summaryrefslogtreecommitdiff
path: root/graphics/pgf/base
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/pgf/base
Initial commit
Diffstat (limited to 'graphics/pgf/base')
-rw-r--r--graphics/pgf/base/INSTALL_NOTES1
-rw-r--r--graphics/pgf/base/README10
-rw-r--r--graphics/pgf/base/doc/AUTHORS3
-rw-r--r--graphics/pgf/base/doc/ChangeLog4452
-rw-r--r--graphics/pgf/base/doc/FILES773
-rw-r--r--graphics/pgf/base/doc/README-3.0.051
-rw-r--r--graphics/pgf/base/doc/extract.lua191
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.bb5
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.jpgbin0 -> 60485 bytes
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.25.bb5
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.25.eps257
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.25.jpgbin0 -> 57081 bytes
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.bb5
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.eps381
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.jpgbin0 -> 78671 bytes
-rw-r--r--graphics/pgf/base/doc/images/brave-gnu-world-logo.xbb6
-rw-r--r--graphics/pgf/base/doc/images/pgfmanual-mindmap-1.pdfbin0 -> 147175 bytes
-rw-r--r--graphics/pgf/base/doc/images/pgfmanual-mindmap-2.pdfbin0 -> 89737 bytes
-rw-r--r--graphics/pgf/base/doc/licenses/LICENSE34
-rw-r--r--graphics/pgf/base/doc/licenses/gnu-free-documentation-license-1.2.txt397
-rw-r--r--graphics/pgf/base/doc/licenses/gnu-public-license-2.txt339
-rw-r--r--graphics/pgf/base/doc/licenses/latex-project-public-license-1.3c.txt416
-rw-r--r--graphics/pgf/base/doc/licenses/manifest-code.txt2
-rw-r--r--graphics/pgf/base/doc/licenses/manifest-documentation.txt2
-rw-r--r--graphics/pgf/base/doc/macros/pgfmanual-en-macros.tex1918
-rw-r--r--graphics/pgf/base/doc/pgfmanual.pdfbin0 -> 10371181 bytes
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-actions.tex530
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-animations.tex1348
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-arrows.tex903
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-decorations.tex980
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-design.tex146
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-external.tex502
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-images.tex272
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-internalregisters.tex127
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-layers.tex136
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-matrices.tex437
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-nodes.tex1289
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-paths.tex876
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-patterns.tex233
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-plots.tex588
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-points.tex683
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-quick.tex188
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-scopes.tex1027
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-shadings.tex762
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-transformations.tex1222
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-base-transparency.tex385
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-drivers.tex449
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-axes.tex3717
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-backend.tex34
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-examples.tex94
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-formats.tex636
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-introduction.tex148
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-main.tex828
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-polar.tex425
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-stylesheets.tex2478
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-dv-visualizers.tex792
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithm-layer.tex832
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithms-in-c.tex864
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-binding-layer.tex281
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-circular.tex29
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-display-layer.tex285
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-edge-routing.tex33
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-examples.tex14
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-force.tex43
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-layered.tex33
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-misc.tex30
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-ogdf.tex115
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-overview.tex306
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-phylogenetics.tex83
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-trees.tex39
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-pgf.tex683
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-tikz.tex530
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-guidelines.tex651
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-installation.tex171
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-introduction.tex260
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-3d.tex244
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-angles.tex109
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-arrows.tex245
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-automata.tex334
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-babel.tex94
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-backgrounds.tex283
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-calc.tex7
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-calendar.tex970
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-chains.tex499
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-circuits.tex2212
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-decorations.tex2160
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-edges.tex329
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-er.tex155
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-external.tex1226
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-fadings.tex51
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex161
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-fixedpoint.tex120
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-folding.tex252
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-fpu.tex677
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-lsystems.tex384
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-math.tex472
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-matrices.tex332
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-mindmaps.tex521
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-patterns.tex354
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-perspective.tex418
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-petri.tex380
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-handlers.tex694
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-marks.tex116
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-profiler.tex242
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-rdf.tex1040
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadings.tex228
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadows.tex291
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-shapes.tex2295
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-spy.tex463
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-svg-path.tex58
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-through.tex43
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-trees.tex196
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-turtle.tex117
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-library-views.tex127
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-license.tex1229
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-main-body.tex857
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-main-preamble.tex374
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-main.tex16
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-math-algorithms.tex207
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-math-commands.tex246
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-math-design.tex95
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-math-numberprinting.tex875
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-math-parsing.tex1403
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-module-parser.tex280
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-oo.tex690
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pages.tex636
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfcalendar.tex488
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgffor.tex397
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeys.tex1692
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeysfiltered.tex576
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-animations.tex1510
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-commands.tex1380
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-overview.tex79
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-paths.tex217
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-protocol.tex89
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-actions.tex1440
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-animations.tex2602
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-arrows.tex2543
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-coordinates.tex1330
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-decorations.tex535
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-design.tex274
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-graphs.tex3695
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-matrices.tex739
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-paths.tex1419
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-pics.tex567
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-plots.tex776
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-scopes.tex582
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-shapes.tex3051
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transformations.tex499
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transparency.tex882
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-trees.tex868
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-Euclid.tex686
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-chains.tex1021
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-map.tex1270
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-nodes.tex1072
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex1394
-rw-r--r--graphics/pgf/base/doc/text-en/pgfmanual-en-xxcolor.tex84
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.table204
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-exp.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-exp.table29
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.table29
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-sin.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-sin.table29
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-tan-example.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-tan-example.table104
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-x.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgf-x.table29
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.gnuplot5
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.table24
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.gnuplot2
-rw-r--r--graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.table104
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfm/en/Makefile30
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfm/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfm/pgfmanual-dvipdfm.cfg18
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfmx/en/Makefile37
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual-test.tex22
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-dvipdfmx/pgfmanual-dvipdfmx.cfg21
-rw-r--r--graphics/pgf/base/doc/version-for-dvips/en/Makefile38
-rw-r--r--graphics/pgf/base/doc/version-for-dvips/en/pgfmanual.tex17
-rw-r--r--graphics/pgf/base/doc/version-for-dvips/pgfmanual-dvips.cfg14
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/Makefile52
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.html5
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.tex27
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.html9
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-asymptotic-example.table204
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-exp.table29
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-parametric-example.table29
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-sin.table29
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-tan-example.table104
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-x.table29
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfmanual-sine.table24
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfplotgnuplot-example.table104
-rw-r--r--graphics/pgf/base/doc/version-for-dvisvgm/pgfmanual-dvisvgm.cfg351
-rw-r--r--graphics/pgf/base/doc/version-for-luatex/en/Makefile35
-rw-r--r--graphics/pgf/base/doc/version-for-luatex/en/pgfmanual-test.tex22
-rw-r--r--graphics/pgf/base/doc/version-for-luatex/en/pgfmanual.tex29
-rw-r--r--graphics/pgf/base/doc/version-for-luatex/pgfmanual-luatex.cfg21
-rw-r--r--graphics/pgf/base/doc/version-for-pdftex/en/Makefile35
-rw-r--r--graphics/pgf/base/doc/version-for-pdftex/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-pdftex/pgfmanual-pdftex.cfg21
-rw-r--r--graphics/pgf/base/doc/version-for-tex4ht/en/Makefile43
-rw-r--r--graphics/pgf/base/doc/version-for-tex4ht/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-tex4ht/pgfmanual-tex4ht.cfg130
-rw-r--r--graphics/pgf/base/doc/version-for-vtex/en/Makefile29
-rw-r--r--graphics/pgf/base/doc/version-for-vtex/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-vtex/pgfmanual-vtex.cfg16
-rw-r--r--graphics/pgf/base/doc/version-for-xetex/en/Makefile30
-rw-r--r--graphics/pgf/base/doc/version-for-xetex/en/pgfmanual.tex16
-rw-r--r--graphics/pgf/base/doc/version-for-xetex/pgfmanual-xetex.cfg17
-rw-r--r--graphics/pgf/base/lua/generic/pgf/manual.lua18
-rw-r--r--graphics/pgf/base/lua/generic/pgf/manual/DocumentParser.lua598
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf.lua72
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd.lua72
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/Binding.lua265
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/BindingToPGF.lua374
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/circular.lua22
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/Tantau2012.lua153
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/doc.lua142
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/library.lua30
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Anchoring.lua104
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentAlign.lua533
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDirection.lua58
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDistance.lua106
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentOrder.lua105
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Components.lua127
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Distances.lua454
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/FineTune.lua164
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/LayoutPipeline.lua1347
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/NodeAnchors.lua175
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Orientation.lua303
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Sublayouts.lua536
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/doc.lua231
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/control/library.lua196
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Cluster.lua65
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Edge.lua358
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Graph.lua396
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Iterators.lua91
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Node.lua280
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Vector.lua256
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc.lua124
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased.lua19
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua129
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua51
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/GEMLayout.lua103
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua53
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua57
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua62
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua45
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua27
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua39
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua27
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered.lua19
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/BarycenterHeuristic.lua23
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua35
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/DfsAcyclicSubgraph.lua27
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua99
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua99
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua27
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyInsertHeuristic.lua23
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua57
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/MedianHeuristic.lua24
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/OptimalRanking.lua35
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua34
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SplitHeuristic.lua24
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua113
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout.lua19
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua48
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua95
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/AcyclicSubgraphModule.lua18
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/HierarchyLayoutModule.lua17
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/InitialPlacer.lua17
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/MultilevelBuilder.lua17
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/RankingModule.lua17
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/TwoLayerCrossMin.lua17
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity.lua19
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua66
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/ASCIIDisplayer.lua32
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/BindingToASCII.lua87
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleDemo.lua82
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleEdgeDemo.lua143
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleHuffman.lua285
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/library.lua30
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua638
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua177
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Skambath2016.lua875
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Supergraph.lua571
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua196
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/TimeSpec.lua62
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/doc.lua120
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/layered.lua107
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/library.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/CoarseGraph.lua435
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlCoarsening.lua148
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlDeclare.lua41
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlElectric.lua97
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlIteration.lua136
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlSprings.lua60
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlStart.lua41
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/QuadTree.lua280
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalHu2006.lua633
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalLayouts.lua54
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalWalshaw2000.lua520
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringHu2006.lua386
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringLayouts.lua36
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua124
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua95
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SimpleSpring.lua74
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua129
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua183
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/CoarseGraphFW.lua264
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceController.lua489
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceTemplate.lua44
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/InitialTemplate.lua64
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/PathLengthsFW.lua174
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/Preprocessing.lua122
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/doc.lua377
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua94
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua201
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua117
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua205
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua123
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua119
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua60
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua60
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua49
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/library.lua115
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/force/library.lua126
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/interface.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceCore.lua191
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToAlgorithms.lua968
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToC.lua78
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToDisplay.lua1002
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/Scope.lua92
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered.lua159
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua342
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990a.lua74
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990b.lua76
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalEadesLS1993.lua124
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua52
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/EdgeRoutingGansnerKNV1993.lua22
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NetworkSimplex.lua898
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodePositioningGansnerKNV1993.lua154
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingGansnerKNV1993.lua159
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingMinimumHeight.lua47
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Ranking.lua291
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Sugiyama.lua476
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/crossing_minimization.lua81
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/cycle_removal.lua136
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/edge_routing.lua49
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/library.lua94
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_positioning.lua55
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_ranking.lua72
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib.lua435
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Bezier.lua160
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/DepthFirstSearch.lua125
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Direct.lua95
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Event.lua98
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/LookupTable.lua111
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PathLengths.lua209
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PriorityQueue.lua342
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Simplifiers.lua279
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Stack.lua61
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Storage.lua110
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Transform.lua120
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Arc.lua653
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Collection.lua208
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Coordinate.lua306
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Digraph.lua849
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Edge.lua209
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Hyperedge.lua56
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path.lua1278
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path_arced.lua316
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Vertex.lua296
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/model/library.lua15
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf.lua26
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf/library.lua33
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees.lua21
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/Koerner2015.lua163
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/library.lua21
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics.lua21
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua77
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua593
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua372
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/DistanceMatrix.lua451
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/Maeusle2012.lua778
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/PhylogeneticTree.lua91
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/SokalMichener1958.lua261
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/library.lua35
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar.lua6
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/BoyerMyrvold2004.lua678
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/Embedding.lua788
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/LinkedList.lua88
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/List.lua49
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PDP.lua576
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PlanarLayout.lua159
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/ShiftMethod.lua128
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/library.lua2
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/parameters.lua144
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/routing.lua22
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/Hints.lua100
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/NecklaceRouting.lua90
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/library.lua29
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/tools/make_gd_wrap.lua183
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/trees.lua21
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ChildSpec.lua225
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ReingoldTilford1981.lua211
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/SpanningTreeComputation.lua643
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/doc.lua331
-rw-r--r--graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/library.lua35
-rw-r--r--graphics/pgf/base/lua/luamath/pgf/luamath/functions.lua626
-rw-r--r--graphics/pgf/base/lua/luamath/pgf/luamath/parser.lua481
-rw-r--r--graphics/pgf/base/source/BalloonLayout_script.h32
-rw-r--r--graphics/pgf/base/source/BarycenterHeuristic_script.h20
-rw-r--r--graphics/pgf/base/source/BarycenterPlacer_script.h32
-rw-r--r--graphics/pgf/base/source/CirclePlacer_script.h56
-rw-r--r--graphics/pgf/base/source/CircularLayout_script.h47
-rw-r--r--graphics/pgf/base/source/CoffmanGrahamRanking_script.h34
-rw-r--r--graphics/pgf/base/source/DfsAcyclicSubgraph_script.h20
-rw-r--r--graphics/pgf/base/source/EdgeCoverMerger_script.h32
-rw-r--r--graphics/pgf/base/source/ExampleLocalMakefileConfig.mk7
-rw-r--r--graphics/pgf/base/source/FMMMLayout_script.h44
-rw-r--r--graphics/pgf/base/source/FastHierarchyLayout_script.h48
-rw-r--r--graphics/pgf/base/source/FastMultipoleEmbedder_script.h51
-rw-r--r--graphics/pgf/base/source/FastSimpleHierarchyLayout_script.h41
-rw-r--r--graphics/pgf/base/source/GEMLayout_script.h101
-rw-r--r--graphics/pgf/base/source/GreedyCycleRemoval_script.h20
-rw-r--r--graphics/pgf/base/source/GreedyInsertHeuristic_script.h20
-rw-r--r--graphics/pgf/base/source/INSTALL28
-rw-r--r--graphics/pgf/base/source/IndependentSetMerger_script.h32
-rw-r--r--graphics/pgf/base/source/InterfaceFromC++.c++215
-rw-r--r--graphics/pgf/base/source/InterfaceFromC++.h190
-rw-r--r--graphics/pgf/base/source/InterfaceFromC.c1189
-rw-r--r--graphics/pgf/base/source/InterfaceFromC.h613
-rw-r--r--graphics/pgf/base/source/InterfaceFromOGDF.c++105
-rw-r--r--graphics/pgf/base/source/InterfaceFromOGDF.h45
-rw-r--r--graphics/pgf/base/source/LocalBiconnectedMerger_script.h32
-rw-r--r--graphics/pgf/base/source/LongestPathRanking_script.h50
-rw-r--r--graphics/pgf/base/source/MakefileConfig.mk45
-rw-r--r--graphics/pgf/base/source/MatchingMerger_script.h32
-rw-r--r--graphics/pgf/base/source/MedianHeuristic_script.h20
-rw-r--r--graphics/pgf/base/source/MedianPlacer_script.h26
-rw-r--r--graphics/pgf/base/source/MultilevelLayout_script.h33
-rw-r--r--graphics/pgf/base/source/OptimalRanking_script.h34
-rw-r--r--graphics/pgf/base/source/PlanarizationLayout_script.h43
-rw-r--r--graphics/pgf/base/source/RandomMerger_script.h32
-rw-r--r--graphics/pgf/base/source/RandomPlacer_script.h32
-rw-r--r--graphics/pgf/base/source/SiftingHeuristic_script.h40
-rw-r--r--graphics/pgf/base/source/SimpleDemoC.c42
-rw-r--r--graphics/pgf/base/source/SimpleDemoCPlusPlus.c++47
-rw-r--r--graphics/pgf/base/source/SimpleDemoOGDF.c++43
-rw-r--r--graphics/pgf/base/source/SolarMerger_script.h36
-rw-r--r--graphics/pgf/base/source/SolarPlacer_script.h26
-rw-r--r--graphics/pgf/base/source/SplitHeuristic_script.h20
-rw-r--r--graphics/pgf/base/source/SpringEmbedderFRExact_script.h66
-rw-r--r--graphics/pgf/base/source/SpringEmbedderFR_script.h45
-rw-r--r--graphics/pgf/base/source/SpringEmbedderKK_script.h39
-rw-r--r--graphics/pgf/base/source/SugiyamaLayout_script.h54
-rw-r--r--graphics/pgf/base/source/ZeroPlacer_script.h32
-rw-r--r--graphics/pgf/base/source/energybased_script.h31
-rw-r--r--graphics/pgf/base/source/layered_script.h46
-rw-r--r--graphics/pgf/base/source/misclayout_script.h13
-rw-r--r--graphics/pgf/base/source/module_script.h27
-rw-r--r--graphics/pgf/base/source/multilevelmixer_script.h33
-rw-r--r--graphics/pgf/base/source/ogdf_script.c++23
-rw-r--r--graphics/pgf/base/source/pgfmathtestsuite.tex1264
-rw-r--r--graphics/pgf/base/source/planarity_script.h11
-rw-r--r--graphics/pgf/base/source/tikzexternaltest.code.tex41
-rw-r--r--graphics/pgf/base/source/tikzexternaltest.sharedpreamble.tex20
-rw-r--r--graphics/pgf/base/source/tikzexternaltest.tex12
-rw-r--r--graphics/pgf/base/source/tikzexternaltestmakefile.tex12
-rw-r--r--graphics/pgf/base/source/unittest_luamathparser.tex562
-rw-r--r--graphics/pgf/base/tex/LUA_CODING_STYLE27
-rw-r--r--graphics/pgf/base/tex/example_graph_for_ascii_displayer.txt20
-rw-r--r--graphics/pgf/base/tex/pgf.cfg33
-rw-r--r--graphics/pgf/base/tex/pgf.revision.tex15
-rw-r--r--graphics/pgf/base/tex/pgf.sty39
-rw-r--r--graphics/pgf/base/tex/pgf.tex28
-rw-r--r--graphics/pgf/base/tex/pgfarrows.sty19
-rw-r--r--graphics/pgf/base/tex/pgfautomata.sty315
-rw-r--r--graphics/pgf/base/tex/pgfbaseimage.sty15
-rw-r--r--graphics/pgf/base/tex/pgfbaseimage.tex20
-rw-r--r--graphics/pgf/base/tex/pgfbaselayers.sty15
-rw-r--r--graphics/pgf/base/tex/pgfbaselayers.tex20
-rw-r--r--graphics/pgf/base/tex/pgfbasematrix.sty17
-rw-r--r--graphics/pgf/base/tex/pgfbasematrix.tex22
-rw-r--r--graphics/pgf/base/tex/pgfbasepatterns.sty15
-rw-r--r--graphics/pgf/base/tex/pgfbasepatterns.tex20
-rw-r--r--graphics/pgf/base/tex/pgfbaseplot.sty17
-rw-r--r--graphics/pgf/base/tex/pgfbaseplot.tex22
-rw-r--r--graphics/pgf/base/tex/pgfbaseshapes.sty17
-rw-r--r--graphics/pgf/base/tex/pgfbaseshapes.tex22
-rw-r--r--graphics/pgf/base/tex/pgfbasesnakes.sty17
-rw-r--r--graphics/pgf/base/tex/pgfbasesnakes.tex22
-rw-r--r--graphics/pgf/base/tex/pgfcalendar.code.tex800
-rw-r--r--graphics/pgf/base/tex/pgfcalendar.sty15
-rw-r--r--graphics/pgf/base/tex/pgfcalendar.tex18
-rw-r--r--graphics/pgf/base/tex/pgfcomp-version-0-65.sty719
-rw-r--r--graphics/pgf/base/tex/pgfcomp-version-1-18.sty29
-rw-r--r--graphics/pgf/base/tex/pgfcore.code.tex38
-rw-r--r--graphics/pgf/base/tex/pgfcore.sty19
-rw-r--r--graphics/pgf/base/tex/pgfcore.tex23
-rw-r--r--graphics/pgf/base/tex/pgfcorearrows.code.tex1253
-rw-r--r--graphics/pgf/base/tex/pgfcoreexternal.code.tex542
-rw-r--r--graphics/pgf/base/tex/pgfcoregraphicstate.code.tex280
-rw-r--r--graphics/pgf/base/tex/pgfcoreimage.code.tex244
-rw-r--r--graphics/pgf/base/tex/pgfcorelayers.code.tex210
-rw-r--r--graphics/pgf/base/tex/pgfcoreobjects.code.tex101
-rw-r--r--graphics/pgf/base/tex/pgfcorepathconstruct.code.tex1477
-rw-r--r--graphics/pgf/base/tex/pgfcorepathprocessing.code.tex563
-rw-r--r--graphics/pgf/base/tex/pgfcorepathusage.code.tex661
-rw-r--r--graphics/pgf/base/tex/pgfcorepatterns.code.tex301
-rw-r--r--graphics/pgf/base/tex/pgfcorepoints.code.tex1212
-rw-r--r--graphics/pgf/base/tex/pgfcorequick.code.tex134
-rw-r--r--graphics/pgf/base/tex/pgfcorerdf.code.tex228
-rw-r--r--graphics/pgf/base/tex/pgfcorescopes.code.tex771
-rw-r--r--graphics/pgf/base/tex/pgfcoreshade.code.tex974
-rw-r--r--graphics/pgf/base/tex/pgfcoretransformations.code.tex819
-rw-r--r--graphics/pgf/base/tex/pgfcoretransparency.code.tex311
-rw-r--r--graphics/pgf/base/tex/pgfexternal.tex32
-rw-r--r--graphics/pgf/base/tex/pgfexternalwithdepth.tex43
-rw-r--r--graphics/pgf/base/tex/pgffor.code.tex763
-rw-r--r--graphics/pgf/base/tex/pgffor.sty16
-rw-r--r--graphics/pgf/base/tex/pgffor.tex19
-rw-r--r--graphics/pgf/base/tex/pgfheaps.sty107
-rw-r--r--graphics/pgf/base/tex/pgfint.code.tex126
-rw-r--r--graphics/pgf/base/tex/pgfkeys.code.tex1125
-rw-r--r--graphics/pgf/base/tex/pgfkeys.sty12
-rw-r--r--graphics/pgf/base/tex/pgfkeys.tex18
-rw-r--r--graphics/pgf/base/tex/pgfkeysfiltered.code.tex1015
-rw-r--r--graphics/pgf/base/tex/pgflibraryarrows.code.tex936
-rw-r--r--graphics/pgf/base/tex/pgflibraryarrows.meta.code.tex1607
-rw-r--r--graphics/pgf/base/tex/pgflibraryarrows.spaced.code.tex92
-rw-r--r--graphics/pgf/base/tex/pgflibraryarrows.sty16
-rw-r--r--graphics/pgf/base/tex/pgflibraryautomata.sty16
-rw-r--r--graphics/pgf/base/tex/pgflibrarycurvilinear.code.tex379
-rw-r--r--graphics/pgf/base/tex/pgflibrarydatavisualization.barcharts.code.tex135
-rw-r--r--graphics/pgf/base/tex/pgflibrarydatavisualization.formats.functions.code.tex209
-rw-r--r--graphics/pgf/base/tex/pgflibrarydatavisualization.polar.code.tex198
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.footprints.code.tex230
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.fractals.code.tex65
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.markings.code.tex178
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.pathmorphing.code.tex294
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.pathreplacing.code.tex240
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.shapes.code.tex468
-rw-r--r--graphics/pgf/base/tex/pgflibrarydecorations.text.code.tex357
-rw-r--r--graphics/pgf/base/tex/pgflibraryfadings.code.tex57
-rw-r--r--graphics/pgf/base/tex/pgflibraryfixedpointarithmetic.code.tex656
-rw-r--r--graphics/pgf/base/tex/pgflibraryfpu.code.tex2347
-rw-r--r--graphics/pgf/base/tex/pgflibrarygraphdrawing.circular.code.tex16
-rw-r--r--graphics/pgf/base/tex/pgflibrarygraphdrawing.code.tex1165
-rw-r--r--graphics/pgf/base/tex/pgflibrarygraphdrawing.examples.code.tex17
-rw-r--r--graphics/pgf/base/tex/pgflibrarygraphdrawing.force.code.tex136
-rw-r--r--graphics/pgf/base/tex/pgflibrarygraphdrawing.layered.code.tex17
-rw-r--r--graphics/pgf/base/tex/pgflibrarygraphdrawing.trees.code.tex19
-rw-r--r--graphics/pgf/base/tex/pgflibraryintersections.code.tex1165
-rw-r--r--graphics/pgf/base/tex/pgflibrarylindenmayersystems.code.tex229
-rw-r--r--graphics/pgf/base/tex/pgflibraryluamath.code.tex558
-rw-r--r--graphics/pgf/base/tex/pgflibrarypatterns.code.tex264
-rw-r--r--graphics/pgf/base/tex/pgflibrarypatterns.meta.code.tex281
-rw-r--r--graphics/pgf/base/tex/pgflibraryplothandlers.code.tex1114
-rw-r--r--graphics/pgf/base/tex/pgflibraryplothandlers.sty17
-rw-r--r--graphics/pgf/base/tex/pgflibraryplotmarks.code.tex453
-rw-r--r--graphics/pgf/base/tex/pgflibraryplotmarks.sty17
-rw-r--r--graphics/pgf/base/tex/pgflibraryprofiler.code.tex530
-rw-r--r--graphics/pgf/base/tex/pgflibraryshadings.code.tex444
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.arrows.code.tex2361
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.callouts.code.tex951
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.code.tex21
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.gates.ee.IEC.code.tex679
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.gates.ee.code.tex170
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.gates.logic.IEC.code.tex733
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.gates.logic.US.code.tex2525
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.gates.logic.code.tex103
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.geometric.code.tex4417
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.misc.code.tex1127
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.multipart.code.tex1356
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.sty18
-rw-r--r--graphics/pgf/base/tex/pgflibraryshapes.symbols.code.tex2775
-rw-r--r--graphics/pgf/base/tex/pgflibrarysnakes.code.tex16
-rw-r--r--graphics/pgf/base/tex/pgflibrarysnakes.sty17
-rw-r--r--graphics/pgf/base/tex/pgflibrarysvg.path.code.tex829
-rw-r--r--graphics/pgf/base/tex/pgflibrarytikzbackgrounds.sty17
-rw-r--r--graphics/pgf/base/tex/pgflibrarytikztrees.sty17
-rw-r--r--graphics/pgf/base/tex/pgflibrarytimelines.code.tex197
-rw-r--r--graphics/pgf/base/tex/pgfmanual.code.tex64
-rw-r--r--graphics/pgf/base/tex/pgfmanual.pdflinks.code.tex439
-rw-r--r--graphics/pgf/base/tex/pgfmanual.prettyprinter.code.tex1115
-rw-r--r--graphics/pgf/base/tex/pgfmanual.sty12
-rw-r--r--graphics/pgf/base/tex/pgfmath.code.tex26
-rw-r--r--graphics/pgf/base/tex/pgfmath.sty13
-rw-r--r--graphics/pgf/base/tex/pgfmath.tex23
-rw-r--r--graphics/pgf/base/tex/pgfmathcalc.code.tex542
-rw-r--r--graphics/pgf/base/tex/pgfmathfloat.code.tex2674
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.base.code.tex330
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.basic.code.tex803
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.code.tex256
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.comparison.code.tex179
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.integerarithmetics.code.tex124
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.misc.code.tex349
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.random.code.tex245
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.round.code.tex123
-rw-r--r--graphics/pgf/base/tex/pgfmathfunctions.trigonometric.code.tex1571
-rw-r--r--graphics/pgf/base/tex/pgfmathode.code.tex178
-rw-r--r--graphics/pgf/base/tex/pgfmathparser.code.tex993
-rw-r--r--graphics/pgf/base/tex/pgfmathutil.code.tex274
-rw-r--r--graphics/pgf/base/tex/pgfmoduleanimations.code.tex1314
-rw-r--r--graphics/pgf/base/tex/pgfmodulebending.code.tex356
-rw-r--r--graphics/pgf/base/tex/pgfmoduledatavisualization.code.tex3215
-rw-r--r--graphics/pgf/base/tex/pgfmoduledecorations.code.tex2191
-rw-r--r--graphics/pgf/base/tex/pgfmodulematrix.code.tex652
-rw-r--r--graphics/pgf/base/tex/pgfmodulenonlineartransformations.code.tex342
-rw-r--r--graphics/pgf/base/tex/pgfmoduleoo.code.tex844
-rw-r--r--graphics/pgf/base/tex/pgfmoduleparser.code.tex681
-rw-r--r--graphics/pgf/base/tex/pgfmoduleplot.code.tex561
-rw-r--r--graphics/pgf/base/tex/pgfmoduleshapes.code.tex1300
-rw-r--r--graphics/pgf/base/tex/pgfmodulesnakes.code.tex369
-rw-r--r--graphics/pgf/base/tex/pgfmodulesorting.code.tex69
-rw-r--r--graphics/pgf/base/tex/pgfnodes.sty19
-rw-r--r--graphics/pgf/base/tex/pgfpages.sty1139
-rw-r--r--graphics/pgf/base/tex/pgfpict2e.sty112
-rw-r--r--graphics/pgf/base/tex/pgfrcs.code.tex155
-rw-r--r--graphics/pgf/base/tex/pgfrcs.sty15
-rw-r--r--graphics/pgf/base/tex/pgfrcs.tex26
-rw-r--r--graphics/pgf/base/tex/pgfshade.sty19
-rw-r--r--graphics/pgf/base/tex/pgfsys-common-pdf-via-dvi.def172
-rw-r--r--graphics/pgf/base/tex/pgfsys-common-pdf.def119
-rw-r--r--graphics/pgf/base/tex/pgfsys-common-postscript.def600
-rw-r--r--graphics/pgf/base/tex/pgfsys-common-svg.def1613
-rw-r--r--graphics/pgf/base/tex/pgfsys-dvi.def394
-rw-r--r--graphics/pgf/base/tex/pgfsys-dvipdfm.def110
-rw-r--r--graphics/pgf/base/tex/pgfsys-dvipdfmx.def512
-rw-r--r--graphics/pgf/base/tex/pgfsys-dvips.def145
-rw-r--r--graphics/pgf/base/tex/pgfsys-dvisvgm.def217
-rw-r--r--graphics/pgf/base/tex/pgfsys-luatex.def401
-rw-r--r--graphics/pgf/base/tex/pgfsys-pdftex.def398
-rw-r--r--graphics/pgf/base/tex/pgfsys-tex4ht.def487
-rw-r--r--graphics/pgf/base/tex/pgfsys-textures.def91
-rw-r--r--graphics/pgf/base/tex/pgfsys-vtex.def106
-rw-r--r--graphics/pgf/base/tex/pgfsys-xetex.def75
-rw-r--r--graphics/pgf/base/tex/pgfsys.code.tex1745
-rw-r--r--graphics/pgf/base/tex/pgfsys.sty20
-rw-r--r--graphics/pgf/base/tex/pgfsys.tex28
-rw-r--r--graphics/pgf/base/tex/pgfsysanimations.code.tex2009
-rw-r--r--graphics/pgf/base/tex/pgfsysprotocol.code.tex70
-rw-r--r--graphics/pgf/base/tex/pgfsyssoftpath.code.tex204
-rw-r--r--graphics/pgf/base/tex/pgfutil-common-lists.tex159
-rw-r--r--graphics/pgf/base/tex/pgfutil-common.tex839
-rw-r--r--graphics/pgf/base/tex/pgfutil-context.def375
-rw-r--r--graphics/pgf/base/tex/pgfutil-latex.def205
-rw-r--r--graphics/pgf/base/tex/pgfutil-plain.def337
-rw-r--r--graphics/pgf/base/tex/t-pgf.tex34
-rw-r--r--graphics/pgf/base/tex/t-pgfbim.tex22
-rw-r--r--graphics/pgf/base/tex/t-pgfbla.tex15
-rw-r--r--graphics/pgf/base/tex/t-pgfbma.tex17
-rw-r--r--graphics/pgf/base/tex/t-pgfbpl.tex18
-rw-r--r--graphics/pgf/base/tex/t-pgfbpt.tex15
-rw-r--r--graphics/pgf/base/tex/t-pgfbsh.tex17
-rw-r--r--graphics/pgf/base/tex/t-pgfbsn.tex18
-rw-r--r--graphics/pgf/base/tex/t-pgfcal.tex36
-rw-r--r--graphics/pgf/base/tex/t-pgfcor.tex60
-rw-r--r--graphics/pgf/base/tex/t-pgffor.tex37
-rw-r--r--graphics/pgf/base/tex/t-pgfkey.tex34
-rw-r--r--graphics/pgf/base/tex/t-pgfmat.tex38
-rw-r--r--graphics/pgf/base/tex/t-pgfmod.tex51
-rw-r--r--graphics/pgf/base/tex/t-pgfrcs.tex42
-rw-r--r--graphics/pgf/base/tex/t-pgfsys.tex42
-rw-r--r--graphics/pgf/base/tex/t-tikz.tex41
-rw-r--r--graphics/pgf/base/tex/tikz.code.tex5588
-rw-r--r--graphics/pgf/base/tex/tikz.sty15
-rw-r--r--graphics/pgf/base/tex/tikz.tex23
-rw-r--r--graphics/pgf/base/tex/tikzexternal.sty143
-rw-r--r--graphics/pgf/base/tex/tikzexternalshared.code.tex1711
-rw-r--r--graphics/pgf/base/tex/tikzlibrary3d.code.tex108
-rw-r--r--graphics/pgf/base/tex/tikzlibraryangles.code.tex98
-rw-r--r--graphics/pgf/base/tex/tikzlibraryanimations.code.tex904
-rw-r--r--graphics/pgf/base/tex/tikzlibraryarrows.code.tex14
-rw-r--r--graphics/pgf/base/tex/tikzlibraryautomata.code.tex105
-rw-r--r--graphics/pgf/base/tex/tikzlibrarybabel.code.tex17
-rw-r--r--graphics/pgf/base/tex/tikzlibrarybackgrounds.code.tex148
-rw-r--r--graphics/pgf/base/tex/tikzlibrarybending.code.tex15
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycalc.code.tex637
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycalendar.code.tex458
-rw-r--r--graphics/pgf/base/tex/tikzlibrarychains.code.tex214
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.code.tex264
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.ee.IEC.code.tex442
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.ee.code.tex148
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.logic.CDH.code.tex28
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.logic.IEC.code.tex75
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.logic.US.code.tex64
-rw-r--r--graphics/pgf/base/tex/tikzlibrarycircuits.logic.code.tex45
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydatavisualization.3d.code.tex79
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydatavisualization.barcharts.code.tex43
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydatavisualization.code.tex2729
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydatavisualization.formats.functions.code.tex16
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydatavisualization.polar.code.tex565
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydatavisualization.sparklines.code.tex37
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.code.tex192
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.footprints.code.tex13
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.fractals.code.tex13
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.markings.code.tex31
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.pathmorphing.code.tex13
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.pathreplacing.code.tex36
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.shapes.code.tex13
-rw-r--r--graphics/pgf/base/tex/tikzlibrarydecorations.text.code.tex704
-rw-r--r--graphics/pgf/base/tex/tikzlibraryer.code.tex40
-rw-r--r--graphics/pgf/base/tex/tikzlibraryexternal.code.tex107
-rw-r--r--graphics/pgf/base/tex/tikzlibraryfadings.code.tex48
-rw-r--r--graphics/pgf/base/tex/tikzlibraryfit.code.tex130
-rw-r--r--graphics/pgf/base/tex/tikzlibraryfixedpointarithmetic.code.tex10
-rw-r--r--graphics/pgf/base/tex/tikzlibraryfolding.code.tex2078
-rw-r--r--graphics/pgf/base/tex/tikzlibraryfpu.code.tex10
-rw-r--r--graphics/pgf/base/tex/tikzlibrarygraphdrawing.code.tex257
-rw-r--r--graphics/pgf/base/tex/tikzlibrarygraphdrawing.evolving.code.tex21
-rw-r--r--graphics/pgf/base/tex/tikzlibrarygraphs.code.tex2671
-rw-r--r--graphics/pgf/base/tex/tikzlibrarygraphs.standard.code.tex108
-rw-r--r--graphics/pgf/base/tex/tikzlibraryintersections.code.tex144
-rw-r--r--graphics/pgf/base/tex/tikzlibrarylindenmayersystems.code.tex81
-rw-r--r--graphics/pgf/base/tex/tikzlibrarymath.code.tex731
-rw-r--r--graphics/pgf/base/tex/tikzlibrarymatrix.code.tex144
-rw-r--r--graphics/pgf/base/tex/tikzlibrarymindmap.code.tex417
-rw-r--r--graphics/pgf/base/tex/tikzlibrarypatterns.code.tex31
-rw-r--r--graphics/pgf/base/tex/tikzlibrarypatterns.meta.code.tex98
-rw-r--r--graphics/pgf/base/tex/tikzlibraryperspective.code.tex111
-rw-r--r--graphics/pgf/base/tex/tikzlibrarypetri.code.tex146
-rw-r--r--graphics/pgf/base/tex/tikzlibraryplothandlers.code.tex14
-rw-r--r--graphics/pgf/base/tex/tikzlibraryplotmarks.code.tex14
-rw-r--r--graphics/pgf/base/tex/tikzlibrarypositioning.code.tex118
-rw-r--r--graphics/pgf/base/tex/tikzlibraryquotes.code.tex90
-rw-r--r--graphics/pgf/base/tex/tikzlibraryrdf.code.tex291
-rw-r--r--graphics/pgf/base/tex/tikzlibraryscopes.code.tex42
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshadings.code.tex21
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshadows.code.tex146
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.arrows.code.tex16
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.callouts.code.tex35
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.code.tex19
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.IEC.code.tex38
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.US.code.tex40
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.geometric.code.tex14
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.misc.code.tex14
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.multipart.code.tex36
-rw-r--r--graphics/pgf/base/tex/tikzlibraryshapes.symbols.code.tex17
-rw-r--r--graphics/pgf/base/tex/tikzlibrarysnakes.code.tex77
-rw-r--r--graphics/pgf/base/tex/tikzlibraryspy.code.tex124
-rw-r--r--graphics/pgf/base/tex/tikzlibrarysvg.path.code.tex33
-rw-r--r--graphics/pgf/base/tex/tikzlibrarythrough.code.tex36
-rw-r--r--graphics/pgf/base/tex/tikzlibrarytopaths.code.tex382
-rw-r--r--graphics/pgf/base/tex/tikzlibrarytrees.code.tex104
-rw-r--r--graphics/pgf/base/tex/tikzlibraryturtle.code.tex84
-rw-r--r--graphics/pgf/base/tex/tikzlibraryviews.code.tex45
-rw-r--r--graphics/pgf/base/tex/xxcolor.sty108
768 files changed, 254517 insertions, 0 deletions
diff --git a/graphics/pgf/base/INSTALL_NOTES b/graphics/pgf/base/INSTALL_NOTES
new file mode 100644
index 0000000000..2eaafdb647
--- /dev/null
+++ b/graphics/pgf/base/INSTALL_NOTES
@@ -0,0 +1 @@
+Please search for pgf.tds.zip and install that one into a local texmf branch (which is typically simpler). This release is intended to satisfy CTAN package browsing policies.
diff --git a/graphics/pgf/base/README b/graphics/pgf/base/README
new file mode 100644
index 0000000000..73e99b884a
--- /dev/null
+++ b/graphics/pgf/base/README
@@ -0,0 +1,10 @@
+pgf -- A Portable Graphic Format for TeX
+
+See the directory doc/generic/pgf for more information. See the file
+doc/generic/pgf/pgfmanual.pdf for a manual. This
+documentation also explains the installation. See the file
+doc/generic/pgf/license/LICENSE for license details.
+
+Please go to the official repository at https://github.com/pgf-tikz/pgf
+or the official mailing list at https://tug.org/mailman/listinfo/pgf-tikz
+to submit bug reports, request new features, etc.
diff --git a/graphics/pgf/base/doc/AUTHORS b/graphics/pgf/base/doc/AUTHORS
new file mode 100644
index 0000000000..8bd3d5bde9
--- /dev/null
+++ b/graphics/pgf/base/doc/AUTHORS
@@ -0,0 +1,3 @@
+Till Tantau <tantau@users.sourceforge.net>
+Mark Wibrow
+Christian Feuersaenger <ludewich@users.sourceforge.net>
diff --git a/graphics/pgf/base/doc/ChangeLog b/graphics/pgf/base/doc/ChangeLog
new file mode 100644
index 0000000000..4715f302ef
--- /dev/null
+++ b/graphics/pgf/base/doc/ChangeLog
@@ -0,0 +1,4452 @@
+2019-08-03 Henri Menke
+
+ - Release 3.1.4b
+
+2019-08-03 Henri Menke
+
+ - Revert "Default implementation of \pgfsys@hboxsynced doesn't work for dvips #690"
+
+2019-07-16 Henri Menke
+
+ - Release 3.1.4a
+
+2019-07-15 Henri Menke
+
+ - Revert "Fix position tracking for XeTeX #353"
+
+2019-07-12 Henri Menke
+
+ - Release 3.1.4
+
+2019-07-12 Henri Menke
+
+ - after_script runs after deploy
+
+2019-07-11 Henri Menke
+
+ - Add pgfmanual to release files
+
+2019-07-11 johannesborgstrom
+
+ - Add URL of the pdf manual to the README.md file
+
+2019-07-11 Henri Menke
+
+ - Goodbye SourceForge
+
+2019-07-11 Henri Menke
+
+ - Clear trap before deploy
+
+2019-07-11 Henri Menke
+
+ - Switch to a new branch for tlcontrib
+
+2019-07-10 Henri Menke
+
+ - Stretchable dash patterns #629
+
+2019-07-09 Henri Menke
+
+ - Try protected@edef in pgfmathparse
+
+2019-07-05 Henri Menke
+
+ - Hardening patterns.meta a little
+
+2019-07-04 Henri Menke
+
+ - \pgfmathrandominteger didn't handle expressions as input
+
+2019-07-04 Henri Menke
+
+ - extract.lua: all extracted files are tex
+
+2019-07-04 Henri Menke
+
+ - extract.lua: recurse into subdirectories, ignore remember picture
+
+2019-07-03 Henri Menke
+
+ - Describe \pgfdeclarepattern and \tikzdeclarepattern
+
+2019-07-03 Henri Menke
+
+ - Add patterns.meta to the manual
+
+2019-06-27 Henri Menke
+
+ - /pgf/foreach/count is unscoped #702
+
+2019-04-22 Henri Menke
+
+ - On the way to more configurable patterns
+
+2019-06-27 Henri Menke
+
+ - Add mailing list to the README
+
+2019-06-26 Henri Menke
+
+ - Missed stripping pt on dimensions #701
+
+2019-06-26 Henri Menke
+
+ - Bend angle need not be integer #700
+
+2019-06-26 Henri Menke
+
+ - No dedicated options for libraries (for now)
+
+2019-06-26 Henri Menke
+
+ - Add option to hide code
+
+2019-06-26 Henri Menke
+
+ - Stripping comments was too greedy
+
+2019-06-26 Henri Menke
+
+ - Small fix to the grammar
+
+2019-06-25 Henri Menke
+
+ - Typos in luamath
+
+2019-06-24 Henri Menke
+
+ - Functionality to print libraries in code listings
+
+2019-06-23 Stefan Pinnow
+
+ - - fixed some typos
+
+2019-06-22 Stefan Pinnow
+
+ - - fixed regression (accidentally duplicated part of code)
+
+2019-06-21 Henri Menke
+
+ - \pgf@nodecallback might be called twice #693
+
+2019-06-21 Henri Menke
+
+ - Default implementation of \pgfsys@hboxsynced doesn't work for dvips #690
+
+2019-06-21 Henri Menke
+
+ - Fix position tracking for XeTeX #353
+
+2019-06-06 Henri Menke
+
+ - Wrong order in definition of \translate #689
+
+2019-06-05 Henri Menke
+
+ - FILES is generated
+
+2019-06-05 Henri Menke
+
+ - Change priority of Travis jobs
+
+2019-06-05 Henri Menke
+
+ - Load imakeidx before hyperref
+
+2019-06-05 Henri Menke
+
+ - Remove user config from deploy script
+
+2019-06-03 Henri Menke
+
+ - Revert "Missing spaces in error messages #679"
+
+2019-05-31 cfeuersaenger
+
+ - Restored lost functionality in intersections / fillbetween feature
+
+2019-05-30 Christian Feuersaenger
+
+ - Revert 00f4e8d4154dcb3133ed4a106b6254b8faf874e2
+
+2019-05-30 Christian Feuersaenger
+
+ - Fixed regression: the merge cc191ed4ae5bd11df9ce42595102caa4e1f141b4 accidentally deleted a feature
+
+2019-05-24 Henri Menke
+
+ - Use imakeidx for automatic index creation
+
+2019-05-23 Henri Menke
+
+ - Looks like I got tex4ht working
+
+2019-05-23 Henri Menke
+
+ - Use T1 for DVI output for now, see also https://github.com/mgieseki/dvisvgm/issues/2
+
+2019-05-23 Henri Menke
+
+ - luaotfload was missing this whole time
+
+2019-05-23 Henri Menke
+
+ - Merge remote-tracking branch 'loopspace/master'
+
+2019-05-23 Henri Menke
+
+ - Disable T1 encoding for LuaTeX
+
+2019-05-21 Andrew Stacey
+
+ - Extended the higher-level save of the last moveto so that it also works with nodes.
+
+2019-05-21 Andrew Stacey
+
+ - Added dimensions for saving the last moveto coordinates so that -- cycle works with nodes. The existing method uses the coordinates stored from the last soft path move to, but this has an extra transformation applied to it meaning that when it gets used in node placement the transformation is applied twice.
+
+2019-05-20 Henri Menke
+
+ - Missing spaces in error messages #679
+
+2019-05-17 Henri Menke
+
+ - Move tlcontrib to tlnet folder to make room for possible future MikTeX contrib
+
+2019-05-17 Henri Menke
+
+ - Typo in alternate angles #676
+
+2019-05-15 Henri Menke
+
+ - Missing xcolor definitions for Plain and ConTeXt #675
+
+2019-05-13 Henri Menke
+
+ - Typo
+
+2019-05-13 Henri Menke
+
+ - Some more fixes for the tex4ht manual
+
+2019-05-13 Henri Menke
+
+ - Merge remote-tracking branch 'Mo-Gul/master'
+
+2019-05-13 Henri Menke
+
+ - Revert all but the useful changes of 98829b450a96a6790570aba11949cd9834e49e2c
+
+2019-05-13 Henri Menke
+
+ - Some more cleanup before deploy
+
+2019-05-10 Henri Menke
+
+ - Fix .lastretry #672
+
+2019-05-13 Henri Menke
+
+ - Deploy TDS and CTAN zip
+
+2019-05-13 Henri Menke
+
+ - Get git tag in Makefile
+
+2019-05-09 Henri Menke
+
+ - Release 3.1.3
+
+2019-05-09 Henri Menke
+
+ - Further unbreaking of shadings #650
+
+2019-05-09 Henri Menke
+
+ - \ifdim instead of \ifx #412
+
+2019-05-08 Henri Menke
+
+ - Add push- and popmacro. Useful for smuggling. From ConTeXt
+
+2019-05-02 Henri Menke
+
+ - Merge pull request #664 from dcpurton/shadings-colorspace
+
+2019-04-29 Henri Menke
+
+ - Add navigation arrows to SVG manual
+
+2019-04-28 Henri Menke
+
+ - Typos in pgfmanual-en-library-circuits.tex #667
+
+2019-04-25 Henri Menke
+
+ - Simpler basename function for extract.lua #640
+
+2019-04-25 David Purton
+
+ - Add copyright and attribution for CMYK and grayscale shadings
+
+2019-04-24 David Purton
+
+ - Update documentation for color model independent shadings
+
+2019-04-21 David Purton
+
+ - CMYK and grayscale shadings library support
+
+2019-04-21 David Purton
+
+ - Functional shading color space conversion functions
+
+2019-04-21 David Purton
+
+ - Support for CMYK and grayscale shadings in set up code
+
+2019-04-21 David Purton
+
+ - Conversion from shade color to grayscale PostScript data support
+
+2019-04-21 David Purton
+
+ - Conversion from shade color to CMYK PostScript data support
+
+2019-04-21 David Purton
+
+ - Add grayscale shading postscript driver support
+
+2019-04-21 David Purton
+
+ - Add CMYK shading postscript driver support
+
+2019-04-21 David Purton
+
+ - Add grayscale shading parsing functions
+
+2019-04-21 David Purton
+
+ - Add CMYK shading parsing functions
+
+2019-04-20 David Purton
+
+ - Adapt shading drivers to allow for multiple color models
+
+2019-04-25 Henri Menke
+
+ - Produce compilable examples from extract.lua #640
+
+2019-04-25 Henri Menke
+
+ - Preliminary version of an extractor script for codeexamples #640
+
+2019-04-25 Henri Menke
+
+ - Manual typos #665
+
+2019-04-23 Henri Menke
+
+ - Revert "No mode switch for typesetting pictures"
+
+2019-04-20 David Purton
+
+ - Support shading color specifications in CMYK
+
+2019-04-20 David Purton
+
+ - Set up RGB specific shading parsing
+
+2019-04-22 Henri Menke
+
+ - Fix typos #662
+
+2019-04-22 Henri Menke
+
+ - No mode switch for typesetting pictures
+
+2019-04-22 Henri Menke
+
+ - Correct floored division (thanks @josephwright)
+
+2019-04-21 Henri Menke
+
+ - Merge pull request #661 from dcpurton/mandelbrot-fix
+
+2019-04-20 David Purton
+
+ - Fix Mandelbrot set shading definition #658
+
+2019-04-20 Henri Menke
+
+ - Add Easter to PGF calendar #593
+
+2019-04-19 Henri Menke
+
+ - Document save and use path #644
+
+2019-04-19 Henri Menke
+
+ - Missing definitions in tex4ht driver #660
+
+2019-04-19 Henri Menke
+
+ - Fix conflicting shading declarations for dvipdfm #659
+
+2019-04-17 Henri Menke
+
+ - Add some circuit symbols #641
+
+2019-04-17 Henri Menke
+
+ - Add tlpkg to Travis cache
+
+2019-04-17 Henri Menke
+
+ - Fix shadings in dvisvgm
+
+2019-04-17 Henri Menke
+
+ - % is not allowed in DVI #657
+
+2019-04-17 Henri Menke
+
+ - Fix shading regression #656
+
+2019-04-17 Henri Menke
+
+ - Don't switch mode in \pgfuseshading #655
+
+2019-04-12 Henri Menke
+
+ - Use TL usertree in CI
+
+2019-04-11 Henri Menke
+
+ - Merge pull request #647 from Skillmon/parserx
+
+2019-04-11 Jonathan Spratte
+
+ - requested changes from review
+
+2019-04-11 Jonathan Spratte
+
+ - Merge remote-tracking branch 'official/master' into parserx
+
+2019-04-11 Henri Menke
+
+ - More checks, fewer rsyncs
+
+2019-04-11 Jonathan Spratte
+
+ - fixed bug ignoring +
+
+2019-04-10 Jonathan Spratte
+
+ - fixes #628; needs the new parser version
+
+2019-04-10 Jonathan Spratte
+
+ - fixed a bug in pgfparserlet
+
+2019-04-10 Jonathan Spratte
+
+ - removed parserx from FILES
+
+2019-04-10 Jonathan Spratte
+
+ - parserx replaces parser
+
+2019-04-10 Henri Menke
+
+ - Force push to SourceForge
+
+2019-04-10 Henri Menke
+
+ - Add revision file to archive
+
+2019-04-10 Henri Menke
+
+ - Override before_script for SourceForge mirror
+
+2019-04-10 Henri Menke
+
+ - Update README [ci skip]
+
+2019-04-10 Henri Menke
+
+ - Typo
+
+2019-04-10 Henri Menke
+
+ - Missing packages
+
+2019-04-10 Henri Menke
+
+ - Better commit message
+
+2019-04-10 Henri Menke
+
+ - Deploy tlcontrib
+
+2019-04-10 Henri Menke
+
+ - PGF requires etex
+
+2019-04-09 Henri Menke
+
+ - Looks like we have to rerun twice
+
+2019-04-09 Henri Menke
+
+ - Rerun check for dvisvgm docs
+
+2019-04-09 Henri Menke
+
+ - Deployment script for website
+
+2019-04-08 Jonathan Spratte
+
+ - bugfix default space rule
+
+2019-04-08 Jonathan Spratte
+
+ - added pgfparserxlet
+
+2019-04-08 Henri Menke
+
+ - Merge branch 'fix-typos' of ssh://git.code.sf.net/u/frougon/pgf
+
+2019-04-08 Henri Menke
+
+ - Shading assignment has to global #650
+
+2019-04-07 Henri Menke
+
+ - Correct initial value for minimum width and height #649
+
+2019-04-06 Jonathan Spratte
+
+ - use pgfutil@namedef
+
+2019-04-06 Jonathan Spratte
+
+ - no etex, no folds
+
+2019-04-06 Jonathan Spratte
+
+ - Merge remote-tracking branch 'official/master' into parserx
+
+2019-04-06 Henri Menke
+
+ - Merge remote-tracking branch 'kpym/master'
+
+2019-04-06 Henri Menke
+
+ - Optional e-TeX protection
+
+2019-04-05 Jonathan Spratte
+
+ - finished parserx documentation and module
+
+2019-04-05 Henri Menke
+
+ - Fix Travis conditional
+
+2019-04-05 Henri Menke
+
+ - Only sync when on upstream
+
+2019-04-05 Henri Menke
+
+ - \noexpand instead of \ignorespaces
+
+2019-04-05 Henri Menke
+
+ - Automatically mirror changes to SourceForge
+
+2019-04-04 Henri Menke
+
+ - Allow optional comma in let assignment list #606 (oberdiek)
+
+2019-04-04 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Release 3.1.2!
+
+2019-04-04 Henri Menke
+
+ - Update README
+
+2019-04-03 Henri Menke
+
+ - Fix #523 (jkinable)
+
+2019-04-03 Henri Menke
+
+ - Fix #522 (kpymtzanev)
+
+2019-04-02 Henri Menke
+
+ - Welcome to GitHub :octocat:
+
+2019-03-13 Max Snippe
+
+ - Renaming perspective library macros
+
+2019-03-13 Max Snippe
+
+ - Fixed typo and missing backslash
+
+2019-03-11 Henri Menke
+
+ - Correct copyright statement
+
+2019-03-08 Max Snippe
+
+ - Added perspective library
+
+2019-03-06 Henri Menke
+
+ - Fix TeX conditionals on \pgfmathdeclarefunction (Eric Domenjoud) Feature Request #121
+
+2019-02-28 Henri Menke
+
+ - More accurate \pgfpointnormalised #518 #519 Feature #96
+
+2019-02-22 Henri Menke
+
+ - tikzmath needs to know about fpu
+
+2019-02-20 Henri Menke
+
+ - Fix shading angle #516 (Eric Domenjoud)
+
+2019-02-14 Henri Menke
+
+ - Fix trivial typo #514
+
+2019-02-08 Henri Menke
+
+ - Missed ligature suppression for dvisvgm #473
+
+2019-02-08 Henri Menke
+
+ - Now I hopefully got all of the ligatures #473
+
+2019-02-05 Henri Menke
+
+ - Some fixes for the shading patch #511 (Eric Domenjoud)
+
+2019-02-05 Henri Menke
+
+ - \long\def
+
+2019-02-05 Henri Menke
+
+ - Fake \scantokens has to at least strip braces
+
+2019-02-05 Henri Menke
+
+ - Only use \scantokens if available #508
+
+2019-02-04 Henri Menke
+
+ - Revert "Revert "Patch for shadings #511 (Eric Domenjoud)""
+
+2019-02-04 Henri Menke
+
+ - Revert "Patch for shadings #511 (Eric Domenjoud)"
+
+2019-02-04 Henri Menke
+
+ - Making the declared coordinate accessible
+
+2019-02-04 Henri Menke
+
+ - Globally remember declare coordinate of a node
+
+2019-02-04 Henri Menke
+
+ - Check for \pgfpointxyz before \rawx, \rawy, \rawz
+
+2019-02-04 Henri Menke
+
+ - Add \rawx, \rawy, \rawz to let operation
+
+2019-02-04 Henri Menke
+
+ - Disable strict nesting for now
+
+2019-02-04 Henri Menke
+
+ - Patch for shadings #511 (Eric Domenjoud)
+
+2019-02-03 Stefan Pinnow
+
+ - - minor stuff
+
+2019-02-02 Christian Feuersaenger
+
+ - Merge branch 'master' of ssh://git.code.sf.net/p/pgf/git
+
+2019-02-02 Christian Feuersaenger
+
+ - Merge branch 'branch_3.1_hotfix'
+
+2019-02-02 Christian Feuersaenger
+
+ - updated release file
+
+2019-02-02 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Release 3.1.1!
+
+2019-02-01 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug #503: regression prevented the use of dvips. This reverts the
+ bugfix for bug #362
+
+2019-01-05 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Release 3.1!
+
+2018-12-28 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - \pgfmathprintnumber: implemented 'retain unit mantissa=true|false' (feature #92)
+
+2018-12-30 Henri Menke
+
+ - fixed wrong projection of `canvas is xy plane at z` in `3d` library (bug #410)
+ - added documentation of `3d` library to the manual (support request #11)
+ - defined CMYK colors for ConTeXt (feature request #33)
+ - `text along path` decoration repeated last char multiple times when
+ this was in math mode (bug #479)
+
+2018-12-29 Henri Menke
+
+ - fixed accidental usage of `\rm` (bug #476)
+
+2018-12-28 Henri Menke
+
+ - fixed newlines for tex4ht (bug #327)
+ - fixed bug that `fit` didn't work with `transform shape` (bug #330)
+ - fill color in nodes now respects colormodel (bug #349)
+ - fixed broken VTeX support (bug #350)
+ - `text=<color>` now works fine when in the nodes' text `\textcolor` is used (bug #362)
+
+2018-12-26 Henri Menke
+
+ - allowed whitespace between layers in `\pgfsetlayers` (bug #376)
+
+2018-12-25 Henri Menke
+
+ - fixed `\method` which can now contain empty lines (bug #448)
+ - manual improvement regarding `pgfoothis` (bug #452)
+ - documented commands `\pgfooeset`, `\pgfooappend`, `\pgfooprefix` (bug #452)
+
+2018-12-24 Henri Menke
+
+ - fixed bug in \pgfkeysedef (bug #306)
+ - `miter limit` now raises an error when a value < 1 is given (bug #347)
+ - fixed bug that `\pgfmathmax` and `pgfmathmin` were broken when
+ `fixedpointarithmetic` library was loaded (bug #360)
+ - added missing function `\pgfmathpneg` in `fixedpointarithmetic` library (bug #361)
+ - fixed bug that brace decorations were malformed for large amplitudes (bug #351)
+ - made node parser aware of prefix and suffix (bug #397)
+
+2018-12-23 Henri Menke
+
+ - (almost) fixed guillemets for LuaTeX (bug #473)
+
+2018-12-21 Henri Menke
+
+ - fixed incorrect spelling in pgflibrarydecorations.text (bug #479)
+ (but this doesn't solve the bug 100%)
+ - fixed 'bend left' bug if used with a formula (bug #423)
+ - use \typeout stream instead of \write16 (bug #488)
+ - fixed some bugs regarding graphdrawing electrical "springs" (bugs #380 and #381)
+
+ 2018-12-20 Henri Menke
+
+ - fixed pgf_lookup_and_require for new luaotfload (bug #493)
+ - fixed graphdrawing for ConTeXt (bug #477)
+
+2018-04-30 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - added utility \pgfmathifexpression (and special treatment in luamath
+ library and fpu library)
+
+2017-11-14 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - intersections lib: improved accuracy of intersections for linear paths
+
+2017-02-08 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed incompatibility issue of tikzmath and fpu reported in
+ http://tex.stackexchange.com/questions/349766/pgfplots-on-tikzmath-function-with-conditionals-returns-an-error
+
+2016-12-31 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Improved driver detection (bug #395 TikZ does not create output with LuaTeX 0.95.0)
+ - New luatex driver now supports fallback to pdftex driver if
+ luatexversion is older than 95 (let's hope this works reliably - luatex
+ used to have version 240 some time ago!)
+
+2016-08-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bugs that caused pgfsys-dvips.def to generate corrupt
+ PostScript for all nodes.
+
+2016-07-16 Till Tantau <tantau@users.sourceforge.net>
+
+ - Bounding box computations for animations implemented.
+ - Animated arrow tips are now possible.
+
+2016-07-13 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed incompatibility between textpos (absolute mode) and external
+
+2016-06-17 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed \write18 issues in luatex 0.87 and later (by using os.execute())
+ affects external lib and plot function.
+
+2016-03-31 Till Tantau <tantau@users.sourceforge.net>
+
+ - Lots of bugfixes in animation and svg code.
+ - Added optimizations to reduce file size for svg code
+ (better support by dvisvgm will be needed however for more
+ compact text!).
+
+2016-03-18 Till Tantau <tantau@users.sourceforge.net>
+
+ - First working, fully documented version of TikZ animations!
+
+2016-02-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed manual stuff to compile it with dvisvgm.
+
+2016-02-02 Till Tantau <tantau@users.sourceforge.net>
+
+ - Rewrote tikz animation lib.
+
+2016-01-06 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - added context-related aux file fix of Hans Hagen
+
+2016-01-02 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed save stack issues (eliminated 'retaining' issues) about pgf@x and pgf@y
+
+2015-12-29 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: 'force remake' now also updates .md5 files
+
+2015-11-28 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fpu: fixed floor and ceil
+ - fixed basic layer floor function
+ - lua library: improved interoperability of luamath and fpu
+ - unit test now compares luamath, fpu, and pgfbasic math
+
+2015-11-15 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - activated math parser in foreach's end notation to allow \foreach \i in {0,...,10-9}
+
+2015-09-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on pgfsys-dvisvgm.def a lot. Now requires
+ dvisvgm-1.5.3 because of switch from pt to bp there. Does
+ correct bounding box computations.
+
+2015-09-06 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in luamath library
+
+2015-08-29 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: added support to automatically externalize references and
+ labels with 'mode=convert with system call'
+
+2015-08-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - Reworked implementation of animations for tikz and started
+ on documentation of the backend.
+
+2015-08-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - First complete implementation of animations for tikz! (for
+ svg backend). Documentation still missing, but works nicely.
+
+2015-08-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - First work on animations for svg. Added commands in pgfsys
+ and added module pgfmoduleanimations. No documnetation yet.
+
+2015-08-07 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Release 3.0.1!
+
+2015-08-03 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed regression introduced for pgf 3.0.0 (bug #149): leading empty
+ lines at the beginning of plot files disabled '-- plot'
+ - fixed bug #291 (missing white space trimming in node labels)
+ - fixed bug #313 (alias option did not respect name prefix/suffix)
+ - fixed bug #341 ("is in pic" was not reset)
+ - fixed bug #365 (caused by missing adoption after copy-paste in tikzlibraryfolding)
+ - fixed bug #315/316 by applying the suggested patch and verifying it
+
+2015-06-12 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed fpu math functions for int, ceil, and floor
+ - added \pgfmathlogtwo and \pgfmathlogten as requested in bug #359
+
+
+2015-06-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed problem in gd: Creating more than about 15 vertices
+ inside a graph drawing algorithm was impossible since this
+ created too many text input levels. Reorganized the interplay
+ between tex and lua for the coroutine so that no input levels
+ are created.
+
+2015-06-05 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added number nodes option to graph lib.
+
+2015-05-18 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed nullfont warnings in axes in datavisualization.
+ - Fixed wrong axes for school book plots.
+
+2015-05-15 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed nullfont warnings when parsing logic gate inputs.
+
+2015-05-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug in tikz.code.tex concerning colors for arrow tips:
+ Setting and restoring the global color "trackers"
+ pgf@fillcolor@global over groups was done only in \pgfscope,
+ but not in the scopes opened and closed by tikz when drawing a
+ path (\pgfsys@beginscope is used there). This caused wrong
+ colors to be used.
+
+2015-05-08 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Updated patterns.meta library.
+
+2015-05-02 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - context: committed patch to adopt pgfutil-context for new (incompatible)
+ context handling of colors -- contains some cleanup by Hans Hagen.
+
+2015-03-28 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in external lib: braces in external filenames confused the generator
+
+2015-01-02 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in fpu: equal(x, 0) failed for x<0
+
+2014-12-30 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in atan2 (returned wrong sign for atan2(4e-5,-5))
+ - implemented atan2 in FPU
+
+2014-11-02 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed save stack issue (TeX capacity exceeded, sorry [save size=250000])
+ if the color changes a _huge_ number of times during a single path.
+
+2014-10-11 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - worked on LUA math parser: ensured that a suitable first scope of
+ functions works. I also added support for 'declare function'
+
+2014-10-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added provisional code for patterns.meta library. Patterns
+ can now be declared using TikZ code with additional support
+ for tile transformations. Currently only PDF output supported
+ at back-end (uses \pgfsys@declarepattern@meta in pgfsys-pdftex.def).
+
+2014-08-04 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - finished first prototype of a LUA math parser. It is orders of magnitude
+ faster than its TeX pendant, features a pure LUA mode and also offers a
+ fallback to the TeX \pgfmathparse for unsupported operations/functions
+ only defined in TeX.
+
+2014-07-09 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug (regression of bug #229): external lib with dvips produced
+ wrong bounding box (was broken entirely)
+
+2014-07-08 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed regression in external lib: 'mode=graphics if exists' broke any
+ undefined label warnigns
+ - added automatic "fast lane" to math parser: if the input is a number
+ without units, it will return that as-is. Reduces typesetting time down to
+ 66% for huge scatter plots and has just 1% overhead for math intensive
+ figures.
+
+2014-06-22 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - added switch 'trig format=deg|rad' which allows to switch sin,cos,tan,
+ and their friends to radians. It works for all user input
+ arguments - I hope without unanticipated side-effects (marked as
+ experimental)
+
+2014-05-17 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: defined suitable defaults for 'system call' depending on driver
+ - external lib: solved incompatibility with biblatex's \cite[][]{name}
+ command (http://tex.stackexchange.com/questions/173465/tikz-error-for-externalized-graphics-but-output-is-correct}
+ - number parser/printer: added switch 'read comma as period' to read
+ localized input numbers. Off by default but added useful hint to parser
+ message.
+
+2014-05-06 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Fixed bug #308 fixedpointarithmetic: unwanted spaces by line ends
+
+2014-03-30 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Fixed feature #81: signum function (fpu + pgf basic layer)
+
+2014-03-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed all \begin{scope} and \end{scope} in foldings lib,
+ changed them to \scope and \endscope.
+
+2014-03-21 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed #303 Type in pgfmanual (colormixin)
+ - Fixed #302 pgf-3.0: Cannot plot a constant function. Will
+ now center the constant line.
+ - Addressed #299 Precision problem with explicitily anchored
+ labels: While not a bug, I added a "centered" option for cases
+ similar to this one (although, in this particular case, the
+ new centered option is not what is needed)...
+ - Fixed #298 \pgfarrowsdeclare is still mentioned in pgfmanual
+ - Fixed #294 Nodes for arcs, which angles are calculated
+ simultaneously.
+ - Fixed #292 "node scale and outer sep" by introducing the new
+ option "outer sep=auto", which takes care of both this problem
+ (at least in all normal cases) and also of the draw versus
+ fill problem with outer seps.
+
+2014-03-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed #285 \tikz@intersect@namedpaths persists outside
+ scopes as suggested.
+ - Fixed #284 Additional rerun statement for overlays (for LyX)
+ by adding the proposed solution (essentially).
+ - Added post-fix for #288 by undoing all -- ligatures in
+ verbatim code.
+
+2014-03-19 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fxied #283 "Is there a smarter way to handle units in math
+ engine?" by adding the "scalar" function.
+ - Fixed #288 "All the '£' should be '$' in the examples of
+ pgfmanual..." by switching to T1 enconding.
+ - Fixed #282 "\pgfmathredeclarefunction does not work properly."
+
+2014-02-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added first edge routing algorithm to gd.
+
+2014-02-02 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - intersections libs: improved robustness and accuracy for curveto paths
+ by using the floating point library together with Mark Wibrow.
+
+2014-01-08 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in latex/plain tex shipout routines for xdvipdfmx and xelatex:
+ combination of shadings and standalone package failed to work.
+
+2013-12-31 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for 'rotate around x/y/z' keys which now evaluate
+ the argument provided.
+
+2013-12-25 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - intersections lib: detected duplicates in line-to intersections
+ in endpoints and suppressed them.
+ - intersections lib: stored time offset for each intersections as optional
+ property (i.e. if it comes for free). This is required to compute fill
+ paths
+
+2013-12-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - Release 3.0.0!
+
+2013-12-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - In preparation for the release 3.0.0, I pimped the manual a
+ bit. It will now automatically detect whether graph drawing
+ C libs are available or not. Also, syntax hilighting is now
+ always switched on. I also some subtle optical hints to
+ crossreferenced words in the code examples; this is pretty
+ useful, I think.
+ - Did a lot of cleaning up for the release.
+
+2013-12-18 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed a bug in Vertex.lua that returned wrong anchor
+ positions for non-centered vertices.
+
+2013-12-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #280 "Layered layout" produces unknown key with graphs library.
+ - Fixed bug #279 "Some parts of arguments in foreach macro are lost".
+ - Fixed bug #258 "Default arrow edge style puts circumflex in
+ drawn end node" by now allowing people to say tip=on proper draw.
+
+2013-12-08 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - intersections lib: ensured that 'name path global' is reset between main paths.
+
+2013-11-30 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - worked on intersections lib (internals only); added O(N) list
+ append/prepend utilities
+
+2013-11-18 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added keys 'rotate around x', 'rotate around y' and
+ 'rotate around z' to rotate the xyz coordinate system
+ around the x, y, or z axis.
+
+2013-11-17 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixes for 'text effects along path' decoration and docs.
+
+2013-11-16 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: added support for 'up to date check=md5' for lualatex.
+ Now, lualatex and pdftex both result in the same checksums (by means of
+ \usepackage{pdftexcmds})
+
+2013-11-16 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Finalised 'text effects along path' decoration and docs.
+
+2013-11-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Changed keyval example (and references to define@key)
+ in pgfcalendar documentation to pgfkeys stuff.
+
+2013-11-08 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Minor fixes to decorations.text and math libraries documentation
+
+2013-11-07 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added 'text effects along path' decoration.
+
+2013-11-01 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Fixed regression/bug in 'name path global'.
+
+2013-10-31 Till Tantau <tantau@users.sourceforge.net>
+
+ - Applied path for bug #277 "\beforeforegroundpath not working".
+
+2013-10-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Prepared manual for new release (fixed overful boxes and
+ index problems).
+
+2013-10-08 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Updated math library (minor fixes).
+
+2013-10-07 Till Tantau <tantau@users.sourceforge.net>
+
+ - Applied some fixes so that C code for graph drawing works
+ once more.
+ - Arrow tips and their doc are now officially finished!
+ - Added documentation of nonlinear transformations.
+
+2013-10-06 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - modified release script to allow uploads of unstable TDS
+ zips to http://pgf.sourceforge.net using
+ make -f pgf/scripts/pgf/Makefile.pgf_release upload USER=cfeuersaenger
+
+2013-10-02 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed problem with math parser inserting extraneous
+ spaces when parsing \dimenexpr
+
+2013-09-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed blend mode syntax to standard pgf syntax (since PDF
+ and SVG do not agree on names...).
+ - Added scale and slant options for arrow tips.
+ - Added more generic arrow tips.
+
+2013-09-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - First version of comlete arrow documentation finished. Still
+ need to document the arrows.meta library, though.
+ - Added "tips" option for drawing arrow tips without drawing
+ paths.
+
+2013-09-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #273 "Graph drawing sublayouts fails".
+ - Incorporated first partial documentation of the arrow tips
+ into the main documentation.
+ - Fixed bug bugs:#272 "SVG parser error after close path" as
+ suggested by Mark Wibrow.
+ - Also changed the default syntax for svg path command so that
+ it uses braces instead of quotation marks. (Quotation marks
+ still work, of course.)
+
+2013-09-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Started working on arrow doc.
+
+2013-09-20 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added macro to convert string of digits to comma separated list.
+
+2013-09-18 Till Tantau <tantau@users.sourceforge.net>
+
+ - First version of new arrow tip management done. Up and
+ running! Still needs documentation and the old arrow tip
+ codes should (but need not) be ported.
+ - Did some porting of old code, added fixes. Doc still missing.
+
+2013-09-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #264: "\pgfkeys /errors/unknown key should (?) expand first argument"
+ - Fixed bug #268: "`matrix of nodes' isn't working properly any more"
+
+2013-09-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Corrected typos (bug #266 and bug #265)
+
+2013-09-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - added magnetic tape shape.
+
+2013-09-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #262/267: "Line breaks are not working in labels anyy more."
+ - Fixed bug #260: "TikZ node on background in pgfextra"
+ - Started work on bending arrows.
+
+2013-09-05 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: fixed bug: file dependency handling was incorrect and
+ suffered from regression caused by MD5 checks
+
+2013-08-31 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - repaired incompatibility with pgfplots <= 1.8: samples key was
+ evaluated in context of floating point unit and new pgf code relied on dimension
+ registers.
+
+2013-08-29 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added "turn" key.
+
+2013-08-28 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added "angle" pic type and "angles" library.
+ - Patched gd loader code so that it works with context mark IV.
+
+2013-08-27 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added new pic path command.
+ - Patched pgfsys-dvipdfmx.def to step around the bug in
+ (x)dvipdfmx that caused scaled boxes (including scaled
+ graphics) inside nodes to be displayed incorrectly.
+
+2013-08-24 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in fpu: 0^0 and 0^x both produced nan. Now we get
+ 0^0=1 and 0^x = 0.
+
+2013-08-22 Till Tantau <tantua@users.sourceforge.net>
+
+ - Removed claims from manual (not by me...) that TikZ does not
+ work with Mark IV of context. I just tried it and everything
+ I tried (including advanced stuff like shadings) worked fine.
+
+2013-08-18 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed pgf intersection library to ensure that
+ specialround tokens are processed.
+
+2013-08-06 Till Tantau <tantua@users.sourceforge.net>
+
+ - Added support for dvisvgm. Quite nice...
+
+2013-08-05 Till Tantau <tantua@users.sourceforge.net>
+
+ - Worked on tex4ht code. Works reasonably well know and even
+ graph drawing is possible (when luatex is used for
+ typesetting; for this I needed to fix some latin1 characters in
+ html4.4ht). Also, I renamed /tikz/tex4ht... to /pgf/tex4ht
+ (someone else added that) since tikz has nothing to do with
+ that stuff.
+ Typesetting the manual in tex4ht no longer works, but that seems
+ like too much bother for my taste.
+
+2013-08-02 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #256 "The special \pgfcoordinate macro doesn't
+ expand \pgfpictureid."
+
+2013-08-04 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: fixed incompatibility of pdflscape with
+ external lib
+
+2013-08-01 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed a problem with pdf resources of transparency groups in
+ dvipdfmx.
+
+2013-07-31 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #149 "/tikz/raw gnuplot ignoring segmented plot"
+ by introducing a new way of handling plot streams. There are
+ now new kinds of points (outliers and undefined points) and
+ "new data sets" commands inside streams. Handlers (like the
+ lineto and curve handlers) can be configured to interpret
+ these as jumps (this is the default).
+ - Fixed bug #255 "Trig computations offend fp via fixedpointarithmetic lib"
+
+2013-07-31 Mark Wibrow <vibrovski@users.sourceforge.net>
+ - Added "math" library. Could be integrated with calc library.
+
+2013-07-26 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Fixed bug in external lib: mode=list and make did not cope well with
+ \ref in externalized images. These will be remade now.
+
+2013-07-24 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #162 "PGF manual examples use undefined "shape example" style"
+ - Fixed bug #169 "ghostscript error: /undefined in pgfo"
+ - Concerning bug #167 "node pin option sets
+ inconsistent/incorrect angle" I added some clarification in
+ the manual that explains the observed behaviour.
+ - Fixed bug #158 "\pgfmathparse does not support e-TeXs
+ \numexpr and \dimexpr". You can now also use
+ \pgfmathsetlength to assign a muskip a value. Internally,
+ "mu" is treated like "pt", but if an expression contains
+ "mu", \pgfmathsetlength and \pgfmathaddtolength will convert
+ the number to "mu" before the assignment.
+
+2013-07-22 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #173 "Tikz's transparency, xelatex and preview
+ package" by adding a specific fix for the interaction
+ between preview.sty and everyshi.sty in pgfutil-latex.def.
+
+2013-07-19 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - optimized mark=* and mark=o (q path versions lead to 10% time reduction)
+ - adopted new pgfkeys feature to /handler config/full or existing (
+ required when /.search also is used to find the correct key path)
+
+2013-07-19 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #175 "In PGF oo module, calling a method strips grouping"
+ - Fixed bug #181 "Need to document |- coordinates using calc notation"
+ - Fixed bug #187 "\pgfmathanglebetweenpoints is not documented"
+ - Increased accuracy of atan, atan2 and
+ \pgfmathanglebetweenpoints.
+
+2013-07-18 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug "#168 PGF is sensitive to dollar catcode"
+ - Fixed bug "#186 pgfonlayer makes pgf forget options" and
+ added "every on background layer" option.
+ - Fixed bug "#192 pgffor scope iteration is buggy"
+ - Fixed bug "#196 Incoherent syntax for Bézier curves"
+ - Fixed bug "#199 Drawing error for chamfered rectangle"
+ - Fixed bug "#201 Markings fail with "Dimension too Large" on
+ certain paths" by fixing a mistake and the decoration core
+ and, additionally, in pgfmathanglebetweenpoints.
+ - Fixed bug "#254 building currenct CVS version fails on
+ graphdrawing with current luatex": Will now work nicely with
+ TeXLive 2013 and Lua 5.2.
+ - Added feature request "bug #203 Blending modes and better transparency"
+
+2013-07-17 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #204 "strange influence of \baselinestretch on
+ tikz figure" by no longer sharing \pgfutil@tempa with latex:
+ This register gets changed by LaTeX in a fontchange, which, in
+ turn can happen at the beginning of every
+ \pgfmathsetlength.
+ - Fixed bug #207 "Decoration markings not on path on large
+ lines" by using a more precise computation of positions on
+ straight lines in decorations. Also, the angle computation
+ is now much more precise by fixedin bug #201.
+ - Fixed bug #212 "Error if using plot into a \foreach loop in
+ a single path" by making \pgffor@beginhook and friends local
+ to the current \foreach. A nice side-effect is that one can
+ now nest \foreach statements on a path and also mix in the
+ plots. Hopefully, no one relied on the (undocumented,
+ unsupported) old bevahiour of the hooks.
+ - Fixed bug #213 "pgfmathsetcounter only works in local scope"
+ by adding a note in the documentation.
+ - Fixed bug #211 "\nodepart ignores text transparency"
+ - Fixed bug #220 "Transformations ignored in edge decoration."
+ - Fixed bug #221 "xyz spherical and cylindrical coordinate, radius not defined"
+ - Fixed bug #225 "pgfkeys "/errors/unknown choice value" ignores parameters"
+ - Fixed bug #253 "\pgfkeysfiltered cannot accept long arguments"
+ - Fixed bug #252 "I'm not able to build the current CVS
+ version". This included a number of patches to fix problems
+ introduced with the bugfixes introduced recently
+
+2013-07-16 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug #226 "matrix column sep=-\pgflinewidth changes after empty cell"
+ - Fixed bug #229 "pgfpagesuselayout breaks beamer class"
+ (hopefully, setting page sizes is really messy in TeX!).
+ - Fixed bug #232 "pow function broken for 0^x for non-integer values of x"
+ - Fixed bug #165 "\draw with empty domain results in infinite calculation"
+ - Added better error message to adress bug #244 "mindmap-style
+ "invalidates" coordinate shape."
+ - Fixed bug #235 "\def\costhirty{0.8660256} not really used"
+
+2013-07-15 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug "#237 CVS-version: pdfimage error: key interpolate undefined"
+ - Fixed bug "#245 broken key /pgf/decoration/reset marks"
+ - Fixed bug "#239 picture disappear after a zero-width rectangle width shading"
+ - Fixed bug "#247 Error messages hard to catch in plain TeX/ConTeXt"
+ - Fixed bug "#166 Possibly typos in circuits.logic.IEC"
+ - Fixed bug "#249 pgfkeys: /handlers/first char syntax is not
+ 'self-contained' (CVS version)"
+ - Fixed bug "#248 circuits adjustable annotation improperly placed"
+
+2013-07-13 Till Tantau <tantua@users.sourceforge.net>
+
+ - Fixed bug "#250 pgfkyes: .append style and similar undouble # tokens"
+ - Fixed bug "#143 label changes center of a matrix node"
+
+2013-07-12 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #128 "fit does not scale if used in scaled scope"
+ - Fixed bug #136 "\hrulefill inherits or not pgf line styles"
+ - Fixed bug #224 "Including Tikzpicture in third part of
+ multipart node"
+
+2013-07-11 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #251 "cross out shape interacts with path options of path it is drawn on"
+ - Fixed bug #139 "Placement of node inside matix environment"
+ - Fixed bug #131 "text centering calculates wrong" and added
+ new "node font" option.
+ - Fixed bug #121 "Annoying "Underfull \hbox (badness 10000)" message"
+ - Fixed bug #134 "Edge node style affecting arrowhead".
+
+2013-07-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #132 "Error in matrix with column sep "between"
+ origins"
+ - Fixed bug #133 "\draw[-<<,>=stealth] (10,45) -- (40,45); does
+ not work." However, this introduces a (small, only visual)
+ incompatibility with previous versions. If you need the visual
+ effect "-<<" used to have (which, in a sense, was wrong), use
+ "-< <" instead. The new "-> >" is also quite handy.
+
+2013-06-28 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #116 "Decorations can't be repositioned when
+ pre/post used."
+
+2013-06-25 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #241 "div/null error by (270:length) and a fading line."
+ - Fixed bug #126 "Incorrect placed labels for inplicite positioned nodes."
+ - Added foreach syntax to nodes. This is useful and also
+ needed to fix the problem that the foreach statement cannot
+ be used after a to path.
+
+2013-06-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #18 and #74 (active characters and tikz) by virtue
+ of the new "babel" library, which deactivates catcodes at the
+ beginning of tikz pictures and reactivates them in nodes.
+
+2013-06-21 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #110 "cannot add node after cycle operation"
+ - Fixed bug #88 "\pgftransformarrow does not rotate with \pgfpointanchor"
+ - Fixed bug #86 "macro-expanded tree node has bad edge anchor"
+ - Fixed bug #85 "PGF + Crop package, at least for pdftex."
+
+2013-06-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #83 "Transparency Problem with \usepackage{endfloat}."
+ - Applied patch #19 pgfkeys: ".search also" fails at unbalanced "\if" values
+ - Applied patch #18 Missing grid lines with
+ negative increment
+ - Applied patch #17 TikZ folding library
+ - Applied patch #14 inheritance in the oo module
+ - Applied patch #13 leaking space in \pgfpointintersectionoflines
+ - Applied patch #11 Patch for Bug #3165961 (\pgfmathmax and \pgfmathmin)
+ - Fixed problem of patch #9 Add papersize to XeTeX driver
+ - Applied patch #8 Support for changing physical page size with XeTeX
+ (also added position saving support, while I was at it...)
+ - Applied patches #3, #4, #5, #6 (typos in manual) as far as possible
+
+2013-06-18 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #236 "Scaled closed paths, start/end points dont exactly match":
+ "cycle" can now be used with all path operations where it
+ makes sense, not only with --. In particular, things like
+ ".. cycle" or "to [bend right] cycle" are now allowed.
+
+2013-05-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Reworked handling of edge and vertex paths in gd. In
+ particular, edge--vertex intersections are now computed in
+ Lua, rather than in TikZ. This is much more powerful and
+ allows beautiful arcs between vertices. It is also very
+ useful for planar graph drawings when several edges leave a
+ vertex in the same direction.
+
+2013-04-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Did away with luadoc, now using simple handcoded documentor
+ that will also work with Lua 5.2
+ - Redid OGDF support. Resonably stable base now.
+ - Added better C support.
+ - Should now work with both Lua 5.1 and 5.2
+
+2013-03-15 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed incompatibility of fixltx2e and external lib
+
+2013-02-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Reworked Storage mechanism of graph drawing system.
+ - Added phylogenetics library for graph drawing; documentation
+ still only rudimentary.
+
+2012-12-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Started adding support for calling C graph drawing functions
+ from Lua.
+ - First proof of concept for OGDF finished.
+ - Must still address luatex shared library link problems.
+
+2012-12-25 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - fixed bug in external lib: \tikzexternalgetnextfilename did reset the
+ value of \tikzsetnextfilename and 'export next'
+
+2012-11-30 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - updated driver pgfsys-xetex: now, it supports all that the new driver
+ for dvipdfmx does which includes fadings, functional shadings, and
+ patterns.
+
+2012-11-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - First complete documentation of the graph drawing
+ system. (Finally!)
+
+2012-11-27 Till Tantau <tantau@users.sourceforge.net>
+
+ - Renamed gd files to shorter versions: instead of
+ pgf/gd/model/pgf.gd.model.Edges.lua we now have
+ pgf/gd/model/Edge.lua and so on.
+ - Worked on gd documentation. Only binding doc is still a
+ mess.
+
+2012-11-26 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on gd documentation.
+
+2012-11-21 Till Tantau <tantau@users.sourceforge.net>
+
+ - New version of gd lib. The internals have been completely
+ redone. In particular, no tikz libraries are needed for the
+ individual algorithms any longer, all declarations are now
+ done completely inside Lua. This makes gd usable (in
+ principle) independently of tikz and pgf.
+ - Because of this, all declarations of algorithms need to be
+ redone.
+
+2012-11-10 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - external lib: fixed spurious white space (caused by 'up to date check')
+
+2012-11-01 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - manual styles: improved robustness of auto cross references & active spaces
+
+2012-10-18 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Fixed a bug with active colon in circuits lib. Probably more to
+ fix in other libraries.
+
+2012-10-11 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+
+ - Improved precision of math functions asin and acos (using linear
+ interpolation instead of constant interpolation)
+
+2012-09-27 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on gd.
+
+2012-09-26 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+ - fixed pgfsys-pdftex.def : very old regression with \setbeamercovered{transparent} and \pause
+ Patch by Hendrik Vogt
+
+2012-08-29 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added support for sublayouts in gd (not yet fully
+ documented). This allows one to use several algorithms inside
+ a single graph.
+
+2012-06-28 Till Tantau <tantau@users.sourceforge.net>
+
+ - Redone handling of clusters in gd yet again. Renamed them to
+ "collections". Much better system now, can handle hyperedges,
+ subgraphs and other stuff (in principle).
+ - Nodes generated by a gd algorithm now have correct size
+ information (this one was tricky!).
+
+2012-06-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Redone handling of clusters in gd.
+ - Worked on gd documentation.
+
+2012-06-18 Christian Feuersaenger <cfeuersaenger@users.sourceforge.net>
+ - fixed minor expansion issue \foreach \x in {a,...,d} lead to unexpanded value \x
+
+2012-06-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - externalization: added special switch to deactivate incompatible
+ geometry drivers during externalization
+
+2012-05-31 Till Tantau <tantau@users.sourceforge.net>
+
+ - Redone pgf.gd.model.Arc
+ - Added documentation for said class.
+
+2012-05-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on gd documentation.
+ - Replaced old luadoc by customized version. Gets called
+ directly from tex.
+
+2012-05-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: added support for MD5/diff based up-to-date checks.
+ Changes to a picture will automatically result in a remake of the
+ respective external graphics.
+
+2012-05-03 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Fix bug #3527068 (\pgfmathatantwo did not exist)
+
+2012-05-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed pgf.gd.new_graph_drawing_algorithm syntax. Not
+ likely to change again...
+ - Added support for algorithms to create nodes and edge in the
+ syntactic digraph.
+ - Introduced library graphdrawing.examples that includes some
+ code demonstrating how "things are done".
+
+
+2012-05-13 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - context: fixed catcode issues by means of suitable module
+ \protect/\unprotect statements.
+
+2012-05-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Introduced a new class model for graph drawing (Digraph,
+ Arc, and Vertex instead of Graph, Edge, Node). I'm currently
+ porting all the old code, but it takes a while and it's a
+ bit messy right now. Some easy algorithms are already based
+ on the new system, old ones not. In the end, things should
+ be significantly faster and also easier to program.
+
+2012-05-03 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Attempt to fix bug in calc lib when '!' or ':' are active (not
+ fully tested but should work).
+
+2012-05-02 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Attempt to fix bug with label and pin when ':' is active (not
+ fully tested but should work).
+
+2012-04-19 Till Tantau <tantau@users.sourceforge.net>
+
+ - Finished the first two chapters of the documentation of gd
+ (overview and tikz usage).
+ - Module system is now redone and the directory structure
+ has been reorganized. No more messing around with lua
+ modules, everything is perfectly portable now.
+
+2012-04-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Started to completely redo the module system of graph
+ drawing in lua. I'm in the middle of it, so its currently
+ messy, but it works.
+
+2012-04-12 Till Tantau <tantau@users.sourceforge.net>
+
+ - Implemented packing procedure for graph drawing.
+ - Cleaned up graph drawing source some more.
+ - Renamed lots of files (still not happy with it, though).
+
+2012-04-11 Till Tantau <tantau@users.sourceforge.net>
+
+ - Implemented Reingold-Tilford tree layout.
+
+2012-04-05 Till Tantau <tantau@users.sourceforge.net>
+
+ - Implemented my first graph drawing algorithm: circular layout.
+
+2012-04-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Introduced new declaration mechanism for graph drawing
+ algorithm classes
+ - Implemented preprocessing step of decomposing a graph into
+ connected components.
+
+2012-04-02 Till Tantau <tantau@users.sourceforge.net>
+
+ - Cleaned up graph drawing algorithm directories: Moved
+ obsolete algorithms to special directory.
+ - Switched graph drawing calling interface from function-base
+ to object-based: All graph drawing algorithms must now be
+ implemented in a class
+ - Cleaned up file and class names of graph drawing engine.
+
+2012-03-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed problem that in case math library is loaded before pgf
+ some math functions were broken (because \pgfmath@xa and
+ \pgf@xa were different registers, which they should not be).
+
+2012-03-29 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added anchoring and orientation to graph drawing library.
+
+2012-03-21 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added arrows.spaced library.
+ - Added quotation syntax to graph lib.
+ - Renamed some graph drawing layouts.
+ - Worked on documentation of graph drawing lib.
+
+2012-03-07 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Moved wrappers for luatex primitives (\pgfutil@directlua,
+ \pgfutil@ifluatex, \pgfutil@luaescapestring) to pgfutil-common.tex
+ - Added support for luatex to the profiler library by emulating
+ \pdfelapsedtime.
+
+2012-02-27 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed wrong edef in graph lib that broke the /-syntax when
+ text contained expandable stuff.
+
+2012-02-21 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - More work on the luamath parser and evaluator.
+
+2012-01-24 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Fix a bug in tikz polar coordinates (reported on tex.se
+ http://tex.stackexchange.com/questions/41828/using-math-in-tikz):
+ braces around a delimited argument are removed.
+
+2012-01-10 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Fix a bug in pgfmath != operator (reported and fixed on tex.se
+ http://tex.stackexchange.com/questions/40605/using-in-pgfmathparse)
+
+2012-01-09 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Fix a pgfmath dependency for pgffor.
+
+2012-01-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added pos support to the arc command (finally...).
+ - Added support to the graph library for drawing tries.
+ - Added support to the graph library for adding edge labels in
+ an easier way.
+
+2011-12-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added the 'fixed relative' number formatting style.
+
+2011-12-28 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added 'const plot mark mid' and 'jump mark mid' plot handlers.
+
+2011-12-02 Till Tantau <tantau@users.sourceforge.net>
+
+ - Renamed "layered drawing" to "layered layout" for
+ consistency.
+
+2011-11-12 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - More work on the lua math parser and evaluator.
+ - Added wrappers for luatex primitives: \pgfutil@directlua,
+ \pgfutil@ifluatex, \pgfutil@luaescapestring
+ - Make lua code more lua 5.2 compatible
+
+2011-11-11 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Work on the lua math parser and evaluator. Begin to merge Mark's
+ code with mine.
+
+2011-11-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added FPU support for ==, !=, <=, >=, ?
+
+2011-10-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed problem with pgf number printer: it introduced spurious spaces
+ tracker id 3430171. Thanks to Clemens Koppensteiner for the bugfix.
+
+2011-09-25 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - \pgfsetlayers can now be given inside of a pgfpicture (or tikzpicture)
+
+2011-06-22 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - The lua math parser now works on basic expressions (no units, no
+ arrays, no strings, no functions, ...?).
+
+2011-06-02 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Some work on a lua (lpeg based) math parser.
+
+2011-05-31 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Added a gnuplot call key to pgfmoduleplot.code.tex (feature
+ request #3308340).
+
+2011-05-30 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Initial work on layered drawing algorithms.
+
+2011-05-25 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Added dim function for array to pgfmath (to be documented)
+ - Some work on a ODE solver
+
+2011-05-20 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - removed spurious white spaces in my bugfix for pgfmathdivide
+
+2011-05-19 Till Tantau <tantau@users.sourceforge.net>
+
+ - Second attempt at fixing spy lib...
+
+2011-05-18 Matthias Schulz <ma.schulz@email.de>
+
+ - graph drawing:
+ - added short overview for nodes and edges (lua class documentation)
+
+2011-05-17 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Separate 'spring layout' and 'spring electrical layout' families.
+ Rename existing algorithms accordingly.
+ - Add an implementation of the Floyd-Warshall algorithm.
+ - Add a new 'Hu2006 spring' algorithm based solely on springs.
+ - Improve the initial layout of 'Hu2006 spring electrical' by
+ taking the graph size and diameter into account.
+ - Rework existing spring electrical algorithms and improve
+ documentation.
+ - Catch -!- edges and remove them from the Lua graph when detected.
+
+2011-05-14 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Update documentation of spring and spring-electrical parameters.
+ Add TODO items where things are missing, unclear or need to be
+ worked on.
+ - Make initial step dimension and the electric charge of nodes
+ configurable. Both, Walshaw2000 and Hu2006 support this.
+ - Improve the approximation of the repulsive force.
+
+2011-05-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug 3297817 (spy postscript problem).
+ - Fixed bug of missing newpath in postscript and opacity
+ settings.
+
+2011-05-13 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Rename graphdrawing.spring to graphdrawing.force.
+ - Fix NaN bug in the orientation helper.
+ - Initial work on improving and documenting the parameters for
+ spring and spring-electrical algorithms.
+ - Properly forward default node and edge parameters to Lua.
+
+2011-05-12 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Add Fibonacci heap and priority queue classes.
+ - Add Lua file for common graph algorithms. Implement Dijkstra.
+ - Add method Graph:getPseudoDiameter().
+ - Hu2006: Scale coordinations of nodes in a coarse graph based on
+ the quotient of its pseudo diameters and that of the parent coarse
+ graph, as described in the paper.
+
+2011-05-11 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Fix several interpolation bugs in the coarse graph class.
+ - Use the coarse graph class in the Walshaw2000 algorithm.
+
+2011-05-11 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on documentation of gd backend. Still need to
+ document graph parameters.
+
+2011-05-10 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Remove files from the old graph drawing library tree.
+ - Disable verbose logging by default.
+ - Specify sane initial values for spring algorithm parameters.
+
+2011-05-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added .graph drawing parameter initial key.
+
+2011-05-09 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Implement graph coarsening in the Hu2006 algorithm.
+ - Name force-based algorithms after the paper author and year.
+
+2011-05-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Reorganized graph drawing documentation.
+
+2011-05-06 Jannis Pohlmann <jannis@xfce.org>
+
+ - Finished the graph drawing library reorganization started by Till.
+
+2011-05-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Reorganized the graph drawing key and directory
+ structure. The documentation is still missing. Also, lots of
+ files still need to be moved, but I'll leave that to Jannis.
+
+2011-05-06 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - implement a quadtree optimization in the Walshaw algorithm.
+ - add a simple version of the Hu spring-electrical algorithm that
+ seems to work almost as good as the Walshaw even without
+ the multilevel approach implemented (which is the only thing
+ that really makes the Walshaw algorithm useful).
+
+2011-05-04 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Initial work on a quad tree implementation for spring and spring
+ electrical algorithms, with unit test.
+ - Improve the internals of the Vector class.
+
+2011-05-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - graph drawing: Started to cleanup pgf and tikz layers. Ongoing...
+
+2011-05-03 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Fix Walshaw algorithm to properly set the subnodes when copying
+ the coarse graphs. Simplify the code that updates the node
+ coordinates.
+
+2011-05-02 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Modify the doclet to allow underscores in parameter names.
+ - Document the Vector class as well as the table, iter and traversal
+ helpers.
+ - Remove old table and iterator helpers. Rename helper files. Rename
+ table.merge() and table.copy() to table.custom_merge() and
+ table.custom_copy() to avoid name clashes with luatools. Add
+ string helpers, including string.parse_braces(). Update algorithms
+ to work with these changes.
+ - Allow vectors to have an origin vector, similar to the Position
+ class. Introduce new alternative table-based syntax for
+ Vector:set() that is much easier to read. Update unit tests
+ and algorithms.
+
+2011-05-02 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fpu: added support for log10 and log2
+
+2011-05-02 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Drop the 'not yet positionedPGFGDINTERNAL' node name prefix
+ internally. It's stripped off now when nodes are passed over to
+ Lua and its added back again when shipping the node out to TeX.
+ - Drop the Node:shortname() method which is no longer needed.
+ - Improve coding style and documentation of the Interface, Sys,
+ Node, Edge and Graph classes.
+ - Rename Sys:logMessage() to Sys:log().
+ - Make parameter labels in the API docs not appear in bold.
+ - Disable verbose logging by default.
+ - Add methods Edge:getNodes() and Node:getEdges().
+
+2011-05-02 Jannis Pohlmann <jannis@xfce.org>
+
+ - graph drawing:
+ - Initial work on spring-electrical and layered drawing algorithms.
+ - Major rework of the Lua code of the graphdrawing library: added
+ a Vector class for improved math operations and node positioning,
+ added quite a number of table and iterator helpers, added
+ post-processing code for fixing the orientation of graph drawings,
+ updated the graph/node/edge data structures to store nodes in the order
+ they appear instead of storing them in a random order, implement
+ coordinate keys for nodes, and much more.
+
+2011-04-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - number printing: added '1000 sep in fractionals' switch
+
+2011-04-29 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Work on pgflibraryluamath (added pgfpointnormalised)
+
+2011-04-27 Matthias Schulz <ma.schulz@email.de>
+
+ - Graphdrawing library documentation, split into two files, removed
+ noluatex file, reworked the text (added information).
+
+2011-04-25 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - First attempt to do math with lua (very basical): pgflibraryluamath
+
+2011-04-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - bugfix for rounding error in \pgfmathdivide{83.407811000}{16.68156400}
+ was 4.10, is now 5.0: it could happen in rare cases that digits where
+ appended where they shouldhave been than added (4 + .10 instead of 4 + 1.0)
+
+2011-04-22 Jannis Pohlmann <jannis@xfce.org>
+
+ - Implemented a G_n subgraph for creating grid (or: mesh) graphs.
+ This also introduces a new key /tikz/graphs/wrap after=<number> that
+ configures how the nodes in such a grid graph are connected. Some of
+ the common subgraph keys such as /tikz/graphs/V and /tikz/graphs/n
+ can be used with G_n subgraphs as well.
+ - Added a simple grid placement strategy. It currently does not
+ support the chain shift and group shift keys properly and does not
+ implement any placement order other than left-to-right, so there is
+ room for improvement.
+
+2011-04-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: reduced number of \newwrite allocations and allowed to disable features
+ to safe more of them (aux in dpth=false,disable dependency files)
+
+2011-04-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added '/pgf/number format/relative' formatting style.
+
+2011-03-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Finished documentation of data visualization (sort of)!
+ - First usable version of data visualization!
+
+2011-03-15 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on dv documentation. Finished chapter on visualizers,
+ style sheets. Legends still missing
+
+2011-03-07 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on dv documentation. Finished chapter on axes.
+
+2011-03-07 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Incorporated a bugfix of Hans Hagen which makes pgf compatible with
+ Context Mk IV.
+ Verified: the patch is backwards compatible with TL 2009 and TL 2010
+ i.e. Context MkII and it works with Context Mk IV.
+
+2011-01-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on dv documentation.
+
+2011-01-05 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Attempt to fix a bug #1911195 with pgfpages and rotation (fix
+ contributed by Mark Wibrow). Note: Mark was not sure it has side
+ effects.
+
+2010-12-17 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Documentation will now compile with auto-xref enabled (a problem
+ with \_ in the graph lib not handled correctly by
+ pgfmanual.pdflinks.code.tex).
+ - Fix bug #3104978 thanks to Heiko Oberdiek patch on ctt.
+
+2010-12-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed the graph syntax for anonymous nodes in the graph
+ library and simplified the as= syntax.
+ - Added fresh nodes options to graph library.
+
+2010-12-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed graph lib so that it compiles with plain TeX.
+
+2010-12-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Small fixed in the graph library.
+
+2010-12-07 Till Tantau <tantau@users.sourceforge.net>
+
+ - Finished graph library!
+
+2010-12-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Nearly finished graph lib and its documentation.
+
+2010-11-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug #3123605 (hopefully...).
+ - Worked on graph lib.
+
+2010-11-19 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Some integer arithmetics functions for the math parser
+ (contributed by Alain Matthes): gcd, isprime, isodd, iseven
+
+2010-11-19 Till Tantau <tantau@users.sourceforge.net>
+
+ - Second attempt at making \tikz work also with fragile stuff
+ following. The new code will no longer fail in a situation
+ like \tikz \foreach ...
+ - Worked on graph lib stuff.
+
+2010-11-06 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - A luatex version of the doc is available (fixed inputenc issues
+ since luatex works with utf8 by default).
+
+2010-11-04 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Fix bug in pgfmathfunctions.basic.code.tex (bug reported by
+ Alain Matthes and fixed by Paul Gaborit on fctt): wrong
+ interaction between pow and exp (linked to \pgfmath@x modified
+ outside macro call).
+
+2010-11-01 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - Make \pgfkeys@exp@call long (bug reported by Florent Chervet on
+ fctt)
+ - Fix bug in pgflibraryshapes.callouts.code.tex: \pgf@test changed
+ to \pgf@node@name (bug reported by Zarko F. Cucej on ctt and fix
+ contributed by Mark Wibrow)
+
+2010-10-27 Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+ - fixed bug 3096333 (Fix contributed by Mark Wibrow): pgffor
+ failed to update \lastx in some cases
+
+2010-10-25 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ Released version 2.10
+
+2010-10-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - closed a lot of bugs on sourceforge, especially documentation bugs
+ - fixed bug 2429749: gnuplot invocation in tabularx did not work.
+
+2010-10-21 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed bug: there was an incompatibility between pgf and beamer due to a
+ missing \interlineskip in the shipout handling for latex.
+
+2010-10-15 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - renamed 'halfcircle' marker to 'halfcircle*' and added 'halfcircle'.
+ - provided special case 'mark color=none' for the half-filled markers.
+
+2010-10-13 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed incorrect fill/stroke coloring of new marker contributions (see
+ ChangeLog 2010-09-27)
+ - added more predefined dashed and dotted line patterns for black/white plots
+ to fulfill a related feature request of Tomek
+ - fixed bug: the 'name path global' feature did not work in every case...
+ the actual implementation might need to be revised eventually.
+
+2010-10-12 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Imported spell checking results of Stefan Pinnow (thanks!)
+ - Dealed with typo in 'sci generic' number formatting style: it now
+ accepts 'mantissa' *and* 'mantisse'
+
+2010-10-11 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - External lib: Fixed bug. The 'failed ref warnings for' was not properly \protect'ed.
+
+2010-09-27 Till Tantau <tantua@users.sourceforge.net>
+
+ - Started on graph lib. Not yet finished and not documented.
+
+
+2010-09-21 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added plot markers of Magnus Tewes and Tomek: halfcircle, halfsquare*,
+ halfsquare left*, halfsquare right*, heart
+
+2010-09-08 Till Tantau <tantua@users.sourceforge.net>
+
+ - Added \pgfpositionnodelater and \pgfpositionnodenow
+ commands.
+
+
+2010-08-31 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - externalization+\ref: fixed a bug
+
+2010-08-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: documented how to generate .png graphics and added support
+ switches.
+
+2010-08-26 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added 'baseline=default', 'trim left=default' and 'trim right=default' choices to reset these keys.
+
+2010-08-25 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added support to provide paragraphs in "pin" arguments
+
+2010-08-24 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on data visualization and its documentation.
+
+
+2010-08-23 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - basic level externalization: added \hoffset=0pt and \voffset=0pt to improve
+ compatibility with special document classes
+ - added docs for \deferredanchor feature contributed by Christophe Jorssen <cjorssen@users.sourceforge.net>
+ - ConTeXt support: fixed loading problem of calendar lib
+
+
+2010-08-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - pgfsys-tex4ht.def: fixed problem with \par in a non-long macro argument,
+ thereby eliminating a compilation problem
+ - pgfsys-tex4ht.def: renamed offending macro invocation \Par to \par
+
+
+2010-08-16 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - basic level image externalization: added '/pgf/images/trim external={<left>}{<bottom>}{<right>}{<top>}'
+ to allow modifications to the hardcoded '1truein' shifts.
+ - added '/.style n args' key.
+ - \usetikzlibrary / \usepgflibrary: added support for white-space trimming
+ and empty arguments in the lists. Now, lines do not need to be terminated
+ by '%' and ',,' is valid.
+
+2010-08-13 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: documented how to solve compatibility problems with
+ \tikzifexternalizing
+
+2010-08-11 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \deferredanchor feature contributed by Christophe Jorssen <cjorssen@users.sourceforge.net>
+
+2010-08-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added optimized and numerically stable arc path command
+ \pgfpatharctoprecomputed which interpolates start- and end points
+
+2010-07-10 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: fixed incompatibility with 2010/06/08 v2.0b eso-pic package
+
+2010-07-06 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: added sanity checking for failed \ref,\pageref,\cite commands in external images.
+
+2010-07-01 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - math parser: improved error messages by providing the complete math expression.
+
+2010-06-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added 'trim left' and 'trim right' features to simplify bounding box
+ modifications and allow support for restricted bounding boxes and image
+ externalization.
+
+2010-06-16 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - pgfutil-latex.def: changed \usepackage to \RequirePackage (thanks to Christophe Jorssen)
+ - external lib: added \tikzappendtofigurename{} shortcut for '\tikzset{external/figure name/.add={}{suffix}}'
+
+2010-06-14 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: added warning at end of document if not all graphics have
+ been found.
+
+2010-06-10 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - updated file 'tikzexternal.sty' for \label and \ref support inside of
+ externalized graphics
+ - documented how \label and \ref support in external graphics works.
+ - activated \label support for mode=convert with system call and
+ documented limitations.
+
+2010-06-09 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \tikzifinpicture{<true code>}{<false code>} macro
+
+2010-05-31 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on data visualization.
+
+2010-05-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added .list key handler.
+
+2010-05-26 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on data visualization.
+
+2010-05-06 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - improved sanity checking in number printer: now, the zero flag is
+ checked even if its exponent > 0
+
+2010-04-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - floatparsenumber: number format errors after exponents now contain the offending
+ character instead of '\relax'
+
+2010-04-12 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - number printer: added 'frac denom' and 'frac whole' for fine tuning of
+ fractional number printing.
+
+2010-04-10 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - number printer: made \protect portable across TeX variants (doesn't
+ produce bugs with context anymore)
+ - fpu: optimized \pgfmathfloatgetflagstomacro
+
+2010-04-09 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfresetboundingbox
+ - added \pgfgetlastxy coordinate macro
+ - added '/pgf/images/include external/<image name>' code key.
+
+2010-04-08 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fpu: added convenience method \pgfmathfloattoint
+
+2010-03-31 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - number printer: added 'frac' style to automatically create fractionals.
+
+2010-03-25 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - splitted basic level file pgfcoreimage.code.tex: there is now a
+ pgfcoreexternal.code.tex file.
+
+2010-03-24 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - \pgfmathprintnumber is no longer a "fragile" command (it is \protect'ed
+ automatically in LaTeX).
+
+2010-03-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed baseline alignment with "text width" option in LaTeX.
+
+2010-03-23 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - New divide function
+ - Rewrote code foreach extensions. Now no longer an impenetrable mess.
+ pgffor.code.tex is much larger, but contains some (as yet) undocumented
+ features which may get optimised out.
+
+2010-03-19 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Image externalization: added '/pgf/images/aux in dpth' feature.
+ It allows to store \label and other .aux file related stuff in the image's
+ .dpth file which is processed when when the main document includes the
+ image.
+ The new switch is on for the semi-automatic modes of the external lib, otherwise it is
+ off.
+
+2010-03-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - pgfkeys: added '.code n args' handler. The difference to '.code
+ args={#1#2#3}' is that keys defined with 'code n args' gobble spaces
+ between the arguments.
+ Note: 'code 2 args' remains as-is (it has the special feature that the
+ second argument is optional).
+ - fixed bug in '/.add code' key handler: it didn't work properly for
+ complicated keys
+ - pgfkeys manual section: updated xrefs and docs
+
+2010-03-15 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: \tikzexternalize no longer needs (but still accepts) the
+ main job's name. Changes are now documented and the replacement |.sty|
+ file has been updated.
+ - intersection lib: added 'name path global' feature.
+
+2010-03-11 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: partially fixed incompatibility with glossary package and
+ documented work-around
+
+2010-03-05 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - FPU: added \pgfmathfloatifapproxequalrel
+ - number printing: added style to configure |sci precision|
+ - number printing: added style to configure |std=<lower e>:<upper e>|
+
+2010-03-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: the <real job's name> argument from \tikzexternalize is
+ now optional. It can be deduced automatically if it is missing.
+
+2010-02-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - number printing: added 'sci generic' style to customize the appearance
+ of scientific format and a 'verbatim' style which doesn't use TeX macros
+ for the formatted numbers.
+
+2010-02-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: now, a |\jobname.auxlock| file will be generated in order
+ to detect whether the \jobname.aux file is in its final state. This allows
+ to export any images containing |\ref{}| manually; the automatic procedure
+ will not use the .aux file.
+
+2010-02-16 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added \ifpgfexternalreadmainaux switch. Will be used to avoid buffering
+ problems during externalization mode 'convert with system call'.
+
+2010-02-16 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug "papersize not supported by pgfsys-xetex.def - ID: 2934982"
+
+
+2010-02-09 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Improved automatic cross referencing: auto key path prefixing failed for
+ spaces in key paths.
+
+2010-02-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added "on background layer" key to backgrounds lib.
+
+2010-02-02 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfmathifisint
+ - supported \nofiles in auto xref generation
+
+2010-02-01 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - externalization: both, basic layer and external lib now support \ref{}s
+ inside of externalized pictures. Furthermore, they won't generate any aux
+ files on their own (which wouldn't be thread safe and is not useful
+ anyway)
+
+2010-01-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: fixed bug with figure list/makefile handling and file
+ deps: calling file dependency handlings outside of a picture could result
+ in compilation failures
+
+2010-01-27 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: mode=list and make now supports the force remake keys.
+ - external lib: the -shell-escape switch for nested system calls is
+ activated only if it was active for the main document. This should allow a
+ reasonable security measure for mode=list and make (which will also work
+ without system calls from within TeX).
+
+2010-01-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: added support for file dependencies.
+ For mode=list and make, any file dependencies configured with
+ \tikzpicturedependsonfile{<name>} will be checked by the generated
+ makefile.
+
+
+2010-01-16 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - profiler library now uses an output file which contains the current date
+ and time. Furthermore, it counts every invocation and allows to show every
+ command invocation (optionally with arguments expanded).
+
+2010-01-14 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - profiler library can now profile macros with arbitrary argument pattern
+ and is more rebust with respect to save stack usage
+
+2010-01-11 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - worked on profiler library and added docs for it.
+
+2010-01-10 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added first draft of the pgf 'profiler' library
+
+2010-01-07 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for rounded corners affecting custom fills in rectangle
+ split shape.
+
+2009-12-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - updated the 'make dist' documentation target such that it compresses
+ every pdf object. The resulting manual is half as large than without
+ compression, but it requires pdf 1.5 (at least acrobat 6.0).
+
+2009-12-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: some output messages did not respect the 'verbose
+ IO=false' flag; fixed that
+ - fixed buggy treatment of some automatic cross references in manual
+
+2009-12-15 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: improved the tikzexternal.sty package which can be used
+ without pgf installed.
+
+2009-12-04 Till Tantau <tantau@users.sourceforge.net>
+
+ - added spy library.
+
+2009-12-02 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - imported a patch of Andy Schlaikjer which extends the 'plot gnuplot'
+ feature to read the ``unbounded point'' information provided by gnuplot.
+
+2009-11-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \r@pgf@reada temporary \openin register for compatibility with
+ other packages
+
+2009-11-19 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed an auto xref bug which wrote '\pgfkeys{}' although the manual
+ contained |\pgfkeys|.
+
+2009-11-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: the 'optimize command away' things where not activated
+ accidentally. I fixed it.
+ - added support for new paragraphs in pgfkeys values
+ - fixed bug in |const plot| handler (and all its variants): the first
+ coordinate was transformed twice
+
+2009-11-15 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - auto xrefs now support point coordinate systems.
+ - auto xrefs now provide an interface to deal with tricky active
+ characters (for |-)
+ - external lib: improved compatibility with |fadings| libary.
+ - replaced 'set terminal table; set output "<file>"' by 'set table "<file>"'
+ to maintain compatibility with the new gnuplot version.
+
+2009-11-14 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - pgfmanual.pdf: provided a 'make dist' target in version_for_pdftex/en
+ which activates automatic hyper references from codeexamples to key
+ declarations.
+ This utilizes larger memory limits, configured in
+ doc/generic/pgf/text-en/texmf.cnf
+
+2009-11-12 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added the 'small mindmap' style.
+
+2009-11-06 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - FPU: improved sanity checks and exception handling for the decompose
+ routines (pgfmathfloatgetexponent etc) and the number parser.
+ Added exception 'wrong lowlevel format'.
+
+2009-10-20 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - renamed 'text mark/style' to 'text mark style' and 'text mark/as node'
+ to 'text mark as node' (there are backw. compatibility hooks).
+ This should avoid confusion with '.unknown' handlers.
+
+2009-10-19 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - improved error recovery of external lib.
+
+2009-10-16 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - temporarily disabled the auto cross references -- it seems they compile
+ only with increased memory.
+
+2009-10-15 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Installed preliminary version of automatic cross referencing tool.
+ Now, every codeexample is parsed for options and control sequences which
+ have been defined somewhere else in the document; pdf cross references are
+ built automatically as well.
+ - configured links to be blue throughout the document.
+ - external lib: added \tikzexternaldisable such that partial externalization is possible
+ although the document contains unsupported constructs (where environments
+ can't be identified without macro expansion).
+ The pgfmanual compiles with image externalization now.
+
+2009-10-13 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfutilsolvetwotwoleq to solve 2x2 linear equation systems using
+ column pivotisation and gauss elim. Should result in improved quality
+ compared with \pgftransforminvert as internal equation solver
+
+2009-10-09 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Defined \pgfdeclaregenericanchor to allow anchors which get the shape
+ name as argument. Only useful internally.
+
+2009-09-15 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Fixed buggy treatment of white spaces in \jobname and 'plot function'
+ using \pgfutilpreparefilename.
+
+2009-09-04 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug item #2834141 [wrong reversed double arrows]
+ - Fixed bug item #2834233 [shapes libraries]
+ - Fixed bug item #2822265 [tangent coordinates not working in CVS]
+ - Changed \rm to \tf in Context.
+
+2009-07-31 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: added 'mode=list and make'. Now, image externalisation
+ time can be reduced with 'make -j 2 -f mainfile.makefile'.
+
+2009-07-08 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external lib: fixed treatment of long arguments in \tikz ... ; shortcut
+ command.
+
+2009-06-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed white space bug in \pgfkeysdeactivatefamily
+ - added \pgfmathfloatvalueof
+
+2009-06-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added a '*' feature to '\pgfmathdeclarefunction' which overwrites
+ existing functions.
+
+2009-06-11 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added '/tikz/no marks' key.
+ - fixed typo in external lib documentation: the key is called 'figure name',
+ not 'file name'
+
+2009-06-10 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfgettransformentries and \pgfsettransformentries.
+ - updated the external library such that it deals with active characters
+ in the same way as without external library.
+ - fixed bug in fpu cosh, sinh and tanh
+
+2009-06-09 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - provided two new aliases for key filters, added \pgfkeyssetfamily.
+
+2009-05-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - allowed numbers like '.9' in fpu.
+
+2009-02-29 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for signal shape.
+
+
+2009-05-22 Jin-Hwan Cho <jinhwancho@users.sourceforge.net>
+
+ - Applied the patches for dvipdfmx driver,
+ pgf-doc-diff.version2cvs (2009-04-18) and
+ pgf-generic-diff.version2cvs (2009-04-19).
+
+2009-05-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Restored processing of unknown keys in the predefined key filters 'and',
+ 'not', 'or' and 'false': it was not improvement...
+
+2009-05-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed the sequence of arguments of
+ \pgfqkeysactivatefamiliesandfilteroptions and
+ \pgfqkeysactivatesinglefamilyandfilteroptions
+ in the reference manual.
+
+2009-05-16 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - key filtering: the composed key filter handlers 'not', 'and', 'false' and 'or' now
+ ignore unknown options and call the .unknown handlers.
+ - pgfkeys: removed the experimental \pgfkeyssetdefaultpathforhandled method.
+ It doesn't fit into the clean interface for pgfkeys - and the problem of
+ default paths for handled keys can be solved better with the '/handler
+ config' method.
+
+2009-04-24 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - provided API function \pgfmathfloatifflags to simplify special cases in
+ FPU.
+
+2009-04-23 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added (primitive) veclen implementation for FPU.
+ - added cosh, sinh, tanh to FPU
+
+2009-04-21 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed bug in external lib: empty lines in tikzpicture environments were not accepted
+ for some operating modes.
+
+2009-04-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfqpointscale
+
+2009-04-08 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added an optional argument count to 'optimize command away' in external
+ library.
+
+2009-04-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added the |figure name| key to the externalization library
+ - improved docs for externalization library
+
+2009-03-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - improved sanity checking of floating point comparison: does now also
+ yield results for infty/nan
+ - added fix for precedence bug for unary minus (fix has been suggested by
+ Mark Wibrow, by mail conversation)
+
+2009-03-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Replaced \z@ by 0pt for context.
+
+2009-03-21 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - external library: fixed the 'optimize' feature: pictures which won't be
+ exported could not be optimized away (although they should)
+
+2009-03-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - Replaced \toks@ and \voidb@x by \pgfutil@toks@ and
+ \pgfutil@voidb@x.
+
+2009-03-14 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - improved docs for .search also.
+ - fixed initial value for 'domain' such that it really uses the default
+ samples=25.
+
+
+2009-03-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added patch for context color support in luatex.
+
+2009-02-26 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - improved the optimization facilities of the external library:
+ |optimize=false| will now properly restore any optimized material
+ when used in \tikzset
+
+2009-02-23 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added |/handler config=all,only existing,full or existing|
+ configuration.
+ - added |.search also| key handler as a simple implementation of key
+ search paths.
+ - fixed default value for /tikz/samples at- there are no really 25
+ samples, not 26. I forgot to fix this last time when I fixed 'samples'
+
+2009-02-20 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added |\pgfkeyssetdefaultpathforhandled| feature as improvement for
+ multiple key paths to pgfkeys. Reference documentation and an
+ application example is in the manual.
+
+2009-02-13 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added 'mark=text' which draws arbitrary TeX content as plot marks to
+ plot mark library.
+
+2009-02-06 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added key 'define function' to define simple local functions.
+
+2009-02-04 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked on dv stuff.
+
+2009-02-01 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Index argument to array is automatically truncated to an
+ integer.
+ - Text decoration can now be aligned along or fitted to a path.
+ - Added key '/pgf/decoration/reverse path' to decorate a path
+ backwards.
+
+2009-01-24 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - the FPU deactivation command is now assembled once and for all during
+ its first usage.
+
+2009-01-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed the "ellipse", "circle" and "arc" commands, so that
+ they take options. This gives a much clearer and more
+ flexible syntax. Naturally, the old syntax continues to work
+ as expected.
+ - Documented svg stuff and added tikz interface. Most useful
+ for quickly converting svg pictures to tikz pictures...
+
+2009-01-23 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed fpu 'round' method - it rounded mantissas instead of the complete
+ number before.
+
+2009-01-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed some math stuff
+ - Renamed \pgfpathcurvebetweentime* to
+ \pgfpathcurvebetweentimecontinue.
+ - Added svg.path lib. It allows one to directly use
+ the svg syntax for paths (like "M10 10 L 20 20"). Not yet
+ documented.
+
+2009-01-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added tutorial for mind/lecture maps.
+
+2009-01-06 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - implemented fpu factorial
+ - if the fixed point library is activated, the fpu will be deactivated
+ automatically.
+ - added draft for FPU documentation
+
+2009-01-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed bug in fpu sqrt.
+ - added logical commands to fpu.
+ - fixed bug in fpu related to multi-argument-commands
+ - provided feature to disable fpu manually.
+
+2008-12-31 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added support for pgf 2.00 and the fpu (works only with additional
+ and technical work - the fpu file is not all which is needed)
+ - added pow and greaterthan to FPU
+ - fixed some FPU issues
+ - fixed processing of '/tikz/domain' key - it produced N+1 samples instead
+ of N.
+
+2008-12-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added further functions to fpu; improved sanity checking; fixed smaller
+ bugs related to fpu
+
+2008-12-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - improved internal floating point code: it is possible to change the
+ low-level representation with minimal number of code lines.
+ - modified low-level floating point representation. All high level code
+ should be completely unaffected; the changes are backwards compatible.
+ - Wrote first draft of a floating point unit library (fpu) similar in
+ spirit to the fixed point library of Mark Wibrow.
+ - Moved all floating point math operations (functions) into the fpu
+ library. It is now necessary to include the library in order to use
+ floating point math operations. The number formatting methods are still
+ available as before.
+
+2008-12-28 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added trigonometric functions to floating point unit.
+
+2008-12-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added \colorlet to ConTeXt stuff.
+
+2008-12-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked some more on data visualization stuff. Still in
+ pre-alpha.
+
+2008-12-11 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfmathfloatexp.
+
+2008-12-07 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - floating point macros now always use the basic pgf math methods for
+ mantisse computations, even if the fixed point library is active.
+
+2008-12-06 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - 'mark=none' is now equivalent with 'mark=' (disables plot marks).
+ The previous behavior was to issue \pgfuseplotmark{none} which is
+ equivalent to \relax (and wastes time).
+
+2008-12-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed exp function code in
+ pgfmathfunctions.basic.code.tex. It is now *much* more
+ precise for negative values and also more precise for
+ positive values.
+
+2008-11-28 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - optimized \pgfmathfloattofixed for speed (although it introduces
+ redundand zeros)
+ - Added '/pgf/image/include external' command key as public interface
+ to modify the '\includegraphics' command in image externalization routines.
+
+2008-11-24 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed bug with |overlay| option and matrizes: now, cell pictures won't
+ collapse any more if the matrix has |overlay| enabled. However, the
+ matrix' bounding box won't contribute to the image as desired.
+
+2008-11-23 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added support for active '!' characters (for example in blue!30!black
+ and french babel setting)
+ - modified processing of 'domain' option: the argument is '\edef'ed such
+ that any potentially active ':' characters will be expanded to non-active
+ ones (avoiding errors in the following processing).
+
+2008-11-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed \pgfnodealias bug that caused chains to fail in matrices.
+
+2008-10-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added shading library, mainly containing the new color wheel
+ shading donated by Ken Starks.
+
+2008-10-27 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - More fixes for insertion of spaces.
+
+2008-10-27 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added square arrow send by
+ gvtjongahung@users.sourceforge.net.
+ - Changed pgfutil-context.def so that driver detection should
+ work once more.
+
+2008-10-27 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed insertion of space when parsing exponents.
+
+2008-10-23 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added int truncation to floating point unit.
+
+2008-10-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added abs, abserror and relerror to floating point unit.
+
+2008-10-21 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added sqrt for floating point unit, built on top of pgfmathsqrt.
+
+2008-10-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed the wrong lengths of support vectors for circles. Used to
+ be 0.555 (found by trial and error), while the correct value
+ is 4/3*(sqrt(2)-1) = 0.5522847, which gives much better
+ circles.
+ Thanks to Ken Starks for point this out.
+
+2008-10-07 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed rounded rectangle right arc bug.
+
+2008-10-06 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Fixed missing treatment of 'assume math mode' in \pgfmathprintnumber'
+
+2008-10-05 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed missing switching off of auto anchors in positioning
+ library.
+
+2008-10-01 Till Tantau <tantau@tcs.uni-luebeck.de>
+
+ - Fixed matrix/pdfsync incompatibility.
+
+2008-09-30 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed some parsing bugs with arrays.
+ - Fix for parsing of arrays in TikZ coordinates.
+
+2008-09-25 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added number formatting option 'min exponent for 1000 sep'.
+
+2008-09-21 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed bug in math parser which inserted spaces into text
+ or picture.
+
+2008-09-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added number formatting style 'sci superscript'
+ Example: formats the number 42 as 4.2^1 instead of 4.2 \cdot 10^1
+
+2008-09-15 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug "TikZ, the shadow library and ConTeXt MKIV
+ (LuaTeX)".
+
+2008-09-14 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed bug #2105132 for rounded rectangle.
+ - Fixed bug #2044129 for chamfered rectangle.
+
+2008-09-12 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added \pgfpathcurvebetweentime.
+
+2008-09-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed problem with nodes on a line inside a picture that is
+ inside a node of another picture. Pictures will now always
+ start with "pos=.5" set.
+
+2008-09-07 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Slight hack of decorations so that the input path can consist of a
+ single move to. This enables stuff like
+ \path [decoration={some decoration}, decorate] (4,5);
+
+2008-09-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed small bug related to '@dec sep mark' and not-a-number in number
+ formatting routines.
+
+2008-09-03 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Solutions for path intersections can now be sorted along either path.
+ - \pgfintersectionsolutions is now a macro, not a count register.
+
+2008-08-31 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - fix for ``Missing character...' warnings in logfile when using
+ foreach.
+ - removed `trim integers' option from foreach as int function
+ can now be used.
+
+2008-08-31 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Rewrote math parser. Anyone who relies on, or has hacked internal
+ parser or function macros, or has defined their own functions for
+ the parser will need to reconsult the code and/or documentation.
+ - Files for functions definitions split (possibly permanantly) into
+ different files.
+ - Scaling of results at the end of the parse is no longer the default
+ action. This doesn't break PGF or TikZ, but it may break user code
+ that depended on this scaling. To turn it back on use
+ \let\pgfmathpostparse=\pgfmathscaleresult.
+ - Modifying existing functions or creating new functions must now be
+ done using \pgfmathdeclarefunction and \pgfmathredeclarefunction.
+ - Single argument functions do not need parentheses, provided the
+ funtion is followed by a space, so sin 60 is the same as sin(60).
+ But! Functions have the highest precedence, so sin 60*\x is the
+ same as sin(60)*\x.
+ - Added {} operators for array specification and [] operators for
+ array access - see docs for details.
+ - added postfix ! factorial operator.
+ - added c++/java style conditional e.g., \x > 10 ? 13 : 20.
+ - added >=, <=, !=, prefix !, &&, || operators.
+ - added atan2, log10, log2, e, int and frac functions.
+ - adapted cosh, sinh and tanh from Martin Heller.
+ - added lua-style random function for generating random integers.
+ - added Mod function (note capital letter). Uses floored division
+ and is never negative.
+ - min, max, veclen and pow can now be nested in any argument
+ position.
+ - min and max can now take a variable number of arguments.
+ - For compatability \pgfmathmax and \pgfmathmin still take two
+ arguments (although these can contain comma separated expressions).
+ However \pgfmathmin@ and \pgfmathmax@ now only take
+ one argument in the form \pgfmathmin@{{1}{2}{3}{4}{5}} (for 5
+ arguments).
+ - added hex, Hex, bin, and oct functions. These functions will not
+ work properly if the post-parse scaling is turned back on.
+ - 0 prefix for integers now specifies an octal number which is
+ automatically converted to base 10.
+ - 0x or 0X prefix for integers now specifies a hexadecimal number,
+ which is automatically converted to base 10.
+ - 0b or 0B prefix for integers now specifies a binary number,
+ which is automatically converted to base 10.
+ - "" characters turn off parsing (!) for part of an expression.
+ - added width, height, and depth functions for text e.g.,
+ width("Some text"), but as an expression is \edef'ed before
+ parsing other commands will have to be `protected' e.g.,
+ width("\noexpand\Huge Some text").
+ - bugfix for tan and cot.
+
+2008-08-27 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added '/tikz/external/export={true,false}' key for externalization
+ library.
+
+2008-08-05 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added documentation for basic layer externalization and baseline option.
+
+2008-07-28 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added 'showpos' key to number printing (and alias 'print sign').
+
+2008-07-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - fixed typo in pgfmathfloat.code.tex
+ - added 'optimize command away=\macro' key to externalization library. It
+ allows to discard unnecessary and possibly expensive user macros during
+ export (unnecessary = not in selected picture).
+
+2008-07-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Fixed bug in system layer path collecting. Very long paths
+ are now processed more efficiently (the bug disabled an optimization).
+
+2008-07-14 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added "marker" positions into the output of number formatting routines
+ to find period positions (even if no period is typeset) and exponent
+ positions. Allows alignment within auxiliary routines.
+
+2008-07-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed dash phase bug.
+ - Fixed missing library include in automata lib.
+ - Added "align" option. "text ragged" and friends are now
+ deprecated. Text width need no longer not, but can, be
+ specified. The following now has the expected effect: \node
+ [draw,align=center] {Hello\\world.};
+
+2008-07-10 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfqpointxy and \pgfqpointxyz to complement the "quick" point
+ commands in basic layer.
+
+2008-07-09 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added 'every mark' style.
+ - 'mark options' simply overwrites 'every mark' (consistent with its old
+ definition)
+
+2008-07-07 Till Tantau <tantau@users.sourceforge.net>
+
+ - Finished circuit library and documentation (well, some
+ shapes still missing, but that's something users should
+ contribute).
+
+2008-07-01 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - the external library now handles active double quotes ",
+ single quotes ', and active semicolons ';' in its system call
+ correctly. Furthermore, \\ will expand to a normal
+ backslash. The initial system call now uses double quotes
+ for indows compatibility, it also contains the shell-escape
+ feature for gnuplot invocations.
+
+2008-06-30 Till Tantau <tantau@users.sourceforge.net>
+
+ - Did some documentation of circuit lib.
+ - Removed the separated documentation of the intersection
+ library and made this documentation part of the main
+ documentation.
+ - The intersection cs is now deprecated, the documentation
+ is now only based on the intersection lib.
+ - Added a "by" option so that "name intersections={of=A and
+ B,by={c,d,e}}" will create an alias c for intersection-1, d
+ for intersection-2 and e for intersection-3.
+ - Renamed "path name" to "name path" in the intersection
+ lib. This is more consistent with "name intersections".
+
+2008-06-29 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Minor changes on float stuff, wrote pgfmathfloatmultiply and
+ pgfmathfloatdivide on top of pgfmathmultiply and pgfmathdivide
+
+2008-06-29 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added `Fixed Point Arithmetic' library, which provides
+ a parsing interface to the fp package. Dealing with plotting
+ files still a bit crude.
+ - This library means the manual now requires the fp pacakge
+ to compile.
+ - Fixed floor function for negative numbers.
+ - Fixed \pgfmathsetseed.
+ - Font and group fix for external documentation.
+
+2008-06-27 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Complete change of TikZ intersections (PGF unchanged).
+ - Slight hack of the TikZ scopes library to permit local
+ path naming. Should work...
+
+2008-06-26 Till Tantau <tantau@users.sourceforge.net>
+
+ - Continued with circuit library.
+ - Introduced subdirectories inside the pgf library
+ directory and moved libs into them.
+ You may need to update your checkout.
+
+2008-06-26 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - The external library now typesets as horizontal material by issueing
+ \leavevmode. This fixes an inconsistency with the normal tikzpictures.
+
+2008-06-25 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added intersection library + documentation for
+ intersecting ``named'' paths.
+
+2008-06-25 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Fixed bug in external library. Now, strings like '#1' occuring
+ somewhere in an image is collected correctly.
+
+2008-06-24 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Removed new intersection stuff. Need to restart from scratch...
+
+2008-06-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Started working on circuit library documentation.
+
+2008-06-23 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added PGF code and docs for intersections of two curves and
+ intersections of a line and a curve.
+ - Fixed bug in foreach code when registers are used with dots
+ statement.
+
+2008-06-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Created first version of circuit libraries for electrical
+ engineering (circuits.ee.*).
+ - Added libraries so that ee circuits and logical circuits can
+ be accessed using the same interface. (circuits.logic.*)
+ - The tikz lib shapes.gates.logic.* will no
+ longer be needed, the circuits.logic.* will replace them. (The
+ pgf libs shapes.gates.* are still used as before, however.)
+ - Minor patch in shapes.gates.logic.US so that the .0 and .180
+ anchors of a not gate or a buffer gate are the same as the
+ input or output anchors.
+ - All this is not documented, yet.
+ - Worked some more on dv stuff, but nothing to "show", yet.
+
+2008-06-21 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed parsing bug in foreach code.
+ - Added "rotate fit" key to fit library, so (e.g.) a rotated
+ rectangle can be fitted around nodes/coordinates.
+
+2008-06-21 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added documentation for tikz 'external' library.
+ - created pgfexternalwithdepth.tex file to use the 'baseline' information.
+ - improved some issues of the external library.
+ - Added '/pgf/images/draft' option
+ - Modified implementation of draft images to show the image file name
+ instead of the internal image name
+
+2008-06-19 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added tikz library 'external' which allows automatic or semiautomatic
+ export of each tikzpicture to pdf. Documentation is not yet ready.
+ - Added self-contained latex package tikzexternal.sty to read those images
+ without tikz/pgf installed.
+ - Added support for the 'baseline' option in \beginpgfgraphicnamed ... \endpgfgraphicnamed
+ by storing the box depth into a separate file.
+
+2008-06-19 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added first ideas for a circuit library.
+ - Bugfixes in scoping behaviour.
+ - Changed scoping rules for to path operation: Options are now
+ local. This may break existing code, but is much more
+ consistent with everything else and removes other problems.
+ - Patched mindmap lib to account for these changed rules.
+ - Added insert path option.
+ - Deprecated "after node path". Use "append after command" and
+ "prefix after command" instead.
+ - Moved datavisualization libraries to separate subdirectory.
+
+2008-06-18 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed label and pin options once again, to allow more
+ flexibility. In particular, the angle can now be
+ omitted. Also, for rotated main nodes the anchors are now
+ chosen in more sensible ways.
+
+2008-06-16 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added tiny little turtle graphics library for fun.
+ - Changed scoping rules for \foreach statement on a path: the
+ last coordinate is now persistent not only after the foreach
+ statement, but also between different iterations.
+ - Changed positioning of "label" when you attach a label to a
+ transformed shape. The position is now absolute with respect
+ to the page, unless the "transform shape" option is used.
+
+2008-06-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed the bug fix for character checking in foreach.
+ - Updates and fixes for new foreach code.
+
+2008-06-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug in new \foreach stuff that causes an error on
+ things like \foreach \i in {1,...,\foo}. If a list element
+ is a macro, no is-it-a-character check is done.
+
+2008-06-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Checked in proposed \foreach extensions. Possibly the
+ extensions would be better contained in a pgflibrary...
+ - list items can now be evaluated.
+ - dots replacement is context sensitive.
+ - sequences indicated by dots can be character sequences.
+ - a list item can be ``remembered'' in the next iteration.
+ - access to the number of the current item in the list is
+ provided.
+
+2008-06-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Worked a bit on data visualization stuff.
+
+2008-06-07 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added '/pgf/number format/1000 sep' and 'dec sep' shortcut
+ styles which simply call 'set thousands separator' and 'set
+ decimal separator'. Those option are somewhat long...
+
+2008-06-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed the "local bounding box" option so that it honors the
+ "relevant for picture size"-if.
+
+2008-06-04 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed buggy "mid left" and "mid right" options.
+ - Added "between positions" option to the "mark" option. This
+ makes it possible to create paths with "repeated arrows along
+ the path". This did not work before.
+
+2008-06-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added '/pgf/number format/assume math mode' to disable math checks.
+ This allows to assemble tabulars, apply \pgfmathprintnumber to each cell
+ and use the dcolumn package to align at decimal separators (no
+ documentation for that feature yet)
+
+2008-06-02 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed pgfpages in conjunction with everyshi.
+
+2008-05-31 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Semantics of |/pgf/number format/fixed zerofill| changed: it now simply
+ sets a boolean which affects all numbers in fixed format; it does not
+ SET fixed format. The same holds for sci zerofill.
+
+2008-05-30 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Provided \pgfmathprintnumberto macro in addition to
+ \pgfmathprintnumber.
+
+2008-05-22 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Revised Lindenmayer system stuff. Documentation should
+ now be up to date.
+
+2008-05-22 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added 'xbar interval' and 'ybar interval' plot handlers.
+ - Moved plot handler options to /pgf key tree.
+ - added 'bar shift' option.
+ - bar width option is now evaluated when needed.
+ - Added documentation for plot handler library changes and for tikz-plot
+ interfaces.
+ - Modified pgf manual macros: codeexamples section now employs pgfkeys,
+ xkeyval no longer required. Introduced style 'every codeexample' to
+ maintain compatibility and allow customization for users.
+
+2008-05-21 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added missing documentation of moveto-decoration.
+
+2008-05-20 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Changed the processing of \pgflsystemstep. Now a TeX
+ dimension, it permits a symbol to shorten the step.
+
+2008-05-19 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added Lindemayer system drawing library.
+ - Renamed the ranomization keys for the step and angle.
+ - Updated the L-system docs.
+
+2008-05-19 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added documentation of oo-subsystem.
+ - Started documentation of data visualization-subsystem.
+ - Fixed hyperlink problem in dvipdfm(x)/xetex.
+ - Fixed typos in Lindemayer system doc.
+
+2008-05-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added \pgfmathfloatadd, \pgfmathfloatsubtract and
+ \pgfmathfloatmultiplyfixed based on pgf's normal math parser
+ - Added tests for float arithmetics
+ - Added \pgfmathfloattoextentedprecision for 8-digit mantisse precision
+ - Added documentation for these methods
+ - Added basic layer input stream methods to set zero levels for [xy]comb/[xy]bar;
+ allows to start bars at different offsets than x=0 / y=0.
+ - Added documentation for zero level streams.
+
+2008-05-15 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added "path picture" option, mostly for the implementation
+ of the corrected mindmap connecting bars.
+ - Fixed buggy code of mindmap connect bars: Shading angles
+ where sometimes wrong and shading was sometimes at the wrong
+ position.
+
+2008-05-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Completely rewrote management of pdf resources. This affects
+ pdftex, dvipdfm, dvipdfmx and xetex backends and all front
+ ends. They should now all work together in harmony, as far
+ as this is supported by them.
+ - Completely rewrote driver detection in plain and context
+ mode.
+ - dvipdfmx and xetex now use \special{pdf:literal direct},
+ which can *considerably* reduce file sizes (up to a factor
+ of 2).
+
+2008-05-14 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed compatability issue with old calc code.
+
+2008-05-13 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - documented '.lasttry' key handler
+ - introduced documentation for key filtering routines (as \input section
+ in pgfmanual-en-pgfkeys.tex). Main section of pgfkeys not really updated
+ yet; I only removed the 'family limitation' item in the introduction.
+
+2008-05-11 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Multiple fixes for signal shape.
+
+2008-05-03 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - added \pgfplotbarwidth and docs
+ - used \pgfmathparse to assign \pgfsetplotbarwidth
+ - added 'const plot mark right' to plot handler library to complete the
+ different variants of left/right connected/jump handlers.
+
+2008-05-01 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed parser for expressions that begin and end with braces.
+
+2008-04-27 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added \pgfmathapproxequalto operation and documentation below
+ \pgfmathequalto
+ - Added some user-interface methods to floating point arithmetics
+ - Added options
+ /pgf/number format/set decimal separator
+ /pgf/number format/set thousands separator
+ /pgf/number format/skip 0.
+ - Added documentation for floating point arithmetics
+ - Added documentation for number printing
+
+2008-04-26 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added PGF plot handlers to plot handler library:
+ - \pgfplothandlerxbar
+ - \pgfplothandlerybar
+ with parameter \pgfsetplotbarwidth{} and
+ - \pgfplothandlerconstantlineto
+ - \pgfplothandlerjumpmarkleft
+ - \pgfplothandlerjumpmarkright
+ - Added Tikz-Plot handlers
+ - /tikz/xbar
+ - /tikz/ybar
+ with option '/tikz/bar width' and
+ - /tikz/const plot
+ - /tikz/jump mark left
+ - /tikz/jump mark right
+ - Added documentation for new plot handlers to Tikz- and plot handler
+ section in manual
+
+2008-04-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Documented changed double line handling.
+ - Made some arrow tips work with double lines.
+
+2008-04-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added (not yet documented) "inner lines", which move the
+ double line mechanism from tikz to the basic layer. This
+ allows the definition of special arrow tips for double lines.
+ - Added (not yet documented) new arrow tip "implies" using
+ this mechanism.
+
+2008-04-21 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - New version of rectangle split shape. Now supports horizontal
+ as well as vertical spliting. Also supports up to 20 parts.
+
+2008-04-17 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added pgfkeysfiltered.code.tex which provides key filtering
+ and provides key-selection utilities like xkeyvals families
+ - changed pgfkeys.code.tex to '\input' pgfkeysfiltered.code.tex
+
+2008-04-14 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added \tikzaddtikzonlycommandshortcutlet and
+ \tikzaddtikzonlycommandshortcutdef to install shortcut commands at the
+ beginning of tikzpicture.
+ - pgfkeys.code.tex: fixed incompatibility .try with .is choice
+
+2008-04-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed patterns in dvips mode (were broken).
+
+2008-04-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Switched to everyshi in latex mode to hack into
+ \shipout. Wrote direct code to hack into \shipout in plain
+ mode. Hacking into \shipout in Context is still unclear.
+ - Added space arrow.
+
+2008-4-02 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Reimplemented parsing of operands.
+
+2008-04-01 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added cirlce solidus shape by Manuel Lacruz.
+
+2008-03-19 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - `curve control points' decoration no longer exists. It is
+ replaced by the `show path construction' decoration.
+ - added code + docs for defining changable patterns.
+ - Parser altered to access \pgfmathfloatparsenumber when
+ \ifpgfmathfloat is true (old interface to \pgfmathfloat deleted).
+
+2008-03-18 Christian Feuersaenger <ludewich@users.sourceforge.net>
+
+ - Added generic/pgf/math/pgfmathfloat.code.tex
+ - Modified pgfmath.code.tex to include pgfmathfloat.code.tex
+ - Added generic/pgf/testsuite/mathtest/pgfmathtestsuite.tex [dvipdfm/pdflatex]
+ which provides testing for pgfmathfloat.code.tex
+
+2008-03-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed minimum width handling in rounded rectangle shape.
+
+2008-03-12 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added key for rectangle split to ignore empty parts.
+ - Extended \pgfshadecolortorgb to define macros for the
+ individual color components.
+
+2008-03-08 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added `curve control points' decoration for drawing
+ curve controls. NB: names/keys may change.
+
+2008-03-07 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for (some) `hidden' bugs: ``Missing character:
+ There is no <char> in font nullfont!''. This is usually
+ only seen in log file. Fixed for star, circular sector
+ and math macros.
+
+2008-03-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed documentation "placment" replaced by "positioning"
+ - Fixed ConTeXt page resource problem. (ConTeXt support is
+ still not as smooth as support of other formats)
+ - Checked in some data visualization stuff, without any
+ documentation. Everything still likely to change
+ completely.
+ - Moved module management to pgfutil.
+ - Added support for simple oo-programming, not documented.
+
+2008-02-26 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed bug in pgfkeysaddvalue.
+ - Fixed bug of stack leak in function shadings in postscript.
+ - Fixed missing image inclusion documentation.
+ - Fixed atan bug in documentation example.
+ - Fixed missing dependency of chains--positioning library
+ - Fixed missing dependency of mindmap--decorations library
+
+2008-02-20 Till Tantau <tantau@users.sourceforge.net>
+
+ Released version 2.00
+
+2008-02-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed "initial"/"accepting" distance bug.
+ - Fixed wrong intersection computation bug.
+
+2008-02-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added "local bounding box" option for Fabien...
+
+2008-02-12 Till Tantau <tantau@users.sourceforge.net>
+
+ - Finished chains and chain tutorial.
+ - Fixed height of rounded rectangle shape.
+
+2008-02-11 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added "auto end on length" and "auto corner on length"
+ options to decorations.
+ - Added "if input segment is closepath" option to
+ decorations.
+ - Renamed "subpath" in decoration code to "inputsegment". In
+ the pdf-specification (and in the rest of the pgf manual) a
+ path is made up of subpath, which are started by movetos,
+ and these in turn are made up of segments. In decorations,
+ segments used to be called subpaths, which was too
+ confusing...
+ - More renaming in chains, but its stabilizing now.
+ - Started a tutorial on chains.
+
+2008-02-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Moved chain part inside "positioning" into "chains"
+ library.
+ - Renamed things in the chains library, yet again and added
+ branches.
+ - Fixed bug with "xyz of" placements.
+
+2008-02-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Renamed "placements" library to "positioning".
+ - Renamed and changed all chain commands.
+ - Added scopes library.
+ - Renamed cap and join to line cap and line join (but old ones
+ are still available).
+
+2008-02-07 Till Tantau <tantau@users.sourceforge.net>
+
+ - Patched Makefiles according to suggestion by Hans Meine.
+ - Fixed bug: duplicate fading name in pgflibraryfadings.
+ - Fixed bug: wrong size of functional shading in dvips.
+ - Fixed bud: documentation a4paper setting.
+ - Fixed bug: Manual now compiles with tex4ht once more.
+ - Fixed bug: Manual now is hyperlinked also for dvipdfm.
+ - Fixed bug: wrong size of all shadings in svg code.
+ - Slight change in placement lib, default chain now has a
+ name.
+
+2008-02-07 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Removed internal asin tables as asin is now calculated from
+ acos tables.
+ - Misc. updates for shapes docs.
+
+
+2008-02-06 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed fit library, so that nodes are now "completely"
+ fitted.
+ - Changed tutorial so that fit library is now used.
+ - Added placement library and documentation.
+
+2008-02-05 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixes in snake compatibility code.
+ - Added dvipdfmx support (identical to dvipdfm).
+ - Fixed missing braces and color stack problem in
+ shapes.logic.IEC.
+
+2008-02-04 Till Tantau <tantau@users.sourceforge.net>
+
+ - Patched (and hopefully fixed) hyperref support.
+ - Made matrix inversion more precise.
+ - Added tutorial for geometric constructions.
+ - Fixed partway and intersection computations.
+ - Added line to circle intersection.
+
+2008-02-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added through library (still very simple...).
+ - Added computation of intersection of circles and tangent to
+ a circle.
+
+2008-01-31 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Updated isosceles triangle shape. Positioning of node
+ contents improved. Added key so minimum width and height
+ can be applied independently
+ - Fix for trapezium shape for minimum height. This fix may
+ ``break'' exisiting code by making any trapezium enlarged using
+ minimum height to appear slightly wider than before. But...
+ - Added keys for trapezium so that minimum width and height
+ can be applied independently, or to just the `body' of the
+ trapezium.
+
+2008-01-30 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Reimplemented shape `tape'. Anchors should behave a bit
+ better now.
+
+2008-01-29 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed problem with pin a relative coordinates.
+
+2008-01-27 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added `logic gate IEC symbol color` key to change color
+ for all symbols simultaneously.
+ - Fix for loading US and IEC shape library separately.
+ - Misc. updates for decoration docs.
+
+2008-01-26 Till Tantau <tantau@users.sourceforge.net>
+
+ - Modified calc library. Working on documentation.
+ - Added calc library and ($...$) notation for coordinates.
+
+2008-01-25 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Reorganised logic shapes. Now two libraries:
+ shapes.gates.logic.US (for `American' gates) and
+ shapes.gates.logic.IEC (for rectangular gates).
+ Gates are now named `and gate US' or `and gate IEC' etc.
+ TikZ key `use US style logic gates' and `use IEC style
+ logic gates' set up styles so that (e.g.) `and gate'
+ becomes a synonym for `shape=and gate US'. See docs for
+ details.
+
+2008-01-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added decorations.markings.
+
+2008-01-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed pgfpatharc: Fractional angles are now handled
+ correctly.
+ - Fixed incompatability with bm package: Changed hack to
+ \@@end to \AtEndDocument.
+ - Changed things in the math engine to speed up things: First,
+ \pgfmath@returnone now uses simpler and faster code. Second,
+ some marshals in the internal math commands like
+ \pgfmathadd@ have been removed. This makes it necessary that
+ the second operand in a call to an internal math macro no
+ longer uses \pgf@x or \pgf@xa and I fixed the 3 places where
+ this was the case.
+ - Added footprint decoration and merged Marks footprints.
+ - Added buffering to the subpath mechanism. This speeds up
+ constructions of very long paths by a factor of 10 or more.
+ - Fixed missing declaration of \iftikz@decoratepath in
+ tikz.code.tex.
+
+2008-01-22 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added logic shapes library. Includes AND gate, NAND gate,
+ OR gate, NOR gate, XOR gate, XNOR gate and NOT gate.
+
+2008-01-22 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fooled around with title page.
+ - Changed TikZ path scoping rules: Scopes no longer affect the
+ last point on a path. This was a nuiseance before and became
+ a real problem with decorations.
+ - Finished my move from snakes to decorations. Also finished
+ documentation.
+ We are now ready for a new release!
+
+2008-01-19 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Removed \externalcode command for decoration states as
+ persistent pre/postcomputation stuff does a similar job.
+
+2008-01-18 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added \externalcode command for decoration states. Allows
+ code to be executed outside the TeX-group the state code
+ is executed in.
+
+2008-01-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Split decoration lib into several libs.
+ - Renamed lineto decoration to curveto decoration.
+ - Renamed many keys of decorations and snakes to shorter
+ names.
+ - Changed the tikz setting of decoration options.
+ - No documentation yet.
+
+2008-01-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Started merging snakes and decorations. Not yet finished.
+
+2008-01-16 Till Tantau <tantau@users.sourceforge.net>
+
+ - (Partly) rewrote the tikz support for decorations. There is
+ now a "decorate" path command:
+ \draw ... decorate [decoration=zigzag] { (0,0) -- (1,2) };
+ This yields a much cleaner interface.
+ - There is also a decorate=true/false option that causes the
+ whole path to be decorated.
+ - Decorated path can now contain nodes.
+ - Node paths can also be decorated now.
+ - Fixed missing \pgftransformreset inside decoration
+ environment.
+
+2008-01-15 Till Tantau <tantau@users.sourceforge.net>
+
+ - Changed the decoration documentation a bit. Still not quite
+ perfect...
+ - Restructured the basic layer. There is a central core (which
+ got slightly larger) and "modules", which can be included
+ using \usepgfmodule. All the pgfbaseXXX files are now
+ obsolete and only included for the old ones for
+ compatibility.
+ The {pgf} package no longer includes the modules "pattern",
+ "snakes" and "decorations" by default. However, these
+ modules are loaded by their respective libraries, so,
+ normally, no one will notice.
+
+2008-01-15 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for minimum size in ellipse split shape.
+ - Added decorations documentation.
+
+2008-01-14 Till Tantau <tantau@users.sourceforge.net>
+
+ - Coordinates like (2,3cm) are now allowed. Has the same
+ effect as ([shift={(2,0)}]0pt,3cm), which is what everybody
+ would expect.
+ - Moved tikz hacks inside tikzlibrarydecorations into
+ tikz.code.tex itself.
+
+2008-01-14 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for save stack overflow in decorations.
+ - Renamed \pgfdecorate \endpgfdecorate, now \pgfdecoration
+ \endpgfdecoration. Makes it more consistent with...
+ - Meta decorations! Automata that decorate the path with
+ decoration automata! Increased fancyness! Docs soon.
+ - Removed a bunch of keys from \tikzlibrarydecorations as
+ not really necessary.
+
+2008-01-13 Till tantau <tantau@users.sourceforge.net>
+
+ - Changed shadow lib once more and added it to CVS.
+
+2008-01-13 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added decorations files. Docs to follow soon(ish).
+ - Fix for `star point ratio' and `star point height'
+ keys in star shape.
+
+2008-01-11 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added copy shadow.
+
+2008-01-10 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added random steps snake.
+
+2008-01-09 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added shadow library, removed shadow shapes (no longer
+ needed).
+ - Added preaction and postaction options (very useful).
+ - Added transform canvas option.
+ - Added scale around option.
+ - Moved tikz.code.tex to tikz/tikz.code.tex
+ - Moved .../libraries/pgflibrarytikzXXXX.code.tex to
+ .../frontendlayer/tikz/libraries/tikzlibraryXXXX.code.tex.
+
+2007-12-20 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed missing example bbs for dvipdfm.
+ - Fixed buggy swirl shading.
+ - Finished documentation switch from \itemoption to {key}.
+ - Changed TikZ fading options. More consistent and easier to use,
+ now.
+
+2007-12-20 Mark Wibrow <vibrovski@users.sourceforge.net>
+ - Added `ellipse split' shape.
+
+2007-12-17 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed spaces problem with external graphics.
+ - Added [missing] option to supress children.
+ - Reduced number of libs includes by {shapes} to geometric,
+ misc and symbol. Shapes is now more or less deprecated.
+ - Added shadowed shapes.
+ - Added pgfsys-xetex for native xetex support.
+ - Added documentation hint on scoping inside \foreach.
+ - Fixed bug [1620194] "tikz library mindmap requires trees"
+ - Fixed bug [1787504] "Usage of \@namelet in xxcolor.sty clases with memoir."
+ - Fixed bug [1809693] "background rectangle is scaled".
+
+2007-12-13 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added fadings.
+ - Added functional shadings.
+ - Fixed bug in double drawing with arrows.
+
+2007-11-24 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for all math functions with two arguments.
+ - Fix for tikz when y-coordinate is a function within braces.
+ - Fix for distance calculation in shape snake.
+ - Added `cloud callout' shape.
+ - cloud shape can now use (or ignore) `aspect' key.
+ - More key updates/fixes for shapes.
+
+2007-11-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Corrected minimum size of a diamond shape (was twice the
+ correct size -- this may break existing code, but that cannot
+ be avoided!).
+ - Changed some more documentation from \itemoption to {key}s. Not
+ yet finished.
+
+2007-11-19 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Updated math documentation. Code examples now consistent with
+ the rest of the manual.
+
+2007-11-12 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed hyperref-dvipdfm-problem.
+
+2007-11-10 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Updated cloud shape for minimum size calculations.
+ - Reimplemented rounded rectangle. Now supports concave arcs.
+ - Removed all stuff for Fancy hyperlinked picture of shapes.
+
+2007-11-07 Till Tantau <tantau@users.sourceforge.net>
+
+ - \foreach will now allow a macro name to be given as list
+ argument (as in \foreach \x in \mylist {...})
+
+2007-10-29 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed keys problem when .try is used with a comma.
+
+2007-10-28 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed shape snake for drawing to other pictures.
+ - Added shapes `arrow box' shape, `rectangle callout` and
+ `ellipse callout'.
+
+2007-10-26 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed dvipdfm problem with hyperref.
+
+2007-10-13 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - pgfbasesnakes: changed length calculation and added angle calculation.
+ - added `shape snake' to snake library.
+ - added cylinder shape to geometric shapes.
+ - renamed `bevelled rectangle'. Now called `chamfered rectangle'.
+ - renamed pgfsavepgf@process. Now called pgfextract@process.
+
+2007-10-12 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed bug #1803811 gobbling of tokens after \pgfmathaddtocounter.
+ - Fixed insertion of spaces after \pgfmath stuff.
+ - Fixed bug #1811862.
+
+2007-09-19 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fix for cot and tan. Now correctly return negative values.
+ - Added `...head indent' option for single and doube arrow
+ shapes (allows the arrowheads to look more `fancy').
+ - Updated tikzshapes.geometric and tikzshapes.symbols so
+ the incircle border construction can be used in TikZ
+ if libraries are loaded separately.
+ - Misc. fixes and updates for shapes doc.
+
+2007-09-18 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed isosceles triangle, circular sector and circle split
+ for `text width' key.
+ - Fixed star, cloud and rectangle shape for using anchors for
+ positioning.
+ - New shapes:Rectangle split, rounded rectangle,
+ bevelled rectangle, tape, signal, single arrow and double arrow.
+ - Fancy hyperlinked picture of all shapes added to shape lib. doc.
+ - Updated math doc.
+ - Fix for square root.
+ - Fix for parsing negative box dimensions.
+ - (Yet another) division version.
+
+
+2007-08-20 Mark Wibrow <vibrovski@users.sourceforge.net>
+ - Added cloud shape.
+ - Updated all shapes (and doc.) for pgfkeys.
+ - Changed Kite key: Now use (e.g.) '/pgf/kite vertex angles=60 and 70' (see doc.)
+ - Added keys /pgf/shape aspect and /pgf/shape aspect inverse, (but \pgfsetshapeaspect
+ and, TikZ option `apsect' are still there for compatability).
+ - Updated diamond shape (and doc.) to use keys.
+ -`Housekeeping' stuff (moved some macros around).
+
+
+2007-08-10 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Trapezium shape updated. No longer uses left and right
+ extensions. Uses internal angles instead.
+ - Updated pgfkeys for shapes (not done \pgfsetshapeaspect for
+ diamond shape)
+
+2007-08-09 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added new starburst shape to misc shapes.
+ - Updated all shapes to pgfkeys.
+
+2007-08-08 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added fitting library.
+
+2007-07-28 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Fixed parser for expressions beginning with groups
+ preceeded by signs e.g. -(4+3)
+ - This also fixes problem in TikZ when specifiying coordinates
+ contatining groups. Coordinates in the form (1, {(2+3)}) will
+ work even if there are spaces after the comma.
+
+2007-07-23 Till Tantau <tantau@users.sourceforge.net>
+
+ - Started to use new pgfkeys also in pgf. In particular,
+ commands like \pgfsetshape... are now replaced by keys.
+ (Not yet finished.)
+
+2007-07-21 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added new geometric shape: `circular sector'.
+ - Updated pgfbaseshapes.code.tex for saved macro support.
+
+2007-07-12 Till Tantau <tantau@users.sourceforge.net>
+
+ - Added overlay functionality to \node.
+ - Added pgfkeys and its documentation.
+
+2007-07-10 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Updated all `new' geometric shapes: polygon, star, trapezium,
+ semicircle, isosceles triangle, kite, dart.
+ - `isosceles triangle' and `simple isosceles triangle' combined
+ into one shape.
+ - more accurate anchor positioning in polygon and star shapes.
+ - Added `shape border uses incircle' option for supporting shapes.
+ - Added `shape border rotate' option for supporting shapes.
+
+2007-07-04 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added support for sec, cosec and cot.
+
+2007-07-03 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed missing compatibility \pgfsincos
+ - Fixed wrong \pgfmathsincos
+
+2007-06-23 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added semicircle shape.
+ - Updated documentation for all new shapes.
+
+2007-06-22 Mark Wibrow <vibrovski@users.sourceforge.net>
+
+ - Added support for savedmacros in \pgfdeclareshape.
+ - Added trapezium shape.
+ - Added support for `legacy' calc code (\real, \minof, \maxof, \ratio).
+ - Fixed 'public' sqrt macro in \pgfmathoperations.code.tex
+ - Added isosceles triangle shape: uses incircle, but supports arbitrary
+ rotation of border.
+ - Added simple isosceles triangle shape: much tighter fit of node
+ contents, but restricted rotation of border.
+
+2007-06-21 Till Tantau <tantau@users.sourceforge.net>
+
+ - Fixed text width problem in matrix of nodes.
+
+2007-01-18 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 1.18:
+
+ - Added regular polygon and star shapes (by Mark Wibrow).
+ - Added graphic externalization commands.
+ - Added barycentric coordinate system.
+ - Added direct TikZ plotting of function based on math engine.
+ - Added math documentation into main documentation.
+ - Added Mark Wibrow's math library.
+ - Added calendar support.
+ - Added matrix stuff.
+ - Added automatic driver selection for xetex.
+ - Added "growth parent anchor" option.
+ - Fixed superfluous spaces in quick math parse code
+ - Fixed superfluous \newboxes in math and image code
+ - Fixed mth parser to recognize \wd\mybox.
+ - Fixed wrong \pgfmathsetrandomseed
+ - Fixed wrong \pgfmathradians@
+ - Fixed problems with long mantissa and plain tex math code.
+ - Fixed things so that \setlength works in pictures, once
+ more.
+ - Fixed selectfont problem in pdfsys-dvipdfm.def
+ - Fixed problem with lost lastx/lasty in foreach in TikZ.
+ - Fixed snake+rectangle+transform problem.
+ - Fixed rectangle+rounded corner problem.
+ - Fixed postscrip eofill1 problem.
+ - Fixed amsmath/pgf clash because of wrong definition of \:
+ - Fixed size of hyperlinks inside nodes.
+ - Fixed ConTeXt problem in pgfbaseplot.
+ - Fixed .aux problems in plain and ConTeXt mode. Using .pgf as
+ extension now.
+
+2006-10-26 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 1.10:
+
+ - Renamed \pgf@sys@pdf@mark to \pgfsyspdfmark.
+ - Fixed the ConTeXt support so that it is usable (which is wasn't).
+
+2006-10-11 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 1.09:
+
+ - Added \usepgflibrary and \usetikzlibrary to simplify adding
+ new libraries.
+ - Added native ConTeXt support in the form of module
+ wrappers.
+ - Added patterns.
+ - Added crosses snake.
+ - Added to and edge path operations.
+ - Added to path library. In particular, this gives decent
+ curved paths.
+ - Added tikz automata library.
+ - Added tikz er diagram library.
+ - Added tikz Petri net library.
+ - Added tikz mindmap library.
+ - Added access to nodes in other pictures (!).
+ - Added extended baseline setting.
+ - Added functionality to add new coordinate systems.
+ - Added polar xy coordinate system.
+ - Added diamond shape (!).
+ - Added plot mark phase, repeat and indices.
+ - Added text height and text depth options.
+ - Added label and pin options.
+ - Added automatic node placement (!).
+ - Added pgfsys-dvi.def for pure dvi mode. Supports only
+ black and white drawing (not documented and not really usable).
+ - Added 3d library (not documented and not really usable).
+ - Cleared up license chaos.
+ - Reorganized library documentation.
+ - Removed pgflibraryautomata, use pgflibrarytikzautomata instead.
+ - Fixed tree level option bug.
+ - Fixed missing options for coordinates.
+ - Fixed bug in TikZ parabola code.
+ - Fixed bug in TikZ snake cycle code.
+ - Fixed bug with empty list in pgffor
+ - Fixed bug in code for insertion of dvips header specials.
+ - Fixed bug in shading code (wrong bigpoint correction).
+ - Fixed bug #1472666.
+ - Fixed bug #1473255.
+ - Fixed bug #1526175.
+ - Fixed bug #1542512.
+ - Fixed bug in TikZ transformation code for nested pictures.
+ - Fixed patch #1443606.
+ - Fixed path #1526178.
+
+2005-11-16 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 1.01:
+
+ - Added textures support.
+ - Added text opacity option.
+ - Fixed bug in pgfbasesnakes.code.tex causing lot's of
+ 'missing = in nullfont' message in log file.
+ - Fixed bug that made plain tex mode unusable.
+ - Fixed missing pgfsys-vtex.def in FILES.
+ - Fixed wrong box placements in compatibility mode.
+ - Fixed SVG support to create legal xml.
+ - Moved documentation to doc/generic/pgf.
+
+2005-10-23 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 1.00:
+
+ - There have not been any real changes since 0.99.
+
+
+2005-10-11 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.99:
+
+ - Added vtex support (finally!).
+ - Added multi part mechanism to nodes.
+ - Added very simple pgflibraryautomata.
+ - Changed coordinate shape such that it now never produces a
+ text label.
+ - Renamed \pgfshapebox to \pgfnodeparttextbox (made necessary
+ by the node part mechanism).
+
+2005-09-20 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.98:
+
+ - Added transparency to PGF (quite nice...).
+ - Added foreach option to child path operation (also nice...).
+ - Fixed problem with \\ in centered text.
+ - Fixed problem with hyperlinks in nodes.
+ - Fixed wrong arrows in trees.
+
+2005-09-08 Till Tantau <tantua@users.sourceforge.net>
+
+ Version 0.97:
+
+ - Reorganised directory structure of documentation.
+ - Added tree mechanism.
+ - Added snake mechanism.
+ - Added layer mechanism.
+ - Added new shapes: cross out, strike out, forbidden sign.
+ - Added some more documentation.
+ - Added "none" drawing and filling colors.
+ - Added pgflibrarytikzbackgrounds.
+ - Changed syntax of \pgfqbox.
+ - Changed syntax of several \pgfsys@xxxx commands.
+ - Added SVG support / a tex4ht backend. (Complicated text
+ inside svg graphics is not supported well, but that's mainly
+ a shortcoming of the svg specification.)
+
+2005-07-06 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.96:
+
+ This is a beta version. Version 1.00 will be the first stable
+ version of TikZ/pgf.
+
+ - Fixed spacing problem in dvips.
+ - Changed syntax of plot and plot marks.
+ - Changed syntax of ellipse and elliptical arc options.
+ - Fixed baseline bug in tikz.
+ - Fixed bug in pgfpages.
+ - Introduced "every xxxx" styles, got rid of shape actions option.
+ - Added "intersection of" syntax for coordinates.
+ - Started revising the documentation.
+ - Changed names of some pgfpages commands.
+ - Changed syntax of parabola command.
+ - Proof read documentation.
+
+2005-06-12 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.95:
+
+ This is an *alpha* prerelease version. Syntax changes
+ are still possible before the beta version. Version 1.00
+ will be the stable version.
+
+ Changes (this is almost a new program):
+ - Introduced three layers: system, basic, frontends.
+ - Wrote two frontends: TikZ (*most* useful!) and pgfpict2e (a
+ demonstration).
+ - Largely rewrote the basic layer.
+ - Largely rewrote the system layer.
+ - Completely rewrote the documentation.
+ - Added two utilities: pgfpages and pgffor.
+ - Made macro naming more consistent.
+ - Added plain tex support.
+ - Added dvipdfm support.
+ - Restructured directory structure.
+ - Zillions of small bugfixes.
+
+2004-10-20 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.65:
+ - Fixed bug in pgfshade.sty that arises in conjunction with
+ calc.sty and latex+dvips.
+
+2004-10-08 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.64:
+ - Fixed missing depth of \pgfnodebox.
+ - Fixed bug that caused infinite stack loop with pictures inside
+ nodes.
+
+2004-07-08 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.63:
+ - Added \pgfextractx, \pgfextracty, \pgfcorner.
+ - Added some documentation on masks and images.
+ - Fixed a somewhat obscure bug having to do with the modification
+ of \spaceskip.
+ - \pgfex and \pgfem no loner needed. Use 1ex etc. once more.
+ - calc.sty is now supported.
+
+2004-07-06 Till Tantau <tantau@users.sourceforge.net>
+
+ Version 0.62:
+ - Fixed problem in xxcolor with option "gray" and xcolor.
+ - Switched to xcolor version 2.00.
+ - Added eofill and eofillstroke commands.
+ - Added option to shadings, so that they are automatically
+ recalculated upon color changes.
+ - Changed names of example images to start with pgf.
+
+2004-04-07 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.61:
+ - Added \pgfex and \pgfem dimensions.
+ - Fixed bug that causes pgfshade to fail to work if xcolor
+ is called with option "gray".
+ - Fixed PostScript code for radial shadings.
+ - xxcolor now works with xcolor 1.10 (and only 1.10).
+
+2004-02-18 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.60:
+ - Replaced some commands for the postscript code by shorter
+ versions for smaller file size.
+ - Fixed bug in pgfbox command that caused incorrect kerning in
+ postscript output.
+ - Fixed bug in pgfsys@defineimage that made page inclusion
+ impossible.
+ - Fixed bug in pgfshading that did not reset dash patterns in
+ shadings in the PostScript version.
+ - Spaces are now allowed inside the pgfpicture environment.
+ - Added \pgfgrid command.
+
+2004-01-13 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.50:
+ - Switched to version 1.06 of xcolor.
+ - Core pgf no longer relies on xxcolor.
+ - The syntax of the mechanism for choosing alternate images and
+ shadings is more flexible now. The syntax has been changed
+ (mainly, you now have to have a dot between the original name and
+ the alternate extension).
+ - Some xxcolor commands have been removed.
+
+2003-12-02 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.43:
+ - Fixed \normalcolor, so that it works also in preamble.
+
+2003-11-20 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.42:
+ - Documented masks.
+ - Fixed bug in pgf.sty for nested pictures.
+
+2003-11-18 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.41:
+ - Added masks (not yet documented).
+
+2003-11-12 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.40:
+ - Changed syntax of \pgfdeclareimage. Uses key=value scheme
+ now. All parameters may now be omitted.
+ - Added \pgfimage command.
+ - Option for selecting a specific page from an image file.
+ - Fixed bug in xxcolor.sty having to do with \@ifempty command.
+ - Reworked the formatting of the user's guide.
+
+2003-10-29 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.34:
+ - Shadings now work together with color mix-ins.
+ - Shadings can now take color names as parameters.
+
+2003-10-24 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.33:
+ - Fixed problem with missing \leavevmode in \pgfuseimage.
+ - Reworked code for image inclusion.
+ - "Draft" option is now supported. Supresses reading of images.
+ - Added xxcolor package.
+ - pgfpictures will now inherit the color from their surroundings.
+
+2003-10-20 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.32:
+ - Updated installation procedure information.
+
+2003-09-18 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.31:
+ - One parameter for \pgfdeclareimage may now be omitted. It will
+ be computed automatically.
+
+2003-08-21 Till Tantau <tantau@cs.tu-berlin.de>
+
+ Version 0.30:
+ - Created ChangeLog
+ - Added pgfshade.sty
+
+
+
+;;; Local Variables:
+;;; coding: undecided-unix
+;;; End:
diff --git a/graphics/pgf/base/doc/FILES b/graphics/pgf/base/doc/FILES
new file mode 100644
index 0000000000..43cfc8e912
--- /dev/null
+++ b/graphics/pgf/base/doc/FILES
@@ -0,0 +1,773 @@
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfsys-protocol.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-shapes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-external.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-chains.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-coordinates.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-main-body.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-math-numberprinting.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-svg-path.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-circular.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-backgrounds.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-layers.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-paths.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-polar.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-animations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-usage-pgf.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-phylogenetics.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-math-parsing.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-binding-layer.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfsys-animations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-views.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-images.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-fadings.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfsys-commands.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-math-algorithms.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-design.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-arrows.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-transparency.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-spy.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfkeysfiltered.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-license.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-design.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfsys-paths.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgffor.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-trees.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-axes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-math-design.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-automata.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-edges.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-misc.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-shadings.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-arrows.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-plots.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-calendar.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-overview.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-actions.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-math.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-patterns.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tutorial-map.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-plots.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-plot-marks.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-lsystems.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-trees.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-actions.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-animations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-rdf.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-internalregisters.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-algorithm-layer.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-mindmaps.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-pics.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-decorations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-through.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-scopes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-external.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-babel.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-visualizers.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfkeys.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-transparency.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-points.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-trees.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-paths.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-usage-tikz.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tutorial-chains.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-fit.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-plot-handlers.tex
+pgf/doc/generic/pgf/text-en/plots/pgf-exp.table
+pgf/doc/generic/pgf/text-en/plots/pgfmanual-sine.table
+pgf/doc/generic/pgf/text-en/plots/pgf-parametric-example.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgfmanual-sine.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgfplotgnuplot-example.table
+pgf/doc/generic/pgf/text-en/plots/pgf-tan-example.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgf-x.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgf-tan-example.table
+pgf/doc/generic/pgf/text-en/plots/pgf-asymptotic-example.table
+pgf/doc/generic/pgf/text-en/plots/pgfplotgnuplot-example.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgf-parametric-example.table
+pgf/doc/generic/pgf/text-en/plots/pgf-asymptotic-example.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgf-sin.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgf-exp.gnuplot
+pgf/doc/generic/pgf/text-en/plots/pgf-x.table
+pgf/doc/generic/pgf/text-en/plots/pgf-sin.table
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-matrices.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-turtle.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-examples.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-display-layer.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-oo.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-edge-routing.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-patterns.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-shadows.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-xxcolor.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-3d.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-formats.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-decorations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-graphs.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tikz-transformations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-installation.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tutorial.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-nodes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-algorithms-in-c.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-fixedpoint.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-introduction.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-drivers.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-petri.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-stylesheets.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-fpu.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-ogdf.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-main-preamble.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-calc.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pages.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-main.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-examples.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-shadings.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-matrices.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-shapes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-quick.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-scopes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-force.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tutorial-nodes.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-arrows.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-guidelines.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-module-parser.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-dv-backend.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-angles.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-base-matrices.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-decorations.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-math-commands.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfcalendar.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-introduction.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-pgfsys-overview.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-gd-layered.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-main.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-er.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-folding.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-library-profiler.tex
+pgf/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex
+pgf/doc/generic/pgf/extract.lua
+pgf/doc/generic/pgf/version-for-pdftex/en/Makefile
+pgf/doc/generic/pgf/version-for-pdftex/en/pgfmanual.tex
+pgf/doc/generic/pgf/version-for-pdftex/pgfmanual-pdftex.cfg
+pgf/doc/generic/pgf/pgfmanual.pdf
+pgf/doc/generic/pgf/version-for-dvisvgm/pgfmanual-dvisvgm.cfg
+pgf/doc/generic/pgf/version-for-dvisvgm/en/pgfmanual-test.tex
+pgf/doc/generic/pgf/version-for-dvisvgm/en/Makefile
+pgf/doc/generic/pgf/version-for-dvisvgm/en/pgfmanual.html
+pgf/doc/generic/pgf/version-for-dvisvgm/en/pgfmanual-test.html
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgf-exp.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgfmanual-sine.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgfplotgnuplot-example.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgf-tan-example.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgf-asymptotic-example.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgf-parametric-example.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgf-x.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/plots/pgf-sin.table
+pgf/doc/generic/pgf/version-for-dvisvgm/en/pgfmanual.tex
+pgf/doc/generic/pgf/ChangeLog
+pgf/doc/generic/pgf/licenses/manifest-documentation.txt
+pgf/doc/generic/pgf/licenses/manifest-code.txt
+pgf/doc/generic/pgf/licenses/LICENSE
+pgf/doc/generic/pgf/licenses/gnu-public-license-2.txt
+pgf/doc/generic/pgf/licenses/gnu-free-documentation-license-1.2.txt
+pgf/doc/generic/pgf/licenses/latex-project-public-license-1.3c.txt
+pgf/doc/generic/pgf/version-for-luatex/pgfmanual-luatex.cfg
+pgf/doc/generic/pgf/version-for-luatex/en/pgfmanual-test.tex
+pgf/doc/generic/pgf/version-for-luatex/en/Makefile
+pgf/doc/generic/pgf/version-for-luatex/en/pgfmanual.tex
+pgf/doc/generic/pgf/README-3.0.0
+pgf/doc/generic/pgf/macros/pgfmanual-en-macros.tex
+pgf/doc/generic/pgf/FILES
+pgf/doc/generic/pgf/version-for-tex4ht/en/Makefile
+pgf/doc/generic/pgf/version-for-tex4ht/en/pgfmanual.tex
+pgf/doc/generic/pgf/version-for-tex4ht/pgfmanual-tex4ht.cfg
+pgf/doc/generic/pgf/images/pgfmanual-mindmap-2.pdf
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.25.bb
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.25.jpg
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.jpg
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.xbb
+pgf/doc/generic/pgf/images/brave-gnu-world-logo-mask.bb
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.bb
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.25.eps
+pgf/doc/generic/pgf/images/brave-gnu-world-logo-mask.jpg
+pgf/doc/generic/pgf/images/pgfmanual-mindmap-1.pdf
+pgf/doc/generic/pgf/images/brave-gnu-world-logo.eps
+pgf/doc/generic/pgf/version-for-dvipdfmx/pgfmanual-dvipdfmx.cfg
+pgf/doc/generic/pgf/version-for-dvipdfmx/en/pgfmanual-test.tex
+pgf/doc/generic/pgf/version-for-dvipdfmx/en/Makefile
+pgf/doc/generic/pgf/version-for-dvipdfmx/en/pgfmanual.tex
+pgf/doc/generic/pgf/version-for-vtex/pgfmanual-vtex.cfg
+pgf/doc/generic/pgf/version-for-vtex/en/Makefile
+pgf/doc/generic/pgf/version-for-vtex/en/pgfmanual.tex
+pgf/doc/generic/pgf/README
+pgf/doc/generic/pgf/version-for-dvips/pgfmanual-dvips.cfg
+pgf/doc/generic/pgf/version-for-dvips/en/Makefile
+pgf/doc/generic/pgf/version-for-dvips/en/pgfmanual.tex
+pgf/doc/generic/pgf/INSTALL
+pgf/doc/generic/pgf/version-for-dvipdfm/pgfmanual-dvipdfm.cfg
+pgf/doc/generic/pgf/version-for-dvipdfm/en/Makefile
+pgf/doc/generic/pgf/version-for-dvipdfm/en/pgfmanual.tex
+pgf/doc/generic/pgf/version-for-xetex/pgfmanual-xetex.cfg
+pgf/doc/generic/pgf/version-for-xetex/en/Makefile
+pgf/doc/generic/pgf/version-for-xetex/en/pgfmanual.tex
+pgf/doc/generic/pgf/AUTHORS
+pgf/source/generic/pgf/testsuite/mathtest/unittest_luamathparser.tex
+pgf/source/generic/pgf/testsuite/mathtest/pgfmathtestsuite.tex
+pgf/source/generic/pgf/testsuite/external/tikzexternaltest.code.tex
+pgf/source/generic/pgf/testsuite/external/Makefile
+pgf/source/generic/pgf/testsuite/external/tikzexternaltest.sharedpreamble.tex
+pgf/source/generic/pgf/testsuite/external/tikzexternaltest.tex
+pgf/source/generic/pgf/testsuite/external/tikzexternaltestmakefile.tex
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/examples/c/SimpleDemoC.c
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/examples/c/SimpleDemoCPlusPlus.c++
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/examples/c/Makefile
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/interface/c/InterfaceFromC++.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/interface/c/Makefile
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/interface/c/InterfaceFromC++.c++
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/interface/c/InterfaceFromC.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/interface/c/InterfaceFromC.c
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/SimpleDemoOGDF.c++
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/planarity/planarity_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/planarity/PlanarizationLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/module/module_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/Makefile
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/ogdf_script.c++
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/energybased_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/CirclePlacer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/MatchingMerger_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/IndependentSetMerger_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/SolarPlacer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/LocalBiconnectedMerger_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/RandomMerger_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/EdgeCoverMerger_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/ZeroPlacer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/multilevelmixer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/SolarMerger_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/RandomPlacer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/MedianPlacer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/multilevelmixer/BarycenterPlacer_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/FMMMLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/FastMultipoleEmbedder_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/SpringEmbedderFR_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/SpringEmbedderKK_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/GEMLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/MultilevelLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/energybased/SpringEmbedderFRExact_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/InterfaceFromOGDF.c++
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/DfsAcyclicSubgraph_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/BarycenterHeuristic_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/LongestPathRanking_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/SplitHeuristic_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/MedianHeuristic_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/GreedyCycleRemoval_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/SugiyamaLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/layered_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/SiftingHeuristic_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/GreedyInsertHeuristic_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/CoffmanGrahamRanking_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/OptimalRanking_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/FastHierarchyLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/layered/FastSimpleHierarchyLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/InterfaceFromOGDF.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/misclayout/misclayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/misclayout/CircularLayout_script.h
+pgf/source/generic/pgf/c/graphdrawing/pgf/gd/ogdf/c/misclayout/BalloonLayout_script.h
+pgf/source/generic/pgf/c/Makefile
+pgf/source/generic/pgf/c/INSTALL
+pgf/source/generic/pgf/c/config/ExampleLocalMakefileConfig.mk
+pgf/source/generic/pgf/c/config/MakefileConfig.mk
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringLayouts.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/CoarseGraph.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlElectric.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlSprings.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/QuadTree.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalHu2006.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlCoarsening.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceTemplate.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/CoarseGraphFW.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/InitialTemplate.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/Preprocessing.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceController.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/PathLengthsFW.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/doc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SimpleSpring.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringHu2006.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlStart.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlIteration.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlDeclare.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalLayouts.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalWalshaw2000.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/force.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/ASCIIDisplayer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/BindingToASCII.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleDemo.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleEdgeDemo.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleHuffman.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/example_graph_for_ascii_displayer.txt
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceCore.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToC.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/Scope.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToAlgorithms.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/PhylogeneticTree.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/Maeusle2012.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/DistanceMatrix.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/SokalMichener1958.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/BindingToPGF.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/Binding.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/doc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ChildSpec.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/SpanningTreeComputation.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ReingoldTilford1981.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/DepthFirstSearch.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Bezier.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Simplifiers.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PriorityQueue.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Stack.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Storage.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Event.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Direct.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/LookupTable.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PathLengths.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Transform.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/module/AcyclicSubgraphModule.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/module/InitialPlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/module/HierarchyLayoutModule.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/module/RankingModule.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/module/MultilevelBuilder.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/module/TwoLayerCrossMin.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/GEMLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SplitHeuristic.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/MedianHeuristic.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/DfsAcyclicSubgraph.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/BarycenterHeuristic.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/OptimalRanking.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/GreedyInsertHeuristic.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/ogdf.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees/Koerner2015.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentAlign.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/doc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/FineTune.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Orientation.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDistance.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/NodeAnchors.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Anchoring.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentOrder.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Components.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDirection.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/LayoutPipeline.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Distances.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Sublayouts.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Hyperedge.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Digraph.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Vertex.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Coordinate.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Collection.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Edge.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path_arced.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Node.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Graph.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Iterators.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Vector.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Cluster.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Edge.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodePositioningGansnerKNV1993.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_ranking.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Ranking.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalEadesLS1993.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/crossing_minimization.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990b.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Sugiyama.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/edge_routing.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_positioning.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/cycle_removal.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NetworkSimplex.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/EdgeRoutingGansnerKNV1993.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990a.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingMinimumHeight.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingGansnerKNV1993.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/ogdf/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/NecklaceRouting.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/Hints.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/ShiftMethod.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/LinkedList.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/BoyerMyrvold2004.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PDP.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/parameters.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/Embedding.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PlanarLayout.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/List.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/tools/make_gd_wrap.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/doc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Supergraph.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Skambath2016.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/layered.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/TimeSpec.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/Tantau2012.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/doc.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/library.lua
+pgf/tex/generic/pgf/graphdrawing/lua/pgf/gd.lua
+pgf/tex/generic/pgf/graphdrawing/lua/LUA_CODING_STYLE
+pgf/tex/generic/pgf/graphdrawing/lua/pgf.lua
+pgf/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.force.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.layered.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.circular.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.trees.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/experimental/tikzlibrarygraphdrawing.evolving.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/tikzlibrarygraphdrawing.code.tex
+pgf/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.examples.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduledecorations.code.tex
+pgf/tex/generic/pgf/modules/pgfmodulesorting.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduledatavisualization.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduleplot.code.tex
+pgf/tex/generic/pgf/modules/pgfmodulebending.code.tex
+pgf/tex/generic/pgf/modules/pgfmodulenonlineartransformations.code.tex
+pgf/tex/generic/pgf/modules/pgfmodulesnakes.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduleoo.code.tex
+pgf/tex/generic/pgf/modules/pgfmodulematrix.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduleparser.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
+pgf/tex/generic/pgf/modules/pgfmoduleanimations.code.tex
+pgf/tex/generic/pgf/lua/pgf/manual/DocumentParser.lua
+pgf/tex/generic/pgf/lua/pgf/manual.lua
+pgf/tex/generic/pgf/math/pgfmath.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex
+pgf/tex/generic/pgf/math/pgfmathutil.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.random.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex
+pgf/tex/generic/pgf/math/pgfmathparser.code.tex
+pgf/tex/generic/pgf/math/pgfmathode.code.tex
+pgf/tex/generic/pgf/math/pgfint.code.tex
+pgf/tex/generic/pgf/math/pgfmathcalc.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.base.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex
+pgf/tex/generic/pgf/math/pgfmathfloat.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.round.code.tex
+pgf/tex/generic/pgf/math/pgfmathfunctions.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfadings.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymatrix.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryturtle.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfolding.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypositioning.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplothandlers.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.misc.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryscopes.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfit.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryquotes.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymindmap.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.gates.logic.US.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.footprints.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.arrows.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryspy.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshadows.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypatterns.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybabel.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryviews.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfpu.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymath.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarychains.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.multipart.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryer.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.callouts.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarylindenmayersystems.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfixedpointarithmetic.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryperspective.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryarrows.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.ee.IEC.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.logic.IEC.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.logic.US.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.logic.CDH.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.ee.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/circuits/tikzlibrarycircuits.logic.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryautomata.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypatterns.meta.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarysvg.path.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.markings.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybending.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.fractals.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.text.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytrees.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshadings.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypetri.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrarygraphs.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrarygraphs.standard.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarycalendar.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybackgrounds.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.symbols.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryintersections.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarysnakes.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzexternalshared.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/datavisualization/tikzlibrarydatavisualization.polar.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/datavisualization/tikzlibrarydatavisualization.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/datavisualization/tikzlibrarydatavisualization.formats.functions.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/datavisualization/tikzlibrarydatavisualization.sparklines.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/datavisualization/tikzlibrarydatavisualization.barcharts.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/datavisualization/tikzlibrarydatavisualization.3d.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryangles.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarycalc.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary3d.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.geometric.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryrdf.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarythrough.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.shapes.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.gates.logic.IEC.code.tex
+pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex
+pgf/tex/generic/pgf/utilities/pgfcalendar.code.tex
+pgf/tex/generic/pgf/utilities/pgfexternalwithdepth.tex
+pgf/tex/generic/pgf/utilities/pgffor.code.tex
+pgf/tex/generic/pgf/utilities/pgfutil-common.tex
+pgf/tex/generic/pgf/utilities/pgfrcs.code.tex
+pgf/tex/generic/pgf/utilities/pgfexternal.tex
+pgf/tex/generic/pgf/utilities/pgfutil-context.def
+pgf/tex/generic/pgf/utilities/pgfutil-plain.def
+pgf/tex/generic/pgf/utilities/pgfutil-latex.def
+pgf/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
+pgf/tex/generic/pgf/utilities/pgfkeys.code.tex
+pgf/tex/generic/pgf/utilities/pgfutil-common-lists.tex
+pgf/tex/generic/pgf/libraries/pgflibraryintersections.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryarrows.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryarrows.spaced.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryfadings.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.callouts.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.symbols.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.multipart.code.tex
+pgf/tex/generic/pgf/libraries/shapes/circuits/pgflibraryshapes.gates.logic.US.code.tex
+pgf/tex/generic/pgf/libraries/shapes/circuits/pgflibraryshapes.gates.ee.IEC.code.tex
+pgf/tex/generic/pgf/libraries/shapes/circuits/pgflibraryshapes.gates.ee.code.tex
+pgf/tex/generic/pgf/libraries/shapes/circuits/pgflibraryshapes.gates.logic.code.tex
+pgf/tex/generic/pgf/libraries/shapes/circuits/pgflibraryshapes.gates.logic.IEC.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.misc.code.tex
+pgf/tex/generic/pgf/libraries/shapes/pgflibraryshapes.arrows.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarypatterns.meta.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarycurvilinear.code.tex
+pgf/tex/generic/pgf/libraries/luamath/pgf/luamath/parser.lua
+pgf/tex/generic/pgf/libraries/luamath/pgf/luamath/functions.lua
+pgf/tex/generic/pgf/libraries/luamath/pgflibraryluamath.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarylindenmayersystems.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarytimelines.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarysnakes.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryprofiler.code.tex
+pgf/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex
+pgf/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.formats.functions.code.tex
+pgf/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.barcharts.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.footprints.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.shapes.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.fractals.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.markings.code.tex
+pgf/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.text.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryshadings.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryfixedpointarithmetic.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarypatterns.code.tex
+pgf/tex/generic/pgf/libraries/pgflibrarysvg.path.code.tex
+pgf/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+pgf/tex/generic/pgf/pgf.revision.tex
+pgf/tex/generic/pgf/systemlayer/pgfsys-common-postscript.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-dvi.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-dvips.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-dvipdfmx.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-dvisvgm.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-common-pdf-via-dvi.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+pgf/tex/generic/pgf/systemlayer/pgf.cfg
+pgf/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+pgf/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+pgf/tex/generic/pgf/systemlayer/pgfsys-xetex.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-dvipdfm.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-luatex.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-vtex.def
+pgf/tex/generic/pgf/systemlayer/pgfsys.code.tex
+pgf/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
+pgf/tex/generic/pgf/systemlayer/pgfsysanimations.code.tex
+pgf/tex/generic/pgf/systemlayer/pgfsys-common-svg.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-textures.def
+pgf/tex/generic/pgf/systemlayer/pgfsys-tex4ht.def
+pgf/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcore.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
+pgf/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
+pgf/tex/plain/pgf/math/pgfmath.tex
+pgf/tex/plain/pgf/frontendlayer/tikz.tex
+pgf/tex/plain/pgf/utilities/pgfcalendar.tex
+pgf/tex/plain/pgf/utilities/pgfkeys.tex
+pgf/tex/plain/pgf/utilities/pgfrcs.tex
+pgf/tex/plain/pgf/utilities/pgffor.tex
+pgf/tex/plain/pgf/systemlayer/pgfsys.tex
+pgf/tex/plain/pgf/basiclayer/pgfbasepatterns.tex
+pgf/tex/plain/pgf/basiclayer/pgfbasematrix.tex
+pgf/tex/plain/pgf/basiclayer/pgfbasesnakes.tex
+pgf/tex/plain/pgf/basiclayer/pgfbaseplot.tex
+pgf/tex/plain/pgf/basiclayer/pgfbaseimage.tex
+pgf/tex/plain/pgf/basiclayer/pgfbaselayers.tex
+pgf/tex/plain/pgf/basiclayer/pgfbaseshapes.tex
+pgf/tex/plain/pgf/basiclayer/pgf.tex
+pgf/tex/plain/pgf/basiclayer/pgfcore.tex
+pgf/tex/latex/pgf/doc/pgfmanual.prettyprinter.code.tex
+pgf/tex/latex/pgf/doc/pgfmanual.pdflinks.code.tex
+pgf/tex/latex/pgf/doc/pgfmanual.code.tex
+pgf/tex/latex/pgf/doc/pgfmanual.sty
+pgf/tex/latex/pgf/math/pgfmath.sty
+pgf/tex/latex/pgf/frontendlayer/tikz.sty
+pgf/tex/latex/pgf/frontendlayer/libraries/tikzlibraryexternal.code.tex
+pgf/tex/latex/pgf/frontendlayer/pgfpict2e.sty
+pgf/tex/latex/pgf/utilities/pgfrcs.sty
+pgf/tex/latex/pgf/utilities/pgfkeys.sty
+pgf/tex/latex/pgf/utilities/pgfpages.sty
+pgf/tex/latex/pgf/utilities/pgfcalendar.sty
+pgf/tex/latex/pgf/utilities/xxcolor.sty
+pgf/tex/latex/pgf/utilities/tikzexternal.sty
+pgf/tex/latex/pgf/utilities/pgffor.sty
+pgf/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+pgf/tex/latex/pgf/compatibility/pgflibrarysnakes.sty
+pgf/tex/latex/pgf/compatibility/pgflibraryshapes.sty
+pgf/tex/latex/pgf/compatibility/pgfautomata.sty
+pgf/tex/latex/pgf/compatibility/pgflibraryplotmarks.sty
+pgf/tex/latex/pgf/compatibility/pgfheaps.sty
+pgf/tex/latex/pgf/compatibility/pgfshade.sty
+pgf/tex/latex/pgf/compatibility/pgflibraryplothandlers.sty
+pgf/tex/latex/pgf/compatibility/pgflibrarytikzbackgrounds.sty
+pgf/tex/latex/pgf/compatibility/pgflibraryarrows.sty
+pgf/tex/latex/pgf/compatibility/pgflibrarytikztrees.sty
+pgf/tex/latex/pgf/compatibility/pgfnodes.sty
+pgf/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+pgf/tex/latex/pgf/compatibility/pgfarrows.sty
+pgf/tex/latex/pgf/compatibility/pgflibraryautomata.sty
+pgf/tex/latex/pgf/systemlayer/pgfsys.sty
+pgf/tex/latex/pgf/basiclayer/pgfbasematrix.sty
+pgf/tex/latex/pgf/basiclayer/pgfbasepatterns.sty
+pgf/tex/latex/pgf/basiclayer/pgfcore.sty
+pgf/tex/latex/pgf/basiclayer/pgf.sty
+pgf/tex/latex/pgf/basiclayer/pgfbaseplot.sty
+pgf/tex/latex/pgf/basiclayer/pgfbaseimage.sty
+pgf/tex/latex/pgf/basiclayer/pgfbasesnakes.sty
+pgf/tex/latex/pgf/basiclayer/pgfbaselayers.sty
+pgf/tex/latex/pgf/basiclayer/pgfbaseshapes.sty
+pgf/tex/context/third/pgf/math/t-pgfmat.tex
+pgf/tex/context/third/pgf/frontendlayer/t-tikz.tex
+pgf/tex/context/third/pgf/utilities/t-pgfrcs.tex
+pgf/tex/context/third/pgf/utilities/t-pgfkey.tex
+pgf/tex/context/third/pgf/utilities/t-pgfcal.tex
+pgf/tex/context/third/pgf/utilities/t-pgfmod.tex
+pgf/tex/context/third/pgf/utilities/t-pgffor.tex
+pgf/tex/context/third/pgf/systemlayer/t-pgfsys.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbla.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfcor.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbpt.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbsh.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbma.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgf.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbim.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbsn.tex
+pgf/tex/context/third/pgf/basiclayer/t-pgfbpl.tex
diff --git a/graphics/pgf/base/doc/README-3.0.0 b/graphics/pgf/base/doc/README-3.0.0
new file mode 100644
index 0000000000..d39a261bc6
--- /dev/null
+++ b/graphics/pgf/base/doc/README-3.0.0
@@ -0,0 +1,51 @@
+I am happy to announce version 3.0.0 of TikZ/pgf. After several years
+of development work in the background, a new version is finally ready.
+
+The big jump in the version number from 2.10 to 3.0.0 is due to the
+fact that a lot of new stuff has been added to TikZ (since the last
+version, over a thousand lines have been added to the change log...)
+and over a hundred bugs have been eliminated. However, care was taken
+to make sure that in normal circumstances all old code will still
+produce the exact same results as it used to.
+
+Since it is impossible to list all the changes and improvements since
+the last version in this announcement, let me just point out some
+hilights:
+
+- Arrow Tips: The code for specifying and using arrow tips has been
+ completely rewritten. You can now configure the appearance of arrow
+ tip "to death" and do so on the fly. Arbitrary arrow tips will now
+ even bend along curves since TikZ can now do curvilinear
+ transformations on a very low level.
+
+- Syntax Improvements: A lot of small things have been added and
+ improved in the syntax. For instance, nodes can be in front of
+ paths, but now also behind them. There is the new notion of a "small
+ picture" called a "pic", which is something of a mixture of a node
+ and a picture, making it easy for normal users to create
+ configurable, reusable graphics.
+
+- A Syntax for Graphs: Creating a larger graph used to require a large
+ number of node and edge commands and, possibly, some foreach
+ loops. Now there is a new simple syntax for this, borrowed from the
+ GraphViz program, that makes it very easy to specify graphs and
+ especially trees in a convenient manner.
+
+- Graph Drawing Algorithms: TikZ now comes with a large and powerful
+ system for computing the positions of nodes of graphs automatically
+ (you need LuaTeX for this, though). A number of common algorithms
+ have already been implemented, making it very easy to draw graphs
+ now. Also, it is rather simple to implement new graph drawing
+ algorithms.
+
+- Data Visualization: There is now an alternative to pgfplots as part
+ of the standard TikZ installation for creating plots. While pgfplots
+ is still the more mature system, the new data visualization system
+ comes with some interesting new ideas.
+
+- Driver Support: Support for all mayor backend drivers has been
+ improved. A new, cool thing is the support for dvisvgm, which
+ allows you to create powerful SVG graphics directly from TeX,
+ including the text. This support also open the door to interactive
+ and animated graphics in future versions since SVG makes it very
+ easy to animate arbitrary parts of a graphic.
diff --git a/graphics/pgf/base/doc/extract.lua b/graphics/pgf/base/doc/extract.lua
new file mode 100644
index 0000000000..89141b6da6
--- /dev/null
+++ b/graphics/pgf/base/doc/extract.lua
@@ -0,0 +1,191 @@
+-- TODO: this has to go
+local preamble = [[
+\usetikzlibrary{3d,arrows,arrows.spaced,arrows.meta,bending,babel,calc,
+ fit,patterns,plotmarks,shapes.geometric,shapes.misc,shapes.symbols,
+ shapes.arrows,shapes.callouts,shapes.multipart,shapes.gates.logic.US,
+ shapes.gates.logic.IEC,circuits.logic.US,circuits.logic.IEC,
+ circuits.logic.CDH,circuits.ee.IEC,datavisualization,
+ datavisualization.polar,datavisualization.formats.functions,er,automata,
+ backgrounds,chains,topaths,trees,petri,mindmap,matrix,calendar,folding,
+ fadings,shadings,spy,through,turtle,positioning,scopes,
+ decorations.fractals,decorations.shapes,decorations.text,
+ decorations.pathmorphing,decorations.pathreplacing,decorations.footprints,
+ decorations.markings,shadows,lindenmayersystems,intersections,
+ fixedpointarithmetic,fpu,svg.path,external,graphs,graphs.standard,quotes,
+ math,angles,views,animations,rdf,perspective}
+\usetikzlibrary{graphdrawing}
+\usegdlibrary{trees,circular,layered,examples,force,phylogenetics,routing}
+]]
+
+local lfs = require("lfs")
+local lpeg = require("lpeg")
+local C, Cf, Cg, Ct, P, S, V = lpeg.C, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.S, lpeg.V
+
+-- strip leading and trailing whitespace
+local function strip(str)
+ return str:match"^%s*(.-)%s*$"
+end
+-- strip braces
+local function strip_braces(str)
+ return str:match"^{?(.-)}?$"
+end
+
+-- optional whitespace
+local ws = S" \t\n\r"^0
+
+-- match string literal
+local function lit(str)
+ return ws * P(str) * ws
+end
+
+-- setter for options table
+local invalid = string.char(0x8)
+local function set(t,k,v)
+ -- strip whitespace from keys
+ k = strip(k)
+ -- if the value is empty, set it to invalid character
+ v = v and strip_braces(v) or invalid
+ return rawset(t,k,v)
+end
+
+-- Grammar to extract code examples
+local extractor = lpeg.P{"document",
+ name =
+ C((1 - S",]=")^1),
+
+ pair =
+ Cg(V"name" * (lit"=" * (V"braces" + V"name"))^0) * lit","^-1,
+
+ list =
+ Cf(Ct"" * V"pair"^0, set),
+
+ balanced =
+ "{" * ((1 - S"{}") + V"balanced")^0 * "}",
+
+ braces =
+ C(V"balanced"),
+
+ optarg =
+ lit"[" * V"list" * lit"]",
+
+ begincodeexample =
+ P"\\begin{codeexample}" * V"optarg",
+
+ endcodeexample =
+ P"\\end{codeexample}",
+
+ content =
+ C((1 - V"endcodeexample")^0),
+
+ codeexample =
+ Ct(V"begincodeexample" * V"content" * V"endcodeexample"),
+
+ anything =
+ (1 - V"codeexample")^0,
+
+ document =
+ V"anything" * Ct(V"codeexample" * (V"anything" * V"codeexample")^0) * V"anything"
+}
+
+-- get the basename and extension of a file
+local function basename(file)
+ local basename, ext = string.match(file, "^(.+)%.([^.]+)$")
+ return basename or "", ext or file
+end
+
+local pathsep = package.config:sub(1,1)
+
+-- Walk the file tree
+local function walk(sourcedir, targetdir)
+ -- Make sure the arguments are directories
+ assert(lfs.attributes(sourcedir, "mode") == "directory", sourcedir .. " is not a directory")
+ assert(lfs.attributes(targetdir, "mode") == "directory", targetdir .. " is not a directory")
+
+ -- Append the path separator if necessary
+ if sourcedir:sub(-1, -1) ~= pathsep then
+ sourcedir = sourcedir .. pathsep
+ end
+ if targetdir:sub(-1, -1) ~= pathsep then
+ targetdir = targetdir .. pathsep
+ end
+
+ -- Process all items in the directory
+ for file in lfs.dir(sourcedir) do
+ if file == "." or file == ".." then
+ -- Ignore these two special ones
+ elseif lfs.attributes(sourcedir .. file, "mode") == "directory" then
+ -- Recurse into subdirectories
+ lfs.mkdir(targetdir .. file)
+ walk(sourcedir .. file .. pathsep, targetdir .. file .. pathsep)
+ elseif lfs.attributes(sourcedir .. file, "mode") == "file" then
+ print("Processing " .. sourcedir .. file)
+
+ -- Read file into memory
+ local f = io.open(sourcedir .. file)
+ local text = f:read("*all")
+ f:close()
+ local name, ext = basename(file)
+
+ -- preprocess, strip all commented lines
+ text = text:gsub("\n%%[^\n]*","")
+
+ -- extract all code examples
+ local matches = extractor:match(text) or {}
+
+ -- write code examples to separate files
+ local setup_code = ""
+ for n, e in ipairs(matches) do
+ local options = e[1]
+ local content = e[2]
+
+ if content:match("remember picture") then
+ goto continue
+ end
+
+ -- If the snippet is marked as setup code, we have to put it before
+ -- every other snippet in the same file
+ if options["setup code"] then
+ setup_code = setup_code .. strip(content) .. "\n"
+ goto continue
+ end
+
+ -- Skip those that say "code only"
+ if not options["code only"] then
+ local newname = name .. "-" .. n .. ".tex"
+ local examplefile = io.open(targetdir .. newname, "w")
+
+ examplefile:write"\\documentclass{article}\n"
+ examplefile:write"\\usepackage{fp,pgf,tikz,xcolor}\n"
+ examplefile:write(preamble) -- TODO: this has to go
+ examplefile:write(options["preamble"] and options["preamble"] .. "\n" or "")
+ examplefile:write"\\begin{document}\n"
+ examplefile:write"\\makeatletter\n" -- TODO: this has to go
+ examplefile:write(setup_code)
+ local pre = options["pre"] or ""
+ pre = pre:gsub("##", "#")
+ examplefile:write(pre .. "\n")
+ if options["render instead"] then
+ examplefile:write(options["render instead"] .. "\n")
+ else
+ examplefile:write(strip(content) .. "\n")
+ end
+ examplefile:write(options["post"] and options["post"] .. "\n" or "")
+ examplefile:write"\\end{document}\n"
+
+ examplefile:close()
+ end
+
+ ::continue::
+ end
+ end
+ end
+end
+
+-- Main loop
+if #arg < 2 then
+ print("Usage: " .. arg[-1] .. " " .. arg[0] .. " <source-dirs...> <target-dir>")
+ os.exit(1)
+end
+for n = 1, #arg - 1 do
+ walk(arg[n], arg[#arg])
+end
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.bb b/graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.bb
new file mode 100644
index 0000000000..381c194932
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.bb
@@ -0,0 +1,5 @@
+%%Title: ./brave-gnu-world-logo-mask.jpg
+%%Creator: ebb Version 0.5.2
+%%BoundingBox: 0 0 246 279
+%%CreationDate: Thu Dec 20 23:49:52 2007
+
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.jpg b/graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.jpg
new file mode 100644
index 0000000000..404aee1f8b
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo-mask.jpg
Binary files differ
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.bb b/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.bb
new file mode 100644
index 0000000000..3cc4f81a2a
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.bb
@@ -0,0 +1,5 @@
+%%Title: ./brave-gnu-world-logo.25.jpg
+%%Creator: ebb Version 0.5.2
+%%BoundingBox: 0 0 246 279
+%%CreationDate: Thu Dec 20 23:49:52 2007
+
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.eps b/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.eps
new file mode 100644
index 0000000000..9c02410d1d
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.eps
@@ -0,0 +1,257 @@
+%!PS-Adobe-3.0 EPSF-3.0 %%Title: brave-gnu-world-logo.25.eps %%CreationDate: 09.10.2006 22:09 Uhr %%BoundingBox: 0 0 342 387 %%HiResBoundingBox: 0 0 342 387 %%SuppressDotGainCompensation %%EndComments %%BeginProlog %%EndProlog %%BeginSetup %%EndSetup %ImageData: 342 387 8 3 0 1 3 "beginimage" %BeginPhotoshop: 13952 % 3842494D0425000000000010000000000000000000000000000000003842494D % 03EA000000001DA63C3F786D6C2076657273696F6E3D22312E302220656E636F % 64696E673D225554462D38223F3E0A3C21444F435459504520706C6973742050 % 55424C494320222D2F2F4170706C6520436F6D70757465722F2F44544420504C % 49535420312E302F2F454E222022687474703A2F2F7777772E6170706C652E63 % 6F6D2F445444732F50726F70657274794C6973742D312E302E647464223E0A3C % 706C6973742076657273696F6E3D22312E30223E0A3C646963743E0A093C6B65 % 793E636F6D2E6170706C652E7072696E742E50616765466F726D61742E504D48 % 6F72697A6F6E74616C5265733C2F6B65793E0A093C646963743E0A09093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E63726561746F72 % 3C2F6B65793E0A09093C737472696E673E636F6D2E6170706C652E7072696E74 % 696E676D616E616765723C2F737472696E673E0A09093C6B65793E636F6D2E61 % 70706C652E7072696E742E7469636B65742E6974656D41727261793C2F6B6579 % 3E0A09093C61727261793E0A0909093C646963743E0A090909093C6B65793E63 % 6F6D2E6170706C652E7072696E742E50616765466F726D61742E504D486F7269 % 7A6F6E74616C5265733C2F6B65793E0A090909093C7265616C3E37323C2F7265 % 616C3E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E636C69656E743C2F6B65793E0A090909093C737472696E673E636F6D % 2E6170706C652E7072696E74696E676D616E616765723C2F737472696E673E0A % 090909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 6D6F64446174653C2F6B65793E0A090909093C646174653E323030362D31302D % 30395432303A30333A33365A3C2F646174653E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B % 65793E0A090909093C696E74656765723E303C2F696E74656765723E0A090909 % 3C2F646963743E0A09093C2F61727261793E0A093C2F646963743E0A093C6B65 % 793E636F6D2E6170706C652E7072696E742E50616765466F726D61742E504D4F % 7269656E746174696F6E3C2F6B65793E0A093C646963743E0A09093C6B65793E % 636F6D2E6170706C652E7072696E742E7469636B65742E63726561746F723C2F % 6B65793E0A09093C737472696E673E636F6D2E6170706C652E7072696E74696E % 676D616E616765723C2F737472696E673E0A09093C6B65793E636F6D2E617070 % 6C652E7072696E742E7469636B65742E6974656D41727261793C2F6B65793E0A % 09093C61727261793E0A0909093C646963743E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E50616765466F726D61742E504D4F7269656E74 % 6174696F6E3C2F6B65793E0A090909093C696E74656765723E313C2F696E7465 % 6765723E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E7469 % 636B65742E636C69656E743C2F6B65793E0A090909093C737472696E673E636F % 6D2E6170706C652E7072696E74696E676D616E616765723C2F737472696E673E % 0A090909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E6D6F64446174653C2F6B65793E0A090909093C646174653E323030362D3130 % 2D30395432303A30333A33365A3C2F646174653E0A090909093C6B65793E636F % 6D2E6170706C652E7072696E742E7469636B65742E7374617465466C61673C2F % 6B65793E0A090909093C696E74656765723E303C2F696E74656765723E0A0909 % 093C2F646963743E0A09093C2F61727261793E0A093C2F646963743E0A093C6B % 65793E636F6D2E6170706C652E7072696E742E50616765466F726D61742E504D % 5363616C696E673C2F6B65793E0A093C646963743E0A09093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E63726561746F723C2F6B6579 % 3E0A09093C737472696E673E636F6D2E6170706C652E7072696E74696E676D61 % 6E616765723C2F737472696E673E0A09093C6B65793E636F6D2E6170706C652E % 7072696E742E7469636B65742E6974656D41727261793C2F6B65793E0A09093C % 61727261793E0A0909093C646963743E0A090909093C6B65793E636F6D2E6170 % 706C652E7072696E742E50616765466F726D61742E504D5363616C696E673C2F % 6B65793E0A090909093C7265616C3E313C2F7265616C3E0A090909093C6B6579 % 3E636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F % 6B65793E0A090909093C737472696E673E636F6D2E6170706C652E7072696E74 % 696E676D616E616765723C2F737472696E673E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E6D6F64446174653C2F6B6579 % 3E0A090909093C646174653E323030362D31302D30395432303A30333A33365A % 3C2F646174653E0A090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E7469636B65742E7374617465466C61673C2F6B65793E0A090909093C696E74 % 656765723E303C2F696E74656765723E0A0909093C2F646963743E0A09093C2F % 61727261793E0A093C2F646963743E0A093C6B65793E636F6D2E6170706C652E % 7072696E742E50616765466F726D61742E504D566572746963616C5265733C2F % 6B65793E0A093C646963743E0A09093C6B65793E636F6D2E6170706C652E7072 % 696E742E7469636B65742E63726561746F723C2F6B65793E0A09093C73747269 % 6E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C2F7374 % 72696E673E0A09093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E6974656D41727261793C2F6B65793E0A09093C61727261793E0A0909 % 093C646963743E0A090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E50616765466F726D61742E504D566572746963616C5265733C2F6B65793E0A % 090909093C7265616C3E37323C2F7265616C3E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F6B65793E % 0A090909093C737472696E673E636F6D2E6170706C652E7072696E74696E676D % 616E616765723C2F737472696E673E0A090909093C6B65793E636F6D2E617070 % 6C652E7072696E742E7469636B65742E6D6F64446174653C2F6B65793E0A0909 % 09093C646174653E323030362D31302D30395432303A30333A33365A3C2F6461 % 74653E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E7374617465466C61673C2F6B65793E0A090909093C696E7465676572 % 3E303C2F696E74656765723E0A0909093C2F646963743E0A09093C2F61727261 % 793E0A093C2F646963743E0A093C6B65793E636F6D2E6170706C652E7072696E % 742E50616765466F726D61742E504D566572746963616C5363616C696E673C2F % 6B65793E0A093C646963743E0A09093C6B65793E636F6D2E6170706C652E7072 % 696E742E7469636B65742E63726561746F723C2F6B65793E0A09093C73747269 % 6E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C2F7374 % 72696E673E0A09093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E6974656D41727261793C2F6B65793E0A09093C61727261793E0A0909 % 093C646963743E0A090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E50616765466F726D61742E504D566572746963616C5363616C696E673C2F6B % 65793E0A090909093C7265616C3E313C2F7265616C3E0A090909093C6B65793E % 636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F6B % 65793E0A090909093C737472696E673E636F6D2E6170706C652E7072696E7469 % 6E676D616E616765723C2F737472696E673E0A090909093C6B65793E636F6D2E % 6170706C652E7072696E742E7469636B65742E6D6F64446174653C2F6B65793E % 0A090909093C646174653E323030362D31302D30395432303A30333A33365A3C % 2F646174653E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E % 7469636B65742E7374617465466C61673C2F6B65793E0A090909093C696E7465 % 6765723E303C2F696E74656765723E0A0909093C2F646963743E0A09093C2F61 % 727261793E0A093C2F646963743E0A093C6B65793E636F6D2E6170706C652E70 % 72696E742E7375625469636B65742E70617065725F696E666F5F7469636B6574 % 3C2F6B65793E0A093C646963743E0A09093C6B65793E636F6D2E6170706C652E % 7072696E742E50616765466F726D61742E504D41646A75737465645061676552 % 6563743C2F6B65793E0A09093C646963743E0A0909093C6B65793E636F6D2E61 % 70706C652E7072696E742E7469636B65742E63726561746F723C2F6B65793E0A % 0909093C737472696E673E636F6D2E6170706C652E7072696E74696E676D616E % 616765723C2F737472696E673E0A0909093C6B65793E636F6D2E6170706C652E % 7072696E742E7469636B65742E6974656D41727261793C2F6B65793E0A090909 % 3C61727261793E0A090909093C646963743E0A09090909093C6B65793E636F6D % 2E6170706C652E7072696E742E50616765466F726D61742E504D41646A757374 % 656450616765526563743C2F6B65793E0A09090909093C61727261793E0A0909 % 090909093C7265616C3E302E303C2F7265616C3E0A0909090909093C7265616C % 3E302E303C2F7265616C3E0A0909090909093C7265616C3E3738333C2F726561 % 6C3E0A0909090909093C7265616C3E3535393C2F7265616C3E0A09090909093C % 2F61727261793E0A09090909093C6B65793E636F6D2E6170706C652E7072696E % 742E7469636B65742E636C69656E743C2F6B65793E0A09090909093C73747269 % 6E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C2F7374 % 72696E673E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E % 7469636B65742E6D6F64446174653C2F6B65793E0A09090909093C646174653E % 323030362D31302D30395432303A30333A33365A3C2F646174653E0A09090909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E737461 % 7465466C61673C2F6B65793E0A09090909093C696E74656765723E303C2F696E % 74656765723E0A090909093C2F646963743E0A0909093C2F61727261793E0A09 % 093C2F646963743E0A09093C6B65793E636F6D2E6170706C652E7072696E742E % 50616765466F726D61742E504D41646A75737465645061706572526563743C2F % 6B65793E0A09093C646963743E0A0909093C6B65793E636F6D2E6170706C652E % 7072696E742E7469636B65742E63726561746F723C2F6B65793E0A0909093C73 % 7472696E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C % 2F737472696E673E0A0909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E7469636B65742E6974656D41727261793C2F6B65793E0A0909093C61727261 % 793E0A090909093C646963743E0A09090909093C6B65793E636F6D2E6170706C % 652E7072696E742E50616765466F726D61742E504D41646A7573746564506170 % 6572526563743C2F6B65793E0A09090909093C61727261793E0A090909090909 % 3C7265616C3E2D31383C2F7265616C3E0A0909090909093C7265616C3E2D3138 % 3C2F7265616C3E0A0909090909093C7265616C3E3832343C2F7265616C3E0A09 % 09090909093C7265616C3E3537373C2F7265616C3E0A09090909093C2F617272 % 61793E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E7469 % 636B65742E636C69656E743C2F6B65793E0A09090909093C737472696E673E63 % 6F6D2E6170706C652E7072696E74696E676D616E616765723C2F737472696E67 % 3E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B % 65742E6D6F64446174653C2F6B65793E0A09090909093C646174653E32303036 % 2D31302D30395432303A30333A33365A3C2F646174653E0A09090909093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E7374617465466C % 61673C2F6B65793E0A09090909093C696E74656765723E303C2F696E74656765 % 723E0A090909093C2F646963743E0A0909093C2F61727261793E0A09093C2F64 % 6963743E0A09093C6B65793E636F6D2E6170706C652E7072696E742E50617065 % 72496E666F2E504D50617065724E616D653C2F6B65793E0A09093C646963743E % 0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 63726561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E617070 % 6C652E7072696E742E706D2E506F73745363726970743C2F737472696E673E0A % 0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E69 % 74656D41727261793C2F6B65793E0A0909093C61727261793E0A090909093C64 % 6963743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E50 % 61706572496E666F2E504D50617065724E616D653C2F6B65793E0A0909090909 % 3C737472696E673E69736F2D61343C2F737472696E673E0A09090909093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C % 2F6B65793E0A09090909093C737472696E673E636F6D2E6170706C652E707269 % 6E742E706D2E506F73745363726970743C2F737472696E673E0A09090909093C % 6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F644461 % 74653C2F6B65793E0A09090909093C646174653E323030332D30372D30315431 % 373A34393A33365A3C2F646174653E0A09090909093C6B65793E636F6D2E6170 % 706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B65793E % 0A09090909093C696E74656765723E313C2F696E74656765723E0A090909093C % 2F646963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09093C % 6B65793E636F6D2E6170706C652E7072696E742E5061706572496E666F2E504D % 556E61646A757374656450616765526563743C2F6B65793E0A09093C64696374 % 3E0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E63726561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E6170 % 706C652E7072696E742E706D2E506F73745363726970743C2F737472696E673E % 0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 6974656D41727261793C2F6B65793E0A0909093C61727261793E0A090909093C % 646963743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E % 5061706572496E666F2E504D556E61646A757374656450616765526563743C2F % 6B65793E0A09090909093C61727261793E0A0909090909093C7265616C3E302E % 303C2F7265616C3E0A0909090909093C7265616C3E302E303C2F7265616C3E0A % 0909090909093C7265616C3E3738333C2F7265616C3E0A0909090909093C7265 % 616C3E3535393C2F7265616C3E0A09090909093C2F61727261793E0A09090909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E636C69 % 656E743C2F6B65793E0A09090909093C737472696E673E636F6D2E6170706C65 % 2E7072696E74696E676D616E616765723C2F737472696E673E0A09090909093C % 6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F644461 % 74653C2F6B65793E0A09090909093C646174653E323030362D31302D30395432 % 303A30333A33365A3C2F646174653E0A09090909093C6B65793E636F6D2E6170 % 706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B65793E % 0A09090909093C696E74656765723E303C2F696E74656765723E0A090909093C % 2F646963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09093C % 6B65793E636F6D2E6170706C652E7072696E742E5061706572496E666F2E504D % 556E61646A75737465645061706572526563743C2F6B65793E0A09093C646963 % 743E0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65 % 742E63726561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E61 % 70706C652E7072696E742E706D2E506F73745363726970743C2F737472696E67 % 3E0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E6974656D41727261793C2F6B65793E0A0909093C61727261793E0A09090909 % 3C646963743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E5061706572496E666F2E504D556E61646A7573746564506170657252656374 % 3C2F6B65793E0A09090909093C61727261793E0A0909090909093C7265616C3E % 2D31383C2F7265616C3E0A0909090909093C7265616C3E2D31383C2F7265616C % 3E0A0909090909093C7265616C3E3832343C2F7265616C3E0A0909090909093C % 7265616C3E3537373C2F7265616C3E0A09090909093C2F61727261793E0A0909 % 0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E63 % 6C69656E743C2F6B65793E0A09090909093C737472696E673E636F6D2E617070 % 6C652E7072696E74696E676D616E616765723C2F737472696E673E0A09090909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F64 % 446174653C2F6B65793E0A09090909093C646174653E323030362D31302D3039 % 5432303A30333A33365A3C2F646174653E0A09090909093C6B65793E636F6D2E % 6170706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B65 % 793E0A09090909093C696E74656765723E303C2F696E74656765723E0A090909 % 093C2F646963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09 % 093C6B65793E636F6D2E6170706C652E7072696E742E5061706572496E666F2E % 7070642E504D50617065724E616D653C2F6B65793E0A09093C646963743E0A09 % 09093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6372 % 6561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E6170706C65 % 2E7072696E742E706D2E506F73745363726970743C2F737472696E673E0A0909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E697465 % 6D41727261793C2F6B65793E0A0909093C61727261793E0A090909093C646963 % 743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E506170 % 6572496E666F2E7070642E504D50617065724E616D653C2F6B65793E0A090909 % 09093C737472696E673E41343C2F737472696E673E0A09090909093C6B65793E % 636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F6B % 65793E0A09090909093C737472696E673E636F6D2E6170706C652E7072696E74 % 2E706D2E506F73745363726970743C2F737472696E673E0A09090909093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F6444617465 % 3C2F6B65793E0A09090909093C646174653E323030332D30372D30315431373A % 34393A33365A3C2F646174653E0A09090909093C6B65793E636F6D2E6170706C % 652E7072696E742E7469636B65742E7374617465466C61673C2F6B65793E0A09 % 090909093C696E74656765723E313C2F696E74656765723E0A090909093C2F64 % 6963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E41504956657273 % 696F6E3C2F6B65793E0A09093C737472696E673E30302E32303C2F737472696E % 673E0A09093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E707269766174654C6F636B3C2F6B65793E0A09093C66616C73652F3E0A0909 % 3C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E74797065 % 3C2F6B65793E0A09093C737472696E673E636F6D2E6170706C652E7072696E74 % 2E5061706572496E666F5469636B65743C2F737472696E673E0A093C2F646963 % 743E0A093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 41504956657273696F6E3C2F6B65793E0A093C737472696E673E30302E32303C % 2F737472696E673E0A093C6B65793E636F6D2E6170706C652E7072696E742E74 % 69636B65742E707269766174654C6F636B3C2F6B65793E0A093C66616C73652F % 3E0A093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E74 % 7970653C2F6B65793E0A093C737472696E673E636F6D2E6170706C652E707269 % 6E742E50616765466F726D61745469636B65743C2F737472696E673E0A3C2F64 % 6963743E0A3C2F706C6973743E0A3842494D03E9000000000078000300000048 % 004800000000030F022FFFEEFFEE033802410367057B03E00002000000480048 % 0000000002D802280001000000640000000100030303000000017FFF00010001 % 0000000000000000000000006808001901900000000000200000000000000000 % 0000000000000000000000000000000000003842494D03ED0000000000100048 % 00000001000200480000000100023842494D042600000000000E000000000000 % 000000003F8000003842494D040D0000000000040000001E3842494D04190000 % 000000040000001E3842494D03F3000000000009000000000000000001003842 % 494D040A00000000000100003842494D271000000000000A0001000000000000 % 00023842494D03F5000000000048002F66660001006C66660006000000000001 % 002F6666000100A1999A0006000000000001003200000001005A000000060000 % 00000001003500000001002D000000060000000000013842494D03F800000000 % 00700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000 % FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFF % FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFF % FFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D04080000000000100000 % 00010000024000000240000000003842494D041E000000000004000000003842 % 494D041A00000000036300000006000000000000000000000183000001560000 % 001700620072006100760065002D0067006E0075002D0077006F0072006C0064 % 002D006C006F0067006F002E0032003500000001000000000000000000000000 % 0000000000000001000000000000000000000156000001830000000000000000 % 0000000000000000010000000000000000000000000000000000000010000000 % 010000000000006E756C6C0000000200000006626F756E64734F626A63000000 % 01000000000000526374310000000400000000546F70206C6F6E670000000000 % 0000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000018300 % 000000526768746C6F6E670000015600000006736C69636573566C4C73000000 % 014F626A6300000001000000000005736C6963650000001200000007736C6963 % 6549446C6F6E67000000000000000767726F757049446C6F6E67000000000000 % 00066F726967696E656E756D0000000C45536C6963654F726967696E0000000D % 6175746F47656E6572617465640000000054797065656E756D0000000A45536C % 6963655479706500000000496D672000000006626F756E64734F626A63000000 % 01000000000000526374310000000400000000546F70206C6F6E670000000000 % 0000004C6566746C6F6E67000000000000000042746F6D6C6F6E670000018300 % 000000526768746C6F6E67000001560000000375726C54455854000000010000 % 000000006E756C6C54455854000000010000000000004D736765544558540000 % 0001000000000006616C74546167544558540000000100000000000E63656C6C % 54657874497348544D4C626F6F6C010000000863656C6C546578745445585400 % 000001000000000009686F727A416C69676E656E756D0000000F45536C696365 % 486F727A416C69676E0000000764656661756C740000000976657274416C6967 % 6E656E756D0000000F45536C69636556657274416C69676E0000000764656661 % 756C740000000B6267436F6C6F7254797065656E756D0000001145536C696365 % 4247436F6C6F7254797065000000004E6F6E6500000009746F704F7574736574 % 6C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000 % 000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F % 75747365746C6F6E6700000000003842494D041100000000000101003842494D % 0414000000000004000000013842494D040C0000000011340000000100000071 % 00000080000001540000AA000000111800180001FFD8FFE000104A4649460001 % 0201004800480000FFED000C41646F62655F434D0002FFEE000E41646F626500 % 648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F15 % 18131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C % 0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E % 14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C % 0C0C0C0C0C0C0C0C0C0C0C0CFFC00011080080007103012200021101031101FF % DD00040008FFC4013F0000010501010101010100000000000000030001020405 % 060708090A0B0100010501010101010100000000000000010002030405060708 % 090A0B1000010401030204020507060805030C33010002110304211231054151 % 611322718132061491A1B14223241552C16233347282D14307259253F0E1F163 % 733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794 % A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797 % A7B7C7D7E7F71100020201020404030405060707060535010002110321311204 % 4151617122130532819114A1B14223C152D1F0332462E1728292435315637334 % F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F3 % 4694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767 % 778797A7B7C7FFDA000C03010002110311003F00F5549249252952EA5D6303A6 % B01C9B3F48E04D74B06EB1D1FBACFDCFCDF56CD94FEFD8A9F5AEB8EC4B1B8182 % CF5BA85A040896B377D17387B7D4B1DB7D94FF00D72EF4AA50E93F57C54F766F % 513F69CDB4EE739E43849FECB5AE733E87B7F435FD0A2AAAA494969FAC06FD6A % C0CA73791ED64F9E82C72B9566DF63B6FD8EE66B05CF35868F3FE777BBFB0C56 % 80F979240009294275911E09D2492535322DEA35585D5555E4526206E2C7B74F % 76ED2C6DBEEFDDF4FF00E2FF00C22A77F51EAFF46BC7C7A9C7F3ADB6C81F9DF4 % 7D0ABF35BFBEB5D2494E5E066E7DAE8BDF8CFD09D94EEDC60EDFCF73BF3BF796 % 931E1ED04692260F2151EA1D1E9CB3EAD4EFB3E50D45AD120FFC755F46DFFCF9 % FCB553A7F53BC669E9FD440A731809601F42D1AFE998FF00F09BA3D9FF00A53D % 8929DB49327494A49249253FFFD0F55599D77ABFECDA18DA5A2CCCC825B8EC3A % 8111BEE7810E732ADECF637F9DB5F553FA3F53D5669AE4F12D6F53EB36752B3D % F57A831F10088D8D163FD4DDB7E8B696DD97F43E9E4D74FF00A2494E8740E91E % 8B1F999536655F2E7BDC649DC439DBB46B7DDB7F37FF003C7A55ADBF34CC6ED6 % 86F8052494A49258791F59EB7DBF67E9349EA16FFA469DB5027DA3F4B0EF57FA % D5B7D1FF0086494EE24B370733A8D8FDB96CA5A4CC8ADD3B6086EDE5DB9FB9DF % C853EA3D6FA7F4EDADBDE4DCF12CA2B05D6113B6767E637F9566C494DF4967E2 % F59AB206EFB3DF5375F73DA3B6A67D373DCAF32C658DDCC70703DC24A64B3BAD % F4A6F52C4DAC8665D277E2DA646D7FEEB8B7FC15BFCDDBFF006E7F395D6B4524 % 94E3F42EA8FCEA032F9664D07D3B6B321DB99ED79B3E97FEAE5B0B987B8627D6 % 6CCF4CED65B48B1FB7B13E9B777F9C3D477F5D74CD208D381A7DDA24A5D24924 % 94FF00FFD1F547025A434C3A343E6B95FAAAE68C4A75DA7DF519D00B1E2835EF % 67B7E936A733DDF9F52EAD60E574BC9C0CBBB3701A6EC6CA9765E20FA41C4973 % EDA3F7F7B8EED9F4FD4FE6FE9FE8D29DB37541BBDCE01BC1713027E2A166661D % 4D2FB6FAEB6375739CF6803E24959B5E4D790C635AE9DA76D8DB25C5A63F384B % 1CFB2BDAA4DE89D2FD3F57228640F77BF489ECFF00A2D494E65D9197F59AF763 % 636EA3A55662C79106D3CFBDA47B5BFB98EFFF00D0BFFB8AB6B1FA562E352296 % B4069FCD048DC63DDB8B8EF7EEFCFF007FFE05FA34B1EE6399E874F6B1B4D6ED % 81EC1EC6E81EE867B3F7FF007D068E9F6FDAB7643DD786C1208105C3875BEEF7 % 7FC055FA5F47F9CFE752009DBF15A6755E2DD6D0DADB0D6C37521ADD00D1C36B % 581BB550B6BC1392F71654ECD11BC020DAD6E9B7D92EB7DCDFDDF52C7AD0B1AD % 9DE40DEE01AEE4CB44BB6FE6AAB8A5D91634E562D7518B1ECF7377B06E6ED63D % A3DDEA58D77AB76DFD1D7FCDFBD2063746FE8A24F4AFF0BD281D958ED690F2EA % F7E9B4CC03EDFD1EDFF02E74B37D5F4FDFFA556A9C864876E0D6C7B23BE9FB8D % FA5FF93FF068EDA61CE6C35CC70F708E67F7964BB1FD5C9B7EC47EC81AFF004D % A1DB832C786C96FA2F1ED6FF0053FEDBB13B849BAD695C7FBDE9E8EC5993454D % 9BAC6543C5CE0047C5D0B3737EB3F4BC7696D160CCC8FCCA68F749FE5DAD9AEB % FF00ABFDCAEC556DC9739FF63EA558AED322B9FE69F103D967B7F44DF67A9EE6 % 7FD6958C7C66B59EC6358ED443181A07F298FF00D35D637DDFA3F4DBFF006D26 % AE73B031B2ADCD7E56701F6ACA2CB1F5813B6B043AA6ECFCDF5ACA29AAADDF4F % 1E9CABAEFF0008BA7ADBB5B1E249FBC9720518B5B786901C4971792E738E8DDC % F73FDDEEDBB7FE2995D7FCD2B49294924924A7FFD2F55492492520BB131AD70B % 2CAC1B1BC5834788F0B1BB5EAB64E48345C08FB5381DAFC6ADA1E040DCEA4EEF % DE6BBDCFB91731D9EF70A30C32ADD05F91619869277368A5BEEB2EF6FF0085F4 % AAFD27F86F7D4876E217EFB3A85E3ECC047A0D3B6B826375EF9DF91EDF66C7FE % 87FE0AD40D9D00DFAA083DE97C66E558FAEDC9BAB68FA5563E39961046DF7DAF % DAFC86B5AEF66DAA867F215AB9C5AD0448931204F6EEA149AC173995892434B9 % A002E81B771FCD4AE739DB1F503635AE2486380D60B750EDAD7FF9E8C850D100 % 820EBDDCCBD96BAC739D7FA75D624B18DFFA565B61FF00A0C594EEB1496EFA1B % 6B9F4BA77BB6B5AE274DB66DDCEDBFC9DAB6ADE9F8F98D7D598CB5C09DE2A712 % CD3F976D2FD963777F2D3E1BF16B2DAF02B365434229D82961F377B773FF007F % 6FA8A200750C03181F30D7C3F97A9CEFB45D9353AABDE0525A1F153C8D9DB67E % 8EB2E66DFA75D9BFF46B55D9CEAF2EBA2DA5EFA5EC97646D90D33B5A5E59F98F % 9FFAC7FC56FF0042A757EA34E2B4D2D6B6DC8B012E635DED6B4FB77E44FD062A % 755DD66DC57D8D76350C8F4BD67B9CD718FCEADCF6BAB73754E8896E02E88978 % 70F8BB39189899B43314B89A5B04110E0E05AEDA196582CF7B7F9CDECFD325D2 % 31DD46132AB2CF55ED2438F8104FE8F977F37F450BA6613DB41BAFBBD7C8BD8C % 6DEE6BB4696496D34D94FA7FA3A9F659EFDBEA588F45D915BC372FD30EB6368A % C1FA41BFA5DEE27DDF454B44824EFD596EA8550D9B8924926AE524924929FFD3 % F554C74D53A8BDA1ED2D3C1E47924A44CB1FF69B1AF2D02016346A4B40D6C7FB % 7DBB9FEC6FFC5A0BB3706CCC6E31BEB75C06E65421CE691FE11DF4B67F21567E % 0DD915BDF97A5971F731A4B9AD00FE8AA6CFEEB7F9DFF4967A8957F64E9EE656 % DDAD2E92F7C06807F96EFDE530803B1B95550FE2D696522C513ADBA2DC7A8012 % DDC7C5DA93F1944F6B60683B008745ECB9BB9A6478F8A8B1EF0FF4DD5B84925D % 669B493FD53BFF00CE6A866640D166870571446FD833B68A6D20D8D0E2D9027C % 0FD26FF55CA9D580FC2A5CDC67B4971DCEB2FDC63C5DB1AE6D7F47F36BF415C6 % 58C2D1E9CB9BC0238FF3BF393DAF656C2EB012D04030D2EE4EDFA2D0EFFCC134 % 709D579DABBBCE3F0F2B3DD7065FEB536C7AD94DFD1B1DE9977A7563D156F73E % A6EFFD25B65D67A9FF0017B158FB0E261DB4D977A7EA39BB2AF6973811FE8F76 % E72D2A3AB74FBC5A59688A1CE6DA4F0DDBF9CE7FF36D67F2B77FE09BD1DD451B % 8DA58DDF1F4C8D614D0C911A01A3164C529697FF0072D2C3ADF4836DAF739D61 % 009768E33A37467B559C8B1B5D4D6BD9BD847B817098FA3A6FFA7F4BF7D1DA1A % 00DBC762B23AC6506D4D0F6C5AED6AD636C3873FBDBFD9FA2FF0B67E8D899932 % 13B685118184753C44BAB8F732FA596B0CB5C3BE864687FE9222CCFABC727F67 % 4640877A961699E5AE77A9C7E66C73FD2DBFF06B4D0F3661B6AA49249253FFD4 % F5550B63D27CC81B4EA2678EDB21FF00E6A9A6735AE696B84B5C2083C1052521 % 756DB7D37133B007026473DF669EE5917B76BDF6BEB796D7616D4C716D758FE5 % 0FCEB372D2B32DEC6D0D6D42CB6DD1E1AE68637696B6EF7D858E77A5BBF32BFC % C51FD9D5BB25F9169F56C71258481B5A3B358DFDEDBF9EA6C79044907A7460CB % 8CCA363525AACCBCD758DAEB6358D03DDB89E4FEEED5A34D8F6B0BAF78D3BC6D % 1F892A4DA76C00040F1D4A1370DDB8BAD7FAAE719F701007EEB1A94A5097411F % CD8F1C32C28EFE1D190BECB2C0DA9AD2CFCE7870D3FAAD83B9584014EC3B8B8B % 8766E908A663DC62398D1472AD299E065AF10D5AD7D599BB6D26B7D446A2E930 % 7F77D9FCE31DFCBFA1FF000BBFF461AB1B230B1B2AE786E55AE3BEBC7AC7A758 % DAD8AE9AD8E758DDCE7FB9F77E7FFDB6AF36D63EB0FACEF69E0B759F8154F32E % C8C70F758F636A26597381DACFE45CDDDF4BFD1DDFF5BFD17E8FD5611C3A81AA % FB02CD5F7F1497DD15C5A62752C64C9FE40DB0EFF5FA0B16D75965B664871391 % EB86D0D0FDD5D15967A5F687532DFD2BB75DE9FF00C27E8FFD221E5E5B9DF67B % CD576CB5F1481A3AD77954E76F6334FF00468DD3F14D4CB2ECD0319D63CD950B % 1BC47E84DB65BA535DB6BEFDB8D5DBF99FE0FF009DF4C63F9AE4C71E33648E9A % 7F55D2E867761B9ED9F49D63853BB9D8C8A013FD6755B968A0E1D031F16AA75F % 6B759E64FB9DFF0049193E5B9F3648EC1492492097FFD5F5549249252175465C % 19A171DED9D4077E77B7F95FF56B2197E4B6E353AD3894D0F1E8D75ED797B662 % E65CCDB635B56EFE6FD3F4ED62DB7B43DA5A6402224120EBE0E6C39AB2BA80B3 % 1EA631F63D9481FA7CA76E76CAC37F4AF73EBDBFA6DAC6ECBACFD1D7FCF7E93F % 997B67777F4639020831BBFC1B14F53ADD98EC176E7DD24B0B58E03601BF758E % 70D9FF0007BD8EFF0047FBEACE564371A875EFFA0C8DE7B35A486BAC77EED75B % 7F4967F2163538169F4FA8623ADB5EC8153B29C5E367D0F5D94511BDDE9BECF4 % BDCCFE73E82D5C7C877A7B0EEB6C61DAE716ECDC47EEB53C4254B84C0AE22906 % 454FAEBBEBB05955801ACD7EF0F0ED5AE6B99BB7336AA7D40D97B4B585D536A9 % 2E7176D0EFE4EC66EB1EADDEF2C754E86EA483B84BBE8B9D0CD5BFBAA961F56F % B56406331DCEC7B1FB29BC35DB5C035EFB2F2EDA6AF437B19456EF57D4B2CFF0 % 7E9FA6FB146601DB50A944CAC0F36A60D79877B8D8E73C18697CB8347FC1876D % 5A7EADE1BE98607088758490493FBAC60F77F9EC44BD8E6B41A9BE32D02499FE % DD6D6AA96E6D58A7D323ED196D689AEB074DDF47D5B0EF652D77F2FF00EB75A9 % 8C8486C3CBAB008CE32278BFB12E174F38F90FCAB6C375D635B5EE7B40735838 % ADAE6FE6EEF7BFFE11553D359665D7451FA3E9F4B8BDD8EC02BAA49F58C56D1F % A675B92EDF63FF0099F4FF0043E9FE96E49D5E5E639A2D787020C5357B6B0276 % D85EF796D96ECFE6FE87FD67F48B4B1B1ABC6ABD3AC47771F13F3DCA23103CFB % 766789BD3A2649249357292492494FFFD6F554924925290EEA59706EED0B0EE6 % 38685AE1F9CD3FF47F96CFD1BFF4688924A73FA937A836B73B1ACFA65A37113E % 9025AC7BEBAEB0DF53FD2FE9ACFF00C013E167E2DEC0DA6C6BAD76E06C6B086B % 9ECF6DBDBE96EFF07BD5F42BB1E9BD8596B0381F9107F79AF6FB98EFE53521D7 % B1457F22E4E7E46654FF00758DA5BCBDF638C081BBD9B5BB76FB7E9D8F546BEA % B936D95DD48BEE6BA41706BEBADC08D3D371FF00C8FBD6FB7A7630209DEF8FA3 % EA3DCF23FAAFB0B9FDFF0079577742C7B06CBEFC8BABEF5BAD2D0E3FBD61A7D2 % 7D9FBBB1EFF4BFE0D33835DD8C62FE56E659D4F305753ADB61ECD59435E1BBDC % DFA2EC87B9DEB3F1B77D3F47F4977FC5AD46306535DE9D64B490E36BC1ADAF71 % 078AA1B6BABAFD9FF1BFE9559C5C0C2C36918D4B6A9E481A9FEB3CFB9CAC27C6 % E3B15E23A51D50D18B5504B9A25EE0017F7DADFA15B7F72AAF77E8EB6A324924 % B94924924A524924929FFFD93842494D04210000000000790000000101000000 % 1800410064006F00620065002000500068006F0074006F00730068006F007000 % 200045006C0065006D0065006E007400730000001C00410064006F0062006500 % 2000500068006F0074006F00730068006F007000200045006C0065006D006500 % 6E0074007300200032002E003000000001003842494D042200000000012E4D4D % 002A000000080007011200030000000100010000011A00050000000100000062 % 011B0005000000010000006A012800030000000100020000013100020000001D % 0000007201320002000000140000008F8769000400000001000000A4000000D0 % 0000004800000001000000480000000141646F62652050686F746F73686F7020 % 456C656D656E747320322E3000323030363A31303A30392032323A30393A3238 % 00000003A001000300000001FFFF0000A00200040000000100000156A0030004 % 00000001000001830000000000000006010300030000000100060000011A0005 % 000000010000011E011B00050000000100000126012800030000000100020000 % 02010004000000010000012E0202000400000001000000000000000000000048 % 0000000100000048000000013842494D03FD0000000000070000000000000000 %EndPhotoshop %begin_xml_code /pdfmark where {pop true} {false} ifelse /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 ge } {false} ifelse and not {userdict /pdfmark /cleartomark load put} if [/NamespacePush pdfmark [/_objdef {photoshop_metadata_stream} /type /stream /OBJ pdfmark /MetadataString 5038 string def % exact length of metadata /TempString 100 string def /ConsumeMetadata { currentfile TempString readline pop pop currentfile MetadataString readstring pop pop } bind def ConsumeMetadata %begin_xml_packet: 5038 <?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CR"?>
+<x:xapmeta xmlns:x='adobe:ns:meta/' x:xaptk='XMP toolkit 2.8.2-33, framework 1.5'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description about='uuid:191a6b3a-5975-11db-aa93-dc897f9dfcbe'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <!-- pdf:Creator is aliased -->
+ </rdf:Description>
+
+ <rdf:Description about='uuid:191a6b3a-5975-11db-aa93-dc897f9dfcbe'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'>
+ <xap:CreatorTool>Adobe Photoshop Elements for Macintosh, version 2.0</xap:CreatorTool>
+ </rdf:Description>
+
+ <rdf:Description about='uuid:191a6b3a-5975-11db-aa93-dc897f9dfcbe'
+ xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'>
+ <xapMM:DocumentID>adobe:docid:photoshop:34766789-5974-11db-aa93-dc897f9dfcbe</xapMM:DocumentID>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xapmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end='w'?> %end_xml_packet [{photoshop_metadata_stream} 2 dict begin /Type /Metadata def /Subtype /XML def currentdict end /PUT pdfmark [{photoshop_metadata_stream} MetadataString /PUT pdfmark [/_objdef {nextImage} /NI pdfmark %end_xml_code gsave % EPS gsave /hascolor /deviceinfo where {pop deviceinfo /Colors known {deviceinfo /Colors get exec 1 gt} {false} ifelse} {/statusdict where {pop statusdict /processcolors known {statusdict /processcolors get exec 1 gt} {false} ifelse} {false} ifelse} ifelse def 40 dict begin /_image systemdict /image get def /_setgray systemdict /setgray get def /_currentgray systemdict /currentgray get def /_settransfer systemdict /settransfer get def /_currenttransfer systemdict /currenttransfer get def /blank 0 _currenttransfer exec 1 _currenttransfer exec eq def /negative blank {0 _currenttransfer exec 0.5 lt} {0 _currenttransfer exec 1 _currenttransfer exec gt} ifelse def /inverted? negative def /level2 systemdict /languagelevel known {languagelevel 2 ge} {false} ifelse def /level3 systemdict /languagelevel known {languagelevel 3 ge} {false} ifelse def level2 {/band 0 def} {/band 5 def} ifelse gsave % Image Header gsave /rows 387 def /cols 342 def 342 387 scale level2 { /DeviceRGB setcolorspace currentdict /PhotoshopDuotoneColorSpace undef currentdict /PhotoshopDuotoneAltColorSpace undef } if /beginimage level2 {/image load def} {{pop .9 setgray 0 0 moveto 0 1 lineto 1 1 lineto 1 0 lineto fill 0 setgray 0 1 translate 1 cols div 1 rows div scale /ratio {cols 400 div mul} def /Helvetica findfont 15 ratio scalefont setfont 5 ratio -20 ratio moveto (Mit JPEG komprimierte Bilder ben\232tigen PostScript Level 2) show /x 128 string def {currentfile x readline {} {pop exit} ifelse (~>) search {pop pop pop exit} {pop} ifelse } loop } def} ifelse 12 dict begin /ImageType 1 def /Width cols def /Height rows def /ImageMatrix [cols 0 0 rows neg 0 rows] def /BitsPerComponent 8 def /Decode [0 1 0 1 0 1] def /DataSource currentfile /ASCII85Decode filter /DCTDecode filter def currentdict end %%BeginBinary: 12801 beginimage s4IA0!"_al8O`[\!W`9l!([(is6]js6"FnCAH67k!!!!"s4[O,!"obO%M0*b&.fQt
+'+km!,8q:3)C$FB(Ddl(+qY4l$k*OQ&I]'V$k*OQ$k*OQ$k*OQ$k*OQ$k*OQ$k*OQ
+$iq%U',DH$)]';0'FkT_'GM#e%Ls0b$k*OQ$kX'[$k*OQ$kWmV$k*OQ$k*OQ$k*OQ
+$k*OQ$k*OQ$k*OQ$k30O!"fJ;K)o!T!?qLF&HMtG!WUsU"995;_uW(&!!*6(!<E3%
+!<<*"z!rr?'"9eu7#RLhG!<<-(!<E3%!<E0#z!!*'$!sAc3#7(VC$P3:="9AT+"9J`3
+"pbA7$o7na!YGM;+VHL55uD&(,&r/h"r*2nYsKZ\'iMkW1Gj-(d6e-bP#Ll/nRHVt
+(8A*e-:F%sA4=A1F>ar`<T7T\Z\66FFlW'_-^:E\[$ASZjRf:V`RX)C<b?N0QDV+1
+f&lZb7os>ILR4pJa4KMK&HDk6!<NB,!sAc3#6tG:2$![Y&Ha12&d1Kt@<!J)"YtXk
+'VVcu,Jd:*n1u>!iGsO56W4_0F#<D5"r<r=K*N_\_U:i9<217?79)6fA`E9eKYu8]
+j7>a)UkQ1@`73l?V7":mjn2YdG(u<[[`6n\p*Vdh=(c`4Q`%=5s4RG]!s&B'&H`UF
+561*a8L0OrP"?rK,a(_k8L0HsP"?p`UlnFGZ%?<?dDV4jogpTSPui)J7e$As^]XT:
+IS_%\*;4U35OrM;\rs!QN<cf(iVrn@;Amt[ET\G>'U79B"7;KU!5J:Nr/-TYU"h\X
+8,iQ5P*2W9^I\G$.1(uU8P2Q"P#@H7,a>*g3MF;"Smt*d=n]EPn(ceAJ'QsD&lX'%
+RbZ\Z-P%s3!0PutccI8rhmi[djO-u&P/r*$=ZQQ?+@#FDcsN-.rrC=g4?^IP#q=\%
+F/7kZK&U$_9U0(a=:]nE8p6@tl#Xabe.31Pf<sBUP"K"*P"A8;,a)&g8L0OrP"?rK
+,a(_ps3U0H8L0OrP"?rK,a(_k8L0HsP"bVU[[4YoCNUo(9\uTB8Zn8cXpOOr!;qH^
+;f==h187oF=T7ad_>aM3(-Clop[3Bdh<'u&3l_4[nQOSt!!+=8B?;G[e`/d`riiL\
+%aH3=>0Wn'ciBuADA#m:0H]o`O^3O2!6VsD;]V$"=h$=!8LWr.[XA`/C2"ri,a(_J
+8L0Hk;Fr-sP`eT`UbB]dg^U(S+e32%g-P5"<MYdV9@1$d`Ni"N'Lcm>QS@aZ1fr*s
+:1N'LD1:Qcp4*,b25L*$nIGW$r/;R"]!$)Br8a*pAW:d@cp,.tM-04&i`8-XF&'%K
+obda[!=ehf8P)YPed?L^bl^9hnG`L4;mF8t4nU6QRRncfP`eT`V'M3q.7keJ8q6lg
+mLi):PbaI6,q1+&8P2gjlKM`__[QoXF`c2NYerukr0FL0.k8c42`jKiU<_!i.@tEm
+nmD:%2s@aMrr2u[W+4jKdlircE=I\EZte?mQ8PlNM('2u1IFHamM4"[8L5f2P"A8;
+,a)&g8L0OrP"?rK,a(_k8L0HsP"?p`Uln:q.3t'J8kC:k;d1UZ]7D3]B4L!#FcU#a
+`j9Hf5!=ttQU6IU(#I3$%tP^RPi^rd#E[Q0`G*o]>GjXm$R["N>9N4f>2e:A_on1L
+o>[UQ3l5;dK,bjk#N0/f,q1+&8P2Q"P#@H7,aA</s3g<J8L0OrP"?rK7`uZR$f6'7
+\rp$Y%oLUEhs%KCVB157rr2utP=\<OEnupql76b2DuKXlb>"%X?9of'^ephhpIWcI
+Q#5P\5hpJJ4G$1:<?k9>5#SJX!!33n.7/BWP"@)o,a(bt8L0I`P"?pq,a(_J8L0Hk
+;Fr-sP`eT`V'M3q.7keJ8lA5+P*D,$,c2AV?.GD1&eEh0mko0Q;e@o+NmNds@M__=
+B4?gg@"1/l=FC,KF8KZ#WIpEU%42j^i=\]V/mc$$Rlc31&])k2j5+%l]9JQ:%OKL@
+Gc<$]';VHMP"@)o,a(cLs3pBK8L0OrP!ct7dn?fe%20d1o3.<G4]a:H50h(6Gk[g7
+rpTf*A5ud;dG)3+AWO::pR-)]Q(s1'6UZo/V'S#S-ia>fG53]oM":%g3a:tVmN)Y5
+.7keJ8lA5+P*D,$,c)cL8L[4VP"JVD,a+CT8L1,XP"@)o,a(bt8L0I`P"?pq,a(_J
+8L0Hk;Fr-sS6i=V).:.P)eP-0^](#p_7sK<B:]mi<Be,Ylg@9PqSV+-bq[2?"=0n@
+a)nO!_+.HZXI@j5BbFFs4*::3P*mSY8L[4VP"L6(eF!r@,a>-dehSQ=TQ&e0^T;m>
+r=Ai$[MLNDVV@_Or8L8=_t.&pP%%GV=XSdr<j`'ZPAHjb!)JO.WDWLA%?[S-Ip(Yt
+B]E+Wd+1sgdc9=Z8o1c:cj>l2P"@)o,a(bt8L0I`P"?pq,`s7CP$e_j492ZBqQ\S<
+gip"&!9gj:Vb6le-kgBH4e'WUp(hMYA^_@!#E,uSk-\e%AZqY0j2j?IC90E?EVQ?,
+@ll:'9977lqNYZoMqTK&5<XM]PHpY05VN=]<5Vo?ZiXK?G\R+UPhW4dkQE+#K"r]5
+,Ojeg]5GBPP*r+:!`"8d<dn[[D*H*spR^R3Koos@hW]C1O($[j@3n&MZE`0/NVOUP
+oa0B89=T6Bl2L`_YUcRH:7i8=\m,C55a7N"!XOluGbh:h*mJs"4p]\F97>[cLFF[V
+P!FZ:8L[4VP"JVD,a+CT8L1,b@k"+^2RI-"h#kf$::\%#n&r*53^:mf+8tjY2Xt,$
+NaDN)]t8$eQo;Efe;jck<gXZKEnL9C[G#_4cbPSuPaNe[8P2Q"P#MD2mLi):P_Uj,
+\@.Q1fKf4o[B#^/QN?)I8Y-7+Zjh,L\F*V`EP8]sUo./lI1#cQQahNHq5qh3KTHMh
+h=0g>B@c"qBm`DD(3fkeqMOT1F$:'=jn)GKFHT3A.3t'J8kC:k;NU=X\go[@@AE9=
+pKF>UP?pD!hp:Go]8GeBZE20SHaElE0Q>C%RHA-bP3>*``sa'_:Jdf(p5u5.\Cb\=
+h!q16/R#FQL@3CuaXODg3,&$$nF9!?hkO?A*Sh@slmkc2%7oPpV6g7'!T9-0U5G?*
+cBfEsF]3'N_?4tQh6]Wq>Vu!&igm?i&<`04JksI;e?q/fcYg<'BE%aa\->_/EPOmd
+\;rcS8ol)/Cik[t6uFM)![:lu.eLOOn`TejA:^V4+J5)p@Oc&C@)ei)\P7ai$#+)/
+YPPXNnYm^<kJDLYk!!/;jHQ\j6[:ecl0E5Uks$dbFYeh/8KIdk,RG\eTCr0DPaY,F
+DM--S9o^i>OTbX*\8^A![f6?.S;]=tL`bsTP#=]4G=6+er"P;lP"?p`UlnQ_lD\Cm
+*#d]kPdU4nRU'^=BUJ<SRaoUpkId"ZS7J6)<LhjrA@`#SVYq;1!8lY&&r/X/dI9_%
+JC3U:U&GYK#Pt4O\S=pFcukFleP`5ppMM'>YA8WPn*nKc5R]]+,S.q98kq>P,a(bt
+8L0Iks46TN8L0P?`X=;>B0bri:W.*TW<KFJ_@'$Ljqh.)3j(-6Dm%LSZfua"rr>qB
+UpWY!1]n4/k+;k^Eur-q@#`kPi)WSfjelk?dml@]62ppd,c9LIR%7I*WR#Y==(S\c
+9JsTqqNUGi^^T:lOHQ"OL:?DpTeEf`rr2uV<G+-1GE6h-W]mc38p&?j0]h?_-oU`l
+>/l6/h>g(E>0f1s,>D&V4msWA\k6^EI@1ie]ZE8:^`U/<Et8T&pUG"k/!ukg[R8rO
+n5mC*BH\ZUY+WV6V%GG$BTo)hCrroKX?caD,m$=tO;kXM"&kqM/TEK&@urQNn%:GX
+Sb=**5PNa(@ku)Zf_DXK[>f!PeYEZH5aCtZ,XhD(P!U_/edi63S8-ItcghZQb^qp?
+i1T4e1q8O`C3]*Bi:ETq4F=$<XjJI\nL;>dXZ+\^LH;_+HO)F'E2P7,r=a]EK89F(
+:>A\G!!+,A1GR'BWRV%c),,-Ap/o/Em>sPSci0+qG4<l@l4<%e8,X0:eUnL*NGDfO
+!.9uTHr;_D%2W.:UeGbXD6TE5T)l`/SP;m"61GjC[UH_XYjNPQdodK&f\ILMMOSH:
+?i]6?B88L&:dfITXLrc*;H'A3WU<8aR+\sp`E-W0!:)a=rrBd/k6EqDBD@^UaQM"!
+,ThPi)`kAYqCF8o_#FDVWqKN+62.)OPDSAb#q:54^$_"e6O/\#GPs1(UA%l5[lg"h
+`2sW-d2GSFoW#&[+F'*L8PL+C$.]%UEk/4]Vbm=B`"*%_hc"$d1[-e-K5okTrr@O;
+Wg9m`FcMXJ*e3E"V<Y-:Xff#&I!kp[d8jAr+haBF!*#]>)Bl=jh%?<2#q9tZ8L5f2
+P"AILfBs8C,a>+N@k;%u`oam"$?VG0JWke"24K?%-ee%eOsN'N6b"j$C!CGI>2_%q
+K!VaDGnTCbD^E*;r_4[aA(pJ5Y*,UTC\4NlnGVgMWAW##`rmE1Odc(aQm!b%B(u:D
+-dUb^9X%1j-*]8EPnlX>&n%8#.`GE'Orth'q';3:=m_4RS102INB:i'e/n<Bknrt_
+99L2=P#0EJBEc6`@!-\hX['?D!(c;E7jS*7AJLJs0Pqa8qG0=LTIfjA[SG%PlduNt
+(cuX3?fj4HFtecXcZ/O'BJPm[`1I[+g(($dE"ThJ,.4=0N)p7&B_9@6*F,f!`j]6m
+mdVSndLJ#u7;Dlu1pe,AMs`C<FLY"MVO[IZ'$99<8HmO<5;2B'\N+--qaiF,XS.8(
+8`Zo=`FuV]@1NHpT-)o`>@R7hQ:!(*Xn<ai-8u]m%K=!<b1`llnOo[e:>fgCm8hgh
++j>K?7rHGaYHW1QbTud$87WLI2^9UN_)N1,2R&QGZ.iAPm&$cDS"^flC%+N*<-/R^
+=m@)Q\9R`T%`N\CT&JGuQ&L%Gf$&noJui#Bit._Gm'DZ*PUq0/K!A=m8,CN2hF9:Q
+*(.=Mrr@LNQW%`+;5)p$b%(_2i58=(kgRFnk+N7P3kVi.$&q#qC9:e?S_L\UV3V/`
+e,=c="LDqs+i2HIhiBMjPp"X9@=XO^VhHV:coC56O3U.,N>gWJ]8o'"V(`bArB-cH
+OkHDk:ZiH.LQDfTj/e?#[n)KCf4moV)su8F.S1nKP`eT`V'M3q.K@c_&kO@5Uln:q
+.3t'J9J!3U5*1u\pJkRQ"I;)]Z/o7_,rA`I.r^XK6G;,QONbA'\(]^,*WH,<L^5>q
+LB:j$,Et9pWjKsF*[DTM9s&1M%1n)#X'mninji,o\,P,V,V&\fY*u@%f(%XaJ"3(\
+#(gB!W19BI[%an5pPse?]N82o?L>eNo7,"X;rEX_PN1B_CYn"gO<_7@WLD2bL:9E-
+:5\-]mh$^7%(62g\L8.*5oZ?RK^/_c0V.>*!1G3637caHH_>Te*rT:*;lN@SJooKk
+)lH!ELY7<).=,e78V@lC]<l8u.WQg%.LrnsNPMR?\Vr;n6Km+dlA(+00L#]RHF_Cp
+'!hMblN@oiF'@cgUT3k'h7%8jSCVkGfQUDqZs?U;Ulk'IZ!#Mq&7EYk=KDh_-cQ`&
+QO2$5T3qn!l+JbZN`Bk52''ps40\8RO5*cN[?e$[LI.RYB`]S"9Dq5TLp(K5#VFgV
+Kd;d-dhpPnPDmM@ofG`s_L9>rG(6;RU?=8S=Q*.NSZJ#=?e*j%'dqt4Zkh8o!0P4/
+rr.N3r?=KOKP6VhQrq/]"Z2I>P"?rK,a(_k8L0HsP"?p`rrE)HmLi):PbaI6,q1+&
+8P2Q"P#@?m*O^iUp:8X:6r+.cYV9eurr?Ef.$M/U@XAX`Op(DHSPbjaQlOL!l2Xhd
+U;t)hR3H.F8$_ujBEA/P-m,j%!,I!@47gcQrD0;ZYQK&+D7$S7p6fh;,[A=p-56Ua
+Q0_p%,g'<J1ZDAdD+aAG,Qo,SFHSp>,"*Obn6t&G*lT-/Nu#)d4hmINk3bql,/P]?
+4!AK_O+JsdFMhMfqq<<Ppa-Qf6J&hZAl_@/\aDNBO)o=nF9"j1Vl*X>Ze@MTJ-0r`
+![>fbN,uK3WO\q=<kT]W`m?n_ii:h;d$:MdcH]-,!N8CJ97^l$=q7:@btKY@f`JCD
+YqH)k$I+%n%:MTN/PrI_"<`UkPE0-qKTp:r?U4f$@JXj@!5Gp7;W)1U9.aou/hi)3
+KW-Z>U\WY?K>"2^P&\.E3N`jnniuc9fVgSUUT$@%NGke_]"&6$*.&CX8a+;CI2rkd
+]5cha?kp1R"ShoEluUl,U/QXbh0\]+r)M[r&4DQC->;*XPisDb,a(bt8L0I`P"?pq
+,a(_Js3g<J8L0OrP"?rK,a(_k6,+_Qk]r"S6"Mp^f@o8q`:AC7Ic<t@S+_f1"cuAC
+dp9),q5m^<1>V=+%K93[!k':0j0D3pKb+ba[9-+<KpEB^`rtT2obad+LLmT"K^+@6
+Og=$P%TBaW".U?AC5CPrnhaLgW`52b7*-nPZtUtr\4aPnH%sER48]e:#7kM\jG45<
+4!(;=2A=o\eC"suY]WWh.TK:^3A1**rKIaqA&7qlS==:8mrNicJ)?W_<ObJ!oo_9g
+%MU`KbX@_!q/nC3,pKS^ZX[i^;[Pk27Z*PE+SQ=8Wu8#p9Vpea$0[VdT#mMm)QAn>
+Kq"KrdL.#M,CS'-g?jnq?"6?l.Zhc\A1/50OpD<]6ijI<Xne4?"i;Acrn!;%8bUtJ
+f2\T%`jACS8$^oKoU$Ug)?QJGi1\$K@F-U>[CbYf>dg,[><[_I%K_?&`b2i@$n%2<
+<a+G?+Y"XYM?4!Z<?l@PUUK@f]V'%Vb\Bu[\g/3$52c%E<Y][sGAWm[A'#2)$jY#]
+Vj$OfqD02qoT:?j#R=Nb[#tP(,>_93?DN`U,q1+&8P2Q"P#MD0mLi):PbaI6,q1+&
+8P2egB_IW;P+(,oD(^Z.OJjJ@]T$0d#*u\q%@!%d':fe<"e@BAKE4F@h!Imo7+h5q
+EA0HX4gLRe/0L7kmP*&[;qg3d&2XP=#oP>gak[54O!RN.27iN\8IcrS5S"STP"76(
+(.2n\6rj>4JaSDY8e"ZRSClKFr(m;\BA2)XA3#0%b>kpM3t\@-@pVNZSR@-!4"(C-
+#dHO5+mdoF<R&6(5atk5DZ9\poDW6bHS<KaN2>8&3ZnLP3s;u1iX+^ZdctViI#["3
+'<\?Q`QNQ$`GP$TJ*L$\4UNL:QalVGSIf\h&R(EEGDEfa+Z0>=WfX0l9IhsLnY@Vn
+(<G]j_WMa@7:N8;bDM^a^reH8@O4"_$(52e.q"D%l*]!7)sI#f7B3jgJP"m=[JFVN
+%gC>f/NtS5Nli!X'7Eq)*`.b#O>nYKE+kE/gKNcV1=p[S\cPm+nc;`t7qqnW5"]P!
+E:ZhV<0BfuV'M3q.7keJ8q6ljmLi):PbaI6,q1%$)teP]%_S#m$.3t(4&3kGUB?,f
+WDg4a]#d+#)W"'@"A4&1Z-Q-M!::?RI;SgU=nc-:^cEU,h-kn4(t$C`h6X(:G1Huk
+<iWWUA?$AQf%j)t?EKk+*$@KI"!sKNK]sbWAdV*U(R#aS,_2"M,_62Q56QK:8*/8Z
+L_EBd,gDN/nkP9)/P8S[O]%>f%T6/F"1dA:20(HSI>p&BJR1-;G7^s8.N4%q4eQso
+iWEbf'%[kQN<5;3G"7(WiMMEN>/LHR$V1_l;7F3*$HqXSq+6sUB4W2.%d[_N0P_`s
+8OmQ(-Ok_oeCdDJJLHG:kQ)ETp4Vq(9-dn2ZGOllO]AO9?oq@tm9@'1+HMZ?ZgVlD
+JteRrT&CnGoUkt9%@Jg7<eA;qi-`Dl`cunH\/CTn]R*nB;Z]_Y;Fr.ql:E7a;NaTs
+PlCa`ea=&A,a>*f8L5f?!b]7SdN_/A>h^fXp?hdn;9`>HTLE]LB)tQ28]BA;5aJ2/
+f0qSq#K7C0.;fUV*[=Y)_lg(G"*mYn%a)KY(EXq=?Ijo]ga8:dW,IG%'eiWG=r_Wb
+(fYO81;\@c70$oeT?Y`1_d'(5p29:a*"\krbEi4!6EY=qRIqre&R-gun%Z.2StR(/
+8IX7u?l;-1<?PUp8&V2Li0Hq]BHWI3b&g.2P`eQr>4soU_HM50)l*9YPpT(7AEG_0
+dCmB6jGucLZ(O+;0CQ8^rr?#R&FrO6[c0hip:':<_;]_>!26q7&4DLDi1js`73n$o
+J:s)IP"5pVZ,NgWaWLaD)[GUnkM)o#W#_%E=jIQ,oAZ_1g;qa-I&D_.;9I./B`s[9
+_>u"+$QSC=F/HGe7KN=j&)Y/$rj!J?/nofbc!+:mMX,=Rd4URQCD<#U)[RdQ8Q&,*
+P*D,$,cC[nmLi):PbaI6,q218%<\"lQOt:dk'!`$GU9-p,pb0tF.<4>&kXBQ"3!(,
+6uKG;+D1W<('6?>*&Pg?PUB%#7+krkYAK8T)O25/-:gV/WkarKFgX/^/bBH^SUtH2
+UP)H/<<^1359PTQ@=^M;(*,+%+R*%1^;:JOlCRL6ERQ>WHFIH23l15q&l`Bs`7VI_
+#%LTS8[jBY?!Bdp.Oj?tdRZq5Nt4")&gEDHW?dWmEXQZbmfq,E)Dt*gXb%D:-c$D>
+%M3ad<4V^"&i[&a7jIlpUikJuM!am^HTaY"K`PECCbilYNlE+>!*"PjDuA<q7uS-D
+%W0+!CEe.S^\)8;=u_:,eh0nhZ0`YFhAd8c1qQ(^+Q;@L.b`o8EK^[Z4ghN-g^[9&
+Mq;`3GYWe5O_2#.mJZ3p8,`B[]=HGdG!O.PJ@hocJ6[I%rrBeo#e[R7TCfZYq%Y?!
+YE="ZOU7hHYfcTQ>F<i0,N'.'le_TdD"lP8F/RPkWRebUP2iNAn$cebCDrH4`%J&d
++P>`,/Nd*PXSdR#<a/_3P"qp?Tn$a<HP[OrR\(atJ[4!$,a0#n,a(_k8L0Hts4?ZO
+8L0OrP"?rK6H;%d[7s!=\?p,866gRmQ`\6Of9G<[Rb.oI##alKFAZ"Xf_7I&(#gMD
+nf#VFJ^nT(X=<jX<H?+'-Zt_;5iE?gB[lUM#.H,re#OLXBUQ9M<nb?d.NOWF(',Yc
+2D>8!'S@(/L5@B8D1$>cWEl<QjhnY7W98RCNF_TXiU4I@Zq+H=UZp@tab(KFLG3\6
+Q(s0d.r.V*9gPXU_I7):<e3gfPb>QY,RR*l8L0Hk;@Z\ng.P"h2$_>LQN?5r#-':3
+cQ3?)X0#5s`sTV*Kh/]`'OP=PqfLdPlTi?:CSF>QA)#/-k^8/Q-t;RP%jAqL3i">o
+mC?5U)!7Nefu/>Y5Fe^AcL&S/3'2sEo5k>YFZoT55c0/Z[VO[]I1I'tL>A6@Dissu
+0X7M$K%ORVZ*!KqIEBrB"k#sg)^:G:,a>*f8L6V$d-_N<,a>*f8L5f0?k_M!8L1/J
+=m?&RJN>6C!$q%k.!<<OS.LC@\;%6&e#h%<n+r=qFB!BT0<DZ?b?XH9mY-d-hWXmf
+$?9A:$Z('l1j^JHX^!;COfA\keup*qo-g(Bp;'PIEKObh*EWMrPkZ\^VgsJs6g2Ef
+?HQUGWR4pA&LuH\(Y,\2[Y6CB.Spc;>O?[0/<n#E$8a#p&PohPJ-&VI.>/<q%2>04
+kodR%Or;!IgIA*_&/drpX=6Kuf]GV52;T^s3S[Aa'S7$l>0O80Q99#'nDO<H.72cq
+1]g:UD,%6MTc?%8<DA%-gE8YoO7JJ?,KXKUG6mq,-0SC_+p&LF^;n1VjJMiZ"#igd
+[t_:=R+?mB.!E:WT'/VG/qR`W.h'8-mL9RVSOn!d'<-5;<`i%DO"LK!&@=SZquW#Q
+n7ZT@ddg(GbFDE\aJH,q%anfVma(@"K1h/FCK3puI!+"?oI<+m3,ueb;DtJ2;Fr-c
+<0BfuV'M3q.K@f`&kO@5Uln:q.3t'J8=p<8Iq,2IKdT<JOfW:]+\BRjKc7l49b=dJ
+GY*EqH29>TG5hQlW7L^NjeV<Qj'>mh!0^<b(@")EjAdk;0tW"d.'/%o%#?arIRR7n
+H%GHLq%YeNO)F(kiSkVI<h,Rn\4<S1dsSI<d!5XRMn:*nf_T.B,cfS`CB;[+i,[9b
+O7Q59p=RaSR0=.#Cm%@8<2>[N>gP_]!dGa6;X#I$k*+X'8h9+r+<`"l(r!f%,uV3,
+VEe1cfNSMkf[)Sb8--<D(2V*pL.Wl=%ah=?_G:Hf1l`9?2TB<'NGgqBMB=r1&Rk*g
+:a;-k.#l_(inG*?qQ$hfg)N6%c0T((W19:P/L<p(HSYs<k]+R9B=(>GWT=<'goF.C
+4':C96Be\3@3qSUG,,1);l:,JcS1e27oa86mb+?JRRackmd<-#*/_&8G2#Bk3Yn:g
+[a7:hb&g\dNpH#-ZLb'RGc[r_oc:DdSDtlq2e.39ZQ]4#],EotrrAF[K1+D-Cb`SI
+P*K2Vg!HV2:9`3HmX3O48L18\P"A8;,a)&g8L0Q#!<:L8&kO@5Uln:q.3t'J8k_Vj
+nP56>.O%8%lT6I2(M[IWQ06i*Y&OU3e:Ggd55HjA[$"U?&,D'f6&gVq?Blm'N&!QO
+BSgM?BUI<SgDa@-[5!EDB5U!DO9nm@F+HO'-c!SXg=s!U<1Rt\+uDE,VZ=:Nolfl>
+ct`M;N[IU>r_beXK`$VWqI-%VY3peBXL6M+m%ni#-1.l/5/qJN6V-bHWjnJ`D2g)c
+QC^E3+O^\$WnH%h,E]hB!&_iR<F]$#-%ZHaSQ+C]mdQ>.61@D0=A/ai:H$4].CQq'
+jZ./O:9^sSenl_Q?Kk6qCMS/boY=.9*XM:N[tOHr*8/gE>,s.#VGE@o^_?L^BZDNb
+d=A>lBE:ZfU)i<aA=uDZMWDkd6lm6i3So#.9q\:Sn.`l%E`!0PV^Q^necOj!]-u#O
+/r_k@2HUeY?.^Vs0#O_[_*c_ca3=*OiDl`uepT\m>HNI9!=FQP%Qk4`cgN*O;A>9c
++I+488L[4VP"JVD,a+f"e*[i?,a>*f8L5f2P"A8;,a)&dQR]LT6/9;bFE;g:YaC8<
+M\Lao24e1gi?0U-MfN,hG1suZDYDjCDQN:Hrr?c31upEX):c&=G9>=.!fj<*.-eFK
+.U\EFB9r`"MLidf*pA3O`uAjn$g"3jD'D-sWB^K(-YG8C@pQ?o!jtI@cK@1-Js5C,
+G2V$[52-t[d%=CF_G.KPQ!'0PO)gi3]<MZs.tlA"f^d#u!P"0F-Yl(9EW^t85trlH
+-J;fGYW'Y8rr=7]SG/"27u"eO88T_bbktHlS;SV*d%8'/b0,o()i`1AEGPN5+5.h/
+<L12!'%.'U$SI4H)255sAWQik#j#Qomih+<d%>*J,rcZ4dCQ#[+D<&q0&A%nBktth
+9L=A+UnU#\]>uG+]1/dn/#*[a#oojcRmst"'FSt"=b_pT<3kiWqEnaT&?A@NWdAe*
+I?ho;b-"lYY1@#"T[4f?k)0F%ZVj`#"^*o0'p7tmbuGR'LA*,Q*RjF4jk3f;!<G)V
+m(+q>TE#N[!@3h%?DN`U,q1+&8P2Q"P#@H7,aA</s4$HL8L0OrP"?rK,a(_k8L0Hs
+P"?p``l>R64&4CN.]?p&'$Q5`Y]<3srMHWPSAr,fOhpGto1+uOW32dO#TuO7QNm';
+60p8+Z,`I"%GOfSFe3"3Rj1HZT\)2(#R&*9+G'N4KpB4(BX9;4Z0jKWL"!j!?G^iY
+^74fMguq9!;2IB8EMuXda:Lrd&<^\og33ECd1T')5hTW9&D^lK2b07urfRr?Se7[l
+.b7c?,ahLI(,IsV#0uLafJl\Ad`78L:?M(-Kh'`I1,r2)>]`>4>_0?Tnu#8t*X$uT
+8?BpICmL4QK!O7sDMdYe#Ip[7>UF6uY01U1d;UJNKDoV,@n3!0DGf6W8bUnI!d$oS
+mN^E5DG<p5e(8TtGbo1IC"<?^9+Et)Xt;7g8<Q4%.o\b#$kFRrn4ng8Ks&X>]5c@K
+J6g1Ti"b8&!/J._EUG3.-Q:hCKN(4oC"gte.5Y=Eg=H+"pNPf2(bsSQlNB]e+8=rm
+J,k/;@3i#g!G8\rTrek1J1!o6&u:[^,q1+&8P2Q"P#@H7,a>*f8L6V$ea=&A,a>*f
+8L5f2P"A8;,a)&g8L0OrP"?rK6HY\q!2Rt4i:)6BC77^Cb^Dgi$`ofip,I'l!,e]X
+;cl>)PP`6a<fmB6#`s-NWqKi\^[lW@/jITG$9Al!0=3U4&D'KSgL)V)&>)UR!.[Vu
+bS=F0[[9-fVo:keNCM0N.sV9'#Wffn<*rj!Y$pp&R@M,Z+qUi2D@C^Xi_H##9U&=<
+["*9@1LG)'5QD.dnluSW"`NbpE'BsIDi>Ab<]^^!&)L5uF[,qFX'!*q24],YZEqZ@
+=2g,6,lR.]X'(V&@^bU^O-!/!@b*ipC/ocd>O=W9?)#pgO:R)B>,qkZlX;O+4eXJ@
+W[4hAcdI35%a+`qNb_!V@A!lErrCqUfn!@'LVobUS?1=:<U/0$icQ]c;XbUt:eQe.
+)bZ-X<a*MPNdOfh8Ld:WP#@H7,a>*f8L5f2P"A8;,a)&g8L0OrP"?ras46TN8L0Or
+P"?rK,a(_k8L0HsP"?p`Uln:q.3t'J8kC:k;NaTsPekl!n"d`jmi)3+S>%b'+%/FF
+8D-uI5+=Hra0bCK%LtLJn-F6&.k)U<RH_'l/p#k=5P^0]E,f+$@o!_0Y`_VOZWP4q
+(5C.cK]sbFP`eT`V'M3q.7keJ8lA5+P*D,$,c)cL8L[4VP"JVD,a+CT8L156fBs8X
+*0NpB`?jKb,cBEq?6#,#IDmMkaX!e>;I1?+8q"Z)iQ3@CgeqGuP"L/A-/lrkVqb0V
+*0NpB`?jKb,cBEq?6#,#IDmMkaX!e>;I1?+8q"Z)iQ3@CgeqGuP"L/A-/lrkVqb0V
+*0NpB`?jKb,cBEq?6#,#IDmMkaX!e>;I1?+8q"Z)iQ3@Cs4I~> %%EndBinary grestore end % Image Trailer grestore grestore % EPS grestore [{nextImage} 1 dict begin /Metadata {photoshop_metadata_stream} def currentdict end /PUT pdfmark [/NamespacePop pdfmark \ No newline at end of file
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.jpg b/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.jpg
new file mode 100644
index 0000000000..2eae971736
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.25.jpg
Binary files differ
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.bb b/graphics/pgf/base/doc/images/brave-gnu-world-logo.bb
new file mode 100644
index 0000000000..10d7e8f6c5
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.bb
@@ -0,0 +1,5 @@
+%%Title: ./brave-gnu-world-logo.jpg
+%%Creator: ebb Version 0.5.2
+%%BoundingBox: 0 0 246 279
+%%CreationDate: Thu Dec 20 23:49:52 2007
+
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.eps b/graphics/pgf/base/doc/images/brave-gnu-world-logo.eps
new file mode 100644
index 0000000000..1c5f93cff2
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.eps
@@ -0,0 +1,381 @@
+%!PS-Adobe-3.0 EPSF-3.0 %%Title: brave-gnu-world-logo.eps %%CreationDate: 09.10.2006 22:10 Uhr %%BoundingBox: 0 0 342 387 %%HiResBoundingBox: 0 0 342 387 %%SuppressDotGainCompensation %%EndComments %%BeginProlog %%EndProlog %%BeginSetup %%EndSetup %ImageData: 342 387 8 3 0 1 3 "beginimage" %BeginPhotoshop: 16252 % 3842494D0425000000000010000000000000000000000000000000003842494D % 03EA000000001DA63C3F786D6C2076657273696F6E3D22312E302220656E636F % 64696E673D225554462D38223F3E0A3C21444F435459504520706C6973742050 % 55424C494320222D2F2F4170706C6520436F6D70757465722F2F44544420504C % 49535420312E302F2F454E222022687474703A2F2F7777772E6170706C652E63 % 6F6D2F445444732F50726F70657274794C6973742D312E302E647464223E0A3C % 706C6973742076657273696F6E3D22312E30223E0A3C646963743E0A093C6B65 % 793E636F6D2E6170706C652E7072696E742E50616765466F726D61742E504D48 % 6F72697A6F6E74616C5265733C2F6B65793E0A093C646963743E0A09093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E63726561746F72 % 3C2F6B65793E0A09093C737472696E673E636F6D2E6170706C652E7072696E74 % 696E676D616E616765723C2F737472696E673E0A09093C6B65793E636F6D2E61 % 70706C652E7072696E742E7469636B65742E6974656D41727261793C2F6B6579 % 3E0A09093C61727261793E0A0909093C646963743E0A090909093C6B65793E63 % 6F6D2E6170706C652E7072696E742E50616765466F726D61742E504D486F7269 % 7A6F6E74616C5265733C2F6B65793E0A090909093C7265616C3E37323C2F7265 % 616C3E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E636C69656E743C2F6B65793E0A090909093C737472696E673E636F6D % 2E6170706C652E7072696E74696E676D616E616765723C2F737472696E673E0A % 090909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 6D6F64446174653C2F6B65793E0A090909093C646174653E323030362D31302D % 30395432303A31303A30355A3C2F646174653E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B % 65793E0A090909093C696E74656765723E303C2F696E74656765723E0A090909 % 3C2F646963743E0A09093C2F61727261793E0A093C2F646963743E0A093C6B65 % 793E636F6D2E6170706C652E7072696E742E50616765466F726D61742E504D4F % 7269656E746174696F6E3C2F6B65793E0A093C646963743E0A09093C6B65793E % 636F6D2E6170706C652E7072696E742E7469636B65742E63726561746F723C2F % 6B65793E0A09093C737472696E673E636F6D2E6170706C652E7072696E74696E % 676D616E616765723C2F737472696E673E0A09093C6B65793E636F6D2E617070 % 6C652E7072696E742E7469636B65742E6974656D41727261793C2F6B65793E0A % 09093C61727261793E0A0909093C646963743E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E50616765466F726D61742E504D4F7269656E74 % 6174696F6E3C2F6B65793E0A090909093C696E74656765723E313C2F696E7465 % 6765723E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E7469 % 636B65742E636C69656E743C2F6B65793E0A090909093C737472696E673E636F % 6D2E6170706C652E7072696E74696E676D616E616765723C2F737472696E673E % 0A090909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E6D6F64446174653C2F6B65793E0A090909093C646174653E323030362D3130 % 2D30395432303A31303A30355A3C2F646174653E0A090909093C6B65793E636F % 6D2E6170706C652E7072696E742E7469636B65742E7374617465466C61673C2F % 6B65793E0A090909093C696E74656765723E303C2F696E74656765723E0A0909 % 093C2F646963743E0A09093C2F61727261793E0A093C2F646963743E0A093C6B % 65793E636F6D2E6170706C652E7072696E742E50616765466F726D61742E504D % 5363616C696E673C2F6B65793E0A093C646963743E0A09093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E63726561746F723C2F6B6579 % 3E0A09093C737472696E673E636F6D2E6170706C652E7072696E74696E676D61 % 6E616765723C2F737472696E673E0A09093C6B65793E636F6D2E6170706C652E % 7072696E742E7469636B65742E6974656D41727261793C2F6B65793E0A09093C % 61727261793E0A0909093C646963743E0A090909093C6B65793E636F6D2E6170 % 706C652E7072696E742E50616765466F726D61742E504D5363616C696E673C2F % 6B65793E0A090909093C7265616C3E313C2F7265616C3E0A090909093C6B6579 % 3E636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F % 6B65793E0A090909093C737472696E673E636F6D2E6170706C652E7072696E74 % 696E676D616E616765723C2F737472696E673E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E6D6F64446174653C2F6B6579 % 3E0A090909093C646174653E323030362D31302D30395432303A31303A30355A % 3C2F646174653E0A090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E7469636B65742E7374617465466C61673C2F6B65793E0A090909093C696E74 % 656765723E303C2F696E74656765723E0A0909093C2F646963743E0A09093C2F % 61727261793E0A093C2F646963743E0A093C6B65793E636F6D2E6170706C652E % 7072696E742E50616765466F726D61742E504D566572746963616C5265733C2F % 6B65793E0A093C646963743E0A09093C6B65793E636F6D2E6170706C652E7072 % 696E742E7469636B65742E63726561746F723C2F6B65793E0A09093C73747269 % 6E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C2F7374 % 72696E673E0A09093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E6974656D41727261793C2F6B65793E0A09093C61727261793E0A0909 % 093C646963743E0A090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E50616765466F726D61742E504D566572746963616C5265733C2F6B65793E0A % 090909093C7265616C3E37323C2F7265616C3E0A090909093C6B65793E636F6D % 2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F6B65793E % 0A090909093C737472696E673E636F6D2E6170706C652E7072696E74696E676D % 616E616765723C2F737472696E673E0A090909093C6B65793E636F6D2E617070 % 6C652E7072696E742E7469636B65742E6D6F64446174653C2F6B65793E0A0909 % 09093C646174653E323030362D31302D30395432303A31303A30355A3C2F6461 % 74653E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E7374617465466C61673C2F6B65793E0A090909093C696E7465676572 % 3E303C2F696E74656765723E0A0909093C2F646963743E0A09093C2F61727261 % 793E0A093C2F646963743E0A093C6B65793E636F6D2E6170706C652E7072696E % 742E50616765466F726D61742E504D566572746963616C5363616C696E673C2F % 6B65793E0A093C646963743E0A09093C6B65793E636F6D2E6170706C652E7072 % 696E742E7469636B65742E63726561746F723C2F6B65793E0A09093C73747269 % 6E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C2F7374 % 72696E673E0A09093C6B65793E636F6D2E6170706C652E7072696E742E746963 % 6B65742E6974656D41727261793C2F6B65793E0A09093C61727261793E0A0909 % 093C646963743E0A090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E50616765466F726D61742E504D566572746963616C5363616C696E673C2F6B % 65793E0A090909093C7265616C3E313C2F7265616C3E0A090909093C6B65793E % 636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F6B % 65793E0A090909093C737472696E673E636F6D2E6170706C652E7072696E7469 % 6E676D616E616765723C2F737472696E673E0A090909093C6B65793E636F6D2E % 6170706C652E7072696E742E7469636B65742E6D6F64446174653C2F6B65793E % 0A090909093C646174653E323030362D31302D30395432303A31303A30355A3C % 2F646174653E0A090909093C6B65793E636F6D2E6170706C652E7072696E742E % 7469636B65742E7374617465466C61673C2F6B65793E0A090909093C696E7465 % 6765723E303C2F696E74656765723E0A0909093C2F646963743E0A09093C2F61 % 727261793E0A093C2F646963743E0A093C6B65793E636F6D2E6170706C652E70 % 72696E742E7375625469636B65742E70617065725F696E666F5F7469636B6574 % 3C2F6B65793E0A093C646963743E0A09093C6B65793E636F6D2E6170706C652E % 7072696E742E50616765466F726D61742E504D41646A75737465645061676552 % 6563743C2F6B65793E0A09093C646963743E0A0909093C6B65793E636F6D2E61 % 70706C652E7072696E742E7469636B65742E63726561746F723C2F6B65793E0A % 0909093C737472696E673E636F6D2E6170706C652E7072696E74696E676D616E % 616765723C2F737472696E673E0A0909093C6B65793E636F6D2E6170706C652E % 7072696E742E7469636B65742E6974656D41727261793C2F6B65793E0A090909 % 3C61727261793E0A090909093C646963743E0A09090909093C6B65793E636F6D % 2E6170706C652E7072696E742E50616765466F726D61742E504D41646A757374 % 656450616765526563743C2F6B65793E0A09090909093C61727261793E0A0909 % 090909093C7265616C3E302E303C2F7265616C3E0A0909090909093C7265616C % 3E302E303C2F7265616C3E0A0909090909093C7265616C3E3738333C2F726561 % 6C3E0A0909090909093C7265616C3E3535393C2F7265616C3E0A09090909093C % 2F61727261793E0A09090909093C6B65793E636F6D2E6170706C652E7072696E % 742E7469636B65742E636C69656E743C2F6B65793E0A09090909093C73747269 % 6E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C2F7374 % 72696E673E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E % 7469636B65742E6D6F64446174653C2F6B65793E0A09090909093C646174653E % 323030362D31302D30395432303A31303A30355A3C2F646174653E0A09090909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E737461 % 7465466C61673C2F6B65793E0A09090909093C696E74656765723E303C2F696E % 74656765723E0A090909093C2F646963743E0A0909093C2F61727261793E0A09 % 093C2F646963743E0A09093C6B65793E636F6D2E6170706C652E7072696E742E % 50616765466F726D61742E504D41646A75737465645061706572526563743C2F % 6B65793E0A09093C646963743E0A0909093C6B65793E636F6D2E6170706C652E % 7072696E742E7469636B65742E63726561746F723C2F6B65793E0A0909093C73 % 7472696E673E636F6D2E6170706C652E7072696E74696E676D616E616765723C % 2F737472696E673E0A0909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E7469636B65742E6974656D41727261793C2F6B65793E0A0909093C61727261 % 793E0A090909093C646963743E0A09090909093C6B65793E636F6D2E6170706C % 652E7072696E742E50616765466F726D61742E504D41646A7573746564506170 % 6572526563743C2F6B65793E0A09090909093C61727261793E0A090909090909 % 3C7265616C3E2D31383C2F7265616C3E0A0909090909093C7265616C3E2D3138 % 3C2F7265616C3E0A0909090909093C7265616C3E3832343C2F7265616C3E0A09 % 09090909093C7265616C3E3537373C2F7265616C3E0A09090909093C2F617272 % 61793E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E7469 % 636B65742E636C69656E743C2F6B65793E0A09090909093C737472696E673E63 % 6F6D2E6170706C652E7072696E74696E676D616E616765723C2F737472696E67 % 3E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B % 65742E6D6F64446174653C2F6B65793E0A09090909093C646174653E32303036 % 2D31302D30395432303A31303A30355A3C2F646174653E0A09090909093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E7374617465466C % 61673C2F6B65793E0A09090909093C696E74656765723E303C2F696E74656765 % 723E0A090909093C2F646963743E0A0909093C2F61727261793E0A09093C2F64 % 6963743E0A09093C6B65793E636F6D2E6170706C652E7072696E742E50617065 % 72496E666F2E504D50617065724E616D653C2F6B65793E0A09093C646963743E % 0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 63726561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E617070 % 6C652E7072696E742E706D2E506F73745363726970743C2F737472696E673E0A % 0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E69 % 74656D41727261793C2F6B65793E0A0909093C61727261793E0A090909093C64 % 6963743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E50 % 61706572496E666F2E504D50617065724E616D653C2F6B65793E0A0909090909 % 3C737472696E673E69736F2D61343C2F737472696E673E0A09090909093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C % 2F6B65793E0A09090909093C737472696E673E636F6D2E6170706C652E707269 % 6E742E706D2E506F73745363726970743C2F737472696E673E0A09090909093C % 6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F644461 % 74653C2F6B65793E0A09090909093C646174653E323030332D30372D30315431 % 373A34393A33365A3C2F646174653E0A09090909093C6B65793E636F6D2E6170 % 706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B65793E % 0A09090909093C696E74656765723E313C2F696E74656765723E0A090909093C % 2F646963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09093C % 6B65793E636F6D2E6170706C652E7072696E742E5061706572496E666F2E504D % 556E61646A757374656450616765526563743C2F6B65793E0A09093C64696374 % 3E0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E63726561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E6170 % 706C652E7072696E742E706D2E506F73745363726970743C2F737472696E673E % 0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 6974656D41727261793C2F6B65793E0A0909093C61727261793E0A090909093C % 646963743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E % 5061706572496E666F2E504D556E61646A757374656450616765526563743C2F % 6B65793E0A09090909093C61727261793E0A0909090909093C7265616C3E302E % 303C2F7265616C3E0A0909090909093C7265616C3E302E303C2F7265616C3E0A % 0909090909093C7265616C3E3738333C2F7265616C3E0A0909090909093C7265 % 616C3E3535393C2F7265616C3E0A09090909093C2F61727261793E0A09090909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E636C69 % 656E743C2F6B65793E0A09090909093C737472696E673E636F6D2E6170706C65 % 2E7072696E74696E676D616E616765723C2F737472696E673E0A09090909093C % 6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F644461 % 74653C2F6B65793E0A09090909093C646174653E323030362D31302D30395432 % 303A31303A30355A3C2F646174653E0A09090909093C6B65793E636F6D2E6170 % 706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B65793E % 0A09090909093C696E74656765723E303C2F696E74656765723E0A090909093C % 2F646963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09093C % 6B65793E636F6D2E6170706C652E7072696E742E5061706572496E666F2E504D % 556E61646A75737465645061706572526563743C2F6B65793E0A09093C646963 % 743E0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65 % 742E63726561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E61 % 70706C652E7072696E742E706D2E506F73745363726970743C2F737472696E67 % 3E0A0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E6974656D41727261793C2F6B65793E0A0909093C61727261793E0A09090909 % 3C646963743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E74 % 2E5061706572496E666F2E504D556E61646A7573746564506170657252656374 % 3C2F6B65793E0A09090909093C61727261793E0A0909090909093C7265616C3E % 2D31383C2F7265616C3E0A0909090909093C7265616C3E2D31383C2F7265616C % 3E0A0909090909093C7265616C3E3832343C2F7265616C3E0A0909090909093C % 7265616C3E3537373C2F7265616C3E0A09090909093C2F61727261793E0A0909 % 0909093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E63 % 6C69656E743C2F6B65793E0A09090909093C737472696E673E636F6D2E617070 % 6C652E7072696E74696E676D616E616765723C2F737472696E673E0A09090909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F64 % 446174653C2F6B65793E0A09090909093C646174653E323030362D31302D3039 % 5432303A31303A30355A3C2F646174653E0A09090909093C6B65793E636F6D2E % 6170706C652E7072696E742E7469636B65742E7374617465466C61673C2F6B65 % 793E0A09090909093C696E74656765723E303C2F696E74656765723E0A090909 % 093C2F646963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09 % 093C6B65793E636F6D2E6170706C652E7072696E742E5061706572496E666F2E % 7070642E504D50617065724E616D653C2F6B65793E0A09093C646963743E0A09 % 09093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E6372 % 6561746F723C2F6B65793E0A0909093C737472696E673E636F6D2E6170706C65 % 2E7072696E742E706D2E506F73745363726970743C2F737472696E673E0A0909 % 093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E697465 % 6D41727261793C2F6B65793E0A0909093C61727261793E0A090909093C646963 % 743E0A09090909093C6B65793E636F6D2E6170706C652E7072696E742E506170 % 6572496E666F2E7070642E504D50617065724E616D653C2F6B65793E0A090909 % 09093C737472696E673E41343C2F737472696E673E0A09090909093C6B65793E % 636F6D2E6170706C652E7072696E742E7469636B65742E636C69656E743C2F6B % 65793E0A09090909093C737472696E673E636F6D2E6170706C652E7072696E74 % 2E706D2E506F73745363726970743C2F737472696E673E0A09090909093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E6D6F6444617465 % 3C2F6B65793E0A09090909093C646174653E323030332D30372D30315431373A % 34393A33365A3C2F646174653E0A09090909093C6B65793E636F6D2E6170706C % 652E7072696E742E7469636B65742E7374617465466C61673C2F6B65793E0A09 % 090909093C696E74656765723E313C2F696E74656765723E0A090909093C2F64 % 6963743E0A0909093C2F61727261793E0A09093C2F646963743E0A09093C6B65 % 793E636F6D2E6170706C652E7072696E742E7469636B65742E41504956657273 % 696F6E3C2F6B65793E0A09093C737472696E673E30302E32303C2F737472696E % 673E0A09093C6B65793E636F6D2E6170706C652E7072696E742E7469636B6574 % 2E707269766174654C6F636B3C2F6B65793E0A09093C66616C73652F3E0A0909 % 3C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E74797065 % 3C2F6B65793E0A09093C737472696E673E636F6D2E6170706C652E7072696E74 % 2E5061706572496E666F5469636B65743C2F737472696E673E0A093C2F646963 % 743E0A093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E % 41504956657273696F6E3C2F6B65793E0A093C737472696E673E30302E32303C % 2F737472696E673E0A093C6B65793E636F6D2E6170706C652E7072696E742E74 % 69636B65742E707269766174654C6F636B3C2F6B65793E0A093C66616C73652F % 3E0A093C6B65793E636F6D2E6170706C652E7072696E742E7469636B65742E74 % 7970653C2F6B65793E0A093C737472696E673E636F6D2E6170706C652E707269 % 6E742E50616765466F726D61745469636B65743C2F737472696E673E0A3C2F64 % 6963743E0A3C2F706C6973743E0A3842494D03E9000000000078000300000048 % 004800000000030F022FFFEEFFEE033802410367057B03E00002000000480048 % 0000000002D802280001000000640000000100030303000000017FFF00010001 % 0000000000000000000000006808001901900000000000200000000000000000 % 0000000000000000000000000000000000003842494D03ED0000000000100048 % 00000001000200480000000100023842494D042600000000000E000000000000 % 000000003F8000003842494D040D0000000000040000001E3842494D04190000 % 000000040000001E3842494D03F3000000000009000000000000000001003842 % 494D040A00000000000100003842494D271000000000000A0001000000000000 % 00023842494D03F5000000000048002F66660001006C66660006000000000001 % 002F6666000100A1999A0006000000000001003200000001005A000000060000 % 00000001003500000001002D000000060000000000013842494D03F800000000 % 00700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000 % FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFF % FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFF % FFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D04080000000000100000 % 00010000024000000240000000003842494D041E000000000004000000003842 % 494D041A00000000035D00000006000000000000000000000183000001560000 % 001400620072006100760065002D0067006E0075002D0077006F0072006C0064 % 002D006C006F0067006F00000001000000000000000000000000000000000000 % 0001000000000000000000000156000001830000000000000000000000000000 % 0000010000000000000000000000000000000000000010000000010000000000 % 006E756C6C0000000200000006626F756E64734F626A63000000010000000000 % 00526374310000000400000000546F70206C6F6E6700000000000000004C6566 % 746C6F6E67000000000000000042746F6D6C6F6E670000018300000000526768 % 746C6F6E670000015600000006736C69636573566C4C73000000014F626A6300 % 000001000000000005736C6963650000001200000007736C69636549446C6F6E % 67000000000000000767726F757049446C6F6E6700000000000000066F726967 % 696E656E756D0000000C45536C6963654F726967696E0000000D6175746F4765 % 6E6572617465640000000054797065656E756D0000000A45536C696365547970 % 6500000000496D672000000006626F756E64734F626A63000000010000000000 % 00526374310000000400000000546F70206C6F6E6700000000000000004C6566 % 746C6F6E67000000000000000042746F6D6C6F6E670000018300000000526768 % 746C6F6E67000001560000000375726C54455854000000010000000000006E75 % 6C6C54455854000000010000000000004D736765544558540000000100000000 % 0006616C74546167544558540000000100000000000E63656C6C546578744973 % 48544D4C626F6F6C010000000863656C6C546578745445585400000001000000 % 000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C % 69676E0000000764656661756C740000000976657274416C69676E656E756D00 % 00000F45536C69636556657274416C69676E0000000764656661756C74000000 % 0B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F % 7254797065000000004E6F6E6500000009746F704F75747365746C6F6E670000 % 00000000000A6C6566744F75747365746C6F6E67000000000000000C626F7474 % 6F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C % 6F6E6700000000003842494D041100000000000101003842494D041400000000 % 0004000000013842494D040C000000001A350000000100000071000000800000 % 01540000AA0000001A1900180001FFD8FFE000104A4649460001020100480048 % 0000FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001 % FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F15181313151313 % 18110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C % 0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C % 0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C % 0C0C0C0C0C0CFFC00011080080007103012200021101031101FFDD00040008FF % C4013F0000010501010101010100000000000000030001020405060708090A0B % 0100010501010101010100000000000000010002030405060708090A0B100001 % 0401030204020507060805030C33010002110304211231054151611322718132 % 061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283 % 264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4 % E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F7 % 1100020201020404030405060707060535010002110321311204415161712213 % 0532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B2 % 83072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495 % C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7 % FFDA000C03010002110311003F00F5549249252962FD63FADFD0BEADD3BFA95F % FA67006BC4AA1D7BC1DC039B4EE6EDAFF46FFD35BE9D3FF09BD61FD7EFAFE3A1 % 8FD91D22323AEDE000000E18E1C3DB658DFA2FC87B7DD451FF00A1191FA2F4AA % C9E1FA4FD5DCEEA998EEA7D58BFA8751CC74D3597026D70038716BABAF1F1D8D % DB65FF00CC52CF469AB67A94D8929EA2CFF1C4CB2D8E9FD132322AEEEB2C6D6E % E63F9BAD993F9BFF0008B5A9FF0018D45AD31D1F3C585E6BA9B1400F7EA1B5D7 % BF258EB2C76DFA14D76A9F4FFA834B58D7E7E4D8D773F66C6706D4D91F47D6B2 % BFB4DCE6EEFE77F56FFC2F5ADDE9BD07A474B71B30B19B5DCE043AF717597104 % 8739AFCABDD6E4399B9BBB67AA9292F4DBFA86452EB73B1460B8B88AA8F505AF % 0C1F45F7BEAFD0B2C7FF00A1A5F7FA7FF721FF00E0ADA4924A79BEBBD47EB974 % 9B1F7E06053D6B05DAB59597539356AEDCCB1937332D9B7D3F4ACC7632DFF494 % 7F855CB752FF0019FF005971C7A7FB2A8E9F748939A320340D665B65185FF07F % E13FF3E2F4D49253E59D37FC66FD64B323D4C9AF03269827ECF8FEA31CE8F67E % 8B21CFC8D9EFFF004B4FFDB5FCF57E83D13AFF004EEB743ADC37383EBDBEB63D % A36DB5EE1B99BD9AEE63FF00C1DF53ACC7BBFC0DB62C4FAD5FE2EFA4F5B6D995 % 84D6F4EEABF49B91588AEC7025F199437D96FA9BDDFA7FE91FF1BE9FA2BCFABB % FAD740EBC303A89FB1754C40E38990C135DA1FFE1F7B87EB38D76CF753FF005B % FD0E4D1FA24A7DB9258DF56FEB0B3ACE31173063E75207AF44CB48FCDC9C677F % 84C5B7F33FD1FF00336FE916CA4A524924929FFFD0F555CC7D7DFAE15FD58E96 % 3D269B3A96687D7835812039BB77DF618DBB28F52BFD1FF86B3F47F43D5B6AE9 % D782F56EA87EB37D6BCAEAAE71B315961A30441814D42CB3D50DB7DCDD98F5DB % 97657B7FA45DFE0D2527FAADD06CCA7D9D433C3F2AFB9C2581FF00A5BEEB9DBD % 98E2CB377BED7B7D5CABBFC151FA7C8B3D15EBDD07A1D7D2F1F7DA18FCFB9A06 % 4DCC076C0FA18F8FBE5D5E263FD0A6BFFAF59FA7B6D58DF527A355481956FBED % A2B635B31FA3B2D636FBDBB3DCE6DCDAACAFF49F4FF58BAA5D724A52499CE6B1 % A5CE21AD689738E8001DCAE03AFF00F8DAC1C6C87E07D5FC63D57246E67AF3B6 % 86BFE830B3682FCA67A9FB9E8D567F81C9494FA024BCBFA6FF008CDFAD0EC963 % 73B0F06DAF5DF4D0E7D76684336B2CB2DC9ABD5F51DF42C6319FF0D5AE9FA87F % 8CAFAAB81D3E9CCB6EB1F66434BABC163272416BBD1B59754E2C663BAAB37FF3 % F6D7EAFA567D9FD6494F5292E1F0FF00C6C746C8B62DC0CDA292EDA2ED8D7800 % 7D27DB5D563AE6EC6EDDDE9577AEB7A6756E9BD5F1465F4DC8665504ED2F61E1 % D01DE9D8C3EFAACDAE6FE8EC6FA8929B6B9FFAEDF5529FACFD1DD8A36579F4FE % 930725E0FB1FA6E61733DEDAB21ADF4EDFFADDFE958FA2B5D024929F11FAB3D7 % 3A85393582F38BD4F049AB6580B75691F68C7CE66D7BFECB7ECD96B367AACCA6 % 7E8EAFB4D78FE9FB2F4ECFA3A8E15799402D65920B1D1B98F6935DD4D9B4B9BE % A536B1F559B5CBC5FEB8B2AE9FFE303AA8A229AEC6B2D796E9B5D6B28B6DB7FE % DE7BAE7AEFBEA266165F6E00115DB59B76811B2DC77370AFF5777B9D6DF5FD99 % DFF07E8BFF00B694F66924924A7FFFD1F50CA6DCFC5B9943B6DCEADC2B7710E2 % 0EC77F9CBE7BFAB4E0031BB8377BECA4171F687DA296D46C0DF76C7EC77FDB5F % CB5F44AF2FFAEFF50F37133EFEBBD0697E5D19AE2EEA3D3DB2FB03DC4BDD918C % DFA56B2C7B9DBAAFE728B1FF00A1FD0FF454A75FEABFD6CE958551C5CFB7ECF5 % 585A5B976FB6BF576B6ABB1EFB3E856FFD17A8CB5DB29FF03FA3B29FD274EFFA % CBF5718DDCFEAB86D6F89C8A80FF00AB5E29565B32D95ED7EE021B66FF007169 % 8D1CF6EEAFD4B58DFF00AEBFFAEAE51F567A78A1D939748A98D87B59639AC3EF % FE65B90E26AAE86BBE97BFFF0003FCF4A6F7D6CFAD79DF5D731DD27A3EFABA15 % 0EFD259043B21CD3B9AFB07E653B87EAD8EFFF008EBFF58FB3E3D15B1BEAF328 % A994359B8D861B5D675B0804BFE916D96FE6FAAC67E67E8BFC27A0AE74EB72F2 % 5870FEAFE28BE9A5C2B665D601C7A3633D4B6DB03D94D3EADAEB376FBEFF00A1 % BFF43916FF00379FD33A66664752756E75BD42C69DAEAEB0C7EE206DDD6DB697 % 6DDBFF0069BF4791F63FE91FA0BD3A1094FE51F5DB4592CB18EA5B67A664E3D2 % 2CFB3D8CA7710D2D6398C0EDAF6B296B3D3AD9EAEBFB9EA7F3BF43F3F3727168 % 19363AD65673C1FD333783732086ED756E2EB9F6FF00C5FDA2F7B3FE1175DD4D % B57D9CBF368C367516FA78ADC2A326FBC8C6AEC7E4E463F517D77D1535FEA3BF % 43BFF9CBFF0056FD27ABE9ACCE9F89899F636ACAE9F878990197598CCFB5B28B % 2B25D35E2E6E1DF75F915DBB3D4C87BEBC6FF47EAD767E92C481C7C5C249F31C % 3308E324D47865A5D7CAE05D7D74EFAAF0FA5EE716163DA46D734B37D3B086FA % 16FD0F568FE77DFF00A657BA5F54C8C1CCAF370EFF00B2DAD86B5ED1B9AF6C7F % 35918ECFE9547FC67E9B7FF45FB3FD35B35F41EAB876BF763B6DC4B6B873F633 % 63B74FF3B4B5D7D9F67D5ED6E5595FBFFE2972AFC5AF2736EFD9CE6E157EA0AA % 9DC1EDAED786FB9BE859BBD2FA5F9BFF006CFEE38E23FA244BF050C9FBC0C5F5 % 7E8DF5F3A4655219D5AEA7A5E6B44B9B6D81B4BC69FA5C5C9B7D3ADFBB77F30E % FD62AFF8BFD3595BAD7F8D3FAA9D36A78C6C8FDA59634AE8C604B4B88259BB28 % B7D06D7BBD8FF4DD75ACFF004162F2BBED78B0E1753A832CD4327F9A7C7B5BB2 % C1FE05AE6FBF6BFF00EDB46C6C460692D0CADDA83B581B13F9D5B9A2FC8B9BFB % 9E933E87F39E8A8D911B9DD47AC754BFAAF5100E6E7BD8E3535BA064B7ECF486 % 39DFE15F551450CDFF00D169CBB6FF00E6BD45E93F526870CC65A5C48B3ED16B % 09DB2F639D57BDAD23D477B9DEA596FEFDB5D5FF0072172BD2FA68BEE630576F % A4F0EDC04BF22E062A7574D67DEF7E47D0BBF49ECC3FE7B2A9C15E97F573A3BB % A6E33ACBDA1995901BEA3038BF635BBBD2A5D6E9EB58CF52CF52EDBFF07FCC55 % 424A7612492494FF00FFD2F5549249253CF7D68FABFF0055F268B3AA755C3DD7 % D23DB918FB9992E7BB6D345553F1DD5D9917BECF4E9C5AADF53F49FA35C2E4F5 % 3661D76B2DA3EDF994EFAB23A78AFED5563B590F7613C3856CCACBF6FA99BD4E % EFF26E33FF0047D330723D3FD1749F5D7A9F52CCCFAFA27437554E6B008CAB1E % 5B6B5D68B2BB5BD3298FD264D78CCB7D5CD67F43AAEBAA65B55CFB3D3E7F230C % B2ACACAEB9946F65120D3539C7098F7FE8EBFB7E5BEFAF2BABE53D9E97EADEAF % F83FD62CF4922247488DF792C9DE801AEB6931EFCEFDA15D7D53229C8C363C33 % 0BA4E23EB661E457B3754FF4EDF4FD7C2AABB7F9CA3A6B2AC8B7F49FCD7A2B5B % AE67E453D0FECD5B9CEA3D573336EC4A982B67B4BAAC5CAFB3D8FF00D5AFB1FF % 00A4BD9E933F57F432FF004795F67B70BA2E4E3E3DB9165384324BFF00441C1A % DC72F1F9D6DAEA5F4E2D357FC17ABB2BAFF4752DAEA3D4DDD4307131FA18A2DA % 301CE7E6E2E23DB5B18F1FD15DBEE7D3859B4D0EDEFBB17ED6CFD73ECB91FA5A % EAB2A5265C5C38AA20D91F6B1717171441D28D7EFF00F8CF0993539C5FBEF15B % 291B9D5D55B8811F9D75B90E63BFEB752C8BBAAE3ED69A45B63AA3BCBDE1AD0E % 27F36CDBBB756BAAB3A062D9EA37A9D79B65D66EB68A2C6B6963DAD875B73BA8 % 5566563E5D0DF519FCCBF7D2A3D32CC365CCAFA7537E63041B29C67B1986C7FD % 16B9F75ADDEFFF0084B37AA5A0BB04D74F958408C7420923A7F37170065DD7D4 % 6AB5CD14002D632A77B6BD7F9B0D656FDAD64FE8B73FF43FE0D74EDEAACBBAB5 % 54F54A2D38F750D37676D0368693B72AC7E3B1CC7D6EDDEFB3D0A2CC6FE777AC % BEBF9D8B84D76331953F2EDDC6E6E35E6DA9A09FFB55B9BB773377E62CFC4B3A % BDD857DB5DB8B8C368A4DD6BCD6F7899FD0BED3E9B94B8BDCF9A029920244588 % 81127691F9BC5ECBAAF4BE92FE934F45AB25D9349B5D6E0DD5D6CBDB734B0B3E % CD4E5FAB7E3FDA5AD637D47B3D3C9A3D2F655E865FA8AC7D4AFA96DCCE995DB6 % 7516BEB63BD3C8AEBAE6EAEC60FD2E1DAEB9F6D0C7635DF47F57BBD7A7D2B3F9 % 9F4960F4AE946EC62D17FDAAEC96B6BCA2D756CABD6AC3DF8D55198CB2BF4DBE % EF7DDB3F4967AAB4FEAA75FCBE97D7AAB7A99ADADEA8598D7FA43F3E3D3664DF % EED8EF4727F41F68FDCBAFF53D5FD0FA73F0C88E23BF567040A1B7F2EEFA574D % E8FD3FA6348C5ACFA8F1166458E365CFFF008DC8B4BED7FF005377A75FF83575 % 249317A92492494FFFD3F5540CDCBA7070EFCDBE7D1C6ADF759024EDADA6C7ED % 1FD56A3AC6FADED73FEAEE5D4D0E70BFD3A5ED67D2732DB6AA2D637FAF558F6A % 205903BA09A04F67CF7033735DD49EFCCBC56FB817E4B2A8B5F73277E5BED716 % 8AFECD7DFF00AB50C6DB5E27A18FFA0F52BF52EB639FD5FA4F53EA95BDF7D74B % F56E363068BACAC47BF3B2AF6B7ECD4E43F6ECA7171BF9AAD6565E065E7B6CCB % EA00B6ECB3AD4C97319B0B6BA316B69FA0DA59ECD8D51ADDD3FA45B4D74B9A5C % 4137BDCD0D0D703F45EF8F7395D8E2BE136234D2965AE214657FB1EB3A2FD5AC % 1CE65561C3765C1871B1CD74FF00C3653ACFFA152E94748E9B896558B9D9D4D3 % EAB837170DA2AA019D19556C76EB2E589F54BEB1DB957B28B2C2719C4CFBAAAD % BFD7DC18CB9FB7F777AA37D79D5B5ECCEE9B7FA5937D97752CDC50C7E2DAF7B9 % E5CE65949BADFB1B58D63297E5329F43FED5FE9941CD66CB8F4034FD8BB1C61C % 3C422724AF500FC81EA3EB5D5F57A707F6BE0D9D42DAF78C4631AE2D13E9FAA2 % FDAEAB1BD37EDABD97FF00DB6B88C5E875E063D9FB2F3701F1FCF65F546BEA35 % C0F7BAA6FAD761DBFF0007B28A3FEBCB7BA3F59C3C8C3C5E9E3A7D995D1AA7B6 % 8A6F6D6E6B68630399F68BB3BDBD3F32B63BDB63E9BBD7FF0083CAB568F55C1E % 974D03A87567557E257B431CCADD90F74FD06D7454C737FB7B2C55E1EDE404CE % C3626090008F144F4F95F27C9AB273DD90CA328DD8EF2DFB4E5340AABB4D5BFD % 1F4F1696EF7B6BF51DFA4BBFF0244FB062605943F20B03EC6EDADA185EE04705 % ACB0EE5DD1FACBF563A858DB3A6DD461BAB7FA577DB5CEAB68076B2C6D78D5D9 % 89E959FE96DC9ABFE13629E67D54C4A1B9199BEA3601B9D977B0D74B43BFD1DB % 7FB6EFE47A2AD619E28815F9316486422AA8741178FC2A1D8C0E5E53DE5F6383 % 7F492DB1D3F4767A7BB62D7CEFD99574AC2A32697DADBF7FDA5CDB87A8CAD8E1 % 8FE8E39B9B5D76DF6FDA5CFB3D4B6AA6AABFE16C5BBD12AE9991655563E3E466 % 565C19F6A35B4540BBDAEB3DCFF57D26CFEE2E33EB4F561922B6FA5B1A379C0A % BE8FA55FABFE135B7ED19190CAAAFB4BFD6B3D6B595D389FA2AFF4ADE672C741 % 0DEC52DC6271167524D01FCBFAAFAEFD55EA87ABFD5DC0CF738D96DB486DEF23 % 693757FA0C9F60FF00BB15DAB55711FE2872326DFAAF757907F98CCB5958F06B % 9B4E4B9BFF006EE45ABB75036D4924924A7FFFD4F5558DF5BDF6D7F56F3ADA49 % 6BEA636D2F01C4B5B5BD965B6B3D27D36FA9556C7D95FA76D6FDEB6557EA1875 % 67E064E0DD22ACBA5F45846876D8D756E8FECB920A7C9EEA6ACA38EE3906D662 % D4CB5F75EDF4FDD73836D77A34BBDAFF006EC7596FBFD8B9FBDAD63ADBECA9E6 % BAEE7578F5B8B29AC1ECED9EEB2DDCBB1A73AA181D3F1AFE97567754CE0FC67D % 15B8627A2CC670AF2AA7DF93BB7E6E265BF7FA0CF57F55F52FBBF43E9AC7B7A1 % 0A3AADE3A9EF7673CB9D8E5CC1B5CD0760FB3501D67B9D5ED77D3FE5AB98720E % 2E1EDDDA99B1CB8788F5EDFCA2D06750EAD7DADA2BDAC635BEE0E240D7F77D3D % BB96DF4EB5F80D6E665DB2FA3FA3B48343371FF876BFD472BB8FD1FA87A6D751 % 8CD6318D906DF7DA5C78F6FB58CFEA6E552EFAB5998E0E6752C865CEB6093686 % B4B5AEF6B5B4D13F9AAC4CE396FA9FDE916B43DC8EDE91FBB10A1D6BAE751C81 % 5636539A376E7D8DCB018C6F01B4D3634AE9B05BD4322E6E4BBA8E7166303EF6 % 369B19FCADDEDF771FB8B98FB25188064DD6597D6E3B69A890DAE7FE118D1B95 % DBE9C9C8A98DC9CDAB171DBEEB035E71E96B40ED57D3B1CA0963801A533C72CC % CB5B010F59C56E3D95E2F4ECEA9D80E712CC5EA356512D2E3B8D2D6D1558FEA1 % 539CE73EBB2EFD255FCDDD7DDFA351E9FD2F1307A6754CDEA783FB50E316E4D3 % 82C16E26234B22A3E85777E8D8E731CFB3F494FAD91FCDD14BEC57F13AEF4AC2 % C607A6D2FCDA1CE0D2E61735D69F065D99B1EDABFA8A97D64CEEB228FB65B7D6 % DC5DE0D75BDBB6BC279DD6578D663D363AAC8B7F47EAE1755B3FED47A95FEA17 % 7A75AA73C631DCA313E619C480B908EA770373E6D6EA9D5B2998EEC379AFA763 % 3C7E93030B7B5CFD1D355F6B36E5DBB98FD8FF0052EC7FFC28B98C8B85A1F940 % 9194EC8D9556D7EFA68A7D36D755BE87B76BFF0048FF0041BBBF45E97A5E9A06 % 4D97D871AEF42F73322C2DC7810EBDE0ECDB5D7B9EE6B77FE6318AE61747B71B % 09FD43A8BEBC375B3914D17822D35CBB1DD9505BE937D5BACF4B11B77E93F476 % 5D4D1E9FE99478ACCAE66FCD18C4F52753AD7689FEAC5F48FF0014B5399F56F2 % 2D8229BF32C763B9D12EAD95D18BBFFCFC7B176CB17EA6F4B7F49FAAFD3B06D0 % E6DCDA459736CFA4DB2E2ECABEB3FF001575CFAD6D2909B24B30D8292492412F % FFD5F5549249253E7FF59FA2BA8EB36D54322BEA85B97845D5B1F43336B0E666 % 36E6E8EAA9C8A1FF006AB1FF00E9BED19DFF0068D71BD3BAFF0059E997BF1ABC % DBFA6D588F7369C41B6EDAE2FDB94CBB0DFBE86FA567A9B6B6FD9FD25ECDD57A % 5E3F54C3762DC5D59FA555F512CB6A7C1636EA2D6FBEBB36BDECFE5D6FB2AB3F % 45658BC83AF62752C0CDFB0756B6F168975D9CFDF683496B68B3305EDFD25DED % AF1EADF657FAAFF84FD37F3CD98BA901AEC4FF00D12C538906E3609D3FDF76F1 % FEB7579F9197D3B2E8CAEA179B3ED347D8E9DAD732B6EEDB9955C5DE87BB657E % BD3EA63FBEAB6DF47F49BF732EDE91D3F16EEA8CC68CE636B376156F66EA6B2E % 6B2FC9B6CC6AAFB594E356FF005AFB3659FF004D79C63F4FCDF4DBD5F019916B % 6A314D992E360158DD53AEAE9A19FA6F4B73FDDBBD3FF825D1F40FACAFE9186F % C3A319F9E64D6E360FB33741EE6B31EB190CBB9FF0FE9A9E10C9C3E202B8A028 % 4883D24D8CFC8C7AADAF26CCA63A9B9C7D0C5E9CDF5CD8D9735B7DD9DBF73B7E % DFCC585D7F21DD41CE755EAE3328FE75D75D1BDDE544D97B96F7526331B0307A % 93BA3E253EAD8EA48B6B326297E4D57D7F637E135DBFECF7FDA7FC1FF33F6654 % 3A7750AF39AD03A636BA32ED34E26563D37D4031822FCADB6372B0B231FD7FD5 % BFE50FB431FF00E0D18E500F0CAEC782D30B97A2B6E2FA3CD60559AF2E79B5CF % B1876B0D9EF0D1FF00042C236FF9AB77173B330996578D8B45965B5BA9393635 % CE7FE91A6BB5B8D5D1B37BFD377F38F7A2751A5D4877D9F19F4575CD6FA4B4B9 % FBBFD23DCCB2AA68639DFE95DEA2A1665518321FB32B318C00D4C6B9DB77F6B2 % DDEFAA9FEDFF00EC3298CA128D57F6B1819233BBEBA7F55B7D331B2BA7E47DA9 % D96F7E4DB532B69F49AEB98D67E869A6BB1AF7ECF53F3B66CF5BFC3AB9D23A4D % 3D73EB0E1F4BC661FD8D82FF00B5E550C0CFB392DF73BD59AF6E6BB3733F47F4 % 28C5A71BEDB8DD3EAB31FF004EB0DB89D4FAC64D54301C8B321C594E2E382CAB % DA36DAEB2C77E652D3B2D7B99FABB3F9CAFF004F532CF5DFAAFF0056707EAEF4 % FF00B3E3B41C8BA1F9778E6CB23B6EF7368ABE863D5F98CFF497D975D6D69803 % 402BC1B10DBC3F96CECA492498BD4924924A7FFFD6F5549249252952EA9D2713 % AAE31A32439AE1269BEB3B6DA9C46DF571EDFF0006FF00FC0EDAFF00437B2DA6 % CB2B5752494F997D6BE8DF5C7A66396E2DCEBBA73A03ECC16BAAF4F46FDA6FBF % A762EC7DBEB3C7ADEA3B272E967A6FFD16262DDE9ACCE85D7BA735CCF4AAC7AE % F757635D9F5D0E70F5D83FA6578D3E93EF636CAAEBB1BF9A7BFF0098F4D7B02C % AEABF55BEAF75871B3A8605375CE2D27200F4EEF6FD0FD6A8F4F23DB1FE95189 % A24EBAF62B4C7EBFDEF57FD27C67AA5DD5E8C99CBB5F55F631AE75D90F739EE6 % 387A83D3B7F3E9B367F38FB3DFB3F9AFF06A855D63A97DA19958F66497B8906C % A8BE96991B36D6FA9DEDFF0037DEBD6F23FC58740BEFF546466D4D6886542E16 % 359F4B5ADF975E4DEDDAE7EEFE79059FE2A3A00205D9BD4322A9F7D365CC0C7C % F6B7D1A29B5DC7FA451FB601D18FDAA363F3D5F361F597AC0AAAFB5E6D8EAEB6 % 6D6E27AA58CB23F372F65953EDC777F85DBFA7C9FF00C11747D1BEABE5F5CD8F % C4C72709E5B65B9F91BA8C7B090DDDF67C46B6ACDC8AAA63FF0045FA4A2AC8FC % FCCA7FC27A074AFA97F557A4383F03A6D2CB1AFF005196D80DD635C349AAFC93 % 75B57FD6DEB6D3E371BA3BB208F7F579B95D03EAEE0F43C7D94FE9B25E22ECA7 % B5A1EE03E8D4C6D6D65746355FE031286B28ABFE37D5B2CD5492497292492494 % A49249253FFFD9003842494D0421000000000079000000010100000018004100 % 64006F00620065002000500068006F0074006F00730068006F00700020004500 % 6C0065006D0065006E007400730000001C00410064006F006200650020005000 % 68006F0074006F00730068006F007000200045006C0065006D0065006E007400 % 7300200032002E003000000001003842494D042200000000012E4D4D002A0000 % 00080007011200030000000100010000011A00050000000100000062011B0005 % 000000010000006A012800030000000100020000013100020000001D00000072 % 01320002000000140000008F8769000400000001000000A4000000D000000048 % 00000001000000480000000141646F62652050686F746F73686F7020456C656D % 656E747320322E3000323030363A31303A30392032323A31303A313900000003 % A001000300000001FFFF0000A00200040000000100000156A003000400000001 % 000001830000000000000006010300030000000100060000011A000500000001 % 0000011E011B0005000000010000012601280003000000010002000002010004 % 000000010000012E020200040000000100000000000000000000004800000001 % 00000048000000013842494D03FD0000000000070000000000000000 %EndPhotoshop %begin_xml_code /pdfmark where {pop true} {false} ifelse /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 ge } {false} ifelse and not {userdict /pdfmark /cleartomark load put} if [/NamespacePush pdfmark [/_objdef {photoshop_metadata_stream} /type /stream /OBJ pdfmark /MetadataString 5038 string def % exact length of metadata /TempString 100 string def /ConsumeMetadata { currentfile TempString readline pop pop currentfile MetadataString readstring pop pop } bind def ConsumeMetadata %begin_xml_packet: 5038 <?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CR"?>
+<x:xapmeta xmlns:x='adobe:ns:meta/' x:xaptk='XMP toolkit 2.8.2-33, framework 1.5'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description about='uuid:191a6b3d-5975-11db-aa93-dc897f9dfcbe'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <!-- pdf:Creator is aliased -->
+ </rdf:Description>
+
+ <rdf:Description about='uuid:191a6b3d-5975-11db-aa93-dc897f9dfcbe'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'>
+ <xap:CreatorTool>Adobe Photoshop Elements for Macintosh, version 2.0</xap:CreatorTool>
+ </rdf:Description>
+
+ <rdf:Description about='uuid:191a6b3d-5975-11db-aa93-dc897f9dfcbe'
+ xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'>
+ <xapMM:DocumentID>adobe:docid:photoshop:191a6b3b-5975-11db-aa93-dc897f9dfcbe</xapMM:DocumentID>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xapmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end='w'?> %end_xml_packet [{photoshop_metadata_stream} 2 dict begin /Type /Metadata def /Subtype /XML def currentdict end /PUT pdfmark [{photoshop_metadata_stream} MetadataString /PUT pdfmark [/_objdef {nextImage} /NI pdfmark %end_xml_code gsave % EPS gsave /hascolor /deviceinfo where {pop deviceinfo /Colors known {deviceinfo /Colors get exec 1 gt} {false} ifelse} {/statusdict where {pop statusdict /processcolors known {statusdict /processcolors get exec 1 gt} {false} ifelse} {false} ifelse} ifelse def 40 dict begin /_image systemdict /image get def /_setgray systemdict /setgray get def /_currentgray systemdict /currentgray get def /_settransfer systemdict /settransfer get def /_currenttransfer systemdict /currenttransfer get def /blank 0 _currenttransfer exec 1 _currenttransfer exec eq def /negative blank {0 _currenttransfer exec 0.5 lt} {0 _currenttransfer exec 1 _currenttransfer exec gt} ifelse def /inverted? negative def /level2 systemdict /languagelevel known {languagelevel 2 ge} {false} ifelse def /level3 systemdict /languagelevel known {languagelevel 3 ge} {false} ifelse def level2 {/band 0 def} {/band 5 def} ifelse gsave % Image Header gsave /rows 387 def /cols 342 def 342 387 scale level2 { /DeviceRGB setcolorspace currentdict /PhotoshopDuotoneColorSpace undef currentdict /PhotoshopDuotoneAltColorSpace undef } if /beginimage level2 {/image load def} {{pop .9 setgray 0 0 moveto 0 1 lineto 1 1 lineto 1 0 lineto fill 0 setgray 0 1 translate 1 cols div 1 rows div scale /ratio {cols 400 div mul} def /Helvetica findfont 15 ratio scalefont setfont 5 ratio -20 ratio moveto (Mit JPEG komprimierte Bilder ben\232tigen PostScript Level 2) show /x 128 string def {currentfile x readline {} {pop exit} ifelse (~>) search {pop pop pop exit} {pop} ifelse } loop } def} ifelse 12 dict begin /ImageType 1 def /Width cols def /Height rows def /ImageMatrix [cols 0 0 rows neg 0 rows] def /BitsPerComponent 8 def /Decode [0 1 0 1 0 1] def /DataSource currentfile /ASCII85Decode filter /DCTDecode filter def currentdict end %%BeginBinary: 21006 beginimage s4IA0!"_al8O`[\!W`9l!([(is6]js6"FnCAH67k!!!!"s4[O,!"obO%M0*b&.fQt
+'+km!,8q:3)C$FB(Ddl(+qY4l$k*OQ&I]'V$k*OQ$k*OQ$k*OQ$k*OQ$k*OQ$k*OQ
+$iq%U',DH$)]';0'FkT_'GM#e%Ls0b$k*OQ$kX'[$k*OQ$kWmV$k*OQ$k*OQ$k*OQ
+$k*OQ$k*OQ$k*OQ$k30O!"fJ;K)o!T!?qLF&HMtG!WUsU"995;_uW(&!!*6(!<E3%
+!<<*"z!rr?'"9eu7#RLhG!<<-(!<E3%!<E0#z!!*'$!sAc3#7(VC$P3:="9AT+"9J`3
+"pbA7$o7na!YGM;+VHL55uD&(,&r/h"r*2nYsKZ\'iMkW1Gj-(d6e-bP#Ll/nRHVt
+(8A*e-:F%sA4=A1F>ar`<T7T\Z\66FFlW'_-^:E\[$ASZjRf:V`RX)C<b?N0QDV+1
+f&lZb7os>ILR4pJa4KMK&HDk6!<NB,!sAc3#6tG:2$![Y&Ha12&d1Kt@<!J)"YtXk
+'VVcu,Jd:*n1u>!iGsO56W4_0F#<D5"r<r=K*N_\_U:i9<217?79)6fA`E9eKYu8]
+j7>a)UkQ1@`73l?V7":mjn2YdG(u<[[`6n\p*Vdh=(c`4Q`%=5s4RG]!s&B'&H`UF
+561*a8L0OrP"?rK,a(_k8L0HsP"?p`Uln!cbf.N(eB51`Za"cbPP_H]!(`9:Uq-C%
+\TBmHKoa"J/Vj?+G(.`:46tH-kcZ&J2mI@<:\g"CP#Ko,\Nfo[MLY"LrrC=dq%[Rk
+F6Q*4bD2\?J)>09:ILAbYNo7XHY(ftc\%V\rrBj&CD;i\IZ(S!?>Mj;elb64-$?I=
+3sdGcrFX(m%!jJ5`t00<%Ga7Zl2@@&r!@.J4"^,ljL)D+g:"H5M];Q&>Q,8mppMHD
+kp2Ea;Fr-sP`i)<JOXcGS^IeoQ8_=<rq127DL)*!dOd)#9pSaSZI7cEBDsWR*j;C>
+!;JW?n3iN8M(^o&et0A^o>/>hN;iml<lF1eDd4BScgq31I1[dfepVB#jQU>jBGIlR
+!(L%!UN^#0[lCqO<eL=*)Me-UrfTm%?-[4h>iGiNP"pN-K&""?&D#Z?,esH*,a82'
+j:6?-Y2&U2'A^U=ri$s9=:]nE8ptt2_"=e5R=bK!fgk4+j6cjHXh4K9qYlN*fQ@+p
+LRo]fD7"%mG)uXKqG6eW&lX'$P"A8;,a)&g8L0OrP"?rK,a(_ps3U0H8L0OrP"?rK
+,a(_k8L0HsOsC&U5S15ABZ6\@)%RJ2=I6_V!5.L\#M-PJU0Wb79c.&dg<59L2ssWE
+!!3*"DuTgRV)uA7l^^#Sf_mUCpM(^oetsPa+8_77rW3$!*k4>&XK:09fbQX7?-AaN
+q^qcd-rj3IE!).9Xc:g)e"')$8PXDQcTM4-X=Hu]Z]1hSfPWB]%3.q6IWLX[J0lM&
+!762T^Zn]qOPZU<j-43KiW+s.Lu\EpX[OnPgKRC-QSj<*:[GO1X-IdEV0Hg\;Bec8
+4%]E=X/jd[o28MF=%f<-%t:(qDr12i/t^Sj@i4Rg#MepG)[H,gr]`ZgCP21!DK+3@
+p/h7o8)ItUrf(]uN+53ld+5ZkeqaG*/P/Yf%[fd*6_HX2p.#el[=7,JP"@)o,a(bt
+8L0I`RI"G;=S@M)_Aq/6"Fhl':6J4g1Oc?GqoNs`j#tCQDn<^\A`*>:eWG(+:8LpY
+?!YA>5^(c"rHYNITD%jCP"AH@=jXaf0^%IVgr@UIEW6"Mq\;aXnu*M2U<:B`hT%He
+rH>A>8L6PspCZ.e\M:dj!!gbp?=ujoq5n^VV5;K;!!pu\ao1[2T)Sfh(:`5)ohR@_
+FgtuCco'NASnS+'D>o%aZi:#AerlI1Z*&Yh#PWS-BeF1Rf]!n!#]MI`C&H#"22p9p
+e#^F"7R/'r6[h'/;H)6?cG-Dnbs"k:rr@@0oY:@>rg@k9JcQ'Ae.B:QHUD11Sfdcc
+fBE0Fgh<kMCr\T!hQQ$>]DN3;&,OqCp'E.tD0FLb.r]hT-*A4&,a>*f8L5f2P"A8;
+,a)++dI%W=,a>*f8L5f2P"A8GZhfD0:W7KX;ta8J!;u#ir<d7OkM#q9p&,eHUXV$0
+FsHR`>mtV$IWO:nKf(gf,4_nCeoJ@9;7ber[`G>-I?cbk!(L5n!:\V?!/1@PMY*pN
+.48BdfmR3&Gr=Wdrec5SXoABSZi)K@N]o8$1YGP?&D21g7]l#N<gWkS7\lY%P_TbZ
+5_eup!Ge.Y=:Jb-U1B@.F+:3H8/8Loht(L9J'D2B*@ojuEkirK$FSSHHf"(Un'?L_
+Y4WE+T81kc1Cj0YL5dA(mVr1+JT(OHrrCB'DP!'@l"g]1o;%`POQlSuV>gPCC?eA>
+5R)`=J2@7F!_FZ#P`eT`V'M3q.7keJ8lA5+P*D,$,c)cL8L[4VP"JVD,a+Z-\+O5I
+W.T4)O-cgu!Z>E1n(&?%r;QcpkP@tWH1k8k?Vea"j=o1qHQEIm!(gPo9%U9s*ET%G
+F\HjO6Xdl9m2o*0r1E&"Uo>Y(AWMoo6XG6WX]:!^"-XXN(,o1V\U>tZds0nR4FJ$T
+r?Z-EH#bg7HV$e);:><3\1S4<I0]#g0cL&l3DT&4^\Rd,!!TF-WnQmC[aa7/4A/oq
+T2b=Y";B]NP#fn&c8[H1pJ*f2\YIsjrr>[Kr>:]hXX),3?I8BWk-tK@3$A/9-V6p%
+,a)&g8L0Q#!<:L8&kO@5Uln:q.0h@R*tKCf)%RJ4=I2#I!7\LRBWcD[dcV1mZq2W1
+!+'+,UT_;0AU60mN%,/+a8/kc+148HqeuK7#QFcBP+#ZtX^lR%^K'jI=f!uNN,S07
+a'8NZrr>orR/#e(&i;]S)C[=]SK%B*jrFSeg.W#"P*t@j(H;C'1i)(G^Ugi-<lU4/
+=r[S'giVBJN^^+Zd(uAc8XE6L]k__[&,TFIP4Q8nTDCMF(4Xn"i;WdJP*tsVQg"FR
+Oo`8M[ARA&IV8V+rr>33Jm-8AP*D,$,c)cL8L[4VP"JVD,a+CT8L1,XP"@)o,a(bt
+8L0I`P"?pq,a(_J8L0HkB_>\uNR]ahO*K9FllSj/rrAj-qYlV&7o7%El'[UP]PW!T
+,NuhUR;G_!!(QYJWt4MT6YBE9-FWoa5VAnj^&.T.rrA&Y!7/FQe<KHI),mr=`iEA"
+$O"J5"2:h"A)C"LJdY73*=e!C*qJI$gs8$WVlT$0<Rk8-/tYSp.WPC,TC?dtcVo&d
+]DhjJ\qRp$#R3OARHO0jO7ba0Rd.I;:cUA$D)6<%PKVYT[X5^ecg[S"^\!@3eO_$L
+;NaTsPlCa`e*[i?,a>*f<;NLhX/=fZQY*t!p,6E/LYGNfgOK3e8P_/8f<-$mrKWE,
+ZG6rCLZ[0:L,]'\q9+9G5NC?%<G'9ADWO%UgQR!Q\]+9rio`;qF-ZYq)B'l9FX\cE
+M*N"RC"[E4;n$n0L:fcZ3_/bSb(_KZd1?h&r6VjN%XYXn:e5A+TT_UPqBV<^_Sg>(
+7(QZb<j"()=RXJ1TC>)2reY_f31.t1TsZgW206C?a6C:YaXKe,P"JVD,a+CT8L1,X
+P"@)o,a(bt8L0I`P"?pq,a(_J8L0Hk;Fr-sP`eT`V'M3q.7keJ8pogfY=KM@NR+T/
+:0BcV%3'Qd5Q:^m^RbB)N;GrX_7sK<B:]p<p&:ODLIoS-!c/>'<!babJ#'3JrrA&X
+A,a'PNK,T0+XK98*L\gs;:p/r9M=83^M"00BcC5tOnnBb_8`crBa9J-<h;,'CPX?5
+,Q=%Wp*?QKU?_3HQW@[Y&e9]rV+kCj4H62iXu[YG,g8@J/URKtn5&q$DBu&(P"@,&
+eF!r@,a>.grr?C%RC=Z[SAX]d$S<DX]RG^PorN@em)neRp9BX)bVc'(a1r4,Q]("f
+5;OqYX$2fpF3*k+IC9(Tf)C7n<[D(KP'A(6CZE?;[SNb#T,5-<IkafqoMcbS:c/0X
+^5CIZVpiV#:O<<;ia["$FE$c==se')P965X5P0l.l'TB>ggKtDkVW#qg%8MI9,;+b
+<CFD!Ol0$tqOd*R!3#3f]d86>9lSR,/gKQDrrD8iPhntWP#@H7,a>*f8L5f3$Z2o4
+h/1IQf"itcNn1Re.F)0O>Pd_uS$Dfhf3Y0(,^\AI!/7Ito,mM2I\6W?$`']%l<SJ.
+oZ$m<E#(j!>OSuWorlU>!3Z0@Y"(_Bk#9B>%5"Eh$S;6&T@[jA[+G<XZO;mZXk":J
+QbDNdiae8N\%,YB%S5B(.4Mq0!3BIE+krWS@.IauL\[>:P80%*Zdn@brr?f@Oo*E^
+&+_F1`EAGV_?#03P,9/M"eZLg"2dq"Uo13Vhc]Lq1GOL$TC@hp]RO,"k+DYRJM*OP
+l,]f-9>g(>">;g;%GO-4FE4a-3fT[orTuC,JR^oiU[sncDs7m5gaLieFYMKaK,EEL
+k7H4*lTOQtl[N1ha)@a%5e>PVDK$f2kP$KMa4kh;#@IBYiNi(HZgIE@Y'nXI2]lgJ
+r=sh,e,KDP8Pc>?oo#PBmB=]A5KMYorr>8(QE`S[=F)j-%;o*15J.uPrdE"mMot@^
+qG*XtDRs'Upct(.qTW)?F#VQXD.afT6^p<k@[clQ*H_i-<o[E)k6&*#r5H@urj:e<
+"*/q5@/SpbD#XL1qBtY0!*bUbfqb\-k@3RT^E):\oUEbQrr<p?Y`b668L1,XP"@)o
+,a(btnXcXGEVbu$%/L]E@iPAI^$T;&A`N`7qtel`i\.NMr0KIZqr14\MY<!LpW3m3
+gJt_D1nCcjp?<Ujr^+E$9FGLDCjk\T5l5?(`h(U@rf^ZOSSG9M40,jr9kSQ)O*7"`
+>Q4],r87AIMm-uck(be:>U0p:'udTBm;CslTT.B-&)D#f;pt$iK34Nm)a4;;c$njN
++&+%?&kO@5rrE)LmLi):PidC'^X224YOSQtrn[NWrr>PB,&!;Di`E2ZCMA"Cr3-<k
+@JL9[F-i-C)r!JI8p*B(d'&O&H\_9DRbY=9/p0l9g<Wi!a6*77<Gi8SQc*fNB7Lps
+W3<Rp;uK4=nik!Vlsgg`da@]1rcbliQW&K>lq5Gh#k=HuoUkd-,E2+B+Eo'?eioR)
+6.'_?juX9e3UE*@5BZ/=rr>91^[P3elQhWb.7keJ8lDY<HBopQ`cb*Up+U1,21+0T
+[*m:HZi+_=)@os9(qh:2hg+#O8?/>2p:p?+qj"Mc2;d?,j#nlno%p@r1:j>[aN-F3
+`XehKJ'h5YRltQQ#&dSPoS:o8Bq"7"p:'j@J#9jW'E6_XepSC][#Hn2`kukXkD^Zo
+C=SBP2g0^j&lW,,E7+'(iSoeHGp09_K?KuprIoBY!NUbiGNOB>J+XM.)?C`^M"*0^
+RVedr]6!)RFJ!TC6.eG9#IN^r==r=u!62VJ6;<FX#19@-qoL9+8H=r89Fpuc3C_Ua
+`p9;KH[em(3MO7)+pj!s\<dfjTLhm_nBHuUa!e(/AO&XVO2YFm)L(5fpQ3K!9aj<P
+1mGpXd0.:F5M'qF$$['j7dY]UW>COc'(8!tb>0k`rr?+GV-+u]alN1l>BJIgq/Q;2
+S3`</jR]@u+A!JFrrB7k,c8gfgI'_,/hD'g/^bmBJ(DA3FWDjq"*+KYbQ>CId_Vbu
+,PV3<d(fS\!ri7YrbZZ6_gsGpriU8tABq*72#dQjI5I2b6;*L+]l)V"[,c,1NX,%&
+5;R6HfDbgQrr?p9!2<b)<nDJ2ZDRr4g4p.N;^@Mt,q1+)>lLRRe#E#Gm1m,%7kT)c
+g1kQ?`0A<Boa:P="ke&bo\8_Hr;.#5R_Q=@n\SQ*P'(i)PN#3eqSDiVrip\J)R1b>
+d].G^qiR$@!"Jr.Sj2VsDU67pcZjPZ&lW0pH;(8eKQBHYW:t15^lq^40a4`C?en[1
+@"$dbd&YmXjZEAqcspO?R0Rf%hoF7@,c=EP2e[9@r:P0Ok<JU2lftX>U`%4%Z:i;(
+2V,G*7Y]K!5]``A2[.TNTKOe6$/Yl:*&bQH8oLMg8La\jmLi):Ph47$qd(%-2LsUf
+fEpIP[EN.\!3j+Ec#Xq0i*,91E'/_9P?55s2u;^bh2.YCWZS;'P$Jaf^ZeqRJ)QIQ
++85^7qBV<f<>O*2$oiU&HlNn!4'M2fg)`/^7.'tTr=tBIH"l!>1ssSE:k.$;.DEus
+e$Ks5Gn)rb+3\IWG.t76@4cV@>2c8LUru,m8Kk8;HsQ_ikG7k)!3D_dUjNeRdGk+@
+$iud(mYsA%aP?7Md-oB^!60JWrj9%:oqS5sJoWa_q5'.7rr?oep+?s%#MnFqq5TLW
+nrfV75?^)Zk9thJBE"#mZG*sCH:*BQb_L^lm;Bq-q4""*b8AS%ci%^"B-$&IW^E\t
+jE^Jk8G\BEbNa@jaiS_h]10/U(,th6V4Zu)rrB#Lr?<j0$_?]0:LLBaoX_jS=f>NS
+ZF2Z5?o+[Pfl,;181DL1Tng7qC].gP25#rU:F,r?e1$_>VAD51o'XQi[PRh-^[(_b
+QZdMI`EG*;pM+@8p7P,&a9MH]2Tto?1SEq,8XWLpeW4L:Up)km^5i0;=O5(@G<OfZ
+LOeFb!.AUkKZC]9mrtSc:<M56A,!`0lpqaaa:]ktNjE_AP$glX,?KBP=oSJo':th;
+`iUfpQOdd0!2QgW;f.QO#q*?V9>B[LfW++Co`oU]>.6ED(]`4IoQ:$bVuDZ>l_%&j
+e]rSSY1aq%7iQf)>@ULrWO0!Yg0R7G+A=;PA*;SENF?=E)^,FBQ]iY@8-AUC:B2Ge
+@Bn=mYNci^JGSu$FPG`GoM7]FE!NUde,J-;Z[YYo'*(OQ6a$scDn%/'E@X`D2FD@F
+of(F+S!hp5miU9[-nZ#=%VUrR3,1\'C:a818<iIN)":`3c4`qth/LQm3R4ni8=8C9
+gL2iJ4p->Ch2@2$F_i-8k^W.252Mh'c_PcG%NM5u+co51/UJG3Fn&CIU]V1[*m6ch
+R-8K6Ck<1.<aIlP-md=PeBbXb_-"\AR92@cWRF(+LZghrm/I&i(2GI7C"@Nmrr@I=
+c44`fcek]n:K65SSNKp^eCrOKCGrhTgQ/Y$r:[-pp%KK)oQZC@r_p^!l>*qNQ<1[a
+pS%PLM<*n-.Fu`>n($hF.G9YEH&^VZ!;#[PJ+,MN4a#F<<h"#Sm]kQ\jLNuo/aE,L
+BT4:3qGgT>O??+aUo',2K^/R;\Qm[?e#7_\iWk)@n#<SC)>'C'6+HF:rrBg.eOX,!
+$`nH:3:j&[o9*$%C4P#Q1.I_(mQ[5F<6oVf2&/TRIX1d'9KnO^\2FmEhn/l+pdK*B
+])ZVl/s8VCP+=^Y288Ar%"/med\!B$0u*&R%<$@^(?.$8h#@A",Ihsh?VCA'do^is
+k3L[U^Ihc*)%g6H)>*q/od/q$j$8clP"?pss4?ZO8L0Or%*V="EM&5Ph=XkmNrK+$
+HU!h7FHTS`rEl8[FGuco)l[g@Q)!QV^WQQV7sFf%cmc^r*PmS=[ul_@9eN16$S$CV
+29Ua?+&k!D-Jk@Re&efk.mNd'rjV`Bpb\5s1$s5Uf1AkeV#;E]j,`'n.Ze`:4*Y^*
+K@lqVnhi*f8kR@siP;'ML?BaAYoj#mTG-916G5;ER0;e8f@mE;i]579E7tTFVFNjB
+cUgfGUm=9mBP4gQq&e!q?k@HoM37f<7EWSc&iL"8LCa5FP<Z8M[AruS;a6g:dPPV"
+48oil!8C'Jd[^$_=nar%O@R6<iu"HEg1^T-[[T>t%eKUj:5ZeNrk!3KOdl\&5jZn?
+rkfJ`DOloT>>6u@8/n[TdWb@\NQCAK$[@O-W,(4,?:f:#!MJtpTDNJ_PHfd8NdHhQ
+Ml3VL$6-S):Rd6:QV.GDE8!8P8hnB2D>#(33;E8dh7Q0DpRS@NVE66/_>E&0a,^LK
+@iJ]"UlNW&(SnXZ4er60J,tVQh(iVHbQH=sTGtq\Q$Wni^#,Zbm<?tub&N8hL]$h:
+nbJ1=48t+MoucQ6DD`@+FcHnQk#L^q-S/c0Q:T*i+q?d1jO9HWhc@`$=?pY.G.#*C
+fZg&0=dbgY`ee910C^Z7rrB'>[pe1,^;0&OEI5npguGqEWs+dL2XC(o>CXK7htu`i
+E-9u'@*FfZ_pPi;]r\6-O_&e]^j;Ig=DRoLm.Pqe924h^W`n(i)A0!m]Cn+j#97s;
+-eoR.=F[GKkgnT:r@cWN@j3aFcHlFcYtZ*\ZCV`;3=a*7o&dH:paW.CrLrcu:,-Ok
+O]u7l_h:*t2,I_QjX?T1K9X7H[n(V6j>kJd^#Be(0s/LDm=tD;9_[T\>1XdK3070k
+6VZ-XVqpb^4i//C*]7T?Fs!6Uj&Yl\]17*t'rn?NN(/VB!Y`R>dDm"c^-Pl$i?S;6
+<I6A7]*BDFc6)fBQ$!kh5pJb5*%9$%A.f'Y$oI;<NBB.KC(T7^X34.DR+&P,Wn$"[
+h7Jqe=^W?m5M,X.=#4\F+i2HIhiBMjPp"X9@=XO^VhHV@!Tu`gEpriQXbQ&ZmJZ4[
+TBmi"f[I2gcY/mpqapM`dKDBd6](Y7eMA.[LDuf+0g)L2a!:k>%j^bf50`!]XX,WW
+89!&k-U9tXJ$u`<)X"Q/iQl\,%6At4rBKuIrr>`X'jBcUS7[OY20WHSj]qJlJ^^X;
+AGnS\LHPS:e5uXaV#LG'rA:=;=MJIOgiqKI06]O-@s<B35P1eei>%T?8P2Q"P#MD-
+mLi):PbaI6,q1+&8PL3(O43^@lP0q/[B9/T5O4s#5O6%Xjn!quj]:C=3sEkk1#Jb1
+C\2g4oJV3W/%/"q5%ORbbW>g=VcN&5\/7H[J'bP$[^Bd1S$\1#Im*n8+7&q,UDIh+
+daB->UhUDPr2%Hs>g1EI@s%"T=S!;2>BZKlrQW+8J+[h:M'Wdr!<BZkYdLWs:7u;'
+kl,N"HUbK=<L`hMgB4/ZJF*P*P4W`p-V\6O>6VP^kqr>GkP[LB!'U>^n1,k>-=1T7
+^"2olJpfBR!*T;8$-jdD4\Gp.hramh9,jf$]Fd&aCYANBr?I68iGJR*Lq!'O<l/RR
+\q&g_fRNNd(GfZHAk7l,MeX?)&E!*YJgN]XZQi]34u.P]q['$Vrr>kGe9*VZq9jJu
+DFS8@B'b;'",I),6#ZE2p[l+!49.b)hFaVup)HPV1#&8\_REf(^<OLk>,;4Q`fBJX
+3#M=q&dFeiQ(QU\q5XtZBl&RW5<Sr,?c`6Ic\kEI<JO/T,/RR%=ugm.!(U5S+&9u7
+#B&]@#6*g6g;Oh1SZQGf1"4T#+L^SEpaV?>DPY-M]']Q`:u^AJV=&l."1nPoF%JRC
+/s)lL#nRH)fgC!6,.7UA1$4LQd<B9P8pW6gd@Cj+AUJA!<di2#QD-6B)`gp,:0kB-
+FZ):qlCC0,^ZO%Ic`5FZD#GrgjmU^#5IA#<"X[L*\dk]YSu\kk7$cr&G7SgkfLKAC
+5LsT'_g?F/RqJt8kk<)Zn*7Gkb8`g#.n:RU)_S3*isES7/%EA/7CF:(Y0nP2p.TJA
+-,Z!Cm%6T@X"qunSj0LZNGIH_;3\k"fftRtiKD&;5o(Hoc)0]a4;OjJCU4f)p2>\P
+#5NeP?.67`ASm(U(94I<P(%)cJilsKOF/)g-Pir8APX3]23[GAoR/srW"`M!3HTOP
+(7NFJ#=l;7UVl]:4eG#Of@$kEb'Pi^l39)[BIs]'+6_AOHFNnSf"G9e9Wb<3?+4Lr
+6,KoWg^F;=2#dQOY$c?HU?2G*oS1*G4duBN`W#p$rr@U%]O$-.&H&Rl7rhe\[CgA0
+^"]XArr?j\V[8td=%a!_49k\QJ$RDU>?JQSa8<0&_>Ak#T>ocbqF[df!5X0N94Eip
+1#'.&"q;m`VE]M/!)CI3Perl(Tq7fL$u"uiIsKqcVNOM"8L0Hk;Fr-sTE!=,&kO@5
+Uln:q.3t'J8kC=52^-[Llk=1,XEjgF!;7%(S(7)r\c2Y;a7&s'a+sL5r@@mJD62OJ
+f(>tXWueQ`YS(aSEGJeXN=t%E:7_hu*KbV3U`b1Hrc[U7rrAeD4KSF#RI>?n>D*bJ
+P!@n\*VrS/Dph6V!-!Sa0p4JXnu"M$/pd\h$$3M*kPOP(f_7I/Jn0kgfIOGn;aUX:
+!Nd8cTo-FI>6/4CFWP@@%6piiieelN$Qoo2*IgZ3aEBaB4_#PTWIo#8(aJh^!SFcb
+*9fWf<Vn1SI4CapEbE/U,3*+@E"H?'9!nZ5A\!\5H'$)g-#&._`fG3`"<-g3gU4/;
+G8I*c]7#E4j8]U.-J7"2p=s^^Uk>^Rh6-_MY&c641D\qE6ZkGp_#%FSFQ6CZ&$Uk$
+D(]pT1i?Q`h+@Q?_0aqFMTPL+nGM0Dmeum[\Hq#W6d]r=Z]enShHGKDmlgbSbdHQn
+2?KcSm1Mhb'OWU#Xa@K7G:\YhF51oc*p2NekQ$^$:JA-Ted\<8!&nJF&Je#6N,uK3
+WO\q=<m:]7L>B/;f8iXpQ6^&"UH\tnO9!cS*MpQZ\ufbPlNS9F-t8NEWG6>a__/&H
+?3&Cgb$4-eQmd.Yk4g+KDUA`-&U"`I@p-Q6.b53S_g&G<=FQ`%J!AjPVY<+/P)XVN
+AT17(7n(:*<BL!S>7SYi2u691(>'!>qd2Vnn$OtDZt-Wj'`B?k*9$nt'lt0Lbc4F@
+1C<S(0?i6O[=f+N3%<dKFUZZ_kt]-5FlQnm#"8/5%eVODAjp;_@@8*eRcdf!THs<-
+2<+I'J's$&+IBJ"\b5,q2Wj5k/8sse>?jrrb^K`3r7#hnU\B7brjKF>\Z][f9XV`'
+*"Z%>81UL!80phQP"JVD,a+CT8L156dd@`>,a>*f8L5f2P"A8NQX/pKNMX&]1>NIa
+Zeam4rr@e_rr<+)rDOih5\#86VBC?OrceAB8Zje5d*0]%^&G(S,$ioP0r\#3.n:9n
+S>ugh&cpEUf"h4'/I,@L@13m*cOM<n>F8NWgth?/4p^m_77'JH8)"DI$*?Bm57?c2
+"Cu(I*9!h$5X29fCFOe<<E#TjR9d8uSEOYQZh#qSa6[TOn4sWbNf7eRPRUtFUZ,PJ
+AYE_LqhR"!<b_4bo+IjT@ZbiS;;*.S$GDFiCWM9E\].KOm]l'#F6TGlcJjtDUFsiq
+edH?l2/`.,-hPW$+4dpmrAB+CAW6bs"+6E23O`O4IYm,,&2H:9'8GGo;i[[)A,_8T
+C:*LM[R(,_?,+@!T8Qq"da\)fiq1UR?L>YT)4^r75G5U-]>`.Urr@F@Q\X)%HNUHi
+WBi9(2n/]rC,nUHBnYcG7%%<(C7FU(T+t4s[MV+N34EM_C'pYHI9!mp;ZJ@6*u=1A
+`Fla&e`Geq^>2E$pZ4KL/(iZ7"1djK_%HuNOp,T!].gqP0Z&g;%GU@!=aT\;B-C[U
+%-CYb)59B&_%D_?cm-]WW"KqXWZrkDOJ#e^80B"f&-fa9\)pZ,%=o&lrr?iUpa#`S
+Y\U8d`+']3i%$_ALjkV+E?&X*\/"7JnEBPKD,0,X/cPh(m&UYVJ_1)4mDWJ%l3q[Z
+O;5nrg'kM'(D<E=@gOdCZV@lSNn^42Ph/Jg?L8J4N-]9KfOP]hL!RcEk1E?"@HD[G
+#<oW+lt+W=\(%V\/=it_rFXCRppiI'/"\ZS5;(0-MXj#r8XTKKp=isQEJR4MPo4A<
+km8cg@kFgkeork,3N'j!)k*RtA5YuEP*D,$,c)cL8La\gmLi):PbaI6,q1+$ngtR&
+qbQ?2On&A!Pk3^434gX+X&lZE#PWE?5Pu+&ZFk@Bb8n.3bEQqhoS'FL>jWh;`[/F6
+_Hc)sLglKm9!>5]'iK4^EsS)Z<mVd<Ehe1b&Ed^gXUM;t>^?[Zh-ij3.Z(VV1<Tpd
+g?lWYShY#!^#i+ZYUR<`%Fu.2fHY\ciW=L.aLU;:kcMTV@7?i0Y>\@:@nBa;ToRXl
+U]<+^>`/$RYj+im:J,,FcfJol>sQ3e&bpP&oQWooK`NCJY,\P\WU+JWP-.a4&*GI%
+_5Wui;Nt</)0TMF7;Qe"8tkpM)_WQBXN"lH#DY=G*mbr)b@QVA)CI*APmk'5Knk6X
+S_#N&CN4kG"i4U-<HU5=m9jdj0LmYDn$9OiE%]lh2!&^QkQ1EAg95I:M'0;0UZ&>=
+(rKW!bQd.<_-q$I>2pYC06/#rl55"CZ#bD@]mn>0BB3Z:g[/hf!9pG8c5@;%"Q:RW
+#7*teEVS?9ACBaYaaAX-Bo1G@8)`Sic&l4WR@j>@>0fNlCF/C2\>^Va)'L%Aaum;R
+h<bcBJRR)"<*gmdRVI)q'o7N6k^gV6(^EK=S9Mo]U)G![UU%10&u?-J'$*q]b1IrM
+<8-T&U"PLpe>(Ji*$N+h3c8#8C>b:lCTQHj>IOJRU9R@j0+^!70r<l1aO&ZMW_]V<
+F.3Pda&.nVDm?SN!!b,rqCPhp,+OUO]1l$_2;6CL?DHK[de^GIqQZ3"_KJ#TQ91ah
+`P;&1rrD9%\@FeeF)h&W(t(<I%;mDMhbLr_CgCLa?5/Po+I+488L[4VP"L6(eF!r@
+,a>*f8L5frI:9a")efKccN*tF;88p5rqNnQ/+oJ$ZSrsG+/6XP!;#$Qrr>G3&S2*l
+E\:iAG-H<`F>("%`sSj[7jSs$eknoaW?'PiFuZ&.Ei4t1$$URkGPZWtBN3fQ>@"eb
+Qs$n(FN3\Z4ZD#$PXrNG"9H-6Ip4O_lOXf4>dl_VGq1A7)SlRI[BZ]=K]*!@=X1.f
+dbX<oXbsBmJ/YC`g-eM:GdcY`hkVPV7Y7?oMQ#duVfRluo2lnR.!k9)d+)\*@E>mW
+.W&6*XKfU<Xl[el:Yr.pB6)X`!-Tp%WggTO[=cH:2u]cdN8.*Y72I_r3=R+6Bp;H:
+k/"aYbDtW_!)6CrdTfEa[#PNBVuDR+h=+VgOX>UFpR^>Uoin_;BBZ]-]$L5fIV$j0
+^=)kGTPKLKrr@OQ=]Kd5OAkqVP_YOs1>_JHd62][5\4,J$\Pr=D8iY8)QBG3@Z_h9
+?+\FrckNUg!K>gs!`X*Y4>]<&h:!BYpDjqB(5_d+F0fYejgFTX=,\2E&A!2a%00'n
+;0E%D?o8N;l8.edMRJKG/SmP3$XL9emM0!,MaTBLM@=+?T6l*,BiLRKaagKX(<[2d
+Q1XRj;&4dL+D"S9a]E4hdAia[`dq<1)hN6aAu3b#VgJN>[>t<?)QSh]o;j0<Lj&k,
+1.QLa%qH\Pk0.Re0sB3g6bP@6OD?J$Wo*+HRdll+27_d-!VrFeG5!UmpGb>I@]@]9
+d?7R@aYaqh`jr:HgNL(kD^0=)W)iWE`kAski&Df'mTrCn_"i]KIol+97n1G&BA'Nh
+!7o>urrD[h0jOiUm[?]mS@qK>P"JVD,a+f"ea=&A,a>*f8L5g+I;-UmQ*9;nCK`sI
+ofqp2XB_AsWRbYA(@('D5L!tISIO/rB9p!l1+k.C6kk,@:`H'.X2PKd&[-:LW\$8F
+'o7UWNjS!&N<eI&7O7\+/LB*c0mBPO8.@;p'@e,)'cg8R[!8TR=#o]?au/6;U'b.+
+Xr7ef/S+/+(&Vhsgc%?W\`R':F:1_\Cl(k@[DGo:=I2if)T/T;numL4<kHu4coWao
+kg9i[d_WAXo&rI+R$bFe(,b6d^ju.RJ&3p>b5ubpOEdKibAA3(C\f<1*-5&>AR41p
+F.DK+m!/M+/O0"&&$t/LG%@l%O3\`Nr:O1-J?WK*Bre=0(&P!pS,WJ6VeQ/2U93Hu
+CMVBAHBjL3dI."g="sQ,DMF>FGQD'OSOUUdCYI\-(d]E6Ak7aZqqp7Vg+kB<ft+'d
+%cb(uZW15pLO48Jr@]5I>MXGIP2R?Hkj,s@":rIRM*4p4+jAS1J-f7j`-KnM!kgG"
+>ls0bcX+qlha\TK>sk+AH2b]GRnl$m//[d<L-8pZW+S=9Xu/C9K?rhkj;mC[*:RK1
++Fi-_g;Y^^TCnAV<7YU?]%[FQ>\j:V;)DhK=,741IBJ./c[7UG-[$N=#uM^]Vh]n9
+2GcV`^c6i%CKeBnT3-4ip:*X:4A6c](ccHL/c&)R78=aX/Xa&r-+dC@K91*=BeCT.
+\CU.0f_C-b<T_fNnj:O/34S@SkbUui>H)Vm4,B07!,h2T.i]:&X(Js[*PR@>]#P#-
+aUS1F)Ut_'[A4F-bNec6]h,'@GNd&oqjOH=&d'O)!dcc,\f=u7>k@TXm7CH+QS@\b
+.aDm^UJ\&7H"dDH'Lu1PMq"E)cB,^al;a>M0&Q;E]t\fpn,40;n[0"lQhUF.kT<`*
+/&]N1I32EK^Y30^nd8Q4!U5b=,a+sd8L5f2P"AILf'X/B,a>*f8L5g,4\$p[*6[)D
+WogrOXn-gVr^h4TOm?ksj^1YEMqf;%bcSs>24XO"p:7)l<G_Pmi785+7`WCiS(r6R
+\:0WWFXgMMbYkLMX^7nQPWN(,A^4?0>JmjK1Knug.T*Mo<i*5]L`2N-f-X$YWg^`Y
+jR0UFkg])+j^a5##2K]d%99$$VXUn25U\O$OE=6^Q:<4WZ'\&/;m.e6aY9tM^=!VG
+gR[.g@so5JX/ir-qaQQoWl5iY('o,p]tr60j(#ij'n=dK2jG9$h0@&p4QFlLrr>Wm
+EUEf6A#_8c1'5V-07!:,?27I-^1olK0B4\*m5bR'/I[*)L]ZY;F)>sLV]D6nE.SMS
+ClYQV6o@.T?5ns?;LDMY_/4smG9<Zg5mVET9uQ>HeSe?,Z7?B^MG$3M>X+P:ItUX8
+=L=.:1eI*O<Hh$4,(iUa>'N3aIt"fGF\H&SQ"[>:l;[67llH*+XK0Vbm[8o):f$g#
+F[l<k-EQ=e2#8'o[f5Llj8T)^<5qsArbe(4G_VB:B^.Ni.<tH'/cPgO5XnCU1(OBO
+@XV\1^!<J5Y72C5U(%&%.6Fg+10qH+_L@2lq>h?@c>f#Y/DT$0SVf#0KS,ou9FVG6
+8A1NeI[+HGRW4aR?`ACkC`V;>AM`X$Yg+jTM>C77:\/@$noHFtcW;:hUW/:,d>e.#
+&=-1tA!KQ*BD5\ZY.]`qF)fq2Sj&"c[?LQ9(I)L)L:Z]2l`AXWTBrF-[$`*>X-JkX
+/VOc`>HKY9d[GAl#<9es,V499^N8-mp#00?o[IVuY5j_Z'!'o-`tm5`.TjVE!D3J6
+*.%kEI8;YYOFNSDpGHp7B#[D'Sl^"+/5K$PcH`qNrK^I`!0U->d6QB2<0Bg-Efs!>
+PbaI6,sVF]mLi):PbaI6,q3kA=\Z;9K#=FE#QFcmrrD8jeuifS>n1pqm:S1XJ*NI%
+!2C-dka'LP4k;fK`uS)TdVS&GS/a]-K?7#(:U-6$2c_HV%?B*.H!)#eHgK48\!;dC
+\k:5k/Sf"1.p@OcdHX_P`pSNJZHE@\&Sf9L8?!i;7QG25LSk5Bbc4:^Y+TliG2bHB
+V4bfGF_auRNYRkaNWM([J]_c1AOF][80TcHc&Qj7W-2NNqF[0sZHWT)0r</.8r2f>
+.+<:@I83UU'\Hfj'ejZ-gA77[jYqt+mOle>4tR3F+^Ea;TIW't?h@@`W?Y;<-k3a;
+H]Ee`-2!=q_Pd+Ycns7PQZZM;F;cR'b83VG7eZcn8uIl?DZ5'R_g%GDR9)BH*`^pm
+2Mlm>S1L10M4IC)XKUR`6JF851)gTe\90Xl,ce<1aHN8`J56b0:+J(:7uDc/K'])"
+l<aJj:"9'@SfI4k>CV+@TmhJc_fTcT=Y[4U]T;CY!/%C`oaK#bC_+#IFL1101U$XJ
+J!Qk"j%A=ie=WM&M2q+&0D:4\&b]:5d1Uh+0?H<d(4DM^$AOCQP%8Dm\LquYPtfX$
+%kpi!g;4muN+d?0!IR<p.^=UGe22M3O3S"%PquS!\>I:OE?tO$JQT(Q^K5(_ct/Nf
+H^sPuik6H!V*:57X8W^WGPs0frr>Kk4Y1<Ri4Vd\;<W-"C.Ns1gUM_]NRiU.:7Bfn
+dRb`(,*GMCPbaI6,sVFVmLi):PbaI6,q3JL](^=4*X%p@^d"mtkPbVGU8%?>`]CSc
+CVaeAOnPRb?5j,%b;U2m';R7:(/p041(5msguI5m_85d61G$PT6X,I?nW2!loog`G
+>uiAXdtgN)rLW'J:\8Am1`!l0D'#n0nm\mF<Nc0-Gkte%B'(Wab,g$0IVQ-?dB9eK
+h!5o-D'$_OaIh=0d)s/1E:ZC!oi.[Hj5Mb+9U0/88&6pYdpSa^T65`&'q!06]VDM3
+22rNQ](<KO'rnLnIZh"\+Zq!fZ\?VC['``:(Af*tY*&LMJ4cn1g`^*F"?6h-22$/(
+j.b:O1C)?YWES$.mr#)oKQ%]bnRX2SRLH`2#B>GV[MpZ8"E9YJb(cF[qY*+iGX4"W
+C9>oPE03&?.3"XFpMtr06_2%Cr%R]>lXJ;q.>F1I?Ab,dX&Y3dUHtWr]<*d!ASq7?
+))&3i$)^e=<pnd(F>;57X7_FAN7nFp2N%2%K.YkCGC()=`NOZ,=0\cJHHKZMZ:7gU
+ZKp_$W3r4fNT>TH[if%ABeVDK\TjD&1i=JF\*2I)ri5/<mmt$jFL?i6r^g1U.'8^=
+bV_i"r4NHl,X=]%f@]kh4HU_B@p-=+W>me,(,_c.MB/m/-b9n*MkHL/$I*u`-H?;t
+gsU>3B`n*nWHaJ(n<j(o>QfR#BR4iH6WKj0l$/0c)7ISQ!,8Y*3@p,Z@C<;)3.OY3
+kg0)q-\;E[*>!>Z0=5BB9LsNGGP,TshtRiVe]@\i`=L/$-^N7?[/U+TrrDnRrr>58
+\JZ>c74BLF9hLR?,a>*f8L6V$dI%W=,a>*f8L5f2P"AFsop6Waq2ER3p>.^Br\:$8
+rnOFO!'I9@B["AA&78Q4(_8CJG2N/V(L,C.gREt0#O)gO5J$Rg!&h@R-FoH0q@@9_
+NrhJJ@X%rOY0:P-/*S;ne[-.#`j#!9_HFMIhO:#WIC*AGguhs/j'BuDomKW5Q>J:J
+b;H*Z5ELBBXK7=I7dtP#rD>DXMG]XV*g\+MoMR$R@h4E)rrBcO=rf;)?I3Aj[Pu:n
+rMD1WX%l?rg4a;]$2%IB:!TreVAuBL#i1[%IW%oOo-osT^dDVcCG,%cI#P5%O1"tn
+mqDPkYjRYR!.8"A0'6`s]!EOM4+mI,kiB,P&hY[tp,^9/;_5uk6]nLF\m;kd&Z^%4
+[KEm4[8W:RgunR)8iq$.M0P2k/&A/FG=Y@Nm[HS_<a*MsmMJa1/g-/e>[&Zkm0GUs
+6o`&iQ^/O_C2BLWR/Cd$NoM5ri?T8H*g&W4=nN]a5R;JY.N[tL0sQ7D'CB?fE\`7M
+SJFrQ_9s(rkL0>i=S=Q]!c$X2ZR3*u.)S0Z7]bbZ4<mbAff2BbZB-!9<ES1''!/Pd
+a(QHuiksSSV61f&N)@M68qk4I<SuJPA6.l(ZoCAGG7jbLP2,3Kk#!5P1*#,ODMLY#
+_^l1bN%&NKBUC+Q5^TZW\CT8K@t'OIDT@0YQF+,EU]Ne[UB^#0JqRVmAL=pD]6#b]
+.&"8*".f>0;QJt\RPNWG&"1drIZO2&]'H\9"j4_%<F^*`cg2=$?6n+C]p.)!aEP8f
+/+2Ht!0C<,?0]1<pGqA@<LfS"D785dn!Pb@oD1]Fg:R#jVL>eL28uh]8%np&as6_Z
+J(GeB!2C++h$*1,*XT[I[8cVX?i!EFY5\M#-I:'k,a(_K8L0HsP"?p`Uln:q5QB1"
+&kO@5Uln:q.3t'J8mKDC_)13]b-Z#]#KLUEHiC_Y!1t'&LQP#N'Y^%>Z/Q;n8\`bC
+)CQfIaOO4jCY<@lG)/=PpQc#4$`ghgfq`@Fg\I-fNpC!"fo]"q07>P5[nfo-J#$,O
+Zatofbf9m<rj>V2gN8)GjY&rC]&"A9/RF\pcm-"H+!DFDPct5:b-,ZAXg2-)h2?C.
+)3-88,uA5NZ%TZ\YkYSkTDBtNCMpup<1Rt\+uDE,UClFu!kLN91$Wu2#!m=<QBrJ4
+e[^B)WIVYIh-fmAgs\Q+YZfC:2efo#Y1fsWPAAtaEK:8[=X<YLc,UCPl]^Wf'_ObS
+PtpUMoF"6G/^,qH,B/ot578Dd&CU9!:8!RPO54gh$&"gR9V.lB8ZKmOe?Qo,JsK//
+X:WHQCZn80_J,,qcD;$K$i?)Z0sjQAV^j4aJ5]S:R-#-PE,?XGDo&rUFMa7s''?KO
+j"GFS18Y<Y9#('D'OQ^ti>i]eE?*Z]"DTG:iPfe!5Z76C_$?5"kd"Bd'e,H'[7lYd
+JIFbL,beh#((I9;OeS7Z\6r(lC!n+K<6'NV=,U7N/=@e*dMi719rg[mb-eb\P2l>9
+b9U#UK0X3?P*MFZQ@AL^J?o_sVcJdQ#_&W<5%g%I6JtcRlVG6"8`=t#7Hq\l$*8*(
+TC02Kq6b_'Q4MN;Q>Url\\Fl;re)B>Y^_E,V*FeMr[E!SV/T=(,_B!Y8L1,XP"@)o
+,a(cLs3pBK8L0OrP"?rK,a(_k8L0Ht6`P7eRnp<non2M=rrD5O5N(m54d:81-*6ao
+$"^N,)]h67J)JqRXIcWD7T3%R!&=P02h?$?pc&3Q_Z'V0[3@/!>9RG7/<CA#+=\+a
+EaD"Sg;e>[._F?nTn^X-O)nh&CgsSC7<Gf`mVd+#Io.m,3j"4?ffK84#pn/J9FptJ
+B,_h;U'd(j[a3=7>'hh^n;/4b<:PiW.WNH$2;8sU/""iI\\Z8'"Zrt`0:f[t.@lTB
+5Re9r!*EcX4Ur6-F91Y5Kmio8(#s'mVp06UZI]D1Pqc*\ckIc6<+euo<^Rd#f74B>
+;eB6W2C%d]7BL8Fa+#N)p=Q^VE5[`.g)*Mq):[;1@tu+8gsmC>9X0s;AUSJ>1_GXM
+:\(#OrBjEMlPZl=>>u*KXrm<77@)Ob;n?W%b+Y)cBcBA$YY^0IoiZ;jTu4LQNRojW
+bApd%GDQ"#X,_U2,CV_,RH;NhZKC[qIN;0nW=?;`r:PU(e,G>af1.GGH^kKXm<I&Y
+JjkpB<kGsf[^Ej5.Y^m[q\q$(eQP_2!eFt7n6G&t-&BJr9<KI0KJjd-Zph6f#O)\j
+p-bm2NKR5V=@0oPI[7!0a=V>uNtkjbqWi5[D^q<ejBQ9VCO?a@+EpV)BQ;^1PME1W
+Q<NZf&ZQ9A"+FpfIZ$('6G',l+;L%.$X9CuX#bsn]!d?/C](rp=8r7,C55RK3>o;`
+gVDA.5=VpTci*`*dF>e`9M0:QD%qeAGs0sOcEbdXVFk-\7Qo2O?$03%lY(&N"'X*f
+!D+Q#(TA[C8P2Q"P#@H7,a>*f8L6V$eF!r@,a>*f8L5f2P"A8;,a)&g8L0P]FcM@7
+ef/9HXIqCok.X$;DZ9^bX,DBK^%g9j_3k]c:XOC^c2)6_QDo!:Q]%HN/K8MEo6.V-
+Zi:#&rrBm0%mkk04E`)Jo_(JW8/b9HX(BqJD=sD"5F;Im^Wil\cfs+>;!`"XCEsh%
++$d>a(0UWlJ,9#"'!g40>HIT@:m?dhBd0X>;m2U]K_)I3-\C<bVu'+MoNPq/DMojs
+Rr!)HX=blOb1>f;Gr.rbLU;O)DrdZ29<,#3UP1QbQGaN?Mh4^,cjiW43F83L#(d@n
+O+()q@TctGM]ULak+k!HCp[[g\ub1!R-#f0W^l6^m;M]J4mIbt=j":8YLO@Bg(@Os
+a7\fl(1j<2AYm,h%q7]%V3ZiB-<4P)*Qm4f"%1Ml0;(.&,QoIE7<UTO\F4=0@#t.V
+LTXlmE2Dj0k_0SO:tFH<HF8fOa0rIaG&on>-"e=":`9_A/L1!u_uB^*Y'o_mkanh_
+H\us2ib#g9?$WefQkm%0aEP#k!7OYSAfYE:P5+.`'&W&hmUG;4P]qIQ^>#_3';@TX
+4@c`cAptcHo\7"-4Dk3bkWS4EX`7eD5ZDE8fo)tUa#NV!'-Gd!0jMb=aoU7?NrYdi
+-UKY*=,o4W3i7-*gho:VBg/QL+H\hJn:1sA0[O.c?iW2::*@$!Tku&6IA^Q["1eE2
+^XG5UB2c-RD)h<C9.iG"rrBmerr<B)[OkgTolf\Rg\QHmWujf^UYJ)mTDf5u!'YnO
+Y,])!Wj^M`6Q"2[CIA.:E]1Eq"B_%9piJEQG3rdgoDH3?Nflpc;Fr-sP`eT`V'M3q
+.7keJ8lA5+P+Vd)mLi):PbaI6,q1+&8P2Q"P#@H7,a>*f8L5qM[I#Pb%Va:BW$,Sl
++0/MqK)BR,@,[+nDt\$\l"XGE,cAhl0JC;a,;-H%BCp*'L]/qQ^;MD\25E7l?,:L-
+a84\\]i*Ra[>):qgFIH-COgJ%opGEuk5A*?Qi!]d)>o$BFas,6^\"6#;;DrW+)#F\
++g.!8kg"Mn*#q@ijVol<k>J:@g=pjj%]oQ&r[n!gZ0hEX,GN?9h\Nj9J'E"q&9h;D
+khEE^l[t`u]Ju'XH'A06R:S[[mpQ>9+H?fUa6Mc>%A46B<4I^oq]3=4`SB`;HbVR2
+-s".e"0^rH[fA5b!3/70^r$.Qrm'*tl4V\C_*\rIYe\WajYhln!!`;-Ms_fmf?$*)
+4IMI^=N7XBhWP<SR4K[8DS@Op"Si6RA0".9=9(4me*^5i/TI0YphEii-Um;<E*HQ'
+e)1U:rr?rO@hR`MU08(Dr?o_Vm'J:fEu5k\L4CC]\$8,o>"Ef)D%5paqqqBso5+F,
+_,j'Xd(4*,%]ZZ)O79T)hu01kYPtu#"a+,Ran4Jkq72ME3M)4K11'H<rrC$gr8jRH
+m<-*,UL@QJf\Q:G[JIN7\,M4tUln]?8L1,XP"@)o,a(bt8L0I`P"?pq,a(_J8L0Hk
+J,e*f&kO@5Uln:q.3t'J8kC:k;NaTsPbaI6,q1+&8P2Q"P#@K,N-f`]U!5`j,_+6;
+P"KeukZoD(0?%Inm@+%To>d`-]BZ:eT4b-1P?\XtIBLQ#Ou?0'_*:r(p6IVgL7U\d
+:]3ndrr=gY\!Qs:#Ka(UW(@-)_"s2B8XhBHrr=sdrr>J<<;f\XF[X[D,PU'`r>"QK
+e<718C=1KkIR!E`os"4GNSjHmdoMW',cN&P8P2Q"P#@H7,a>*f8L5f2P"A8;,a)&g
+8L0OrP"?rK,a(_ps4?ZO?6#,#IDmMkaX!e>;I1?+8q"Z)iQ3@CgeqGuP"L/A-/lrk
+Vqb0V*0NpB`?jKb,cBEq?6#,#IDmMkaX!e>;I1?+8q"Z)iQ3@CgeqGuP"L/A-/lrk
+Vqb0V*0NpB`?jKb,cBEq?6#,#IDmMkaX!e>;I1?+8q"Z)iQ3@CgeqGuP"L/A-/lrkVuPE~> %%EndBinary grestore end % Image Trailer grestore grestore % EPS grestore [{nextImage} 1 dict begin /Metadata {photoshop_metadata_stream} def currentdict end /PUT pdfmark [/NamespacePop pdfmark \ No newline at end of file
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.jpg b/graphics/pgf/base/doc/images/brave-gnu-world-logo.jpg
new file mode 100644
index 0000000000..d5615673b2
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.jpg
Binary files differ
diff --git a/graphics/pgf/base/doc/images/brave-gnu-world-logo.xbb b/graphics/pgf/base/doc/images/brave-gnu-world-logo.xbb
new file mode 100644
index 0000000000..8a4669dd91
--- /dev/null
+++ b/graphics/pgf/base/doc/images/brave-gnu-world-logo.xbb
@@ -0,0 +1,6 @@
+%%Title: /Users/tantau/Library/texmf/tex/generic/pgf/doc/generic/pgf/images/brave-gnu-world-logo.jpg
+%%Creator: extractbb 20130405
+%%BoundingBox: 0 0 342 387
+%%HiResBoundingBox: 0.000000 0.000000 342.000000 387.000000
+%%CreationDate: Tue Aug 27 10:50:29 2013
+
diff --git a/graphics/pgf/base/doc/images/pgfmanual-mindmap-1.pdf b/graphics/pgf/base/doc/images/pgfmanual-mindmap-1.pdf
new file mode 100644
index 0000000000..8c3a81a7d3
--- /dev/null
+++ b/graphics/pgf/base/doc/images/pgfmanual-mindmap-1.pdf
Binary files differ
diff --git a/graphics/pgf/base/doc/images/pgfmanual-mindmap-2.pdf b/graphics/pgf/base/doc/images/pgfmanual-mindmap-2.pdf
new file mode 100644
index 0000000000..0e1e46be0f
--- /dev/null
+++ b/graphics/pgf/base/doc/images/pgfmanual-mindmap-2.pdf
Binary files differ
diff --git a/graphics/pgf/base/doc/licenses/LICENSE b/graphics/pgf/base/doc/licenses/LICENSE
new file mode 100644
index 0000000000..293753aff8
--- /dev/null
+++ b/graphics/pgf/base/doc/licenses/LICENSE
@@ -0,0 +1,34 @@
+Licenses for the PGF package
+============================
+
+Different parts of the PGF package are distributed under
+different licenses:
+
+1. The code of the package is dual-license. This means that
+ you can decide which license you wish to use when using the
+ pgf package. The two options are:
+
+ a) You can use the GNU Public License, version 2.
+ b) You can use the LaTeX Project Public License, version 1.3c.
+
+2. The documentation of the package is also dual-license. Again,
+ you can choose between two options:
+
+ a) You can use the GNU Free Documentation License, version 1.2.
+ b) You can use the LaTeX Project Public License, version 1.3c.
+
+The ``documentation of the package'' refers to all files in the
+subdirectory doc of the pgf package. A detailed listing can be
+found in the file
+
+ doc/generic/pgf/licenses/manifest-documentation.txt
+
+All files in other directories are part of the ``code of the
+package.'' A detailed listing can be found in the file
+
+ doc/generic/pgf/licenses/manifest-code.txt
+
+You will find the licenses in the manual and also as plain text
+versions in the directory
+
+ doc/generic/pgf/licenses
diff --git a/graphics/pgf/base/doc/licenses/gnu-free-documentation-license-1.2.txt b/graphics/pgf/base/doc/licenses/gnu-free-documentation-license-1.2.txt
new file mode 100644
index 0000000000..26cf032dcd
--- /dev/null
+++ b/graphics/pgf/base/doc/licenses/gnu-free-documentation-license-1.2.txt
@@ -0,0 +1,397 @@
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/graphics/pgf/base/doc/licenses/gnu-public-license-2.txt b/graphics/pgf/base/doc/licenses/gnu-public-license-2.txt
new file mode 100644
index 0000000000..fd94e166f5
--- /dev/null
+++ b/graphics/pgf/base/doc/licenses/gnu-public-license-2.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/graphics/pgf/base/doc/licenses/latex-project-public-license-1.3c.txt b/graphics/pgf/base/doc/licenses/latex-project-public-license-1.3c.txt
new file mode 100644
index 0000000000..90e5e3ab79
--- /dev/null
+++ b/graphics/pgf/base/doc/licenses/latex-project-public-license-1.3c.txt
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2006-05-20
+
+Copyright 1999 2002-2006 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % 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 M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/graphics/pgf/base/doc/licenses/manifest-code.txt b/graphics/pgf/base/doc/licenses/manifest-code.txt
new file mode 100644
index 0000000000..2f710872f7
--- /dev/null
+++ b/graphics/pgf/base/doc/licenses/manifest-code.txt
@@ -0,0 +1,2 @@
+The code consists of all files listed in ../FILES that do not lie in
+the directory doc.
diff --git a/graphics/pgf/base/doc/licenses/manifest-documentation.txt b/graphics/pgf/base/doc/licenses/manifest-documentation.txt
new file mode 100644
index 0000000000..33c97f55e7
--- /dev/null
+++ b/graphics/pgf/base/doc/licenses/manifest-documentation.txt
@@ -0,0 +1,2 @@
+The documentation consists of all files listed in ../FILES that lie in
+the doc subdirectory.
diff --git a/graphics/pgf/base/doc/macros/pgfmanual-en-macros.tex b/graphics/pgf/base/doc/macros/pgfmanual-en-macros.tex
new file mode 100644
index 0000000000..a3226328ac
--- /dev/null
+++ b/graphics/pgf/base/doc/macros/pgfmanual-en-macros.tex
@@ -0,0 +1,1918 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+% $Header$
+
+
+\providecommand\href[2]{\texttt{#1}}
+\providecommand\hypertarget[2]{\texttt{#1}}
+\providecommand\hyperlink[2]{\texttt{#1}}
+
+
+\newcount\pgfmanualtargetcount
+
+\def\cleanuplink#1{%
+ \expandafter\ifx\csname pgfmanual@hlink@#1\endcsname\relax%
+ \global\advance\pgfmanualtargetcount by1\relax%
+ \expandafter\xdef\csname pgfmanual@hlink@#1\endcsname{pgfmanual-pos-\the\pgfmanualtargetcount}%
+ \fi%
+}
+\def\cleanedhypertarget#1#2{% necessary for dvisvgm
+ \cleanuplink{#1}%
+ \hypertarget{\csname pgfmanual@hlink@#1\endcsname}{#2}%
+}
+\def\cleanedhyperlink#1#2{%
+ \cleanuplink{#1}%
+ \hyperlink{\csname pgfmanual@hlink@#1\endcsname}{#2}%
+}
+
+\colorlet{examplefill}{yellow!80!black}
+\definecolor{graphicbackground}{rgb}{0.96,0.96,0.8}
+\definecolor{codebackground}{rgb}{0.9,0.9,1}
+\definecolor{animationgraphicbackground}{rgb}{0.96,0.96,0.8}
+
+\newenvironment{pgfmanualentry}{\list{}{\leftmargin=2em\itemindent-\leftmargin\def\makelabel##1{\hss##1}}}{\endlist}
+\newcommand\pgfmanualentryheadline[1]{\itemsep=0pt\parskip=0pt{\raggedright\item\strut{#1}\par}\topsep=0pt}
+\newcommand\pgfmanualbody{\parskip3pt}
+
+\let\origtexttt=\texttt
+\def\texttt#1{{\def\textunderscore{\char`\_}\def\textbraceleft{\char`\{}\def\textbraceright{\char`\}}\origtexttt{#1}}}
+\def\exclamationmarktext{!}
+\def\atmarktext{@}
+
+{
+ \catcode`\|=12
+ \gdef\pgfmanualnormalbar{|}
+ \catcode`\|=13
+ \AtBeginDocument{\gdef|{\ifmmode\pgfmanualnormalbar\else\expandafter\verb\expandafter|\fi}}
+}
+
+
+
+\newenvironment{pgflayout}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \texttt{\string\pgfpagesuselayout\char`\{\declare{#1}\char`\}}\oarg{options}%
+ }
+ \index{#1@\protect\texttt{#1} layout}%
+ \index{Page layouts!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{sysanimateattribute}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \texttt{\string\pgfsysanimate\char`\{\declare{#1}\char`\}}%
+ }
+ \index{#1@\protect\texttt{#1} system layer animation attribute}%
+ \index{Animation attributes (system layer)!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{animateattribute}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \texttt{\string\pgfanimateattribute\char`\{\declare{#1}\char`\}\marg{options}}%
+ }
+ \index{#1@\protect\texttt{#1} basic layer animation attribute}%
+ \index{Animation attributes (basic layer)!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{tikzanimateattribute}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \foreach \attr in{#1} {\expandafter\pgfmanualpdflabel\expandafter{\attr}{}}%
+ \textbf{Animation attribute} \foreach \attr[count=\i]
+ in{#1}{{\ifnum\i>1 \textbf,\fi} \texttt{:\declare{\attr}}}%
+ }
+ \foreach\attr in{#1}{%
+ \edef\indexcall{%
+ \noexpand\index{\attr@\noexpand\protect\noexpand\texttt{\attr} animation attribute}%
+ \noexpand\index{Animation attributes!\attr@\noexpand\protect\noexpand\texttt{\attr}}%
+ }%
+ \indexcall%
+ }%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{command}[1]{
+ \begin{pgfmanualentry}
+ \extractcommand#1\@@
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\makeatletter
+
+\def\includeluadocumentationof#1{
+ \directlua{require 'pgf.manual.DocumentParser'}
+ \directlua{pgf.manual.DocumentParser.include '#1'}
+}
+
+\newenvironment{luageneric}[4]{
+ \pgfmanualentry
+ \pgfmanualentryheadline{#4 \texttt{#1\declare{#2}}#3}
+ \index{#2@\protect\texttt{#2} (Lua)}%
+ \def\temp{#1}
+ \ifx\temp\pgfutil@empty\else
+ \index{#1@\protect\texttt{#1}!#2@\protect\texttt{#2} (Lua)}%
+ \fi
+ \pgfmanualbody
+}{\endpgfmanualentry}
+
+\newenvironment{luatable}[3]{
+ \medskip
+ \luageneric{#1}{#2}{ (declared in \texttt{#3})}{\textbf{Lua table}}
+}{\endluageneric}
+
+\newenvironment{luafield}[1]{
+ \pgfmanualentry
+ \pgfmanualentryheadline{Field \texttt{\declare{#1}}}
+ \pgfmanualbody
+}{\endpgfmanualentry}
+
+
+\newenvironment{lualibrary}[1]{
+ \pgfmanualentry
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Graph Drawing Library} \texttt{\declare{#1}}%
+ }
+ \index{#1@\protect\texttt{#1} graph drawing library}%
+ \index{Libraries!#1@\protect\texttt{#1}}%
+ \index{Graph drawing libraries!#1@\protect\texttt{#1}}%
+ \vskip.25em
+ {\ttfamily\char`\\usegdlibrary\char`\{\declare{#1}\char`\}\space\space \char`\%\space\space \LaTeX\space and plain \TeX}\\
+ {\ttfamily\char`\\usegdlibrary[\declare{#1}]\space \char`\%\space\space Con\TeX t}\smallskip\par
+ \pgfmanualbody
+}{\endpgfmanualentry}
+
+\newenvironment{luadeclare}[4]{
+ \pgfmanualentry
+ \def\manual@temp@default{#3}%
+ \def\manual@temp@initial{#4}%
+ \def\manual@temp@{#3#4}%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ {\ttfamily/graph
+ drawing/\declare{#1}\opt{=}}\opt{#2}\hfill%
+ \ifx\manual@temp@\pgfutil@empty\else%
+ (\ifx\manual@temp@default\pgfutil@empty\else%
+ default {\ttfamily #3}\ifx\manual@temp@initial\pgfutil@empty\else, \fi%
+ \fi%
+ \ifx\manual@temp@initial\pgfutil@empty\else%
+ initially {\ttfamily #4}%
+ \fi%
+ )\fi%
+ }%
+ \index{#1@\protect\texttt{#1} key}%
+ \pgfmanualbody
+ \gdef\myname{#1}%
+% \keyalias{tikz}
+% \keyalias{tikz/graphs}
+}{\endpgfmanualentry}
+
+\newenvironment{luadeclarestyle}[4]{
+ \pgfmanualentry
+ \def\manual@temp@para{#2}%
+ \def\manual@temp@default{#3}%
+ \def\manual@temp@initial{#4}%
+ \def\manual@temp@{#3#4}%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ {\ttfamily/graph drawing/\declare{#1}}\ifx\manual@temp@para\pgfutil@empty\else\opt{\texttt=}\opt{#2}\fi\hfill%
+ (style\ifx\manual@temp@\pgfutil@empty\else, %
+ \ifx\manual@temp@default\pgfutil@empty\else%
+ default {\ttfamily #3}\ifx\manual@temp@initial\pgfutil@empty\else, \fi%
+ \fi%
+ \ifx\manual@temp@initial\pgfutil@empty\else%
+ initially {\ttfamily #4}%
+ \fi%
+ \fi)%
+ }%
+ \index{#1@\protect\texttt{#1} key}%
+ \pgfmanualbody%
+ \gdef\myname{#1}%
+% \keyalias{tikz}
+% \keyalias{tikz/graphs}
+}{\endpgfmanualentry}
+
+\newenvironment{luanamespace}[2]{
+ \luageneric{#1}{#2}{}{\textbf{Lua namespace}}
+}{\endluageneric}
+
+\newenvironment{luafiledescription}[1]{}{}
+
+\newenvironment{luacommand}[4]{
+ \cleanedhypertarget{pgf/lua/#1}{\luageneric{#2}{#3}{\texttt{(#4)}}{\texttt{function}}}
+}{\endluageneric}
+
+\newenvironment{luaparameters}{\par\emph{Parameters:}%
+ \parametercount=0\relax%
+ \let\item=\parameteritem%
+ \let\list=\restorelist%
+}
+{\par
+}
+
+\newenvironment{luareturns}{\par\emph{Returns:}%
+ \parametercount=0\relax%
+ \let\item=\parameteritem%
+ \let\list=\restorelist%
+}
+{\par
+}
+
+\newcount\parametercount
+
+\newenvironment{parameterdescription}{\unskip%
+ \parametercount=0\relax%
+ \let\item=\parameteritem%
+ \let\list=\restorelist%
+}
+{\par
+}
+\let\saveditemcommand=\item
+\let\savedlistcommand=\list
+\def\denselist#1#2{\savedlistcommand{#1}{#2}\parskip0pt\itemsep0pt}
+\def\restorelist{\let\item=\saveditemcommand\denselist}
+\def\parameteritem{\pgfutil@ifnextchar[\parameteritem@{}}%}
+\def\parameteritem@[#1]{\advance\parametercount by1\relax\hskip0.15em plus 1em\emph{\the\parametercount.}\kern1ex\def\test{#1}\ifx\test\pgfutil@empty\else#1\kern.5em\fi}
+
+\newenvironment{commandlist}[1]{%
+ \begin{pgfmanualentry}
+ \foreach \xx in {#1} {%
+ \expandafter\extractcommand\xx\@@
+ }%
+ \pgfmanualbody
+}{%
+ \end{pgfmanualentry}
+}%
+
+% \begin{internallist}[register]{\pgf@xa}
+% \end{internallist}
+%
+% \begin{internallist}[register]{\pgf@xa,\pgf@xb}
+% \end{internallist}
+\newenvironment{internallist}[2][register]{%
+ \begin{pgfmanualentry}
+ \foreach \xx in {#2} {%
+ \expandafter\extractinternalcommand\expandafter{\xx}{#1}%
+ }%
+ \pgfmanualbody
+}{%
+ \end{pgfmanualentry}
+}%
+\def\extractinternalcommand#1#2{%
+ \removeats{#1}%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{\textbackslash\strippedat}{}%
+ Internal #2 \declare{\texttt{\string#1}}}%
+ \index{Internals!\strippedat @\protect\myprintocmmand{\strippedat}}%
+ \index{\strippedat @\protect\myprintocmmand{\strippedat}}%
+}
+
+%% MW: START MATH MACROS
+\def\mvar#1{{\ifmmode\textrm{\textit{#1}}\else\rmfamily\textit{#1}\fi}}
+
+\makeatletter
+
+\def\extractmathfunctionname#1{\extractmathfunctionname@#1(,)\tmpa\tmpb}
+\def\extractmathfunctionname@#1(#2)#3\tmpb{\def\mathname{#1}}
+
+\makeatother
+
+\newenvironment{math-function}[1]{
+ \def\mathdefaultname{#1}
+ \extractmathfunctionname{#1}
+ \edef\mathurl{{math:\mathname}}\expandafter\cleanedhypertarget\expandafter{\mathurl}{}%
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\texttt{#1}}%
+ \index{\mathname @\protect\texttt{\mathname} math function}%
+ \index{Math functions!\mathname @\protect\texttt{\mathname}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\pgfmanualemptytext{}
+\def\pgfmanualvbarvbar{\char`\|\char`\|}
+
+\newenvironment{math-operator}[4][]{%
+ \begin{pgfmanualentry}
+ \csname math#3operator\endcsname{#2}{#4}
+ \def\mathtest{#4}%
+ \ifx\mathtest\pgfmanualemptytext%
+ \def\mathtype{(#3 operator)}
+ \else%
+ \def\mathtype{(#3 operator; uses the \texttt{#4} function)}
+ \fi%
+ \pgfmanualentryheadline{\mathexample\hfill\mathtype}%
+ \def\mathtest{#1}%
+ \ifx\mathtest\pgfmanualemptytext%
+ \index{#2@\protect\texttt{#2} #3 math operator}%
+ \index{Math operators!#2@\protect\texttt{#2}}%
+ \fi%
+ \pgfmanualbody
+}
+{\end{pgfmanualentry}}
+
+\newenvironment{math-operators}[5][]{%
+ \begin{pgfmanualentry}
+ \csname math#4operator\endcsname{#2}{#3}
+ \def\mathtest{#5}%
+ \ifx\mathtest\pgfmanualemptytext%
+ \def\mathtype{(#4 operators)}
+ \else%
+ \def\mathtype{(#4 operators; use the \texttt{#5} function)}
+ \fi%
+ \pgfmanualentryheadline{\mathexample\hfill\mathtype}%
+ \def\mathtest{#1}%
+ \ifx\mathtest\pgfmanualemptytext%
+ \index{#2#3@\protect\texttt{#2\protect\ #3} #4 math operators}%
+ \index{Math operators!#2#3@\protect\texttt{#2\protect\ #3}}%
+ \fi%
+ \pgfmanualbody
+}
+{\end{pgfmanualentry}}
+
+\def\mathinfixoperator#1#2{%
+ \def\mathoperator{\texttt{#1}}%
+ \def\mathexample{\mvar{x}\space\texttt{#1}\space\mvar{y}}%
+}
+
+\def\mathprefixoperator#1#2{%
+ \def\mathoperator{\texttt{#1}}%
+ \def\mathexample{\texttt{#1}\mvar{x}}%
+}
+
+\def\mathpostfixoperator#1#2{%
+ \def\mathoperator{\texttt{#1}}
+ \def\mathexample{\mvar{x}\texttt{#1}}%
+}
+
+\def\mathgroupoperator#1#2{%
+ \def\mathoperator{\texttt{#1\ #2}}%
+ \def\mathexample{\texttt{#1}\mvar{x}\texttt{#2}}%
+}
+
+\expandafter\let\csname matharray accessoperator\endcsname=\mathgroupoperator
+\expandafter\let\csname matharrayoperator\endcsname=\mathgroupoperator
+
+\def\mathconditionaloperator#1#2{%
+ \def\mathoperator{#1\space#2}
+ \def\mathexample{\mvar{x}\ \texttt{#1}\ \mvar{y}\ {\texttt{#2}}\ \mvar{z}}
+}
+
+\newcommand\mathcommand[1][\mathdefaultname]{%
+ \expandafter\makemathcommand#1(\empty)\stop%
+ \expandafter\extractcommand\mathcommandname\@@%
+ \medskip
+}
+\makeatletter
+
+\def\makemathcommand#1(#2)#3\stop{%
+ \expandafter\def\expandafter\mathcommandname\expandafter{\csname pgfmath#1\endcsname}%
+ \ifx#2\empty%
+ \else%
+ \@makemathcommand#2,\stop,
+ \fi}
+\def\@makemathcommand#1,{%
+ \ifx#1\stop%
+ \else%
+ \expandafter\def\expandafter\mathcommandname\expandafter{\mathcommandname{\ttfamily\char`\{#1\char`\}}}%
+ \expandafter\@makemathcommand%
+ \fi}
+\makeatother
+
+\def\calcname{\textsc{calc}}
+
+\newenvironment{math-keyword}[1]{
+ \extracttikzmathkeyword#1@
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\texttt{\color{red}\mathname}\mathrest}%
+ \index{\mathname @\protect\texttt{\mathname} tikz math function}%
+ \index{TikZ math functions!\mathname @\protect\texttt{\mathname}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\extracttikzmathkeyword#1#2@{%
+ \def\mathname{#1}%
+ \def\mathrest{#2}%
+}
+
+%% MW: END MATH MACROS
+
+
+\def\extractcommand#1#2\@@{%
+ \removeats{#1}%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{\textbackslash\strippedat}{}%
+ \declare{\expandafter\texttt\expandafter{\string#1}}#2%
+ }%
+ \index{\strippedat @\protect\myprintocmmand{\strippedat}}
+}
+
+\def\luaextractcommand#1#2\relax{%
+ \declare{\texttt{\string#1}}#2\par%
+% \removeats{#1}%
+ % \index{\strippedat @\protect\myprintocmmand{\strippedat}}
+ % \pgfmanualpdflabel{\textbackslash\strippedat}{}%
+}
+
+
+% \begin{environment}{{name}\marg{arguments}}
+\renewenvironment{environment}[1]{
+ \begin{pgfmanualentry}
+ \extractenvironement#1\@@
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\extractenvironement#1#2\@@{%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ {\ttfamily\char`\\begin\char`\{\declare{#1}\char`\}}#2%
+ }%
+ \pgfmanualentryheadline{{\ttfamily\ \ }\meta{environment contents}}%
+ \pgfmanualentryheadline{{\ttfamily\char`\\end\char`\{\declare{#1}\char`\}}}%
+ \index{#1@\protect\texttt{#1} environment}%
+ \index{Environments!#1@\protect\texttt{#1}}
+}
+
+
+\newenvironment{plainenvironment}[1]{
+ \begin{pgfmanualentry}
+ \extractplainenvironement#1\@@
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\extractplainenvironement#1#2\@@{%
+ \pgfmanualentryheadline{{\ttfamily\declare{\char`\\#1}}#2}%
+ \pgfmanualentryheadline{{\ttfamily\ \ }\meta{environment contents}}%
+ \pgfmanualentryheadline{{\ttfamily\declare{\char`\\end#1}}}%
+ \index{#1@\protect\texttt{#1} environment}%
+ \index{Environments!#1@\protect\texttt{#1}}%
+}
+
+
+\newenvironment{contextenvironment}[1]{
+ \begin{pgfmanualentry}
+ \extractcontextenvironement#1\@@
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\extractcontextenvironement#1#2\@@{%
+ \pgfmanualentryheadline{{\ttfamily\declare{\char`\\start#1}}#2}%
+ \pgfmanualentryheadline{{\ttfamily\ \ }\meta{environment contents}}%
+ \pgfmanualentryheadline{{\ttfamily\declare{\char`\\stop#1}}}%
+ \index{#1@\protect\texttt{#1} environment}%
+ \index{Environments!#1@\protect\texttt{#1}}}
+
+
+\newenvironment{shape}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Shape} {\ttfamily\declare{#1}}%
+ }%
+ \index{#1@\protect\texttt{#1} shape}%
+ \index{Shapes!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{pictype}[2]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Pic type} {\ttfamily\declare{#1}#2}%
+ }%
+ \index{#1@\protect\texttt{#1} pic type}%
+ \index{Pic Types!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{shading}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Shading} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} shading}%
+ \index{Shadings!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{graph}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Graph} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} graph}%
+ \index{Graphs!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{gdalgorithm}[2]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Layout} {\ttfamily/graph drawing/\declare{#1}\opt{=}}\opt{\meta{options}}}%
+ \index{#1@\protect\texttt{#1} layout}%
+ \index{Layouts!#1@\protect\texttt{#1}}%
+ \foreach \algo in {#2}
+ {\edef\marshal{\noexpand\index{#2@\noexpand\protect\noexpand\texttt{#2} algorithm}}\marshal}%
+ \index{Graph drawing layouts!#1@\protect\texttt{#1}}
+ \item{\small alias {\ttfamily/tikz/#1}}\par
+ \item{\small alias {\ttfamily/tikz/graphs/#1}}\par
+ \item{\small Employs {\ttfamily algorithm=#2}}\par
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{dataformat}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Format} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} format}%
+ \index{Formats!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{stylesheet}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Style sheet} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} style sheet}%
+ \index{Style sheets!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{handler}[1]{
+ \begin{pgfmanualentry}
+ \extracthandler#1\@nil%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\gobble#1{}
+\def\extracthandler#1#2\@nil{%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{/handlers/#1}{}%
+ \textbf{Key handler} \meta{key}{\ttfamily/\declare{#1}}#2}%
+ \index{\gobble#1@\protect\texttt{#1} handler}%
+ \index{Key handlers!#1@\protect\texttt{#1}}
+}
+
+
+\makeatletter
+
+
+\newenvironment{stylekey}[1]{
+ \begin{pgfmanualentry}
+ \def\extrakeytext{style, }
+ \extractkey#1\@nil%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\def\choicesep{$\vert$}%
+\def\choicearg#1{\texttt{#1}}
+
+\newif\iffirstchoice
+
+% \mchoice{choice1,choice2,choice3}
+\newcommand\mchoice[1]{%
+ \begingroup
+ \firstchoicetrue
+ \foreach \mchoice@ in {#1} {%
+ \iffirstchoice
+ \global\firstchoicefalse
+ \else
+ \choicesep
+ \fi
+ \choicearg{\mchoice@}%
+ }%
+ \endgroup
+}%
+
+% \begin{key}{/path/x=value}
+% \begin{key}{/path/x=value (initially XXX)}
+% \begin{key}{/path/x=value (default XXX)}
+\newenvironment{key}[1]{
+ \begin{pgfmanualentry}
+ \def\extrakeytext{}
+ %\def\altpath{\emph{\color{gray}or}}%
+ \extractkey#1\@nil%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+% \insertpathifneeded{a key}{/pgf} -> assign mykey={/pgf/a key}
+% \insertpathifneeded{/tikz/a key}{/pgf} -> assign mykey={/tikz/a key}
+%
+% #1: the key
+% #2: a default path (or empty)
+\def\insertpathifneeded#1#2{%
+ \def\insertpathifneeded@@{#2}%
+ \ifx\insertpathifneeded@@\empty
+ \def\mykey{#1}%
+ \else
+ \insertpathifneeded@#2\@nil
+ \ifpgfutil@in@
+ \def\mykey{#2/#1}%
+ \else
+ \def\mykey{#1}%
+ \fi
+ \fi
+}%
+\def\insertpathifneeded@#1#2\@nil{%
+ \def\insertpathifneeded@@{#1}%
+ \def\insertpathifneeded@@@{/}%
+ \ifx\insertpathifneeded@@\insertpathifneeded@@@
+ \pgfutil@in@true
+ \else
+ \pgfutil@in@false
+ \fi
+}%
+
+% \begin{keylist}[default path]
+% {/path/option 1=value,/path/option 2=value2}
+% \end{keylist}
+\newenvironment{keylist}[2][]{%
+ \begin{pgfmanualentry}
+ \def\extrakeytext{}%
+ \foreach \xx in {#2} {%
+ \expandafter\insertpathifneeded\expandafter{\xx}{#1}%
+ \expandafter\extractkey\mykey\@nil%
+ }%
+ \pgfmanualbody
+}{%
+ \end{pgfmanualentry}
+}%
+
+\def\extractkey#1\@nil{%
+ \pgfutil@in@={#1}%
+ \ifpgfutil@in@%
+ \extractkeyequal#1\@nil
+ \else%
+ \pgfutil@in@{(initial}{#1}%
+ \ifpgfutil@in@%
+ \extractequalinitial#1\@nil%
+ \else
+ \pgfmanualentryheadline{%
+ \def\mykey{#1}%
+ \def\mypath{}%
+ \gdef\myname{}%
+ \firsttimetrue%
+ \pgfmanualdecomposecount=0\relax%
+ \decompose#1/\nil%
+ {\ttfamily\declare{#1}}\hfill(\extrakeytext no value)}%
+ \fi
+ \fi%
+}
+
+\def\extractkeyequal#1=#2\@nil{%
+ \pgfutil@in@{(default}{#2}%
+ \ifpgfutil@in@%
+ \extractdefault{#1}#2\@nil%
+ \else%
+ \pgfutil@in@{(initial}{#2}%
+ \ifpgfutil@in@%
+ \extractinitial{#1}#2\@nil%
+ \else
+ \pgfmanualentryheadline{%
+ \def\mykey{#1}%
+ \def\mypath{}%
+ \gdef\myname{}%
+ \firsttimetrue%
+ \pgfmanualdecomposecount=0\relax%
+ \decompose#1/\nil%
+ {\ttfamily\declare{#1}=}#2\hfill(\extrakeytext no default)}%
+ \fi%
+ \fi%
+}
+
+\def\extractdefault#1#2(default #3)\@nil{%
+ \pgfmanualentryheadline{%
+ \def\mykey{#1}%
+ \def\mypath{}%
+ \gdef\myname{}%
+ \firsttimetrue%
+ \pgfmanualdecomposecount=0\relax%
+ \decompose#1/\nil%
+ {\ttfamily\declare{#1}\opt{=}}\opt{#2}\hfill (\extrakeytext default {\ttfamily#3})}%
+}
+
+\def\extractinitial#1#2(initially #3)\@nil{%
+ \pgfmanualentryheadline{%
+ \def\mykey{#1}%
+ \def\mypath{}%
+ \gdef\myname{}%
+ \firsttimetrue%
+ \pgfmanualdecomposecount=0\relax%
+ \decompose#1/\nil%
+ {\ttfamily\declare{#1}=}#2\hfill (\extrakeytext no default, initially {\ttfamily#3})}%
+}
+
+\def\extractequalinitial#1 (initially #2)\@nil{%
+ \pgfmanualentryheadline{%
+ \def\mykey{#1}%
+ \def\mypath{}%
+ \gdef\myname{}%
+ \firsttimetrue%
+ \pgfmanualdecomposecount=0\relax%
+ \decompose#1/\nil%
+ {\ttfamily\declare{#1}}\hfill (\extrakeytext initially {\ttfamily#2})}%
+}
+
+% Introduces a key alias '/#1/<name of current key>'
+% to be used inside of \begin{key} ... \end{key}
+\def\keyalias#1{\vspace{-3pt}\item{\small alias {\ttfamily/#1/\myname}}\vspace{-2pt}\par
+ \pgfmanualpdflabel{/#1/\myname}{}%
+}
+
+\newif\iffirsttime
+\newcount\pgfmanualdecomposecount
+
+\makeatother
+
+\def\decompose/#1/#2\nil{%
+ \def\test{#2}%
+ \ifx\test\empty%
+ % aha.
+ \index{#1@\protect\texttt{#1} key}%
+ \index{\mypath#1@\protect\texttt{#1}}%
+ \gdef\myname{#1}%
+ \pgfmanualpdflabel{#1}{}
+ \else%
+ \advance\pgfmanualdecomposecount by1\relax%
+ \ifnum\pgfmanualdecomposecount>2\relax%
+ \decomposetoodeep#1/#2\nil%
+ \else%
+ \iffirsttime%
+ \begingroup%
+ % also make a pdf link anchor with full key path.
+ \def\hyperlabelwithoutslash##1/\nil{%
+ \pgfmanualpdflabel{##1}{}%
+ }%
+ \hyperlabelwithoutslash/#1/#2\nil%
+ \endgroup%
+ \def\mypath{#1@\protect\texttt{/#1/}!}%
+ \firsttimefalse%
+ \else%
+ \expandafter\def\expandafter\mypath\expandafter{\mypath#1@\protect\texttt{#1/}!}%
+ \fi%
+ \def\firsttime{}%
+ \decompose/#2\nil%
+ \fi%
+ \fi%
+}
+
+\def\decomposetoodeep#1/#2/\nil{%
+ % avoid too-deep nesting in index
+ \index{#1/#2@\protect\texttt{#1/#2} key}%
+ \index{\mypath#1/#2@\protect\texttt{#1/#2}}%
+ \decomposefindlast/#1/#2/\nil%
+}
+\makeatletter
+\def\decomposefindlast/#1/#2\nil{%
+ \def\test{#2}%
+ \ifx\test\pgfutil@empty%
+ \gdef\myname{#1}%
+ \else%
+ \decomposefindlast/#2\nil%
+ \fi%
+}
+\makeatother
+\def\indexkey#1{%
+ \def\mypath{}%
+ \decompose#1/\nil%
+}
+
+\newenvironment{predefinedmethod}[1]{
+ \begin{pgfmanualentry}
+ \extractpredefinedmethod#1\@nil
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+\def\extractpredefinedmethod#1(#2)\@nil{%
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ Method \declare{\ttfamily #1}\texttt(#2\texttt) \hfill(predefined for all classes)}
+ \index{#1@\protect\texttt{#1} method}%
+ \index{Methods!#1@\protect\texttt{#1}}
+}
+
+
+\newenvironment{ooclass}[1]{
+ \begin{pgfmanualentry}
+ \def\currentclass{#1}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Class} \declare{\texttt{#1}}}
+ \index{#1@\protect\texttt{#1} class}%
+ \index{Class #1@Class \protect\texttt{#1}}%
+ \index{Classes!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{method}[1]{
+ \begin{pgfmanualentry}
+ \extractmethod#1\@nil
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+\def\extractmethod#1(#2)\@nil{%
+ \def\test{#1}
+ \ifx\test\currentclass
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ Constructor \declare{\ttfamily #1}\texttt(#2\texttt)}
+ \else
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ Method \declare{\ttfamily #1}\texttt(#2\texttt)}
+ \fi
+ \index{#1@\protect\texttt{#1} method}%
+ \index{Methods!#1@\protect\texttt{#1}}
+ \index{Class \currentclass!#1@\protect\texttt{#1}}%
+}
+
+\newenvironment{classattribute}[1]{
+ \begin{pgfmanualentry}
+ \extractattribute#1\@nil
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+\def\extractattribute#1=#2;\@nil{%
+ \def\test{#2}%
+ \ifx\test\@empty
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ Private attribute \declare{\ttfamily #1} \hfill (initially empty)}
+ \else
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ Private attribute \declare{\ttfamily #1} \hfill (initially {\ttfamily #2})}
+ \fi
+ \index{#1@\protect\texttt{#1} attribute}%
+ \index{Attributes!#1@\protect\texttt{#1}}
+ \index{Class \currentclass!#1@\protect\texttt{#1}}%
+}
+
+
+
+\newenvironment{predefinednode}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Predefined node} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} node}%
+ \index{Predefined node!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{coordinatesystem}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{Coordinate system} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} coordinate system}%
+ \index{Coordinate systems!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{snake}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\textbf{Snake} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} snake}%
+ \index{Snakes!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{decoration}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\textbf{Decoration} {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} decoration}%
+ \index{Decorations!#1@\protect\texttt{#1}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\def\pgfmanualbar{\char`\|}
+\makeatletter
+\newenvironment{pathoperation}[3][]{
+ \begin{pgfmanualentry}
+ \def\pgfmanualtest{#1}%
+ \pgfmanualentryheadline{%
+ \ifx\pgfmanualtest\@empty%
+ \pgfmanualpdflabel{#2}{}%
+ \fi%
+ \textcolor{gray}{{\ttfamily\char`\\path}\
+ \ \dots}
+ \declare{\texttt{\noligs{#2}}}#3\ \textcolor{gray}{\dots\texttt{;}}}%
+ \ifx\pgfmanualtest\@empty%
+ \index{#2@\protect\texttt{#2} path operation}%
+ \index{Path operations!#2@\protect\texttt{#2}}%
+ \fi%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+\newenvironment{datavisualizationoperation}[3][]{
+ \begin{pgfmanualentry}
+ \def\pgfmanualtest{#1}%
+ \pgfmanualentryheadline{%
+ \ifx\pgfmanualtest\@empty%
+ \pgfmanualpdflabel{#2}{}%
+ \fi%
+ \textcolor{gray}{{\ttfamily\char`\\datavisualization}\
+ \ \dots}
+ \declare{\texttt{\noligs{#2}}}#3\ \textcolor{gray}{\dots\texttt{;}}}%
+ \ifx\pgfmanualtest\@empty%
+ \index{#2@\protect\texttt{#2} (data visualization)}%
+ \index{Data visualization!#2@\protect\texttt{#2}}%
+ \fi%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+\makeatother
+
+\def\doublebs{\texttt{\char`\\\char`\\}}
+
+
+\newenvironment{package}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ {\ttfamily\char`\\usepackage\char`\{\declare{#1}\char`\}\space\space \char`\%\space\space \LaTeX}}
+ \index{#1@\protect\texttt{#1} package}%
+ \index{Packages and files!#1@\protect\texttt{#1}}%
+ \pgfmanualentryheadline{{\ttfamily\char`\\input \declare{#1}.tex\space\space\space \char`\%\space\space plain \TeX}}
+ \pgfmanualentryheadline{{\ttfamily\char`\\usemodule[\declare{#1}]\space\space \char`\%\space\space Con\TeX t}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{pgfmodule}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ {\ttfamily\char`\\usepgfmodule\char`\{\declare{#1}\char`\}\space\space\space
+ \char`\%\space\space \LaTeX\space and plain \TeX\space and pure pgf}}
+ \index{#1@\protect\texttt{#1} module}%
+ \index{Modules!#1@\protect\texttt{#1}}%
+ \pgfmanualentryheadline{{\ttfamily\char`\\usepgfmodule[\declare{#1}]\space\space \char`\%\space\space Con\TeX t\space and pure pgf}}
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{pgflibrary}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{\tikzname\ Library} \texttt{\declare{#1}}}
+ \index{#1@\protect\texttt{#1} library}%
+ \index{Libraries!#1@\protect\texttt{#1}}%
+ \vskip.25em%
+ {{\ttfamily\char`\\usepgflibrary\char`\{\declare{#1}\char`\}\space\space\space
+ \char`\%\space\space \LaTeX\space and plain \TeX\space and pure pgf}}\\
+ {{\ttfamily\char`\\usepgflibrary[\declare{#1}]\space\space \char`\%\space\space Con\TeX t\space and pure pgf}}\\
+ {{\ttfamily\char`\\usetikzlibrary\char`\{\declare{#1}\char`\}\space\space
+ \char`\%\space\space \LaTeX\space and plain \TeX\space when using \tikzname}}\\
+ {{\ttfamily\char`\\usetikzlibrary[\declare{#1}]\space
+ \char`\%\space\space Con\TeX t\space when using \tikzname}}\\[.5em]
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{purepgflibrary}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{{\small PGF} Library} \texttt{\declare{#1}}}
+ \index{#1@\protect\texttt{#1} library}%
+ \index{Libraries!#1@\protect\texttt{#1}}%
+ \vskip.25em%
+ {{\ttfamily\char`\\usepgflibrary\char`\{\declare{#1}\char`\}\space\space\space
+ \char`\%\space\space \LaTeX\space and plain \TeX}}\\
+ {{\ttfamily\char`\\usepgflibrary[\declare{#1}]\space\space \char`\%\space\space Con\TeX t}}\\[.5em]
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{tikzlibrary}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{%
+ \pgfmanualpdflabel{#1}{}%
+ \textbf{\tikzname\ Library} \texttt{\declare{#1}}}
+ \index{#1@\protect\texttt{#1} library}%
+ \index{Libraries!#1@\protect\texttt{#1}}%
+ \vskip.25em%
+ {{\ttfamily\char`\\usetikzlibrary\char`\{\declare{#1}\char`\}\space\space \char`\%\space\space \LaTeX\space and plain \TeX}}\\
+ {{\ttfamily\char`\\usetikzlibrary[\declare{#1}]\space \char`\%\space\space Con\TeX t}}\\[.5em]
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+
+\newenvironment{filedescription}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{File {\ttfamily\declare{#1}}}%
+ \index{#1@\protect\texttt{#1} file}%
+ \index{Packages and files!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+\newenvironment{packageoption}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{{\ttfamily\char`\\usepackage[\declare{#1}]\char`\{pgf\char`\}}}
+ \index{#1@\protect\texttt{#1} package option}%
+ \index{Package options for \textsc{pgf}!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+}
+{
+ \end{pgfmanualentry}
+}
+
+
+
+\newcommand\opt[1]{{\color{black!50!green}#1}}
+\newcommand\ooarg[1]{{\ttfamily[}\meta{#1}{\ttfamily]}}
+
+\def\opt{\afterassignment\pgfmanualopt\let\next=}
+\def\pgfmanualopt{\ifx\next\bgroup\bgroup\color{black!50!green}\else{\color{black!50!green}\next}\fi}
+
+
+
+\def\beamer{\textsc{beamer}}
+\def\pdf{\textsc{pdf}}
+\def\eps{\texttt{eps}}
+\def\pgfname{\textsc{pgf}}
+\def\tikzname{Ti\emph{k}Z}
+\def\pstricks{\textsc{pstricks}}
+\def\prosper{\textsc{prosper}}
+\def\seminar{\textsc{seminar}}
+\def\texpower{\textsc{texpower}}
+\def\foils{\textsc{foils}}
+
+{
+ \makeatletter
+ \global\let\myempty=\@empty
+ \global\let\mygobble=\@gobble
+ \catcode`\@=12
+ \gdef\getridofats#1@#2\relax{%
+ \def\getridtest{#2}%
+ \ifx\getridtest\myempty%
+ \expandafter\def\expandafter\strippedat\expandafter{\strippedat#1}
+ \else%
+ \expandafter\def\expandafter\strippedat\expandafter{\strippedat#1\protect\printanat}
+ \getridofats#2\relax%
+ \fi%
+ }
+
+ \gdef\removeats#1{%
+ \let\strippedat\myempty%
+ \edef\strippedtext{\stripcommand#1}%
+ \expandafter\getridofats\strippedtext @\relax%
+ }
+
+ \gdef\stripcommand#1{\expandafter\mygobble\string#1}
+}
+
+\def\printanat{\char`\@}
+
+\def\declare{\afterassignment\pgfmanualdeclare\let\next=}
+\def\pgfmanualdeclare{\ifx\next\bgroup\bgroup\color{red!75!black}\else{\color{red!75!black}\next}\fi}
+
+
+\let\textoken=\command
+\let\endtextoken=\endcommand
+
+\def\myprintocmmand#1{\texttt{\char`\\#1}}
+
+\def\example{\par\smallskip\noindent\textit{Example: }}
+\def\themeauthor{\par\smallskip\noindent\textit{Theme author: }}
+
+
+\def\indexoption#1{%
+ \index{#1@\protect\texttt{#1} option}%
+ \index{Graphic options and styles!#1@\protect\texttt{#1}}%
+}
+
+\def\itemcalendaroption#1{\item \declare{\texttt{#1}}%
+ \index{#1@\protect\texttt{#1} date test}%
+ \index{Date tests!#1@\protect\texttt{#1}}%
+}
+
+
+
+\def\class#1{\list{}{\leftmargin=2em\itemindent-\leftmargin\def\makelabel##1{\hss##1}}%
+\extractclass#1@\par\topsep=0pt}
+\def\endclass{\endlist}
+\def\extractclass#1#2@{%
+\item{{{\ttfamily\char`\\documentclass}#2{\ttfamily\char`\{\declare{#1}\char`\}}}}%
+ \index{#1@\protect\texttt{#1} class}%
+ \index{Classes!#1@\protect\texttt{#1}}}
+
+\def\partname{Part}
+
+\makeatletter
+\def\index@prologue{\section*{Index}\addcontentsline{toc}{section}{Index}
+ This index only contains automatically generated entries. A good
+ index should also contain carefully selected keywords. This index is
+ not a good index.
+ \bigskip
+}
+\c@IndexColumns=2
+ \def\theindex{\@restonecoltrue
+ \columnseprule \z@ \columnsep 29\p@
+ \twocolumn[\index@prologue]%
+ \parindent -30pt
+ \columnsep 15pt
+ \parskip 0pt plus 1pt
+ \leftskip 30pt
+ \rightskip 0pt plus 2cm
+ \small
+ \def\@idxitem{\par}%
+ \let\item\@idxitem \ignorespaces}
+ \def\endtheindex{\onecolumn}
+\def\noindexing{\let\index=\@gobble}
+
+
+\newenvironment{arrowtipsimple}[1]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\textbf{Arrow Tip Kind} {\ttfamily#1}}
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \def\currentarrowtype{#1}
+ \pgfmanualbody}
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{arrowtip}[4]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\textbf{Arrow Tip Kind} {\ttfamily#1}}
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+ \def\currentarrowtype{#1}
+ \begin{minipage}[t]{10.25cm}
+ #2
+ \end{minipage}\hskip5mm\begin{minipage}[t]{4.75cm}
+ \leavevmode\vskip-2em
+ \tikz{
+ \draw [black!50,line width=5mm,-{#1[#3,color=black]}] (-4,0) -- (0,0);
+ \foreach \action in {#4}
+ { \expandafter\processaction\action\relax }
+ }
+ \end{minipage}\par\smallskip
+ }
+{
+ \end{pgfmanualentry}
+}
+
+\newenvironment{arrowcap}[5]{
+ \begin{pgfmanualentry}
+ \pgfmanualentryheadline{\textbf{Arrow Tip Kind} {\ttfamily#1}}
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \pgfmanualbody
+ \def\currentarrowtype{#1}
+ \begin{minipage}[t]{10.25cm}
+ #2
+ \end{minipage}\hskip5mm\begin{minipage}[t]{4.75cm}
+ \leavevmode\vskip-2em
+ \tikz{
+ \path [tips, line width=10mm,-{#1[#3,color=black]}] (-4,0) -- (0,0);
+ \draw [line width=10mm,black!50] (-3,0) -- (#5,0);
+ \foreach \action in {#4}
+ { \expandafter\processaction\action\relax }
+ }
+ \end{minipage}\par\smallskip
+ }
+{
+ \end{pgfmanualentry}
+}
+
+\def\processaction#1=#2\relax{
+ \expandafter\let\expandafter\pgf@temp\csname manual@action@#1\endcsname
+ \ifx\pgf@temp\relax\else
+ \pgf@temp#2/0/\relax
+ \fi
+}
+\def\manual@action@length#1/#2/#3\relax{%
+ \draw [red,|<->|,semithick,xshift=#2] ([yshift=4pt]current bounding
+ box.north -| -#1,0) coordinate (last length) -- node
+ [above=-2pt] {|length|} ++(#1,0);
+}
+\def\manual@action@width#1/#2/#3\relax{%
+ \draw [overlay, red,|<->|,semithick] (.5,-#1/2) -- node [below,sloped] {|width|} (.5,#1/2);
+}
+\def\manual@action@inset#1/#2/#3\relax{%
+ \draw [red,|<->|,semithick,xshift=#2] ([yshift=-4pt]current bounding
+ box.south -| last length) -- node [below] {|inset|} ++(#1,0);
+}
+
+\newenvironment{arrowexamples}
+{\begin{tabbing}
+ \hbox to \dimexpr\linewidth-5.5cm\relax{\emph{Appearance of the below at line width} \hfil} \=
+ \hbox to 1.9cm{\emph{0.4pt}\hfil} \= \hbox to 2cm{\emph{0.8pt}\hfil} \= \emph{1.6pt} \\
+ }
+{\end{tabbing}\vskip-1em}
+
+\newenvironment{arrowcapexamples}
+{\begin{tabbing}
+ \hbox to \dimexpr\linewidth-5.5cm\relax{\emph{Appearance of the below at line width} \hfil} \=
+ \hbox to 1.9cm{\emph{1ex}\hfil} \= \hbox to 2cm{\emph{1em}\hfil} \\
+ }
+{\end{tabbing}\vskip-1em}
+
+\def\arrowcapexample#1[#2]{\def\temp{#1}\ifx\temp\pgfutil@empty\arrowcapexample@\currentarrowtype[{#2}]\else\arrowcapexample@#1[{#2}]\fi}
+\def\arrowcapexample@#1[#2]{%
+ {\sfcode`\.1000\small\texttt{#1[#2]}} \>
+ \kern-.5ex\tikz [baseline,>={#1[#2]}] \draw [line
+ width=1ex,->] (0,.5ex) -- (2em,.5ex); \>
+ \kern-.5em\tikz [baseline,>={#1[#2]}] \draw [line
+ width=1em,->] (0,.5ex) -- (2em,.5ex); \\
+}
+
+\def\arrowexample#1[#2]{\def\temp{#1}\ifx\temp\pgfutil@empty\arrowexample@\currentarrowtype[{#2}]\else\arrowexample@#1[{#2}]\fi}
+\def\arrowexample@#1[#2]{%
+ {\sfcode`\.1000\small\texttt{#1[#2]}} \>
+ \tikz [baseline,>={#1[#2]}] \draw [line
+ width=0.4pt,->] (0,.5ex) -- (2em,.5ex); thin \>
+ \tikz [baseline,>={#1[#2]}] \draw [line
+ width=0.8pt,->] (0,.5ex) -- (2em,.5ex); \textbf{thick} \>
+ \tikz [baseline,>={#1[#2]}] \draw [line
+ width=1.6pt,->] (0,.5ex) -- (3em,.5ex); \\
+}
+\def\arrowexampledup[#1]{\arrowexample[{#1] \currentarrowtype[}]}
+\def\arrowexampledupdot[#1]{\arrowexample[{#1] . \currentarrowtype[}]}
+
+\def\arrowexampledouble#1[#2]{\def\temp{#1}\ifx\temp\pgfutil@empty\arrowexampledouble@\currentarrowtype[{#2}]\else\arrowexampledouble@#1[{#2}]\fi}
+\def\arrowexampledouble@#1[#2]{%
+ {\sfcode`\.1000\small\texttt{#1[#2]} on double line} \>
+ \tikz [baseline,>={#1[#2]}]
+ \draw [double equal sign distance,line width=0.4pt,->] (0,.5ex) -- (2em,.5ex); thin \>
+ \tikz [baseline,>={#1[#2]}]
+ \draw [double equal sign distance,line width=0.8pt,->] (0,.5ex) -- (2em,.5ex); \textbf{thick} \>
+ \tikz [baseline,>={#1[#2]}]
+ \draw [double equal sign distance, line width=1.6pt,->] (0,.5ex) -- (3em,.5ex); \\
+}
+
+
+
+\newcommand\symarrow[1]{%
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \texttt{#1}& yields thick
+ \begin{tikzpicture}[arrows={#1-#1},thick,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture} and thin
+ \begin{tikzpicture}[arrows={#1-#1},thin,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}
+}
+\newcommand\symarrowdouble[1]{%
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \texttt{#1}& yields thick
+ \begin{tikzpicture}[arrows={#1-#1},thick,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}
+ and thin
+ \begin{tikzpicture}[arrows={#1-#1},thin,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}, double
+ \begin{tikzpicture}[arrows={#1-#1},thick,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw[double,double equal sign distance] (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture} and
+ \begin{tikzpicture}[arrows={#1-#1},thin,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw[double,double equal sign distance] (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}
+}
+
+\newcommand\sarrow[2]{%
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \index{#2@\protect\texttt{#2} arrow tip}%
+ \index{Arrow tips!#2@\protect\texttt{#2}}%
+ \texttt{#1-#2}& yields thick
+ \begin{tikzpicture}[arrows={#1-#2},thick,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture} and thin
+ \begin{tikzpicture}[arrows={#1-#2},thin,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}
+}
+
+\newcommand\sarrowdouble[2]{%
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \index{#2@\protect\texttt{#2} arrow tip}%
+ \index{Arrow tips!#2@\protect\texttt{#2}}%
+ \texttt{#1-#2}& yields thick
+ \begin{tikzpicture}[arrows={#1-#2},thick,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture} and thin
+ \begin{tikzpicture}[arrows={#1-#2},thin,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}, double
+ \begin{tikzpicture}[arrows={#1-#2},thick,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw[double,double equal sign distance] (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture} and
+ \begin{tikzpicture}[arrows={#1-#2},thin,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+ \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw[double,double equal sign distance] (0pt,.5ex) -- (1cm,.5ex);
+ \end{tikzpicture}
+}
+
+\newcommand\carrow[1]{%
+ \index{#1@\protect\texttt{#1} arrow tip}%
+ \index{Arrow tips!#1@\protect\texttt{#1}}%
+ \texttt{#1}& yields for line width 1ex
+ \begin{tikzpicture}[arrows={#1-#1},line width=1ex,baseline]
+ \useasboundingbox (-1mm,-0.5ex) rectangle (1.6cm,2ex);
+ \fill [black!15] (1.5cm,-.5ex) rectangle (1.6cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+ \draw (0pt,.5ex) -- (1.5cm,.5ex);
+ \end{tikzpicture}
+}
+\def\myvbar{\char`\|}
+\newcommand\plotmarkentry[1]{%
+ \index{#1@\protect\texttt{#1} plot mark}%
+ \index{Plot marks!#1@\protect\texttt{#1}}
+ \texttt{\char`\\pgfuseplotmark\char`\{\declare{\noligs{#1}}\char`\}} &
+ \tikz\draw[color=black!25] plot[mark=#1,mark options={fill=examplefill,draw=black}] coordinates{(0,0) (.5,0.2) (1,0) (1.5,0.2)};\\
+}
+\newcommand\plotmarkentrytikz[1]{%
+ \index{#1@\protect\texttt{#1} plot mark}%
+ \index{Plot marks!#1@\protect\texttt{#1}}
+ \texttt{mark=\declare{\noligs{#1}}} & \tikz\draw[color=black!25]
+ plot[mark=#1,mark options={fill=examplefill,draw=black}]
+ coordinates {(0,0) (.5,0.2) (1,0) (1.5,0.2)};\\
+}
+
+
+
+\ifx\scantokens\@undefined
+ \PackageError{pgfmanual-macros}{You need to use extended latex
+ (elatex) or (pdfelatex) to process this document}{}
+\fi
+
+\begingroup
+\catcode`|=0
+\catcode`[= 1
+\catcode`]=2
+\catcode`\{=12
+\catcode `\}=12
+\catcode`\\=12 |gdef|find@example#1\end{codeexample}[|endofcodeexample[#1]]
+|endgroup
+
+% define \returntospace.
+%
+% It should define NEWLINE as {}, spaces and tabs as \space.
+\begingroup
+\catcode`\^=7
+\catcode`\^^M=13
+\catcode`\^^I=13
+\catcode`\ =13%
+\gdef\returntospace{\catcode`\ =13\def {\space}\catcode`\^^I=13\def^^I{\space}}
+\gdef\showreturn{\show^^M}
+\endgroup
+
+\begingroup
+\catcode`\%=13
+\catcode`\^^M=13
+\gdef\commenthandler{\catcode`\%=13\def%{\@gobble@till@return}}
+\gdef\@gobble@till@return#1^^M{}
+\gdef\@gobble@till@return@ignore#1^^M{\ignorespaces}
+\gdef\typesetcomment{\catcode`\%=13\def%{\@typeset@till@return}}
+\gdef\@typeset@till@return#1^^M{{\def%{\char`\%}\textsl{\char`\%#1}}\par}
+\endgroup
+
+% Define tab-implementation functions
+% \codeexample@tabinit@replacementchars@
+% and
+% \codeexample@tabinit@catcode@
+%
+% They should ONLY be used in case that tab replacement is active.
+%
+% This here is merely a preparation step.
+%
+% Idea:
+% \codeexample@tabinit@catcode@ will make TAB active
+% and
+% \codeexample@tabinit@replacementchars@ will insert as many spaces as
+% /codeexample/tabsize contains.
+{
+\catcode`\^^I=13
+% ATTENTION: do NOT use tabs in these definitions!!
+\gdef\codeexample@tabinit@replacementchars@{%
+ \begingroup
+ \count0=\pgfkeysvalueof{/codeexample/tabsize}\relax
+ \toks0={}%
+ \loop
+ \ifnum\count0>0
+ \advance\count0 by-1
+ \toks0=\expandafter{\the\toks0\ }%
+ \repeat
+ \xdef\codeexample@tabinit@replacementchars@@{\the\toks0}%
+ \endgroup
+ \let^^I=\codeexample@tabinit@replacementchars@@
+}%
+\gdef\codeexample@tabinit@catcode@{\catcode`\^^I=13}%
+}%
+
+% Called after any options have been set. It assigns
+% \codeexample@tabinit@catcode
+% and
+% \codeexample@tabinit@replacementchars
+% which are used inside of
+%\begin{codeexample}
+% ...
+%\end{codeexample}
+%
+% \codeexample@tabinit@catcode is either \relax or it makes tab
+% active.
+%
+% \codeexample@tabinit@replacementchars is either \relax or it inserts
+% a proper replacement sequence for tabs (as many spaces as
+% configured)
+\def\codeexample@tabinit{%
+ \ifnum\pgfkeysvalueof{/codeexample/tabsize}=0\relax
+ \let\codeexample@tabinit@replacementchars=\relax
+ \let\codeexample@tabinit@catcode=\relax
+ \else
+ \let\codeexample@tabinit@catcode=\codeexample@tabinit@catcode@
+ \let\codeexample@tabinit@replacementchars=\codeexample@tabinit@replacementchars@
+ \fi
+}
+
+\newif\ifpgfmanualtikzsyntaxhilighting
+
+\pgfqkeys{/codeexample}{%
+ width/.code= {\setlength\codeexamplewidth{#1}},
+ graphic/.code= {\colorlet{graphicbackground}{#1}},
+ code/.code= {\colorlet{codebackground}{#1}},
+ execute code/.is if=code@execute,
+ hidden/.is if=code@hidden,
+ code only/.code= {\code@executefalse},
+ setup code/.code= {\pgfmanual@setup@codetrue\code@executefalse},
+ multipage/.code= {\code@executefalse\pgfmanual@multipage@codetrue},
+ pre/.store in=\code@pre,
+ post/.store in=\code@post,
+ % #1 is the *complete* environment contents as it shall be
+ % typeset. In particular, the catcodes are NOT the normal ones.
+ typeset listing/.code= {#1},
+ render instead/.store in=\code@render,
+ vbox/.code= {\def\code@pre{\vbox\bgroup\setlength{\hsize}{\linewidth-6pt}}\def\code@post{\egroup}},
+ ignorespaces/.code= {\let\@gobble@till@return=\@gobble@till@return@ignore},
+ leave comments/.code= {\def\code@catcode@hook{\catcode`\%=12}\let\commenthandler=\relax\let\typesetcomment=\relax},
+ tabsize/.initial=0,% FIXME : this here is merely used for indentation. It is just a TAB REPLACEMENT.
+ every codeexample/.style={width=4cm+7pt, tikz syntax=true},
+ from file/.code={\codeexamplefromfiletrue\def\codeexamplesource{#1}},
+ tikz syntax/.is if=pgfmanualtikzsyntaxhilighting,
+ animation list/.store in=\code@animation@list,
+ animation pre/.store in=\code@animation@pre,
+ animation post/.store in=\code@animation@post,
+ animation scale/.store in=\pgfmanualanimscale,
+ animation bb/.style={
+ animation pre={
+ \tikzset{
+ every picture/.style={
+ execute at begin picture={
+ \useasboundingbox[clip] #1;}
+ }
+ }
+ }
+ },
+ preamble/.store in=\code@preamble,
+}
+
+\def\pgfmanualanimscale{.5}
+
+\newread\examplesource
+
+
+% Opening, reading and closing the results file
+
+\def\opensource#1{
+ \immediate\openin\examplesource=#1
+}
+\def\do@codeexamplefromfile{%
+ \immediate\openin\examplesource\expandafter{\codeexamplesource}%
+ \def\examplelines{}%
+ \readexamplelines
+ \closein\examplesource
+ \expandafter\endofcodeexample\expandafter{\examplelines}%
+}
+
+\def\readexamplelines{
+ \ifeof\examplesource%
+ \else
+ \immediate\read\examplesource to \exampleline
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\examplelines\expandafter\expandafter\expandafter{\expandafter\examplelines\exampleline}
+ \expandafter\readexamplelines%
+ \fi
+}
+
+\let\code@animation@pre\pgfutil@empty
+\let\code@animation@post\pgfutil@empty
+\let\code@animation@list\pgfutil@empty
+
+\let\code@pre\pgfutil@empty
+\let\code@post\pgfutil@empty
+\let\code@render\pgfutil@empty
+\let\code@preamble\pgfutil@empty
+\def\code@catcode@hook{}
+
+\newif\ifpgfmanual@multipage@code
+\newif\ifpgfmanual@setup@code
+\newif\ifcodeexamplefromfile
+\newdimen\codeexamplewidth
+\newif\ifcode@execute
+\newif\ifcode@hidden
+\newbox\codeexamplebox
+\def\codeexample[#1]{%
+ \global\let\pgfmanual@do@this\relax%
+ \aftergroup\pgfmanual@do@this%
+ \begingroup%
+ \code@executetrue
+ \pgfqkeys{/codeexample}{every codeexample,#1}%
+ \pgfmanualswitchoncolors%
+ \ifcodeexamplefromfile\begingroup\fi
+ \codeexample@tabinit% assigns \codeexample@tabinit@[catcode,replacementchars]
+ \parindent0pt
+ \begingroup%
+ \par% this \par is not inside \ifcode@hidden because we want to switch to vmode
+ \ifcode@hidden\else
+ \medskip%
+ \fi
+ \let\do\@makeother%
+ \dospecials%
+ \obeylines%
+ \@vobeyspaces%
+ \catcode`\%=13%
+ \catcode`\^^M=13%
+ \code@catcode@hook%
+ \codeexample@tabinit@catcode
+ \relax%
+ \ifcodeexamplefromfile%
+ \expandafter\do@codeexamplefromfile%
+ \else%
+ \expandafter\find@example%
+ \fi}
+\def\endofcodeexample#1{%
+ \endgroup%
+ \ifpgfmanual@setup@code%
+ \gdef\pgfmanual@do@this{%
+ {%
+ \returntospace%
+ \commenthandler%
+ \xdef\code@temp{#1}% removes returns and comments
+ }%
+ \edef\pgfmanualmcatcode{\the\catcode`\^^M}%
+ \catcode`\^^M=9\relax%
+ \expandafter\scantokens\expandafter{\code@temp}%
+ \catcode`\^^M=\pgfmanualmcatcode%
+ }%
+ \fi%
+ \ifcode@hidden\else
+ \ifcode@execute%
+ \setbox\codeexamplebox=\hbox{%
+ \ifx\code@render\pgfutil@empty%
+ {%
+ {%
+ \returntospace%
+ \commenthandler%
+ \xdef\code@temp{#1}% removes returns and comments
+ }%
+ \catcode`\^^M=9%
+ \colorbox{graphicbackground}{\color{black}\ignorespaces%
+ \code@pre\expandafter\scantokens\expandafter{\code@temp\ignorespaces}\code@post\ignorespaces}%
+ }%
+ \else%
+ \global\let\code@temp\code@render%
+ \colorbox{graphicbackground}{\color{black}\ignorespaces%
+ \code@render}%
+ \fi%
+ }%
+ \ifx\code@animation@list\pgfutil@empty%
+ \else%
+ \setbox\codeexampleboxanim=\vbox{%
+ \rightskip0pt\leftskip0pt plus1filll%
+ \ifdim\wd\codeexamplebox>\codeexamplewidth%
+ \else%
+ \hsize\codeexamplewidth%
+ \advance\hsize by2cm%
+ \fi%
+ \leavevmode\catcode`\^^M=9%
+ \foreach \pgfmanualtime/\pgfmanualtimehow in\code@animation@list{%
+ \setbox\codeexampleboxanim=\hbox{\colorbox{animationgraphicbackground}{%
+ \tikzset{make snapshot of=\pgfmanualtime}%
+ \scalebox{\pgfmanualanimscale}{\color{black}\ignorespaces%
+ \code@animation@pre\expandafter\scantokens\expandafter{\code@temp\ignorespaces}\code@animation@post\ignorespaces}%
+ }}%
+ \space\raise4pt\hbox to0pt{\vrule width0pt height1em\hbox
+ to\wd\codeexampleboxanim{\hfil\scriptsize$t{=}\pgfmanualtimehow \mathrm s$\hfil}\hss}%
+ \lower\ht\codeexampleboxanim\box\codeexampleboxanim\hfil\penalty0\hskip0ptplus-1fil%
+ }%
+ }%
+ \setbox\codeexampleboxanim=\hbox{\hbox{}\hskip-2cm\box\codeexampleboxanim}%
+ \fi%
+ \ifdim\wd\codeexamplebox>\codeexamplewidth%
+ \def\code@start{\par}%
+ \def\code@flushstart{}\def\code@flushend{}%
+ \def\code@mid{\parskip2pt\par\noindent}%
+ \def\code@width{\linewidth-6pt}%
+ \def\code@end{}%
+ \else%
+ \def\code@start{%
+ \linewidth=\textwidth%
+ \parshape \@ne 0pt \linewidth
+ \leavevmode%
+ \hbox\bgroup}%
+ \def\code@flushstart{\hfill}%
+ \def\code@flushend{\hbox{}}%
+ \def\code@mid{\hskip6pt}%
+ \def\code@width{\linewidth-12pt-\codeexamplewidth}%
+ \def\code@end{\egroup}%
+ \fi%
+ \code@start%
+ \noindent%
+ \begin{minipage}[t]{\codeexamplewidth}\raggedright
+ \hrule width0pt%
+ \footnotesize\vskip-1em%
+ \code@flushstart\box\codeexamplebox\code@flushend%
+ \vskip0pt%
+ \leavevmode%
+ \box\codeexampleboxanim%
+ \vskip-1ex
+ \leavevmode%
+ \end{minipage}%
+ \else%
+ \def\code@mid{\par}
+ \def\code@width{\linewidth-6pt}
+ \def\code@end{}
+ \fi%
+ \code@mid%
+ \ifpgfmanual@multipage@code%
+ {%
+ \pgfkeysvalueof{/codeexample/prettyprint/base color}%
+ \pgfmanualdolisting{#1}%
+ }%
+ \else%
+ \colorbox{codebackground}{%
+ \pgfkeysvalueof{/codeexample/prettyprint/base color}%
+ \begin{minipage}[t]{\code@width}%
+ \pgfmanualdolisting{#1}%
+ \end{minipage}}%
+ \fi%
+ \code@end%
+ \par%
+ \medskip
+ \fi
+ \endcodeexample\endgroup%
+}
+
+\def\endcodeexample{\endgroup}
+\newbox\codeexampleboxanim
+
+\def\pgfmanualdolisting#1{%
+ {%
+ \let\do\@makeother
+ \dospecials
+ \frenchspacing\@vobeyspaces
+ \normalfont\ttfamily\footnotesize
+ \typesetcomment%
+ \codeexample@tabinit@replacementchars
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode \null \@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+ \obeylines
+ \everypar \expandafter{\the\everypar \unpenalty}%
+ \ifx\code@preamble\pgfutil@empty\else
+ \pgfutil@tempdima=\hsize
+ \vbox{\hsize=\pgfutil@tempdima
+ \scriptsize\detokenize\expandafter{\code@preamble}}%
+ \fi
+ \pgfkeysvalueof{/codeexample/typeset listing/.@cmd}{#1}\pgfeov
+ }%
+}
+
+\makeatother
+
+\usepackage{pgfmanual}
+
+
+% autoxref is now always on
+
+% \makeatletter
+% % \pgfautoxrefs will be defined by 'make dist'
+% \pgfutil@ifundefined{pgfautoxrefs}{%
+% \renewcommand\pgfmanualpdflabel[3][]{#3}% NO-OP
+% \def\pgfmanualpdfref#1#2{#2}%
+% \pgfkeys{
+% /pdflinks/codeexample links=false,% DISABLED.
+% }%
+% }{}
+% \makeatother
+
+\newdimen\pgfmanualcslinkpreskip
+
+% Styling of the pretty printer
+\pgfkeys{
+ /codeexample/syntax hilighting/.style={
+ /codeexample/prettyprint/key name/.code={\textcolor{keycolor}{\pgfmanualpdfref{##1}{\noligs{##1}}}},
+ /codeexample/prettyprint/key name with handler/.code 2 args={\textcolor{keycolor}{\pgfmanualpdfref{##1}{\noligs{##1}}}/\textcolor{blue!70!black}{\pgfmanualpdfref{/handlers/##2}{\noligs{##2}}}},
+ /codeexample/prettyprint/key value display only/.code={\textcolor{keycolor}{{\itshape{\let\pgfmanualwordstartup\relax\pgfmanualprettyprintcode{##1}}}}},
+ /codeexample/prettyprint/cs/.code={\textcolor{cscolor}{\pgfmanualcslinkpreskip4.25pt\pgfmanualpdfref{##1}{\noligs{##1}}}},
+ /codeexample/prettyprint/cs with args/.code 2 args={\textcolor{black}{\pgfmanualcslinkpreskip4.25pt\pgfmanualpdfref{##1}{\noligs{##1}}}\{\textcolor{black}{\pgfmanualprettyprintcode{##2}}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/pgfkeys/.initial=1,
+ /codeexample/prettyprint/cs/pgfkeys/.code 2 args={\textcolor{black}{\pgfmanualcslinkpreskip4.25pt\pgfmanualpdfref{##1}{\noligs{##1}}}\{\textcolor{black}{\pgfmanualprettyprintpgfkeys{##2}}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/begin/.initial=1,
+ /codeexample/prettyprint/cs/begin/.code 2 args={\textcolor{black}{##1}\{\textcolor{cscolor}{\pgfmanualpdfref{##2}{\noligs{##2}}}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/end/.initial=1,
+ /codeexample/prettyprint/cs/end/.code 2 args={\textcolor{black}{##1}\{\textcolor{cscolor}{\pgfmanualpdfref{##2}{\noligs{##2}}}\pgfmanualclosebrace},
+ /codeexample/prettyprint/word/.code={\pgfmanualwordstartup{\begingroup\pgfkeyssetvalue{/pdflinks/search key prefixes in}{}\pgfmanualpdfref{##1}{\noligs{##1}}\endgroup}},
+ /codeexample/prettyprint/point/.code={\textcolor{pointcolor}{\noligs{##1}}},%
+ /codeexample/prettyprint/point with cs/.code 2 args={\textcolor{pointcolor}{(\pgfmanualpdfref{##1}{\noligs{##1}}:\noligs{##2}}},%
+ /codeexample/prettyprint/comment font=\itshape,
+ /codeexample/prettyprint/base color/.initial=\color{basecolor},
+ /pdflinks/render hyperlink/.code={%
+ {\setbox0=\hbox{##1}%
+ \rlap{{\color{linkcolor}\dimen0\wd0\advance\dimen0by-\pgfmanualcslinkpreskip\hskip\pgfmanualcslinkpreskip\vrule width\dimen0 height-1pt depth1.6pt}}%
+ \box0%
+ }%
+ }
+ },/codeexample/syntax hilighting
+}
+
+\colorlet{keycolor}{black}
+\colorlet{cscolor}{black}
+\colorlet{pointcolor}{black}
+\colorlet{basecolor}{black}
+\colorlet{linkcolor}{black!8}
+
+\def\pgfmanualswitchoncolors{%
+ \colorlet{keycolor}{green!50!black}%
+ \colorlet{cscolor}{blue!70!black}
+ \colorlet{pointcolor}{violet}
+ \colorlet{basecolor}{black!55}
+ \colorlet{linkcolor}{white}
+}
+
+\makeatletter
+
+\def\pgfmanualwordstartup{\textcolor{black}}
+
+\def\noligs#1{\pgfmanualnoligs#1\kern0pt--\pgf@stop}%
+\def\pgfmanualnoligs#1--{%
+ \pgfutil@ifnextchar\pgf@stop{#1\pgfutil@gobble}{#1-\kern0pt-\kern0pt\pgfmanualnoligs}%
+}
+\makeatother
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "beameruserguide"
+%%% End:
diff --git a/graphics/pgf/base/doc/pgfmanual.pdf b/graphics/pgf/base/doc/pgfmanual.pdf
new file mode 100644
index 0000000000..5d149f21c7
--- /dev/null
+++ b/graphics/pgf/base/doc/pgfmanual.pdf
Binary files differ
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-actions.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-actions.tex
new file mode 100644
index 0000000000..fa2f26158b
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-actions.tex
@@ -0,0 +1,530 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Using Paths}
+
+\subsection{Overview}
+
+Once a path has been constructed, it can be \emph{used} in different ways. For
+example, you can draw the path or fill it or use it for clipping.
+
+Numerous graph parameters influence how a path will be rendered. For example,
+when you draw a path, the line width is important as well as the dashing
+pattern. The options that govern how paths are rendered can all be set with
+commands starting with |\pgfset|. \emph{All options that influence how a path
+is rendered always influence the complete path.} Thus, it is not possible to
+draw part of a path using, say, a red color and drawing another part using a
+green color. To achieve such an effect, you must use two paths.
+
+In detail, paths can be used in the following ways:
+%
+\begin{enumerate}
+ \item You can \emph{stroke} (also known as \emph{draw}) a path.
+ \item You can add \emph{arrow tips} to a path.
+ \item You can \emph{fill} a path with a uniform color.
+ \item You can \emph{clip} subsequent renderings against the path.
+ \item You can \emph{shade} a path.
+ \item You can \emph{use the path as bounding box} for the whole picture.
+\end{enumerate}
+%
+You can also perform any combination of the above, though it makes no sense to
+fill and shade a path at the same time.
+
+To perform (a combination of) the first four actions, you can use the following
+command:
+%
+\begin{command}{\pgfusepath\marg{actions}}
+ Applies the given \meta{actions} to the current path. Afterwards, the
+ current path is (globally) empty. The following actions are possible:
+ %
+ \begin{itemize}
+ \item \declare{|fill|} fills the path. See Section~\ref{section-fill}
+ for further details.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ \item \declare{|stroke|} strokes the path. See
+ Section~\ref{section-stroke} for further details.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ \item \declare{|draw|} has the same effect as |stroke|.
+ \item \declare{|clip|} clips all subsequent drawings against the path.
+ Always suppresses arrow tips. See Section~\ref{section-clip} for
+ further details.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfusepath{stroke,clip}
+ \pgfpathcircle{\pgfpoint{1cm}{1cm}}{0.5cm}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ \item \declare{|discard|} discards the path, that is, it is not used at
+ all. Giving this option (alone) has the same effect as giving an
+ empty options list.
+ \end{itemize}
+ %
+ When more than one of the first three actions are given, they are applied
+ in the above ordering, regardless of their ordering in \meta{actions}.
+ Thus, |{stroke,fill}| and |{fill,stroke}| have the same effect.
+\end{command}
+
+To shade a path, use the |\pgfshadepath| command, which is explained in
+Section~\ref{section-shadings}.
+
+
+\subsection{Stroking a Path}
+\label{section-stroke}
+
+When you use |\pgfusepath{stroke}| to stroke a path, several graphic parameters
+influence how the path is drawn. The commands for setting these parameters are
+explained in the following.
+
+Note that all graphic parameters apply to the path as a whole, never only to a
+part of it.
+
+All graphic parameters are local to the current |{pgfscope}|, but they persists
+past \TeX\ groups, \emph{except} for the interior rule (even-odd or nonzero)
+and the arrow tip kinds. The latter graphic parameters only persist till the
+end of the current \TeX\ group, but this may change in the future, so do not
+count on this.
+
+
+\subsubsection{Graphic Parameter: Line Width}
+
+\begin{command}{\pgfsetlinewidth\marg{line width}}
+ This command sets the line width for subsequent strokes (in the current
+ |pgfscope|). The line width is given as a normal \TeX\ dimension like
+ |0.4pt| or |1mm|.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetlinewidth{1mm}
+ \pgfpathmoveto{\pgfpoint{0mm}{0mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{0mm}}
+ \pgfusepath{stroke}
+ \pgfsetlinewidth{2\pgflinewidth} % double in size
+ \pgfpathmoveto{\pgfpoint{0mm}{5mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{5mm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{textoken}{\pgflinewidth}
+ You can access the current line width via the \TeX\ dimension
+ |\pgflinewidth|. It will be set to the correct line width, that is, even
+ when a \TeX\ group closed, the value will be correct since it is set
+ globally, but when a |{pgfscope}| closes, the value is set to the correct
+ value it had before the scope.
+\end{textoken}
+
+
+\subsubsection{Graphic Parameter: Caps and Joins}
+
+\begin{command}{\pgfsetbuttcap}
+ Sets the line cap to a butt cap. See Section~\ref{section-cap-joins} for an
+ explanation of what this is.
+\end{command}
+%
+\begin{command}{\pgfsetroundcap}
+ Sets the line cap to a round cap. See again Section~\ref{section-cap-joins}.
+\end{command}
+\begin{command}{\pgfsetrectcap}
+ Sets the line cap to a square cap. See again Section~\ref{section-cap-joins}.
+\end{command}
+%
+\begin{command}{\pgfsetroundjoin}
+ Sets the line join to a round join. See again Section~\ref{section-cap-joins}.
+\end{command}
+%
+\begin{command}{\pgfsetbeveljoin}
+ Sets the line join to a bevel join. See again Section~\ref{section-cap-joins}.
+\end{command}
+%
+\begin{command}{\pgfsetmiterjoin}
+ Sets the line join to a miter join. See again Section~\ref{section-cap-joins}.
+\end{command}
+%
+\begin{command}{\pgfsetmiterlimit\marg{miter limit factor}}
+ Sets the miter limit to \meta{miter limit factor}. See again
+ Section~\ref{section-cap-joins}.
+\end{command}
+
+
+\subsubsection{Graphic Parameter: Dashing}
+
+\begin{command}{\pgfsetdash\marg{list of even length of dimensions}\marg{phase}}
+ Sets the dashing of a line. The first entry in the list specifies the
+ length of the first solid part of the list. The second entry specifies the
+ length of the following gap. Then comes the length of the second solid
+ part, following by the length of the second gap, and so on. The
+ \meta{phase} specifies where the first solid part starts relative to the
+ beginning of the line.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetdash{{0.5cm}{0.5cm}{0.1cm}{0.2cm}}{0cm}
+ \pgfpathmoveto{\pgfpoint{0mm}{0mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{0mm}}
+ \pgfusepath{stroke}
+ \pgfsetdash{{0.5cm}{0.5cm}{0.1cm}{0.2cm}}{0.1cm}
+ \pgfpathmoveto{\pgfpoint{0mm}{1mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1mm}}
+ \pgfusepath{stroke}
+ \pgfsetdash{{0.5cm}{0.5cm}{0.1cm}{0.2cm}}{0.2cm}
+ \pgfpathmoveto{\pgfpoint{0mm}{2mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{2mm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ Use |\pgfsetdash{}{0pt}| to get a solid dashing.
+\end{command}
+
+
+\subsubsection{Graphic Parameter: Stroke Color}
+
+\begin{command}{\pgfsetstrokecolor\marg{color}}
+ Sets the color used for stroking lines to \meta{color}, where \meta{color}
+ is a \LaTeX\ color like |red| or |black!20!red|. Unlike the |\color|
+ command, the effect of this command lasts till the end of the current
+ |{pgfscope}| and not till the end of the current \TeX\ group.
+
+ The color used for stroking may be different from the color used for
+ filling. However, a |\color| command will always ``immediately override''
+ any special settings for the stroke and fill colors.
+
+ In plain \TeX, this command will also work, but the problem of
+ \emph{defining} a color arises. After all, plain \TeX\ does not provide
+ \LaTeX\ colors. For this reason, \pgfname\ implements a minimalistic
+ ``emulation'' of the |\definecolor|, |\colorlet|, and |\color| commands.
+ Only gray-scale and rgb colors are supported. For most cases this turns out
+ to be enough.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetlinewidth{1pt}
+ \color{red}
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{3mm} \pgfusepath{fill,stroke}
+ \pgfsetstrokecolor{black}
+ \pgfpathcircle{\pgfpoint{1cm}{0cm}}{3mm} \pgfusepath{fill,stroke}
+ \color{red}
+ \pgfpathcircle{\pgfpoint{2cm}{0cm}}{3mm} \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetcolor\marg{color}}
+ Sets both the stroke and fill color. The difference to the normal |\color|
+ command is that the effect lasts till the end of the current |{pgfscope}|,
+ not only till the end of the current \TeX\ group.
+\end{command}
+
+
+\subsubsection{Graphic Parameter: Stroke Opacity}
+
+You can set the stroke opacity using |\pgfsetstrokeopacity|. This command is
+described in Section~\ref{section-transparency}.
+
+
+\subsubsection{Inner Lines}
+
+When a path is stroked, it is possible to request that it is stroked twice, the
+second time with a different line width and a different color. This is a useful
+effect for creating ``double'' lines, for instance by setting the line width to
+2pt and stroking a black line and then setting the inner line width to 1pt and
+stroking a white line on the same path as the original path. This results in
+what looks like two lines, each of thickness 0.5pt, spaced 1pt apart.
+
+You may wonder why there is direct support for this ``double stroking'' in the
+basic layer. After all, this effect is easy to achieve ``by hand''. The main
+reason is that arrow tips must be treated in a special manner when such
+``double lines'' are present. First, the order of actions is important: First,
+the (thick) main line should be stroked, then the (thin) inner line, and only
+then should the arrow tip be drawn. Second, the way an arrow tip looks
+typically depends strongly on the width of the inner line, so the arrow tip
+code, which is part of the basic layer, needs access to the inner line
+thickness.
+
+Two commands are used to set the inner line width and color.
+
+\begin{command}{\pgfsetinnerlinewidth\marg{dimension}}
+ This command sets the width of the inner line. Whenever a path is stroked
+ (and only then), it will be stroked normally and, afterward, it is stroked
+ once more with the color set to the inner line color and the line width set
+ to \meta{dimension}.
+
+ In case arrow tips are added to a path, the path is first stroked normally,
+ then the inner line is stroked, and then the arrow tip is added. In case
+ the main path is shortened because of the added arrow tip, this shortened
+ path is double stroked, not the original path (which is exactly what you
+ want).
+
+ When the inner line width is set to 0pt, which is the default, no inner
+ line is stroked at all (not even a line of width 0pt). So, in order to
+ ``switch off'' double stroking, set \meta{dimension} to~|0pt|.
+
+ The setting of the inner line width is local to the current \TeX\ group and
+ \emph{not} to the current \pgfname\ scope.
+
+ Note that inner lines will \emph{not} be drawn for paths that are also used
+ for clipping. However, this may change in the future, so you should not
+ depend on this.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfsetlinewidth{2pt}
+ \pgfsetinnerlinewidth{1pt}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetinnerstrokecolor\marg{color}}
+ This command sets the \meta{color} that is to be used when the inner line
+ is stroked. The effect of this command is also local to the current \TeX\
+ group.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfsetlinewidth{2pt}
+ \pgfsetinnerlinewidth{1pt}
+ \pgfsetinnerstrokecolor{red!50}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Arrow Tips on a Path}
+\label{section-tips}
+
+After a path has been drawn, \pgfname\ can add arrow tips at the ends,
+depending on how the |tips| key is set, on whether |stroke| or |clip| are used
+and on whether the path contains closed subpaths. The exact rules when arrow
+tips are added are explained in Section~\ref{section-arrow-tips-where}.
+
+\begin{command}{\pgfsetarrowsstart\marg{start arrow tip specification}}
+ Sets the arrow tip kind used at the start of a (possibly curved) path. The
+ syntax of the \meta{start arrow specification} is detailed in
+ Section~\ref{section-arrow-spec}.
+
+ To ``clear'' the start arrow, say |\pgfsetarrowsstart{}|.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetarrowsstart{Latex[length=10pt]}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfusepath{stroke}
+ \pgfsetarrowsstart{Computer Modern Rightarrow}
+ \pgfpathmoveto{\pgfpoint{0cm}{2mm}}
+ \pgfpathlineto{\pgfpoint{1cm}{2mm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ The effect of this command persists only till the end of the current \TeX\
+ scope.
+\end{command}
+
+\begin{command}{\pgfsetarrowsend\marg{end arrow tip specification}}
+ Sets the arrow tip kind used at the end of a path.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetarrowsstart{Latex[length=10pt]}
+ \pgfsetarrowsend{Computer Modern Rightarrow}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetarrows\marg{argument}}
+ The \meta{argument} can be of the form \meta{start arrow tip
+ specification}|-|\meta{end arrow tip specification}. In this case, both the
+ start and the end arrow specification are set:
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetarrows{Latex[length=10pt]->>}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ Alternatively, \meta{argument} can be of the form |[|\meta{arrow keys}|]|.
+ In this case, the \meta{arrow keys} will be set for all arrow tips in the
+ current scope, see Section~\ref{section-arrow-scopes}.
+\end{command}
+
+\begin{command}{\pgfsetshortenstart\marg{dimension}}
+ This command will shortened the start of every stroked path by the given
+ dimension. This shortening is done in addition to automatic shortening done
+ by a start arrow, but it can be used even if no start arrow is given.
+
+ It is usually better to use the |sep| key with arrow tips.
+
+ This command is useful if you wish arrows or lines to ``stop shortly
+ before'' a given point.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathcircle{\pgfpointorigin}{5mm}
+ \pgfusepath{stroke}
+ \pgfsetarrows{Latex-}
+ \pgfsetshortenstart{4pt}
+ \pgfpathmoveto{\pgfpoint{5mm}{0cm}} % would be on the circle
+ \pgfpathlineto{\pgfpoint{2cm}{0cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetshortenend\marg{dimension}}
+ Works like |\pgfsetshortenstart|.
+\end{command}
+
+
+\subsection{Filling a Path}
+\label{section-fill}
+
+Filling a path means coloring every interior point of the path with the current
+fill color. It is not always obvious whether a point is ``inside'' a path when
+the path is self-intersecting and/or consists or multiple parts. In this case
+either the nonzero winding number rule or the even-odd crossing number rule is
+used to decide which points lie ``inside''. These rules are explained in
+Section~\ref{section-rules}.
+
+
+\subsubsection{Graphic Parameter: Interior Rule}
+
+You can set which rule is used using the following commands:
+
+\begin{command}{\pgfseteorule}
+ Dictates that the even-odd rule is used in subsequent fillings in the
+ current \emph{\TeX\ scope}. Thus, for once, the effect of this command does
+ not persist past the current \TeX\ scope.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfseteorule
+ \pgfpathcircle{\pgfpoint{0mm}{0cm}}{7mm}
+ \pgfpathcircle{\pgfpoint{5mm}{0cm}}{7mm}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetnonzerorule}
+ Dictates that the nonzero winding number rule is used in subsequent
+ fillings in the current \TeX\ scope. This is the default.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetnonzerorule
+ \pgfpathcircle{\pgfpoint{0mm}{0cm}}{7mm}
+ \pgfpathcircle{\pgfpoint{5mm}{0cm}}{7mm}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Graphic Parameter: Filling Color}
+
+\begin{command}{\pgfsetfillcolor\marg{color}}
+ Sets the color used for filling paths to \meta{color}. Like the stroke
+ color, the effect lasts only till the next use of |\color|.
+\end{command}
+
+
+\subsubsection{Graphic Parameter: Fill Opacity}
+
+You can set the fill opacity using |\pgfsetfillopacity|. This command is
+described in Section~\ref{section-transparency}.
+
+
+\subsection{Clipping a Path}
+\label{section-clip}
+
+When you add the |clip| option, the current path is used for clipping
+subsequent drawings. The same rule as for filling is used to decide whether a
+point is inside or outside the path, that is, either the even-odd rule or the
+nonzero rule.
+
+Clipping never enlarges the clipping area. Thus, when you clip against a
+certain path and then clip again against another path, you clip against the
+intersection of both.
+
+The only way to enlarge the clipping path is to end the |{pgfscope}| in which
+the clipping was done. At the end of a |{pgfscope}| the clipping path that was
+in force at the beginning of the scope is reinstalled.
+
+
+\subsection{Using a Path as a Bounding Box}
+\label{section-using-bb}
+
+When you add the |use as bounding box| option, the bounding box of the picture
+will be enlarged such that the path in encompassed, but any \emph{subsequent}
+paths of the current \TeX\ scope will not have any effect on the size of the
+bounding box. Typically, you use this command at the very beginning of a
+|{pgfpicture}| environment. Alternatively, you can use |\pgfresetboundingbox|,
+followed by |\pgfusepath{use as bounding box}| to overrule the picture's
+bounding box completely.
+%
+\begin{codeexample}[]
+Left
+\begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2ex}{1ex}}
+ \pgfusepath{use as bounding box} % draws nothing
+
+ \pgfpathcircle{\pgfpointorigin}{2ex}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+right.
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-animations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-animations.tex
new file mode 100644
index 0000000000..32bfa24386
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-animations.tex
@@ -0,0 +1,1348 @@
+% Copyright 2015 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Animations}
+\label{section-base-animations}
+
+\begin{pgfmodule}{animations}
+ This module contains the basic layer support of animations, which is
+ documented in the following.
+\end{pgfmodule}
+
+This section described the basic layer support of animations, the \tikzname\
+support is described in Section~\ref{section-tikz-animations}. As always,
+\tikzname\ mainly converts syntactic constructs (like the special colon or
+quote syntax) to appropriate basic layer commands, which are documented here.
+Note, however, that while many attributes and options are the same on both
+layers, some things are handled differently on the basic layer.
+
+
+\subsection{Overview}
+
+An \emph{animation} changes the way some part of a graphic looks like over
+time. The archetypical animation is, of course, a \emph{movement} of node, but
+a change of, say, the opacity of a path is also an animation. \pgfname\ allows
+you to specify such animations using a set of commands and keys that are
+documented in the following.
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{opacity}{
+ whom = node, begin on = {click}, entry = {0s}{1}, entry = {2s}{0} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+
+Differently from other packages, the animations created by \pgfname\ are not
+precomputed sequences of pictures that are displayed in rapid succession.
+Rather, an animation created by \pgfname\ consists mainly of an annotation in
+the output that a certain attribute of a certain object should change over time
+in some specific way when the object is displayed. It is the job of the
+document viewer application to actually compute and display the animation.
+Interestingly, this means that animations neither increase the size of the
+ouput files noticably nor does it put a special burden on \TeX. The hard and
+complicated calculations are done by the viewer application, not by \TeX\ and
+\pgfname.
+
+Only few viewer applications and formats are currently ``up to the job'' of
+displaying animations. In particular, the popular \textsc{pdf} format does
+\emph{not} allow one to specify animations in this way (one can partly ``fake''
+animations at the high price of including a great number of precomputed
+pictures and using JavaScript in special viewers, but this is really not the
+same thing as what \pgfname\ does). Indeed, currently only the \textsc{svg}
+format allows one to specify animations in a sensible way. Thus, \pgfname's
+animations will only be displayed when \textsc{svg} is used as output format.
+
+Because of the shortcomings of the other formats and, also, for purposes of
+printing and depicting animations in a sequential manner, \pgfname\ also allows
+you to create ``snapshots'' of animations. As an example, the following code
+shows how the same drawing is shown at different ``time snapshots'':
+%
+\begin{codeexample}[width=3.9cm]
+\tikz [make snapshot of=0.5s] \scoped :rotate = { 0s = "0", 2s = "90" }
+ \node [draw=blue, very thick] {\pgfname};
+\tikz [make snapshot of=1s] \scoped :rotate = { 0s = "0", 2s = "90" }
+ \node [draw=blue, very thick] {\pgfname};
+\tikz [make snapshot of=1.5s] \scoped :rotate = { 0s = "0", 2s = "90" }
+ \node [draw=blue, very thick] {\pgfname};
+\tikz [make snapshot of=2s] \scoped :rotate = { 0s = "0", 2s = "90" }
+ \node [draw=blue, very thick] {\pgfname};
+\end{codeexample}
+
+
+\subsection{Animating an Attribute}
+
+\subsubsection{The Main Command}
+
+Creating an animation is done using the command |\pgfanimateattribute|, which
+takes a to-be-animated attribute and options specifying the timeline:
+
+\begin{command}{\pgfanimateattribute\marg{attribute}\marg{options}}
+ Adds an animation of the \meta{attribute} of a future \emph{object} to the
+ current graphic. Attributes are things like the ``fill opacity'' or the
+ transformation matrix or the line width.
+
+ The \meta{options} are keys that configure how the attribute changes over
+ time. Using the |entry| key multiple times, you specify which value the
+ chosen attribute should have at different points in time. Unless special
+ keys are used, ``outside'' the specified timeline the animation has no
+ effect:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2,2.5}]
+\tikz {
+ \pgfanimateattribute{opacity}{
+ whom = node, begin on = {click}, entry = {0s}{1}, entry = {2s}{0} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+
+ Other keys, like |repeats|, allow you to specify how the animation behaves
+ ``as a whole''. These keys are documented later in this section.
+
+
+ \medskip
+ \textbf{The Attributes}
+
+ In detail, the |\pgfanimateattribute| command opens a \TeX-scope, looks up
+ the \emph{type} values of the specified \meta{attribute} have (if you wish
+ to animate the |opacity| of an object, the type is ``scalar'' meaning that
+ entries must be scalar numbers; when you animate the |fill| attribute, the
+ type is ``color'' and values must be colors, and so on), and then executes
+ the \meta{options} with the path prefix |/pgf/animation|. Finally, an
+ appropriate system layer command |\pgfsysanimate...| is called to create
+ the actual animation and the scope is closed.
+
+ The following \meta{attributes} are permissible:
+
+ \begin{tabular}{ll}
+ \emph{Attribute} & \emph{Type} \\
+ |draw|, |fill| & color \\
+ |line width| & dimension \\
+ |motion| & scalar \\
+ |opacity|, |fill opacity|, |draw opacity| & scalar \\
+ |path| & path \\
+ |rotate| & scalar \\
+ |scale| & scaling \\
+ |softpath| & softpath \\
+ |translate| & point \\
+ |view| & viewbox \\
+ |visible| & boolean \\
+ |stage| & boolean \\
+ |xskew|, |yskew| & scalar \\
+ \end{tabular}
+
+ These attributes are detailed in Sections
+ \ref{section-base-animation-painting}
+ to~\ref{section-base-animation-views}, but here is a quick overview:
+ %
+ \begin{itemize}
+ \item |draw| and |fill| refer to the color used to draw (stroke) and
+ fill paths in an object, respectively. Typical values for this
+ attribute are |red| or |black!10|.
+ \item |line width| is, of course, the line width used in an object.
+ Typical values are |0.4pt| or |1mm|. Note that you (currently)
+ cannot use keys like |thin| or |thick| here, but this may change in
+ the future.
+ \item |motion| is a slightly special attribute: It allows you to
+ specify a path along which the object should be moved (using the
+ |along| key). The values given to the |entry| key for this
+ attribute refer to a \emph{fraction of the distance along the
+ path}. See the |along| key for details.
+ \item |opacity| and the variants |fill opacity| and |draw opacity|
+ animate the opacity of an object. Allowed values range between 0
+ and 1.
+ \item |path| allows you to animate a path (it will morph). The
+ ``values'' are now paths themselves. See
+ Section~\ref{section-base-animation-paths} for details.
+ \item |rotate| refers to a rotation of the object. Values for the
+ |entry| key are the rotation angles like |0| or |90|.
+ \item |scale| refers to the scaling of the object. Values are either
+ single scalars values (like |1| or |1.5|) or two numbers separated
+ by a comma (like |1,1.5| or |0.5,2|), referring to the $x$-scaling
+ and $y$-scaling.
+ \item |softpath| is a special case of the |path| attribute, see
+ Section~\ref{section-base-animation-paths} once more.
+ \item |translate| shifts the object by a certain vector. Values are
+ points like |\pgfpoint{1cm}{2cm}|.
+ \item |view| allows you to animate the view box of a view, see
+ Section~\ref{section-base-animation-views} for details.
+ \item |visible| refers to the visibility of an object. Allowed values
+ are |true| and |false|.
+ \item |stage| is identical to |visible|, but when the object is not
+ animated, it will be hidden by default.
+ \item |xskew| and |yskew| skew the object. Attributes are angles like
+ |0| or |45| or even |90|.
+ \end{itemize}
+
+
+ \medskip
+ \textbf{The Target Object}
+
+ As stated earlier, the \meta{options} are used to specify the object whose
+ attribute for which an animation should be added to the picture. Indeed,
+ you \emph{must} specify the object explicitly using the |whom| key and you
+ must do so \emph{before} the object is created. Note that, in contrast, in
+ \textsc{svg} you can specify an animation more or less anywhere and then
+ use hyper-references to link the animation to the to-be-animated object;
+ \pgfname\ insists that you specify the animation before the object. This is
+ a bit of a bother in some situations, but it is the only way to ensure that
+ \pgfname\ has a fighting chance to attach some additional code to the
+ object (which is necessary for almost all animations of the transformation
+ matrix).
+
+ \begin{key}{/pgf/animation/whom=\meta{id}\opt{|.|\meta{type}}}
+ You \emph{must} use this key once which each call of the
+ |\pgfanimateattribute| command. The \meta{id} and the optional
+ \meta{type} (which is whatever follows the first dot) will be passed to
+ |\pgfidrefnextuse|, see that command for details.
+ \end{key}
+
+ As explained in the introduction of this chapter, an ``animation'' is just
+ a bit of special text in the output document asking a viewer application to
+ animate the object at some later time. The |\pgfanimateattribute| command
+ inserts this special text immediately, even though it refers to an object
+ created only later on. Normally, this is not a problem, but the special
+ text should be on the same page as the to-be-animated object. To ensure
+ this, it suffices to call |\pgfanimateattribute| no earlier than the
+ beginning of the |pgfpicture| containing the object.
+
+
+ \medskip
+ \textbf{Naming the Animation}
+
+ You can assign a name to an animation for later (or early) reference. In
+ particular, it is possible to begin \emph{another} animation relative to
+ the beginning or end of this animation and for referencing this animation
+ must be assigned a name. See the |of| and |of next| keys for details.
+
+ \begin{key}{/pgf/animation/name=\meta{name}}
+ Assigns a name to the animation by which it can be referenced using the
+ |of| and |of next| keys in another animation.
+ %
+\begin{codeexample}[animation list={.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {end, of next = my move animation, delay = 1s},
+ entry = {0s}{0}, entry = {2s}{90}, begin snapshot = 3s, }
+ \pgfanimateattribute{translate}{
+ name = my move animation, whom = node, begin on = {click},
+ entry = {0s}{\pgfpointorigin}, entry = {2s}{\pgfpoint{0cm}{-5mm}} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Here!};
+}
+\end{codeexample}
+ \end{key}
+\end{command}
+
+\begin{command}{\pgfanimateattributecode\marg{attribute}\marg{code}}
+ The command works like |\pgfanimateattribute|, only instead of
+ \meta{options} you specify some \meta{code} whose job is to setup the
+ options.
+\end{command}
+
+
+\subsubsection{Specifying the Timeline}
+
+The core key for specifying how an attribute varies over time is the |entry|
+key:
+%
+\begin{key}{/pgf/animation/entry=\marg{time}\marg{value}}
+ You use this key repeatedly to specify the different values that the
+ \meta{attribute} should have over time. At the \meta{time} specified, the
+ \meta{attribute} will have the value specified as \meta{value}:
+ %
+\begin{codeexample}[animation list={.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click},
+ entry = {0s}{0}, entry = {1s}{90}, entry = {1.1s}{45}, entry = {2s}{90}
+ }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+
+ You need to call |entry| once for each time in the timeline for which you
+ want to specify a \meta{value} explicitly. Between these times, the values
+ get interpolated (see below for details). You need to specify the
+ \meta{time}s in non-decreasing order (it is permissible and sometimes also
+ necessary to specify the same time twice, namely to create a ``jump'' of
+ the value of some attribute).
+
+ The \meta{time} is parsed using the command |\pgfparsetime| described
+ later.
+
+
+ \medskip
+ \textbf{Start and end of the timeline.}
+ The first and last times of the timeline are a bit special: The timeline
+ starts on the first time and the duration of the timeline is the difference
+ between the first and last time. ``Starting'' on the start time actually
+ means that any beginnings (see the |begin| and |end| keys) get offset by
+ the start time; similarly end times are offset by this value.
+
+
+ \medskip
+ \textbf{Syntax of the values.}
+ The syntax of the \meta{value} varies according to the type of the
+ \meta{attribute}. In detail, these are:
+
+ \begin{tabular}{lp{12cm}}
+ \emph{Type} & \emph{Syntax} \\
+ color & Standard color syntax like |red| or |black!10| \\
+ scalar & A value parsed using |\pgfmathparse| \\
+ dimension & A dimension parsed using |\pgfmathparse| \\
+ path & A sequence of path construction commands \\
+ softpath & A sequence of soft path construction commands \\
+ scaling & A scalar value or a pair of scalar values separated by a comma \\
+ point & A \pgfname-point like |\pgfpoint{1cm}{5mm}| \\
+ viewbox & Two \pgfname-points \\
+ boolean & |true| or |false| \\
+ \end{tabular}
+
+
+ \medskip
+ \textbf{Interpolation between key times.}
+ You use the |entry| key repeatedly, namely once for each ``key time'',
+ which is a time point for which you specify the value of the attribute
+ explicitly. Between these key times, the attribute's value is interpolated.
+ Normally, this is just a linear interpolation, but you can influence this
+ using the following keys, see Section~\ref{section-anim-smooth} for
+ details.
+
+ \begin{key}{/pgf/animations/exit control=\marg{time fraction}\marg{value fraction}}
+ Same as |/tikz/animate/options/exit control|.
+ %
+\begin{codeexample}[animation list={0.333/\frac{1}{3},0.666/\frac{2}{3},1,1.333/1\frac{1}{3},1.666/1\frac{2}{3}}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \pgfanimateattribute{translate}{
+ whom = node, begin on = {click},
+ exit control={1}{0},
+ entry = {0s}{\pgfpointorigin},
+ linear, % revert to default
+ entry = {1s}{\pgfpoint{0cm}{-5mm}},
+ entry control={0}{1},
+ entry = {2s}{\pgfpoint{0cm}{-10mm}} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/animations/entry control=\marg{time fraction}\marg{value fraction}}
+ Works like |exit control|.
+ \end{key}
+
+ \begin{key}{/pgf/animations/linear}
+ A shorthand for |exit control={0}{0}, entry control={1}{1}|. This will
+ (re)install a linear curve.
+ \end{key}
+
+ \begin{key}{/pgf/animations/stay}
+ Same as |/tikz/animate/options/stay|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2,2.5}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \pgfanimateattribute{translate}{
+ whom = node, begin on = {click},
+ entry = {0s}{\pgfpointorigin},
+ stay,
+ entry = {1s}{\pgfpoint{0cm}{-5mm}},
+ linear,
+ entry = {2s}{\pgfpoint{0cm}{-10mm}},
+ entry = {3s}{\pgfpoint{0cm}{-15mm}} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/animations/jump}
+ Same as |/tikz/animate/options/jump|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \pgfanimateattribute{translate}{
+ whom = node, begin on = {click},
+ entry = {0s}{\pgfpointorigin},
+ jump,
+ entry = {1s}{\pgfpoint{0cm}{-1cm}},
+ linear,
+ entry = {2s}{\pgfpoint{0cm}{-2cm}} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+When the time of an animation lies outside the timeline specified by the
+|entry| keys, no animation is present. This means that the value of the
+attribute is the object's scope is used instead. Using the following key, you
+can set this value directly:
+
+\begin{key}{/tikz/animations/base=\meta{value}}
+ The syntax of the \meta{value} is the same as for the |entry| key. The
+ \meta{value} is installed as the value of the object's attribute whenever
+ the timeline is not active. This makes it easy to specify the value of an
+ attribute when the animation is ``not running''.
+ %
+\begin{codeexample}[animation list={-1,0,1,2,3}]
+\tikz {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click},
+ entry = {0s}{90}, entry = {2s}{180},
+ base = 45
+ }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{key}
+
+It may happen that there is more than one timeline active that is ``trying to
+modify'' a given attribute. In this case, the following rules are used to
+determine, which timeline ``wins'':
+%
+\begin{enumerate}
+ \item If no animation is active at the current time (all animation either
+ have not yet started or they have already ended), then the base value
+ given in the animation encountered last in the code is used. (If there
+ are no base values, the attribute is taken from the surrounding scope.)
+ \item If there are several active animations, the one that has started last
+ is used and the its value is used.
+ \item If there are several active animations that have started at the same
+ time, the one that comes last in the code is used.
+\end{enumerate}
+
+Note that these rules do not apply to transformations of the canvas since these
+are always additive (or, phrased differently, they are always all active and
+the effects accumulate).
+
+\begin{command}{\pgfparsetime\marg{time}}
+ This command works like |\pgfmathparse| (indeed, it calls is internally),
+ but returns the result in the macro |\pgftimeresult| rather than
+ |\pgfmathresult|. Furthermore, the following changes are installed:
+ %
+ \begin{itemize}
+ \item The postfix operator |s| is added, which has no effect.
+ \item The postfix operator |ms| is added, which divides a number by
+ 1000, so |2ms| equals 0.002s.
+ \item The postfix operator |min| is added, which multiplies a number by
+ 60.
+ \item The postfix operator |h| is added, which multiplies a number by
+ 3600.
+ \item The infix operator |:| is redefined, so that it multiplies its
+ first argument by 60 and adds the second. This implies that |1:20|
+ equals 80s and |01:00:00| equals 3600s.
+ \item The parsing of octal numbers is switched off to allow things like
+ |01:08| for 68s.
+ \end{itemize}
+\end{command}
+
+
+\subsubsection{``Anti-Animations'': Snapshots}
+
+There are a number of situations in which you want the ``opposite'' of an
+animation to happen: You want to create a ``still image''. For instance, when
+you want to print an animation you will typically wish to show one or more
+``temporal snapshots'' of the animation. Also, you may wish to specify a value
+for an object when it is \emph{not} being animated.
+
+Let us start with creating a snapshot:
+
+\begin{command}{\pgfsnapshot\marg{time}}
+ When this command is used inside a \TeX\ scope, the behaviour of
+ |\pgfanimateattribute| changes: Instead of adding an animation to the
+ object and the attribute, the object's attribute is set to value it would
+ have during the animation at time \meta{time}. Note that when this command
+ is used in a \TeX\ scope, no animation is created and no support by the
+ driver is needed (so, it works with \textsc{pdf}).
+ %
+\begin{codeexample}[]
+\tikz [make snapshot of=1s,
+ animate = { myself: = {
+ :rotate = { 0s = "0", 2s = "90" },
+ :color = { 0s = "red", 2s = "green" },
+ :line width = { 0s = "0mm", 4s = "4mm" }
+ }}]
+ \node [fill=black!20, draw] { Node };
+\end{codeexample}
+
+
+ \medskip\textbf{Timing and Events.}
+ The timeline of an animation normally starts at a ```moment |0s|'' and the
+ \meta{time} is considered relative to this time. For instance, if a
+ timeline contains, say, the settings |entry={2s}{0}| and |entry={3s}{10}|
+ and \marg{time} is set to |2.5s|, then the value the attribute will get is
+ 5.
+
+ It is, however, also possible to specify that animations begin and end at
+ certain times relative to events like a |click| event. \emph{These events
+ are not relevant with respect to snapshots.} However, there is one key that
+ allows you to specify the beginning of the snapshot timeline:
+ %
+ \begin{key}{/tikz/animations/begin snapshot=\meta{begin time}}
+ When this key is used inside the options of |\pgfanimateattribute|,
+ with respect to snapshots, the timeline begins at \meta{begin time}.
+ This means that, if the snapshot time is set to \meta{time} and the
+ beginning of the snapshot's timeline is set to \meta{begin time}, the
+ attribute is set to the value of the timeline at time $\meta{time} -
+ \meta{begin time}$.
+
+ The idea is that when you make a snapshot of several animations and all
+ of them have started at different times because of different events,
+ you use |begin snapshot| with each object and attribute to directly
+ specify when these different events have happened.
+ \end{key}
+
+ Note that the |end| keys have no effect with snapshots, that is, with a
+ snapshot all animations always run till the end of the timeline (which may
+ or may not be ``forever'').
+
+
+ \medskip\textbf{Limitations.}
+ For snapshots, the value an animation has at time \meta{time} must be
+ computed by \TeX. While in many cases this is easy to achieve, in some
+ cases this is not trivial such as a timeline for a path with repeats plus
+ smoothing via splines. An additional complication is the fact that an
+ animation may be specified at a place far removed from the actual
+ to-be-animated object. For these reasons, certain limitations apply to
+ snapshots:
+ %
+ \begin{itemize}
+ \item The |begin| and |begin on| keys have no effect (but |begin
+ snapshot| has one.
+ \item The |end| and |end on| keys have no effect.
+ \item The |current value| may not be used in a timeline (since
+ \pgfname\ cannot really determine this value).
+ \item The |accumulating| specification may not be used with paths,
+ views, or motions.
+ \item Since the timing computations are done using \TeX\ code, they are
+ not necessarily stable. For instance, when a time interval is very
+ small and there are many repeats or when a spline is very
+ complicated, the calculated values may not be fully accurate.
+ \end{itemize}
+\end{command}
+
+\begin{command}{\pgfsnapshotafter\marg{time}}
+ This command works exactly like |\pgfsnapshot| only the ``moment'' that
+ \meta{time} refers to is conceptually $\meta{time} + \epsilon$: When
+ timeline specifies several values for \meta{time}, this command will select
+ the last value at \meta{time}, while |\pgfsnapshot| will select the first
+ value at \meta{time}. Similarly, when a timeline ends at \meta{time},
+ |\pgfsnapshot| will select the last value of the timeline while
+ |\pgfsnapshotafter| will not apply the animation any more:
+ %
+\begin{codeexample}[]
+\foreach \t in {0,1,2,3,4} {
+ \pgfsnapshot{\t}
+ \tikz :rotate = { 0s = "0", 2s = "90", 2s = "180", 4s = "270" }
+ \node [draw=blue, very thick] {f}; }
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\foreach \t in {0,1,2,3,4} {
+ \pgfsnapshotafter{\t}
+ \tikz :rotate = { 0s = "0", 2s = "90", 2s = "180", 4s = "270" }
+ \node [draw=blue, very thick] {f}; }
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Animating Color, Opacity, Visibility, and Staging}
+\label{section-base-animation-painting}
+
+\begin{animateattribute}{fill}
+ You can animate the color of the target object of an animation using the
+ attributes |fill| or |draw|, which animate the fill color and the drawing
+ (stroking) color, respectively. To animate both the fill and draw color,
+ you need to create two animations, one for each.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{fill}{
+ whom = node.background, begin on = {click},
+ entry = {0s}{white}, entry = {2s}{red} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{animateattribute}
+
+\begin{animateattribute}{draw}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{draw}{
+ whom = node.background, begin on = {click},
+ entry = {0s}{white}, entry = {2s}{red} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+\end{animateattribute}
+
+When the target of a color animation is a scope, you animate the color ``used
+in this scope'' for filling or stroking. However, when an object inside the
+scope has its color set explicitly, this color overrules the color of the
+scope:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(1.5,-0.75) rectangle (3,0.75)}]
+\tikz {
+ \pgfanimateattribute{fill}{
+ whom = example, begin on = {click, of next=node},
+ entry = {0s}{white}, entry = {2s}{red} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \begin{scope}[name = example]
+ \fill (1.5,-0.75) rectangle ++ (1,1);
+ \fill [blue] (2,-0.25) rectangle ++ (1,1);
+ \end{scope}
+}
+\end{codeexample}
+
+Note that in certain cases, a graphic scope may contain graphic objects with
+their colors set explicitly ``in places where you do not expect it'': In
+particular, a node normally consists at least of a background path and a text.
+For both the text and for the background path, colors will be set for the text
+and also for the path explicitly. This means that when you pick the fill
+attribute of a node as the target of an animation, you will \emph{not} animate
+the color of the background path in case this color has been set explicitly.
+Instead, you must choose the background path of the node as the target of the
+animation. Fortunately, this is easy to achieve since when the background path
+of a node is created, the identifier type is set to |background|, which in turn
+allows you to access it as \meta{node}|.background| through the |whom| key.
+
+The text of a node also gets it color set explicitly, which means that a change
+of the node's scope's color has no effect on the text color. Instead, you must
+choose \meta{name}|.text| as the target (or, if the node has more parts, use
+the name of the part as the identifier type instead of |text|).
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(1.1,-0.9) rectangle (2.9,0.9)}]
+\tikz {
+ \pgfanimateattribute{fill}{
+ whom = example, begin on = {click, of next=node},
+ entry = {0s}{white}, entry = {2s}{red} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \node at (2,0) (example) [fill = blue!20, circle] {No effect}; }
+\end{codeexample}
+
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(1.1,-0.9) rectangle (2.9,0.9)}]
+\tikz {
+ \pgfanimateattribute{fill}{
+ whom = example.background, begin on = {click, of next=node},
+ entry = {0s}{white}, entry = {2s}{red} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \node at (2,0) (example) [fill = blue!20, circle] {Effect}; }
+\end{codeexample}
+
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(1.1,-0.9) rectangle (2.9,0.9)}]
+\tikz {
+ \pgfanimateattribute{fill}{
+ whom = example.text, begin on = {click, of next=node},
+ entry = {0s}{white}, entry = {2s}{red} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \node at (2,0) (example) [fill = blue!20, circle, font=\huge] {Text}; }
+\end{codeexample}
+
+Similarly to the color, you can also set the opacity used for filling and for
+drawing. You specify the opacity using a number between 0 (transparent) and 1
+(opaque).
+
+\begin{animateattribute}{fill opacity}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{fill opacity}{
+ whom = node, begin on = {click}, entry = {0s}{1}, entry = {2s}{0} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+\end{animateattribute}
+
+\begin{animateattribute}{draw opacity}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{draw opacity}{
+ whom = node, begin on = {click}, entry = {0s}{1}, entry = {2s}{0} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+\end{animateattribute}
+
+\begin{animateattribute}{opacity}
+ Unlike colors, where there is no joint attribute for filling and stroking,
+ there is a single |opacity| attribute in addition to the above two
+ attributes. If supported by the driver, it treats the graphic object to
+ which it is applied as a transparency group. In essence, ``this attribute
+ does what you want'' at least in most situations.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{opacity}{
+ whom = node, begin on = {click}, entry = {0s}{1}, entry = {2s}{0} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{animateattribute}
+
+\begin{animateattribute}{visible}
+ The difference between the |visible| attribute and an opacity of |0| is
+ that an invisible object cannot be clicked and does not need to be
+ rendered. The (only) two possible values for this attribute are |false| and
+ |true|.
+ %
+\begin{codeexample}[animation list={1,2,3,4}]
+\tikz {
+ \pgfanimateattribute{visible}{
+ whom = node, begin on = {click}, entry = {0s}{false}, entry = {2s}{false} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{animateattribute}
+
+\begin{animateattribute}{stage}
+ This attribute is the same as the |visible| attribute, only |base=false| is
+ set by default. This means that the object is \emph{only} visible when you
+ explicitly during the time the entries are set to |true|. The idea behind
+ the name ``stage'' is that the object is normally ``off stage'' and when
+ you explicitly set the ``stage attribute'' to |true| the object ``enters''
+ the stage and ``leaves'' once more when it is no longer ``on stage''.
+ %
+\begin{codeexample}[animation list={-1,0,1,2,3},animation bb={(1.3,-0.7) rectangle (2.7,0.7)}]
+\tikz {
+ \pgfanimateattribute{stage}{
+ whom = example, begin on = {click, of next=node},
+ entry = {0s}{true}, entry = {2s}{true} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \node at (2,0) (example) [fill = blue!20, circle] {Effect}; }
+\end{codeexample}
+ %
+\end{animateattribute}
+
+
+\subsection{Animating Paths and their Rendering}
+\label{section-base-animation-paths}
+
+You can animate the appearance of a path in the following ways:
+
+\begin{animateattribute}{line width}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{line width}{
+ whom = node, begin on = {click}, entry = {0s}{1pt}, entry = {2s}{5mm} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ The possible values passed to the |entry| key are, of course, dimensions.
+\end{animateattribute}
+
+\begin{animateattribute}{dash}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{dash}{
+ whom = node, begin on = {click}, entry = {0s}{{{10pt}{1pt}}{0pt}},
+ entry = {2s}{{{1pt}{10pt}}{0pt}} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{dash}{
+ whom = node, begin on = {click}, entry = {0s}{{{1cm}{1pt}}{0pt}},
+ entry = {2s}{{{1cm}{1pt}}{1cm}} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ To specify the dash pattern, you specify a sequence of ``on and off''
+ dimensions; see |\pgfsetdash| for details. Note that you \emph{must}
+ specify the same number of elements in all patterns of a timeline: You
+ cannot specify that the dash pattern for |1s| is |{1pt}{2pt}| and for |2s|
+ is |{1pt}{3pt}{2pt}| since the number of elements would differ. In
+ particular, you cannot (sensibly) use |current value| for the first entry
+ since this corresponds to an empty dash pattern (even when you have
+ specified a dash pattern for the target object: this pattern will not be
+ attached to the to-be-animated scope or object but to a surrounding scope
+ and, thus, the to-be-animated scope will not have any dash pattern
+ installed).
+\end{animateattribute}
+
+\begin{animateattribute}{path}
+ You can animate the path itself:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pgfanimateattribute{path}{
+ whom = node.background.path, begin on = {click, of next=node},
+ entry = {0s}{\pgfpathellipse{\pgfpointorigin}
+ {\pgfpointxy{1}{0}}{\pgfpointxy{0}{1.5}}},
+ entry = {2s}{\pgfpathellipse{\pgfpointxy{.5}{0}}
+ {\pgfpointxy{.5}{.5}}{\pgfpointxy{0.25}{.25}}}}
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ The path is specified by giving path construction commands as in the above
+ example. They will be executed in a special protected scope to ensure that
+ they have only little side effects.
+
+ As for the dash pattern, you must ensure that all paths in the timeline
+ have the same structure (same sequence of path construction commands); only
+ the coordinates may differ. In particular, you cannot say that the path at
+ |1s| is a rectangle using |\pgfpathrectangle| and at |2s| is a circle using
+ |\pgfpathcircle|. Instead, you would have to ensure that at both times that
+ path consists of appropriate Bézier curves.
+
+ Unlike the dash pattern, the to-be-animated object is, indeed, the path
+ itself and not some special scope. This means that you can use the |current
+ value| for the start path. However, this also means that you really must
+ pick \emph{the path object} as the target of the animation. In conjunction
+ with \tikzname, this will be an object of type |path| as in the above
+ example.
+
+ When a path is animated, it cannot have ``normal'' arrows attached to it
+ since due to the way \pgfname\ adds arrow tips to paths, these would not
+ ``move along'' with the path (you get an error message if you try).
+ However, it still \emph{is} possible to add arrow tips to an animated path,
+ only you need to use the |arrows| key described next.
+
+ Concerning the bounding box computation of the path, a bounding box for all
+ paths mentioned for any time point is used as the overall bounding box.
+\end{animateattribute}
+
+\begin{key}{/pgf/animation/arrows=\meta{start tip spec}|-|\meta{end tip spec}}
+ This key specifies arrow tips during the animation of the path. The syntax
+ for the arrow tips is the same syntax as the |\pgfsetarrow| command or
+ \tikzname's |arrows| key. The specified start and end arrow tips are
+ rendered as ``markers'', which are added to the path \emph{only} during the
+ animation. The markers are rotated along with the path in exactly the same
+ way as normal arrow tips would be. To be precise, the rules used for the
+ computation of where arrow tips go and in which direction they head is not
+ always the same for ``static'' arrow tips (arrow tips added to a normal
+ path) and the ``dynamic'' arrow tips based on markers; namely when the
+ paths are very short or closed. For this reason, you should add arrow tips
+ to animated paths only when the paths are ``nice and simple'' in the sense
+ that they consist of a single segment whose ends are reasonably long.
+
+ In addition to adding the arrow tips to the path during the animation, the
+ path gets shortened as necessary to compensate for the extend of the arrow
+ tips. However, for this to work, the arrow tips have to be specified before
+ path values are specified (since the shortening is done immediately when a
+ path value is parsed).
+ %
+\begin{codeexample}[animation list={0,1,2,3,4},animation bb={(0.9,-0.1)rectangle(2.1,1.1)}]
+\tikz {
+ \pgfanimateattribute{path}{
+ whom = p.path, begin on = {click, of next=node}, arrows = ->,
+ entry = {1s}{\pgfpathmoveto{\pgfpoint{1cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1cm}}},
+ entry = {3s}{\pgfpathmoveto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{5mm}}}}
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \draw [very thick, blue, name=p] (1,0.5) -- (2,0.5);
+}
+\end{codeexample}
+
+ Note that the markers that visualize the arrow tips are rendered only once
+ per animation. In consequence, ``bending'' arrow tips cannot be rendered
+ correctly: As a path ``morphs'' a bend arrow tip needs not only to rotate
+ along, but must actually ``bend along'', which is not supported (neither by
+ \pgfname\ nor by \textsc{svg}).
+
+ As pointed out earlier, an animated path cannot have ``static'' arrow tips.
+ However, when you specify a |base| value, which is the path used whenever
+ there is no active animation, \emph{will} use the arrow tips. As a result,
+ you can use this to animate a path with an arrow tip:
+ %
+\begin{codeexample}[animation list={0,1,2,3,4},animation bb={(0.9,-0.1)rectangle(2.1,1.1)}]
+\tikz {
+ \pgfanimateattribute{path}{
+ whom = p.path, begin on = {click, of next=node}, arrows = ->,
+ base = {\pgfpathmoveto{\pgfpoint{1cm}{5mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{5mm}}},
+ entry = {1s}{\pgfpathmoveto{\pgfpoint{1cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1cm}}},
+ entry = {3s}{\pgfpathmoveto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{5mm}}}}
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \draw [very thick, blue, name=p];
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/animation/shorten >=\meta{dimension}}
+ Just like the normal \tikzname\ key |shorten >|, this key specifies an
+ extra shortening of to-be-animated paths. Whenever a path is parsed as a
+ value for a path animation, it gets shortened at the end by the
+ \meta{dimension} (and, additionally, by the length of the attached arrow
+ tip). Just like the |arrows| key, this key must be given before the path
+ entries are specified.
+ %
+\begin{codeexample}[animation list={0,1,2,3,4},animation bb={(0.9,-0.1)rectangle(2.1,1.1)}]
+\tikz {
+ \pgfanimateattribute{path}{
+ whom = p.path, begin on = {click, of next=node}, arrows = ->,
+ shorten > = 2mm,
+ base = {\pgfpathmoveto{\pgfpoint{1cm}{5mm}}
+ \pgfpathlineto{\pgfpoint{2cm}{5mm}}},
+ entry = {1s}{\pgfpathmoveto{\pgfpoint{1cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1cm}}},
+ entry = {3s}{\pgfpathmoveto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{5mm}}}}
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \draw (0.9,-0.1) grid (2.1,1.1);
+ \draw [help lines] (0.9,-0.1) grid[step=1mm] (2.1,1.1);
+ \draw [very thick, blue, name=p];
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/animation/shorten <=\meta{dimension}}
+ Works like |shorten >|.
+\end{key}
+
+
+\subsection{Animating Transformations and Views}
+\label{section-base-animation-views}
+
+In order to animate the canvas transformation matrix, you do not animate an
+attribute called ``|transform|'' (or something similar). Rather, there are
+several keys that all manipulate the canvas transformation matrix in different
+ways. These keys, taken in appropriate combination, allow you to achieve any
+particular canvas transformation matrix. All keys that animate the
+transformation matrix \emph{always} accumulate.
+
+Some, but not all, of these keys also have an effect on the bounding box
+computation: The |translate| and |motion| attribute change the computation of
+the bounding box in such a way that it is chosen large enough as to include the
+whole picture during all stages of the animation (however, if there are
+multiple transformations active at the same time, the computation may not be
+correct). In contrast, |scale|, |rotate| and |skew| animations change the
+canvas transformation, but are ignored for the bounding box computation. When
+in doubt, please set the bounding box explicitly.
+
+Let us start with the basic keys that allow you to change the canvas
+transformation matrix directly:
+
+\begin{animateattribute}{scale}
+ The |scale| attribute adds an animation of the scaling:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{scale}{
+ whom = node, begin on = {click},
+ entry = {0s}{0.5}, entry = {2s}{0.75,1.5} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ The values passed to the |entry| key must either be single scalar values or
+ a pair of such numbers separated by a comma (which then refer to the $x$-
+ and $y$-scaling).
+\end{animateattribute}
+
+\begin{animateattribute}{rotate}
+ The |rotate| key adds an animation of the rotation:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click},
+ entry = {0s}{45}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ The values are scalar values representing a rotation in degrees.
+\end{animateattribute}
+
+\begin{animateattribute}{xskew}
+ The |xskew| and |yskew| keys (and also |skew x| and |skew y|, which are
+ aliases) add an animation of the skew (given in degrees, not as a slant):
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{xskew}{
+ whom = node, begin on = {click}, entry = {0s}{0}, entry = {2s}{45} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ The values are scalar values.
+\end{animateattribute}
+
+\begin{animateattribute}{yskew}
+ See |xskew|.
+\end{animateattribute}
+
+\begin{animateattribute}{skew x}
+ An alias of |xskew|.
+\end{animateattribute}
+
+\begin{animateattribute}{skew y}
+ An alias of |yskew|.
+\end{animateattribute}
+
+\begin{animateattribute}{translate}
+ The |translate| key adds an animation of the translation (shift):
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{translate}{
+ whom = node, begin on = {click},
+ entry = {0s}{\pgfpointorigin}, entry = {2s}{\pgfpoint{5mm}{-5mm}} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!};
+}
+\end{codeexample}
+ %
+ The values are \pgfname-points.
+
+ Unlike for the previous canvas transformations, for this key the bounding
+ box computation is changed: All points in the to-be-animated scope do not
+ only contribute to the normal bounding box, but they also contribute
+ shifted by all points in the entry list. The effect is that a bounding box
+ is computed that encompasses the animated scope at all stages.
+\end{animateattribute}
+
+For all of these attributes, the following key is of importance:
+%
+\begin{key}{/pgf/animation/origin=\meta{pgf point}}
+ An animation of the canvas transformation is added to all other
+ transformations from surrounding or interior scopes. This means that, in
+ particular, the origin of a canvas transformation is, by default, the
+ origin of the canvas of the scope surrounding the transformation object.
+
+ For some canvas animations, like a rotation or a scaling, you will
+ typically wish to use a different origin (like the center of an object that
+ is to be rotated or scaled). You can achieve this effect by surrounding the
+ object by a scope that shifts the canvas to the desired origin, followed by
+ a scope whose transformation matrix you animate, followed by a scope that
+ shifts back the canvas.
+
+ The |origin| key simplifies this process by allowing you to specify the
+ origin of the transformation directly. Internally, however, all this key
+ does is to create the above-mentioned scopes with the necessary shifts.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click},
+ origin = \pgfpoint{-5mm}{0mm}, entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{animateattribute}{motion}
+ A second way of changing the canvas transformation matrix is to use the
+ |motion| attribute:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{motion}{
+ whom = node, begin on = {click},
+ along = \pgfpathcircle{\pgfpointorigin}{5mm},
+ entry = {0s}{.25}, entry = {2s}{.5} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+
+ Just like the |translate| attribute, this key also changes the bounding box
+ computation.
+ %
+ \begin{key}{/pgf/animation/along=\meta{path}}
+ This key must be used with |motion| attribute to specify a path along
+ which the transformation matrix will be ``moved'' (that is, a shift
+ transformation will be added to the different points on the path).
+
+ The values passed to the |entry| key specify fractions of the distance
+ along the \meta{path}. That means, when you provide a value of |0|, you
+ reference the start point of the path, a value of |1| references the
+ end of the path and |0.5| referenced the point halfway along the path.
+ %
+\begin{codeexample}[animation list={0.25,0.5,0.75,1,1.25,1.5,1.75,2,2.25,2.5}]
+\tikz [very thick] {
+ \pgfanimateattribute{motion}{
+ whom = node, begin on = {click},
+ along = \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{0mm}{5mm}},
+ entry = {0s}{0}, entry = {1s}{0.5}, entry = {2s}{0.25}, entry={3s}{1} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/animation/rotate along=\meta{Boolean} (default true)}
+ When set to |true|, the |along| key additionally adds a rotation that
+ varies in such a way that a tangent to the path always points right.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [very thick] {
+ \pgfanimateattribute{motion}{
+ whom = node, begin on = {click},
+ rotate along = true,
+ along = \pgfpathmoveto {\pgfpointorigin}
+ \pgfpathcurveto{\pgfpoint{5mm}{0cm}}{\pgfpoint{5mm}{0cm}}
+ {\pgfpoint{5mm}{5mm}},
+ entry = {0s}{0}, entry = {2s}{1} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ \end{key}
+\end{animateattribute}
+
+The final method of changing the transformation matrix is to animate a
+\emph{view.}
+
+\begin{animateattribute}{view}
+ A view is a canvas transformation that shifts and scales the canvas in such
+ a way that a certain rectangle ``matches'' another rectangle: The idea is
+ that you ``look through'' a ``window'' (the view) and ``see'' a certain
+ area of the canvas. View animation do not allow you to do anything that
+ cannot also be done using the |translate| and |scale| keys in combination,
+ but it often much more natural to animate which area of a graphic you wish
+ to see than to compute and animate a scaling and shift explicitly.
+
+ In order to use a view, you first need to create a view, which is done
+ using a |{pgfviewboxscope}|, see Section~\ref{section-base-view}, which is
+ used by the |view| library internally. You can then animate the view using
+ the |view| attribute. The values passed to the |entry| key must be two
+ \pgfname-points, each surrounded by parentheses.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(1.1,-0.9) rectangle (2.9,0.9)}]
+\tikz [very thick] {
+ \pgfanimateattribute{view}{
+ whom = me.view, begin on = {click, of next=node}, freeze at end,
+ entry = {0s}{{\pgfpoint{0mm}{0mm}}{\pgfpoint{20mm}{20mm}}},
+ entry = {2s}{{\pgfpoint{10mm}{10mm}}{\pgfpoint{15mm}{15mm}}} }
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+
+ \draw [green!50!black] (1.2,-0.8) rectangle (2.7,0.8);
+ \begin{scope}[name = me, view = {(0,0) (2,2) at (1.2,-0.8) (2.7,0.8)}]
+ \draw [red] (10mm,10mm) rectangle (15mm,15mm);
+ \node at (10mm,10mm) [circle, fill=red, text=white, font=\tiny] {red};
+ \end{scope}
+}
+\end{codeexample}
+
+\begin{codeexample}[width=2cm]
+\tikz [very thick] {
+ \pgfanimateattribute{view}{
+ whom = me.view, begin on = {click, of next=n1}, freeze at end,
+ entry = {0s}{\pgfpoint{0mm}{0mm}}{\pgfpoint{2cm}{2cm}},
+ entry = {2s}{{\pgfpoint{5mm}{5mm}}{\pgfpoint{15mm}{20mm}}} }
+ \pgfanimateattribute{view}{
+ whom = me.view, begin on = {click, of next=n2}, freeze at end,
+ entry = {0s}{\pgfpoint{0mm}{0mm}}{\pgfpoint{2cm}{2cm}},
+ entry = {2s}{{\pgfpoint{10mm}{10mm}}{\pgfpoint{15mm}{15mm}}} }
+ \node (n1) at (0,0) [fill = blue!20, draw = blue, circle] {Zoom blue};
+ \node (n2) at (2,0) [fill = blue!20, draw = blue, circle] {Zoom red};
+
+ \draw [green!50!black] (4,0) rectangle (6,2);
+ \begin{scope}[name = me, view = {(0,0) (2,2) at (4,0) (6,2)}]
+ \draw [blue] (5mm,5mm) rectangle (15mm,20mm);
+ \node at (5mm,5mm) [circle, fill=blue, text=white] {blue};
+
+ \draw [red] (10mm,10mm) rectangle (15mm,15mm);
+ \node at (10mm,10mm) [circle, fill=red, text=white, font=\tiny] {red};
+ \end{scope}
+}
+\end{codeexample}
+ %
+\end{animateattribute}
+
+
+\subsection{Commands for Specifying Timing: Beginnings and Endings}
+
+Using the |entry| key repeatedly, you specify a timeline: The \meta{time} used
+with the first use of the |entry| key in a timeline is the start time and the
+\meta{time} in the last |entry| key is the stop time. However, this leaves open
+then question of when the whole timeline is to be started: The moment the
+document is opened? When the page is displayed? When the user scrolls to the
+to-be-animated object? When some other object is clicked? The key |begin|, and
+also the key |end|, allow you to specify answers to these questions.
+
+\begin{key}{/pgf/animation/begin=\meta{time}}
+ This key specifies when the ``moment |0s|'' should be relative to the
+ moment when the current graphic is first displayed. You can use this key
+ multiple times, in this case the timeline is restarted for each of the
+ times specified (if it is already running, it will be reset). If no |begin|
+ key is given at all, the effect is the same as if |begin=0s| had been
+ specified.
+
+ It is permissible to set \meta{time} to a negative value.
+\end{key}
+
+\begin{key}{/pgf/animation/end=\meta{time}}
+ This key will truncate the timeline so that it ends \meta{time} after the
+ display of the graphic, provided the timeline begins before the specified
+ end time. For instance, if you specify a timeline starting at 2\,s and
+ ending at 5\,s and you set |begin| to 1\,s and |end| to 4\,s, the timeline
+ will run, relative to the moment when the graphic is displayed from 3\,s to
+ 4\,s.
+ %
+\begin{codeexample}[width=3cm]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin = 2s, end = 4s,
+ entry = {1s}{0}, entry = {2s}{90}, entry = {3s}{180}, entry = {4s}{270} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Turn after 3s!}; }
+\end{codeexample}
+ %
+\end{key}
+
+It is not immediately clear what should happen with the attribute of an object
+when an animation ends: Should it revert to its original value ``as if there
+had never been an animation'' or should it ``stay at the last value''? The
+following key governs what should happen:
+
+\begin{key}{/pgf/animation/freeze at end=\meta{true or false} (default true, initially false)}
+ When set to |true|, whenever a timeline ends (either because the last time
+ of timeline has been reached or because an |end| or |end of| key have ended
+ it prematurely), the last value the attribute had because of the animation
+ ``stays put''. When set to |false|, which is the initial value, once an
+ animation ends, its effect will be removed ``as if it never happened''.
+ %
+\begin{codeexample}[animation list={0,1,2,3,4}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, freeze at end = false,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Here!}; }
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0,1,2,3,4}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, freeze at end,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Here!}; }
+\end{codeexample}
+ %
+\end{key}
+
+Instead of specifying the beginning of the timeline relative to the moment to
+to-be-animated graphic is displayed, you can also set the ``moment |0s|'' to
+the moment a specific \emph{event} happens using the following key:
+
+\begin{key}{/pgf/animation/begin on=\meta{options}}
+ Has the same effect as |/tikz/animate/option/begin on|, see
+ Section~\ref{section-anim-begin-end}.
+\end{key}
+
+When you use |begin on| to start an animation when a certain event is
+triggered, it is not clear what should happen when the event is triggered
+\emph{again}. Should this be ignored completely? Should it only be ignored
+while the animation is running? The following key allows you to specify when
+should happen:
+
+\begin{key}{/pgf/animation/restart=\meta{choice} (default true)}
+ Has the same effect as |/tikz/animate/option/restart|, see
+ Section~\ref{section-anim-begin-end}.
+\end{key}
+
+Just like |begin on| specifies when a timeline begins relative to some event,
+the |end on| allows you to stop is early when some event happens:
+
+\begin{key}{/pgf/animation/end on=\meta{options}}
+ Works exactly like |begin on|, one possible end of the timeline is
+ specified using the \meta{options}.
+\end{key}
+
+
+\subsection{Commands for Specifying Timing: Repeats}
+
+Normally, a timeline is displayed once and then ends. You can, however, request
+that the timeline should be repeated a certain number of times or indefinitely.
+
+\begin{key}{/pgf/animation/repeats=\meta{specification}}
+ Use this key to specify that the timeline animation should repeat at the
+ end. The \meta{specification} must consist of two parts, each of which may
+ be empty. The first part is one of the following:
+ %
+ \begin{itemize}
+ \item Empty, in which case the timeline repeats forever.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, repeats,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ %
+ \item A \meta{number} (like |2| or |3.25|), in which case the timeline
+ repeats \meta{number} times.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, repeats = 1.75,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ %
+ \item The text ``|for| \meta{time}'' (like |for 2s| or |for 300ms|), in
+ which case the timeline repeats however often necessary so that it
+ stops exactly after \meta{time}.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, repeats = for 3.5s,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ \end{itemize}
+ %
+ The second part of the specification must be one of the following:
+ %
+ \begin{itemize}
+ \item Empty, in which case each time the timeline is restarted, the
+ attribute's value undergoes the same series of values it did
+ previously.
+ \item The text |accumulating|. This has the effect that each time the
+ timeline is restarted, the attribute values specified by the
+ timeline are \emph{added} to the value from the previous
+ iteration(s). A typical example is an animation that shifts a scope
+ by, say, 1\,cm over a time of 1\,s. Now, if you repeat this five
+ times, normally the scope will shift 1\,cm for 1\,s then ``jump
+ back'', shift again, jump back, and so on for five times. In
+ contrast, when the repeats are accumulating, the scope will move by
+ 5\,cm over 5\,s in total.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, repeats = accumulating,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz [very thick] {
+ \pgfanimateattribute{rotate}{
+ whom = node, begin on = {click}, repeats = 2 accumulating,
+ entry = {0s}{0}, entry = {2s}{90} }
+ \node (node) [fill = blue!20, draw = blue, circle] {Click me!}; }
+\end{codeexample}
+ \end{itemize}
+\end{key}
+
+\begin{key}{/pgf/animation/repeat=\meta{specification}}
+ This is an alias for |repeats|.
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-arrows.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-arrows.tex
new file mode 100644
index 0000000000..b26efb1b87
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-arrows.tex
@@ -0,0 +1,903 @@
+% Copyright 2013 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Defining New Arrow Tip Kinds}
+\label{section-arrows}
+
+\subsection{Overview}
+
+In present section we have a look at how you can define new arrow tips for use
+in \pgfname. The low-level commands for selecting which arrow tips are to be
+used have already been described in Section~\ref{section-tips}, the general
+syntax rules for using arrows are detailed in
+Section~\ref{section-tikz-arrows}. Although Section~\ref{section-tikz-arrows}
+describes the use of arrows in \tikzname, in reality, \tikzname\ itself does
+not actually do anything about arrow tips; all of the functionality is
+implemented on the \pgfname\ level in the commands described in
+Section~\ref{section-tikz-arrows}. Indeed, even the |/.tip| key handler
+described in Section~\ref{section-tikz-arrows} is actually implemented on the
+\pgfname\ layer.
+
+What has \emph{not} yet been covered is how you can actually define a complete
+new arrow tip. In \pgfname, arrows are ``meta-arrows'' in the same way that
+fonts in \TeX\ are ``meta-fonts''. When a meta-arrow is resized, it is not
+simply scaled, but a possibly complicated transformation is applied to the
+size.
+
+A meta-font is not one particular font at a specific size with a specific
+stroke width (and with a large number of other parameters being fixed). Rather,
+it is a ``blueprint'' (actually, more like a program) for generating such a
+font at a particular size and width. This allows the designer of a meta-font to
+make sure that, say, the font is somewhat thicker and wider at very small
+sizes. To appreciate the difference: Compare the following texts: ``Berlin''
+and ``\tikz{\node [scale=2,inner sep=0pt,outer sep=0pt]{\tiny Berlin};}''. The
+first is a ``normal'' text, the second is the tiny version scaled by a factor
+of two. Obviously, the first look better. Now, compare ``\tikz{\node
+[scale=.5,inner sep=0pt,outer sep=0pt]{Berlin};}'' and ``{\tiny Berlin}''. This
+time, the normal text was scaled down, while the second text is a ``normal''
+tiny text. The second text is easier to read.
+
+\pgfname's meta-arrows work in a similar fashion: The shape of an arrow tip can
+vary according to a great number of parameters, the line width of the arrow tip
+being one of them. Thus, an arrow tip drawn at a line width of 5pt will
+typically \emph{not} be five times as large as an arrow tip of line width 1pt.
+Instead, the size of the arrow will get bigger only slowly as the line width
+increases.
+
+To appreciate the difference, here are the |Latex| and
+|Classical TikZ Rightarrow| arrows, as drawn by \pgfname\ at four different
+sizes:
+
+\medskip
+\begin{tikzpicture}[1/.tip=Latex, 2/.tip=Classical TikZ Rightarrow]
+ \draw[-1, line width=0.1pt] (0pt,0ex) -- +(3,0) node[thin,right] {line width is 0.1pt};
+ \draw[-1, line width=0.4pt] (0pt,-2em) -- +(3,0) node[thin,right] {line width is 0.4pt};
+ \draw[-1, line width=1.2pt] (0pt,-4em) -- +(3,0) node[thin,right] {line width is 1.2pt};
+ \draw[-1, line width=5pt] (0pt,-6em) -- +(3,0) node[thin,right] {line width is 5pt};
+
+ \draw[-2, line width=0.1pt] (6cm,0ex) -- +(3,0) node[thin,right] {line width is 0.1pt};
+ \draw[-2, line width=0.4pt] (6cm,-2em) -- +(3,0) node[thin,right] {line width is 0.4pt};
+ \draw[-2, line width=1.2pt] (6cm,-4em) -- +(3,0) node[thin,right] {line width is 1.2pt};
+ \draw[-2, line width=5pt] (6cm,-6em) -- +(3,0) node[thin,right] {line width is 5pt};
+\end{tikzpicture}
+
+\medskip
+Here, by comparison, are the same arrows when they are simply ``resized'':
+
+\medskip
+\begin{tikzpicture}[1/.tip=Latex, 2/.tip=Classical TikZ Rightarrow]
+ \draw[-{1[length=1pt]}, line width=0.1pt] (0pt,0ex) -- +(3,0) node[thin,right] {line width is 0.1pt};
+ \draw[-{1[length=4pt]}, line width=0.4pt] (0pt,-2em) -- +(3,0) node[thin,right] {line width is 0.4pt};
+ \draw[-{1[length=12pt]}, line width=1.2pt] (0pt,-4em) -- +(3,0) node[thin,right] {line width is 1.2pt};
+ \draw[-{1[length=32pt]}, line width=5pt] (0pt,-6em) -- +(3,0) node[thin,right] {line width is 5pt};
+
+ \draw[-{2[length=0.455pt]}, line width=0.1pt] (6cm,0ex) -- +(3,0) node[thin,right] {line width is 0.1pt};
+ \draw[-{2[length=1.82pt]}, line width=0.4pt] (6cm,-2em) -- +(3,0) node[thin,right] {line width is 0.4pt};
+ \draw[-{2[length=5.46pt]}, line width=1.2pt] (6cm,-4em) -- +(3,0) node[thin,right] {line width is 1.2pt};
+ \draw[-{2[length=14.56pt]}, line width=5pt] (6cm,-6em) -- +(3,0) node[thin,right] {line width is 5pt};
+\end{tikzpicture}
+
+\bigskip
+As can be seen, simple scaling produces arrow tips that are way too large at
+larger sizes and way too small at smaller sizes.
+
+In addition to the line width, other options may also influence the appearance
+of an arrow tip. In particular, the width of the inner line (the line used to
+create the effect of a double line) influences arrow tips as well as other
+options that are specific to the arrow tip.
+
+
+\subsection{Terminology}
+\label{section-arrow-terminology}
+
+Before we have a look at the exact commands used for defining arrow tips, we
+need to fix some terminology. Consider the following drawing of an arrow tip
+where the arrow tip is drawn transparently so that we can see what is
+``happening behind it'':
+%
+\begin{tikzpicture}
+ \draw [red!50, ,line width=1cm] (0,0) -- (4,0);
+ \path [tips, opacity=.25,line width=1cm, -{Stealth[black,line width=0pt,length=4cm, width=4cm, inset=1cm]}] (0,0) -- (6,0);
+
+ \draw [->,thick] (1,0) -- (8,0) node [right] {$x$-axis};
+ \draw [->,thick] (5,-2.25) -- (5,2.25) node [above] {$y$-axis};
+
+ \foreach \i in {-3,-2,-1,1,2} \draw (\i+5,-1mm) -- (\i+5,1mm) node [above] {\small$\i$};
+ \foreach \i in {-2,-1,1,2} \draw (49mm,\i) -- (51mm,\i) node [right] {\small$\i$};;
+\end{tikzpicture}
+
+I have also added a coordinate system. The code for drawing an arrow tip always
+draws it in the way shown above: Pointing right along the $x$-axis.
+
+We will use the following terminology:
+%
+\begin{itemize}
+ \item The point where tip of the arrow ends is called the \emph{tip end}.
+ It is at $(1,0)$ in our example and we always assume it to lie on the
+ $x$-axis, so we just treat it as a distance, 1 in this case. This is
+ the position where the original path was supposed to end (so if the
+ arrow tip had not been added to the red path, it would have ended
+ here).
+ \item The \emph{back end} of the arrow is where a vertical line just to the
+ left of the arrow intersects the $x$-axis. In our case, this is the
+ point $(-3,0)$ and again we treat it as a distance, $-3$ in this case.
+ \item The \emph{line end} is the position where the path now ends. This
+ should be a position inside the arrow head that gets ``covered'' by the
+ path. Note that a path may have a round or a rect head and should still
+ be covered. Clearly, necessary shortening of the path will be the
+ difference between the tip end and the line end.
+ \item The \emph{visual back end} is the position where the path and the the
+ arrow head ``meet last'' on the path. In our case, because of the
+ inset, the visual back end is not the same as the back end: The arrow
+ ends ``visually'' at $(-2,0)$. The difference between the back end and
+ the visual back end is important when the arrow tip is flexed, see
+ Section~\ref{section-arrow-flex} for an explanation of flexing.
+ \item There is also a \emph{visual tip end}, the counterpart of the visual
+ back end for the front. In our case, the visual tip end and the tip end
+ obviously coincide, but if we were to reverse the arrow tip, the visual
+ tip end would be different form the tip end (while the visual back end
+ would then coincide with the new back end).
+ \item There are four points that make up the \emph{convex hull} of the
+ arrow tip: $(1,0)$, $(-3,2)$, and $(-3,-2)$.
+
+ Normally, \pgfname\ automatically keeps track of a bounding box of
+ everything you draw. However, since arrow tips are drawn so often,
+ \pgfname\ caches the code needing for drawing arrow tips internally and
+ because of this cache it cannot determine the size of the arrow tip
+ just based on the drawing commands used for drawing the tip. Instead, a
+ convex hull of the arrow tip must be explicitly provided in the
+ definition.
+\end{itemize}
+
+When you design a new arrow tip, all of the above parameters must be defined.
+
+
+\subsection{Caching and Rendering of Arrows}
+
+As a last preparation for the description of the commands for declaring arrows,
+it is important to understand the exact process by which \pgfname\ draws
+arrows.
+%
+\begin{enumerate}
+ \item First, you have to define an arrow tip kind using
+ |\pgfdeclarearrow{name=foo,...|. This will tell \pgfname\ that |foo| is %}
+ now the name of an arrow tip. In particular, the parser for arrow tip
+ specifications will now treat |foo| as the name of an arrow tip and
+ will not try to consider |f|, |o|, and |o| as the names of single-char
+ shorthands.
+
+ Other than storing the definitions in the declaration internally, this
+ command has little other effect. In particular, no drawing or other
+ processing takes place.
+ \item Now assume that at some point the arrow tip |foo| is actually used.
+ In this case, certain options may have been set, for instance the user
+ may have requested the arrow tip |foo[length=5pt,open]|. What happens
+ next depends on whether it is the first time the arrow tip |foo| is
+ used with \emph{these exact options} or not.
+ \item Assume that is the first time |foo| is requested at a length of 5pt
+ and in an ``open'' version. \pgfname\ now retrieves the definition of
+ the arrow tip kind that it stored in the first step and executes the
+ so-called \emph{setup} code. When this code is executed, all the
+ options will be in force (for instance, |\pgfarrowlength| will equal
+ |5pt| in our case). The job of the setup code is two-fold: First, it
+ needs to compute all of the parameters listed in
+ Section~\ref{section-arrow-terminology}, that is, it has to compute
+ where the tip end will lie in the arrow tip's coordinate system
+ \emph{at the particular size of 5pt}, where the back end will be, where
+ the convex hull points lie, and so on. Second, the setup code should
+ precompute values that will be important for constructing the path of
+ the arrow. In our example, there is little to do in this regard, but
+ for more complicated arrows, all time-consuming preparations are done
+ now.
+
+ It is \emph{not} the job of the setup to actually draw the arrow tip,
+ only to ``prepare'' this as much as possible.
+
+ The setup code will always be executed only once for each arrow tip
+ kind for a given set of options. Thus, when a user uses
+ |foo[length=5pt,open]| once more later anywhere in the document, the
+ setup code will not be executed again.
+ \item The next thing that happens is that we have a look at the
+ \emph{drawin code} stored in the |code| field of the arrow. In our
+ example, the drawing code would consist of creating a filled path with
+ four straight segments.
+
+ In most cases, what happens now is that the drawing code is executed in
+ a special sandbox in which the low-level driver commands that do the
+ actual drawing are intercepted and stored away in a so-called
+ \emph{cache}. Once such a cache has been created, its contents will be
+ reused whenever |foo[length=5pt,open]| is requested by a user and just
+ like the setup code, the drawing code will not be executed again.
+
+ There are, however, two cases in which the drawing code gets executed
+ each time the arrow is used: First, an arrow tip kind can specify that
+ this should always happen by saying |cachable=false| in its definition.
+ This is necessary if the drawing code contains low-level drawing
+ commands that cannot be intercepted such as a use of |\pgftext| for
+ arrow tips that ``contain text''. Second, when the |bend| option is
+ used, the same arrow tip will look different each time it is used,
+ namely in dependence on the exact curvature of the path to which it is
+ added.
+
+ Because the drawing code may be executed several times, while the setup
+ code may not, we must find a way to ``communicate'' the values computed
+ by the setup code to the drawing code. This is done by explicitly
+ calling |\pgfarrowssave| inside the setup code. Whatever is ``saved''
+ in this way is restored each time before the drawing code is executed.
+\end{enumerate}
+
+As can be seen, the process is a bit involved, but it leads to a reasonably
+fast arrow tip management.
+
+
+\subsection{Declaring an Arrow Tip Kind}
+
+\begin{command}{\pgfdeclarearrow\marg{config}}
+ This command is both used to define a new arrow tip kind and to to declare
+ a so-called shorthand. We have a look at the case that a complete new arrow
+ tip kind is created and then have a look how the command can be used to
+ create shorthands.
+
+
+ \medskip
+ \noindent\textbf{Defining a Complete New Arrow Tip Kind.}
+ The \meta{config} is a key--value list in which different keys are used to
+ setup the to-be defined arrow. The following keys can be given:
+ %
+ \begin{itemize}
+ \item \declare{|name|}|=|\meta{name} or |name=|\meta{start
+ name}|-|\meta{end name}
+
+ This defines the name of the arrow tip. It is legal to define an
+ arrow tip a second time, in this case the previous definition will
+ be overwritten in the current \TeX\ scope. It is customary to use a
+ name with an uppercase fist letter for a ``complete'' arrow tip
+ kind. Short names and lower case names should be used for
+ shorthands that change their meaning inside a document, while arrow
+ tips with uppercase first letters should not be redefined.
+
+ If the name contains a hyphen, the second syntax is assumed and
+ everything before the hyphen will be the name used in start arrow
+ specifications, while the text after the hyphen is the name used in
+ end specifications.
+ \item \declare{|parameters|}|=|\marg{list of macros}
+
+ As explained earlier, an arrow tip typically needs to be redrawn
+ each time an option like |length| or |inset| is changed. However,
+ for some arrow tips, the |inset| has no influence, while for other
+ it is important whether the arrow is reversed or not. (How keys
+ like |length| actually set \TeX\ dimensions like |\pgfarrowlength|
+ is explained in Section~\ref{section-arrow-options}.)
+
+ The job of the |parameters| key is to specify which dependencies
+ the arrow tip has. Everything that will influence any of the
+ parameters computed in the setup code or used in the drawing code
+ should be listed here.
+
+ The \meta{list of macros} will be used inside a
+ |\csname|-|\endcsname| pair and should expand to the current values
+ of the relevant parameters have. For example, if the arrow tip
+ depends on the current value of |\pgfarrowlength| and
+ |\pgfarrowwidth| only, then \meta{list of macros} should be set to
+ |\the\pgfarrowlength,\the\pgfarrowwidth|. (Actually, the comma is
+ optional, the \meta{list of macros} does not really have to be a
+ list, just something that can be expanded unambiguously.)
+
+ Note that the line width (|\pgflinewidth|) and the inner line width
+ (|\pgfinnerlinewidth|) are always parameters and need not be
+ specified in the |parameters|.
+
+ It is important to get this parameter right. Otherwise, arrow tips
+ may look wrong because \pgfname\ thinks that it can reuse some code
+ when, in reality, this code actually depends on a parameter not
+ listed here.
+ \item \declare{|setup code|}|=|\marg{code}
+
+ When an arrow tip is used, the value stored in |parameters| is
+ expanded and it is tested whether the result was encountered
+ before. If not, the \meta{code} gets executed (only this once). The
+ code can now do arbitrarily complicated computations the prepare
+ the later drawing of the arrow tip. Also the \meta{code} must
+ specify the different tip and back ends and the convex hull points.
+ This is done by calling the following macros inside the
+ \meta{code}:
+ %
+ \begin{command}{\pgfarrowssettipend\marg{dimension}}
+ When this command is called inside the setup code of an arrow
+ tip, it specifies that the tip of the drawn arrow will end
+ exactly at \meta{dimension}. For example, for our earlier
+ example of the large arrow tip, where the tip end was at 1cm,
+ we would call
+ %
+\begin{codeexample}[code only]
+\pgfarrowssettipend{1cm}
+\end{codeexample}
+ %
+ Note that for efficiency reasons, the \meta{dimension} is not
+ passed through |\pgfmathsetlength|; rather what happens is that
+ |\pgf@x=|\meta{dimension} gets executed. In particular, you can
+ pack further computations into the \meta{dimension} by simply
+ starting it with a number and then appending some code that
+ modifies |\pgf@x|. Here is an example where instead of 1cm we
+ use $1\mathrm{cm} - \frac12\mathrm{linewidth}$ as the tip end:
+ %
+\begin{codeexample}[code only]
+\pgfarrowssettipend{1cm\advance\pgf@x by-.5\pgflinewidth}
+\end{codeexample}
+ %
+ If the command is not called at all inside the setup code, the
+ tip end is set to |0pt|.
+ \end{command}
+
+ \begin{command}{\pgfarrowssetbackend\marg{dimension}}
+ Works like the command for the tip end, only it sets the back
+ end. In our example we would call
+ %
+\begin{codeexample}[code only]
+\pgfarrowssettipend{-3cm}
+\end{codeexample}
+ %
+ Defaults to |0pt|.
+ \end{command}
+
+ \begin{command}{\pgfarrowssetlineend\marg{dimension}}
+ Sets the line end, so in the example we have
+ |\pgfarrowssettipend{-1cm}|. Default to |0pt|.
+ \end{command}
+
+ \begin{command}{\pgfarrowssetvisualbackend\marg{dimension}}
+ Sets the visual back end, |\pgfarrowssetvisualbackend{-2cm}| in
+ our example. Default to the value of the normal back end.
+ \end{command}
+
+ \begin{command}{\pgfarrowssetvisualtipend\marg{dimension}}
+ Sets the visual tip end. Default to the value of the normal tip
+ end and, thus, we need not set it in our example.
+ \end{command}
+
+ \begin{command}{\pgfarrowshullpoint\marg{x dimension}\marg{y dimension}}
+ Adds a point to the convex hull of the arrow tip. As for the
+ previous commands, no math parsing is done; instead \pgfname\
+ says |\pgf@x=|\meta{x dimension} and then |\pgf@y=|\meta{y
+ dimension}. Thus, both ``dimensions'' can contain code for
+ advancing and thus modifying |\pgf@x| and |\pgf@y|.
+
+ In our example we would write
+ %
+\begin{codeexample}[code only]
+\pgfarrowshullpoint{1cm}{0pt}
+\pgfarrowshullpoint{-3cm}{2cm}
+\pgfarrowshullpoint{-3cm}{-2cm}
+\end{codeexample}
+ \end{command}
+
+ \begin{command}{\pgfarrowsupperhullpoint\marg{x dimension}\marg{y dimension}}
+ This command works like the previous command, only it normally
+ adds \emph{two} points to the convex hull: First, the point
+ $(\meta{x dimension},\meta{y dimension})$ and, secondly, the
+ point $(\meta{x dimension},-\meta{y dimension})$. However, the
+ second point is only added if the arrow is not a harpoon.
+
+ Thus, in our example we could simplify the convex hull to
+ %
+\begin{codeexample}[code only]
+\pgfarrowshullpoint{1cm}{0pt}
+\pgfarrowsupperhullpoint{-3cm}{2cm}
+\end{codeexample}
+ %
+ If the \meta{y dimension} is zero or less, only one point,
+ namely $(\meta{x dimension},\meta{y dimension})$, is added to
+ the hull. Thus, we could also have used the upper convex hull
+ command in the first of the two of the above commands.
+ \end{command}
+
+ \begin{command}{\pgfarrowssave\marg{macro}}
+ As explained earlier, the setup code needs to ``communicate''
+ with the drawing code via ``saved values''. This command get
+ the name of a macro and will store the value this macro had
+ internally. Then, each time drawing code is executed, the value
+ of this macro will be restored.
+ \end{command}
+
+ \begin{command}{\pgfarrowssavethe\marg{register}}
+ Works like |\pgfarrowssave|, only the parameter must be a
+ register and |\the|\meta{register} will be saved. Typically,
+ you will write something like
+ %
+\begin{codeexample}[code only]
+\pgfarrowssavethe{\pgfarrowlength}
+\pgfarrowssavethe{\pgfarrowwidth}
+\end{codeexample}
+ %
+ To ensure that inside the drawing code the the dimension
+ registers |\pgfarrowlength| and |\pgfarrowwidth| are setup with
+ the values they had during the setup.
+ \end{command}
+ \item \declare{|drawing code|}|=|\marg{code}
+
+ This code will be executed at least once for each setting of the
+ parameters when the time arrow tip is actually drawn. Usually, this
+ one execution will be all and the low-level commands generated
+ inside the \meta{code} will we stored in a special cache; but in
+ some cases the \meta{code} gets executed each time the arrow tip is
+ used, so do not assume anything about it. Inside the \meta{code},
+ you have access to all values that were saved in the setup code as
+ well as to the line width.
+
+ The \meta{code} should draw the arrow tip ``going right along the
+ $x$-axis''. \pgfname\ will take care of setting up a canvas
+ transformation beforehand to a rotation such that when the drawing
+ is rendered, the arrow tip that is actually drawn points in the
+ direction of the line. Alternatively, when bending is switched on,
+ even more complicated low-level transformations will be done
+ automatically.
+
+ The are some special considerations concerning the \meta{code}:
+ %
+ \begin{itemize}
+ \item In the \meta{code} you may \emph{not} use |\pgfusepath|
+ since this would try to add arrow tips to the arrow tip and
+ lead to a recursion. Use the ``quick'' versions
+ |\pgfusepathqstroke| and so on instead, which never try to
+ add arrow tips.
+ \item If you stroke the path that you construct, you should
+ first set the dashing to solid and set up fixed joins and
+ caps, as needed. This will ensure that the arrow tip will
+ always look the same.
+ \item When the arrow tip code is executed, it is automatically
+ put inside a low-level scope, so nothing will ``leak out''
+ from the scope.
+ \item The high-level coordinate transformation matrix will be
+ set to the identity matrix when the code is executed for
+ the first time.
+ \end{itemize}
+ \item \declare{|cache|}|=|\meta{true or false}
+
+ When set to |true|, which is the default, the \meta{code} will be
+ executed only once for a particular value of parameters and the
+ low-level commands created by the drawing code (using the system
+ layer protocol subsystem, see Section~\ref{section-protocols}) will
+ be cached and reused later on. However, when the drawing code
+ contains ``uncachable'' code like a call to |\pgftext|, caching
+ must be switched off by saying |cache=false|.
+ \item \declare{|bending mode|}|=|\meta{mode}
+
+ This key is important only when the |bend| option is used with an
+ arrow, see Section~\ref{section-arrow-flex} for an introduction to
+ this option. The |bend| option asks us to, well, bend the arrow
+ head. For some arrow head this is not possible or leads to very
+ strange drawings (for instance, when the |\pgftext| command is
+ used) and then it is better to switch bending off for the arrow
+ head (|flex| will then be used instead). To achieve this, set
+ \meta{mode} to |none|.
+
+ For most arrow tips it does, however, make sense to bend them.
+ There are (at least) two different mathematical ways of doing so,
+ see Section~\ref{section-library-curvilinear} for details. Which of
+ these ways is use can be configured by setting \meta{mode} to
+ either |orthogonal| or to |polar|. It is best to try simply try out
+ both when designing an arrow tip to see which works better. Since
+ |orthogonal| is quicker and often gives good oder even better
+ results, it is the default. Some arrow tips, however, profit from
+ saying |bending mode=polar|.
+ \item \declare{|defaults|}|=|\meta{arrow keys}
+
+ The \meta{arrow keys} allow you to configure the default values for
+ the parameters on which an arrow tip depends. The \meta{arrow keys}
+ will be executed first before any other arrow tip options are
+ executed, see Section~\ref{section-arrow-scopes} for the exact
+ sequence. Also see Section~\ref{section-arrow-options} below for
+ more details on arrow options.
+ \end{itemize}
+
+ This concludes the description of the keys you provide for the declaration
+ of an arrow. Let us now have a look at a simple example that uses these
+ features: We want to define an arrow tip kind |foo| that produces the arrow
+ tip we used as our running example. However, to make things a bit more
+ interesting, let us make it ``configurable'' insofar as the length of the
+ arrow tip can be configured using the |length| option, which sets the
+ |\pgfarrowlength|. By default, this length should be the gigantic 4cm we
+ say in the example, but uses should be able to set it to anything they
+ like. We will not worry about the arrow width or insets, of arrow line
+ width, or harpoons, or anything else in this example to keep it simple.
+
+ Here is the code:
+ %
+\begin{codeexample}[code only]
+\pgfdeclarearrow{
+ name = foo,
+ parameters = { \the\pgfarrowlength },
+ setup code = {
+ % The different end values:
+ \pgfarrowssettipend{.25\pgfarrowlength}
+ \pgfarrowssetlineend{-.25\pgfarrowlength}
+ \pgfarrowssetvisualbackend{-.5\pgfarrowlength}
+ \pgfarrowssetbackend{-.75\pgfarrowlength}
+ % The hull
+ \pgfarrowshullpoint{.25\pgfarrowlength}{0pt}
+ \pgfarrowshullpoint{-.75\pgfarrowlength}{.5\pgfarrowlength}
+ \pgfarrowshullpoint{-.75\pgfarrowlength}{-.5\pgfarrowlength}
+ % Saves: Only the length:
+ \pgfarrowssavethe\pgfarrowlength
+ },
+ drawing code = {
+ \pgfpathmoveto{\pgfqpoint{.25\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-.75\pgfarrowlength}{.5\pgfarrowlength}}
+ \pgfpathlineto{\pgfqpoint{-.5\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-.75\pgfarrowlength}{-.5\pgfarrowlength}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ defaults = { length = 4cm }
+}
+\end{codeexample}
+ %
+ We can now use it:
+ %
+\pgfdeclarearrow{
+ name = foo,
+ parameters = { \the\pgfarrowlength },
+ setup code = {
+ % The different end values:
+ \pgfarrowssettipend{.25\pgfarrowlength}
+ \pgfarrowssetlineend{-.25\pgfarrowlength}
+ \pgfarrowssetvisualbackend{-.5\pgfarrowlength}
+ \pgfarrowssetbackend{-.75\pgfarrowlength}
+ % The hull
+ \pgfarrowshullpoint{.25\pgfarrowlength}{0pt}
+ \pgfarrowshullpoint{-.75\pgfarrowlength}{.5\pgfarrowlength}
+ \pgfarrowshullpoint{-.75\pgfarrowlength}{-.5\pgfarrowlength}
+ % Saves: Only the length:
+ \pgfarrowssavethe\pgfarrowlength
+ },
+ drawing code = {
+ \pgfpathmoveto{\pgfqpoint{.25\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-.75\pgfarrowlength}{.5\pgfarrowlength}}
+ \pgfpathlineto{\pgfqpoint{-.5\pgfarrowlength}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-.75\pgfarrowlength}{-.5\pgfarrowlength}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ defaults = { length = 4cm }
+}
+\begin{codeexample}[]
+\tikz \draw [-foo] (0,0) -- (8,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [-{foo[length=2cm,bend]}] (0,0) to [bend left] (3,0);
+\end{codeexample}
+
+
+ \medskip
+ \noindent\textbf{Defining a Shorthand.}
+ The |\pgfdeclarearrow| command can also used to define
+ \emph{shorthands}. This works as follows:
+ \begin{itemize}
+ \item First, you must provide a |name| just in the same way as when you
+ define a full-flung new arrow tip kind.
+ \item Second, instead of all of the other options listed above, you
+ just use one more option:
+
+ \smallskip
+ \declare{|means|}|=|\meta{end arrow specification}
+
+ This sets up things so that whenever \meta{name} is now used in an
+ arrow specification, it will be replaced by the \meta{end arrow
+ specification} (the problems resulting form the \meta{name} begin
+ used in a start arrow specification are taken care of
+ automatically). See also Section~\ref{section-arrow-tip-macro} for
+ details on the order in which options get executed in such cases.
+
+ Note that the \meta{end arrow specification} will be executed
+ immediately to build the so-called arrow option caches, a concept
+ explored in more detail in
+ Section~\ref{section-arrow-option-cache}. In practice, this has
+ mainly two effects: First, all arrow tips referred to in the
+ specification must already exist (at least as ``dummy'' versions).
+ Second, all dimensions mentioned in options of the \meta{end arrow
+ specification} will be evaluated immediately. For instance, when
+ you write
+ %
+\begin{codeexample}[code only]
+\pgfdeclarearrow{ name=foo, means = bar[length=2cm+\mydimen] }
+\end{codeexample}
+ %
+ The value |2cm+\mydimen| is evaluated immediately. When |foo| is
+ used later on and |\mydimen| has changed, this has no effect.
+ \end{itemize}
+\end{command}
+
+
+\subsection{Handling Arrow Options}
+\label{section-arrow-options}
+
+When you declare an arrow tip, your drawing code should take into account the
+different arrow keys set for it (like the arrow tip length, width, or
+harpooning). The different arrow keys that are available have been described in
+detail in Section~\ref{section-arrow-config}; but how do we access the values
+set by an option like |length| or |harpoon| or |bend| in the drawing code? In
+the present section we have a look at how this works.
+
+
+\subsubsection{Dimension Options}
+
+Most arrow keys, like |length| or |width'|, simple set a \TeX\ dimension
+register to a certain value. For example, |length| sets the value of the \TeX\
+dimension register |\pgfarrowlength|. Note that |length| takes several values
+as input with a complicated semantics as explained for the |length| key on
+page~\pageref{length-arrow-key}. All of these settings are not important for
+the setup code: When it gets executed, the code behind the |length| key will
+have computed a simple number that is stored in |\pgfarrowlength|. Indeed,
+inside the setup code you do not have access to the exact value given to the
+|length| key; just to the final computed value.
+
+The following \TeX\ dimensions are available to the setup code:
+%
+\begin{itemize}
+ \item |\pgfarrowslength|. It gets set by the arrow keys |length| and
+ |angle|.
+ \item |\pgfarrowswidth|. It gets set by |width|, |width'|, and |angle|.
+ \item |\pgfarrowsinset|. It gets set by |inset| and |inset'|.
+ \item |\pgfarrowslinewidth|. It gets set by |line width| and |line width'|.
+\end{itemize}
+
+If your setup code depends on any of them, add them to the |parameters| key of
+the arrow tip.
+
+
+\subsubsection{True--False Options}
+
+A number of arrow keys just do a yes/no switch, like |reversed|. All of them
+setup a \TeX-if that you can access in the setup code:
+%
+\begin{itemize}
+ \item |\ifpgfarrowreversed| is setup by |reversed|.
+ \item |\ifpgfarrowswap| is setup by |swap| and also |right|.
+ \item |\ifpgfarrowharpoon| is setup by |harpoon| and also |left| and
+ |right|.
+ \item |\ifpgfarrowroundcap| is set to true by |line cap=round| and set to
+ false by |line cap=butt|. It also gets (re)set by |round| and |sharp|.
+ \item |\ifpgfarrowroundjoin| is set to true by |line join=round| and set to
+ false by |line join=miter|. It also gets (re)set by |round| and
+ |sharp|.
+ \item |\ifpgfarrowopen| is set to true by |fill=none| and by |open| (which
+ is a shorthand for |fill=none|) and set to false by |color| and all
+ other |fill=|\meta{color}.
+\end{itemize}
+
+If you code depends on any of these, you must add them to the |parameters| in
+such a way that the parameters are different when the \TeX-if is set from when
+it is not set. An easy way to achieve this is to write something like
+%
+\begin{codeexample}[code only]
+ parameters = { \the\pgfarrowlength,...,
+ \ifpgfarrowharpoon h\fi\
+ \ifpgfarrowroundjoin j\fi}
+\end{codeexample}
+%
+In other words, for each set parameter on which the arrow tip depends, a
+specific letter is added to the parameters, making them unique.
+
+The first two of the above keys are a bit special: Reversing and swapping an
+arrow tip can be done just by fiddling with the transformation matrix: a
+reverse is a ``flip'' along the $y$-axis and a swap is a flip along the
+$x$-axis. This is done automatically by \pgfname.
+
+Nevertheless, you may wish to modify you code in dependence especially of the
+|reverse| key: When |\ifpgfarrowreverse| is true, \pgfname\ will flip the
+coordinate system along the $y$-axis, will negate all end values (like line
+end, tip end, and so on) and will exchange the meaning of back end and tip end
+as well as of visual back end and visual back end. Usually, this is exactly
+what one need; \emph{except} that the line end may no longer be appropriate.
+After all, the line end should be chosen so that it is completely covered by
+the arrow. Now, when the arrow tip is open, a reversed arrow should no longer
+have the line end near the old visual back end, but near to the old visual tip
+end.
+
+For these reasons, you may need to make the computation of the line end
+dependent on whether the arrow is reversed or not. Note that when you specify a
+different line end for a reversed arrow tip, the transformation and inverting
+of the coordinate system will still be done, meaning that if |reverse| is true,
+you need to specify a line end in the ``old'' coordinate system that is at the
+position where, after everything is inverted, it will be at the correct
+position. Usually that means that if the |reverse| option is set, you need to
+\emph{increase} the line end.
+
+
+\subsubsection{Inaccessible Options}
+
+There are some options that influence the way an arrow tip looks, but that you
+cannot access inside the setup code. Handling these options lies entirely with
+\pgfname. If you wish your setup code to handle these options, you have to
+setup your own ``parallel'' options.
+%
+\begin{itemize}
+ \item |quick|, |flex|, |flex'|, and |bend| are all handled automatically.
+ You can, however, set the |bending mode| to avoid bending of your arrow
+ tip.
+ \item The colors set by |color| and |fill|. You can, however, access them
+ indirectly, namely through the current stroke and fill colors.
+ \item |sep|
+\end{itemize}
+
+
+\subsubsection{Defining New Arrow Keys}
+\label{section-arrow-option-cache}
+
+The set of predefined options is already quite long and most arrow tips will
+not need more than the predefined options. However, sometimes an arrow tip may
+need to introduce a new special-purpose option. For instance, suppose we wish
+to introduce a new fictive arrow key |depth|. In such cases, you must do two
+things:
+%
+\begin{enumerate}
+ \item Introduce a new dimension register or macro that will hold the
+ configuration value and which will be accessed by the setup code. The
+ could be achieved by saying
+ %
+\begin{codeexample}[code only]
+\newdimen\pgfarrowdepth
+\end{codeexample}
+ %
+ \item Introduce a new arrow key option |/pgf/arrow keys/depth| that allows
+ users to configure the new macro or register.
+\end{enumerate}
+
+When an arrow is selected via for instance |foo[depth=5pt]|, the key--value
+pairs between the square brackets are executed with the path prefix
+|/pgf/arrow keys|. Thus, in the example, our depth key would get executed.
+Thus, it is tempting to write something like
+%
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/arrow keys/depth/.code = \pgfmathsetlength{\pgfarrowdepth}{#1}}
+\end{codeexample}
+
+Sadly, this will not work. The reason is that there is yet another level of
+caching involved when \pgfname\ processes arrow tips: The option cache! The
+problem is each time an arrow tip is used, even when the drawing code of the
+arrow tip is nicely cached, we still need to process the options in
+|foo[length=5pt]| to find out which version in the cache we would like to
+access. To make matters worse, |foo| might be a shorthand that calls other
+arrow tips, which add more options, and so on. Unfortunately, executing keys is
+quite an expensive operation (\pgfname's key--value parser is powerful, but
+that power comes at a price). So, whenever possible, we do \emph{not} want the
+key--value parser to be started.
+
+For these reasons, when something like |foo[|\meta{options}|]| is encountered
+inside a shorthand, the \meta{options} are executed only once. They should now
+setup the \emph{arrow option cache}, which is some code that, when executed,
+should setup the values that the \meta{options} configure. In our example, the
+|depth| key should add something to the arrow option cache that sets
+|\pgfarrowdepth| to the given value.
+
+Adding something to the arrow option cache is done using the following command:
+
+\begin{command}{\pgfarrowsaddtooptions\marg{code}}
+ This command should be called by keys with the prefix |/pgf/arrow keys| to
+ add code to the arrow option cache. For our |depth| key example, we could
+ use this key as follows:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/arrow keys/depth/.code=
+ \pgfarrowsaddtooptions{\pgfmathsetlength{\pgfarrowdepth}{#1}}
+\end{codeexample}
+ %
+ Actually, this is still not optimal since the expensive |\pgfmathsetlength|
+ command is now called each time an arrow tip is used with the |depth|
+ option set. The trick is to do the expensive operation only once and then
+ store only very quick code in the arrow option cache:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/arrow keys/depth/.code=
+ \pgfmathsetlength{\somedimen}{#1}
+ \pgfarrowsaddtooptions{\pgfarrowdepth=\somedimen} % buggy
+\end{codeexample}
+ %
+ The above code will not (yet) work since |\somedimen| will surely have a
+ different value when the cache is executed. The trick is to use some
+ |\expandafter|s:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/arrow keys/depth/.code=
+ \pgfmathsetlength{\somedimen}{#1}
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\pgfarrowdepth\expandafter=\the\somedimen}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfarrowsaddtolateoptions\marg{code}}
+ This command works like |\pgfarrowsaddtooptions|, only the \meta{code} will
+ be executed ``later'' than the code added by the normal version of the
+ command. This is useful for keys that depend on the length of an arrow:
+ Keys like |width'| want to define the arrow width as a multiple of the
+ arrow length, but when the |width'| key is given, the length may not yet
+ have been specified. By making the computation of the width a ``late''
+ option, we ensure that |\pgfarrowlength| will have been setup correctly.
+\end{command}
+
+If you define a new option that sets a dimensions and if that dimension should
+change in accordance to the setting of either |scale length| or |scale width|,
+you need to make \pgfname\ ``aware'' of this using the following key:
+
+\begin{command}{\pgfarrowsaddtolengthscalelist\marg{dimension register}}
+ Each time an arrow tip is used, the given \meta{dimension register} will be
+ multiplied by the |scale length| factor prior to the actual drawing. You
+ call this command only once in the preamble somewhere.
+\end{command}
+
+\begin{command}{\pgfarrowsaddtowidthscalelist\marg{dimension register}}
+ Works like |\pgfarrowsaddtolengthscalelist|, only for width parameters.
+\end{command}
+
+
+\begin{command}{\pgfarrowsthreeparameters\marg{line-width dependent size specification}}
+ This command is useful for parsing the values given to keys like |length|
+ or |width| the expect a dimension followed optionally for some numbers.
+ This command converts the \meta{line-width dependent size specification},
+ which may consist of one, two, or three numbers, into a triple of three
+ numbers in curly braces, which gets stored in the macro
+ |\pgfarrowstheparameters|. Here is an example, where |\showvalueofmacro| is
+ used in this example to show the value stored in a macro:
+ %
+ \makeatletter
+ \def\showvalueofmacro#1{%
+ \texttt{\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfutil@gobble\expandafter\expandafter\expandafter\string\expandafter\csname#1\endcsname}
+ }
+\begin{codeexample}[]
+\pgfarrowsthreeparameters{2pt 1}
+\showvalueofmacro\pgfarrowstheparameters
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfarrowslinewidthdependent\marg{dimension}\marg{line width factor}\marg{outer factor}}
+ This command take three parameters and does the ``line width dependent
+ computation'' described on page~\pageref{length-arrow-key} for the |length|
+ key. The result is returned in |\pgf@x|.
+
+ The idea is that you can setup line-width dependent keys like |length| or
+ |width| using code like the following:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/arrow keys/depth/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{%
+ \expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters% compute...
+ \pgfarrowdepth\pgf@x% ... and store.
+ }%
+}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfarrowslengthdependent\marg{dimension}\marg{length factor}\marg{dummy}}
+ This command take three parameters, of which the last one is ignored, and
+ does the ``length dependent computation'' described for the |width'| and
+ |inset'| keys. The result is returned in |\pgf@x|.
+
+ You can setup length dependent keys using code like the following:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/arrow keys/depth'/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{%
+ \expandafter\pgfarrowslengthdependent\pgfarrowstheparameters% compute...
+ \pgfarrowdepth\pgf@x% ... and store.
+ }%
+}
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-decorations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-decorations.tex
new file mode 100644
index 0000000000..81be7f5fc9
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-decorations.tex
@@ -0,0 +1,980 @@
+% Copyright 2008 by Till Tantau and Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Decorations}
+\label{section-base-decorations}
+
+\begin{pgfmodule}{decorations}
+ The commands for creating decorations are defined in this module, so you
+ need to load this module to use decorations. This module is automatically
+ loaded by the different decoration libraries.
+\end{pgfmodule}
+
+
+\subsection{Overview}
+
+Decorations are a general way of creating graphics by ``moving along'' a path
+and, while doing so, either drawing something or constructing a new path. This
+could be as simple as extending a path with a ``zigzagged'' line\ldots
+%
+\begin{codeexample}[preamble={\usetikzlibrary{decorations,decorations.pathmorphing}}]
+\tikz \draw decorate[decoration=zigzag] {(0,0) -- (3,0)};
+\end{codeexample}
+%
+\ldots but could also be as complex as typesetting text along a path:
+%
+{\catcode`\|12
+\begin{codeexample}[]
+\tikz \path decorate [decoration={text along path,
+ text={Some text along a path}}]
+ { (0,2) .. controls (2,2) and (1,0) .. (3,0) };
+\end{codeexample}
+}
+
+The workflow for using decorations is the following:
+%
+\begin{enumerate}
+ \item You define a decoration using the |\pgfdeclaredecoration| command.
+ Different useful decorations are already declared in libraries like
+ |decorations.shapes|.
+ \item You use normal path construction commands like |\pgfpathlineto| to
+ construct a path. Let us call this path the \emph{to-be-decorated}
+ path.
+ \item You place the path construction commands inside the environment
+ |{pgfdecoration}|. This environment takes the name of a previously
+ declared decoration as a parameter. It will then start ``walking
+ along'' the to-be-decorated path. As it does this, a special finite
+ automaton called a \emph{decoration automaton} produces new path
+ commands as its output (or even other outputs). These outputs replace
+ the to-be-decorated path; indeed, after the to-be-decorated path has
+ been fully walked along it is thrown away, only the output of the
+ automaton persists.
+\end{enumerate}
+
+In the present section the process of how decoration automata work is explained
+first. Then the command(s) for declaring decoration automata and for using them
+are covered.
+
+
+\subsection{Decoration Automata}
+
+Decoration automata (and the closely related meta-decoration automata) are a
+general concept for creating graphics ``along paths''. For straight lines, this
+idea was first proposed by Till Tantau in an earlier version of \pgfname, the
+idea to extend this to arbitrary path was proposed and implemented by Mark
+Wibrow. Further versatility is provided by ``meta-decorations''. These are
+automata that decorate a path with decorations.
+
+In the present subsection the different ideas underlying decoration automata
+are presented.
+
+
+\subsubsection{The Different Paths}
+
+In order to prevent confusion with different types of paths, such as those that
+are extended, those that are decorated and those that are created, the
+following conventions will be used:
+%
+\begin{itemize}
+ \item The \emph{preexisting} path refers to the current path in existence
+ before a decoration environment. (Possibly this path has been created
+ by another decoration used earlier, but we will still call this path
+ the preexisting path also in this case.)
+ \item The \emph{input} path refers to the to-be-decorated path that the
+ decoration automaton moves along. The input path may consist of many
+ line and curve input segments (for example, a circle or an ellipse
+ consists of four curves). It is specified inside the decoration
+ environment.
+ \item The \emph{output} path refers to the path that the decoration
+ creates. Depending on the decoration, this path may or may not be empty
+ (a decoration can also choose to use side-effects instead of producing
+ an output path). The input path is always consumed by the decoration
+ automaton, that is, it is no longer available in any way after the
+ decoration automaton has finished.
+\end{itemize}
+
+The effect of a decoration environment is the following: The input path, which
+is specified inside the environment, is constructed and stored. This process
+does not alter the preexisting path in any way. Then the decoration automaton
+is started (as described later) and it produces an output path (possibly
+empty). Whenever part of the output path is produced, it is concatenated with
+the preexisting path. After the environment, the current path will equal the
+original preexisting path followed by the output path.
+
+It is permissible that a decoration issues a |\pgfusepath| command. As usual,
+this causes the current path to be filled or stroked or some other action to be
+taken and the current path is set to the empty path. As described above, when
+the decoration automaton starts, the current path is the preexisting path and
+as the automaton progresses, the current path is constantly being extended by
+the output path. This means that first time a |\pgfusepath| command is used on
+a decoration, the preexisting path is part of the path this command operates
+on; in subsequent calls only the part of the output path constructed since the
+last |\pgfusepath| command will be used.
+
+You can use this mechanism to stroke or fill different parts of the output path
+in different colors, line widths, fills and shades; all within the same
+decoration. Alternatively, a decoration can choose to produce no output path at
+all: the |text| decoration simply typesets text along a path.
+
+
+\subsubsection{Segments and States}
+
+The most common use of a decoration is to ``repeat something along a path''
+(for example, the |zigzag| decoration repeats
+%
+\tikz\draw decorate[decoration=zigzag] {(0,0)--(\pgfdecorationsegmentlength,0)};
+%
+along a path). However, it not necessarily the case that only one thing is
+repeated: a decoration can consist of different parts, or \emph{segments},
+repeated in a particular order.
+
+When you declare a decoration, you provide a description of how their different
+segments will be rendered. The description of each segment should be given in a
+way as if the ``$x$-axis'' of the segment is the tangent to the path at a
+particular point, and that point is the origin of the segment. Thus, for
+example, the segment of the |zigzag| decoration might be defined using the
+following code:
+%
+\begin{codeexample}[code only]
+\pgfpathlineto{\pgfpoint{5pt}{5pt}}
+\pgfpathlineto{\pgfpoint{15pt}{-5pt}}
+\pgfpathlineto{\pgfpoint{20pt}{0pt}}
+\end{codeexample}
+
+\pgfname\ will ensure that an appropriate coordinate transformation is in place
+when the segment is rendered such that the segment actually points in the right
+direction. Also, subsequent segments will be transformed such that they are
+``further along the path'' toward the end of the path. All transformations are
+set up automatically.
+
+Note that we did not use a |\pgfpathmoveto{\pgfpointorigin}| at the beginning
+of the segment code. Doing so would subdivide the path into numerous subpaths.
+Rather, we assume that the previous segment caused the current point to be at
+the origin.
+
+The width of a segment can (and must) be specified explicitly. \pgfname\ will
+use this width to find out the start point of the next segment and the correct
+rotation. The width the you provide need not be the ``real'' width of the
+segment, which allows decoration segments to overlap or to be spaced far apart.
+
+The |zigzag| decoration only has one segment that is repeated again and again.
+However, we might also like to have \emph{different} segments and use rules to
+describe which segment should be used where. For example, we might have special
+segments at the start and at the end.
+
+Decorations use a mechanism known in theoretical in computer science as
+\emph{finite state automata} to describe which segment is used at a particular
+point. The idea is the following: For the first segment we start in a special
+\emph{state} called the \emph{initial state}. In this state, and also in all
+other states later, \pgfname\ first computes how much space is left on the
+input path. That is, \pgfname\ keeps track of the distance to the end of the
+input path. Attached to each state there is a set of rules of the following
+form: ``If the remaining distance on the input path is less than $x$, switch to
+state~$q$.'' \pgfname\ checks for each of these rules whether it applies and,
+if so, immediately switches to state~$q$.
+
+Only if none of the rules tell us to switch to another state, \pgfname\ will
+execute the state's code. This code will (typically) add a segment to the
+output path. In addition to the rules there is also a width parameter attached
+to each state. \pgfname\ then translates the coordinate system by this width
+and reduces the remaining distance on the input path. Then, \pgfname\ either
+stays in the current state or switches to another state, depending on yet
+another property attached of the state.
+
+The whole process stops when a special state called |final| is reached. The
+segment of this state is immediately added to the output path (it is often
+empty, though) and the process ends.
+
+
+\subsection{Declaring Decorations}
+
+The following command is used to declare a decoration. Essentially, this
+command describes the decoration automaton.
+
+\begin{command}{\pgfdeclaredecoration\marg{name}\marg{initial state}\marg{states}}
+ This command declares a new decoration called \meta{name}. The
+ \meta{states} argument contains a description of the decoration automaton's
+ states and the transitions between them. The \meta{initial state} is the
+ state in which the automaton starts.
+
+ When the automaton is later applied to an input path, it keeps track of a
+ certain position on the input path. This current point will ``travel along
+ the path'', each time being moved along by a certain distance. This will
+ also work if the path is not a straight line. That is, it is permissible
+ that the path curves are veers at a sharp angle. It is also permissible
+ that while traveling along the input path, the current input segment ends
+ and a new input segment starts. In this case, the remaining distance on the
+ first input segment is subtracted from the \meta{dimension} and then we
+ travel along the second input segment for the remaining distance. This
+ input segment may also end early, in which case we travel along the next
+ input segment, and so on. Note that it cannot happen that we travel past
+ the end of the input path since this would have caused an immediate switch
+ to the |final| state.
+
+ Note that the computation of the path lengths has only a low accuracy
+ because of \TeX's small math capabilities. Do not expect high accuracy
+ alignments when using decorations (unless the input path consists only of
+ horizontal and vertical lines).
+
+ The \meta{states} argument should consist of |\state| commands, one for
+ each state of the decoration automaton. The |\state| command is defined
+ only when the \meta{states} argument is executed.
+
+ \begin{command}{\state\marg{name}\oarg{options}\marg{code}}
+ This command declares a new state inside the current decoration
+ automaton. The state is named \meta{name}.
+
+ When the decoration automaton is in state \meta{name}, the following
+ things happen:
+ %
+ \begin{enumerate}
+ \item The \meta{options} are parsed. This may lead to a state
+ switch, see below. When this happens, the following steps are
+ not executed. The \meta{options} are executed one after the
+ other in the given order. If an option causes a state switch,
+ the switch is immediate, even if later options might cause a
+ different state switch.
+ \item The \meta{code} is executed in a \TeX-group with the current
+ transformation matrix set up in such a way that the origin is
+ on the input path at the current point (the point at the
+ distance traveled up to now) and the coordinate system is
+ rotated in such a way that the positive $x$-axis points in the
+ direction of the tangent to the input path at the current
+ point, while the positive $y$-axis points to the left of this
+ tangent.
+
+ As described earlier, the \meta{code} can have two different
+ effects: If it just contains path construction commands, the
+ decoration will produce an output path, that is, it extends the
+ preexisting path. Here is an example:
+ %
+\begin{codeexample}[]
+\pgfdeclaredecoration{example}{initial}
+{
+ \state{initial}[width=10pt]
+ {
+ \pgfpathlineto{\pgfpoint{0pt}{5pt}}
+ \pgfpathlineto{\pgfpoint{5pt}{5pt}}
+ \pgfpathlineto{\pgfpoint{5pt}{-5pt}}
+ \pgfpathlineto{\pgfpoint{10pt}{-5pt}}
+ \pgfpathlineto{\pgfpoint{10pt}{0pt}}
+ }
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ }
+}
+\tikz[decoration=example]
+{
+ \draw [decorate] (0,0) -- (3,0);
+ \draw [red,decorate] (0,0) to [out=45,in=135] (3,0);
+}
+\end{codeexample}
+
+ Alternatively, the \meta{code} can also contain the
+ |\pgfusepath| command. This will use the path in the usual
+ manner, where ``the path'' is the preexisting path plus a part
+ of the output path for the first invocation and the different
+ parts of the rest of the output path for the following
+ invocation. Here is an example:
+ %
+\begin{codeexample}[]
+\pgfdeclaredecoration{stars}{initial}{
+ \state{initial}[width=15pt]
+ {
+ \pgfmathparse{round(rnd*100)}
+ \pgfsetfillcolor{yellow!\pgfmathresult!orange}
+ \pgfsetstrokecolor{yellow!\pgfmathresult!red}
+ \pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}}
+ }
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }
+}
+\tikz\path[decorate, decoration=stars, star point ratio=2, star points=5,
+ inner sep=0, minimum size=rnd*10pt+2pt]
+ (0,0) .. controls (0,2) and (3,2) .. (3,0)
+ .. controls (3,-3) and (0,0) .. (0,-3)
+ .. controls (0,-5) and (3,-5) .. (3,-3);
+\end{codeexample}
+ %
+
+ \item After the \meta{code} has been executed (possibly more than
+ once, if the |repeat state| option is used), the state switches
+ to whatever state has been specified inside the \meta{options}
+ using the |next state| option. If no |next state| has been
+ specified, the state stays the same.
+ \end{enumerate}
+
+ The \meta{options} are executed with the key path set to
+ |/pgf/decoration automaton|. The following keys are defined:
+ %
+ \begin{key}{/pgf/decoration automaton/switch if less than=\meta{dimension}\texttt{ to }\meta{new state}}
+ When this key is encountered, \pgfname\ checks whether the
+ remaining distance to the end of the input path is less than
+ \meta{dimension}. If so, an immediate state switch to \meta{new
+ state} occurs.
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration automaton/switch if input segment less than=\\\meta{dimension}\texttt{ to }\meta{new state}}
+ When this key is encountered, \pgfname\ checks whether the
+ remaining distance to the end of the current input segment of the
+ input path is less than \meta{dimension}. If so, an immediate state
+ switch to \meta{new state} occurs.
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration automaton/width=\meta{dimension}}
+ First, this option causes an immediate switch to the state |final|
+ if the remaining distance on the input path is less than
+ \meta{dimension}. The effect is the same as if you had said |switch
+ if less than=|\meta{dimension}| to final| just before the |width|
+ option.
+
+ If no switch occurs, this option tells \pgfname\ the width of the
+ segment. The current point will travel along the input path (as
+ described earlier) by this distance.
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration automaton/repeat state=\meta{repetitions} (initially 0)}
+ Tells \pgfname\ how long the automaton stays ``normally'' in the
+ current state. This count is reset to \meta{repetitions} each time
+ one of the |switch if| keys causes a state switch. If no state
+ switches occur, the \meta{code} is executed and the repetition
+ counter is decreased. Then, there is once more a chance of a state
+ change caused by any of the \meta{options}. If no repetition
+ occurs, the \meta{code} is executed once more and the counter is
+ decreased once more. When the counter reaches zero, the \meta{code}
+ is executed once more, but, then, a different state is entered, as
+ specified by the |next state| option.
+
+ Note, that the maximum number of times the state will be executed
+ is $\meta{repetitions}+1$.
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration automaton/next state=\meta{new state}}
+ After the \meta{code} for state has been executed for the last
+ time, a state switch to \meta{new state} is performed. If this
+ option is not given, the next state is the same as the current
+ state.
+ \end{key}
+
+ \begin{key}{/pgf/decoration automaton/if input segment is closepath=\meta{options}}
+ This key checks whether the current input segment is a closepath
+ operation. If so, the \meta{options} get executed; otherwise
+ nothing happens. You can use this option to handle a closepath in
+ some special way, for instance, switching to a new state in which
+ |\pgfpathclose| is executed.
+ \end{key}
+
+ \begin{key}{/pgf/decoration automaton/auto end on length=\meta{dimension}}
+ This key is just included for convenience, it does nothing that
+ cannot be achieved using the previous options. The effect is the
+ following: If the remaining input path's length is at most
+ \meta{dimension}, the decorated path is ended with a straight line
+ to the end of the input path and, possibly, it is closed, namely if
+ the input path ended with a closepath operation. Otherwise, it is
+ checked whether the current input segment is a closepath segment
+ and whether the remaining distance on the current input segment is
+ at most \meta{distance}. If so, then a closepath operation is used
+ to close the decorated path and the automaton continues with the
+ next subpath, remaining in the current state.
+
+ In all other cases, nothing happens.
+ \end{key}
+
+ \begin{key}{/pgf/decoration automaton/auto corner on length=\meta{dimension}}
+ This key has the following effect: Firstly, in case the \TeX-if
+ |\ifpgfdecoratepathhascorners| is false, nothing happens.
+ Otherwise, it is tested whether the remaining distance on the
+ current input segment is at most \meta{dimension}. If so, a
+ |lineto| operation is used to reach the end of this input segment
+ and the automaton continues with the next input segment, but
+ remains in the current state.
+
+ The main idea behind this option is to avoid having decoration
+ segments ``overshoot'' past a corner.
+ \end{key}
+
+ You may sometimes wish to do computations outside the transformational
+ \TeX-group of the current segment, so that these results of these
+ computations are available in the next state. For this, the following
+ two options are useful:
+
+ \begin{key}{/pgf/decoration automaton/persistent precomputation=\meta{precode}}
+ If the \meta{code} of the state is executed, the \meta{precode} is
+ executed first and it is executed outside the \TeX-group of the
+ \meta{code}. Note that when the \meta{precode} is executed, the
+ transformation matrix is not set up.
+ \end{key}
+
+ \begin{key}{/pgf/decoration automaton/persistent postcomputation=\meta{postcode}}
+ Works like the |persistent precomputation| option, only the
+ \meta{postcode} is executed after (and also outside) the \TeX-group
+ of the main \meta{code}.
+ \end{key}
+
+ There are a number of macros and dimensions which may be useful inside
+ a decoration automaton. The following macros are available:
+
+ \begin{command}{\pgfdecoratedpathlength}
+ The length of the input path. If the input path consists of several
+ input segments, this number is the sum of the lengths of the input
+ segments.
+ \end{command}
+
+ \begin{command}{\pgfdecoratedinputsegmentlength}
+ The length of the current input segment of the input path.
+ ``Current input segment'' refers to the input segment on which the
+ current point lies.
+ \end{command}
+
+ \begin{command}{\pgfpointdecoratedpathlast}
+ The final point of the input path.
+ \end{command}
+
+ \begin{command}{\pgfpointdecoratedinputsegmentlast}
+ The final point of the current input segment of the input path.
+ \end{command}
+
+ \begin{command}{\pgfdecoratedangle}
+ The angle of the tangent to the decorated path at the \emph{origin}
+ of the current segment. The transformation matrix applied at the
+ beginning of a state includes a rotation equivalent to this angle.
+ \end{command}
+
+ The following \TeX\ dimension registers are also available inside the
+ automaton:
+
+ \begin{command}{\pgfdecoratedremainingdistance}
+ The remaining distance on the input path.
+ \end{command}
+
+ \begin{command}{\pgfdecoratedcompleteddistance}
+ The completed distance on the input path.
+ \end{command}
+
+ \begin{command}{\pgfdecoratedinputsegmentremainingdistance}
+ The remaining distance on the current input segment of the input path.
+ \end{command}
+
+ \begin{command}{\pgfdecoratedinputsegmentcompleteddistance}
+ The completed distance on the current input segment of the input path.
+ \end{command}
+
+ Further keys and macros are defined and used by the decoration
+ libraries, see Section~\ref{section-library-decorations}.
+
+ The following example shows how these options can be used:
+ %
+\begin{codeexample}[]
+\pgfdeclaredecoration{complicated example decoration}{initial}
+{
+ \state{initial}[width=5pt,next state=up]
+ { \pgfpathlineto{\pgfpoint{5pt}{0pt}} }
+
+ \state{up}[width=5pt,next state=down]
+ {
+ \ifdim\pgfdecoratedremainingdistance>\pgfdecoratedcompleteddistance
+ % Growing
+ \pgfpathlineto{\pgfpoint{0pt}{\pgfdecoratedcompleteddistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{\pgfdecoratedcompleteddistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{0pt}}
+ \else
+ % Shrinking
+ \pgfpathlineto{\pgfpoint{0pt}{\pgfdecoratedremainingdistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{\pgfdecoratedremainingdistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{0pt}}
+ \fi%
+ }
+ \state{down}[width=5pt,next state=up]
+ {
+ \ifdim\pgfdecoratedremainingdistance>\pgfdecoratedcompleteddistance
+ % Growing
+ \pgfpathlineto{\pgfpoint{0pt}{-\pgfdecoratedcompleteddistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{-\pgfdecoratedcompleteddistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{0pt}}
+ \else
+ % Shrinking
+ \pgfpathlineto{\pgfpoint{0pt}{-\pgfdecoratedremainingdistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{-\pgfdecoratedremainingdistance}}
+ \pgfpathlineto{\pgfpoint{5pt}{0pt}}
+ \fi%
+ }
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ }
+}
+\begin{tikzpicture}[decoration=complicated example decoration]
+ \draw decorate{ (0,0) -- (3,0)};
+ \fill [red!50,rounded corners=2pt]
+ decorate {(.5,-2) -- ++(2.5,-2.5)} -- (3,-5) -| (0,-2) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ \end{command}
+\end{command}
+
+
+\subsubsection{Predefined Decorations}
+
+The three decorations |moveto|, |lineto|, and |curveto| are predefined and
+``always available''. They are mostly useful in conjunction with
+meta-decorations. They are documented in
+Section~\ref{section-library-decorations} alongside the other decorations.
+
+
+\subsection{Using Decorations}
+
+Once a decoration has been declared, it can be used.
+
+\begin{environment}{{pgfdecoration}\marg{decoration list}}
+ The \meta{environment contents} should contain commands for creating an
+ path. This path is the basis for the \emph{input paths} for the decorations
+ in the \meta{decoration list}. In detail, the following happens:
+ %
+ \begin{enumerate}
+ \item The preexisting unused path is saved.
+ \item The path commands specified in \meta{environment contents} are
+ executed and this resulting path is saved. The path is then divided
+ into different \emph{input paths} as follows: The format for each
+ item in \marg{decoration list} is
+ %
+ \begin{quote}
+ \marg{decoration}\marg{length}\opt{\marg{before code}\marg{after code}}
+ \end{quote}
+ %
+ The \meta{before code} and the \meta{after code} are optional. The
+ input path is divided into input paths as follows: The first input
+ path consists of the first lines of the path specified in the
+ \meta{environment contents} until the \meta{length} of the first
+ element of the \meta{decoration list} is reached. If this length is
+ reached in the middle of a line, the line is broken up at this
+ exact position. Then the second input path has the \meta{length} of
+ the second element in the \meta{decoration list} and consists of
+ the lines making up the following \meta{length} part of the path in
+ the \meta{environment contents}, and so on.
+
+ If the lengths in the \meta{decoration list} do not add up to the
+ total length of the path in the \meta{environment contents}, either
+ some decorations are dropped (if their lengths add up to more than
+ the length of the \meta{environment contents}) or the input path is
+ not fully used (if their lengths add up to less).
+ \item The preexisting path is reinstalled.
+ \item The decoration automata move along the input paths, thus creating
+ (and possibly using) the output paths. These output paths extend
+ the current path (unless they are used).
+ \end{enumerate}
+
+ Some important points should be noted regarding the use of this
+ environment:
+ %
+ \begin{itemize}
+ \item If \meta{environment contents} does not begin with
+ |\pgfpathmoveto|, the last known point on the preexisting path is
+ assumed as the starting point.
+ \item All except the last of any sequence of consecutive move-to
+ commands in \meta{environment contents} are discarded.
+ \item Any move-to commands at the end of \meta{environment contents}
+ are ignored.
+ \item Any close-path commands on the input path are interpreted as
+ straight lines. Internally, something a little more complicated is
+ going on, however, a closed path on the input path has no effect on
+ the output path, other than causing the automaton to travel in a
+ straight line towards the location of the last move-to command on
+ the input path.
+ \item Although tangent computations for the input path work with the
+ last point on the preexisting path, no automatic move-to operations
+ are issued for the output path. If an output path starts with a
+ line-to or curve-to when the existing path is empty, an appropriate
+ move-to command should be inserted before the decoration starts.
+ \item If a decoration uses its own path, the first time this happens
+ the preexisting path is part of the path that is used at this
+ point.
+ \end{itemize}
+
+ Before the automata start to "work on" their respective inputs paths,
+ \meta{before code} is executed. After the decoration automaton has
+ finished, \meta{after code} is executed.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={segment length=5pt}]
+ \draw [help lines] grid (3,2);
+ \begin{pgfdecoration}{{curveto}{1cm},{zigzag}{2cm},{curveto}{1cm}}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{3cm}{2cm}}{\pgfpoint{3cm}{0cm}}
+ \end{pgfdecoration}
+\pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ When the lengths are evaluated, the dimension
+ |\pgfdecoratedremainingdistance| holds the remaining distance on the entire
+ decorated path, and |\pgfdecoratedpathlength| holds the total length of the
+ path. Thus, it is possible to specify lengths like
+ |\pgfdecoratedpathlength/3|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={segment length=5pt}]
+ \draw [help lines] grid (3,2);
+ \begin{pgfdecoration}{
+ {curveto}{\pgfdecoratedpathlength/3},
+ {zigzag}{\pgfdecoratedpathlength/3},
+ {curveto}{\pgfdecoratedremainingdistance}
+ }
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{3cm}{2cm}}{\pgfpoint{3cm}{0cm}}
+ \end{pgfdecoration}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ When \meta{before code} is executed, the following macro is useful:
+ %
+ \begin{command}{\pgfpointdecoratedpathfirst}
+ Returns the point corresponding to the start of the current input path.
+ \end{command}
+ %
+ When \meta{after code} is executed, the following macro can be used:
+ %
+ \begin{command}{\pgfpointdecoratedpathlast}
+ Returns the point corresponding to the end of the current input path.
+ \end{command}
+ %
+ This means that if decorations do not use their own path, it is possible to
+ do something with them and continue from the correct place.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \begin{pgfdecoration}{
+ {curveto}{\pgfdecoratedpathlength/3}
+ {}
+ {
+ \pgfusepath{stroke}
+ },
+ {zigzag}{\pgfdecoratedpathlength/3}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathfirst}
+ \pgfdecorationsegmentlength=5pt
+ }
+ {
+ \pgfsetstrokecolor{red}
+ \pgfusepath{stroke}
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ \pgfsetstrokecolor{black}
+ },
+ {curveto}{\pgfdecoratedremainingdistance}
+ }
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{3cm}{2cm}}{\pgfpoint{3cm}{0cm}}
+ \end{pgfdecoration}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ After the |{decoration}| environment has finished, the following macros are
+ available:
+
+ \begin{command}{\pgfdecorateexistingpath}
+ The preexisting path before the environment was entered.
+ \end{command}
+
+ \begin{command}{\pgfdecoratedpath}
+ The (total) input path (that is, the path created by the environment
+ contents).
+ \end{command}
+
+ \begin{command}{\pgfdecorationpath}
+ The output path. If the path is used, this macro contains only the last
+ unused part of the output path.
+ \end{command}
+
+ \begin{command}{\pgfpointdecoratedpathlast}
+ The final point of the input path.
+ \end{command}
+
+ \begin{command}{\pgfpointdecorationpathlast}
+ The final point of the output path.
+ \end{command}
+
+ The following style is executed each time a decoration is used. You may use
+ it to set up default options for decorations.
+ %
+ \begin{stylekey}{/pgf/every decoration (initially \normalfont empty)}
+ This style is executed for every decoration.
+ \end{stylekey}
+\end{environment}
+
+\begin{plainenvironment}{{pgfdecoration}\marg{name}}
+ The plain-\TeX{} version of the |{pgfdecorate}| environment.
+ \todosp{`pgfdecorate' right or `pgfdecoration'? really no idea}
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfdecoration}\marg{name}}
+ The Con\TeX t version of the |{pgfdecoration}| environment.
+\end{contextenvironment}
+
+For convenience, the following macros provide a ``shorthand'' for decorations
+(internally, they all use the |{pgfdecoration}| environment).
+
+\begin{command}{\pgfdecoratepath\marg{name}\marg{path commands}}
+ Decorate the path described by \meta{path commands} with the decoration
+ \meta{name}. This is equivalent to
+ %
+\begin{codeexample}[code only]
+\pgfdecorate{{name}{\pgfdecoratedpathlength}
+ {\pgfdecoratebeforecode}{\pgfdecorateaftercode}}
+ // the path commands.
+\endpgfdecorate
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfdecoratecurrentpath\marg{name}}
+ Decorate the preexisting path with the decoration \meta{name}.
+\end{command}
+
+Both the above commands use the current definitions of the following macros:
+
+\begin{command}{\pgfdecoratebeforecode}
+ Code executed as \meta{before code}, see the description of |\pgfdecorate|.
+\end{command}
+
+\begin{command}{\pgfdecorateaftercode}
+ Code executed as \meta{after code}, see the description of |\pgfdecorate|.
+\end{command}
+
+It may sometimes be useful to add an additional transformation for each segment
+of a decoration. The following command allows you to define such a ``last
+minute transformation''.
+
+\begin{command}{\pgfsetdecorationsegmenttransformation\marg{code}}
+ The \meta{code} will be executed at the very beginning of each segment.
+ Note when applying multiple decorations, this will be reset between
+ decorations, so it needs to be specified for each segment.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \begin{pgfdecoration}{
+ {curveto}{\pgfdecoratedpathlength/3},
+ {zigzag}{\pgfdecoratedpathlength/3}
+ {
+ \pgfdecorationsegmentlength=5pt
+ \pgfsetdecorationsegmenttransformation{\pgftransformyshift{.5cm}}
+ },
+ {curveto}{\pgfdecoratedremainingdistance}
+ }
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{3cm}{2cm}}{\pgfpoint{3cm}{0cm}}
+ \end{pgfdecoration}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Meta-Decorations}
+\label{section-base-meta-decorations}
+
+A meta-decoration provides an alternative way to decorate a path with multiple
+decorations. It is, in essence, an automaton that decorates an input path with
+decoration automatons. In general, however, the end effect is still that a path
+is decorated with other paths, and the input path should be thought of as being
+divided into sub-input-paths, each with their own decoration. Like ordinary
+decorations, a meta-decoration must be declared before it can be used.
+
+
+\subsubsection{Declaring Meta-Decorations}
+
+\begin{command}{\pgfdeclaremetadecorate\marg{name}\marg{initial state}\marg{states}}
+ This command declares a new meta-decoration called \meta{name}. The
+ \meta{states} argument contains a description of the meta-decoration
+ automaton's states and the transitions between them. The \meta{initial
+ state} is the state in which the automaton starts.
+
+ The |\state| command is similar to the one found in decoration
+ declarations, and takes the same form:
+
+ \begin{command}{\state\marg{name}\oarg{options}\marg{code}} Declares the
+ state \meta{name} inside the current meta-decoration automaton. Unlike
+ decorations, states in meta-decorations are not executed within a
+ group, which makes the persistent computation options superfluous.
+ Consider using an initial state with |width=0pt| to do precalculations
+ that could speed the execution of the meta-decoration.
+
+ The \meta{options} are executed with the key path set to
+ |/pgf/meta-decorations automaton/|, and the following keys are defined
+ for this path:
+
+ \begin{key}{/pgf/meta-decoration automaton/switch if less than=\meta{dimension}| to |\meta{new state}}
+ This causes \pgfname\ to check whether the remaining distance to
+ the end of the input path is less than \meta{dimension}, and, if
+ so, to immediately switch to the state \meta{new state}. When this
+ key is evaluated, the macro |\pgfmetadecoratedpathlength| will be
+ defined as the total length of the decoration path, allowing for
+ values such as |\pgfmetadecoratedpathlength/8|.
+ \end{key}
+
+ \begin{key}{/pgf/meta-decoration automaton/width=\meta{dimension}}
+ As always, this option will cause an immediate switch to the state
+ |final| if the remaining distance on the input path is less than
+ \meta{dimension}.
+
+ Otherwise, this option tells \pgfname\ the width of the
+ ``meta-segment'', that is, the length of the sub-input-path which
+ the decoration automaton specified in \meta{code} will decorate.
+ \end{key}
+
+ \begin{key}{/pgf/meta-decoration automaton/next state=\meta{new state}}
+ After the code for a state has been executed, a state switch to
+ \meta{new state} is performed. If this option is not given, the
+ next state is the same as the current state.
+ \end{key}
+
+ The code in \meta{code} is quite different from the code in a
+ decoration state. In almost all cases only the following three macros
+ will be required:
+
+ \begin{command}{\decoration\marg{name}}
+ This sets the decoration for the current state to \meta{name}. If
+ this command is omitted, the |moveto| decoration will be used.
+ \end{command}
+
+ \begin{command}{\beforedecoration\marg{before code}}
+ Defines \meta{before code} as (typically) \pgfname{} commands to be
+ executed before the decoration is applied to the current segment.
+ This command can be omitted. If you wish to set up some decoration
+ specific parameters such as segment length, or segment amplitude,
+ then they can be set in \meta{before code}.
+ \end{command}
+
+ \begin{command}{\afterdecoration\marg{after code}}
+ Defines \meta{after code} as commands to be executed after the
+ decoration has been applied to the current segment. This command
+ can be omitted.
+ \end{command}
+
+ There are some macros that may be useful when creating meta-decorations
+ (note that they are all macros):
+
+ \begin{command}{\pgfpointmetadecoratedpathfirst}
+ When the \meta{before code} is executed, this macro stores the
+ first point on the current sub-input-path.
+ \end{command}
+
+ \begin{command}{\pgfpointmetadecoratedpathlast}
+ When the \meta{after code} is executed, this macro stores the last
+ point on the current sub-input-path.
+ \end{command}
+
+ \begin{command}{\pgfmetadecoratedpathlength}
+ The entire length of the entire input path.
+ \end{command}
+
+ \begin{command}{\pgfmetadecoratedcompleteddistance}
+ The completed distance on the entire input path.
+ \end{command}
+
+ \begin{command}{\pgfmetadecoratedremainingdistance}
+ The remaining distance on the entire input path.
+ \end{command}
+
+ \begin{command}{\pgfmetadecoratedinputsegmentcompleteddistance}
+ The completed distance on the current input segment of the entire
+ input path.
+ \end{command}
+
+ \begin{command}{\pgfmetadecoratedinputsegmentremainingdistance}
+ The remaining distance on the current input segment of the entire
+ input path.
+ \end{command}
+ \end{command}
+
+ Here is a complete example of a meta-decoration:
+ %
+\begin{codeexample}[]
+\pgfdeclaremetadecoration{arrows}{initial}{
+ \state{initial}[width=0pt, next state=arrow]
+ {
+ \pgfmathdivide{100}{\pgfmetadecoratedpathlength}
+ \let\factor\pgfmathresult
+ \pgfsetlinewidth{1pt}
+ \pgfset{/pgf/decoration/segment length=4pt}
+ }
+ \state{arrow}[
+ switch if less than=\pgfmetadecorationsegmentlength to final,
+ width=\pgfmetadecorationsegmentlength/3,
+ next state=zigzag]
+ {
+ \decoration{curveto}
+ \beforedecoration
+ {
+ \pgfmathparse{\pgfmetadecoratedcompleteddistance*\factor}
+ \pgfsetcolor{red!\pgfmathresult!yellow}
+ \pgfpathmoveto{\pgfpointmetadecoratedpathfirst}
+ }
+ }
+ \state{zigzag}[width=\pgfmetadecorationsegmentlength/3, next state=end arrow]
+ {
+ \decoration{zigzag}
+ }
+ \state{end arrow}[width=\pgfmetadecorationsegmentlength/3, next state=move]
+ {
+ \decoration{curveto}
+ \beforedecoration{\pgfpathmoveto{\pgfpointmetadecoratedpathfirst}}
+ \afterdecoration
+ {
+ \pgfsetarrowsend{to}
+ \pgfusepath{stroke}
+ }
+ }
+ \state{move}[width=\pgfmetadecorationsegmentlength/2, next state=arrow]{}
+ \state{final}{}
+}
+
+\tikz\draw[decorate,decoration={arrows,meta-segment length=2cm}]
+ (0,0) .. controls (0,2) and (3,2) .. (3,0)
+ .. controls (3,-2) and (0,-2) .. (0,-4)
+ .. controls (0,-6) and (3,-6) .. (3,-8)
+ .. controls (3,-10) and (0,-10) .. (0,-8);
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Predefined Meta-decorations}
+
+There are no predefined meta-decorations loaded with \pgfname{}.
+
+
+\subsubsection{Using Meta-Decorations}
+
+Using meta-decorations is ``simpler'' than using decorations, because you can
+only use one meta-decoration per path.
+
+\begin{environment}{{pgfmetadecoration}\marg{name}}
+ This environment decorates the input path described in \meta{environment
+ contents}, with the meta-decoration \meta{name}.
+\end{environment}
+
+\begin{plainenvironment}{{pgfmetadecoration}\marg{name}}
+ The plain \TeX{} version of the |{pgfmetadecoration}| environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfmetadecoration}\marg{name}}
+ The Con\TeX t version of the |{pgfmetadecoration}| environment.
+\end{contextenvironment}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-design.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-design.tex
new file mode 100644
index 0000000000..72dc66db70
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-design.tex
@@ -0,0 +1,146 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Design Principles}
+
+This section describes the basic layer of \pgfname. This layer is built on top
+of the system layer. Whereas the system layer just provides the absolute
+minimum for drawing graphics, the basic layer provides numerous commands that
+make it possible to create sophisticated graphics easily and also quickly.
+
+The basic layer does not provide a convenient syntax for describing graphics,
+which is left to frontends like \tikzname. For this reason, the basic layer is
+typically used only by ``other programs''. For example, the \textsc{beamer}
+package uses the basic layer extensively, but does not need a convenient input
+syntax. Rather, speed and flexibility are needed when \textsc{beamer} creates
+graphics.
+
+The following basic design principles underlie the basic layer:
+%
+\begin{enumerate}
+ \item Structuring into a core and modules.
+ \item Consistently named \TeX\ macros for all graphics commands.
+ \item Path-centered description of graphics.
+ \item Coordinate transformation system.
+\end{enumerate}
+
+
+\subsection{Core and Modules}
+
+The basic layer consists of a \emph{core package}, called |pgfcore|, which
+provides the most basic commands, and several \emph{modules} like commands for
+plotting (in the |plot| module). Modules are loaded using the |\usepgfmodule|
+command.
+
+If you say |\usepackage{pgf}| or |\input pgf.tex| or |\usemodule[pgf]|, the
+|plot| and |shapes| modules are preloaded (as well as the core and the system
+layer).
+
+
+\subsection{Communicating with the Basic Layer via Macros}
+
+In order to ``communicate'' with the basic layer you use long sequences of
+commands that start with |\pgf|. You are only allowed to give these commands
+inside a |{pgfpicture}| environment. (Note that |{tikzpicture}| opens a
+|{pgfpicture}| internally, so you can freely mix \pgfname\ commands and
+\tikzname\ commands inside a |{tikzpicture}|.) It is possible to ``do other
+things'' between the commands. For example, you might use one command to move
+to a certain point, then have a complicated computation of the next point, and
+then move there.
+%
+\begin{codeexample}[]
+\newdimen\myypos
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpoint{0cm}{\myypos}}
+ \pgfpathlineto{\pgfpoint{1cm}{\myypos}}
+ \advance \myypos by 1cm
+ \pgfpathlineto{\pgfpoint{1cm}{\myypos}}
+ \pgfpathclose
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+The following naming conventions are used in the basic layer:
+%
+\begin{enumerate}
+ \item All commands and environments start with |pgf|.
+ \item All commands that specify a point (a coordinate) start with
+ |\pgfpoint|.
+ \item All commands that extend the current path start with |\pgfpath|.
+ \item All commands that set/change a graphics parameter start with
+ |\pgfset|.
+ \item All commands that use a previously declared object (like a path,
+ image or shading) start with |\pgfuse|.
+ \item All commands having to do with coordinate transformations start with
+ |\pgftransform|.
+ \item All commands having to do with arrow tips start with |\pgfarrows|.
+ \item All commands for ``quickly'' extending or drawing a path start with
+ |\pgfpathq| or |\pgfusepathq|.
+ \item All commands having to do with matrices start with |\pgfmatrix|.
+\end{enumerate}
+
+
+\subsection{Path-Centered Approach}
+
+In \pgfname\ the most important entity is the \emph{path}. All graphics are
+composed of numerous paths that can be stroked, filled, shaded, or clipped
+against. Paths can be closed or open, they can self-intersect and consist of
+unconnected parts.
+
+Paths are first \emph{constructed} and then \emph{used}. In order to construct
+a path, you can use commands starting with |\pgfpath|. Each time such a command
+is called, the current path is extended in some way.
+
+Once a path has been completely constructed, you can use it using the command
+|\pgfusepath|. Depending on the parameters given to this command, the path will
+be stroked (drawn) or filled or subsequent drawings will be clipped against
+this path.
+
+
+\subsection{Coordinate Versus Canvas Transformations}
+\label{section-design-transformations}
+
+\pgfname\ provides two transformation systems: \pgfname's own \emph{coordinate}
+transformation matrix and \pdf's or PostScript's \emph{canvas} transformation
+matrix. These two systems are quite different. Whereas a scaling by a factor
+of, say, $2$ of the canvas causes \emph{everything} to be scaled by this factor
+(including the thickness of lines and text), a scaling of two in the coordinate
+system causes only the \emph{coordinates} to be scaled, but not the line width
+nor text.
+
+By default, all transformations only apply to the coordinate transformation
+system. However, using the command |\pgflowlevel| it is possible to apply a
+transformation to the canvas.
+
+Coordinate transformations are often preferable over canvas transformations.
+Text and lines that are transformed using canvas transformations suffer from
+differing sizes and lines whose thickness differs depending on whether the line
+is horizontal or vertical. To appreciate the difference, consider the following
+two ``circles'' both of which have been scaled in the $x$-direction by a factor
+of $3$ and by a factor of $0.5$ in the $y$-direction. The left circle uses a
+canvas transformation, the right uses \pgfname's coordinate transformation
+(some viewers will render the left graphic incorrectly since they do no apply
+the low-level transformation the way they should):
+
+\begin{tikzpicture}[line width=5pt]
+ \useasboundingbox (-1.75,-1) rectangle (14,1);
+
+ \begin{scope}
+ \pgflowlevel{\pgftransformxscale{3}}
+ \pgflowlevel{\pgftransformyscale{.5}}
+
+ \draw (0,0) circle (0.5cm);
+ \draw (.55cm,0pt) node[right] {canvas};
+ \end{scope}
+ \begin{scope}[xshift=9cm,xscale=3,yscale=.5]
+ \draw (0,0) circle (0.5cm);
+ \draw (.55cm,0pt) node[right] {coordinate};
+ \end{scope}
+\end{tikzpicture}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-external.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-external.tex
new file mode 100644
index 0000000000..033049def2
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-external.tex
@@ -0,0 +1,502 @@
+% Copyright 2007 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Externalizing Graphics}
+\label{section-external}
+
+\subsection{Overview}
+
+There are two fundamentally different ways of inserting graphics into a
+\TeX-document. First, you can create a graphic using some external program like
+|xfig| or |InDesign| and then include this graphic in your text. This is done
+using commands like |\includegraphics| or |\pgfimage|. In this case, the
+graphic file contains all the low-level graphic commands that describe the
+picture. When such a file is included, all \TeX\ has to worry about is the size
+of the picture; the internals of the picture are unknown to \TeX\ and it does
+not care about them.
+
+The second method of creating graphics is to use a special package that
+transforms \TeX-commands like |\draw| or |\psline| into appropriate low-level
+graphic commands. In this case, \TeX\ has to do all the hard work of
+``typesetting'' the picture and if a picture has a complicated internal
+structure this may take a lot of time.
+
+While \pgfname\ was created to facilitate the second method of creating
+pictures, there are two main reasons why you may need to employ the first
+method of image-inclusion, nevertheless:
+%
+\begin{enumerate}
+ \item Typesetting a picture using \TeX\ can be a very time-consuming
+ process. If \TeX\ needs a minute to typeset a picture, you do not want
+ to wait this minute when you re\TeX\ your document after having changed
+ a single comma.
+ \item Some users, especially journal editors, may not be able to process
+ files that contain \pgfname\ commands -- for the simple reason that the
+ systems of many publishing houses do not have \pgfname\ installed.
+\end{enumerate}
+
+In both cases, the solution is to ``extract'' or ``externalize'' pictures that
+would normally be typeset every time a document is \TeX ed. Once the pictures
+have been extracted into separate graphics files, these graphic files can be
+reinserted into the text using the first method.
+
+Extracting a graphic from a file is not as easy as it may sound at first since
+\TeX\ cannot write parts of its output into different files and a bit of
+trickery is needed. The following macros simplify the workflow:
+%
+\begin{enumerate}
+ \item You have to tell \pgfname\ which files will be used for which
+ pictures. To do so, you enclose each picture that you wish to be
+ ``externalized'' in a pair of |\beginpgfgraphicnamed| and
+ |\endpgfgraphicnamed| macros.
+ \item The next step is to generate the extracted graphics. For this you run
+ \TeX\ with the |\jobname| set to the graphic file's name. This will
+ cause |\pgfname| to behave in a very special way: All of your document
+ will simply be thrown away, \emph{except} for the single graphic having
+ the same name as the current jobname.
+ \item After you have run \TeX\ once for each graphic that your wish to
+ externalize, you can rerun \TeX\ on your document normally. This will
+ have the following effect: Each time a |\beginpgfgraphicnamed| is
+ encountered, \pgfname\ checks whether a graphic file of the given name
+ exists (if you did step 2, it will). If this graphic file exists, it
+ will be input and the text till the corresponding |\endpgfgraphicnamed|
+ will be ignored.
+\end{enumerate}
+
+In the rest of this section, the above workflow is explained in more detail.
+
+
+\subsection{Workflow Step 1: Naming Graphics}
+
+In order to put each graphic in an external file, you first need to tell
+\pgfname\ the names of these files.
+
+\begin{command}{\beginpgfgraphicnamed\marg{file name prefix}}
+ This command indicates that everything up to the next call of
+ |\endpgfgraphicnamed| is part of a graphic that should be placed in a file
+ named \meta{file name prefix}|.|\meta{suffix}, where the \meta{suffix}
+ depends on your backend driver. Typically, \meta{suffix} will be |dvi| or
+ |pdf|.
+
+ Here is a typical example of how this command is used:
+ %
+\begin{codeexample}[code only]
+% In file main.tex:
+...
+As we see in Figure~\ref{fig1}, the world is flat.
+\begin{figure}
+ \beginpgfgraphicnamed{graphic-of-flat-world}
+ \begin{tikzpicture}
+ \fill (0,0) circle (1cm);
+ \end{tikzpicture}
+ \endpgfgraphicnamed
+ \caption{The flat world.}
+ \label{fig1}
+\end{figure}
+\end{codeexample}
+
+ Each graphic to be externalized should have a unique name. Note that this
+ name will be used as the name of a file in the file system, so it should
+ not contain any funny characters.
+
+ This command can have three different effects:
+ %
+ \begin{enumerate}
+ \item The easiest situation arises if there does not yet exist a
+ graphic file called \meta{file name prefix}|.|\meta{suffix}, where
+ the \meta{suffix} is one of the suffixes understood by your current
+ backend driver (so |pdf| or |jpg| if you use |pdftex|, |eps| if you
+ use |dvips|, and so on). In this case, both this command and the
+ |\endpgfgraphicnamed| command simply have no effect.
+ \item A more complex situation arises when a graphic file named
+ \meta{file name prefix}|.|\meta{suffix} \emph{does} exist. In this
+ case, this graphic file is included using the |\includegraphics|
+ command%
+ %
+ \footnote{Actually, the command key \texttt{/pgf/images/include
+ external} is invoked which calls an appropriate
+ \texttt{\textbackslash includegraphics} command.}.
+ %
+ Furthermore, the text between |\beginpgfgraphicnamed| and
+ |\endpgfgraphicnamed| is ignored.
+
+ When the text is ``ignored'', what actually happens is that all
+ text up to the next occurrence of |\endpgfgraphicnamed| is thrown
+ away without any macro expansion. This means, in particular, that
+ (a) you cannot put |\endpgfgraphicnamed| inside a macro and (b) the
+ macros used in the graphics need not be defined at all when the
+ graphic file is included. \item The most complex behaviour arises
+ when current the |\jobname| equals the \meta{file name prefix} and,
+ furthermore, the \emph{real job name} has been declared. The
+ behaviour for this case is explained later.
+ \end{enumerate}
+
+ Note that the |\beginpgfgraphicnamed| does not really have any effect until
+ you have generated the graphic files named. Till then, this command is
+ simply ignored. Also, if you delete the graphics file later on, the
+ graphics are typeset normally once more.
+\end{command}
+
+\begin{command}{\endpgfgraphicnamed}
+ This command just marks the end of the graphic that should be externalized.
+\end{command}
+
+
+\subsection{Workflow Step 2: Generating the External Graphics}
+
+We have now indicated all the graphics for which we would like graphic files to
+be generated. In order to generate the files, you now need to modify the
+|\jobname| appropriately. This is done in two steps:
+%
+\begin{enumerate}
+ \item You use the following command to tell \pgfname\ the real name of your
+ |.tex| file:
+ %
+ \begin{command}{\pgfrealjobname\marg{name}}
+ Tells \pgfname\ the real name of your job. For instance, if you
+ have a file called |survey.tex| that contains two graphics that you
+ wish to be called |survey-graphic1| and |survey-graphic2|, then you
+ should write the following.
+ %
+\begin{codeexample}[code only]
+% This is file survey.tex
+\documentclass{article}
+...
+\usepackage{tikz}
+\pgfrealjobname{survey}
+\end{codeexample}
+ \end{command}
+ \item You run \TeX\ with the |\jobname| set to the name of the graphic for
+ which you need an external graphic to be generated. To set the
+ |\jobname|, you use the |--jobname=| option of \TeX:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+bash> latex --jobname=survey-graphic1 survey.tex
+\end{codeexample}
+ %
+\end{enumerate}
+
+The following things will now happen:
+%
+\begin{enumerate}
+ \item |\pgfrealjobname| notices that the |\jobname| is not the ``real''
+ jobname and, thus, must be the name of a graphic that is to be put in
+ an external file.
+ \item At the beginning of the document, \pgfname\ changes the definition of
+ \TeX's internal |\shipout| macro. The new shipout macro simply throws
+ away the output. This means that the document is typeset normally, but
+ no output is produced.
+ \item When the |\beginpgfgraphicnamed{|\meta{name}|}| command is
+ encountered where the \meta{name} is the same as the current
+ |\jobname|, then a \TeX-box is started and \meta{everything} up to the
+ following |\endpgfgraphicnamed| command is stored inside this box.
+
+ Note that, typically, \meta{everything} will contain just a single
+ |{tikzpicture}| or |{pgfpicture}| environment. However, this need not
+ be the case, you can use, say, a |{pspicture}| environment as
+ \meta{everything} or even just some normal \TeX-text.
+ \item At the |\endpgfgraphicnamed|, the box \emph{is} shipped out using the
+ original |\shipout| command. Thus, unlike everything else, the contents
+ of the graphic is made part of the output.
+ \item When the box containing the graphic is shipped out, the paper size is
+ modified such that it is exactly equal to the height and width of the
+ box.
+\end{enumerate}
+
+The net effect of everything described above is that the two commands
+%
+\begin{codeexample}[code only, tikz syntax=false]
+bash> latex --jobname=survey-graphic1 survey.tex
+bash> dvips survey-graphic1
+\end{codeexample}
+%
+\noindent produce a file called |survey-graphic1.ps| that consists of a single
+page that contains exactly the graphic produced by the code between
+|\beginpgfgraphicnamed{survey-graphic1}| and |\endpgfgraphicnamed|.
+Furthermore, the size of this single page is exactly the size of the graphic.
+
+If you use pdf\TeX, producing the graphic is even simpler:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+bash> pdflatex --jobname=survey-graphic1 survey.tex
+\end{codeexample}
+%
+\noindent produces the single-page |pdf|-file |survey-graphic1.pdf|.
+
+
+\subsection{Workflow Step 3: Including the External Graphics}
+
+Once you have produced all the pictures in the text, including them into the
+main document is easy: Simply run \TeX\ again without any modification of the
+|\jobname|. In this case the |\pgfrealjobname| command will notice that the
+main file is, indeed, the main file. The main file will then be typeset
+normally and the |\beginpgfgraphicnamed| commands also behave normally, which
+means that they will try to include the generated graphic files -- which is
+exactly what you want.
+
+Suppose that you wish to send your survey to a journal that does not have
+\pgfname\ installed. In this case, you now have all the necessary external
+graphics, but you still need \pgfname\ to automatically include them instead of
+the executing the picture code! One way to solve this problem is to simply
+delete all of the \pgfname\ or \tikzname\ code from your |survey.tex| and
+instead insert appropriate |\includegraphics| commands ``by hand''. However,
+there is a better way: You input the file |pgfexternal.tex|.
+
+\begin{filedescription}{pgfexternal.tex}
+ This file defines the command |\beginpgfgraphicnamed| and causes it to have
+ the following effect: It includes the graphic file given as a parameter to
+ it and then gobbles everything up to |\endpgfgraphicnamed|.
+
+ Since |\beginpgfgraphicnamed| does not do macro expansion as it searches
+ for |\endpgfgraphicnamed|, it is not necessary to actually include the
+ packages necessary for \emph{creating} the graphics. So the idea is that
+ you comment out things like |\usepackage{tikz}| and instead say |\input
+ pgfexternal.tex|.
+
+ Indeed, the contents of this file is simply the following line:
+ %
+\begin{codeexample}[code only]
+\long\def\beginpgfgraphicnamed#1#2\endpgfgraphicnamed{\includegraphics{#1}}
+\end{codeexample}
+
+ Instead of |\input pgfexternal.tex| you could also include this line in
+ your main file.
+\end{filedescription}
+
+As a final remark, note that the |baseline| option does not work directly with
+pictures written to an external graphic file. The simple reason is that there
+is no way to store this baseline information in an external graphic file. To
+allow the |baseline| option (or any \TeX\ construction with non-zero depth),
+the baseline information is stored into a separate file. This file is named
+\marg{image file}|.dpth| and contains something like |5pt|.
+
+So, if you need baseline information, you will have to keep the external
+graphic file together with its~|.dpth| file. Furthermore, the short command in
+|\input pgfexternal.tex| is no longer enough because it ignores any baseline
+information. You will need to use |\input pgfexternalwithdepth.tex| instead (it
+is shown below). It is slightly longer, but it can be used in the same way as
+|pgfexternal.tex|.
+
+\begin{key}{/pgf/images/include external (initially \textbackslash pgfimage\{\#1\})}
+\label{pgf:includeexternalkey}
+\index{External Graphics!Bounding Box Issues}
+ This key constitutes the public interface to exchange the
+ |\includegraphics| command used for the image inclusion.
+
+ Redefining this key allows to provide bounding box or viewport options:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/images/include external/.code={\includegraphics[viewport=0 0 211.28 175.686]{#1}}}
+\end{codeexample}
+ %
+ Do not forget the |.code| here which redefines the command.
+
+ One application could be image externalization and bounding box
+ restrictions: As far as I know, a |.pdf| graphics with restricted bounding
+ box is always cropped (which is not always desired). One solution could be
+ to use |latex| and |dvips| which doesn't have this restriction. Another is
+ to manually provide the |viewport| option as shown above.
+
+ A possible value for |viewport| can be found in the |.pdf| image, search
+ for |/MediaBox = [ ... ]|.
+\end{key}
+
+
+\subsection{A Complete Example}
+
+Let us now have a look at a simple, but complete example. We start out with a
+normal file called |survey.tex| that has the following contents:
+%
+\begin{codeexample}[code only]
+% This is the file survey.tex
+\documentclass{article}
+
+\usepackage{graphics}
+\usepackage{tikz}
+
+\begin{document}
+In the following figure, we see a circle:
+\begin{tikzpicture}
+ \fill (0,0) circle (10pt);
+\end{tikzpicture}
+
+By comparison, in this figure we see a rectangle:
+\begin{tikzpicture}
+ \fill (0,0) rectangle (10pt,10pt);
+\end{tikzpicture}
+\end{document}
+\end{codeexample}
+
+Now our editor tells us that the publisher will need all figures to be provided
+in separate PostScript or |.pdf|-files. For this, we enclose all figures in
+|...graphicnamed|-pairs and we add a call to the |\pgfrealjobname| macro:
+%
+\begin{codeexample}[code only]
+% This is the file survey.tex
+\documentclass{article}
+
+\usepackage{graphics}
+\usepackage{tikz}
+\pgfrealjobname{survey}
+
+\begin{document}
+In the following figure, we see a circle:
+\beginpgfgraphicnamed{survey-f1}
+\begin{tikzpicture}
+ \fill (0,0) circle (10pt);
+\end{tikzpicture}
+\endpgfgraphicnamed
+
+By comparison, in this figure we see a rectangle:
+\beginpgfgraphicnamed{survey-f2}
+\begin{tikzpicture}
+ \fill (0,0) rectangle (10pt,10pt);
+\end{tikzpicture}
+\endpgfgraphicnamed
+\end{document}
+\end{codeexample}
+
+After these changes, typesetting the file will still yield the same output as
+it did before -- after all, we have not yet created any external graphics.
+
+To create the external graphics, we run |pdflatex| twice, once for each
+graphic:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+bash> pdflatex --jobname=survey-f1 survey.tex
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6)
+entering extended mode
+(./survey.tex
+LaTeX2e <2005/12/01>
+...
+) [1] (./survey-f1.aux) )
+Output written on survey-f1.pdf (1 page, 1016 bytes).
+Transcript written on survey-f1.log.
+\end{codeexample}
+
+\begin{codeexample}[code only, tikz syntax=false]
+bash> pdflatex --jobname=survey-f2 survey.tex
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6)
+entering extended mode
+(./survey.tex
+LaTeX2e <2005/12/01>
+...
+(./survey-f2.aux) )
+Output written on survey-f2.pdf (1 page, 1002 bytes).
+Transcript written on survey-f2.log.
+\end{codeexample}
+
+We can now send the two generated graphics (|survey-f1.pdf| and
+|survey-f2.pdf|) to the editor. However, the publisher cannot use our
+|survey.tex| file, yet. The reason is that it contains the command
+|\usepackage{tikz}| and they do not have \pgfname\ installed.
+
+Thus, we modify the main file |survey.tex| as follows:
+%
+\begin{codeexample}[code only]
+% This is the file survey.tex
+\documentclass{article}
+
+\usepackage{graphics}
+\input pgfexternal.tex
+% \usepackage{tikz}
+% \pgfrealjobname{survey}
+
+\begin{document}
+In the following figure, we see a circle:
+\beginpgfgraphicnamed{survey-f1}
+\begin{tikzpicture}
+ \fill (0,0) circle (10pt);
+\end{tikzpicture}
+\endpgfgraphicnamed
+
+By comparison, in this figure we see a rectangle:
+\beginpgfgraphicnamed{survey-f2}
+\begin{tikzpicture}
+ \fill (0,0) rectangle (10pt,10pt);
+\end{tikzpicture}
+\endpgfgraphicnamed
+\end{document}
+\end{codeexample}
+%
+If we now run pdf\LaTeX, then, indeed, \pgfname\ is no longer needed:
+% In the following, we switch off typesetting of listings because the
+% parentheses confuse the pretty printer
+%
+\begin{codeexample}[code only,typeset listing/.code=#1]
+bash> pdflatex survey.tex
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6)
+entering extended mode
+(./survey.tex
+LaTeX2e <2005/12/01>
+Babel <v3.8h> and hyphenation patterns for english, ..., loaded.
+(/usr/local/gwTeX/texmf.texlive/tex/latex/base/article.cls
+Document Class: article 2005/09/16 v1.4f Standard LaTeX document class
+(/usr/local/gwTeX/texmf.texlive/tex/latex/base/size10.clo))
+(/usr/local/gwTeX/texmf.texlive/tex/latex/graphics/graphics.sty
+(/usr/local/gwTeX/texmf.texlive/tex/latex/graphics/trig.sty)
+(/usr/local/gwTeX/texmf.texlive/tex/latex/config/graphics.cfg)
+(/usr/local/gwTeX/texmf.texlive/tex/latex/pdftex-def/pdftex.def))
+(/Users/tantau/Library/texmf/tex/generic/pgf/generic/pgf/utilities/pgfexternal.
+tex) (./survey.aux)
+(/usr/local/gwTeX/texmf.texlive/tex/context/base/supp-pdf.tex
+[Loading MPS to PDF converter (version 2006.09.02).]
+) <survey-f1.pdf, id=1, 23.33318pt x 19.99973pt> <use survey-f1.pdf>
+<survey-f2.pdf, id=2, 13.33382pt x 10.00037pt> <use survey-f2.pdf> [1{/Users/ta
+ntau/Library/texmf/fonts/map/pdftex/updmap/pdftex.map} <./survey-f1.pdf> <./sur
+vey-f2.pdf>] (./survey.aux) )</usr/local/gwTeX/texmf.texlive/fonts/type1/bluesk
+y/cm/cmr10.pfb>
+Output written on survey.pdf (1 page, 10006 bytes).
+Transcript written on survey.log.
+\end{codeexample}
+
+To our editor, we send the following files:
+%
+\begin{itemize}
+ \item The last |survey.tex| shown above.
+ \item The graphic file |survey-f1.pdf|.
+ \item The graphic file |survey-f2.pdf|.
+ \item The file |pgfexternal.tex|, whose contents is simply
+ %
+\begin{codeexample}[code only]
+\long\def\beginpgfgraphicnamed#1#2\endpgfgraphicnamed{\includegraphics{#1}}
+\end{codeexample}
+ %
+ (Alternatively, we can also directly add this line to our |survey.tex|
+ file).
+\end{itemize}
+%
+In case we have used the |baseline| option, we also need to include any |.dpth|
+files and we need to use the file |pgfexternalwithdepth.tex| instead of
+|pgfexternal.tex|. This file also checks for the existence of |.dpth| files
+containing baseline information, its contents is
+%
+\begin{codeexample}[code only]
+\long\def\beginpgfgraphicnamed#1#2\endpgfgraphicnamed{%
+ \begingroup
+ \setbox1=\hbox{\includegraphics{#1}}%
+ \openin1=#1.dpth
+ \ifeof1 \box1
+ \else
+ \read1 to\pgfincludeexternalgraphicsdp\closein1
+ \dimen0=\pgfincludeexternalgraphicsdp\relax
+ \hbox{\lower\dimen0 \box1 }%
+ \fi
+ \endgroup
+}
+\end{codeexample}
+%
+Again, we could simply copy these lines to our |survey.tex| file.
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-images.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-images.tex
new file mode 100644
index 0000000000..e8531820ca
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-images.tex
@@ -0,0 +1,272 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Declaring and Using Images}
+\label{section-images}
+
+This section describes the commands for creating images.
+
+
+\subsection{Overview}
+
+To be quite frank, \LaTeX's |\includegraphics| is designed better than
+\pgfname's image mechanism. For this reason, \emph{I recommend that you use the
+standard image inclusion mechanism of your format}. Thus, \LaTeX\ users are
+encouraged to use |\includegraphics| to include images.
+
+However, there are reasons why you might need to use the image inclusion
+facilities of \pgfname:
+%
+\begin{itemize}
+ \item There is no standard image inclusion mechanism in your format. For
+ example, plain \TeX\ does not have one, so \pgfname's inclusion
+ mechanism is ``better than nothing''.
+
+ However, this applies only to the |pdftex| backend. For all other
+ backends, \pgfname\ currently maps its commands back to the |graphicx|
+ package. Thus, in plain \TeX, this does not really help. It might be a
+ good idea to fix this in the future such that \pgfname\ becomes
+ independent of \LaTeX, thereby providing a uniform image abstraction
+ for all formats.
+ \item You wish to use masking. This is a feature that is only supported by
+ \pgfname, though I hope that someone will implement this also for the
+ graphics package in \LaTeX\ in the future.
+\end{itemize}
+
+Whatever your choice, you can still use the usual image inclusion facilities of
+the |graphics| package.
+
+The general approach taken by \pgfname\ to including an image is the following:
+First, |\pgfdeclareimage| declares the image. This must be done prior to the
+first use of the image. Once you have declared an image, you can insert it into
+the text using |\pgfuseimage|. The advantage of this two-phase approach is
+that, at least for \textsc{pdf}, the image data will only be included once in
+the file. This can drastically reduce the file size if you use an image
+repeatedly, for example in an overlay. However, there is also a command called
+|\pgfimage| that declares and then immediately uses the image.
+
+To speedup the compilation, you may wish to use the following class option:
+%
+\begin{packageoption}{draft}
+ In draft mode boxes showing the image name replace the images. It is
+ checked whether the image files exist, but they are not read. If either
+ height or width is not given, 1cm is used instead.
+\end{packageoption}
+
+
+\subsection{Declaring an Image}
+
+\begin{command}{\pgfdeclareimage\oarg{options}\marg{image name}\marg{filename}}
+ Declares an image, but does not paint anything. To draw the image, use
+ |\pgfuseimage{|\meta{image name}|}|. The \meta{filename} may not have an
+ extension. For \textsc{pdf}, the extensions |.pdf|, |.jpg|, and |.png|
+ will automatically tried. For PostScript, the extensions |.eps|, |.epsi|,
+ and |.ps| will be tried.
+
+ The following options are possible:
+ %
+ \begin{itemize}
+ \item \declare{|height=|\meta{dimension}} sets the height of the image.
+ If the width is not specified simultaneously, the aspect ratio of
+ the image is kept.
+ \item \declare{|width=|\meta{dimension}} sets the width of the image.
+ If the height is not specified simultaneously, the aspect ratio of
+ the image is kept.
+ \item \declare{|page=|\meta{page number}} selects a given page number
+ from a multipage document. Specifying this option will have the
+ following effect: first, \pgfname\ tries to find a file named
+ %
+ \begin{quote}
+ \meta{filename}|.page|\meta{page number}|.|\meta{extension}
+ \end{quote}
+ %
+ If such a file is found, it will be used instead of the originally
+ specified filename. If not, \pgfname\ inserts the image stored in
+ \meta{filename}|.|\meta{extension} and if a recent version of
+ |pdflatex| is used, only the selected page is inserted. For older
+ versions of |pdflatex| and for |dvips| the complete document is
+ inserted and a warning is printed.
+ \item \declare{|interpolate=|\meta{true or false}} selects whether the
+ image should be ``smoothed'' when zoomed. False by default.
+ \item \declare{|mask=|\meta{mask name}} selects a transparency mask.
+ The mask must previously be declared using |\pgfdeclaremask| (see
+ below). This option only has an effect for |pdf|. Not all viewers
+ support masking.
+ \end{itemize}
+ %
+\begin{codeexample}[code only]
+\pgfdeclareimage[interpolate=true,height=1cm]{image1}{brave-gnu-world-logo}
+\pgfdeclareimage[interpolate=true,width=1cm,height=1cm]{image2}{brave-gnu-world-logo}
+\pgfdeclareimage[interpolate=true,height=1cm]{image3}{brave-gnu-world-logo}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfaliasimage\marg{new image name}\marg{existing image name}}
+ The \marg{existing image name} is ``cloned'' and the \marg{new image name}
+ can now be used whenever the original image is used. This command is useful
+ for creating aliases for alternate extensions and for accessing the last
+ image inserted using |\pgfimage|.
+
+ \example |\pgfaliasimage{image.!30!white}{image.!25!white}|
+\end{command}
+
+
+\subsection{Using an Image}
+
+\begin{command}{\pgfuseimage\marg{image name}}
+ Inserts a previously declared image into the \emph{normal text}. If you
+ wish to use it in a |{pgfpicture}| environment, you must put a |\pgftext|
+ around it.
+
+ If the macro |\pgfalternateextension| expands to some nonempty
+ \meta{alternate extension}, \pgfname\ will first try to use the image named
+ \meta{image name}|.|\meta{alternate extension}. If this image is not
+ defined, \pgfname\ will next check whether \meta{alternate extension}
+ contains a |!| character. If so, everything up to this exclamation mark and
+ including it is deleted from \meta{alternate extension} and the \pgfname\
+ again tries to use the image \meta{image name}|.|\meta{alternate
+ extension}. This is repeated until \meta{alternate extension} no longer
+ contains a~|!|. Then the original image is used.
+
+ The |xxcolor| package sets the alternate extension to the current color
+ mixin.
+ %
+\begin{codeexample}[]
+\pgfdeclareimage[interpolate=true,width=1cm,height=1cm]
+ {image1}{brave-gnu-world-logo}
+\pgfdeclareimage[interpolate=true,width=1cm]{image2}{brave-gnu-world-logo}
+\pgfdeclareimage[interpolate=true,height=1cm]{image3}{brave-gnu-world-logo}
+\begin{pgfpicture}
+ \pgftext[at=\pgfpoint{1cm}{5cm},left,base]{\pgfuseimage{image1}}
+ \pgftext[at=\pgfpoint{1cm}{3cm},left,base]{\pgfuseimage{image2}}
+ \pgftext[at=\pgfpoint{1cm}{1cm},left,base]{\pgfuseimage{image3}}
+
+ \pgfpathrectangle{\pgfpoint{1cm}{5cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1cm}{3cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ The following example demonstrates the effect of using |\pgfuseimage|
+ inside a colormixin environment.
+ %
+\begin{codeexample}[]
+\pgfdeclareimage[interpolate=true,width=1cm,height=1cm]
+ {image1.!25!white}{brave-gnu-world-logo.25}
+\pgfdeclareimage[interpolate=true,width=1cm]
+ {image2.25!white}{brave-gnu-world-logo.25}
+\pgfdeclareimage[interpolate=true,height=1cm]
+ {image3.white}{brave-gnu-world-logo.25}
+\begin{colormixin}{25!white}
+\begin{pgfpicture}
+ \pgftext[at=\pgfpoint{1cm}{5cm},left,base]{\pgfuseimage{image1}}
+ \pgftext[at=\pgfpoint{1cm}{3cm},left,base]{\pgfuseimage{image2}}
+ \pgftext[at=\pgfpoint{1cm}{1cm},left,base]{\pgfuseimage{image3}}
+
+ \pgfpathrectangle{\pgfpoint{1cm}{5cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1cm}{3cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{colormixin}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfalternateextension}
+ You should redefine this command to install a different alternate
+ extension.
+
+ \example |\def\pgfalternateextension{!25!white}|
+\end{command}
+
+\begin{command}{\pgfimage\oarg{options}\marg{filename}}
+ Declares the image under the name |pgflastimage| and immediately uses it.
+ You can ``save'' the image for later usage by invoking |\pgfaliasimage| on
+ |pgflastimage|.
+ %
+\begin{codeexample}[]
+\begin{colormixin}{25!white}
+\begin{pgfpicture}
+ \pgftext[at=\pgfpoint{1cm}{5cm},left,base]
+ {\pgfimage[interpolate=true,width=1cm,height=1cm]{brave-gnu-world-logo}}
+ \pgftext[at=\pgfpoint{1cm}{3cm},left,base]
+ {\pgfimage[interpolate=true,width=1cm]{brave-gnu-world-logo}}
+ \pgftext[at=\pgfpoint{1cm}{1cm},left,base]
+ {\pgfimage[interpolate=true,height=1cm]{brave-gnu-world-logo}}
+
+ \pgfpathrectangle{\pgfpoint{1cm}{5cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1cm}{3cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{1cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{colormixin}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Masking an Image}
+
+\begin{command}{\pgfdeclaremask\oarg{options}\marg{mask name}\marg{filename}}
+ Declares a transparency mask named \meta{mask name} (called a \emph{soft
+ mask} in the \textsc{pdf} specification). This mask is read from the file
+ \meta{filename}. This file should contain a grayscale image that is as
+ large as the actual image. A white pixel in the mask will correspond to
+ ``transparent'', a black pixel to ``solid'', and gray values correspond to
+ intermediate values. The mask must have a single ``color channel''. This
+ means that the mask must be a ``real'' grayscale image, not an
+ \textsc{rgb}-image in which all \textsc{rgb}-triples happen to have the
+ same components.
+
+ You can only mask images the are in a ``pixel format''. These are |.jpg|
+ and |.png|. You cannot mask |.pdf| images in this way. Also, again, the
+ mask file and the image file must have the same size.
+
+ The following options may be given:
+ %
+ \begin{itemize}
+ \item |matte=|\marg{color components} sets the so-called \emph{matte}
+ of the actual image (strangely, this has to be specified together
+ with the mask, not with the image itself). The matte is the color
+ that has been used to preblend the image. For example, if the image
+ has been preblended with a red background, then \meta{color
+ components} should be set to |{1 0 0}|. The default is |{1 1 1}|,
+ which is white in the rgb model.
+
+ The matte is specified in terms of the parent's image color space.
+ Thus, if the parent is a grayscale image, the matte has to be set
+ to |{1}|.
+ \end{itemize}
+ %
+ \example
+ %
+\begin{codeexample}[]
+%% Draw a large colorful background
+\pgfdeclarehorizontalshading{colorful}{5cm}{color(0cm)=(red);
+color(2cm)=(green); color(4cm)=(blue); color(6cm)=(red);
+color(8cm)=(green); color(10cm)=(blue); color(12cm)=(red);
+color(14cm)=(green)}
+\hbox{\pgfuseshading{colorful}\hskip-14cm\hskip1cm
+\pgfimage[height=4cm]{brave-gnu-world-logo}\hskip1cm
+\pgfimage[height=4cm]{brave-gnu-world-logo-mask}\hskip1cm
+\pgfdeclaremask{mymask}{brave-gnu-world-logo-mask}
+\pgfimage[mask=mymask,height=4cm,interpolate=true]{brave-gnu-world-logo}}
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-internalregisters.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-internalregisters.tex
new file mode 100644
index 0000000000..64c9da58f1
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-internalregisters.tex
@@ -0,0 +1,127 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Adding libraries to \pgfname: temporary registers}
+\label{section-internal-registers}
+
+This section is intended for those who like to write libraries to extend
+\pgfname. Of course, this requires a good deal of knowledge about
+\TeX-programming and the structure of the \pgfname\ basic layer. Besides, one
+will encounter the need of temporary variables and, especially, temporary \TeX\
+registers. This section describes how to use a set of pre-allocated temporary
+registers of the basic layer without needing to allocate more of them.
+
+A part of these internals are already mentioned in
+section~\ref{section-internal-pointcmds}, but the basic layer provides more
+temporaries than |\pgf@x| and |\pgf@y|.
+
+\begin{internallist}[dimen register]{\pgf@x,\pgf@y}
+ These registers are used to process point coordinates in the basic layer of
+ \pgfname, see section~\ref{section-internal-pointcmds}. After a
+ |\pgfpoint|$\dotsc$ command, they contain the final $x$ and $y$ coordinate,
+ respectively.
+
+ The values of |\pgf@x| and |\pgf@y| are set \emph{globally} in contrast to
+ other available \pgfname\ registers. You should never assume anything about
+ their value unless the context defines them explicitly.
+
+ Please prefer the |\pgf@xa|, |\pgf@xb|, $\dotsc$ registers for temporary
+ dimen registers unless you are writing point coordinate commands.
+\end{internallist}
+
+\begin{internallist}[dimen register]{
+ \pgf@xa,
+ \pgf@xb,
+ \pgf@xc,
+ \pgf@ya,
+ \pgf@yb,
+ \pgf@yc%
+}
+ Temporary registers for \TeX\ dimensions which can be modified freely. Just
+ make sure changes occur only within \TeX\ groups.
+
+ \paragraph{Attention:}
+ %
+ \pgfname\ uses these registers to perform path operations. For reasons of
+ efficiency, path commands do not always guard them. As a consequence, the
+ code
+ %
+\begin{codeexample}[code only]
+\pgfpointadd{\pgfpoint{\pgf@xa}{\pgf@ya}}{\pgfpoint{\pgf@xb}{\pgf@yb}}
+\end{codeexample}
+ %
+ \noindent may fail: Inside |\pgfpointadd|, the |\pgf@xa| and friend
+ registers might be modified. In particular, it might happen that |\pgf@xb|
+ is changed before |\pgfpoint{\pgf@xb}{\pgf@yb}| is evaluated. The right
+ thing to do would be to first expand everything using |\edef| and process
+ the values afterwards, resulting in unnecessary expensive operations. Of
+ course, one can avoid this by simply looking into the source code of
+ |\pgfpointadd| to see which registers are used.
+\end{internallist}
+
+\begin{internallist}[dimen register]{\pgfutil@tempdima,\pgfutil@tempdimb}
+ Further multi-purpose temporary dimen registers. For \LaTeX, these
+ registers are already allocated as |\@tempdima| and |\@tempdimb| and are
+ simply |\let| to the |\pgfutil@|$\dotsc$ names.
+\end{internallist}
+
+\begin{internallist}[count register]{
+ \c@pgf@counta,
+ \c@pgf@countb,
+ \c@pgf@countc,
+ \c@pgf@countd%
+}
+ These multiple-purpose count registers are used throughout \pgfname\ to
+ perform integer computations. Feel free to use them as well, just make sure
+ changes are scoped by local \TeX\ groups.
+\end{internallist}
+
+\begin{internallist}[openout handle]{\w@pgf@writea}
+ An |\openout| handle which is used to generate complete output files within
+ locally scoped parts of \pgfname\ (for example, to interact with
+ |gnuplot|). You should always use |\immediate| in front of output
+ operations involving |\w@pgf@writea| and you should always close the file
+ before returning from your code.
+ %
+\begin{codeexample}[code only]
+\immediate\openout\w@pgf@writea=myfile.dat
+\immediate\write\w@pgf@writea{...}%
+\immediate\write\w@pgf@writea{...}%
+\immediate\closeout\w@pgf@writea%
+\end{codeexample}
+ %
+\end{internallist}
+
+\begin{internallist}[openin handle]{\r@pgf@reada}
+ An |\openin| handle which is used to read files within locally scoped parts
+ of \pgfname, for example to check if a file exists or to read data files.
+ You should always use |\immediate| in front of output operations involving
+ |\r@pgf@writea| and you should always close the file before returning from
+ your code.
+ %
+\begin{codeexample}[code only]
+\immediate\openin\r@pgf@reada=myfile.dat
+% do something with \macro
+\ifeof\r@pgf@reada
+ % end of file or it doesn't exist
+\else
+ % loop or whatever
+ \immediate\read\r@pgf@reada to\macro
+ ...
+\fi
+\immediate\closein\r@pgf@reada
+\end{codeexample}
+ %
+\end{internallist}
+
+\begin{internallist}[box]{\pgfutil@tempboxa}
+ A box for temporary use inside of local \TeX\ scopes. For \LaTeX, this box
+ is the same as the already pre-allocated |\@tempboxa|.
+\end{internallist}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-layers.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-layers.tex
new file mode 100644
index 0000000000..65ec0f8896
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-layers.tex
@@ -0,0 +1,136 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Layered Graphics}
+\label{section-layers}
+
+\subsection{Overview}
+
+\pgfname\ provides a layering mechanism for composing graphics from multiple
+layers. (This mechanism is not to be confused with the conceptual ``software
+layers'' the \pgfname\ system is composed of.) Layers are often used in graphic
+programs. The idea is that you can draw on the different layers in any order.
+So you might start drawing something on the ``background'' layer, then
+something on the ``foreground'' layer, then something on the ``middle'' layer,
+and then something on the background layer once more, and so on. At the end, no
+matter in which ordering you drew on the different layers, the layers are
+``stacked on top of each other'' in a fixed ordering to produce the final
+picture. Thus, anything drawn on the middle layer would come on top of
+everything of the background layer.
+
+Normally, you do not need to use different layers since you will have little
+trouble ``ordering'' your graphic commands in such a way that layers are
+superfluous. However, in certain situations you only ``know'' what you should
+draw behind something else after the ``something else'' has been drawn.
+
+For example, suppose you wish to draw a yellow background behind your picture.
+The background should be as large as the bounding box of the picture, plus a
+little border. If you know the size of the bounding box of the picture at its
+beginning, this is easy to accomplish. However, in general this is not the case
+and you need to create a ``background'' layer in addition to the standard
+``main'' layer. Then, at the end of the picture, when the bounding box has been
+established, you can add a rectangle of the appropriate size to the picture.
+
+
+\subsection{Declaring Layers}
+
+In \pgfname\ layers are referenced using names. The standard layer, which is a
+bit special in certain ways, is called |main|. If nothing else is specified,
+all graphic commands are added to the |main| layer. You can declare a new layer
+using the following command:
+
+\begin{command}{\pgfdeclarelayer\marg{name}}
+ This command declares a layer named \meta{name} for later use. Mainly, this
+ will set up some internal bookkeeping.
+\end{command}
+
+The next step toward using a layer is to tell \pgfname\ which layers will be
+part of the actual picture and which will be their ordering. Thus, it is
+possible to have more layers declared than are actually used.
+
+\begin{command}{\pgfsetlayers\marg{layer list}}
+ This command tells \pgfname\ which layers will be used in pictures. They
+ are stacked on top of each other in the order given. The layer |main|
+ should always be part of the list. Here is an example:
+ %
+\begin{codeexample}[code only]
+\pgfdeclarelayer{background}
+\pgfdeclarelayer{foreground}
+\pgfsetlayers{background,main,foreground}
+\end{codeexample}
+
+ This command should be given either outside of any picture or ``directly
+ inside'' of a picture. Here, the ``directly inside'' means that there
+ should be no further level of \TeX\ grouping between |\pgfsetlayers| and
+ the matching |\end{pgfpicture}| (no closing braces, no |\end{...}|). It
+ will also work if |\pgfsetlayers| is provided before |\end{tikzpicture}|
+ (with similar restrictions).
+\end{command}
+
+
+\subsection{Using Layers}
+
+Once the layers of your picture have been declared, you can start to ``fill''
+them. As said before, all graphics commands are normally added to the |main|
+layer. Using the |{pgfonlayer}| environment, you can tell \pgfname\ that
+certain commands should, instead, be added to the given layer.
+
+\begin{environment}{{pgfonlayer}\marg{layer name}}
+ The whole \meta{environment contents} is added to the layer with the name
+ \meta{layer name}. This environment can be used anywhere inside a picture.
+ Thus, even if it is used inside a |{pgfscope}| or a \TeX\ group, the
+ contents will still be added to the ``whole'' picture. Using this
+ environment multiple times inside the same picture will cause the
+ \meta{environment contents} to accumulate.
+
+ \emph{Note:} You can \emph{not} add anything to the |main| layer using this
+ environment. The only way to add anything to the main layer is to give
+ graphic commands outside all |{pgfonlayer}| environments.
+ %
+\begin{codeexample}[]
+\pgfdeclarelayer{background layer}
+\pgfdeclarelayer{foreground layer}
+\pgfsetlayers{background layer,main,foreground layer}
+\begin{tikzpicture}
+ % On main layer:
+ \fill[blue] (0,0) circle (1cm);
+
+ \begin{pgfonlayer}{background layer}
+ \fill[yellow] (-1,-1) rectangle (1,1);
+ \end{pgfonlayer}
+
+ \begin{pgfonlayer}{foreground layer}
+ \node[white] {foreground};
+ \end{pgfonlayer}
+
+ \begin{pgfonlayer}{background layer}
+ \fill[black] (-.8,-.8) rectangle (.8,.8);
+ \end{pgfonlayer}
+
+ % On main layer again:
+ \fill[blue!50] (-.5,-1) rectangle (.5,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{environment}
+
+\begin{plainenvironment}{{pgfonlayer}\marg{layer name}}
+ This is the plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfonlayer}\marg{layer name}}
+ This is the Con\TeX t version of the environment.
+\end{contextenvironment}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-matrices.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-matrices.tex
new file mode 100644
index 0000000000..edba1275d1
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-matrices.tex
@@ -0,0 +1,437 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Matrices}
+\label{section-base-matrices}
+
+\begin{pgfmodule}{matrix}
+The present section documents the commands of this module.
+\end{pgfmodule}
+
+\subsection{Overview}
+
+Matrices are a mechanism for aligning several so-called cell pictures
+horizontally and vertically. The resulting alignment is placed in a normal node
+and the command for creating matrices, |\pgfmatrix|, takes options very similar
+to the |\pgfnode| command.
+
+In the following, the basic idea behind the alignment mechanism is explained
+first. Then the command |\pgfmatrix| is explained. At the end of the section,
+additional ways of modifying the width of columns and rows are discussed.
+
+
+\subsection{Cell Pictures and Their Alignment}
+
+A matrix consists of rows of \emph{cells}. Cells are separated using the
+special command |\pgfmatrixnextcell|, rows are ended using the command
+|\pgfmatrixendrow| (the command |\\| is set up to mean the same as
+|\pgfmatrixendrow| by default). Each cell contains a \emph{cell picture},
+although cell pictures are not complete pictures as they lack layers. However,
+each cell picture has its own bounding box like a normal picture does. These
+bounding boxes are important for the alignment as explained in the following.
+
+Each cell picture will have an origin somewhere in the picture (or even outside
+the picture). The position of these origins are important for the alignment: On
+each row the origins will be on the same horizontal line and for each column
+the origins will also be on the same vertical line. These two requirements mean
+that the cell pictures may need to be shifted around so that the origins wind
+up on the same lines. The top of a row is given by the top of the cell picture
+whose bounding box's maximum $y$-position is largest. Similarly, the bottom of
+a row is given by the bottom of the cell picture whose bounding box's minimum
+$y$-position is the most negative. Similarly, the left end of a column is given
+by the left end of the cell whose bounding box's $x$-position is the most
+negative; and similarly for the right end of a column.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[x=3mm,y=3mm,fill=blue!50]
+ \def\atorig#1{\node[black] at (0,0) {\tiny #1};}
+
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{}
+ {
+ \fill (0,-3) rectangle (1,1);\atorig1 \pgfmatrixnextcell
+ \fill (-1,0) rectangle (1,1);\atorig2 \pgfmatrixnextcell
+ \fill (-1,-2) rectangle (0,0);\atorig3 \pgfmatrixnextcell
+ \fill (-1,-1) rectangle (0,3);\atorig4 \\
+ \fill (-1,0) rectangle (4,1);\atorig5 \pgfmatrixnextcell
+ \fill (0,-1) rectangle (1,1);\atorig6 \pgfmatrixnextcell
+ \fill (0,0) rectangle (1,4);\atorig7 \pgfmatrixnextcell
+ \fill (-1,-1) rectangle (0,0);\atorig8 \\
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{The Matrix Command}
+
+All matrices are typeset using the following command:
+
+\begin{command}{\pgfmatrix\marg{shape}\marg{anchor}\marg{name}\marg{usage}\marg{shift}\marg{pre-code}\marg{matrix cells}}
+ This command creates a node that contains a matrix. The name of the node is
+ \meta{name}, its shape is \meta{shape} and the node is anchored at
+ \meta{anchor}.
+
+ The \meta{matrix cell} parameter contains the cells of the matrix. In each
+ cell drawing commands may be given, which create a so-called cell picture.
+ For each cell picture a bounding box is computed and the cells are aligned
+ according to the rules outlined in the previous section.
+
+ The resulting matrix is used as the |text| box of the node. As for a normal
+ node, the \meta{usage} commands are applied, so that the path(s) of the
+ resulting node is (are) stroked or filled or whatever.
+
+
+ \medskip
+ \textbf{Specifying the cells and rows.\ }
+ Even though this command uses |\halign| internally, there are two special
+ rules for indicating cells:
+ %
+ \begin{enumerate}
+ \item Cells in the same row must be separated using the macro
+ |\pgfmatrixnextcell| rather than |&|. Using |&| will result in an
+ error message.
+
+ However, you can make |&| an active character and have it expand to
+ |\pgfmatrixnextcell|. This way, it will ``look'' as if |&| is used.
+ \item Rows are ended using the command |\pgfmatrixendrow|, but |\\| is
+ set up to mean the same by default. However, some environments like
+ |{minipage}| redefine |\\|, so it is good to have
+ |\pgfmatrixendrow| as a ``fallback''.
+ \item Every row \emph{including the last row} must be ended using the
+ command |\\| or |\pgfmatrixendrow|.
+ \end{enumerate}
+
+ Both |\pgfmatrixnextcell| and |\pgfmatrixendrow| (and, thus, also |\\|)
+ take an optional argument as explained in the
+ Section~\ref{section-matrix-spacing}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{}
+ {
+ \node {a}; \pgfmatrixnextcell \node {b}; \pgfmatrixendrow
+ \node {c}; \pgfmatrixnextcell \node {d}; \pgfmatrixendrow
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Anchoring matrices at nodes inside the matrix.\ }
+ The parameter \meta{shift} is an additional negative shift for the node.
+ Normally, such a shift could be given beforehand (that is, the shift could
+ be preapplied to the current transformation matrix). However, when
+ \meta{shift} is evaluated, you can refer to \emph{temporary} positions of
+ nodes inside the matrix. In detail, the following happens: When the matrix
+ has been typeset, all nodes in the matrix temporarily get assigned their
+ positions in the matrix box. The origin of this coordinate system is at the
+ left baseline end of the matrix box, which corresponds to the |text|
+ anchor. The position \meta{shift} is then interpreted inside this
+ coordinate system and then used for shifting.
+
+ This allows you to use the parameter \meta{shift} in the following way: If
+ you use |text| as the \meta{anchor} and specify
+ |\pgfpointanchor{inner node}{some anchor}| for the parameter \meta{shift},
+ where |inner node| is a node that is created in the matrix, then the whole
+ matrix will be shifted such that |inner node.some anchor| lies at the
+ origin of the whole picture.
+
+
+ \medskip
+ \textbf{Rotations and scaling.\ }
+ The matrix node is never rotated or scaled, because the current coordinate
+ transformation matrix is reset (except for the translational part) at the
+ beginning of |\pgfmatrix|. This is intentional and will not change in the
+ future. If you need to rotate or scale the matrix, you must install an
+ appropriate canvas transformation yourself.
+
+ However, nodes and stuff inside the cell pictures can be rotated and scaled
+ normally.
+
+
+ \medskip
+ \textbf{Callbacks.\ }
+ At the beginning and at the end of each cell the special macros
+ |\pgfmatrixbegincode|, |\pgfmatrixendcode| and possibly
+ |\pgfmatrixemptycode| are called. The effect is explained in
+ Section~\ref{section-matrix-callbacks}.
+
+
+ \medskip
+ \textbf{Executing extra code.\ }
+ The parameter \meta{pre-code} is executed at the beginning of the outermost
+ \TeX-group enclosing the matrix node. It is inside this \TeX-group, but
+ outside the matrix itself. It can be used for different purposes:
+ %
+ \begin{enumerate}
+ \item It can be used to simplify the next cell macro. For example,
+ saying |\let\&=\pgfmatrixnextcell| allows you to use |\&| instead
+ of |\pgfmatrixnextcell|. You can also set the catcode of |&| to
+ active.
+ \item It can be used to issue an |\aftergroup| command. This allows you
+ to regain control after the |\pgfmatrix| command. (If you do not
+ know the |\aftergroup| command, you are probably blessed with a
+ simple and happy life.)
+ \end{enumerate}
+
+
+ \medskip
+ \textbf{Special considerations concerning macro expansion.\ }
+ As said before, the matrix is typeset using |\halign| internally. This
+ command does a lot of strange and magic things like expanding the first
+ macro of every cell in a most unusual manner. Here are some effects you may
+ wish to be aware of:
+ %
+ \begin{itemize}
+ \item It is not necessary to actually mention |\pgfmatrixnextcell| or
+ |\pgfmatrixendrow| inside the \meta{matrix cells}. It suffices that
+ the macros inside \meta{matrix cells} expand to these macros
+ sooner or later.
+ \item In particular, you can define clever macros that insert columns
+ and rows as needed for special effects.
+ \end{itemize}
+\end{command}
+
+
+\subsection{Row and Column Spacing}
+\label{section-matrix-spacing}
+
+It is possible to control the space between columns and rows rather detailedly.
+Two commands are important for the row spacing and two commands for the column
+spacing.
+
+\begin{command}{\pgfsetmatrixcolumnsep\marg{sep list}}
+ This macro sets the default separation list for columns. The details of the
+ format of this list are explained in the description of the next command.
+\end{command}
+
+\begin{command}{\pgfmatrixnextcell\opt{\oarg{additional sep list}}}
+ This command has two purposes: First, it is used to separate cells. Second,
+ by providing the optional argument \meta{additional sep list} you can
+ modify the spacing between the columns that are separated by this command.
+
+ The optional \meta{additional sep list} may only be provided when the
+ |\pgfmatrixnextcell| command starts a new column. Normally, this will only
+ be the case in the first row, but sometimes a later row has more elements
+ than the first row. In this case, the |\pgfmatrixnextcell| commands that
+ start the new columns in the later row may also have the optional argument.
+ Once a column has been started, subsequent uses of this optional argument
+ for the column have no effect.
+
+ To determine the space between the two columns that are separated by
+ |\pgfmatrixnextcell|, the following algorithm is executed:
+ %
+ \begin{enumerate}
+ \item Both the default separation list (as set up by
+ |\pgfsetmatrixcolumnsep|) and the \meta{additional sep list} are
+ processed, in this order. If the \meta{additional sep list}
+ argument is missing, only the default separation list is processed.
+ \item Both lists may contain dimensions, separated by commas, as well
+ as occurrences of the keywords |between origins| and |between
+ borders|.
+ \item All dimensions occurring in either list are added together to
+ arrive at a dimension $d$.
+ \item The last occurrence of either of the keywords is located. If
+ neither keyword is present, we proceed as if |between borders| were
+ present.
+ \end{enumerate}
+ %
+ At the end of the algorithm, a dimension $d$ has been computed and one of
+ the two \emph{modes} |between borders| and |between origins| has been
+ determined. Depending on which mode has been determined, the following
+ happens:
+ %
+ \begin{itemize}
+ \item For the |between borders| mode, an additional horizontal space of
+ $d$ is added between the two columns. Note that $d$ may be
+ negative.
+ \item For the |between origins| mode, the spacing between the two
+ columns is computed differently: Recall that the origins of the
+ cell pictures in both pictures lie on two vertical lines. The
+ spacing between the two columns is set up such that the horizontal
+ distance between these two lines is exactly $d$.
+
+ This mode may only be used between columns \emph{already introduced
+ in the first row}.
+ \end{itemize}
+ %
+ All of the above rules boil down to the following effects:
+ %
+ \begin{itemize}
+ \item A default spacing between columns should be set up using
+ |\pgfsetmatrixcolumnsep|. For example, you might say
+ |\pgfsetmatrixcolumnsep{5pt}| to have columns spaced apart by
+ |5pt|. You could say
+ %
+\begin{verbatim}
+\pgfsetmatrixcolumnsep{1cm,between origins}
+\end{verbatim}
+ %
+ to specify that horizontal space between the origins of cell
+ pictures in adjacent columns should be 1cm by default -- regardless
+ of the actual size of the cell pictures.
+ \item You can now use the optional argument of |\pgfmatrixnextcell| to
+ locally overrule the spacing between two columns. By saying
+ |\pgfmatrixnextcell[5pt]| you \emph{add} 5pt to the space between
+ of the two columns, regardless of the mode.
+
+ You can also (locally) change the spacing mode for these two
+ columns. For example, even if the normal spacing mode is
+ |between origins|, you can say
+ %
+\begin{verbatim}
+\pgfmatrixnextcell[5pt,between borders]
+\end{verbatim}
+ %
+ to locally change the mode for these columns to |between borders|.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \pgfsetmatrixcolumnsep{1mm}
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{\let\&=\pgfmatrixnextcell}
+ {
+ \node {8}; \&[2mm] \node{1}; \&[-1mm] \node {6}; \\
+ \node {3}; \& \node{5}; \& \node {7}; \\
+ \node {4}; \& \node{9}; \& \node {2}; \\
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \pgfsetmatrixcolumnsep{1mm}
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{\let\&=\pgfmatrixnextcell}
+ {
+ \node {8}; \&[2mm] \node(a){1}; \&[1cm,between origins] \node(b){6}; \\
+ \node {3}; \& \node {5}; \& \node {7}; \\
+ \node {4}; \& \node {9}; \& \node {2}; \\
+ }
+ \draw [<->,red,thick,every node/.style=] (a.center) -- (b.center)
+ node [above,midway] {11mm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \pgfsetmatrixcolumnsep{1cm,between origins}
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{\let\&=\pgfmatrixnextcell}
+ {
+ \node (a) {8}; \& \node (b) {1}; \&[between borders] \node (c) {6}; \\
+ \node {3}; \& \node {5}; \& \node {7}; \\
+ \node {4}; \& \node {9}; \& \node {2}; \\
+ }
+ \begin{scope}[every node/.style=]
+ \draw [<->,red,thick] (a.center) -- (b.center) node [above,midway] {10mm};
+ \draw [<->,red,thick] (b.east) -- (c.west) node [above,midway]
+ {10mm};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+The mechanism for the between-row-spacing is the same, only the commands are
+called differently.
+
+\begin{command}{\pgfsetmatrixrowsep\marg{sep list}}
+ This macro sets the default separation list for rows.
+\end{command}
+
+\begin{command}{\pgfmatrixendrow\opt{\oarg{additional sep list}}}
+ This command ends a line. The optional \meta{additional sep list} is used
+ to determine the spacing between the row being ended and the next row. The
+ modes and the computation of $d$ is done in the same way as for columns.
+ For the last row the optional argument has no effect.
+
+ Inside matrices (and only there) the command |\\| is set up to mean the
+ same as this command.
+\end{command}
+
+
+\subsection{Callbacks}
+\label{section-matrix-callbacks}
+
+There are three macros that get called at the beginning and end of cells. By
+redefining these macros, which are empty by default, you can change the
+appearance of cells in a very general manner.
+
+\begin{command}{\pgfmatrixemptycode}
+ This macro is executed for empty cells. This means that \pgfname\ uses some
+ macro magic to determine whether a cell is empty (it immediately ends with
+ |\pgfmatrixemptycode| or |\pgfmatrixendrow|) and, if so, put this macro
+ inside the cell.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \def\pgfmatrixemptycode{\node{empty};}
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{\let\&=\pgfmatrixnextcell}
+ {
+ \node {a}; \& \& \node {b}; \\
+ \& \node{c}; \& \node {d}; \& \\
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+ As can be seen, the macro is not executed for empty cells at the end of row
+ when columns are added only later on.
+\end{command}
+
+\begin{command}{\pgfmatrixbegincode}
+ This macro is executed at the beginning of non-empty cells.
+ Correspondingly, |\pgfmatrixendcode| is added at the end of every non-empty
+ cell.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \def\pgfmatrixbegincode{\node[draw]\bgroup}
+ \def\pgfmatrixendcode{\egroup;}
+ \pgfmatrix{rectangle}{center}{mymatrix}
+ {\pgfusepath{}}{\pgfpointorigin}{\let\&=\pgfmatrixnextcell}
+ {
+ a \& b \& c \\
+ d \& \& e \\
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Note that between |\pgfmatrixbegincode| and |\pgfmatrixendcode| there will
+ \emph{not} only be the contents of the cell. Rather, \pgfname\ will add
+ some (invisible) commands for book-keeping purposes that involve |\let| and
+ |\gdef|. In particular, it is not a good idea to have |\pgfmatrixbegincode|
+ end with |\csname| and |\pgfmatrixendcode| start with |\endcsname|.
+\end{command}
+
+\begin{command}{\pgfmatrixendcode}
+ See the explanation above.
+\end{command}
+
+The following two counters allow you to access the current row and current
+column in a callback:
+
+\begin{command}{\pgfmatrixcurrentrow}
+ This counter stores the current row of the current cell of the matrix. Do
+ not even think about changing this counter.
+\end{command}
+
+\begin{command}{\pgfmatrixcurrentcolumn}
+ This counter stores the current column of the current cell of the matrix.
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-nodes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-nodes.tex
new file mode 100644
index 0000000000..4e0ba4f536
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-nodes.tex
@@ -0,0 +1,1289 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Nodes and Shapes}
+
+\label{section-shapes}
+
+This section describes the |shapes| module.
+
+\begin{pgfmodule}{shapes}
+ This module defines commands both for creating nodes and for creating
+ shapes. The package is loaded automatically by |pgf|, but you can load it
+ manually if you have only included |pgfcore|.
+\end{pgfmodule}
+
+
+\subsection{Overview}
+
+\pgfname\ comes with a sophisticated set of commands for creating \emph{nodes}
+and \emph{shapes}. A \emph{node} is a graphical object that consists
+(typically) of (one or more) text labels and some additional stroked or filled
+paths. Each node has a certain \emph{shape}, which may be something simple like
+a |rectangle| or a |circle|, but it may also be something complicated like a
+|uml class diagram| (this shape is currently not implemented, though).
+Different nodes that have the same shape may look quite different, however,
+since shapes (need not) specify whether the shape path is stroked or filled.
+
+
+\subsubsection{Creating and Referencing Nodes}
+
+You create a node by calling the macro |\pgfnode| or the more general
+|\pgfmultipartnode|. This macro takes several parameters and draws the
+requested shape at a certain position. In addition, it will ``remember'' the
+node's position within the current |{pgfpicture}|. You can then, later on,
+refer to the node's position. Coordinate transformations are ``fully
+supported'', which means that if you used coordinate transformations to shift
+or rotate the shape of a node, the node's position will still be correctly
+determined by \pgfname. This is \emph{not} the case if you use canvas
+transformations instead.
+
+
+\subsubsection{Anchors}
+
+An important property of a node or a shape in general are its \emph{anchors}.
+Anchors are ``important'' positions in a shape. For example, the |center|
+anchor lies at the center of a shape, the |north| anchor is usually ``at the
+top, in the middle'' of a shape, the |text| anchor is the lower left corner of
+the shape's text label (if present), and so on.
+
+Anchors are important both when you create a node and when you reference it.
+When you create a node, you specify the node's ``position'' by asking \pgfname\
+to place the shape in such a way that a certain anchor lies at a certain point.
+For example, you might ask that the node is placed such that the |north| anchor
+is at the origin. This will effectively cause the node to be placed below the
+origin.
+
+When you reference a node, you always reference an anchor of the node. For
+example, when you request the ``|north| anchor of the node just placed'' you
+will get the origin. However, you can also request the ``|south| anchor of this
+node'', which will give you a point somewhere below the origin. When a
+coordinate transformation was in force at the time of creation of a node, all
+anchors are also transformed accordingly.
+
+
+\subsubsection{Layers of a Shape}
+
+The simplest shape, the |coordinate|, has just one anchor, namely the |center|,
+and a label (which is usually empty). More complicated shapes like the
+|rectangle| shape also have a \emph{background path}. This is a \pgfname-path
+that is defined by the shape. The shape does not prescribe what should happen
+with the path: When a node is created, this path may be stroked (resulting in a
+frame around the label), filled (resulting in a background color for the text),
+or just discarded.
+
+Although most shapes consist just of a background path plus some label text,
+when a shape is drawn, up to seven different layers are drawn:
+%
+\begin{enumerate}
+ \item The ``behind the background layer''. Unlike the background path,
+ which can be used in different ways by different nodes, the graphic
+ commands given for this layer will always stroke or always fill the
+ path they construct. They might also insert some text that is ``behind
+ everything''.
+ \item The background path layer. How this path is used depends on the
+ arguments of the |\pgfnode| command.
+ \item The ``before the background path layer''. This layer works like the
+ first one, only the commands of this layer are executed after the
+ background path has been used (in whatever way the creator of the node
+ chose).
+ \item The label layer. This layer inserts the node's text box(es).
+ \item The ``behind the foreground layer''. This layer, like the first
+ layer, once more contains graphic commands that are ``simply
+ executed''.
+ \item The foreground path layer. This path is treated in the same way as
+ the background path, only it is drawn after the label text has been
+ drawn.
+ \item The ``before the foreground layer''.
+\end{enumerate}
+
+Which of these layers are actually used depends on the shape.
+
+
+\subsubsection{Node Parts}
+
+A shape typically does not consist only of different background and foreground
+paths, but it may also have text labels. Indeed, for many shapes the text
+labels are the more important part of the shape.
+
+Most shapes will have only one text label. In this case, this text label is
+simply passed as a parameter to the |\pgfnode| command. When the node is drawn,
+the text label is shifted around such that its lower left corner is at the
+|text| anchor of the node.
+
+More complicated shapes may have more than one text label. Nodes of such shapes
+are called \emph{multipart nodes}. The different \emph{node parts} are simply
+the different text labels. For example, a |uml class| shape might have a
+|class name| part, a |method| part and an |attributes| part. Indeed, single
+part nodes are a special case of multipart nodes: They only have one part named
+|text|.
+
+When a shape is declared, you must specify the node parts. There is a simple
+command called |\nodeparts| that takes a list of the part names as input. When
+you create a node of a multipart shape, for each part of the node you must have
+set up a \TeX-box containing the text of the part. For a part named |XYZ| you
+must set up the box |\pgfnodepartXYZbox|. The box will be placed at the anchor
+|XYZ|. See the description of |\pgfmultipartnode| for more details.
+
+
+\subsection{Creating Nodes}
+
+\subsubsection{Creating Simple Nodes}
+
+\begin{command}{\pgfnode\marg{shape}\marg{anchor}\marg{label text}\marg{name}\marg{path usage command}}
+ This command creates a new node. The \meta{shape} of the node must have
+ been declared previously using |\pgfdeclareshape|.
+
+ The shape is shifted such that the \meta{anchor} is at the origin. In order
+ to place the shape somewhere else, use the coordinate transformation prior
+ to calling this command.
+
+ The \meta{name} is a name for later reference. If no name is given, nothing
+ will be ``saved'' for the node, it will just be drawn.
+
+ The \meta{path usage command} is executed for the background and the
+ foreground path (if the shape defines them).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (4,3);
+ {
+ \pgftransformshift{\pgfpoint{1.5cm}{1cm}}
+ \pgfnode{rectangle}{north}{Hello World}{hellonode}{\pgfusepath{stroke}}
+ }
+ {
+ \color{red!20}
+ \pgftransformrotate{10}
+ \pgftransformshift{\pgfpoint{3cm}{1cm}}
+ \pgfnode{rectangle}{center}
+ {\color{black}Hello World}{hellonode}{\pgfusepath{fill}}
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ As can be seen, all coordinate transformations are also applied to the text
+ of the shape. Sometimes, it is desirable that the transformations are
+ applied to the point where the shape will be anchored, but you do not wish
+ the shape itself to the transformed. In this case, you should call
+ |\pgftransformresetnontranslations| prior to calling the |\pgfnode|
+ command.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (4,3);
+ {
+ \color{red!20}
+ \pgftransformrotate{10}
+ \pgftransformshift{\pgfpoint{3cm}{1cm}}
+ \pgftransformresetnontranslations
+ \pgfnode{rectangle}{center}
+ {\color{black}Hello World}{hellonode}{\pgfusepath{fill}}
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ The \meta{label text} is typeset inside the \TeX-box |\pgfnodeparttextbox|.
+ This box is shown at the |text| anchor of the node, if the node has a
+ |text| part. See the description of |\pgfmultipartnode| for details.
+\end{command}
+
+
+\subsubsection{Creating Multi-Part Nodes}
+
+\begin{command}{\pgfmultipartnode\marg{shape}\marg{anchor}\marg{name}\marg{path usage command}}
+ This command is the more general (and less user-friendly) version of the
+ |\pgfnode| command. While the |\pgfnode| command can only be used for
+ shapes that have a single part (which is the case for most shapes), this
+ command can also be used with multi-part nodes.
+
+ When this command is called, for each node part of the node you must have
+ set up one \TeX-box. Suppose the shape has two parts: The |text| part and
+ the |lower| part. Then, prior to calling |\pgfmultipartnode|, you must have
+ set up the boxes |\pgfnodeparttextbox| and |\pgfnodepartlowerbox|. These
+ boxes may contain any \TeX-text. The shape code will then compute the
+ positions of the shape's anchors based on the sizes of the these shapes.
+ Finally, when the node is drawn, the boxes are placed at the anchor
+ positions |text| and |lower|.
+ %
+\begin{codeexample}[]
+\setbox\pgfnodeparttextbox=\hbox{$q_1$}
+\setbox\pgfnodepartlowerbox=\hbox{01}
+\begin{pgfpicture}
+ \pgfmultipartnode{circle split}{center}{my state}{\pgfusepath{stroke}}
+\end{pgfpicture}
+\end{codeexample}
+
+ \emph{Note:\/} Be careful when using the |\setbox| command inside a
+ |{pgfpicture}| command. You will have to use |\pgfinterruptpath| at the
+ beginning of the box and |\endpgfinterruptpath| at the end of the box to
+ make sure that the box is typeset correctly. In the above example this
+ problem was sidestepped by moving the box construction outside the
+ environment.
+
+ \emph{Note:\/} It is not necessary to use |\newbox| for every node part
+ name. Although you need a different box for each part of a single shape,
+ two different shapes may very well use the same box even when the names of
+ the parts are different. Suppose you have a |circle split| shape that has a
+ |lower| part and you have a |uml class| shape that has a |methods| part.
+ Then, in order to avoid exhausting \TeX's limited number of box registers,
+ you can say
+ %
+\begin{codeexample}[code only]
+\newbox\pgfnodepartlowerbox
+\let\pgfnodepartmethodsbox=\pgfnodepartlowerbox
+\end{codeexample}
+ %
+ Also, when you have a node part name with spaces like |class name|, it may
+ be useful to create an alias:
+ %
+\begin{codeexample}[code only]
+\newbox\mybox
+\expandafter\let\csname pgfnodepartclass namebox\endcsname=\mybox
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfcoordinate\marg{name}\marg{coordinate}}
+ This command creates a node of shape |coordinate| at the given
+ \meta{coordinate}. Exactly the same effect can be achieved using first a
+ shift of the coordinate system to \meta{coordinate}, followed by creating a
+ node of shape |coordinate| named \meta{name}. However, this command is
+ easier and more natural to use and, more importantly, it is much faster.
+\end{command}
+
+\begin{command}{\pgfnodealias\marg{new name}\marg{existing node}}
+ This command does not actually create a new node. Rather, it allows you to
+ subsequently access the node \meta{existing node} using the name \meta{new
+ name}.
+\end{command}
+
+\begin{command}{\pgfnoderename\marg{new name}\marg{existing node}}
+ This command renames an existing node.
+\end{command}
+
+There are a number of values that have an influence on the size of a node.
+These values are stored in the following keys.
+
+\begin{key}{/pgf/minimum width=\meta{dimension} (initially 1pt)}
+\keyalias{tikz}
+ This key stores the \emph{recommended} minimum width of a shape. Thus, when
+ a shape is drawn and when the shape's width would be smaller than
+ \meta{dimension}, the shape's width is enlarged by adding some empty space.
+
+ Note that this value is just a recommendation. A shape may choose to ignore
+ this key.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (-2,0) grid (2,1);
+
+ \pgfset{minimum width=3cm}
+ \pgfnode{rectangle}{center}{Hello World}{}{\pgfusepath{stroke}}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/minimum height=\meta{dimension} (initially 1pt)}
+\keyalias{tikz}
+ Works like |/pgf/minimum width|.
+\end{key}
+
+\begin{key}{/pgf/minimum size=\meta{dimension}}
+\keyalias{tikz}
+ This style both |/pgf/minimum width| and |/pgf/minimum height| to \meta{dimension}.
+\end{key}
+
+\begin{key}{/pgf/inner xsep=\meta{dimension} (initially 0.3333em)}
+\keyalias{tikz}
+ This key stores the \emph{recommended} horizontal inner separation between
+ the label text and the background path. As before, this value is just a
+ recommendation and a shape may choose to ignore this key.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (-2,0) grid (2,1);
+
+ \pgfset{inner xsep=1cm}
+ \pgfnode{rectangle}{center}{Hello World}{}{\pgfusepath{stroke}}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/inner ysep=\meta{dimension} (initially 0.3333em)}
+\keyalias{tikz}
+ Works like |/pgf/inner xsep|.
+\end{key}
+
+\begin{key}{/pgf/inner sep=\meta{dimension}}
+\keyalias{tikz}
+ This style sets both |/pgf/inner xsep| and |/pgf/inner ysep| to
+ \meta{dimension}.
+\end{key}
+
+\begin{key}{/pgf/outer xsep=\meta{dimension} (initially .5\string\pgflinewidth)}
+\keyalias{tikz}
+ This key stores the recommended horizontal separation between the
+ background path and the ``outer anchors''. For example, if \meta{dimension}
+ is |1cm| then the |east| anchor will be 1cm to the right of the right
+ border of the background path. As before, this value is just a
+ recommendation.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (-2,0) grid (2,1);
+
+ \pgfset{outer xsep=.5cm}
+ \pgfnode{rectangle}{center}{Hello World}{x}{\pgfusepath{stroke}}
+
+ \pgfpathcircle{\pgfpointanchor{x}{north}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{south}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{east}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{west}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{north east}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/outer ysep=\meta{dimension} (initially .5\string\pgflinewidth)}
+\keyalias{tikz}
+ Works like |/pgf/outer xsep|.
+\end{key}
+
+\begin{key}{/pgf/outer sep=\meta{dimension}}
+\keyalias{tikz}
+ This style sets both |/pgf/outer xsep| and |/pgf/outer ysep| to
+ \meta{dimension}.
+\end{key}
+
+
+\subsubsection{Deferred Node Positioning}
+\label{section-shapes-deferred-node-positioning}
+
+Normally, when a node is created using a command like |\pgfnode|, the node is
+immediately inserted into the current picture. In particular, you have no
+chance to change the position of a created node after it has been created.
+Using |\pgfpositionnodelater| in concert with |\pgfpositionnodenow|, you can
+create a node whose position is determined only at some later time.
+
+\begin{command}{\pgfpositionnodelater\marg{macro name}}
+ This command is not a replacement for |\pgfnode|. Rather, when this command
+ is used in a scope, all subsequent node creations in this scope will be
+ affected in the following way: When a node is created, it is not inserted
+ into the current picture. Instead, it is stored in the box
+ |\pgfpositionnodelaterbox|. Furthermore, the node is not relevant for the
+ picture's bounding box, but a bounding box for the node is computed and
+ stored in the macros |\pgfpositionnodelaterminx| to
+ |\pgfpositionnodelatermaxy|. Then, the \meta{macro name} is called with the
+ following macros set up:
+
+ \begin{command}{\pgfpositionnodelaterbox}
+ A box register number (|0| currently) that stores the node's paths and
+ texts. You should move the contents of this box to a box of your choice
+ inside \meta{macro name}.
+ \end{command}
+
+ \begin{command}{\pgfpositionnodelatername}
+ The name of the just-created-node. This name will be the originally
+ ``desired'' name of the box plus the fixed prefix
+ |not yet positionedPGFINTERNAL|. The idea is to ensure that the
+ original name is not inadvertently used before the node is actually
+ positioned. When |\pgfpositionnodenow| is called, it will change the
+ name to the
+ original name.
+ \end{command}
+
+ \begin{command}{\pgfpositionnodelaterminx}
+ The minimal $x$-position of a bounding box of the node. This bounding
+ box refers to the node when it is positioned with the anchor at the
+ origin. It is guaranteed, that this macro will contain a dimension in
+ the format \meta{number}|pt|.
+ \end{command}
+ %
+ \begin{command}{\pgfpositionnodelaterminy}
+ \end{command}
+ %
+ \begin{command}{\pgfpositionnodelatermaxx}
+ \end{command}
+ %
+ \begin{command}{\pgfpositionnodelatermaxy}
+ \end{command}
+
+ Once a late node has been created, you can add arbitrary code in the same
+ picture. Then, at some later point, you call |\pgfpositionnodenow| to
+ finally position the node at a given position. At this point, the above
+ macros must have the exact same values they had when \meta{macro name} was
+ called. Note that the above macros are local to a scope that ends right
+ after the call to \meta{macro name}, so it is your job to copy the values
+ to safety inside \meta{macro name}.
+
+ The following two macros will also be set inside the call to \meta{macro
+ name}, but they are only ``informative'' in the sense that you need
+ \emph{not} restore these macros when |\pgfpositionnodenow| is called.
+
+ \begin{command}{\pgfpositionnodelaterpath}
+ This macro stores the path of the background of the node. See
+ Section~\ref{section-soft-paths} for an overview of how these paths are
+ encode.
+ \end{command}
+
+ By setting \meta{macro name} to |\relax| (which is the default), you can
+ switch off the whole mechanism. When a picture is interrupted, this is done
+ automatically.
+\end{command}
+
+\begin{command}{\pgfpositionnodenow\marg{coordinate}}
+ This command is used to position a node that has previously been created
+ using the command |\pgfpositionnodelater|. When |\pgfpositionnodenow| is
+ called, the macros and boxes mentioned in the description of
+ |\pgfpositionnodenow| must be set to the value they had when the
+ \meta{macro name} was called. Provided this is the case, this command will
+ insert the box into the current picture, shifted by \meta{coordinate}.
+ Then, the late code (see below) is called. Subsequently, you can refer to
+ the node with its original name as if it had just been created.
+ %
+\begin{codeexample}[]
+\newbox\mybox
+
+\def\mysaver{
+ \global\setbox\mybox=\box\pgfpositionnodelaterbox
+ \global\let\myname=\pgfpositionnodelatername
+ \global\let\myminx=\pgfpositionnodelaterminx
+ \global\let\myminy=\pgfpositionnodelaterminy
+ \global\let\mymaxx=\pgfpositionnodelatermaxx
+ \global\let\mymaxy=\pgfpositionnodelatermaxy
+}
+
+\begin{tikzpicture}
+ {
+ \pgfpositionnodelater{\mysaver}
+ \node [fill=blue!20,below,rotate=30] (hi) {Hello world};
+ }
+ \draw [help lines] (0,0) grid (3,2);
+
+ \let\pgfpositionnodelatername=\myname
+ \let\pgfpositionnodelaterminx=\myminx
+ \let\pgfpositionnodelaterminy=\myminy
+ \let\pgfpositionnodelatermaxx=\mymaxx
+ \let\pgfpositionnodelatermaxy=\mymaxy
+ \setbox\pgfpositionnodelaterbox=\box\mybox
+ \pgfpositionnodenow{\pgfqpoint{2cm}{2cm}}
+
+ \draw (hi) -- (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfnodepostsetupcode\marg{node name}\marg{code}}
+ When you call this macro inside a scope for which the
+ |\pgfpositionnodelater| has been called, the \meta{code} will be stored
+ internally. Later, when the node named \meta{node name} is actually
+ positioned using |\pgfpositionnodenow|, the \meta{code} will be executed.
+ When this macro is called multiple times with the same \meta{node name},
+ the \meta{code} accumulates. However, When |\pgfpositionnodenow| is called,
+ the code stored for the node is cleared.
+
+ The main purpose of this mechanism is to allow \tikzname\ to store
+ so-called ``late options'' with a node that will be positioned only later.
+\end{command}
+
+
+\subsection{Using Anchors}
+
+Each shape defines a set of anchors. We saw already that the anchors are used
+when the shape is drawn: the shape is placed in such a way that the given
+anchor is at the origin (which in turn is typically translated somewhere else).
+
+One has to look up the set of anchors of each shape, there is no ``default''
+set of anchors, except for the |center| anchor, which should always be present.
+Also, most shapes will declare anchors like |north| or |east|, but this is not
+guaranteed.
+
+
+\subsubsection{Referencing Anchors of Nodes in the Same Picture}
+
+Once a node has been defined, you can refer to its anchors using the following
+commands:
+
+\begin{command}{\pgfpointanchor\marg{node}\marg{anchor}}
+ This command is another ``point command'' like the commands described in
+ Section~\ref{section-points}. It returns the coordinate of the given
+ \meta{anchor} in the given \meta{node}. The command can be used in commands
+ like |\pgfpathmoveto|.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgftransformrotate{30}
+ \pgfnode{rectangle}{center}{Hello World!}{x}{\pgfusepath{stroke}}
+
+ \pgfpathcircle{\pgfpointanchor{x}{north}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{south}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{east}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{west}}{2pt}
+ \pgfpathcircle{\pgfpointanchor{x}{north east}}{2pt}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+
+ In the above example, you may have noticed something curious: The rotation
+ transformation is still in force when the anchors are invoked, but it does
+ not seem to have an effect. You might expect that the rotation should apply
+ to the already rotated points once more.
+
+ However, |\pgfpointanchor| returns a point that takes the current
+ transformation matrix into account: \emph{The inverse transformation to the
+ current coordinate transformation is applied to an anchor point before
+ returning it.}
+
+ This behavior may seem a bit strange, but you will find it very natural in
+ most cases. If you really want to apply a transformation to an anchor point
+ (for example, to ``shift it away'' a little bit), you have to invoke
+ |\pgfpointanchor| without any transformations in force. Here is an example:
+ %
+\makeatletter
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgftransformrotate{30}
+ \pgfnode{rectangle}{center}{Hello World!}{x}{\pgfusepath{stroke}}
+
+ {
+ \pgftransformreset
+ \pgfpointanchor{x}{east}
+ \xdef\mycoordinate{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}
+ }
+
+ \pgfpathcircle{\mycoordinate}{2pt}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+
+ A special situation arises when the \meta{node} lies in a picture different
+ from the current picture. In this case, if you have not told \pgfname\ that
+ the picture should be ``remembered'', the \meta{node} will be treated as if
+ it lay in the current picture. For example, if the \meta{node} was at
+ position $(3,2)$ in the original picture, it is treated as if it lay at
+ position $(3,2)$ in the current picture. However, if you have told
+ \pgfname\ to remember the picture position of the node's picture and also
+ of the current picture, then |\pgfpointanchor| will return a coordinate
+ that corresponds to the position of the node's anchor on the page,
+ transformed into the current coordinate system. For examples and more
+ details see Section~\ref{section-cross-pictures-pgf}.
+\end{command}
+
+\begin{command}{\pgfpointshapeborder\marg{node}\marg{point}}
+ This command returns the point on the border of the shape that lies on a
+ straight line from the center of the node to \meta{point}. For complex
+ shapes it is not guaranteed that this point will actually lie on the
+ border, it may be on the border of a ``simplified'' version of the shape.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \begin{pgfscope}
+ \pgftransformrotate{30}
+ \pgfnode{rectangle}{center}{Hello World!}{x}{\pgfusepath{stroke}}
+ \end{pgfscope}
+ \pgfpathcircle{\pgfpointshapeborder{x}{\pgfpoint{2cm}{1cm}}}{2pt}
+ \pgfpathcircle{\pgfpoint{2cm}{1cm}}{2pt}
+ \pgfpathcircle{\pgfpointshapeborder{x}{\pgfpoint{-1cm}{1cm}}}{2pt}
+ \pgfpathcircle{\pgfpoint{-1cm}{1cm}}{2pt}
+ \pgfusepath{fill}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Referencing Anchors of Nodes in Different Pictures}
+\label{section-cross-pictures-pgf}
+
+As a picture is typeset, \pgfname\ keeps track of the positions of all nodes
+inside the picture. What \pgfname\ does not remember is the position of the
+picture \emph{itself} on the page. Thus, if you define a node in one picture
+and then try to reference this node while another picture is typeset, \pgfname\
+will only know the position of the nodes that you try to typeset inside the
+original picture, but it will not know where this picture lies. What is missing
+is the relative positioning of the two pictures.
+
+To overcome this problem, you need to tell \pgfname\ that it should remember
+the position of pictures on a page. If these positions are remembered, then
+\pgfname\ can compute the offset between the pictures and make nodes in
+different pictures accessible.
+
+Determining the positions of pictures on the page is, alas, not-so-easy.
+Because of this, \pgfname\ does not do so automatically. Rather, you have to
+proceed as follows:
+%
+\begin{enumerate}
+ \item You have to use a backend driver that supports position tracking.
+ pdf\TeX\ is one such driver, |dvips| currently is not.
+ \item You have to say |\pgfrememberpicturepositiononpagetrue| somewhere
+ before or inside every picture
+ %
+ \begin{itemize}
+ \item in which you wish to reference a node and
+ \item from which you wish to reference a node in another picture.
+ \end{itemize}
+ %
+ The second item is important since \pgfname\ does not only need to know
+ the position of the picture in which the node you wish to reference
+ lies, but it also needs to know where the current picture lies.
+ \item You typically have to run \TeX\ twice (depending on the backend
+ driver) since the position information typically gets written into an
+ external file on the first run and is available only on the second run.
+ \item You have to switch off automatic bounding bound computations. The
+ reason is that the node in the other picture should not influence the
+ size of the bounding box of the current picture. You should say
+ |\pgfusepath{use as bounding box}| before using a coordinate in another
+ picture.
+\end{enumerate}
+
+
+\subsection{Special Nodes}
+
+There are several special nodes that are always defined and which you should
+not attempt to redefine.
+
+\begin{predefinednode}{current bounding box}
+ This node is of shape |rectangle|. Unlike normal nodes, its size changes
+ constantly and always reflects the size of the bounding box of the current
+ picture. This means that, for instance, that
+ %
+\begin{codeexample}[code only]
+\pgfpointanchor{current bounding box}{south east}
+\end{codeexample}
+ %
+ returns the lower left corner of the bounding box of the current picture.
+\end{predefinednode}
+
+\begin{predefinednode}{current path bounding box}
+ This node is also of shape |rectangle|. Its size is the size of the
+ bounding box of the current path.
+\end{predefinednode}
+
+\begin{predefinednode}{current subpath start}
+ This node is of shape |coordinate| and is at the beginning of the current
+ subpath. This is the position of the last move-to operation.
+\end{predefinednode}
+
+\begin{predefinednode}{current page}
+ This node is inside a virtual remembered picture. The size of this node is
+ the size of the current page. This means that if you create a remembered
+ picture and inside this picture you reference an anchor of this node, you
+ reference an absolute position on the page. To demonstrate the effect, the
+ following code puts some text in the lower left corner of the current page.
+ Note that this works only if the backend driver supports it, otherwise the
+ text is inserted right here.
+ %
+{%
+\pgfrememberpicturepositiononpagetrue%
+\begin{pgfpicture}
+ \pgfusepath{use as bounding box}
+ \pgftransformshift{\pgfpointanchor{current page}{south west}}
+ \pgftransformshift{\pgfpoint{1cm}{1cm}}
+ \pgftext[left,base]{
+ \textcolor{red}{
+ Text absolutely positioned in
+ the lower left corner.}
+ }
+\end{pgfpicture}
+}%
+\begin{codeexample}[code only]
+\pgfrememberpicturepositiononpagetrue
+\begin{pgfpicture}
+ \pgfusepath{use as bounding box}
+ \pgftransformshift{\pgfpointanchor{current page}{south west}}
+ \pgftransformshift{\pgfpoint{1cm}{1cm}}
+ \pgftext[left,base]{
+ \textcolor{red}{
+ Text absolutely positioned in
+ the lower left corner.}
+ }
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{predefinednode}
+
+There is also an option that allows you to create new special nodes quite
+similar to the above:
+%
+\begin{key}{/pgf/local bounding box=\meta{node name}}
+\keyalias{tikz}
+ This defines a new node \meta{node name} whose size is the bounding box
+ around all objects in the current scope starting at the position where this
+ option was given. After the end of the scope, the \meta{node name} is still
+ available. You can use this option to keep track of the size of a certain
+ area. Note that excessive use of this option (keeping track of dozens of
+ bounding boxes at the same time) will slow things down.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ { [local bounding box=outer box]
+ \draw (1,1) circle (.5) [local bounding box=inner box] (2,2) circle (.5);
+ }
+ \draw (outer box.south west) rectangle (outer box.north east);
+ \draw[red] (inner box.south west) rectangle (inner box.north east);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Declaring New Shapes}
+
+There are only three predefined shapes, see
+Section~\ref{section-predefined-shapes}, so there must be some way of defining
+new shapes. Defining a shape is, unfortunately, a not-quite-trivial process.
+The reason is that shapes need to be both very flexible (their size will vary
+greatly according to circumstances) and they need to be constructed reasonably
+``fast''. \pgfname\ must be able to handle pictures with several hundreds of
+nodes and documents with thousands of nodes in total. It would not do if
+\pgfname\ had to compute and store, say, dozens of anchor positions for every
+node.
+
+
+\subsubsection{What Must Be Defined For a Shape?}
+
+In order to define a new shape, you must provide:
+%
+\begin{itemize}
+ \item a \emph{shape name},
+ \item code for computing the \emph{saved anchors} and \emph{saved
+ dimensions},
+ \item code for computing \emph{anchor} positions in terms of the saved
+ anchors,
+ \item optionally code for the \emph{background path} and \emph{foreground
+ path},
+ \item optionally code for \emph{things to be drawn before or behind} the
+ background and foreground paths.
+ \item optionally a list of node parts.
+\end{itemize}
+
+
+\subsubsection{Normal Anchors Versus Saved Anchors}
+
+Anchors are special places in a shape. For example, the |north east| anchor,
+which is a normal anchor, lies at the upper right corner of the |rectangle|
+shape, as does |\northeast|, which is a saved anchor. The difference is the
+following: \emph{saved anchors are computed and stored for each node, anchors
+are only computed as needed.} The user only has access to the normal anchors,
+but a normal anchor can just ``copy'' or ``pass through'' the location of a
+saved anchor.
+
+The idea behind all this is that a shape can declare a very large number of
+normal anchors, but when a node of this shape is created, these anchors are not
+actually computed. However, this causes a problem: When we wish to reference an
+anchor of a node at some later time, we must still be able to compute the
+position of the anchor. For this, we may need a lot of information: What was
+the transformation matrix that was in force when the node was created? What was
+the size of the text box? What were the values of the different separation
+dimensions? And so on.
+
+To solve this problem, \pgfname\ will always compute the locations of all
+\emph{saved anchors} and store these positions. Then, when an normal anchor
+position is requested later on, the anchor position can be given just from
+knowing where the locations of the saved anchors are.
+
+As an example, consider the |rectangle| shape. For this shape two anchors are
+saved: The |\northeast| corner and the |\southwest| corner. A normal anchor
+like |north west| can now easily be expressed in terms of these coordinates:
+Take the $x$-position of the |\southwest| point and the $y$-position of the
+|\northeast| point. The |rectangle| shape currently defines 13 normal anchors,
+but needs only two saved anchors. Adding new anchors like a |south south east|
+anchor would not increase the memory and computation requirements of pictures.
+
+All anchors (both saved and normal) are specified in a local \emph{shape
+coordinate space}. This is also true for the background and foreground paths.
+The |\pgfnode| macro will automatically apply appropriate transformations to
+the coordinates so that the shape is shifted to the right anchor or otherwise
+transformed.
+
+
+\subsubsection{Command for Declaring New Shapes}
+
+The following command declares a new shape:
+%
+\begin{command}{\pgfdeclareshape\marg{shape name}\marg{shape specification}}
+ This command declares a new shape named \meta{shape name}. The shape name
+ can later be used in commands like |\pgfnode|.
+
+ The \meta{shape specification} is some \TeX\ code containing calls to
+ special commands that are only defined inside the \meta{shape
+ specification} (similarly to commands like |\draw| that are only available
+ inside the |{tikzpicture}| environment).
+
+ \example Here is the code of the |coordinate| shape:
+ %
+\begin{codeexample}[code only]
+\pgfdeclareshape{coordinate}
+{
+ \savedanchor\centerpoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgf@y=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by -.5\dp\pgfnodeparttextbox%
+ }
+ \anchor{center}{\centerpoint}
+ \anchorborder{\centerpoint}
+}
+\end{codeexample}
+
+ The special commands are explained next. In the examples given for the
+ special commands a new shape will be constructed, which we might call
+ |simple rectangle|. It should behave like the normal rectangle shape, only
+ without bothering about the fine details like inner and outer separations.
+ The skeleton for the shape is the following.
+ %
+\begin{codeexample}[code only]
+\pgfdeclareshape{simple rectangle}{
+ ...
+}
+\end{codeexample}
+
+ \begin{command}{\nodeparts\marg{list of node parts}}
+ This command declares which parts make up nodes of this shape. A
+ \emph{node part} is a (possibly empty) text label that is drawn when a
+ node of the shape is created.
+
+ By default, a shape has just one node part called |text|. However,
+ there can be several node parts. For example, the |circle split| shape
+ has two parts: the |text| part, which shows that the upper text, and a
+ |lower| part, which shows the lower text. For the |circle split| shape
+ the |\nodeparts| command was called with the argument |{text,lower}|.
+
+ When a multipart node is created, the text labels are drawn in the
+ sequences listed in the \meta{list of node parts}. For each node part,
+ you must have declared one anchor and the \TeX-box of the part is
+ placed at this anchor. For a node part called |XYZ| the \TeX-box
+ |\pgfnodepartXYZbox| is placed at anchor |XYZ|.
+ \end{command}
+
+ \begin{command}{\savedanchor\marg{command}\marg{code}}
+ This command declares a saved anchor. The argument \meta{command}
+ should be a \TeX\ macro name like |\centerpoint|.
+
+ The \meta{code} will be executed each time |\pgfnode| (or
+ |\pgfmultipartnode|) is called to create a node of the shape
+ \meta{shape name}. When the \meta{code} is executed, the \TeX-boxes of
+ the node parts will contain the text labels of the node. Possibly,
+ these box are void. For example, if there is just a |text| part, the
+ node |\pgfnodeparttextbox| will be set up when the \meta{code} is
+ executed.
+
+ The \meta{code} can use the width, height, and depth of the box(es) to
+ compute the location of the saved anchor. In addition, the \meta{code}
+ can take into account the values of dimensions like |\pgfshapeminwidth|
+ or |\pgfshapeinnerxsep|. Furthermore, the \meta{code} can take into
+ consideration the values of any further shape-specific variables that
+ are set at the moment when |\pgfnode| is called.
+
+ The net effect of the \meta{code} should be to set the two \TeX\
+ dimensions |\pgf@x| and |\pgf@y|. One way to achieve this is to say
+ |\pgfpoint{|\meta{x value}|}{|\meta{y value}|}| at the end of the
+ \meta{code}, but you can also just set these variables. The values that
+ |\pgf@x| and |\pgf@y| have after the code has been executed, let us
+ call them $x$ and $y$, will be recorded and stored together with the
+ node that is created by the command |\pgfnode|.
+
+ The macro \meta{command} is defined to be |\pgfpoint{|$x$|}{|$y$|}|.
+ However, the \meta{command} is only locally defined while anchor
+ positions are being computed. Thus, it is possible to use very simple
+ names for \meta{command}, like |\center| or |\a|, without causing a
+ name-clash. (To be precise, very simple \meta{command} names will clash
+ with existing names, but only locally inside the computation of anchor
+ positions; and we do not need the normal |\center| command during these
+ computations.)
+
+ For our |simple rectangle| shape, we will need only one saved anchor:
+ The upper right corner. The lower left corner could either be the
+ origin or the ``mirrored'' upper right corner, depending on whether we
+ want the text label to have its lower left corner at the origin or
+ whether the text label should be centered on the origin. Either will be
+ fine, for the final shape this will make no difference since the shape
+ will be shifted anyway. So, let us assume that the text label is
+ centered on the origin (this will be specified later on using the
+ |text| anchor). We get the following code for the upper right corner:
+ %
+\begin{codeexample}[code only]
+\savedanchor{\upperrightcorner}{
+ \pgf@y=.5\ht\pgfnodeparttextbox % height of the box, ignoring the depth
+ \pgf@x=.5\wd\pgfnodeparttextbox % width of the box
+}
+\end{codeexample}
+
+ If we wanted to take, say, the |\pgfshapeminwidth| into account, we
+ could use the following code:
+ %
+\begin{codeexample}[code only]
+\savedanchor{\upperrightcorner}{
+ \pgf@y=.\ht\pgfnodeparttextbox % height of the box
+ \pgf@x=.\wd\pgfnodeparttextbox % width of the box
+ \setlength{\pgf@xa}{\pgfshapeminwidth}
+ \ifdim\pgf@x<.5\pgf@xa
+ \pgf@x=.5\pgf@xa
+ \fi
+}
+\end{codeexample}
+ %
+ Note that we could not have written |.5\pgfshapeminwidth| since the
+ minimum width is stored in a ``plain text macro'', not as a real
+ dimension. So if |\pgfshapeminwidth| depth were 2cm, writing
+ |.5\pgfshapeminwidth| would yield the same as |.52cm|.
+
+ In the ``real'' |rectangle| shape the code is somewhat more complex,
+ but you get the basic idea.
+ \end{command}
+ %
+ \begin{command}{\saveddimen\marg{command}\marg{code}}
+ This command is similar to |\savedanchor|, only instead of setting
+ \meta{command} to |\pgfpoint{|$x$|}{|$y$|}|, the \meta{command} is set
+ just to (the value of) $x$.
+
+ In the |simple rectangle| shape we might use a saved dimension to store
+ the depth of the shape box.
+ %
+\begin{codeexample}[code only]
+\saveddimen{\depth}{
+ \pgf@x=\dp\pgfnodeparttextbox
+}
+\end{codeexample}
+ \end{command}
+ %
+ \begin{command}{\savedmacro\marg{command}\marg{code}}
+ This command is similar to |\saveddimen|, only at some point in
+ \meta{code}, \meta{command} should be defined appropriately, (this
+ could be a value, or some text).
+
+ In the |regular polygon| shape, a saved macro is used to store the
+ number of sides of the polygon.
+ %
+\begin{codeexample}[code only]
+\savedmacro{\sides}{\let\sides\pgfpolygonsides}
+\end{codeexample}
+ \end{command}
+ %
+ \begin{command}{\anchor\marg{name}\marg{code}}
+ This command declares an anchor named \meta{name}. Unlike for saved
+ anchors, the \meta{code} will not be executed each time a node is
+ declared. Rather, the \meta{code} is only executed when the anchor is
+ specifically requested; either for anchoring the node during its
+ creation or as a position in the shape referenced later on.
+
+ The \meta{name} is a quite arbitrary string that is not ``passed down''
+ to the system level. Thus, names like |south| or |1| or |::| would all
+ be fine.
+
+ A saved anchor is not automatically also a normal anchor. If you wish
+ to give the users access to a saved anchor you must declare a normal
+ anchor that just returns the position of the saved anchor.
+
+ When the \meta{code} is executed, all saved anchor macros will be
+ defined. Thus, you can reference them in your \meta{code}. The effect
+ of the \meta{code} should be to set the values of |\pgf@x| and |\pgf@y|
+ to the coordinates of the anchor.
+
+ Let us consider some example for the |simple rectangle| shape. First,
+ we would like to make the upper right corner publicly available, for
+ example as |north east|:
+ %
+\begin{codeexample}[code only]
+\anchor{north east}{\upperrightcorner}
+\end{codeexample}
+
+ The |\upperrightcorner| macro will set |\pgf@x| and |\pgf@y| to the
+ coordinates of the upper right corner. Thus, |\pgf@x| and |\pgf@y| will
+ have exactly the right values at the end of the anchor's code.
+
+ Next, let us define a |north west| anchor. For this anchor, we can
+ negate the |\pgf@x| variable:
+ %
+\begin{codeexample}[code only]
+\anchor{north west}{
+ \upperrightcorner
+ \pgf@x=-\pgf@x
+}
+\end{codeexample}
+
+ Finally, it is a good idea to always define a |center| anchor, which
+ will be the default location for a shape.
+ %
+\begin{codeexample}[code only]
+\anchor{center}{\pgfpointorigin}
+\end{codeexample}
+
+ You might wonder whether we should not take into consideration that the
+ node is not placed at the origin, but has been shifted somewhere.
+ However, the anchor positions are always specified in the shape's
+ ``private'' coordinate system. The ``outer'' transformation that has
+ been applied to the shape upon its creation is applied automatically to
+ the coordinates returned by the anchor's \meta{code}.
+
+ Our |simple rectangle| only has one text label (node part) called
+ |text|. This is the default situation, so we do not need to do
+ anything. For the |text| node part we must set up a |text| anchor. Upon
+ creation of a node, this anchor will be made to coincide with the left
+ endpoint of the baseline of the text label (within the private
+ coordinate system of the shape). By default, the |text| anchor is at
+ the origin, but you may change this. For example, we would say
+ %
+\begin{codeexample}[code only]
+\anchor{text}{%
+ \upperrightcorner%
+ \pgf@x=-\pgf@x%
+ \pgf@y=-\pgf@y%
+}
+\end{codeexample}
+ to center the text label on the origin in the shape coordinate space.
+ Note that we could \emph{not} have written the following:
+ %
+\begin{codeexample}[code only]
+\anchor{text}{\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+\end{codeexample}
+ %
+ Do you see why this is wrong? The problem is that the box
+ |\pgfnodeparttextbox| will most likely not have the correct size when
+ the anchor is computed. After all, the anchor position might be
+ recomputed at a time when several other nodes have been created.
+
+ If a shape has several node parts, we would have to define an anchor
+ for each part.
+ \end{command}
+
+ \begin{command}{\deferredanchor\marg{name}\marg{code}}
+ This command declares an anchor named \meta{name}. It works like
+ |\anchor|. However, unlike for anchors declared by |\anchor|,
+ \meta{name} will \emph{not} be expanded during the shape declaration
+ (i.e.\ not during |\pgfdeclareshape|). Rather, the \meta{name} is
+ expanded when the \emph{node} is actually used (with |\pgfnode| or more
+ likely with |\node|). This may be useful if the anchor name is context
+ dependent (depending, for example, on the value of a key).
+ %
+\begin{codeexample}[code only]
+\makeatletter
+\def\foo{foo}
+\pgfdeclareshape{simple shape}{%
+ \savedanchor{\center}{%
+ \pgfpointorigin}
+ \anchor{center}{\center}
+ \savedanchor{\anchorfoo}{%
+ \pgf@x=1cm
+ \pgf@y=0cm}
+ \deferredanchor{anchor \foo}{\anchorfoo}}
+
+\begin{tikzpicture}
+ \node[simple shape] (Test1) at (0,0) {};
+ \fill (Test1.anchor foo) circle (2pt) node[below] {anchor foo anchor};
+ %
+ \def\foo{bar}
+ \node[simple shape] (Test2) at (2,2) {};
+ \fill (Test2.anchor bar) circle (2pt) node[below] {anchor bar anchor};
+\end{tikzpicture}
+\end{codeexample}
+ \end{command}
+ %
+ \begin{command}{\anchorborder\marg{code}}
+ A \emph{border anchor} is an anchor point on the border of the shape.
+ What exactly is considered as the ``border'' of the shape depends on
+ the shape.
+
+ When the user requests a point on the border of the shape using the
+ |\pgfpointshapeborder| command, the \meta{code} will be executed to
+ discern this point. When the execution of the \meta{code} starts, the
+ dimensions |\pgf@x| and |\pgf@y| will have been set to a location $p$
+ in the shape's coordinate system. It is now the job of the \meta{code}
+ to set up |\pgf@x| and |\pgf@y| such that they specify the point on the
+ shape's border that lies on a straight line from the shape's center to
+ the point $p$. Usually, this is a somewhat complicated computation,
+ involving many case distinctions and some basic math.
+
+ For our |simple rectangle| we must compute a point on the border of a
+ rectangle whose one corner is the origin (ignoring the depth for
+ simplicity) and whose other corner is |\upperrightcorner|. The
+ following code might be used:
+ %
+\begin{codeexample}[code only]
+\anchorborder{%
+ % Call a function that computes a border point. Since this
+ % function will modify dimensions like \pgf@x, we must move them to
+ % other dimensions.
+ \@tempdima=\pgf@x
+ \@tempdimb=\pgf@y
+ \pgfpointborderrectangle{\pgfpoint{\@tempdima}{\@tempdimb}}{\upperrightcorner}
+}
+\end{codeexample}
+ \end{command}
+ %
+ \begin{command}{\backgroundpath\marg{code}}
+ This command specifies the path that ``makes up'' the background of the
+ shape. Note that the shape cannot prescribe what is going to happen
+ with the path: It might be drawn, shaded, filled, or even thrown away.
+ If you want to specify that something should ``always'' happen when
+ this shape is drawn (for example, if the shape is a stop-sign, we
+ \emph{always} want it to be filled with a red color), you can use
+ commands like |\beforebackgroundpath|, explained below.
+
+ When the \meta{code} is executed, all saved anchors will be in effect.
+ The \meta{code} should contain path construction commands.
+
+ For our |simple rectangle|, the following code might be used:
+ %
+\begin{codeexample}[code only]
+\backgroundpath{
+ \pgfpathrectanglecorners
+ {\upperrightcorner}
+ {\pgfpointscale{-1}{\upperrightcorner}}
+}
+\end{codeexample}
+ %
+ As the name suggests, the background path is used ``behind'' the text
+ labels. Thus, this path is used first, then the text labels are drawn,
+ possibly obscuring part of the path.
+ \end{command}
+ %
+ \begin{command}{\foregroundpath\marg{code}}
+ This command works like |\backgroundpath|, only it is invoked after the
+ text labels have been drawn. This means that this path can possibly
+ obscure (part of) the text labels.
+ \end{command}
+ %
+ \begin{command}{\behindbackgroundpath\marg{code}}
+ Unlike the previous two commands, \meta{code} should not only construct
+ a path, it should also use this path in whatever way is appropriate.
+ For example, the \meta{code} might fill some area with a uniform color.
+
+ Whatever the \meta{code} does, it does it first. This means that any
+ drawing done by \meta{code} will be even behind the background path.
+
+ Note that the \meta{code} is protected with a |{pgfscope}|.
+ \end{command}
+ %
+ \begin{command}{\beforebackgroundpath\marg{code}}
+ This command works like |\behindbackgroundpath|, only the \meta{code}
+ is executed after the background path has been used, but before the
+ texts label are drawn.
+ \end{command}
+ %
+ \begin{command}{\behindforegroundpath\marg{code}}
+ The \meta{code} is executed after the text labels have been drawn, but
+ before the foreground path is used.
+ \end{command}
+ %
+ \begin{command}{\beforeforegroundpath\marg{code}}
+ This \meta{code} is executed at the very end.
+ \end{command}
+ %
+ \begin{command}{\inheritsavedanchors|[from=|\marg{another shape name}|]|}
+ This command allows you to inherit the code for saved anchors from
+ \meta{another shape name}. The idea is that if you wish to create a new
+ shape that is just a small modification of a another shape, you can
+ recycle the code used for \meta{another shape name}.
+
+ The effect of this command is the same as if you had called
+ |\savedanchor| and |\saveddimen| for each saved anchor or saved
+ dimension declared in \meta{another shape name}. Thus, it is not
+ possible to ``selectively'' inherit only some saved anchors, you always
+ have to inherit all saved anchors from another shape. However, you can
+ inherit the saved anchors of more than one shape by calling this
+ command several times.
+ \end{command}
+ %
+ \begin{command}{\inheritbehindbackgroundpath|[from=|\marg{another shape name}|]|}
+ This command can be used to inherit the code used for the drawings
+ behind the background path from \meta{another shape name}.
+ \end{command}
+ %
+ \begin{command}{\inheritbackgroundpath|[from=|\marg{another shape name}|]|}
+ Inherits the background path code from \meta{another shape name}.
+ \end{command}
+ %
+ \begin{command}{\inheritbeforebackgroundpath|[from=|\marg{another shape name}|]|}
+ Inherits the before background path code from \meta{another shape
+ name}.
+ \end{command}
+ %
+ \begin{command}{\inheritbehindforegroundpath|[from=|\marg{another shape name}|]|}
+ Inherits the behind foreground path code from \meta{another shape
+ name}.
+ \end{command}
+ %
+ \begin{command}{\inheritforegroundpath|[from=|\marg{another shape name}|]|}
+ Inherits the foreground path code from \meta{another shape name}.
+ \end{command}
+ %
+ \begin{command}{\inheritbeforeforegroundpath|[from=|\marg{another shape name}|]|}
+ Inherits the before foreground path code from \meta{another shape
+ name}.
+ \end{command}
+ %
+ \begin{command}{\inheritanchor|[from=|\marg{another shape name}|]|\marg{name}}
+ Inherits the code of one specific anchor named \meta{name} from
+ \meta{another shape name}. Thus, unlike saved anchors, which must be
+ inherited collectively, normal anchors can and must be inherited
+ individually.
+ \end{command}
+ %
+ \begin{command}{\inheritanchorborder|[from=|\marg{another shape name}|]|}
+ Inherits the border anchor code from \meta{another shape name}.
+ \end{command}
+
+ The following example shows how a shape can be defined that relies heavily
+ on inheritance:
+ %
+\makeatletter
+\begin{codeexample}[]
+\pgfdeclareshape{document}{
+ \inheritsavedanchors[from=rectangle] % this is nearly a rectangle
+ \inheritanchorborder[from=rectangle]
+ \inheritanchor[from=rectangle]{center}
+ \inheritanchor[from=rectangle]{north}
+ \inheritanchor[from=rectangle]{south}
+ \inheritanchor[from=rectangle]{west}
+ \inheritanchor[from=rectangle]{east}
+ % ... and possibly more
+ \backgroundpath{% this is new
+ % store lower right in xa/ya and upper right in xb/yb
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % compute corner of ``flipped page''
+ \pgf@xc=\pgf@xb \advance\pgf@xc by-5pt % this should be a parameter
+ \pgf@yc=\pgf@yb \advance\pgf@yc by-5pt
+ % construct main path
+ \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yb}}
+ \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
+ \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
+ \pgfpathclose
+ % add little corner
+ \pgfpathmoveto{\pgfpoint{\pgf@xc}{\pgf@yb}}
+ \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
+ \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
+ \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
+ }
+}\hskip-1.2cm
+\begin{tikzpicture}
+ \node[shade,draw,shape=document,inner sep=2ex] (x) {Remark};
+ \node[fill=yellow!80!black,draw,ellipse,double]
+ at ([shift=(-80:3cm)]x) (y) {Use Case};
+
+ \draw[dashed] (x) -- (y);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-paths.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-paths.tex
new file mode 100644
index 0000000000..4863835dda
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-paths.tex
@@ -0,0 +1,876 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Constructing Paths}
+
+\subsection{Overview}
+
+The ``basic entity of drawing'' in \pgfname\ is the \emph{path}. A path
+consists of several parts, each of which is either a closed or open curve. An
+open curve has a starting point and an end point and, in between, consists of
+several \emph{segments}, each of which is either a straight line or a Bézier
+curve. Here is an example of a path (in red) consisting of two parts, one open,
+one closed:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=2]
+ \draw[thick,red]
+ (0,0) coordinate (a)
+ -- coordinate (ab) (1,.5) coordinate (b)
+ .. coordinate (bc) controls +(up:1cm) and +(left:1cm) .. (3,1) coordinate (c)
+ (0,1) -- (2,1) -- coordinate (x) (1,2) -- cycle;
+
+ \draw (a) node[below] {start part 1}
+ (ab) node[below right] {straight segment}
+ (b) node[right] {end first segment}
+ (c) node[right] {end part 1}
+ (x) node[above right] {part 2 (closed)};
+\end{tikzpicture}
+\end{codeexample}
+
+A path, by itself, has no ``effect'', that is, it does not leave any marks on
+the page. It is just a set of points on the plane. However, you can \emph{use}
+a path in different ways. The most natural actions are \emph{stroking} (also
+known as \emph{drawing}) and \emph{filling}. Stroking can be imagined as
+picking up a pen of a certain diameter and ``moving it along the path''.
+Filling means that everything ``inside'' the path is filled with a uniform
+color. Naturally, the open parts of a path must first be closed before a path
+can be filled.
+
+In \pgfname, there are numerous commands for constructing paths, all of which
+start with |\pgfpath|. There are also commands for \emph{using} paths, though
+most operations can be performed by calling |\pgfusepath| with an appropriate
+parameter.
+
+As a side-effect, the path construction commands keep track of two bounding
+boxes. One is the bounding box for the current path, the other is a bounding
+box for all paths in the current picture. See Section~\ref{section-bb} for more
+details.
+
+Each path construction command extends the current path in some way. The
+``current path'' is a global entity that persists across \TeX\ groups. Thus,
+between calls to the path construction commands you can perform arbitrary
+computations and even open and close \TeX\ groups. The current path only gets
+``flushed'' when the |\pgfusepath| command is called (or when the soft-path
+subsystem is used directly, see Section~\ref{section-soft-paths}).
+
+
+\subsection{The Move-To Path Operation}
+
+The most basic operation is the move-to operation. It must be given at the
+beginning of paths, though some path construction command (like
+|\pgfpathrectangle|) generate move-tos implicitly. A move-to operation can also
+be used to start a new part of a path.
+
+\begin{command}{\pgfpathmoveto\marg{coordinate}}
+ This command expects a \pgfname-coordinate like |\pgfpointorigin| as its
+ parameter. When the current path is empty, this operation will start the
+ path at the given \meta{coordinate}. If a path has already been partly
+ constructed, this command will end the current part of the path and start a
+ new one.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{3cm}{0.5cm}}
+ \pgfpathlineto{\pgfpoint{3cm}{0cm}}
+ \pgfsetfillcolor{yellow!80!black}
+ \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1cm}}
+ \pgfpathmoveto{\pgfpoint{2cm}{1cm}} % New part
+ \pgfpathlineto{\pgfpoint{3cm}{0.5cm}}
+ \pgfpathlineto{\pgfpoint{3cm}{0cm}}
+ \pgfsetfillcolor{yellow!80!black}
+ \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The command will apply the current coordinate transformation matrix to
+ \meta{coordinate} before using it.
+
+ It will update the bounding box of the current path and picture, if
+ necessary.
+\end{command}
+
+
+\subsection{The Line-To Path Operation}
+
+\begin{command}{\pgfpathlineto\marg{coordinate}}
+ This command extends the current path in a straight line to the given
+ \meta{coordinate}. If this command is given at the beginning of path
+ without any other path construction command given before (in particular
+ without a move-to operation), the \TeX\ file may compile without an error
+ message, but a viewer application may display an error message when trying
+ to render the picture.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{2cm}{1cm}}
+ \pgfsetfillcolor{yellow!80!black}
+ \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The command will apply the current coordinate transformation matrix to
+ \meta{coordinate} before using it.
+
+ It will update the bounding box of the current path and picture, if
+ necessary.
+\end{command}
+
+
+\subsection{The Curve-To Path Operations}
+
+\begin{command}{\pgfpathcurveto\marg{support 1}\marg{support 2}\marg{coordinate}}
+ This command extends the current path with a Bézier curve from the last
+ point of the path to \meta{coordinate}. The \meta{support 1} and
+ \meta{support 2} are the first and second support point of the Bézier
+ curve. For more information on Bézier curves, please consult a standard
+ textbook on computer graphics.
+
+ Like the line-to command, this command may not be the first path
+ construction command in a path.
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfpoint{1cm}{1cm}}{\pgfpoint{2cm}{1cm}}{\pgfpoint{3cm}{0cm}}
+ \pgfsetfillcolor{yellow!80!black}
+ \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The command will apply the current coordinate transformation matrix to
+ \meta{coordinate} before using it.
+
+ It will update the bounding box of the current path and picture, if
+ necessary. However, the bounding box is simply made large enough such that
+ it encompasses all of the support points and the \meta{coordinate}. This
+ will guarantee that the curve is completely inside the bounding box, but
+ the bounding box will typically be quite a bit too large. It is not clear
+ (to me) how this can be avoided without resorting to ``some serious math''
+ in order to calculate a precise bounding box.
+\end{command}
+
+\begin{command}{\pgfpathquadraticcurveto\marg{support}\marg{coordinate}}
+ This command works like |\pgfpathcurveto|, only it uses a quadratic Bézier
+ curve rather than a cubic one. This means that only one support point is
+ needed.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathquadraticcurveto
+ {\pgfpoint{1cm}{1cm}}{\pgfpoint{2cm}{0cm}}
+ \pgfsetfillcolor{yellow!80!black}
+ \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ Internally, the quadratic curve is converted into a cubic curve. The only
+ noticeable effect of this is that the points used for computing the
+ bounding box are the control points of the converted curve rather than
+ \meta{support}. The main effect of this is that the bounding box will be a
+ bit tighter than might be expected. In particular, \meta{support} will not
+ always be part of the bounding box.
+\end{command}
+
+There exist two commands to draw only part of a cubic Bézier curve:
+
+\begin{command}{\pgfpathcurvebetweentime\marg{time $t_1$}\marg{time $t_2$}\marg{point p}\marg{point $s_1$}\marg{point $s_2$}\marg{point q}}
+ This command draws the part of the curve described by $p$, $s_1$, $s_2$ and
+ $q$ between the times $t_1$ and $t_2$. A time value of 0 indicates the
+ point $p$ and a time value of 1 indicates point $q$. This command includes
+ a moveto operation to the first point.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [thin] (0,0) .. controls (0,2) and (3,0) .. (3,2);
+ \pgfpathcurvebetweentime{0.25}{0.9}{\pgfpointxy{0}{0}}{\pgfpointxy{0}{2}}
+ {\pgfpointxy{3}{0}}{\pgfpointxy{3}{2}}
+ \pgfsetstrokecolor{red}
+ \pgfsetstrokeopacity{0.5}
+ \pgfsetlinewidth{2pt}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpathcurvebetweentimecontinue\marg{time $t_1$}\marg{time $t_2$}\marg{point p}\marg{point $s_1$}\marg{point $s_2$}\marg{point q}}
+ This command works like |\pgfpathcurvebetweentime|, except that a moveto
+ operation is \emph{not} made to the first point.
+\end{command}
+
+
+\subsection{The Close Path Operation}
+
+\begin{command}{\pgfpathclose}
+ This command closes the current part of the path by appending a straight
+ line to the start point of the current part. Note that there \emph{is} a
+ difference between closing a path and using the line-to operation to add a
+ straight line to the start of the current path. The difference is
+ demonstrated by the upper corners of the triangles in the following
+ example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfsetlinewidth{5pt}
+ \pgfpathmoveto{\pgfpoint{1cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-1cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{-1cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{2.5cm}{1cm}}
+ \pgfpathlineto{\pgfpoint{1.5cm}{-1cm}}
+ \pgfpathlineto{\pgfpoint{2.5cm}{-1cm}}
+ \pgfpathlineto{\pgfpoint{2.5cm}{1cm}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Arc, Ellipse and Circle Path Operations}
+
+The path construction commands that we have discussed up to now are sufficient
+to create all paths that can be created ``at all''. However, it is useful to
+have special commands to create certain shapes, like circles, that arise often
+in practice.
+
+In the following, the commands for adding (parts of) (transformed) circles to a
+path are described.
+
+\begin{command}{\pgfpatharc\marg{start angle}\marg{end angle}{\ttfamily\char`\{}\meta{radius}\opt{| and |\meta{y-radius}}{\ttfamily\char`\}}}
+ This command appends a part of a circle (or an ellipse) to the current
+ path. Imagine the curve between \meta{start angle} and \meta{end angle} on
+ a circle of radius \meta{radius} (if $\meta{start angle} < \meta{end
+ angle}$, the curve goes around the circle counterclockwise, otherwise
+ clockwise). This curve is now moved such that the point where the curve
+ starts is the previous last point of the path. Note that this command will
+ \emph{not} start a new part of the path, which is important for example for
+ filling purposes.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{0cm}{1cm}}
+ \pgfpatharc{180}{90}{.5cm}
+ \pgfpathlineto{\pgfpoint{3cm}{1.5cm}}
+ \pgfpatharc{90}{-45}{.5cm}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+
+ Saying |\pgfpatharc{0}{360}{1cm}| ``nearly'' gives you a full circle. The
+ ``nearly'' refers to the fact that the circle will not be closed. You can
+ close it using |\pgfpathclose|.
+
+ If the optional \meta{y-radius} is given, the \meta{radius} is the
+ $x$-radius and the \meta{y-radius} the $y$-radius of the ellipse from which
+ the curve is taken:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpatharc{180}{45}{2cm and 1cm}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+
+ The axes of the circle or ellipse from which the arc is ``taken'' always
+ point up and right. However, the current coordinate transformation matrix
+ will have an effect on the arc. This can be used to, say, rotate an arc:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformrotate{30}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpatharc{180}{45}{2cm and 1cm}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+
+ The command will update the bounding box of the current path and picture,
+ if necessary. Unless rotation or shearing transformations are applied, the
+ bounding box will be tight.
+\end{command}
+
+\begin{command}{\pgfpatharcaxes\marg{start angle}\marg{end angle}\marg{first axis}\marg{second axis}}
+ This command is similar to |\pgfpatharc|. The main difference is how the
+ ellipse or circle is specified from which the arc is taken. The two
+ parameters \meta{first axis} and \meta{second axis} are the $0^\circ$-axis
+ and the $90^\circ$-axis of the ellipse from which the path is taken. Thus,
+ |\pgfpatharc{0}{90}{1cm and 2cm}| has the same effect as
+ %
+\begin{verbatim}
+\pgfpatharcaxes{0}{90}{\pgfpoint{1cm}{0cm}}{\pgfpoint{0cm}{2cm}}
+\end{verbatim}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2cm,5mm) (0,0) -- (0cm,1cm);
+
+ \pgfpathmoveto{\pgfpoint{2cm}{5mm}}
+ \pgfpatharcaxes{0}{90}{\pgfpoint{2cm}{5mm}}{\pgfpoint{0cm}{1cm}}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpatharcto\marg{x-radius}\marg{y-radius}\marg{rotation} \marg{large arc flag}\marg{counterclockwise flag}\\\marg{target point}}
+ This command (which directly corresponds to the arc-path command of
+ \textsc{svg}) is used to add an arc to the path that starts at the current
+ point and ends at \meta{target point}. This arc is part of an ellipse that
+ is determined in the following way: Imagine an ellipse with radii
+ \meta{x-radius} and \meta{y-radius} that is rotated around its center by
+ \meta{rotation} degrees. When you move this ellipse around in the plane,
+ there will be exactly two positions such that the two current point and the
+ target point lie on the border of the ellipse (excluding pathological
+ cases). The flags \meta{large arc flag} and \meta{clockwise flag} are then
+ used to decide which of these ellipses should be picked and which arc on
+ the picked ellipsis should be used.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \pgfpathmoveto{\pgfpoint{0mm}{20mm}}
+ \pgfpatharcto{3cm}{1cm}{0}{0}{0}{\pgfpoint{3cm}{1cm}}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Both flags are considered to be false exactly if they evaluate to |0|,
+ otherwise they are true. If the \meta{large arc flag} is true, then the
+ angle spanned by the arc will be greater than $180^\circ$, otherwise it
+ will be less than $180^\circ$. The \meta{clockwise flag} is used to
+ determine which of the two ellipses should be used: if the flag is true,
+ then the arc goes from the current point to the target point in a
+ counterclockwise direction, otherwise in a clockwise fashion.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetlinewidth{2pt}
+ % Flags 0 0: red
+ \pgfsetstrokecolor{red}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpatharcto{20pt}{10pt}{0}{0}{0}{\pgfpoint{20pt}{10pt}}
+ \pgfusepath{stroke}
+ % Flags 0 1: blue
+ \pgfsetstrokecolor{blue}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpatharcto{20pt}{10pt}{0}{0}{1}{\pgfpoint{20pt}{10pt}}
+ \pgfusepath{stroke}
+ % Flags 1 0: orange
+ \pgfsetstrokecolor{orange}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpatharcto{20pt}{10pt}{0}{1}{0}{\pgfpoint{20pt}{10pt}}
+ \pgfusepath{stroke}
+ % Flags 1 1: black
+ \pgfsetstrokecolor{black}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpatharcto{20pt}{10pt}{0}{1}{1}{\pgfpoint{20pt}{10pt}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \emph{Warning:} The internal computations necessary for this command are
+ numerically very unstable. In particular, the arc will not always really
+ end at the \meta{target coordinate}, but may be off by up to several
+ points. A more precise positioning is currently infeasible due to \TeX's
+ numerical weaknesses. The only case it works quite nicely is when the
+ resulting angle is a multiple of~$90^\circ$.
+\end{command}
+
+\begin{command}{\pgfpatharctoprecomputed\marg{center point}\marg{start angle}\marg{end angle}\marg{end point}\\\marg{x-radius}\marg{y-radius}\marg{ratio x-radius/y-radius}\marg{ratio y-radius/x-radius}}
+ A specialized arc operation which is fast and numerically stable, provided
+ a lot of information is given in advance.
+
+ In contrast to |\pgfpatharc|, it explicitly interpolates start and end
+ points.
+
+ In contrast to |\pgfpatharcto|, this routine is numerically stable and
+ quite fast since it relies on a lot of available information.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \def\cx{1.5cm}% center x
+ \def\cy{1cm}% center y
+ \def\startangle{0}%
+ \def\endangle{270}%
+ \def\a{1.5cm}% xradius
+ \def\b{0.5cm}% yradius
+ \pgfmathparse{\a/\b}\let\abratio=\pgfmathresult
+ \pgfmathparse{\b/\a}\let\baratio=\pgfmathresult
+ %
+ % start point:
+ \pgfpathmoveto{\pgfpoint{\cx+\a*cos(\startangle)}{\cy+\b*sin(\startangle)}}%
+ \pgfpatharctoprecomputed
+ {\pgfpoint{\cx}{\cy}}
+ {\startangle}
+ {\endangle}
+ {\pgfpoint{\cx+\a*cos(\endangle)}{\cy+\b*sin(\endangle)}}% end point
+ {\a}
+ {\b}
+ {\abratio}
+ {\baratio}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{command}{\pgfpatharctomaxstepsize}
+ The quality of arc approximation taken by |\pgfpatharctoprecomputed| by
+ means of Bézier splines is controlled by a mesh width, which is
+ initially
+
+ |\def\pgfpatharctoprecomputed{45}|.
+
+ The mesh width is provided in (full!) degrees. The smaller the mesh
+ width, the more precise the arc approximation.
+
+ Use an empty value to disable spline approximation (uses a single cubic
+ polynomial for the complete arc).
+
+ The value must be an integer!
+ \end{command}
+\end{command}
+
+\begin{command}{\pgfpathellipse\marg{center}\marg{first axis}\marg{second axis}}
+ The effect of this command is to append an ellipse to the current path (if
+ the path is not empty, a new part is started). The ellipse's center will be
+ \meta{center} and \meta{first axis} and \meta{second axis} are the axis
+ \emph{vectors}. The same effect as this command can also be achieved using
+ an appropriate sequence of move-to, arc, and close operations, but this
+ command is easier and faster.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathellipse{\pgfpoint{1cm}{0cm}}
+ {\pgfpoint{1.5cm}{0cm}}
+ {\pgfpoint{0cm}{1cm}}
+ \pgfusepath{draw}
+ \color{red}
+ \pgfpathellipse{\pgfpoint{1cm}{0cm}}
+ {\pgfpoint{1cm}{1cm}}
+ {\pgfpoint{-0.5cm}{0.5cm}}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+
+ The command will apply coordinate transformations to all coordinates of the
+ ellipse. However, the coordinate transformations are applied only after the
+ ellipse is ``finished conceptually''. Thus, a transformation of 1cm to the
+ right will simply shift the ellipse one centimeter to the right; it will
+ not add 1cm to the $x$-coordinates of the two axis vectors.
+
+ The command will update the bounding box of the current path and picture,
+ if necessary.
+\end{command}
+
+\begin{command}{\pgfpathcircle\marg{center}\marg{radius}}
+ A shorthand for |\pgfpathellipse| applied to \meta{center} and the two axis
+ vectors $(\meta{radius},0)$ and $(0,\meta{radius})$.
+\end{command}
+
+
+\subsection{Rectangle Path Operations}
+
+Another shape that arises frequently is the rectangle. Two commands can be used
+to add a rectangle to the current path. Both commands will start a new part of
+the path.
+
+\begin{command}{\pgfpathrectangle\marg{corner}\marg{diagonal vector}}
+ Adds a rectangle to the path whose one corner is \meta{corner} and whose
+ opposite corner is given by $\meta{corner} + \meta{diagonal vector}$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathrectangle{\pgfpoint{1cm}{0cm}}{\pgfpoint{1.5cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{1.5cm}{0.25cm}}{\pgfpoint{1.5cm}{1cm}}
+ \pgfpathrectangle{\pgfpoint{2cm}{0.5cm}}{\pgfpoint{1.5cm}{1cm}}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The command will apply coordinate transformations and update the bounding
+ boxes tightly.
+\end{command}
+
+\begin{command}{\pgfpathrectanglecorners\marg{corner}\marg{opposite corner}}
+ Adds a rectangle to the path whose two opposing corners are \meta{corner}
+ and \meta{opposite corner}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathrectanglecorners{\pgfpoint{1cm}{0cm}}{\pgfpoint{1.5cm}{1cm}}
+ \pgfusepath{draw}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The command will apply coordinate transformations and update the bounding
+ boxes tightly.
+\end{command}
+
+
+\subsection{The Grid Path Operation}
+
+\begin{command}{\pgfpathgrid\oarg{options}\marg{first corner}\marg{second corner}}
+ Appends a grid to the current path. That is, a (possibly large) number of
+ parts are added to the path, each part consisting of a single horizontal or
+ vertical straight line segment.
+
+ Conceptually, the origin is part of the grid and the grid is clipped to the
+ rectangle specified by the \meta{first corner} and the \meta{second
+ corner}. However, no clipping occurs (this command just adds parts to the
+ current path) and the points where the lines enter and leave the ``clipping
+ area'' are computed and used to add simple lines to the current path.
+
+ The following keys influence the grid:
+ %
+ \begin{key}{/pgf/stepx=\meta{dimension} (initially 1cm)}
+ The horizontal stepping.
+ \end{key}
+ %
+ \begin{key}{/pgf/stepy=\meta{dimension} (initially 1cm)}
+ The vertical stepping.
+ \end{key}
+ %
+ \begin{key}{/pgf/step=\meta{vector}}
+ Sets the horizontal stepping to the $x$-coordinate of \meta{vector} and
+ the vertical stepping to its $y$-coordinate.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetlinewidth{0.8pt}
+ \pgfpathgrid[step={\pgfpoint{1cm}{1cm}}]
+ {\pgfpoint{-3mm}{-3mm}}{\pgfpoint{33mm}{23mm}}
+ \pgfusepath{stroke}
+ \pgfsetlinewidth{0.4pt}
+ \pgfpathgrid[stepx=1mm,stepy=1mm]
+ {\pgfpoint{-1.5mm}{-1.5mm}}{\pgfpoint{31.5mm}{21.5mm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The command will apply coordinate transformations and update the bounding
+ boxes. As for ellipses, the transformations are applied to the
+ ``conceptually finished'' grid.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgftransformrotate{10}
+ \pgfpathgrid[stepx=1mm,stepy=2mm]{\pgfpoint{0mm}{0mm}}{\pgfpoint{30mm}{30mm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{The Parabola Path Operation}
+
+\begin{command}{\pgfpathparabola\marg{bend vector}\marg{end vector}}
+ This command appends two half-parabolas to the current path. The first
+ starts at the current point and ends at the current point plus \meta{bend
+ vector}. At this point, it has its bend. The second half parabola starts at
+ that bend point and ends at point that is given by the bend plus \meta{end
+ vector}.
+
+ If you set \meta{end vector} to the null vector, you append only a half
+ parabola that goes from the current point to the bend; by setting
+ \meta{bend vector} to the null vector, you append only a half parabola that
+ goes through the current point and \meta{end vector} and has its bend at
+ the current point.
+
+ It is not possible to use this command to draw a part of a parabola that
+ does not contain the bend.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ % Half-parabola going ``up and right''
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathparabola{\pgfpointorigin}{\pgfpoint{2cm}{4cm}}
+ \color{red}
+ \pgfusepath{stroke}
+
+ % Half-parabola going ``down and right''
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathparabola{\pgfpoint{-2cm}{4cm}}{\pgfpointorigin}
+ \color{blue}
+ \pgfusepath{stroke}
+
+ % Full parabola
+ \pgfpathmoveto{\pgfpoint{-2cm}{2cm}}
+ \pgfpathparabola{\pgfpoint{1cm}{-1cm}}{\pgfpoint{2cm}{4cm}}
+ \color{orange}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The command will apply coordinate transformations and update the bounding
+ boxes.
+\end{command}
+
+
+\subsection{Sine and Cosine Path Operations}
+
+Sine and cosine curves often need to be drawn and the following commands may
+help with this. However, they only allow you to append sine and cosine curves
+in intervals that are multiples of $\pi/2$.
+
+\begin{command}{\pgfpathsine\marg{vector}}
+ This command appends a sine curve in the interval $[0,\pi/2]$ to the
+ current path. The sine curve is squeezed or stretched such that the curve
+ starts at the current point and ends at the current point plus
+ \meta{vector}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,1);
+ \pgfpathmoveto{\pgfpoint{1cm}{0cm}}
+ \pgfpathsine{\pgfpoint{1cm}{1cm}}
+ \pgfusepath{stroke}
+
+ \color{red}
+ \pgfpathmoveto{\pgfpoint{1cm}{0cm}}
+ \pgfpathsine{\pgfpoint{-2cm}{-2cm}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The command will apply coordinate transformations and update the bounding
+ boxes.
+\end{command}
+
+\begin{command}{\pgfpathcosine\marg{vector}}
+ This command appends a cosine curve in the interval $[0,\pi/2]$ to the
+ current path. The curve is squeezed or stretched such that the curve starts
+ at the current point and ends at the current point plus \meta{vector}.
+ Using several sine and cosine operations in sequence allows you to produce
+ a complete sine or cosine curve
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+ \pgfpathsine{\pgfpoint{1cm}{1cm}}
+ \pgfpathcosine{\pgfpoint{1cm}{-1cm}}
+ \pgfpathsine{\pgfpoint{1cm}{-1cm}}
+ \pgfpathcosine{\pgfpoint{1cm}{1cm}}
+ \pgfsetfillcolor{yellow!80!black}
+ \pgfusepath{fill,stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The command will apply coordinate transformations and update the bounding
+ boxes.
+\end{command}
+
+
+\subsection{Plot Path Operations}
+
+There exist several commands for appending plots to a path. These commands are
+available through the module |plot|. They are documented in
+Section~\ref{section-plots}.
+
+
+\subsection{Rounded Corners}
+
+Normally, when you connect two straight line segments or when you connect two
+curves that end and start ``at different angles'', you get ``sharp corners''
+between the lines or curves. In some cases it is desirable to produce ``rounded
+corners'' instead. Thus, the lines or curves should be shortened a bit and then
+connected by arcs.
+
+\pgfname\ offers an easy way to achieve this effect, by calling the following
+two commands.
+
+\begin{command}{\pgfsetcornersarced\marg{point}}
+ This command causes all subsequent corners to be replaced by little
+ arcs. The effect of this command lasts till the end of the current
+ \TeX\ scope.
+
+ The \meta{point} dictates how large the corner arc will be. Consider a
+ corner made by two lines $l$ and~$r$ and assume that the line $l$ comes
+ first on the path. The $x$-dimension of the \meta{point} decides by how
+ much the line~$l$ will be shortened, the $y$-dimension of \meta{point}
+ decides by how much the line $r$ will be shortened. Then, the shortened
+ lines are connected by an arc.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \pgfsetcornersarced{\pgfpoint{5mm}{5mm}}
+ \pgfpathrectanglecorners{\pgfpointorigin}{\pgfpoint{3cm}{2cm}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \pgfsetcornersarced{\pgfpoint{10mm}{5mm}}
+ % 10mm entering,
+ % 5mm leaving.
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{0cm}{2cm}}
+ \pgfpathlineto{\pgfpoint{3cm}{2cm}}
+ \pgfpathcurveto
+ {\pgfpoint{3cm}{0cm}}
+ {\pgfpoint{2cm}{0cm}}
+ {\pgfpoint{1cm}{0cm}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ If the $x$- and $y$-coordinates of \meta{point} are the same and the corner
+ is a right angle, you will get a perfect quarter circle (well, not quite
+ perfect, but perfect up to six decimals). When the angle is not $90^\circ$,
+ you only get a fair approximation.
+
+ More or less ``all'' corners will be rounded, even the corner generated by
+ a |\pgfpathclose| command. (The author is a bit proud of this feature.)
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetcornersarced{\pgfpoint{4pt}{4pt}}
+ \pgfpathmoveto{\pgfpointpolar{0}{1cm}}
+ \pgfpathlineto{\pgfpointpolar{72}{1cm}}
+ \pgfpathlineto{\pgfpointpolar{144}{1cm}}
+ \pgfpathlineto{\pgfpointpolar{216}{1cm}}
+ \pgfpathlineto{\pgfpointpolar{288}{1cm}}
+ \pgfpathclose
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ To return to normal (unrounded) corners, use
+ |\pgfsetcornersarced{\pgfpointorigin}|.
+
+ Note that the rounding will produce strange and undesirable effects if the
+ lines at the corners are too short. In this case the shortening may cause
+ the lines to ``suddenly extend over the other end'' which is rarely
+ desirable.
+\end{command}
+
+
+\subsection{Internal Tracking of Bounding Boxes for Paths and Pictures}
+\label{section-bb}
+
+\makeatletter
+
+The path construction commands keep track of two bounding boxes: One for the
+current path, which is reset whenever the path is used and thereby flushed, and
+a bounding box for the current |{pgfpicture}|.
+
+\begin{command}{\pgfresetboundingbox}
+ Resets the picture's bounding box. The picture will simply forget any
+ previous bounding box updates and start collecting from scratch.
+
+ You can use this together with |\pgfusepath{use as bounding box}| to
+ replace the bounding box by the one of a particular path (ignoring
+ subsequent paths).
+\end{command}
+
+The bounding boxes are not accessible by ``normal'' macros. Rather, two sets of
+four dimension variables are used for this, all of which contain the
+letter~|@|.
+
+\begin{textoken}{\pgf@pathminx}
+ The minimum $x$-coordinate ``mentioned'' in the current path. Initially,
+ this is set to $16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@pathmaxx}
+ The maximum $x$-coordinate ``mentioned'' in the current path. Initially,
+ this is set to $-16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@pathminy}
+ The minimum $y$-coordinate ``mentioned'' in the current path. Initially,
+ this is set to $16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@pathmaxy}
+ The maximum $y$-coordinate ``mentioned'' in the current path. Initially,
+ this is set to $-16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@picminx}
+ The minimum $x$-coordinate ``mentioned'' in the current picture. Initially,
+ this is set to $16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@picmaxx}
+ The maximum $x$-coordinate ``mentioned'' in the current picture. Initially,
+ this is set to $-16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@picminy}
+ The minimum $y$-coordinate ``mentioned'' in the current picture. Initially,
+ this is set to $16000$pt.
+\end{textoken}
+
+\begin{textoken}{\pgf@picmaxy}
+ The maximum $y$-coordinate ``mentioned'' in the current picture. Initially,
+ this is set to $-16000$pt.
+\end{textoken}
+
+
+Each time a path construction command is called, the above variables are
+(globally) updated. To facilitate this, you can use the following command:
+
+\begin{command}{\pgf@protocolsizes\marg{x-dimension}\marg{y-dimension}}
+ Updates all of the above dimensions in such a way that the point specified
+ by the two arguments is inside both bounding boxes. For the picture's
+ bounding box this updating occurs only if |\ifpgf@relevantforpicturesize|
+ is true, see below.
+\end{command}
+
+For the bounding box of the picture it is not always desirable that every path
+construction command affects this bounding box. For example, if you have just
+used a clip command, you do not want anything outside the clipping area to
+affect the bounding box. For this reason, there exists a special ``\TeX\ if''
+that (locally) decides whether updating should be applied to the picture's
+bounding box. Clipping will set this if to false, as will certain other
+commands.
+
+\begin{command}{\pgf@relevantforpicturesizefalse}
+ Suppresses updating of the picture's bounding box.
+\end{command}
+
+\begin{command}{\pgf@relevantforpicturesizetrue}
+ Causes updating of the picture's bounding box.
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-patterns.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-patterns.tex
new file mode 100644
index 0000000000..a8f85fb4cf
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-patterns.tex
@@ -0,0 +1,233 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Patterns}
+\label{section-patterns}
+
+\subsection{Overview}
+
+There are many ways of filling a path. First, you can fill it using a solid
+color and this is also the fastest method. Second, you can also fill it using a
+shading, which means that the color changes smoothly between two (or more)
+different colors. Third, you can fill it using a tiling pattern and it is
+explained in the following how this is done.
+
+A tiling pattern can be imagined as a rectangular tile (hence the name) on
+which a small picture is painted. There is not a single tile, but
+(conceptually) an infinite number of tiles, all showing the same picture, and
+these tiles are arranged horizontally and vertically to fill the plane. When
+you use a tiling pattern to fill a path, what happens is that the path clips
+out a ``window'' through which we see part of this infinite plane.
+
+Patterns come in two versions: \emph{inherently colored patterns} and
+\emph{form-only patterns}. (These are often called ``color patterns'' and
+``uncolored patterns'', but these names are misleading since uncolored patterns
+do have a color and the color changes. As I said, the name is misleading\dots)
+An inherently colored pattern is just a colored tile like, say, a red star with
+a black outline. A form-only pattern can be imagined as a tile that is a kind
+of rubber stamp. When this pattern is used, the stamp is used to print copies
+of the stamp picture onto the plane, but we can use a different stamp color
+each time we use a form-only pattern.
+
+\pgfname\ provides a special support for patterns. You can declare a pattern
+and then use it very much like a fill color. \pgfname\ directly maps patterns
+to the pattern facilities of the underlying graphic languages (PostScript,
+\textsc{pdf}, and \textsc{svg}). This means that filling a path using a pattern
+will be nearly as fast as if you used a uniform color.
+
+There are a number of pitfalls and restrictions when using patterns. First,
+once a pattern has been declared, you cannot change it anymore. In particular,
+it is not possible to enlarge it or change the line width. Such flexibility
+would require that the repeating of the pattern were not done by the graphic
+language, but on the \pgfname\ level. This would make patterns orders of
+magnitude slower to produce and to render. However, \pgfname{} does provide a
+more-or-less successful emulation of ``mutable'' patterns, although internally,
+a new (fixed) instance of a pattern is declared when the parameters of a
+pattern change.
+
+Second, the phase of patterns is not well-defined, that is, it is not clear
+where the origin of the ``first'' tile is. To be more precise, PostScript and
+\textsc{pdf} on the one hand and \textsc{svg} on the other hand define the
+origin differently. PostScript and \textsc{pdf} define a fixed origin that is
+independent of where the path lies. This has the highly desirable effect that
+if you use the same pattern to fill multiple paths, the outcome is the same as
+if you had filled a single path consisting of the union of all these paths. By
+comparison, \textsc{svg} uses the upper-left (?) corner of the path to be
+filled as the origin. However, the \textsc{svg} specification is a bit vague on
+this question.
+
+
+\subsection{Declaring a Pattern}
+
+Before a pattern can be used, it must be declared. The following command is
+used for this:
+
+\begin{command}{\pgfdeclarepatternformonly%
+ \opt{\oarg{variables}}%
+ \marg{name}%
+ \marg{bottom left}%
+ \marg{top right}%
+ \marg{tile size}%
+ \marg{code}%
+}
+ This command declares a new form-only pattern. The \meta{name} is a name
+ for later reference. The two parameters \meta{lower left} and \meta{upper
+ right} must describe a bounding box that is large enough to encompass the
+ complete tile.
+
+ The size of a tile is given by \meta{tile size}, that is, a tile is a
+ rectangle whose lower left corner is the origin and whose upper right
+ corner is given by \meta{tile size}. This might make you wonder why the
+ second and third parameters are needed. First, the bounding box might be
+ smaller than the tile size if the tile is larger than the picture on the
+ tile. Second, the bounding box might be bigger, in which case the picture
+ will ``bleed'' over the tile.
+
+ The \meta{code} should be \pgfname\ code than can be protocolled. It should
+ not contain any color code.
+ %
+\begin{codeexample}[]
+\pgfdeclarepatternformonly{stars}
+{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
+{\pgfpoint{1cm}{1cm}}
+{
+ \pgftransformshift{\pgfpoint{.5cm}{.5cm}}
+ \pgfpathmoveto{\pgfpointpolar{0}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{144}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{288}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{72}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{216}{4mm}}
+ \pgfpathclose%
+ \pgfusepath{fill}
+}
+\begin{tikzpicture}
+ \filldraw[pattern=stars] (0,0) rectangle (1.5,2);
+ \filldraw[pattern=stars,pattern color=red]
+ (1.5,0) rectangle (3,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ The optional argument \meta{variables} consists of a comma separated list
+ of macros, registers or keys, representing the parameters of the pattern
+ that may vary. If a variable is a key, then the full path name must be used
+ (specifically, it must start with |/|). As an example, a list might look
+ like the following: |\mymacro,\mydimen,/pgf/my key|. Note that macros and
+ keys should be ``simple''. They should only store values in themselves.
+
+ The effect of \meta{variables}, is the following: Normally, when this
+ argument is empty, once a pattern has been declared, it becomes ``frozen''.
+ This means that it is not possible to enlarge the pattern or change the
+ line width later on. By specifying \meta{variables}, no pattern is actually
+ created. Instead, the arguments are stored away (so the macros, registers
+ or keys do not have to be defined in advance).
+
+ When the fill pattern is set, \pgfname{} checks if the pattern has already
+ been created with the \meta{variables} set to their current values
+ (\pgfname{} is usually ``smart enough'' to distinguish between macros,
+ registers and keys). If so, this already-declared-pattern is used as the
+ fill pattern. If not, a new instance of the pattern (which will have a
+ unique internal name) is declared using the current values of
+ \meta{variables}. These values are then saved and the fill pattern set
+ accordingly.
+
+ The following shows an example of a pattern which varies according to the
+ values of the macro |\size|, the key |/tikz/radius|, and the \TeX{}
+ dimension |\thickness|.
+ %
+\begin{codeexample}[]
+\pgfdeclarepatternformonly[/tikz/radius,\thickness,\size]{rings}
+{\pgfpoint{-0.5*\size}{-0.5*\size}}
+{\pgfpoint{0.5*\size}{0.5*\size}}
+{\pgfpoint{\size}{\size}}
+{
+ \pgfsetlinewidth{\thickness}
+ \pgfpathcircle\pgfpointorigin{\pgfkeysvalueof{/tikz/radius}}
+ \pgfusepath{stroke}
+}
+\newdimen\thickness
+\tikzset{
+ radius/.initial=4pt,
+ size/.store in=\size, size=20pt,
+ thickness/.code={\thickness=#1},
+ thickness=0.75pt
+}
+\begin{tikzpicture}[rings/.style={pattern=rings}]
+ \filldraw [rings, radius=2pt, size=6pt] (0,0) rectangle +(1.5,2);
+ \filldraw [rings, radius=2pt, size=8pt] (2,0) rectangle +(1.5,2);
+ \filldraw [rings, radius=6pt, thickness=2pt] (0,2.5) rectangle +(1.5,2);
+ \filldraw [rings, radius=8pt, thickness=4pt] (2,2.5) rectangle +(1.5,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfdeclarepatterninherentlycolored
+ \opt{\oarg{variables}}
+ \marg{name}
+ \marg{lower left}
+ \marg{upper right}
+ \marg{tile size}
+ \marg{code}%
+}
+ This command works like |\pgfdeclarepatternuncolored|, only the pattern
+ will have an inherent color. To set the color, you should use \pgfname's
+ color commands, not the |\color| command, since this fill is not
+ protocolled.
+ %
+\begin{codeexample}[]
+\pgfdeclarepatterninherentlycolored{green stars}
+{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
+{\pgfpoint{1cm}{1cm}}
+{
+ \pgfsetfillcolor{green!50!black}
+ \pgftransformshift{\pgfpoint{.5cm}{.5cm}}
+ \pgfpathmoveto{\pgfpointpolar{0}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{144}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{288}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{72}{4mm}}
+ \pgfpathlineto{\pgfpointpolar{216}{4mm}}
+ \pgfpathclose%
+ \pgfusepath{stroke,fill}
+}
+\begin{tikzpicture}
+ \filldraw[pattern=green stars] (0,0) rectangle (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Setting a Pattern}
+
+Once a pattern has been declared, it can be used.
+
+\begin{command}{\pgfsetfillpattern\marg{name}\marg{color}}
+ This command specifies that paths that are filled should be filled with the
+ ``color'' by the pattern \meta{name}. For an inherently colored pattern,
+ the \meta{color} parameter is ignored. For form-only patterns, the
+ \meta{color} parameter specifies the color to be used for the pattern.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetfillpattern{stars}{red}
+ \filldraw (0,0) rectangle (1.5,2);
+
+ \pgfsetfillpattern{green stars}{red}
+ \filldraw (1.5,0) rectangle (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-plots.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-plots.tex
new file mode 100644
index 0000000000..4e4bac2faf
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-plots.tex
@@ -0,0 +1,588 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Creating Plots}
+\label{section-plots}
+
+This section describes the |plot| module.
+
+\begin{pgfmodule}{plot}
+ This module provides a set of commands that are intended to make it
+ reasonably easy to plot functions using \pgfname. It is loaded
+ automatically by |pgf|, but you can load it manually if you have only
+ included |pgfcore|.
+\end{pgfmodule}
+
+
+\subsection{Overview}
+
+There are different reasons for using \pgfname\ for creating plots rather than
+some more powerful program such as \textsc{gnuplot} or \textsc{mathematica}, as
+discussed in Section~\ref{section-why-pgname-for-plots}. So, let us assume that
+-- for whatever reason -- you wish to use \pgfname\ for generating a plot.
+
+\pgfname\ (conceptually) uses a two-stage process for generating plots. First,
+a \emph{plot stream} must be produced. This stream consists (more or less) of a
+large number of coordinates. Second a \emph{plot handler} is applied to the
+stream. A plot handler ``does something'' with the stream. The standard handler
+will issue line-to operations to the coordinates in the stream. However, a
+handler might also try to issue appropriate curve-to operations in order to
+smooth the curve. A handler may even do something else entirely, like writing
+each coordinate to another stream, thereby duplicating the original stream.
+
+Both for the creation of streams and the handling of streams different sets of
+commands exist. The commands for creating streams start with |\pgfplotstream|,
+the commands for setting the handler start with |\pgfplothandler|.
+
+
+\subsection{Generating Plot Streams}
+
+\subsubsection{Basic Building Blocks of Plot Streams}
+
+A \emph{plot stream} is a (long) sequence of the following commands:
+%
+\begin{enumerate}
+ \item |\pgfplotstreamstart|,
+ \item |\pgfplotstreampoint|,
+ \item |\pgfplotstreampointoutlier|,
+ \item |\pgfplotstreampointundefined|,
+ \item |\pgfplotstreamnewdataset|,
+ \item |\pgfplotstreamspecial|, and
+ \item |\pgfplotstreamend|.
+\end{enumerate}
+%
+Between calls of these commands arbitrary other code may be called. Obviously,
+the stream should start with the first command and end with the last command.
+Here is an example of a plot stream:
+%
+\begin{codeexample}[code only]
+\pgfplotstreamstart
+\pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+\newdimen\mydim
+\mydim=2cm
+\pgfplotstreampoint{\pgfpoint{\mydim}{2cm}}
+\advance \mydim by 3cm
+\pgfplotstreampoint{\pgfpoint{\mydim}{2cm}}
+\pgfplotstreamend
+\end{codeexample}
+
+Streams are \emph{global}, meaning that they are not influenced by \TeX\
+groups.
+
+\begin{command}{\pgfplotstreamstart}
+ This command signals that a plot stream starts. The effect of this command
+ is to call the internal command |\pgf@plotstreamstart|, which is set by the
+ current plot handler to do whatever needs to be done at the beginning of
+ the plot. It will also reset the meaning of the internal commands like
+ |\pgf@plotstreampoint| to the initial setting for the plot handler (what
+ this means will be explained in a moment).
+\end{command}
+
+\begin{command}{\pgfplotstreampoint\marg{point}}
+ This command adds a \meta{point} to the current plot stream. The effect of
+ this command is to call the internal command |\pgf@plotstreampoint|, which
+ is also set by the current plot handler. This command should now ``handle''
+ the point in some sensible way. For example, a line-to command might be
+ issued for the point.
+
+ When a plot handler is installed, it will setup the internal command
+ |\pgf@plotstreampoint| in some way. It is permissible to change the meaning
+ of this internal command during a stream. For instance, a handler might
+ setup |\pgf@plotstreampoint| in some sensible way for the first point and
+ then redefine it so that subsequent points are handled in some other way.
+
+ As mentioned earlier, the |\pgfplotstreamstart| will always reset the
+ definition of the internal command to the initial meaning it had when the
+ handler was installed. This is true for the other commands mentioned in the
+ following.
+\end{command}
+
+\begin{command}{\pgfplotstreampointoutlier\marg{point}}
+ An \emph{outlier} is a point that is ``out of bounds'' in some way. For
+ instance, it might have very large coordinates or the coordinates might
+ just be outside some specified range. Nevertheless, an outlier is still a
+ well-defined point. This command is issued, for instance, by
+ \textsc{gnuplot} when a value is outside the specified range.
+
+ You can configure how outliers are treated using the following key:
+ %
+ \begin{key}{/pgf/handle outlier points in plots=\meta{how} (initially jump)}
+ \keyalias{tikz}
+ You can set \meta{how} to one of the following values:
+ %
+ \begin{itemize}
+ \item |plot| This will cause the outlier to be drawn normally, just
+ as if |\pgfplotstreampoint| had been used rather than this
+ command.
+ \item |ignore| The outlier will be completely ignored, just as if
+ the command had not been used at all.
+ \item |jump| This causes the internal macro |\pgf@plotstreamjump|
+ to be called. A ``jump'' in a stream is a position where a
+ ``gap'' is introduced. For instance, a simple line-to plot
+ handler will stop the current subpath at a jump position and
+ begin with a move-to operation at the next normal point of the
+ stream.
+
+ The net effect of this setting is that at outlier points plots
+ get interrupted and ``restarted'' when the points are no longer
+ outliers. This is usually the behaviour you will be looking
+ for.
+ \end{itemize}
+ \end{key}
+\end{command}
+
+\begin{command}{\pgfplotstreampointundefined}
+ This command indicated that the stream contains an ``undefined'' point like
+ a point where some coordinate results for a division by zero. Such a point
+ cannot be plotted, which is why it is not given as a parameter. However,
+ such a point \emph{can} result in a jump in the plot, depending on the
+ setting of the following key:
+ %
+ \begin{key}{/pgf/handle undefined points in plots=\meta{how} (initially jump)}
+ \keyalias{tikz}
+ You can set \meta{how} to one of the following values:
+ %
+ \begin{itemize}
+ \item |ignore| The undefined point will be completely ignored, just
+ as if the command had not been used at all.
+ \item |jump| This causes the internal macro |\pgf@plotstreamjump|
+ to be called.
+ \end{itemize}
+ \end{key}
+\end{command}
+
+\begin{command}{\pgfplotstreamnewdataset}
+ This command indicated that in the stream a ``new data set'' starts. So,
+ the stream does not end, but there is a logical break in the data. For
+ example, when a table is read from a file, empty lines are interpreted as
+ indicating new data sets. What happens when a new data set is encountered
+ is governed by the following key:
+ %
+ \begin{key}{/pgf/handle new data sets in plots=\meta{how} (initially jump)}
+ \keyalias{tikz}
+ You can set \meta{how} to one of the following values:
+ %
+ \begin{itemize}
+ \item |ignore| The command will be completely ignored, just as if
+ the command had not been used at all.
+ \item |jump| This causes the internal macro |\pgf@plotstreamjump|
+ to be called.
+ \end{itemize}
+ \end{key}
+\end{command}
+
+\begin{command}{\pgfplotstreamspecial\marg{text}}
+ This command causes |\pgf@plotstreamspecial| to be called with \meta{text}
+ as its parameter. This allows handler-specific information to be passed to
+ the handler. All normal handlers ignore this command.
+\end{command}
+
+\begin{command}{\pgfplotstreamend}
+ This command signals that a plot stream ends. It calls
+ |\pgf@plotstreamend|, which should now do any necessary ``cleanup''.
+\end{command}
+
+Note that plot streams are not buffered, that is, the different points are
+handled immediately. However, using the recording handler, it is possible to
+record a stream.
+
+
+\subsubsection{Commands That Generate Plot Streams}
+\label{section-plot-jumps}
+
+Plot streams can be created ``by hand'' as in the earlier example. However,
+most of the time the coordinates will be produced internally by some command.
+For example, the |\pgfplotxyfile| reads a file and converts it into a plot
+stream.
+
+\begin{command}{\pgfplotxyfile\marg{filename}}
+ This command will try to open the file \meta{filename}. If this succeeds,
+ it will convert the file contents into a plot stream as follows: A
+ |\pgfplotstreamstart| is issued. Then, for each empty line a
+ |\pgfplotstreamnewdataset| is produced. Other lines in the file should
+ start with two numbers separated by a space, such as |0.1 1| or |100 -.3|.
+ The numbers may be followed by some text, which will be ignore
+ \emph{except} if it is exactly ``|u|'' or ``|o|''. For ``|u|'' the point
+ is considered to be undefined and |\pgfplotstreampointundefined| is called.
+ For ``|o|'' the point is considered to be an outlier and
+ |\pgfplotstreampointoutlier| is called. Otherwise, each pair \meta{x} and
+ \meta{y} of numbers is converted into one plot stream point in the
+ $xy$-coordinate system. Thus, a line like
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+0 Nan u
+1 1 some text
+2 4
+3 9
+
+4 16 o
+5 25 oo
+\end{codeexample}
+ %
+ is turned into
+ %
+\begin{codeexample}[code only]
+\pgfplotstreamstart
+\pgfplotstreampointundefined
+\pgfplotstreampoint{\pgfpointxy{1}{1}}
+\pgfplotstreampoint{\pgfpointxy{2}{4}}
+\pgfplotstreampoint{\pgfpointxy{3}{9}}
+\pgfplotstreamnewdataset
+\pgfplotstreampointoutlier{\pgfpointxy{4}{16}}
+\pgfplotstreampoint{\pgfpointxy{5}{25}}
+\pgfplotstreamend
+\end{codeexample}
+ %
+ (Note that the last line is not an outlier because |oo| is not the same as
+ |o|).
+
+ The two characters |%| and |#| are also allowed in a file and they are both
+ treated as comment characters. Thus, a line starting with either of them is
+ treated as empty.
+
+ When the file has been read completely, |\pgfplotstreamend| is called.
+\end{command}
+
+\begin{command}{\pgfplotxyzfile\marg{filename}}
+ This command works like |\pgfplotxyfile|, only \emph{three} numbers are
+ expected on each non-empty line. They are converted into points in the
+ $xyz$-coordinate system. Consider, the following file:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+% Some comments
+# more comments
+2 -5 1 first entry
+2 -.2 2 o
+2 -5 2 third entry
+\end{codeexample}
+ %
+ It is turned into the following stream:
+ %
+\begin{codeexample}[code only]
+\pgfplotstreamstart
+\pgfplotstreamnewdataset
+\pgfplotstreamnewdataset
+\pgfplotstreampoint{\pgfpointxyz{2}{-5}{1}}
+\pgfplotstreampointoutlier{\pgfpointxyz{2}{-.2}{2}}
+\pgfplotstreampoint{\pgfpointxyz{2}{-5}{2}}
+\pgfplotstreamend
+\end{codeexample}
+ %
+\end{command}
+
+Currently, there is no command that can decide automatically whether the
+$xy$-coordinate system should be used or whether the $xyz$-system should be
+used. However, it would not be terribly difficult to write a ``smart file
+reader'' that parses coordinate files a bit more intelligently.
+
+\begin{command}{\pgfplotfunction\marg{variable}\marg{sample list}\marg{point}}
+ This command will produce coordinates by iterating the \meta{variable} over
+ all values in \meta{sample list}, which should be a list in the |\foreach|
+ syntax. For each value of \meta{variable}, the \meta{point} is evaluated
+ and the resulting coordinate is inserted into the plot stream.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[x=3.8cm/360]
+ \pgfplothandlerlineto
+ \pgfplotfunction{\x}{0,5,...,360}{\pgfpointxy{\x}{sin(\x)+sin(3*\x)}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[y=3cm/360]
+ \pgfplothandlerlineto
+ \pgfplotfunction{\y}{0,5,...,360}{\pgfpointxyz{sin(2*\y)}{\y}{cos(2*\y)}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ Be warned that if the expressions that need to evaluated for each point are
+ complex, then this command can be very slow.
+\end{command}
+
+\begin{command}{\pgfplotgnuplot\oarg{prefix}\marg{function}}
+ This command will ``try'' to call the \textsc{gnuplot} program to generate
+ the coordinates of the \meta{function}. In detail, the following happens:
+
+ This command works with two files: \meta{prefix}|.gnuplot| and
+ \meta{prefix}|.table|. If the optional argument \meta{prefix} is not
+ given, it is set to |\jobname|.
+
+ Let us start with the situation where none of these files exists. Then
+ \pgfname\ will first generate the file \meta{prefix}|.gnuplot|. In this
+ file it writes
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+set terminal table; set output "#1.table"; set format "%.5f"
+\end{codeexample}
+ %
+ where |#1| is replaced by \meta{prefix}. Then, in a second line, it writes
+ the text \meta{function}.
+
+ Next, \pgfname\ will try to invoke the program |gnuplot| with the argument
+ \meta{prefix}|.gnuplot|. This call may or may not succeed, depending on
+ whether the |\write18| mechanism (also known as shell escape) is switched
+ on and whether the |gnuplot| program is available.
+
+ Assuming that the call succeeded, the next step is to invoke
+ |\pgfplotxyfile| on the file \meta{prefix}|.table|; which is exactly the
+ file that has just been created by |gnuplot|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,-1) grid (4,1);
+ \pgfplothandlerlineto
+ \pgfplotgnuplot[plots/pgfplotgnuplot-example]{plot [x=0:3.5] x*sin(x)}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ The more difficult situation arises when the |.gnuplot| file exists, which
+ will be the case on the second run of \TeX\ on the \TeX\ file. In this case
+ \pgfname\ will read this file and check whether it contains exactly what
+ \pgfname\ ``would have written'' into this file. If this is not the case,
+ the file contents is overwritten with what ``should be there'' and, as
+ above, |gnuplot| is invoked to generate a new |.table| file. However, if
+ the file contents is ``as expected'', the external |gnuplot| program is
+ \emph{not} called. Instead, the \meta{prefix}|.table| file is immediately
+ read.
+
+ As explained in Section~\ref{section-tikz-gnuplot}, the net effect of the
+ above mechanism is that |gnuplot| is called as seldom as possible and that
+ when you pass along the |.gnuplot| and |.table| files with your |.tex| file
+ to someone else, that person can \TeX\ the |.tex| file without having
+ |gnuplot| installed and without having the |\write18| mechanism switched
+ on.
+
+ \begin{key}{/pgf/plot/gnuplot call=\meta{gnuplot invocation} (initially gnuplot)}
+ This key can be used to change the way gnuplot is called.
+
+ Some portable MiK\TeX{} distribution needs something like the
+ following.
+ %
+\begin{codeexample}[code only]
+ \pgfkeys{/pgf/plot/gnuplot call="/Programs/gnuplot/binary/gnuplot"}
+\end{codeexample}
+ \end{key}
+\end{command}
+
+
+\subsection{Plot Handlers}
+\label{section-plot-handlers}
+
+A \emph{plot handler} determines what ``should be done'' with a plot stream.
+You must set the plot handler before the stream starts. The following commands
+install the most basic plot handlers; more plot handlers are defined in the
+file |pgflibraryplothandlers|, which is documented in
+Section~\ref{section-library-plothandlers}.
+
+All plot handlers work by setting or redefining the following three macros:
+|\pgf@plotstreamstart|, |\pgf@plotstreampoint|, and |\pgf@plotstreamend|.
+
+\begin{command}{\pgfplothandlerlineto}
+ This handler will issue a |\pgfpathlineto| command for each point of the
+ plot, \emph{except} possibly for the first. What happens with the first
+ point can be specified using the two commands described below.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfplothandlerlineto
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{1cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{3cm}{2cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{2cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetmovetofirstplotpoint}
+ Specifies that the line-to plot handler (and also some other plot handlers)
+ should issue a move-to command for the first point of the plot instead of a
+ line-to. This will start a new part of the current path, which is not
+ always, but often, desirable. This is the default.
+\end{command}
+
+\begin{command}{\pgfsetlinetofirstplotpoint}
+ Specifies that plot handlers should issue a line-to command for the first
+ point of the plot.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfsetlinetofirstplotpoint
+ \pgfplothandlerlineto
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{1cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{3cm}{2cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{2cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerpolygon}
+ This handler works like the line-to plot handler, only the line is closed
+ at the end using |\pgfpathclose|, resulting in a polygon.
+\end{command}
+
+\begin{command}{\pgfplothandlerdiscard}
+ This handler will simply throw away the stream.
+\end{command}
+
+\begin{command}{\pgfplothandlerrecord\marg{macro}}
+ When this handler is installed, each time a plot stream command is called,
+ this command will be appended to \meta{macro}. Thus, at the end of the
+ stream, \meta{macro} will contain all the commands that were issued on the
+ stream. You can then install another handler and invoke \meta{macro} to
+ ``replay'' the stream (possibly many times).
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfplothandlerrecord{\mystream}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{1cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{3cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{2cm}}
+ \pgfplotstreamend
+ \pgfplothandlerlineto
+ \mystream
+ \pgfplothandlerclosedcurve
+ \mystream
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Defining New Plot Handlers}
+
+You can define new plot handlers using the following command:
+
+\begin{command}{\pgfdeclareplothandler\marg{macro}\marg{arguments}\marg{configuration}}
+ This command creates a new plot handler that can subsequently be called
+ using the macro \meta{macro}. This macro take the arguments given in
+ \meta{arguments}, which can be a list like |#1#2| if \meta{macro} should be
+ invoked with two arguments. Here is a typical example:
+ %
+\begin{codeexample}[code only]
+\pgfdeclareplothandler{\myhandler}{#1}{...}
+...
+\myhandler{foo}
+\pgfplotstreamstart
+...
+\pgfplotstreamend
+\end{codeexample}
+
+ The \meta{configuration} is used to define the behaviour of the handler. It
+ is a list of key--value pairs, where the following keys are allowed:
+ %
+ \begin{itemize}
+ \item |start=|\meta{code}. The \meta{code} will be executed whenever
+ |\pgfplotstreamstart| is used while the handler \meta{macro} is
+ selected. Inside the \meta{code}, you can use |#1|, |#2|, and so on
+ to refer to the parameters that were given to \meta{macro}:
+ %
+\begin{codeexample}[width=6cm]
+\pgfdeclareplothandler{\myhandler}{#1}{
+ start = Hi #1.,
+ end = Bye #1.,
+}
+\myhandler{foo}
+\pgfplotstreamstart
+\pgfplotstreamend
+\myhandler{bar}
+\pgfplotstreamstart
+\pgfplotstreamend
+\end{codeexample}
+ %
+ \item |end=|\meta{code} Works just like |start|.
+ \item |point=|\meta{code}. The \meta{code} will be executed whenever
+ |\pgfplotstreampoint| is used while the handler \meta{macro} is in
+ force. Inside the \meta{code}, you can use |#1|, |#2|, and so on to
+ refer to the arguments give to \meta{macro}, while you can use
+ |##1| to refer to the argument given to |\pgfplotstreampoint|
+ itself (this will be the coordinate).
+ %
+\begin{codeexample}[]
+\pgfdeclareplothandler{\myhandler}{#1}{
+ point=\pgfpathcircle{##1}{#1} % ##1 is the coordinate,
+ % #1 the parameter for \myhandler
+}
+\begin{pgfpicture}
+ \myhandler{1pt}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0pt}{0pt}}
+ \pgfplotstreampoint{\pgfpoint{3pt}{3pt}}
+ \pgfplotstreampoint{\pgfpoint{6pt}{3pt}}
+ \pgfplotstreampoint{\pgfpoint{9pt}{0pt}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+ \myhandler{3pt}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0pt}{0pt}}
+ \pgfplotstreampoint{\pgfpoint{9pt}{0pt}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+ The \meta{code} will also be called for
+ |\pgfplotstreampointoutlier| when this command has been configured
+ to |plot| the outliers.
+ \item |jump=|\meta{code} The \meta{code} will be called whenever a jump
+ has been requested indirectly via an outlier point, and undefined
+ point, or a new data set (for each of which the command needs to be
+ configured to |jump|). As always, inside the \meta{code} you can
+ access |#1| and so on.
+ \item |special=|\meta{code} Causes \meta{code} to be executed whenever
+ |\pgfplotstreamspecial|\marg{something} is used. Inside the
+ \meta{code}, you can access \meta{something} via |##1| and the
+ parameters of \meta{macro} as |#1|, |#2|, and so on.
+ \end{itemize}
+
+ In addition to the above keys, there exist also ``code macro versions'' of
+ them:
+ %
+ \begin{itemize}
+ \item |point macro=|\meta{some macro}. Causes |\pgfplotstreampoint| to
+ call \meta{some macro} directly (actually, |\pgf@plotstreampoint|
+ is set to be equal to \meta{some macro}). Inside the \meta{some
+ macro} you can use |#1| to access the coordinate passed to
+ |\pgfplotstreampoint| and you can no longer access the parameters
+ passed to the original call to \meta{macro} that installed the
+ handler. So, \meta{some macro} must take exactly one argument,
+ namely |#1|.
+ \item |special macro=|\meta{some macro}. As |point macro|, only for
+ specials.
+ \item |start macro=|\meta{some macro}. Causes \meta{some macro} to be
+ executed at the start. This macro, like the below ones, may not
+ take any parameters and will not have access to the parameters
+ passed to the original \meta{macro}.
+ \item |end macro=|\meta{some macro}. As above.
+ \item |jump macro=|\meta{some macro}. As above.
+ \end{itemize}
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-points.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-points.tex
new file mode 100644
index 0000000000..56f49d7e5d
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-points.tex
@@ -0,0 +1,683 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Specifying Coordinates}
+\label{section-points}
+
+\subsection{Overview}
+
+Most \pgfname\ commands expect you to provide the coordinates of a \emph{point}
+(also called \emph{coordinate}) inside your picture. Points are always
+``local'' to your picture, that is, they never refer to an absolute position on
+the page, but to a position inside the current |{pgfpicture}| environment. To
+specify a coordinate you can use commands that start with |\pgfpoint|.
+
+
+\subsection{Basic Coordinate Commands}
+
+The following commands are the most basic for specifying a coordinate.
+
+\begin{command}{\pgfpoint\marg{x coordinate}\marg{y coordinate}}
+ Yields a point location. The coordinates are given as \TeX\ dimensions.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathcircle{\pgfpoint{1cm}{1cm}} {2pt}
+ \pgfpathcircle{\pgfpoint{2cm}{5pt}} {2pt}
+ \pgfpathcircle{\pgfpoint{0pt}{.5in}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointorigin}
+ Yields the origin. Same as |\pgfpoint{0pt}{0pt}|.
+\end{command}
+
+\begin{command}{\pgfpointpolar\marg{degree}{\ttfamily\char`\{}\meta{radius}\opt{|/|\meta{y-radius}}{\ttfamily\char`\}}}
+ Yields a point location given in polar coordinates. You can specify the
+ angle only in degrees, radians are not supported, currently.
+
+ If the optional \meta{y-radius} is given, the polar coordinate is actually
+ a coordinate on an ellipse whose $x$-radius is given by \meta{radius} and
+ whose $y$-radius is given by \meta{y-radius}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \foreach \angle in {0,10,...,90}
+ {\pgfpathcircle{\pgfpointpolar{\angle}{1cm}}{2pt}}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \foreach \angle in {0,10,...,90}
+ {\pgfpathcircle{\pgfpointpolar{\angle}{1cm and 2cm}}{2pt}}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Coordinates in the XY-Coordinate System}
+
+Coordinates can also be specified as multiples of an $x$-vector and a
+$y$-vector. Normally, the $x$-vector points one centimeter in the $x$-direction
+and the $y$-vector points one centimeter in the $y$-direction, but using the
+commands |\pgfsetxvec| and |\pgfsetyvec| they can be changed. Note that the
+$x$- and $y$-vector do not necessarily point ``horizontally'' and
+``vertically''.
+
+\begin{command}{\pgfpointxy\marg{$s_x$}\marg{$s_y$}}
+ Yields a point that is situated at $s_x$ times the $x$-vector plus $s_y$
+ times the $y$-vector.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpointxy{1}{0}}
+ \pgfpathlineto{\pgfpointxy{2}{2}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetxvec\marg{point}}
+ Sets that current $x$-vector for usage in the $xyz$-coordinate system.
+ \example
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \pgfpathmoveto{\pgfpointxy{1}{0}}
+ \pgfpathlineto{\pgfpointxy{2}{2}}
+ \pgfusepath{stroke}
+
+ \color{red}
+ \pgfsetxvec{\pgfpoint{0.75cm}{0cm}}
+ \pgfpathmoveto{\pgfpointxy{1}{0}}
+ \pgfpathlineto{\pgfpointxy{2}{2}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetyvec\marg{point}}
+ Works like |\pgfsetxvec|.
+\end{command}
+
+\begin{command}{\pgfpointpolarxy\marg{degree}{\ttfamily\char`\{}\meta{radius}\opt{|/|\meta{y-radius}}{\ttfamily\char`\}}}
+ This command is similar to the |\pgfpointpolar| command, but the
+ \meta{radius} is now a factor to be interpreted in the $xy$-coordinate
+ system. This means that a degree of |0| is the same as the $x$-vector of
+ the $xy$-coordinate system times \meta{radius} and a degree of |90| is the
+ $y$-vector times \meta{radius}. As for |\pgfpointpolar|, a \meta{radius}
+ can also be a pair separated by a slash. In this case, the $x$- and
+ $y$-vectors are multiplied by different factors.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \begin{scope}[x={(1cm,-5mm)},y=1.5cm]
+ \foreach \angle in {0,10,...,90}
+ {\pgfpathcircle{\pgfpointpolarxy{\angle}{1}}{2pt}}
+ \pgfusepath{fill}
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Three Dimensional Coordinates}
+
+It is also possible to specify a point as a multiple of three vectors, the
+$x$-, $y$-, and $z$-vector. This is useful for creating simple three
+dimensional graphics.
+
+\begin{command}{\pgfpointxyz\marg{$s_x$}\marg{$s_y$}\marg{$s_z$}}
+ Yields a point that is situated at $s_x$ times the $x$-vector plus $s_y$
+ times the $y$-vector plus $s_z$ times the $z$-vector.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetarrowsend{to}
+
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpointxyz{0}{0}{1}}
+ \pgfusepath{stroke}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpointxyz{0}{1}{0}}
+ \pgfusepath{stroke}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpointxyz{1}{0}{0}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetzvec\marg{point}}
+ Works like |\pgfsetxvec|.
+\end{command}
+
+Inside the $xyz$-coordinate system, you can also specify points using spherical
+and cylindrical coordinates.
+
+\begin{command}{\pgfpointcylindrical\marg{degree}\marg{radius}\marg{height}}
+ This command yields the same as
+ %
+\begin{verbatim}
+\pgfpointadd{\pgfpointpolarxy{degree}{radius}}{\pgfpointxyz{0}{0}{height}}
+\end{verbatim}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [->] (0,0) -- (1,0,0) node [right] {$x$};
+ \draw [->] (0,0) -- (0,1,0) node [above] {$y$};
+ \draw [->] (0,0) -- (0,0,1) node [below left] {$z$};
+
+ \pgfpathcircle{\pgfpointcylindrical{80}{1}{.5}}{2pt}
+ \pgfusepath{fill}
+
+ \draw[red] (0,0) -- (0,0,.5) -- +(80:1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointspherical\marg{longitude}\marg{latitude}\marg{radius}}
+ This command yields a point ``on the surface of the earth'' specified by
+ the \meta{longitude} and the \meta{latitude}. The radius of the earth is
+ given by \meta{radius}. The equator lies in the $xy$-plane.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetfillcolor{lightgray}
+
+ \foreach \latitude in {-90,-75,...,30}
+ {
+ \foreach \longitude in {0,20,...,360}
+ {
+ \pgfpathmoveto{\pgfpointspherical{\longitude}{\latitude}{1}}
+ \pgfpathlineto{\pgfpointspherical{\longitude+20}{\latitude}{1}}
+ \pgfpathlineto{\pgfpointspherical{\longitude+20}{\latitude+15}{1}}
+ \pgfpathlineto{\pgfpointspherical{\longitude}{\latitude+15}{1}}
+ \pgfpathclose
+ }
+ \pgfusepath{fill,stroke}
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Building Coordinates From Other Coordinates}
+
+Many commands allow you to construct a coordinate in terms of other
+coordinates.
+
+
+\subsubsection{Basic Manipulations of Coordinates}
+
+\begin{command}{\pgfpointadd\marg{$v_1$}\marg{$v_2$}}
+ Returns the sum vector $\meta{$v_1$} + \meta{$v_2$}$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathcircle{\pgfpointadd{\pgfpoint{1cm}{0cm}}{\pgfpoint{1cm}{1cm}}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointscale\marg{factor}\marg{coordinate}}
+ Returns the vector $\meta{factor}\meta{coordinate}$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathcircle{\pgfpointscale{1.5}{\pgfpoint{1cm}{0cm}}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointdiff\marg{start}\marg{end}}
+ Returns the difference vector $\meta{end} - \meta{start}$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathcircle{\pgfpointdiff{\pgfpoint{1cm}{0cm}}{\pgfpoint{1cm}{1cm}}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointnormalised\marg{point}}
+ This command returns a normalised version of \meta{point}, that is, a
+ vector of length 1pt pointing in the direction of \meta{point}. If
+ \meta{point} is the $0$-vector or extremely short, a vector of length 1pt
+ pointing upwards is returned.
+
+ This command is \emph{not} implemented by calculating the length of the
+ vector, but rather by calculating the angle of the vector and then using
+ (something equivalent to) the |\pgfpointpolar| command. This ensures that
+ the point will really have length 1pt, but it is not guaranteed that the
+ vector will \emph{precisely} point in the direction of \meta{point} due to
+ the fact that the polar tables are accurate only up to one degree.
+ Normally, this is not a problem.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathcircle{\pgfpoint{2cm}{1cm}}{2pt}
+ \pgfpathcircle{\pgfpointscale{20}
+ {\pgfpointnormalised{\pgfpoint{2cm}{1cm}}}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Points Traveling along Lines and Curves}
+\label{section-pointsattime}
+
+The commands in this section allow you to specify points on a line or a curve.
+Imagine a point ``traveling'' along a curve from some point $p$ to another
+point $q$. At time $t=0$ the point is at $p$ and at time $t=1$ it is at $q$ and
+at time, say, $t=1/2$ it is ``somewhere in the middle''. The exact location at
+time $t=1/2$ will not necessarily be the ``halfway point'', that is, the point
+whose distance on the curve from $p$ and $q$ is equal. Rather, the exact
+location will depend on the ``speed'' at which the point is traveling, which in
+turn depends on the lengths of the support vectors in a complicated manner. If
+you are interested in the details, please see a good book on Bézier curves.
+
+\begin{command}{\pgfpointlineattime\marg{time $t$}\marg{point $p$}\marg{point $q$}}
+ Yields a point that is the $t$th fraction between $p$ and~$q$, that is, $p
+ + t(q-p)$. For $t=1/2$ this is the middle of $p$ and $q$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{2cm}{2cm}}
+ \pgfusepath{stroke}
+ \foreach \t in {0,0.25,...,1.25}
+ {\pgftext[at=
+ \pgfpointlineattime{\t}{\pgfpointorigin}{\pgfpoint{2cm}{2cm}}]{\t}}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointlineatdistance\marg{distance}\marg{start point}\marg{end point}}
+ Yields a point that is located \meta{distance} many units away from the
+ start point in the direction of the end point. In other words, this is the
+ point that results if we travel \meta{distance} steps from \meta{start
+ point} towards \meta{end point}.
+ %
+ \example
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{3cm}{2cm}}
+ \pgfusepath{stroke}
+ \foreach \d in {0pt,20pt,40pt,70pt}
+ {\pgftext[at=
+ \pgfpointlineatdistance{\d}{\pgfpointorigin}{\pgfpoint{3cm}{2cm}}]{\d}}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointarcaxesattime\marg{time $t$}\marg{center}\marg{0-degree axis}\marg{90-degree axis}\marg{start angle}\\\marg{end angle}}
+ Yields a point on the arc between \meta{start angle} and \meta{end angle}
+ on an ellipse whose center is at \meta{center} and whose two principal axes
+ are \meta{0-degree axis} and \meta{90-degree axis}. For $t=0$ the point at
+ the \meta{start angle} is returned and for $t=1$ the point at the \meta{end
+ angle}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpoint{2cm}{1cm}}
+ \pgfpatharcaxes{0}{60}{\pgfpoint{2cm}{0cm}}{\pgfpoint{0cm}{1cm}}
+ \pgfusepath{stroke}
+ \foreach \t in {0,0.25,0.5,0.75,1}
+ {\pgftext[at=\pgfpointarcaxesattime{\t}{\pgfpoint{0cm}{1cm}}
+ {\pgfpoint{2cm}{0cm}}{\pgfpoint{0cm}{1cm}}{0}{60}]{\t}}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointcurveattime\marg{time $t$}\marg{point $p$}\marg{point $s_1$}\marg{point $s_2$}\marg{point $q$}}
+ Yields a point that is on the Bézier curve from $p$ to $q$ with the support
+ points $s_1$ and $s_2$. The time $t$ is used to determine the location,
+ where $t=0$ yields $p$ and $t=1$ yields $q$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{0cm}{2cm}}{\pgfpoint{3cm}{2cm}}
+ \pgfusepath{stroke}
+ \foreach \t in {0,0.25,0.5,0.75,1}
+ {\pgftext[at=\pgfpointcurveattime{\t}{\pgfpointorigin}
+ {\pgfpoint{0cm}{2cm}}
+ {\pgfpoint{0cm}{2cm}}
+ {\pgfpoint{3cm}{2cm}}]{\t}}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Points on Borders of Objects}
+
+The following commands are useful for specifying a point that lies on the
+border of special shapes. They are used, for example, by the shape mechanism to
+determine border points of shapes.
+
+\begin{command}{\pgfpointborderrectangle\marg{direction point}\marg{corner}}
+ This command returns a point that lies on the intersection of a line
+ starting at the origin and going towards the point \meta{direction point}
+ and a rectangle whose center is in the origin and whose upper right corner
+ is at \meta{corner}.
+
+ The \meta{direction point} should have length ``about 1pt'', but it will be
+ normalized automatically. Nevertheless, the ``nearer'' the length is to
+ 1pt, the less rounding errors.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,1.5);
+ \pgfpathrectanglecorners{\pgfpoint{-1cm}{-1.25cm}}{\pgfpoint{1cm}{1.25cm}}
+ \pgfusepath{stroke}
+
+ \pgfpathcircle{\pgfpoint{5pt}{5pt}}{2pt}
+ \pgfpathcircle{\pgfpoint{-10pt}{5pt}}{2pt}
+ \pgfusepath{fill}
+ \color{red}
+ \pgfpathcircle{\pgfpointborderrectangle
+ {\pgfpoint{5pt}{5pt}}{\pgfpoint{1cm}{1.25cm}}}{2pt}
+ \pgfpathcircle{\pgfpointborderrectangle
+ {\pgfpoint{-10pt}{5pt}}{\pgfpoint{1cm}{1.25cm}}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointborderellipse\marg{direction point}\marg{corner}}
+ This command works like the corresponding command for rectangles, only this
+ time the \meta{corner} is the corner of the bounding rectangle of an
+ ellipse.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,1.5);
+ \pgfpathellipse{\pgfpointorigin}{\pgfpoint{1cm}{0cm}}{\pgfpoint{0cm}{1.25cm}}
+ \pgfusepath{stroke}
+
+ \pgfpathcircle{\pgfpoint{5pt}{5pt}}{2pt}
+ \pgfpathcircle{\pgfpoint{-10pt}{5pt}}{2pt}
+ \pgfusepath{fill}
+ \color{red}
+ \pgfpathcircle{\pgfpointborderellipse
+ {\pgfpoint{5pt}{5pt}}{\pgfpoint{1cm}{1.25cm}}}{2pt}
+ \pgfpathcircle{\pgfpointborderellipse
+ {\pgfpoint{-10pt}{5pt}}{\pgfpoint{1cm}{1.25cm}}}{2pt}
+ \pgfusepath{fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Points on the Intersection of Lines}
+
+\begin{command}{\pgfpointintersectionoflines\marg{$p$}\marg{$q$}\marg{$s$}\marg{$t$}}
+ This command returns the intersection of a line going through $p$ and $q$
+ and a line going through $s$ and $t$. If the lines do not intersection, an
+ arithmetic overflow will occur.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,2);
+ \draw (.5,0) -- (2,2);
+ \draw (1,2) -- (2,0);
+ \pgfpathcircle{%
+ \pgfpointintersectionoflines
+ {\pgfpointxy{.5}{0}}{\pgfpointxy{2}{2}}
+ {\pgfpointxy{1}{2}}{\pgfpointxy{2}{0}}}
+ {2pt}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Points on the Intersection of Two Circles}
+
+\begin{command}{\pgfpointintersectionofcircles\marg{$p_1$}\marg{$p_2$}\marg{$r_1$}\marg{$r_2$}\marg{solution}}
+ This command returns the intersection of the two circles centered at $p_1$
+ and $p_2$ with radii $r_1$ and $r_2$. If \meta{solution} is |1|, the first
+ intersection is returned, otherwise the second one is returned.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,2);
+ \draw (0.5,0) circle (1);
+ \draw (1.5,1) circle (.8);
+ \pgfpathcircle{%
+ \pgfpointintersectionofcircles
+ {\pgfpointxy{.5}{0}}{\pgfpointxy{1.5}{1}}
+ {1cm}{0.8cm}{1}}
+ {2pt}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Points on the Intersection of Two Paths}
+
+\begin{pgflibrary}{intersections}
+ This library defines the below command and allows you to calculate the
+ intersections of two arbitrary paths. However, due to the low accuracy of
+ \TeX, the paths should not be ``too complicated''. In particular, you
+ should not try to intersect paths consisting of lots of very small segments
+ such as plots or decorated paths.
+\end{pgflibrary}
+
+\begin{command}{\pgfintersectionofpaths\marg{path 1}\marg{path 2}}
+ This command finds the intersection points on the paths \meta{path 1} and
+ \meta{path 2}. The number of intersection points (``solutions'') that are
+ found will be stored, and each point can be accessed afterward. The code
+ for \meta{path 1} and \meta{path 2} is executed within a \TeX{} group and
+ so can contain transformations (which will be in addition to any existing
+ transformations). The code should not use the path in any way, unless the
+ path is saved first and restored afterward. \pgfname{} will regard
+ solutions as ``a bit special'', in that the points returned will be
+ ``absolute'' and unaffected by any further transformations.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+\pgfintersectionofpaths
+{
+ \pgfpathellipse{\pgfpointxy{0}{0}}{\pgfpointxy{1}{0}}{\pgfpointxy{0}{2}}
+ \pgfgetpath\temppath
+ \pgfusepath{stroke}
+ \pgfsetpath\temppath
+}
+{
+ \pgftransformrotate{-30}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpointxy{2}{2}}
+ \pgfgetpath\temppath
+ \pgfusepath{stroke}
+ \pgfsetpath\temppath
+}
+\foreach \s in {1,...,\pgfintersectionsolutions}
+ {\pgfpathcircle{\pgfpointintersectionsolution{\s}}{2pt}}
+\pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ \begin{command}{\pgfintersectionsolutions}
+ After using the |\pgfintersectionofpaths| command, this \TeX-macro will
+ indicate the number of solutions found.
+ \end{command}
+
+ \begin{command}{\pgfpointintersectionsolution\marg{number}}
+ After using the |\pgfintersectionofpaths| command, this command will
+ return the point for solution \meta{number} or the origin if this
+ solution was not found. By default, the intersections are simply
+ returned in the order that the intersection algorithm finds them.
+ Unfortunately, this is not necessarily a ``helpful'' ordering. However
+ the following two commands can be used to order the solutions more
+ helpfully.
+ \end{command}
+
+ \let\ifpgfintersectionsortbyfirstpath=\relax
+ \begin{command}{\pgfintersectionsortbyfirstpath}
+ Using this command will mean the solutions will be sorted along
+ \meta{path 1}.
+ \end{command}
+
+ \let\ifpgfintersectionsortbysecondpath=\relax
+ \begin{command}{\pgfintersectionsortbysecondpath}
+ Using this command will mean the solutions will be sorted along
+ \meta{path 2}.
+ \end{command}
+\end{command}
+
+
+\subsection{Extracting Coordinates}
+
+There are two commands that can be used to ``extract'' the $x$- or
+$y$-coordinate of a coordinate.
+
+\begin{command}{\pgfextractx\marg{dimension}\marg{point}}
+ Sets the \TeX-\meta{dimension} to the $x$-coordinate of the point.
+ %
+\begin{codeexample}[code only]
+\newdimen\mydim
+\pgfextractx{\mydim}{\pgfpoint{2cm}{4pt}}
+%% \mydim is now 2cm
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfextracty\marg{dimension}\marg{point}}
+ Like |\pgfextractx|, except for the $y$-coordinate.
+\end{command}
+
+\begin{command}{\pgfgetlastxy\marg{macro for $x$}\marg{macro for $y$}}
+ Stores the most recently used $(x,y)$ coordinates into two macros.
+ %
+\begin{codeexample}[]
+\pgfpoint{2cm}{4cm}
+\pgfgetlastxy{\macrox}{\macroy}
+Macro $x$ is `\macrox' and macro $y$ is `\macroy'.
+\end{codeexample}
+ %
+ Since $(x,y)$ coordinates are usually assigned globally, it is safe to use
+ this command after path operations.
+\end{command}
+
+
+\subsection{Internals of How Point Commands Work}
+\label{section-internal-pointcmds}
+
+As a normal user of \pgfname\ you do not need to read this section. It is
+relevant only if you need to understand how the point commands work internally.
+
+When a command like |\pgfpoint{1cm}{2pt}| is called, all that happens is that
+the two \TeX-dimension variables |\pgf@x| and |\pgf@y| are set to |1cm| and
+|2pt|, respectively. These variables belong to the set of internal \pgfname\
+registers, see section~\ref{section-internal-registers} for details. A command
+like |\pgfpathmoveto| that takes a coordinate as parameter will just execute
+this parameter and then use the values of |\pgf@x| and |\pgf@y| as the
+coordinates to which it will move the pen on the current path.
+
+Since commands like |\pgfpointnormalised| modify other variables besides
+|\pgf@x| and |\pgf@y| during the computation of the final values of |\pgf@x|
+and |\pgf@y|, it is a good idea to enclose a call of a command like |\pgfpoint|
+in a \TeX-scope and then make the changes of |\pgf@x| and |\pgf@y| global as in
+the following example:
+ %
+\begin{codeexample}[code only]
+...
+{ % open scope
+ \pgfpointnormalised{\pgfpoint{1cm}{1cm}}
+ \global\pgf@x=\pgf@x % make the change of \pgf@x persist past the scope
+ \global\pgf@y=\pgf@y % make the change of \pgf@y persist past the scope
+}
+% \pgf@x and \pgf@y are now set correctly, all other variables are
+% unchanged
+\end{codeexample}
+
+\makeatletter
+Since this situation arises very often, the macro |\pgf@process| can
+be used to perform the above code:
+ %
+\begin{command}{\pgf@process\marg{code}}
+ Executes the \meta{code} in a scope and then makes |\pgf@x| and |\pgf@y|
+ global.
+\end{command}
+
+Note that this macro is used often internally. For this reason, it is not a
+good idea to keep anything important in the variables |\pgf@x| and |\pgf@y|
+since they will be overwritten and changed frequently. Instead, intermediate
+values can be stored in the \TeX-dimensions |\pgf@xa|, |\pgf@xb|, |\pgf@xc| and
+their |y|-counterparts |\pgf@ya|, |\pgf@yb|, |\pgf@yc|. For example, here is the
+code of the command |\pgfpointadd|:
+%
+\begin{codeexample}[code only]
+\def\pgfpointadd#1#2{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#2}%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-quick.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-quick.tex
new file mode 100644
index 0000000000..b07c3a51c4
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-quick.tex
@@ -0,0 +1,188 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Quick Commands}
+
+This section explains the ``quick'' commands of \pgfname. These commands are
+executed more quickly than the normal commands of \pgfname, but offer less
+functionality. You should use these commands only if you either have a very
+large number of commands that need to be processed or if you expect your
+commands to be executed very often.
+
+
+\subsection{Quick Coordinate Commands}
+
+\begin{command}{\pgfqpoint\marg{x}\marg{y}}
+ This command does the same as |\pgfpoint|, but \meta{x} and \meta{y} must
+ be simple dimensions like |1pt| or |1cm|. Things like |2ex| or |2cm+1pt|
+ are not allowed.
+\end{command}
+
+\begin{command}{\pgfqpointxy\marg{$s_x$}\marg{$s_y$}}
+ This command does the same as |\pgfpointxy|, but \meta{$s_x$} and
+ \meta{$s_y$} must be simple numbers without unit, like |1.234| or |5.0|.
+ Mathematical expressions or units are not allowed.
+\end{command}
+
+\begin{command}{\pgfqpointxyz\marg{$s_x$}\marg{$s_y$}\marg{$s_z$}}
+ As |\pgfqpointxy|, but for three-dimensional coordinates. Any argument
+ needs to be a number without unit.
+\end{command}
+
+\begin{command}{\pgfqpointscale\marg{factor}\marg{coordinate}}
+ As |\pgfpointscale|, but \marg{factor} must be a simple number without
+ unit, as for the other ``quick'' commands.
+\end{command}
+
+
+\subsection{Quick Path Construction Commands}
+
+The difference between the quick and the normal path commands is that the quick
+path commands
+%
+\begin{itemize}
+ \item do not keep track of the bounding boxes,
+ \item do not allow you to arc corners,
+ \item do not apply coordinate transformations.
+\end{itemize}
+
+However, they do use the soft-path subsystem (see
+Section~\ref{section-soft-paths} for details), which allows you to mix quick
+and normal path commands arbitrarily.
+
+All quick path construction commands start with |\pgfpathq|.
+
+\begin{command}{\pgfpathqmoveto\marg{x dimension}\marg{y dimension}}
+ Either starts a path or starts a new part of a path at the coordinate
+ $(\meta{x dimension},\meta{y dimension})$. The coordinate is \emph{not}
+ transformed by the current coordinate transformation matrix. However, any
+ low-level transformations apply.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformxshift{1cm}
+ \pgfpathqmoveto{0pt}{0pt} % not transformed
+ \pgfpathqlineto{1cm}{1cm} % not transformed
+ \pgfpathlineto{\pgfpoint{2cm}{0cm}}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpathqlineto\marg{x dimension}\marg{y dimension}}
+ The quick version of the line-to operation.
+\end{command}
+
+\begin{command}{\pgfpathqcurveto\marg{$s^1_x$}\marg{$s^1_y$}\marg{$s^2_x$}\marg{$s^2_y$}\marg{$t_x$}\marg{$t_y$}}
+ The quick version of the curve-to operation. The first support point is
+ $(s^1_x,s^1_y)$, the second support point is $(s^2_x,s^2_y)$, and the
+ target is $(t_x,t_y)$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathqmoveto{0pt}{0pt}
+ \pgfpathqcurveto{1cm}{1cm}{2cm}{1cm}{3cm}{0cm}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpathqcircle\marg{radius}}
+ Adds a radius around the origin of the given \meta{radius}. This command is
+ orders of magnitude faster than |\pgfcircle{\pgfpointorigin}{|\meta{radius}|}|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (1,1);
+ \pgfpathqcircle{10pt}
+ \pgfsetfillcolor{examplefill}
+ \pgfusepath{stroke,fill}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Quick Path Usage Commands}
+
+The quick path usage commands perform similar tasks as |\pgfusepath|, but they
+%
+\begin{itemize}
+ \item do not add arrows,
+ \item do not modify the path in any way, in particular,
+ \item ends are not shortened,
+ \item corners are not replaced by arcs.
+\end{itemize}
+
+Note that you \emph{have to} use the quick versions in the code of arrow tip
+definitions since, inside these definition, you obviously do not want arrows to
+be drawn.
+
+\begin{command}{\pgfusepathqstroke}
+ Strokes the path without further ado. No arrows are drawn, no corners are
+ arced.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathqcircle{5pt}
+ \pgfusepathqstroke
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfusepathqfill}
+ Fills the path without further ado.
+\end{command}
+
+\begin{command}{\pgfusepathqfillstroke}
+ Fills and then strokes the path without further ado.
+\end{command}
+
+\begin{command}{\pgfusepathqclip}
+ Clips all subsequent drawings against the current path. The path is not
+ processed.
+\end{command}
+
+
+\subsection{Quick Text Box Commands}
+
+\begin{command}{\pgfqbox\marg{box number}}
+ This command inserts a \TeX\ box into a |{pgfpicture}| by ``escaping'' to
+ \TeX, inserting the box number \meta{box number} at the origin, and then
+ returning to the typesetting the picture.
+\end{command}
+
+\begin{command}{\pgfqboxsynced\marg{box number}}
+ This command works similarly to the |\pgfqbox| command. However, before
+ inserting the text in \meta{box number}, the current coordinate
+ transformation matrix is applied to the current canvas transformation
+ matrix (is it ``synced'' with this matrix, hence the name).
+
+ Thus, this command basically has the same effect as if you first called
+ |\pgflowlevelsynccm| followed by |\pgfqbox|. However, this command will use
+ |\hskip| and |\raise| commands for the ``translational part'' of the
+ coordinate transformation matrix, instead of adding the translational part
+ to the current canvas transformation matrix directly. Both methods have the
+ same effect (box \meta{box number} is translated to where it should be),
+ but the method used by |\pgfqboxsynced| ensures that hyperlinks are placed
+ correctly. Note that scaling and rotation will not (cannot, even) apply to
+ hyperlinks.
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-scopes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-scopes.tex
new file mode 100644
index 0000000000..618ff86c66
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-scopes.tex
@@ -0,0 +1,1027 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section[Hierarchical Structures: Package, Environments, Scopes, and Text]
+ {Hierarchical Structures:\\
+ Package, Environments, Scopes, and Text}
+
+\subsection{Overview}
+
+\pgfname\ uses two kinds of hierarchical structuring: First, the package itself
+is structured hierarchically, consisting of different packages that are built
+on top of each other. Second, \pgfname\ allows you to structure your graphics
+hierarchically using environments and scopes.
+
+
+\subsubsection{The Hierarchical Structure of the Package}
+
+The \pgfname\ system consists of several layers:
+%
+\begin{description}
+ \item[System layer.]
+ The lowest layer is called the \emph{system layer}, though it might
+ also be called ``driver layer'' or perhaps ``backend layer''. Its job
+ is to provide an abstraction of the details of which driver is used to
+ transform the |.dvi| file. The system layer is implemented by the
+ package |pgfsys|, which will load appropriate driver files as needed.
+
+ The system layer is documented in Part~\ref{part-system}.
+ \item[Basic layer.]
+ The basic layer is loaded by the package |pgfcore| and subsequent use
+ of the command |\usepgfmodule| to load additional modules of the basic
+ layer.
+
+ The basic layer is documented in the present part.
+ \item[Frontend layer.]
+ The frontend layer is not loaded by a single package. Rather, different
+ packages, like \tikzname\ or \textsc{pgfpict2e}, are different
+ frontends to the basic layer.
+
+ The \tikzname\ frontend is documented in Part~\ref{part-tikz}.
+\end{description}
+
+Each layer will automatically load the necessary files of the layers below it.
+
+In addition to the packages of these layers, there are also some library
+packages. These packages provide additional definitions of things like new
+arrow tips or new plot handlers.
+
+The library packages are documented in Part~\ref{part-libraries}.
+
+
+\subsubsection{The Hierarchical Structure of Graphics}
+
+Graphics in \pgfname\ are typically structured hierarchically. Hierarchical
+structuring can be used to identify groups of graphical elements that are to be
+treated ``in the same way''. For example, you might group together a number of
+paths, all of which are to be drawn in red. Then, when you decide later on that
+you like them to be drawn in, say, blue, all you have to do is to change the
+color once.
+
+The general mechanism underlying hierarchical structuring is known as
+\emph{scoping} in computer science. The idea is that all changes to the general
+``state'' of the graphic that are done inside a scope are local to that scope.
+So, if you change the color inside a scope, this does not affect the color used
+outside the scope. Likewise, when you change the line width in a scope, the
+line width outside is not changed, and so on.
+
+There are different ways of starting and ending scopes of graphic parameters.
+Unfortunately, these scopes are sometimes ``in conflict'' with each other and
+it is sometimes not immediately clear which scopes apply. In essence, the
+following scoping mechanisms are available:
+%
+\begin{enumerate}
+ \item The ``outermost'' scope supported by \pgfname\ is the |{pgfpicture}|
+ environment. All changes to the graphic state done inside a
+ |{pgfpicture}| are local to that picture.
+
+ In general, it is \emph{not} possible to set graphic parameters
+ globally outside any |{pgfpicture}| environments. Thus, you can
+ \emph{not} say |\pgfsetlinewidth{1pt}| at the beginning of your
+ document to have a default line width of one point. Rather, you have to
+ (re)set all graphic parameters inside each |{pgfpicture}|. (If this is
+ too bothersome, try defining some macro that does the job for you.)
+ \item Inside a |{pgfpicture}| you can use a |{pgfscope}| environment to
+ keep changes of the graphic state local to that environment.
+
+ The effect of commands that change the graphic state are local to the
+ current |{pgfscope}|, but not always to the current \TeX\ group. Thus,
+ if you open a \TeX\ group (some text in curly braces) inside a
+ |{pgfscope}|, and if you change, for example, the dash pattern, the
+ effect of this changed dash pattern will persist till the end of the
+ |{pgfscope}|.
+
+ Unfortunately, this is not always the case. \emph{Some} graphic
+ parameters only persist till the end of the current \TeX\ group. For
+ example, when you use |\pgfsetarrows| to set the arrow tip inside a
+ \TeX\ group, the effect lasts only till the end of the current \TeX\
+ group.
+ \item Some graphic parameters are not scoped by |{pgfscope}| but
+ ``already'' by \TeX\ groups. For example, the effect of coordinate
+ transformation commands is always local to the current \TeX\ group.
+
+ Since every |{pgfscope}| automatically creates a \TeX\ group, all
+ graphic parameters that are local to the current \TeX\ group are also
+ local to the current |{pgfscope}|.
+ \item Some graphic parameters can only be scoped using \TeX\ groups, since
+ in some situations it is not possible to introduce a |{pgfscope}|. For
+ example, a path always has to be completely constructed and used in the
+ same |{pgfscope}|. However, we might wish to have different coordinate
+ transformations apply to different points on the path. In this case, we
+ can use \TeX\ groups to keep the effect local, but we could not use
+ |{pgfscope}|.
+ \item The |\pgftext| command can be used to create a scope in which \TeX\
+ ``escapes back'' to normal \TeX\ mode. The text passed to the
+ |\pgftext| is ``heavily guarded'' against having any effect on the
+ scope in which it is used. For example, it is possible to use another
+ |{pgfpicture}| environment inside the argument of |\pgftext|.
+\end{enumerate}
+
+Most of the complications can be avoided if you stick to the following
+rules:
+%
+\begin{itemize}
+ \item Give graphic commands only inside |{pgfpicture}| environments.
+ \item Use |{pgfscope}| to structure graphics.
+ \item Do not use \TeX\ groups inside graphics, \emph{except} for keeping
+ the effect of coordinate transformations local.
+\end{itemize}
+
+
+\subsection{The Hierarchical Structure of the Package}
+
+Before we come to the structuring commands provided by \pgfname\ to structure
+your graphics, let us first have a look at the structure of the package itself.
+
+
+\subsubsection{The Core Package}
+
+To use \pgfname, include the following package:
+
+\begin{package}{pgfcore}
+ This package loads the complete core of the ``basic layer'' of \pgfname,
+ but not any modules. That is, it will load all of the commands described in
+ the current part of this manual, but it will not load frontends like
+ \tikzname. It will also load the system layer. To load additional modules,
+ use the |\usepgfmodule| command explained below.
+\end{package}
+
+The following package is just a convenience.
+
+\begin{package}{pgf}
+ This package loads the |pgfcore| and the two modules |shapes| and |plot|.
+
+ In \LaTeX, the package takes two options:
+ %
+ \begin{packageoption}{draft}
+ When this option is set, all images will be replaced by empty
+ rectangles. This can speedup compilation.
+ \end{packageoption}
+
+ \begin{packageoption}{version=\meta{version}}
+ Indicates that the commands of version \meta{version} need to be
+ defined. If you set \meta{version} to |0.65|, then a large bunch of
+ ``compatibility commands'' are loaded. If you set \meta{version} to
+ |0.96|, then these compatibility commands will not be loaded.
+
+ If this option is not given at all, then the commands of all versions
+ are defined.
+ \end{packageoption}
+\end{package}
+
+
+\subsubsection{The Modules}
+
+\begin{command}{\usepgfmodule\marg{module names}}
+ Once the core has been loaded, you can use this command to load further
+ modules. The modules in the \meta{module names} list should be separated by
+ commas. Instead of curly braces, you can also use square brackets, which is
+ something Con\TeX t users will like. If you try to load a module a second
+ time, nothing will happen.
+
+ \example |\usepgfmodule{matrix,shapes}|
+
+ What this command does is to load the file
+ |pgfmodule|\meta{module}|.code.tex| for each \meta{module} in the list of
+ \meta{module names}. Thus, to write your own module, all you need to do is
+ to place a file of the appropriate name somewhere \TeX\ can find it.
+ \LaTeX, plain \TeX, and Con\TeX t users can then use your library.
+\end{command}
+
+The following modules are available for use with |pgfcore|: \todosp{In the
+meantime there are some more modules. Also mention them here?}
+%
+\begin{itemize}
+ \item The |plot| module provides commands for plotting functions. The
+ commands are explained in Section~\ref{section-plots}.
+ \item The |shapes| module provides commands for drawing shapes and nodes.
+ These commands are explained in Section~\ref{section-shapes}.
+ \item The |decorations| module provides commands for adding decorations to
+ paths. These commands are explained in
+ Section~\ref{section-base-decorations}.
+ \item The |matrix| module provides the |\pgfmatrix| command. The commands
+ are documented in Section~\ref{section-base-matrices}.
+\end{itemize}
+
+
+\subsubsection{The Library Packages}
+
+There is a special command for loading library packages. The difference between
+a library and module is the following: A library just defines additional
+objects using the basic layer, whereas a module adds completely new
+functionality. For instance, a decoration library defines additional
+decorations, while a decoration module defines the whole code for handling
+decorations.
+
+\begin{command}{\usepgflibrary\marg{list of libraries}}
+ Use this command to load further libraries. The list of libraries should
+ contain the names of libraries separated by commas. Instead of curly
+ braces, you can also use square brackets. If you try to load a library a
+ second time, nothing will happen.
+
+ \example |\usepgflibrary{arrows}|
+
+ This command causes the file |pgflibrary|\meta{library}|.code.tex| to be
+ loaded for each \meta{library} in the \meta{list of libraries}. This means
+ that in order to write your own library file, place a file of the
+ appropriate name somewhere where \TeX\ can find it. \LaTeX, plain \TeX, and
+ Con\TeX t users can then use your library.
+
+ You should also consider adding a \tikzname\ library that simply includes
+ your \pgfname\ library.
+\end{command}
+
+
+\subsection{The Hierarchical Structure of the Graphics}
+
+\subsubsection{The Main Environment}
+
+Most, but not all, commands of the \pgfname\ package must be given within a
+|{pgfpicture}| environment. The only commands that (must) be given outside are
+commands having to do with including images (like |\pgfuseimage|) and with
+inserting complete shadings (like |\pgfuseshading|). However, just to keep life
+entertaining, the |\pgfshadepath| command must be given \emph{inside} a
+|{pgfpicture}| environment.
+
+\begin{environment}{{pgfpicture}}
+ This environment will insert a \TeX\ box containing the graphic drawn by
+ the \meta{environment contents} at the current position.
+
+
+ \medskip
+ \textbf{The size of the bounding box.}
+ The size of the box is determined in the following manner: While \pgfname\
+ parses the \meta{environment contents}, it keeps track of a bounding box
+ for the graphic. Essentially, this bounding box is the smallest box that
+ contains all coordinates mentioned in the graphics. Some coordinates may be
+ ``mentioned'' by \pgfname\ itself; for example, when you add circle to the
+ current path, the support points of the curve making up the circle are also
+ ``mentioned'' despite the fact that you will not ``see'' them in your code.
+
+ Once the \meta{environment contents} have been parsed completely, a \TeX\
+ box is created whose size is the size of the computed bounding box and this
+ box is inserted at the current position.
+ %
+\begin{codeexample}[]
+Hello \begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2ex}{1ex}}
+ \pgfusepath{stroke}
+\end{pgfpicture} World!
+\end{codeexample}
+
+ Sometimes, you may need more fine-grained control over the size of the
+ bounding box. For example, the computed bounding box may be too large or
+ you intensionally wish the box to be ``too small''. In these cases, you can
+ use the command |\pgfusepath{use as bounding box}|, as described in
+ Section~\ref{section-using-bb}.
+
+
+ \medskip
+ \textbf{The baseline of the bounding box.}
+ When the box containing the graphic is inserted into the normal text, the
+ baseline of the graphic is normally at the bottom of the graphic. For this
+ reason, the following two sets of code lines have the same effect, despite
+ the fact that the second graphic uses ``higher'' coordinates than the
+ first:
+ %
+\begin{codeexample}[]
+Rectangles \begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2ex}{1ex}}
+ \pgfusepath{stroke}
+\end{pgfpicture} and \begin{pgfpicture}
+ \pgfpathrectangle{\pgfpoint{0ex}{1ex}}{\pgfpoint{2ex}{1ex}}
+ \pgfusepath{stroke}
+\end{pgfpicture}.
+\end{codeexample}
+
+ You can change the baseline using the |\pgfsetbaseline| command, see below.
+ %
+\begin{codeexample}[]
+Rectangles \begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2ex}{1ex}}
+ \pgfusepath{stroke}
+ \pgfsetbaseline{0pt}
+\end{pgfpicture} and \begin{pgfpicture}
+ \pgfpathrectangle{\pgfpoint{0ex}{1ex}}{\pgfpoint{2ex}{1ex}}
+ \pgfusepath{stroke}
+ \pgfsetbaseline{0pt}
+\end{pgfpicture}.
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Including text and images in a picture.}
+ You cannot directly include text and images in a picture. Thus, you should
+ \emph{not} simply write some text in a |{pgfpicture}| or use a command like
+ |\includegraphics| or even |\pgfimage|. In all these cases, you need to
+ place the text inside a |\pgftext| command. This will ``escape back'' to
+ normal \TeX\ mode, see Section~\ref{section-text-command} for details.
+
+
+ \medskip
+ \textbf{Remembering a picture position for later reference.}
+ After a picture has been typeset, its position on the page is normally
+ forgotten by \pgfname\ and also by \TeX. This means that is not possible to
+ reference a node in this picture later on. In particular, it is normally
+ impossible to draw lines between nodes in different pictures automatically.
+
+ In order to make \pgfname\ ``remember'' a picture, the \TeX-if
+ |\||ifpgfrememberpicturepositiononpage| should be set to |true|. It is only
+ important that this \TeX-if is |true| at the end of the
+ |{pgfpicture}|-en\-vi\-ron\-ment, so you can switch it on inside the
+ environment. However, you can also just switch it on globally, then the
+ positions of all pictures are remembered.
+
+ There are several reasons why the remembering is not switched on by
+ default. First, it does not work for all backend drivers (currently, it
+ works only for pdf\TeX). Second, it requires two passes of \TeX\ over the
+ file; on the first pass all positions will be wrong. Third, for every
+ remembered picture a line is added to the |.aux|-file, which may result in
+ a large number of extra lines.
+
+ Despite all these ``problems'', for documents that are processed with
+ pdf\TeX\ and in which there is only a small number of pictures (less than a
+ hundred or so), you can switch on this option globally, it will not cause
+ any significant slowing of \TeX.
+\end{environment}
+
+\begin{plainenvironment}{{pgfpicture}}
+ The plain \TeX\ version of the environment. Note that in this version,
+ also, a \TeX\ group is created around the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfpicture}}
+ This is the Con\TeX t version of the environment.
+\end{contextenvironment}
+
+{\let\ifpgfrememberpicturepositiononpage=\relax
+\begin{command}{\ifpgfrememberpicturepositiononpage}
+ Determines whether the position of pictures on the page should be recorded.
+ The value of this \TeX-if at the end of a |{pgfpicture}| environment is
+ important, not the value at the beginning.
+
+ If this option is set to true of a picture, \pgfname\ will attempt to
+ record the position of the picture on the page. (This attempt will fail
+ with most drivers and when it works, it typically requires two runs of
+ \TeX.) The position is not directly accessible. Rather, the nodes mechanism
+ will use this position if you access a node from another picture. See
+ Sections~\ref{section-cross-pictures-pgf}
+ and~\ref{section-cross-picture-tikz} for more details.
+\end{command}
+}
+
+\makeatletter
+\begin{command}{\pgfsetbaseline\marg{dimension}}
+ This command specifies a $y$-coordinate of the picture that should be used
+ as the baseline of the whole picture. When a \pgfname\ picture has been
+ typeset completely, \pgfname\ must decide at which height the baseline of
+ the picture should lie. Normally, the baseline is set to the $y$-coordinate
+ of the bottom of the picture, but it is often desirable to use a different
+ height.
+ %
+\begin{codeexample}[]
+Text
+\begin{pgfpicture}
+ \pgfpathcircle{\pgfpointorigin}{1ex}\pgfusepath{stroke}
+\end{pgfpicture},
+\begin{pgfpicture}
+ \pgfsetbaseline{0pt}
+ \pgfpathcircle{\pgfpointorigin}{1ex}\pgfusepath{stroke}
+\end{pgfpicture},
+\begin{pgfpicture}
+ \pgfsetbaseline{.5ex}
+ \pgfpathcircle{\pgfpointorigin}{1ex}\pgfusepath{stroke}
+\end{pgfpicture},
+\begin{pgfpicture}
+ \pgfsetbaseline{-1ex}
+ \pgfpathcircle{\pgfpointorigin}{1ex}\pgfusepath{stroke}
+\end{pgfpicture}.
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetbaselinepointnow\marg{point}}
+ This command specifies the baseline indirectly, namely as the
+ $y$-coordinate that the given \meta{point} has when the command is called.
+\end{command}
+
+\begin{command}{\pgfsetbaselinepointlater\marg{point}}
+ This command also specifies the baseline indirectly, but the $y$-coordinate
+ of the given \meta{point} is only computed at the end of the picture.
+ %
+\begin{codeexample}[]
+Hello
+\begin{pgfpicture}
+ \pgfsetbaselinepointlater{\pgfpointanchor{X}{base}}
+ % Note: no shape X, yet
+ \pgfnode{cross out}{center}{world.}{X}{\pgfusepath{stroke}}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Graphic Scope Environments}
+
+Inside a |{pgfpicture}| environment you can substructure your picture using the
+following environment:
+
+\begin{environment}{{pgfscope}}
+ All changes to the graphic state done inside this environment are
+ local to the environment. The graphic state includes the following:
+ %
+ \begin{itemize}
+ \item The line width.
+ \item The stroke and fill colors.
+ \item The dash pattern.
+ \item The line join and cap.
+ \item The miter limit.
+ \item The canvas transformation matrix.
+ \item The clipping path.
+ \end{itemize}
+ %
+ Other parameters may also influence how graphics are rendered, but they are
+ \emph{not} part of the graphic state. For example, the arrow tip kind is
+ not part of the graphic state and the effect of commands setting the arrow
+ tip kind are local to the current \TeX\ group, not to the current
+ |{pgfscope}|. However, since |{pgfscope}| starts and ends a \TeX\ group
+ automatically, a |{pgfscope}| can be used to limit the effect of, say,
+ commands that set the arrow tip kind.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \begin{pgfscope}
+ {
+ \pgfsetlinewidth{2pt}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2ex}{2ex}}
+ \pgfusepath{stroke}
+ }
+ \pgfpathrectangle{\pgfpoint{3ex}{0ex}}{\pgfpoint{2ex}{2ex}}
+ \pgfusepath{stroke}
+ \end{pgfscope}
+ \pgfpathrectangle{\pgfpoint{6ex}{0ex}}{\pgfpoint{2ex}{2ex}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \begin{pgfscope}
+ {
+ \pgfsetarrows{-to}
+ \pgfpathmoveto{\pgfpointorigin}\pgfpathlineto{\pgfpoint{2ex}{2ex}}
+ \pgfusepath{stroke}
+ }
+ \pgfpathmoveto{\pgfpoint{3ex}{0ex}}\pgfpathlineto{\pgfpoint{5ex}{2ex}}
+ \pgfusepath{stroke}
+ \end{pgfscope}
+ \pgfpathmoveto{\pgfpoint{6ex}{0ex}}\pgfpathlineto{\pgfpoint{8ex}{2ex}}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ At the start of the scope, the current path must be empty, that is, you
+ cannot open a scope while constructing a path.
+
+ It is usually a good idea \emph{not} to introduce \TeX\ groups inside a
+ |{pgfscope}| environment.
+\end{environment}
+
+\begin{plainenvironment}{{pgfscope}}
+ Plain \TeX\ version of the |{pgfscope}| environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfscope}}
+ This is the Con\TeX t version of the environment.
+\end{contextenvironment}
+
+The following scopes also encapsulate certain properties of the graphic state.
+However, they are typically not used directly by the user.
+
+\begin{environment}{{pgfinterruptpath}}
+ This environment can be used to temporarily interrupt the construction of
+ the current path. The effect will be that the path currently under
+ construction will be ``stored away'' and restored at the end of the
+ environment. Inside the environment you can construct a new path and do
+ something with it.
+
+ An example application of this environment is the arrow tip caching.
+ Suppose you ask \pgfname\ to use a specific arrow tip kind. When the arrow
+ tip needs to be rendered for the first time, \pgfname\ will ``cache'' the
+ path that makes up the arrow tip. To do so, it interrupts the current path
+ construction and then protocols the path of the arrow tip. The
+ |{pgfinterruptpath}| environment is used to ensure that this does not
+ interfere with the path to which the arrow tips should be attached.
+
+ This command does \emph{not} install a |{pgfscope}|. In particular, it does
+ not call any |\pgfsys@| commands at all, which would, indeed, be dangerous
+ in the middle of a path construction.
+\end{environment}
+
+\begin{plainenvironment}{{pgfinterruptpath}}
+ Plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfinterruptpath}}
+ Con\TeX t version of the environment.
+\end{contextenvironment}
+
+\begin{environment}{{pgfinterruptpicture}}
+ This environment can be used to temporarily interrupt a |{pgfpicture}|.
+ However, the environment is intended only to be used at the beginning and
+ end of a box that is (later) inserted into a |{pgfpicture}| using
+ |\pgfqbox|. You cannot use this environment directly inside a
+ |{pgfpicture}|.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}} % In the middle of path, now
+ \newbox\mybox
+ \setbox\mybox=\hbox{
+ \begin{pgfinterruptpicture}
+ Sub-\begin{pgfpicture} % a subpicture
+ \pgfpathmoveto{\pgfpoint{1cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+ \pgfusepath{stroke}
+ \end{pgfpicture}-picture.
+ \end{pgfinterruptpicture}
+ }
+ \pgfqbox{\mybox}%
+ \pgfpathlineto{\pgfpoint{0cm}{1cm}}
+ \pgfusepath{stroke}
+\end{pgfpicture}\hskip3.9cm
+\end{codeexample}
+ %
+\end{environment}
+
+\begin{plainenvironment}{{pgfinterruptpicture}}
+ Plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfinterruptpicture}}
+ Con\TeX t version of the environment.
+\end{contextenvironment}
+
+\begin{environment}{{pgfinterruptboundingbox}}
+ This environment temporarily interrupts the computation of the bounding box
+ and sets up a new bounding box. At the beginning of the environment the old
+ bounding box is saved and an empty bounding box is installed. After the
+ environment the original bounding box is reinstalled as if nothing has
+ happened.
+\end{environment}
+
+\begin{plainenvironment}{{pgfinterruptboundingbox}}
+ Plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfinterruptboundingbox}}
+ Con\TeX t version of the environment.
+\end{contextenvironment}
+
+
+\subsubsection{Inserting Text and Images}
+\label{section-text-command}
+
+Often, you may wish to add normal \TeX\ text at a certain point inside a
+|{pgfpicture}|. You cannot do so ``directly'', that is, you cannot simply write
+this text inside the |{pgfpicture}| environment. Rather, you must pass the text
+as an argument to the |\pgftext| command.
+
+You must \emph{also} use the |\pgftext| command to insert an image or a shading
+into a |{pgfpicture}|.
+
+\begin{command}{\pgftext\opt{\oarg{options}}\marg{text}}
+ This command will typeset \meta{text} in normal \TeX\ mode and insert the
+ resulting box into the |{pgfpicture}|. The bounding box of the graphic will
+ be updated so that all of the text box is inside. By default, the text box
+ is centered at the origin, but this can be changed either by giving
+ appropriate \meta{options} or by applying an appropriate coordinate
+ transformation beforehand.
+
+ The \meta{text} may contain verbatim text. (In other words, the \meta{text}
+ ``argument'' is not a normal argument, but is put in a box and some
+ |\aftergroup| hackery is used to find the end of the box.)
+
+ \pgfname's current (high-level) coordinate transformation is synchronized
+ with the canvas transformation matrix temporarily when the text box is
+ inserted. The effect is that if there is currently a high-level rotation
+ of, say, 30 degrees, the \meta{text} will also be rotated by thirty
+ degrees. If you do not want this effect, you have to (possibly temporarily)
+ reset the high-level transformation matrix.
+
+ The \meta{options} keys are used with the path |/pgf/text/|. The following
+ keys are defined for this path:
+ %
+ \begin{key}{/pgf/text/left}
+ The key causes the text box to be placed such that its left border is
+ on the origin.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[left] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/right}
+ The key causes the text box to be placed such that its right border is
+ on the origin.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[right] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/top}
+ This key causes the text box to be placed such that its top is on the
+ origin. This option can be used together with the |left| or |right|
+ option.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[top] {lovely}}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[top,right] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/bottom}
+ This key causes the text box to be placed such that its bottom is on
+ the origin.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[bottom] {lovely}}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[bottom,right] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/base}
+ This key causes the text box to be placed such that its baseline is on
+ the origin.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[base] {lovely}}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[base,right] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/at=\meta{point}}
+ Translates the origin (that is, the point where the text is shown) to
+ \meta{point}.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[base,at={\pgfpoint{1cm}{0cm}}] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/x=\meta{dimension}}
+ Translates the origin by \meta{dimension} along the $x$-axis.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[base,x=1cm,y=-0.5cm] {lovely}}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/text/y=\meta{dimension}}
+ This key works like the |x| option.
+ \end{key}
+ %
+ \begin{key}{/pgf/text/rotate=\meta{degree}}
+ Rotates the coordinate system by \meta{degree}. This will also rotate
+ the text box.
+ %
+\begin{codeexample}[]
+\tikz{\draw[help lines] (-1,-.5) grid (1,.5);
+ \pgftext[base,x=1cm,y=-0.5cm,rotate=30] {lovely}}
+\end{codeexample}
+ \end{key}
+\end{command}
+
+
+\subsection{Object Identifiers}
+
+Graphical objects can have an \emph{identifier,} which allows you to reference
+the object later on. For instance, you could reference the object as the target
+of a hyperlink (although this capability is not necessarily implemented by
+drivers) or as the target of an animation; indeed, animations always need an
+object identifier to identify the to-be-animated object.
+
+Attaching an identifier to an object is a two-step process:
+%
+\begin{enumerate}
+ \item You call |\pgfuseid{|\meta{id}|}| to choose an id, which is a normal
+ string.
+ \item Next, you call one of several commands like |\pgfidscope| or
+ |\pgftext|, which create an object. This object will have then have the
+ id.
+\end{enumerate}
+
+
+\subsubsection{Commands for Creating Graphic Objects}
+
+The following system level commands create an object with an id:
+%
+\begin{enumerate}
+ \item |\pgfsys@begin@idscope|, which creates a graphic scope.
+ \item |\pgfsys@viewboxmeet| or |\pgfsys@viewboxslice|, which create view
+ boxes,
+ \item |\pgfsys@fill|, |\pgfsys@stroke|, and all other path usage command,
+ \item |\pgfsys@hbox| or |\pgfsys@hboxsynced|, which create text boxes, and
+ \item |\pgfsys@animate...|, which create animations.
+\end{enumerate}
+
+These system layer commands are, in turn, called by the following basic layer
+commands (and, also, by the commands that call them, in turn):
+%
+\begin{itemize}
+ \item |\pgfidscope|, which creates an id scope (see below).
+ \item |\pgfviewboxscope|, which creates a view box.
+ \item |\pgfusepath|, which creates a path.
+ \item |\pgftext| and |\pgfnode| and |\pgfmultipartnode|, which create text
+ boxes and nodes, and
+ \item |\pgfanimateattribute|, which creates an animation.
+\end{itemize}
+
+\begin{environment}{{pgfidscope}}
+ Creates a graphic scope that will have the id last used with |\pgfuseid|
+ attached to, provided such an id was set and was not already used with
+ another object. In the latter cases, no graphic scope is created. Thus, if
+ you wish to ensure that a graphic scope is created, you must (additionally)
+ call |\pgfscope| inside or outside the id scope.
+\end{environment}
+
+The Plain\TeX\ and Con\TeX t versions of the environment are:
+%
+\begin{plainenvironment}{{pgfidscope}}
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfidscope}}
+\end{contextenvironment}
+
+
+\subsubsection{Settings and Querying Identifiers}
+
+In order to attach an identifier to an object, you first use the following
+command:
+
+\begin{command}{\pgfuseid\marg{name}}
+ The \meta{name} is a string by which the object will be referenced (see
+ |\pgfidrefnextuse|). The next time a graphic object is created in the
+ current \TeX\ scope, the name will be attached to it (actually, it will get
+ a system layer identifier attached to it that is automatically created
+ using |\pgfsys@new@id|, the \meta{name} is bound to that identifier and it
+ can be retrieved using |\pgfidrefnextuse|). This holds true only for the
+ next object: If a second object is created, it will not get the name
+ attached to it. This does not mean, however, that you cannot attach the
+ same name to different objects; you just need to call |\pgfuseid| again
+ before each object.
+
+ Besides the \meta{name} (or, more precisely, besides the system layer
+ identifier is refers to), the current \emph{identifier type} is also
+ important: Actually, a graphic object is not referenced by a system layer
+ identifier, but by the combination of the identifier and a type. You can
+ use the following commands for modifying the type used for the creation of
+ objects:
+
+ \begin{command}{\pgfusetype\marg{type}}
+ Sets the type used for the referencing of graphic objects for the
+ current scope to \meta{type} or, if \meta{type} starts with a dot,
+ appends \meta{type} to the current type.
+
+ You use this command with compound graphic objects: Before each part of
+ a graphic object, set the type to an appropriate value. Now, if the
+ object is named using |\pgfuseid|, you can later on access all parts of
+ the compound object using the combination of the \meta{name} used with
+ |\pgfuseid| and the type of the part.
+
+ As an example, this system is used to give you access to the different
+ parts of a node: When use say |\pgfuseid{mynode}| and then create a
+ node, you can use |mynode| with the empty type to reference the
+ graphics scope that encompasses the whole node, but also |mynode|
+ together with the type |background| to access the background path of
+ the node.
+
+ In detail, \pgfname\ uses this command to set the following types:
+ %
+ \begin{itemize}
+ \item Inside the command |\pgfviewboxscope|, the type |.view| is
+ used for the view object.
+ \item Inside the command |\pgfmultipartnode|, the type
+ |.behind background| is used for the scope of drawings behind
+ the background. Similarly, |.before background| and
+ |.behind foreground| and finally |.before foreground| are used
+ with the respective parts of a node.
+ \item Also inside a node, |.background| and |.foreground| are used
+ as types of the background and foreground paths, respectively.
+ \item Finally, inside a node, for each text part, the text part's
+ name is used as a type (so |.text| is used for the main part).
+ \end{itemize}
+
+ In addition, \tikzname\ uses this command in the following
+ situations:
+ %
+ \begin{itemize}
+ \item The type |.path| is used with a named path (named using the
+ |name| key). This is the graphic object you need to reference
+ when you wish to morph a path.
+ \item The type |.path picture| is used with the scope of the
+ optional path picture.
+ \item The type |.path fill| is used with the path used for filling.
+ This is not the same as the normal path in case the path is
+ filled and patterned, for instance.
+ \item The type |.path shade| is used with the path used for shading
+ a path.
+ \end{itemize}
+ \end{command}
+
+ \begin{command}{\pgfpushtype}
+ Pushes the current type on an internal global stack. The idea is to
+ allow you to temporarily change the current type without having to open
+ a \TeX\ scope.
+ \end{command}
+
+ \begin{command}{\pgfpoptype}
+ Restores the most recent type from the internal global stack of types.
+ \end{command}
+\end{command}
+
+\begin{command}{\pgfclearid}
+ Clears the current id (and type) for the local scope.
+\end{command}
+
+\begin{command}{\pgfidrefnextuse\marg{macro}\marg{name}}
+ This command assigns a system layer identifier (the identifier returned by
+ |\pgfsys@new@id|) to the \meta{macro}, namely the one that will be used the
+ \emph{next} time |\pgfuseid| is used. You use this command for ``forward
+ referencing''.
+
+ A typical use case is the following: A key like |whom| for animations uses
+ this command to get the system identifier that will be used for a future
+ object. Then, this identifier can be passed to system layer commands like
+ |\pgfsys@animation@whom|.
+
+ Note that the ``next'' use need not be on the same page (or there may not
+ even be any use at all), in which case the reference will not refer to any
+ object.
+\end{command}
+
+\begin{command}{\pgfidrefprevuse\marg{macro}\marg{name}}
+ Works like |\pgfidrefnextuse|, only it references the most recent
+ \emph{previous} use of the \meta{name}. As for |\pgfidrefnextuse|, the most
+ recent use need not be on the same page.
+\end{command}
+
+\begin{command}{\pgfaliasid\marg{alias}\marg{name}}
+ Creates an alias of a name inside the current \TeX\ scope. After calling
+ this command, you can use \meta{alias} anywhere where you would normally
+ use \meta{name}. Note that the binding between \meta{alias} and \meta{name}
+ is not kept when |\pgfuseid| is used on the \meta{name} (or the
+ \meta{alias}).
+\end{command}
+
+\begin{command}{\pgfgaliasid\marg{1}\marg{2}}
+ Like |\pgfaliasid|, only the alias is set globally.
+\end{command}
+
+\begin{command}{\pgfifidreferenced\marg{name}\marg{then code}\marg{else code}}
+ If \meta{name} has been referenced, \meta{then code} is executed, otherwise
+ \meta{else code}.
+\end{command}
+
+
+\subsection{Resource Description Framework Annotations (RDFa)}
+\label{section-base-rdf}
+
+With certain output formats (in particular, with \textsc{svg}) you can insert
+annotations into the output file following the standard set by the
+\emph{resource description framework} (known as ``\textsc{rdf}'', please
+consult the literature on \textsc{rdf} and \textsc{rdf}a for an introduction to
+resource descriptions and ontologies and their purpose in general). To do so,
+you call one (or several) of the following commands before you call
+|\pgfidscope|. The attributes and values you specify using the commands will
+then be added to the resulting scope (if the driver supports this, which is
+only the case for \textsc{svg} at the moment). As an example, when you write
+%
+\begin{codeexample}[code only]
+\pgfrdfresource{/fruits/apple}
+\pgfidscope
+...
+\pgfendidscope
+\end{codeexample}
+
+in the resulting \textsc{svg} file you get
+%
+\begin{codeexample}[code only]
+<g resource="/fruits/apple">
+ ...
+</g>
+\end{codeexample}
+
+Most of the following commands just set a single attribute for the next id
+scope. In some cases, however, repeated calling of these commands makes sense
+and causes the passed values to accumulate as in the following example:
+%
+\begin{codeexample}[code only]
+\pgfrdfresource{/fruits/apple}
+\pgfrdfproperty{http://foo.com/props/juicy}
+\pgfrdfproperty{http://foo.com/props/green}
+\pgfidscope
+...
+\pgfendidscope
+\end{codeexample}
+
+Now you get:
+%
+\begin{codeexample}[code only]
+<g resource="/fruits/apple"
+ property="http://foo.com/props/juicy http://foo.com/props/green">
+ ...
+</g>
+\end{codeexample}
+
+The following commands ``accumulate'': |\pgfrdfproperty|, |\pgfrdfrel|,
+|\pgfrdfrev| and also the command |\pgfrdftypeof|.
+
+\begin{command}{\pgfrdfabout\marg{text}}
+ Adds the \textsc{rdf} attribute |about="|\meta{text}|"| to the next id
+ scope (please see the \textsc{rdf}a specification for details on the
+ semantics of |about| in the context of the resource description framework).
+\end{command}
+
+The following commands work the same way.
+
+\begin{command}{\pgfrdfcontent\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfdatatype\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfhref\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfinlist}
+\end{command}
+
+\begin{command}{\pgfrdfprefix\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfproperty\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfrel\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfresource\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfrev\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfsrc\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdftypeof\marg{text}}
+\end{command}
+
+\begin{command}{\pgfrdfvocab\marg{text}}
+\end{command}
+
+
+\subsection{Error Messages and Warnings}
+
+Sometimes, a command inside \pgfname\ may fail. In this case, two commands are
+useful to communicate with the author:
+
+\begin{command}{\pgferror\marg{message}}
+ Stops the processing of the current document and prints out the
+ \meta{message}. In \LaTeX, this will be done using |\PackageError|,
+ otherwise |\errmessage| is used directly.
+\end{command}
+
+\begin{command}{\pgfwarning\marg{message}}
+ Prints the \meta{message} on the output, but does not interrupt the
+ processing. In \LaTeX, this will be done using |\PackageWarning|, otherwise
+ a write to stream $17$ is used.
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-shadings.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-shadings.tex
new file mode 100644
index 0000000000..e8bcde8ff7
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-shadings.tex
@@ -0,0 +1,762 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Shadings}
+\label{section-shadings}
+
+\subsection{Overview}
+
+A shading is an area in which the color changes smoothly between different
+colors. Similarly to an image, a shading must first be declared before it can
+be used. Also similarly to an image, a shading is put into a \TeX-box. Hence,
+in order to include a shading in a |{pgfpicture}|, you have to use |\pgftext|
+around it.
+
+There are different kinds of shadings: horizontal, vertical, radial, and
+functional shadings. However, you can rotate and clip shadings like any other
+graphics object, which allows you to create more complicated shadings.
+Horizontal shadings could be created by rotating a vertical shading by 90
+degrees, but explicit commands for creating both horizontal and vertical
+shadings are included for convenience.
+
+Once you have declared a shading, you can insert it into the text using the
+command |\pgfuseshading|. This command cannot be used directly in a
+|{pgfpicture}|, you have to put a |\pgftext| around it. The second command for
+using shadings, |\pgfshadepath|, on the other hand, can only be used inside
+|{pgfpicture}| environments. It will ``fill'' the current path with the
+shading.
+
+A horizontal shading is a horizontal bar of a certain height whose color
+changes smoothly. You must at least specify the colors at the left and at the
+right end of the bar, but you can also add color specifications for points in
+between. For example, suppose you wish to create a bar that is red at the left
+end, green in the middle, and blue at the end, and you would like the bar to be
+4cm long. This could be specified as follows:
+%
+\begin{codeexample}[code only]
+rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); rgb(4cm)=(0,0,1)
+\end{codeexample}
+%
+This line means that at 0cm (the left end) of the bar, the color should be red,
+which has red-green-blue (rgb) components (1,0,0). At 2cm, the bar should be
+green, and at 4cm it should be blue. Instead of |rgb|, you can currently also
+specify |cmyk| as color model, in which case four values are needed,
+|gray| as color model, in which case only one value is needed, or
+|color|, in which case you must provide the name of a color in parentheses. In
+a color specification the individual specifications must be separated using a
+semicolon, which may be followed by a whitespace (like a space or a newline).
+Individual specifications must be given in increasing order.
+
+\subsubsection{Color models}
+
+\noindent\emph{by David Purton}
+
+An attempt is made to produce shadings consistent with the currently selected
+|xcolor| package color model. The |rgb|, |cmyk|, and |gray| color models from
+the |xcolor| package are supported.
+
+\textbf{Note:} The color model chosen for a shading is based on the |xcolor|
+color model \emph{at the time the shading is created}. This is either when
+\cs{pgfdeclare*shading} is called with no optional argument or when
+\cs{pgfuseshading} is called if \cs{pgfdeclare*shading} was called with an
+optional argument.
+
+If the |xcolor| package |natural| color model is in use then the shading color
+model will be \textsc{rgb} by default. In practice this means that if you are
+using the |natural| color model of the |xcolor| package you can get mismatched
+colors if you, for example, create a shading from green (which is defined as
+\textsc{rgb}) to magenta (which is defined as \textsc{cmyk}). The shading will
+finish with \textsc{rgb} magenta which will look different to the
+\textsc{cmyk} magenta used in solid colors.
+
+You can avoid mismatched colors by loading the |xcolor| package first with an
+explicit color model (|rgb|, |cmyk|, or |gray|).
+
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ \fill[green] (0,0) rectangle (1,1);
+ \shade[left color=green, right color=magenta] (1.25,0) rectangle (3.75,1);
+ \fill[magenta] (4,0) rectangle (5,1);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{center}
+ \begin{minipage}{5cm}
+ |xcolor| |natural| color model:\medskip
+
+ \begin{tikzpicture}
+ \fill[green] (0,0) rectangle (1,1);
+ \shade[left color=green, right color=magenta] (1.25,0) rectangle (3.75,1);
+ \fill[magenta] (4,0) rectangle (5,1);
+ \end{tikzpicture}
+ \end{minipage}\hspace{2cm}%
+ \begin{minipage}{5cm}
+ |xcolor| |cmyk| color model:\medskip
+
+ \selectcolormodel{cmyk}
+ \begin{tikzpicture}
+ \fill[green] (0,0) rectangle (1,1);
+ \shade[left color=green, right color=magenta] (1.25,0) rectangle (3.75,1);
+ \fill[magenta] (4,0) rectangle (5,1);
+ \end{tikzpicture}
+ \end{minipage}\medskip
+
+ \begin{minipage}{5cm}
+ |xcolor| |rgb| color model:\medskip
+
+ \selectcolormodel{rgb}
+ \begin{tikzpicture}
+ \fill[green] (0,0) rectangle (1,1);
+ \shade[left color=green, right color=magenta] (1.25,0) rectangle (3.75,1);
+ \fill[magenta] (4,0) rectangle (5,1);
+ \end{tikzpicture}
+ \end{minipage}\hspace{2cm}%
+ \begin{minipage}{5cm}
+ |xcolor| |gray| color model:\medskip
+
+ \selectcolormodel{gray}
+ \begin{tikzpicture}
+ \fill[green] (0,0) rectangle (1,1);
+ \shade[left color=green, right color=magenta] (1.25,0) rectangle (3.75,1);
+ \fill[magenta] (4,0) rectangle (5,1);
+ \end{tikzpicture}
+ \end{minipage}
+\end{center}
+
+\subsection{Declaring Shadings}
+
+\subsubsection{Horizontal and Vertical Shadings}
+
+\begin{command}{\pgfdeclarehorizontalshading\oarg{color list}\marg{shading name}\marg{shading height}\marg{color specification}}
+ Declares a horizontal shading named \meta{shading name} of the specified
+ \meta{height} with the specified colors. The width of the bar is deduced
+ automatically from the maximum dimension in the specification.
+ %
+\begin{codeexample}[]
+\pgfdeclarehorizontalshading{myshadingA}
+ {1cm}{rgb(0cm)=(1,0,0); color(2cm)=(green); color(4cm)=(blue)}
+\pgfuseshading{myshadingA}
+\end{codeexample}
+
+ The effect of the \meta{color list}, which is a comma-separated list of
+ colors, is the following: Normally, when this list is empty, once a shading
+ has been declared, it becomes ``frozen''. This means that even if you
+ change a color that was used in the declaration of the shading later on,
+ the shading will not change. By specifying a \meta{color list} you can
+ specify that the shading should be recalculated whenever one of the colors
+ listed in the list changes (this includes effects like color mixins and
+ |xcolor| color models). Thus, when you specify a \meta{color list},
+ whenever the shading is used, \pgfname\ first converts the colors in the
+ list to tuples in the current |xcolor| color model using the current
+ values of the colors and taking any mixins and blends into account. If the
+ resulting tuples have not yet been used,
+ a new shading is internally created and used. Note that if the option
+ \meta{color list} is used, then no shading is created until the first use
+ of |\pgfuseshading|. In particular, the colors mentioned in the shading
+ need not be defined when the declaration is given.
+
+ When a shading is recalculated because of a change in the colors mentioned
+ in \meta{color list}, the complete shading is recalculated. Thus even
+ colors not mentioned in the list will be used with their current values,
+ not with the values they had upon declaration.
+ %
+\begin{codeexample}[]
+\pgfdeclarehorizontalshading[mycolor]{myshadingB}
+ {1cm}{rgb(0cm)=(1,0,0); color(2cm)=(mycolor)}
+\colorlet{mycolor}{green}
+\pgfuseshading{myshadingB}
+\colorlet{mycolor}{blue}
+\pgfuseshading{myshadingB}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfdeclareverticalshading\oarg{color list}\marg{shading name}\marg{shading width}\marg{color specification}}
+ Declares a vertical shading named \meta{shading name} of the specified
+ \meta{width}. The height of the bar is deduced automatically. The effect of
+ \meta{color list} is the same as for horizontal shadings.
+ %
+\begin{codeexample}[]
+\pgfdeclareverticalshading{myshadingC}
+ {4cm}{rgb(0cm)=(1,0,0); rgb(1.5cm)=(0,1,0); rgb(2cm)=(0,0,1)}
+\pgfuseshading{myshadingC}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Radial Shadings}
+
+\begin{command}{\pgfdeclareradialshading\oarg{color list}\marg{shading name}\marg{center point}\marg{color specification}}
+ Declares a radial shading. A radial shading is a circle whose inner color
+ changes as specified by the color specification. Assuming that the center
+ of the shading is at the origin, the color of the center will be the color
+ specified for 0cm and the color of the border of the circle will be the
+ color for the maximum dimension given in the \meta{color specified}. This
+ maximum will also be the radius of the circle. If the \meta{center point}
+ is not at the origin, the whole shading inside the circle (whose size
+ remains exactly the same) will be distorted such that the given center now
+ has the color specified for 0cm. The effect of \meta{color list} is the
+ same as for horizontal shadings.
+ %
+\begin{codeexample}[]
+\pgfdeclareradialshading{sphere}{\pgfpoint{0.5cm}{0.5cm}}%
+ {rgb(0cm)=(0.9,0,0);
+ rgb(0.7cm)=(0.7,0,0);
+ rgb(1cm)=(0.5,0,0);
+ rgb(1.05cm)=(1,1,1)}
+\pgfuseshading{sphere}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{General (Functional) Shadings}
+
+\begin{command}{\pgfdeclarefunctionalshading\oarg{color list}\marg{shading
+ name}\marg{lower left corner}\marg{upper right corner}\\
+ \marg{init code}\marg{type 4 function}%
+}
+ \emph{Warning: These shadings are the least portable of all and they put
+ the heaviest burden of the renderer. They are slow and, possibly, will not
+ print correctly!}
+
+ This command creates a \emph{functional shading}. For such a shading, the
+ color of each point is calculated by calling a function that takes the
+ coordinates of the point as input and yields the color as an output. Note
+ that the function is evaluated by the \emph{renderer}, not by \pgfname\ or
+ \TeX\ or someone else at compile-time. This means that the evaluation of
+ this function has to be done \emph{extremely quickly} and the function
+ should be \emph{very simple}. For this reason, only a very restricted set
+ of operations are possible in the function and functions should be kept
+ small. Any errors in the function will only be noticed by the renderer.
+
+ The syntax for specifying functions is the following: You use a simplified
+ form of a subset of the PostScript language. This subset will be understood
+ by the PDF-renderer (yes, PDF-renderers do have a basic understanding of
+ PostScript) and also by PostScript renders. This subset is detailed in
+ Section~3.9.4 of the PDF-specification (version~1.7). In essence, the
+ specification states that these functions may contain ``expressions
+ involving integers, real numbers, and boolean values only. There are no
+ composite data structures such as strings or arrays, no procedures, and no
+ variables or names.'' The allowed operators are (exactly) the following:
+ \texttt{abs}, \texttt{add}, \texttt{atan}, \texttt{ceiling}, \texttt{cos},
+ \texttt{cvi}, \texttt{cvr}, \texttt{div}, \texttt{exp}, \texttt{floor},
+ \texttt{idiv}, \texttt{ln}, \texttt{log}, \texttt{mod}, \texttt{mul},
+ \texttt{neg}, \texttt{round}, \texttt{sin}, \texttt{sqrt}, \texttt{sub},
+ \texttt{truncate}, \texttt{and}, \texttt{bitshift}, \texttt{eq},
+ \texttt{false}, \texttt{ge}, \texttt{gt}, \texttt{le}, \texttt{lt},
+ \texttt{ne}, \texttt{not}, \texttt{or}, \texttt{true}, \texttt{xor},
+ \texttt{if}, \texttt{ifelse}, \texttt{copy}, \texttt{dup}, \texttt{exch},
+ \texttt{index}, \texttt{pop}.
+
+ When the function is evaluated, the top two stack elements are the
+ coordinates of the point for which the color should be computed. The
+ coordinates are dimensionless and given in big points, so for the
+ coordinate $(50bp, 72.27pt)$ the top two stack elements would be
+ \texttt{50.0} and \texttt{72.0}. Otherwise, the (virtual) stack is empty
+ (or should be treated as if it were empty). The function should then
+ replace these two values by three values, representing the red, green, and
+ blue color of the point for an \textsc{rgb} shading, four colors,
+ representing the cyan, magenta, yellow, and black color of the point for a
+ \textsc{cmyk} shading, or one value representing the gray color for a
+ grayscale shading. The numbers should be real values, not integers
+ since, Apple's PDF renderer is broken in this regard (use \texttt{cvr} at
+ the end if necessary).
+
+ Conceptually, the function will be evaluated once for each point of the
+ rectangle \meta{lower left corner} to \meta{upper right corner}, which
+ should be a \pgfname-point expression like |\pgfpoint{100bp}{100bp}|. A
+ renderer may choose to evaluate the function at less points, but, in
+ principle, the function will be evaluated for each pixel independently.
+
+ Because of the rather difficult PostScript syntax, use this macro only
+ \emph{if you know what you are doing} (or if you are adventurous, of
+ course).
+
+ As for other shadings, the optional \meta{color list} is used to determine
+ whether a shading needs to be recalculated when a color has changed.
+
+ The \meta{init code} is executed each time a shading is (re)calculated.
+ Typically, it will contain code to extract coordinates from colors.
+ %
+\begin{codeexample}[]
+\pgfdeclarefunctionalshading{twospots}
+ {\pgfpointorigin}{\pgfpoint{4cm}{4cm}}{}{
+ % Save coordinates for later
+ 2 copy
+ % Compute distance from (40bp,45bp), with x doubled
+ 45 sub dup mul exch
+ 40 sub dup mul 0.5 mul add sqrt
+ % exponential decay
+ dup mul neg 1.0005 exch exp 1.0 exch sub
+ % Compute distance from (70bp,70bp) from stored coordinate, scaled
+ 3 1 roll
+ 70 sub dup mul .5 mul exch
+ 70 sub dup mul add sqrt
+ % Decay
+ dup mul neg 1.002 exch exp 1.0 exch sub
+ % red component
+ 1.0 3 1 roll
+}
+\pgfuseshading{twospots}
+\end{codeexample}
+
+ Inside the PostScript function \meta{type 4 function} you cannot use colors
+ directly. Rather, you must push the color components on the stack. For
+ this, it is useful to call one of |\pgfshadecolortorgb|,
+ |\pgfshadecolortocmyk|, or |\pgfshadecolortogray| in the \meta{init code}:
+
+ \begin{command}{\pgfshadecolortorgb\marg{color name}\marg{macro}}
+ This command takes \meta{color name} as input, converts it to
+ \textsc{rgb} and stores the color's
+ red/green/blue components real numbers between 0.0 and 1.0 separated by
+ spaces (which is exactly what you need if you want to push it on a
+ stack) in \meta{macro}. This macro can then be used inside the
+ \meta{type 4 function} argument for |\pgfdeclarefunctionalshading|.
+ %
+\begin{codeexample}[]
+\pgfdeclarefunctionalshading[mycol]{sweep}{\pgfpoint{-1cm}{-1cm}}
+{\pgfpoint{1cm}{1cm}}{\pgfshadecolortorgb{mycol}{\myrgb}}{
+ 2 copy % whirl
+ % Calculate "safe" atan of position
+ 2 copy abs exch abs add 0.0001 ge { atan } { pop } ifelse
+ 3 1 roll
+ dup mul exch
+ dup mul add sqrt
+ 30 mul
+ add
+ sin
+ 1 add 2 div
+ dup
+ \myrgb % push mycol
+ 5 4 roll % multiply all components by calculated value
+ mul
+ 3 1 roll
+ 3 index
+ mul
+ 3 1 roll
+ 4 3 roll
+ mul
+ 3 1 roll
+}
+\colorlet{mycol}{white}%
+\pgfuseshading{sweep}%
+\colorlet{mycol}{red}%
+\pgfuseshading{sweep}
+\end{codeexample}
+
+ In addition, three macros suffixed with |red|, |green| and |blue| are
+ defined, which store the individual components of \meta{color name}.
+ These can also be used in the \meta{type 4 function} argument.
+ %
+\begin{codeexample}[]
+\pgfshadecolortorgb{orange}{\mycol}
+|\mycol|=\mycol |\mycolred|=\mycolred |\mycolgreen|=\mycolgreen |\mycolblue|=\mycolblue
+\end{codeexample}
+ \end{command}
+
+\begin{codeexample}[]
+\pgfdeclarefunctionalshading[col1,col2,col3,col4]{bilinear interpolation}
+{\pgfpointorigin}{\pgfpoint{100bp}{100bp}}
+{
+\pgfshadecolortorgb{col1}{\first}\pgfshadecolortorgb{col2}{\second}
+\pgfshadecolortorgb{col3}{\third}\pgfshadecolortorgb{col4}{\fourth}
+}{
+ 100 div exch 100 div 2 copy % Calculate y/100 x/100.
+ neg 1 add exch neg 1 add % Calculate 1-y/100 1-x/100.
+ 3 1 roll 2 copy exch 5 2 roll 6 copy 6 copy % Set up stack.
+ \firstred mul exch \secondred mul add mul % Process red component.
+ 4 1 roll
+ \thirdred mul exch \fourthred mul add mul
+ add
+ 13 1 roll
+ \firstgreen mul exch \secondgreen mul add mul % Process green component.
+ 4 1 roll
+ \thirdgreen mul exch \fourthgreen mul add mul
+ add
+ 7 1 roll
+ \firstblue mul exch \secondblue mul add mul % Process blue component.
+ 4 1 roll
+ \thirdblue mul exch \fourthblue mul add mul
+ add
+}
+
+\colorlet{col1}{blue}
+\colorlet{col2}{yellow}
+\colorlet{col3}{red}
+\colorlet{col4}{green}
+\pgfuseshading{bilinear interpolation}
+\end{codeexample}
+
+ \begin{command}{\pgfshadecolortocmyk\marg{color name}\marg{macro}}
+ This command takes \meta{color name} as input, converts it to
+ \textsc{cmyk} and stores the color's cyan/magenta/yellow/black
+ components real numbers between 0.0 and 1.0 separated by spaces.
+
+ In addition, four macros suffixed with |cyan|, |magenta|, |yellow| and
+ |black| are defined, which store the individual components of
+ \meta{color name}.
+ %
+ \end{command}
+
+ \begin{command}{\pgfshadecolortogray\marg{color name}\marg{macro}}
+ This command takes \meta{color name} as input converts it to grayscale
+ and stores the color's value as a real number between 0.0 and 1.0.
+
+ Although it's not needed, for consistency a second macro suffixed with
+ |gray| is also defined.
+ %
+ \end{command}
+ %
+\end{command}
+
+\paragraph{Color model independent functional shadings.}
+
+By nature, the PostScript code used in functional shadings must output one of
+\textsc{rgb}, \textsc{cmyk}, or grayscale data. Therefore,
+\cs{pgfdeclarefunctionalshading} is \emph{not} portable across color models.
+
+Take particular care that the same color model is in use at declaration time
+and use time for functional shadings declared with an optional argument as
+otherwise the PostScript data will not match the declared color space and
+you will end up with a malformed PDF.
+
+Having said this, it \emph{is} possible to create portable functional shadings
+by providing conditional code to append color transformations to the
+PostScript data. A variety of \cs{pgffuncshading*to*} (e.g.,
+\cs{pgffuncshadingrgbtocmyk}) macros along with \cs{ifpgfshadingmodel*} (e.g.,
+\cs{ifpgfshadingmodelcmyk}) conditionals are provided to assist with these
+transformations. Obviously, this will make the PostScript code less efficient
+than if you work in your intended color model.
+
+\pgfdeclarefunctionalshading[black]{portabletwospots}
+ {\pgfpointorigin}{\pgfpoint{3.5cm}{3.5cm}}{}{
+ 2 copy
+ 45 sub dup mul exch
+ 40 sub dup mul 0.5 mul add sqrt
+ dup mul neg 1.0005 exch exp 1.0 exch sub
+ 3 1 roll
+ 70 sub dup mul .5 mul exch
+ 70 sub dup mul add sqrt
+ dup mul neg 1.002 exch exp 1.0 exch sub
+ 1.0 3 1 roll
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}
+\begin{center}
+ \begin{minipage}{3.5cm}
+ |xcolor| |rgb| model:\medskip
+
+ \selectcolormodel{rgb}
+ \pgfuseshading{portabletwospots}
+ \end{minipage}\hspace{2cm}
+ \begin{minipage}{3.5cm}
+ |xcolor| |cmyk| model:\medskip
+
+ \selectcolormodel{cmyk}
+ \pgfuseshading{portabletwospots}
+ \end{minipage}\hspace{2cm}
+ \begin{minipage}{3.5cm}
+ |xcolor| |gray| model:\medskip
+
+ \selectcolormodel{gray}
+ \pgfuseshading{portabletwospots}
+ \end{minipage}
+\end{center}
+
+\begin{codeexample}[code only]
+\pgfdeclarefunctionalshading[black]{portabletwospots}{\pgfpointorigin}{\pgfpoint{3.5cm}{3.5cm}}{}{
+ 2 copy
+ 45 sub dup mul exch
+ 40 sub dup mul 0.5 mul add sqrt
+ dup mul neg 1.0005 exch exp 1.0 exch sub
+ 3 1 roll
+ 70 sub dup mul .5 mul exch
+ 70 sub dup mul add sqrt
+ dup mul neg 1.002 exch exp 1.0 exch sub
+ 1.0 3 1 roll
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}
+\end{codeexample}
+
+\begin{command}{\pgffuncshadingrgbtocmyk}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
+ top 3 elements on the stack from \textsc{rgb} to \textsc{cmyk}. In
+ combination with the \cs{ifpgfshadingmodelcmyk} conditional this macro can
+ be used to make functional shading declarations more portable across color
+ models.
+\end{command}
+
+\begin{command}{\pgffuncshadingrgbtogray}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
+ top 3 elements on the stack from \textsc{rgb} to grayscale. In combination
+ with the \cs{ifpgfshadingmodelgray} conditional this macro can be used to
+ make functional shading declarations more portable across color models.
+\end{command}
+
+\begin{command}{\pgffuncshadingcmyktorgb}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
+ top 4 elements on the stack from \textsc{cmyk} to \textsc{rgb}. In
+ combination with the \cs{ifpgfshadingmodelrgb} conditional this macro can be
+ used to make functional shading declarations more portable across color
+ models.
+\end{command}
+
+\begin{command}{\pgffuncshadingcmyktogray}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
+ top 4 elements on the stack from \textsc{cmyk} to grayscale. In combination
+ with the \cs{ifpgfshadingmodelgray} conditional this macro can be used to
+ make functional shading declarations more portable across color models.
+\end{command}
+
+\begin{command}{\pgffuncshadinggraytorgb}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
+ top element on the stack from grayscale to \textsc{rgb}. In combination with
+ the \cs{ifpgfshadingmodelrgb} conditional this macro can be used to make
+ functional shading declarations more portable across color models.
+\end{command}
+
+\begin{command}{\pgffuncshadinggraytocmyk}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
+ top element on the stack from grayscale to \textsc{cmyk}. In combination
+ with the \cs{ifpgfshadingmodelcmyk} conditional this macro can be used to
+ make functional shading declarations more portable across color models.
+\end{command}
+
+{\let\ifpgfshadingmodelrgb=\relax
+ \let\ifpgfshadingmodelcmyk=\relax
+ \let\ifpgfshadingmodelgray=\relax
+ \begin{command}{\ifpgfshadingmodelrgb}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to test if the
+ |xcolor| color model is |rgb| \emph{at the time the shading is created}.
+ This can be used to ensure that the data output in the \meta{type 4
+ function} correctly matches the active color model.
+ \end{command}
+
+ \begin{command}{\ifpgfshadingmodelcmyk}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to test if the
+ |xcolor| color model is |cmyk| \emph{at the time the shading is created}.
+ This can be used to ensure that the data output in the \meta{type 4
+ function} correctly matches the active color model.
+ \end{command}
+
+ \begin{command}{\ifpgfshadingmodelgray}
+ Within the \meta{type 4 function} argument of
+ \cs{pgfdeclarefunctionalshading}, this command can be used to test if the
+ |xcolor| color model is |gray| \emph{at the time the shading is created}.
+ This can be used to ensure that the data output in the \meta{type 4
+ function} correctly matches the active color model.
+ \end{command}
+}
+
+\subsection{Using Shadings}
+\label{section-shading-a-path}
+
+\begin{command}{\pgfuseshading\marg{shading name}}
+ Inserts a previously declared shading into the text. If you wish to use it
+ in a |pgfpicture| environment, you should put a |\pgftext| around it.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfdeclareverticalshading{myshadingD}
+ {20pt}{color(0pt)=(red); color(20pt)=(blue)}
+ \pgftext[at=\pgfpoint{1cm}{0cm}] {\pgfuseshading{myshadingD}}
+ \pgftext[at=\pgfpoint{2cm}{0.5cm}]{\pgfuseshading{myshadingD}}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfshadepath\marg{shading name}\marg{angle}}
+ This command must be used inside a |{pgfpicture}| environment. The effect
+ is a bit complex, so let us go over it step by step.
+
+ First, \pgfname\ will set up a local scope.
+
+ Second, it uses the current path to clip everything inside this scope.
+ However, the current path is once more available after the scope, so it can
+ be used, for example, to stroke it.
+
+ Now, the \meta{shading name} should be a shading whose width and height are
+ 100\,bp, that is, 100 big points. \pgfname\ has a look at the bounding box
+ of the current path. This bounding box is computed automatically when a
+ path is computed; however, it can sometimes be (quite a bit) too large,
+ especially when complicated curves are involved.
+
+ Inside the scope, the low-level transformation matrix is modified. The
+ center of the shading is translated (moved) such that it lies on the center
+ of the bounding box of the path. The low-level coordinate system is also
+ scaled such that the shading ``covers'' the path (the details are a bit
+ more complex, see below). Then, the coordinate system is rotated by
+ \meta{angle}. Finally, if the macro |\pgfsetadditionalshadetransform| has
+ been used, an additional transformation is applied.
+
+ After everything has been set up, the shading is inserted. Due to the
+ transformations and clippings, the effect will be that the shading seems
+ to ``fill'' the path.
+
+ If both the path and the shadings were always rectangles and if rotations
+ were never involved, it would be easy to scale shadings such they always
+ cover the path. However, when a vertical shading is rotated, it must
+ obviously be ``magnified'' so that it still covers the path. Things get
+ worse when the path is not a rectangle itself.
+
+ For these reasons, things work slightly differently ``in reality''. The
+ shading is scaled and translated such that the point
+ $(50\mathrm{bp},50\mathrm{bp})$, which is the middle of the shading, is at
+ the middle of the path and such that the point
+ $(25\mathrm{bp},25\mathrm{bp})$ is at the lower left corner of the path and
+ that $(75\mathrm{bp},75\mathrm{bp})$ is at upper right corner.
+
+ In other words, only the center quarter of the shading will actually
+ ``survive the clipping'' if the path is a rectangle. If the path is not a
+ rectangle, but, say, a circle, even less is seen of the shading. Here is an
+ example that demonstrates this effect:
+ %
+\begin{codeexample}[]
+\pgfdeclareverticalshading{myshadingE}{100bp}
+ {color(0bp)=(red); color(25bp)=(green); color(75bp)=(blue); color(100bp)=(black)}
+\pgfuseshading{myshadingE}
+\hskip 1cm
+\begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgfshadepath{myshadingE}{0}
+ \pgfusepath{stroke}
+ \pgfpathrectangle{\pgfpoint{3cm}{0cm}}{\pgfpoint{1cm}{2cm}}
+ \pgfshadepath{myshadingE}{0}
+ \pgfusepath{stroke}
+ \pgfpathrectangle{\pgfpoint{5cm}{0cm}}{\pgfpoint{2cm}{2cm}}
+ \pgfshadepath{myshadingE}{45}
+ \pgfusepath{stroke}
+ \pgfpathcircle{\pgfpoint{9cm}{1cm}}{1cm}
+ \pgfshadepath{myshadingE}{45}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ As can be seen above in the last case, the ``hidden'' part of the shading
+ actually \emph{can} become visible if the shading is rotated. The reason is
+ that it is scaled as if no rotation took place, then the rotation is done.
+
+ The following graphics show which part of the shading are actually shown:
+ %
+\begin{codeexample}[]
+\pgfdeclareverticalshading{myshadingF}{100bp}
+ {color(0bp)=(red); color(25bp)=(green); color(75bp)=(blue); color(100bp)=(black)}
+\begin{tikzpicture}
+ \draw (50bp,50bp) node {\pgfuseshading{myshadingF}};
+ \draw[white,thick] (25bp,25bp) rectangle (75bp,75bp);
+ \draw (50bp,0bp) node[below] {first two applications};
+
+ \begin{scope}[xshift=5cm]
+ \draw (50bp,50bp) node{\pgfuseshading{myshadingF}};
+ \draw[rotate around={45:(50bp,50bp)},white,thick] (25bp,25bp) rectangle (75bp,75bp);
+ \draw (50bp,0bp) node[below] {third application};
+ \end{scope}
+
+ \begin{scope}[xshift=10cm]
+ \draw (50bp,50bp) node{\pgfuseshading{myshadingF}};
+ \draw[white,thick] (50bp,50bp) circle (25bp);
+ \draw (50bp,0bp) node[below] {fourth application};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+ An advantage of this approach is that when you rotate a radial shading, no
+ distortion is introduced:
+ %
+\begin{codeexample}[]
+\pgfdeclareradialshading{ballshading}{\pgfpoint{-10bp}{10bp}}
+ {color(0bp)=(red!15!white); color(9bp)=(red!75!white);
+ color(18bp)=(red!70!black); color(25bp)=(red!50!black); color(50bp)=(black)}
+\pgfuseshading{ballshading}
+\hskip 1cm
+\begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
+ \pgfshadepath{ballshading}{0}
+ \pgfusepath{}
+ \pgfpathcircle{\pgfpoint{3cm}{0cm}}{1cm}
+ \pgfshadepath{ballshading}{0}
+ \pgfusepath{}
+ \pgfpathcircle{\pgfpoint{6cm}{0cm}}{1cm}
+ \pgfshadepath{ballshading}{45}
+ \pgfusepath{}
+\end{pgfpicture}
+\end{codeexample}
+
+ If you specify a rotation of $90^\circ$ and if the path is not a square,
+ but an elongated rectangle, the ``desired'' effect results: The shading
+ will exactly vary between the colors at the 25bp and 75bp boundaries. Here
+ is an example:
+ %
+\begin{codeexample}[]
+\pgfdeclareverticalshading{myshadingG}{100bp}
+ {color(0bp)=(red); color(25bp)=(green); color(75bp)=(blue); color(100bp)=(black)}
+\begin{pgfpicture}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgfshadepath{myshadingG}{0}
+ \pgfusepath{stroke}
+ \pgfpathrectangle{\pgfpoint{3cm}{0cm}}{\pgfpoint{2cm}{1cm}}
+ \pgfshadepath{myshadingG}{90}
+ \pgfusepath{stroke}
+ \pgfpathrectangle{\pgfpoint{6cm}{0cm}}{\pgfpoint{2cm}{1cm}}
+ \pgfshadepath{myshadingG}{45}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+
+ As a final example, let us define a ``rainbow spectrum'' shading for use
+ with \tikzname.
+ %
+\begin{codeexample}[]
+\pgfdeclareverticalshading{rainbow}{100bp}
+ {color(0bp)=(red); color(25bp)=(red); color(35bp)=(yellow);
+ color(45bp)=(green); color(55bp)=(cyan); color(65bp)=(blue);
+ color(75bp)=(violet); color(100bp)=(violet)}
+\begin{tikzpicture}[shading=rainbow]
+ \shade (0,0) rectangle node[white] {\textsc{pride}} (2,1);
+ \shade[shading angle=90] (3,0) rectangle +(1,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that rainbow shadings are \emph{way} too colorful in almost all
+ applications.
+\end{command}
+
+\begin{command}{\pgfsetadditionalshadetransform\marg{transformation}}
+ This command allows you to specify an additional transformation that should
+ be applied to shadings when the |\pgfshadepath| command is used. The
+ \meta{transformation} should be transformation code like
+ |\pgftransformrotate{20}|.
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-transformations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-transformations.tex
new file mode 100644
index 0000000000..2cd4553dfe
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-transformations.tex
@@ -0,0 +1,1222 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Coordinate, Canvas, and Nonlinear Transformations}
+
+\subsection{Overview}
+
+\pgfname\ offers different ways of scaling, shifting, and rotating (these
+operations are generally known as \emph{transformations}) graphics: You can
+apply \emph{coordinate transformations} to all coordinates, you can apply
+\emph{canvas transformations} to the canvas on which you draw, and you can
+apply \emph{additional nonlinear transformations}. (The names ``coordinate''
+and ``canvas'' transformations are not standard, I introduce them only for the
+purposes of this manual.)
+
+The differences are the following:
+%
+\begin{itemize}
+ \item As the name ``coordinate transformation'' suggests, coordinate
+ transformations apply only to coordinates. For example, when you
+ specify a coordinate like |\pgfpoint{1cm}{2cm}| and you wish to ``use''
+ this coordinate -- for example as an argument to a |\pgfpathmoveto|
+ command -- then the coordinate transformation matrix is applied to the
+ coordinate, resulting in a new coordinate. Continuing the example, if
+ the current coordinate transformation is ``scale by a factor of two'',
+ the coordinate |\pgfpoint{1cm}{2cm}| actually designates the point
+ $(2\mathrm{cm},4\mathrm{cm})$.
+
+ Note that coordinate transformations apply \emph{only} to coordinates.
+ They do not apply to, say, line width or shadings or text.
+ \item The effect of a ``canvas transformation'' like ``scale by a factor of
+ two'' can be imagined as follows: You first draw your picture on a
+ ``rubber canvas'' normally. Then, once you are done, the whole canvas
+ is transformed, in this case stretched by a factor of two. In the
+ resulting image \emph{everything} will be larger: Text, lines,
+ coordinates, and shadings.
+ \item Nonlinear transformations are a special form of coordinate
+ transformations that are, as the name suggests, not linear. The support
+ for nonlinear transformations is quite different from the support for
+ linear coordinate transformations, the main reason being speed: While
+ linear coordinate transformations can be applied very quickly
+ (\pgfname\ does so almost constantly), nonlinear transformations are
+ much harder to apply and also to use. For this reason, nonlinear
+ transformations are implemented in a special module
+ |nonlineartransformations| that has to be loaded explicitly. By
+ default, they are not available.
+\end{itemize}
+
+In many cases, it is preferable that you use coordinate transformations and not
+canvas transformations. When canvas transformations are used, \pgfname\ looses
+track of the coordinates of nodes and shapes. Also, canvas transformations
+often cause undesirable effects like changing text size. For these reasons,
+\pgfname\ makes it easy to setup the coordinate transformation, but a bit
+harder to change the canvas transformation. Because of the speed penalties
+caused by nonlinear transformations, they are even harder to set up.
+
+
+\subsection{Coordinate Transformations}
+\label{section-linear-coordinate-transformations}
+
+\subsubsection{How PGF Keeps Track of the Coordinate Transformation Matrix}
+\label{section-transform-cm}
+
+\pgfname\ has an internal coordinate transformation matrix. This matrix is
+applied to coordinates ``in certain situations''. This means that the matrix is
+not always applied to every coordinate ``no matter what''. Rather, \pgfname\
+tries to be reasonably smart at when and how this matrix should be applied. The
+most prominent examples are the path construction commands, which apply the
+coordinate transformation matrix to their inputs.
+
+The coordinate transformation matrix consists of four numbers $a$, $b$, $c$,
+and $d$, and two dimensions $s$ and $t$. When the coordinate transformation
+matrix is applied to a coordinate $(x,y)$, the new coordinate
+$(ax+cy+s,bx+dy+t)$ results. For more details on how transformation matrices
+work in general, please see, for example, the \textsc{pdf} or PostScript
+reference or a textbook on computer graphics.
+
+The coordinate transformation matrix is equal to the identity matrix at the
+beginning. More precisely, $a=1$, $b=0$, $c=0$, $d=1$, $s=0\mathrm{pt}$, and
+$t=0\mathrm{pt}$.
+
+The different coordinate transformation commands will modify the matrix by
+concatenating it with another transformation matrix. This way the effect of
+applying several transformation commands will \emph{accumulate}.
+
+The coordinate transformation matrix is local to the current \TeX\ group
+(unlike the canvas transformation matrix, which is local to the current
+|{pgfscope}|). Thus, the effect of adding a coordinate transformation to the
+coordinate transformation matrix will last only till the end of the current
+\TeX\ group.
+
+
+\subsubsection{Commands for Relative Coordinate Transformations}
+
+The following commands add a basic coordinate transformation to the current
+coordinate transformation matrix. For all commands, the transformation is
+applied \emph{in addition} to any previous coordinate transformations.
+
+\begin{command}{\pgftransformshift\marg{point}}
+ Shifts coordinates by \meta{point}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformshift{\pgfpoint{1cm}{1cm}}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformxshift\marg{dimensions}}
+ Shifts coordinates by \meta{dimension} along the $x$-axis.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformxshift{.5cm}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformyshift\marg{dimensions}}
+ Like |\pgftransformxshift|, only for the $y$-axis.
+\end{command}
+
+\begin{command}{\pgftransformscale\marg{factor}}
+ Scales coordinates by \meta{factor}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformscale{.75}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformxscale\marg{factor}}
+ Scales coordinates by \meta{factor} in the $x$-direction.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformxscale{.75}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformyscale\marg{factor}}
+ Like |\pgftransformxscale|, only for the $y$-axis.
+\end{command}
+
+\begin{command}{\pgftransformxslant\marg{factor}}
+ Slants coordinates by \meta{factor} in the $x$-direction. Here, a factor of
+ |1| means $45^\circ$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformxslant{.5}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformyslant\marg{factor}}
+ Slants coordinates by \meta{factor} in the $y$-direction.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformyslant{-1}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\begin{command}{\pgftransformrotate\marg{angles}}
+ Rotates coordinates counterclockwise by \meta{angles} given in degrees.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformrotate{30}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformtriangle\marg{a}\marg{b}\marg{c}}
+ This command transforms the coordinate system in such a way that the
+ triangle given by the points \meta{a}, \meta{b} and \meta{c} lies at the
+ coordinates $(0,0)$, $(1\mathrm{pt},0\mathrm{pt})$ and
+ $(0\mathrm{pt},1\mathrm{pt})$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformtriangle
+ {\pgfpoint{1cm}{0cm}}
+ {\pgfpoint{0cm}{2cm}}
+ {\pgfpoint{3cm}{1cm}}
+
+ \draw (0,0) -- (1pt,0pt) -- (0pt,1pt) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformcm\marg{a}\marg{b}\marg{c}\marg{d}\marg{point}}
+ Applies the transformation matrix given by $a$, $b$, $c$, and $d$ and the
+ shift \meta{point} to coordinates (in addition to any previous
+ transformations already in force).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformcm{1}{1}{0}{1}{\pgfpoint{.25cm}{.25cm}}
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformarrow\marg{start}\marg{end}}
+ Shifts coordinates to the end of the line going from \meta{start} to
+ \meta{end} with the correct rotation.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (3,1);
+ \pgftransformarrow{\pgfpointorigin}{\pgfpoint{3cm}{1cm}}
+ \pgftext{tip}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformlineattime\marg{time}\marg{start}\marg{end}}
+ Shifts coordinates by a specific point on a line at a specific time. The
+ point by which the coordinate is shifted is calculated by calling
+ |\pgfpointlineattime|, see Section~\ref{section-pointsattime}.
+
+ In addition to shifting the coordinate, a rotation \emph{may} also be
+ applied. Whether this is the case depends on whether the \TeX\ if
+ |\ifpgfslopedattime| is set to true or not.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1);
+ \pgftransformlineattime{.25}{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (2,1);
+ \pgfslopedattimetrue
+ \pgftransformlineattime{.25}{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ If |\ifpgfslopedattime| is true, another \TeX\ |\if| is important:
+ |\ifpgfallowupsidedowattime|. If this is false, \pgfname\ will ensure that
+ the rotation is done in such a way that text is never ``upside down''.
+
+ There is another \TeX\ |\if| that influences this command. If you set
+ |\ifpgfresetnontranslationattime| to true, then, between shifting the
+ coordinate and (possibly) rotating/sloping the coordinate, the command
+ |\pgftransformresetnontranslations| is called. See the description of this
+ command for details.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformscale{1.5}
+ \draw (0,0) -- (2,1);
+ \pgfslopedattimetrue
+ \pgfresetnontranslationattimefalse
+ \pgftransformlineattime{.25}{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformscale{1.5}
+ \draw (0,0) -- (2,1);
+ \pgfslopedattimetrue
+ \pgfresetnontranslationattimetrue
+ \pgftransformlineattime{.25}{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformcurveattime\marg{time}\marg{start}\marg{first support}\marg{second support}\marg{end}}
+ Shifts coordinates by a specific point on a curve at a specific time, see
+ Section~\ref{section-pointsattime} once more.
+
+ As for the line-at-time transformation command, |\ifpgfslopedattime|
+ decides whether an additional rotation should be applied. Again, the value
+ of |\ifpgfallowupsidedowattime| is also considered.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) .. controls (0,2) and (1,2) .. (2,1);
+ \pgftransformcurveattime{.25}{\pgfpointorigin}
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{1cm}{2cm}}{\pgfpoint{2cm}{1cm}}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) .. controls (0,2) and (1,2) .. (2,1);
+ \pgfslopedattimetrue
+ \pgftransformcurveattime{.25}{\pgfpointorigin}
+ {\pgfpoint{0cm}{2cm}}{\pgfpoint{1cm}{2cm}}{\pgfpoint{2cm}{1cm}}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The value of |\ifpgfresetnontranslationsattime| is also taken into account.
+\end{command}
+
+\begin{command}{\pgftransformarcaxesattime\marg{time
+ $t$}\marg{center}\marg{0-degree axis}\marg{90-degree
+ axis}\marg{start angle}\marg{end angle}%
+}
+ Shifts coordinates by a specific point on an arc at a specific time, see
+ Section~\ref{section-pointsattime} once more.
+
+ As for the previous commands, |\ifpgfslopedattime| decides whether an
+ additional rotation should be applied and |\ifpgfallowupsidedowattime| is
+ also considered.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpoint{2cm}{1cm}}
+ \pgfpatharcaxes{0}{60}{\pgfpoint{2cm}{0cm}}{\pgfpoint{0cm}{1cm}}
+ \pgfusepath{stroke}
+ \pgfslopedattimetrue
+ \pgftransformarcaxesattime{.25}
+ {\pgfpoint{0cm}{1cm}}
+ {\pgfpoint{2cm}{0cm}}{\pgfpoint{0cm}{1cm}}
+ {0}{60}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The value of |\ifpgfresetnontranslationsattime| is also taken into account.
+\end{command}
+
+{
+ \let\ifpgfslopedattime=\relax
+ \begin{textoken}{\ifpgfslopedattime}
+ Decides whether the ``at time'' transformation commands also rotate
+ coordinates or not.
+ \end{textoken}
+}
+{
+ \let\ifpgfallowupsidedowattime=\relax
+ \begin{textoken}{\ifpgfallowupsidedowattime}
+ Decides whether the ``at time'' transformation commands should allow
+ the rotation be done in such a way that ``upside-down text'' can
+ result.
+ \end{textoken}
+}
+{
+ \let\ifpgfresetnontranslationsattime=\relax
+ \begin{textoken}{\ifpgfresetnontranslationsattime}
+ Decides whether the ``at time'' transformation commands should reset
+ the non-translations between shifting and rotating.
+ \end{textoken}
+}
+
+
+\subsubsection{Commands for Absolute Coordinate Transformations}
+
+The coordinate transformation commands introduced up to now are always applied
+in addition to any previous transformations. In contrast, the commands
+presented in the following can be used to change the transformation matrix ``in
+absolute terms''. Note that this is, in general, dangerous and will often
+produce unexpected effects. You should use these commands only if you really
+know what you are doing.
+
+\begin{command}{\pgftransformreset}
+ Resets the coordinate transformation matrix to the identity matrix. Thus,
+ once this command is given no transformations are applied till the end of
+ the scope.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformrotate{30}
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransformreset
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransformresetnontranslations}
+ This command sets the $a$, $b$, $c$, and $d$ part of the coordinate
+ transformation matrix to $a=1$, $b=0$, $c=0$, and $d=1$. However, the
+ current shifting of the matrix is not modified.
+
+ The effect of this command is that any rotation/scaling/slanting is undone
+ in the current \TeX\ group, but the origin is not ``moved back''.
+
+ This command is mostly useful directly before a |\pgftext| command to
+ ensure that the text is not scaled or rotated.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformscale{2}
+ \pgftransformrotate{30}
+ \pgftransformxshift{1cm}
+ {\color{red}\pgftext{rotated}}
+ \pgftransformresetnontranslations
+ \pgftext{shifted only}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgftransforminvert}
+ Replaces the coordinate transformation matrix by a coordinate
+ transformation matrix that ``exactly undoes the original transformation''.
+ For example, if the original transformation was ``scale by 2 and then shift
+ right by 1cm'' the new one is ``shift left by 1cm and then scale by
+ $1/2$''.
+
+ This command will produce an error if the determinant of the matrix is too
+ small, that is, if the matrix is near-singular.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgftransformrotate{30}
+ \draw (0,0) -- (2,1) -- (1,0);
+ \pgftransforminvert
+ \draw[red] (0,0) -- (2,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Saving and Restoring the Coordinate Transformation Matrix}
+
+There are two commands for saving and restoring coordinate transformation
+matrices.
+
+\begin{command}{\pgfgettransform\marg{macro}}
+ This command will (locally) define \meta{macro} to a representation of the
+ current coordinate transformation matrix. This matrix can later on be
+ reinstalled using |\pgfsettransform|.
+\end{command}
+
+\begin{command}{\pgfsettransform\marg{macro}}
+ Reinstalls a coordinate transformation matrix that was previously saved
+ using |\pgfgettransform|.
+\end{command}
+
+\begin{command}{\pgfgettransformentries\marg{macro for a}\marg{macro
+ for b}\marg{macro for c}\marg{macro for d}\marg{macro for shift
+ x}\marg{macro for shift y}%
+}
+ This command is similar to |\pgfgettransform| except that it stores the
+ current coordinate transformation matrix in a set of six macros.
+
+ The matrix can later on be reinstalled using |\pgfsettransformentries|.
+ Furthermore, all these macros (or just a few of them) can be used as
+ arguments for |\pgftransformcm|.
+\end{command}
+
+\begin{command}{\pgfsettransformentries\marg{a}\marg{b}\marg{c}\marg{d}\marg{shiftx}\marg{shifty}}
+ Reinstalls a coordinate transformation matrix that was previously saved
+ using the storage command |\pgfgettransformentries|. This command can also
+ be used to replace any previously existing coordinate transformation matrix
+ (it is thus equivalent to |\pgftransformreset| followed by
+ |\pgftransformcm|).
+\end{command}
+
+
+\subsubsection{Computing Adjustments for Coordinate Transformations}
+\label{section-adjustment-transformations}
+
+\begin{command}{\pgftransformationadjustments}
+ This command computes ``adjustments'' for the current transformation matrix
+ so that even when you install a transformation matrix that scales
+ everything by a certain factor, you can still draw something of ``an
+ absolute size''. Suppose for instance that you install a transformation
+ matrix that scales everything by a factor of 4 and you now wish to draw a
+ horizontal line of length 1cm. Then, if you do not reset the transformation
+ matrix, you can draw a line of logical length 2.5mm, which will then get
+ scaled to a line of 1cm. Things get more difficult in case you scale things
+ only, say, vertically. In this case, the adjustment necessary for
+ horizontal lines is different from the one needed for vertical lines.
+
+ This function computes two scaling factors, one for horizontal lines
+ and one for vertical lines, and stores them in the following macros:
+ %
+ \begin{command}{\pgfhorizontaltransformationadjustment}
+ When you scale the length of a horizontal line by this factor in the
+ current transformation, you compensate for the scaling. Formally, it is
+ $1/\|\mathit{transform}(1,0)\|_2$, where $\mathit{transform}$ applies
+ the current transformations matrix to the given number.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (2,2);
+ \begin{scope}[xscale=2,thick]
+ \draw [red] (1,1) -- ++(1,0);
+
+ \pgftransformationadjustments
+ \draw [blue] (1,0) -- ++(\pgfhorizontaltransformationadjustment,0);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (2,2);
+ \begin{scope}[xscale=2,thick,rotate=90]
+ \draw [red] (1,1) -- ++(1,0);
+
+ \pgftransformationadjustments
+ \draw [blue] (1,0) -- ++(\pgfhorizontaltransformationadjustment,0);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ \end{command}
+ %
+ \begin{command}{\pgfverticaltransformationadjustment}
+ $1/\|\mathit{transform}(0,1)\|_2$.
+ \end{command}
+
+ Note that the ``right'' way to draw a line of absolute length 1cm in a
+ transformed coordinate system is to first compute the start point and to
+ then reset the transformation matrix. The transformation adjustments
+ computed here are important only in situations where you cannot do this,
+ for instance when an |outer xsep| must be set.
+\end{command}
+
+
+\subsection{Canvas Transformations}
+
+The canvas transformation matrix is not managed by \pgfname, but by the output
+format like \pdf\ or PostScript. All that \pgfname\ does is to call appropriate
+low-level |\pgfsys@| commands to change the canvas transformation matrix.
+
+Unlike coordinate transformations, canvas transformations apply to
+``everything'', including images, text, shadings, line thickness, and so on.
+The idea is that a canvas transformation really stretches and deforms the
+canvas after the graphic is finished.
+
+Unlike coordinate transformations, canvas transformations are local to the
+current |{pgfscope}|, not to the current \TeX\ group. This is due to the fact
+that they are managed by the backend driver, not by \TeX\ or \pgfname.
+
+Unlike the coordinate transformation matrix, it is not possible to ``reset''
+the canvas transformation matrix. The only way to change it is to concatenate
+it with another canvas transformation matrix or to end the current
+|{pgfscope}|.
+
+Unlike coordinate transformations, \pgfname\ does not ``keep track'' of canvas
+transformations. In particular, it will not be able to correctly save the
+coordinates of shapes or nodes when a canvas transformation is used.
+
+
+\subsubsection{Applying General Canvas Transformations}
+
+\pgfname\ does not offer many commands for modifying the canvas transformation
+matrix. Instead, different commands allow you to concatenate the canvas
+transformation matrix with a coordinate transformation matrix (and there are
+numerous commands for specifying a coordinate transformation, see the previous
+section).
+
+\begin{command}{\pgflowlevelsynccm}
+ This command concatenates the canvas transformation matrix with the current
+ coordinate transformation matrix. Afterward, the coordinate transformation
+ matrix is reset.
+
+ The effect of this command is to ``synchronize'' the coordinate
+ transformation matrix and the canvas transformation matrix. All
+ transformations that were previously applied by the coordinate
+ transformations matrix are now applied by the canvas transformation matrix.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfsetlinewidth{1pt}
+ \pgftransformscale{5}
+ \draw (0,0) -- (0.4,.2);
+ \pgftransformxshift{0.2cm}
+ \pgflowlevelsynccm
+ \draw[red] (0,0) -- (0.4,.2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgflowlevel\marg{transformation code}}
+ This command concatenates the canvas transformation matrix with the
+ coordinate transformation specified by \meta{transformation code}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfsetlinewidth{1pt}
+ \pgflowlevel{\pgftransformscale{5}}
+ \draw (0,0) -- (0.4,.2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgflowlevelobj\marg{transformation code}\marg{code}}
+ This command creates a local |{pgfscope}|. Inside this scope,
+ |\pgflowlevel| is first called with the argument \meta{transformation
+ code}, then the \meta{code} is inserted.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfsetlinewidth{1pt}
+ \pgflowlevelobj{\pgftransformscale{5}} {\draw (0,0) -- (0.4,.2);}
+ \pgflowlevelobj{\pgftransformxshift{-1cm}}{\draw (0,0) -- (0.4,.2);}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{environment}{{pgflowlevelscope}\marg{transformation code}}
+ This environment first surrounds the \meta{environment contents} by a
+ |{pgfscope}|. Then it calls |\pgflowlevel| with the argument
+ \meta{transformation code}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfsetlinewidth{1pt}
+ \begin{pgflowlevelscope}{\pgftransformscale{5}}
+ \draw (0,0) -- (0.4,.2);
+ \end{pgflowlevelscope}
+ \begin{pgflowlevelscope}{\pgftransformxshift{-1cm}}
+ \draw (0,0) -- (0.4,.2);
+ \end{pgflowlevelscope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{environment}
+
+\begin{plainenvironment}{{pgflowlevelscope}\marg{transformation code}}
+ Plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgflowlevelscope}\marg{transformation code}}
+ Con\TeX t version of the environment.
+\end{contextenvironment}
+
+
+\subsubsection{Establishing View Boxes}
+\label{section-base-view}
+
+A \emph{view box} is like a ``window'' through which you see a graphic. To
+establish a view box, you specify a rectangle -- which is the window -- and
+another rectangle surrounding the to-be-viewed graphic. The graphic will then
+be rescaled and shifted in such a way that the to-be-viewed rectangle matches
+the view box's rectangle as well as possible. Note that establishing a view box
+does, indeed, cause a canvas transformation to be installed.
+
+View boxes are only seldom needed in normal graphics. Their main application is
+with animations since you can \emph{animate} the to-be-viewed rectangle. This
+makes it easy to create animations in which you zoom in, zoom out, and pan a
+graphic.
+
+\begin{environment}{{pgfviewboxscope}\marg{$ll_1$}\marg{$ur_1$}\marg{$ll_2$}\marg{$ur_2$}\marg{meet or slice}}
+ Inside the viewbox scope, the source rectangle (with the two \pgfname\
+ points $ll_1$ and $ur_1$ as corners) will be translated and scaled so that
+ it becomes centered on the target rectangle (with the corners $ll_2$ and
+ $ur_2$) and will, for |meet| as last parameter, be as large as possible so
+ that it fits inside the target and, for |slice|, be as small as possible so
+ that it encompasses the target.
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [red, very thick] (0,0) rectangle (20mm,20mm);
+ \begin{pgfviewboxscope}
+ {\pgfpoint{5mm}{5mm}}{\pgfpoint{25mm}{15mm}} % Source
+ {\pgfpoint{0mm}{0mm}}{\pgfpoint{20mm}{20mm}} % Target
+ {meet}
+ \draw [blue, very thick] (5mm,5mm) rectangle (25mm,15mm);
+ \draw [thick] (1,1) circle [radius=8mm] node {Hi};
+ \end{pgfviewboxscope} }
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [red, very thick] (0,0) rectangle (20mm,20mm);
+ \begin{pgfviewboxscope}
+ {\pgfpoint{5mm}{5mm}}{\pgfpoint{25mm}{15mm}} % Source
+ {\pgfpoint{0mm}{0mm}}{\pgfpoint{20mm}{20mm}} % Target
+ {slice}
+ \draw [blue, very thick] (5mm,5mm) rectangle (25mm,15mm);
+ \draw [thick] (1,1) circle [radius=8mm] node {Hi};
+ \end{pgfviewboxscope} }
+\end{codeexample}
+ %
+\end{environment}
+
+\begin{plainenvironment}{{pgfviewboxscope}\marg{$ll_1$}\marg{$ur_1$}\marg{$ll_2$}\marg{$ur_2$}\marg{meet or slice}}
+ Plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{pgfviewboxscope}\marg{$ll_1$}\marg{$ur_1$}\marg{$ll_2$}\marg{$ur_2$}\marg{meet or slice}}
+ Con\TeX t version of the environment.
+\end{contextenvironment}
+
+
+\subsection{Nonlinear Transformations}
+\label{section-nonlinear-transformations}
+
+In order to use nonlinear transformations, you first have to load the following
+\pgfname\ module:
+
+\begin{pgfmodule}{nonlineartransformations}
+ Loads the necessary functionality for nonlinear transformations.
+\end{pgfmodule}
+
+
+\subsubsection{Introduction}
+
+The difference between the coordinate transformations introduced in
+Section~\ref{section-linear-coordinate-transformations} above to nonlinear
+transformations is, of course, that the transformations can be nonlinear. An
+example of a nonlinear transformation is the transformation underlying polar
+coordinates: A polar coordinate $(r,d)$ gets transformed to the canvas position
+$(d\cos r,d\sin r)$, which is clearly not a linear transformation.
+
+Nonlinear transformations work somewhat like the normal linear coordinate
+transformations in the sense that they apply to coordinate and thereby to the
+construction of paths, but not to things like text or line width or shadings.
+(Indeed, it is not possible to apply nonlinear transformations to, say, text.)
+
+This means that there is a fundamental difference between, on the one hand,
+calling a function like |\pgfpointpolar| or specifying a coordinate as |(45:2)|
+in \tikzname\ and, on the other hand, installing the nonlinear transformation
+``polar coordinates'' using the command |\pgftransformnonlinear|: In a
+coordinate like |(45:2)| the user explicitly says ``please evaluate this one
+coordinate in polar coordinate and then continue in the normal coordinate
+system with the result''. Otherwise nothing changes and a line between two
+points specified in this way is still a straight line.
+
+Things are quite different when we install a polar \emph{transformation} using
+|\pgftransformnonlinear|. Now, even a seemingly low-level Cartesian coordinate
+|\pgfqpoint{1pt}{1pt}| will get transformed. Even more drastically, what is
+specified as a straight line like
+%
+\begin{codeexample}[code only]
+\draw (0,1) -- (1,1);
+\end{codeexample}
+%
+can become curved since \emph{everything} gets transformed.
+
+
+\subsubsection{Installing Nonlinear Transformation}
+
+\makeatletter
+\def\polartransformation{
+ % \pgf@x will contain the radius
+ % \pgf@y will contain the distance
+ \pgfmathsincos@{\pgf@sys@tonumber\pgf@x}%
+ % pgfmathresultx is now the cosine of radius and
+ % pgfmathresulty is the sine of radius
+ \pgf@x=\pgfmathresultx\pgf@y%
+ \pgf@y=\pgfmathresulty\pgf@y%
+}
+\makeatother
+
+\begin{command}{\pgftransformnonlinear\marg{transformation code}}
+ This command adds the \meta{transformation code} to the list of non-linear
+ transformations currently in force. Thus, similar to linear coordinate
+ transformations, each additional call to this function adds another
+ transformation to the current \TeX\ scope and the effect ends at the end of
+ the current scope. In practice, however, you typically will not have more
+ than one active nonlinear transformation.
+
+ The job of the \meta{transformation code} is to map a point~$p$ given in
+ the registers |\pgf@x| and |\pgf@y| to a new coordinate~$f(p)$, which
+ should be returned in |\pgf@x| and |\pgf@y| as well. As an example, suppose
+ we wish to install polar coordinates as the nonlinear transformation. For
+ this, we need a bit of code:
+ %
+\begin{codeexample}[code only]
+\def\polartransformation{%
+ % \pgf@x will contain the radius
+ % \pgf@y will contain the distance
+ \pgfmathsincos@{\pgf@sys@tonumber\pgf@x}%
+ % pgfmathresultx is now the cosine of radius and
+ % pgfmathresulty is the sine of radius
+ \pgf@x=\pgfmathresultx\pgf@y%
+ \pgf@y=\pgfmathresulty\pgf@y%
+}
+\end{codeexample}
+ %
+ (In case you wonder why you cannot just call |\pgfpointpolar| at this
+ point: You can, but this function internally uses |\pgf@x| and |\pgf@y| in
+ complicated ways, so you would first have to safe them so some other
+ registers. Also, the above is faster.)
+
+ If we were to call this function again, we would get something funny like
+ ``polar-polar coordinates'', so let's not do this. Let us instead have a
+ look at the effect this call has: Once a nonlinear transformation is
+ installed, all subsequent path constructions are affected by this
+ transformation. In particular, a normal grid now becomes the typical
+ ``polar grid''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ % Start nonlinear transformation
+ \pgftransformnonlinear{\polartransformation}% see above
+
+ % Draw something with this transformation in force
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Applying Nonlinear Transformations to Points}
+
+\begin{command}{\pgfpointtransformednonlinear\marg{point}}
+ Works like |\pgfpointtransformed|, but also applies the current nonlinear
+ transformation; that is, it first applies the current linear transformation
+ and then the current nonlinear transformations. Note that, just like
+ |\pgfpointtransformed|, you normally do not call this function directly
+ since it is called internally by the path drawing commands.
+\end{command}
+
+
+\subsubsection{Applying Nonlinear Transformations to Paths}
+
+When a nonlinear transformation is installed, the normal path construction
+commands like |\pgfpathmoveto| get adjusted so that the ``honour'' the
+nonlinear transformations currently in force. For |\pgfpathmoveto| this is
+pretty simple: Instead of just applying the linear transformation matrix to the
+point to which the path should ``jump'' next, we also apply the nonlinear
+transformation. However, for a command like |\pgfpathlineto|, things are much
+more difficult: A straight line will no longer be a straight line!
+
+In order to make straight lines ``bend'', the following changes are in force
+while a nonlinear transformation is installed:
+%
+\begin{enumerate}
+ \item Whenever a straight line between two points $p$ and $q$ should be
+ added to the path, either through |\pgfpathlineto| or through
+ |\pgfpathclose|, we replace this straight line by a ``degenerated
+ curve'' from $p$ to $q$ whose control points are at one third and two
+ third of the distance between $p$ and $q$ on the line between $p$ and
+ $q$. In this way, while nonlinear transformations are in force, we only
+ need to transform curves.
+ \item Next, suppose we wish to transform a curve from $p$ to $q$ with
+ supports $s$ and $t$. For this, we simply apply the nonlinear
+ transformation $f$ to all four points and draw a line with the results.
+ Note that this mapping is actually not quite satisfactory for long
+ lines that are strongly curved:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgftransformnonlinear{\polartransformation}
+ % The curve with the controls computed by pgf: a nice quarter arc
+ \draw [red] (0,20mm) -- (90pt,20mm);
+ }
+ % Here is the curve with controls just transformed:
+ \draw (0:20mm) .. controls (30pt:20mm) and (60pt:20mm) .. (90pt:20mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ As the example shows, the control points now lie on the arc; but in
+ reality they should point along the tangents at the start and the end.
+ This is exactly when \pgfname\ does through the computation described
+ above.
+ \item To overcome the effect of the control points being ``off'', it is
+ necessary to split up longer curves into smaller parts, which are drawn
+ individually to increase the accuracy. When such splitting occurs, can
+ be configured using the following command:
+ %
+ \begin{command}{\pgfsettransformnonlinearflatness\marg{dimension} (initially 5pt)}
+ Whenever in a to-be-drawn curve the $L^\infty$-distance (maximum of
+ the distances in $x$- and $y$-directions) between the start of a
+ curve and its first control point or between the first and second
+ control points or between the second control point and the end is
+ more than \meta{distance}, the curve gets split in the middle (more
+ precisely, at time $t= 0.5$) and we draw the two parts individually
+ (for them, splitting may occur again, if the curve is still too
+ long).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \draw[red] (0:20mm) arc [start angle=0, end angle=90, radius=2cm];
+ {
+ \pgftransformnonlinear{\polartransformation}
+ \pgfsettransformnonlinearflatness{2pt} % very precise
+ \draw (0,20mm) -- (90pt,20mm);
+ }
+\end{tikzpicture}
+\end{codeexample}
+ \end{command}
+\end{enumerate}
+
+
+\subsubsection{Applying Nonlinear Transformations to Text}
+
+Earlier, it was pointed that nonlinear transformations do not apply to text.
+Nevertheless, when you use |\pgftext| or |\pgfnode|, \pgfname\ will do a sort
+of ``best effort'' to render the text in the nonlinear coordinate system: The
+point where the text should be shown can obviously be computed easily. When
+then temporarily reset the nonlinear transformation and, instead, setup a
+linear transformation that matches the nonlinear transformation at the point
+where the text should be. Then, the text is shown. This means that if the text
+is longer, it will not ``follow'' the nonlinear transformation, but near the
+origin of the text it will look ``correct''. As an example, let us add some
+text at the grid point of the above example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \pgftransformnonlinear{\polartransformation}% see above
+
+ % Draw something with this transformation in force
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+
+ \foreach \angle in {0,30,60,90}
+ \foreach \dist in {1,2}
+ {
+ \pgftransformshift{\pgfpoint{\angle pt}{\dist cm}}
+ \pgftext{\angle$^\circ$}
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Approximating Nonlinear Transformations Using Linear Transformations}
+
+At any given point, the current nonlinear transformation can be approximated
+using a linear transformation. The following two functions allow you to install
+such a local approximation:
+
+\begin{command}{\pgfapproximatenonlineartransformation}
+ This command will do two things:
+ %
+ \begin{enumerate}
+ \item It clears the nonlinear transformations for the rest of the
+ current \TeX\ scope, so only linear transformations apply.
+ \item However, before removing the nonlinear transformations, the
+ linear transformation matrix is modified so that it mimics the
+ effect the nonlinear transformation had at the origin. That is,
+ after you call this command, drawing something near the origin will
+ look almost the same as if you had not called it.
+ \end{enumerate}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \pgftransformnonlinear{\polartransformation}% see above
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+
+ \begin{scope}[shift={(45pt,20mm)}]
+ % Draw something near "origin":
+ \draw [red] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [red] (10pt,-10pt) -- (-10pt,10pt);
+
+ % Now draw the same, but in the "approximate" coordinate system:
+ \pgfapproximatenonlineartransformation
+ \draw [] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [] (10pt,-10pt) -- (-10pt,10pt);
+ \pgftext{foo};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ This command is used by |\pgftext| and |\pgfnode| to transform text when a
+ nonlinear transformation is in force.
+\end{command}
+
+\begin{command}{\pgfapproximatenonlineartranslation}
+ This command works like the normal approximation command, but it will only
+ approximate how the origin gets translated, it will not approximate the
+ rotation, skewing, or scaling that is involved. This is useful for drawing
+ text at the right position, but without ``mutilating'' the text.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \pgftransformnonlinear{\polartransformation}% see above
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+
+ \begin{scope}[shift={(45pt,20mm)}]
+ % Draw something near "origin":
+ \draw [red] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [red] (10pt,-10pt) -- (-10pt,10pt);
+
+ % Now draw the same, but in the "approximate" coordinate system:
+ \pgfapproximatenonlineartranslation
+ \draw [] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [] (10pt,-10pt) -- (-10pt,10pt);
+ \pgftext{foo};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Nonlinear Transformation Libraries}
+\label{section-library-curvilinear}
+
+\begin{pgflibrary}{curvilinear}
+ This library defines commands for computing nonlinear transformations
+ ``along Bézier curves''.
+\end{pgflibrary}
+
+Up to now, our running example for a nonlinear transformation was polar
+transformation. However, is \pgfname\ nonlinear transformations are
+\emph{actually} mainly used for transforming arrow tips; and these need to be
+transformed ``along curves''. The |curvilinear| library defines a number of
+commands that offer the necessary computations for such transformations.
+
+\begin{command}{\pgfsetcurvilinearbeziercurve\marg{start}\marg{first support}\marg{second support}\marg{end}}
+ Prior to using any other command from this library, you first call this
+ function to ``install'' a Bézier curve to which the commands will refer.
+ This curve will be local to the current \TeX\ scope and you can install
+ only one curve at a time.
+
+ The main job of this command is to store the passed points internally and
+ to build a lookup table for distance-to-time conversions, see the next
+ command.
+ %
+\begin{codeexample}[code only]
+\pgfsetcurvilinearbeziercurve
+ {\pgfpointorigin}
+ {\pgfpoint{1cm}{1cm}}
+ {\pgfpoint{2cm}{1cm}}
+ {\pgfpoint{3cm}{0cm}}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfcurvilineardistancetotime\marg{distance}}
+ This command does a ``distance-to-time-conversion'': It tries to compute a
+ time $t$, returned in |\pgf@x|, that corresponds to travelling
+ \meta{distance} along the curve that has last been installed using the
+ command |\pgfsetcurvilinearbeziercurve|. The distance-to-time-conversion
+ uses the precomputations done by that command. Note that several
+ compromises had to be made between speed and accuracy:
+ %
+ \begin{itemize}
+ \item The conversion will be best near the start of the curve.
+ \item The more ``degenerate'' the curve, the worse the results.
+ \end{itemize}
+\end{command}
+
+\begin{command}{\pgfpointcurvilinearbezierorthogonal\marg{distance}\marg{offset}}
+ This command computes the following point: Consider the curve last
+ installed using the command |\pgfsetcurvilinearbeziercurve|. We travel
+ along this curve by \meta{distance}, arriving at a point $p$. Then, we turn
+ by $90^\circ$ and travel by \meta{offset} units ``always from the curve'',
+ arriving at a point $q$. This point $q$ will now be returned in |\pgf@x|
+ and |\pgf@y|; furthermore, the transformed local coordinate system at point
+ $q$ will also be returned |\pgf@xa| and the other registers, see
+ |\pgftransformnonlinear| for details.
+ %
+\makeatletter
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{11mm}{20mm}}
+ {\pgfpoint{20mm}{11mm}}
+ {\pgfpoint{20mm}{0mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierorthogonal\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (11mm,20mm) and (20mm,11mm) .. (20mm,0mm);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{10mm}{20mm}}
+ {\pgfpoint{10mm}{10mm}}
+ {\pgfpoint{20mm}{10mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierorthogonal\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (10mm,20mm) and (10mm,10mm) .. (20mm,10mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfpointcurvilinearbezierpolar\marg{x}\marg{y}}
+ This command is similar to the previous version, but the transformation is
+ different: The idea is that a line form $(0,0)$ to $(x,0)$ gets transformed
+ to the curve from the start of the curve to a point at distance $x$ along
+ the curve. This is identical to what the ``orthogonal'' transformation
+ above also does. The difference is that a line from $(0,0)$ to $(0,y)$ gets
+ still transformed to an initial segment of the curve of a length of $y$,
+ but now rotated by $90^\circ$. In general, the point $p = (x,y)$ gets
+ transferred to a point that at distance $|p| = \sqrt{x^2+y^2}$ along the
+ curve, but rotated by the angle of $p$ relative to the $x$-axis.
+
+ All of these computations mainly have the following effect: Two straight
+ lines from the start of the curve as in a |Straight Barb| arrow tip get
+ transformed to an initial segment of the curve whose length is the length
+ of the two lines, but this segment gets rotated by the angle of the two
+ lines.
+ %
+\makeatletter
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{11mm}{20mm}}
+ {\pgfpoint{20mm}{11mm}}
+ {\pgfpoint{20mm}{0mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierpolar\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ % Add a "barb":
+ \draw [blue, very thick] (20pt,10pt) -- (0,0) -- (20pt,-10pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (11mm,20mm) and (20mm,11mm) .. (20mm,0mm);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{10mm}{20mm}}
+ {\pgfpoint{10mm}{10mm}}
+ {\pgfpoint{20mm}{10mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierpolar\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ % Add a "barb":
+ \draw [blue, very thick] (20pt,10pt) -- (0,0) -- (20pt,-10pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (10mm,20mm) and (10mm,10mm) .. (20mm,10mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
+
+% LocalWords: nonlineartransformations PGF cx dy pdf PostScript pgfscope xstep
+% LocalWords: Reinstalls shiftx backend pgflowlevelscope ystep ezier lookup xa
+% LocalWords: precomputations
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-base-transparency.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-transparency.tex
new file mode 100644
index 0000000000..22156f98d3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-base-transparency.tex
@@ -0,0 +1,385 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Transparency}
+\label{section-transparency}
+
+For an introduction to the notion of transparency, fadings, and transparency
+groups, please consult Section~\ref{section-tikz-transparency}.
+
+
+\subsection{Specifying a Uniform Opacity}
+
+Specifying a stroke and/or fill opacity is quite easy.
+
+\begin{command}{\pgfsetstrokeopacity\marg{value}}
+ Sets the opacity of stroking operations. The \meta{value} should be a
+ number between |0| and |1|, where |1| means ``fully opaque'' and |0| means
+ ``fully transparent''. A value like |0.5| will cause paths to be stroked in
+ a semitransparent way.
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfsetlinewidth{5mm}
+ \color{red}
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{10mm} \pgfusepath{stroke}
+ \color{black}
+ \pgfsetstrokeopacity{0.5}
+ \pgfpathcircle{\pgfpoint{1cm}{0cm}}{10mm} \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetfillopacity\marg{value}}
+ Sets the opacity of filling operations. As for stroking, the \meta{value}
+ should be a number between |0| and~|1|.
+
+ The ``filling transparency'' will also be used for text and images.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetfillopacity{0.5}
+ \fill[red] (90:1cm) circle (11mm);
+ \fill[green] (210:1cm) circle (11mm);
+ \fill[blue] (-30:1cm) circle (11mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+Note the following effect: If you set up a certain opacity for stroking or
+filling and you stroke or fill the same area twice, the effect accumulates:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetfillopacity{0.5}
+ \fill[red] (0,0) circle (1);
+ \fill[red] (1,0) circle (1);
+\end{tikzpicture}
+\end{codeexample}
+
+Often, this is exactly what you intend, but not always. You can use
+transparency groups, see the end of this section, to change this.
+
+
+\subsection{Specifying a Blend Mode}
+
+To set the blend mode, use the following command:
+
+\begin{command}{\pgfsetblendmode\marg{mode}}
+ Sets the blend mode to one of the values described in
+ Section~\ref{section-blend-modes}. As described there, blend modes are an
+ advanced feature of \textsc{pdf} and not always rendered correctly.
+ %
+\begin{codeexample}[]
+\tikz [transparency group] {
+ \pgfsetblendmode{screen}
+
+ \fill[red!90!black] ( 90:.6) circle (1);
+ \fill[green!80!black] (210:.6) circle (1);
+ \fill[blue!90!black] (330:.6) circle (1);
+}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Specifying a Fading}
+
+The method used by \pgfname\ for specifying fadings is quite general: You
+``paint'' the fading using any of the standard graphics commands. In more
+detail: You create a normal picture, which may even contain text, image, and
+shadings. Then, you create a fading based on this picture. For this, the
+\emph{luminosity} of each pixel of the picture is analyzed (the brighter the
+pixel, the higher the luminosity -- a black pixel has luminosity $0$, a white
+pixel has luminosity $1$, a gray pixel has some intermediate value as does a
+red pixel). Then, when the fading is used, the luminosity of the pixel
+determines the opacity of the fading at that position. Positions in the fading
+where the picture was black will be completely transparent, positions where the
+picture was white will be completely opaque. Positions that have not been
+painted at all in the picture are always completely transparent.
+
+\begin{command}{\pgfdeclarefading\marg{name}\marg{contents}}
+ This command declares a fading named \meta{name} for later use. The
+ ``picture'' on which the fading is based is given by the \meta{contents}.
+ The \meta{contents} are normally typeset in a \TeX\ box. The resulting box
+ is then used as the ``picture''. In particular, inside the \meta{contents}
+ you must explicitly open a |{pgfpicture}| environment if you wish to use
+ \pgfname\ commands.
+
+ Let's start with an easy example. Our first fading picture is just some
+ text:
+ %
+\begin{codeexample}[]
+\pgfdeclarefading{fading1}{\color{white}Ti\emph{k}Z}
+\begin{tikzpicture}
+ \fill [black!20] (0,0) rectangle (2,2);
+ \fill [black!30] (0,0) arc (180:0:1);
+ \pgfsetfading{fading1}{\pgftransformshift{\pgfpoint{1cm}{1cm}}}
+ \fill [red] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ What's happening here? The ``fading picture'' is mostly transparent, except
+ for the pixels that are part of the word Ti\emph{k}Z. Now, these pixels are
+ \emph{white} and, thus, have a high luminosity. This in turn means that
+ these pixels of the fading will be highly opaque. For this reason, only
+ those pixels of the big red rectangle ``shine through'' that are at the
+ positions of these opaque pixels.
+
+ It is somewhat counter-intuitive that the white pixels in a fading picture
+ are opaque in a fading. For this reason, the color |pgftransparent| is
+ defined to be the same as |black|. This allows one to write
+ |pgftransparent| for completely transparent parts of a fading picture and
+ |pgftransparent!0| for the opaque parts and things like |pgftransparent!20|
+ for parts that are 20\% transparent.
+
+ Furthermore, the color |pgftransparent!0| (which is the same as white and
+ which corresponds to completely opaque) is installed at the beginning of a
+ fading picture. Thus, in the above example the |\color{white}| was not
+ really necessary.
+
+ Next, let us create a fading that gets more and more transparent as we go
+ from left to right. For this, we put a shading inside the fading picture
+ that has the color |pgftransparent!0| at the left-hand side and the color
+ |pgftransparent!100| at the right-hand side.
+ %
+\begin{codeexample}[]
+\pgfdeclarefading{fading2}
+{\tikz \shade[left color=pgftransparent!0,
+ right color=pgftransparent!100] (0,0) rectangle (2,2);}
+\begin{tikzpicture}
+ \fill [black!20] (0,0) rectangle (2,2);
+ \fill [black!30] (0,0) arc (180:0:1);
+ \pgfsetfading{fading2}{\pgftransformshift{\pgfpoint{1cm}{1cm}}}
+ \fill [red] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ In our final example, we create a fading that is based on a radial shading.
+ %
+\begin{codeexample}[]
+\pgfdeclareradialshading{myshading}{\pgfpointorigin}
+{
+ color(0mm)=(pgftransparent!0);
+ color(5mm)=(pgftransparent!0);
+ color(8mm)=(pgftransparent!100);
+ color(15mm)=(pgftransparent!100)
+}
+\pgfdeclarefading{fading3}{\pgfuseshading{myshading}}
+\begin{tikzpicture}
+ \fill [black!20] (0,0) rectangle (2,2);
+ \fill [black!30] (0,0) arc (180:0:1);
+ \pgfsetfading{fading3}{\pgftransformshift{\pgfpoint{1cm}{1cm}}}
+ \fill [red] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+After having declared a fading, we can use it. As for shadings, there are
+different commands for using fadings:
+
+\begin{command}{\pgfsetfading\marg{name}\marg{transformations}}
+ This command sets the graphic state parameter ``fading'' to a previously
+ defined fading \meta{name}. This graphic state works like other graphic
+ states, that is, is persists till the end of the current scope or until a
+ different transparency setting is chosen.
+
+ When the fading is installed, it will be centered on the origin with its
+ natural size. Anything outside the fading picture's original bounding box
+ will be transparent and, thus, the fading effectively clips against this
+ bounding box.
+
+ The \meta{transformations} are applied to the fading before it is used.
+ They contain normal \pgfname\ transformation commands like
+ |\pgftransformshift|. You can also scale the fading using this command.
+ Note, however, that the transformation needs to be inverted internally,
+ which may result in inaccuracies and the following graphics may be slightly
+ distorted if you use a strong \meta{transformation}.
+ %
+\begin{codeexample}[]
+\pgfdeclarefading{fading2}
+{\tikz \shade[left color=pgftransparent!0,
+ right color=pgftransparent!100] (0,0) rectangle (2,2);}
+\begin{tikzpicture}
+ \fill [black!20] (0,0) rectangle (2,2);
+ \fill [black!30] (0,0) arc (180:0:1);
+ \pgfsetfading{fading2}{}
+ \fill [red] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \fill [black!20] (0,0) rectangle (2,2);
+ \fill [black!30] (0,0) arc (180:0:1);
+ \pgfsetfading{fading2}{\pgftransformshift{\pgfpoint{1cm}{1cm}}
+ \pgftransformrotate{20}}
+ \fill [red] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetfadingforcurrentpath\marg{name}\marg{transformations}}
+ This command works like |\pgfsetfading|, but the fading is scaled and
+ transformed according to the following rules:
+ %
+ \begin{enumerate}
+ \item If the current path is empty, the command has the same effect as
+ |\pgfsetfading|.
+ \item Otherwise it is assumed that the fading has a size of 100bp times
+ 100bp.
+ \item The fading is resized and shifted (using appropriate
+ transformations) such that the position
+ $(25\mathrm{bp},25\mathrm{bp})$ lies at the lower-left corner of
+ the current path and the position $(75\mathrm{bp},75\mathrm{bp})$
+ lies at the upper-right corner of the current path.
+ \end{enumerate}
+ %
+ Note that these rules are the same as the ones used in |\pgfshadepath| for
+ shadings. After these transformations, the \meta{transformations} are
+ executed (typically a rotation).
+ %
+\begin{codeexample}[]
+\pgfdeclarehorizontalshading{shading}{100bp}
+{ color(0pt)=(transparent!0); color(25bp)=(transparent!0);
+ color(75bp)=(transparent!100); color(100bp)=(transparent!100)}
+
+\pgfdeclarefading{fading}{\pgfuseshading{shading}}
+
+\begin{tikzpicture}
+ \fill [black!20] (0,0) rectangle (2,2);
+ \fill [black!30] (0,0) arc (180:0:1);
+
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{2cm}{1cm}}
+ \pgfsetfadingforcurrentpath{fading}{}
+ \pgfusepath{discard}
+
+ \fill [red] (0,0) rectangle (2,1);
+
+ \pgfpathrectangle{\pgfpoint{0cm}{1cm}}{\pgfpoint{2cm}{1cm}}
+ \pgfsetfadingforcurrentpath{fading}{\pgftransformrotate{90}}
+ \pgfusepath{discard}
+
+ \fill [red] (0,1) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetfadingforcurrentpathstroked\marg{name}\marg{transformations}}
+ This command works line |\pgfsetfadingforcurrentpath|, only the current
+ path is enlarged by the line width in both $x$- and $y$-direction. This is
+ exactly the enlargement necessary to compensate for the fact that if the
+ current path will be stroked, this much needs to be added around the path's
+ bounding box to actually contain the path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetlinewidth{2mm}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{2cm}{0cm}}
+ \pgfsetfadingforcurrentpathstroked{fading}{}
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Transparency Groups}
+
+Transparency groups are declared using the following commands.
+
+\begin{environment}{{pgftransparencygroup}\opt{\oarg{options}}}
+ This environment should only be used inside a |{pgfpicture}|. It has the
+ following effect:
+ %
+ \begin{enumerate}
+ \item The \meta{environment contents} are stroked/filled ``ignoring any
+ outside transparency''. This means, all previous transparency
+ settings are ignored (you can still set transparency inside the
+ group, but never mind). This means that if in the \meta{environment
+ contents} you stroke a pixel three times in black, it is just
+ black. Stroking it white afterwards yields a white pixel, and so
+ on.
+ \item When the group is finished, it is painted as a whole. The
+ \emph{fill} transparency settings are now applied to the resulting
+ picture. For instance, the pixel that has been painted three times
+ in black and once in white is just white at the end, so this white
+ color will be blended with whatever is ``behind'' the group on the
+ page.
+ \end{enumerate}
+
+ The optional \meta{options} are keys that configure the transparency group
+ further. Two keys are currently defined:
+ %
+ \begin{itemize}
+ \item \declare{|knockout|\opt{|=|\meta{true or false}}} Configures
+ whether the group is a knockout group (if no argument is given,
+ |true| is assumed; initially the key is always false, even when the
+ command is used in a nested manner.) See
+ Section~\ref{section-transparency-groups} for details on knockout
+ groups.
+ \item \declare{|isolated|\opt{|=|\meta{true or false}}} Similar, but
+ configures whether the group is an isolated group. Also see
+ Section~\ref{section-transparency-groups} for details on isolated
+ groups.
+ \end{itemize}
+
+ Note that, depending on the driver, \pgfname\ may have to guess the size of
+ the contents of the transparency group (because such a group is put in an
+ XForm in \textsc{pdf} and a bounding box must be supplied). \pgfname\ will
+ use normally use the size of the picture's bounding box at the end of the
+ transparency group plus a safety margin of 1cm. Under normal circumstances,
+ this will work nicely since the picture's bounding box contains everything
+ anyway. However, if you have switched off the picture size tracking or if
+ you are using canvas transformations, you may have to make sure that the
+ bounding box is big enough. The trick is to locally create a picture that
+ is ``large enough'' and then insert this picture into the main picture
+ while ignoring the size. The following example shows how this is done:
+
+% TODO: Nesting tikzpictures is NOT supported
+{\tikzexternaldisable
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (2,2);
+
+ % Stuff outside the picture, but still in a transparency group.
+ \node [left,overlay] at (0,1) {
+ \begin{tikzpicture}
+ \pgfsetfillopacity{0.5}
+ \pgftransparencygroup
+ \node at (2,0) [forbidden sign,line width=2ex,draw=red,fill=white]
+ {Smoking};
+ \endpgftransparencygroup
+ \end{tikzpicture}
+ };
+\end{tikzpicture}
+\end{codeexample}
+}%
+
+ \begin{plainenvironment}{{pgftransparencygroup}}
+ Plain \TeX\ version of the |{pgftransparencygroup}| environment.
+ \end{plainenvironment}
+
+ \begin{contextenvironment}{{pgftransparencygroup}}
+ This is the Con\TeX t version of the environment.
+ \end{contextenvironment}
+\end{environment}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-drivers.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-drivers.tex
new file mode 100644
index 0000000000..e107e8f097
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-drivers.tex
@@ -0,0 +1,449 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Supported Formats}
+\label{section-formats}
+
+\TeX\ was designed to be a flexible system. This is true both for the
+\emph{input} for \TeX\ as well as for the \emph{output}. The present section
+explains which input formats there are and how they are supported by \pgfname.
+It also explains which different output formats can be produced.
+
+
+\subsection{Supported Input Formats: \LaTeX, Plain \TeX, Con\TeX t}
+
+\TeX\ does not prescribe exactly how your input should be formatted. While it
+is \emph{customary} that, say, an opening brace starts a scope in \TeX, this is
+by no means necessary. Likewise, it is \emph{customary} that environments start
+with |\begin|, but \TeX\ could not really care less about the exact command
+name.
+
+Even though \TeX\ can be reconfigured, users can not. For this reason, certain
+\emph{input formats} specify a set of commands and conventions how input for
+\TeX\ should be formatted. There are currently three ``major'' formats: Donald
+Knuth's original |plain| \TeX\ format, Leslie Lamport's popular \LaTeX\ format,
+and Hans Hangen's Con\TeX t format.
+
+
+\subsubsection{Using the \LaTeX\ Format}
+
+Using \pgfname\ and \tikzname\ with the \LaTeX\ format is easy: You say
+|\usepackage{pgf}| or |\usepackage{tikz}|. Usually, that is all you need to do,
+all configuration will be done automatically and (hopefully) correctly.
+
+The style files used for the \LaTeX\ format reside in the subdirectory
+|latex/pgf/| of the \pgfname-system. Mainly, what these files do is to include
+files in the directory |generic/pgf|. For example, here is the content of the
+file |latex/pgf/frontends/tikz.sty|:
+%
+\begin{codeexample}[code only]
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgf,pgffor}
+
+\input{tikz.code.tex}
+
+\endinput
+\end{codeexample}
+
+The files in the |generic/pgf| directory do the actual work.
+
+
+\subsubsection{Using the Plain \TeX\ Format}
+
+When using the plain \TeX\ format, you say |\input{pgf.tex}| or
+|\input{tikz.tex}|. Then, instead of |\begin{pgfpicture}| and
+|\end{pgfpicture}| you use |\pgfpicture| and |\endpgfpicture|.
+
+Unlike for the \LaTeX\ format, \pgfname\ is not as good at discerning the
+appropriate configuration for the plain \TeX\ format. In particular, it can
+only automatically determine the correct output format if you use |pdftex| or
+|tex| plus |dvips|. For all other output formats you need to set the macro
+|\pgfsysdriver| to the correct value. See the description of using output
+formats later on.
+
+Like the \LaTeX\ style files, the plain \TeX\ files like |tikz.tex| also just
+include the correct |tikz.code.tex| file.
+
+
+\subsubsection{Using the Con\TeX t Format}
+
+When using the Con\TeX t format, you say |\usemodule[pgf]| or
+|\usemodule[tikz]|. As for the plain \TeX\ format you also have to replace the
+start- and end-of-environment tags as follows: Instead of |\begin{pgfpicture}|
+and |\end{pgfpicture}| you use |\startpgfpicture| and |\stoppgfpicture|;
+similarly, instead of |\begin{tikzpicture}| and |\end{tikzpicture}| you use
+must now use |\starttikzpicture| and |\stoptikzpicture|; and so on for other
+environments.
+
+The Con\TeX t support is very similar to the plain \TeX\ support, so the same
+restrictions apply: You may have to set the output format directly and graphics
+inclusion may be a problem.
+
+In addition to |pgf| and |tikz| there also exist modules like |pgfcore| or
+|pgfmodulematrix|. To use them, you may need to include the module |pgfmod|
+first (the modules |pgf| and |tikz| both include |pgfmod| for you, so typically
+you can skip this). This special module is necessary since Con\TeX t
+satanically restricts the length of module names to 6 characters and \pgfname's
+long names are mapped to cryptic 6-letter-names for you by the module |pgfmod|.
+
+
+\subsection{Supported Output Formats}
+\label{section-drivers}
+
+An output format is a format in which \TeX\ outputs the text it has typeset.
+Producing the output is (conceptually) a two-stage process:
+%
+\begin{enumerate}
+ \item \TeX\ typesets your text and graphics. The result of this
+ typesetting is mainly a long list of letter--coordinate pairs, plus
+ (possibly) some ``special'' commands. This long list of pairs is
+ written to something called a |.dvi|-file (informally known as
+ ``device-independent file'').
+ \item Some other program reads this |.dvi|-file and translates the
+ letter--coordinate pairs into, say, PostScript commands for placing
+ the given letter at the given coordinate.
+\end{enumerate}
+
+The classical example of this process is the combination of |latex| and
+|dvips|. The |latex| program (which is just the |tex| program called with the
+\LaTeX-macros preinstalled) produces a |.dvi|-file as its output. The |dvips|
+program takes this output and produces a |.ps|-file (a PostScript file).
+Possibly, this file is further converted using, say, |ps2pdf|, whose name is
+supposed to mean ``PostScript to PDF''. Another example of programs using this
+process is the combination of |tex| and |dvipdfm|. The |dvipdfm| program takes
+a |.dvi|-file as input and translates the letter--coordinate pairs therein into
+\pdf-commands, resulting in a |.pdf| file directly. Finally, the |tex4ht| is
+also a program that takes a |.dvi|-file and produces an output, this time it is
+a |.html| file. The programs |pdftex| and |pdflatex| are special: They directly
+produce a |.pdf|-file without the intermediate |.dvi|-stage. However, from the
+programmer's point of view they behave exactly as if there was an intermediate
+stage.
+
+Normally, \TeX\ only produces letter--coordinate pairs as its ``output''. This
+obviously makes it difficult to draw, say, a curve. For this, ``special''
+commands can be used. Unfortunately, these special commands are not the same
+for the different programs that process the |.dvi|-file. Indeed, every program
+that takes a |.dvi|-file as input has a totally different syntax for the
+special commands.
+
+One of the main jobs of \pgfname\ is to ``abstract away'' the difference in the
+syntax of the different programs. However, this means that support for each
+program has to be ``programmed'', which is a time-consuming and complicated
+process.
+
+
+\subsubsection{Selecting the Backend Driver}
+
+When \TeX\ typesets your document, it does not know which program you are going
+to use to transform the |.dvi|-file. If your |.dvi|-file does not contain any
+special commands, this would be fine; but these days almost all |.dvi|-files
+contain lots of special commands. It is thus necessary to tell \TeX\ which
+program you are going to use later on.
+
+Unfortunately, there is no ``standard'' way of telling this to \TeX. For the
+\LaTeX\ format a sophisticated mechanism exists inside the |graphics| package
+and \pgfname\ plugs into this mechanism. For other formats and when this
+plugging does not work as expected, it is necessary to tell \pgfname\ directly
+which program you are going to use. This is done by redefining the macro
+|\pgfsysdriver| to an appropriate value \emph{before} you load |pgf|. If you
+are going to use the |dvips| program, you set this macro to the value
+|pgfsys-dvips.def|; if you use |pdftex| or |pdflatex|, you set it to
+|pgfsys-pdftex.def|; and so on. In the following, details of the support of the
+different programs are discussed.
+
+
+\subsubsection{Producing PDF Output}
+
+\pgfname\ supports three programs that produce \pdf\ output (\pdf\ means
+``portable document format'' and was invented by the Adobe company): |dvipdfm|,
+|pdftex|, and |vtex|. The |pdflatex| program is the same as the |pdftex|
+program: it uses a different input format, but the output is exactly the same.
+
+\begin{filedescription}{pgfsys-pdftex.def}
+ This is the driver file for use with pdf\TeX, that is, with the |pdftex| or
+ |pdflatex| command. It includes |pgfsys-common-pdf.def|.
+
+ This driver has a lot of functionality. (Almost) everything \pgfname\ ``can
+ do at all'' is implemented in this driver.
+\end{filedescription}
+
+\begin{filedescription}{pgfsys-dvipdfm.def}
+ This is a driver file for use with (|la|)|tex| followed by |dvipdfm|. It
+ includes |pgfsys-common-pdf.def|.
+
+ This driver supports most of \pgfname's features, but there are some
+ restrictions:
+ %
+ \begin{enumerate}
+ \item In \LaTeX\ mode it uses |graphicx| for the graphics inclusion
+ and does not support masking.
+ \item In plain \TeX\ mode it does not support image inclusion.
+ \end{enumerate}
+\end{filedescription}
+
+\begin{filedescription}{pgfsys-xetex.def}
+ This is a driver file for use with |xe|(|la|)|tex| followed by |xdvipdfmx|.
+ This driver supports largely the same operations as the |dvipdfm| driver.
+\end{filedescription}
+
+\begin{filedescription}{pgfsys-vtex.def}
+ This is the driver file for use with the commercial \textsc{vtex} program.
+ Even though it produces \textsc{pdf} output, it includes
+ |pgfsys-common-postscript.def|. Note that the \textsc{vtex} program can
+ produce \emph{both} Postscript and \textsc{pdf} output, depending on the
+ command line parameters. However, whether you produce Postscript or
+ \textsc{pdf} output does not change anything with respect to the driver.
+
+ This driver supports most of \pgfname's features, except for the following
+ restrictions:
+ %
+ \begin{enumerate}
+ \item In \LaTeX\ mode it uses |graphicx| for the graphics inclusion
+ and does not support masking.
+ \item In plain \TeX\ mode it does not support image inclusion.
+ \item Shading is fully implemented, but yields the same quality as
+ the implementation for |dvips|.
+ \item Opacity is not supported.
+ \item Remembering of pictures (inter-picture connections) is not
+ supported.
+ \end{enumerate}
+\end{filedescription}
+
+It is also possible to produce a |.pdf|-file by first producing a PostScript
+file (see below) and then using a PostScript-to-\pdf\ conversion program like
+|ps2pdf| or the Acrobat Distiller.
+
+
+\subsubsection{Producing PostScript Output}
+
+\begin{filedescription}{pgfsys-dvips.def}
+ This is a driver file for use with (|la|)|tex| followed by |dvips|. It
+ includes |pgfsys-common-postscript.def|.
+
+ This driver also supports most of \pgfname's features, except for the
+ following restrictions:
+ %
+ \begin{enumerate}
+ \item In \LaTeX\ mode it uses |graphicx| for the graphics inclusion
+ and does not support masking.
+ \item In plain \TeX\ mode it does not support image inclusion.
+ \item Shading is fully implemented, but the results will not be as
+ good as with a driver producing |.pdf| as output.
+ \item Opacity works only in conjunction with newer versions of
+ Ghostscript.
+ \item For remembering of pictures (inter-picture connections) you
+ need to use a recent version of |pdftex| running in DVI-mode.
+ \end{enumerate}
+\end{filedescription}
+
+\begin{filedescription}{pgfsys-textures.def}
+ This is a driver file for use with the \textsc{textures} program. It
+ includes |pgfsys-common-postscript.def|.
+
+ This driver has exactly the same restrictions as the driver for |dvips|.
+\end{filedescription}
+
+You can also use the |vtex| program together with |pgfsys-vtex.def| to produce
+Postscript output.
+
+
+\subsubsection{Producing SVG Output}
+
+\begin{filedescription}{pgfsys-dvisvgm.def}
+ This driver converts \textsc{dvi} files to \textsc{svg} file, including
+ text and fonts. When you select this driver, \pgfname\ will output the
+ required raw \textsc{svg} code for the pictures it produces.
+
+ Since the |graphics| package does not (yet?) support this driver directly,
+ there is special rule for this driver in \LaTeX: If the option |dvisvgm| is
+ given to the |tikz| package, this driver gets selected (normally, the
+ driver selected by |graphics| would be used). For packages like |beamer|
+ that load \pgfname\ themselves, this means that the option |dvisvgm| should
+ be given to the document class.
+ %
+\begin{codeexample}[code only]
+% example.tex
+\documentclass[dvisvgm]{minimal}
+
+\usepackage{tikz}
+
+\begin{document}
+Hello \tikz [baseline] \fill [fill=blue!80!black] (0,.75ex) circle[radius=.75ex];
+\end{document}
+\end{codeexample}
+
+ And then run
+ %
+\begin{codeexample}[code only]
+latex example
+dvisvgm example
+\end{codeexample}
+ %
+ or better
+ %
+\begin{codeexample}[code only]
+lualatex --output-format=dvi example
+dvisvgm example
+\end{codeexample}
+ %
+ (This is ``better'' since it gives you access to the full power of Lua\TeX\
+ inside your \TeX-file. In particular, \tikzname\ is able to run graph
+ drawing algorithms in this case.)
+
+ Unlike the |tex4ht| driver below, this driver has full support of text
+ nodes.
+\end{filedescription}
+
+\begin{filedescription}{pgfsys-tex4ht.def}
+ This is a driver file for use with the |tex4ht| program. It is selected
+ automatically when the |tex4ht| style or command is loaded. It includes
+ |pgfsys-common-svg.def|.
+
+ The |tex4ht| program converts |.dvi|-files to |.html|-files. While the
+ \textsc{html}-format cannot be used to draw graphics, the
+ \textsc{svg}-format can. This driver will ask \pgfname\ to produce an
+ \textsc{svg}-picture for each \pgfname\ graphic in your text.
+
+ When using this driver you should be aware of the following restrictions:
+ %
+ \begin{enumerate}
+ \item In \LaTeX\ mode it uses |graphicx| for the graphics inclusion.
+ \item In plain \TeX\ mode it does not support image inclusion.
+ \item Remembering of pictures (inter-picture connections) is not
+ supported.
+ \item Text inside |pgfpicture|s is not supported very well. The
+ reason is that the \textsc{svg} specification currently does not
+ support text very well and, although it is possible to ``escape
+ back'' to \textsc{html}, \tikzname\ has then to guess what size
+ the text rendered by the browser would have.
+ \item Unlike for other output formats, the bounding box of a picture
+ ``really crops'' the picture.
+ \item Matrices do not work.
+ \item Functional shadings are not supported.
+ \end{enumerate}
+
+ The driver basically works as follows: When a |{pgfpicture}| is started,
+ appropriate |\special| commands are used to directed the output of |tex4ht|
+ to a new file called |\jobname-xxx.svg|, where |xxx| is a number that is
+ increased for each graphic. Then, till the end of the picture, each (system
+ layer) graphic command creates a special that inserts appropriate
+ \textsc{svg} literal text into the output file. The exact details are a bit
+ complicated since the imaging model and the processing model of
+ PostScript/\pdf\ and \textsc{svg} are not quite the same; but they are
+ ``close enough'' for \pgfname's purposes.
+
+ Because text is not supported very well in the \textsc{svg} standard, you
+ may wish to use the following options to modify the way text is handled:
+
+ \begin{key}{/pgf/tex4ht node/escape=\meta{boolean} (default |false|)}
+ Selects the rendering method for a text node with the tex4ht driver.
+
+ When this key is set to |false|, text is translated into \textsc{svg}
+ text, which is somewhat limited: simple characters (letters, numerals,
+ punctuation, $\sum$, $\int$, \ldots), subscripts and superscripts (but
+ not subsubscripts) will display but everything else will be filtered
+ out, ignored or will produce invalid \textsc{html} code (in the worst
+ case). This means that two kind of texts render reasonably well:
+ %
+ \begin{enumerate}
+ \item First, plain text without math mode, special characters or
+ anything else special.
+ \item Second, \emph{very} simple mathematical text that contains
+ subscripts or superscripts. Even then, variables are not
+ correctly set in italics and, in general, text simple does
+ not look very nice.
+ \end{enumerate}
+ %
+ If you use text that contains anything special, even something as
+ simple as |$\alpha$|, this may corrupt the graphic.
+ %
+\begin{codeexample}[code only]
+\tikz \node[draw,/pgf/tex4ht node/escape=false] {Example : $(a+b)^2=a^2+2ab+b^2$};
+\end{codeexample}
+
+ When you write |node[/pgf/tex4ht node/escape=true] {|\meta{text}|}|,
+ \pgfname\ escapes back to \textsc{html} to render the \meta{text}. This
+ method produces valid \textsc{html} code in most cases and the support for
+ complicated text nodes is much better since code that renders well outside
+ a |{pgfpicture}|, should also render well inside a text node. Another
+ advantage is that inside text nodes with fixed width, \textsc{html} will
+ produce line breaks for long lines. On the other hand, you need a browser
+ with good \textsc{svg} support to display the picture. Also, the text will
+ display differently, depending on your browsers, the fonts you have on your
+ system and your settings. Finally, \pgfname\ has to guess the size of the
+ text rendered by the browser to scale it and prevent it from sticking from
+ the node. When it fails, the text will be either cropped or too small.
+ %
+\begin{codeexample}[code only]
+\tikz \node[draw,/pgf/tex4ht node/escape=true]
+ {Example : $\int_0^\infty\frac{1}{1+t^2}dt=\frac{\pi}{2}$};
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/tex4ht node/css=\meta{filename} (default |\string\jobname|)}
+ This option allows you to tell the browser what \textsc{css} file it
+ should use to style the display of the node (only with |tex4ht
+ node/escape=true|).
+ \end{key}
+
+ \begin{key}{/pgf/tex4ht node/class=\meta{class name} (default foreignobject)}
+ This option allows you to give a class name to the node, allowing it to
+ be styled by a \textsc{css} file (only with |tex4ht node/escape=true|).
+ \end{key}
+
+ \begin{key}{/pgf/tex4ht node/id=\meta{id name} (default |\string\jobname\ picture number-node number|)}
+ This option allows you to give a unique id to the node, allowing
+ it to be styled by a \textsc{css} file (only with
+ |tex4ht node/escape=true|).
+ \end{key}
+\end{filedescription}
+
+
+\subsubsection{Producing Perfectly Portable DVI Output}
+
+\begin{filedescription}{pgfsys-dvi.def}
+ This is a driver file that can be used with any output driver, except for
+ |tex4ht|.
+
+ The driver will produce perfectly portable |.dvi| files by composing all
+ pictures entirely of black rectangles, the basic and only graphic shape
+ supported by the \TeX\ core. Even straight, but slanted lines are tricky to
+ get right in this model (they need to be composed of lots of little
+ squares).
+
+ Naturally, \emph{very little} is possible with this driver. In fact, so
+ little is possible that it is easier to list what is possible:
+ %
+ \begin{itemize}
+ \item Text boxes can be placed in the normal way.
+ \item Lines and curves can be drawn (stroked). If they are not
+ horizontal or vertical, they are composed of hundreds of small
+ rectangles.
+ \item Lines of different width are supported.
+ \item Transformations are supported.
+ \end{itemize}
+ %
+ Note that, say, even filling is not supported! (Let alone color or anything
+ fancy.)
+
+ This driver has only one real application: It might be useful when you only
+ need horizontal or vertical lines in a picture. Then, the results are quite
+ satisfactory.
+\end{filedescription}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-axes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-axes.tex
new file mode 100644
index 0000000000..a0e46cbaf9
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-axes.tex
@@ -0,0 +1,3717 @@
+% Copyright 2010 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Axes}
+\label{section-dv-axes}
+
+\subsection{Overview}
+
+When a data point is visualized, the most obvious way of creating a visual
+representation of its many attributes is to vary \emph{where} the data point is
+shown. The data visualization system uses \emph{axes} to turn data point
+attributes into positions on a page. The simplest -- and most common -- use of
+axes is to vary the horizontal position of data points according to one
+attribute and to vary the vertical position according to another attribute. In
+contrast, in a polar plot one attribute dictates the distance of the data point
+from the origin and another attribute describes the angle. From the data
+visualization engine's point of view, in both cases two \emph{axes} are
+involved.
+
+In addition to specifying how the value of a certain attribute is converted
+into a displacement on the page, an axis is also typically (but not always)
+visualized (``drawn'') somewhere on the page. In this case, it is also
+customary to add a visual representation on this axis of which attribute values
+correspond to which positions on the page -- something commonly known as
+\emph{ticks}. Similar to ticks, \emph{grid lines} also indicate positions where
+a certain attribute has a certain value, but instead of just indicating a
+single position on an axis, a grid line goes through all points that share an
+attribute value.
+
+In the following, in Section~\ref{section-dv-axes-main} we first have a look at
+how axes can be defined and configured. As you will see, a lot of powerful
+configurations are available, but you will rarely define and configure an axis
+from scratch. Rather, it is more common to use a preconfigured axis instead.
+Section~\ref{section-dv-axis-systems} introduces \emph{axis systems}, which are
+predefined bundles of axes. You can define your own axis systems, but, again,
+in most cases it will suffice to just use one of the many preconfigured axis
+systems and use a few options to configure it so that it fits your need.
+Section~\ref{section-dv-ticks-and-grids} explains how ticks and grid lines can
+be configured. Again, several layers of options allow you to configure the way
+ticks look and where they are placed in great detail.
+
+This section documents the standard axis systems that are always available. For
+polar axis systems, a special library needs to be loaded, which is documented
+in Section~\ref{section-dv-polar}.
+
+
+\subsection{Basic Configuration of Axes}
+\label{section-dv-axes-main}
+
+Inside the data visualization system, an \emph{axis} is roughly a ``systematic,
+named way of mapping an attribute to a position on a page''. For instance, the
+classical ``$x$-axis'' is the ``systematic way of mapping the value of the |x|
+attribute of data points to a horizontal position on the page''. An axis is
+\emph{not} its visual representation (such as the horizontal line with the
+ticks drawn to represent the $x$-axis), but a visual representation can be
+created once an axis has been defined.
+
+The transformation of an attribute value (such as the value |1000000000| for
+the |x| attribute) to a specific displacement of the corresponding data point
+on the page involves two steps:
+%
+\begin{enumerate}
+ \item First, the range of possible values such as $[-5.6\cdot
+ 10^{12},7.8\cdot 10^{12}]$ must be mapped to a ``reasonable'' interval
+ such as $[0\mathrm{cm},5\mathrm{cm}]$ or $[0^\circ,180^\circ]$.
+ \tikzname's drawing routines will only be able to cope with values from
+ such a ``reasonable'' interval.
+ \item Second, the values from the reasonable interval must be mapped to a
+ transformation.
+\end{enumerate}
+%
+The first step is always the same for all axes, while the second requires
+different strategies. For this reason, the command |new axis base| is used to
+create a ``basic'' axis that has a ``scaling mapper'', whose job it is to map
+the range of values of a specific attribute to a reasonable interval, but such
+a basic axis does not define an actual transformation object. For this second
+step, additional objects such as a |linear transformer| need to be created
+separately.
+
+
+\subsubsection{Usage}
+
+To create an axis, the key |new axis base| is used first. Since this key does
+not create a transformation object, users typically do not use this key
+directly. Rather, it is used internally by other keys that create ``real''
+axes. These keys are listed in Section~\ref{section-dv-reference-axis-types}.
+
+\begin{key}{/tikz/data visualization/new axis base=\meta{axis name}}
+ This key defines a new axis for the current data visualization called
+ \meta{name}. This has two effects:
+ %
+ \begin{enumerate}
+ \item A so called \emph{scaling mapper} is created that will monitor a
+ certain attribute, rescale it, and map it to another attribute.
+ (This will be explained in detail in a moment.)
+ \item The \meta{axis name} is made available as a key that can be used
+ to configure the axis:
+ %
+ \begin{key}{/tikz/data visualization/\meta{axis name}=\meta{options}}
+ This key becomes available once |new axis base=|meta{axis name}
+ has been called. It will execute the \meta{options} with the
+ path prefix |/tikz/data visualization/axis options|.
+ %
+\begin{codeexample}[code only]
+[new axis base=my axis,
+ my axis={attribute=some attribute}]
+\end{codeexample}
+ \end{key}
+ \item The \meta{axis name} becomes part of the current set of axes.
+ This set can be accessed through the following key:
+ %
+ \begin{key}{/tikz/data visualization/all axes=\meta{options}}
+ This key passes the \meta{options} to all axes inside the
+ current scope, just as if you had written \meta{some axis
+ name}|=|\meta{options} for each \meta{some axis name} in the
+ current scope, including the just-created name \meta{axis
+ name}.
+ \end{key}
+ \end{enumerate}
+ %
+ There are many \meta{options} that can be passed to a newly created axis.
+ They are explained in the rest of this section.
+\end{key}
+
+Note the |new axis base| does \emph{not} cause attributes to be mapped to
+positions on a page. Rather, special keys like |new Cartesian axis| first use
+|new axis base| to create an axis and then create an internal object that
+performs a linear mapping of the attribute to positions along a vectors.
+
+
+\subsubsection{The Axis Attribute}
+\label{section-dv-axis-attribute}
+
+The first main job of an axis is to map the different values of some attribute
+to a reasonable interval. To achieve this, the following options are important
+(recall that these options are passed to the key whose name is the name of the
+axis):
+
+\begin{key}{/tikz/data visualization/axis options/attribute=\meta{attribute}}
+ Specifies that the axis is used to transform the data points according the
+ different values of the key |/data point/|\meta{attribute}. For instance,
+ when we create a classical two-dimensional Cartesian coordinate system,
+ then there are two axes called |x axis| and |y axis| that monitor the
+ values of the attributes |/data point/x| and |/data point/y|, respectively:
+ %
+\begin{codeexample}[code only]
+ [new axis base=x axis,
+ new axis base=y axis,
+ x axis={attribute=x},
+ y axis={attribute=y}]
+\end{codeexample}
+ %
+ In another example, we also create an |x axis| and a |y axis|. However,
+ this time, we want to plot the values of the |/data point/time| attribute
+ on the $x$-axis and, say, the value of the |height| attribute on the
+ $y$-axis:
+ %
+\begin{codeexample}[code only]
+ [new axis base=x axis,
+ new axis base=y axis,
+ x axis={attribute=time},
+ y axis={attribute=height}]
+\end{codeexample}
+ %
+ During the data visualization, the \meta{attribute} will be ``monitored''
+ during the survey phase. This means that for each data point, the current
+ value of |/data point/|\meta{attribute} is examined and the minimum value
+ of all of these values as well as the maximum value is recorded internally.
+ Note that this works even when very large numbers like |100000000000| are
+ involved.
+
+ Here is a real-life example. The |scientific axes| create two axes, called
+ |x axis| and |y axis|, respectively.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ x axis={attribute=people, length=2.5cm, ticks=few},
+ y axis={attribute=year},
+ visualize as scatter]
+ data {
+ year, people
+ 1900, 100
+ 1910, 200
+ 1950, 200
+ 1960, 250
+ 2000, 150
+ };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{The Axis Attribute Range Interval}
+
+Once an attribute has been specified for an axis, the data visualization engine
+will start monitoring this value. This means that before anything actual
+visualization is done, a ``survey phase'' is used to determine the range of
+values encountered for the attribute for all data points. This range of values
+results in what is called the \emph{attribute range interval}. Its minimum is
+the smallest value encountered in the data and its maximum is the largest
+value.
+
+Even though the attribute range interval is computed automatically and even
+though you typically do not need to worry about it, there are some situations
+where you may wish to set or enlarge the attribute range interval:
+%
+\begin{itemize}
+ \item You may wish to start the interval with $0$, even though the range of
+ values contains only positive values.
+ \item You may wish to slightly enlarge the interval so that, say, the
+ maximum is some ``nice'' value like |100| or |60|.
+\end{itemize}
+
+The following keys can be used to influence the size of the attribute range
+interval:
+%
+\begin{key}{/tikz/data visualization/axis options/include value=\meta{list of value}}
+ This key ``fakes'' data points for which the attribute's values are in the
+ comma-separated \meta{list of values}. For instance, when you write
+ |include value=0|, then the attribute range interval is guaranteed to
+ contain |0| -- even if the actual data points are all positive or all
+ negative.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes, all axes={length=3cm},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes, all axes={length=3cm},
+ visualize as line,
+ x axis={include value=20},
+ y axis={include value=0}]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/axis options/min value=\meta{value}}
+ This key allows you to simply set the minimum value, regardless of which
+ values are present in the actual data. This key should be used with care:
+ If there are data points for which the attribute's value is less than
+ \meta{value}, they will still be depicted, but typically outside the normal
+ visualization area. Usually, saying |include value=|\meta{value} will
+ achieve the same as saying |min value=|\meta{value}, but with less danger
+ of creating ill-formed visualizations.
+\end{key}
+
+\begin{key}{/tikz/data visualization/axis options/max value=\meta{value}}
+ Works like |min value|.
+\end{key}
+
+
+\subsubsection{Scaling: The General Mechanism}
+
+The above key allows us specify which attribute should be ``monitored''. The
+next key is used to specify what should happen with the observed values.
+
+\begin{key}{/tikz/data visualization/axis options/scaling=\meta{scaling spec}}
+ The \meta{scaling spec} must have the following form:
+ %
+ \begin{quote}
+ \meta{$s_1$}| at |\meta{$t_1$}| and |\meta{$s_2$}| at |\meta{$t_2$}
+ \end{quote}
+ %
+ This means that monitored values in the interval $[s_1,s_2]$ should be
+ mapped to values the ``reasonable'' interval $[t_1,t_2]$, instead. For
+ instance, we might write
+ %
+\begin{codeexample}[code only]
+[y axis = {scaling = 1900 at 0cm and 2000 at 5cm}]
+\end{codeexample}
+ %
+ in order to map dates between 1900 and 2000 to the dimension interval
+ $[0\mathrm{cm},5\mathrm{cm}]$.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ x axis={attribute=people, length=2.5cm, ticks=few},
+ y axis={attribute=year, scaling=1900 at 0cm and 2000 at 5cm},
+ visualize as scatter]
+ data {
+ year, people
+ 1900, 100
+ 1910, 200
+ 1950, 200
+ 1960, 250
+ 2000, 150
+ };
+\end{codeexample}
+ %
+ So much for the basic idea. Let us now have a detailed look at what
+ happens.
+
+
+ \medskip
+ \textbf{Number format and the min and max keywords.}
+ The source values $s_1$ and $s_2$ are typically just numbers like |3.14| or
+ |10000000000|. However, as described in
+ Section~\ref{section-dv-expressions}, you can also specify expressions like
+ |(pi/2)|, provided that (currently) you put them in parentheses.
+
+ Instead of a number, you may alternatively also use the two key words |min|
+ and |max| for $s_1$ and/or $s_2$. In this case, |min| evaluates to the
+ smallest value observed for the attribute in the data, symmetrically |max|
+ evaluates to the largest values. For instance, in the above example with
+ the |year| attribute ranging from |1900| to |2000|, the keyword |min| would
+ stand for |1900| and |max| for |2000|. Similarly, for the |people|
+ attribute |min| stands for |100| and |max| for |250|. Note that |min| and
+ |max| can only be used for $s_1$ and $s_2$, not for $t_1$ and $t_2$.
+
+ A typical use of the |min| and |max| keywords is to say
+ %
+\begin{codeexample}[code only]
+scaling = min at 0cm and max at 5cm
+\end{codeexample}
+ %
+ to map the complete range of values into an interval of length of 5cm.
+
+ The interval $[s_1,s_2]$ need not contain all values that the
+ \meta{attribute} may attain. It is permissible that values are less than
+ $s_1$ or more than $s_2$.
+
+
+ \medskip
+ \textbf{Linear transformation of the attribute.}
+ As indicated earlier, the main job of an axis is to map values from a
+ ``large'' interval $[s_1,s_2]$ to a more reasonable interval $[t_1,t_2]$.
+ Suppose that for the current data point the value of the key
+ |/data point/|\meta{attribute} is the number $v$. In the simplest case, the
+ following happens: A new value $v'$ is computed so that $v' = t_1$ when
+ $v=s_1$ and $v'=t_2$ when $v=s_2$ and $v'$ is some value in between $t_1$
+ and $t_2$ then $v$ is some value in between $s_1$ and $s_2$. (Formally, in
+ this basic case $v' = t_1 + (v-s_1)\frac{t_2-t_1}{s_2-s_1}$.)
+
+ Once $v'$ has been computed, it is stored in the key
+ |/data point/|\meta{attribute}|/scaled|. Thus, the ``reasonable'' value
+ $v'$ does not replace the value of the attribute, but it is placed in a
+ different key. This means that both the original value and the more
+ ``scaled'' values are available when the data point is visualized.
+
+ As an example, suppose you have written
+ %
+\begin{codeexample}[code only]
+[x axis = {attribute = x, scaling=1000 at 20 and 2000 at 30}]
+\end{codeexample}
+ %
+ Now suppose that |/data point/x| equals |1200| for a data point. Then the
+ key |/data point/x/scaled| will be set to |22| when the data point is being
+ visualized.
+
+
+ \medskip
+ \textbf{Nonlinear transformations of the attribute.}
+ By default, the transformation of $[s_1,s_2]$ to $[t_1,t_2]$ is the linear
+ transformation described above. However, in some case you may be interested
+ in a different kind of transformation: For example, in a logarithmic plot,
+ values of an attribute may range between, say, |1| and |1000| and we want
+ an axis of length |3cm|. So, we would write
+ %
+\begin{codeexample}[code only]
+[x axis = {attribute = x, scaling=1 at 0cm and 1000 at 3cm}]
+\end{codeexample}
+ %
+ Indeed, |1| will now be mapped to position |0cm| and |1000| will be mapped
+ to position |3cm|. Now, the value |10| will be mapped to approximately
+ |0.03cm| because it is (almost) at one percent between |1| and |1000|.
+ However, in a logarithmic plot we actually want |10| to be mapped to the
+ position |1cm| rather than |0.03cm| and we want |100| to be mapped to the
+ position |2cm|. Such a mapping a \emph{nonlinear} mapping between the
+ intervals.
+
+ In order to achieve such a nonlinear mapping, the |function| key can be
+ used, whose syntax is described in a moment. The effect of this key is to
+ specify a function $f \colon \mathbb{R} \to \mathbb{R}$ like, say, the
+ logarithm function. When such a function is specified, the mapping of $v$
+ to $v'$ is computed as follows:
+ %
+ \begin{align*}
+ v' = t_1 + (f(s_2) - f(v))\frac{t_2 - t_1}{f(s_2)-f(s_1)}.
+ \end{align*}
+
+ The syntax of the |function| key is described next, but you typically will
+ not call this key directly. Rather, you will use a key like |logarithmic|
+ that installs appropriate code for the |function| key for you.
+ %
+ \begin{key}{/tikz/data visualization/axis options/function=\meta{code}}
+ The \meta{code} should specify a function $f$ that is applied during
+ the transformation of the interval $[s_1,s_2]$ to the interval
+ $[t_1,t_2]$ in the following way: When the \meta{code} is called, the
+ macro |\pgfvalue| will have been set to an internal representation of
+ the to-be-transformed value~$v$. You can then call the commands of the
+ math-micro-kernel of the data visualization system, see
+ Section~\ref{section-dv-math-kernel}, to compute a new value. This new
+ value must once more be stored in |\pgfvalue|.
+
+ The most common use of this key is to say
+ %
+\begin{codeexample}[code only]
+some axis={function=\pgfdvmathln{\pgfvalue}{\pgfvalue}}
+\end{codeexample}
+ %
+ This specifies that the function $f$ is the logarithm function.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ x axis={ticks={major={at={1,10,100,1000}}},
+ scaling=1 at 0cm and 1000 at 3cm,
+ function=\pgfdvmathln{\pgfvalue}{\pgfvalue}},
+ visualize as scatter]
+ data [format=named] {
+ x={1,100,...,1000}, y={1,2,3}
+ };
+\end{codeexample}
+ %
+ Another possibility might be to use the square-root function, instead:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ x axis={ticks=few,
+ scaling=1 at 0cm and 1000 at 3cm,
+ function=\pgfdvmathunaryop{\pgfvalue}{sqrt}{\pgfvalue}},
+ visualize as scatter]
+ data [format=named] {
+ x={0,100,...,1000}, y={1,2,3}
+ };
+\end{codeexample}
+ \end{key}
+
+
+ \medskip
+ \textbf{Default scaling.}
+ When no scaling is specified, it may seem natural to use $[0,1]$ both as
+ the source and the target interval. However, this would not work when the
+ logarithm function is used as transformations: In this case the logarithm
+ of zero would be computed, leading to an error. Indeed, for a logarithmic
+ axis it is far more natural to use $[1,10]$ as the source interval and
+ $[0,1]$ as the target interval.
+
+ For these reasons, the default value for the |scaling| that is used when no
+ value is specified explicitly can be set using a special key:
+ %
+ \begin{key}{/tikz/data visualization/axis options/scaling/default=\meta{text}}
+ The \meta{text} is used as |scaling| whenever no other scaling is
+ specified. This key is mainly used when a transformation function is
+ set using |function|; normally, you will not use this key directly.
+ \end{key}
+\end{key}
+
+Most of the time, you will not use neither the |scaling| nor the |function| key
+directly, but rather you will use one of the following predefined styles
+documented in the following.
+
+
+\subsubsection{Scaling: Logarithmic Axes}
+
+\begin{key}{/tikz/data visualization/axis options/logarithmic}
+ When this key is used with an axis, three things happen:
+ %
+ \begin{enumerate}
+ \item The transformation |function| of the axis is setup to the
+ logarithm.
+ \item The strategy for automatically generating ticks and grid lines is
+ set to the |exponential strategy|, see
+ Section~\ref{section-dv-exponential-strategy} for details.
+ \item The default scaling is setup sensibly.
+ \end{enumerate}
+ %
+ All told, to turn an axis into a logarithmic axis, you just need to add
+ this option to the axis.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [scientific axes,
+ x axis={logarithmic},
+ y axis={logarithmic},
+ visualize as line]
+ data [format=function] {
+ var x : interval [0.01:100];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+ Note that this will work with any axis, including, say, the degrees on a
+ polar axis:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [new polar axes,
+ angle axis={logarithmic, scaling=1 at 0 and 90 at 90},
+ radius axis={scaling=0 at 0cm and 100 at 3cm},
+ visualize as scatter]
+ data [format=named] {
+ angle={1,10,...,90}, radius={1,10,...,100}
+ };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [new polar axes,
+ angle axis={degrees},
+ radius axis={logarithmic, scaling=1 at 0cm and 100 at 3cm},
+ visualize as scatter]
+ data [format=named] {
+ angle={1,10,...,90}, radius={1,10,...,100}
+ };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Scaling: Setting the Length or Unit Length}
+
+\begin{key}{/tikz/data visualization/axis options/length=\meta{dimension}}
+ Sets |scaling| to |min at 0cm and max at |\meta{dimension}. The effect is
+ that the range of all values of the axis's attribute will be mapped to an
+ interval of exact length \meta{dimension}.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ x axis={length=3cm},
+ y axis={length=2cm},
+ all axes={ticks=few},
+ visualize as line]
+ data {
+ x, y
+ 10, 10
+ 20, 20
+ 15, 30
+ 13, 20
+ };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ x axis={length=3cm},
+ y axis={length=4cm},
+ all axes={ticks=few},
+ visualize as line]
+ data {
+ x, y
+ 10, 10
+ 20, 20
+ 15, 30
+ 13, 20
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/axis options/unit length=\meta{dimension}\opt{| per |\meta{number}| units|}}
+ Sets |scaling| to |0 at 0cm and 1 at |\meta{dimension}. In other words,
+ this key allows you to specify how long a single unit should be. This key
+ is particularly useful when you wish to ensure that the same scaling is
+ used across multiple axes or pictures.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={ticks=few, unit length=1mm},
+ visualize as line]
+ data {
+ x, y
+ 10, 10
+ 40, 20
+ 15, 30
+ 13, 20
+ };
+\end{codeexample}
+ The optional |per |\meta{number}| units| allows you to apply more drastic
+ scaling. Suppose that you want to plot a graph where one billion
+ corresponds to one centimeter. Then the unit length would be need to be set
+ to a hundredth of a nanometer -- much too small for \TeX\ to handle as a
+ dimension. In this case, you can write
+ |unit length=1cm per 1000000000 units|:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ x axis={unit length=1mm per 1000000000 units, ticks=few},
+ visualize as line]
+ data {
+ x, y
+ 10000000000, 10
+ 40000000000, 20
+ 15000000000, 30
+ 13000000000, 20
+ };
+\end{codeexample}
+ %
+\end{key}
+%
+\begin{key}{/tikz/data visualization/axis options/power unit length=\meta{dimension}}
+ This key is used in conjunction with the |logarithmic| setting. It cases
+ the |scaling| to be set to |1 at 0cm and 10 at |\meta{dimension}. This
+ causes a ``power unit'', that is, one power of ten in a logarithmic plot,
+ to get a length of \meta{dimension}. Again, this key is useful for ensuring
+ that the same scaling is used across multiple axes or pictures.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization
+ [scientific axes,
+ y axis={logarithmic, power unit length=1mm, grid},
+ visualize as line]
+ data {
+ x, y
+ 0, 0.0000000001
+ 1, 1
+ 2, 100000
+ 3, 100000000000
+ 4, 10000000000000000000000000000000
+ 5, 500000000
+ 6, 5000000000000000000
+ };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Axis Label}
+
+An axis can have a \emph{label}, which is a textual representation of the
+attribute according to which the axis varies the position of the page. You can
+set the attribute using the following key:
+
+\begin{key}{/tikz/data visualization/axis options/label=\opt{|\char`\{[|\meta{options}|]|}\meta{text}\opt{|\char`\}|}
+ (default \normalfont axis's label in math mode)%
+}
+ This key sets the label of an axis to \meta{text}. This text will typically
+ be placed inside a |node| and the \meta{options} can be used to further
+ configure the way this node is rendered. The \meta{options} will be
+ executed with the path prefix |/tikz/data visualization/|, so you need to
+ say |node style| to configure the styling of a node, see
+ Section~\ref{section-dv-style}.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [
+ scientific axes,
+ x axis = {label, length=2.5cm},
+ y axis = {label={[node style={fill=blue!20}]{$x^2$}}},
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [-3:5];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+Note that using the |label| key does not actually cause a node to be created,
+because it is somewhat unclear where the label should be placed. Instead, the
+|visualize label| key is used (typically internally by an axis system) to show
+the label at some sensible position. This key is documented in
+Section~\ref{section-dv-visualize-label}.
+
+
+\subsubsection{Reference: Axis Types}
+\label{section-dv-reference-axis-types}
+
+As explained earlier, when you use |new axis base| to create a new axis, a
+powerful scaling and attribute mapping mechanism is installed, but no mapping
+of values to positions on the page is performed. For this, a
+\emph{transformation object} must be installed. The following keys take care of
+this for you. Note, however, that even these keys do not cause a visual
+representation of the axis to be added to the visualization -- this is the job
+of an axis system, see Section~\ref{section-dv-axis-systems}.
+
+\begin{key}{/tikz/data visualization/new Cartesian axis=\meta{name}}
+ This key creates a new ``Cartesian'' axis, named \meta{name}. For such an
+ axis, the (scaled) values of the axis's attribute are transformed into a
+ displacement on the page along a straight line. The following key is used
+ to configure in which ``direction'' the axis points:
+ %
+ \begin{key}{/tikz/data visualization/axis options/unit vector=\meta{coordinate} (initially {(1pt,0pt)})}
+ Recall that an axis takes the values of an attribute and rescales them
+ so that they fit into a ``reasonable'' interval $[t_1,t_2]$. Suppose
+ that $v'$ is the rescaled dimension in (\TeX) points. Then when the
+ data point is visualized, the coordinate system will be shifted by $v'$
+ times the \meta{coordinate}.
+
+ As an example, suppose that you have said
+ |scaling=0 and 10pt and 50 and 20pt|. Then when the underlying
+ attribute has the value |25|, it will be mapped to a $v'$ of $15$
+ (because |25| lies in the middle of |0| and |50| and |15pt| lies in the
+ middle of |10pt| and |20pt|). This, in turn, causes the data point to
+ be displaced by $15$ times the \meta{coordinate}.
+
+ The bottom line is that the \meta{coordinate} should usually denote a
+ point that is at distance |1pt| from the origin and that points into
+ the direction of the axis.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \datavisualization
+ [new Cartesian axis=x axis, x axis={attribute=x},
+ new Cartesian axis=y axis, y axis={attribute=y},
+ x axis={unit vector=(0:1pt)},
+ y axis={unit vector=(60:1pt)},
+ visualize as scatter]
+ data {
+ x, y
+ 0, 0
+ 1, 0
+ 2, 0
+ 1, 1
+ 2, 1
+ 1, 1.5
+ 2, 1.5
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsection{Axis Systems}
+\label{section-dv-axis-systems}
+
+An \emph{axis system} is, as the name suggests, a whole family of axes that act
+in concert. For example, in the ``standard'' axis system there is a horizontal
+axis called the $x$-axis that monitors the |x| attribute (by default, you can
+change this easily) and a vertical axis called the $y$-axis. Furthermore, a
+certain number of ticks are added and labels are placed at sensible positions.
+
+
+\subsubsection{Usage}
+
+Using an axis system is usually pretty easy: You just specify a key like
+|scientific axes| and the necessary axes get initialized with sensible default
+values. You can then start to modify these default values, if necessary.
+
+First, you can (and should) set the attributes to which the difference axes
+refer. For instance, if the |time| attribute is plotted along the $x$-axis, you
+would write
+%
+\begin{codeexample}[code only]
+x axis = {attribute = time}
+\end{codeexample}
+
+Second, you may wish to modify the lengths of the axes. For this, you can use
+keys like |length| or further keys as described in the references later on.
+
+Third, you may often wish to modify how many ticks and grid lines are shown. By
+default, no grid lines are shown, but you can say the following in order to
+cause grid lines to be shown:
+%
+\begin{codeexample}[code only]
+all axes={grid}
+\end{codeexample}
+%
+Naturally, instead of |all axes| you can also specify a single axis, causing
+only grid lines to be shown for this axis. In order to change the number of
+ticks that are shown, you can say
+%
+\begin{codeexample}[code only]
+all axes={ticks=few}
+\end{codeexample}
+%
+or also |many| instead of |few| or even |none|. Far more fine-grained control
+over the tick placement and rendering is possible, see
+Section~\ref{section-dv-ticks-and-grids} for details.
+
+Fourth, consider adding units (like ``cm'' for centimeters or
+``$\mathrm{m}/\mathrm{s}^2$'' for acceleration) to your ticks:
+%
+\begin{codeexample}[code only]
+x axis={ticks={tick unit=cm}}, y axis={ticks={tick unit=m/s^2}}
+\end{codeexample}
+
+Finally, consider adding labels to your axes. For this, use the label option:
+%
+\begin{codeexample}[code only]
+x axes={time $t$ (ms)}, y axis={distance $d$ (mm)}
+\end{codeexample}
+
+Here is an example that employs most of the above features:
+%
+\begin{codeexample}[width=8.5cm]
+\tikz \datavisualization [
+ scientific axes=clean,
+ x axis={attribute=time, ticks={tick unit=ms},
+ label={elapsed time}},
+ y axis={attribute=v, ticks={tick unit=m/s},
+ label={speed of disc}},
+ all axes=grid,
+ visualize as line]
+data {
+ time, v
+ 0, 0
+ 1, 0.001
+ 2, 0.002
+ 3, 0.004
+ 4, 0.0035
+ 5, 0.0085
+ 6, 0.0135
+};
+\end{codeexample}
+
+
+\subsubsection{Reference: Scientific Axis Systems}
+
+\begin{key}{/tikz/data visualization/scientific axes=\opt{\meta{options}}}
+ This key installs a two-dimensional coordinate system based on the
+ attributes |/data point/x| and |/data point/y|.
+ %
+\begin{codeexample}[width=7cm]
+\begin{tikzpicture}
+ \datavisualization [scientific axes,
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [0:100];
+ func y = sqrt(\value x);
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ This axis system is usually a good choice to depict ``arbitrary two
+ dimensional data''. Because the axes are automatically scaled, you do not
+ need to worry about how large or small the values will be. The name
+ |scientific axes| is intended to indicate that this axis system is often
+ used in scientific publications.
+
+ You can use the \meta{options} to fine tune the axis system. The
+ \meta{options} will be executed with the following path prefix:
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/scientific axes
+\end{codeexample}
+ %
+ All keys with this prefix can thus be passed as \meta{options}.
+
+ This axis system will always distort the relative magnitudes of the units
+ on the two axis. If you wish the units on both axes to be equal, consider
+ directly specifying the unit length ``by hand'':
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [visualize as smooth line,
+ scientific axes,
+ all axes={unit length=1cm per 10 units, ticks={few}}]
+ data [format=function] {
+ var x : interval [0:100];
+ func y = sqrt(\value x);
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ The |scientific axes| have the following properties:
+ %
+ \begin{itemize}
+ \item The |x|-values are surveyed and the $x$-axis is then scaled and
+ shifted so that it has the length specified by the following key.
+ %
+ \begin{key}{/tikz/data visualization/scientific axes/width=\meta{dimension} (initially 5cm)}
+ \end{key}
+ %
+ The minimum value is at the left end of the axis and at the canvas
+ origin. The maximum value is at the right end of the axis. \item
+ The |y|-values are surveyed and the $y$-axis is then scaled so that
+ is has the length specified by the following key.
+ %
+ \begin{key}{/tikz/data visualization/scientific axes/height=\meta{dimension}}
+ By default, the |height| is the golden ratio times the |width|.
+ \end{key}
+ %
+ The minimum value is at the bottom of the axis and at the canvas
+ origin. The maximum value is at the top of the axis.
+ \item Lines (forming a frame) are depicted at the minimum and maximum
+ values of the axes in 50\% black.
+ \end{itemize}
+
+ The following keys are executed by default as options: |outer ticks| and
+ |standard labels|.
+
+ You can use the following style to overrule the defaults:
+
+ \begin{stylekey}{/tikz/data visualization/every scientific axes}
+ \end{stylekey}
+\end{key}
+
+The keys described in the following can be used to fine-tune the way the
+scientific axis system is rendered.
+
+\begin{key}{/tikz/data visualization/scientific axes/outer ticks}
+ This causes the ticks to be drawn `` on the outside'' of the frame so that
+ they interfere as little as possible with the data. It is the default.
+ %
+\begin{codeexample}[width=7cm]
+\begin{tikzpicture}
+ \datavisualization [scientific axes=outer ticks,
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [-12:12];
+ func y = \value x*\value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/scientific axes/inner ticks}
+ This axis system works like |scientific axes|, only the ticks are on the
+ ``inside'' of the frame.
+ %
+\begin{codeexample}[width=7cm]
+\begin{tikzpicture}
+ \datavisualization [scientific axes=inner ticks,
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [-12:12];
+ func y = \value x*\value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ This axis system is also common in publications, but the ticks tend to
+ interfere with marks if they are near to the border as can be seen in the
+ following example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [scientific axes={inner ticks, width=3.2cm},
+ style sheet=cross marks,
+ visualize as scatter/.list={a,b}]
+ data [set=a] {
+ x, y
+ 0, 0
+ 1, 1
+ 0.5, 0.5
+ 2, 1
+ }
+ data [set=b] {
+ x, y
+ 0.05, 0
+ 1.5, 1
+ 0.5, 0.75
+ 2, 0.5
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/scientific axes/clean}
+ The axes and the ticks are completely removed from the actual data, making
+ this axis system especially useful for scatter plots, but also for most
+ other scientific plots.
+ %
+\begin{codeexample}[width=7.5cm]
+\tikz \datavisualization [
+ scientific axes=clean,
+ visualize as smooth line]
+data [format=function] {
+ var x : interval [-12:12];
+ func y = \value x*\value x*\value x;
+};
+\end{codeexample}
+
+ The distance of the axes from the actual plot is given by the padding of
+ the axes.
+\end{key}
+
+For all scientific axis systems, different label placement strategies can be
+specified. They are discussed in the following.
+
+\begin{key}{/tikz/data visualization/scientific axes/standard labels}
+ As the name suggests, this is the standard placement strategy. The label of
+ the $x$-axis is placed below the center of the $x$-axis, the label of the
+ $y$-axis is rotated by $90^\circ$ and placed left of the center of the
+ $y$-axis.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization
+ [scientific axes={clean, standard labels},
+ visualize as smooth line,
+ x axis={label=degree $d$,
+ ticks={tick unit={}^\circ}},
+ y axis={label=$\sin d$}]
+data [format=function] {
+ var x : interval [-10:10] samples 10;
+ func y = sin(\value x);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/scientific axes/upright labels}
+ Works like |scientific axes standard labels|, only the label of the
+ $y$-axis is not rotated.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes={clean, upright labels},
+ visualize as smooth line,
+ x axis={label=degree $d$,
+ ticks={tick unit={}^\circ}},
+ y axis={label=$\cos d$, include value=1,
+ ticks={style={
+ /pgf/number format/precision=4,
+ /pgf/number format/fixed zerofill}}}]
+data [format=function] {
+ var x : interval [-10:10] samples 10;
+ func y = cos(\value x);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/scientific axes/end labels}
+ Places the labels at the end of the $x$- and the $y$-axis, similar to the
+ axis labels of a school book axis system.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes={clean, end labels},
+ visualize as smooth line,
+ x axis={label=degree $d$,
+ ticks={tick unit={}^\circ}},
+ y axis={label=$\tan d$}]
+data [format=function] {
+ var x : interval [-80:80];
+ func y = tan(\value x);
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Reference: School Book Axis Systems}
+
+\begin{key}{/tikz/data visualization/school book axes=\meta{options}}
+ This axis system is intended to ``look like'' the coordinate systems often
+ used in school books: The axes are drawn in such a way that they intersect
+ to origin. Furthermore, no automatic scaling is done to ensure that the
+ lengths of units are the same in all directions.
+
+ This axis system must be used with care -- it is nearly always necessary to
+ specify the desired unit length by hand using the option |unit length|. If
+ the magnitudes of the units on the two axes differ, different unit lengths
+ typically need to be specified for the different axes.
+
+ Finally, if the data is ``far removed'' from the origin, this axis system
+ will also ``look bad''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as smooth line]
+ data [format=function] {
+ var x : interval [-1.3:1.3];
+ func y = \value x*\value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ The stepping of the ticks is one unit by default. Using keys like
+ |ticks=some| may help to give better steppings.
+
+ The \meta{options} are executed with the key itself as path prefix. Thus,
+ the following subkeys are permissible options:
+ %
+ \begin{key}{/tikz/data visualization/school book axes/unit=\meta{value}}
+ Sets the scaling so that 1\,cm corresponds to \meta{value} units. At
+ the same time, the stepping of the ticks will also be set to
+ \meta{value}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes={unit=10},
+ visualize as smooth line,
+ clean ticks,
+ x axis={label=$x$},
+ y axis={label=$f(x)$}]
+ data [format=function] {
+ var x : interval [-20:20];
+ func y = \value x*\value x/10;
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/school book axes/standard labels}
+ This key makes the label of the $x$-axis appear at the right end of
+ this axis and it makes the label of the $y$-axis appear at the top of
+ the $y$-axis.
+
+ Currently, this is the only supported placement strategy for the school
+ book axis system.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes={standard labels},
+ visualize as smooth line,
+ clean ticks,
+ x axis={label=$x$},
+ y axis={label=$f(x)$}]
+ data [format=function] {
+ var x : interval [-1:1];
+ func y = \value x*\value x + 1;
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsubsection{Advanced Reference: Underlying Cartesian Axis Systems}
+
+The axis systems described in the following are typically not used directly by
+the user. The systems setup \emph{directions} for several axes in some sensible
+way, but they do not actually draw anything on these axes. For instance, the
+|xy Cartesian| creates two axes called |x axis| and |y axis| and makes the
+$x$-axis point right and the $y$-axis point up. In contrast, an axis system
+like |scientific axes| uses the axis system |xy Cartesian| internally and then
+proceeds to setup a lot of keys so that the axis lines are drawn, ticks and
+grid lines are drawn, and labels are placed at the correct positions.
+
+\begin{key}{/tikz/data visualization/xy Cartesian}
+ This axis system creates two axes called |x axis| and |y axis| that point
+ right and up, respectively. By default, one unit is mapped to one cm.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [xy Cartesian, visualize as smooth line]
+ data [format=function] {
+ var x : interval [-1.25:1.25];
+ func y = \value x*\value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/data visualization/xy axes=\meta{options}}
+ This key applies the \meta{options} both to the |x axis| and the
+ |y axis|.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/xyz Cartesian cabinet}
+ This axis system works like |xy Cartesian|, only it \emph{additionally}
+ creates an axis called |z axis| that points left and down. For this axis,
+ one unit corresponds to $\frac{1}{2}\sin 45^\circ\mathrm{cm}$. This is also
+ known as a cabinet projection.
+
+ \begin{key}{/tikz/data visualization/xyz axes=\meta{options}}
+ This key applies the \meta{options} both to the |x axis| and the
+ |y axis|.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/uv Cartesian}
+ This axis system works like |xy Cartesian|, but it introduces two axes
+ called |u axis| and |v axis| rather than the |x axis| and the |y axis|. The
+ idea is that in addition to a ``major'' $xy$-coordinate system this is also
+ a ``smaller'' or ``minor'' coordinate system in use for depicting, say,
+ small vectors with respect to this second coordinate system.
+
+ \begin{key}{/tikz/data visualization/uv axes=\meta{options}}
+ Applies the \meta{options} to both the |u axis| and the |y axis|.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/uvw Cartesian cabinet}
+ Like |xyz Cartesian cabinet|, but for the $uvw$-system.
+
+ \begin{key}{/tikz/data visualization/uvw axes=\meta{options}}
+ Like |xyz axes|.
+ \end{key}
+\end{key}
+
+
+\subsection{Ticks and Grids}
+\label{section-dv-ticks-and-grids}
+
+\subsubsection{Concepts}
+
+A \emph{tick} is a small visual indication on an axis of the value of the
+axis's attribute at the position where the tick is shown. A tick may be
+accompanied additionally by a textual representation, but it need not. A
+\emph{grid line} is similar to a tick, but it is not an indication on the axis,
+but rather a whole line that indicates all positions where the attribute has a
+certain value. Unlike ticks, grid lines (currently) are not accompanied by a
+textual representation.
+
+Just as for axes, the data visualization system decouples the specification of
+which ticks are present \emph{in principle} from where they are visualized. In
+the following, I describe how you specify which ticks and grid lines you would
+like to be drawn and how they should look like (their styling). The axis system
+of your choice will then visualize the ticks at a sensible position for the
+chosen system. For details on how to change where whole axis is shown along
+with its ticks, see Section~\ref{section-dv-visualize-ticks}.
+
+Specifying which ticks you are interested in is done as follows: First, you use
+|ticks| key (or, for specifying which grid lines should be present, the |grid|
+key). This key takes several possible options, described in detail in the
+following, which have different effects:
+%
+\begin{enumerate}
+ \item Keys like |step=10| or |minor steps between steps| cause a
+ ``semi-automatic'' computation of possible steps. Here, you explicitly
+ specify the stepping of steps, but the first stepping and their number
+ are computed automatically according to the range of possible values
+ for the attribute.
+ \item Keys like |few|, |some|, or |many| can be passed to |ticks| in order
+ to have \tikzname\ compute good tick positions automatically. This is
+ usually what you want to happen, which is why most axis system will
+ implicitly say |ticks={some}|.
+ \item Keys like |at| or |also at| provide ``absolute control'' over which
+ ticks or grid lines are shown. For these keys, you can not only specify
+ at what value a tick should be shown, but also its styling and also
+ whether it is a major, minor, or subminor tick or grid line.
+\end{enumerate}
+
+In the following, the main keys |ticks| and |grids| are documented first. Then
+the different kinds of ways of specifying where ticks or grid lines should be
+shown are explained.
+
+
+\subsubsection{The Main Options: Tick and Grid}
+
+\begin{key}{/tikz/data visualization/axis options/ticks=\meta{options} (default some)}
+ This key can be passed to an axis in order to configure which ticks are
+ present for the axis. The possible \meta{options} include, for instance,
+ keys like |step|, which is used to specify a stepping for the ticks, but
+ also keys like |major| or |minor| for specifying the positions of major and
+ minor ticks in detail. The list of possible options is described in the
+ rest of this section.
+
+ Note that the |ticks| option will only configure which ticks should be
+ shown in principle. The actual rendering is done only when the
+ |visualize ticks| key is used, documented in
+ Section~\ref{section-dv-visualize-ticks}, which is typically done only
+ internally by an axis system.
+
+ The \meta{options} will be executed with the path prefix
+ |/tikz/data visualization/|. When the |ticks| key is used multiple times
+ for an axis, the \meta{options} accumulate.
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ scientific axes, visualize as line,
+ x axis={ticks={step=24, minor steps between steps=3},
+ label=hours}]
+ data {
+ x, y
+ 0, 0
+ 10, 0
+ 20, 0.5
+ 30, 0.75
+ 40, 0.7
+ 50, 0.6
+ 60, 0.5
+ 70, 0.45
+ 80, 0.47
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/axis options/grid=\meta{options} (default at default ticks)}
+ This key is similar to |ticks|, only it is used to configure where grid
+ lines should be shown rather than ticks. In particular, the options that
+ can be passed to the |ticks| key can also be passed to the |grid| key. Just
+ like |ticks|, the \meta{options} only specify which grid lines should be
+ drawn in principle; it is the job of the |visualize grid| key to actually
+ cause any grid lines to be shown.
+
+ If you do not specify any \meta{options}, the default text
+ |at default ticks| is used. This option causes grid lines to be drawn at
+ all positions where ticks are shown by default. Since this usually exactly
+ what you would like to happen, most of the time you just need to
+ |all axes=grid| to cause a grid to be shown.
+\end{key}
+
+\begin{key}{/tikz/data visualization/axis options/ticks and grid=\meta{options}}
+ This key passes the \meta{options} to both the |ticks| key and also to the
+ |grid| key. This is useful when you want to specify some special points
+ explicitly where you wish a tick to be shown and also a grid line.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ visualize as smooth line,
+ all axes= {grid, unit length=1.25cm},
+ y axis={ ticks=few },
+ x axis={ ticks=many, ticks and grid={ major also at={(pi/2) as $\frac{\pi}{2}$}}}]
+ data [format=function] {
+ var x : interval [-pi/2:3*pi] samples 50;
+ func y = sin(\value x r);
+ };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Semi-Automatic Computation of Tick and Grid Line Positions}
+\label{section-dv-concept-tick-placement-strategies}
+
+Consider the following problem: The data visualization engine determines that
+in a plot the $x$-values vary between $17.4$ and $34.5$. In this case, we
+certainly do not want, say, ten ticks at exactly ten evenly spaced positions
+starting with $17.4$ and ending with $34.5$, because this would yield ticks at
+positions like $32.6$. Ticks should be placed at ``nice'' positions like $20$,
+$25$, and $30$.
+
+Determining which positions are ``nice'' is somewhat difficult. In the above
+example, the positions $20$, $25$, and $30$ are certainly nice, but only three
+ticks may be a bit few of them. Better might be the tick positions $17.5$,
+$20$, $22.5$, through to $32.5$. However, users might prefer even numbers over
+fractions like $2.5$ as the stepping.
+
+A \emph{tick placement strategy} is a method of automatically deciding which
+positions are \emph{good} for placing ticks. The data visualization engine
+comes with a number of predefined strategies, but you can also define new ones
+yourself. When the data visualization is requested to automatically determine
+``good'' positions for the placement of ticks on an axis, it uses one of
+several possible \emph{basic strategies}. These strategies differ dramatically
+in which tick positions they will choose: For a range of values between $5$ and
+$1000$, a |linear steps| strategy might place ticks at positions $100$, $200$,
+through to $1000$, while an |exponential steps| strategy would prefer the tick
+positions $10$, $100$ and $1000$. The exact number and values of the tick
+positions chosen by either strategy can be fine-tuned using additional options
+like |step| or |about|.
+
+Here is an example of the different stepping chosen when one varies the tick
+placement strategy:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [scientific axes, visualize as smooth line]
+ data [format=function] {
+ var x : interval [1:11];
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\qquad
+\begin{tikzpicture}
+ \datavisualization [scientific axes, visualize as smooth line,
+ y axis={exponential steps},
+ x axis={ticks={quarter about strategy}},
+ ]
+ data [format=function] {
+ var x : interval [1:11];
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Two strategies are always available: |linear steps|, which yields
+(semi)automatic ticks are evenly spaced positions, and |exponential steps|,
+which yields (semi)automatic steps at positions at exponentially increasing
+positions -- which is exactly what is needed for logarithmic plots. These
+strategies are details in Section~\ref{section-dv-strategies}.
+
+The following options are used to configure tick placement strategies like
+|linear steps|. Unlike the basic choice of a placement strategy, which is an
+axis option, the following should be passed to the option |ticks| or |grid|
+only. So, you would write things like |x axis={ticks={step=2}}|, but
+|x axis={linear steps}|.
+
+\begin{key}{/tikz/data visualization/step=\meta{value} (initially 1)}
+ The value of this key is used to determine the spacing of the major ticks.
+ The key is used by the |linear steps| and |exponential steps| strategies,
+ see the explanations in Section~\ref{section-dv-strategies} for details.
+ Basically, all ticks are placed at all multiples of \meta{value} that lie
+ in the attribute range interval.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [
+ school book axes, visualize as smooth line,
+ y axis={ticks={step=1.25}},
+ ]
+ data [format=function] {
+ var x : interval [0:3];
+ func y = \value x*\value x/2;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/minor steps between steps=\meta{number} (default 9)}
+ Specifies that between any two major steps (whose positions are specified
+ by the |step| key), there should be \meta{number} many minor steps. Note
+ that the default of |9| is exactly the right number so that each interval
+ between two minor steps is exactly a tenth of the size of a major step. See
+ also Section~\ref{section-dv-strategies} for further details.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as smooth line,
+ x axis={ticks={minor steps between steps=3}},
+ y axis={ticks={minor steps between steps}},
+ ]
+ data [format=function] {
+ var x : interval [-1.5:1.5];
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/phase=\meta{value} (initially 0)}
+ See Section~\ref{section-dv-strategies} for details on how the phase of
+ steps influences the tick placement.
+\end{key}
+
+
+\subsubsection{Automatic Computation of Tick and Grid Line Positions}
+
+The |step| option gives you ``total control'' over the stepping of ticks on an
+axis, but you often do not know the correct stepping in advance. In this case,
+you may prefer to have a good value for |step| being computed for you
+automatically.
+
+Like the |step| key, these options are passed to the |ticks| option. So, for
+instance, you would write |x axis={ticks={about=4}}| to request about four
+ticks to be placed on the $x$-axis.
+
+\begin{key}{/tikz/data visualization/about=\meta{number}}
+ This key asks the data visualization to place \emph{about} \meta{number}
+ many ticks on an axis. It is not guaranteed that \emph{exactly}
+ \meta{number} many ticks will be used, rather the actual number will be the
+ closest number of ticks to \meta{number} so that their stepping is still
+ ``good''. For instance, when you say |about=10|, it may happen that exactly
+ |10|, but perhaps even |13| ticks are actually selected, provided that
+ these numbers of ticks lead to good stepping values like |5| or |2.5|
+ rather than numbers like |3.4| or |7|. The method that is used to determine
+ which steppings a deemed to be ``good'' depends on the current tick
+ placement strategy.
+
+
+ \medskip
+ \textbf{Linear steps.}
+ Let us start with |linear steps|: First, the difference between the maximum
+ value $v_{\max}$ and the minimum value $v_{\min}$ on the axis is computed;
+ let us call it $r$ for ``range''. Then, $r$ is divided by \meta{number},
+ yielding a target stepping~$s$. If $s$ is a number like $1$ or $5$ or $10$,
+ then this number could be used directly as the new value of |step|.
+ However, $s$ will typically something strange like $0.023\,45$ or
+ $345\,223.76$, so $s$ must be replaced by a better value like $0.02$ in the
+ first case and perhaps $250\,000$ in the second case.
+
+ In order to determine which number is to be used, $s$ is rewritten in the
+ form $m \cdot 10^k$ with $1 \le m < 10$ and $k \in \mathbb Z$. For
+ instance, $0.023\,45$ would be rewritten as $2.345 \cdot 10^{-2}$ and
+ $345\,223.76$ as $3.452\,2376 \cdot 10^5$. The next step is to replace the
+ still not-so-good number $m$ like $2.345$ or $3.452\,237$ by a ``good''
+ value $m'$. For this, the current value of the |about strategy| is used:
+ %
+ \begin{key}{/tikz/data visualization/about strategy=\meta{list}}
+ The \meta{list} is a comma-separated sequence of pairs
+ \meta{threshold}/\meta{value} like for instance |1.5/1.0| or |2.3/2.0|.
+ When a good value $m'$ is sought for a given $m$, we iterate over the
+ list and find the first pair \meta{threshold}/\meta{value} where
+ \meta{threshold} exceeds~$m$. Then $m'$ is set to \meta{value}. For
+ instance, if \meta{list} is |1.5/1.0,2.3/2.0,4/2.5,7/5,11/10|, which is
+ the default, then for $m=3.141$ we would get $m'=2.5$ since $4 >
+ 3.141$, but $2.3 \le 3.141$. For $m=6.3$ we would get $m'=5$.
+ \end{key}
+ %
+ Once $m'$ has been determined, the stepping is set to $s' = m' \cdot 10^k$.
+
+ % Define an axis type
+ \tikzdatavisualizationset{
+ one dimensional axis/.style={
+ new Cartesian axis=axis,
+ axis={
+ attribute=main,
+ unit vector={(0pt,1pt)},
+ visualize axis={style=->},
+ visualize ticks={major={tick text at low},direction axis=perpendicular},
+ length=3cm
+ },
+ new Cartesian axis=perpendicular,
+ perpendicular={
+ attribute=perp,
+ unit vector={(1pt,0pt)},
+ include value=0,
+ include value=1
+ }
+ }
+ }
+
+ \def\showstrategy#1{
+ % Show the effect for the different strategies
+ \medskip
+ \begin{tikzpicture}
+ \foreach \max/\about [count=\c] in {10/5,20/5,30/5,40/5,50/5,60/5,70/5,80/5,90/5,100/5,100/3,100/10}
+ {
+ \begin{scope}[xshift=\c pt*30]
+ \datavisualization [#1,
+ one dimensional axis,
+ axis={
+ ticks={about=\about},
+ include value=0,
+ include value=\max
+ }
+ ];
+
+ \node at (0,-5mm) [anchor=mid] {\texttt{\about}};
+ \end{scope}
+ }
+
+ \node at (30pt,-5mm) [anchor=mid east] {\texttt{about=\ \ }};
+ \end{tikzpicture}
+ }
+
+ The net effect of all this is that for the default strategy the only valid
+ stepping are the values $1$, $2$, $2.5$ and $5$ and every value obtainable
+ by multiplying one of these values by a power of ten. The following example
+ shows the effects of, first, setting |about=5| (corresponding to the |some|
+ option) and then having axes where the minimum value is always |0| and
+ where the maximum value ranges from |10| to |100| and, second, setting
+ |about| to the values from |3| (corresponding to the |few| option) and to
+ |10| (corresponding to the |many| option) while having the minimum at |0|
+ and the maximum at |100|:
+
+ \showstrategy{standard about strategy}
+
+ \medskip
+ \textbf{Exponential steps.}
+ For |exponential steps| the strategy for determining a good stepping value
+ is similar to |linear steps|, but with the following differences:
+ %
+ \begin{itemize}
+ \item Naturally, since the stepping value refers to the exponent, the
+ whole computation of a good stepping value needs to be done ``in
+ the exponent''. Mathematically spoken, instead of considering the
+ difference $r = v_{\max} - v_{\min}$, we consider the difference $r
+ = \log v_{\max} - \log v_{\min}$. With this difference, we still
+ compute $s = r / \meta{number}$ and let $s = m \cdot 10^k$ with $1
+ \le m < 10$.
+ \item It makes no longer sense to use values like $2.5$ for $m'$ since
+ this would yield a fractional exponent. Indeed, the only sensible
+ values for $m'$ seem to be $1$, $3$, $6$, and $10$. Because of
+ this, the |about strategy| is ignored and one of these values or a
+ multiple of one of them by a power of ten is used.
+ \end{itemize}
+
+ The following example shows the chosen steppings for a maximum varying from
+ $10^1$ to $10^5$ and from $10^{10}$ to $10^{50}$ as well as for $10^{100}$
+ for |about=3|:
+
+ \medskip
+ \begin{tikzpicture}
+ \foreach \max [count=\c] in {1,...,5,10,20,...,50,100}
+ {
+ \begin{scope}[xshift=\c pt*40]
+ \datavisualization [
+ one dimensional axis,
+ axis={
+ logarithmic,
+ ticks={about=3},
+ include value=1,
+ include value=1e\max
+ }
+ ];
+ \end{scope}
+ }
+ \end{tikzpicture}
+
+
+ \medskip
+ \textbf{Alternative strategies.}
+
+ In addition to the standard |about strategy|, there are some additional
+ strategies that you might wish to use instead:
+
+ \begin{key}{/tikz/data visualization/standard about strategy}
+ Permissible values for $m'$ are: $1$, $2$, $2.5$, and~$5$. This
+ strategy is the default strategy.
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/euro about strategy}
+ Permissible values for $m'$ are: $1$, $2$, and~$5$. These are the same
+ values as for the Euro coins, hence the name.
+
+ \showstrategy{euro about strategy}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/half about strategy}
+ Permissible values for $m'$: $1$ and $5$. Use this strategy if only
+ powers of $10$ or halves thereof seem logical.
+
+ \showstrategy{half about strategy}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/decimal about strategy}
+ The only permissible value for $m'$ is $1$. This is an even more
+ radical version of the previous strategy.
+
+ \showstrategy{decimal about strategy}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/quarter about strategy}
+ Permissible values for $m'$ are: $1$, $2.5$, and $5$.
+
+ \showstrategy{quarter about strategy}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/int about strategy}
+ Permissible values for $m'$ are: $1$, $2$, $3$, $4$, and $5$.
+
+ \showstrategy{int about strategy}
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/many}
+ This is an abbreviation for |about=10|.
+\end{key}
+
+\begin{key}{/tikz/data visualization/some}
+ This is an abbreviation for |about=5|.
+\end{key}
+
+\begin{key}{/tikz/data visualization/few}
+ This is an abbreviation for |about=3|.
+\end{key}
+
+\begin{key}{/tikz/data visualization/none}
+ Switches off the automatic step computation. Unless you use |step=|
+ explicitly to set a stepping, no ticks will be (automatically) added.
+\end{key}
+
+
+\subsubsection{Manual Specification of Tick and Grid Line Positions}
+
+The automatic computation of ticks and grid lines will usually do a good job,
+but not always. For instance, you might wish to have ticks exactly at, say,
+prime numbers or at Fibonacci numbers or you might wish to have an additional
+tick at $\pi$. In these cases you need more direct control over the
+specification of tick positions.
+
+First, it is important to understand that the data visualization system
+differentiates between three kinds of ticks and grid lines: major, minor, and
+subminor. The major ticks are the most prominent ticks where, typically, a
+textual representation of the tick is shown; and the major grid lines are the
+thickest. The minor ticks are smaller, more numerous, and lie between major
+ticks. They are used, for instance, to indicate positions in the middle between
+major ticks or at all integer positions between major ticks. Finally, subminor
+ticks are even smaller than minor ticks and they lie between minor ticks.
+
+Four keys are used to configure the different kinds:
+
+\begin{key}{/tikz/data visualization/major=\meta{options}}
+ The key can be passed as an option to the |ticks| key and also to the
+ |grid| key, which in turn is passed as an option to an axis. The
+ \meta{options} passed to |major| specify at which positions major
+ ticks/grid lines should be shown (using the |at| option and |also at|
+ option) and also any special styling. The different possible options are
+ described later in this section.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [ school book axes, visualize as smooth line,
+ x axis={ticks={major={at={1, 1.5, 2}}}}]
+ data [format=function] {
+ var x : interval [-1.25:2];
+ func y = \value x * \value x / 2;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/minor=\meta{options}}
+ Like |major|, only for minor ticks/grid lines.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [ school book axes, visualize as smooth line,
+ x axis={grid={minor={at={1, 1.5, 2}}}}]
+ data [format=function] {
+ var x : interval [-1.25:2];
+ func y = \value x * \value x / 2;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/subminor=\meta{options}}
+ Like |major|, only for subminor ticks/grid lines.
+\end{key}
+
+\begin{key}{/tikz/data visualization/common=\meta{options}}
+ This key allows you to specify \meta{options} that apply to |major|,
+ |minor| and |subminor| alike. It does not make sense to use |common| to
+ specify positions (since you typically do not want both a major and a minor
+ tick at the same position), but it can be useful to configure, say, the
+ size of all kinds of ticks:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [ school book axes, visualize as smooth line,
+ x axis={ticks={minor steps between steps, common={low=0}}} ]
+ data [format=function] {
+ var x : interval [-1.25:2];
+ func y = \value x * \value x / 2;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+The following keys can now be passed to the |major|, |minor|, and |subminor|
+keys to specify where ticks or grid lines should be shown:
+
+\begin{key}{/tikz/data visualization/at=\meta{list}}
+ Basically, the \meta{list} must be a list of values that is processed with
+ the |\foreach| macro (thus, it can contain ellipses to specify ranges of
+ value). Empty values are skipped.
+
+ The effect of passing |at| to a |major|, |minor|, or |subminor| key is that
+ ticks or grid lines on the axis will be placed exactly at the values in
+ \meta{list}. Here is an example:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [ school book axes, visualize as smooth line,
+ x axis={ticks={major={at={-1,0.5,(pi/2)}}}}]
+ data [format=function] {
+ var x : interval [-1.25:2];
+ func y = \value x * \value x / 2;
+ };
+\end{codeexample}
+ When this option is used, any previously specified tick positions are
+ overwritten by the values in \meta{list}. Automatically computed ticks are
+ also overwritten. Thus, this option gives you complete control over where
+ ticks should be placed.
+
+ Normally, the individual values inside the \meta{list} are just numbers
+ that are specified in the same way as an attribute value. However, such a
+ value may also contain the keyword |as|, which allows you so specify the
+ styling of the tick in detail. Section~\ref{section-dv-ticks-styling}
+ details how this works.
+
+ It is often a bit cumbersome that one has to write things like
+ %
+\begin{codeexample}[code only]
+some axis = {ticks = {major = {at = {...}}}}
+\end{codeexample}
+ %
+ A slight simplification is given by the following keys, which can be passed
+ directly to |ticks| and |grid|:
+ %
+ \begin{key}{/tikz/data visualization/major at=\meta{list}}
+ A shorthand for |major={at={|\meta{list}|}}|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/minor at=\meta{list}}
+ A shorthand for |major={at={|\meta{list}|}}|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/subminor at=\meta{list}}
+ A shorthand for |major={at={|\meta{list}|}}|.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/also at=\meta{list}}
+ This key is similar to |at|, but it causes ticks or grid lines to be placed
+ at the positions in the \meta{list} \emph{in addition} to the ticks that
+ have already been specified either directly using |at| or indirectly using
+ keys like |step| or |some|. The effect of multiple calls of this key
+ accumulate. However, when |at| is used after an |also at| key, the |at| key
+ completely resets the positions where ticks or grid lines are shown.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [ school book axes, visualize as smooth line,
+ x axis={grid, ticks and grid={major={also at={0.5}}}}]
+ data [format=function] {
+ var x : interval [-1.25:2];
+ func y = \value x * \value x / 2;
+ };
+\end{codeexample}
+ %
+ As for |at|, there are some shorthands available:
+ %
+ \begin{key}{/tikz/data visualization/major also at=\meta{list}}
+ A shorthand for |major={also at={|\meta{list}|}}|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/minor also at=\meta{list}}
+ A shorthand for |major={also at={|\meta{list}|}}|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/subminor also at=\meta{list}}
+ A shorthand for |major={also at={|\meta{list}|}}|.
+ \end{key}
+\end{key}
+
+
+\subsubsection{Styling Ticks and Grid Lines: Introduction}
+\label{section-dv-ticks-styling}
+
+When a tick, a tick label, or a grid line is visualized on the page, a whole
+regiment of styles influences the appearance. The reason for this large number
+of interdependent styles is the fact that we often wish to influence only a
+very certain part of how a tick is rendered while leaving the other aspects
+untouched: Sometimes we need to modify just the font of the tick label;
+sometimes we wish to change the length of the tick label and the tick label
+position at the same time; sometimes we wish to change the color of grid line,
+tick, and tick label; and sometimes we wish to generally change the thickness
+of all ticks.
+
+Let us go over the different kinds of things that can be styled (grid lines,
+ticks, and tick labels) one by one and let us have a look at which styles are
+involved. We will start with the grid lines, since they turn out to be the most
+simple, but first let us have a look at the general |style| and |styling|
+mechanism that is used in many placed in the following:
+
+
+\subsubsection{Styling Ticks and Grid Lines: The Style and Node Style Keys}
+\label{section-dv-style}
+
+All keys of the data visualization system have the path prefix
+|/tikz/data visualization|. This is not only true for the main keys like
+|scientific axes| or |visualize as line|, but also for keys that govern how
+ticks are visualized. In particular, a style like |every major grid| has the
+path prefix |/tikz/data visualization| and all keys stored in this style are
+also executed with this path prefix.
+
+Normally, this does not cause any trouble since most of the keys and even
+styles used in a data visualization are intended to configure what is shown in
+the visualization. However, at some point, we may also with to specify options
+that no longer configure the visualization in general, but specify the
+appearance of a line or a node on the \tikzname\ layer.
+
+Two keys are used to ``communicate'' with the \tikzname\ layer:
+
+\begin{key}{/tikz/data visualization/style=\meta{\tikzname\ options}}
+ This key takes options whose path prefix is |/tikz|, not
+ |/tikz/data visualization|. These options will be \emph{appended} to a
+ current list of such options (thus, multiple calls of this key accumulate).
+ The resulting list of keys is not executed immediately, but it will be
+ executed whenever the data visualization engine calls the \tikzname\ layer
+ to draw something (this placed will be indicated in the following).
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ all axes={ticks={style=blue}, length=3cm},
+ y axis={grid, grid={minor steps between steps, major={style=red}}},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/styling}
+ Executing this key will cause all ``accumulated'' \tikzname\ options from
+ previous calls to the key |/tikz/data visualization/style| to be executed.
+ Thus, you use |style| to set \tikzname\ options, but you use |styling| to
+ actually apply these options. Usually, you do not call this option directly
+ since this application is only done deep inside the data visualization
+ engine.
+\end{key}
+
+Similar to |style| (and |styling|) there also exist the |node style| (and
+|node styling|) key that takes \tikzname\ options that apply to nodes only --
+in addition to the usual |style|.
+
+\begin{key}{/tikz/data visualization/node style=\meta{\tikzname\ options}}
+ This key works like |style|, only it has an effect only on nodes that are
+ created during a data visualization. This includes tick labels and axis
+ labels:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ all axes={ticks={node style=red}, length=3cm},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+ Note that in the example the ticks themselves (the little thicker lines)
+ are not red.
+\end{key}
+
+\begin{key}{/tikz/data visualization/node styling}
+ Executing this key will cause all ``accumulated'' node stylings to be
+ executed.
+\end{key}
+
+
+\subsubsection{Styling Ticks and Grid Lines: Styling Grid Lines}
+\label{section-dv-styling-grid-lines}
+
+When a grid line is visualized, see
+Section~\ref{section-dv-visualize-gridlines} for details on when this happens,
+the following styles are executed in the specified order.
+%
+\begin{enumerate}
+ \item |grid layer|.
+ \item |every grid|.
+ \item |every major grid| or |every minor grid| or |every subminor grid|,
+ depending on the kind of grid line.
+ \item locally specified options for the individual grid line, see
+ Section~\ref{section-dv-local-styles}.
+ \item |styling|, see Section~\ref{section-dv-style}.
+\end{enumerate}
+
+All of these keys have the path prefix |/tikz/data visualization|. However, the
+options stored in the first style (|grid layer|) and also in the last
+(|styling|) are executed with the path prefix |/tikz| (see
+Section~\ref{section-dv-style}).
+
+Let us now have a look at these keys in detail:
+
+\begin{stylekey}{/tikz/data visualization/grid layer (initially on background layer)}
+\label{section-dv-grid-layer}%
+ This key is used to specified the \emph{layer} on which grid lines should
+ be drawn (layers are explained in Section~\ref{section-tikz-backgrounds}).
+ By default, all grid lines are placed on the |background| layer and thus
+ behind the data visualization. This is a sensible strategy since it avoids
+ obscuring the more important data with the far less important grid lines.
+ However, you can change this style to ``get the grid lines to the front'':
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ all axes={
+ length=3cm,
+ grid,
+ grid={minor steps between steps}
+ },
+ grid layer/.style=, % none, so on top of data (bad idea)
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+ When this style is executed, the keys stored in the style will be executed
+ with the prefix |/tikz|. Normally, you should only set this style to be
+ empty or to |on background layer|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every grid}
+ This style provides overall configuration options for grid lines. By
+ default, it is set to the following:
+ %
+\begin{codeexample}[code only]
+low=min, high=max
+\end{codeexample}
+ %
+ This causes grid lines to span all possible values when they are
+ visualized, which is usually the desired behaviour (the |low| and |high|
+ keys are explained in Section~\ref{section-dv-visualize-ticks}. You can
+ append the |style| key to this style to configure the overall appearance of
+ grid lines. In the following example we cause all grid lines to be dashed
+ (which is not a good idea in general since it creates a distracting
+ background pattern).
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ all axes={length=3cm, grid},
+ every grid/.append style={style=densely dashed},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every major grid}
+ This style configures the appearance of major grid lines. It does so by
+ calling the |style| key to setup appropriate \tikzname\ options for
+ visualizing major grid lines. The default definition of this style is:
+ %
+\begin{codeexample}[code only]
+style = {help lines, thin, black!25}
+\end{codeexample}
+ %
+ In the following example, we use thin major blue grid lines:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes,
+ all axes={
+ length=3cm,
+ grid,
+ grid={minor steps between steps}
+ },
+ every major grid/.style = {style={blue, thin}},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+ As can be seen, this is not exactly visually pleasing. The default settings
+ for the grid lines should work in most situations; you may wish to increase
+ the blackness level, however, when you experience trouble during printing
+ or projecting graphics.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every minor grid}
+ Works like |every major grid|. The default is
+ %
+\begin{codeexample}[code only]
+style = {help lines, black!25}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every subminor grid}
+ Works like |every major grid|. The default is
+ %
+\begin{codeexample}[code only]
+style = {help lines, black!10}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsubsection{Styling Ticks and Grid Lines: Styling Ticks and Tick Labels}
+\label{section-dv-styling-ticks}
+
+Styling ticks and tick labels is somewhat similar to styling grid lines. Let us
+start with the tick \emph{mark}, that is, the small line that represents the
+tick. When this mark is drawn, the following styles are applied:
+%
+\begin{enumerate}
+ \item |every ticks|.
+ \item |every major ticks| or |every minor ticks| or |every subminor ticks|,
+ depending on the kind of ticks to be visualized.
+ \item locally specified options for the individual tick, see
+ Section~\ref{section-dv-local-styles}.
+ \item |tick layer|
+ \item |every odd tick| or |every even tick|, see
+ Section~\ref{section-dv-stacking}.
+ \item |draw|
+ \item |styling|, see Section~\ref{section-dv-style}.
+\end{enumerate}
+
+For the tick label node (the node containing the textual representation of the
+attribute's value at the tick position), the following styles are applied:
+%
+\begin{enumerate}
+ \item |every ticks|.
+ \item |every major ticks| or |every minor ticks| or |every subminor ticks|,
+ depending on the kind of ticks to be visualized.
+ \item locally specified options for the individual tick, see
+ Section~\ref{section-dv-local-styles}.
+ \item |tick node layer|
+ \item |every odd tick| or |every even tick|, see
+ Section~\ref{section-dv-stacking}.
+ \item |styling|, see Section~\ref{section-dv-style}.
+ \item |node styling|, see Section~\ref{section-dv-style}.
+\end{enumerate}
+
+\begin{stylekey}{/tikz/data visualization/every ticks}
+ This style allows you to configure the appearance of ticks using the
+ |style| and |node style| key. Here is (roughly) the default definition of
+ this style:
+ %
+\begin{codeexample}[code only]
+node style={
+ font=\footnotesize,
+ inner sep=1pt,
+ outer sep=.1666em,
+ rounded corners=1.5pt
+}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every major ticks}
+ The default is
+ %
+\begin{codeexample}[code only]
+ style={line cap=round}, tick length=2pt
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every minor ticks}
+ The default is
+ %
+\begin{codeexample}[code only]
+ style={help lines,thin, line cap=round}, tick length=1.4pt
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/every subminor ticks}
+ The default is
+ %
+\begin{codeexample}[code only]
+ style={help lines, line cap=round}, tick length=0.8pt
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/tick layer (initially on background layer)}
+ Like |grid layer|, this key specifies on which layer the ticks should be
+ placed.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/tick node layer (initially \normalfont empty)}
+ Like |tick layer|, but now for the nodes. By default, tick nodes are placed
+ on the main layer and thus on top of the data in case that the tick nodes
+ are inside the data.
+\end{stylekey}
+
+
+\subsubsection{Styling Ticks and Grid Lines: Exceptional Ticks}
+
+You may sometimes wish to style a few ticks differently from the other ticks.
+For instance, in the axis system |school book axes| there should be a tick
+label at the |0| position only on one axis and then this label should be offset
+a bit. In many cases this is easy to achieve: When you add a tick ``by hand''
+using the |at| or |also at| option, you can add any special options in square
+brackets.
+
+However, in some situations the special tick position has been computed
+automatically for you, for instance by the |step| key or by saying |tick=some|.
+In this case, adding a tick mark with the desired options using |also at| would
+cause the tick mark with the correct options to be shown in addition to the
+tick mark with the wrong options. In cases like this one, the following option
+may be helpful:
+
+\begin{key}{/tikz/data visualization/options at=\meta{value} |as [|\meta{options}|]|}
+ This key causes the \meta{options} to be executed for any tick mark(s) at
+ \meta{value} in addition to any options given already for this position:
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line,
+ x axis={ticks={major={
+ options at = 3 as [no tick text],
+ also at = (pi) as
+ [{tick text padding=1ex}] $\pi$}}}]
+data [format=function] {
+ var x : interval[0:2*pi];
+ func y = sin(\value x r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/no tick text at=\meta{value}}
+ Shorthand for |options at=|\meta{value}| as [no tick text]|.
+\end{key}
+
+
+\subsubsection{Styling Ticks and Grid Lines: Styling and Typesetting a Value}
+\label{section-dv-local-styles}
+\label{section-dv-tick-labels}
+
+The \todosp{why 2 labels?} |at| and |also at| key allow you to provide a
+comma-separated \meta{list} of \meta{value}s where ticks or grid lines should
+be placed. In the simplest case, the \meta{value} is simply a number. However,
+the general syntax allows three different kinds of \meta{value}s:
+%
+\begin{enumerate}
+ \item \meta{value}
+ \item \meta{value} |as| |[|\meta{local options}|]|
+ \item \meta{value} |as| \opt{|[|\meta{local options}|]|} \meta{text}
+\end{enumerate}
+
+In the first case, the \meta{value} is just a number that is interpreted like
+any other attribute value.
+
+In the second case, where the keyword |as| is present, followed by some option
+in square brackets, but nothing following the closing square bracket, when the
+tick or grid line at position \meta{value} is shown, the \meta{local options}
+are executed first. These can use the |style| key or the |node style| key to
+configure the appearance of this single tick or grid line. You can also use
+keys like |low| or |high| to influence how large the grid lines or the ticks
+are or keys like |tick text at low| to explicitly hide or show a tick label.
+
+In the third case, which is only important for |ticks| and not for |grid|, the
+same happens as in the second case, but the text that is shown as tick label is
+\meta{text} rather than the automatically generated tick label. This automatic
+generation of tick labels is explained in the following.
+%
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes=clean,
+ x axis={length=2.5cm, ticks={major at={
+ 5,
+ 6 as [style=red],
+ 7 as [{style=blue, low=-1em}],
+ 8 as [style=green] $2^3$,
+ 10 as ten
+ }}},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+
+A value like ``2'' or ``17'' could just be used as \meta{text} to be displayed
+in the node of a tick label. However, things are more difficult when the
+to-be-shown value is $0.0000000015$, because we then would typically (but not
+always) prefer something like $1.5 \cdot 10^{-9}$ to be shown. Also, we might
+wish a unit to be added like $23\mathrm{m}/\mathrm{s}$. Finally, we might wish
+a number like $3.141$ to be replaced by $\pi$. For these reasons, the data
+visualization system does not simply put the to-be-shown value in a node as
+plain text. Instead, the number is passed to a \emph{typesetter} whose job it
+is to typeset this number nicely using \TeX's typesetting capabilities. The
+only exception is, as indicated above, the third syntax version of the |at| and
+|also at| keys, where \meta{text} is placed in the tick label's node,
+regardless of what the typesetting would usually do.
+
+The text produced by the automatic typesetting is computed as follows:
+%
+\begin{enumerate}
+ \item The current contents of the key |tick prefix| is put into the node.
+ \item This is followed by a call of the key |tick typesetting| which gets
+ the \meta{value} of the tick as its argument in scientific notation.
+ \item This is followed by the contents of the key |tick suffix|.
+\end{enumerate}
+
+Let us have a look at these keys in detail:
+
+\begin{key}{/tikz/data visualization/tick prefix=\meta{text} (initially \normalfont empty)}
+ The \meta{text} will be put in front of every typeset tick:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes, all axes={ticks=few, length=2.5cm},
+ x axis={ticks={tick prefix=$\langle$, tick suffix=$]$}},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/tick suffix=\meta{text} (initially \normalfont empty)}
+ Works like |tick prefix|. This key is especially useful for adding units
+ like ``cm'' or ``$\mathrm m/\mathrm s$'' to every tick label. For this
+ reason, there is a (near) alias that is easier to memorize:
+ %
+ \begin{key}{/tikz/data visualization/tick unit=\meta{roman math text}}
+ A shorthand for |tick suffix={$\,\rm|\meta{roman math text}|$}|:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [scientific axes, all axes={length=3cm},
+ x axis={ticks={tick unit=s}},
+ y axis={ticks={tick unit=m/s^2}},
+ visualize as line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/tick typesetting=\meta{value}}
+ The key gets called for each number that should be typeset. The argument
+ \meta{value} will be in scientific notation (like |1.0e1| for $10$). By
+ default, this key applies |\pgfmathprintnumber| to its argument. This
+ command is a powerful number printer whose configuration is documented in
+ Section~\ref{pgfmath-numberprinting}.
+
+ You are invited to code underlying this key so that a different typesetting
+ mechanism is used. Here is a (not quite finished) example that shows how,
+ say, numbers could be printed in terms of multiples of $\pi$:
+ %
+\begin{codeexample}[]
+\def\mytypesetter#1{%
+ \pgfmathparse{#1/pi}%
+ \pgfmathprintnumber{\pgfmathresult}$\pi$%
+}
+\tikz \datavisualization
+ [school book axes, all axes={unit length=1.25cm},
+ x axis={ticks={step=(0.5*pi), tick typesetter/.code=\mytypesetter{##1}}},
+ y axis={include value={-1,1}},
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [0.5:7];
+ func y = sin(\value x r);
+ };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Stacked Ticks}
+\label{section-dv-stacking}
+
+Sometimes, the text of tick labels are so long or so numerous that the text of
+adjacent tick labels overlap (or have too little padding):
+%
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+%
+There are two ways to address this problem:
+%
+\begin{itemize}
+ \item One can rotate the labels on horizontal axes:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm},
+ x axis={ticks={node style={rotate=90, anchor=east}}},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+ %
+ This is often a good solution, but may be hard to read. Also consider
+ rotating labels only by $45^\circ$ or $30^\circ$.
+ \item One can specify different shifts of the nodes for the different
+ ticks, whereby the ticks text no longer overlap.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm},
+ x axis={ticks={major at={0,4000,8000,
+ 2000 as [node style={yshift=-1em}],
+ 6000 as [node style={yshift=-1em}],
+ 10000 as [node style={yshift=-1em}]}}},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+ %
+ However, specifying shifts ``by hand'' in the above way is not always
+ an option, especially when the tick positions should be computed
+ automatically. Instead, the |stack| option can be used, which is much
+ easier to use and gives better results:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm}, x axis={ticks=stack},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+ %
+\end{itemize}
+
+The |stack| option is actually just a style that gives you access to the
+general even/odd mechanism for ticks with labels. Whenever a tick mark is
+created where a tick label is also to be drawn, two special things happen:
+%
+\begin{enumerate}
+ \item For every odd tick mark, the |every odd tick| style is executed, for
+ every even tick mark the |every even tick|. Here, ``odd'' and ``even''
+ are with respect to the order in which the ticks have been added to the
+ list of |at| positions for each major, minor, or subminor tick list,
+ not with respect to the order in which they will appear on the axis.
+ Thus, when you write
+ %
+\begin{codeexample}[code only]
+ticks={major at={1,2,3,4}, major at={0,-1,-2}, minor at={9,8,7}}
+\end{codeexample}
+ %
+ then for |1|, |3|, |0|, and |-2| as well as |9| and |7| the key
+ |every odd tick| will be executed, while |every even tick| will be
+ executed for positions |2|, |4|, |-1|, and also |8|.
+ \item When a tick node label is shown at the |low| position of the tick
+ mark, the dimension stored in the key |tick text low even padding| is
+ added to the |low| value. Provided that this padding is not zero (which
+ is the default), the length of the even tick marks will be increased
+ and the tick label node will be placed at a greater distance from the
+ axis.
+
+ Similar keys exist for padding ticks with labels at high positions and
+ also at even positions.
+\end{enumerate}
+
+\begin{key}{/tikz/data visualization/tick text low even padding=\meta{dimension} (initially 0pt)}
+ When a tick label is shown at the low position of an even tick, the
+ \meta{distance} is added to the |low| value, see also
+ Section~\ref{section-dv-visualize-ticks}.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm},
+ x axis={ticks={tick text low even padding=-1em}},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+ %
+ Note that \meta{dimension} should usually be non-positive.
+\end{key}
+
+The following keys work similarly:
+%
+\begin{key}{/tikz/data visualization/tick text low odd padding=\meta{dimension} (initially 0pt)}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/tick text high even padding=\meta{dimension} (initially 0pt)}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/tick text high odd padding=\meta{dimension} (initially 0pt)}
+\end{key}
+
+\begin{key}{/tikz/data visualization/tick text odd padding=\meta{dimension}}
+ A shorthand for setting |tick text odd low padding| and
+ |tick text odd high padding| at the same time.
+\end{key}
+
+\begin{key}{/tikz/data visualization/tick text even padding=\meta{dimension}}
+ A shorthand for setting |tick text even low padding| and
+ |tick text even high padding| at the same time.
+\end{key}
+
+\begin{key}{/tikz/data visualization/tick text padding=\meta{dimension}}
+ Sets all text paddings to \meta{dimension}.
+\end{key}
+
+\begin{key}{/tikz/data visualization/stack=\meta{dimension} (default 1em)}
+ Shorthand for |tick text even padding=|\meta{dimension}.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm},
+ x axis={ticks={stack=1.5em}},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/stack'=\meta{dimension}}
+ Shorthand for |tick text odd padding=|\meta{dimension}. The difference to
+ |stack| is that the set of value that are ``lowered'' is exactly exchanged
+ with the set of value ``lowered'' by |stack|.
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes,
+ all axes={length=2.5cm},
+ x axis={ticks=stack'},
+ visualize as smooth line]
+ data [format=function] {
+ var y : interval[-100:100];
+ func x = \value y*\value y;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+Note that the above keys have an effect on all tick labels of an axis, also on
+special ticks that you may have added using the |also at| key. When using the
+|stack| key, you should specify a |tick text padding| explicitly for such keys:
+%
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes,
+ x axis={ticks={stack, many, major also at=
+ {(pi) as [{tick text padding=2.5em}] $\pi$}}},
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval[0:(2*pi)];
+ func y = sin(\value x r);
+ };
+\end{codeexample}
+
+
+\subsubsection{Reference: Basic Strategies}
+\label{section-dv-strategies}
+
+\begin{key}{/tikz/data visualization/axis options/linear steps}
+ This strategy places ticks at positions that are evenly spaced by the
+ current value of |step|.
+
+ In detail, the following happens: Let $a$ be the minimum value of the data
+ values along the axis and let $b$ be the maximum. Let the current
+ \emph{stepping} be $s$ (the stepping is set using the |step| option, see
+ below) and let the current \emph{phasing} be $p$ (set using the |phase|)
+ option. Then ticks are placed all positions $i\cdot s + p$ that lie in the
+ interval $[a,b]$, where $i$ ranges over all integers.
+
+ The tick positions computed in the way described above are \emph{mayor}
+ step positions. In addition to these, if the key
+ |minor steps between steps| is set to some number $n$, then $n$ many minor
+ ticks are introduced between each two mayor ticks (and also before and
+ after the last mayor tick, provided the values still lie in the interval
+ $[a,b]$). Note that is $n$ is $1$, then one minor tick will be added in the
+ middle between any two mayor ticks. Use a value of $9$ (not $10$) to
+ partition the interval between two mayor ticks into ten equally sized minor
+ intervals.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization
+ [scientific axes={inner ticks, width=3cm},
+ x axis={ticks={step=3, minor steps between steps=2}},
+ y axis={ticks={step=.36}},
+ visualize as scatter]
+ data {
+ x, y
+ 17, 30
+ 34, 32
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\label{section-dv-exponential-strategy}
+
+\begin{key}{/tikz/data visualization/axis options/exponential steps}
+ This strategy produces ticks at positions that are appropriate for
+ logarithmic plots. It is automatically selected when you use the
+ |logarithmic| option with an axis.
+
+ In detail, the following happens: As for |linear steps| let numbers $a$,
+ $b$, $s$, and $p$ be given. Then, mayor ticks are placed at all positions
+ $10^{i\cdot s+p}$ that lie in the interval $[a,b]$ for $i \in \mathbb{Z}$.
+
+ The minor steps are added in the same way as for |linear steps|. In
+ particular, they interpolate \emph{linearly} between mayor steps.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization
+ [scientific axes,
+ x axis={logarithmic, length=2cm, ticks={step=1.5}},
+ y axis={logarithmic, ticks={step=1, minor steps between steps=9}},
+ visualize as scatter]
+ data {
+ x, y
+ 1, 10
+ 1000, 1000000
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Advanced: Defining New Placement Strategies}
+
+\begin{key}{/tikz/data visualization/axis options/tick placement strategy=\meta{macro}}
+ This key can be used to install a so-called \emph{tick placement strategy}.
+ Whenever |visualize ticks| is used to request some ticks to be visualized,
+ it is checked whether some automatic ticks should be created. This is the
+ case when the following key is set:
+ %
+ \begin{key}{/tikz/data visualization/compute step=\meta{code}}
+ The \meta{code} should compute a suitable value for the stepping to be
+ used by the \meta{macro} in the tick placement strategy.
+
+ For instance, the |step| key sets |compute step| to
+ |\def\tikz@lib@dv@step{#1}|. Thus, when you say |step=5|, then the
+ desired stepping of |5| is communicated to the \meta{macro} via the
+ macro |\tikz@lib@dv@step|.
+ \end{key}
+
+ Provided |compute step| is set to some nonempty value, upon visualization
+ of ticks the \meta{macro} is executed. Typically, \meta{macro} will first
+ call the \meta{code} stored in the key |compute step|. Then, it should
+ implement some strategy then uses the value of the computed or desired
+ stepping to create appropriate |at| commands. To be precise, it should set
+ the keys |major|, |minor|, and/or |subminor| with some appropriate |at|
+ values.
+
+ Inside the call of \meta{macro}, the macro |\tikzdvaxis| will have been set
+ to the name of the axis for which default ticks need to be computed. This
+ allows you to access the minimum and the maximum value stored in the
+ |scaling mapper| of that axis.
+ %
+\begin{codeexample}[width=7cm]
+\def\silly{
+ \tikzdatavisualizationset{major={at={
+ 2,3,5,7,11,13}}}
+}
+\begin{tikzpicture}
+ \datavisualization [
+ scientific axes, visualize as scatter,
+ x axis={tick placement strategy=\silly}
+ ]
+ data {
+ x, y
+ 0, 0
+ 15, 15
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Advanced: Creating New Axis Systems}
+
+The data visualization library comes with a number of predefined axis systems,
+like |scientific axes=clean|, but it is also possible and to define new axis
+systems. Doing so involves the following steps:
+%
+\begin{enumerate}
+ \item Creating a number of axes.
+ \item Configuring attributes of these axes like their length or default
+ scaling.
+ \item Creating visual representations of the axes.
+ \item Creating visual representations of the ticks and grid lines.
+\end{enumerate}
+
+The first step uses |new ... axis| keys to create new axes, the last steps use
+|visualize ...| keys to create the visual representations of the axes.
+
+Note that the axis system has no control over the actual attribute value ranges
+and neither over which ticks need to be drawn. The axis system can only provide
+good defaults and then specify \emph{how} the ticks or labels should be drawn
+and \emph{where} on the page -- but not at which values.
+
+In the following, as a running example let us develop an axis system
+|our system| that does the following: For the $x$-axis is looks like a normal
+scientific axis system, but there are actually two $y$-axes: One at the left
+and one at the right, each using a different attribute, but both coexisting in
+the same picture.
+
+
+\subsubsection{Creating the Axes}
+
+A new axis system is created as a style key with the prefix
+|/tikz/data visualization|. Thus, we would write:
+%
+\begin{codeexample}[code only]
+\tikzset{
+ data visualization/our system/.style={
+ ...
+ }
+}
+\end{codeexample}
+
+In our system we need three axis: The $x$-axis, the left axis and the right
+axis. Since all of these axes are Cartesian axes, we write the following:
+%
+\begin{codeexample}[code only]
+\tikzset{
+ data visualization/our system/.style={
+ new Cartesian axis=x axis,
+ new Cartesian axis=left axis,
+ new Cartesian axis=right axis,
+ x axis={attribute=x},
+ left axis={unit vector={(0cm,1pt)}},
+ right axis={unit vector={(0cm,1pt)}},
+ }
+}
+\end{codeexample}
+%
+As can be seen, we also configure things so that the $x$-axis will use the |x|
+attribute by default (users can later change this by saying
+|x axis={attribute=|\meta{some other attribute}|}|), but we do not configure
+the attributes of the |left axis| nor the |right axis|. We also make the left
+and right axis point upward (the |x axis| needs no configuration here since a
+Cartesian axis points right by default). The reason is the |left| would not be
+a particularly good attribute name and this way we ensure that users have to
+pick names themselves (hopefully good ones).
+
+The next step is to define a standard scaling for the axes. Here, we can use
+the same as for |scientific axes|, so we would add the following keys to the
+definition of |our system|:
+%
+\begin{codeexample}[code only]
+x axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width}},
+left axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+right axis={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}}
+\end{codeexample}
+
+We now already have enough to try our system, although we will not yet see any
+axes or ticks, but we will see the correct scaling of the attributes. Let us
+first define a data group:
+%
+\begin{codeexample}[]
+\tikz \datavisualization data group {people and money} = {
+ data [set=people 1] {
+ time, people
+ 1900, 1000000000
+ 1920, 1500000000
+ 1930, 2000000000
+ 1980, 3000000000
+ }
+ data [set=people 2] {
+ time, people
+ 1900, 2000000000
+ 1920, 2500000000
+ 1940, 4000000000
+ 2000, 5700000000
+ }
+ data [set=money 1] {
+ time, money
+ 1910, 1.1
+ 1920, 2
+ 1930, 5
+ 1980, 2
+ }
+ data [set=money 2] {
+ time, money
+ 1950, 3
+ 1960, 3
+ 1970, 4
+ 1990, 3.5
+ }
+ };
+\end{codeexample}
+
+\tikzdatavisualizationset{
+ our system/.style={
+ new Cartesian axis=x axis,
+ new Cartesian axis=left axis,
+ new Cartesian axis=right axis,
+ x axis={attribute=x},
+ left axis={unit vector={(0cm,1pt)}},
+ right axis={unit vector={(0cm,1pt)}},
+ x axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width}},
+ left axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+ right axis={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}}
+ }
+}
+\begin{codeexample}[]
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=4cm},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2},
+ people 1={style={visualizer color=blue}},
+ people 2={style={visualizer color=blue!50}},
+ money 1={style={visualizer color=red}},
+ money 2={style={visualizer color=red!50}}]
+ data group {people and money};
+\end{codeexample}
+
+
+\subsubsection{Visualizing the Axes}
+\label{section-dv-visualize-axis}
+
+We must now show the axes themselves. For this we can use the |visualize axis|
+key:
+
+\begin{key}{/tikz/data visualization/axis options/visualize axis=\meta{options}}
+ This key is passed to an axis as an option. It causes a visual
+ representation of the axis to be created during the data visualization. The
+ \meta{options} are used to determine where the axis should be drawn and how
+ long it should be. We can specify, for instance, that an axis should be
+ drawn at the minimum value of another axis or where another axis has the
+ value |0|.
+
+
+ \medskip
+ \textbf{The goto, high, and low Keys.}
+ In our example, the |left axis| should be shown at the left hand side. This
+ is the position where the |x axis| has its minimum value. To specify this,
+ we would use the following code:
+ %
+\begin{codeexample}[code only]
+left axis={ visualize axis={ x axis={ goto=min } }
+\end{codeexample}
+ %
+ As can be seen, we can pass another axis as an \meta{option} to
+ |visualize axis|, where we pass the following key to the axis in turn:
+ %
+ \begin{key}{/tikz/data visualization/axis options/goto=\meta{value}}
+ The key can be passed to an axis. It will set the attribute monitored
+ by the axis to the given \meta{value}, which is usually some number.
+ However, \meta{value} may also be one of the following, which causes a
+ special behaviour:
+ %
+ \begin{itemize}
+ \item |min|: The attribute is set to the minimal value that the
+ attribute has attained along this axis.
+ \item |max|: Like |min|.
+ \item |padded min|: This will also set the \meta{attribute}
+ monitored by the axis to the same value as |min|.
+ Additionally, however, the subkey
+ |/data point/|\meta{attribute}|/offset| is set to the current
+ padding for the minimum, see the description of |padding min|
+ later on. The effect of this is that the actual point ``meant''
+ by the attribute is offset by this padding along the
+ attribute's axis.
+ \item |padded max|: Like |padded min|.
+ \end{itemize}
+ \end{key}
+
+ The |right axis| would be visualized the same way, only at |goto=max|. The
+ $x$-axis actually need to be visualized \emph{twice}: Once at the bottom
+ and once at the top. Thus, we need to call |visualize axis| twice for this
+ axis:
+%
+\tikzdatavisualizationset{
+ our system/.style={
+ new Cartesian axis=x axis,
+ new Cartesian axis=left axis,
+ new Cartesian axis=right axis,
+ x axis={attribute=x},
+ left axis={unit vector={(0cm,1pt)}},
+ right axis={unit vector={(0cm,1pt)}},
+ x axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width}},
+ left axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+ right axis={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}}
+ }
+}
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ left axis= {visualize axis={x axis= {goto=min}}},
+ right axis={visualize axis={x axis= {goto=max}}},
+ x axis= {visualize axis={left axis={goto=min}},
+ visualize axis={left axis={goto=max}}},
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=4cm},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+
+ There is another key that is similar to |goto|, but has a slightly
+ different semantics:
+ %
+ \begin{key}{/tikz/data visualization/axis options/goto pos=\meta{fraction}}
+ The key works like |goto|, only the \meta{fraction} is not interpreted
+ as a value but as a fraction of the way between the minimum and the
+ maximum value for this axis.
+
+ Suppose that for an axis the attribute range interval is $[500,1000]$
+ and the reasonable interval is $[1,3]$. Then for a \meta{fraction} of
+ |0|, the mapping process would choose value $1$ from the reasonable
+ interval, for a \meta{fraction} of |1| the position $3$ from the
+ reasonable interval, and for a \meta{fraction} or |0.25| the position
+ $1.5$ since it is one quarter at the distance from $1$ to $3$.
+
+ Note that neither the attribute range interval nor the transformation
+ function for the attribute are important for the |goto pos| option --
+ the \meta{fraction} is computed with respect to the reasonable
+ interval. Also note that the values of the actual attribute
+ corresponding to the fractional positions in the reasonable interval
+ are not computed.
+ %
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ x axis= {visualize axis={left axis={goto pos=0.25}},
+ visualize axis={left axis={goto pos=0.5}}},
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=4cm},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+ \end{key}
+
+ By default, when an axis is visualized, it spans the set of all possible
+ values for the monitored attribute, that is, from |min| to |max|. However,
+ there are actually two keys that allow you to adjust this:
+ %
+ \begin{key}{/tikz/data visualization/low=\meta{value}}
+ This is the attribute value where the axis visualization starts. The
+ same special values as for |goto| are permissible (like |min| or
+ |padded min|, but also |0| or |1|).
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/high=\meta{value}}
+ Like |low|, only for where the axis ends.
+ \end{key}
+
+ By default, |low=min| and |high=max| are set for an axis visualization.
+ Another sensible setting is |low=padded min| and |high=padded max|. The
+ following key provides a shorthand for this:
+ %
+ \begin{key}{/tikz/data visualization/padded}
+ Shorthand for |low=padded min, high=padded max|.
+ \end{key}
+ %
+ As an example, consider the |scientific axes=clean|. Here, each axis is
+ actually drawn three times: Once at the minimum, once at the maximum and
+ then once more at the padded minimum.
+
+
+ \medskip
+ \textbf{The axis line.}
+ When an axis is drawn, \tikzname\ does not simply draw a straight line from
+ the |low| position to the |high| position. In reality, the data
+ visualization system uses the two commands |\pgfpathdvmoveto| and
+ |\pgfpathdvlineto| internally. These will replace the straight line by a
+ curve in certain situations. For instance, in a polar coordinate system, if
+ an axis should be drawn along an angle axis for a fixed radius, an arc will
+ be used instead of a straight line.
+
+
+ \medskip
+ \textbf{Styling the axis.}
+ As can be seen, we now get the axis we want (but without the ticks,
+ visualizing them will be explained later). The axis is, however, simply a
+ black line. We can \emph{style} the axis in a manner similar to styling
+ ticks and grid lines, see Section~\ref{section-dv-style}. In detail, the
+ following styles get executed:
+ %
+ \begin{enumerate}
+ \item |axis layer|
+ \item |every axis|
+ \item |styling|
+ \end{enumerate}
+ %
+ Additionally, even before |every axis| is executed, |low=min| and
+ |high=max| are executed.
+
+ \begin{stylekey}{/tikz/data visualization/axis layer (initially on background layer)}
+ The layer on which the axis is drawn. See the description of
+ |grid layer| on page~\ref{section-dv-grid-layer} for details.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/data visualization/every axis}
+ Put styling of the axis here. It is usually a good idea to set this
+ style to |style={black!50}|.
+ \end{stylekey}
+
+ Recall that the |styling| key is set using the |style| key, see
+ Section~\ref{section-dv-style}.
+ %
+\tikzset{
+}
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ every axis/.style={style=black!50}, % make this the default
+ left axis= {visualize axis={x axis= {goto=min}, style=red!75}},
+ right axis={visualize axis={x axis= {goto=max}, style=blue!75}},
+ x axis= {visualize axis={left axis={goto=min}},
+ visualize axis={left axis={goto=max}}},
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=4cm},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+\tikzset{
+ data visualization/our system/.append style={
+ every axis/.style={style=black!50}, % make this the default
+ left axis= {visualize axis={x axis= {goto=min}, style=red!75}},
+ right axis={visualize axis={x axis= {goto=max}, style=blue!75}},
+ x axis= {visualize axis={left axis={goto=min}},
+ visualize axis={left axis={goto=max}}},
+ }
+}
+
+
+ \medskip
+ \textbf{Padding the Axis.}
+ When an axis is visualized, it is often a good idea to make it ``a little
+ bit longer'' or to ``remove it a bit from the border'', because the
+ visualization of an axis should not interfere with the actual data. For
+ this reason, a \emph{padding} can be specified for axes:
+
+ \begin{key}{/tikz/data visualization/axis options/padding min=\meta{dimension}}
+ This is the dimension that is used whenever |goto=padded min| is used.
+ The \meta{dimension} is then put into the |offset| subkey of the
+ attribute monitored by the axis. When a data point is transformed by a
+ linear transformer and when this subkey is nonzero, this offset is
+ added. (For an angle axis of a polar transformer, the \meta{dimension}
+ is interpreted as an additional angle rather than as an additional
+ distance). Note that \meta{dimension} should typically be negative
+ since ``adding the \meta{dimension}'' will then make the axis longer
+ (because it starts at a smaller value). The standard axis systems set
+ the padding to some default and take its value into account:
+ %
+\begin{codeexample}[width=8cm]
+\begin{tikzpicture}
+ \datavisualization [scientific axes=clean,
+ x axis={padding min=-1cm},
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [-3:5];
+ func y = \value x * \value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ Using padded and using the |padded| key, we can visualize our axis ``a
+ little removed from the actual data'':
+ %
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ all axes= {padding=.5em},
+ left axis= {visualize axis={x axis= {goto=padded min}, padded}},
+ right axis={visualize axis={x axis= {goto=padded max}, padded}},
+ x axis= {visualize axis={left axis={goto=padded min}, padded},
+ visualize axis={left axis={goto=padded max}, padded}},
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=3cm},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/axis options/padding max=\meta{dimension}}
+ Works like |padding min|, but \meta{dimension} should typically be
+ positive.
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/axis options/padding=\meta{dimension}}
+ Sets both |padding min| to the negated value of \meta{dimension} and
+ |padding max| to \meta{dimension}.
+ \end{key}
+\end{key}
+
+
+\subsubsection{Visualizing Grid Lines}
+\label{section-dv-visualize-gridlines}
+
+As explained earlier, the |grid| key is used to specify at which positions grid
+lines should be drawn in principle. However, this key does not actually cause
+any grid lines to be drawn. Instead, the |visualize grid| key is used by the
+axis system to specify how grid lines are drawn.
+
+\begin{key}{/tikz/data visualization/axis options/visualize grid=\meta{options}}
+ This key is passed to an axis. It causes grid lines to be drawn at the
+ positions specified by the |grid| key for this axis. The \meta{options}
+ govern where and how the grid lines will be drawn.
+
+
+ \medskip
+ \textbf{The direction axis.}
+ At first sight, one might expect that the grid lines for an axis should
+ simply be drawn perpendicular to the axis between the minimum and maximum
+ value of the axis. However, things are somewhat more difficult in reality:
+ %
+ \begin{enumerate}
+ \item A grid line is supposed to indicate all positions where a certain
+ attribute attains a fixed value. But, then, a grid line does not
+ really need to be a grid \emph{line}. Consider for instance a three
+ dimensional axis system. A ``grid line'' for the $x$-coordinate |3|
+ would actually be a ``grid plane''.
+ \item For a polar coordinate system and a fixed radius, this set of
+ positions at a certain radius is not a straight line, but an arc.
+ For more complicated coordinate systems such as the one arising
+ from three-dimensional spherical projections, a grid line may well
+ be a fairly involved curve.
+ \end{enumerate}
+ %
+ The |visualize grid| command addresses these complications as follows:
+ %
+ \begin{enumerate}
+ \item A grid line is always a line, not a plane or a volume. This means
+ that in the example of a three dimensional axis system and the
+ $x$-attribute being |3|, one would have to choose whether the grid
+ line should go ``along'' the $y$-axis or ``along'' the $z$-axis for
+ this position. One can, however, call the |visualize grid| command
+ twice, once for each direction, to cause grid lines to be shown for
+ both directions.
+ \item A grid line is created by moving to a start position and then
+ doing a lineto to the target position. However, the ``moveto'' and
+ ``lineto'' are done by calling special commands of the data
+ visualization system. These special commands allow coordinate
+ system to ``notice'' that the line is along an axis and will allow
+ them to replace the straight line by an appropriate curve. The
+ polar axes systems employ this strategy, for instance.
+ \end{enumerate}
+
+ By the above discussion, in order to create a grid line for attribute $a$
+ having value $v$, we need to specify an axis ``along'' which the line
+ should be drawn. When there are only two axes, this is usually ``the other
+ axis''. This ``other axis'' is specified using the following key:
+ %
+ \begin{key}{/tikz/data visualization/direction axis=\meta{axis name}}
+ You must pass this key as an \meta{option} each time you use
+ |visualize axis|. When the grid line is drawn, the attribute $a$ is set
+ to $v$ and the axis \meta{axis name}'s attribute is set once to the
+ current value of |low| and once to |high|. Then a line is drawn between
+ these two positions using |\pgfpathdvlineto|.
+ \end{key}
+ %
+ The |low| and |high| keys are the same as the ones used in the
+ |visualize axis| key.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [
+ xyz Cartesian cabinet,
+ all axes={visualize axis={low=0, style=->}},
+ x axis={visualize grid={direction axis=y axis}, grid=many},
+ visualize as scatter]
+ data {
+ x, y, z
+ 0, 0, 1
+ 0, 1, 0
+ 2, 2, 2
+ };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [
+ xyz Cartesian cabinet,
+ all axes={visualize axis={low=0, style=->}, grid=many},
+ x axis={visualize grid={direction axis=z axis}},
+ z axis={visualize grid={direction axis=x axis},
+ visualize grid={direction axis=y axis},},
+ visualize as scatter]
+ data {
+ x, y, z
+ 0, 0, 1
+ 0, 1, 0
+ 2, 2, 2
+ };
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Styling the grid lines.}
+ When a grid line is draw, styles are applied as described in
+ Section~\ref{section-dv-styling-grid-lines}.
+
+
+ \medskip
+ \textbf{The major, minor, and subminor grid lines.}
+ The |grid| option allows you to specify for each kind of grid line (major,
+ minor, or subminor) a set of different values for which these grid lines
+ should be drawn. Correspondingly, it is also possible to configure for each
+ kind of grid line how it should be drawn. For this, the |major|, |minor|,
+ |subminor|, and also the |common| keys can be used inside the
+ \meta{options} of |visualize grid|. While as option to |grid| these keys
+ are used to specify |at| values, as options of |visualize grid| they are
+ used to configure the different kinds of grid lines.
+
+ Most of the time, no special configuration is necessary since all styling
+ is best done by configuring keys like |every major grid|. You need to use a
+ key like |major| only if you wish to configure for instance the |low| or
+ |high| values of a |major| grid line differently from those of |minor| grid
+ lines -- are rather unlikely setting -- or when the styling should deviate
+ from the usual settings.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [
+ xy Cartesian,
+ all axes={visualize axis={low=0, style=->},
+ grid={some, minor steps between steps}},
+ x axis= {visualize grid={
+ direction axis=y axis,
+ minor={low=0.25, high=1.75, style=red!50}}},
+ visualize as scatter]
+ data {
+ x, y
+ 0, 0
+ 3, 3
+ };
+\end{codeexample}
+ %
+\end{key}
+
+Returning to the example of |our system| with the two axis systems, it is
+straight-forward to configure the grid lines of the $x$-axis: The direction
+axis is either of the other two axis (they point in the same direction and they
+have the same range). For the other two axes, we visualize one grid
+independently of the other, using different colors.
+%
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ x axis= {visualize grid={direction axis=left axis}},
+ left axis= {visualize grid={direction axis=x axis,
+ common={style=red!50}}},
+ right axis={visualize grid={direction axis=x axis,
+ common={style=blue!50}}},
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=3cm, grid=many},
+ left axis ={attribute=money, grid=some},
+ right axis={attribute=people, grid=few},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+
+
+\subsubsection{Visualizing the Ticks and Tick Labels}
+\label{section-dv-visualize-ticks}
+
+\begin{key}{/tikz/data visualization/axis options/visualize ticks=\meta{options}}
+ Visualizing a tick involves (possibly) drawing a tick mark and adding
+ (possibly) the tick node. The process is similar to |visualize grid|: Users
+ use the |ticks| key to configure how many ticks they would like for an axis
+ and at which positions. The axis system uses the |visualize ticks| key to
+ specify where these ticks should actually be shown.
+
+ Unlike grid lines, which are typically only visualized once for each
+ combination of an axis and a direction axis, tick marks might be visualized
+ at different places for the same axis. Consider for instance the
+ |scientific axes|:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes, all axes={length=3cm},
+ x axis={ticks={stack}},
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [0:2];
+ func y = \value x*\value x;
+ };
+\end{codeexample}
+ %
+ Have a look at the ticks on the $y$-axis: There are ticks at values |0|,
+ |1|, |2|, |3|, and~|4|. These are visualized both at the left side (where
+ the tick nodes are also shown) and additionally also at the right side, but
+ only as small marks. Similarly, the ticks on the $x$-axis appear at the
+ bottom, but also (in much simpler versions) at the top. Both for the
+ $x$-axis and for the $y$-axis the |visualize ticks| key was called twice.
+
+
+ \medskip
+ \textbf{The tick marks.}
+ Drawing a tick mark is quite similar to visualizing a grid line; indeed a
+ tick mark can be thought of as a ``mini grid line'': Just like a grid line
+ it ``points a long an axis''. However, a tick will always be a short
+ straight line -- even when the coordinate system is actually twisted
+ (experimentation has shown that ticks that follow the curvature of the
+ coordinate system like grid lines are hard to recognize). For this reason,
+ the |low| and |high| keys have a different meaning from the one used with
+ the |visualize grid| key. In detail to configure the size and position of a
+ tick mark for the value $v$ of attribute $a$, proceed as follows:
+ %
+ \begin{itemize}
+ \item The |visualize ticks| key will have setup attribute $a$ to be
+ equal to $v$.
+ \item You should now use the |goto| or |goto pos| key together with all
+ \emph{other} axes to configure at which position with respect to
+ these other options the tick mark should be shown. For instance,
+ suppose we want tick marks in |our system| for the $x$-axis at the
+ bottom and at the top. This corresponds to once setting the
+ |left axis| to its minimal value and once to its maximal value:
+ %
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ x axis={visualize ticks={direction axis=left axis, left axis={goto=min}},
+ visualize ticks={direction axis=left axis, left axis={goto=max}},
+ }
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=3cm, ticks=many},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+ %
+ \item In the above example, we may wish to shorten the ticks a bit at
+ the bottom and at the top. For this, we use the |low| and |high|
+ key:
+ %
+ \begin{key}{/tikz/data visualization/low=\meta{dimension}}
+ When used with the |visualize ticks| option, the |low| key
+ contains a dimension that specifies the extend of the tick
+ going ``toward the minimum'' of the direction axis. More
+ precisely, when a tick mark is visualized, a unit tangent
+ vector at the current data point in the direction of the
+ |direction axis| is computed and this vector is multiplied by
+ \meta{dimension} to compute the start position of the tick
+ line. The end position is given by this vector times the |high|
+ value.
+
+ Note that the \meta{dimension} should usually be negative for
+ the |low| key and positive for the |high| key.
+
+ For tick marks where a tick label node is shown, the
+ \meta{dimension} is increased by the current values of keys
+ like |tick text even low padding|, see
+ Section~\ref{section-dv-stacking} for details.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/high=\meta{dimension}}
+ Like |low|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/tick length=\meta{dimension}}
+ Shorthand for |low=-|\meta{dimension}|, high=|\meta{dimension}.
+ \end{key}
+
+ What we want to happen is that in the upper visualization of the
+ ticks the |low| value is |0pt|, while in the lower one the |high|
+ value is |0pt|:
+ %
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ x axis={
+ visualize ticks={direction axis=left axis,high=0pt,left axis={goto=min}},
+ visualize ticks={direction axis=left axis,low=0pt,left axis={goto=max}},
+ }
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=3cm, ticks=many},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+ %
+ \end{itemize}
+ %
+ In order to style the tick mark, use the styling mechanism that is detailed
+ in Section~\ref{section-dv-styling-ticks}.
+
+
+ \medskip
+ \textbf{The tick label node.}
+ At certain tick positions, we may wish to add a node indicating the value
+ of the attribute at the given position. The |visualize ticks| command has
+ no influence over which text should be shown at a node -- the text is
+ specified and typeset as explained in Section~\ref{section-dv-tick-labels}.
+
+ Each time |visualize ticks|, for each tick position up to two tick label
+ nodes will be created: One at the |low| position and one at the |high|
+ position. The following keys are used to configure which of these cases
+ happen:
+ %
+ \begin{key}{/tikz/data visualization/tick text at low=\opt{\meta{true or false}} (default true)}
+ Pass this option to |visualize ticks| when you want tick label nodes to
+ be placed at the |low| position of each tick mark.
+ %
+\begin{codeexample}[]
+\tikzset{
+ data visualization/our system/.append style={
+ x axis={
+ visualize ticks={direction axis=left axis, left axis={goto=min},
+ high=0pt, tick text at low, stack},
+ visualize ticks={direction axis=left axis, left axis={goto=max},
+ low=0pt, tick text at high, stack}
+ }
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, length=3cm, ticks=some},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/tick text at high=\opt{\meta{true or false}} (default true)}
+ Like |tick text at low|.
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/no tick text}
+ Shorthand for |tick text at low=false, tick text at high=false|.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [scientific axes, all axes={length=3cm},
+ x axis={ticks={
+ major also at={6.5 as [no tick text]}}},
+ visualize as smooth line]
+ data [format=function] {
+ var x : interval [5:10];
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ \end{key}
+
+ When a tick label node is to be placed at the low or the high position, the
+ next step is to determine the exact position and the correct anchor of the
+ node. This is done as follows:
+ %
+ \begin{itemize}
+ \item In order to compute an appropriate |anchor|, the tick mark is
+ considered: This is a short line pointing in a certain direction.
+ For a tick label node at the |low| position, the |anchor| attribute
+ is setup in such a way that the node label will be below the |low|
+ position when the tick mark direction points up, it will be to the
+ right when the direction points left, above when it points down,
+ and so on also for diagonal directions. Similarly, for the |high|
+ position, when the direction points up, the node will be placed
+ above the tick mark and so on.
+
+ This computation is done automatically.
+ \item The tick label node is styled. The styles that are applied are
+ described in Section~\ref{section-dv-styling-ticks}.
+ \item A tick label node for the |low| position is usually anchored at
+ this |low| position, but an additional padding will be added as
+ described in Section~\ref{section-dv-stacking}.
+ \end{itemize}
+\end{key}
+
+
+\subsubsection{Visualizing the Axis Labels}
+\label{section-dv-visualize-label}
+
+The |label| option can be used with an axis to specify a text should be shown
+next to the axis to indicates which attribute this axis refers to. Like |ticks|
+or |grid|, the |label| option does not actually draw the label, this is the job
+of the |visualize label| key, which is configured by the axis system.
+
+\begin{key}{/tikz/data visualization/axis options/visualize label=\meta{options}}
+ The \meta{options} should be used to configure a ``good place'' for the
+ axis label. Usually, you will use the |goto| or the |goto pos| key.
+
+ For the example of |our system|, we would like the label of the |x axis| to
+ be placed below at the middle of the axis, so we use |goto pos=.5| to
+ determine this position. Concerning the other axes, we want it to be placed
+ at the minimum position of the |left axis| with a lot of padding.
+ %
+\begin{codeexample}[width=7cm]
+\tikzdatavisualizationset{
+ our system/.append style={
+ x axis={visualize label={
+ x axis={goto pos=.5},
+ left axis={padding=1.5em, goto=padded min}}}
+ }
+}
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, ticks=some, label},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={
+ people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+
+ In the above example, the |padding| of |1.5em| was rather arbitrary and
+ ``suboptimal''. It would be outright wrong if the labels on the |x axis|
+ were larger or if they were missing. It would be better if the vertical
+ position of the |x axis| label were always ``below'' all other options. For
+ such cases a slightly strange approach is useful: You position the node
+ using |node style={at=...}| where |at| is now the normal \tikzname\ option
+ that is used to specify the position of a node. Inside the |...|, you
+ specify that the horizontal position should be the bottom of
+ up-to-now-constructed data visualization and the vertical position should
+ be at the ``origin'', which is, however, the position computed by the
+ |goto| keys for the axes:
+ %
+\begin{codeexample}[width=7cm]
+\tikzdatavisualizationset{
+ our system/.append style={
+ x axis={visualize label={
+ x axis={goto pos=.5},
+ node style={
+ at={(0,0 |- data visualization bounding box.south)},
+ below
+} } } } }
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, ticks=some, label=Year},
+ left axis ={attribute=money},
+ right axis={attribute=people},
+ visualize as line/.list={
+ people 1, people 2, money 1, money 2}]
+ data group {people and money};
+\end{codeexample}
+
+ Two additional keys are useful for positioning axis labels:
+ %
+ \begin{key}{/tikz/data visualization/axis option/anchor at min}
+ When passed to an axis, this key sets the |anchor| so that a node
+ positioned at either the |min| or the |padded min| value of the axis
+ will be placed ``nicely'' with respect to the axis. For instance, if
+ the axis points upwards from the |min| value to the |max| value, the
+ |anchor| would be set to |north| since this gives a label below the
+ axis's start. Similarly, if the axis points right, the anchor would be
+ set to |east|, and so on.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/axis option/anchor at max}
+ Like |anchor at min|.
+ \end{key}
+\end{key}
+
+
+\subsubsection{The Complete Axis System}
+
+Here is the code for the complete axis system developed above and an example of
+how it is used:
+%
+\begin{codeexample}[code only]
+\tikzdatavisualizationset{ our system/.style={
+ % The axes
+ new Cartesian axis=x axis, new Cartesian axis=left axis, new Cartesian axis=right axis,
+ % The directions of the axes
+ all axes={padding=.5em}, left axis={unit vector={(0cm,1pt)}}, right axis={unit vector={(0cm,1pt)}},
+ % The default attributes, other attributes must be configured
+ x axis={attribute=x},
+ % The lengths of the axes
+ x axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width}},
+ left axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+ right axis={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+ % The styling of the axes
+ every axis/.style={style=black!50}, % make this the default
+ % Visualizing the axes themselves
+ left axis= {visualize axis={x axis= {goto=padded min}, style=red!75, padded}},
+ right axis={visualize axis={x axis= {goto=padded max}, style=blue!75,padded}},
+ x axis= {visualize axis={left axis={goto=padded min}, padded},
+ visualize axis={left axis={goto=padded max}, padded}},
+ % Visualizing the grid, when requested
+ x axis= {visualize grid={direction axis=left axis}},
+ left axis= {visualize grid={direction axis=x axis, common={style=red!50}}},
+ right axis={visualize grid={direction axis=x axis, common={style=blue!50}}},
+ % Visualizing the ticks, when requested
+ left axis={visualize ticks={style={red!50!black}, direction axis=x axis,
+ x axis={goto=padded min}, high=0pt, tick text at low}},
+ right axis={visualize ticks={style={blue!80!black}, direction axis=x axis,
+ x axis={goto=padded max}, low=0pt, tick text at high}},
+ x axis={visualize ticks={direction axis=left axis, left axis={goto=padded min}, high=0pt,
+ tick text at low},
+ visualize ticks={direction axis=left axis, left axis={goto=padded max}, low=0pt}},
+ % By default, there are ticks on all axes
+ all axes={ticks},
+ % Visualizing the axis labels, when requested
+ x axis={visualize label={x axis={goto pos=.5}, node style={
+ at={(0,0 |- data visualization bounding box.south)}, below}}},
+ left axis={visualize label={left axis={goto pos=.5}, node style={
+ at={(0,0 -| data visualization bounding box.west)}, rotate=90, anchor=south, red!50!black}}},
+ right axis={visualize label={right axis={goto pos=.5}, node style={
+ at={(0,0 -| data visualization bounding box.east)}, rotate=-90, anchor=south, blue!80!black}}},
+}}
+\end{codeexample}
+
+\tikzdatavisualizationset{
+ our system/.style={
+ % The axes
+ new Cartesian axis=x axis,
+ new Cartesian axis=left axis,
+ new Cartesian axis=right axis,
+ % The default attributes, other attributes must be configured
+ x axis={attribute=x},
+ % The directions of the axes
+ all axes={padding=.5em},
+ left axis={unit vector={(0cm,1pt)}},
+ right axis={unit vector={(0cm,1pt)}},
+ % The lengths of the axes
+ x axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width}},
+ left axis ={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+ right axis={length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}},
+ % The styling of the axes
+ every axis/.style={style=black!50}, % make this the default
+ % Visualizing the axes themselves
+ left axis= {visualize axis={x axis= {goto=padded min}, style=red!75, padded}},
+ right axis={visualize axis={x axis= {goto=padded max}, style=blue!75,padded}},
+ x axis= {visualize axis={left axis={goto=padded min}, padded},
+ visualize axis={left axis={goto=padded max}, padded}},
+ % Visualizing the grid, when requested
+ x axis= {visualize grid={direction axis=left axis, padded}},
+ left axis= {visualize grid={direction axis=x axis, padded, common={style=red!50}}},
+ right axis={visualize grid={direction axis=x axis, padded, common={style=blue!50}}},
+ % Visualizing the ticks, when requested
+ left axis={
+ visualize ticks={style={red!50!black}, direction axis=x axis, x axis={goto=padded min}, high=0pt, tick text at low}},
+ right axis={
+ visualize ticks={style={blue!80!black}, direction axis=x axis, x axis={goto=padded max}, low=0pt, tick text at high}},
+ x axis={
+ visualize ticks={direction axis=left axis, left axis={goto=padded min}, high=0pt, tick text at low},
+ visualize ticks={direction axis=left axis, left axis={goto=padded max}, low=0pt}
+ },
+ % By default, there are ticks on all axes
+ all axes={ticks},
+ % Visualizing the axis labels, when requested
+ x axis={visualize label={
+ x axis={goto pos=.5}, node style={at={(0,0 |- data visualization bounding box.south)}, below}}},
+ left axis={visualize label={
+ left axis={goto pos=.5}, node style={
+ at={(0,0 -| data visualization bounding box.west)}, rotate=90, anchor=south, red!50!black}}},
+ right axis={visualize label={
+ right axis={goto pos=.5}, node style={
+ at={(0,0 -| data visualization bounding box.east)}, rotate=-90, anchor=south, blue!80!black}}},
+ }
+}
+
+\begin{codeexample}[]
+\tikz \datavisualization [
+ our system,
+ x axis={attribute=time, label=Year,
+ ticks={tick text padding=2pt, style={/pgf/number format/set thousands separator=}}},
+ left axis={attribute=money, label=Spending,
+ padding min=0, include value=0, grid,
+ ticks={tick prefix=\$, style={/pgf/number format/fixed,
+ /pgf/number format/fixed zerofill, /pgf/number format/precision=2}}},
+ right axis={attribute=people,
+ label=Population,
+ padding min=0, include value=0,
+ ticks={style=/pgf/number format/fixed}},
+ visualize as line/.list={
+ people 1, people 2, money 1, money 2},
+ people 1={style={visualizer color=blue}},
+ people 2={style={visualizer color=blue!50}},
+ money 1={style={visualizer color=red}},
+ money 2={style={visualizer color=red!50}} ]
+data group {people and money};
+\end{codeexample}
+
+
+\subsubsection{Using the New Axis System Key}
+
+The axis system |our system| that we developed in the course of the previous
+section is not yet ``configurable''. The only configuration that was possible
+was to ``misuse'' the |width| and |height| keys of the |scientific axes|.
+
+In order to make |our system| configurable so that we can say
+|our system=|\meta{options}, where \meta{options} are executed with the path
+prefix
+%
+\begin{codeexample}[code only]
+/tikz/data visualization/our system
+\end{codeexample}
+%
+we can use the following key:
+
+\begin{key}{/tikz/data visualization/new axis system=\marg{axis system
+ name}\marg{axis setup}\marg{default options}\\ \marg{application
+ options}%
+}
+ The |new axis system| key takes four parameters. The first one,
+ \meta{system name}, is the name of the to-be-created axis system,
+ |our system| in our case. The |new axis system| will create the following
+ new key:
+ %
+ \begin{key}{/tikz/data visualization/\meta{axis system name}=\opt{\meta{options}}}
+ When the key \meta{axis system name} is used, the following keys will be
+ executed in the following order:
+ %
+ \begin{enumerate}
+ \item The \meta{axis setup} with the path prefix
+ |/tikz/data visualization/|.
+ \item The \meta{default options} with the same path prefix.
+ \item The following style:
+ %
+ \begin{stylekey}{/tikz/data visualization/every \meta{axis system name}}
+ Even though this style has the path prefix
+ |/tikz/data visualization| itself, the keys stored in this
+ style will be executed with the path prefix
+ |/tikz/data visualization/|\meta{axis system name}.
+ \end{stylekey}
+ \item The \meta{options} with the path prefix
+ |/tikz/data visualization/|\meta{axis system name}.
+ \item The \meta{application options} with the path prefix
+ |/tikz/data visualization/|
+ \end{enumerate}
+ \end{key}
+
+ Let us now have a look at what all of this means. First, the \meta{axis
+ setup} will contain all options that setup the axis system in all ways that
+ need not be configured. For instance, the \meta{axis setup} for the
+ |scientific axes| will create an |x axis| and also a |y axis| (because
+ these are always present), but will not setup the label visualization
+ (because this can be configured in different ways). For |our system|, which
+ cannot be configured at all, we would place all of our configuration in the
+ \meta{axis setup}.
+
+ The \meta{default options} can be used to pick default values that would
+ usually be passed to the \meta{options} of the newly created axis system.
+ For instance, for |scientific axis|, the \meta{default options} are set to
+ |outer ticks,standard labels|, because these are the defaults.
+
+ Finally, the \meta{application options} can be used to actually apply the
+ configuration that has been chosen by the \meta{options}. The idea is that
+ \meta{default options}, \meta{options}, and also |every| \meta{axis system
+ name} all have a chance of changing, re-changing and re-setting all sorts
+ of styles and keys. Then, with the last change ``winning'', the resulting
+ setting of a style can be executed, which may then cause a label
+ visualization to be installed.
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-backend.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-backend.tex
new file mode 100644
index 0000000000..ca3fcf2833
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-backend.tex
@@ -0,0 +1,34 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{The Data Visualization Backend}
+\label{section-dv-backend}
+
+\subsection{Overview}
+
+The present section explains the mechanisms behind the data visualization
+engine.
+
+Until it is documented properly, we will have to make do with the documentation
+in the source code.
+
+
+\subsection{The Rendering Pipeline}
+
+To be written...
+
+\subsection{Usage}
+
+To be written...
+
+\subsection{The Mathematical Micro-Kernel}
+\label{section-dv-math-kernel}
+
+To be written...
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-examples.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-examples.tex
new file mode 100644
index 0000000000..ce4c95a5e3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-examples.tex
@@ -0,0 +1,94 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+A first example:
+
+\begin{codeexample}[]
+\begin{tikzpicture}[baseline]
+ \datavisualization [
+ school book axes,
+ visualize as smooth line,
+ clean ticks,
+ all axes={grid={step=1,minor steps between steps=1}},
+ x axis={
+ ticks={
+ major={
+ also at={(0.5*pi) as $\pi/2$},
+ also at={(pi) as $\pi$},
+ options at=3 as [no tick text]
+ }
+ },
+ label=$x$
+ },
+ y axis={
+ label=$y$,
+ }
+ ]
+ data [format=function] {
+ var x : interval [-0.5*pi:4] samples 50;
+ func y = sin(\value x r);
+ };
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}[baseline]
+ \datavisualization [
+ scientific axes=clean,
+ visualize as line,
+ all axes={padding=4pt},
+ x axis={logarithmic,
+ ticks={many, tick unit={ms},
+ node style={rotate=45,anchor=north east}},
+ label={time},
+ grid},
+ y axis={label={distance}},
+ ]
+ data {
+ x, y, z
+ 0.001, 0, 0
+ 2000, 2.23, 2
+ 20670, 1, 3
+ 501, -2, 0
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[baseline,mark=*]
+ \datavisualization [
+ scientific axes=inner ticks,
+ all axes={padding=4pt},
+ euro about strategy,
+ visualize as scatter,
+ x axis={attribute=x2},
+ y axis={attribute=y2}
+ ]
+ data [separator=\space] {
+x y x1 y1 x2 y2 x3 y3
+10.0 8.04 10.0 9.14 10.0 7.46 8.0 6.58
+8.0 6.95 8.0 8.14 8.0 6.77 8.0 5.76
+13.0 7.58 13.0 8.74 13.0 12.74 8.0 7.71
+9.0 8.81 9.0 8.77 9.0 7.11 8.0 8.84
+11.0 8.33 11.0 9.26 11.0 7.81 8.0 8.47
+14.0 9.96 14.0 8.10 14.0 8.84 8.0 7.04
+6.0 7.24 6.0 6.13 6.0 6.08 8.0 5.25
+4.0 4.26 4.0 3.10 4.0 5.39 19.0 12.50
+12.0 10.84 12.0 9.13 12.0 8.15 8.0 5.56
+7.0 4.82 7.0 7.26 7.0 6.42 8.0 7.91
+5.0 5.68 5.0 4.74 5.0 5.73 8.0 6.89
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-formats.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-formats.tex
new file mode 100644
index 0000000000..6150487437
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-formats.tex
@@ -0,0 +1,636 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Providing Data for a Data Visualization}
+\label{section-dv-formats}
+
+\subsection{Overview}
+
+The data visualization system needs a stream of data points as input. These
+data points can be directly generated by repeatedly calling the |\pgfdatapoint|
+command, but usually data is available in some special (text) format and one
+would like to visualize this data. The present section explains how data in
+some specific format can be fed to the data visualization system.
+
+This section starts with an explanation of the main concepts. Then, the
+standard formats are listed in the reference section. It is also possible to
+define new formats, but this an advanced concept which requires an
+understanding of some of the internals of the parsing mechanism, explained in
+Section~\ref{section-dv-parsing}, and the usage of a rather low-level command,
+explained in Section~\ref{section-dv-declaring-formats}.
+
+
+\subsection{Concepts}
+
+For the purposes of this section, let call a \emph{data format} some
+standardized way of writing down a list of data points. A simple example of a
+data format is the \textsc{csv} format (the acronym stands for \emph{comma
+separated values}), where each line contains a data point, specified by values
+separated by commas. A different format is the \emph{key--value format}, where
+data points are specified by lists of key--value pairs. A far more complex
+format is the \textsc{pdb}-format used by the protein database to describe
+molecules.
+
+The data visualization system does not use any specific format. Instead,
+whenever data is read by the data visualization system, you must specify a
+format parser (or it is chosen automatically for you). It is the job of the
+parser to read (parse) the data lines and to turn them into data points, that
+is, to setup appropriate subkeys of |/data point/|.
+
+To give a concrete example, suppose a file contains the following
+lines:
+%
+\begin{codeexample}[code only]
+x, y, z
+0, 0, 0
+1, 1, 0
+1, 1, 0.5
+0, 1, 0.5
+\end{codeexample}
+%
+This file is in the \textsc{csv}-format. This format can be read by the |table|
+parser (which is called thus, rather than ``|csv|'', since it can also read
+files in which the columns are separated by, say, a semicolon or a space). The
+|table| format will then read the data and for each line of the data, except
+for the headline of course, it will produce one data point. For instance, for
+the last data point the key |/data point/x| will be set to |0|, the key
+|/data point/y| will be set to |1|, and the key |/data point/z| will be set to
+|0.5|.
+
+All parsers are basically line-oriented. This means that, normally, each line
+in the input data should contain one data point. This rule may not always
+apply, for instance empty lines are typically ignored and sometimes a data
+point may span several lines, but deviating from this ``one data point per
+line'' rule makes parsers harder to program.
+
+
+\subsection{Reference: Build-In Formats}
+
+The following format is the default format, when no |format=...| is specified.
+
+\begin{dataformat}{table}
+ This format is used to parse data that is formatted in the following
+ manner: Basically, each line consists of \emph{values} that are separated
+ by a \emph{separator} like a comma or a space. The values are stored in
+ different \emph{attributes}, that is, subkeys of |/data point| like
+ |/data point/x|. In order to decide which attribute is chosen for a give
+ value, the headline is important. This is the first non-empty line of a
+ table. It is formatted in the same way as normal data lines (value
+ separated by the separator), but the meaning of the values is different:
+ The first value in the headline is the name of the attribute where the
+ first values in the following lines should go each time. Similarly, the
+ second value in the headline is the name of the attribute for the second
+ values in the following lines, and so on.
+
+ A simple example is the following:
+ %
+\begin{codeexample}[code only]
+angle, radius
+0, 1
+45, 2
+90, 3
+135, 4
+\end{codeexample}
+ %
+ The headline states that the values in the first column should be stored in
+ the |angle| attribute (|/data point/angle| to be precise) and that the
+ values in the second column should be stored in the |radius| attribute.
+ There are four data points in this data set.
+
+ The format will tolerate too few or too many values in a line. If there are
+ less values in a line than in the headline, the last attributes will simply
+ be empty. If there are more values in a line than in the headline, the
+ values are stored in attributes called |/data point/attribute |\meta{column
+ number}, where the first value of a line gets \meta{column number} equal to
+ |1| and so on.
+
+ The |table| format can be configured using the following options:
+ %
+ \begin{key}{/pgf/data/separator=\meta{character} (initially ,)}
+ Use this key to change which character is used to separate values in
+ the headline and in the data lines. To set the separator to a space,
+ either set this key to an empty value or say |separator=\space|. Note
+ that you must surround a comma by curly braces if you which to (re)set
+ the separator character to a space.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as line]
+ data [separator=\space] {
+ x y
+ 0 0
+ 1 1
+ 2 1
+ 3 0
+ }
+ data [separator=;] {
+ x; y; z
+ 3; 1; 0
+ 2; 2; 0
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/data/headline=\meta{headline}}
+ When this key is set to a non-empty value, the value of \meta{headline}
+ is used as the headline and the first line of the data is treated as a
+ normal line rather than as a headline.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as line]
+ data [headline={x, y}] {
+ 0, 0
+ 1, 1
+ 2, 1
+ 3, 0
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{dataformat}
+
+\begin{dataformat}{named}
+ Basically, each line of the data must consist of a comma-separated sequence
+ of attribute--values pairs like |x=5, lo=500|. This will cause the
+ attribute |/data point/x| to be set to |5| and |/data point/lo| to be set
+ to |500|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as line]
+ data [format=named] {
+ x=0, y=0
+ x=1, y=1
+ x=2, y=1
+ x=3, y=0
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ However, instead of just specifying a single value for an attribute as in
+ |x=5|, you may also specify a whole set of values as in |x={1,2,3}|. In
+ this case, three data points will be created, one for each value in the
+ list. Indeed, the |\foreach| statement is used to iterate over the list of
+ values, so you can write things like |x={1,...,5}|.
+
+ It is also permissible to specify lists of values for more than one
+ attribute. In this case, a data point is created for each possible
+ combination of values in the different lists:
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as scatter/.list={a,b,c},
+ style sheet=cross marks]
+data [format=named] {
+ x=0, y={1,2,3}, set=a
+ x={2,3,4}, y={3,4,5,7}, set=b
+ x=6, y={5,7,...,15}, set=c
+};
+\end{codeexample}
+ %
+\end{dataformat}
+
+\begin{dataformat}{TeX code}
+ This format will simply execute each line of the data, each of which should
+ contain some normal TeX code. Note that at the end of each line control
+ returns to the format handler, so for instance the arguments of a command
+ may not be spread over several lines. However, not each line needs to
+ produce a data point.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as line]
+ data [format=TeX code] {
+ \pgfkeys{/data point/.cd,x=0, y=0} \pgfdatapoint
+ \pgfkeys{/data point/.cd,x=1, y=1} \pgfdatapoint
+ \pgfkeys{/data point/x=2} \pgfdatapoint
+ \pgfkeyssetvalue{/data point/x}{3}
+ \pgfkeyssetvalue{/data point/y}{0} \pgfdatapoint
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{dataformat}
+
+
+\subsection{Reference: Advanced Formats}
+
+\begin{tikzlibrary}{datavisualization.formats.functions}
+ This library defines the formats described in the following, which allow
+ you to specify the data points indirectly, namely via a to-be-evaluated
+ function.
+
+ \begin{dataformat}{function}
+ This format allows you to specify a function that is then evaluated in
+ order to create the desired data points. In other words, the data lines
+ do not contain the data itself, but rather a functional description of
+ the data.
+
+ The format used to specify the function works as follows: Each nonempty
+ line of the data should contain at least one of either a \emph{variable
+ declaration} or a \emph{function declaration}. A variable declaration
+ signals that a certain attribute will range over a given interval. The
+ function declarations will then, later, be evaluated for values inside
+ this interval. The syntax for a variable declaration is one of the
+ following:
+ %
+ \begin{enumerate}
+ \item |var |\declare{\meta{variable}}| : interval[|\meta{low}|:|\meta{high}|]|
+ \opt{|samples |\meta{number}}|;|
+ \item |var |\declare{\meta{variable}}| : interval[|\meta{low}|:|\meta{high}%
+ |] step |\meta{step}|;|
+ \item |var |\declare{\meta{variable}}| : {|\meta{values}|};|
+ \end{enumerate}
+ %
+ In the first case, if the optional |samples| part is missing, the
+ number of |samples| is taken from the value stored in the following
+ key:
+ %
+ \begin{key}{/pgf/data/samples=\meta{number} (initially 25)}
+ Sets the number of samples to be used when no sample number is
+ specified.
+ \end{key}
+ %
+ The meaning of declaring a variable declaration to range over an
+ |interval| is that the attribute named \meta{variable}, that is, the
+ key |/data point/|\meta{variable}, will range over the interval
+ $[\meta{low},\meta{high}]$. If the number of |samples| is given
+ (directly or indirectly), the interval is evenly divided into
+ \meta{number} many points and the attribute is set to each of these
+ values. Similarly, when a \meta{step} is specified, this stepping is
+ used to increase \meta{low} iteratively up to the largest value that is
+ still less or equal to \meta{high}.
+
+ The meaning of declaring a variable using a list of \meta{values} is
+ that the variable will simply iterate over the values using |\foreach|.
+
+ You can specify more than one variable. In this case, each variable is
+ varied independently of the other variables. For instance, if you
+ declare an $x$-variable to range over the interval $[0,1]$ in $25$
+ steps and you also declare a $y$-variable to range over the same
+ interval, you get a total of $625$ value pairs.
+
+ The variable declarations specify which (input) variables will take
+ which values. It is the job of the \emph{function declarations} to
+ specify how some additional attributes are to be computed. The syntax
+ of a function declaration is as follows:
+ %
+ \begin{quote}
+ |func |\declare{\meta{attribute}}| = |\meta{expression}|;|
+ \end{quote}
+ %
+ The meaning of such a declaration is the following: For each setting of
+ the input variables (the variables specified using the |var|
+ declaration), evaluate the \meta{expression} using the standard
+ mathematical parser of \tikzname. The resulting value is then stored in
+ |/data point/|\meta{attribute}.
+
+ Inside \meta{expression} you can reference data point attributes using
+ the following command, which is only defined inside such an expression:
+ %
+ \begin{command}{\value\marg{variable}}
+ This expands to the current value of the key
+ |/data point/|\meta{variable}.
+ \end{command}
+
+ There can be multiple function declarations in a single data
+ specification. In this case, all of these functions will be evaluated
+ for each setting of input variables.
+ %
+\begin{codeexample}[]
+\tikz
+ \datavisualization [school book axes, visualize as smooth line]
+ data [format=function] {
+ var x : interval [-1.5:1.5];
+
+ func y = \value x * \value x;
+ };
+\end{codeexample}
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ school book axes,
+ all axes={unit length=5mm, ticks={step=2}},
+ visualize as smooth line]
+data [format=function] {
+ var t : interval [0:2*pi];
+
+ func x = \value t * cos(\value t r);
+ func y = \value t * sin(\value t r);
+};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ scientific axes=clean,
+ y axis={ticks={style={
+ /pgf/number format/fixed,
+ /pgf/number format/fixed zerofill,
+ /pgf/number format/precision=2}}},
+ x axis={ticks={tick suffix=${}^\circ$}},
+ visualize as smooth line/.list={1,2,3,4,5,6},
+ style sheet=vary hue]
+data [format=function] {
+ var set : {1,...,6};
+ var x : interval [0:50];
+ func y = sin(\value x * (\value{set}+10))/(\value{set}+5);
+};
+\end{codeexample}
+ \end{dataformat}
+\end{tikzlibrary}
+
+
+\subsection{Advanced: The Data Parsing Process}
+\label{section-dv-parsing}
+
+Whenever data is fed to the data visualization system, it will be handled by
+the |\pgfdata| command, declared in the |datavisualization| module. The command
+is both used to parse data stored in external sources (that is, in external
+files or which is produced on the fly by calling an external command) as well
+as data given inline. A data format does not need to know whether data comes
+from a file or is given inline, the |\pgfdata| command will take care of this.
+
+Since \TeX\ will always read files in a line-wise fashion, data is always fed
+to data format parsers in such a fashion. Thus, even it would make more sense
+for a format to ignore line-breaks, the parser must still handle data given
+line-by-line.
+
+Let us now have a look at how |\pgfdata| works.
+
+\begin{command}{\pgfdata\opt{\oarg{options}\marg{inline data}}}
+ This command is used to feed data to the visualization pipeline. This
+ command can only be used when a data visualization object has been properly
+ setup, see Section~\ref{section-dv-main-setup}.
+
+
+ \medskip
+ \textbf{Basic options.}
+ The |\pgfdata| command may be followed by \meta{options}, which are
+ executed with the path |/pgf/data/|. Depending on these options, the
+ \meta{options} may either be followed by \meta{inline data} or,
+ alternatively, no \meta{inline data} is present and the data is read from
+ an external source.
+
+ The first important option is \meta{source}, which governs which of these
+ two alternatives applies:
+ %
+ \begin{key}{/pgf/data/read from file=\meta{filename} (initially \normalfont empty)}
+ If you set the |read from file| attribute to a non-empty
+ \meta{filename}, the data will be read from this file. In this case, no
+ \meta{inline data} may be present, not even empty curly braces should
+ be provided. If |read from file| is empty, the data must directly
+ follow as \meta{inline data}.
+ %
+\begin{codeexample}[code only]
+% Data is read from two external files:
+\pgfdata[format=table, read from file=file1.csv]
+\pgfdata[format=table, read from file=file2.csv]
+\end{codeexample}
+ %
+\begin{codeexample}[code only]
+% Data is given inline:
+\pgfdata[format=table]
+{
+ x, y
+ 1, 2
+ 2, 3
+}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/data/inline}
+ This is a shorthand file |read from file={}|. You can add this to make
+ it clear(er) to the reader that data follows inline.
+ \end{key}
+ %
+ The second important key is |format|, which is used to specify the data
+ format:
+ %
+ \begin{key}{/pgf/data/format=\meta{format} (initially table)}
+ Use this key to locally set the format used for parsing the data. The
+ \meta{format} must be a format that has been previously declared using
+ the |\pgfdeclaredataformat| command. See the reference section for a
+ list of the predefined formats.
+ \end{key}
+ %
+ In case all your data is in a certain format, you may wish to generally set
+ the above key somewhere at the beginning of your file. Alternatively, you
+ can use the following style to setup the |format| key and possibly further
+ keys concerning the data format:
+ %
+ \begin{stylekey}{/pgf/every data}
+ This style is executed by |\pgfdata| before the \meta{options} are
+ parsed.
+
+ Note that the path of this key is just |/pgf/|, not |/pgf/data/|. Also
+ note that \tikzname\ internally sets the value of this key up in such a
+ way that the keys |/tikz/every data| and also
+ |/tikz/data visualization/every data| are executed. The bottom line of
+ this is that when using \tikzname, you should not set this key
+ directly, set |/tikz/every data| instead.
+ \end{stylekey}
+
+ \medskip
+ \textbf{Gathering of the data.}
+ Once the data format and the source have been decided upon, the data is
+ ``gathered''. During this phase the data is not actually parsed in detail,
+ but just gathered so that it can later be parsed during the visualization.
+ There are two different ways in which the data is gathered:
+ %
+ \begin{itemize}
+ \item In case you have specified an external source, the data
+ visualization object is told (by means of invoking the |add data|
+ method) that it should (later) read data from the file specified
+ by the |source| key using the format specified by the |format| key.
+ The file is not read at this point, but only later during the
+ actual visualization.
+ \item Otherwise, namely when data is given inline, depending on which
+ format is used, some catcodes get changed. This is necessary since
+ \TeX's special characters are often not-so-special in a certain
+ format.
+
+ Independently of the format, the end-of-line character (carriage
+ return) is made an active character.
+
+ Finally, the \meta{inline data} is then read as a normal argument
+ and the data visualization object is told that later on it should
+ parse this data using the given format parser. Note that in this
+ case the data visualization object must store the whole data
+ internally.
+ \end{itemize}
+ %
+ In both cases the ``data visualization object'' is the object stored
+ in the |/pgf/data visualization/obj| key.
+
+
+ \medskip
+ \textbf{Parsing of the data.}
+ During the actual data visualization, all code that has been added to the
+ data visualization object by means of the |add data| method is executed
+ several times. It is the job of this code to call the |\pgfdatapoint|
+ method for all data points present in the data.
+
+ When the |\pgfdata| method calls |add data|, the code that is passed to the
+ data visualization object is just a call to internal macros of |\pgfdata|,
+ which are able to parse the data stored in an external file or in the
+ inlined data. Independently of where the data is stored, these macros
+ always do the following:
+ %
+ \begin{enumerate}
+ \item The catcodes are setup according to what the data format
+ requires.
+ \item Format-specific startup code gets called, which can initialize
+ internal variables of the parsing process. (The catcode changes are
+ not part of the startup code since in order to read inline data
+ |\pgfdata| must be able to setup to temporarily setup the catcodes
+ needed later on by the parsers, but since no reading is to be done,
+ no startup code should be called at this point.)
+ \item For each line of the data a format-specific code handler, which
+ depends on the data format, is called. This handler gets the
+ current line as input and should call |\pgfdatapoint| once for each
+ data point that is encoded by this line (a line might define
+ multiple data points or none at all). Empty lines are handled by
+ special format-specific code.
+ \item At the end, format-specific end code is executed.
+ \end{enumerate}
+ %
+ For an example of how this works, see the description of the
+ |\pgfdeclaredataformat| command.
+
+
+ \medskip
+ \textbf{Data sets.}
+ There are three options that allow you to create \emph{data sets}. Such a
+ data set is essentially a macro that stores a pre-parsed set of data that
+ can be used multiple times in subsequent visualizations (or even in the
+ same visualization).
+ %
+ \begin{key}{/pgf/data/new set=\meta{name}}
+ Creates an empty data set called \meta{name}. If a data set of the same
+ name already exists, it is overwritten and made empty. Data sets are
+ global.
+ \end{key}
+ %
+ \begin{key}{/pgf/data/store in set=\meta{name}}
+ When this key is set to any non-empty \meta{name} and if this
+ \meta{name} has previously been used with the |new set| key, then the
+ following happens: For the current |\pgfdata| command, all parsed data
+ is not passed to the rendering pipeline. Instead, the parsed data is
+ appended to the data set \meta{name}. This includes all options parsed
+ to the |\pgfdata| command, which is why neither this key nor the
+ previous key should be passed as options to a |\pgfdata| command.
+ \end{key}
+ %
+ \begin{key}{/pgf/data/use set=\meta{name}}
+ This works similar to |read from file|. When this key is used with a
+ |\pgfdata| command, no inline data may follow. Instead, the data stored
+ in the data set \meta{name} is used.
+ \end{key}
+\end{command}
+
+
+\subsection{Advanced: Defining New Formats}
+\label{section-dv-declaring-formats}
+
+In order to define a new data format you can use the following command, which
+is basic layer command defined in the module |datavisualization|:
+
+\begin{command}{\pgfdeclaredataformat\marg{format name}\marg{catcode
+ code}\marg{startup code}\marg{line arguments}\\\marg{line
+ code}\marg{empty line code}\marg{end code}%
+}
+ This command defines a new data format called \meta{format name}, which can
+ subsequently be used in the |\pgfdata| command. (The \tikzname's |data|
+ maps directly to |\pgfdata|, so the following applies to \tikzname\ as
+ well.)
+
+ As explained in the description of the |\pgfdata| command, when data is
+ being parsed that is formatted according to \meta{format name}, the
+ following happens:
+ %
+ \begin{enumerate}
+ \item The \meta{catcode code} is executed. This code should just
+ contain catcode changes. The \meta{catcode code} will also be
+ executed when inline data is read.
+ \item Next, the \meta{startup code} is executed.
+ \item Next, for each non-empty line of the data, the line is passed to
+ a macro whose argument list is given by \meta{line arguments} and
+ whose body is given by \meta{line code}. The idea is that you can
+ use \TeX's powerful pattern matching capabilities to parse the
+ non-empty lines. See also the below example.
+ \item Empty lines are not processed by the \meta{line code}, but rather
+ by the \meta{empty line code}. Typically, empty lines can simply be
+ ignored and in this case you can let this parameter be empty.
+ \item At the end of the data, the \meta{end code} is executed.
+ \end{enumerate}
+
+ As an example, let us now define a simple data format for reading files
+ formatted in the following manner: Each line should contain a coordinate
+ pair as in |(1.2,3.2)|, so two numbers separated by a comma and surrounded
+ by parentheses. To make things more interesting, suppose that the hash mark
+ symbol can be used to indicate comments. Here is an example of some data
+ given in this format:
+ %
+\begin{codeexample}[code only]
+# This is some data formatted according to the "coordinates" format
+(0,0)
+(0.5,0.25)
+(1,1)
+(1.5,2.25)
+(2,4)
+\end{codeexample}
+
+ A format parser for this format could be defined as follows:
+ %
+\begin{codeexample}[code only]
+\pgfdeclaredataformat{coordinates}
+% First comes the catcode argument. We turn the hash mark into a comment character.
+{\catcode`\#=14\relax}
+% Second comes the startup code. Since we do not need to setup things, we can leave
+% it empty. Note that we could also set it to something like \begingroup, provided we
+% put an \endgroup in the end code
+{}
+% Now comes the arguments for non-empty lines. Well, these should be of the form
+% (#1,#2), so we specify that:
+{(#1,#2)}
+% Now we must do something with a line of this form. We store the #1 argument in
+% /data point/x and #2 in /data point/y. Then we call \pgfdatapoint to create a data point.
+{
+ \pgfkeyssetvalue{/data point/x}{#1}
+ \pgfkeyssetvalue{/data point/y}{#2}
+ \pgfdatapoint
+}
+% We ignore empty lines:
+{}
+% And we also have no end-of-line code.
+{}
+\end{codeexample}
+ %
+ This format could now be used as follows:
+ %
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ \datavisualization[school book axes, visualize as smooth line]
+ data [format=coordinates] {
+ # This is some data formatted according
+ # to the "coordinates" format
+ (0,0)
+ (0.5,0.25)
+ (1,1)
+ (1.5,2.25)
+ (2,4)
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-introduction.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-introduction.tex
new file mode 100644
index 0000000000..cd48bd5d67
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-introduction.tex
@@ -0,0 +1,148 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Introduction to Data Visualization}
+
+\emph{Data visualization} is the process of converting \emph{data points,}
+which typically consist of multiple numerical values, into a graphical
+representation. Examples include the well-known function plots, but pie charts,
+bar diagrams, box plots, or vector fields are also examples of data
+visualizations.
+
+The data visualization subsystem of \pgfname\ takes a general, open approach to
+data visualization. Like everything else in \pgfname, there is a powerful, but
+not-so-easy-to-use basic layer in the data visualization system and a less
+flexible, but much simpler-to-use frontend layer. The present section gives an
+overview of the basic ideas behind the data visualization system.
+
+
+\subsection{Concept: Data Points}
+\label{section-dv-intro-data-points}
+
+The most important input for a data visualization is always raw data. This data
+is typically present in different formats and the data visualization subsystem
+provides methods for reading such formats and also for defining new input
+formats. However, independently of the input format, we may ask what kind of
+data the data visualization subsystem should be able to process. For
+two-dimensional plots we need lists of pairs of real numbers. For a bar plot we
+usually need a list of numbers, possibly together with some colors and labels.
+For a surface plot we need a matrix of triples of real numbers. For a vector
+field we need even more complex data.
+
+The data visualization subsystem makes no assumption concerning which kind of
+data is being processed. Instead, the whole ``rendering pipeline'' is centered
+around a concept called the \emph{data point}. Conceptually, a data point is an
+arbitrarily complex record that represents one piece of data that should be
+visualized. Data points are \emph{not} just coordinates in the plane or the
+numerical values that need to be visualized. Rather, they represent the basic
+units of the data that needs to be visualized.
+
+Consider the following example: In an experiment we drive a car along a road
+and have different measurement instruments installed. We measure the position
+of the car, the time, the speed, the direction the car is heading, the
+acceleration, and perhaps some further values. A data point would consist of a
+record consisting of a timestamp together with the current position of the car
+(presumably two or three numbers), the speed vector (another two or three
+numbers), the acceleration (another two or three numbers), and perhaps the
+label text of the current experiment.
+
+Data points should be ``information rich''. They might even contain more
+information than what will actually be visualized. It is the job of the
+rendering pipeline to pick out the information relevant to one particular data
+visualization -- another visualization of the same data might pick different
+aspects of the data points, thereby hopefully allowing new insights into the
+data.
+
+Technically, there is no special data structure for data points. Rather, when a
+special macro called |\pgfdatapoint| is called, the ``totality'' of all
+currently set keys with the |/data point/| prefix in the current scope forms
+the data point. This is both a very general approach and quite fast since no
+extra data structures need to be created.
+
+
+\subsection{Concept: Visualization Pipeline}
+
+The \emph{visualization pipeline} is a series of actions that are performed on
+the to-be-visualized data. The data is presented to the visualization pipeline
+in the form of a long stream of complex data points. The visualization
+pipeline makes several passes over this stream of data points. During the first
+pass(es), called the \emph{survey phase(s)}, information is gathered about the
+data points such as minimal and maximal values, which can be useful for
+automatic fitting of the data into a given area. In the main pass over the
+data, called the \emph{visualization phase}, the data points are actually
+visualized, for instance in the form of lines or points.
+
+Like as for data points, the visualized pipeline makes no assumptions
+concerning what kind of visualization is desired. Indeed, one could even use it
+to produce a plain-text table. This flexibility is achieved by extensive use of
+objects and signals: When a data visualization starts, a number of signals (see
+Section~\ref{section-signals} for an introduction to signals) are initialized.
+Then, numerous ``visualization objects'' are created that listen to these
+signals. These objects are all involved in processing the data points. For
+instance, the job of an |interval mapper| object is to map one attribute of a
+data point, such as a car's velocity, to another, such as the $y$-axis of a
+plot. For each data point the different signals are raised in a certain order
+and the different visualization objects now have a chance of preparing the data
+point for the actual visualization. Continuing the above example, there might
+be a second |interval mapper| that takes the computed $y$-position and applies
+a logarithm to it, because a log-plot was requested. Then another mapper, this
+time a |polar mapper| might be used to map everything to polar coordinates.
+Following this, a |plot mark visualizer| might actually draw something at the
+computed position.
+
+The whole idea behind the rendering pipeline is that new kinds of data
+visualizations can be implemented, ideally, just by adding one or two new
+objects to the visualization pipeline. Furthermore, different kinds of plots
+can be combined in novel ways in this manner, which is usually very hard to do.
+For instance, the visualization pipeline makes it easy to create, say,
+polar-semilog-box-plots. At first sight, such new kinds of plots may seem
+frivolous, but data visualization is all about gaining insights into the data
+from as many different angles as possible.
+
+Naturally, creating new classes and objects for the rendering pipeline is not
+trivial, so most users will just use the existing classes, which should, thus,
+be as flexible as possible. But even when one only intends to use existing
+classes, it is still tricky to setup the pipeline correctly since the ordering
+is obviously important and since things like axes and ticks need to be
+configured and taken care of. For this reason, the frontend libraries provide
+preconfigured rendering pipelines so that one can simply say that a data
+visualization should look like a |line plot| with |school book axes| or with
+|scientific axes|, which selects a certain visualization pipeline that is
+appropriate for this kind of plot:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=.7]
+ \datavisualization [school book axes, visualize as smooth line]
+ data [format=function] {
+ var x : interval [-2:2];
+ func y = \value x*\value x + 1;
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=.7]
+ \datavisualization [scientific axes, visualize as smooth line]
+ data [format=function] {
+ var x : interval [-2:2];
+ func y = \value x*\value x + 1;
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+One must still configure such a plot (choose styles and themes and also specify
+which attributes of a data point should be used), but on the whole the plot is
+quite simple to specify.
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-main.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-main.tex
new file mode 100644
index 0000000000..26a97fa4e7
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-main.tex
@@ -0,0 +1,828 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Creating Data Visualizations}
+\label{section-dv-main}
+\label{section-dv-main-setup}
+
+\subsection{Overview}
+
+The \todosp{why two labels? The first doesn't seem to be used.} present section
+explains how a data visualization is created in \tikzname. For this, you need
+to include the |datavisualization| library and then use the command
+|\datavisualization| whose syntax is explained in the rest of the present
+section. This command is part of the following library:
+
+\begin{tikzlibrary}{datavisualization}
+ This library must be loaded if you wish to use the |\datavisualization|
+ command. It defines all styles needed to create basic data visualizations;
+ additional, more specialized libraries need to be loaded for more advanced
+ features.
+\end{tikzlibrary}
+
+In order to visualize, you basically need to do three things:
+%
+\begin{enumerate}
+ \item You need to select what kind of plot you would like to have (a
+ ``school book plot'' or a ``scientific 2d plot'' or a ``scientific
+ spherical plot'' etc.). This is done by passing an option to the
+ |\datavisualization| command that selects this kind of plot.
+ \item You need to provide data points, which is done using the |data|
+ command.
+ \item Additionally, you can add options that give you more fine-grained
+ control over the way the visualization will look. You can configure the
+ number of ticks and grid lines, where the labels are placed, the
+ colors, or the fonts. Indeed, since the data visualization engine
+ internally uses \tikzname-styles, you can have extremely fine-grained
+ control over how a plot will look like.
+\end{enumerate}
+
+The syntax of the |\datavisualization| command is designed in such a way that
+if you only need to provide very few options to create plots that ``look good
+by default''.
+
+This section is structured as follows: First, the philosophy behind concepts
+like ``data points'', ``axes'', or ``visualizers'' is explained. Each of these
+concepts is further detailed in later section. Then, the syntax of the
+|\datavisualization| command is covered. The reference sections explain which
+predefined plot kinds are available.
+
+
+\subsection{Concept: Data Points and Data Formats}
+
+As explained in Section~\ref{section-dv-intro-data-points}, data points are the
+basic entities that are processed by the data visualization engine. In order to
+specify data points, you use the |data| command, whose syntax is explained in
+more detail in Section~\ref{section-dv-data-syntax}. The |data| command allows
+you to either specify points ``inline'', directly inside your \TeX-file; or you
+can specify the name of file that contains the data points.
+
+\medskip
+\textbf{Specifying data points.}
+Data points can be formatted in different ways. For instance, in the so called
+\emph{comma separated values} format, there is one line for each data point and
+the different attributes of a data point are separated by commas. Another
+common format is to specify data points using the so called \emph{key--value}
+format, where on each line the different attributes of a data point are set
+using a comma-separated list of strings of the form |attribute=value|.
+
+Here are two examples, where similar data is given in different formats:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as smooth line]
+ data {
+ x, y
+ -1.5, 2.25
+ -1, 1
+ -.5, .25
+ 0, 0
+ .5, .25
+ 1, 1
+ 1.5, 2.25
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [school book axes, visualize as smooth line]
+ data [format=function] {
+ var x : interval [-1.5:1.5] samples 7;
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+In the first example, no format needed to be specified explicitly since the
+default format is the one used for the data following the |data| keyword: A
+list of comma-separated values, where each line represents a data point.
+
+\medskip
+\textbf{Number accuracy.}\label{section-dv-expressions}
+Data visualizations typically demand a much higher accuracy and range of values
+than \TeX\ provides: \TeX\ numbers are limited to 13 bits for the integer part
+and 16 bits for the fractional part. Because of this, the data visualization
+engine does not use \pgfname's standard representation of numbers and \TeX\
+dimensions and is does not use the standard parser when reading numbers in a
+data point. Instead, the |fpu| library, described in
+Section~\ref{section-library-fpu}, is used to handle numbers.
+
+This use of the |fpu| library has several effects that users of the data
+visualization system should be aware of:
+%
+\begin{enumerate}
+ \item You can use numbers like |100000000000000| or |0.00000000001| in a
+ data points.
+ \item Since the |fpu| library does not support advanced parsing, you
+ currently \emph{cannot} write things like |3+2| in a data point number.
+ This will result in an error.
+ \item However, there is a loop-hole: If a ``number'' in a data point starts
+ with a parenthesis, the value between the parentheses \emph{is} parsed
+ using the normal parser:
+ %
+ \begin{itemize}
+ \item |100000| is allowed.
+ \item |2+3| yields an error.
+ \item |(2+3)| is allowed and evaluates to |5|.
+ \item |(100000)| yields an error since $100\,000$ is beyond the
+ normal parser's precision.
+ \end{itemize}
+ %
+ The bottom line is that any normal calculations should be set inside
+ round parentheses, while large numbers should not be surrounded by
+ parentheses. Hopefully, in the future, these restrictions will be
+ lifted.
+\end{enumerate}
+
+Section~\ref{section-dv-formats} gives an in-depth coverage of the available
+data formats and explains how new data formats can be defined.
+
+
+\subsection{Concept: Axes, Ticks, and Grids}
+
+Most plots have two or three axes: A horizontal axis usually called the
+$x$-axis, a vertical axis called the $y$-axis, and possibly some axis pointing
+in a sloped direction called the $z$-axis. Axes are usually drawn as lines with
+\emph{ticks} indicating interesting positions on the axes. The data
+visualization engine gives you detailed control over where these ticks are
+rendered and how many of them are used. Great care is taken to ensure that the
+position of ticks are chosen well by default.
+
+From the point of view of the data visualization engine, axes are a somewhat
+more general concept than ``just'' lines that point ``along'' some dimension:
+The data visualization engine uses axes to visualize any change of an attribute
+by varying the position of data points in the plane. For instance, in a polar
+plot, there is an ``axis'' for the angle and another ``axis'' for the distance
+if the point from the center. Clearly these axes vary the position of data
+points in the plane according to some attribute of the data points; but just as
+clearly they do not point in any ``direction''.
+
+A great benefit of this approach is that the powerful methods for specifying
+and automatic inference of ``good'' positions for ticks or grid lines apply to
+all sorts of situations. For instance, you can use it to automatically put
+ticks and grid lines at well-chosen angles of a polar plot.
+
+Typically, you will not need to specify axes explicitly. Rather, predefined
+styles take care of this for you:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [
+ scientific axes,
+ x axis={length=3cm, ticks=few},
+ visualize as smooth line
+ ]
+ data [format=function] {
+ var x : interval [-1.5:1.5] samples 7;
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [
+ scientific axes=clean,
+ x axis={length=3cm, ticks=few},
+ all axes={grid},
+ visualize as smooth line
+ ]
+ data [format=function] {
+ var x : interval [-1.5:1.5] samples 7;
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Section~\ref{section-dv-axes} explains in more detail how axes, ticks, and grid
+lines can be chosen and configured.
+
+
+\subsection{Concept: Visualizers}
+
+Data points and axes specify \emph{what} is visualized and \emph{where}. A
+\emph{visualizer} specifies \emph{how} they are visualized. One of the most
+common visualizers is a \emph{line visualizer} which connects the positions of
+the data points in the plane using a line. Another common visualizer is the
+\emph{scatter plot visualizer} where small marks are drawn at the positions of
+the data points. More advanced visualizers include, say, box plot visualizers
+or pie chart visualizers.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [
+ scientific axes=clean,
+ x axis={length=3cm, ticks=few},
+ visualize as smooth line
+ ]
+ data [format=function] {
+ var x : interval [-1.5:1.5] samples 7;
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \datavisualization [
+ scientific axes=clean,
+ x axis={length=3cm, ticks=few},
+ visualize as scatter
+ ]
+ data [format=function] {
+ var x : interval [-1.5:1.5] samples 7;
+ func y = \value x*\value x;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Section~\ref{section-dv-visualizers} provides more information on visualizers
+as well as reference lists.
+
+
+\subsection{Concept: Style Sheets and Legends}
+
+A single data visualizations may use more than one visualizer. For instance, if
+you wish to create a plot containing several lines, a separate visualizer is
+used for each line. In this case, two problems arise:
+%
+\begin{enumerate}
+ \item You may wish to make it easy for the reader to differentiate between
+ the different visualizers. For instance, one line should be black,
+ another should be red, and another blue. Alternatively, you might wish
+ one line to be solid, another to be dashed, and a third to be dotted.
+
+ Specifying such styles is trickier than one might expect; experience
+ shows that many plots use ill-chosen and inconsistent styling. For this
+ reason, the data visualization introduces the notion of \emph{style
+ sheets} for visualizers and comes with some well-designed predefined
+ style sheets.
+ \item You may wish to add information concerning what the different
+ visualizers represent. This is typically done using a legend, but it is
+ even better to add labels directly inside the visualization. Both
+ approaches are supported.
+\end{enumerate}
+
+An example where three functions are plotted and a legend is added is shown
+below. Two style sheets are used so that \emph{both} the coloring and the
+dashing is varied.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[baseline]
+ \datavisualization [ scientific axes=clean,
+ y axis=grid,
+ visualize as smooth line/.list={sin,cos,tan},
+ style sheet=strong colors,
+ style sheet=vary dashing,
+ sin={label in legend={text=$\sin x$}},
+ cos={label in legend={text=$\cos x$}},
+ tan={label in legend={text=$\tan x$}},
+ data/format=function ]
+ data [set=sin] {
+ var x : interval [-0.5*pi:4];
+ func y = sin(\value x r);
+ }
+ data [set=cos] {
+ var x : interval [-0.5*pi:4];
+ func y = cos(\value x r);
+ }
+ data [set=tan] {
+ var x : interval [-0.3*pi:.3*pi];
+ func y = tan(\value x r);
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Section~\ref{section-dv-style-sheets} details style sheets and legends.
+
+
+\subsection{Usage}
+\label{section-dv-data-syntax}
+
+Inside a \tikzname\ picture you can use the |\datavisualization| command to
+create a data visualization. You can use this command several times in a
+picture to create pictures containing multiple data visualizations.
+
+\begin{command}{\datavisualization\opt{\oarg{data visualization options}}\meta{data specification}|;|}
+ This command is available only inside a |{tikzpicture}| environment.
+
+ The \meta{data visualization options} are used to configure the data
+ visualization, that is, how the data is to be depicted. The options are
+ executed with the path prefix |/tikz/data visualization|. This means that
+ normal \tikzname\ options like |thin| or |red| cannot be used here. Rather,
+ a large number of options specific to data visualizations are available.
+
+ As a minimum, you should specify at least two options: First, you should
+ use an option that selects an axis system that is appropriate for your
+ plot. Typical possible keys are |school book axes| or |scientific axes|,
+ detailed information on them can be found in Section~\ref{section-dv-axes}.
+
+ Second, you use an option to select \emph{how} the data should be
+ visualized. This is done using a key like |visualize as line| which will,
+ as the name suggests, visualize the data by connecting data points in the
+ plane using a line. Similarly, |visualize as smooth cycle| will try to fit
+ a smooth cycle through the data points. Detailed information on possible
+ visualizers can be found in Section~\ref{section-dv-visualizers}.
+
+ Following these options, the \meta{data specification} is used to provide
+ the actual to-be-visualized data. The syntax is somewhat similar to
+ commands like |\path|: The \meta{data specification} is a sequence of
+ keywords followed by local options and parameters, terminated with a
+ semicolon. (Indeed, like for the |\path| command, the \meta{data
+ visualizers options} need not be specified at the beginning, but additional
+ option surrounded by square brackets may be given anywhere inside the
+ \meta{data specification}.)
+
+ The different possible keywords inside the \meta{data specification} are
+ explained in the following.
+\end{command}
+
+\begin{datavisualizationoperation}{data}{\opt{\oarg{options}}\opt{\marg{inline data}}}
+ This command is used to specify data for the data visualization. It can be
+ used several times inside a single visualization and each time the
+ to-be-read data may have a different format, but the data will be
+ visualized as if it have been specified inside a single |data| command.
+
+ The behaviour of the |data| command depends on whether the \meta{inline
+ data} is present. If it is not present, the \meta{options} must be used to
+ specify a source file from which the data is read; if the \meta{inline
+ data} is present no file will be used, instead the data should directly
+ reside inside the \TeX-file and be given between the curly braces
+ surrounding the \meta{inline data}.
+
+ The \meta{options} are executed with the prefix |/pgf/data|. The following
+ options are always available:
+ %
+ \begin{key}{/pgf/data/read from file=\meta{filename} (initially \normalfont empty)}
+ If you set the |source| attribute to a non-empty \meta{filename}, the
+ data will be read from this file. In this case, no \meta{inline data}
+ may be present, not even empty curly braces should be provided.
+ %
+\begin{codeexample}[code only]
+\datavisualization ...
+ data [read from file=file1.csv]
+ data [read from file=file2.csv];
+\end{codeexample}
+ %
+ The other way round, if |read from file| is empty, the data must
+ directly follow as \meta{inline data}.
+ %
+\begin{codeexample}[code only]
+\datavisualization ...
+ data {
+ x, y
+ 1, 2
+ 2, 3
+ };
+\end{codeexample}
+ \end{key}
+ %
+ The second important key is |format|, which is used to specify the data
+ format:
+ %
+ \begin{key}{/pgf/data/format=\meta{format} (initially table)}
+ Use this key to locally set the format used for parsing the data, see
+ Section~\ref{section-dv-formats} for a list of predefined formats.
+
+ The default format is the |table|-format, also known as
+ ``comma-separated values''. The first line contains names of attributes
+ separated by commas, all following lines constitute a data point where
+ the attributes are given by the comma-separated values in that line.
+ \end{key}
+
+
+ \medskip
+ \textbf{Presetting attributes.}
+ Normally, the inline data or the external data contains for each data point
+ the values of the different attributes. However, sometimes you may also
+ wish to set an attribute to a fixed value for all data points of a data
+ set. Suppose, for instance, that you have to source files
+ |experiment007.csv| and |experiment023.csv| and you would like that for all
+ data points of the first file the attribute |/data point/experiment id| is
+ set to 7 while for the data points of the second file they are set to 23.
+ In this case, you can specify the desired settings using an absolute path
+ inside the \meta{options}. The effect will be local to the current |data|
+ command:
+ %
+\begin{codeexample}[code only]
+\datavisualization...
+ data [/data point/experiment=7, read from file=experiment007.csv]
+ data [/data point/experiment=23, read from file=experiment023.csv];
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz
+ \datavisualization [school book axes, visualize as line]
+ data [/data point/x=1] {
+ y
+ 1
+ 2
+ }
+ data [/data point/x=2] {
+ y
+ 2
+ 0.5
+ };
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Setting options for multiple |data| commands.}
+ You may wish to generally set the format once and for all. This can be done
+ by using the following key:
+ %
+ \begin{stylekey}{/tikz/every data}
+ This key is executed for every |data| command.
+ \end{stylekey}
+
+ Another way of passing options to multiple |data| commands is to use the
+ following facility: Whenever an option with the path
+ |/tikz/data visualization/data| is used, the path will be remapped to
+ |/pgf/data|. This means, in particular, that you can pass an option like
+ |data/format=table| to the |\datavisualization| command to set the data
+ format for all |data| commands of the data visualization.
+
+
+ \medskip
+ \textbf{Parsing inline data.}
+ When you specify data inline, \TeX\ needs to read the data
+ ``line-by-line'', while \TeX\ normally largely ignores end-of-line
+ characters. For this reason, the data visualization system temporarily
+ changes the meaning of the end-of-line character. This is only possible if
+ \TeX\ has not already processed the data in some other way (namely as the
+ parameter to some macro).
+
+ The bottom line is that you cannot use inline data when the whole
+ |\datavisualization| command is passed as a parameter to some macro that is
+ not setup to handle ``fragile'' code. For instance, in a \textsc{beamer}
+ |frame| you need to add the |fragile| option when a data visualization
+ contains inline data.
+
+ The problem does not arise when an external data |source| is specified.
+\end{datavisualizationoperation}
+
+\begin{datavisualizationoperation}{data point}{\opt{\oarg{options}}}
+ This command is used to specify data a single data point. The
+ \meta{options} are simply executed with the path |/data point| and then a
+ data point is created. This means that inside the \meta{options} you just
+ specify the values of all attributes in key--value syntax.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [school book axes, visualize as line]
+ data point [x=1, y=1] data point [x=1, y=2]
+ data point [x=2, y=2] data point [x=2, y=0.5];
+\end{codeexample}
+ %
+\end{datavisualizationoperation}
+
+\begin{key}{/tikz/data visualization/data point=\meta{options}}
+ This key is the ``key version'' of the previous command. The difference is
+ that this key can be used internally inside styles.
+ %
+\begin{codeexample}[]
+\tikzdatavisualizationset{
+ horizontal/.style={
+ data point={x=#1, y=1}, data point={x=#1, y=2}},
+}
+\tikz \datavisualization
+[ school book axes, visualize as line,
+ horizontal=1,
+ horizontal=2 ];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{datavisualizationoperation}{data group}{\opt{\oarg{options}}\marg{name}\opt{|+=|\marg{data specifications}}}
+ You can store a whole \meta{data specification} in a \emph{data group}.
+ This allows you to reuse data in multiple places without having to write
+ the data to an external file.
+
+ The syntax of this command comes in the following three variants:
+ %
+ \begin{itemize}
+ \item |data group| \opt{\oarg{options}} \marg{name} |=| \marg{data
+ specifications}
+ \item |data group| \opt{\oarg{options}} \marg{name} |+=| \marg{data
+ specifications}
+ \item |data group| \opt{\oarg{options}} \marg{name}
+ \end{itemize}
+ %
+ In the first case, a new data group called \meta{name} is created (an
+ existing data group of the same name will be erased) and the following
+ \meta{data specifications} is stored in this data group. The data group
+ will not be fed to the rendering pipeline, but it is parsed at this point
+ as if it were. The defined data group is defined globally, so you can used
+ it in subsequent visualizations. The \meta{options} are saved with the
+ parsed \meta{data specifications}.
+
+ In the second case, an already existing data group is extended by adding
+ the \meta{data specifications} to it.
+
+ In the third case (detected by noting that the \meta{name} is neither
+ followed by an equal sign nor a plus sign), the contents of the previously
+ defined data group \meta{name} is inserted. The \meta{options} are also
+ executed.
+
+ Let is now first create a data group. Note that nothing is drawn since the
+ ``dummy'' data visualization is empty and used only for the definition of
+ the data group.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization data group {points} = {
+ data {
+ x, y
+ 0, 1
+ 1, 2
+ 2, 2
+ 5, 1
+ 2, 0
+ 1, 1
+ }
+};
+\end{codeexample}
+
+ We can now use this data in different plots:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization [school book axes, visualize as line] data group {points};
+\qquad
+\tikz \datavisualization [scientific axes=clean, visualize as line] data group {points};
+\end{codeexample}
+ %
+\end{datavisualizationoperation}
+
+\begin{datavisualizationoperation}{scope}{\opt{\oarg{options}}\marg{data specification}}
+ Scopes can be used to nest hierarchical data sets. The \meta{options} will
+ be executed with the path |/pgf/data| and will only apply to the data sets
+ specified inside the \meta{data specification}, which may contain |data| or
+ |scope| commands once more:
+ %
+\begin{codeexample}[code only]
+\datavisualization...
+ scope [/data point/experiment=7]
+ {
+ data [read from file=experiment007-part1.csv]
+ data [read from file=experiment007-part2.csv]
+ data [read from file=experiment007-part3.csv]
+ }
+ scope [/data point/experiment=23, format=foo]
+ {
+ data [read from file=experiment023-part1.foo]
+ data [read from file=experiment023-part2.foo]
+ };
+\end{codeexample}
+ %
+\end{datavisualizationoperation}
+
+\begin{datavisualizationoperation}{info}{\opt{\oarg{options}}\marg{code}}
+ This command will execute normal \tikzname\ \meta{code} at the end of a
+ data visualization. The \meta{options} are executed with the normal path
+ |/tikz/|.
+
+ The only difference between this command and just giving the \meta{code}
+ directly following the data visualization is that inside the \meta{code}
+ following an |info| command you still have access to the coordinate system
+ of the data visualization. In sharp contrast, \tikzname\ code given after a
+ data visualization can no longer access this coordinate system.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[baseline]
+ \datavisualization [ school book axes, visualize as line ]
+ data [format=function] {
+ var x : interval [-0.1*pi:2];
+ func y = sin(\value x r);
+ }
+ info {
+ \draw [red] (visualization cs: x={(.5*pi)}, y=1) circle [radius=1pt]
+ node [above,font=\footnotesize] {extremal point};
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ As can be seen, inside a data visualization a special coordinate system is
+ available:
+
+ \begin{coordinatesystem}{visualization}
+ As for other coordinate systems, the syntax is
+ \declare{|(visualization cs:|\meta{list of attribute-value pairs}|)|}.
+ The effect is the following: For each pair
+ \meta{attribute}|=|\meta{value} in the \meta{list} the key
+ |/data point/|\meta{attribute} is set to \meta{value}. Then, it is
+ computed where the resulting data point ``would lie'' on the canvas
+ (however, no data point is passed to the visualizers).
+ \end{coordinatesystem}
+\end{datavisualizationoperation}
+
+\begin{datavisualizationoperation}{info'}{\opt{\oarg{options}}\marg{code}}
+ This command works like |info|, only the \meta{code} will be executed just
+ before the visualization is done. This allows you to draw things
+ \emph{behind} the visualization.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[baseline]
+ \datavisualization [ school book axes, visualize as line ]
+ data [format=function] {
+ var x : interval [-0.1*pi:2];
+ func y = sin(\value x r);
+ }
+ info' {
+ \fill [red] (visualization cs: x={(.5*pi)}, y=1) circle [radius=2mm];
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{datavisualizationoperation}
+
+\label{section-dv-bounding-box}%
+\begin{predefinednode}{data visualization bounding box}
+ This rectangle node stores a bounding box of the data visualization that is
+ currently being constructed. This node can be useful inside |info| commands
+ or when labels need to be added.
+\end{predefinednode}
+
+\begin{predefinednode}{data bounding box}
+ This rectangle node is similar to |data visualization bounding box|, but it
+ keeps track only of the actual data. The spaces needed for grid lines,
+ ticks, axis labels, tick labels, and other all other information that is
+ not part of the actual data is not part of this box.
+\end{predefinednode}
+
+
+\subsection{Advanced: Executing User Code During a Data Visualization}
+\label{section-dv-user-code}
+
+The following keys can be passed to the |\datavisualization| command and allow
+you to execute some code at some special time during the data visualization
+process. For details of the process and on which signals are emitted when, see
+Section~\ref{section-dv-backend}.
+
+\begin{key}{/tikz/data visualization/before survey=\meta{code}}
+ The \meta{code} is passed to the |before survey| method of the data
+ visualization object and then executed at the appropriate time (see
+ Section~\ref{section-dv-backend} for details).
+
+ The following commands work likewise:
+\end{key}
+%
+\begin{key}{/tikz/data visualization/at start survey=\meta{code}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/at end survey=\meta{code}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/after survey=\meta{code}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/before visualization=\meta{code}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/at start visualization=\meta{code}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/at end visualization=\meta{code}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/after visualization=\meta{code}}
+\end{key}
+
+
+\subsection{Advanced: Creating New Objects}
+
+You will need the following key only when you wish to create new rendering
+pipelines from scratch -- instead of modifying an existing pipeline as you
+would normally do. In the following it is assumed that you are familiar with
+the concepts of Section~\ref{section-dv-backend}.
+
+\begin{key}{/tikz/data visualization/new object=\meta{options}}
+ This key serves two purposes:
+ %
+ \begin{enumerate}
+ \item This method makes it easy to create a new object as part of the
+ rendering pipeline, using \meta{options} to specify arguments
+ rather that directly calling |\pgfoonew|. Since you have the full
+ power of the keys mechanism at your disposal, it is easy, for
+ instance, to control whether or not parameters to the constructor
+ are expanded or not.
+ \item The object is not created immediately, but only just before the
+ visualization starts. This allows you to specify that an object
+ must be created, but the parameter values of for its constructor
+ may depend on keys that are not yet set. A typical application is
+ the creating of an axis object: When you say |scientific axes|, the
+ |new object| command is used internally to create two objects
+ representing these axes. However, keys like |x={length=5cm}| can
+ only \emph{later} be used to specify the parameters that need to be
+ passed to the constructor of the objects.
+ \end{enumerate}
+
+ The following keys may be used inside the \meta{options}:
+ %
+ \begin{key}{/tikz/data visualization/class=\meta{class name}}
+ The class of the to-be-created object.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/when=\meta{phase name} (initially before survey)}
+ This key is used to specify when the object is to be created. As
+ described above, the object is not created immediately, but at some
+ time during the rendering process. You can specify any of the phases
+ defined by the data visualization object, see
+ Section~\ref{section-dv-backend} for details.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/store=\meta{key name}}
+ If the \meta{key name} is not empty, once the object has been created,
+ a handle to the object will be stored in \meta{key name}. If a handle
+ is already stored in \meta{key name}, the object is not created twice.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/before creation=\meta{code}}
+ This code is executed right before the object is finally created. It
+ can be used to compute values that are then passed to the constructor.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/after creation=\meta{code}}
+ This code is executed right after the object has just been created. A
+ handle to the just-created object is available in |\tikzdvobj|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/arg1=\meta{value}}
+ The value to be passed as the first parameter to the constructor.
+ Similarly, the keys |arg2| to |arg8| specify further parameters passed.
+ Naturally, only as many arguments are passed as parameters are set.
+ Here is an example:
+ %
+\begin{codeexample}[code only]
+\tikzdatavisualizationset{
+ new object={
+ class = example class,
+ arg1 = foo,
+ arg2 = \bar
+ }
+}
+\end{codeexample}
+ %
+ causes the following object creation code to be executed later on:
+ %
+\begin{codeexample}[code only]
+\pgfoonew \tikzdvobj=new example class(foo,\bar)
+\end{codeexample}
+ %
+ Note that you key mechanisms like |.expand once| to pass the value of a
+ macro instead of the macro itself:
+ %
+\begin{codeexample}[code only]
+\tikzdatavisualizationset{
+ new object={
+ class = example class,
+ arg1 = foo,
+ arg2/.expand once = \bar
+ }
+}
+\end{codeexample}
+ %
+ Now, if |\bar| is set to |This \emph{is} it.|\@ at the moment to object
+ is created later on, the following object creation code is executed:
+ %
+\begin{codeexample}[code only]
+\pgfoonew \tikzdvobj=new example class(foo,This \emph{is} it)
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/arg1 from key=\meta{key}}
+ Works like the |arg1|, only the value that is passed to the constructor
+ is the current value of the specified \meta{key} at the moment when the
+ object is created.
+ %
+\begin{codeexample}[code only]
+\tikzdatavisualizationset{
+ new object={
+ class = example class,
+ arg1 from key = /tikz/some key
+ }
+}
+\tikzset{some key/.initial=foobar}
+\end{codeexample}
+ %
+ causes the following to be executed:
+ %
+\begin{codeexample}[code only]
+\pgfoonew \tikzdvobj=new example class(foobar)
+\end{codeexample}
+ %
+ Naturally, the keys |arg2 from key| to |arg8 from key| are also
+ provided.
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/arg1 handle from key=\meta{key}}
+ Works like the |arg1 from key|, only the key must store an object and
+ instead of the object a handle to the object is passed to the
+ constructor.
+ \end{key}
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-polar.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-polar.tex
new file mode 100644
index 0000000000..5d9f351805
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-polar.tex
@@ -0,0 +1,425 @@
+% Copyright 2010 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Polar Axes}
+\label{section-dv-polar}
+
+\subsection{Overview}
+
+\begin{tikzlibrary}{datavisualization.polar}
+ This library contains keys that allow you to create plots in a polar axis
+ system is used.
+\end{tikzlibrary}
+
+In a \emph{polar axis system} two attributes are visualized by displacing a
+data point as follows: One attribute is used to compute a an angle (a
+direction) while a second attribute is used as a radius (a distance). The angle
+can be measured in degrees, radians, or can be scaled arbitrarily.
+%
+\begin{codeexample}[width=8.5cm]
+\tikz \datavisualization [
+ scientific polar axes={0 to pi, clean},
+ all axes=grid,
+ style sheet=vary hue,
+ legend=below
+ ]
+ [visualize as smooth line=sin,
+ sin={label in legend={text=$1+\sin \alpha$}}]
+ data [format=function] {
+ var angle : interval [0:pi];
+ func radius = sin(\value{angle}r) + 1;
+ }
+ [visualize as smooth line=cos,
+ cos={label in legend={text=$1+\cos\alpha$}}]
+ data [format=function] {
+ var angle : interval [0:pi];
+ func radius = cos(\value{angle}r) + 1;
+ };
+\end{codeexample}
+
+Most of the time, in order to create a polar axis system, you will just use the
+|scientific polar axes| key, which takes a number of options that allow you to
+configure the axis system in greater detail. This key is documented in
+Section~\ref{section-dv-sci-polar-axes}. Internally, this key uses more low
+level keys which are documented in the en suite sections.
+
+It is worthwhile to note that the axes of a polar axis system are, still,
+normal axes of the data visualization system. In particular, all the
+configurations possible for, say, Cartesian axes also apply to the ``angle
+axis'' and the ``radius axis'' of a polar axis system. For instance, you can
+could make both axes logarithmic or style their ticks:
+%
+\begin{codeexample}[]
+\tikz[baseline] \datavisualization [
+ scientific axes={clean},
+ x axis={attribute=angle, ticks={minor steps between steps=4}},
+ y axis={attribute=radius, ticks={some, style=red!80!black}},
+ all axes=grid,
+ visualize as smooth line=sin]
+ data [format=function] {
+ var t : interval [-3:3];
+ func angle = exp(\value t);
+ func radius = \value{t}*\value{t};
+ };
+\qquad
+\tikz[baseline] \datavisualization [
+ scientific polar axes={right half clockwise, clean},
+ angle axis={logarithmic,
+ ticks={
+ minor steps between steps=8,
+ major also at/.list={2,3,4,5,15,20}}},
+ radius axis={ticks={some, style=red!80!black}},
+ all axes=grid,
+ visualize as smooth line=sin]
+ data [format=function] {
+ var t : interval [-3:3];
+ func angle = exp(\value t);
+ func radius = \value{t}*\value{t};
+ };
+\end{codeexample}
+
+
+\subsection{Scientific Polar Axis System}
+\label{section-dv-sci-polar-axes}
+
+\begin{key}{/tikz/data visualization/scientific polar axes=\meta{options}}
+ This key installs a polar axis system that can be used in a ``scientific''
+ publication. Two axes are created called the |angle axis| and the
+ |radius axis|. Unlike ``normal'' Cartesian axes, these axes do not point in
+ a specific direction. Rather, the |radius axis| is used to map the values
+ of one attribute to a distance from the origin while the |angle axis| is
+ used to map the values of another attribute to a rotation angle.
+
+ The \meta{options} will be executed with the path prefix
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/scientific polar axes
+\end{codeexample}
+ %
+ The permissible keys are documented in the later subsections of this
+ section.
+
+ Let us start with the configuration of the radius axis since it is easier.
+ Firstly, you should specify which attribute is linked to the radius. The
+ default is |radius|, but you will typically wish to change this. As with
+ any other axis, the |attribute| key is used to configure the axis, see
+ Section~\ref{section-dv-axis-attribute} for details. You can also apply all
+ other configurations to the radius axis like, say, |unit length| or
+ |length| or |style|. Note, however, that the |logarithmic| key will not
+ work with the radius axis for a |scientific polar axes| system since the
+ attribute value zero is always placed at the center -- and for a
+ logarithmic plot the value |0| cannot be mapped.
+ %
+\begin{codeexample}[width=8.8cm]
+\tikz \datavisualization [
+ scientific polar axes,
+ radius axis={
+ attribute=distance,
+ ticks={step=5000},
+ padding=1.5em,
+ length=3cm,
+ grid
+ },
+ visualize as smooth line]
+data [format=function] {
+ var angle : interval [0:100];
+ func distance = \value{angle}*\value{angle};
+};
+\end{codeexample}
+
+ For the |angle axis|, you can also specify an attribute using the
+ |attribute| key. However, for this axis the mapping of a value to an actual
+ angle is a complicated process involving many considerations of how the
+ polar axis system should be visualized. For this reason, there are a large
+ number of predefined such mappings documented in
+ Section~\ref{section-dv-angle-ranges}. Finally, as for a |scientific plot|,
+ you can configure where the ticks should be shown using the keys
+ |inner ticks|, |outer ticks|, and |clean|, documented below.
+\end{key}
+
+
+\subsubsection{Tick Placements}
+
+\begin{key}{/tikz/data visualization/scientific polar axes/outer ticks}
+ This key, which is the default, causes ticks to be drawn ``outside'' the
+ outer ``ring'' of the polar axes:
+ %
+\begin{codeexample}[width=8.8cm]
+\tikz \datavisualization [
+ scientific polar axes={outer ticks, 0 to 180},
+ visualize as smooth line]
+data [format=function] {
+ var angle : interval [0:100];
+ func radius = \value{angle};
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/scientific polar axes/inner ticks}
+ This key causes the ticks to be ``turned to the inside''. I do not
+ recommend using this key.
+ %
+\begin{codeexample}[width=8.8cm]
+\tikz \datavisualization [
+ scientific polar axes={inner ticks, 0 to 180},
+ visualize as smooth line]
+data [format=function] {
+ var angle : interval [0:100];
+ func radius = \value{angle};
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/scientific polar axes/clean}
+ This key separates the area where the data is shown from the area where the
+ ticks are shown. Usually, this is the best choice for the tick placement
+ since it avoids a collision of data and explanations.
+ %
+\begin{codeexample}[width=8.8cm]
+\tikz \datavisualization [
+ scientific polar axes={clean, 0 to 180},
+ visualize as smooth line]
+data [format=function] {
+ var angle : interval [0:100];
+ func radius = \value{angle};
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Angle Ranges}
+\label{section-dv-angle-ranges}
+
+Suppose you create a polar plot in which the radius values vary between, say,
+$567$ and $1234$. Then the normal axis scaling mechanisms can be used to
+compute a good scaling for the ``radius axis'': Place the value $1234$ at a
+distance of , say, $5\,\mathrm{cm}$ from the origin and place the value $0$ at
+the origin. Now, by comparison, suppose that the values of the angle axis's
+attribute ranged between, say, $10$ and $75.7$. In this case, we may wish the
+angles to be scaled so that the minimum value is horizontal and the maximum
+value is vertical. But we may also wish the a value of $0$ is horizontal and a
+value of $90$ is vertical.
+
+Since it is unclear which interpretation is the right one, you have to use an
+option to select which should happen. The applicable options fall into three
+categories:
+%
+\begin{itemize}
+ \item Options that request the scaling to be done in such a way that the
+ attribute is interpreted as a value in degrees and such that the
+ minimum and maximum of the depicted range is a multiple of $90^\circ$.
+ For instance, the option |0 to 180| causes the angle axis to range from
+ $0^\circ$ to $180^\circ$, independently of the actual range of the
+ values.
+ \item Options that work as above, but use radians rather than degrees. An
+ example is the option |0 to pi|.
+ \item Options that map the minimum value in the data to a horizontal or
+ vertical line and the maximum value to another such line. This is
+ useful when the values neither directly correspond to degrees or
+ radians. In this case, the angle axis may also be a logarithmic axis.
+\end{itemize}
+
+In addition to the above categories, all of the option documented in the
+following implicitly also select quadrants that are used to depict the data.
+For instance, the |0 to 90| key and also the |0 to pi half| key setup the polar
+axis system in such a way that only first (upper right) quadrant is used. No
+check is done whether the data fill actually lie in this quadrant -- if it does
+not, the data will ``bleed outside'' the range. Naturally, with a key like
+|0 to 360| or |0 to 2pi| this cannot happen.
+
+In order to save some space in this manual, in the following the different
+possible keys are only given in a table together with a small example for each
+key. The examples were created using the following code:
+%
+\begin{codeexample}[]
+\tikz \datavisualization [
+ scientific polar axes={
+ clean,
+ 0 to 90 % the option
+ },
+ angle axis={ticks={step=30}},
+ radius axis={length=1cm, ticks={step=1}},
+ visualize as scatter]
+data point [angle=20, radius=0.5]
+data point [angle=30, radius=1]
+data point [angle=40, radius=1.5];
+\end{codeexample}
+
+For the options on radians, the angle values have been replaced by |0.2|,
+|0.3|, and |0.4| and the stepping has been changed by setting |step=(pi/6)|.
+For the quadrant options, no stepping is set at all (it is computed
+automatically).
+
+\def\polarexample#1#2#3#4#5{%
+ \texttt{#1}%
+ \indexkey{/tikz/data visualization/scientific polar axes/#1}&
+ \tikz [baseline]{\path(-2.25cm,0)(2.25cm,0); \datavisualization [
+ scientific polar axes={clean, #1},
+ angle axis={ticks={#2}},
+ radius axis={length=1cm, ticks={step=1}},
+ visualize as scatter
+ ]
+ data point [angle=#3, radius=0.5]
+ data point [angle=#4, radius=1]
+ data point [angle=#5, radius=1.5];
+ \path ([yshift=-1em]current bounding box.south);
+ }&
+ \tikz [baseline]{\path(-2.25cm,0)(2.25cm,0); \datavisualization [
+ scientific polar axes={outer ticks, #1},
+ angle axis={ticks={#2}},
+ radius axis={length=1cm, ticks={step=1}},
+ visualize as scatter
+ ]
+ data point [angle=#3, radius=0.5]
+ data point [angle=#4, radius=1]
+ data point [angle=#5, radius=1.5];
+ \path ([yshift=-1em]current bounding box.south);
+ }
+ \\
+}
+
+\begin{tabular}{lcc}
+ \emph{Option} & \emph{With clean ticks} & \emph{With outer ticks} \\
+ \polarexample{0 to 90}{step=30}{20}{30}{40}
+ \polarexample{-90 to 0}{step=30}{20}{30}{40}
+ \polarexample{0 to 180}{step=30}{20}{30}{40}
+ \polarexample{-90 to 90}{step=30}{20}{30}{40}
+ \polarexample{0 to 360}{step=30}{20}{30}{40}
+ \polarexample{-180 to 180}{step=30}{20}{30}{40}
+\end{tabular}
+
+\begin{tabular}{lcc}
+ \emph{Option} & \emph{With clean ticks} & \emph{With outer ticks} \\
+ \polarexample{0 to pi half}{step=(pi/6)}{0.2}{0.3}{0.4}
+ \polarexample{-pi half to 0}{step=(pi/6)}{0.2}{0.3}{0.4}
+ \polarexample{0 to pi}{step=(pi/6)}{0.2}{0.3}{0.4}
+ \polarexample{-pi half to pi half}{step=(pi/6)}{0.2}{0.3}{0.4}
+ \polarexample{0 to 2pi}{step=(pi/6)}{0.2}{0.3}{0.4}
+ \polarexample{-pi to pi}{step=(pi/6)}{0.2}{0.3}{0.4}
+\end{tabular}
+
+\begin{tabular}{lcc}
+ \emph{Option} & \emph{With clean ticks} & \emph{With outer ticks} \\
+ \polarexample{quadrant}{}{20}{30}{40}
+ \polarexample{quadrant clockwise}{}{20}{30}{40}
+ \polarexample{fourth quadrant}{}{20}{30}{40}
+ \polarexample{fourth quadrant clockwise}{}{20}{30}{40}
+ \polarexample{upper half}{}{20}{30}{40}
+ \polarexample{upper half clockwise}{}{20}{30}{40}
+ \polarexample{lower half}{}{20}{30}{40}
+ \polarexample{lower half clockwise}{}{20}{30}{40}
+\end{tabular}
+
+\begin{tabular}{lcc}
+ \emph{Option} & \emph{With clean ticks} & \emph{With outer ticks} \\
+ \polarexample{left half}{}{20}{30}{40}
+ \polarexample{left half clockwise}{}{20}{30}{40}
+ \polarexample{right half}{}{20}{30}{40}
+ \polarexample{right half clockwise}{}{20}{30}{40}
+\end{tabular}
+
+
+\subsection{Advanced: Creating a New Polar Axis System}
+
+\begin{key}{/tikz/data visualization/new polar axes=|\char`\{|\meta{angle axis name}|\char`\}||\char`\{|\meta{radius axis name}|\char`\}|}
+ This key actually creates two axes, whose names are give as parameters: An
+ \emph{angle axis} and a \emph{radius axis}. These two axes work in concert
+ in the following way: Suppose a data point has two attributes called
+ |angle| and |radius| (these attribute names can be changed by changing the
+ |attribute| of the \meta{angle axis name} or the \meta{radius axis name},
+ respectively). These two attributes are then scaled as usual, resulting in
+ two ``reasonable'' values $a$ (for the angle) and $r$ (for the radius).
+ Then, the data point gets visualized (in principle, details will follow) at
+ a position on the page that is at a distance of $r$ from the origin and at
+ an angle of~$a$.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [new polar axes={angle axis}{radius axis},
+ radius axis={length=2cm},
+ visualize as scatter]
+ data [format=named] {
+ angle={0,20,...,160}, radius={0,...,5}
+ };
+\end{codeexample}
+ %
+ In detail, the \meta{angle axis} keeps track of two vectors $v_0$ and
+ $v_{90}$, each of which will usually have unit length (length |1pt|) and
+ which point in two different directions. Given a radius $r$ (measured in
+ \TeX\ |pt|s, so if the radius attribute |10pt|, then $r$ would be $10$) and
+ an angle $a$, let $s$ be the sine of $a$ and let $c$ be the cosine of $a$,
+ where $a$ is a number is degrees (so $s$ would be $1$ for $a = 90$). Then,
+ the current page position is shifted by $c \cdot r$ times $v_0$ and,
+ additionally, by $s \cdot r$ times $v_{90}$. This means that in the ``polar
+ coordinate system'' $v_0$ is the unit vector along the ``$0^\circ$-axis''
+ and $v_{90}$ is the unit vector along ``$90^\circ$-axis''. The values of
+ $v_0$ and $v_{90}$ can be changed using the following key on the
+ \meta{angle axis}:
+ %
+ \begin{key}{/tikz/data visualization/axis options/unit vectors=%
+ |\char`\{|\meta{unit vector 0 degrees}|\char`\}\char`\{|\meta{unit vector 90 degrees}|\char`\}|
+ (initially {\char`\{(1pt,0pt)\char`\}\char`\{(0pt,1pt)\char`\}})%
+ }
+ Both the \meta{unit vector 0 degrees} and the \meta{unit vector 90 degrees}
+ are \tikzname\ coordinates:
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [new polar axes={angle axis}{radius axis},
+ radius axis={unit length=1cm},
+ angle axis={unit vectors={(10:1pt)}{(60:1pt)}},
+ visualize as scatter]
+ data [format=named] {
+ angle={0,90}, radius={0.25,0.5,...,2}
+ };
+\end{codeexample}
+ \end{key}
+\end{key}
+
+Once created, the |angle axis| can be scaled conveniently using the following
+keys:
+
+\begin{key}{/tikz/data visualization/axis options/degrees}
+ When this key is passed to the angle axis of a polar axis system, it sets
+ up the scaling so that a value of |360| on this axis corresponds to a
+ complete circle.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [new polar axes={angle axis}{radius axis},
+ radius axis={unit length=1cm},
+ angle axis={degrees},
+ visualize as scatter]
+ data [format=named] {
+ angle={10,90}, radius={0.25,0.5,...,2}
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/axis options/radians}
+ In contrast to |degrees|, this option sets up things so that a value of
+ |2*pi| on this axis corresponds to a complete circle.
+ %
+\begin{codeexample}[]
+\tikz \datavisualization
+ [new polar axes={angle axis}{radius axis},
+ radius axis={unit length=1cm},
+ angle axis={radians},
+ visualize as scatter]
+ data [format=named] {
+ angle={0,1.5}, radius={0.25,0.5,...,2}
+ };
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-stylesheets.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-stylesheets.tex
new file mode 100644
index 0000000000..0e162cc1c3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-stylesheets.tex
@@ -0,0 +1,2478 @@
+% Copyright 2010 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Style Sheets and Legends}
+\label{section-dv-style-sheets}
+
+\subsection{Overview}
+
+In many data visualizations, different sets of data need to be visualized in a
+single visualization. For instance, in a plot there might be a line for the
+sine of~$x$ and another line for the cosine of~$x$; in another visualization
+there might be a set of points representing data from a first experiment and
+another set of points representing data from a second experiment; and so on. In
+order to indicate to which data set a data point belongs, one might plot the
+curve of the sine in, say, black, and the curve of the cosine in red; we might
+plot the data from the fist experiment using stars and the data from the second
+experiment using circles; and so on. Finally, at some place in the
+visualization -- either inside the data or in a legend next to it -- the
+meaning of the colors or symbols need to be explained.
+
+Just as you would like \tikzname\ to map the data points automatically onto the
+axes, you will also typically wish \tikzname\ to choose for instance the
+coloring of the lines automatically for you. This is done using \emph{style
+sheets}. There are at least two good reasons why you should prefer style sheets
+over configuring the styling of each visualizer ``by hand'' using the |style|
+key:
+%
+\begin{enumerate}
+ \item It is far more convenient to just say |style sheet=strong colors|
+ than having to individually picking the different colors.
+ \item The style sheets were chosen and constructed rather carefully.
+
+ For instance, the |strong colors| style sheet does not pick colors like
+ pure green or pure yellow, which have very low contrast with respect to
+ a white background and which often lead to unintelligible graphics.
+ Instead, opposing primary colors with maximum contrast on a white
+ background were picked that are visually quite pleasing.
+
+ Similarly, the different dashing style sheets are constructed in such a
+ way that there are only few and small gaps in the dashing so that no
+ data points get lost because the dashes are spaced too far apart. Also
+ dashing patterns were chosen that have a maximum optical difference.
+
+ As a final example, style sheets for plot marks are constructed in such
+ a way that even when two plot marks lie directly on top of each other,
+ they are still easily distinguishable.
+\end{enumerate}
+%
+The bottom line is that whenever possible, you should use one of the predefined
+style sheets rather than picking colors or dashings at random.
+
+
+\subsection{Concepts: Style Sheets}
+
+A \emph{style sheet} is a predefined list of styles such as a list of colors, a
+list of dashing pattern, a list of plot marks, or a combinations thereof. A
+style sheet can be \emph{attached} to a data point attribute. Then, the value
+of this attribute is used with data points to choose which style in the list
+should be chosen to visualize the data point.
+
+In most cases, there is just one attribute to which style sheets get attached:
+the |/data point/visualizer| attribute. The effect of attaching a style sheet
+to this attribute is that each visualizer is styled differently.
+
+For the following examples, let us first define a simple data set:
+%
+\begin{codeexample}[]
+\tikz \datavisualization data group {function classes} = {
+ data [set=log, format=function] {
+ var x : interval [0.2:2.5];
+ func y = ln(\value x);
+ }
+ data [set=lin, format=function] {
+ var x : interval [-2:2.5];
+ func y = 0.5*\value x;
+ }
+ data [set=squared, format=function] {
+ var x : interval [-1.5:1.5];
+ func y = \value x*\value x;
+ }
+ data [set=exp, format=function] {
+ var x : interval [-2.5:1];
+ func y = exp(\value x);
+ }
+};
+\end{codeexample}
+
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ school book axes, all axes={unit length=7.5mm},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ school book axes, all axes={unit length=7.5mm},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+
+
+\subsection{Concepts: Legends}
+\label{section-dv-labels-in}
+
+A \emph{legend} is a box that is next to a data visualization (or inside it at
+some otherwise empty position) that contains a textual explanation of the
+different colors or styles used in a data visualization.
+
+Just as it is difficult to get colors and dashing patterns right ``by hand'',
+it is also difficult to get a legend right. For instance, when a small line is
+shown in the legend that represents the actual line in the data visualization,
+if the line is too short and the dashing is too large, it may be impossible to
+discern which dashing is actually meant. Similarly, when plot marks are shown
+on such a short line, using a simple straight line may make it hard to read the
+plot marks correctly.
+
+The data visualization engine makes some effort to make it easy to create
+high-quality legends. Additionally, it also offers ways of easily adding labels
+for visualizers directly inside the data visualization, which is even better
+than adding a legend, in general.
+%
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ school book axes, all axes={unit length=7.5mm},
+ x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ school book axes,
+ x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ every data set label/.append style={text colored},
+ log= {pin in data={text'=$\log x$, when=y is -1}},
+ lin= {pin in data={text=$x/2$, when=x is 2,
+ pin length=1ex}},
+ squared={pin in data={text=$x^2$, when=x is 1.1,
+ pin angle=230}},
+ exp= {label in data={text=$e^x$, when=x is -2}},
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+
+
+\subsection{Usage: Style Sheets}
+
+\subsubsection{Picking a Style Sheet}
+
+To use a style sheet, you need to \emph{attach} it to an attribute. You can
+attach multiple style sheets to an attribute and in this case all of these
+style sheets can influence the appearance of the data points.
+
+Most of the time, you will attach a style sheet to the |set| attribute. This
+has the effect that each different data set inside the same visualization is
+rendered in a different way. Since this use of style sheets is the most common,
+there is a special, easy-to-remember option for this:
+
+\begin{key}{/tikz/data visualization/style sheet=\meta{style sheet}}
+ Adds the \meta{style sheet} to the list of style sheets attached to the
+ |set| attribute.
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ school book axes, all axes={unit length=7.5mm},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ style sheet=vary thickness and dashing,
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+While the |style sheet| key will attach a style sheet only to the |set|
+attribute, the following key handler can be used to attach a style sheet to an
+arbitrary attribute:
+
+\begin{handler}{{.style sheet}=\meta{style sheet}}
+ Inside a data visualization you can use this key handler together with an
+ attribute, that is, with a key having the path prefix |/data point|. For
+ instance, in order to attach the \meta{style sheet} |strong colors| to the
+ attribute |set|, you could write
+ %
+\begin{codeexample}[code only]
+/data point/set/.style sheet=strong colors
+\end{codeexample}
+ %
+ Indeed, the |style sheet| key is just a shorthand for the above.
+
+ The effect of attaching a style sheet is the following:
+ %
+ \begin{itemize}
+ \item A new object is created that will monitor the attribute.
+ \item Each time a special \emph{styling key} is emitted by the data
+ visualization engine, this object will inspect the current value of
+ the attribute to which it is attached.
+ \item Depending on this value, one of the styles stored in the style
+ sheet is chosen (how this works, exactly, will be explained in a
+ moment).
+ \item The chosen style is then locally applied.
+ \end{itemize}
+
+ In reality, things are a bit more complicated: If the attribute of the data
+ point happens to have a subkey named in the same way as the value, then the
+ value of is this subkey is used instead of the value itself. This allows
+ you to ``rename'' a value.
+
+ In a sense, a style sheet behaves much like a visualizer (see
+ Section~\ref{section-dv-visualizers}): In accordance with the value of a
+ certain attribute, the appearance of data points change. However, there are
+ a few differences: First, the styling of a data point needs to be triggered
+ explicitly and this triggering is not necessarily done for each data point
+ individually, but only for a whole visualizer. Second, styles can be
+ computed even when no data point is present. This is useful for instance in
+ a legend since, here, a visual representation of a visualizer needs to be
+ created independently of the actual data points.
+\end{handler}
+
+
+\subsubsection{Creating a New Style Sheet}
+
+Creating a style sheet works as follows: For each possible value that an
+attribute can attain we must specify a style. This is done by creating a style
+key for each such possible value with a special path prefix and setting this
+style key to the desired value. The special path prefix is
+|/pgf/data visualization/style sheets| followed by the name of the style sheet.
+
+As an example, suppose we wish to create a style sheet |test| that makes styled
+data points |red| when the attribute has value |foo| and |green| when the
+attribute has value |bar| and |dashed, blue| when the attribute is |foobar|. We
+could then write
+%
+\begin{codeexample}[code only]
+/pgf/data visualization/style sheets/test/foo/.style={red},
+/pgf/data visualization/style sheets/test/bar/.style={green},
+/pgf/data visualization/style sheets/test/foobar/.style={dashed, blue},
+\end{codeexample}
+
+We could then attach this style sheet to the attribute |code| as follows:
+%
+\begin{codeexample}[code only]
+/data point/code/.style sheet=test
+\end{codeexample}
+
+Then, when |/data point/code=foobar| holds when the styling signal is raised,
+the style |dashed, blue| will get executed.
+
+A natural question arises concerning the situation that the value of the
+attribute is not defined as a subkey of the style sheet. In this case, a
+special key gets executed:
+
+\begin{stylekey}{/pgf/data visualization/style sheets/\meta{style sheet}/default style=\meta{value}}
+ This key gets during styling whenever
+ |/pgf/data visualization/style sheet/|\meta{style sheet}|/|\meta{value} is
+ not defined.
+\end{stylekey}
+
+Let us put all of this together in a real-life example. Suppose we wish to
+create a style sheet that makes the first data set |green|, the second |yellow|
+and the third one |red|. Further data sets should be, say, |black|. The
+attribute that we intend to style is the |set| attribute. For the moment, we
+assume that the data sets will be named |1|, |2|, |3|, and so on (instead of,
+say, |experiment 1| or |sin| or something more readable -- we will get rid of
+this restriction in a minute).
+
+We would now write:
+%
+\begin{codeexample}[]
+\pgfkeys{
+ /pgf/data visualization/style sheets/traffic light/.cd,
+ % All these styles have the above prefix.
+ 1/.style={green!50!black},
+ 2/.style={yellow!90!black},
+ 3/.style={red!80!black},
+ default style/.style={black}
+}
+\tikz \datavisualization [
+ school book axes,
+ visualize as line=1,
+ visualize as line=2,
+ visualize as line=3,
+ style sheet=traffic light]
+data point [x=0, y=0, set=1]
+data point [x=2, y=2, set=1]
+data point [x=0, y=1, set=2]
+data point [x=2, y=1, set=2]
+data point [x=0.5, y=1.5, set=3]
+data point [x=2.25, y=1.75, set=3];
+\end{codeexample}
+
+In the above example, we have to name the visualizers |1|, |2|, |3| and so one
+since the value of the |set| attribute is used both assign data points to
+visualizers and also pick a style sheet. However, it would be much nicer if we
+could name any way we want. To achieve this, we use the special rule for style
+sheets that says that if there is a subkey of an attribute whose name is the
+same name as the value, then the value of this key is used instead. This
+slightly intimidating definition is much easier to understand when we have a
+look at an example:
+%
+\pgfkeys{
+ /pgf/data visualization/style sheets/traffic light/.cd,
+ % All these styles have the above prefix.
+ 1/.style={green!50!black},
+ 2/.style={yellow!90!black},
+ 3/.style={red!80!black},
+ default style/.style={black}
+}
+\begin{codeexample}[]
+% Definition of traffic light keys as above
+\begin{tikzpicture}
+ \datavisualization data group {lines} = {
+ data point [x=0, y=0, set=normal]
+ data point [x=2, y=2, set=normal]
+ data point [x=0, y=1, set=heated]
+ data point [x=2, y=1, set=heated]
+ data point [x=0.5, y=1.5, set=critical]
+ data point [x=2.25, y=1.75, set=critical]
+ };
+ \datavisualization [
+ school book axes,
+ visualize as line=normal,
+ visualize as line=heated,
+ visualize as line=critical,
+ /data point/set/normal/.initial=1,
+ /data point/set/heated/.initial=2,
+ /data point/set/critical/.initial=3,
+ style sheet=traffic light]
+ data group {lines};
+\end{tikzpicture}
+\end{codeexample}
+
+Now, it is a bit bothersome that we have to set all these |/data point/set/...|
+keys by hand. It turns out that this is not necessary: Each time a visualizer
+is created, a subkey of |/data point/set| with the name of the visualizer is
+created automatically and a number is stored that is increased for each new
+visualizer in a data visualization. This means that the three lines starting
+with |/data point| are inserted automatically for you, so they can be left out.
+However, you would need them for instance when you would like several different
+data sets to use the same styling:
+%
+\begin{codeexample}[]
+% Definition of traffic light keys as above
+\tikz \datavisualization [
+ school book axes,
+ visualize as line=normal,
+ visualize as line=heated,
+ visualize as line=critical,
+ /data point/set/critical/.initial=1, % same styling as first set
+ style sheet=traffic light]
+data group {lines};
+\end{codeexample}
+
+We can a command that slightly simplifies the definition of style sheets:
+
+\begin{command}{\pgfdvdeclarestylesheet\marg{name}\marg{keys}}
+ This command executes the \meta{keys} with the path prefix
+ |/pgf/data visualization/style sheets/|\penalty0\meta{name}. The above
+ definition of the traffic light style sheet could be rewritten as follows:
+ %
+\begin{codeexample}[code only]
+\pgfdvdeclarestylesheet{traffic light}{
+ 1/.style={green!50!black},
+ 2/.style={yellow!90!black},
+ 3/.style={red!80!black},
+ default style/.style={black}
+}
+\end{codeexample}
+ %
+\end{command}
+
+As a final example, let us create a style sheet that changes the dashing
+pattern according to the value of the attribute. We do not need to define an
+large number of styles in this case, but can use the |default style| key to
+``calculate'' the correct dashing.
+
+\begin{codeexample}[]
+\pgfdvdeclarestylesheet{my dashings}{
+ default style/.style={dash pattern={on #1pt off 1pt}}
+}
+\tikz \datavisualization [
+ school book axes,
+ visualize as line=normal,
+ visualize as line=heated,
+ visualize as line=critical,
+ style sheet=my dashings]
+data group {lines};
+\end{codeexample}
+
+
+\subsubsection{Creating a New Color Style Sheet}
+
+Creating a style sheet that varies colors according to an attribute works the
+same way as creating a normal style sheet: Subkeys lies |1|, |2|, and so on use
+the |style| attribute to setup a color. However, instead of using the |color|
+attribute to set the color, you should use the |visualizer color| key to set
+the color:
+
+\begin{key}{/tikz/visualizer color=\meta{color}}
+ This key is used to set the color |visualizer color| to \meta{color}. This
+ color is used by visualizers to color the data they visualize, rather than
+ the current ``standard color''. The reason for not using the normal current
+ color is simply that it makes many internals of the data visualization
+ engine a bit simpler.
+ %
+\begin{codeexample}[]
+\pgfdvdeclarestylesheet{my colors}
+{
+ default style/.style={visualizer color=black},
+ 1/.style={visualizer color=black},
+ 2/.style={visualizer color=red!80!black},
+ 3/.style={visualizer color=blue!80!black},
+}
+\tikz \datavisualization [
+ school book axes,
+ visualize as line=normal,
+ visualize as line=heated,
+ visualize as line=critical,
+ style sheet=my colors]
+data group {lines};
+\end{codeexample}
+ %
+\end{key}
+
+There is an additional command that makes it easy to define a style sheet based
+on a \emph{color series}. Color series are a concept from the |xcolor| package:
+The idea is that we start with a certain color for the first data set and then
+add a certain ``color offset'' for each next data point. Please consult the
+documentation of the |xcolor| package for details.
+
+\begin{command}{\tikzdvdeclarestylesheetcolorseries\marg{name}\marg{color model}\marg{initial color}\marg{step}}
+ This command creates a new style sheet using |\pgfdvdeclarestylesheet|.
+ This style sheet will only have a default style setup that maps numbers to
+ the color in the color series starting with \meta{initial color} and having
+ a stepping of \meta{step}. Note that when the value of the attribute is
+ |1|, which it is the first data set, the \emph{second} color in the color
+ series is used (since counting starts at |0| for color series). Thus, in
+ general, you need to start the \meta{initial color} ``one early''.
+ %
+\begin{codeexample}[]
+\tikzdvdeclarestylesheetcolorseries{greens}{hsb}{0.3,1.3,0.8}{0,-.4,-.1}
+\tikz \datavisualization [
+ school book axes,
+ visualize as line=normal,
+ visualize as line=heated,
+ visualize as line=critical,
+ style sheet=greens]
+data group {lines};
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Reference: Style Sheets for Lines}
+
+The following style sheets can be applied to visualizations that use the
+|visualize as line| and related keys. For the examples, the following style and
+data set are used:
+%
+\begin{codeexample}[code only]
+\tikzdatavisualizationset {
+ example visualization/.style={
+ scientific axes=clean,
+ y axis={ticks={style={
+ /pgf/number format/fixed,
+ /pgf/number format/fixed zerofill,
+ /pgf/number format/precision=2}}},
+ x axis={ticks={tick suffix=${}^\circ$}},
+ 1={label in legend={text=$\frac{1}{6}\sin 11x$}},
+ 2={label in legend={text=$\frac{1}{7}\sin 12x$}},
+ 3={label in legend={text=$\frac{1}{8}\sin 13x$}},
+ 4={label in legend={text=$\frac{1}{9}\sin 14x$}},
+ 5={label in legend={text=$\frac{1}{10}\sin 15x$}},
+ 6={label in legend={text=$\frac{1}{11}\sin 16x$}},
+ 7={label in legend={text=$\frac{1}{12}\sin 17x$}},
+ 8={label in legend={text=$\frac{1}{13}\sin 18x$}}
+ }
+}
+\end{codeexample}
+\tikzdatavisualizationset {
+ example visualization/.style={
+ scientific axes=clean,
+ y axis={ticks={style={
+ /pgf/number format/fixed,
+ /pgf/number format/fixed zerofill,
+ /pgf/number format/precision=2}}},
+ x axis={ticks={tick suffix=${}^\circ$}},
+ 1={label in legend={text=$\frac{1}{6}\sin 11x$}},
+ 2={label in legend={text=$\frac{1}{7}\sin 12x$}},
+ 3={label in legend={text=$\frac{1}{8}\sin 13x$}},
+ 4={label in legend={text=$\frac{1}{9}\sin 14x$}},
+ 5={label in legend={text=$\frac{1}{10}\sin 15x$}},
+ 6={label in legend={text=$\frac{1}{11}\sin 16x$}},
+ 7={label in legend={text=$\frac{1}{12}\sin 17x$}},
+ 8={label in legend={text=$\frac{1}{13}\sin 18x$}}
+ }
+}
+
+\begin{codeexample}[code only]
+\tikz \datavisualization data group {sin functions} = {
+ data [format=function] {
+ var set : {1,...,8};
+ var x : interval [0:50];
+ func y = sin(\value x * (\value{set}+10))/(\value{set}+5);
+ }
+};
+\end{codeexample}
+\tikz \datavisualization data group {sin functions} = {
+ data [format=function] {
+ var set : {1,...,8};
+ var x : interval [0:50];
+ func y = sin(\value x * (\value{set}+10))/(\value{set}+5);
+ }
+};
+
+\begin{stylesheet}{vary thickness}
+ This style varies the thickness of lines. It should be used only when there
+ are only two or three lines, and even then it is not particularly pleasing
+ visually.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=vary thickness]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+\begin{stylesheet}{vary dashing}
+ This style varies the dashing of lines. Although it is not particularly
+ pleasing visually and although visualizations using this style sheet tend
+ to look ``excited'' (but not necessarily ``exciting''), this style sheet is
+ often the best choice when the visualization is to be printed in black and
+ white.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=vary dashing]
+data group {sin functions};
+\end{codeexample}
+ %
+ As can be seen, there are only seven distinct dashing patterns. The eighth
+ and further lines will use a solid line once more. You will then have to
+ specify the dashing ``by hand'' using the |style| option together with the
+ visualizer.
+\end{stylesheet}
+
+\begin{stylesheet}{vary dashing and thickness}
+ This style alternates between varying the thickness and the dashing of
+ lines. The difference to just using both the |vary thickness| and
+ |vary dashing| is that too thick lines are avoided. Instead, this style
+ creates clearly distinguishable line styles for many lines (up to 14) with
+ a minimum of visual clutter. This style is the most useful for
+ visualizations when many different lines (ten or more) should be printed in
+ black and white.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=vary thickness
+ and dashing]
+data group {sin functions};
+\end{codeexample}
+ %
+ For comparison, here is the must-less-than-satisfactory result of combining
+ the two independent style sheets:
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=vary thickness,
+ style sheet=vary dashing]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+
+\subsection{Reference: Style Sheets for Scatter Plots}
+
+The following style sheets can be used both for scatter plots and also with
+lines. In the latter case, the marks are added to the lines.
+
+\begin{stylesheet}{cross marks}
+ This style uses different crosses to distinguish between the data points of
+ different data sets. The crosses were chosen in such a way that when two
+ different cross marks lie at the same coordinate, their overall shape
+ allows one to still uniquely determine which marks are on top of each
+ other.
+
+ This style supports only up to six different data sets and requires the
+ |plotmarks| library.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as scatter/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=cross marks]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=cross marks]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+
+\subsection{Reference: Color Style Sheets}
+
+Color style sheets are very useful for creating visually pleasing data
+visualizations that contain multiple data sets. However, there are two things
+to keep in mind:
+%
+\begin{itemize}
+ \item At some point, every data visualization is printed or photo copied in
+ black and white by someone. In this case, data sets can often no longer
+ be distinguished.
+ \item A few people are color blind. They will not be able to distinguish
+ between red and green lines (and some people are not even able to
+ distinguish colors at all).
+\end{itemize}
+
+For these reasons, if there is any chance that the data visualization will be
+printed in black and white at some point, consider combining color style sheets
+with style sheets like |vary dashing| to make data sets distinguishable in all
+situations.
+
+\begin{stylesheet}{strong colors}
+ This style sheets uses pure primary colors that can very easily be
+ distinguished. Although not as visually pleasing as the |vary hue| style
+ sheet, the visualizations are easier to read when this style sheet is used.
+ Up to six different data sets are supported.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=strong colors]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=strong colors,
+ style sheet=vary dashing]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+
+Unlike |strong colors|, the following style sheets support, in principle, an
+unlimited number of data set. In practice, as always, more than four or five
+data sets lead to nearly indistinguishable data sets.
+
+\begin{stylesheet}{vary hue}
+ This style uses a different hue for each data set.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=vary hue]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+\begin{stylesheet}{shades of blue}
+ As the name suggests, different shades of blue are used for different data
+ sets.
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=shades of blue]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+\begin{stylesheet}{shades of red}
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=shades of red]
+data group {sin functions};
+\end{codeexample}
+\end{stylesheet}
+
+\begin{stylesheet}{gray scale}
+ For once, this style sheet can also be used when the visualization is
+ printed in black and white.
+ %
+\begin{codeexample}[width=10cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list=
+ {1,2,3,4,5,6,7,8},
+ example visualization,
+ style sheet=gray scale]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{stylesheet}
+
+
+\subsection{Usage: Labeling Data Sets Inside the Visualization}
+
+In a visualization that contains multiple data sets, it is often necessary to
+clearly point out which line or mark type corresponds to which data set. This
+can be done in the main text via a sentence like ``the normal data (black) lies
+clearly below the critical values (red)'', but it often a good idea to indicate
+data sets ideally directly inside the data visualization or directly next to it
+in a so-called legend.
+
+The data visualization engine has direct support both for indicating data sets
+directly inside the visualization and also for indicating them in a legend.
+
+The ``best'' way of indicating where a data set lies or which color is used for
+it is to put a label directly inside the data visualization. The reason this is
+the ``best'' way is that people do not have to match the legend entries against
+the data, let alone having to look up the meaning of line styles somewhere in
+the text. However, adding a label directly inside the visualization is also the
+most tricky way of indicating data sets since it is hard to compute good
+positions for the labels automatically and since there needs to be some empty
+space where the label can be put.
+
+
+\subsubsection{Placing a Label Next to a Data Set}
+
+The following key is used to create a label inside the data visualization for a
+data set:
+
+\begin{key}{/tikz/data visualization/visualizer options/label in data=\meta{options}}
+ This key is passed to a visualizer that has previously been created using
+ keys starting |visualize as ...|. It will create a label inside the data
+ visualization ``next'' to the visualizer (the details are explained in a
+ moment). You can use this key multiple times with a visualizer to create
+ multiple labels at different points with different texts.
+
+ The \meta{options} determine which text is shown and where it is shown.
+ They are executed with the following path prefix:
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/visualizer label options
+\end{codeexample}
+
+ In order to configure which text is shown and where, use the following keys
+ inside the \meta{options}:
+
+ \begin{key}{/tikz/data visualization/visualizer label options/text=\meta{text}}
+ This is the text that will be displayed next to the data. It will be to
+ the ``left'' of the data, see the description below.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/text'=\meta{text}}
+ Like |text|, only the text will be to the ``right'' of the data.
+ \end{key}
+
+ The following keys are used to configure where the label will be shown.
+ They use different strategies to specify one data point where the label
+ will be anchored. The coordinate of this data point will be stored in
+ |(label| |visualizer| |coordinate)|. Independently of the strategy, once
+ the data point has been chosen, the coordinate of the next data point is
+ stored in |(label| |visualizer| |coordinate')|. Then, a (conceptual) line
+ is created from the first coordinate to the second and a node is placed at
+ the beginning of this line to its ``left'' or, for the |text'| option, on
+ its ``right''. More precisely, an automatic anchor is computed for a node
+ placed implicitly on this line using the |auto| option or, for the |text'|
+ option, using |auto,swap|.
+
+ The node placed at the position computed in this way will have the
+ \meta{text} set by the |text| or |text'| option and its styling is
+ determined by the current |node style|.
+
+ Let us now have a look at the different ways of determining the data point
+ at which the label in anchored:
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/when=\meta{attribute}| is|\meta{number}}
+ This key causes the value of the \meta{attribute} to be monitored in
+ the stream of data points. The chosen is data point is the first data
+ point where the \meta{attribute} is at least \meta{number} (if this
+ never happens, the last data point is used).
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ school book axes,
+ x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ log= {label in data={text'=$\log x$, when=y is -1,
+ text colored}},
+ lin= {label in data={text=$x/2$, when=x is 2}},
+ squared={label in data={text=$x^2$, when=x is 1.1}},
+ exp= {label in data={text=$e^x$, when=x is -2,
+ text colored}},
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/index=\meta{number}}
+ This key chooses the \meta{number}th data point belonging to the
+ visualizer's data set.
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ school book axes,
+ x axis={label=$x$},
+ visualize as smooth line/.list={exp},
+ exp= {label in data={text=$5$, index=5},
+ label in data={text=$10$, index=10},
+ label in data={text=$20$, index=20},
+ style={mark=x}},
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/pos=\meta{fraction}}
+ This key chooses the first data point belonging to the data set whose
+ index is at least \meta{fraction} times the number of all data points
+ in the data set.
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ school book axes,
+ x axis={label=$x$},
+ visualize as smooth line=exp,
+ exp= {label in data={text=$.2$, pos=0.2},
+ label in data={text=$.5$, pos=0.5},
+ label in data={text=$.95$, pos=0.95},
+ style={mark=x}},
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/auto}
+ This key is executed automatically by default. It works like the |pos|
+ option, where the \meta{fraction} is set to $(\meta{data set's
+ index}-1/2)/\meta{number of data sets}$. For instance, when there are
+ $10$ data sets, the fraction for the first one will be $5\%$, the
+ fraction for the second will be $15\%$, for the third it will be
+ $25\%$, ending with $95\%$ for the last one.
+
+ The net effect of all this is that when there are several lines, labels
+ will be placed at different positions along the lines with hopefully
+ only little overlap.
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ scientific axes=clean,
+ visualize as smooth line/.list={linear, squared, cubed},
+ linear ={label in data={text=$2x$}},
+ squared={label in data={text=$x^2$}},
+ cubed ={label in data={text=$x^3$}}]
+data [set=linear, format=function] {
+ var x : interval [0:1.5];
+ func y = 2*\value x;
+}
+data [set=squared, format=function] {
+ var x : interval [0:1.5];
+ func y = \value x * \value x;
+}
+data [set=cubed, format=function] {
+ var x : interval [0:1.5];
+ func y = \value x * \value x * \value x;
+};
+\end{codeexample}
+ %
+ As can be seen in the example, the result is not always satisfactory.
+ In this case, the |pin in data| option might be preferable, see below.
+ \end{key}
+
+ The following keys allow you to style labels.
+
+ \begin{key}{/tikz/data visualization/visualizer label options/node style=\meta{options}}
+ Just passes the options to |/tikz/data visualization/node style|.
+ \end{key}
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/text colored}
+ Causes the |node style| to set the text color to |visualizer color|.
+ The effect of this is that the label's text will have the same color as
+ the data set to which it is attached.
+ \end{key}
+
+ \begin{stylekey}{/tikz/data visualization/every data set label}
+ This style is executed with every label that represents a data set.
+ Inside this style, use |node style| to change the appearance of nodes.
+ This style has a default definition, usually you should just append
+ things to this style.
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ school book axes,
+ x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ every data set label/.append style={text colored},
+ log= {label in data={text'=$\log x$, when=y is -1}},
+ lin= {label in data={text=$x/2$,
+ node style=sloped, when=x is 2}},
+ squared={label in data={text=$x^2$, when=x is 1.1}},
+ exp= {label in data={text=$e^x$,
+ node style=sloped, when=x is -2}},
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/data visualization/every label in data}
+ Like |every data set label|, this key is also executed with labels.
+ However, this key is executed after the style sheets have been
+ executed, giving you a chance to overrule their styling.
+ \end{stylekey}
+\end{key}
+
+
+\subsubsection{Connecting a Label to a Data Set via a Pin}
+
+\begin{key}{/tikz/data visualization/visualizer options/pin in data=\meta{options}}
+ This key is a variant of the |label in data| key and takes the same
+ options, plus two additional ones. The difference to |label in data| is
+ that the label node is shown a bit removed from the data set, but connected
+ to it via a small line (this is like the difference between the |label| and
+ |pin| options).
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ scientific axes=clean,
+ visualize as smooth line/.list={linear, squared, cubed},
+ linear ={pin in data={text=$2x$}},
+ squared={pin in data={text=$x^2$}},
+ cubed ={pin in data={text=$x^3$}}]
+data [set=linear, format=function] {
+ var x : interval [0:1.5];
+ func y = \value x;
+}
+data [set=squared, format=function] {
+ var x : interval [0:1.5];
+ func y = \value x * \value x;
+}
+data [set=cubed, format=function] {
+ var x : interval [0:1.5];
+ func y = \value x * \value x * \value x;
+};
+\end{codeexample}
+ %
+ The following keys can be used additionally:
+ %
+ \begin{key}{/tikz/data visualization/visualizer label options/pin angle=\meta{angle}}
+ The position of the label of a |pin in data| is mainly computed in the
+ same way as for a |label in data|. However, once the position has been
+ computed, the label is shifted as follows:
+ %
+ \begin{itemize}
+ \item When an \meta{angle} is specified using the present key, the
+ shift is by the current value of |pin length| in the direction
+ of \meta{angle}.
+ \item When \meta{angle} is empty (which is the default), then the
+ shift is also by the current value of |pin length|, but now in
+ the direction that is orthogonal and to the left of the line
+ between the coordinate of the data point and the coordinate of
+ the next data point. When |text'| is used, the direction is to
+ the right instead of the left.
+ \end{itemize}
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/visualizer label options/pin length=\meta{dimension}}
+ See the description of |pin angle|.
+ \end{key}
+ %
+\begin{codeexample}[width=6.3cm]
+\tikz \datavisualization [
+ school book axes,
+ x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ every data set label/.append style={text colored},
+ log= {pin in data={text'=$\log x$, when=y is -1}},
+ lin= {pin in data={text=$x/2$, when=x is 2,
+ pin length=1ex}},
+ squared={pin in data={text=$x^2$, when=x is 1.1,
+ pin angle=230}},
+ exp= {label in data={text=$e^x$, when=x is -2}},
+ style sheet=vary hue]
+data group {function classes};
+\end{codeexample}
+ \end{key}
+
+
+\subsection{Usage: Labeling Data Sets Inside a Legend}
+
+The ``classical'' way of indicating the style used for the different data sets
+inside a visualization is a \emph{legend}. It is a description next to or even
+inside the visualization that contains one line for each data set and displays
+an iconographic version of the data set next to some text labeling the data
+set. Note, however, that even though legend are quite common, also consider
+using a |label in data| or a |pin in data| instead.
+
+Creating a high-quality legend is by no means simple. A legend should not
+distract the reader, so aggressive borders should definitively be avoided. A
+legend should make it easy to match the actual styling of a data set (like,
+say, using a red, dashed line) to the ``iconographic'' representation of this
+styling. An example of what can go wrong here is using short lines to represent
+lines dashed in different way where the lines are so short that the differences
+in the dashing cannot be discerned. Another example is showing straight lines
+with plot marks on them where the plot marks are obscured by the horizontal
+line itself, while the plot marks are clearly visible in the actual
+visualization since no horizontal lines occur.
+
+The data visualization engine comes with a large set of options for creating
+and placing high-quality legends next or inside data visualizations.
+
+
+\subsubsection{Creating Legends and Legend Entries}
+
+A data visualization can be accompanied by one or more legends. In order to
+create a legend, the following key can be used (although, in practice, you will
+usually use the |legend| key instead, see below):
+
+\begin{key}{/tikz/data visualization/new legend=\meta{legend name} (default main legend)}
+ This key is used to create a new legend named \meta{legend name}. The
+ legend is empty by default and further options are needed to add entries to
+ it. When the key is called a second time for the same \meta{legend name}
+ nothing happens.
+
+ When a legend is created, a new key is created that can subsequently be
+ used to configure the legend:
+ %
+ \begin{key}{/tikz/data visualization/\meta{legend name}=\meta{options}}
+ When this key is used, the \meta{options} are executed with the path
+ prefix
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/legend options
+\end{codeexample}
+ %
+ The different keys with this path prefix allow you to change the
+ position where the legend is shown and how it is organised (for
+ instance, whether legend entries are shown in a row or in a column or
+ in a square).
+
+ The different possible keys will be explained in the course of this
+ section.
+ \end{key}
+
+ In the end, the legend is just a \tikzname\ node, a |matrix| node, to be
+ precise. The following key is used to style this node:
+
+ \begin{key}{/tikz/data visualization/legend options/matrix node style=\meta{options}}
+ Adds the \meta{options} to the list of options that will be executed
+ when the legend's node is created.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend={matrix node style={fill=black!25}},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+ \end{key}
+
+ The following style allows you to configure the default appearance of every
+ newly created legend:
+ %
+ \begin{stylekey}{/tikz/data visualization/legend options/every new legend}
+ This key defaults to |east outside, label style=text right|. This means
+ that by default a legend is placed to the right of the data
+ visualization and that in the individual legend entries the text is to
+ the right of the data set visualization.
+ \end{stylekey}
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ scientific axes, x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ new legend={upper legend},
+ new legend={lower legend},
+ upper legend=above,
+ lower legend=below,
+ log= {label in legend={text=$\log x$, legend=upper legend}},
+ lin= {label in legend={text=$x/2$, legend=upper legend}},
+ squared={label in legend={text=$x^2$, legend=lower legend}},
+ exp= {label in legend={text=$e^x$, legend=lower legend}},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend=\meta{options}}
+ This is a shorthand for
+ |new legend=main legend, main legend=|\meta{options}. In other words, this
+ key creates a new |main legend| and immediately passes the configuration
+ \meta{options} to this legend.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ scientific axes, x axis={label=$x$},
+ visualize as smooth line/.list={log, lin, squared, exp},
+ legend=below,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+As pointed out above, a legend is empty by default. In particular, the
+different data sets are not automatically inserted into the legend. Instead,
+the key |label in legend| must be used together with a data set:
+
+\begin{key}{/tikz/data visualization/visualizer options/label in legend=\meta{options}}
+ This key is passed to a data set, similar to options like |pin in data| or
+ |smooth line|. The \meta{options} are used to configure the following:
+ %
+ \begin{itemize}
+ \item The legend in which the data set should be visualized.
+ \item The text that is to be shown in the legend for the data set.
+ \item The appearance of the legend entries.
+ \end{itemize}
+ %
+ In detail, the \meta{options} are executed with the path prefix
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/legend entry options
+\end{codeexample}
+ %
+ To configure in which legend the label should appear, use the
+ following key:
+ %
+ \begin{key}{/tikz/data visualization/legend entry options/legend=\meta{name} (initially main legend)}
+ Set this key to the name of a legend that has previously been created
+ using |new legend|. The label will then be shown in this legend.
+
+ In most cases, there is only one legend (namely |main legend|) and
+ there is no need to set this key since it defaults to the main legend.
+
+ Also note that the legend \meta{name} is automatically created if it
+ nodes not yet exist.
+ \end{key}
+
+ \begin{key}{/tikz/data visualization/legend entry options/text=\meta{text}}
+ Use this key to setup the \meta{text} that is shown as the label of the
+ data set.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes, x axis={label=$x$},
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={pin in data ={text=$x^2$, pos=0.1}},
+ exp= {label in data ={text=$e^x$}},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+ \end{key}
+
+ In addition to the two keys described above, there are further keys that
+ are described in Section~\ref{section-dv-label-legend-entry-options}.
+\end{key}
+
+
+\subsubsection{Rows and Columns of Legend Entries}
+
+In a legend, the different legend entries are arranged in a matrix, which
+typically has only one row or one column. For the impatient reader: Say
+|rows=1| to get everything in a row, say |columns=1| to get everything in a
+single column, and skip the rest of this section.
+
+The more patient reader will appreciate that when there are very many different
+data sets in a single visualization, it may be necessary to use more than one
+row or column inside the legend. \tikzname\ comes with a rather powerful
+mechanism for distributing the multiple legend entries over the matrix.
+
+The first thing to decide is in which ``direction'' the entries should be
+inserted into the matrix. Suppose we have a $3 \times 3$ matrix and our entries
+are $a$, $b$, $c$, and so on. Then, one might place the $a$ in the upper left
+corner of the matrix, $b$ in the upper middle position, $c$ in the upper right
+position, and $d$ in the middle left position. This is a ``first right, then
+down'' strategy. A different strategy might be to place the $a$ in the upper
+left corner, but $b$ in the middle left position, $c$ in the lower left
+position, and $d$ then in the upper middle position. This is a ``first down,
+then right'' strategy. In certain situations it might even make sense to place
+$a$ in the lower right corner and then go ``first up, then left''.
+
+All of these strategies are supported by the |legend| command. You can
+configure which strategy is used using the following keys:
+
+\tikzdatavisualizationset {
+ legend example/.style={
+ scientific axes, all axes={length=1cm, ticks=none},
+ 1={label in legend={text=1}},
+ 2={label in legend={text=2}},
+ 3={label in legend={text=3}},
+ 4={label in legend={text=4}},
+ 5={label in legend={text=5}},
+ 6={label in legend={text=6}},
+ 7={label in legend={text=7}},
+ 8={label in legend={text=8}}
+ }
+}
+
+\begin{key}{/tikz/data visualization/legend options/down then right}
+ Causes the legend entries to fill the legend matrix first downward and,
+ once a column is full, the next column is begun to the right of the
+ previous one. This is the default.
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={down then right, columns=3}]
+data group {sin functions};
+\end{codeexample}
+ %
+ In the example, the |legend example| is the following style:
+ %
+\begin{codeexample}[code only]
+\tikzdatavisualizationset {
+ legend example/.style={
+ scientific axes, all axes={length=1cm, ticks=none},
+ 1={label in legend={text=1}},
+ 2={label in legend={text=2}},
+ 3={label in legend={text=3}},
+ 4={label in legend={text=4}},
+ 5={label in legend={text=5}},
+ 6={label in legend={text=6}},
+ 7={label in legend={text=7}},
+ 8={label in legend={text=8}}
+ }
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/down then left}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={down then left, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/up then right}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={up then right, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/up then left}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={up then left, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/left then up}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={left then up, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/left then down}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={left then down, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/right then up}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={right then up, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/right then down}
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={right then down, columns=3}]
+data group {sin functions};
+\end{codeexample}
+\end{key}
+
+Having configured the directions in which the matrix is being filled, you must
+next setup the number of rows or columns that are to be shown. There are
+actually two different ways of doing so. The first way is to specify a maximum
+number of rows or columns. For instance, you might specify that there should be
+at most ten rows to a column and when there are more, a new column should be
+begun. This is achieved using the following keys:
+
+\begin{key}{/tikz/data visualization/legend options/max rows=\meta{number}}
+ As the legend matrix is being filled, whenever the number of rows in the
+ current column would exceed \meta{number}, a new column is started.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={max rows=3}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={max rows=4}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={max rows=5}]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/max columns=\meta{number}}
+ This key works like |max rows|, only now the number of columns is
+ monitored. Note that this strategy only really makes sense when the when
+ you use this key with a strategy that first goes left or right and then up
+ or down.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={right then down, max columns=2}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={right then down,max columns=3}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={right then down,max columns=4}]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{key}
+
+The second way of specifying the number of entries in a row or column is to
+specify an ``ideal number of rows or columns''. The idea is as follows: Suppose
+that we use the standard strategy and would like to have everything in two
+columns. Then if there are eight entries, the first four should go to the first
+column, while the next four should go to the second column. If we have 20
+entries, the first ten should go the first column and the next ten to the
+second, and so on. So, in general, the objective is to distribute the entries
+evenly so the this ``ideal number of columns'' is reached. Only when there are
+too few entries to achieve this or when the number of entries per column would
+exceed the |max rows| value, will the number of columns deviate from this ideal
+value.
+
+\begin{key}{/tikz/data visualization/legend options/ideal number of columns=\meta{number}}
+ Specifies, that the entries should be split into \meta{number} different
+ columns, whenever possible. However, when there would be more than the
+ |max rows| value of rows per column, more columns than the ideal number are
+ created.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={ideal number of columns=2}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={ideal number of columns=4}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={max rows=3,ideal number of columns=2}]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/rows=\meta{number}}
+ Shorthand for |ideal number of rows=|\meta{number}.
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/ideal number of rows=\meta{number}}
+ Works like |ideal number of columns|.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={ideal number of rows=2}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={ideal number of rows=4}]
+data group {sin functions};
+\end{codeexample}
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ visualize as smooth line/.list={1,2,3,4,5,6,7,8},
+ legend example, style sheet=vary hue,
+ main legend={max columns=3,ideal number of rows=2}]
+data group {sin functions};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/columns=\meta{number}}
+ Shorthand for |ideal number of columns=|\meta{number}.
+\end{key}
+
+
+\subsubsection{Legend Placement: The General Mechanism}
+
+A legend can either be placed next to the data visualization or inside the data
+visualization at some place where there are no data entries. Both approached
+have advantages: Placing the legend next to the visualization minimises the
+``cluttering'' by keeping all the extra information apart from the actual data,
+while placing the legend inside the visualization minimises the distance
+between the data sets and their explanations, making it easier for the eye to
+connect them.
+
+For both approaches there are options that make the placement easier, see
+Sections \ref{section-dv-legend-outside} and~\ref{section-dv-legend-inside},
+but these options internally just map to the following two options:
+
+\begin{key}{/tikz/data visualization/legend options/anchor=\meta{anchor}}
+ The whole legend is a \tikzname-matrix internally. Thus, in particular, it
+ is stored in a node, which has anchors. Like for any other node, when the
+ node is shown, the node is shifted in such a way that the \meta{anchor} of
+ the node lies at the current |at| position.
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/at=\meta{coordinate}}
+ Configures the \meta{coordinate} at which the \meta{anchor} of the legend's
+ node should lie.
+
+ It may seem hard to predict a good \meta{coordinate} for a legend since,
+ depending of the size of the axis, different positions need to the chosen
+ for the legend. However, it turns out that one can often use the
+ coordinates of the special nodes |data bounding box| and
+ |data visualization bounding box|, documented in
+ Section~\ref{section-dv-bounding-box}.
+
+ As an example, let us put a legend to the right of the visualization, but
+ so that the first entry starts at the top of the visualization:
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes, x axis={label=$x$},
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend={anchor=north west, at=
+ (data visualization bounding box.north east)},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=vary dashing]
+data group {function classes};
+\end{codeexample}
+ %
+ As can be seen, a bit of an additional shift might have been in order, but
+ the result is otherwise quite satisfactory.
+\end{key}
+
+
+\subsubsection{Legend Placement: Outside to the Data Visualization}
+\label{section-dv-legend-outside}
+
+The following keys make it easy to place a legend outside the data
+visualization.
+
+\begin{key}{/tikz/data visualization/legend options/east outside}
+ Placing the legend to the right of the data visualization is the default:
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=east outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+
+ \begin{key}{/tikz/data visualization/legend options/right}
+ This is an easier-to-remember alias.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/north east outside}
+ A variant, where the legend is to the right, but aligned with the northern
+ end of the data visualization:
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=north east outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/south east outside}
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=south east outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/west outside}
+ The legend is placed left. Note that the text also swaps its position.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=west outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+ \begin{key}{/tikz/data visualization/legend options/left}
+ This is an easier-to-remember alias.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/north west outside}
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=north west outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/south west outside}
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=south west outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+\end{key}
+
+
+\begin{key}{/tikz/data visualization/legend options/north outside}
+ The legend is placed above the data. Note that the legend entries now for a
+ row rather than a column.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=north outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+ \begin{key}{/tikz/data visualization/legend options/above}
+ This is an easier-to-remember alias.
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/south outside}
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=south outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+ \begin{key}{/tikz/data visualization/legend options/below}
+ This is an easier-to-remember alias.
+ \end{key}
+\end{key}
+
+
+\subsubsection{Legend Placement: Inside to the Data Visualization}
+\label{section-dv-legend-inside}
+
+There are two sets of options for placing a legend directly inside a data
+visualization: First, there are options for placing it inside, but next to some
+part of the border. Second, there are options for positioning it relative to a
+coordinate given by a certain data point.
+
+\begin{key}{/tikz/data visualization/legend options/south east inside}
+ Puts the legend in the upper right corner of the data.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin},
+ legend=south east inside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+
+ Note that the text is now a little smaller since there tends to be much
+ less space inside the data visualization than next to it. Also, the
+ legend's node is filled in white by default to ensures that the legend is
+ clearly legible even in the presence of, say, a grid or data points behind
+ it. This behaviour is triggered by the following style key:
+
+ \begin{stylekey}{/tikz/data visualization/legend options/every legend inside}
+ Executed the keys |opaque| by default and sets the text size to the
+ size of footnotes.
+ \end{stylekey}
+\end{key}
+
+In order to further configure the default appearance of an inner legend, the
+following keys might be useful:
+
+\begin{key}{/tikz/data visualization/legend options/opaque=\meta{color} (default white)}
+ When this key is used, the legend's node will be filled with the
+ \meta{color} and its corners will be rounded. Additionally, the inner and
+ outer separations will be set to sensible values.
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/transparent}
+ Sets the filling of the legend node to |none|.
+\end{key}
+
+The following keys work much the same way as |south east inside|:
+
+\begin{key}{/tikz/data visualization/legend options/east inside}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/north east inside}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/south west inside}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/west inside}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/north west inside}
+\end{key}
+
+The keys |south inside| and |north inside| are a bit different: They use a row
+rather than a column for the legend entries:
+
+\begin{key}{/tikz/data visualization/legend options/south inside}
+ Puts the legend in the upper right corner of the data. Note that the text
+ is now a little smaller since there tends to be much less space inside the
+ data visualization than next to it.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list={log, lin},
+ legend=south inside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/north inside}
+ As above.
+\end{key}
+
+The above keys do not always give you as fine a control as you may need over
+the placement of the legend. In such cases, the following keys may help (or you
+can revert to directly setting the |at| and the |anchor| keys):
+
+\begin{key}{/tikz/data visualization/legend options/at values=\meta{data point}}
+ This key allows you to specify the desired center of the legend in terms of
+ a data point. The \meta{data point} should be a list of comma-separated
+ key--value pairs that specify a data point. The legend will then be
+ centered at this data point.
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list={log, lin},
+ legend={at values={x=-1, y=2}},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend options/right of=\meta{data point}}
+ Works like |at values|, but the anchor is set to |west|:
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list={log, lin},
+ legend={right of={x=-1, y=2}},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+The following keys work similarly:
+%
+\begin{key}{/tikz/data visualization/legend options/above right of=\meta{data point}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/above of=\meta{data point}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/above left of=\meta{data point}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/left of=\meta{data point}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/below left of=\meta{data point}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/below of=\meta{data point}}
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend options/below right of=\meta{data point}}
+\end{key}
+
+
+\subsubsection{Legend Entries: General Styling}
+\label{section-dv-label-legend-entry-options}
+
+The entries in a legend can be styled in several ways:
+%
+\begin{itemize}
+ \item You can configure the styling of the text node.
+ \item You can configure the relative placement of the text node and the
+ little picture depicting the data set's styling.
+ \item You can configure how the data set's styling is depicted.
+\end{itemize}
+
+Before we have look at how each of these are configured, in detail, let us
+first have a look at the keys that allow us to save a set of such styles:
+
+\begin{stylekey}{/tikz/data visualization/every label in legend}
+ This key is executed with every label in a legend. However, the options
+ stored in this style are executed with the path prefix
+ |/tikz/data visualization/legend entry options|. Thus, this key can use
+ keys like |node style| to configure the styling of all text nodes:
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ every label in legend/.style={node style=
+ {fill=red!30}},
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=north east outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$,
+ node style={circle, draw=red}}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{key}{/tikz/data visualization/legend options/label style=\meta{options}}
+ This key can be used with a legend. It will simply add the \meta{options}
+ to the |every label in legend| style for the given legend.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend={label style={node style=draw}},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$,
+ node style={circle, draw=red}}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Legend Entries: Styling the Text Node}
+
+The appearance of the text nodes is easy to configure.
+
+\begin{key}{/tikz/data visualization/legend entry options/node style=\meta{options}}
+ This key adds \meta{options} to the styling of the text nodes of the label.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend=north east outside,
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$,
+ node style={circle, draw=red}}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/text colored}
+ Causes the |node style| to set the text color to |visualizer color|. The
+ effect of this is that the label's text will have the same color as the
+ data set to which it is attached.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend={label style=text colored},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Legend Entries: Text Placement}
+
+Three keys govern where the text will be placed relative to the data set style
+visualization.
+
+\begin{key}{/tikz/data visualization/legend entry options/text right}
+ Placed the text node to the right of the data set style visualization. This
+ is the default for most, but not all, legends.
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend entry options/text left}
+ Placed the text node to the left of the data set style visualization.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend={label style=text left},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+%
+\begin{key}{/tikz/data visualization/legend entry options/text only}
+ Shows only the text nodes and no data set style visualization at all. This
+ options only makes sense in conjunction with the |text colored| options,
+ which is why this options is also selected implicitly.
+ %
+\begin{codeexample}[width=8cm]
+\tikz \datavisualization [
+ scientific axes,
+ visualize as smooth line/.list=
+ {log, lin, squared, exp},
+ legend={south east inside, rows=2,
+ label style=text only},
+ log= {label in legend={text=$\log x$}},
+ lin= {label in legend={text=$x/2$}},
+ squared={label in legend={text=$x^2$}},
+ exp= {label in legend={text=$e^x$}},
+ style sheet=strong colors]
+data group {function classes};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Advanced: Labels in Legends and Their Visualizers}
+\label{section-dv-legend-entries}
+
+The following explanations are important only for you if you intend to create a
+new visualizer and an accompanying label in legend visualizer; otherwise you
+can safely proceed with the next section.
+
+A legend entry consists not only of some explaining text, but, even more
+importantly, of a visual representation of the style used for the data points,
+created by a \emph{label in legend visualizer}. For instance, when data points
+are visualized as lines in different colors, the legend entry for the first
+line might consist of the text ``first experiment'' and a short line in black
+and the second entry might consist of ``failed experiment'' and a short line in
+red -- assuming, of course, that the style sheet makes the first line black and
+the second line blue. As another example, when data sets are visualized as
+clouds of plot marks, the texts in the legend would be accompanied by the plot
+marks used to visualize the data sets.
+
+For every visualizer, the \emph{label in legend visualizer} creates an
+appropriate visualization of the data set's styling. There may be more than one
+possible such label in legend visualizer that is appropriate, in which case
+options are used to choose between them.
+
+Let us start with the key for creating a new legend entry. This key gets called
+for instance by |label in legend|:
+
+\begin{key}{/tikz/data visualization/new legend entry=\meta{options}}
+ This key will add a new entry to the legend that is identified by the
+ \meta{options}. For this, the \meta{options} are executed once with the
+ path prefix |/tikz/data visualization/legend entry options| and the
+ resulting setting of the |legend| key is used to pick which legend the new
+ entry should belong to. Then, the \meta{options} are stored away for the
+ time being.
+
+ Later, when the legend is created, the \meta{options} get executed once
+ more. This time, however, the |legend| key is no longer important. Instead,
+ the \meta{options} that setup keys like |text| or |visualizer in legend|
+ now play a role.
+
+ In detail, the following happens:
+ %
+ \begin{itemize}
+ \item For the legend entry, a little cell picture is created in the
+ matrix of the legend (see Section~\ref{section-tikz-cell-pictures}
+ for details on cell pictures).
+ \item Inside this picture, a node is created whose text is taken from
+ the key
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/legend entry options/text
+\end{codeexample}
+ %
+ \item Also inside the picture, the code stored in the following key
+ gets executed:
+ %
+ \begin{key}{/tikz/data visualization/legend entry options/visualizer in legend}
+ Set this key to some code that paints something in the cell
+ picture. Typically, this will be a visual representation of the
+ data set styling, but it could also be something different.
+ %
+\begin{codeexample}[width=6cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ style sheet=vary dashing,
+ a={label in legend={text=a}},
+ new legend entry={
+ text=spacer,
+ visualizer in legend={\draw[solid] (0,0) circle[radius=2pt];}
+ },
+ b={label in legend={text=b}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+ \end{key}
+ \end{itemize}
+ %
+ The following styles are applied in the following order before the cell
+ picture is filled:
+ %
+ \begin{enumerate}
+ \item |/tikz/data visualization/every data set label| with path
+ |/tikz/data visualization|
+ \item |/tikz/data visualization/every label in legend| with path\\
+ |/tikz/data visualization/legend entry options|.
+ \item The \meta{options}.
+ \item The code in the following key:
+ %
+ \begin{key}{/tikz/data visualization/legend entry options/setup}
+ Some code to be executed at this point. Mostly, it is used to
+ setup attributes for style sheets.
+ \end{key}
+ \item A styling signal is emitted.
+ \item Only for the node: The current value of |node style|.
+ \item Only for the visualizer in legend: The styling that has been
+ accumulated by calls to the following key:
+ %
+ \begin{stylekey}{/tikz/data visualization/legend entry options/visualizer in legend style=\\\marg{options}}
+ Calls to this key accumulate \meta{options} that will be
+ executed with the path prefix |/tikz| at this point.
+ \end{stylekey}
+ \end{enumerate}
+\end{key}
+
+As indicated earlier, the |new legend entry| key is called by the
+|label in legend=|\meta{options} key internally. In this case, the following
+extra \meta{extra options} are passed to |new legend entry| key:
+%
+\begin{itemize}
+ \item The styling of the visualizer.
+ \item The |/tikz/data visualization/every label in legend| style.
+ \item The |/tikz/every label| style with path |/tikz|.
+ \item Setting |setup| to |/data point/set=|\meta{name of the visualizer}.
+ \item The value of the |label legend options| that are stored in the
+ visualizer. These options can be changed using the following key:
+ %
+ \begin{key}{/tikz/data visualization/visualizer options/label in legend options=\meta{options}}
+ Use this key with a visualizer to configure the label in legend
+ options. Typically, this key is used only internally by a
+ visualizer upon its creating to set the \meta{options} to setup the
+ |visualizer in legend| key.
+ \end{key}
+\end{itemize}
+
+
+\subsubsection{Reference: Label in Legend Visualizers for Lines and Scatter Plots}
+
+Visualizers like |visualize as line| or |visualize as smooth line| use a label
+in legend visualizer that draws a short line to represent the data set inside
+the legend. However, this line needs not be a simple straight line, but can be
+a little curve or a small circle -- indeed, even the default line is not a
+simple straight line but rather a small zig-zag curve. To configure this line,
+the two keys are used, although you will only rarely use them directly, but
+rather use one of the predefined styles mentioned later on.
+
+Before we go into the glorious details of all of these keys, let us first have
+a look at the keys you are most likely to use in practice: The keys for
+globally reconfiguring the default label in legend visualizers:
+%
+\begin{stylekey}{/tikz/data visualization/legend entry options/default label in legend path}
+ This style is set, by default, to |zig zag label in legend line|. It is
+ installed by the styles |straight line|, |smooth line|, and |gap line|, so
+ changing this style will change the appearance of lines in legends. The
+ main other sensible option for this key is |straight label in legend line|.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ style sheet=vary dashing,
+ a={label in legend={text=a}}, b={label in legend={text=b}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ legend entry options/default label in legend path/.style=
+ straight label in legend line,
+ style sheet=vary dashing,
+ a={label in legend={text=a}}, b={label in legend={text=b}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+ %
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/data visualization/legend entry options/default label in legend closed path}
+ This style is executed by |smooth cycle| and |straight cycle|. There are
+ (currently) no other predefined sets of coordinates that can be used
+ instead of the default value |circular label in legend line|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/data visualization/legend entry options/default label in legend mark}
+ This style is executed by |no lines| and, implicitly, by scatter plots. The
+ default is to use |label in legend line one mark|. Another possible value
+ is |label in legend line three marks|.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ visualize as scatter/.list={a,b,c},
+ style sheet=cross marks,
+ legend entry options/default label in legend mark/.style=
+ label in legend three marks,
+ a={label in legend={text=example a}},
+ b={label in legend={text=example b}},
+ c={label in legend={text=example c}}];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{key}{/tikz/data visualization/legend entry options/label in legend line coordinates=\\\marg{list of coordinates}}
+ This key takes a \meta{list of coordinates}, which are
+ \tikzname-coordinates separated by commas like |(0,0),|\penalty0|(1,1)|.
+ The effect of setting the key is the following: The label in legend
+ visualizer used by, for instance, |visualize as line| will draw a path
+ going through these points. When the line is drawn, the exact same style
+ will be used as was used for the data set. For instance, if the
+ |smooth line| key was used and also the |style=red| key, the line through
+ the \meta{list of coordinates} will also be red and smooth. When the
+ |straight cycle| key was used, the coordinates will also be connected by a
+ cycle, and so on.
+
+ When the line connecting the \meta{list of coordinates} is drawn, the
+ coordinate system will have been shifted and transformed in such a way that
+ |(0,0)| lies to the left of the text and at half the height of the
+ character ``x''. This means that the right-most-point in the list should
+ usually be |(0,0)| and all other $x$-coordinates should usually be
+ negative. When the |text left| options is used, the coordinate system will
+ have been flipped, so the \meta{list of coordinates} is independent of
+ whether the text is to the right or to the left of the line.
+
+ Let us now have a look at a first, simple example. We create a legend entry
+ that is just a straight line, so it should start somewhere to the left of
+ the origin at height $0$ and go to the origin:
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ style sheet=vary dashing,
+ a={label in legend={text=a,
+ label in legend line coordinates={(-1em,0), (0,0)}}},
+ b={label in legend={text=b,
+ label in legend line coordinates={(-2em,0), (0,0)}}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+
+ Now let us make this a bit more fancy and useful by using shifted lines:
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ legend={up then right}, style sheet=vary dashing,
+ a={label in legend={text=a,
+ label in legend line coordinates={(-2em,-.25ex), (0,0)}}},
+ b={label in legend={text=b,
+ label in legend line coordinates={(-2em,.25ex), (0,0)}}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+
+ In the final example, we use a little ``hat'' to represent lines:
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ legend={up then right}, style sheet=vary dashing,
+ a={label in legend={text=a,
+ label in legend line coordinates={
+ (-2em,-.2ex), (-1em,.2ex), (0,-.2ex)}}},
+ b={label in legend={text=b,
+ label in legend line coordinates={
+ (-2em,-.2ex), (-1em,.2ex), (0,-.2ex)}}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/label in legend mark coordinates=\\\marg{list of coordinates}}
+ This key is similar to |label in legend line coordinates|, but now the
+ \meta{list of coordinates} is used as the positions where plot marks are
+ shown. Naturally, plot marks are only shown there if they are also shown by
+ the visualizer in the actual data -- just like the line through the
+ coordinates of the previous key is only shown when there is a line.
+
+ The \meta{list of coordinates} may be the same as the one used for lines,
+ but usually it is not. In general, it is better to have marks for instance
+ not at the ends of the line.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ school book axes, visualize as line/.list={a,b},
+ legend={up then right},
+ style sheet=vary dashing,
+ style sheet=cross marks,
+ a={label in legend={text=a,
+ label in legend line coordinates={
+ (-2em,-.2ex), (-1em,.2ex), (0,-.2ex)},
+ label in legend mark coordinates={
+ (-1em,.2ex)}}},
+ b={label in legend={text=b,
+ label in legend line coordinates={
+ (-2em,-.2ex), (-1em,.2ex), (0,-.2ex)},
+ label in legend mark coordinates={
+ (-2em,-.2ex), (0,-.2ex)}}}]
+data point [x=-1, y=-1, set=a] data point [x=1, y=0, set=a]
+data point [x=-1, y=1, set=b] data point [x=1, y=0.5, set=b];
+\end{codeexample}
+ %
+\end{key}
+
+
+Naturally, you typically will not give coordinates explicitly for each label,
+but use one of the following styles:
+
+\begin{key}{/tikz/data visualization/legend entry options/straight label in legend line}
+ Just gives a straight line and two plot marks.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [visualize as line,
+ line={style={mark=x}, label in legend={text=example,
+ straight label in legend line}}];
+\end{codeexample}
+ %
+ This style might seem like a good idea to use in general, but it does have
+ a huge drawback: Some commonly used plot marks will be impossible to
+ distinguish -- even though there is no problem distinguishing them in a
+ graph.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [visualize as line/.list={a,b,c},
+ legend entry options/default label in legend path/.style=
+ straight label in legend line,
+ a={style={mark=+}, label in legend={text=bad example a}},
+ b={style={mark=-}, label in legend={text=bad example b}},
+ c={style={mark=|}, label in legend={text=bad example c}}];
+\end{codeexample}
+ %
+ For this reason, this option is not the default, but rather the next one.
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/zig zag label in legend line}
+ Uses a small up-down-up line as the label in legend visualizer. The two
+ plot marks are at the extremal points of the line. It works pretty well in
+ almost all situations and is the default.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ visualize as line=a,
+ visualize as smooth line/.list={b,c},
+ a={style={mark=+}, label in legend={text=better example a}},
+ b={style={mark=-}, label in legend={text=better example b}},
+ c={style={mark=|}, label in legend={text=better example c}}];
+\end{codeexample}
+ %
+ Even though the above example shows that the marks are easier to
+ distinguish than with a straight line, the chosen marks are still not
+ optimal. This is the reason that the |cross marks| style uses different
+ crosses:
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [
+ visualize as line/.list={a,b},
+ visualize as smooth line=c,
+ style sheet=cross marks,
+ a={label in legend={text=good example a}},
+ b={label in legend={text=good example b}},
+ c={gap line, label in legend={text=good example c}}];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/circular label in legend line}
+ This style is especially tailored to represent lines that are closed. It is
+ automatically selected for instance by the |polygon| or the |smooth cycle|
+ styles.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ scientific axes={clean}, all axes={length=3cm},
+ visualize as line/.list={a,b,c},
+ a={polygon}, b={smooth cycle},
+ style sheet=cross marks,
+ a={label in legend={text=polygon}},
+ b={label in legend={text=circle}},
+ c={label in legend={text=line}}]
+data [format=function, set=a] {
+ var t : {0,72,...,359};
+ func x = cos(\value t);
+ func y = sin(\value t);
+}
+data [format=function, set=b] {
+ var t : [0:2*pi];
+ func x = .8*cos(\value t r);
+ func y = .8*sin(\value t r);
+}
+data point [x=-1, y=0.5, set=c]
+data point [x=1, y=0.25, set=c];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/gap circular label in legend line}
+ This style is especially tailored to for the |gap cycle| style and
+ automatically selected by it:
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ scientific axes={clean}, all axes={length=3cm},
+ visualize as line/.list={a,b,c},
+ a={gap cycle}, b={smooth cycle}, c={gap line},
+ a={style={mark=*, mark size=0.5pt},
+ label in legend={text=polygon}},
+ b={label in legend={text=circle}},
+ c={style={mark=*, mark size=0.5pt, mark options=red},
+ label in legend={text=line}}]
+data [format=function, set=a] {
+ var t : {0,72,...,359};
+ func x = cos(\value t);
+ func y = sin(\value t);
+}
+data [format=function, set=b] {
+ var t : [0:352];
+ func x = .8*cos(\value t);
+ func y = .8*sin(\value t);
+}
+data point [x=-1, y=0.5, set=c]
+data point [x=1, y=0.25, set=c];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/label in legend one mark}
+ To be used with scatter plots, since no line is drawn. Just displays a
+ single mark (this is the default with a scatter plot or when the |no line|
+ is selected.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [visualize as scatter/.list={a,b,c},
+ style sheet=cross marks,
+ a={label in legend={text=example a}},
+ b={label in legend={text=example b}},
+ c={label in legend={text=example c}}];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/legend entry options/label in legend three marks}
+ An alternative to the previous style, where several marks are shown.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \datavisualization [visualize as scatter/.list={a,b,c},
+ style sheet=cross marks,
+ a={label in legend={text=example a, label in legend three marks}},
+ b={label in legend={text=example b, label in legend three marks}},
+ c={label in legend={text=example c, label in legend three marks}}];
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-visualizers.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-visualizers.tex
new file mode 100644
index 0000000000..3923339a11
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-dv-visualizers.tex
@@ -0,0 +1,792 @@
+% Copyright 2010 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Visualizers}
+\label{section-dv-visualizers}
+
+\subsection{Overview}
+
+In a data visualization a long stream of data points is \emph{visualized} using
+\emph{visualizers}. Recall that it is the job of the axis systems as described
+in Section~\ref{section-dv-axes} to determine \emph{where} data points are
+visualized. It is the job of the visualizers to determine \emph{how} they are
+visualized.
+
+The most basic and common visualizer is the \emph{line visualizer}. It simply
+connects subsequent data points by straight lines to indicate either that the
+points on these lines interpolate between the real data points or the straight
+lines are used to indicate the order in which the data points appear. A
+different, more ``conservative'' visualizer is the \emph{scatter visualizer} or
+\emph{mark visualizer}, which just places a small mark at each data point. Such
+a visualizer does not imply any interpolation or ordering between the data
+points.
+
+Visualizers may, however, also be more complicated. For instance, a visualizer
+used for a box plot could visualize a data point as a box with a median value,
+standard deviation, outliers, and other information; a rectangle visualizer
+might visualize data points as larger areas; a projection visualizer might
+visualize the projection of data points onto different axes; and so.
+
+Creating a new visualizer is not quite trivial since a new \pgfname\ class
+needs to be implemented. Fortunately, using visualizers is much simpler: For
+each kind of visualizer there is a key that allows you to create such a
+visualizer. You can then use further keys to configure the visualizer and to
+connect it to the data.
+
+In a data visualization multiple visualizers may exist at the same time. This
+happens in different situations:
+%
+\begin{itemize}
+ \item A data visualization may contain several independent data sets that
+ are to be visualized. There might be a line plot, for which a line
+ visualizer is used, and also a scatter plot, for which a scatter
+ visualizer would be used.
+
+ In this case, for each data point only one visualizer will do anything.
+ To achieve this, each data point has an attribute called |visualizer|
+ which tells the visualizer objects whether they should ``react'' to the
+ data point or not.
+ \item A single data point might be visualized several times. For instance,
+ a scatter visualizer might draw a mark at the data point's position on
+ the page and a projection visualizer might draw, additionally, a mark
+ at the projected position.
+\end{itemize}
+
+
+\subsection{Usage}
+
+\subsubsection{Using a Single Visualizer}
+
+The simplest scenario for using visualizers are data visualizations in which
+there is only a single data set that is visualized in one style. In this case,
+all that needs to be done in order to choose a visualizer is use one of the
+options starting with |visualize as ...| together with the |\datavisualization|
+command:
+%
+\begin{codeexample}[]
+% Define a data set:
+\tikz \datavisualization data group {example} = {
+data {
+ x, y
+ 0, 0
+ 0.5, 2
+ 1, 2
+ 1.5, 1.5
+ 2, 0.5
+}};
+\tikz \datavisualization [school book axes, visualize as line] data group {example};
+\qquad
+\tikz \datavisualization [school book axes, visualize as smooth line] data group {example};
+\qquad
+\tikz \datavisualization [school book axes, visualize as scatter] data group {example};
+\end{codeexample}
+
+Methods for styling visualizers are discussed in
+Section~\ref{section-dv-visualizer-styling}.
+
+
+\subsubsection{Using Multiple Visualizers}
+
+A data visualization may contain multiple data groups and for each data set we
+might wish to use a different visualizer. In this case, we need some way of
+telling the data visualization engine to which visualizer should be used with
+the different data points.
+
+To solve this problem, you can \emph{name} a visualizer. The visualizer's name
+can then both be used to configure the visualizer and also to indicate that
+data points ``belong'' to the visualizer.
+
+Naming a visualizer is quite simple: The |visualize as ...| keys actually take
+a single parameter, which is the name of the visualizer. For instance, the
+following code creates three visualizers, named |sin|, |cos|, and |tan|:
+%
+\begin{codeexample}[code only]
+visualize as line=sin,
+visualize as line=cos,
+visualize as scatter=tan
+\end{codeexample}
+
+(When you just say |visualize as line| without providing a name, the name
+|line| is chosen as a default, for |visualize as scatter| the name |scatter| is
+the default and so.)
+
+In order to indicate which data points should be visualized by which of these
+visualizers, the following key is important:
+
+\begin{key}{/data point/set}
+ A visualizer will only act on a data point when its name matches the value
+ of this key. Initially, this key is set to the last visualizer created, so
+ if there is only one, there is no need to set or worry about this key.
+\end{key}
+
+Since the |set| key has the path prefix |/data point|, it can be set like any
+other attribute of a data key:
+%
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as line=sin,
+ visualize as line=cos,
+ visualize as scatter=tan]
+data {
+ x, y, set
+ 0, 0, sin
+ 1, 1, sin
+ 2, 0, sin
+ 3, -1, sin
+ 4, 0, sin
+ 0, 1, cos
+ 1, 0, cos
+ 0, 0, tan
+ 1, 1, tan
+ 2, 2, tan
+ 3, 4, tan
+ 2, -1, cos
+ 3, 0, cos
+ 4, 1, cos
+};
+\end{codeexample}
+
+As can be seen, the data points with the same |set| attribute do not need to be
+consecutive.
+
+The above method of specifying the visualizer works nicely, but in most cases
+it would be more natural to keep the |set| attribute out of the table. This is
+easy to achieve by using multiple |data| and using the following key:
+
+\begin{key}{/pgf/data/set=\meta{name}}
+ Shorthand for |/data point/set=|\meta{name}.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as line=sin,
+ visualize as line=cos]
+data [set=sin] {
+ x, y
+ 0, 0
+ 1, 1
+ 2, 0
+ 3, -1
+ 4, 0
+}
+data [set=cos] {
+ x, y
+ 0, 1
+ 1, 0
+ 2, -1
+ 3, 0
+ 4, 1
+};
+\end{codeexample}
+ %
+\end{key}
+
+When you need to visualize several similar things in a single plot (like ten
+lines that all get visualized by |visualize as line|), it is somewhat
+cumbersome having to write this ten times. In this case you can shorten your
+code by making use of the |.list| key handler: When you add it to a key, the
+``value'' passed to the key is parsed as a list of values. The key is then
+executed once for each of these values:
+%
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as line/.list={sin, cos, tan}]
+data [set=sin, format=function] {
+ var x : interval[0:3*pi];
+ func y = sin(\value x r);
+}
+data [set=cos, format=function] {
+ var x : interval[0:3*pi];
+ func y = cos(\value x r);
+}
+data [set=tan, format=function] {
+ var x : interval[0:pi/2.2];
+ func y = tan(\value x r);
+};
+\end{codeexample}
+
+
+\subsubsection{Styling a Visualizer}
+\label{section-dv-visualizer-styling}
+
+In order to style a visualizer that has been created using for instance
+|visualize as line=|\meta{visualizer name}, you can use the following key:
+
+\begin{key}{/tikz/data visualization/\meta{visualizer name}=\meta{options}}
+ For each visualizer, a key of the same name is created with the path prefix
+ |/tikz/data visualization|. This key takes the \meta{options} and executes
+ them with the path prefix
+ %
+\begin{codeexample}[code only]
+/tikz/data visualization/visualizer options/
+\end{codeexample}
+ %
+ These options are then used to configure the appearance of the current
+ visualizer. (This is quite similar to the way options are passed to an axis
+ in order to configure the axis.) Possible options include |style|, but also
+ |label in legend| and |label in data|. The latter two options are discussed
+ in Section~\ref{section-dv-labels-in}, the first option below.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as smooth line/.list={sin, cos},
+ sin={style=red},
+ cos={style=blue}]
+data [set=sin, format=function] {
+ var x : interval[0:3*pi];
+ func y = sin(\value x r);
+}
+data [set=cos, format=function] {
+ var x : interval[0:3*pi];
+ func y = cos(\value x r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/style=\meta{options}}
+ The \meta{options} given to this key should be normal \tikzname\ options.
+ They will be executed when the visualizer is used.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as smooth line=sin,
+ sin={style={red, densely dotted}},
+ visualize as smooth line=cos,
+ cos={style={mark=x}},
+]
+data [set=sin, format=function] {
+ var x : interval[0:3*pi];
+ func y = sin(\value x r);
+}
+data [set=cos, format=function] {
+ var x : interval[0:3*pi];
+ func y = cos(\value x r);
+};
+\end{codeexample}
+
+ When you have multiple visualizers in a single data visualization, you can
+ use the |style| option with each visualizer to configure their different
+ appearances as in the above example. However, it is usually much better
+ (and easier) to use a style sheet, see
+ Section~\ref{section-dv-style-sheets}.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes={clean, end labels},
+ x axis={label=$x$}, y axis={grid={major also at=0}},
+ visualize as smooth line/.list={sin,cos,sin 2,cos 2},
+ legend={below, rows=2},
+ sin={label in legend={text=$\sin x$}},
+ cos={label in legend={text=$\cos x$}},
+ sin 2={label in legend={text=$\sin 2x$}},
+ cos 2={label in legend={text=$\cos 2x$}},
+ style sheet=strong colors]
+data [set=sin, format=function] {
+ var x : interval[0:3*pi];
+ func y = sin(\value x r);
+}
+data [set=cos, format=function] {
+ var x : interval[0:3*pi];
+ func y = cos(\value x r);
+}
+data [set=sin 2, format=function] {
+ var x : interval[0:3*pi];
+ func y = sin(2*\value x r);
+}
+data [set=cos 2, format=function] {
+ var x : interval[0:3*pi];
+ func y = cos(2*\value x r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/ignore style sheets}
+ This option, which should be passed to a visualizer after its creation
+ before another visualizer is created, causes style sheets \emph{not} to
+ apply to the visualizer (but the |style| option will still have an effect).
+ This allows you to create visualizers that are used for special purposes
+ and that do not ``take part'' in the usual styling. For instance, a
+ visualizer might be used internally to depict a regression line, even
+ though the regression line itself should not participate in the usual
+ styling by, say, dashing or different coloring.
+\end{key}
+
+In addition to the options passed to a visualizer via |style|, the following
+also gets executed when a visualizer is used:
+
+\begin{stylekey}{/tikz/data visualization/every visualizer}
+ This style is used with every visualizer. Note that it should contain
+ normal \tikzname\ keys.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ every visualizer/.style={dashed},
+ visualize as smooth line]
+data [format=function] {
+ var x : interval[0:3*pi];
+ func y = sin(\value x r);
+};
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Reference: Basic Visualizers}
+
+\subsubsection{Visualizing Data Points Using Lines}
+
+\begin{key}{/tikz/data visualizers/visualize as line=\meta{visualizer name} (default line)}
+ Creates a new visualizer named \meta{visualizer name}. Basically, this
+ visualizer connects all data points for which the |/data point/set|
+ attribute equals \meta{visualizer name} by a line that is styled by the
+ visualizer's style.
+
+ In more detail, the following happens:
+ %
+ \begin{enumerate}
+ \item A new object is created (of class |plot handler visualizer|) that
+ is configured to collect the canvas positions of all data points
+ whose |set| attribute equals \meta{visualizer name}.
+ \item During the end of the data visualization, \pgfname's plotting
+ mechanism (see Section~\ref{section-plots}) is used to plot the
+ stream of recorded data points.
+
+ This means that, in principle, all of the plot handlers available
+ in \tikzname\ could be used for the visualization (such as the
+ |smooth| handler). However, some plot handlers such as, say, the
+ |xcomb| are unsuitable as plot handlers since they do not support
+ the advanced axis handling done by the data visualization engine.
+ Because of this (and also for other reasons), you cannot set the
+ plot handler directly, but must use one of the options like
+ |straight line|, |smooth line| and others, documented in a moment.
+ \item Additionally, plot marks can be drawn at the collected data
+ points. Here, all of the options available to \tikzname\ for
+ drawing plot marks are available. To configure them, all options
+ offered by \tikzname\ for configuring marks are available such as
+ |mark repeat|:
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as line=my data,
+ my data={style={mark=x, mark repeat=3}}]
+data [format=function] {
+ var x : interval [0:pi] samples 10;
+ func y = sin(\value x r);
+};
+\end{codeexample}
+ \end{enumerate}
+
+ The line visualizer also provides a method of dealing with gaps in a line.
+ Take for instance the function $f(x) = \tan x$. When this function is
+ plotted over the interval $[0,\pi]$, then the function will go to $\pm
+ \infty$ at $\pi/2$. When we plot this, we might plot the function in the
+ interval $[0,\frac{\pi}{2}-\epsilon]$ and then continue in the interval
+ $[\frac{\pi}{2}+\epsilon,\pi]$. However, we do not want the point at
+ coordinate $\bigl(\frac{\pi}{2}- \epsilon, \tan(\frac{\pi}{2}-
+ \epsilon)\bigr)$ to be connected to the coordinate $\bigl(\frac{\pi}{2}+
+ \epsilon, \tan(\frac{\pi}{2}+ \epsilon)\bigr)$ by a line. Rather, there
+ should be a ``gap'' or a ``jump'' between these coordinates. To achieve
+ this, the following key can be used:
+ %
+ \begin{key}{/data point/outlier=\meta{value} (default true, initially \normalfont empty)}
+ When this key is set to anything non-empty value, a visualizer will
+ consider this data point to be an ``outlier''. For a line visualizer
+ this means that the point is not shown and that the current line ends
+ at the previous data point and a new line starts at the next data
+ point.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean, x axis={grid={major at=(pi/2)}},
+ visualize as smooth line]
+data [format=function] {
+ var x : interval[0:pi/2-0.1];
+ func y = tan(\value x r);
+}
+data point [outlier]
+data [format=function] {
+ var x : interval[pi/2+0.1:pi];
+ func y = tan(\value x r);
+};
+\end{codeexample}
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/data visualizers/visualize as smooth line=\meta{visualizer name} (default line)}
+ A shorthand |visualize as line=|\meta{visualizer name} followed
+ \meta{visualizer name}|=smooth line|.
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/straight line}
+ Causes the data points to be connected by straight lines.
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={straight line}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/straight cycle}
+ Causes the data points to be connected by a polygon.
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={straight cycle}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/polygon}
+ This is an alias for |straight cycle|.
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/smooth line}
+ Causes the data points to be connected by a line that is smoothed at the
+ joins:
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={smooth line}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/smooth cycle}
+ Causes the data points to be connected by a circular line that is smoothed
+ at the joins:
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={smooth cycle}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/gap line}
+ This key causes the data points to be connected by lines that ``do not
+ quite touch'' the data points. This is implemented by using the
+ |\pgfplothandlergaplineto|, see Section~\ref{section-plot-gapped}.
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={gap line}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/gap cycle}
+ Like |gapped line|, only with a cycle:
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={gap cycle}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/data visualization/visualizer options/no lines}
+ Suppresses the line. This option only makes sense when the |mark| option is
+ used.
+ %
+\begin{codeexample}[]
+\tikz [scale=.55] \datavisualization
+ [scientific axes=clean, all axes={ticks=few},
+ visualize as smooth line=my data, my data={no lines, style={mark=x}}]
+data [format=function] {
+ var t : interval [0:4] samples 5;
+ func x = cos(\value t r);
+ func y = sin(\value t r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Visualizing Data Points Using Marks}
+
+\begin{key}{/tikz/data visualizers/visualize as scatter=\meta{visualizer name} (default scatter)}
+ A shorthand |visualize as line=|\meta{visualizer name} followed
+ \meta{visualizer name}|=no lines| and setting the |style| of the visualizer
+ so that is will use |mark=x| (plus some size adjustments) to draw marks at
+ the data points.
+ %
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization
+ [scientific axes=clean,
+ visualize as scatter]
+data [format=function] {
+ var x : interval [0:pi] samples 10;
+ func y = sin(\value x r);
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Advanced: Creating New Visualizers}
+
+Creating a new visualizer is a two-stage process that does, unfortunately,
+require in-depth knowledge of the data visualization backend:
+%
+\begin{enumerate}
+ \item First, you need to create a new class using |\pgfooclass| whose
+ instances react to the signal |visualize datapoint signal|. This
+ requires detailed knowledge of the data visualization engine, see
+ Section~\ref{section-dv-backend}.
+ \item Second, you should provide keys on the \tikzname\ level for creating
+ the necessary objects. These keys invoke the key |new visualizer|
+ internally.
+\end{enumerate}
+
+\begin{key}{/tikz/data visualization/new visualizer=\marg{name}\marg{options}\marg{legend entry options}}
+ This key configures a new visualizer named \meta{name}. This entails the
+ following actions:
+ %
+ \begin{itemize}
+ \item The key |/tikz/data visualization/|\meta{name} is created. As
+ described earlier, this key can be used to pass for instance
+ |style| options to the visualizer.
+ \item The style key
+ |/tikz/data visualization/visualizers/|\meta{name}|/styling| is
+ created and made empty. This is the key in which the |style| key
+ will store the options passed to the visualizer.
+ \item The style key
+ |/tikz/data visualization/visualizers/|\meta{name}|/label in legend options|
+ is set to \meta{legend entry options}. These options are used to
+ configure how the visualizer should be rendered in a legend, see
+ Section~\ref{section-dv-legend-entries} for details.
+ \item The key |/data point/set/|\meta{name} is set to a number that is
+ increased for each visualizer in the current data visualization.
+ This number is important for style sheets, see
+ Section~\ref{section-dv-style-sheets}.
+ \item The key |/data point/|\meta{name}|/execute at begin| is set to
+ code that creates a |{scope}| that executes the following styles as
+ options:
+ %
+ \begin{enumerate}
+ \item The \meta{options} passed to the |new visualizer| key.
+ \item The |every visualizer| style.
+ \item The styling from the currently active style sheets, see
+ Section~\ref{section-dv-style-sheets}.
+ \item The styling stored in the |styling| key mentioned above.
+ \end{enumerate}
+ %
+ \item The key |/data point/|\meta{name}|/execute at end| is set to code
+ that will finish all paths that may have been created by the
+ visualizer and closes the scope.
+ \end{itemize}
+
+ All of the above mean the following in practice:
+ %
+ \begin{itemize}
+ \item Inside a new |visualize as ...| key, you pass the name of the
+ to-be-created to |new visualizer| as the first parameter and any
+ special default styling setup of the visualizer as the second
+ parameter.
+ \item The new |visualize as ...| key should also create a visualizer
+ object using |new object|.
+ \item When this object finally is about to create the actual
+ visualization, it should surround the code by invoking the code
+ stored in the |execute at begin| and the |execute at end| keys of
+ the visualizer.
+ \end{itemize}
+
+ Everything else is usually taken care of by the |new visualizer| key
+ automatically.
+\end{key}
+
+As an example, let us create a simple visualizer that creates a circle whose
+radius is dictated by the |radius| attribute. To keep things simple in this
+example, this attribute cannot be configured.
+
+First, we need the visualizer class. For this example I have boiled it down to
+a minimum:
+%
+\begin{codeexample}[code only]
+\pgfooclass{circle visualizer}
+{
+ % Stores the name of the visualizer. This is needed for filtering and configuration
+ \attribute name;
+
+ % The constructor. Just setup the attribute.
+ \method circle visualizer(#1) { \pgfooset{name}{#1} }
+
+ % Connect to visualize signal.
+ \method default connects() {
+ \pgfoothis.get handle(\me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\me,visualize,visualize datapoint signal)
+ }
+
+ % This method is invoked for each data point. It checks whether the data point belongs to the correct
+ % visualizer and, if so, calls the macro \dovisualization to do the actual visualization.
+ \method visualize() {
+ \pgfdvfilterpassedtrue
+ \pgfdvnamedvisualizerfilter
+ \ifpgfdvfilterpassed
+ \dovisualization
+ \fi
+ }
+}
+\end{codeexample}
+
+The |\dovisualization| method must now do the correct visualization.
+%
+\begin{codeexample}[code only]
+\def\dovisualization{
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at begin}
+ \pgfpathcircle{\pgfpointdvdatapoint}{\pgfkeysvalueof{/data point/radius}}
+ % \pgfusepath is done by |execute at end|
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at end}
+}
+\end{codeexample}
+
+Finally, we create a |visualize as| key:
+%
+\begin{codeexample}[code only]
+\tikzdatavisualizationset{
+ visualize as circle/.style={
+ new object={
+ when=after survey,
+ store=/tikz/data visualization/visualizers/#1,
+ class=circle visualizer,
+ arg1=#1
+ },
+ new visualizer={#1}{%
+ color=visualizer color, % a color setup by the style sheet
+ every path/.style={fill,draw}, % fill and draw the circle by default,
+ }{}, % let's ignore legends in this example
+ /data point/set=#1
+ },
+ visualize as circle/.default=circle
+}
+\end{codeexample}
+
+Now, let's see how this works:
+
+\pgfooclass{circle visualizer} {
+ % Stores the name of the visualizer. This is needed for filtering
+ % and configuration
+ \attribute name;
+
+ % The constructor. Just setup the attribute.
+ \method circle visualizer(#1) { \pgfooset{name}{#1} }
+
+ % Connect to visualize signal.
+ \method default connects() {
+ \pgfoothis.get handle(\me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\me,visualize,visualize datapoint signal)
+ }
+
+ % This method is invoked for each data point. It checks whether the
+ % data point belongs to the correct visualizer and, if so, calls the
+ % macro \dovisualization to do the actual visualization.
+ \method visualize() {
+ \pgfdvfilterpassedtrue
+ \pgfdvnamedvisualizerfilter
+ \ifpgfdvfilterpassed
+ \dovisualization
+ \fi
+ }
+}
+
+\def\dovisualization{
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at begin}
+ \pgfpathcircle{\pgfpointdvdatapoint}{\pgfkeysvalueof{/data point/radius}}
+ % \pgfusepath is done by |execute at end|
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at end}
+}
+
+\tikzdatavisualizationset{
+ visualize as circle/.style={
+ new object={
+ when=after survey,
+ store=/tikz/data visualization/visualizers/#1,
+ class=circle visualizer,
+ arg1=#1
+ },
+ new visualizer={#1}{%
+ color=visualizer color, % a color setup by the style sheet
+ every path/.style={fill,draw}, % fill and draw the circle by default,
+ }{},
+ /data point/set=#1
+ },
+ visualize as circle/.default=circle
+}
+
+\begin{codeexample}[width=7cm]
+\tikz \datavisualization [
+ scientific axes=clean,
+ visualize as circle/.list={a, b, c},
+ style sheet=strong colors]
+data [set=a] {
+ x, y, radius
+ 0, 0, 2pt
+ 1, 1, 3pt
+ 1, 2, 3pt
+ 2, 0, 1pt
+}
+data [set=b] {
+ x, y, radius
+ 0.5, 0.5, 5pt
+ 1, 1.5, 2pt
+ 1, 2.5, 3pt
+ 0, 2, 4pt
+}
+data [set=c] {
+ x, y, radius
+ 3, 2, 3pt
+ 2.5, 0.5, 4pt
+};
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithm-layer.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithm-layer.tex
new file mode 100644
index 0000000000..aa9fa817a9
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithm-layer.tex
@@ -0,0 +1,832 @@
+% Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+% Copyright 2011 by Till Tantau
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{The Algorithm Layer}
+\label{section-gd-algorithm-layer}
+
+\noindent{\emph{by Till Tantau}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\subsection{Overview}
+
+The present section is addressed at readers interested in implementing new
+graph drawing algorithms for the graph drawing system. Obviously, in order to
+do so, you need to have an algorithm in mind and also some programming skills;
+but fortunately only in the Lua programming language: Even though the graph
+drawing system was originally developed as an extension of \tikzname, is has
+been restructured so that the ``algorithm layer'' where you define algorithms
+is scrupulously separated from \tikzname. In particular, an algorithm declared
+and implemented on this layer can be used in with every ``display layers'', see
+Section~\ref{section-gd-display-layer}, without change. Nevertheless, in the
+following we will use the \tikzname\ display layer and syntax in our examples.
+
+Normally, new graph drawing algorithms can and must be implemented in the Lua
+programming language, which is a small, easy-to-learn (and quite beautiful)
+language integrated into current versions of \TeX. However, as explained in
+Section~\ref{section-algorithms-in-c}, you can also implement algorithms in C
+or C++ (and, possibly, in the future also in other languages), but this comes
+at a great cost concerning portability. In the present section, I assume that
+you are only interested in writing an algorithm using Lua.
+
+In the following, after a small ``hello world'' example of graph drawing and a
+discussion of technical details like how to name files so that \TeX\ will find
+them, we have a look at the main parts of the algorithm layer:
+%
+\begin{itemize}
+ \item Section~\ref{section-gd-namespaces} gives and overview of the
+ available namespaces and also of naming conventions used in the graph
+ drawing system.
+ \item Section~\ref{section-gd-gd-scope} explores what graph drawing scopes
+ ``look like on the algorithm layer''. As the graph of a graph drawing
+ scope is being parsed on the display layer, a lot of information is
+ gathered: The nodes and edges of the graph are identified and the
+ object-oriented model is built, but other information is also
+ collected. For instance, a sequence of \emph{events} is created during
+ the parsing process. As another example, numerous kinds of
+ \emph{collections} may be identified by the parser. The parsed graph
+ together with the event sequence and the collections are all gathered
+ in a single table, called the \emph{scope table} of the current graph
+ drawing scope. Algorithms can access this table to retrieve information
+ that goes beyond the ``pure'' graph model.
+
+ One entry in this table is of particular importance: The
+ \emph{syntactic digraph.} While most graph drawing algorithms are not
+ really interested in the ``details'' of how a graph was specified, for
+ some algorithms it makes a big difference whether you write |a -> b| or
+ |b <- a| in your specification of the graph. These algorithms can
+ access the ``fine details'' of how the input graph was specified
+ through the syntactic digraph; all other algorithms can access their
+ |digraph| or |ugraph| fields and do not have to worry about the
+ difference between |a -> b| and |b <- a|.
+ \item Section~\ref{section-gd-models} explains the object-oriented model of
+ graphs used throughout the graph drawing system. Graph drawing
+ algorithms do not get the ``raw'' specification used by the user to
+ specify a graph (like |{a -> {b,c}}| in the |graph| syntax). Instead,
+ what a graph drawing algorithm sees is ``just'' a graph object that
+ provides methods for accessing the vertices and arcs.
+ \item Section~\ref{section-gd-transformations} explains how the information
+ in the graph drawing scope is processed. One might expect that we
+ simply run the algorithm selected by the user; however, things are more
+ involved in practice. When the layout of a graph needs to be computed,
+ only very few algorithms will actually be able to compute positions for
+ the nodes of \emph{every} graph. For instance, most algorithms
+ implicitly assume that the input graph is connected; algorithms for
+ computing layouts for trees assume that the input is, well, a tree; and
+ so on. For this reason, graph drawing algorithms will not actually need
+ the original input graph as their input, but some \emph{transformed}
+ version of it. Indeed, \emph{all} graph drawing algorithms are treated
+ as graph transformations by the graph drawing engine.
+
+ This section explains how transformations are chosen and which
+ transformations are applied by default.
+ \item Section~\ref{section-gd-interface-to-algorithms} documents the
+ interface-to-algorithm class. This interface encapsulates all that an
+ algorithm ``sees'' of the graph drawing system (apart from the classes
+ in |model| and |lib|).
+ \item Section~\ref{section-gd-examples} provides a number of complete
+ examples that show how graph drawing algorithms can, actually, be
+ implemented.
+ \item Section~\ref{section-gd-libs} documents the different libraries
+ functions that come with the graph drawing engine. For instance, there
+ are library functions for computing the (path) distance of nodes in a
+ graph; a parameter that is needed by some algorithms.
+\end{itemize}
+
+
+\subsection{Getting Started}
+
+In this section, a ``hello world'' example of a graph drawing algorithm is
+given, followed by an overview of the organization of the whole engine.
+
+
+\subsubsection{The Hello World of Graph Drawing}
+
+Let us start our tour of the algorithm layer with a ``hello world'' version of
+graph drawing: An algorithm that simply places all nodes of a graph in a circle
+of a fixed radius. Naturally, this is not a particularly impressive or
+intelligent graph drawing algorithm; but neither is the classical ``hello
+world''$\dots$\ Here is a minimal version of the needed code (this is not the
+typical way of formulating the code, but it is the shortest; we will have a
+look at the more standard and verbose way in a moment):
+%
+\begin{codeexample}[code only, tikz syntax=false]
+pgf.gd.interface.InterfaceToAlgorithms.declare {
+ key = "very simple demo layout",
+ algorithm = {
+ run =
+ function (self)
+ local alpha = (2 * math.pi) / #self.ugraph.vertices
+ for i,vertex in ipairs(self.ugraph.vertices) do
+ vertex.pos.x = math.cos(i * alpha) * 25
+ vertex.pos.y = math.sin(i * alpha) * 25
+ end
+ end
+ }
+}
+\end{codeexample}
+\directlua{
+pgf.gd.interface.InterfaceToAlgorithms.declare {
+ key = "very simple demo layout",
+ algorithm = {
+ run =
+ function (self)
+ local alpha = (2 * math.pi) / \luaescapestring{#}self.ugraph.vertices
+ for i,vertex in ipairs(self.ugraph.vertices) do
+ vertex.pos.x = math.cos(i * alpha) * 25
+ vertex.pos.y = math.sin(i * alpha) * 25
+ end
+ end
+ }
+}
+}
+
+This code \emph {declares} a new algorithm (|very simple demo layout|) and
+includes an implementation of the algorithm (through the |run| field of the
+|algorithm| field). When the |run| method is called, the |self| parameter will
+contain the to-be-drawn graph in its |ugraph| field. It is now the job of the
+code to modify the positions of the vertices in this graph (in the example,
+this is done by assigning values to |vertex.pos.x| and |vertex.pos.y|).
+
+In order to actually \emph{use} the algorithm, the above code first needs to be
+executed somehow. For \tikzname, one can just call |\directlua| on it or put it
+in a file and then use |\directlua| plus |require| (a better alternative) or
+you put it in a file like |simpledemo.lua| and use |\usegdlibrary{simpledemo}|
+(undoubtedly the ``best'' way). For another display layer, like a graphical
+editor, the code could also be executed through the use of |require|.
+
+Executing the code ``just'' declares the algorithm, this is what the |declare|
+function does. Inside some internal tables, the algorithm layer will store the
+fact that a |very simple demo layout| is now available. The algorithm layer
+will also communicate with the display layer through the binding layer to
+advertise this fact to the ``user''. In the case of \tikzname, this means that
+the option key |very simple demo layout| becomes available at this point and we
+can use it like this:
+%
+\begin{codeexample}[]
+\tikz [very simple demo layout]
+ \graph { f -> c -> e -> a -> {b -> {c, d, f}, e -> b}};
+\end{codeexample}
+
+It turns out, that our little algorithm is already more powerful than one might
+expect. Consider the following example:
+%
+\begin{codeexample}[]
+\tikz [very simple demo layout, componentwise]
+ \graph {
+ 1 -> 2 ->[orient=right] 3 -> 1;
+ a -- b --[orient=45] c -- d -- a;
+ };
+\end{codeexample}
+
+Note that, in our algorithm, we ``just'' put all nodes on a circle around the
+origin. Nevertheless, the graph gets decomposed into two connected components,
+the components are rotated so that the edge from node |2| to node |3| goes from
+left to right and the edge from |b| to |c| goes up at an angle of $45^\circ$,
+and the components are placed next to each other so that some spacing is
+achieved.
+
+The ``magic'' that achieves all this behind the scenes is called ``graph
+transformations''. They will heavily pre- and postprocess the input and output
+of graph drawing algorithms to achieve the above results.
+
+Naturally, some algorithms may not wish their inputs and/or outputs to be
+``tampered'' with. An algorithm can easily configure which transformations
+should be applied, by passing appropriate options to |declare|.
+
+
+\subsubsection{Declaring an Algorithm}
+
+Let us now have a look at how one would ``really'' implement the example
+algorithm. First of all, we place our algorithm in a separate file called, say,
+|ExampleLayout.lua|. This way, by putting it in a separate file, all display
+layers can easily install the algorithm at runtime by saying
+|require "ExampleLayout"|.
+
+Next, the |declare| function is needed quite often, so it makes sense to create
+a short local name for it:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+-- This is the file ExampleLayout.lua
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+\end{codeexample}
+
+The |declare| function is the work-horse of the algorithm layer. It takes a
+table that contains at least a |key| field, which must be a unique string, and
+some other fields that specify in more detail what kind of key is declared.
+Once declared through a call of |declare|, the ``key'' can be used on the
+display layer.
+
+For declaring an algorithm, the table passed to |declare| must contain a field
+|algorithm|. This field, in turn, must (normally) be set to a table that will
+become the algorithm class. In the above example, our algorithm was so simple
+that we could place the whole definition of the class inside the call of
+|declare|, but normally the class is defined in more detail after the call to
+|declare|:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+local ExampleClass = {} -- A local variable holding the class table
+
+declare {
+ key = "very simple demo layout",
+ algorithm = ExampleClass
+}
+
+function ExampleClass:run ()
+ local alpha = (2 * math.pi) / #self.ugraph.vertices
+ ...
+end
+\end{codeexample}
+
+The effect of the |declare| will be that the table stored in |ExampleClass| is
+setup to form a class in the sense of object-oriented programming. In
+particular, a static |new| function is installed.
+
+Now, whenever the user uses the key |very simple demo layout| on a graph, at
+some point the graph drawing engine will create a new instance of the
+|ExampleClass| using |new| and will then call the |run| method of this class.
+The class can have any number of other methods, but |new| and |run| are the
+only ones directly called by the graph drawing system.
+
+
+\subsubsection{The Run Method}
+
+The |run| method of an algorithm classes lies at the heart of any graph drawing
+algorithm. This method will be called whenever a graph needs to be laid out.
+Upon this call, the |self| object will have some important fields set:
+%
+\begin{itemize}
+ \item |ugraph| This stands for ``undirected graph'' and is the
+ ``undirected'' version of the to-be-laid out graph. In this graph,
+ whenever there is an arc between $u$ and $v$, there is also an arc
+ between $v$ and $u$. It is obtained by considering the syntactic
+ digraph and then ``forgetting'' about the actual direction of the
+ edges.
+
+ When you have set certain |preconditions| in your algorithm class, like
+ |connected=true|, the |ugraph| will satisfy these conditions. In
+ particular, the |ugraph| typically will not be the underlying
+ undirected graph of the complete syntactic digraph, but rather of some
+ part of it. The use of (sub)layouts will also modify the syntactic
+ digraph is fancy ways.
+
+ Refer to this graph whenever your algorithm is ``most comfortable''
+ with an undirected graph, as is the case for instance for most
+ force-base algorithms.
+ \item |digraph| This stands for ``directed graph'' and is the
+ ``semantically directed'' version of the to-be-laid out graph.
+ Basically, when happens is that reverse edges in the syntactic digraph
+ (an edge like |b <- a|) will yield an |Arc| from |a| to |b| in the
+ |digraph| while they yield a |b| to |a| arc and edge in the syntactic
+ digraph. Also, undirected edges like |a -- b| are replaced by directed
+ edges in both directions between the vertices.
+ \item |scope| The graph drawing scope.
+ \item |layout| The layout object for this graph. This is a collection of
+ kind |layout|.
+\end{itemize}
+
+
+\subsubsection{Loading Algorithms on Demand}
+
+In order to use the |very simple demo layout| on the display layer, |declare|
+must have been called for this key. However, we just saw that the |declare|
+function takes the actual class table as parameter and, thus, whenever an
+algorithm is declared, it is also completely loaded and compiled at this point.
+
+This is not always desirable. A user may wish to include a number of libraries
+in order to declare a large number of potentially useful algorithms, but will
+not actually use all of them. Indeed, at least for large, complex algorithms,
+it is preferable that the algorithm's code is loaded only when the algorithm is
+used for the first time.
+
+Such a ``loading of algorithms on demand'' is supported through the option of
+setting the |algorithm| field in a |declare| to a string. This string must now
+be the file name of a Lua file that contains the code of the actual algorithm.
+When the key is actually used for the first time, this file will be loaded. It
+must return a table that will be plugged into the |algorithm| field; so
+subsequent usages of the key will not load the file again.
+
+The net effect of all this is that you can place implementations of algorithms
+in files separate from interface files that just contain the |declare| commands
+for these algorithms. You will typically do this only for rather large
+algorithms.
+
+For our example, the code would look like this:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+-- File ExampleLayout.lua
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+declare {
+ key = "very simple demo layout",
+ algorithm = "ExampleLayoutImplementation"
+}
+\end{codeexample}
+
+\begin{codeexample}[code only, tikz syntax=false]
+-- File ExampleLayoutImplementation.lua
+local ExampleClass = {}
+function ExampleClass:run ()
+ local alpha = (2 * math.pi) / #self.ugraph.vertices
+ ...
+end
+return ExampleClass
+\end{codeexample}
+
+
+\subsubsection{Declaring Options}
+
+Let us now make our example algorithm a bit more ``configurable''. For this, we
+use |declare| once more, but instead of the |algorithm| field, we use a |type|
+field. This tells the display layer that the key is not used to select an
+algorithm, but to configure ``something'' about the graph or about nodes or
+edges.
+
+In our example, we may wish to configure the radius of the graph. So, we
+introduce a |radius| key (actually, this key already exists, so we would not
+need to declare it, but let us do so anyway for example purposes):
+%
+\begin{codeexample}[code only, tikz syntax=false]
+declare {
+ key = "radius",
+ type = "length",
+ initial = "25pt"
+}
+\end{codeexample}
+
+This tells the display layer that there is now an option called |radius|, that
+users set it to some ``length'', and that if it is not set at all, then the
+25pt should be used.
+
+To access what the user has specified for this key, an algorithm can access the
+|options| field of a graph, vertex, or arc at the key's name:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+ vertex.pos.x = math.cos(i * alpha) * vertex.options.radius
+ vertex.pos.y = math.sin(i * alpha) * vertex.options.radius
+\end{codeexample}
+
+
+\subsubsection{Adding Inline Documentation}
+
+You should always document the keys you |declare|. For this, the |declare|
+function allows you to add three fields to its argument table:
+%
+\begin{itemize}
+ \item |summary| This should be a string that succinctly summarizes the
+ effect this key has. The idea is that this text will be shown as a
+ ``tooltip'' in a graphical editor or will be printed out by a command
+ line tool when a user requests help about the key. You can profit from
+ using Lua's |[[| and |]]| syntax for specifying multi-line strings.
+
+ Also, when the file containing the key is parsed for this manual, this
+ text will be shown.
+ \item |documentation| When present, this field contains a more extensive
+ documentation of the key. It will also be shown in this manual, but
+ typically not as a tool tip.
+ \item |examples| This should either be a single string or an array of
+ strings. Each string should be an example demonstrating how the key is
+ used in \tikzname. They will all be included in the manual, each
+ surrounded by a |codeexample| environment.
+\end{itemize}
+
+Let us augment our |radius| key with some documentation. The three dashes
+before the |declare| are only needed when the declaration is part of this
+manual and they will trigger an inclusion of the key in the manual.
+%
+\begin{codeexample}[code only, tikz syntax=false]
+---
+declare {
+ key = "radius",
+ type = "length",
+ initial = "25pt",
+ summary = [[
+ Specifies the radius of a circle on which the nodes are placed when
+ the |very simple example layout| is used. Each vertex can have a
+ different radius.
+ ]],
+ examples = [[
+ \tikz \graph [very simple example layout, radius=2cm] {
+ a -- b -- c -- d -- e;
+ };
+ ]]
+}
+\end{codeexample}
+
+As a courtesy, all of the strings given in the documentation can start and end
+with quotation marks, which will be removed. (This helps syntax highlighting
+with editors that do not recognize the |[[| to |]]| syntax.) Also, the
+indentation of the strings is removed (we compute the minimum number of leading
+spaces on any line and remove this many spaces from all lines).
+
+
+\subsubsection{Adding External Documentation}
+\label{section-gd-documentation-in}
+
+As an alternative to inlining documentation, you can also store the
+documentation of keys in a separate file that is loaded only when the
+documentation is actually accessed. Since this happens only rarely (for
+instance, not at all, when \tikzname\ is run, except for this manual), this
+will save time and space. Also, for C code, it is impractical to store
+multi-line documentation strings directly in the C file.
+
+In order to store documentation externally, instead of the |summary|,
+|documentation|, and |examples| keys, you provide the key |documentation_in|.
+The |documentation_in| key must be set to a string that is input using
+|require|.
+
+In detail, when someone tries to access the |summary|, |documentation|, or
+|examples| field of a key and these keys are not (yet) defined, the system
+checks whether the |documentation_in| key is set. If so, we apply |require| to
+the string stored in this field. The file loaded in this way can now setup the
+missing fields of the current key and, typically, also of all other keys
+defined in the same file as the current key. For this purpose, it is advisable
+to use the |pgf.gd.doc| class:
+
+\includeluadocumentationof{pgf.gd.doc}
+
+As a longer example, consider the following declarations:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+---
+declare {
+ key = "very simple demo layout",
+ algorithm = ExampleClass,
+ documentation_in = "documentation_file"
+}
+
+---
+declare {
+ key = "radius",
+ type = "length",
+ initial = "25",
+ documentation_in = "documentation_file"
+}
+\end{codeexample}
+
+The file |documentation_file.lua| would look like this:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+-- File documentation_file.lua
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+key "very simple demo layout"
+documentation "This layout is a very simple layout that, ..."
+
+key "radius"
+summary "Specifies the radius of a circle on which the nodes are placed."
+documentation
+[[
+This key can be used together with |very simple example layout|. An
+important feature ist that...
+]]
+example
+[[
+\tikz \graph [very simple example layout, radius=2cm]
+{ a -- b -- c -- d -- e; };
+]]
+\end{codeexample}
+
+
+\subsection{Namespaces and File Names}
+\label{section-gd-namespaces}
+
+\subsubsection{Namespaces}
+
+All parts of the graph drawing library reside in the Lua ``namespace''
+|pgf.gd|, which is itself a ``sub-namespace'' of |pgf|. For your own
+algorithms, you are free to place them in whatever namespace you like; only for
+the official distribution of \pgfname\ everything has been put into the correct
+namespace.
+
+Let us now have a more detailed look at these namespaces. A namespace is just a
+Lua table, and sub-namespaces are just subtables of namespace tables. Following
+the Java convention, namespaces are in lowercase letters. The following
+namespaces are part of the core of the graph drawing engine:
+%
+\begin{itemize}
+ \item |pgf| This namespace is the main namespace of \pgfname. Other parts
+ of \pgfname\ and \tikzname\ that also employ Lua should put an entry
+ into this table. Since, currently, only the graph drawing engine
+ adheres to this rule, this namespace is declared inside the graph
+ drawing directory, but this will change.
+
+ The |pgf| table is the \emph{only} entry into the global table of Lua
+ generated by the graph drawing engine (or, \pgfname, for that matter).
+ If you intend to extend the graph drawing engine, do not even
+ \emph{think} of polluting the global namespace. You will be fined.
+ \item |pgf.gd| This namespace is the main namespace of the graph drawing
+ engine, including the object-oriented models of graphs and the layout
+ pipeline. Algorithms that are part of the distribution are also inside
+ this namespace, but if you write your own algorithms you do not need
+ place them inside this namespace. (Indeed, you probably should not
+ before they are made part of the official distribution.)
+ \item |pgf.gd.interface| This namespace handles, on the one hand, the
+ communication between the algorithm layer and the binding layer and, on
+ the other hand, the communication between the display layer (\tikzname)
+ and the binding layer.
+ \item |pgf.gd.binding| So-called ``bindings'' between display layers and
+ the graph drawing system reside in this namespace.
+ \item |pgf.gd.lib| Numerous useful classes that ``make an algorithm's your
+ life easier'' are collected in this namespace. Examples are a class for
+ decomposing a graph into connected components or a class for computing
+ the ideal distance between two sibling nodes in a tree, taking all
+ sorts of rotations and separation parameters into account.
+ \item |pgf.gd.model| This namespace contains all Lua classes that are part
+ of the object-oriented model of graphs employed throughout the graph
+ drawing engine. For readers familiar with the model--view--controller
+ pattern: This is the namespace containing the model-part of this
+ pattern.
+ \item |pgf.gd.control| This namespace contains the ``control logic'' of the
+ graph drawing system. It will transform graphs according to rules,
+ disassemble layouts and sublayouts and will call the appropriate
+ algorithms. For readers still familiar with the model--view--controller
+ pattern: This is the namespace containing the control-part of this
+ pattern.
+ \item |pgf.gd.trees| This namespace contains classes that are useful for
+ dealing with graphs that are trees. In particular, it contains a class
+ for computing a spanning tree of an arbitrary connected graph; an
+ operation that is an important preprocessing step for many algorithms.
+
+ In addition to providing ``utility functions for trees'', the namespace
+ \emph{also} includes actual algorithms for computing graph layouts like
+ |pgf.gd.trees.ReingoldTilford1981|. It may seem to be a bit of an
+ ``impurity'' that a namespace mixes utility classes and ``real''
+ algorithms, but experience has shown that it is better to keep things
+ together in this way.
+
+ Concluding the analogy to the model--view--controller pattern, a graph
+ drawing algorithm is, in a loose sense, the ``view'' part of the
+ pattern.
+ \item |pgf.gd.layered| This namespace provides classes and functions for
+ ``layered'' layouts; the Sugiyama layout method being the most
+ well-known one. Again, the namespace contains both algorithms to be
+ used by a user and utility functions.
+ \item |pgf.gd.force| Collects force-based algorithms and, again, also
+ utility functions and classes.
+ \item |pgf.gd.examples| Contains some example algorithms. They are
+ \emph{not} intended to be used directly, rather they should serve as
+ inspirations for readers wishing to implement their own algorithms.
+\end{itemize}
+
+There are further namespaces that also reside in the |pgf.gd| namespace, these
+namespaces are used to organize different graph drawing algorithms into
+categories.
+
+In Lua, similarly to Java, when a class |SomeClass| is part of, say, the
+namespace |pgf.gd.example|, it is customary to put the class's code in a file
+|SomeClass.lua| and then put this class in a directory |example|, that is a
+subdirectory of a directory |gd|, which is in turn a subdirectory of a
+directory |pgf|. When you write \texttt{require "pgf.gd.example.SomeClass"} the
+so-called \emph{loader} will turn this into a request for the file
+\texttt{pgf/gd/example/SomeClass.lua} (for Unix systems).
+
+
+\subsubsection{Defining and Using Namespaces and Classes}
+
+There are a number of rules concerning the structure and naming of namespaces
+as well as the naming of files. Let us start with the rules for naming
+namespaces, classes, and functions. They follow the ``Java convention'':
+%
+\begin{enumerate}
+ \item A namespace is a short lowercase |word|.
+ \item A function in a namespace is in
+ |lowercase_with_underscores_between_words|.
+ \item A class name is in |CamelCaseWithAnUppercaseFirstLetter|.
+ \item A class method name is in |camelCaseWithALowercaseFirstLetter|.
+\end{enumerate}
+
+From Lua's point of view, every namespace and every class is just a table.
+However, since these tables will be loaded using Lua's |require| function, each
+namespace and each class must be placed inside a separate file (unless you
+modify the |package.loaded| table, but, then, you know what you are doing
+anyway). Inside such a file, you should first declare a local variable whose
+name is the name of the namespace or class that you intend to define and then
+assign a (possibly empty) table to this variable:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+-- File pgf.gd.example.SomeClass.lua:
+local SomeClass = {}
+\end{codeexample}
+%
+Next, you should add your class to the encompassing namespace. This is achieved
+as follows:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+require("pgf.gd.example").SomeClass = SomeClass
+\end{codeexample}
+%
+The reason this works is that the |require| will return the table that is the
+namespace |pgf.gd.example|. So, inside this namespace, the |SomeClass| field
+will be filled with the table stored in the local variable of the same name --
+which happens to be the table representing the class.
+
+At the end of the file, you must write
+%
+\begin{codeexample}[code only, tikz syntax=false]
+return SomeClass
+\end{codeexample}
+%
+This ensures that the table that is defined in this file gets stored by Lua in
+the right places. Note that you need and should not use Lua's |module| command.
+The reason is that this command has disappeared in the new version of Lua and
+that it is not really needed.
+
+Users of your class can import and use your class by writing:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+...
+local SomeClass = require "pgf.gd.examples.SomeClass"
+...
+\end{codeexample}
+
+
+\subsection{The Graph Drawing Scope}
+\label{section-gd-gd-scope}
+
+\includeluadocumentationof{pgf.gd.interface.Scope}
+
+
+\subsection{The Model Classes}
+\label{section-gd-models}
+
+All that a graph drawing algorithm will ``see'' of the graph specified by the
+user is a ``graph object''. Such an object is an object-oriented model of the
+user's graph that no longer encodes the specific way in which the user
+specified the graph; it only encodes which nodes and edges are present. For
+instance, the \tikzname\ graph specification
+%
+\begin{codeexample}[code only]
+graph { a -- {b, c} }
+\end{codeexample}
+%
+\noindent and the graph specification
+%
+\begin{codeexample}[code only]
+node (a) { a }
+child { node (b) {b} }
+child { node (c) {c} }
+\end{codeexample}
+%
+will generate exactly the same graph object.
+
+\begin{luanamespace}{pgf.gd.}{model}
+ This namespace contains the classes modeling graphs, nodes, and edges.
+ Also, the |Coordinate| class is found here, since coordinates are also part
+ of the modeling.
+\end{luanamespace}
+
+
+\subsubsection{Directed Graphs (Digraphs)}
+
+Inside the graph drawing engine, the only model of a graph that is available
+treats graphs as
+%
+\begin{enumerate}
+ \item directed (all edges have a designated head and a designated tail) and
+ \item simple (there can be at most one edge between any pair of nodes).
+\end{enumerate}
+%
+These two properties may appear to be somewhat at odds with what users can
+specify as graphs and with what some graph drawing algorithms might expect as
+input. For instance, suppose a user writes
+%
+\begin{codeexample}[code only]
+graph { a -- b --[red] c, b --[green, bend right] c }
+\end{codeexample}
+%
+In this case, it seems that the input graph for a graph drawing algorithm
+should actually be an \emph{undirected} graph in which there are
+\emph{multiple} edges (namely $2$) between |b| and~|c|. Nevertheless, the graph
+drawing engine will turn the user's input a directed simple graph in ways
+described later. You do not need to worry that information gets lost during
+this process: The \emph{syntactic digraph,} which is available to graph drawing
+algorithms on request, stores all the information about which edges are present
+in the original input graph.
+
+The main reasons for only considering directed, simple graphs are speed and
+simplicity: The implementation of these graphs has been optimized so that all
+operations on these graphs have a guaranteed running time that is small in
+practice.
+
+\includeluadocumentationof{pgf.gd.model.Digraph}
+
+
+\subsubsection{Vertices}
+
+\includeluadocumentationof{pgf.gd.model.Vertex}
+
+
+\subsubsection{Arcs}
+\label{section-gd-arc-model}
+
+\includeluadocumentationof{pgf.gd.model.Arc}
+
+
+\subsubsection{Edges}
+
+\includeluadocumentationof{pgf.gd.model.Edge}
+
+
+\subsubsection{Collections}
+
+\includeluadocumentationof{pgf.gd.model.Collection}
+
+
+\subsubsection{Coordinates, Paths, and Transformations}
+
+\includeluadocumentationof{pgf.gd.model.Coordinate}
+\includeluadocumentationof{pgf.gd.model.Path}
+\includeluadocumentationof{pgf.gd.lib.Transform}
+
+
+\subsubsection{Options and Data Storages for Vertices, Arcs, and Digraphs}
+
+Many objects in the graph drawing system have an |options| table attached to
+them. These tables will contain the different kinds options specified by the
+user for the object. For efficiency reasons, many objects may share the same
+options table (since, more often than not, almost all objects have exactly the
+same |options| table). For this reason, you cannot store anything in an options
+table, indeed, you should never attempt to write anything into an options
+table. Instead, you should use a |Storage|.
+
+\includeluadocumentationof{pgf.gd.lib.Storage}
+
+
+\subsubsection{Events}
+
+\includeluadocumentationof{pgf.gd.lib.Event}
+
+
+\subsection{Graph Transformations}
+\label{section-gd-transformations}
+
+\subsubsection{The Layout Pipeline}
+
+\includeluadocumentationof{pgf.gd.control.LayoutPipeline}
+
+
+\subsubsection{Hints For Edge Routing}
+
+\includeluadocumentationof{pgf.gd.routing.Hints}
+
+
+\subsection{The Interface To Algorithms}
+\label{section-gd-interface-to-algorithms}
+
+\includeluadocumentationof{pgf.gd.interface.InterfaceToAlgorithms}
+
+
+\subsection{Examples of Implementations of Graph Drawing Algorithms}
+\label{section-gd-examples}
+
+\includeluadocumentationof{pgf.gd.examples.library}
+\includeluadocumentationof{pgf.gd.examples.SimpleDemo}
+\includeluadocumentationof{pgf.gd.examples.SimpleEdgeDemo}
+\includeluadocumentationof{pgf.gd.examples.SimpleHuffman}
+
+
+\subsection{Support Libraries}
+\label{section-gd-libs}
+
+The present section lists a number of general-purpose libraries that are used
+by different algorithms.
+
+\subsubsection{Basic Functions}
+
+\includeluadocumentationof{pgf}
+
+\includeluadocumentationof{pgf.gd.lib}
+
+
+\subsubsection{Lookup Tables}
+
+\includeluadocumentationof{pgf.gd.lib.LookupTable}
+
+
+\subsubsection{Computing Distances in Graphs}
+
+\emph{Still needs to be ported to digraph classes!}
+
+%\includeluadocumentationof{pgf.gd.lib.PathLengths}
+
+
+\subsubsection{Priority Queues}
+
+\includeluadocumentationof{pgf.gd.lib.PriorityQueue}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithms-in-c.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithms-in-c.tex
new file mode 100644
index 0000000000..042493105d
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-algorithms-in-c.tex
@@ -0,0 +1,864 @@
+% Copyright 2012 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Writing Graph Drawing Algorithms in C}
+\label{section-algorithms-in-c}
+
+\noindent{\emph{by Till Tantau}}
+\bigskip
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+In the present section we have a look at how graph drawing
+algorithms written in the C programming language (or in C++) can be
+used in the graph drawing framework.
+
+\begin{quote}
+ \emph{Warning:} Graph drawing algorithms written in C can be incredibly
+ fast if you use the facilities of C correctly. \emph{However,} C code is
+ much less portable than Lua code in the sense that it has to be compiled
+ for the specific platform used by the user and that it has to be linked
+ dynamically during a run of the \TeX\ program. All of this in possible (and
+ works, as demonstrated by the linking of the \textsc{ogdf} framework), but
+ it is \emph{much} harder to get right than writing Lua code.
+
+ Bottom line, \emph{you really should be using this method only if it is
+ really necessary (namely, when Lua code is simply not fast enough).}
+\end{quote}
+
+In the following, I first explain how the link between \TeX\ and C code works,
+in general. Then, in the subsequent sections, we go over the different kinds of
+programming languages and frameworks for which there is direct support for such
+a link.
+
+
+\subsection{How C and \TeX\ Communicate}
+
+In order to use C code for graph drawing algorithms during a run of the \TeX\
+program, there is no need to build a new version of \TeX. Rather, it is
+possible that C code is linked into the \TeX\ executable at runtime. This is
+made possible by the fact that Lua (which part of Lua\TeX$\dots$) is able to
+link C libraries at runtime -- provided a strict regime of rules is adhered to:
+%
+\begin{enumerate}
+ \item When you say |require| in Lua, it will normally look for a |.lua|
+ file; but it will also try to find a |.so| file (a shared C library) as
+ a fallback.
+ \item If it finds such a shared library, Lua(\TeX) will try to link this
+ library dynamically at runtime.
+ \item Inside the library, there must be a function (called an entry point)
+ with a special name (it must start with |luaopen_| and it must
+ otherwise be the path and name of the library with slashes replaced by
+ underscores).
+ \item This function gets called by Lua, once. Its job is to setup the
+ library so that it can be used by Lua. Mainly, this means that certain
+ C functions get registered in such a way that Lua can call them.
+ \item At this point, control returns to Lua and, now, certain functions
+ have become available on the Lua layer that, when called, actually
+ invoke the C code of our linked library.
+\end{enumerate}
+
+For each of the above points, there are some bells and whistles:
+%
+\begin{enumerate}
+ \item Lua\TeX\ looks at slightly inconvenient places for shared libraries:
+ By default, (currently, 2013) it looks in a |lib| subdirectory of the
+ directory containing the Lua\TeX\ executable. The logic behind is that
+ the shared libraries depend on the specific architecture of the
+ executable. Thus, unlike normal Lua files, the library needs to be
+ installed ``far away'' from the actual package of which it is part.
+ \item Certain versions of Lua\TeX\ have a broken handling of filenames of
+ libraries written in C. The TL2013 version of Lua\TeX, for instance,
+ crashes when the filename of a shared library does not contain the
+ complete path (while this works for normal file). Hopefully, this, too,
+ will be fixed in future versions.
+ \item On certain platforms, the support for dynamic linking against
+ Lua\TeX\ is broken since the symbol table of the Lua library has been
+ stripped away. Hopefully, this will be fixed soon; in the meantime, a
+ highly fragile workaround is to link in another copy of the Lua
+ library.
+ \item The entry point that is called by Lua requires a certain signature
+ (it takes a Lua state as its only parameter) and must return the number
+ of objects it returns on the Lua stack.
+ \item The registration process of C functions is somewhat tricky and
+ changes from Lua version to Lua version.
+ \item C functions that get called by Lua must follow all sorts of tricky
+ rules in order to communicate with Lua correctly.
+\end{enumerate}
+
+Despite the above obstacles, one can use graph drawing algorithms written in C
+inside Lua, in principle, as follows: One loads an appropriately prepared and
+located C library using |require| and this library uses commands like |declare|
+to register its own functions into the graph drawing system so that when the
+|run| method is called, a C functions gets called instead.
+
+Unfortunately, the above approach is extremely tedious and error-prone and it
+is ``no fun'' to access Lua data structures (such as the syntactic digraph)
+from C. For this reason, I have written some libraries that encapsulate (as
+much as possible) of this communication between C and Lua. Indeed, when you use
+these libraries, you can focus entirely on the graph drawing issues and you
+will not even notice that your code ``is talking to Lua''. (Except for the name
+of the entry point, which is fixed to start with |luaopen_| and it is
+impossible to change this without disrupting a lot inside Lua's module system).
+
+There are libraries available for simplifying the communication between the
+graph drawing system and graph drawing algorithms written in
+%
+\begin{itemize}
+ \item C, see Section~\ref{section-gd-c},
+ \item C++, see Section~\ref{section-gd-c++},
+ \item Open Graph Drawing Framework, see
+ Section~\ref{section-gd-ogdf-interface}.
+\end{itemize}
+
+
+\subsection{Writing Graph Drawing Algorithms in C}
+\label{section-gd-c}
+
+\subsubsection{The Hello World of Graph Drawing in C}
+
+As our first example, as always, the ``hello world'' of graph drawing simply
+places nodes on a circle. For this, we implement a function |fast_hello_world|
+in a file |SimpleDemoC.c|. It starts as follows:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+#include <math.h>
+
+static void fast_hello_world (pgfgd_SyntacticDigraph* graph) {
+ ...
+}
+\end{codeexample}
+
+As we can see, we first include a special header file of a rather small library
+that does all the hard work of translating between Lua and C for us
+(|InterfaceFromC|). These header files reside in the |c| subdirectory of the
+|pgf| package. Note that we do \emph{not} have to include the headers of the
+Lua library; indeed, you do not need access to the source of Lua to use the
+interface headers. As a side effect, we will, however, have to write
+|struct lua_State| instead of the more common |lua_State| once in our code,
+namely in the declaration of the entry point; but that is the only downside.
+
+The library |InterfaceFromC| declares the type |pgfgd_SyntacticDigraph|. In a
+moment, we will see that we can setup a key |fast simple demo layout| such that
+when this key is used on the display layer, the function |fast_hello_world|
+gets called. When it is called, the |graph| parameter will be a full
+representation of the to-be-laid-out graph. We can access the fields of the
+graph and even directly modify some of its fields (in particular, we can modify
+the |pos| fields of the vertices). Here is the complete code of the algorithm:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+static void fast_hello_world (pgfgd_SyntacticDigraph* graph) {
+ double angle = 6.28318530718 / graph->vertices.length;
+ double radius = pgfgd_tonumber(graph->options, "fast simple demo radius");
+
+ int i;
+ for (i = 0; i < graph->vertices.length; i++) {
+ pgfgd_Vertex* v = graph->vertices.array[i];
+ v->pos.x = cos(angle*i) * radius;
+ v->pos.y = sin(angle*i) * radius;
+ }
+}
+\end{codeexample}
+
+That is all that is needed; the C library will take care of both creating the
+|graph| object as all well as of deleting it and of copying back the computed
+values of the |pos| fields of the vertices.
+
+Our next task is to setup the key |fast simple demo layout|. We can (and must)
+also do this from C, using the following code:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+int luaopen_pgf_gd_examples_c_SimpleDemoC (struct lua_State *state) {
+
+ pgfgd_Declaration* d = pgfgd_new_key ("fast simple demo layout");
+ pgfgd_key_summary (d, "The C version of the hello world of graph drawing");
+ pgfgd_key_algorithm (d, fast_hello_world);
+ pgfgd_key_add_precondition (d, "connected");
+ pgfgd_key_add_precondition (d, "tree");
+ pgfgd_declare (state, d)
+ pgfgd_free_key (d);
+\end{codeexample}
+
+The function |luaopen_pgf_gd_examples_c_SimpleDemoC| is the function that will
+be called by Lua (we will come to that). More important for us, at the moment,
+is the declaration of the key: We use |pgfgd_new_key| to create a declaration
+record and then fill the different fields using appropriate function calls. In
+particular, the call |pgfgd_key_algorithm| allows us to link the key with a
+particular C function. The |pgfgd_declare| will then pass the whole declaration
+back to Lua, so the effect of the above is essentially the same as if you had
+written in Lua:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+declare {
+ key = "fast simple demo layout",
+ summary = "The C version of the hello world of graph drawing",
+ preconditions = {
+ connected = true,
+ tree = true,
+ },
+ algorithm = {
+ run = -- something magic we cannot express in Lua
+ }
+}
+\end{codeexample}
+
+In our algorithm, in addition to the above key, we also use the
+|fast simple demo radius| key, which is a simple length key. This key, too, can
+be declared on the C layer:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+ d = pgfgd_new_key ("fast simple demo radius");
+ pgfgd_key_summary (d, "A radius value for the hello world of graph drawing");
+ pgfgd_key_type (d, "length");
+ pgfgd_key_initial (d, "1cm");
+ pgfgd_declare (state, d);
+ pgfgd_free_key (d);
+
+ return 0;
+}
+\end{codeexample}
+
+We simply add this code to the startup function above.
+
+Now it is time to compile and link the code. For this, you must, well, compile
+it, link it against the library |InterfaceFromC|, and build a shared library
+out of it. Also, you must place it somewhere where Lua\TeX\ will find it. You
+will find a Makefile that should be able to achieve all of this in the
+directory |pgf/c/graphdrawing/pgf/gd/examples/c|, where you will also find the
+code of the above example.
+
+Now, all you need to do to use it is to write in Lua (after you have loaded the
+|pgf.gd| library, of course), would normally be the call
+%
+\begin{codeexample}[code only, tikz syntax=false]
+require 'pgf.gd.examples.c.SimpleDemoC'
+\end{codeexample}
+%
+or in \tikzname
+%
+\begin{codeexample}[code only]
+\usegdlibrary {examples.c.SimpleDemoC}
+\end{codeexample}
+
+This should cause Lua\TeX\ to find the shared library, load it, and then call
+the function in that library with the lengthy name (the name is always
+|luaopen_| followed by the path and filename with slashes replaced by
+underscores).
+
+\emph{Remark:} Unfortunately, the above does not work with the \TeX Live 2013
+versions of Lua\TeX\ due to a bugs that causes the ``replace dots by slashes''
+to fail. For this reason, we currently need to rename our shared library file
+to
+%
+\begin{codeexample}[code only, tikz syntax=false]
+pgf_gd_examples_c_SimpleDemoC.so
+\end{codeexample}
+%
+and then say
+%
+\begin{codeexample}[code only, tikz syntax=false]
+require 'pgf_gd_examples_c_SimpleDemoC'
+\end{codeexample}
+%
+or in \tikzname
+%
+\begin{codeexample}[code only]
+\usegdlibrary {pgf_gd_examples_c_SimpleDemoC}
+\end{codeexample}
+
+In future versions of Lua\TeX, things should be ``back to normal'' in this
+regard. Also, the bug only concerns shared libraries; you can still create a
+normal Lua file with a nice name and place at a nice location and the only
+contents of this file is then the above |require| command.
+
+Anyway, once we have loaded the shared library we can say:
+%
+\begin{codeexample}[code only]
+\tikz \graph [fast simple demo layout, fast simple demo radius=1.25cm]
+{ a -> b -> c -> d -> e -> a };
+\end{codeexample}
+
+
+\subsubsection{Documenting Algorithms Written in C}
+\label{section-gd-documenting-c-algos}
+
+In our above example, we included a summary with the keys in the C code. It
+would be even better if we added a longer documentation and some examples that
+show how the key works; but this is a bit impracticable in C since multi-line
+strings are hard to write down in~C. The trick is to use the |documentation_in|
+field of a key: It allows us to specify the name of a Lua file that should be
+loaded (using |require|) to install the missing documentation fields. As
+explained in Section~\ref{section-gd-documentation-in}, this Lua file may make
+good use the |pgf.gd.doc| package. Note, also, that for keys documented in this
+way the documentation can easily be included in this manual through the use of
+the |\includedocumentationof| command.
+
+In our example, we would first add the following line twice in the C code (once
+for each key), assuming that the documentation resides in the file
+|pgf/gd/doc/examples/SimpleDemoC.lua|:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+ pgfgd_key_documentation_in (d, "pgf.gd.doc.examples.SimpleDemoC");
+\end{codeexample}
+
+Note that since the documentation is a normal Lua file, it will be searched in
+the usual places Lua files are located (in the texmf trees) and not, like the C
+shared library, in the special |lib| subdirectory of the Lua\TeX\ binary.
+
+Here are typical contents of the documentation file:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+-- File pgf/gd/doc/examples/SimpleDemoC.lua
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+key "fast simple demo layout"
+documentation
+[[
+This layout is used...
+]]
+example
+[[
+\tikz \graph [fast simple example layout]
+{ a -- b -- c -- d -- e; };
+]]
+
+key "fast simple demo radius"
+documentation
+[[
+The radius parameter is used to ...
+]]
+example
+[[
+\tikz \graph [fast simple demo layout, fast simple demo radius=1.25cm]
+{ a -> b -> c -> d -> e -> a };
+]]
+\end{codeexample}
+
+
+\subsubsection{The Interface From C}
+
+In the above example, we already saw some of the functions from the library
+|InterfaceFromC| that translated from Lua to C for us. For a complete list of
+all functions available, currently please see
+|graphdrawing/c/pgf/gd/interface/c/InterfaceFromC.h| directly.
+
+Currently, the library provides C functions to directly access all aspects of
+the syntactic digraph and also of the graphs computed by the preprocessing of
+the layout pipeline. What is missing, however, is access to the tree of
+(sub)layouts and to collections. Hopefully, these will be added in the future.
+
+
+\subsection{Writing Graph Drawing Algorithms in C++}
+\label{section-gd-c++}
+
+Built on top of the C interface presented in the previous section, there is
+also a C++ interface available. It encapsulates as much of the C functions as
+possible in C++ classes. Thus, this interface is mostly there for convenience,
+it does not offer fundamentally new functionality.
+
+
+\subsubsection{The Hello World of Graph Drawing in C++}
+
+Let us have a look at how our beloved hello world of graph drawing looks in
+C++. Although it is still possible to put graph drawing algorithms inside
+functions, it is more natural in C++ to turn them into methods of a class.
+Thus, we start the code of |SimpleDemoCPlusPlus.c++| as follows:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+#include <pgf/gd/interface/c/InterfaceFromC++.h>
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+
+#include <math.h>
+
+struct FastLayout : scripting::declarations, scripting::runner {
+ ...
+}
+\end{codeexample}
+
+As can be seen, we do not only include the interface from C++, but also that
+from C (since, currently, not all functionality of the C library is
+encapsulated in C++).
+
+The interesting part is the |struct FastLayout|, which will contain our
+algorithm (you could just as well have used a |class| instead of a |struct|).
+It is derived from two classes: First, from a |declarations| class and,
+secondly, from a |runner| class. Both of them, just like everything else from
+the interface, reside in the namespace |scripting|. This name was chosen since
+the main purpose of the interface is to provide ``scripting facilities'' to C
+code through the use of Lua.
+
+We are currently interested in the class |runner|. This class has a virtual
+function |run| that gets called when, on the Lua side, someone has selected the
+algorithm represented by the class. Thus, we place our algorithm in this
+method:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+void run () {
+ pgfgd_SyntacticDigraph* graph = parameters->syntactic_digraph;
+
+ double angle = 6.28318530718 / graph->vertices.length;
+ double radius = parameters->option<double>("fast simple demo radius c++");
+
+ for (int i = 0; i < graph->vertices.length; i++) {
+ pgfgd_Vertex* v = graph->vertices.array[i];
+ v->pos.x = cos(angle*i) * radius;
+ v->pos.y = sin(angle*i) * radius;
+ }
+}
+\end{codeexample}
+
+The |run| method has access to the member variable |parameters|, which contains
+all sorts of information concerning the to-be-drawn graph. In particular, the
+|syntactic_digraph| field gives us access to the syntactic digraph structure
+that was already available in the interface from plain~C. However, we can also
+see that a template function like |option| allows us to access the graph's
+option table in a simple way.
+
+As for C code, our next task is to setup a key that, when used on the
+\tikzname\ layer, will run our algorithm. For this, we can use an object
+derived from a |declarations|. In our example, the |FastLayout| is both derived
+from a |runner| (since it contains an algorithm) and also from |declarations|
+(since it also contains the code necessary for declaring this algorithm). If
+you prefer, you can split this into two classes. A |declarations| object must
+override the |declare| method. This method gets a |script| object as input,
+which is the ``representation'' of Lua inside the C++ code:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+void declare(scripting::script s) {
+ using namespace scripting;
+
+ s.declare(key ("fast simple demo layout c++")
+ .summary ("The C++ version of the hello world of graph drawing")
+ .precondition ("connected")
+ .precondition ("tree")
+ .algorithm (this));
+
+ s.declare(key ("fast simple demo radius c++")
+ .summary ("A radius value for the hello world of graph drawing")
+ .type ("length")
+ .initial ("1cm"));
+}
+\end{codeexample}
+
+For each key that we wish to declare, we call the script's |declare| method
+once. This method takes a |key| object as input, which can be configured
+through a sequence of calls to different member functions (like |summary| or
+|algorithm|). Most of these member functions are rather self-explaining; only
+|algorithm| is a bit trickier: It does not take a function as input, but rather
+an object of type |runner| and it will call the |run| method of this object
+whenever the algorithm is run.
+
+Lastly, we also need to write the entry point:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+extern "C" int luaopen_pgf_gd_examples_c_SimpleDemoCPlusPlus (struct lua_State *state) {
+ scripting::script s (state);
+ s.declare (new FastLayout);
+ return 0;
+}
+\end{codeexample}
+
+Note that it is the job of the interface classes to free the passed
+|declarations| object. For this reason, you really need to call |new| and
+cannot pass the address of a temporary object.
+
+As before, because of the bug in some Lua\TeX\ versions, to actually load the
+library at runtime, we need to rename it to
+%
+\begin{codeexample}[code only, tikz syntax=false]
+pgf_gd_examples_c_SimpleDemoCPlusPlus.so
+\end{codeexample}
+%
+and then say
+%
+\begin{codeexample}[code only, tikz syntax=false]
+require 'pgf_gd_examples_c_SimpleDemoCPlusPlus'
+\end{codeexample}
+%
+or in \tikzname
+%
+\begin{codeexample}[code only]
+\usegdlibrary {pgf_gd_examples_c_SimpleDemoCPlusPlus}
+\end{codeexample}
+
+We can now use it:
+%
+\begin{codeexample}[code only]
+\tikz \graph [fast simple demo layout c++, fast simple demo radius c++=1.25cm]
+{ a -> b -> c -> d -> e -> a };
+\end{codeexample}
+
+
+\subsubsection{The Interface From C++}
+
+The header |graphdrawing/c/pgf/gd/interface/c/InterfaceFromC++.h| contains, as
+the name suggest, the interface from C++. A complete documentation is still
+missing, but let us go over the main ideas:
+
+
+\medskip
+\noindent\textbf{Runners.}
+Algorithms are represented by objects of type |runner|. An algorithm will
+overwrite the |run| method, as we saw in the example, and it should modify the
+|parameters| of the runner object.
+
+In addition to the |run| method, there are also two more virtual methods,
+called |bridge| and |unbrigde|. The first is called before the |run| method is
+called and the second afterwards. The idea is that another framework, such as
+\textsc{ogdf}, can implement a new class |ogdf_runner| that overrides these two
+methods in order to transform the Lua/C representation of the input graph into
+an \textsc{ogdf} representation prior to the |run| method being called. The
+|run| method can then access additional member variables that store the graph
+representations in \textsc{ogdf} form (or another form, depending on the
+framework). The |unbridge| method allows the framework to translate back.
+
+Although a |runner| object must be created for every algorithm, an algorithm
+can also reside in a function. The class |function_runner| is a simple wrapper
+that turns a function into such an object.
+
+
+\medskip
+\noindent\textbf{Keys.}
+A key object is a temporary object that is passed to the |declare| method of a
+script. It represents the table that is passed to the Lua function |declare|.
+In order to make setting its field easy, for each field name there is a
+corresponding function (like |summary|) that takes the string that should be
+set to this field and returns the key object once more, so that we can chain
+calls.
+
+The |algorithm| method gets a runner object as parameter and will store a
+pointer to this object inside Lua. Each time the algorithm is used, this object
+will be used to ``run'' the algorithm, that is, the methods |prepare|,
+|bridge|, |run|, and |unbridge| will be called in that order. Since the object
+is reused each time, only one object is needed; but this object may not be
+freed prematurely. Indeed, you will normally create the object using |new| once
+and will then never delete it.
+
+A typical idiom you may find in the code is
+%
+\begin{codeexample}[code only, tikz syntax=false]
+s.declare (key (...)
+ .algorithm(this)
+ ...);
+\end{codeexample}
+%
+This code is seen inside the |declare| method of objects that are both
+declarations and runners. They register ``themselves'' via the above code.
+Note, however, that this requires that the |this| pointer is not a temporary
+object. (The typing rules of C++ make it hard for this situation to happen, but
+it can be achieved.)
+
+
+\medskip
+\noindent\textbf{Reading options.} Once options have been declared, your C++
+algorithms will wish to read them back. For this, the |parameters| field of a
+runner object provides a number of templated methods:
+%
+\begin{itemize}
+ \item The |option_is_set| method returns |true| if the passed option has
+ been set \emph{and} can be cast to the type of the template. So,
+ |option_is_set<double>("node distance")| will return true if the
+ |node distance| key has been set for the graph as a whole (currently,
+ there is no way to read the options of a vertex or an edge from C++,
+ use the C methods instead).
+ \item The |option| function comes in two flavours: First, it takes a single
+ option name and just returns the option's value. If, however, the
+ option has not been set or has another type, some sort of null value is
+ returned. So, |option<double>("node distance")| will return the
+ configured node distance as a double. When an option has an initial
+ value, this call will always return a sensible value.
+
+ The second flavour of |option| allows you to pass a reference to an
+ object in which the option's value should be stored and the function
+ will return true if the option is set (and, thus, something was written
+ into the reference). This is the ``safest'' way to access an option:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+double dist;
+if (parameters->option ("node distance", dist))
+ ...
+\end{codeexample}
+
+ Caution must be taken for |char*| options: The returned string must be
+ explicitly freed; it will be a copy of the string stored in the Lua
+ table.
+ \item The |configure_option| method is used to set a member of an object
+ based on the value of a certain option. For this, you must pass a
+ pointer to a member function that sets the member. Here is an example:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+class MyClass {
+public:
+ void setMyDistance (double distance);
+...
+};
+...
+
+MyClass m;
+parameters->configure_option("node distance", &MyClass::setMyDistance, m);
+\end{codeexample}
+ %
+ If the option has not been set or does not have the correct type, the
+ member function is not called.
+\end{itemize}
+
+
+\medskip
+\noindent\textbf{Factories and modules.}
+A Lua key is normally either a Boolean, a double, or a string. However, in C++,
+we may also sometimes wish Lua users to configure which C function is used to
+achieve something. One could do this using strings or numbers and then use
+search algorithms or a long |switch|, but this would neither be flexible nor
+elegant.
+
+Instead, it is possible to store \emph{factories} in Lua keys. A factory is a
+class derived from |factory| that implements the virtual function |make|. This
+function will return a new object of a template type. You can store such a
+factory in a key.
+
+The |make| method of a parameters object allows you to invoke the factory
+stored in a key. (If no factory is stored in it, |null| is returned).
+
+The |configure_module| method is akin to |configure_option|, only the result of
+applying the factory is passed to the member function of the class.
+
+
+\medskip
+\noindent\textbf{Scripts.}
+A ``script'' is the abstraction of the communication between Lua and C++. From
+C++'s point of view, the script object offers different |declare| methods that
+allow us to ``make objects and function scriptable'' in the sense that they can
+then be called and configured from Lua. The script must be initialized with a
+Lua state and will be bound to that state (basically, the script only stores
+this single pointer).
+
+When you call |declare|, you either pass a single key object (which is then
+declared on the Lua layer) or you pass a |declarations| object, whose virtual
+|declare| method is then called. The |declarations| objects are used to bundle
+several declarations into a single one.
+
+
+\subsection{Writing Graph Drawing Algorithms Using OGDF}
+\label{section-gd-ogdf-interface}
+
+Built on top of the C++ interface, a small interface allows you to easily link
+algorithms written for the \textsc{ogdf} (Open Graph Drawing Framework) with
+graph drawing in Lua.
+
+
+\subsubsection{The Hello World of Graph Drawing in OGDF -- From Scratch}
+
+We start with some startup code:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <math.h>
+
+using namespace ogdf;
+using namespace scripting;
+\end{codeexample}
+
+Note that the interface from \textsc{ogdf} resides in the |ogdf| folder, not in
+the |interface| folder.
+
+Like in the plain C++ interface, we must now subclass the |runner| class and
+the |declarations| class. Also like the plain C++ interface, we can use
+multiple inheritance. The difference lies in the fact that we do not directly
+subclass form |runner|, but rather from |ogdf_runner|. This class implements
+the complicated ``bridging'' or ``translation'' process between the world of
+|InterfaceFromC++| and \textsc{ogdf}:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+struct FastLayoutOGDF : declarations, ogdf_runner {
+
+ void run () {
+ double angle = 6.28318530718 / graph.numberOfNodes();
+ double radius = parameters->option<double>("my radius ogdf");
+
+ int i = 0;
+ for (node v = graph.firstNode(); v; v=v->succ(), i++) {
+ graph_attributes.x(v) = cos(angle*i) * radius;
+ graph_attributes.y(v) = sin(angle*i) * radius;
+ }
+ }
+\end{codeexample}
+
+As can be seen, in a subclass of |ogdf_runner|, the |run| method will have
+access to a member called |graph| and to another member called
+|graph_attributes|. These will have been setup with the graph from the Lua
+layer and, after the algorithm has run, the information stored in the |x| and
+|y| fields of the graph attributes and also the bend information of the edges
+will be written back automatically.
+
+Next, we need to declare the algorithm. This is done as in the plain
+C++ interface:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+ void declare(script s) {
+ using namespace scripting;
+
+ s.declare(key ("fast simple demo layout ogdf")
+ .summary ("The OGDF version of the hello world of graph drawing")
+ .precondition ("connected")
+ .algorithm (this));
+
+ s.declare(key ("my radius ogdf")
+ .summary ("A radius value for the hello world of graph drawing")
+ .type ("length")
+ .initial ("1cm"));
+ }
+};
+\end{codeexample}
+
+Finally, we need the entry point, which is also ``as usual'':
+%
+\begin{codeexample}[code only, tikz syntax=false]
+extern "C" int luaopen_pgf_gd_examples_c_SimpleDemoOGDF (struct lua_State *state) {
+ script (state).declare (new FastLayoutOGDF);
+ return 0;
+}
+\end{codeexample}
+
+Yet again, we need to rename the resulting shared library and then say
+|require| on it. We can now use it:
+%
+\begin{codeexample}[code only]
+\tikz \graph [fast simple demo layout ogdf, my radius ogdf=1cm]
+{ a -> b -> c -> d -> e -> a };
+\end{codeexample}
+
+
+\subsubsection{The Hello World of Graph Drawing in OGDF -- Adapting Existing Classes}
+
+In the previous example we implemented a graph drawing algorithm using
+\textsc{ogdf} for use with Lua ``from scratch''. In particular, the whole
+algorithm was contained in the |run| method of our main class. In practice,
+however, graph drawing algorithms are typically placed in classes that ``know
+nothing about scripting''. For instance, our hello world of graph drawing might
+actually be implemented like this:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+// File HelloWorldLayout.h
+#include <ogdf/module/LayoutModule.h>
+
+class HelloWorldLayout : puplic ogdf::LayoutModule {
+public:
+
+ virtual void call(ogdf::GraphAttributes &GA)
+ {
+ using namespace ogdf;
+
+ const Graph &graph = GA.constGraph();
+ double angle = 6.28318530718 / graph.numberOfNodes();
+ int i = 0;
+ for (node v = graph.firstNode(); v; v=v->succ(), i++) {
+ GA.x(v) = cos(angle*i) * radius;
+ GA.y(v) = sin(angle*i) * radius;
+ }
+ }
+
+ void setRadius (double r) { radius = r; }
+
+private:
+
+ double radius;
+};
+\end{codeexample}
+
+Now, what we actually want to do is to ``make this class scriptable''. For
+this, we setup a new class whose |run| method will produce a new
+|HelloWorldLayout|, configure it, and then run it. Here is this run method:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+void run ()
+{
+ HelloWorldLayout layout;
+ parameters->configure_option("HelloWorldLayout.radius", &HelloWorldLayout::setRadius, layout);
+ layout.call(graph_attributes);
+}
+\end{codeexample}
+
+Next, we need to write the declarations code. This is very similar to the
+``from scratch'' version:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+void declare(script s) {
+ using namespace scripting;
+
+ s.declare(key ("HelloWorldLayout")
+ .summary ("The OGDF version of the hello world of graph drawing")
+ .precondition ("connected")
+ .algorithm (this));
+
+ s.declare(key ("HelloWorldLayout.radius")
+ .summary ("A radius value for the hello world of graph drawing")
+ .type ("length")
+ .alias ("radius"));
+}
+\end{codeexample}
+
+Two remarks are in order: First, it is customary to name the keys for the
+display system the same way as the classes. Second, the different configuration
+options of the algorithm are named with the class name followed by the option
+name. This makes it clear who, exactly, is being configured. However, these
+keys should then also get an |alias| field set, which will cause an automatic
+forwarding of the key to something more ``user friendly'' like just |radius|.
+
+It remains to put the above methods in a ``script'' file. It is this file that,
+when compiled, must be linked at runtime against Lua\TeX.
+%
+\begin{codeexample}[code only, tikz syntax=false]
+// File HelloWorldLayout_script.c++
+
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <HelloWorldLayout.h>
+
+using namespace ogdf;
+using namespace scripting;
+
+struct HelloWorldLayout_script : declarations, ogdf_runner {
+ void run () { ... see above ... }
+ void declare (script s) { ... see above ... }
+};
+
+extern "C" int luaopen_my_path_HelloWorldLayout_script (struct lua_State *state) {
+ script (state).declare (new HelloWorldLayout_script);
+ return 0;
+}
+\end{codeexample}
+
+
+\subsubsection{Documenting OGDF Algorithms}
+
+As explained in Section~\ref{section-gd-documenting-c-algos}, we can add
+external documentation to algorithms written in C and, using the
+|documentation_in| method of the |key| class, we can use the exact same method
+to document \textsc{ogdf} algorithms.
+
+I strongly recommend making use of this feature since, currently, the
+documentation of many \textsc{ogdf} classes is sketchy at best and using
+\tikzname\ examples seems to be a good way of explaining the effect of the
+different parameters algorithms offer.
+
+
+\subsubsection{The Interface From OGDF}
+
+The support for \textsc{ogdf} offered inside |InterfaceFromOGDF.h| is just the
+class |ogdf_runner| we saw already in the example. In addition, there is also a
+wrapper class |ogdf_function_runner| that allows you to wrap an algorithm
+implemented in a function that uses \textsc{ogdf}, but I expect this to be the
+case only rarely.
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-binding-layer.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-binding-layer.tex
new file mode 100644
index 0000000000..b677de2175
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-binding-layer.tex
@@ -0,0 +1,281 @@
+% Copyright 2010-2011 by Renée Ahrens
+% Copyright 2010-2011 by Olof Frahm
+% Copyright 2010-2011 by Jens Kluttig
+% Copyright 2010-2011 by Matthias Schulz
+% Copyright 2010-2011 by Stephan Schuster
+% Copyright 2011 by Jannis Pohlmann
+% Copyright 2011 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{The Binding Layer}
+\label{section-gd-binding-layer}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\subsection{Overview}
+
+This section explains how the \emph{binding} of the graph drawing system to a
+particular display layer works. Let me stress that all of this is important
+only for readers who
+%
+\begin{itemize}
+ \item either wish to write new display system (see
+ Section~\ref{section-gd-display-layer})
+ \item or wish to know more about how the graph drawing system works on the
+ pure \pgfname\ layer (this is were the binding occurs).
+\end{itemize}
+
+\emph{Bindings} are used to encapsulate the details of the communication
+between the graph drawing system and a display system (see
+Section~\ref{section-gd-display-layer} for an introduction to display systems).
+
+Consider a display system that communicates with the graph drawing system. At
+some point, the display system would like to run an algorithm to lay out a
+graph. To achieve this, it will call different functions from the class
+|InterfaceToDisplay| and the effect of this is that a representation of the
+to-be-drawn graph is constructed internally and that the appropriate algorithms
+are run. All of this is in some sense independent of the actual display system,
+the class |InterfaceToDisplay| offers the same standard interface to all
+display systems.
+
+At some point, however, the graph drawing system may need to ``talk back'' to
+the display system. For instance, once the graph has been laid out, to trigger
+the actual rendering of the graph, the graph drawing system must ``tell'' the
+display layer where the vertices lie. For some display systems this is easy: if
+the display system itself is written in Lua, it could just access the syntactic
+digraph directly. However, for systems like \tikzname\ or systems written in
+another language, the graph drawing system needs a set of functions that it can
+call that will tell the display system what is going on. This is were bindings
+come in.
+
+The class |Binding| is an interface that defines numerous methods that will be
+called by the graph drawing system in different situations (see the
+documentation below for details). For instance, there is a function
+|renderVertex| that is called by the graph drawing system whenever a vertex
+should be rendered by the display system. The class is really just an interface
+in the sense of object-oriented programming. For each display system you need
+to create a subclass of |Binding| like |BindingToPGF| or |BindingToASCII| that
+implement the methods declared by |Binding|. The number of methods that need to
+be implemented depends on the display system.
+
+In the following, you will find the documentation of the |Binding| class in
+Section~\ref{section-gd-binding-doc}. Following this, we first have a quick
+look at how the |BindingToPGF| works and then go over a simple example of a
+binding to a more or less imaginary display system. This example should help
+readers interested in implementing their own bindings.
+
+
+\subsection{The Binding Class and the Interface Core}
+\label{section-gd-binding-doc}
+
+\includeluadocumentationof{pgf.gd.bindings.Binding}
+\includeluadocumentationof{pgf.gd.interface.InterfaceCore}
+
+
+\subsection{The Binding To PGF}
+
+\includeluadocumentationof{pgf.gd.bindings.BindingToPGF}
+
+
+\subsection{An Example Binding Class}
+
+\label{section-gd-binding-layer-example}
+
+In the present section a complete binding is presented to an imaginary
+``\textsc{ascii} art display system'' is presented. The idea is that this
+display system will depict graphs using just normal letters and spaces so that,
+when the text is typeset in a monospace font, a visualization of the graph
+results. For instance:
+
+\bigskip
+\noindent
+\begin{minipage}[t]{.5\textwidth}
+\emph{Graph rendered by |BindingToPGF|:}
+\medskip
+
+\tikz [anchor=base]\graph [layered layout,level distance=2.35cm,sibling
+distance=1.2cm,edges={rounded corners,>=spaced stealth'}] {
+ Alice;
+ Bob;
+ Charly;
+ Dave;
+ Eve;
+ Fritz;
+ George;
+ Alice -> Bob;
+ Alice -> Charly;
+ Charly -> Dave;
+ Bob -> Dave;
+ Dave -> Eve;
+ Eve -> Fritz;
+ Fritz -> Alice;
+ George -> Eve;
+ George -> Fritz;
+ Alice -> George;
+};
+\end{minipage}%
+\begin{minipage}[t]{.49\textwidth}
+\emph{Graph rendered by |BindingToASCII|:}
+
+\begin{verbatim}
+ Alice
+ .......
+ .. . . .
+ ... . . .
+ ... .. . ..
+ .. . . .
+ Charly Bob . .
+ .. . . .
+ . . . .
+ . . . .
+ .. . . .
+ .. . .
+ Dave George .
+ .. . ... .
+ . . .. .
+ . . ...
+ .. . . ...
+ .. . ..
+ Eve . ..
+ .. . ..
+ . . .
+ . . .
+ .. . ..
+ ...
+ Fritz
+\end{verbatim}
+\end{minipage}
+\bigskip
+
+The binding will reside in a file |BindingToASCII.lua|, whose contents is
+detailed below, and which is used by calling the |bind| function of
+|InterfaceToDisplay|, see its documentation for details.
+
+The binding's code starts with some initializations:
+%
+\begin{codeexample}[code only]
+-- File BindingToASCII.lua
+
+-- Imports
+local lib = require "pgf.gd.lib"
+
+-- Subclass the Binding class:
+local BindingToASCII = lib.class { base_class = require "pgf.gd.bindings.Binding" }
+\end{codeexample}
+
+The interesting code is the code for ``rendering'' a graph. The graph drawing
+system will invoke the binding's methods |renderStart| and |renderStop| to
+signal that the graph drawing algorithms have finished and that the vertices
+and edges can now be drawn.
+
+In our \textsc{ascii} renderer, we use a two-dimensional field holding
+characters that severs as the ``drawing canvas''. At the beginning of the
+rendering, we initialize it with blanks:
+%
+\begin{codeexample}[code only]
+local canvas
+
+function BindingToASCII:renderStart()
+ canvas = {}
+ -- Clear the canvas
+ for x=-30,30 do
+ canvas [x] = {}
+ for y=-30,30 do
+ canvas[x][y] = ' '
+ end
+ end
+end
+\end{codeexample}
+
+In order to ``render'' a vertex, the graph drawing system will call the
+|renderVertex| method. The binding of \tikzname\ does a lot of complicated
+things in this method to retrieve the underlying node's box from internal table
+and to somehow reinstall the box in \TeX's output stream; for our
+\textsc{ascii} binding things are much simpler: We simply put the vertex's name
+at the canvas position corresponding to the vertex's |pos| coordinate. Note
+that this simple version of an \textsc{ascii} renderer does not try to scale
+things; thus, array out of bounds might occur here.
+%
+\begin{codeexample}[code only]
+function BindingToASCII:renderVertex(v)
+ canvas [math.floor(v.pos.x)][math.floor(v.pos.y)] = v.name
+end
+\end{codeexample}
+
+The rendering of edges is a more complicated process. Given two vertices, we
+put dots at the canvas positions between them; provided there are no vertices
+(so edges are behind the nodes). Here is the essential part of the code (for
+the complete code, have a look at |pgf/gd/examples/BindingToASCII.lua|):
+%
+\begin{codeexample}[code only]
+function BindingToASCII:renderEdge(e)
+ local function connect (p,q)
+ -- Connect the points p and q
+ local x1, y1, x2, y2 = math.floor(p.x+0.5), math.floor(p.y+0.5), math.floor(q.x+0.5), math.floor(q.y+0.5)
+ ...
+ local delta_x = x2-x1
+ local delta_y = y2-y1
+ ...
+ local slope = delta_y/delta_x
+ for i=x1,x2 do
+ local x,y = i, math.floor(y1 + (i-x1)*slope + 0.5)
+
+ if canvas[x][y] == " " then
+ canvas[x][y] = '.'
+ end
+ end
+ ...
+ end
+
+ -- Iterate over all points on the path from tail to head:
+ local p = e.tail.pos
+ for i=1,#e.path do
+ connect(p, e.tail.pos + e.path[i])
+ p = e.tail.pos + e.path[i]
+ end
+ connect(p, e.head.pos)
+end
+\end{codeexample}
+
+The methods |renderVertex| and |renderEdge| will be called once for each vertex
+and edge of the to-be-rendered graph. At the end, the |renderStop| method is
+called. In our case, this method will output the canvas using |print|. A slight
+complication arises when node names are longer than just one character. In this
+case, the following code ``centers'' them on their coordinate and makes sure
+that they do not get overwritten by the dots forming edges:
+%
+\begin{codeexample}[code only]
+function BindingToASCII:renderStop()
+ for y=10,-30,-1 do
+ local t = {}
+ for x=-30,30 do
+ local s = canvas[x][y]
+ for i=1,#s do
+ pos = x+30+i-math.floor(#s/2)
+ if not t[pos] or t[pos] == " " or t[pos] == "." then
+ t[pos] = string.sub(s,i,i)
+ end
+ end
+ end
+ print(table.concat(t))
+ end
+end
+\end{codeexample}
+
+At the end, we need to return the created object:
+%
+\begin{codeexample}[code only]
+return BindingToASCII
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-circular.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-circular.tex
new file mode 100644
index 0000000000..c503936db0
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-circular.tex
@@ -0,0 +1,29 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Graph Drawing Algorithms: Circular Layouts}
+
+{\noindent {\emph{by Till Tantau}}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\includeluadocumentationof{pgf.gd.circular.library}
+\includeluadocumentationof{pgf.gd.circular.Tantau2012}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-display-layer.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-display-layer.tex
new file mode 100644
index 0000000000..46b1d5db04
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-display-layer.tex
@@ -0,0 +1,285 @@
+% Copyright 2010-2011 by Renée Ahrens
+% Copyright 2010-2011 by Olof Frahm
+% Copyright 2010-2011 by Jens Kluttig
+% Copyright 2010-2011 by Matthias Schulz
+% Copyright 2010-2011 by Stephan Schuster
+% Copyright 2011 by Jannis Pohlmann
+% Copyright 2011 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{The Display Layer}
+\label{section-gd-display-layer}
+
+{\noindent {\itshape{by Till Tantau}}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\begin{quote}
+ \itshape You do not need to read this section in order to write new graph
+ drawing algorithms. It is of interest only to those wishing to write
+ programs that wish to ``use'' the graph drawing system in a similar way
+ that \tikzname\ does for laying out graphs that are generated and then
+ passed down from the program to the graph drawing system.
+\end{quote}
+
+
+\subsection{Introduction: The Interplay of the Different Layers}
+
+The job of the graph drawing system is to run graph drawing algorithms on
+graphs. Since graph drawing is useful in many different contexts, not only in
+the context of \tikzname\ for which the present system was originally
+developed, the graph drawing system was designed in such a way that it can be
+used independently of \tikzname. To achieve this, the \emph{display layer}
+provides an interface via which an arbitrary program (\tikzname, a graph
+editor, a command line interface, etc.) ``talk'' to the graph drawing system.
+
+To better understand how this works, let us consider the following setup:
+%
+\begin{itemize}
+ \item A program would like to communicate with the graph drawing system. It
+ is written in Java and its job is to analyse social networks. This
+ software would like to use graph drawing to produce drawings of some
+ ``social graphs'' arising from its analyses. This software will be
+ called ``the display system'' in the following.
+ \item There are two algorithms that the display system would like to apply
+ to the graphs its produces. Let us call these algorithms ``A'' and
+ ``B''. However, the display system would also, ideally, wish to make it
+ possible that its user chooses other algorithms ``C'' that are not
+ necessarily part of its binary.
+ \item The display system has internally generated a ``social graph'' that
+ it would now like to draw.
+\end{itemize}
+
+For this setup, the communication between the different layers of the graph
+drawing system is as follows:
+%
+\begin{enumerate}
+ \item The display system, being written in Java, must embed Lua to use the
+ graph drawing system.
+ \item The display system must initialize the graph drawing system. For
+ this, it must use |require| on the file |InterfaceToDisplay|, which, as
+ the name suggests, contains the interface between the display system
+ and the graph drawing system.
+
+ It must also create a so-called ``binding'' between the graph drawing
+ system and the display layer. See
+ Section~\ref{section-gd-binding-layer} for more information on
+ bindings.
+ \item The display system now needs to load the declarations of the
+ algorithms A and B. For this, it just needs to apply |require| to the
+ files in which the algorithms reside. This will cause the |declare|
+ function to be called. This function is declared by
+ |InterfaceToAlgorithms| and allows files to declare that certain
+ algorithms and options are now available.
+
+ Once this is done, the graph drawing system is fully initialized and
+ can be used.
+ \item Later on, the display system wishes to lay out a social graph. Note
+ that this is known as ``drawing the graph'' in the graph drawing
+ community, even though this only means the coordinates are computed for
+ the nodes of the graph. The actual ``rendering'' of the graph on the
+ display is the job of the display system (hence the name ``display
+ layer'').
+ \item To start the layout process, the display system calls the function
+ |beginGraphDrawingScope| of the class |InterfaceToDisplay|.
+ \item Next, for each vertex the function |createVertex| of the interface
+ class must be called and similarly for each edge. These calls will
+ cause an internal model of the graph to be created on the algorithm
+ layer. Options that are attached to nodes and edges are also
+ communicated to the graph drawing system through function calls like
+ |pushOption|.
+ \item When the graph is fully specified, the method
+ |runGraphDrawingAlgorithm| must be called, which is once more a method
+ of the interface class. This function will internally discern which
+ algorithms have been chosen (via options) and invoke the code of the
+ appropriate algorithms.
+ \item Next, the function |renderGraph| must be called. Its job is to
+ ``communicate back'' which coordinates have been computed. It will use
+ the binding for this communication, see
+ Section~\ref{section-gd-binding-layer}.
+ \item Finally, by calling |endGraphDrawingScope|, the resources needed for
+ the layout process for the social graph are freed once more.
+\end{enumerate}
+
+A few points may be noteworthy:
+%
+\begin{itemize}
+ \item The whole communication between the display system and the graph
+ drawing system goes through the interface class via function calls.
+ This makes it easy to communicate with display system whose internal
+ model of graphs is quite different from the one used in Lua (as is
+ certainly the case for \TeX, but also the ``social graph'' mentioned
+ above need not even exist as a separate entity inside the display
+ system).
+
+ \emph{The display system should only rely on the interface class. All
+ communication has to go through this class, the display system may not
+ access the internals of the internally constructed graphs directly.}
+ \item New algorithms can be loaded at runtime, as long as the |require|
+ method is supported.
+ \item The display system can also use the interface class to query which
+ algorithms and which options are available in principle (and display
+ this information to the user). The display system can even get access
+ the documentation of the options at runtime since the documentation is
+ stored in fields of the declared options.
+\end{itemize}
+
+In the following, we first present a simple display system other than
+\tikzname. The remainder of the section then encompasses a documentation of the
+different functions of the class |InterfaceToDisplay|.
+
+
+\subsection{An Example Display System}
+
+In the following, we present the code of a very simple display system written
+in Lua (another such display system is \tikzname\ itself, but the minimal
+system will allow us to focus on what is really needed). You will also find it
+in |pgf.gd.examples.ASCIIDisplayer|.
+
+The job of this display system is to parse a string that encodes a graph and to
+call the appropriate functions of |InterfaceToDisplay| to lay out the graph.
+The actual calls for rendering the graph are part of the binding, which is
+documented in Section~\ref{section-gd-binding-layer-example}.
+
+The syntax of the to-be-laid-out graph is a reduced version of \tikzname's
+|graph| syntax: The string must start with |graph[|\meta{algorithm's name}|]{|
+and end with |}|. Between the braces, all lines must either be of the form
+\meta{node name}|;| or \meta{name 1}|->|\meta{name 2}|;| with optional spaces
+around the node names.
+
+Let us now have a look at what we must do to use the graph drawing system.
+First, we load some libraries and initialize the binding (see
+Section~\ref{section-gd-binding-layer-example} for details on the binding; we
+can ignore it for now).
+%
+\begin{codeexample}[code only]
+local InterfaceToDisplay = require "pgf.gd.interface.InterfaceToDisplay"
+InterfaceToDisplay.bind(require "pgf.gd.examples.BindingToASCII")
+
+-- Load two libraries that define graph drawing algorithms. We can do this only *after* the binding
+-- has been created since they call the declare function internally.
+require "pgf.gd.layered.library"
+require "pgf.gd.force.library"
+\end{codeexample}
+
+Now comes some preparation code that starts a graph drawing scope and sets up
+the algorithm to the string provided between the square \todosp{should
+\texttt{.pushPhase} be \texttt{.pushOption}? (bug \#396)} brackets:
+
+%
+\begin{codeexample}[code only]
+local algorithm = io.read():match("%s*graph%s*%[(.-)%]")
+
+InterfaceToDisplay.pushPhase(algorithm, "main", 1)
+InterfaceToDisplay.pushOption("level distance", 6, 2)
+InterfaceToDisplay.pushOption("sibling distance", 8, 3)
+InterfaceToDisplay.beginGraphDrawingScope(3)
+InterfaceToDisplay.pushLayout(4)
+\end{codeexample}
+
+The numbers |1| to |4| are the positions on the options stack at which the
+options should be placed. See the description of |pushOption| for more details.
+
+We are now ready to create the vertices and edges via a very simple parser:
+%
+\begin{codeexample}[code only]
+for line in io.lines() do
+ if line:match("}") then
+ break
+ elseif line:find("-") then
+ local n1, dir, n2 = string.match(line, "^%s*(.-)%s*(-.)%s*(.-)%s*;")
+ InterfaceToDisplay.createEdge(n1, n2, dir, 4)
+ else
+ local n1 = string.match(line, "^%s*(.-)%s*;")
+ InterfaceToDisplay.createVertex(n1, "rectangle", nil, 4)
+ end
+end
+\end{codeexample}
+
+The graph is now completely constructed inside the graph drawing system. We can
+now invoke the algorithms:
+%
+\begin{codeexample}[code only]
+InterfaceToDisplay.runGraphDrawingAlgorithm()
+InterfaceToDisplay.renderGraph()
+InterfaceToDisplay.endGraphDrawingScope()
+\end{codeexample}
+
+We can now run the resulting file using the Lua interpreter. If we provide the
+input shown on the left, we get the output shown on the right:
+
+\bigskip
+\noindent
+\begin{minipage}[t]{.5\textwidth}
+\emph{Input given to ASCIIDisplayer:}
+
+\begin{verbatim}
+graph [layered layout] {
+ Alice;
+ Bob;
+ Charly;
+ Dave;
+ Eve;
+ Fritz;
+ George;
+ Alice -> Bob;
+ Alice -> Charly;
+ Charly -> Dave;
+ Bob -> Dave;
+ Dave -> Eve;
+ Eve -> Fritz;
+ Fritz -> Alice;
+ George -> Eve;
+ George -> Fritz;
+ Alice -> George;
+}
+\end{verbatim}
+\end{minipage}%
+\begin{minipage}[t]{.49\textwidth}
+\emph{Output produced by ASCIIDisplayer:}
+
+\begin{verbatim}
+ Alice
+ .......
+ .. . . .
+ ... . . .
+ ... .. . ..
+ .. . . .
+ Charly Bob . .
+ .. . . .
+ . . . .
+ . . . .
+ .. . . .
+ .. . .
+ Dave George .
+ .. . ... .
+ . . .. .
+ . . ...
+ .. . . ...
+ .. . ..
+ Eve . ..
+ .. . ..
+ . . .
+ . . .
+ .. . ..
+ ...
+ Fritz
+\end{verbatim}
+\end{minipage}
+
+
+\subsection{The Interface to Display Systems}
+
+\includeluadocumentationof{pgf.gd.interface.InterfaceToDisplay}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-edge-routing.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-edge-routing.tex
new file mode 100644
index 0000000000..4c4fa8cab3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-edge-routing.tex
@@ -0,0 +1,33 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Graph Drawing Algorithms: Edge Routing}
+\label{section-last-graphdrawing-library-in-manual}
+
+{\noindent{\emph{by Till Tantau}}\todosp{Why is a second label here? The second
+doesn't seem to be used.}}
+
+\label{section-gd-edge-routing}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\includeluadocumentationof{pgf.gd.routing.library}
+\includeluadocumentationof{pgf.gd.routing.NecklaceRouting}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-examples.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-examples.tex
new file mode 100644
index 0000000000..bba5c540ad
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-examples.tex
@@ -0,0 +1,14 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-force.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-force.tex
new file mode 100644
index 0000000000..514351e534
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-force.tex
@@ -0,0 +1,43 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Graph Drawing Algorithms: Force-Based Methods}
+\label{section-library-graphdrawing-force-based}
+
+{\emph{by Till Tantau and Jannis Pohlmann}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\includeluadocumentationof{pgf.gd.force.library}
+
+\includeluadocumentationof{pgf.gd.force.ControlDeclare}
+\includeluadocumentationof{pgf.gd.force.ControlStart}
+\includeluadocumentationof{pgf.gd.force.ControlIteration}
+\includeluadocumentationof{pgf.gd.force.ControlSprings}
+\includeluadocumentationof{pgf.gd.force.ControlElectric}
+\includeluadocumentationof{pgf.gd.force.ControlCoarsening}
+
+\includeluadocumentationof{pgf.gd.force.SpringLayouts}
+\includeluadocumentationof{pgf.gd.force.SpringHu2006}
+
+\includeluadocumentationof{pgf.gd.force.SpringElectricalLayouts}
+\includeluadocumentationof{pgf.gd.force.SpringElectricalHu2006}
+\includeluadocumentationof{pgf.gd.force.SpringElectricalWalshaw2000}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-layered.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-layered.tex
new file mode 100644
index 0000000000..4f68dae40f
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-layered.tex
@@ -0,0 +1,33 @@
+% Copyright 2012 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Graph Drawing Algorithms: Layered Layouts}
+
+{\emph{by Till Tantau and Jannis Pohlmann}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+\includeluadocumentationof{pgf.gd.layered.library}
+\includeluadocumentationof{pgf.gd.layered.Sugiyama}
+\includeluadocumentationof{pgf.gd.layered.cycle_removal}
+\includeluadocumentationof{pgf.gd.layered.node_ranking}
+\includeluadocumentationof{pgf.gd.layered.crossing_minimization}
+\includeluadocumentationof{pgf.gd.layered.node_positioning}
+\includeluadocumentationof{pgf.gd.layered.edge_routing}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-misc.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-misc.tex
new file mode 100644
index 0000000000..8c88238eb3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-misc.tex
@@ -0,0 +1,30 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\section{Graph Drawing Layouts: Miscellaneous}
+
+
+\begin{tikzlibrary}{graphdrawing.misc}
+ Load this package when you wish to use the graph drawing algorithms
+ defined in this library. You should load the |graphdrawing| library first.
+\end{tikzlibrary}
+
+
+\begin{gdalgorithm}{simple demo layout}{Simple Demo}
+ The algorithm used in the examples of this manual for demonstrating
+ how a trivial graph drawing can be implemented.
+\end{gdalgorithm}
+
+
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-ogdf.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-ogdf.tex
new file mode 100644
index 0000000000..579606e54c
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-ogdf.tex
@@ -0,0 +1,115 @@
+% Copyright 2012 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\section[Graph Drawing Algorithms: The Open Graph Drawing Framework]{Graph Drawing Algorithms:\\ The Open Graph Drawing Framework}
+
+% TODO:{
+% ATTENTION: this label is ALSO present in the previous algorithm.
+% Please update the labels once this section is back in the manual
+% }
+\label{section-last-graphdrawing-library-in-manual}
+
+{\emph{by Till Tantau (who copied much of the text from
+ the source documentation of \textsc{ogdf})}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+\ifgdccodeogdf
+\else
+ In order to typeset this section, LuaTeX\ must be able to link C code at
+ runtime and the \textsc{ogdf} graph drawing C libraries must be installed
+ on your system. You will find the sources in the |c| subdirectory of the
+ installation, where you will also find example Makefiles.
+ \expandafter\endinput
+\fi
+
+\emph{Remark:} The integration of the \textsc{ogdf} library is still under
+construction and the examples in this section are more a proof-of-concept. So,
+use at your own risk.
+
+\includeluadocumentationof{pgf.gd.ogdf.library}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.SugiyamaLayout}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.module.RankingModule}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.CoffmanGrahamRanking}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.LongestPathRanking}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.OptimalRanking}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.module.TwoLayerCrossMin}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.BarycenterHeuristic}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.GreedyInsertHeuristic}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.MedianHeuristic}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.SiftingHeuristic}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.SplitHeuristic}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.module.AcyclicSubgraphModule}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.DfsAcyclicSubgraph}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.GreedyCycleRemoval}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.module.HierarchyLayoutModule}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.FastHierarchyLayout}
+\includeluadocumentationof{pgf.gd.doc.ogdf.layered.FastSimpleHierarchyLayout}
+
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.SpringEmbedderFR}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.SpringEmbedderKK}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.FMMMLayout}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.MultilevelLayout}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.GEMLayout}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.FastMultipoleEmbedder}
+
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.module.InitialPlacer}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.BarycenterPlacer}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.CirclePlacer}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.MedianPlacer}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.RandomPlacer}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.SolarPlacer}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.ZeroPlacer}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.module.MultilevelBuilder}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.EdgeCoverMerger}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.IndependentSetMerger}
+\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.LocalBiconnectedMerger}
+%\includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.MatchingMerger}
+% \includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.RandomMerger}
+% \includeluadocumentationof{pgf.gd.doc.ogdf.energybased.multilevelmixer.SolarMerger}
+
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.planarity}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.planarity.PlanarizationLayout}
+%\includeluadocumentationof{pgf.gd.ogdf.planarity.LayoutPlanRepModule}
+
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.misclayout}
+
+\includeluadocumentationof{pgf.gd.doc.ogdf.misclayout.BalloonLayout}
+\includeluadocumentationof{pgf.gd.doc.ogdf.misclayout.CircularLayout}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-overview.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-overview.tex
new file mode 100644
index 0000000000..39ecd659a8
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-overview.tex
@@ -0,0 +1,306 @@
+% Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+% Copyright 2011 by Till Tantau
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Introduction to Algorithmic Graph Drawing}
+\label{section-intro-gd}
+
+\emph{by Till Tantau}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\subsection{What Is Algorithmic Graph Drawing?}
+
+\emph{Algorithmic graph drawing} (or just \emph{graph drawing} in the
+following) is the process of computing algorithmically where the nodes of a
+graph are positioned on a page so that the graph ``looks nice''. The idea is
+that you, as human (or you, as a machine, if you happen to be a machine and
+happen to be reading this document) just specify which nodes are present in a
+graph and which edges are present. Additionally, you may add some ``hints''
+like ``this node should be near the center'' or ``this edge is pretty
+important''. You do \emph{not} specify where, exactly, the nodes and edges
+should be. This is something you leave to a \emph{graph drawing algorithm}. The
+algorithm gets your description of the graph as an input and then decides where
+the nodes should go on the page.
+%
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, level distance=5mm] {
+ 4 -- {
+ 3 -- 0 -- 1[second],
+ 10 -- {
+ 8 -- {
+ 6 -- {5,7},
+ 9
+ } } }
+};
+\end{codeexample}
+
+\begin{codeexample}[]
+% \usetikzlibrary{graphs,graphdrawing,quotes}
+% \usegdlibrary{force}
+\tikz \graph [spring layout,
+ edge quotes mid,
+ edges={nodes={font=\scriptsize, fill=white, sloped, inner sep=1pt}}]
+{
+ 1 ->["Das"] 2 ->["ist"] 3 ->["das"] 4 ->["Haus"]
+ 2 ->["vom" near start] 5 ->["Ni"] 4 ->["ko" near start]
+ 1 ->["laus", orient=right] 5;
+};
+\end{codeexample}
+
+Naturally, graph drawing is a bit of a (black?) art. There is no ``perfect''
+way of drawing a graph, rather, depending on the circumstances there are
+several different ways of drawing the same graph and often it will just depend
+on the aesthetic sense of the reader which layout he or she would prefer. For
+this reason, there are a huge number of graph drawing algorithms ``out there''
+and there are scientific conference devoted to such algorithms, where each year
+dozens of new algorithms are proposed.
+
+Unlike the rest of \pgfname\ and \tikzname, which is implemented purely in
+\TeX, the graph drawing algorithms are simply too complex to be implemented
+directly in \TeX. Instead, the programming language Lua is used by the graph
+drawing library -- a programming language that has been integrated into recent
+versions of \TeX. This means that (a) as a user of the graph drawing engine you
+run \TeX\ on your documents in the usual way, no external programs are called
+since Lua is already integrated into \TeX, and (b) it is pretty easy to
+implement new graph drawing algorithms for \tikzname\ since Lua can be used and
+no \TeX\ programming knowledge is needed.
+
+
+\subsection{Using the Graph Drawing System}
+
+``Users'' of the graph drawing engine can invoke the graph drawing algorithms
+often by just adding a single option to their picture. Here is a typical
+example, where the |layered layout| option tells \tikzname\ that the graph
+should be drawn (``should be laid out'') using a so-called ``layered graph
+drawing algorithm'' (what these are will be explained later):
+%
+\begin{codeexample}[]
+\tikz [>=spaced stealth']
+ \graph [layered layout, components go right top aligned, nodes=draw, edges=rounded corners]
+ {
+ first root -> {1 -> {2, 3, 7} -> {4, 5}, 6 }, 4 -- 5;
+ second root -> x -> {a -> {u,v}, b, c -> d -> {w,z} };
+ third root -> child -> grandchild -> youngster -> third root;
+ };
+\end{codeexample}
+%
+Here is another example, where a different layout method is used that is more
+appropriate for trees:
+%
+\begin{codeexample}[]
+\tikz [grow'=up, binary tree layout, nodes={circle,draw}]
+ \node {1}
+ child { node {2}
+ child { node {3} }
+ child { node {4}
+ child { node {5} }
+ child { node {6} }
+ }
+ }
+ child { node {7}
+ child { node {8}
+ child[missing]
+ child { node {9} }
+ }
+ };
+\end{codeexample}
+%
+A final example, this time using a ``spring electrical layout'' (whatever that
+might be\dots):
+%
+\begin{codeexample}[]
+\tikz [spring electrical layout, node distance=1.3cm,
+ every edge/.style={
+ decoration={coil, aspect=-.5, post length=1mm,
+ segment length=1mm, pre length=2mm},
+ decorate, draw}]
+{
+ \foreach \i in {1,...,6}
+ \node (node \i) [fill=blue!50, text=white, circle] {\i};
+
+ \draw (node 1) edge (node 2)
+ (node 2) edge (node 3)
+ edge (node 4)
+ (node 3) edge (node 4)
+ edge (node 5)
+ edge (node 6);
+}
+\end{codeexample}
+%
+In all of the example, the positions of the nodes have only been computed
+\emph{after} all nodes have been created and the edges have been specified. For
+instance, in the last example, without the option |spring electrical layout|,
+all of the nodes would have been placed on top of each other.
+
+
+\subsection{Extending the Graph Drawing System}
+
+The graph drawing engine is also intended to make is (relatively) easy to
+implement new graph drawing algorithms. These algorithms can either be
+implemented in the Lua programming language (which is \emph{much} easier to
+program than \TeX\ itself) or in C/C++ (but at a great cost regarding
+portability). The Lua code for a graph drawing algorithm gets an
+object-oriented model of the input graph as an input and must just compute the
+desired new positions of the nodes. The complete handling of passing options
+and configurations back-and-forth between the different \tikzname\ and
+\pgfname\ layers is handled by the graph drawing engine.
+
+As a caveat, the graph drawing engine comes with a library of functions and
+methods that simplify the writing of new graph drawing algorithms. As a typical
+example, when you implement a graph drawing algorithm for trees, you typically
+require that your input is a tree; but you can bet that users will feed all
+sorts of graphs to your algorithm, including disjoint unions of cliques. The
+graph drawing engine offers you to say that a precondition to running your
+algorithm is that the graph is a |tree| and instead of the original graph your
+algorithm will be provided with a spanning tree of the graph on which it can
+work. There are numerous further automatic pre- and postprocessing steps that
+include orienting, anchoring, and packing of components, to name a few.
+
+The bottom line is that the graph drawing engine makes it easy
+to try out new graph drawing algorithms for medium sized graphs (up
+to a few hundred nodes) in Lua. For larger graphs, C/C++ code must be
+used.
+
+
+\subsection{The Layers of the Graph Drawing System}
+\label{section-gd-layers}
+
+Even though the graph drawing system presented in the following sections was
+developed as part of \pgfname, it can be used independently of \pgfname\ and
+\tikzname: It was (re)designed so that it can be used by arbitrary programs as
+long as they are able to run Lua. To achieve this, the graph drawing system
+consists of three layers:
+%
+\begin{enumerate}
+ \item At the ``bottom'' we have the \emph{algorithmic layer}. This layer,
+ written in Lua, contains all graph drawing algorithms. Interestingly,
+ options must also be declared on this layer, so an algorithm together
+ with all options it uses can and must be specified entirely on this
+ layer. If you intend to implement a new graph drawing algorithm, you
+ will only be interested in the functionality of this layer.
+
+ Algorithm ``communicate'' with the graph drawing system through a
+ well-defined interface, encapsulated in the class
+ |InterfaceToAlgorithms|.
+ \item At the ``top'' we have the \emph{display layer}. This layer is not
+ actually part of the graph drawing system. Rather, it is a piece of
+ software that ``displays'' graphs and \tikzname\ is just one example of
+ such a software. Another example might be a graph editor that uses the
+ graph drawing system to lay out the graph it displays. Yet another
+ example might be a command line tool for drawing graphs described in a
+ file. Finally, you may also wish to use the graph drawing system as a
+ simple subroutine for rendering graphs produced in a larger program.
+
+ Since the different possible instantiations of the display layer are
+ quite heterogeneous, all display layers must communicate with the graph
+ drawing system through a special interface, encapsulated in the class
+ |InterfaceToDisplay|.
+
+ The main job of this class is to provide a set of methods for
+ specifying that a graph has certain nodes and edges and that certain
+ options have been set for them. However, this interface also allows you
+ to query all options that have been declared by algorithms, including
+ their documentation. This way, an editor or a command line tool can
+ display a list of all graph drawing algorithms and how they can be
+ configured.
+ \item The algorithm layer and the display layer are ``bound together''
+ through the \emph{binding layer}. Most of the bookkeeping concerning
+ the to-be-drawn graphs is done by the graph drawing system
+ independently of which algorithm is used and also independently of
+ which display layer is used, but some things are still specific to each
+ display layer. For instance, some algorithms may create new nodes and
+ the algorithms may then need to know how large these nodes will be. For
+ this, the display layer must be ``queried'' during a run of the
+ algorithm -- and it is the job of the binding layer to achieve this
+ callback.
+
+ As a rule, the binding layer implements the ``backward'' communication
+ from the graph drawing system back to the display layer, while the
+ display layer's interface class provides only functions that are called
+ from the display layer but which will not ``talk back''.
+\end{enumerate}
+
+All of the files concerned with graph drawing reside in the |graphdrawing|
+subdirectory of |generic/pgf|.
+
+
+\subsection{Organisation of the Graph Drawing Documentation}
+
+The documentation of the graph drawing engine is structured as follows:
+%
+\begin{enumerate}
+ \item Following this overview section, the next section documents the graph
+ drawing engine from ``the \tikzname\ user's point of view''. No
+ knowledge of Lua or algorithmic graph drawing is needed for this
+ section, everyone who intends to use algorithmic graph drawing in
+ \tikzname\ may be interested in reading it.
+ \item You will normally only use \tikzname's keys and commands in order to
+ use the graph drawing system, but, internally, these keys call more
+ basic \pgfname\ commands that do the ``hard work'' of binding the world
+ of \TeX\ boxes and macros to the object-oriented world of Lua.
+ Section~\ref{section-gd-pgf} explains how this works and which commands
+ are available for authors of packages that directly need to use the
+ graph drawing system inside \pgfname, avoiding the overhead incurred by
+ \tikzname.
+
+ Most readers can safely skip this section.
+ \item The next sections detail which graph drawing algorithms are currently
+ implemented as part of the \tikzname\ distribution, see
+ Sections~\ref{section-first-graphdrawing-library-in-manual}
+ to~\ref{section-last-graphdrawing-library-in-manual}.
+ \item Section~\ref{section-gd-algorithm-layer} is addressed at readers who
+ wish to implement their own graph drawing algorithms. For this,
+ \emph{no knowledge at all} of \TeX\ programming is needed. The section
+ explains the graph model used in Lua, the available libraries, the
+ graph drawing pipeline, and everything else that is part of the Lua
+ side of the engine.
+ \item Section~\ref{section-gd-display-layer} details the display layer of
+ the graph drawing system. You should read this section if you wish to
+ implement a new display system (that is, a non-\TeX-based program) that
+ intends to use the graph drawing system.
+ \item Section~\ref{section-gd-binding-layer} explains how binding layers
+ can be implemented. This section, too, is of interest only to readers
+ who wish to write new display systems.
+\end{enumerate}
+
+
+\subsection{Acknowledgements}
+
+Graph drawing in \tikzname\ began as a student's project under my supervision.
+Ren\'ee Ahrens, Olof-Joachim Frahm, Jens Kluttig, Matthias Schulz, and Stephan
+Schuster wrote the first prototype of a graph drawing system inside \tikzname\
+that uses Lua\TeX\ for the implementation of graph drawing algorithms.
+
+This first, early version was greatly extended on the algorithmic side by
+Jannis Pohlmann who wrote his Diploma thesis on graph drawing under my
+supervision. He implemented, in particular, the Sugiyama method
+(|layered layout|) and force based algorithms. Also, he rewrote some of the
+code of the prototype.
+
+At some point it became apparent that the first implementation had a number of
+deficiencies, both concerning the structure, the interfaces, and (in
+particular) the performance. Because of this, I rewrote the code of the graph
+drawing system, both on the \TeX\ side and on the Lua side in its current form.
+However, I would like to stress that without the work of the people mentioned
+above graph drawing in \tikzname\ would not exist.
+
+The documentation was written almost entirely by myself, though I did copy some
+paragraphs from Jannis's Diploma thesis, which I can highly recommend everyone
+to read.
+
+In the future, I hope that other people will contribute algorithms, which will
+be available as libraries.
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-phylogenetics.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-phylogenetics.tex
new file mode 100644
index 0000000000..486b930ce5
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-phylogenetics.tex
@@ -0,0 +1,83 @@
+% Copyright 2013 by Sarah Mäusle and Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Graph Drawing Layouts: Phylogenetic Trees}
+\label{section-library-graphdrawing-phylogenetics}
+
+{\noindent {\emph{by Sarah Mäusle and Till Tantau}}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+\tikzset{/graph drawing/phylogenetic inner node/.style={
+ /tikz/.cd,
+ draw, circle, inner sep=0pt, minimum size=5pt}
+}
+\tikzset{/graph drawing/phylogenetic edge/.style={
+ /tikz/.cd,
+ thick, rounded corners,edge node={node[auto,font=\tiny, inner sep=2pt]{}}}
+}
+
+\includeluadocumentationof{pgf.gd.phylogenetics.library}
+\includeluadocumentationof{pgf.gd.phylogenetics.PhylogeneticTree}
+
+
+\subsection{Generating a Phylogenetic Tree}
+
+... \todosp{I guess something should be added here, right?}
+
+When a phylogenetic tree is generated, new nodes and edges get created. In
+order to give you a chance at styling them, the following styles are executed:
+
+\begin{stylekey}{/graph drawing/phylogenetic inner node}
+ The style is added every newly created inner node. In this manual, this key
+ is set to:
+ %
+\begin{codeexample}[code only]
+\pgfgdset{phylogenetic inner node/.style={
+ /tikz/.cd, draw, circle, inner sep=0pt, minimum size=5pt
+ }
+}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/graph drawing/phylogenetic edge=\meta{length}}
+ The style is added every newly created phylogenetic edge. The \meta{length}
+ will be set to the computed evolutionary length of the edge. In this
+ manual, this key is set to:
+ %
+\begin{codeexample}[code only]
+\pgfgdset{phylogenetic edge/.style={
+ /tikz/.cd, thick, rounded corners
+ }
+}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\includeluadocumentationof{pgf.gd.phylogenetics.AuthorDefinedPhylogeny}
+\includeluadocumentationof{pgf.gd.phylogenetics.SokalMichener1958}
+\includeluadocumentationof{pgf.gd.phylogenetics.BalancedMinimumEvolution}
+\includeluadocumentationof{pgf.gd.phylogenetics.BalancedNearestNeighbourInterchange}
+
+
+\subsection{Laying out the Phylogram}
+
+\includeluadocumentationof{pgf.gd.phylogenetics.Maeusle2012}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-trees.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-trees.tex
new file mode 100644
index 0000000000..171b7f8778
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-trees.tex
@@ -0,0 +1,39 @@
+% Copyright 2012 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Graph Drawing Layouts: Trees}
+\label{section-first-graphdrawing-library-in-manual}
+\label{section-library-graphdrawing-trees}
+
+{\noindent {\emph{by Till Tantau}} \todosp{why 2 labels? The second doesn't
+seem to be used.}}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+\includeluadocumentationof{pgf.gd.trees.library}
+
+
+\subsection{The Tree Layouts}
+
+\includeluadocumentationof{pgf.gd.trees.ReingoldTilford1981}
+
+% Other subsections:
+\includeluadocumentationof{pgf.gd.trees.ChildSpec}
+\includeluadocumentationof{pgf.gd.trees.SpanningTreeComputation}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-pgf.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-pgf.tex
new file mode 100644
index 0000000000..961f1e1076
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-pgf.tex
@@ -0,0 +1,683 @@
+% Copyright 2010-2011 by Renée Ahrens
+% Copyright 2010-2011 by Olof Frahm
+% Copyright 2010-2011 by Jens Kluttig
+% Copyright 2010-2011 by Matthias Schulz
+% Copyright 2010-2011 by Stephan Schuster
+% Copyright 2011 by Jannis Pohlmann
+% Copyright 2011 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Using Graph Drawing in PGF}
+\label{section-gd-pgf}
+
+{\noindent {\emph{by Till Tantau}}}
+
+\begin{purepgflibrary}{graphdrawing}
+ This package provides the core support for graph drawing inside \pgfname.
+ It does so by providing \pgfname\ macros for controlling the graph drawing
+ system, but also implements the binding to the graph drawing system (see
+ Section~\ref{section-gd-binding-layer} for details on bindings).
+\end{purepgflibrary}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\subsection{Overview}
+
+Just like everywhere else in \pgfname, \tikzname\ is ``just a convenient
+syntax'' in the context of graph drawing. The ``hard work'' of binding the
+internal representations of nodes and edges with the graph drawing system
+written in Lua is not done by \tikzname, but rather by a set of macros that are
+part of the basic \pgfname\ layer.
+
+The documentation of the \pgfname\ part of the graph drawing system that is
+presented in the following includes only those macros that other \TeX\ packages
+could conceivably call in order to use the graph drawing system without using
+\tikzname; for instance, for efficiency reasons. (The internal callback
+functions defined in the graph drawing library that are part of the binding
+between \pgfname\ and the graph drawing system are not documented, should not
+be called, and may change in the future.)
+
+
+\subsection{How Graph Drawing in PGF Works}
+
+The core idea behind graph drawing in \pgfname\ is that inside special
+\emph{graph drawing scopes} whenever \pgfname\ creates a node, we intercept
+this node creation and \emph{do not} immediately place the node. Rather, we
+pass it down to Lua part of the graph drawing system via calls to appropriate
+methods of the (Lua) class |InterfaceToDisplay|. The effect will be that the
+nodes are ``tucked away'' in some internal tables. For edges, we introduce a
+special command called |\pgfgdedge| that tells the graph drawing system that
+there is an edge between two tucked-away nodes. Then, at the end of the graph
+drawing scope, a graph drawing algorithm written in Lua starts to work on the
+graph by computing new positions for the nodes. Once the algorithm has
+finished, the graph drawing system starts sending back the nodes and edges to
+\pgfname\ via the methods of the class |BindingToPGF|. These methods reinsert
+some code into the \TeX\ output stream that finally places the nodes at their
+final positions. Note that graph drawing algorithms are perfectly oblivious to
+all of this; indeed, the graph drawing algorithms can even be used
+independently of \TeX.
+
+Let us have a look at a simple example to see what happens when a graph is
+specified:
+%
+\begin{codeexample}[]
+\tikz[tree layout]
+ \graph {root [as=Hello] -> World[fill=blue!20]};
+\end{codeexample}
+
+The key |tree layout| internally calls the key |request scope and layout|,
+which in turn calls the macro |\pgfgdbeginscope|, which starts a graph drawing
+scope inside the graph drawing system. Once this macro has been called, until
+the next call of |\pgfgdendscope|, all nodes that are created actually get
+passed down to the graph drawing engine. This is implemented on the lowest
+layer, namely by directly intercepting nodes freshly created using |\pgfnode|.
+In our example, this happens in two places: For the |root| node and for the
+|World| node. The |graph| library and \tikzname\ internally call the |\pgfnode|
+macro for these two nodes (after a large number of internal syntax
+translations, but the graph drawing system does not care about them).
+
+Note that the node boxes will have been fully created before they are passed
+down to the graph drawing engine -- only their final position is not yet fixed.
+It is not possible to modify the size of nodes inside the graph drawing engine,
+but you can create new nodes in certain situations.
+
+In contrast, the single edge of the graph that is created by the |->| command
+is not fully created before it is passed down to the graph drawing system. This
+would not really make sense since before the final positions of the nodes are
+fixed, we cannot even begin to compute the length of this edge, let alone where
+it should start or end. For this reason, on the upper \tikzname\ layer, the
+normal edge creation that would be caused by |->| via |new ->| is suppressed.
+Instead, the command |\pgfgdedge| is called. Similarly, inside a graph drawing
+scope, \tikzname\ will suppress both the |edge| and the |edge from parent|
+command and cause |\pgfgdedge| to be called instead.
+
+An overview of what happens is illustrated by the following call graph:
+
+\bigskip
+
+\begin{tikzpicture}[
+ class name/.style={draw,minimum size=20pt, fill=blue!20},
+ object node/.style={draw,minimum size=15pt, fill=yellow!20},
+ p/.style={->,>=spaced stealth'},
+ livespan/.style={very thick},
+ xscale=0.8,
+]
+ % class names above
+ \node (tikz) at (0,4) [class name] {\tikzname\ layer (\TeX)};
+ \node (tex) at (6,4) [class name] {\pgfname\ layer (\TeX)};
+ \node (interface) at (13,4) [class name] {Display layer (Lua)};
+ % lines from the class names to the bottom of the picture
+ \draw[livespan] (tikz) -- (0,-6.5);
+ \draw[livespan] (tex) -- (6,-6.5);
+ \draw[livespan] (interface) -- (13,-6.5);
+ % first command: \graph{ -- generates new graph in lua interface
+ \node (tikz-begin-graph) at (0,3) [object node] {|\graph[... layout]{|}; %}
+ \node (tex-begin-graph) at (6,3) [object node] {|\pgfgdbeginscope|};
+ \node (interface-new-graph) at (13,3) [object node] {|beginGraphDrawingScope(|...|)|};
+ \draw [p] (tikz-begin-graph.east) -- (tex-begin-graph.west);
+ \draw [p] (tex-begin-graph.east) -- (interface-new-graph.west);
+ % second command: a -> b -- generates two nodes in lua
+ % and one edge
+ \node (tikz-node) at (0,2) [object node] {|a -> b;|};
+ \node (tex-node) at (6,2) [object node, double copy shadow] {|\pgfnode|};
+ \draw[p] (tikz-node.east) -- (tex-node.west);
+
+ \node (interface-add-node) at (13,2) [object node, double copy shadow] {|createVertex(|...|)|};
+ \draw[p] (tex-node.east) -- (interface-add-node.west);
+
+ \node (tex-add-edge) at (6,1) [object node, double copy shadow] {|\pgfgdedge|};
+ \node (interface-add-edge) at (13,1) [object node, double copy shadow] {|createEdge(|...|)|};
+ \draw[p] (tikz-node.east) -- (1.5,2) -- (1.5,1) -- (tex-add-edge.west);
+ \draw[p] (tex-add-edge.east) -- (interface-add-edge.west);
+
+ % scope ends -- cloes graph, layouts it and draws it
+ \node (tikz-end) at (0,0) [object node] {|};|};
+ \node (tex-end) at (6,0) [object node] {|\pgfgdendscope|};
+ \node (interface-draw-graph) at (13,0) [object node] {|runGraphDrawingAlgorithm()|};
+ \node (interface-finish-graph) at (13,-2) [object node] {|endGraphDrawingScope()|};
+
+ \node (invoke-algorithm) at (15.5,-1) [object node] {invoke algorithm};
+ \draw[p] (tikz-end.east) -- (tex-end.west);
+ \draw[p] (tex-end.east) -- (interface-draw-graph.west);
+ \draw[p] (interface-draw-graph.east) -| (invoke-algorithm.20);
+ \draw[p] (tex-end.east) -- (9.5,0) -- (9.5,-2) -- (interface-finish-graph.west);
+
+ % begin shipout
+ \node (tex-begin-shipout) at (6,-3) [object node] {|\pgfgdcallbackbeginshipout|};
+
+ \node (tex-puttexbox) at (6,-4) [object node, double copy shadow] {|\pgfgdcallbackrendernode|};
+ \node (tex-putedge) at (6,-5) [object node, double copy shadow] {|\pgfgddefaultedgecallback|};
+
+ \node (tex-end-shipout) at (6,-6) [object node] {|\pgfgdcallbackendshipout|};
+
+ \draw [p] (interface-finish-graph.-170) |- (tex-begin-shipout.east);
+ \draw [p] (interface-finish-graph.-170) |- (tex-puttexbox.east);
+ \draw [p] (interface-finish-graph.-170) |- (tex-putedge.east);
+ \draw [p] (interface-finish-graph.-170) |- (tex-end-shipout.east);
+ %(interface-finish-graph.east) -- (12.5,-2) -- (12.5,-4) -- (sys-puttexbox.west);
+
+ % put edge
+ %(interface-finish-graph.east) -- (12.5,-2) -- (12.5,-5) -- (sys-put-edge.west);
+ % end shipout
+ %(interface-finish-graph.east) -- (12.5,-2) -- (12.5,-6) -- (sys-end-shipout.west);
+\end{tikzpicture}
+\medskip
+
+The above diagram glosses over the fact that the display layer does not
+actually call any of the macros of \TeX\ directly, but uses a so called
+\emph{binding} (see the class |BindingToPGF|). However, this will not be
+important for the present section since you cannot access the binding directly.
+
+
+\subsubsection{Graph Drawing Scopes}
+\label{section-gd-scopes}
+
+When the graph drawing system is active, some pretty basic things inside
+\pgfname\ change -- such as the fact that nodes are no longer created in the
+normal manner. For this reason, the graph drawing system must be switched on
+and of explicitly through opening and closing a so called \emph{graph drawing
+scope}. These scopes can, in principle, be nested, namely a graph contains a
+node that contains some text that in turn contains a subpicture that contains a
+drawing of a graph. However, this is \emph{not} the same as subgraphs nodes and
+sublayouts, which are all part of the same graph drawing scope. Normally, graph
+drawing scopes are not nested.
+
+Graph drawing scopes are created using the following commands:
+
+\begin{command}{\pgfgdbeginscope}
+ This macro starts a \TeX\ scope inside which the following things happen:
+ %
+ \begin{enumerate}
+ \item The display layer method |beginGraphDrawingScope| is called,
+ which created a new graph drawing scope inside the graph drawing
+ system and places it on top of an internal stack. From now on, all
+ subsequent interface calls will refer to this scope until
+ |\pgfgdendscope| is called, which will pop the scope once more.
+ \item Inside the \TeX\ scope, nodes are not placed immediately. Rather,
+ |\pgfpositionnodelater|, see
+ Section~\ref{section-shapes-deferred-node-positioning}, is used to
+ call |InterfaceToDisplay.createVertex| for all nodes created inside
+ the scope. This will cause them to be put inside some internal
+ table.
+ \item Some additional \meta{code} is executed, which has been set using
+ the following command:
+ %
+ \begin{command}{\pgfgdaddspecificationhook\marg{code}}
+ This command adds the \meta{code} to the code that is executed
+ whenever a graph drawing scope starts. For instance, the
+ \tikzname\ library |graphdrawing| uses this macro to add some
+ \meta{code} that will redirect the |edge| and
+ |edge from parent| path commands to |\pgfgdedge|.
+ \end{command}
+ \item |\pgftransformreset| is called.
+ \item The following \TeX-if is set to true:
+ {
+ \let\ifpgfgdgraphdrawingscopeactive=\relax
+ \begin{textoken}{\ifpgfgdgraphdrawingscopeactive}
+ Will be true inside a graph drawing scope.
+ \end{textoken}
+ }
+ \end{enumerate}
+ %
+ The above has a number of consequences for what can happen inside a graph
+ drawing scope:
+ %
+ \begin{itemize}
+ \item Since nodes are not actually created before the end of the scope,
+ you cannot reference these nodes. Thus, you cannot write
+ %
+\begin{codeexample}[code only]
+\tikz [spring layout] {
+ \node (a) {a};
+ \node (b) {b};
+ \draw (a) -- (b);
+}
+\end{codeexample}
+ %
+ The problem is that we cannot connect |(a)| and |(b)| via a
+ straight line since these nodes do not exist at that point (they
+ are available only deeply inside the Lua).
+ \item In order to create edges between nodes inside a graph drawing
+ scope, you need to call the |\pgfgdedge| command, described below.
+ \end{itemize}
+
+ Additionally, when \tikzname\ is used, the following things also happen:
+ %
+ \begin{itemize}
+ \item If the |graphs| library has been loaded, the default positioning
+ mechanisms of this library are switched off, leaving the
+ positioning to the graph drawing engine. Also, when an edge is
+ created by the |graphs| library, this is signalled to the graph
+ drawing library. (To be more precise: The keys |new ->| and so on
+ are redefined so that they call |\pgfgdedge| instead of creating an
+ edge.
+ \item The |edge| path command is modified so that it also calls
+ |\pgfgdedge| instead of immediately creating any edges.
+ \item The |edge from parent| path command is modified so that is also
+ calls |\pgfgdedge|.
+ \item The keys |append after command| and |prefix after command| keys
+ are modified so that they are executed only via |late options| when
+ the node has ``reached its final parking position''.
+ \end{itemize}
+
+ Note that inside a graph drawing scope you first have to open a (main)
+ layout scope (using the |\pgfgdbeginlayout| command described later on)
+ before you can add nodes and edges to the scope.
+\end{command}
+
+\begin{command}{\pgfgdendscope}
+ This macro is used to end a graph drawing scope. It must be given on the
+ same \TeX\ grouping level as the corresponding |\pgfgdbeginscope|. When the
+ macro is called, it triggers a lot of new calls:
+ %
+ \begin{enumerate}
+ \item The special treatment of newly created boxes is ended. Nodes are
+ once more created normally.
+ \item The effects of the \meta{code} that was inserted via the
+ specification hook command also ends (provided it had no global
+ effects).
+ \item We call |InterfaceToDisplay.runGraphDrawingAlgorithm|. This will
+ cause the algorithm(s) for the graph to be executed (since a graph
+ can have sublayouts, several algorithms may be run). See
+ Section~\ref{section-gd-layout-scopes} below.
+ \item Next, we call |InterfaceToDisplay.endGraphDrawingScope|. This
+ causes all nodes that were intercepted during the graph drawing
+ scope to be reinserted into the output stream at the positions that
+ were computed for them. Also, for each edge that was requested via
+ |\pgfgdedge|, the callback macro is called (see below).
+ \end{enumerate}
+\end{command}
+
+Inside a graph drawing scope, nodes are automatically passed down to the graph
+drawing engine, while for edges a command has to be called explicitly:
+
+\begin{command}{\pgfgdedge\marg{first node}\marg{second node}\marg{edge direction}\marg{edge options}\marg{edge nodes}}
+ This command is used to tell the graph drawing engine that there is an edge
+ between \meta{first node} and \meta{second node} in your graph. The
+ ``kind'' of connection is indicated by \meta{direction}, which may be one
+ of the following:
+ %
+ \begin{itemize}
+ \item |->| indicates a directed edge (also known as an arc) from
+ \meta{first node} to \meta{second node}.
+ \item |--| indicates an undirected edge between \meta{first node} and
+ \meta{second node},
+ \item |<-| indicates a directed edge from \meta{second node} to
+ \meta{first node}, but with the ``additional hint'' that this is a
+ ``backward'' edge. A graph drawing algorithm may or may not take
+ this hint into account.
+ \item |<->| indicates a bi-directed edge between \meta{first node} and
+ \meta{second node}.
+ \item |-!-| indicates that the edge from \meta{first node} to
+ \meta{second node} is ``missing''.
+ \end{itemize}
+ %
+ Note that in all cases, the syntactic digraph will contain an arc from
+ \meta{first node} to \meta{second node}, regardless of the value of
+ \meta{direction}. The \meta{direction} is ``just'' a ``semantic
+ annotation''.
+
+ The parameters \meta{edge options} and \meta{edge nodes} are a bit more
+ tricky. When an edge between two vertices of a graph is created via
+ |\pgfgdedge|, nothing is actually done immediately. After all, without
+ knowing the final positions of the nodes \meta{first node} and \meta{second
+ node}, there is no way of creating the actual drawing commands for the
+ edge. Thus, the actual drawing of the edge is done only when the graph
+ drawing algorithm is done (namely in the macro |\pgfgdedgecallback|, see
+ later).
+
+ Because of this ``delayed'' drawing of edges, options that influence the
+ edge must be retained until the moment when the edge is actually drawn.
+ Parameters \meta{edge options} and \meta{edge nodes} store such options.
+
+ Let us start with \meta{edge options}. This parameter should be set to a
+ list of key--value pairs like
+ %
+\begin{codeexample}[code only]
+/tikz/.cd, color=red, very thick, orient=down
+\end{codeexample}
+ %
+ Some of these options may be of interest to the graph drawing algorithm
+ (like the last option) while others will only be important during the
+ drawing of edge (like the first option). The options that are important for
+ the graph drawing algorithm must be pushed onto the graph drawing system's
+ option stack.
+
+ The tricky part is that options that are of interest to the graph drawing
+ algorithm must be executed \emph{before} the algorithm starts, but the
+ options as a whole are usually only executed during the drawing of the
+ edges, which is \emph{after} the algorithm has finished. To overcome this
+ problem, the following happens:
+
+ The options in \meta{edge options} are executed ``tentatively'' inside
+ |\pgfgdedge|. However, this execution is done in a ``heavily guarded
+ sandbox'' where all effects of the options (like changing the color or the
+ line width) do not propagate beyond the sandbox. Only the changes of the
+ graph drawing edge parameters leave the sandbox. These parameters are then
+ passed down to the graph drawing system.
+
+ Later, when the edge is drawn using |\pgfgdedgecallback|, the options
+ \meta{edge options} are available once more and then they are executed
+ normally.
+
+ Note that when the options in \meta{edge options} are executed, no path is
+ preset. Thus, you typically need to start it with, say, |/tikz/.cd|. Also
+ note that the sandbox is not perfect and changing global values will have
+ an effect outside the sandbox. Indeed, ``putting things in a sandbox'' just
+ means that the options are executed inside a \TeX\ scope inside an
+ interrupted path inside a \TeX\ box that is thrown away immediately.
+
+ The text in \meta{edge nodes} is some ``auxiliary'' text that is simply
+ stored away and later directed to |\pgfgdedgecallback|. This is used for
+ instance by \tikzname\ to store its node labels.
+\end{command}
+
+\begin{command}{\pgfgdsetedgecallback\marg{macro}}
+ This command allows you to change the \meta{macro} that gets called form
+ inside the graph drawing system at the end of the creation of a graph, when
+ the nodes have been positioned. The \meta{macro} will be called once for
+ each edge with the following parameters:
+ %
+ \begin{quote}
+ \meta{macro}\marg{first node}\marg{second node}\marg{direction}\marg{edge options}\marg{edge nodes}\\
+ \marg{algorithm-generated options}\marg{bend information}\marg{animations}
+ \end{quote}
+
+ The first five parameters are the original values that were passed down to
+ the |\pgfgdedge| command.
+
+ The \meta{algorithm-generated options} have been ``computed by the
+ algorithm''. For instance, an algorithm might have determined, say, flow
+ capacities for edges and it might now wish to communicate this information
+ back to the upper layers. These options should be executed with the path
+ |/graph drawing|.
+
+ The parameter \meta{bend information} contains algorithmically-computed
+ information concerning how the edge should bend. This will be a text like
+ |(10pt,20pt)--(30pt,40pt)| in \tikzname-syntax and may include the path
+ commands |--|, |..| (followed by Bézier coordinates), and |--cycle|.
+
+ The parameter \meta{animations} contains algorithmically-generated
+ animation commands (calls to |\pgfanimateattribute|. The |whom| will be set
+ to |pgf@gd|.
+
+ The default \meta{macro} simply draws a line between the nodes. When the
+ |graphdrawing| library of the \tikzname\ layer is loaded, a more fancy
+ \meta{macro} is used that takes all of the parameters into account.
+\end{command}
+
+
+\subsection{Layout Scopes}
+\label{section-gd-layout-scopes}
+
+As described in Section~\ref{section-gd-sublayouts}, the graph drawing engine
+does not always apply only a single algorithm. Rather, several different
+algorithm may be applied to different parts of the graph. How this happens,
+exactly, is governed by a hierarchy of layouts, which are setup using the
+commands |\pgfgdbeginlayout| and |\pgfgdendlayout|.
+
+\begin{command}{\pgfgdbeginlayout}
+ This command first starts a new \TeX\ scope and then informs the display
+ layer that a new (sub)layout should be started. For each graph there may be
+ a hierarchy of layouts, each of which contains a certain number of vertices
+ and edges. This hierarchy is created through calls to this macros and the
+ corresponding calls of |\pgfgdendlayout|. For each graph drawing scope
+ there has to be exactly one main layout that encompasses all nodes and
+ edges and also all sublayouts. Thus, after a graph drawing scope has been
+ opened, a layout scope also needs to be opened almost immediately.
+
+ For each layout created via this macro, a graph drawing algorithm will be
+ run later on the subgraph of all nodes that make up the layout. Which
+ algorithm is run for the layout is dictated by which layout key (one of the
+ |... layout| keys) is ``in force'' when the macro is called. Thus, using a
+ layout key for selecting an algorithm must always be done \emph{before} the
+ layout is started. (However, see the discussion of layout keys in the next
+ subsection for more details on what really happens.)
+
+ A vertex can be part of several layouts, either because they are nested or
+ because they overlap (this happens when a node is later on added to another
+ layout by calling |\pgfgdsetlatenodeoption|). This means that it is not
+ immediately obvious how conflicts arising from the different ways different
+ algorithms ``would like to place nodes'' should be resolved. The method for
+ this resolving is detailed in Section~\ref{section-gd-layout-resolve}.
+\end{command}
+
+\begin{command}{\pgfgdendlayout}
+ This command ends the \TeX\ scope of the current layout. Once closed, no
+ nodes or edges can be added to a layout.
+\end{command}
+
+\begin{command}{\pgfgdsetlatenodeoption\marg{node name}}
+ This command can only be called when the node named \meta{node name} has
+ already been created inside the current graph drawing scope. The effect of
+ calling this macro will be that all options currently on the graph drawing
+ system's option stack will be added to the node's option, possibly
+ overwriting the original option settings. Furthermore, the node will become
+ part of all layouts currently on the option stack. This means that you can
+ use this command to add a node to several layouts that are not included in
+ one another.
+\end{command}
+
+
+\subsection{Layout Keys}
+
+\emph{Layout keys} are keys like |tree layout| or |layered layout| that are
+used to select a specific graph drawing algorithm. From the graph drawing
+system's point of view, these keys ``just'' select an algorithm and when
+several layout keys are used in a row, the last one would ``win''; just as when
+you say |orient=90| directly followed by |orient=0|, the result is that the
+|orient| key is set to |0| because the last key ``wins''.
+
+Unfortunately, if keys like |tree layout| were ``just'' to select an algorithm,
+we would still need a key or some special syntax to actually start a
+(sub)layout. In early versions of the system this was exactly what people had
+to do and this was somewhat awkward. Because of this problem, the behaviour of
+the layout keys in \pgfname\ (and only there, other display layers need to
+implement their own behaviour) is now a bit more involved. When you use a key
+like |tree layout| (more precisely, any key that was declared as an algorithm
+key on the algorithm layer of the graph drawing system) in any scope in
+\pgfname, the following happens:
+%
+\begin{enumerate}
+ \item The graph drawing system is told that a specific algorithm has been
+ selected (the Reingold--Tilford-algorithm in this case; this
+ information was communicated to the graph drawing system during the
+ declaration of the algorithm). Being ``told'' about this means that a
+ special entry is pushed onto the current options stack of the graph
+ drawing system.
+ \item An internal ``request'' for a ``scope and a layout'' is made. This
+ has several effects:
+ \item We first test whether we are already inside a layout scope. If not,
+ we use |\pgfgdbeginscope| to open a graph drawing scope. This scope
+ will be closed appropriately (see |\pgfgdsetrequestcallback| for
+ details).
+ \item Next, a layout scope is opened using |\pgfgdbeginlayout|. It will
+ also be closed appropriately.
+\end{enumerate}
+
+The net effect of the above is that the first use of a layout key in a picture
+starts both a graph drawing scope and also a main layout, while subsequent uses
+of layout keys inside a picture will only open sublayouts.
+
+\begin{command}{\pgfgdsetrequestcallback\marg{macro}}
+ This command sets up \meta{macro} as the macro that is called whenever a
+ layout key ``requests'' that a layout and, possibly, a graph drawing scope
+ is opened. When \meta{macro} is called, it gets two parameters, the
+ \meta{begin code} and the \meta{end code}. In addition to whatever setup
+ the \meta{macro} would like to do, it should execute the \meta{begin code}
+ at the beginning of a \TeX\ scope (the code will open graph drawing and
+ layout scopes) and the \meta{end code} at the end of the same \TeX\ scope.
+
+ The need for this slightly strange macro arises from the fact that in
+ \tikzname\ we often write things like |[spring layout,node sep=2cm]|. The
+ point is that when the |spring layout| key is executed, we do \emph{not}
+ wish to open a layout scope immediately. Rather, this should happen only
+ after the option |nodes sep=2cm| has been executed. For this reason,
+ \tikzname\ sets up a special \meta{macro} that ``delays'' the execution of
+ the \meta{begin code} until the end of the opening of the next scope.
+
+ Because of this, in \tikzname\ layout keys can only be used as an option
+ when a \tikzname\ scope is started. Thus, you can pass them to |\tikz|, to
+ |{tikzpicture}|, to |\scoped|, to |{scope}|, to |graph|, and to |{graph}|.
+ For instance, the |tree layout| option can be used in the following ways:
+ %
+\begin{codeexample}[]
+\tikz [tree layout] \graph {1 -> {b,c}};
+\tikz \graph [tree layout] {2 -> {b,c}};
+\tikz \path graph [tree layout] {3 -> {b,c}};
+
+\begin{tikzpicture}[tree layout]
+ \graph {4 -> {b,c}};
+\end{tikzpicture}
+
+\begin{tikzpicture}
+ \scoped [tree layout] \graph {5 -> {b,c}};
+
+ \begin{scope}[tree layout, xshift=1.5cm]
+ \graph {6 -> {b,c}};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+ You can \emph{not} use layout keys with a single node or on a path. In
+ particular, to typeset a tree given in the |child| syntax somewhere inside
+ a |{tikzpicture}|, you must prefix it with the |\scoped| command:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \scoped [tree layout]
+ \node {root}
+ child { node {left child} }
+ child { node {right child} };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Naturally, the above could have been written more succinctly as
+ %
+\begin{codeexample}[]
+\tikz [tree layout]
+ \node {root}
+ child { node {left child} }
+ child { node {right child} };
+\end{codeexample}
+ %
+ Or even more succinctly:
+ %
+\begin{codeexample}[]
+\tikz \graph [tree layout] { root -- {left child, right child} };
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Parameters}
+\label{section-gd-parameters}
+
+When a graph drawing algorithm starts working, a set of options, called ``graph
+drawing parameters'' or just ``parameters'' can influence the way the algorithm
+works. For instance, a graph drawing parameter might be the average distance
+between vertices which the algorithm should take into account. Another example
+might be the fact the certain nodes are special nodes and that a certain edge
+should have a large label.
+
+These graph drawing parameters are different from ``usual'' \pgfname\ options:
+An algorithmic parameter influences the way the algorithm works, while usual
+options influence the way the result looks like. For instance, the fact that a
+node is red is not a graph drawing parameter, while the shape of a node might
+be an graph drawing parameter.
+
+The possible graph parameters are declared by the algorithmic layer through the
+|declare| method; you cannot declare parameters on the \pgfname\ layer since
+this would not be compatible across different display systems.
+
+Users use a graph parameter in the same way as a normal key. The difference is
+that each time a key representing a graph drawing parameter is used, a special
+function of the graph drawing system's interface is called to ``push'' the
+parameter onto an internal option stack (and elements are popped from this
+stack whenever the \TeX\ scope closes in which the key was used).
+
+The net effect of all of this is that the graph drawing system keeps track of a
+stack of option in parallel to \TeX. You cannot, however, access the current
+values of graph drawing parameters from \TeX\ since they are tucked away deep
+inside the graph drawing system.
+
+
+\subsection{Events}
+
+\emph{Events} are used to pass information from the parser about the syntactic
+structure of a graph to graph drawing algorithms. Consider, for instance, a
+graph that is actually a tree in which some node ``misses'' its first child. In
+this case, the information that the child is missing is neither part of any
+node (because the node is missing, after all) nor is it an option of the whole
+graph. However, events are created by the parser the allow an algorithm to
+reconstruct the fact that the child is missing. Naturally, graph drawing
+algorithms may choose to ignore events and most will.
+
+Most of the creation and handling of events is done automatically. The only
+reason you might wish to use the following commands is when you write a
+``parser extension'' together with a new graph drawing algorithm. For instance,
+you might come up with new options that, when used, trigger events.
+
+\begin{command}{\pgfgdevent\marg{kind}\marg{parameter}}
+ Calls |createEvent| of the graph drawing system's interface class. This
+ creates a new |Event| object on the Lua layer whose |kind| field is set to
+ \meta{kind} and the |parameters| field to \meta{parameter}. You must be
+ inside a graph drawing scope to use this command.
+\end{command}
+
+\begin{command}{\pgfgdbegineventgroup\marg{parameter}}
+ Starts an event group. This just means that an |Event| of kind |begin| is
+ created with the given \meta{parameter}.
+\end{command}
+
+\begin{command}{\pgfgdendeventgroup}
+ Ends an event group. This is done by adding an event of kind |end| without
+ any parameters to the event string.
+\end{command}
+
+\begin{command}{\pgfgdeventgroup\marg{parameters}}
+ Starts an event group just like |\pgfgdbegineventgroup|, but adds a
+ corresponding closing |end| event at the end of the current \TeX\ group
+ (using |\aftergroup|).
+\end{command}
+
+
+\subsection{Subgraph Nodes}
+
+\begin{command}{\pgfgdsubgraphnode\marg{name}\marg{node options}\marg{node text}}
+ A subgraph node is a node that ``surrounds'' the nodes of a subgraph. The
+ special property of a subgraph node opposed to a normal node is that it is
+ created only after the subgraph has been laid out. However, the difference
+ to a collection like |hyper| is that the node is available immediately as a
+ normal node in the sense that you can connect edges to it.
+
+ What happens internally is that subgraph nodes get ``registered''
+ immediately both on the \pgfname\ level and on the Lua level, but the
+ actual node is only created inside the layout pipeline using a callback.
+ The actual node creation happens when the innermost layout in which the
+ subgraph node is declared has finished.
+
+ When you create a subgraph node using this macro, you also start a
+ collection (of an internal kind) that stores the subgraph. All following
+ nodes in the current \TeX\ scope will become part of this collection.
+
+ The \meta{name} is the node name by which you can refer to this node in the
+ following. The \meta{node options} are normal \pgfname\ options (like |red|
+ or |draw| or |circle|) that will influence the appearance when it is
+ created later on. The \meta{node text} is the text that will be passed to
+ |\pgfnode| upon creation of the node.
+
+ See |InterfaceToDisplay.pushSubgraphVertex| for more details.
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-tikz.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-tikz.tex
new file mode 100644
index 0000000000..bbedfc01db
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-gd-usage-tikz.tex
@@ -0,0 +1,530 @@
+% Copyright 2012 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Using Graph Drawing in \tikzname}
+
+{\noindent {\emph{by Till Tantau}}}
+
+\begin{tikzlibrary}{graphdrawing}
+ This package provides capabilities for automatic graph drawing. It requires
+ that the document is typeset using Lua\TeX. This package should work with
+ Lua\TeX\ 0.54 or higher.
+\end{tikzlibrary}
+
+\ifluatex
+\else
+ This section of the manual can only be typeset using Lua\TeX.
+ \expandafter\endinput
+\fi
+
+
+\subsection{Choosing a Layout and a Library}
+
+The graph drawing engine is initialized when you load the library
+|graphdrawing|. This library provides the basic framework for graph drawing,
+including all options and keys described in the present section. However, this
+library does \emph{not} load any actual algorithms for drawing graphs. For
+this, you need to use the following command, which is defined by the
+|graphdrawing| library:
+
+\begin{command}{\usegdlibrary\marg{list of libraries}}
+ This command is used to load the special graph drawing libraries (the |gd|
+ in the name of the command stands for ``graph drawing''). The \meta{list of
+ libraries} is a comma-separated list of library written in the Lua
+ programming language (which is why a special command is needed).
+
+ In detail, this command does the following. For each \meta{name} in the
+ \meta{list of libraries} we do:
+ %
+ \begin{enumerate}
+ \item Check whether Lua\TeX\ can call |require| on the library file
+ |pgf.gd.|\meta{name}|.library|. Lua\TeX's usual file search
+ mechanism will search the texmf-trees in the usual manner and the
+ dots in the file name get converted into directory slashes.
+ \item If the above failed, try to |require| the string
+ |pgf.gd.|\meta{name}.
+ \item If this fails, try to |require| the string \meta{name}|.library|.
+ \item If this fails, try to |require| the string \meta{name}. If this
+ fails, print an error message.
+ \end{enumerate}
+ %
+ The net effect of the above is the following: Authors of graph drawing
+ algorithms can bundle together multiple algorithms in a library by creating
+ a |...xyz/library.lua| file that internally just calls |require| for all
+ files containing declarations. On the other hand, if a graph drawing
+ algorithm completely fits inside a single file, it can also be read
+ directly using |\usegdlibrary|.
+ %
+\begin{codeexample}[code only]
+\usetikzlibrary{graphdrawing}
+\usegdlibrary{trees,force}
+\end{codeexample}
+
+ The different graph drawing libraries are documented in the following
+ Sections~\ref{section-first-graphdrawing-library-in-manual} to
+ \ref{section-last-graphdrawing-library-in-manual}.
+\end{command}
+
+Note that in addition to the graph \emph{drawing} libraries, you may also wish
+to load the normal \tikzname\ library |graphs|. It provides the powerful
+|graph| path command with its easy-to-use syntax for specifying graphs, but you
+can use the graph drawing engine independently of the |graphs| library, for
+instance in conjunction with the |child| or the |edge| syntax. Here is a
+typical setup:
+%
+\begin{codeexample}[code only]
+\usetikzlibrary{graphs, graphdrawing}
+\usegdlibrary{trees, layered}
+\end{codeexample}
+
+Having set things up, you must then specify for which scopes the graph drawing
+engine should apply a layout algorithm to the nodes in the scope. Typically,
+you just add an option ending with |... layout| to the |graph| path operation
+and then let the graph drawing do its magic:
+%
+\begin{codeexample}[]
+\tikz [rounded corners]
+ \graph [layered layout, sibling distance=8mm, level distance=8mm]
+ {
+ a -> {
+ b,
+ c -> { d, e }
+ } ->
+ f ->
+ a
+ };
+\end{codeexample}
+
+Whenever you use such an option, you can:
+%
+\begin{itemize}
+ \item Create nodes in the usual way. The nodes will be created completely,
+ but then tucked away in an internal table. This means that all of
+ \tikzname's options for nodes can be applied. You can also name a node
+ and reference it later.
+ \item Create edges using either the syntax of the |graph| command (using
+ |--|, |<-|, |->|, or |<->|), or using the |edge| command, or using the
+ |child| command. These edges will, however, not be created immediately.
+ Instead, the basic layer's command |\pgfgdedge| will be called, which
+ stores ``all the information concerning the edge''. The actual drawing
+ of the edge will only happen after all nodes have been positioned.
+ \item Most of the keys that can be passed to an edge will work as expected.
+ In particular, you can add labels to edges using the usual |node|
+ syntax for edges.
+ \item The |label| and |pin| options can be used in the usual manner with
+ nodes inside a graph drawing scope. Only, the labels and nodes will
+ play no role in the positioning of the nodes and they are added when
+ the nodes are finally positioned.
+ \item Similarly, nodes that are placed ``on an edge'' using the implicit
+ positioning syntax can be used in the usual manner.
+\end{itemize}
+%
+Here are some things that will \emph{not} work:
+%
+\begin{itemize}
+ \item Only edges created using the graph syntax, the |edge| command, or the
+ |child| command will correctly pass their connection information to the
+ basic layer. When you write |\draw (a)--(b);| inside a graph drawing
+ scope, where |a| and |b| are nodes that have been created inside the
+ scope, you will get an error message / things will look wrong. The
+ reason is that the usual |--| is not ``caught'' by the graph drawing
+ engine and, thus, tries to immediately connect two nodes that do not
+ yet exist (except inside some internal table).
+ \item The options of edges are executed twice: Once when the edge is
+ ``examined'' by the |\pgfgdedge| command (using some magic to shield
+ against the side effects) and then once more when the edge is actually
+ created. Fortunately, in almost all cases, this will not be a problem;
+ but if you do very evil magic inside your edge options, you must roll a
+ D100 to see what strange things will happen. (Do no evil, by the way.)
+\end{itemize}
+
+If you are really interested in the ``fine print'' of what happens, please see
+Section~\ref{section-gd-pgf}.
+
+
+\subsection{Graph Drawing Parameters}
+
+Graph drawing algorithms can typically be configured in some way. For instance,
+for a graph drawing algorithm that visualizes its nodes as a tree, it will
+typically be useful when the user can change the so-called \emph{level
+distance} and the \emph{sibling distance}. For other algorithms, like
+force-based algorithms, a large number of parameters influence the way the
+algorithms work. Options that influence graph drawing algorithms will be called
+\emph{(graph drawing) parameters} in the following. From the user's point of
+view, these parameters look like normal \tikzname\ keys and you set them in the
+usual way. Internally, they are treated a bit differently from normal keys
+since their ``effect'' becomes apparent only later on, namely during the run of
+the graph drawing algorithm.
+
+A graph drawing algorithm may or may not take different graph parameters into
+account. After all, these options may even outright contradict each other, so
+an algorithm can only try to ``do its best''. While many graph parameters are
+very specific to a single algorithm, a number of graph parameters will be
+important for many algorithms and they are documented in the course of the
+present section. Here is an example of an option the ``always works'':
+%
+\begin{codeexample}[]
+\tikz \graph [spring layout, vertical=1 to 2] { 1--2--3--1 };
+\end{codeexample}
+
+\includeluadocumentationof{pgf.gd.control.Distances}
+\includeluadocumentationof{pgf.gd.control.Anchoring}
+\includeluadocumentationof{pgf.gd.control.Orientation}
+
+\includeluadocumentationof{pgf.gd.control.FineTune}
+
+\includeluadocumentationof{pgf.gd.control.Components}
+\includeluadocumentationof{pgf.gd.control.ComponentOrder}
+\includeluadocumentationof{pgf.gd.control.ComponentDirection}
+\includeluadocumentationof{pgf.gd.control.ComponentAlign}
+\includeluadocumentationof{pgf.gd.control.ComponentDistance}
+
+\includeluadocumentationof{pgf.gd.control.NodeAnchors}
+
+\includeluadocumentationof{pgf.gd.model.Hyperedge}
+
+
+\subsection{Using Several Different Layouts to Draw a Single Graph}
+\label{section-gd-sublayouts}
+
+Inside each graph drawing scope, a main algorithm is used to perform the graph
+drawing. However, parts of the graph may be drawn using different algorithms:
+For instance, a graph might consist of several, say, cliques that are arranged
+in a tree-like fashion. In this case, it might be useful to layout each clique
+using a circular layout, but then lay out all laid out cliques using a tree
+drawing algorithm.
+
+In order to lay out a graph using multiple algorithms, we need two things:
+First, we must be able to \emph{specify} which algorithms should be used where
+and, second, we must be able to \emph{resolve} conflicts that may result from
+different algorithms ``having different ideas'' concerning where nodes should
+be placed.
+
+
+\subsubsection{Sublayouts}
+
+Specifying different layouts for a graph is easy: Inside a graph drawing scope,
+simply open scopes, in which you use an option like |tree layout| for the nodes
+mentioned in this scope. Inside these scopes, you can open even subscopes for
+sublayouts, and so on. Furthermore, the |graphs| library has special support
+for sublayouts.
+
+Let us start with the ``plain'' syntax for opening sublayouts: You pass a key
+for creating layouts to a |scope|:
+%
+\begin{codeexample}[]
+\tikz [spring layout] {
+ \begin{scope}[tree layout]
+ \node (a) {a};
+ \node (b) {b};
+ \node (c) {c};
+ \draw (a) edge (b) edge (c);
+ \end{scope}
+
+ \begin{scope}[tree layout]
+ \node (1) {1};
+ \node (2) {2};
+ \draw (1) edge (2);
+ \end{scope}
+
+ \draw (a) edge (1);
+}
+\end{codeexample}
+
+Let us see, what is going on here. The main layout (|spring layout|) contains
+two sublayouts (the two |tree layouts|). Both of them are laid out
+independently (more on the details in a moment). Then, from the main layout's
+point of view, the sublayouts behave like ``large nodes'' and, thus, the edge
+between |a| and |1| is actually the only edge that is used by the
+|spring layout| -- resulting in a simple layout consisting of one big node at
+the top and a big node at the bottom.
+
+The |graphs| library has a special support for sublayouts: The syntax is as
+follows: wherever a normal node would go, you can write
+%
+\begin{quote}
+ |//| \opt{\oarg{layout options}} |{|\meta{sublayout}|}|
+\end{quote}
+
+Following the double slash, you may provide \meta{layout options} in square
+brackets. However, you \emph{must} provide a sublayout in braces. The contents
+of \meta{sublayout} will be parsed using the usual |graph| syntax, but will
+form a sublayout.
+%
+\begin{codeexample}[]
+\tikz \graph [spring layout] {
+ // [tree layout] { a -- {b, c} };
+ // [tree layout] { 1 -- 2 };
+ a -- 1;
+};
+\end{codeexample}
+
+In the above example, there is no node before the double slash, which means
+that the two sublayouts will be part of the main graph, but will not be
+indicated otherwise.
+%
+\begin{codeexample}[]
+\tikz \graph [simple necklace layout] {
+ // [simple necklace layout] { a -> b -> c -> d -> e -> f -> a };
+
+ // [tree layout] { % first tentacle
+ a -> {1, 2};
+ };
+
+ // [tree layout] {% second tentacle
+ d -> {3, 4 -> {5, 6}}
+ };
+};
+\end{codeexample}
+
+In the above example, the first sublayout is the one for the nodes with letter
+names. These nodes are arranged using a simple necklace layout as the sublayout
+inherits this option from the main layout. The two small trees (|a -> {1, 2}|
+and the tree starting at the |d| node) are also sublayouts, triggered by the
+|tree layout| option. They are also arranged. Then, all of the layouts are
+merged (as described later). The result is actually a single node, so the main
+layout does nothing here.
+
+Compare the above to the following code:
+%
+\begin{codeexample}[]
+\tikz \graph [simple necklace layout] {
+ // [tree layout] { % first ``giant node''
+ a -> {1, 2};
+ };
+
+ a -> b -> c -> d;
+
+ // [tree layout] {% second ``giant node''
+ d -> {3, 4 -> {5, 6}}
+ },
+
+ d -> e -> f -> a;
+};
+\end{codeexample}
+
+Here, only the two trees are laid out first. They are then contracted into
+``giant nodes'' and these are then part of the set of nodes that are arranged
+by the |simple necklace layout|. For details of how this contracting works, see
+below.
+
+
+\subsubsection{Subgraph Nodes}
+
+A \emph{subgraph node} is a special kind of node that ``surrounds'' the
+vertices of a subgraph. The special property of a subgraph node opposed to a
+normal node is that it is created only after the subgraph has been laid out.
+However, the difference to a collection like |hyper| is that the node is
+available immediately as a normal node in the sense that you can connect edges
+to it.
+
+The syntax used to declare a subgraph node in a |graph| specification is as
+follows:
+%
+\begin{quote}
+ \opt{|"|}\meta{node name}\opt{|"|}\opt{|/|\opt{|"|}\meta{text}\opt{|"|}}
+ \opt{\oarg{node options}} |//| \opt{\oarg{layout options}} |{|\meta{subgraph}|}|
+\end{quote}
+
+The idea ist that a subgraph node is declared like a normal node specification,
+but is followed by a double slash and a subgraph:
+%
+\begin{codeexample}[width=5cm]
+\tikz \graph [simple necklace layout] {
+ tree 1[draw, circle] // [tree layout] { a -> {1, 2}; }
+ -> b
+ -> c
+ -> tree 2[draw] // [tree layout] { d -> {3, 4 -> {5, 6} } }
+ -> e
+ -> f
+ -> tree 1;
+};
+\end{codeexample}
+
+Note how the two subgraph nodes |tree 1| and |tree 2| surround the two smaller
+trees. In the example, both had trees as contents and these trees were rendered
+using a sublayout. However, a subgraph layout does not need to have its own
+layout: If you do \emph{not} provide a layout name after the double slash, the
+subgraph node will simply surround all nodes that were placed by the main
+layout wherever they were placed:
+%
+\begin{codeexample}[]
+\tikz [subgraph text bottom=text centered,
+ subgraph nodes={font=\itshape}]
+ \graph [tree layout] {
+ a -> { b -> {c, d}, e -> {f, g -> h} };
+
+ left [draw] // { b, c, d };
+ right [draw] // { e, f, g, h};
+
+ left <-> right;
+ };
+\end{codeexample}
+
+Every time a subgraph node is created, the following style is execute:
+
+\begin{key}{/tikz/every subgraph node}
+ Set a subgraph node style.
+\end{key}
+
+\begin{key}{/tikz/subgraph nodes=\meta{style}}
+ Sets the |every subgraph node| style to \meta{style}.
+ %
+\begin{codeexample}[]
+\tikz [subgraph text bottom=text centered,
+ subgraph nodes=red]
+ \graph [tree layout] {
+ a -> { b -> {c, d}, e -> {f, g -> h} };
+
+ left [draw] // { b, c, d };
+ right [draw] // { e, f, g, h};
+
+ left <-> right;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/subgraph text none}
+ When this option is used, the text of a subgraph node is not shown. Adding
+ a slash after the node name achieves roughly the same effect, but this
+ option is useful in situations when subgraph nodes generally should not
+ have any text inside them.
+ %
+\begin{codeexample}[]
+\tikz [subgraph text none]
+ \graph [tree layout] {
+ a -> { b -> {c, d}, e -> {f, g -> h} };
+
+ left [draw] // { b, c, d };
+ right [draw] // { e, f, g, h};
+
+ left <-> right;
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/subgraph text top=\meta{text alignment options} (default text ragged right)}
+ Specifies that the text of a subgraph node should be placed at the top of
+ the subgraph node: Still inside the node, but above all nodes inside the
+ subgraph node.
+ %
+\begin{codeexample}[]
+\tikz [subgraph text top=text ragged left]
+ \graph [tree layout] {
+ a -> { b -> {c, d}, e -> {f, g -> h} };
+
+ left [draw] // { b, c, d };
+ right [draw] // { e, f, g, h};
+
+ left <-> right;
+ };
+\end{codeexample}
+ %
+ You can pass any of the \meta{text alignment options} understood by
+ \tikzname, such as |text centered|:
+ %
+\begin{codeexample}[width=5cm]
+\tikz [subgraph text top=text centered]
+ \graph [tree layout] {
+ a -> { b -> {c, d}, e -> {f, g -> h} };
+
+ left [draw, circle] // { b, c, d };
+ };
+\end{codeexample}
+ %
+ To place a label \emph{outside} the subgraph node, use a label, typically
+ defined using the |quotes| library:
+ %
+\begin{codeexample}[]
+\tikz \graph [tree layout] {
+ a -> { b -> {c, d}, e -> {f, g -> h} };
+
+ / ["left", draw] // { b, c, d } <->
+ / ["right", draw] // { e, f, g, h};
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/subgraph text bottom=\meta{text alignment options} (default ragged right)}
+ Works like |subgraph text top|, only the text placed at the bottom.
+\end{key}
+
+Note that there are no keys |subgraph text left| or |... right|, for somewhat
+technical reasons.
+
+\begin{key}{/tikz/subgraph text sep=\meta{dimension} (initially .1em)}
+ Some space added between the inner nodes of a subgraph node and the text
+ labels.
+\end{key}
+
+
+\subsubsection{Overlapping Sublayouts}
+\label{section-gd-layout-resolve}
+
+Nodes and edges can be part of several layouts. This will inevitably lead to
+conflicts because algorithm will disagree on where a node should be placed on
+the canvas. For this reason, there are some rules governing how such conflicts
+are resolved: Given a layout, starting with the main layout, the graph drawing
+system does the following:
+%
+\begin{enumerate}
+ \item We start by first processing the (direct) sublayouts of the current
+ layout (recursively). Sublayouts may overlap (they may share one or
+ more nodes), but we run the specified layout algorithm for each
+ sublayout independently on a ``fresh copy'' of all the nodes making up
+ the sublayout. In particular, different, conflicting positions may be
+ computed for nodes when they are present in several sublayouts.
+ \item Once all nodes in the sublayouts have been laid out in this way, we
+ \emph{join} overlapping elements. The idea is that if two layouts share
+ exactly one vertex, we can shift them around so that his vertex is at
+ the same position in both layouts. In more detail, the following
+ happens:
+
+ We build a (conceptual) graph whose nodes are the sublayouts and in
+ which there is an edge between two nodes if the sublayouts represented
+ by these elements have a node in common. Inside the resulting graph, we
+ treat each connected component separately. Each component has the
+ property that the sublayouts represented by the nodes in the component
+ overlap by at least one node. We now \emph{join} them as follows: We
+ start with the first sublayout in the component (``first'' with respect
+ to the order in which they appear in the input graph) and ``mark'' this
+ sublayout. We loop the following instructions as long as possible:
+ Search for the first sublayout (again, with respect to the order in
+ which they appear in the input) that is connect by an edge to a marked
+ sublayout. The sublayout will now have at least one node in common with
+ the marked sublayouts (possibly, even more). We consider the first such
+ node (again, first respect to the input ordering) and shift the whole
+ sublayout is such a way that this particular node is at the position is
+ has in the marked sublayouts. Note that after the shift, other nodes
+ that are also present in the marked sublayouts may lie at a different
+ position in the current sublayout. In this case, the position in the
+ marked sublayouts ``wins''. We then mark the sublayout.
+ \item When the above algorithm has run, we will have computed positions for
+ all nodes in all sublayouts of each of the components. For each
+ component, we contract all nodes of the component to a single node.
+ This new node will be ``large'' in the sense that its convex hull is
+ the convex hull of all the nodes in the component. All nodes that used
+ to be part of the component are removed and the new large node is added
+ (with arcs adjusted appropriately).
+ \item We now run the layout's algorithm on the resulting nodes (the
+ remaining original nodes and the contracted nodes).
+ \item In a last step, once the graph has been laid out, we expand the nodes
+ that were previously contracted. For this, the nodes that were deleted
+ earlier get reinserted, but shifted by whatever amount the contraction
+ node got shifted.
+\end{enumerate}
+
+
+\subsection{Miscellaneous Options}
+
+\includeluadocumentationof{pgf.gd.control.library}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-guidelines.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-guidelines.tex
new file mode 100644
index 0000000000..a91cd43452
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-guidelines.tex
@@ -0,0 +1,651 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Guidelines on Graphics}
+
+The present section is not about \pgfname\ or \tikzname, but about general
+guidelines and principles concerning the creation of graphics for scientific
+presentations, papers, and books.
+
+The guidelines in this section come from different sources. Many of them are
+just what I would like to claim is ``common sense'', some reflect my personal
+experience (though, hopefully, not my personal preferences), some come from
+books (the bibliography is still missing, sorry) on graphic design and
+typography. The most influential source are the brilliant books by Edward
+Tufte. While I do not agree with everything written in these books, many of
+Tufte's arguments are so convincing that I decided to repeat them in the
+following guidelines.
+
+The first thing you should ask yourself when someone presents a bunch of
+guidelines is: Should I really follow these guidelines? This is an important
+question, because there are good reasons not to follow general guidelines. The
+person who set up the guidelines may have had other objectives than you do. For
+example, a guideline might say ``use the color red for emphasis''. While this
+guideline makes perfect sense for, say, a presentation using a projector, red
+``color'' has the \emph{opposite} effect of ``emphasis'' when printed using a
+black-and-white printer. Guidelines were almost always set up to address a
+specific situation. If you are not in this situation, following a guideline can
+do more harm than good.
+
+The second thing you should be aware of is the basic rule of typography is:
+``Every rule can be broken, as long as you are \emph{aware} that you are
+breaking a rule.'' This rule also applies to graphics. Phrased differently, the
+basic rule states: ``The only mistakes in typography are things done in
+ignorance.'' When you are aware of a rule and when you decide that breaking the
+rule has a desirable effect, break the rule.
+
+
+\subsection{Planning the Time Needed for the Creation of Graphics}
+
+When you create a paper with numerous graphics, the time needed to create these
+graphics becomes an important factor. How much time should you calculate for
+the creation of graphics?
+
+As a general rule, assume that a graphic will need as much time to create as
+would a text of the same length. For example, when I write a paper, I need
+about one hour per page for the first draft. Later, I need between two and four
+hours per page for revisions. Thus, I expect to need about half an hour for the
+creation of \emph{a first draft} of a half page graphic. Later on, I expect
+another one to two hours before the final graphic is finished.
+
+In many publications, even in good journals, the authors and editors have
+obviously invested a lot of time on the text, but seem to have spend about
+five minutes to create all of the graphics. Graphics often seem to have been
+added as an ``afterthought'' or look like a screen shot of whatever the
+authors's statistical software shows them. As will be argued later on, the
+graphics that programs like \textsc{gnuplot} produce by default are of poor
+quality.
+
+Creating informative graphics that help the reader and that fit together with
+the main text is a difficult, lengthy process.
+%
+\begin{itemize}
+ \item Treat graphics as first-class citizens of your papers. They deserve
+ as much time and energy as the text does. Indeed, the creation of
+ graphics might deserve \emph{even more} time than the writing of the
+ main text since more attention will be paid to the graphics and they
+ will be looked at first.
+ \item Plan as much time for the creation and revision of a graphic as you
+ would plan for text of the same size.
+ \item Difficult graphics with a high information density may require even
+ more time.
+ \item Very simple graphics will require less time, but most likely you do
+ not want to have ``very simple graphics'' in your paper, anyway; just
+ as you would not like to have a ``very simple text'' of the same
+ size.
+\end{itemize}
+
+
+\subsection{Workflow for Creating a Graphic}
+
+When you write a (scientific) paper, you will most likely follow the following
+pattern: You have some results/ideas that you would like to report about. The
+creation of the paper will typically start with compiling a rough outline.
+Then, the different sections are filled with text to create a first draft. This
+draft is then revised repeatedly until, often after substantial revision, a
+final paper results. In a good journal paper there is typically not be a single
+sentence that has survived unmodified from the first draft.
+
+Creating a graphics follows the same pattern:
+%
+\begin{itemize}
+ \item Decide on what the graphic should communicate. Make this a
+ conscious decision, that is, determine ``What is the graphic supposed
+ to tell the reader?''
+ \item Create an ``outline'', that is, the rough overall ``shape'' of the
+ graphic, containing the most crucial elements. Often, it is useful to
+ do this using pencil and paper.
+ \item Fill out the finer details of the graphic to create a first draft.
+ \item Revise the graphic repeatedly along with the rest of the paper.
+\end{itemize}
+
+
+\subsection{Linking Graphics With the Main Text}
+
+Graphics can be placed at different places in a text. Either, they can be
+inlined, meaning they are somewhere ``in the middle of the text'' or they can
+be placed in stand-alone ``figures''. Since printers (the people) like to have
+their pages ``filled'', (both for aesthetic and economic reasons) stand-alone
+figures may traditionally be placed on pages in the document far away from the
+main text that refers to them. \LaTeX\ and \TeX\ tend to encourage this
+``drifting away'' of graphics for technical reasons.
+
+When a graphic is inlined, it will more or less automatically be linked with
+the main text in the sense that the labels of the graphic will be implicitly
+explained by the surrounding text. Also, the main text will typically make it
+clear what the graphic is about and what is shown.
+
+Quite differently, a stand-alone figure will often be viewed at a time when the
+main text that this graphic belongs to either has not yet been read or has been
+read some time ago. For this reason, you should follow the following guidelines
+when creating stand-alone figures:
+%
+\begin{itemize}
+ \item Stand-alone figures should have a caption than should make them
+ ``understandable by themselves''.
+
+ For example, suppose a graphic shows an example of the different
+ stages of a quicksort algorithm. Then the figure's caption should, at
+ the very least, inform the reader that ``the figure shows the
+ different stages of the quicksort algorithm introduced on page xyz''.
+ and not just ``Quicksort algorithm''.
+ \item A good caption adds as much context information as possible. For
+ example, you could say: ``The figure shows the different stages of
+ the quicksort algorithm introduced on page xyz. In the first line,
+ the pivot element 5 is chosen. This causes\dots'' While this
+ information can also be given in the main text, putting it in the
+ caption will ensure that the context is kept. Do not feel afraid of a
+ 5-line caption. (Your editor may hate you for this. Consider hating
+ them back.)
+ \item Reference the graphic in your main text as in ``for an example of
+ quicksort `in action', see Figure~2.1 on page xyz''.
+ \item Most books on style and typography recommend that you do not use
+ abbreviations as in ``Fig.~2.1'' but write ``Figure~2.1''.
+
+ The main argument against abbreviations is that ``a period is too
+ valuable to waste it on an abbreviation''. The idea is that a period
+ will make the reader assume that the sentence ends after ``Fig'' and
+ it takes a ``conscious backtracking'' to realize that the sentence
+ did not end after all.
+
+ The argument in favor of abbreviations is that they save space.
+
+ Personally, I am not really convinced by either argument. On the one
+ hand, I have not yet seen any hard evidence that abbreviations slow
+ readers down. On the other hand, abbreviating all ``Figure'' by
+ ``Fig.'' is most unlikely to save even a single line in most documents.
+ I avoid abbreviations.
+\end{itemize}
+
+
+\subsection{Consistency Between Graphics and Text}
+
+Perhaps the most common ``mistake'' people do when creating graphics (remember
+that a ``mistake'' in design is always just ``ignorance'') is to have a
+mismatch between the way their graphics look and the way their text looks.
+
+It is quite common that authors use several different programs for creating the
+graphics of a paper. An author might produce some plots using \textsc{gnuplot},
+a diagram using \textsc{xfig}, and include an |.eps| graphic a coauthor
+contributed using some unknown program. All these graphics will, most likely,
+use different line widths, different fonts, and have different sizes. In
+addition, authors often use options like |[height=5cm]| when including graphics
+to scale them to some ``nice size''.
+
+If the same approach were taken to writing the main text, every section would
+be written in a different font at a different size. In some sections all
+theorems would be underlined, in another they would be printed all in uppercase
+letters, and in another in red. In addition, the margins would be different on
+each page. Readers and editors would not tolerate a text if it were written in
+this fashion, but with graphics they often have to.
+
+To create consistency between graphics and text, stick to the following
+guidelines:
+%
+\begin{itemize}
+ \item Do not scale graphics.
+
+ This means that when generating graphics using an external program,
+ create them ``at the right size''.
+ \item Use the same font(s) both in graphics and the body text.
+ \item Use the same line width in text and graphics.
+
+ The ``line width'' for normal text is the width of the stem of letters
+ like T{}. For \TeX, this is usually $0.4\,\mathrm{pt}$. However, some
+ journals will not accept graphics with a normal line width below
+ $0.5\,\mathrm{pt}$.
+ \item When using colors, use a consistent color coding in the text and in
+ graphics. For example, if red is supposed to alert the reader to
+ something in the main text, use red also in graphics for important
+ parts of the graphic. If blue is used for structural elements like
+ headlines and section titles, use blue also for structural elements
+ of your graphic.
+
+ However, graphics may also use a logical intrinsic color
+ coding. For example, no matter what colors you normally use, readers
+ will generally assume, say, that the color green as ``positive, go,
+ ok'' and red as ``alert, warning, action''.
+\end{itemize}
+
+Creating consistency when using different graphic programs is almost
+impossible. For this reason, you should consider sticking to a single graphics
+program.
+
+
+\subsection{Labels in Graphics}
+
+Almost all graphics will contain labels, that is, pieces of text that explain
+parts of the graphics. When placing labels, stick to the following guidelines:
+%
+\begin{itemize}
+ \item Follow the rule of consistency when placing labels. You should do
+ so in two ways: First, be consistent with the main text, that is, use
+ the same font as the main text also for labels. Second, be consistent
+ between labels, that is, if you format some labels in some particular
+ way, format all labels in this way.
+ \item In addition to using the same fonts in text and graphics, you
+ should also use the same notation. For example, if you write $1/2$ in
+ your main text, also use ``$1/2$'' as labels in graphics, not
+ ``0.5''. A $\pi$ is a ``$\pi$'' and not ``$3.141$''. Finally,
+ $\mathrm e^{-\mathrm i \pi}$ is ``$\mathrm e^{-\mathrm i \pi}$'', not
+ ``$-1$'', let alone ``-1''.
+ \item Labels should be legible. They should not only have a reasonably
+ large size, they also should not be obscured by lines or other text.
+ This also applies to labels of lines and text \emph{behind} the
+ labels.
+ \item Labels should be ``in place''. Whenever there is enough space,
+ labels should be placed next to the thing they label. Only if
+ necessary, add a (subdued) line from the label to the labeled object.
+ Try to avoid labels that only reference explanations in external
+ legends. Reader have to jump back and forth between the explanation and
+ the object that is described.
+ \item Consider subduing ``unimportant'' labels using, for example, a gray
+ color. This will keep the focus on the actual graphic.
+\end{itemize}
+
+
+\subsection{Plots and Charts}
+
+One of the most frequent kind of graphics, especially in scientific papers, are
+\emph{plots}. They come in a large variety, including simple line plots,
+parametric plots, three dimensional plots, pie charts, and many more.
+
+Unfortunately, plots are notoriously hard to get right. Partly, the default
+settings of programs like \textsc{gnuplot} or Excel are to blame for this since
+these programs make it very convenient to create bad plots.
+
+The first question you should ask yourself when creating a plot is: Are there
+enough data points to merit a plot? If the answer is ``not really'', use a
+table.
+
+A typical situation where a plot is unnecessary is when people present a few
+numbers in a bar diagram. Here is a real-life example: At the end of a seminar
+a lecturer asked the participants for feedback. Of the 50 participants, 30
+returned the feedback form. According to the feedback, three participants
+considered the seminar ``very good'', nine considered it ``good'', ten ``ok'',
+eight ``bad'', and no one thought that the seminar was ``very bad''.
+
+A simple way of summing up this information is the following table:
+
+\medskip
+\begin{tabular}{lp{3.75cm}r}
+ \emph{Rating given} & \raggedright\emph{Participants (out of 50) who gave this rating} &
+ \emph{Percentage} \\[1.75em]
+ ``very good'' & \hfil\hphantom{0}3\hfil & \hphantom{0}6\% \\
+ ``good'' & \hfil\hphantom{0}9\hfil & 18\% \\
+ ``ok'' & \hfil10\hfil & 20\% \\
+ ``bad'' & \hfil\hphantom{0}8\hfil & 16\% \\
+ ``very bad'' & \hfil\hphantom{0}0\hfil & \hphantom{0}0\% \\[2mm]
+ none & \hfil20\hfil & 40\% \\
+\end{tabular}
+
+\bigskip
+What the lecturer did was to visualize the data using a 3D bar diagram. It
+looked like this (except that in reality the numbers where typeset using some
+extremely low-resolution bitmap font and were near-unreadable):
+
+\bigskip
+\par
+\begin{tikzpicture}[y=0.03cm,z=3mm]
+ \foreach \y in {0,20,40,60,80,100}
+ \draw[dashed] (0,\y,0) node[left] {\y} -- (0,\y,1) -- (6,\y,1);
+
+ \draw (0,0,0) -- (0,100,0) (0,0,1) -- (0,100,1);
+ \draw (0,0,0) -- (6,0,0);
+
+ \foreach \x/\xtext/\height in {1/very good/10,2/good/30,3/ok/33,4/bad/27,5/very bad/0}
+ {
+ \draw (\x,0) node[rotate=90,anchor=east] {\xtext};
+
+ \begin{scope}[xshift=\x cm]
+
+ \filldraw[fill=blue!50] (-.3,0,0) rectangle (.3,\height,0);
+ \filldraw[fill=blue!30] (.3,0,0) -- (.3,0,1) -- (.3,\height,1) -- (.3,\height,0) --cycle;
+ \filldraw[fill=blue!20] (-.3,\height,0) -- (.3,\height,0) --
+ (.3,\height,1) -- (-.3,\height,1) --cycle;
+ \end{scope}
+ }
+\end{tikzpicture}
+\bigskip
+
+Both the table and the ``plot'' have about the same size. If your first thought
+is ``the graphic looks nicer than the table'', try to answer the following
+questions based on the information in the table or in the graphic:
+%
+\begin{enumerate}
+ \item How many participants where there?
+ \item How many participants returned the feedback form?
+ \item What percentage of the participants returned the feedback form?
+ \item How many participants checked ``very good''?
+ \item What percentage out of all participants checked ``very good''?
+ \item Did more than a quarter of the participants check ``bad'' or ``very
+ bad''?
+ \item What percentage of the participants that returned the form checked
+ ``very good''?
+\end{enumerate}
+
+Sadly, the graphic does not allow us to answer \emph{a single one of these
+questions}. The table answers all of them directly, except for the last one. In
+essence, the information density of the graphic is very close to zero. The
+table has a much higher information density; despite the fact that it uses
+quite a lot of white space to present a few numbers. Here is the list of things
+that went wrong with the 3D-bar diagram:
+%
+\begin{itemize}
+ \item The whole graphic is dominated by irritating background lines.
+ \item It is not clear what the numbers at the left mean; presumably
+ percentages, but it might also be the absolute number of
+ participants.
+ \item The labels at the bottom are rotated, making them hard to read.
+
+ (In the real presentation that I saw, the text was rendered at a very
+ low resolution with about 10 by 6 pixels per letter with wrong
+ kerning, making the rotated text almost impossible to read.)
+ \item The third dimension adds complexity to the graphic without adding
+ information.
+ \item The three dimensional setup makes it much harder to gauge the
+ height of the bars correctly. Consider the ``bad'' bar. It the number
+ this bar stands for more than 20 or less? While the front of the bar
+ is below the 20 line, the back of the bar (which counts) is above.
+ \item It is impossible to tell which numbers are represented by the
+ bars. Thus, the bars needlessly hide the information these bars are
+ all about.
+ \item What do the bar heights add up to? Is it 100\% or 60\%?
+ \item Does the bar for ``very bad'' represent 0 or~1?
+ \item Why are the bars blue?
+\end{itemize}
+
+You might argue that in the example the exact numbers are not important for the
+graphic. The important things is the ``message'', which is that there are more
+``very good'' and ``good'' ratings than ``bad'' and ``very bad''. However, to
+convey this message either use a sentence that says so or use a graphic that
+conveys this message more clearly:
+
+\medskip
+\par
+\begin{tikzpicture}
+ \colorlet{good}{green!75!black}
+ \colorlet{bad}{red}
+ \colorlet{neutral}{black!60}
+ \colorlet{none}{white}
+
+ \node[align=center,text width=3cm]{Ratings given by 50~participants};
+
+ \begin{scope}[line width=4mm,rotate=270]
+ \draw[good] (-123:2cm) arc (-123:-101:2cm);
+ \draw[good!60!white] (-36:2cm) arc (-36:-101:2cm);
+ \draw[neutral] (-36:2cm) arc (-36:36:2cm);
+ \draw[bad!60!white] (36:2cm) arc (36:93:2cm);
+
+ \newcount\mycount
+ \foreach \angle in {0,72,...,3599}
+ {
+ \mycount=\angle\relax
+ \divide\mycount by 10\relax
+ \draw[black!15,thick] (\the\mycount:18mm) -- (\the\mycount:22mm);
+ }
+
+ \draw (0:2.2cm) node[below] {``ok'': 10 (20\%)};
+ \draw (165:2.2cm) node[above] {none: 20 (40\%)};
+ \draw (-111:2.2cm) node[left] {``very good'': 3 (6\%)};
+ \draw (-68:2.2cm) node[left] {``good'': 9 (18\%)};
+ \draw (65:2.2cm) node[right] {``bad'': 8 (16\%)};
+ \draw (93:2.2cm) node[right] {``very bad'': 0 (0\%)};
+ \end{scope}
+ \draw[gray] (0,0) circle (2.2cm) circle (1.8cm);
+\end{tikzpicture}
+
+\bigskip
+The above graphic has about the same information density as the table (about
+the same size and the same numbers are shown). In addition, one can directly
+``see'' that there are more good or very good ratings than bad ones. One can
+also ``see'' that the number of people who gave no rating at all is not
+negligible, which is quite common for feedback forms.
+
+Charts are not always a good idea. Let us look at an example that I redrew from
+a pie chart in \emph{Die Zeit}, June 4th, 2005:
+
+\bigskip
+\par
+\begin{tikzpicture}
+ \begin{scope}[xscale=3.2,yscale=1.2]
+
+ \sffamily
+ \coordinate (right border) at (2.0cm,-1.7cm);
+ \coordinate (left border) at (-2.5cm,2.1cm);
+
+ \fill[black!25] ([xshift=-2mm,yshift=1.1cm]left border) rectangle ([xshift=2mm,yshift=-.3cm]right border);
+
+ \node[below right,text width=10cm,inner sep=0pt] at ([yshift=.9cm,xshift=-1mm]left border)
+ { {\color{black!75} \Large Kohle ist am wichtigsten}\\
+ Energiemix bei der deutschen Stromerzeugung 2004};
+
+ \filldraw[draw=gray,fill=white] ([xshift=-1mm]left border) node[below right,black]
+ {\footnotesize Gesamte Netto-Stromerzeugung in Prozent, in
+ Milliarden Kilowattstunden (Mrd.\ kWh)}
+ rectangle ([xshift=1mm]right border);
+
+ % The 3D stuff
+ \pgfdeclarehorizontalshading{zeit}{100bp}
+ {color(0pt)=(black);
+ color(25bp)=(black);
+ color(37bp)=(white);
+ color(50bp)=(black);
+ color(62bp)=(white);
+ color(75bp)=(black);
+ color(100bp)=(black)}
+
+ \shadedraw[very thin,shading=zeit,yshift=-1.5mm] (0,0) circle (1cm);
+
+ \fill[green!20!gray] (0,0) -- (90:1cm) arc (90:-5:1cm);
+ \fill[white!20!gray] (0,0) -- (-5:1cm) arc (-5:-105:1cm);
+ \fill[orange!20!gray] (0,0) -- (-105:1cm) arc (-105:-180:1cm);
+ \fill[orange!60!white] (0,0) -- (180:1cm) arc (180:150:1cm);
+ \fill[black!75!white] (0,0) -- (150:1cm) arc (150:145:1cm);
+ \fill[blue!90!white] (0,0) -- (145:1cm) arc (145:135:1cm);
+ \fill[blue!50!white] (0,0) -- (135:1cm) arc (135:92:1cm);
+ \fill[yellow!50!black] (0,0) -- (92:1cm) arc (92:90:1cm);
+
+ \begin{scope}[very thin]
+ \draw (0,0) -- (90:1cm);
+ \draw (0,0) -- (-5:1cm);
+ \draw (0,0) -- (-105:1cm);
+ \draw (0,0) -- (-180:1cm);
+ \draw (0,0) -- (150:1cm);
+ \draw (0,0) -- (145:1cm);
+ \draw (0,0) -- (135:1cm);
+ \draw (0,0) -- (92:1cm);
+
+ \draw(0,0) circle (1cm);
+ \end{scope}
+
+ \node (Regenerative) at (115:.75cm) {\bfseries 9,4\%};
+ \node (Kernenergie) at (30:.5cm) {\bfseries 27,8\%};
+ \node (Braunkohle) at (-45:.6cm) {\bfseries 25,6\%};
+ \node (Steinkohle) at (-135:.6cm) {\bfseries 22,3\%};
+ \node (Erdgas) at (168:.75cm) {\bfseries 10,4\%};
+ \coordinate (Mineral) at (147:.9cm);
+ \coordinate (Sonstige) at (140:.9cm);
+
+ \small
+ \draw (Regenerative.north) |- ([yshift=.25cm]Regenerative.north -| right border) coordinate (Regenerative label);
+ \draw (91:.9cm) |- (Regenerative label);
+ \node[above left] at (Regenerative label) {Regenerative\
+ {\footnotesize (53,7 kWh)/davon} Wind \textbf{4,4\%} \footnotesize (25,0 kWh)};
+
+ \draw (Kernenergie.base east) -- (Kernenergie.base east -| right border) coordinate (Kernenergie label);
+ \node[above left] at (Kernenergie label) {Kernenergie};
+ \node[below left] at (Kernenergie label) {\footnotesize (158,4 kWh)};
+
+ \draw (Braunkohle.south) |- ([yshift=-.75cm]Braunkohle.south -| right border) coordinate (Braunkohle label);
+ \node[above left] at (Braunkohle label) {Braunkohle\ \ \footnotesize (146,0 kWh)};
+
+ \draw (Steinkohle.south) |- ([yshift=-.75cm]Steinkohle.south -| left border) coordinate (Steinkohle label);
+ \node[above right] at (Steinkohle label) {Steinkohle\ \ \footnotesize (127,1 kWh)};
+
+ \draw (Erdgas.base west) -- (Erdgas.base west -| left border) coordinate (Erdgas label);
+ \node[above right] at (Erdgas label) {Erdgas\ \ \footnotesize (59,2 kWh)};
+
+ \draw (Mineral) -- (Mineral -| left border) coordinate (Mineral label);
+ \node[above right] at (Mineral label) {Mineral\"olprodukte\ \
+ \footnotesize (9,2 kWh) \ \ \normalsize\textbf{1,6\%}};
+
+ \draw (Sonstige) |- (Regenerative label -| left border) coordinate (Sonstige label);
+ \node[above right] at (Sonstige label) {Sonstige\ \
+ \footnotesize (16,5 kWh) \hskip1.5cm\
+ \normalsize\textbf{2,9\%}};
+ \end{scope}
+\end{tikzpicture}
+
+This graphic has been redrawn in \tikzname, but the original looks almost
+exactly the same.
+
+At first sight, the graphic looks ``nice and informative'', but there are a lot
+of things that went wrong:
+%
+\begin{itemize}
+ \item The chart is three dimensional. However, the shadings add nothing
+ ``information-wise'', at best, they distract.
+ \item In a 3D-pie-chart the relative sizes are very strongly distorted.
+ For example, the area taken up by the gray color of ``Braunkohle'' is
+ larger than the area taken up by the green color of ``Kernenergie''
+ \emph{despite the fact that the percentage of Braunkohle is less than
+ the percentage of Kernenergie}.
+ \item The 3D-distortion gets worse for small areas. The area of
+ ``Regenerative'' somewhat larger than the area of ``Erdgas''. The
+ area of ``Wind'' is slightly smaller than the area of
+ ``Mineral\"olprodukte'' \emph{although the percentage of Wind is
+ nearly three times larger than the percentage of
+ Mineral\"olprodukte.}
+
+ In the last case, the different sizes are only partly due to
+ distortion. The designer(s) of the original graphic have also made
+ the ``Wind'' slice too small, even taking distortion into
+ account. (Just compare the size of ``Wind'' to ``Regenerative'' in
+ general.)
+ \item According to its caption, this chart is supposed to inform us that
+ coal was the most important energy source in Germany in 2004.
+ Ignoring the strong distortions caused by the superfluous and
+ misleading 3D-setup, it takes quite a while for this message to get
+ across.
+
+ Coal as an energy source is split up into two slices: one for
+ ``Steinkohle'' and one for ``Braunkohle'' (two different kinds of
+ coal). When you add them up, you see that the whole lower half of
+ the pie chart is taken up by coal.
+
+ The two areas for the different kinds of coal are not visually
+ linked at all. Rather, two different colors are used, the labels are
+ on different sides of the graphic. By comparison, ``Regenerative''
+ and ``Wind'' are very closely linked.
+ \item The color coding of the graphic follows no logical pattern at all.
+ Why is nuclear energy green? Regenerative energy is light blue,
+ ``other sources'' are blue. It seems more like a joke that the area
+ for ``Braunkohle'' (which literally translates to ``brown coal'') is
+ stone gray, while the area for ``Steinkohle'' (which literally
+ translates to ``stone coal'') is brown.
+ \item The area with the lightest color is used for ``Erdgas''. This area
+ stands out most because of the brighter color. However, for this
+ chart ``Erdgas'' is not really important at all.
+\end{itemize}
+%
+Edward Tufte calls graphics like the above ``chart junk''. (I am happy to
+announce, however, that \emph{Die Zeit} has stopped using 3D pie charts and
+their information graphics have got somewhat better.)
+
+Here are a few recommendations that may help you avoid producing chart junk:
+%
+\begin{itemize}
+ \item Do not use 3D pie charts. They are \emph{evil}.
+ \item Consider using a table instead of a pie chart.
+ \item Do not apply colors randomly; use them to direct the readers's
+ focus and to group things.
+ \item Do not use background patterns, like a crosshatch or diagonal
+ lines, instead of colors. They distract. Background patterns in
+ information graphics are \emph{evil}.
+\end{itemize}
+
+
+\subsection{Attention and Distraction}
+
+Pick up your favorite fiction novel and have a look at a typical page. You will
+notice that the page is very uniform. Nothing is there to distract the reader
+while reading; no large headlines, no bold text, no large white areas. Indeed,
+even when the author does wish to emphasize something, this is done using
+italic letters. Such letters blend nicely with the main text -- at a distance
+you will not be able to tell whether a page contains italic letters, but you
+would notice a single bold word immediately. The reason novels are typeset this
+way is the following paradigm: Avoid distractions.
+
+Good typography (like good organization) is something you do \emph{not} notice.
+The job of typography is to make reading the text, that is, ``absorbing'' its
+information content, as effortless as possible. For a novel, readers absorb the
+content by reading the text line-by-line, as if they were listening to someone
+telling the story. In this situation anything on the page that distracts the
+eye from going quickly and evenly from line to line will make the text harder
+to read.
+
+Now, pick up your favorite weekly magazine or newspaper and have a look at a
+typical page. You will notice that there is quite a lot ``going on'' on the
+page. Fonts are used at different sizes and in different arrangements, the text
+is organized in narrow columns, typically interleaved with pictures. The reason
+magazines are typeset in this way is another paradigm: Steer attention.
+
+Readers will not read a magazine like a novel. Instead of reading a magazine
+line-by-line, we use headlines and short abstracts to check whether we want to
+read a certain article or not. The job of typography is to steer our attention
+to these abstracts and headlines, first. Once we have decided that we want to
+read an article, however, we no longer tolerate distractions, which is why the
+main text of articles is typeset exactly the same way as a novel.
+
+The two principles ``avoid distractions'' and ``steer attention'' also apply to
+graphics. When you design a graphic, you should eliminate everything that will
+``distract the eye''. At the same time, you should try to actively help the
+reader ``through the graphic'' by using fonts/colors/line widths to highlight
+different parts.
+
+Here is a non-exhaustive list of things that can distract readers:
+%
+\begin{itemize}
+ \item Strong contrasts will always be registered first by the eye. For
+ example, consider the following two grids:
+
+ \medskip\par
+ \begin{tikzpicture}[x=40pt,y=40pt]
+ \draw[step=10pt,gray] (0,0) grid +(1,1);
+ \draw[step=2pt] (2,0) grid +(1,1);
+ \end{tikzpicture}
+
+ \medskip
+ Even though the left grid comes first in English reading order, the
+ right one is much more likely to be seen first: The white-to-black
+ contrast is higher than the gray-to-white contrast. In addition,
+ there are more ``places'' adding to the overall contrast in the right
+ grid.
+
+ Things like grids and, more generally, help lines usually should not
+ grab the attention of the readers and, hence, should be typeset with
+ a low contrast to the background. Also, a loosely-spaced grid is less
+ distracting than a very closely-spaced grid.
+ \item Dashed lines create many points at which there is black-to-white
+ contrast. Dashed or dotted lines can be very distracting and, hence,
+ should be avoided in general.
+
+ Do not use different dashing patterns to differentiate curves in
+ plots. You lose data points this way and the eye is not particularly
+ good at ``grouping things according to a dashing pattern''. The eye
+ is \emph{much} better at grouping things according to colors.
+ \item Background patterns filling an area using diagonal lines or
+ horizontal and vertical lines or just dots are almost always
+ distracting and, usually, serve no real purpose.
+ \item Background images and shadings distract and only seldomly add
+ anything of importance to a graphic.
+ \item Cute little clip arts can easily draw attention away from the data.
+\end{itemize}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-installation.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-installation.tex
new file mode 100644
index 0000000000..a80222fa91
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-installation.tex
@@ -0,0 +1,171 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Installation}
+
+There are different ways of installing \pgfname, depending on your system and
+needs, and you may need to install other packages as well, see below. Before
+installing, you may wish to review the licenses under which the package is
+distributed, see Section~\ref{section-license}.
+
+Typically, the package will already be installed on your system. Naturally, in
+this case you do not need to worry about the installation process at all and
+you can skip the rest of this section.
+
+
+\subsection{Package and Driver Versions}
+
+This documentation is part of version \pgfversion\ of the \pgfname\ package. In
+order to run \pgfname, you need a reasonably recent \TeX\ installation. When
+using \LaTeX, you need the following packages installed (newer versions should
+also work):
+%
+\begin{itemize}
+ \item |xcolor| version \xcolorversion.
+\end{itemize}
+%
+With plain \TeX, |xcolor| is not needed, but you obviously do not get its
+(full) functionality.
+
+Currently, \pgfname\ supports the following backend drivers:
+%
+\begin{itemize}
+ \item |luatex| version 0.76 or higher. Most earlier versions also work.
+ \item |pdftex| version 0.14 or higher. Earlier versions do not work.
+ \item |dvips| version 5.94a or higher. Earlier versions may also work.
+
+ For inter-picture connections, you need to process pictures using
+ |pdftex| version 1.40 or higher running in DVI mode.
+ \item |dvipdfm| version 0.13.2c or higher. Earlier versions may also
+ work.
+
+ For inter-picture connections, you need to process pictures using
+ |pdftex| version 1.40 or higher running in DVI mode.
+ \item |dvipdfmx| version 0.13.2c or higher. Earlier versions may also
+ work.
+ \item |dvisvgm| version 1.2.2 or higher. Earlier versions may also work.
+ \item |tex4ht| version 2003-05-05 or higher. Earlier versions may also
+ work.
+ \item |vtex| version 8.46a or higher. Earlier versions may also work.
+ \item |textures| version 2.1 or higher. Earlier versions may also work.
+ \item |xetex| version 0.996 or higher. Earlier versions may also work.
+\end{itemize}
+
+Currently, \pgfname\ supports the following formats:
+%
+\begin{itemize}
+ \item |latex| with complete functionality.
+ \item |plain| with complete functionality, except for graphics inclusion,
+ which works only for pdf\TeX.
+ \item |context| with complete functionality, except for graphics
+ inclusion, which works only for pdf\TeX.
+\end{itemize}
+
+For more details, see Section~\ref{section-formats}.
+
+
+\subsection{Installing Prebundled Packages}
+
+I do not create or manage prebundled packages of \pgfname, but, fortunately,
+nice other people do. I cannot give detailed instructions on how to install
+these packages, since I do not manage them, but I \emph{can} tell you were to
+find them. If you have a problem with installing, you might wish to have a look
+at the Debian page or the MiK\TeX\ page first.
+
+
+\subsubsection{Debian}
+
+The command ``|aptitude install pgf|'' should do the trick. Sit back and relax.
+
+
+\subsubsection{MiKTeX}
+
+For MiK\TeX, use the update wizard to install the (latest versions of the)
+packages called |pgf| and |xcolor|.
+
+
+\subsection{Installation in a texmf Tree}
+
+For a permanent installation, you place the files of the \textsc{pgf} package
+in an appropriate |texmf| tree.
+
+When you ask \TeX\ to use a certain class or package, it usually looks for the
+necessary files in so-called |texmf| trees. These trees are simply huge
+directories that contain these files. By default, \TeX\ looks for files in
+three different |texmf| trees:
+%
+\begin{itemize}
+ \item The root |texmf| tree, which is usually located at
+ |/usr/share/texmf/| or |c:\texmf\| or somewhere similar.
+ \item The local |texmf| tree, which is usually located at
+ |/usr/local/share/texmf/| or |c:\localtexmf\| or somewhere similar.
+ \item Your personal |texmf| tree, which is usually located in your home
+ directory at |~/texmf/| or |~/Library/texmf/|.
+\end{itemize}
+
+You should install the packages either in the local tree or in your personal
+tree, depending on whether you have write access to the local tree.
+Installation in the root tree can cause problems, since an update of the whole
+\TeX\ installation will replace this whole tree.
+
+
+\subsubsection{Installation that Keeps Everything Together}
+
+Once you have located the right texmf tree, you must decide whether you want to
+install \pgfname\ in such a way that ``all its files are kept in one place'' or
+whether you want to be ``\textsc{tds}-compliant'', where \textsc{tds} means
+``\TeX\ directory structure''.
+
+If you want to keep ``everything in one place'', inside the |texmf| tree that
+you have chosen create a sub-sub-directory called |texmf/tex/generic/pgf| or
+|texmf/tex/generic/pgf-|\texttt{\pgfversion}, if you prefer. Then place all
+files of the |pgf| package in this directory. Finally, rebuild \TeX's filename
+database. This is done by running the command |texhash| or |mktexlsr| (they are
+the same). In MiK\TeX, there is a menu option to do this.
+
+
+\subsubsection{Installation that is TDS-Compliant}
+
+While the above installation process is the most ``natural'' one and although I
+would like to recommend it since it makes updating and managing the \pgfname\
+package easy, it is not \textsc{tds}-compliant. If you want to be
+\textsc{tds}-compliant, proceed as follows: (If you do not know what
+\textsc{tds}-compliant means, you probably do not want to be
+\textsc{tds}-compliant.)
+
+The |.tar| file of the |pgf| package contains the following files and
+directories at its root: |README|, |doc|, |generic|, |plain|, and |latex|. You
+should ``merge'' each of the four directories with the following directories
+|texmf/doc|, |texmf/tex/generic|, |texmf/tex/plain|, and |texmf/tex/latex|. For
+example, in the |.tar| file the |doc| directory contains just the directory
+|pgf|, and this directory has to be moved to |texmf/doc/pgf|. The root |README|
+file can be ignored since it is reproduced in |doc/pgf/README|.
+
+You may also consider keeping everything in one place and using symbolic links
+to point from the \textsc{tds}-compliant directories to the central
+installation.
+
+\vskip1em For a more detailed explanation of the standard installation process
+of packages, you might wish to consult
+\href{http://www.ctan.org/installationadvice/}{|http://www.ctan.org/installationadvice/|}.
+However, note that the \pgfname\ package does not come with a |.ins| file
+(simply skip that part).
+
+
+\subsection{Updating the Installation}
+
+To update your installation from a previous version, all you need to do is to
+replace everything in the directory |texmf/tex/generic/pgf| with the files of
+the new version (or in all the directories where |pgf| was installed, if you
+chose a \textsc{tds}-compliant installation). The easiest way to do this is to
+first delete the old version and then proceed as described above. Sometimes,
+there are changes in the syntax of certain commands from version to version. If
+things no longer work that used to work, you may wish to have a look at the
+release notes and at the change log.
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-introduction.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-introduction.tex
new file mode 100644
index 0000000000..7117552eff
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-introduction.tex
@@ -0,0 +1,260 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Introduction}
+
+Welcome to the documentation of \tikzname\ and the underlying \pgfname\ system.
+What began as a small \LaTeX\ style for creating the graphics in my (Till
+Tantau's) PhD thesis directly with pdf\LaTeX\ has now grown to become a
+full-flung graphics language with a manual of over a thousand pages. The wealth
+of options offered by \tikzname\ is often daunting to beginners; but
+fortunately this documentation comes with a number slowly-paced tutorials that
+will teach you almost all you should know about \tikzname\ without your having
+to read the rest.
+
+I wish to start with the questions ``What is \tikzname?'' Basically, it just
+defines a number of \TeX\ commands that draw graphics. For example, the code
+|\tikz \draw (0pt,0pt) -- (20pt,6pt);| yields the line \tikz \draw (0pt,0pt) --
+(20pt,6pt); and the code |\tikz \fill[orange] (1ex,1ex) circle (1ex);| yields
+\tikz \fill[orange] (1ex,1ex) circle (1ex);. In a sense, when you use
+\tikzname\ you ``program'' your graphics, just as you ``program'' your document
+when you use \TeX. This also explains the name: \tikzname\ is a recursive
+acronym in the tradition of ``\textsc{gnu} is not unix'' and means ``\tikzname\
+ist \emph{kein} Zeichenprogramm'', which translates to ``\tikzname\ is not a
+drawing program'', cautioning the reader as to what to expect. With \tikzname\
+you get all the advantages of the ``\TeX-approach to typesetting'' for your
+graphics: quick creation of simple graphics, precise positioning, the use of
+macros, often superior typography. You also inherit all the disadvantages:
+steep learning curve, no \textsc{wysiwyg}, small changes require a long
+recompilation time, and the code does not really ``show'' how things will look
+like.
+
+Now that we know what \tikzname\ is, what about ``\pgfname''? As mentioned
+earlier, \tikzname\ started out as a project to implement \TeX\ graphics macros
+that can be used both with pdf\LaTeX\ and also with the classical
+(PostScript-based) \LaTeX. In other words, I wanted to implement a ``portable
+graphics format'' for \TeX\ -- hence the name \pgfname. These early macros are
+still around and they form the ``basic layer'' of the system described in this
+manual, but most of the interaction an author has theses days is with
+\tikzname\ -- which has become a whole language of its own.
+
+
+\subsection{The Layers Below \tikzname}
+
+It turns out that there are actually \emph{two} layers below \tikzname:
+%
+\begin{description}
+ \item[System layer:] This layer provides a complete abstraction of what
+ is going on ``in the driver''. The driver is a program like |dvips|
+ or |dvipdfm| that takes a |.dvi| file as input and generates a |.ps|
+ or a |.pdf| file. (The |pdftex| program also counts as a driver, even
+ though it does not take a |.dvi| file as input. Never mind.) Each
+ driver has its own syntax for the generation of graphics, causing
+ headaches to everyone who wants to create graphics in a portable way.
+ \pgfname's system layer ``abstracts away'' these differences. For
+ example, the system command |\pgfsys@lineto{10pt}{10pt}| extends the
+ current path to the coordinate $(10\mathrm{pt},10\mathrm{pt})$ of
+ the current |{pgfpicture}|. Depending on whether |dvips|, |dvipdfm|,
+ or |pdftex| is used to process the document, the system command will
+ be converted to different |\special| commands. The system layer is as
+ ``minimalistic'' as possible since each additional command makes it
+ more work to port \pgfname\ to a new driver.
+
+ As a user, you will not use the system layer directly.
+ \item[Basic layer:] The basic layer provides a set of basic commands that
+ allow you to produce complex graphics in a much easier manner than by
+ using the system layer directly. For example, the system layer provides
+ no commands for creating circles since circles can be composed from the
+ more basic Bézier curves (well, almost). However, as a user you will
+ want to have a simple command to create circles (at least I do) instead
+ of having to write down half a page of Bézier curve support
+ coordinates. Thus, the basic layer provides a command |\pgfpathcircle|
+ that generates the necessary curve coordinates for you.
+
+ The basic layer consists of a \emph{core}, which consists of several
+ interdependent packages that can only be loaded \emph{en bloc}, and
+ additional \emph{modules} that extend the core by more
+ special-purpose commands like node management or a plotting
+ interface. For instance, the \textsc{beamer} package uses only the
+ core and not, say, the |shapes| modules.
+\end{description}
+
+In theory, \tikzname\ itself is just one of several possible ``frontends''.
+which are sets of commands or a special syntax that makes using the basic layer
+easier. A problem with directly using the basic layer is that code written for
+this layer is often too ``verbose''. For example, to draw a simple triangle,
+you may need as many as five commands when using the basic layer: One for
+beginning a path at the first corner of the triangle, one for extending the
+path to the second corner, one for going to the third, one for closing the
+path, and one for actually painting the triangle (as opposed to filling it).
+With the \tikzname\ frontend all this boils down to a single simple
+\textsc{metafont}-like command:
+%
+\begin{verbatim}
+\draw (0,0) -- (1,0) -- (1,1) -- cycle;
+\end{verbatim}
+
+In practice, \tikzname\ is the only ``serious'' frontend for \pgfname. It gives
+you access to all features of \pgfname, but it is intended to be easy to use.
+The syntax is a mixture of \textsc{metafont} and \textsc{pstricks} and some
+ideas of myself. There are other frontends besides \tikzname, but they are more
+intended as ``technology studies'' and less as serious alternatives to
+\tikzname. In particular, the |pgfpict2e| frontend reimplements the standard
+\LaTeX\ |{picture}| environment and commands like |\line| or |\vector| using
+the \pgfname\ basic layer. This layer is not really ``necessary'' since the
+|pict2e.sty| package does at least as good a job at reimplementing the
+|{picture}| environment. Rather, the idea behind this package is to have a
+simple demonstration of how a frontend can be implemented.
+
+Since most users will only use \tikzname\ and almost no one will use the system
+layer directly, this manual is mainly about \tikzname\ in the first parts; the
+basic layer and the system layer are explained at the end.
+
+
+\subsection{Comparison with Other Graphics Packages}
+
+\tikzname\ is not the only graphics package for \TeX. In the following, I try
+to give a reasonably fair comparison of \tikzname\ and other packages.
+%
+\begin{enumerate}
+ \item The standard \LaTeX\ |{picture}| environment allows you to create
+ simple graphics, but little more. This is certainly not due to a lack
+ of knowledge or imagination on the part of \LaTeX's designer(s).
+ Rather, this is the price paid for the |{picture}| environment's
+ portability: It works together with all backend drivers.
+ \item The |pstricks| package is certainly powerful enough to create any
+ conceivable kind of graphic, but it is not really portable. Most
+ importantly, it does not work with |pdftex| nor with any other driver
+ that produces anything but PostScript code.
+
+ Compared to \tikzname, |pstricks| has a similar support base. There
+ are many nice extra packages for special purpose situations that have
+ been contributed by users over the last decade. The \tikzname\ syntax
+ is more consistent than the |pstricks| syntax as \tikzname\ was
+ developed ``in a more centralized manner'' and also ``with the
+ shortcomings on |pstricks| in mind''.
+ \item The |xypic| package is an older package for creating graphics.
+ However, it is more difficult to use and to learn because the syntax
+ and the documentation are a bit cryptic.
+ \item The |dratex| package is a small graphic package for creating a
+ graphics. Compared to the other package, including \tikzname, it is
+ very small, which may or may not be an advantage.
+ \item The |metapost| program is a powerful alternative to \tikzname. It
+ used to be an external program, which entailed a bunch of problems,
+ but in Lua\TeX\ it is now build in. An obstacle with |metapost| is
+ the inclusion of labels. This is \emph{much} easier to achieve using
+ \pgfname.
+ \item The |xfig| program is an important alternative to \tikzname\ for
+ users who do not wish to ``program'' their graphics as is necessary
+ with \tikzname\ and the other packages above. There is a conversion
+ program that will convert |xfig| graphics to \tikzname.
+\end{enumerate}
+
+
+\subsection{Utility Packages}
+
+The \pgfname\ package comes along with a number of utility package that are not
+really about creating graphics and which can be used independently of \pgfname.
+However, they are bundled with \pgfname, partly out of convenience, partly
+because their functionality is closely intertwined with \pgfname. These utility
+packages are:
+%
+\begin{enumerate}
+ \item The |pgfkeys| package defines a powerful key management facility.
+ It can be used completely independently of \pgfname.
+ \item The |pgffor| package defines a useful |\foreach| statement.
+ \item The |pgfcalendar| package defines macros for creating calendars.
+ Typically, these calendars will be rendered using \pgfname's graphic
+ engine, but you can use |pgfcalendar| also typeset calendars using
+ normal text. The package also defines commands for ``working'' with
+ dates.
+ \item The |pgfpages| package is used to assemble several pages into a
+ single page. It provides commands for assembling several ``virtual
+ pages'' into a single ``physical page''. The idea is that whenever
+ \TeX\ has a page ready for ``shipout'', |pgfpages| interrupts this
+ shipout and instead stores the page to be shipped out in a special
+ box. When enough ``virtual pages'' have been accumulated in this way,
+ they are scaled down and arranged on a ``physical page'', which then
+ \emph{really} shipped out. This mechanism allows you to create ``two
+ page on one page'' versions of a document directly inside \LaTeX\
+ without the use of any external programs. However, |pgfpages| can do
+ quite a lot more than that. You can use it to put logos and watermark
+ on pages, print up to 16 pages on one page, add borders to pages, and
+ more.
+\end{enumerate}
+
+
+\subsection{How to Read This Manual}
+
+This manual describes both the design of \tikzname\ and its usage. The
+organization is very roughly according to ``user-friendliness''. The commands
+and subpackages that are easiest and most frequently used are described first,
+more low-level and esoteric features are discussed later.
+
+If you have not yet installed \tikzname, please read the installation first.
+Second, it might be a good idea to read the tutorial. Finally, you might wish
+to skim through the description of \tikzname. Typically, you will not need to
+read the sections on the basic layer. You will only need to read the part on
+the system layer if you intend to write your own frontend or if you wish to
+port \pgfname\ to a new driver.
+
+The ``public'' commands and environments provided by the system are described
+throughout the text. In each such description, the described command,
+environment or option is printed in red. Text shown in green is optional and
+can be left out.
+
+
+\subsection{Authors and Acknowledgements}
+\label{section-authors}
+
+The bulk of the \pgfname\ system and its documentation was written by Till
+Tantau. A further member of the main team is Mark Wibrow, who is responsible,
+for example, for the \pgfname\ mathematical engine, many shapes, the decoration
+engine, and matrices. The third member is Christian Feuers\"anger who
+contributed the floating point library, image externalization, extended key
+processing, and automatic hyperlinks in the manual.
+
+Furthermore, occasional contributions have been made by Christophe Jorssen,
+Jin-Hwan Cho, Olivier Binda, Matthias Schulz, Ren\'ee Ahrens, Stephan Schuster,
+and Thomas Neumann.
+
+Additionally, numerous people have contributed to the \pgfname\ system by
+writing emails, spotting bugs, or sending libraries and patches. Many thanks to
+all these people, who are too numerous to name them all!
+
+
+\subsection{Getting Help}
+
+When you need help with \pgfname\ and \tikzname, please do the following:
+
+\begin{enumerate}
+ \item Read the manual, at least the part that has to do with your
+ problem.
+ \item If that does not solve the problem, try having a look at the
+ GitHub development page for \pgfname\ and \tikzname\ (see the
+ title of this document). Perhaps someone has already reported a
+ similar problem and someone has found a solution.
+ \item On the website you will find numerous forums for getting help.
+ There, you can write to help forums, file bug reports, join mailing
+ lists, and so on.
+ \item Before you file a bug report, especially a bug report concerning
+ the installation, make sure that this is really a bug. In particular,
+ have a look at the |.log| file that results when you \TeX\ your
+ files. This |.log| file should show that all the right files are
+ loaded from the right directories. Nearly all installation problems
+ can be resolved by looking at the |.log| file.
+ \item \emph{As a last resort} you can try to email me (Till Tantau) or,
+ if the problem concerns the mathematical engine, Mark Wibrow. I do
+ not mind getting emails, I simply get way too many of them. Because
+ of this, I cannot guarantee that your emails will be answered timely
+ or even at all. Your chances that your problem will be fixed are
+ somewhat higher if you mail to the \pgfname\ mailing list (naturally,
+ I read this list and answer questions when I have the time).
+\end{enumerate}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-3d.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-3d.tex
new file mode 100644
index 0000000000..76014f5e82
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-3d.tex
@@ -0,0 +1,244 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Three Dimensional Drawing Library}
+
+\begin{tikzlibrary}{3d}
+ This package provides some styles and options for drawing three dimensional
+ shapes.
+\end{tikzlibrary}
+
+\subsection{Coordinate Systems}
+
+\begin{coordinatesystem}{xyz cylindrical}
+ The |xyz cylindrical| coordinate system allows to you specify a point in
+ terms of cylindrical coordinates, sometimes also referred to as cylindrical
+ polar coordinates or polar cylindrical coordinates. It is very similar to
+ the |canvas polar| and |xy polar| coordinate systems with the difference
+ that you provide an elevation over the $xy$-plane using the |z| key.
+ %
+ \begin{key}{/tikz/cs/angle=\meta{degrees} (initially 0)}
+ The angle of the coordinate interpreted in the ellipse whose axes are
+ the $x$-vector and the $y$-vector.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/radius=\meta{number} (initially 0)}
+ A factor by which the $x$-vector and $y$-vector are multiplied prior to
+ forming the ellipse.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/z=\meta{number} (initially 0)}
+ Factor by which the $z$-vector is multiplied.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[->]
+ \draw (0,0,0) -- (xyz cylindrical cs:radius=1);
+ \draw (0,0,0) -- (xyz cylindrical cs:radius=1,angle=90);
+ \draw (0,0,0) -- (xyz cylindrical cs:z=1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+\begin{coordinatesystem}{xyz spherical}
+ The |xyz spherical| coordinate system allows you to specify a point in
+ terms of spherical coordinates.
+ %
+ \begin{key}{/tikz/cs/radius=\meta{number} (initially 0)}
+ Factor by which the $x$-, $y$-, and $z$-vector are multiplied.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/latitude=\meta{degrees} (initially 0)}
+ Angle of the coordinate between the $y$- and $z$-vector, measured from
+ the $y$-vector.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/longitude=\meta{degrees} (initially 0)}
+ Angle of the coordinate between the $x$- and $y$-vector, measured from
+ the $y$-vector.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/angle=\meta{degrees} (initially 0)}
+ Same as |longitude|.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[->]
+ \draw (0,0,0) -- (xyz spherical cs:radius=1);
+ \draw (0,0,0) -- (xyz spherical cs:radius=1,latitude=90);
+ \draw (0,0,0) -- (xyz spherical cs:radius=1,longitude=90);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+
+\subsection{Coordinate Planes}
+
+Sometimes drawing with full three dimensional coordinates is not necessary and
+it suffices to draw in two dimensions but in a different coordinate plane. The
+following options help you to switch to a different plane.
+
+
+\subsubsection{Switching to an arbitrary plane}
+
+\begin{key}{/tikz/plane origin=\meta{point} (initially {(0,0)})}
+ Origin of the plane.
+\end{key}
+
+\begin{key}{/tikz/plane x=\meta{point} (initially {(1,0)})}
+ Unit vector of the $x$-direction in the new plane.
+\end{key}
+
+\begin{key}{/tikz/plane y=\meta{point} (initially {(0,1)})}
+ Unit vector of the $y$-direction in the new plane.
+\end{key}
+
+\begin{key}{/tikz/canvas is plane}
+ Perform the transformation into the new canvas plane using the units above.
+ Note that you have to set the units \emph{before} calling
+ |canvas is plane|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ ->,
+ plane x={(0.707,-0.707)},
+ plane y={(0.707,0.707)},
+ canvas is plane,
+]
+ \draw (0,0) -- (1,0);
+ \draw (0,0) -- (0,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Predefined planes}
+
+\begin{key}{/tikz/canvas is xy plane at z=\meta{dimension}}
+ A plane with
+ %
+ \begin{itemize}
+ \item |plane origin={(0,0,|\meta{dimension}|)}|,
+ \item |plane x={(1,0,|\meta{dimension}|)}|, and
+ \item |plane y={(0,1,|\meta{dimension}|)}|.
+ \end{itemize}
+\end{key}
+
+\begin{key}{/tikz/canvas is yx plane at z=\meta{dimension}}
+ A plane with
+ %
+ \begin{itemize}
+ \item |plane origin={(0,0,|\meta{dimension}|)}|,
+ \item |plane x={(0,1,|\meta{dimension}|)}|, and
+ \item |plane y={(1,0,|\meta{dimension}|)}|.
+ \end{itemize}
+\end{key}
+
+\begin{key}{/tikz/canvas is xz plane at y=\meta{dimension}}
+ A plane with
+ %
+ \begin{itemize}
+ \item |plane origin={(0,|\meta{dimension}|,0)}|,
+ \item |plane x={(1,|\meta{dimension}|,0)}|, and
+ \item |plane y={(0,|\meta{dimension}|,1)}|.
+ \end{itemize}
+\end{key}
+
+\begin{key}{/tikz/canvas is zx plane at y=\meta{dimension}}
+ A plane with
+ %
+ \begin{itemize}
+ \item |plane origin={(0,|\meta{dimension}|,0)}|,
+ \item |plane x={(0,|\meta{dimension}|,1)}|, and
+ \item |plane y={(1,|\meta{dimension}|,0)}|.
+ \end{itemize}
+\end{key}
+
+\begin{key}{/tikz/canvas is yz plane at x=\meta{dimension}}
+ A plane with
+ %
+ \begin{itemize}
+ \item |plane origin={(|\meta{dimension}|,0,0)}|,
+ \item |plane x={(|\meta{dimension}|,1,0)}|, and
+ \item |plane y={(|\meta{dimension}|,0,1)}|.
+ \end{itemize}
+\end{key}
+
+\begin{key}{/tikz/canvas is zy plane at x=\meta{dimension}}
+ A plane with
+ %
+ \begin{itemize}
+ \item |plane origin={(|\meta{dimension}|,0,0)}|,
+ \item |plane x={(|\meta{dimension}|,0,1)}|, and
+ \item |plane y={(|\meta{dimension}|,1,0)}|.
+ \end{itemize}
+\end{key}
+
+
+\subsection{Examples}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[z={(10:10mm)},x={(-45:5mm)}]
+ \def\wave{
+ \draw[fill,thick,fill opacity=.2]
+ (0,0) sin (1,1) cos (2,0) sin (3,-1) cos (4,0)
+ sin (5,1) cos (6,0) sin (7,-1) cos (8,0)
+ sin (9,1) cos (10,0)sin (11,-1)cos (12,0);
+ \foreach \shift in {0,4,8}
+ {
+ \begin{scope}[xshift=\shift cm,thin]
+ \draw (.5,0) -- (0.5,0 |- 45:1cm);
+ \draw (1,0) -- (1,1);
+ \draw (1.5,0) -- (1.5,0 |- 45:1cm);
+ \draw (2.5,0) -- (2.5,0 |- -45:1cm);
+ \draw (3,0) -- (3,-1);
+ \draw (3.5,0) -- (3.5,0 |- -45:1cm);
+ \end{scope}
+ }
+ }
+ \begin{scope}[canvas is zy plane at x=0,fill=blue]
+ \wave
+ \node at (6,-1.5) [transform shape] {magnetic field};
+ \end{scope}
+ \begin{scope}[canvas is zx plane at y=0,fill=red]
+ \draw[help lines] (0,-2) grid (12,2);
+ \wave
+ \node at (6,1.5) [rotate=180,xscale=-1,transform shape] {electric field};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \begin{scope}[canvas is zy plane at x=0]
+ \draw (0,0) circle (1cm);
+ \draw (-1,0) -- (1,0) (0,-1) -- (0,1);
+ \end{scope}
+
+ \begin{scope}[canvas is zx plane at y=0]
+ \draw (0,0) circle (1cm);
+ \draw (-1,0) -- (1,0) (0,-1) -- (0,1);
+ \end{scope}
+
+ \begin{scope}[canvas is xy plane at z=0]
+ \draw (0,0) circle (1cm);
+ \draw (-1,0) -- (1,0) (0,-1) -- (0,1);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-angles.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-angles.tex
new file mode 100644
index 0000000000..6f6c2e6ef0
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-angles.tex
@@ -0,0 +1,109 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Angle Library}
+\label{section-angle}
+
+\begin{tikzlibrary}{angles}
+ This library defines pic types for drawing angles.
+\end{tikzlibrary}
+
+\begin{pictype}{angle}{\opt{|=|\meta{A}|--|\meta{B}|--|\meta{C}}}
+ This pic adds a drawing of an angle to the current path. This ``drawing of
+ an angle'' consist of a ``sector'' or ``wedge'' or ``slice'' whose pointed
+ end is at point \meta{B} and whose straight sides lie on the lines form
+ \meta{B} to \meta{A} and from \meta{B} to \meta{C}. The length of these
+ lines is governed by the following key:
+ %
+ \begin{key}{/tikz/angle radius=\meta{dimension} (initially 5mm)}
+ The length of the sides of the angle's wedge:
+ %
+\begin{codeexample}[]
+\tikz \draw (2,0) coordinate (A) -- (0,0) coordinate (B)
+ -- (-1,-1) coordinate (C)
+ pic [fill=black!50] {angle = A--B--C}
+ pic [draw,->,red,thick,angle radius=1cm] {angle = C--B--A};
+\end{codeexample}
+ \end{key}
+
+ The three points \meta{A}, \meta{B}, and \meta{C} \emph{must} be the names
+ of nodes or coordinates; you cannot use direct coordinates like ``|(1,1)|''
+ here.
+
+ You can leave out the three points, in this case the text |A--B--C| is
+ used; so in the above examples we could just have written |{angle}| in the
+ first pic.
+
+ Concerning the sector that makes up the drawing of the angle, the angular
+ part of this sector is drawn in front of the path if the |draw| option is
+ given to the |pic|, while filled sector is drawn behind the |pic|, provided
+ an option like |fill| or |shade| is passed to the pic. The following
+ example shows the difference:
+ %
+\begin{codeexample}[]
+\tikz \draw [line width=2mm]
+ (2,0) coordinate (A) -- (0,0) coordinate (B)
+ -- (1,1) coordinate (C)
+ pic [draw=blue, fill=blue!50, angle radius=1cm] {angle};
+\end{codeexample}
+
+ When |pic text| is set (which you typically do by using the quotes syntax),
+ a node will be created whose name is empty (and, thus, inherits the pic's
+ name) and which will be at the half-way angle between the lines to \meta{A}
+ and \meta{C} and whose distance from \meta{B} is |angle radius| times the
+ following factor:
+ %
+ \begin{key}{/tikz/angle eccentricity=\meta{factor} (initially 0.6)}
+\begin{codeexample}[]
+\tikz \draw (2,0) coordinate (A) -- (0,0) coordinate (B)
+ -- (1,1) coordinate (C)
+ pic ["$\alpha$", draw, ->] {angle};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \draw (2,0) coordinate (A) -- (0,0) coordinate (B)
+ -- (1,1) coordinate (C)
+ pic ["$\alpha$", draw, angle eccentricity=1] {angle};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw (2,0) coordinate (A) -- (0,0) coordinate (B)
+ -- (1,1) coordinate (C)
+ pic (alpha) ["$\alpha$", draw] {angle};
+
+ \draw (alpha) circle [radius=5pt];
+}
+\end{codeexample}
+ \end{key}
+\end{pictype}
+
+\begin{pictype}{right angle}{\opt{|=|\meta{A}|--|\meta{B}|--|\meta{C}}}
+ This pic adds a drawing of a right angle to the current path. It works in
+ the same way as |angle| pic.
+ %
+\begin{codeexample}[]
+ \tikz
+ \draw (0,0,0) coordinate (O)
+ (1,0,0) coordinate (A) -- (O)
+ (0,0,1) coordinate (B) -- (O)
+ (0,1,0) coordinate (C) -- (O)
+ pic [fill=gray,angle radius=4mm] {right angle = A--O--B}
+ pic [draw,red,thick,angle eccentricity=.5,pic text=.]
+ {right angle = A--O--C};
+\end{codeexample}
+ %
+\end{pictype}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-arrows.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-arrows.tex
new file mode 100644
index 0000000000..e9e1a8be00
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-arrows.tex
@@ -0,0 +1,245 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Arrow Tip Library}
+\label{section-library-arrows}
+
+The libraries |arrows| and |arrows.spaced| from older versions of \pgfname\ are
+still available for compatibility, but they are considered deprecated.
+
+The standard arrow tips, which are loaded by the library |arrows.meta|, are
+documented in Section~\ref{section-arrows-meta}.
+
+
+% \subsection{Mathematical Arrow Tips}
+%
+% \begin{tabular}{ll}
+% \symarrow{to} \\
+% \symarrow{to reversed} \\
+% \symarrowdouble{implies} \\
+% \symarrow{spaced to} \\
+% \symarrow{spaced to reversed} \\
+% \symarrowdouble{spaced implies} \\
+% \end{tabular}
+%
+%
+% \subsection{Triangular Arrow Tips}
+%
+% \begin{tabular}{ll}
+% \symarrowdouble{latex} \\
+% \symarrowdouble{latex reversed} \\
+% \symarrow{latex'} \\
+% \symarrow{latex' reversed} \\
+% \symarrowdouble{stealth} \\
+% \symarrowdouble{stealth reversed} \\
+% \symarrow{stealth'} \\
+% \symarrow{stealth' reversed}\\
+% \symarrow{triangle 90} \\
+% \symarrow{triangle 90 reversed} \\
+% \symarrow{triangle 60} \\
+% \symarrow{triangle 60 reversed} \\
+% \symarrow{triangle 45} \\
+% \symarrow{triangle 45 reversed} \\
+% \symarrow{open triangle 90} \\
+% \symarrow{open triangle 90 reversed} \\
+% \symarrow{open triangle 60} \\
+% \symarrow{open triangle 60 reversed} \\
+% \symarrow{open triangle 45} \\
+% \symarrow{open triangle 45 reversed} \\
+% \end{tabular}
+%
+% \medskip
+% \noindent
+% \begin{tabular}{ll}
+% \symarrowdouble{spaced latex} \\
+% \symarrowdouble{spaced latex reversed} \\
+% \symarrow{spaced latex'} \\
+% \symarrow{spaced latex' reversed} \\
+% \symarrowdouble{spaced stealth} \\
+% \symarrowdouble{spaced stealth reversed} \\
+% \symarrow{spaced stealth'} \\
+% \symarrow{spaced stealth' reversed}\\
+% \end{tabular}
+%
+% \medskip
+% \noindent
+% \begin{tabular}{ll}
+% \symarrow{spaced triangle 90} \\
+% \symarrow{spaced triangle 90 reversed} \\
+% \symarrow{spaced triangle 60} \\
+% \symarrow{spaced triangle 60 reversed} \\
+% \symarrow{spaced triangle 45} \\
+% \symarrow{spaced triangle 45 reversed} \\
+% \symarrow{spaced open triangle 90} \\
+% \symarrow{spaced open triangle 90 reversed} \\
+% \symarrow{spaced open triangle 60} \\
+% \symarrow{spaced open triangle 60 reversed} \\
+% \symarrow{spaced open triangle 45} \\
+% \symarrow{spaced open triangle 45 reversed} \\
+% \end{tabular}
+%
+%
+% \subsection{Barbed Arrow Tips}
+%
+% \begin{tabular}{ll}
+% \symarrow{angle 90} \\
+% \symarrow{angle 90 reversed} \\
+% \symarrow{angle 60} \\
+% \symarrow{angle 60 reversed} \\
+% \symarrow{angle 45} \\
+% \symarrow{angle 45 reversed} \\
+% \symarrow{hooks} \\
+% \symarrow{hooks reversed} \\
+% \end{tabular}
+%
+% \medskip
+% \noindent
+% \begin{tabular}{ll}
+% \symarrow{spaced angle 90} \\
+% \symarrow{spaced angle 90 reversed} \\
+% \symarrow{spaced angle 60} \\
+% \symarrow{spaced angle 60 reversed} \\
+% \symarrow{spaced angle 45} \\
+% \symarrow{spaced angle 45 reversed} \\
+% \symarrow{spaced hooks} \\
+% \symarrow{spaced hooks reversed} \\
+% \end{tabular}
+%
+%
+% \subsection{Bracket-Like Arrow Tips}
+%
+% {
+% \bigskip
+% \catcode`\|=12
+% \begin{tabular}{ll}
+% \sarrow{[}{]} \\
+% \sarrow{]}{[} \\
+% \sarrow{(}{)} \\
+% \sarrow{)}{(} \\
+% \index{*vbar@\protect\texttt{\protect\myvbar} arrow tip}%
+% \index{Arrow tips!*vbar@\protect\texttt{\protect\myvbar}}%
+% \texttt{\char`\|-\char`\|} & yields thick
+% \begin{tikzpicture}[arrows={|-|},thick]
+% \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+% \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+% \draw (0pt,.5ex) -- (1cm,.5ex);
+% \end{tikzpicture} and thin
+% \begin{tikzpicture}[arrows={|-|},thin]
+% \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+% \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+% \draw (0pt,.5ex) -- (1cm,.5ex);
+% \end{tikzpicture}\\
+% \sarrow{spaced [}{spaced ]} \\
+% \sarrow{spaced ]}{spaced [} \\
+% \sarrow{spaced (}{spaced )} \\
+% \sarrow{spaced )}{spaced (} \\
+% \index{*spaced vbar@\protect\texttt{spaced \protect\myvbar} arrow tip}%
+% \index{Arrow tips!*spaced vbar@\protect\texttt{spaced \protect\myvbar}}%
+% \texttt{spaced \char`\|-spaced \char`\|} & yields thick
+% \begin{tikzpicture}[arrows={spaced |-spaced |},thick]
+% \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+% \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+% \draw (0pt,.5ex) -- (1cm,.5ex);
+% \end{tikzpicture} and thin
+% \begin{tikzpicture}[arrows={spaced |-spaced |},thin]
+% \useasboundingbox (-1mm,-0.5ex) rectangle (1.1cm,2ex);
+% \fill [black!15] (1cm,-.5ex) rectangle (1.1cm,1.5ex) (-1mm,-.5ex) rectangle (0mm,1.5ex) ;
+% \draw (0pt,.5ex) -- (1cm,.5ex);
+% \end{tikzpicture}
+% \end{tabular}
+% }
+%
+% \subsection{Circle, Diamond and Square Arrow Tips}
+%
+%
+% \begin{tabular}{ll}
+% \symarrow{o} \\
+% \symarrow{*} \\
+% \symarrow{diamond} \\
+% \symarrow{open diamond} \\
+% \symarrow{square} \\
+% \symarrow{open square} \\
+% \end{tabular}
+%
+%
+% \medskip
+% \noindent
+% \begin{tabular}{ll}
+% \symarrow{spaced o} \\
+% \symarrow{spaced *} \\
+% \symarrow{spaced diamond} \\
+% \symarrow{spaced open diamond} \\
+% \symarrow{spaced square} \\
+% \symarrow{spaced open square} \\
+% \end{tabular}
+%
+%
+% \subsection{Serif-Like Arrow Tips}
+%
+% \begin{tabular}{ll}
+% \symarrow{serif cm} \\
+% \symarrow{spaced serif cm}
+% \end{tabular}
+%
+%
+% \subsection{Partial Arrow Tips}
+%
+% \begin{tabular}{ll}
+% \symarrow{left to} \\
+% \symarrow{left to reversed} \\
+% \symarrow{right to} \\
+% \symarrow{right to reversed} \\
+% \symarrow{left hook} \\
+% \symarrow{left hook reversed} \\
+% \symarrow{right hook} \\
+% \symarrow{right hook reversed}\\
+% \symarrow{spaced left to} \\
+% \symarrow{spaced left to reversed} \\
+% \symarrow{spaced right to} \\
+% \symarrow{spaced right to reversed} \\
+% \symarrow{spaced left hook} \\
+% \symarrow{spaced left hook reversed} \\
+% \symarrow{spaced right hook} \\
+% \symarrow{spaced right hook reversed}
+% \end{tabular}
+%
+%
+% \subsection{Line Caps}
+%
+% \begin{tabular}{ll}
+% \carrow{round cap} \\
+% \carrow{butt cap} \\
+% \carrow{triangle 90 cap} \\
+% \carrow{triangle 90 cap reversed} \\
+% \carrow{fast cap} \\
+% \carrow{fast cap reversed} \\
+% \carrow{spaced round cap} \\
+% \carrow{spaced butt cap} \\
+% \carrow{spaced triangle 90 cap} \\
+% \carrow{spaced triangle 90 cap reversed} \\
+% \carrow{spaced fast cap} \\
+% \carrow{spaced fast cap reversed} \\
+% \end{tabular}
+%
+%
+% \subsection{Spacing Tips}
+%
+% The spacing arrow tips are useful for combining them with other arrows
+% to get arrows that do not touch the end of the line.
+%
+% \begin{tabular}{ll}
+% \symarrow{space} \\
+% \end{tabular}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-automata.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-automata.tex
new file mode 100644
index 0000000000..a0e73700ff
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-automata.tex
@@ -0,0 +1,334 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Automata Drawing Library}
+
+\begin{tikzlibrary}{automata}
+ This packages provides shapes and styles for drawing finite state automata
+ and Turing machines.
+\end{tikzlibrary}
+
+
+\subsection{Drawing Automata}
+
+The automata drawing library is intended to make it easy to draw finite
+automata and Turing machines. It does not cover every situation imaginable, but
+most finite automata and Turing machines found in text books can be drawn in a
+nice and convenient fashion using this library.
+
+To draw an automaton, proceed as follows:
+%
+\begin{enumerate}
+ \item For each state of the automaton, there should be one node with the
+ option |state|.
+ \item To place the states, you can either use absolute positions or
+ relative positions, using options like |above| or |right|.
+ \item Give a unique name to each state node.
+ \item Accepting and initial states are indicated by adding the options
+ |accepting| and |initial|, respectively, to the state nodes.
+ \item Once the states are fixed, the edges can be added. For this, the
+ |edge| operation is most useful. It is, however, also possible to add
+ edges after each node has been placed.
+ \item For loops, use the |edge [loop]| operation.
+\end{enumerate}
+
+Let us now see how this works for a real example. Let us consider a
+nondeterministic four state automaton that checks whether an input contains the
+sequence $0^*1$ or the sequence $1^*0$.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
+ \draw[help lines] (0,0) grid (3,2);
+
+ \node[state,initial] (q_0) {$q_0$};
+ \node[state] (q_1) [above right=of q_0] {$q_1$};
+ \node[state] (q_2) [below right=of q_0] {$q_2$};
+ \node[state,accepting](q_3) [below right=of q_1] {$q_3$};
+
+ \path[->] (q_0) edge node {0} (q_1)
+ edge node [swap] {1} (q_2)
+ (q_1) edge node {1} (q_3)
+ edge [loop above] node {0} ()
+ (q_2) edge node [swap] {0} (q_3)
+ edge [loop below] node {1} ();
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{States With and Without Output}
+
+The |state| style actually just ``selects'' a default underlying style. Thus,
+you can define multiple new complicated state style and then simply set the
+|state| style to your given style to get the desired kind of styles.
+
+By default, the following state styles are defined:
+%
+\begin{stylekey}{/tikz/state without output}
+ This node style causes nodes to be drawn as circles. Also, this style calls
+ |every state|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/state with output}
+ This node style causes nodes to be drawn as split circles, that is, using
+ the |circle split| shape. In the upper part of the shape you have the name
+ of the style, in the lower part the output is placed. To specify the
+ output, use the command |\nodepart{lower}| inside the node. This style also
+ calls |every state|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \node[state without output] {$q_0$};
+
+ \node[state with output] at (2,0) {$q_1$ \nodepart{lower} $00$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/state (initially state without output)}
+ You should redefine it to something else, if you wish to use states of a
+ different nature.
+\begin{codeexample}[]
+\begin{tikzpicture}[state/.style=state with output]
+ \node[state] {$q_0$ \nodepart{lower} $11$};
+ \node[state] at (2,0) {$q_1$ \nodepart{lower} $00$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every state (initially \normalfont empty)}
+ This style is used by |state with output| and also by
+ |state without output|. By default, it does nothing, but you can use it to
+ make your state look more fancy:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,>=stealth',
+ every state/.style={draw=blue!50,very thick,fill=blue!20}]
+
+ \node[state,initial] (q_0) {$q_0$};
+ \node[state] (q_1) [above right=of q_0] {$q_1$};
+ \node[state] (q_2) [below right=of q_0] {$q_2$};
+
+ \path[->] (q_0) edge node [above left] {0} (q_1)
+ edge node [below left] {1} (q_2)
+ (q_1) edge [loop above] node {0} ()
+ (q_2) edge [loop below] node {1} ();
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Initial and Accepting States}
+
+The styles |initial| and |accepting| are similar to the |state| style as they
+also just select an ``underlying'' style, which installs the actual settings
+for initial and accepting states.
+
+Let us start with the initial states.
+%
+\begin{stylekey}{/tikz/initial (initially initial by arrow)}
+ This style is used to draw initial states.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/initial by arrow}
+ This style causes an arrow and, possibly, some text to be added to the
+ node. The arrow points from the text to the node. The node text and the
+ direction and the distance can be set using the following key:
+ %
+ \begin{key}{/tikz/initial text=\meta{text} (initially start)}
+ This key sets the text to be used. Use an empty text to suppress all
+ text.
+ \end{key}
+ %
+ \begin{key}{/tikz/initial where=\meta{direction} (initially left)}
+ Set the place where the text should be shown. Allowed values are
+ |above|, |below|, |left|, and |right|.
+ \end{key}
+ %
+ \begin{key}{/tikz/initial distance=\meta{distance} (initially 3ex)}
+ Sets the length of the arrow leading from the text to the state node.
+ \end{key}
+ %
+ \begin{stylekey}{/tikz/every initial by arrow (initially \normalfont empty)}
+ This style is executed at the beginning of every path that contains the
+ arrow and the text. You can use it to, say, make the text red or
+ whatever.
+ \end{stylekey}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every initial by arrow/.style={text=red,->>}]
+ \node[state,initial,initial distance=2cm] {$q_0$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/initial above}
+ This is a shorthand for |initial by arrow,initial where=above|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/initial below}
+ Works similarly to the previous option.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/initial left}
+ Works similarly to the previous option.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/initial right}
+ Works similarly to the previous option.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/initial by diamond}
+ This style uses a diamond to indicate an initial node.
+\end{stylekey}
+
+For the accepting states, the situation is similar: There is also an
+|accepting| style that selects the way accepting states are rendered. There are
+now two options: First, |accepting by arrow|, which works the same way as
+|initial by arrow|, only with the direction of arrow reversed, and
+|accepting by double|, where accepting states get a double line around them.
+
+\begin{stylekey}{/tikz/accepting (initially accepting by double)}
+ This style is used to draw accepting states. You can replace this by the
+ style |accepting by arrow| to get accepting states with an arrow leaving
+ them.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/accepting by double}
+ This style causes a double line to be drawn around a state.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/accepting by arrow}
+ This style causes an arrow and, possibly, some text to be added to the
+ node. The arrow points to the text from the node.
+
+ The same options as for initial states can be used, only with |initial|
+ replaced by |accepting|:
+ %
+ \begin{key}{/tikz/accepting text=\meta{text} (initially \normalfont empty)}
+ This key sets the text to be used.
+ \end{key}
+ %
+ \begin{key}{/tikz/accepting where=\meta{direction} (initially right)}
+ Set the place where the text should be shown. Allowed values are
+ |above|, |below|, |left|, and |right|.
+ \end{key}
+ %
+ \begin{key}{/tikz/initial distance=\meta{distance} (initially 3ex)}
+ Sets the length of the arrow leading from the text to the state
+ node.
+ \end{key}
+ %
+ \begin{stylekey}{/tikz/every accepting by arrow (initially \normalfont empty)}
+ Executed at the beginning of every path that contains the arrow and the
+ text.
+ \end{stylekey}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [shorten >=1pt,node distance=2cm,on grid,>=stealth',initial text=,
+ every state/.style={draw=blue!50,very thick,fill=blue!20},
+ accepting/.style=accepting by arrow]
+
+ \node[state,initial] (q_0) {$q_0$};
+ \node[state] (q_1) [above right=of q_0] {$q_1$};
+ \node[state] (q_2) [below right=of q_0] {$q_2$};
+ \node[state,accepting](q_3) [below right=of q_1] {$q_3$};
+
+ \path[->] (q_0) edge node [above left] {0} (q_1)
+ edge node [below left] {1} (q_2)
+ (q_1) edge node [above right] {1} (q_3)
+ edge [loop above] node {0} ()
+ (q_2) edge node [below right] {0} (q_3)
+ edge [loop below] node {1} ();
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/accepting above}
+ This is a shorthand for |accepting by arrow,accepting where=above|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/accepting below}
+ Works similarly to the previous option.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/accepting left}
+ Works similarly to the previous option.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/accepting right}
+ Works similarly to the previous option.
+\end{stylekey}
+
+
+\subsection{Examples}
+
+In the following example, we once more typeset the automaton presented in the
+previous sections. This time, we use the following rule for accepting/initial
+state: Initial states are red, accepting states are green, and normal states
+are orange. Then, we must find a path from a red state to a green state.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,>=stealth',thick,
+ every state/.style={fill,draw=none,orange,text=white,circular drop shadow},
+ accepting/.style ={green!50!black,text=white},
+ initial/.style ={red,text=white}]
+
+ \node[state,initial] (q_0) {$q_0$};
+ \node[state] (q_1) [above right=of q_0] {$q_1$};
+ \node[state] (q_2) [below right=of q_0] {$q_2$};
+ \node[state,accepting](q_3) [below right=of q_1] {$q_3$};
+
+ \path[->] (q_0) edge node [above left] {0} (q_1)
+ edge node [below left] {1} (q_2)
+ (q_1) edge node [above right] {1} (q_3)
+ edge [loop above] node {0} ()
+ (q_2) edge node [below right] {0} (q_3)
+ edge [loop below] node {1} ();
+\end{tikzpicture}
+\end{codeexample}
+
+The next example is the current candidate for the five-state busiest beaver:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[->,>=stealth',shorten >=1pt,%
+ auto,node distance=2cm,on grid,semithick,
+ inner sep=2pt,bend angle=45]
+ \node[initial,state] (A) {$q_a$};
+ \node[state] (B) [above right=of A] {$q_b$};
+ \node[state] (D) [below right=of A] {$q_d$};
+ \node[state] (C) [below right=of B] {$q_c$};
+ \node[state] (E) [below=of D] {$q_e$};
+
+ \path [every node/.style={font=\footnotesize}]
+ (A) edge node {0,1,L} (B)
+ edge node {1,1,R} (C)
+ (B) edge [loop above] node {1,1,L} (B)
+ edge node {0,1,L} (C)
+ (C) edge node {0,1,L} (D)
+ edge [bend left] node {1,0,R} (E)
+ (D) edge [loop below] node {1,1,R} (D)
+ edge node {0,1,R} (A)
+ (E) edge [bend left] node {1,0,R} (A);
+\end{tikzpicture}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-babel.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-babel.tex
new file mode 100644
index 0000000000..dd8bb7b43a
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-babel.tex
@@ -0,0 +1,94 @@
+% Copyright 2008 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Babel Library}
+\label{section-library-babel}
+
+\begin{pgflibrary}{babel}
+ A tiny library that make the interaction with the |babel| package easier.
+ Despite the name, it may also be useful in other contexts, namely whenever
+ the catcodes of important symbols are changed globally. Normally, using
+ this library is always a good idea; it is not always loaded by default
+ since in some rare cases it may break old code.
+\end{pgflibrary}
+
+The problems this library tries to fix have to do with the so-called
+``catcodes'' of symbols used inside \tikzname. In normal \TeX\ operation,
+symbols like |!| or |"| are ``normal'' characters and the \tikzname\ parser
+expects them to be. Some packages, most noticeably the |babel| package,
+aggressively change these character codes so that for instance a semicolon gets
+a little extra space in |french| mode or a quotation mark followed by a
+vertical bar breaks ligatures in |german| mode.
+
+Unfortunately, \tikzname\ expects the character codes of some symbols to be
+``normal''. In some important cases it will tolerate changed character codes,
+but when the changes made by |babel| (or some other package) are too
+``aggressive'', compilation of \tikzname\ code will fail.
+
+The |babel| library of \tikzname\ is intended to help out in this situation.
+All this library does is to set the following two keys to |true|. You can,
+however, also set these keys directly and also switch them off or on
+individually and independently of this library.
+
+\begin{key}{/tikz/handle active characters in code=\opt{\meta{true or false}} (initially false)}
+ When this key is set, at the beginning of every |\tikz| command and every
+ |{tikzpicture}|, the character codes of all symbols used by \tikzname\ are
+ reset to their normal values. Furthermore, at the beginning of each node,
+ the catcodes are restored to the values they had prior to the current
+ picture.
+
+ The net effect of this is that, in most cases, symbols having a special
+ character code can be used nicely both in \tikzname\ code and also in node
+ texts.
+
+ In the following, slightly silly, example we make the dot an active
+ character and define it in some strange way. Now, in the later \tikzname\
+ command, the dot in |3.0cm| may no longer be active and setting the
+ |handle...| option achieves exactly this. However, as can be seen, the dot
+ is once more active inside the node.
+ %
+\begin{codeexample}[]
+\catcode`\.=\active
+\def.{\o}
+
+\tikz [handle active characters in code]
+ \node [draw, minimum width=3.0cm] {hall. pe.ple};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/handle active characters in nodes=\opt{\meta{true or false}} (initially false)}
+ This key is needed for a special situation: As explained for the
+ |handle ... code| key, that key switches off all special meaning of symbols
+ and switches them back on again at the beginning of nodes. However, there
+ is one situation when this is not possible: When some text has already been
+ read by \TeX, the catcodes can no longer change. Now, for normal nodes this
+ is not a problem since their contents has not been read at the moment the
+ catcodes are restored. In contrast for label nodes for edges, nodes
+ produced by the |graph| and |quotes| libraries, and some others nodes,
+ their text \emph{has} already been read when the catcodes get adjusted.
+
+ The present key may help in such situations: It causes the text of all such
+ ``indirectly created'' nodes to be surrounded by a call to the
+ |\scantokens| command. This command attempts to reread an already read
+ text, but allows catcodes to change. As users of this command will know, it
+ is not a perfect substitute for directly reading the text by \TeX, but it
+ normally has the desired effect.
+ %
+\begin{codeexample}[]
+\catcode`\.=\active
+\def.{\o}
+
+\tikz [handle active characters in code,
+ handle active characters in nodes]
+ \node [draw, label=f..] {hall. pe.ple};
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-backgrounds.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-backgrounds.tex
new file mode 100644
index 0000000000..b24a38860a
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-backgrounds.tex
@@ -0,0 +1,283 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Background Library}
+\label{section-tikz-backgrounds}
+
+\begin{tikzlibrary}{backgrounds}
+ This library defines ``backgrounds'' for pictures. This does not refer to
+ background pictures, but rather to frames drawn around and behind pictures.
+ For example, this package allows you to just add the |framed| option to a
+ picture to get a rectangular box around your picture or |gridded| to put a
+ grid behind your picture.
+\end{tikzlibrary}
+
+The first use of this library is to make the following key available:
+%
+\begin{key}{/tikz/on background layer=\meta{options}}
+ This key can (only) be used with a |{scope}| or |\scoped|. It will cause
+ everything inside the scope to be typeset on a background layer.
+
+ The \meta{options} will be executed \emph{inside} background scope. This is
+ useful since \emph{other} options passed to the |{scope}| environment will
+ be executed \emph{before} the actual background material starts and, thus,
+ will have no effect on it.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ % On main layer:
+ \fill[blue] (0,0) circle (1cm);
+
+ \begin{scope}[on background layer={color=yellow}]
+ \fill (-1,-1) rectangle (1,1);
+ \end{scope}
+
+ \begin{scope}[on background layer]
+ \fill[black] (-.8,-.8) rectangle (.8,.8);
+ \end{scope}
+
+ % On main layer again:
+ \fill[blue!50] (-.5,-1) rectangle (.5,1);
+\end{tikzpicture}
+\end{codeexample}
+
+ A scope with this option set should not be ``deeply nested'' inside the
+ picture since changes to the graphic state (like the color or the
+ transformation matrix) ``do not survive a layer switch'', see also
+ Section~\ref{section-layers} for details. In particular, setting, say, the
+ line width at the beginning of a picture will not have an effect on the
+ background picture.
+
+ For this reason, it may be useful to setup the following style:
+ %
+ \begin{stylekey}{/tikz/every on background layer}
+ This style is executed at the beginning of each background layer. If
+ you have a global setup in |every picture|, you should consider putting
+ that part of it that concerns the graphics state into this style.
+ %
+\begin{codeexample}[]
+\tikzset{
+ every picture/.style={line width=1ex},
+ every on background layer/.style={every picture}
+}
+\begin{tikzpicture}
+ \draw [->] (0,0) -- (2,1);
+
+ \scoped[on background layer]
+ \draw[red] (0,1) -- (2,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{key}
+
+When this package is loaded, the following styles become available:
+%
+\begin{stylekey}{/tikz/show background rectangle}
+ This style causes a rectangle to be drawn behind your graphic. This style
+ option must be given to the |{tikzpicture}| environment or to the |\tikz|
+ command.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[show background rectangle]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The size of the background rectangle is determined as follows: We start
+ with the bounding box of the picture. Then, a certain separator distance is
+ added on the sides. This distance can be different for the $x$- and
+ $y$-directions and can be set using the following options:
+ %
+ \begin{key}{/tikz/inner frame xsep=\meta{dimension} (initially 1ex)}
+ Sets the additional horizontal separator distance for the background
+ rectangle.
+ \end{key}
+ %
+ \begin{key}{/tikz/inner frame ysep=\meta{dimension} (initially 1ex)}
+ Same for the vertical separator distance.
+ \end{key}
+ %
+ \begin{key}{/tikz/inner frame sep=\meta{dimension}}
+ Sets the horizontal and vertical separator distances simultaneously.
+ \end{key}
+ %
+ The following two styles make setting the inner separator a bit easier to
+ remember:
+ %
+ \begin{stylekey}{/tikz/tight background}
+ Sets the inner frame separator to 0pt. The background rectangle will
+ have the size of the bounding box.
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/loose background}
+ Sets the inner frame separator to 2ex.
+ \end{stylekey}
+
+ You can influence how the background rectangle is rendered by setting the
+ following style:
+ %
+ \begin{stylekey}{/tikz/background rectangle (initially draw)}
+ This style dictates how the background rectangle is drawn or filled.
+ The default setting causes the path of the background rectangle to be
+ drawn in the usual way. Setting this style to, say, |fill=blue!20|
+ causes a light blue background to be added to the picture. You can also
+ use more fancy settings as shown in the following example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [background rectangle/.style=
+ {double,ultra thick,draw=red,top color=blue,rounded corners},
+ show background rectangle]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Naturally, no one in their right mind would use the above, but here is
+ a nice background:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [background rectangle/.style=
+ {draw=blue!50,fill=blue!20,rounded corners=1ex},
+ show background rectangle]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{stylekey}
+
+\begin{stylekey}{/tikz/framed}
+ This is a shorthand for |show background rectangle|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/show background grid}
+ This style behaves similarly to the |show background rectangle| style, but
+ it will not use a rectangle path, but a grid. The lower left and upper
+ right corner of the grid is computed in the same way as for the background
+ rectangle:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[show background grid]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ You can influence the background grid by setting the following style:
+ %
+ \begin{stylekey}{/tikz/background grid (initially draw,help lines)}
+ This style dictates how the background grid path is drawn.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [background grid/.style={thick,draw=red,step=.5cm},
+ show background grid]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+ %
+ This option can be combined with the |framed| option (use the |framed|
+ option first):
+ %
+\begin{codeexample}[]
+\tikzset{background grid/.style={thick,draw=red,step=.5cm},
+ background rectangle/.style={rounded corners,fill=yellow}}
+\begin{tikzpicture}[framed,gridded]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/gridded}
+ This is a shorthand for |show background grid|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/show background top}
+ This style causes a single line to be drawn at the top of the background
+ rectangle. Normally, the line coincides exactly with the top line of the
+ background rectangle:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ background rectangle/.style={fill=yellow},
+ framed,show background top]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The following option allows you to lengthen (or shorten) the line:
+ %
+ \begin{key}{/tikz/outer frame xsep=\meta{dimension} (initially 0pt)}
+ The \meta{dimension} is added at the left and right side of the line.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [background rectangle/.style={fill=yellow},
+ framed,
+ show background top,
+ outer frame xsep=1ex]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/outer frame ysep=\meta{dimension} (initially 0pt)}
+ This option does not apply to the top line, but to the left and right
+ lines, see below.
+ \end{key}
+ %
+ \begin{key}{/tikz/outer frame sep=\meta{dimension}}
+ Sets both the $x$- and $y$-separation.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [background rectangle={fill=blue!20},
+ outer frame sep=1ex,%
+ show background top,%
+ show background bottom,%
+ show background left,%
+ show background right]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ You can influence how the line is drawn grid by setting the following
+ style:
+ %
+ \begin{stylekey}{/tikz/background top (initially draw)}
+\begin{codeexample}[]
+\tikzset{background rectangle/.style={fill=blue!20},
+ background top/.style={draw=blue!50,line width=1ex}}
+\begin{tikzpicture}[framed,show background top]
+ \draw (0,0) ellipse (10mm and 5mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{stylekey}
+
+\begin{stylekey}{/tikz/show background bottom}
+ Works like the style for the top line.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/show background left}
+ Works similarly.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/show background right}
+ Works similarly.
+\end{stylekey}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-calc.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-calc.tex
new file mode 100644
index 0000000000..49ece07ff9
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-calc.tex
@@ -0,0 +1,7 @@
+
+\section{Calc Library}
+
+\begin{tikzlibrary}{calc}
+ The library allows advanced Coordinate Calculations. It is documented in
+ all detail in Section~\ref{tikz-lib-calc} on page~\pageref{tikz-lib-calc}.
+\end{tikzlibrary}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-calendar.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-calendar.tex
new file mode 100644
index 0000000000..6d1f3a3f4f
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-calendar.tex
@@ -0,0 +1,970 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Calendar Library}
+\label{section-calender}
+
+\begin{tikzlibrary}{calendar}
+ The library defines the |\calendar| command, which can be used to typeset
+ calendars. The command relies on the |\pgfcalendar| command from the
+ |pgfcalendar| package, which is loaded automatically.
+
+ The |\calendar| command is quite configurable, allowing you to produce all
+ kinds of different calendars.
+\end{tikzlibrary}
+
+
+\subsection{Calendar Command}
+
+The core command for creating calendars in \tikzname\ is the |\calendar|
+command. It is available only inside |{tikzpicture}| environments (similar to,
+say, the |\draw| command).
+
+\begin{command}{\calendar \meta{calendar specification}|;|}
+ The syntax for this command is similar to commands like |\node| or
+ |\matrix|. However, it has its complete own parser and only those commands
+ described in the following will be recognized, nothing else. Note,
+ furthermore, that a \meta{calendar specification} is not a path
+ specification, indeed, no path is created for the calendar.
+
+
+ \medskip
+ \textbf{The specification syntax.}
+ The \meta{calendar specification} must be a sequence of elements, each of
+ which has one of the following structures:
+ %
+ \begin{itemize}
+ \item |[|\meta{options}|]|
+
+ You provide \meta{options} in square brackets as in
+ |[red,draw=none]|. These \meta{options} can be any \tikzname\
+ option and they apply to the whole calendar. You can provide this
+ element multiple times, the effect accumulates.
+ \item |(|\meta{name}|)|
+
+ This has the same effect as saying |[name=|\meta{name}|]|. The
+ effect of providing a \meta{name} is explained later. Note already
+ that \emph{a calendar is not a node} and the \meta{name} is
+ \emph{not the name of a node}.
+ \item |at (|\meta{coordinate}|)|
+
+ This has the same effect as saying |[at=(|\meta{coordinate}|)]|.
+ \item |if (|\meta{date condition}|)| \meta{options or commands}\opt{|else|\meta{else options or commands}}
+
+ The effect of such an |if| is explained later.
+ \end{itemize}
+
+ At the beginning of every calendar, the following style is used:
+ %
+ \begin{stylekey}{/tikz/every calendar (initially \normalfont empty)}
+ This style is used with every calendar.
+ \end{stylekey}
+
+
+ \medskip
+ \textbf{The date range.}
+ The overall effect of the |\calendar| command is to execute code for each
+ day of a range of dates. This range of dates is set using the following
+ option:
+ %
+ \begin{key}{/tikz/dates=\meta{start date}| to |\meta{end date}}
+ This option specifies the date range. Both the start and end date are
+ specified as described on page~\pageref{calendar-date-format}. In
+ short: You can provide ISO-format type dates like |2006-01-02|, you can
+ replace the day of month by |last| to refer to the last day of a month
+ (so |2006-02-last| is the same as |2006-02-28|), and you can add a plus
+ sign followed by a number to specify an offset (so |2006-01-01+-1| is
+ the same as |2005-12-31|).
+ \end{key}
+ %
+ It will be useful to fix two pieces of terminology for the following
+ descriptions: The |\calendar| command iterates over the dates in the range.
+ The \emph{current date} refers to the current date the command is
+ processing as it iterates over the dates. For each current date code is
+ executed, which will be called the \emph{current date code}. The current
+ date code consists of different parts, to be detailed later.
+
+ The central part of the current date code is the execution of the code
+ |\tikzdaycode|. By default, this code simply produces a node whose text is
+ set to the day of month. This means that unless further action is taken,
+ all days of a calendar will be put on top of each other! To avoid this, you
+ must modify the current date code to shift days around appropriately.
+ Predefined arrangements like |day list downward| or |week list| do this for
+ you, but you can define arrangements yourself. Since defining an
+ arrangement is a bit tricky, it is explained only later on. For the time
+ being, let us use a predefined arrangement to produce our first calendar:
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list];
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Changing the spacing.}
+ In the above calendar, the spacing between the days is determined by
+ numerous options. Most arrangements do not use all of these options, but
+ only those that apply naturally.
+ %
+ \begin{key}{/tikz/day xshift=\meta{dimension} (initially 3.5ex)}
+ Specifies the horizontal shift between days. This is not the gap
+ between days, but the shift between the anchors of their nodes.
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,day xshift=3ex];
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/day yshift=\meta{dimension} (initially 3ex)}
+ Specifies the vertical shift between days. Again, this is the shift
+ between the anchors of their nodes.
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,day yshift=2ex];
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/month xshift=\meta{dimension}}
+ Specifies an additional horizontal shift between different months.
+ \end{key}
+ %
+ \begin{key}{/tikz/month yshift=\meta{dimension}}
+ Specifies an additional vertical shift between different months.
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-02-last,week list,
+ month yshift=0pt];
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-02-last,week list,
+ month yshift=1cm];
+\end{codeexample}
+ \end{key}
+
+
+ \medskip
+ \textbf{Changing the position of the calendar.}
+ The calendar is placed in such a way that, normally, the anchor of the
+ first day label is at the origin. This can be changed by using the |at|
+ option. When you say |at={(1,1)}|, this anchor of the first day will lie at
+ coordinate $(1,1)$.
+
+ In general, arrangements will not always place the anchor of the first day
+ at the origin. Sometimes, additional spacing rules get in the way. There
+ are different ways of addressing this problem: First, you can just ignore
+ it. Since calendars are often placed in their own |{tikzpicture}| and since
+ their size if computed automatically, the exact position of the origin
+ often does not matter at all. Second, you can put the calendar inside a
+ node as in |...node {\tikz \calendar...}|. This allows you to position the
+ node in the normal ways using the node's anchors. Third, you can be very
+ clever and use a single-cell matrix. The advantage is that a matrix allows
+ you to provide any anchor of any node inside the matrix as an anchor for
+ the whole matrix. For example, the following calendar is placed in such a
+ way the center of 2000-01-20 lies on the position $(2,2)$:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \matrix [anchor=cal-2000-01-20.center] at (2,2)
+ { \calendar(cal)[dates=2000-01-01 to 2000-01-31,week list]; \\};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Unfortunately, the matrix-base positions, which is the cleanest way, isn't
+ as portable as the other approaches (it currently does not work with the
+ \textsc{svg} backend for instance).
+
+
+ \medskip
+ \textbf{Changing the appearance of days.}
+ As mentioned before, each day in the above calendar is produced by an
+ execution of the |\tikzdaycode|. Each time this code is executed, the
+ coordinate system will have been set up appropriately to place the day of
+ the month correctly. You can change both the code and its appearance using
+ the following options.
+ %
+ \begin{key}{/tikz/day code=\meta{code} (initially \normalfont see below)}
+ This option allows you to change the code that is executed for each
+ day. The default is to create a node with an appropriate name, but you
+ can change this:
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ day code={\fill[blue] (0,0) circle (2pt);}];
+\end{codeexample}
+ %
+ The default code is the following:
+ %
+\begin{codeexample}[code only]
+\node[name=\pgfcalendarsuggestedname,every day]{\tikzdaytext};
+\end{codeexample}
+ %
+ The first part causes the day nodes to be accessible via the following
+ names: If \meta{name} is the name given to the calendar via a |name=|
+ option or via the specification element |(|\meta{name}|)|, then
+ |\pgfcalendarsuggestedname| will expand to \meta{name}|-|\meta{date},
+ where \meta{date} is the date of the day that is currently being
+ processed in ISO format.
+
+ For example, if January 1, 2006 is being processed and the calendar has
+ been named |mycal|, then the node containing the |1| for this date will
+ be names |mycal-2006-01-01|. You can later reference this node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \calendar (mycal) [dates=2000-01-01 to 2000-01-31,week list];
+
+ \draw[red] (mycal-2000-01-20) circle (4pt);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/day text=\meta{text}}
+ This option changes the setting of the |\tikzdaytext|. By default, this
+ macro simply yields the current day of month, but you can change it
+ arbitrarily. Here is a silly example:
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ day text=x];
+\end{codeexample}
+ %
+ More useful examples are based on using the |\%| command. This command
+ is redefined inside a |\pgfcalendar| to mean the same as
+ |\pgfcalendarshorthand|. (The original meaning of |\%| is lost inside
+ the calendar, you need to save if before the calendar if you really
+ need it.)
+
+ The |\%| inserts the current day/month/year/day of week in a certain
+ format into the text. The first letter following the |\%| selects the
+ type (permissible values are |d|, |m|, |y|, |w|), the second letter
+ specifies how the value should be displayed (|-| means numerically, |=|
+ means numerically with leading space, |0| means numerically with
+ leading zeros, |t| means textual, and |.| means textual, abbreviated).
+ For example |\%d0| gives the day with a leading zero (for more details
+ see the description of |\pgfcalendarshorthand| on
+ page~\pageref{pgfcalendarshorthand}).
+
+ Let us redefine the |day text| so that it yields the day with a leading
+ zero:
+ %
+\begin{codeexample}[leave comments]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ day text=\%d0];
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/every day (initially anchor=base east)}
+ This style is executed by the default node code for each day. The
+ |every day| style is useful for changing the way days look. For
+ example, let us make all days red:
+ %
+\begin{codeexample}[leave comments]
+\tikz[every day/.style=red]
+ \calendar[dates=2000-01-01 to 2000-01-31,week list];
+\end{codeexample}
+ \end{key}
+
+
+ \medskip
+ \textbf{Changing the appearance of month and year labels.}
+ In addition to the days of a calendar, labels for the months and even years
+ (for really long calendars) can be added. These labels are only added once
+ per month or year and this is not done by default. Rather, special styles
+ starting with |month label| place these labels and make them visible:
+ %
+\begin{codeexample}[]
+\tikz \calendar[dates=2000-01-01 to 2000-02-last,week list,
+ month label above centered];
+\end{codeexample}
+
+ The following options change the appearance of the month and year label:
+ %
+ \begin{key}{/tikz/month code=\meta{code} (initially \normalfont see below)}
+ This option allows you to specify what the macro |\tikzmonthcode|
+ should expand to.
+
+ By default, the |\tikzmonthcode| it is set to
+ %
+\begin{codeexample}[code only]
+\node[every month]{\tikzmonthtext};
+\end{codeexample}
+ %
+ Note that this node is not named by default.
+ \end{key}
+
+ \begin{key}{/tikz/month text=\meta{text}}
+ This option allows you to change the macro |\tikzmonthtext|. By
+ default, the month text is a long textual presentation of the current
+ month being typeset.
+ %
+\begin{codeexample}[leave comments]
+\tikz \calendar[dates=2000-01-01 to 2000-01-31,week list,
+ month label above centered,
+ month text=\textcolor{red}{\%mt} \%y-];
+\end{codeexample}
+ \end{key}
+
+ \begin{stylekey}{/tikz/every month (initially \normalfont empty)}
+ This style can be used to change the appearance of month labels.
+ \end{stylekey}
+
+ \begin{key}{/tikz/year code=\meta{code}}
+ Works like |month code|, only for years.
+ \end{key}
+
+ \begin{key}{/tikz/year text=\meta{text}}
+ Works like |month text|, only for years.
+ \end{key}
+
+
+ \begin{key}{/tikz/every year}
+ Works like |every month|, only for years.
+ \end{key}
+
+
+ \medskip
+ \textbf{Date ifs.}
+ Much of the power of the |\calendar| command comes from the use of
+ conditionals. There are two equivalent way of specifying such a
+ conditional. First, you can add the text
+ |if (|\meta{conditions}|) |\meta{code or options} to your \meta{calendar
+ specification}, possibly followed by |else|\meta{else code or options}. You
+ can have multiple such conditionals (but you cannot nest them in this
+ simple manner). The second way is to use the following option:
+ %
+ \begin{key}{/tikz/if=|(|\meta{conditions}|)|\meta{code or options}\opt{|else|\meta{else code or options}}}
+ This option has the same effect as giving a corresponding if in the
+ \meta{calendar specification}. The option is mostly useful for use in
+ the |every calendar| style, where you cannot provide if conditionals
+ otherwise.
+ \end{key}
+ %
+ Now, regardless of how you specify a conditional, it has the following
+ effect (individually and independently for each date in the calendar):
+ %
+ \begin{enumerate}
+ \item It is checked whether the current date is one of the
+ possibilities listed in \meta{conditions}. An example of such a
+ condition is |Sunday|. Thus, when you write
+ |if (Saturday,Sunday) {foo}|, then |foo| will be executed for every
+ day in the calendar that is a Saturday \emph{or} a Sunday.
+
+ The command |\ifdate| and, thereby, |\pgfcalendarifdate| are used
+ to evaluate the \meta{conditions}, see
+ page~\pageref{pgfcalendarifdate} for a complete list of possible
+ tests. The most useful tests are: Tests like |Monday| and so on,
+ |workday| for the days Monday to Friday, |weekend| for Saturday and
+ Sunday, |equals| for testing whether the current date equals a
+ given date, |at least| and |at least| for comparing the current
+ date with a given date.
+ \item If the date passes the check, the \meta{code or options} is
+ evaluated in a manner to be described in a moment; if the date
+ fails, the \meta{else code or options} is evaluated, if present.
+
+ The \meta{code or options} can either be some code. This is
+ indicated by surrounding the code with curly braces. It can also be
+ a list of \tikzname\ options. This is indicated by surrounding the
+ options with square brackets. For example in the date test
+ |if (Sunday) {\draw...} else {\fill...}| there are two pieces of
+ code involved. By comparison, |if (Sunday) [red] else [green]|
+ involves two options.
+
+ If \meta{code or options} is code, it is simply executed (for the
+ current day). If it is a list of options, these options are passed
+ to a scope surrounding the current date.
+ \end{enumerate}
+ %
+ Let us now have a look at some examples. First, we use a conditional to
+ make all Sundays red.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-31,week list]
+ if (Sunday) [red];
+\end{codeexample}
+ %
+ Next, let us do something on a specific date:
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-31,week list]
+ if (Sunday) [red]
+ if (equals=2000-01-20) {\draw (0,0) circle (8pt);};
+\end{codeexample}
+ %
+ You might wonder why the circle seems to be ``off'' the date. Actually, it
+ is centered on the date, it is just that the date label uses the
+ |base east| anchor, which shifts the label up and right. To overcome this
+ problem we can change the anchor:
+ %
+\begin{codeexample}[]
+\tikz [every day/.style={anchor=mid}]
+ \calendar
+ [dates=2000-01-01 to 2000-01-31,week list]
+ if (Sunday) [red]
+ if (equals=2000-01-20) {\draw (0,0) circle (8pt);};
+\end{codeexample}
+ %
+ However, the single day dates are now no longer aligned correctly. For
+ this, we can change the day text to |\%d=|, which adds a space at the
+ beginning of single day text.
+
+ In the following, more technical information is covered. Most readers may
+ wish to skip it.
+
+ \medskip
+ \textbf{The current date code.}
+ As mentioned earlier, for each date in the calendar the current date code
+ is executed. It is the job of this code to shift around date nodes, to
+ render the date nodes, to draw the month labels and to do all other stuff
+ that is necessary to draw a calendar.
+
+ The current date code consists of the following parts, in this order:
+ %
+ \begin{enumerate}
+ \item The before-scope code.
+ \item A scope is opened.
+ \item The at-begin-scope code.
+ \item All date-ifs from the \meta{calendar specification} are executed.
+ \item The at-end-scope code.
+ \item The scope is closed.
+ \item The after-scope code.
+ \end{enumerate}
+ %
+ All of the codes mentioned above can be changed using appropriate options,
+ see below. In case you wonder why so many are needed, the reason is that
+ the current date code as a whole is not surrounded by a scope or \TeX\
+ group. This means that code executed in the before-scope code and in the
+ after-scope code has an effect on all following days. For example, if the
+ after-scope code modifies the transformation matrix by shifting everything
+ downward, all following days will be shifted downward. If each day does
+ this, you get a list of days, one below the other.
+
+ However, you do not always want code to have an effect on everything that
+ follows. For instance, if a day has the date-if |if (Sunday) [red]|, we
+ only want this Sunday to red, not all following days also. Similarly,
+ sometimes it is easier to compute the position of a day relative to a fixed
+ origin and we do not want any modifications of the transformation matrix to
+ have an effect outside the scope.
+
+ By cleverly adjusting the different codes, all sorts of different day
+ arrangements are possible.
+
+ \begin{key}{/tikz/execute before day scope=\meta{code}}
+ The \meta{code} is executed before everything else for each date.
+ Multiple calls of this option have an accumulative effect. Thus, if you
+ use this option twice, the code from the first use is used first for
+ each day, followed by the code given the second time.
+ \end{key}
+ %
+ \begin{key}{/tikz/execute at begin day scope=\meta{code}}
+ This code is execute before everything else inside the scope of the
+ current date. Again, the effect is accumulative.
+ \end{key}
+ %
+ \begin{key}{/tikz/execute at end day scope=\meta{code}}
+ This code is executed just before the day scope is closed. The effect
+ is also accumulative, however, in reverse order. This is useful to
+ pair, say, |\scope| and |\endscope| commands in at-begin- and
+ at-end-code.
+ \end{key}
+ %
+ \begin{key}{/tikz/execute after day scope=\meta{code}}
+ This is executed at the very end of the current date, outside the
+ scope. The accumulation is also in reverse.
+ \end{key}
+\end{command}
+
+In the rest of the following subsections we have a look at how the different
+scope codes can be used to create different calendar arrangements.
+
+
+\subsubsection{Creating a Simple List of Days}
+
+We start with a list of the days of the calendar, one day below the other. For
+this, we simply shift the coordinate system downward at the end of the code for
+each day. This shift must be \emph{outside} the day scope as we want day shifts
+to accumulate. Thus, we use the following code:
+%
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-01 to 2000-01-08,
+ execute after day scope=
+ {\pgftransformyshift{-1em}}];
+\end{codeexample}
+%
+Clearly, we can use this approach to create day lists going up, down, right,
+left, or even diagonally.
+
+
+\subsubsection{Adding a Month Label}
+
+We now want to add a month label to the left of the beginning of each month.
+The idea is to do two things:
+%
+\begin{enumerate}
+ \item We add code that is executed only on the first of each month.
+ \item The code is executed before the actual day is rendered. This ensures
+ that options applying to the days do not affect the month rendering.
+\end{enumerate}
+%
+We have two options where we should add the month code: Either we add it at the
+beginning of the day scope or before. Either will work fine, but it might be
+safer to put the code inside the scope to ensure that settings to not
+inadvertently ``leak outside''.
+%
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-08,
+ execute after day scope={\pgftransformyshift{-1em}},
+ execute at begin day scope=
+ {\ifdate{day of month=1}{\tikzmonthcode}{}},
+ every month/.append style={anchor=base east,xshift=-2em}];
+\end{codeexample}
+
+In the above code we used the |\ifdate|\marg{condition}\marg{then
+code}\marg{else code} command, which is described on page~\pageref{ifdate} in
+detail and which has much the same effect as
+|if (|\meta{condition}|)|\marg{then code}| else |\marg{else code}, but works in
+normal code.
+
+
+\subsubsection{Creating a Week List Arrangement}
+
+Let us now address a more complicated arrangement: A week list. In this
+arrangement there is line for each week. The horizontal placement of the days
+is thus that all Mondays lie below each other, likewise for all Tuesdays, and
+so on.
+
+In order to typeset this arrangement, we can use the following approach: The
+origin of the coordinate system rests at the anchor for the Monday of each
+week. That means that at the end of each week the origin is moved downward one
+line. On all other days, the origin at the end of the day code is the same as
+at the beginning. To position each day correctly, we use code inside and at the
+beginning of the day scope to horizontally shift the day according to its day
+of week.
+%
+\begin{codeexample}[]
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-01-20,
+ % each day is shifted right according to the day of week
+ execute at begin day scope=
+ {\pgftransformxshift{\pgfcalendarcurrentweekday em}},
+ % after each week, the origin is shifted downward:
+ execute after day scope=
+ {\ifdate{Sunday}{\pgftransformyshift{-1em}}{}}];
+\end{codeexample}
+
+
+\subsubsection{Creating a Month List Arrangement}
+
+For another example, let us create an arrangement that contains one line for
+each month. This is easy enough to do as for weeks, unless we add the following
+requirement: Again, we want all days in a column to have the same day of week.
+Since months start on different days of week, this means that each row has to
+have an individual offset.
+
+One possible way is to use the following approach: After each month (or at the
+beginning of each month) we advance the vertical position of the offset by one
+line. For horizontal placement, inside the day scope we locally shift the day
+by its day of month. Furthermore, we must additionally shift the day to ensure
+that the first day of the month lies on the correct day of week column. For
+this, we remember this day of week the first time we see it.
+%
+\begin{codeexample}[]
+\newcount\mycount
+\tikz
+ \calendar
+ [dates=2000-01-01 to 2000-02-last,
+ execute before day scope=
+ {
+ \ifdate{day of month=1} {
+ % Remember the weekday of first day of month
+ \mycount=\pgfcalendarcurrentweekday
+ % Shift downward
+ \pgftransformyshift{-1em}
+ }{}
+ },
+ execute at begin day scope=
+ {
+ % each day is shifted right according to the day of month
+ \pgftransformxshift{\pgfcalendarcurrentday em}
+ % and additionally according to the weekday of the first
+ \pgftransformxshift{\the\mycount em}
+ }];
+\end{codeexample}
+
+
+\subsection{Arrangements}
+
+An \emph{arrangement} specifies how the days of calendar are arranged on the
+page. The calendar library defines a number of predefined arrangements.
+
+We start with arrangements in which the days are listed in a long line.
+
+\begin{stylekey}{/tikz/day list downward}
+ This style causes the days of a month to be typeset one below the other.
+ The shift between days is given by |day yshift|. Between month an
+ additional shift of |month yshift| is added.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/day list upward}
+ Works as above, only the list grows upward instead of downward.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list upward,month yshift=1em];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/day list right}
+ This style also works as before, but the list of days grows to the right.
+ Instead of |day yshift| and |month yshift|, the values of |day xshift| and
+ |month xshift| are used.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list right,month xshift=1em];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/day list left}
+ As above, but the list grows left.
+\end{stylekey}
+
+The next arrangement lists days by the week.
+
+\begin{stylekey}{/tikz/week list}
+ This style creates one row for each week in the range. The value of
+ |day xshift| is used for the distance between days in each week row, the
+ value of |day yshift| is used for the distance between rows. In both cases,
+ ``distance'' refers to the distance between the anchors of the nodes of the
+ days (or, more generally, the distance between the origins of the little
+ pictures created for each day).
+
+ The days inside each week are shifted such that Monday is always at the
+ first position (to change this, you need to copy and then modify the code
+ appropriately). If the date range does not start on a Monday, the first
+ line will not start in the first column, but rather in the column
+ appropriate for the first date in the range.
+
+ At the beginning of each month (except for the first month in the range) an
+ additional vertical space of |month yshift| is added. If this is set to
+ |0pt| you get a continuous list of days.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-01 to 2000-02-last,week list];
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-01 to 2000-02-last,week list,
+ month yshift=0pt];
+\end{codeexample}
+ %
+\end{stylekey}
+
+The following arrangement gives a very compact view of a whole year.
+%
+\begin{stylekey}{/tikz/month list}
+ In this arrangement there is a row for each month. As for the |week list|,
+ the |day xshift| is used for the horizontal distance. For the vertical
+ shift, |month yshift| is used.
+
+ In each row, all days of the month are listed alongside each other.
+ However, it is once more ensured that days in each column lie on the same
+ day of week. Thus, the very first column contains only Mondays. If a month
+ does not start with a Monday, its days are shifted to the right such that
+ the days lie on the correct columns.
+ %
+\begin{codeexample}[]
+\sffamily\scriptsize
+\tikz
+ \calendar [dates=2000-01-01 to 2000-12-31,
+ month list,month label left,month yshift=1.25em]
+ if (Sunday) [black!50];
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Month Labels}
+
+For many calendars you may wish to add a label to each month. We have already
+covered how month nodes are created and rendered in the description of the
+|\calendar| command: use |month text|, |every month|, and also |month code| (if
+necessary) to change the appearance of the month labels.
+
+What we have not yet covered is where these labels are placed. By default, they
+are not placed at all as there is no good ``default position'' for them.
+Instead, you can use one of the following options to specify a position for the
+labels:
+%
+\begin{stylekey}{/tikz/month label left}
+ Places the month label to the left of the first day of the month. (For
+ |week list| and |month list| where a month does not start on a Monday, the
+ position is chosen ``as if'' the month had started on a Monday -- which is
+ usually exactly what you want.)
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label left];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label left vertical}
+ This style works like the above style, only the label is rotated
+ counterclockwise by 90 degrees.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label left vertical];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label right}
+ This style places the month label to the right of the row in which the
+ first day of the month lies. This means that for a day list the label is to
+ the right of the first day, for a week list it is to the right of the first
+ week, and for a month list it is to the right of the whole month.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label right];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label right vertical}
+ Works as above, only the label is rotated clockwise by 90 degrees.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list downward,month yshift=1em,
+ month label right vertical];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label above left}
+ This style places the month label above of the row of the first day,
+ flushed left to the leftmost column. The amount by which the label is
+ raised is fixed to |1.25em|; use the |yshift| option with the month node to
+ modify this.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-28 to 2000-02-03,
+ day list right,month xshift=1em,
+ month label above left];
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-20 to 2000-02-10,
+ week list,month label above left];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label above centered}
+ Works as above, only the label is centered above the row containing the
+ first day.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-02-01 to 2000-02-last,
+ day list right,month label above centered];
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-20 to 2000-02-10,
+ week list,month label above centered];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label above right}
+ Works as above, but flushed right
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-01-20 to 2000-02-10,
+ week list,month label above right];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label below left}
+ Works like |month label above left|, only the label is placed below the
+ row. This placement is not really useful with the |week list| arrangement,
+ but rather with the |day list right| or |month list| arrangement.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-02-01 to 2000-02-last,
+ day list right,month label below left];
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/month label below centered}
+ Works like |month label above centered|, only below.
+ %
+\begin{codeexample}[]
+\tikz
+ \calendar [dates=2000-02-01 to 2000-02-last,
+ day list right,month label below centered];
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Examples}
+
+In the following, some example calendars are shown that come either from real
+applications or are just nice to look at.
+
+Let us start with a year-2100-countdown, in which we cross out dates as we
+approach the big celebration. For this, we set the shape to |strike out| for
+these dates.
+%
+\begin{codeexample}[leave comments]
+\begin{tikzpicture}
+ \calendar
+ [
+ dates=2099-12-01 to 2100-01-last,
+ week list,inner sep=2pt,month label above centered,
+ month text=\%mt \%y0
+ ]
+ if (at most=2099-12-29) [nodes={strike out,draw}]
+ if (weekend) [black!50,nodes={draw=none}]
+ ;
+\end{tikzpicture}
+\end{codeexample}
+
+The next calendar shows a deadline, which is 10 days in the future from the
+current date. The last three days before the deadline are in red, because we
+really should be done by then. All days on which we can no longer work on the
+project are crossed out.
+%
+\begin{codeexample}[leave comments]
+\begin{tikzpicture}
+ \calendar
+ [
+ dates=\year-\month-\day+-25 to \year-\month-\day+25,
+ week list,inner sep=2pt,month label above centered,
+ month text=\textit{\%mt \%y0}
+ ]
+ if (at least=\year-\month-\day) {}
+ else [nodes={strike out,draw}]
+ if (at most=\year-\month-\day+7)
+ [green!50!black]
+ if (between=\year-\month-\day+8 and \year-\month-\day+10)
+ [red]
+ if (Sunday)
+ [gray,nodes={draw=none}]
+ ;
+\end{tikzpicture}
+\end{codeexample}
+
+The following example is a futuristic calendar that is all about circles:
+%
+\begin{codeexample}[]
+\sffamily
+
+\colorlet{winter}{blue}
+\colorlet{spring}{green!60!black}
+\colorlet{summer}{orange}
+\colorlet{fall}{red}
+
+% A counter, since TikZ is not clever enough (yet) to handle
+% arbitrary angle systems.
+\newcount\mycount
+
+\begin{tikzpicture}
+ [transform shape,
+ every day/.style={anchor=mid,font=\fontsize{6}{6}\selectfont}]
+ \node{\normalsize\the\year};
+ \foreach \month/\monthcolor in
+ {1/winter,2/winter,3/spring,4/spring,5/spring,6/summer,
+ 7/summer,8/summer,9/fall,10/fall,11/fall,12/winter}
+ {
+ % Compute angle:
+ \mycount=\month
+ \advance\mycount by -1
+ \multiply\mycount by 30
+ \advance\mycount by -90
+
+ % The actual calendar
+ \calendar at (\the\mycount:6.4cm)
+ [
+ dates=\the\year-\month-01 to \the\year-\month-last,
+ ]
+ if (day of month=1) {\color{\monthcolor}\tikzmonthcode}
+ if (Sunday) [red]
+ if (all)
+ {
+ % Again, compute angle
+ \mycount=1
+ \advance\mycount by -\pgfcalendarcurrentday
+ \multiply\mycount by 11
+ \advance\mycount by 90
+ \pgftransformshift{\pgfpointpolar{\mycount}{1.4cm}}
+ };
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+Next, let's us have a whole year in a tight column:
+%
+\begin{codeexample}[leave comments]
+\begin{tikzpicture}
+ \small\sffamily
+ \colorlet{darkgreen}{green!50!black}
+ \calendar[dates=\year-01-01 to \year-12-31,week list,
+ month label left,month yshift=0pt,
+ month text=\textcolor{darkgreen}{\%m0}]
+ if (Sunday) [black!50];
+\end{tikzpicture}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-chains.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-chains.tex
new file mode 100644
index 0000000000..da83874151
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-chains.tex
@@ -0,0 +1,499 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Chains}
+\label{section-chains}
+
+\begin{tikzlibrary}{chains}
+ This library defines options for creating chains.
+\end{tikzlibrary}
+
+
+\subsection{Overview}
+
+\emph{Chains} are sequences of nodes that are -- typically -- arranged in a row
+or a column and that are -- typically -- connected by edges. More generally,
+they can be used to position nodes of a branching network in a systematic
+manner. For the positioning of nodes in rows and columns you can also use
+matrices, see Section~\ref{section-matrices}, but chains can also be used to
+describe the connections between nodes that have already been connected using,
+say, matrices. Thus, it often makes sense to use matrices for the positioning
+of elements and chains to describe the connections.
+
+
+\subsection{Starting and Continuing a Chain}
+
+Typically, you construct one chain at a time, but it is permissible to
+construct multiple chains simultaneously. In this case, the chains must be
+named differently and you must specify for each node which chain it belongs to.
+
+The first step toward creating a chain is to use the |start chain| option.
+
+\begin{key}{/tikz/start chain=\opt{\meta{chain name}}\opt{\meta{direction}}}
+ This key should, but need not, be given as an option to a scope enclosing
+ all nodes of the chain. Typically, this will be a |scope| or the whole
+ |tikzpicture|, but it might just be a path on which all nodes of the chain
+ are found. If no \meta{chain name} is given, the default value |chain| will
+ be used instead.
+
+ The key starts a chain named \meta{chain name} and makes it \emph{active},
+ which means that it is currently being constructed. The |start chain| can
+ be issued only once to activate a chain, inside a scope in which a chain is
+ active you cannot use this option once more (for the same chain name). The
+ chain stops being active at the end of the scope in which the |start chain|
+ command was given.
+
+ Although chains are only locally active (that is, active inside the scope
+ the |start chain| command was issued), the information concerning the
+ chains is stored globally and it is possible to \emph{continue} a chain
+ after a scope has ended. For this, the |continue chain| option can be used,
+ which allows you to reactivate an existing chain in another scope.
+
+ The \meta{direction} is used to determine the placement rule for nodes on
+ the chain. If it is omitted, the current value of the following key is
+ used:
+ %
+ \begin{key}{/tikz/chain default direction=\meta{direction} (initially going right)}
+ This \meta{direction} is used in a |chain| option, if no other
+ \meta{direction} is specified.
+ \end{key}
+
+ The \meta{direction} can have two different forms:
+ \declare{|going |\meta{options}} or \declare{|placed |\meta{options}}. The
+ effect of these rules will be explained in the description of the
+ |on chain| option. Right now, just remember that the \meta{direction} you
+ provide with the |chain| option applies to the whole chain.
+
+ Other than this, this key has no further effect. In particular, to place
+ nodes on the chain, you must use the |on chain| option, described next.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain]
+ % The chain is called just "chain"
+ \node [on chain] {A};
+ \node [on chain] {B};
+ \node [on chain] {C};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ % Same as above, using the scope shorthand
+ { [start chain]
+ \node [on chain] {A};
+ \node [on chain] {B};
+ \node [on chain] {C};
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain=1 going right,
+ start chain=2 going below,
+ node distance=5mm,
+ every node/.style=draw]
+ \node [on chain=1] {A};
+ \node [on chain=1] {B};
+ \node [on chain=1] {C};
+
+ \node [on chain=2] at (0.5,-.5) {0};
+ \node [on chain=2] {1};
+ \node [on chain=2] {2};
+
+ \node [on chain=1] {D};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/continue chain=\opt{\meta{chain name}}\opt{\meta{direction}}}
+ This option allows you to (re)activate an existing chain and to possibly
+ change the default direction. If the |chain name| is missing, the name of
+ the innermost activated chain is used. If no chain is activated, |chain| is
+ used.
+
+ Let us have a look at the two different applications of this option. The
+ first is to change the direction of a chain as it is being constructed. For
+ this, just give this option somewhere inside the scope of the chain.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain=going right,node distance=5mm]
+ \node [draw,on chain] {Hello};
+ \node [draw,on chain] {World};
+ \node [draw,continue chain=going below,on chain] {,};
+ \node [draw,on chain] {this};
+ \node [draw,on chain] {is};
+\end{tikzpicture}
+\end{codeexample}
+
+ The second application is to reactivate a chain after it ``has already been
+ closed down''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm,
+ every node/.style=draw]
+ { [start chain=1]
+ \node [on chain] {A};
+ \node [on chain] {B};
+ \node [on chain] {C};
+ }
+
+ { [start chain=2 going below]
+ \node [on chain=2] at (0.5,-.5) {0};
+ \node [on chain=2] {1};
+ \node [on chain=2] {2};
+ }
+
+ { [continue chain=1]
+ \node [on chain] {D};
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Nodes on a Chain}
+
+\begin{key}{/tikz/on chain=\opt{\meta{chain name}}\opt{\meta{direction}}}
+ This key should be given as an option to a node. When the option is used,
+ the \meta{chain name} must be the name of a chain that has been started
+ using the |start chain| option. If \meta{chain name} is the empty string,
+ the current value of the innermost activated chain is used. If this option
+ is used several times for a node, only the last invocation ``wins''. (To
+ place a node on several chains, use the |\chainin| command repeatedly.)
+
+ The \meta{direction} part is optional. If present, it sets the direction
+ used for this node, otherwise the \meta{direction} that was given to the
+ original |start chain| option is used (or of the last |continue chain|
+ option, which allows you to change this default).
+
+ The effects of this option are the following:
+ %
+ \begin{enumerate}
+ \item An internal counter (there is one local counter for each chain)
+ is increased. This counter reflects the current number of the node
+ in the chain, where the first node is node 1, the second is node 2,
+ and so on.
+
+ The value of this internal counter is globally stored in the macro
+ \declare{|\tikzchaincount|}.
+ \item If the node does not yet have a name, (having been given using
+ the |name| option or the name-syntax), the name of the node is set
+ to \meta{chain name}|-|\meta{value of the internal chain counter}.
+ For instance, if the chain is called |nums|, the first node would
+ be named |nums-1|, the second |nums-2|, and so on. For the default
+ chain name |chain|, the first node is named |chain-1|, the second
+ |chain-2|, and so on.
+ \item Independently of whether the name has been provided automatically
+ or via the |name| option, the name of the node is globally stored
+ in the macro \declare{|\tikzchaincurrent|}.
+ \item Except for the first node, the macro
+ \declare{|\tikzchainprevious|} is now globally set to the name of
+ the node of the previous node on the chain. For the first node of
+ the chain, this macro is globally set to the empty string.
+ \item Except possibly for the first node of the chain, the placement
+ rule is now executed. The placement rule is just a \tikzname\
+ option that is applied automatically to each node on the chain.
+ Depending on the form of the \meta{direction} parameter (either the
+ locally given one or the one given to the |start chain| option),
+ different things happen.
+
+ First, it makes a difference whether the \meta{direction} starts
+ with |going| or with |placed|. The difference is that in the first
+ case, the placement rule is not applied to the first node of the
+ chain, while in the second case the placement rule is applied also
+ to this first node. The idea is that a |going|-direction indicates
+ that we are ``going somewhere relative to the previous node''
+ whereas a |placed| indicates that we are ``placing nodes according
+ to their number''.
+
+ Independently of which form is used, the \meta{text} inside
+ \meta{direction} that follows |going| or |placed| (separated by a
+ compulsory space) can have two different effects:
+ %
+ \begin{enumerate}
+ \item If it contains an equal sign, then this \meta{text} is
+ used as the placement rule, that is, it is simply executed.
+ \item If it does not contain an equal sign, then
+ \meta{text}|=of \tikzchainprevious| is used as the
+ placement rule.
+ \end{enumerate}
+
+ Note that in the first case, inside the \meta{text} you have access
+ to |\tikzchainprevious| and |\tikzchaincount| for doing your
+ positioning calculations.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain=circle placed {at=(\tikzchaincount*30:1.5)}]
+ \foreach \i in {1,...,10}
+ \node [on chain] {\i};
+
+ \draw (circle-1) -- (circle-10);
+\end{tikzpicture}
+\end{codeexample}
+ \item The following style is executed:
+ %
+ \begin{stylekey}{/tikz/every on chain}
+ This key is executed for every node on a chain, including the
+ first one.
+ \end{stylekey}
+ \end{enumerate}
+
+ Recall that the standard placement rule has a form like
+ |right=of (\tikzchainprevious)|. This means that each new node is placed to
+ the right of the previous one, spaced by the current value of
+ |node distance|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain,node distance=5mm]
+ \node [draw,on chain] {};
+ \node [draw,on chain] {Hallo};
+ \node [draw,on chain] {Welt};
+\end{tikzpicture}
+\end{codeexample}
+
+ The optional \meta{direction} allows us to temporarily change the direction
+ in the middle of a chain:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain,node distance=5mm]
+ \node [draw,on chain] {Hello};
+ \node [draw,on chain] {World};
+ \node [draw,on chain=going below] {,};
+ \node [draw,on chain] {this};
+ \node [draw,on chain] {is};
+\end{tikzpicture}
+\end{codeexample}
+
+ You can also use more complicated computations in the \meta{direction}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain=going {at=(\tikzchainprevious),shift=(30:1)}]
+ \draw [help lines] (0,0) grid (3,2);
+ \node [draw,on chain] {1};
+ \node [draw,on chain] {Hello};
+ \node [draw,on chain] {World};
+ \node [draw,on chain] {.};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+For each chain, two special ``pseudo nodes'' are created.
+
+\begin{predefinednode}{\meta{chain name}-begin}
+ This node is the same as the first node on the chain. It is only defined
+ after a first node has been defined.
+\end{predefinednode}
+
+\begin{predefinednode}{\meta{chain name}-end}
+ This node is the same as the (currently) last node on the chain. As the
+ chain is extended, this node changes.
+\end{predefinednode}
+
+The |on chain| option can also be used, in conjunction with |late options|, to
+add an already existing node to a chain. The following command, which is only
+defined inside scopes where a |start chain| option is present, simplifies this
+process.
+
+\begin{command}{\chainin |(|\meta{existing name}|)| \opt{\oarg{options}}}
+ This command makes it easy to add a node to chain that has already been
+ constructed. This node may even be part of a another chain.
+
+ When you say |\chainin (some node);|, the node |some node| must already
+ exist. It will then be made part of the current chain. This does not mean
+ that the node can be changed (it is already constructed, after all), but
+ the |join| option can be used to join |some node| to the previous last node
+ on the chain and subsequent nodes will be placed relative to |some node|.
+
+ It is permissible to give the |on chain| option inside the \meta{options}
+ in order to specify on which chain the node should be put.
+
+ This command is just a shortcut for
+ %
+ \begin{quote}
+ |\path (|\meta{existing name}|) [late options={on chain,every chain in,|\meta{options}|}]|
+ \end{quote}
+ %
+ In particular, it is possible to continue to path after a |\chainin|
+ command, though that does not seem very useful.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm,
+ every node/.style=draw,every join/.style=->]
+ \draw [help lines] (0,0) grid (3,2);
+
+ \node[red] (existing) at (0,2) {existing};
+
+ \begin{scope}[start chain]
+ \node [draw,on chain,join] {Hello};
+ \node [draw,on chain,join] {World};
+ \chainin (existing) [join];
+ \node [draw,on chain,join] {this};
+ \node [draw,on chain,join] {is};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+ Here is an example where nodes are positioned using a matrix and then
+ connected using a chain
+ %
+{\catcode`\|=12
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \matrix [matrix of nodes,column sep=5mm,row sep=5mm]
+ {
+ |(a)| World & |(b) [circle]| peace \\
+ |(c)| be & |(d) [isosceles triangle]| would \\
+ |(e) [ellipse]| great & |(f)| ! \\
+ };
+
+ % (the `scopes' library needs to be loaded to make the following work)
+ { [start chain,every on chain/.style={join=by ->}]
+ \chainin (a);
+ \chainin (b);
+ \chainin (d);
+ \chainin (c);
+ \chainin (e);
+ \chainin (f);
+ }
+\end{tikzpicture}
+\end{codeexample}
+}
+ %
+\end{command}
+
+
+\subsection{Joining Nodes on a Chain}
+
+\begin{key}{/tikz/join=\opt{|with |\meta{with} }\opt{|by |\meta{options}}}
+ When this key is given to any node on a chain (except possibly for the
+ first node), an |edge| command is added after the node. The |with| part
+ specifies which node should be used for the start point of the edge; if the
+ |with| part is omitted, the |\tikzchainprevious| is used. This |edge|
+ command gets the \meta{options} as parameter and the current node as its
+ target. If there is no previous node and no |with| is given, no |edge|
+ command gets executed.
+ %
+ \begin{stylekey}{/tikz/every join}
+ This style is executed each time this command is used.
+ \end{stylekey}
+
+ Note that it makes sense to call this option several times for a node, in
+ order to connect it to several nodes. This is especially useful for joining
+ in branches, see the next section.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[start chain,node distance=5mm,
+ every join/.style={->,red}]
+ \node [draw,on chain,join] {};
+ \node [draw,on chain,join] {Hallo};
+ \node [draw,on chain,join] {Welt};
+ \node [draw,on chain=going below,
+ join,join=with chain-1 by {blue,<-}] {foo};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Branches}
+
+A \emph{branch} is a chain that (typically only temporarily) extends an
+existing chain. The idea is the following: Suppose we are constructing a chain
+and at some node |x| there is a fork. In this case, one (or even more) branches
+starts at this fork. For each branch a chain is created, but the first node on
+this chain should be~|x|. For this, it is useful to use |\chainin| on the node
+|x| to make it part of the different branch chains and to name the branch
+chains in some way that reflects the name of the main chain.
+
+The |start branch| option provides a shorthand for doing exactly what was just
+described.
+
+\begin{key}{/tikz/start branch=\meta{branch name}\opt{\meta{direction}}}
+ This key is used in the same manner as the |start chain| command, however,
+ the effect is slightly different:
+ %
+ \begin{itemize}
+ \item This option may only be used if some chain is already active and
+ there is a (last) node on this chain. Let us call this node the
+ \meta{fork node}.
+ \item The chain is not just called \meta{branch name}, but
+ \meta{current chain}|/|\meta{branch name}. For instance, if the
+ \meta{fork node} is part of the chain called |trunk| and the
+ \meta{branch name} is set to |left|, the complete chain name of the
+ branch is |trunk/left|. The \meta{branch name} must be given, there
+ is no default value.
+ \item The \meta{fork node} is automatically ``chained into'' the branch
+ chain as its first node. Thus, for the first node on the branch
+ that you provide, the |join| option will cause it to be connected
+ to the fork node.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every on chain/.style=join,every join/.style=->,
+ node distance=2mm and 1cm]
+ { [start chain=trunk]
+ \node [on chain] {A};
+ \node [on chain] {B};
+
+ { [start branch=numbers going below]
+ \node [on chain] {1};
+ \node [on chain] {2};
+ \node [on chain] {3};
+ }
+ { [start branch=greek going above]
+ \node [on chain] {$\alpha$};
+ \node [on chain] {$\beta$};
+ \node [on chain] {$\gamma$};
+ }
+
+ \node [on chain,join=with trunk/numbers-end,join=with trunk/greek-end] {C};
+ { [start branch=symbols going below]
+ \node [on chain] {$\star$};
+ \node [on chain] {$\circ$};
+ \node [on chain] {$\int$};
+ }
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/continue branch=\meta{branch name}\opt{\meta{direction}}}
+ This option works like the |continue chain| option, only \meta{current
+ chain}|/|\meta{branch name} is used as the chain name, rather than just
+ \meta{branch name}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every on chain/.style=join,every join/.style=->,
+ node distance=2mm and 1cm]
+ { [start chain=trunk]
+ \node [on chain] {A};
+ \node [on chain] {B};
+ { [start branch=numbers going below] } % just a declaration,
+ { [start branch=greek going above] } % we will come back later
+ \node [on chain] {C};
+
+ % Now come the branches...
+ { [continue branch=numbers]
+ \node [on chain] {1};
+ \node [on chain] {2};
+ }
+ { [continue branch=greek]
+ \node [on chain] {$\alpha$};
+ \node [on chain] {$\beta$};
+ }
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-circuits.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-circuits.tex
new file mode 100644
index 0000000000..c211fa49ca
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-circuits.tex
@@ -0,0 +1,2212 @@
+% Copyright 2008 by Till Tantau and Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Circuit Libraries}
+\label{section-library-circuits}
+
+\emph{Written and documented by Till Tantau, and Mark Wibrow. Inspired
+by the work of Massimo Redaelli.}
+
+
+\subsection{Introduction}
+
+The circuit libraries can be used to draw different kinds of electrical or
+logical circuits. There is not a single library for this, but a whole hierarchy
+of libraries that work in concert. The main design goal was to create a balance
+between ease-of-use and ease-of-extending, while creating high-quality
+graphical representations of circuits.
+
+
+\subsubsection{A First Example}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,x=3cm,y=2cm,semithick,
+ every info/.style={font=\footnotesize},
+ small circuit symbols,
+ set resistor graphic=var resistor IEC graphic,
+ set diode graphic=var diode IEC graphic,
+ set make contact graphic= var make contact IEC graphic]
+ % Let us start with some contacts:
+ \foreach \contact/\y in {1/1,2/2,3/3.5,4/4.5,5/5.5}
+ {
+ \node [contact] (left contact \contact) at (0,\y) {};
+ \node [contact] (right contact \contact) at (1,\y) {};
+ }
+ \draw (right contact 1) -- (right contact 2) -- (right contact 3)
+ -- (right contact 4) -- (right contact 5);
+
+ \draw (left contact 1) to [diode] ++(down:1)
+ to [voltage source={near start,
+ direction info={volt=3}},
+ resistor={near end,ohm=3}] ++(right:1)
+ to (right contact 1);
+ \draw (left contact 1) to [resistor={ohm=4}] (right contact 1);
+ \draw (left contact 1) to [resistor={ohm=3}] (left contact 2);
+ \draw (left contact 2) to [voltage source={near start,
+ direction info={<-,volt=8}},
+ resistor={ohm=2,near end}] (right contact 2);
+ \draw (left contact 2) to [resistor={near start,ohm=1},
+ make contact={near end,info'={[red]$S_1$}}]
+ (left contact 3);
+ \draw (left contact 3) to [current direction'={near start,info=$\iota$},
+ resistor={near end,info={$R=4\Omega$}}]
+ (right contact 3);
+ \draw (left contact 4) to [voltage source={near start,
+ direction info={<-,volt=8}},
+ resistor={ohm=2,near end}] (right contact 4);
+ \draw (left contact 3) to [resistor={ohm=1}] (left contact 4);
+ \draw (left contact 4) to [resistor={ohm=3}] (left contact 5);
+ \draw (left contact 5) to [resistor={ohm=4}] (right contact 5);
+ \draw (left contact 5) to [diode] ++(up:1)
+ to [voltage source={near start,
+ direction info={volt=3}},
+ resistor={near end,ohm=3}] ++(right:1)
+ to (right contact 5);
+\end{tikzpicture}
+\end{codeexample}
+
+An important feature of the circuit library is that the appearance of a circuit
+can be configured in general ways and that the labels are placed automatically
+by default. Here is the graphic once more, generated from \emph{exactly the
+same source code}, with only the options of the |{tikzpicture}| environment
+replaced by |[rotate=-90,circuit ee IEC,x=3.25cm,y=2.25cm]|:
+
+\begin{tikzpicture}[rotate=-90,circuit ee IEC,x=3cm,y=2.25cm]
+ % Let us start with some contacts:
+ \foreach \contact/\y in {1/1,2/2,3/3.5,4/4.5,5/5.5}
+ {
+ \node [contact] (left contact \contact) at (0,\y) {};
+ \node [contact] (right contact \contact) at (1,\y) {};
+ }
+ \draw (right contact 1) -- (right contact 2) -- (right contact 3)
+ -- (right contact 4) -- (right contact 5);
+
+ \draw (left contact 1) to [diode] ++(down:1)
+ to [voltage source={near start,direction info={volt=3}},
+ resistor={near end,ohm=3}] ++(right:1)
+ to (right contact 1);
+ \draw (left contact 1) to [resistor={ohm=4}] (right contact 1);
+ \draw (left contact 1) to [resistor={ohm=3}] (left contact 2);
+ \draw (left contact 2) to [voltage source={near start,
+ direction info={<-,volt=8}},
+ resistor={ohm=2,near end}] (right contact 2);
+ \draw (left contact 2) to [resistor={near start,ohm=1},
+ make contact={near end,info'={[red]$S_1$}}] (left contact 3);
+ \draw (left contact 3) to [current direction'={near start,info=$\iota$},
+ resistor={near end,info={$R=4\Omega$}}]
+ (right contact 3);
+ \draw (left contact 4) to [voltage source={near start,
+ direction info={<-,volt=8}},
+ resistor={ohm=2,near end}] (right contact 4);
+ \draw (left contact 3) to [resistor={ohm=1}] (left contact 4);
+ \draw (left contact 4) to [resistor={ohm=3}] (left contact 5);
+ \draw (left contact 5) to [resistor={ohm=4}] (right contact 5);
+ \draw (left contact 5) to [diode] ++(up:1)
+ to [voltage source={near start,direction info={volt=3}},
+ resistor={near end,ohm=3}] ++(right:1)
+ to (right contact 5);
+\end{tikzpicture}
+
+
+\subsubsection{Symbols}
+
+A circuit typically consists of numerous electronic elements like logical gates
+or resistors or diodes that are connected by wires. In \pgfname/\tikzname, we
+use nodes for the electronic elements and normal lines for the wires.
+\tikzname\ offers a large number of different ways of positioning and
+connecting nodes in general, all of which can be used here. Additionally, the
+|circuits| library defines an additional useful |to|-path that is particularly
+useful for elements like a resistor on a line.
+
+There are many different names that are used to refer to electrical
+``elements'', so a bit of terminology standardization is useful: We will call
+such elements \emph{symbols}. A \emph{symbol shape} is a \pgfname\ shape
+declared using the |\pgfdeclareshape| command. A \emph{symbol node} is a node
+whose shape is a symbol shape.
+
+
+\subsubsection{Symbol Graphics}
+
+Symbols can be created by |\node[shape=some symbol shape]|. However, in order
+to represent some symbols correctly, just using standard \pgfname\ shapes is
+not sufficient. For instance, most symbols have a visually appealing ``default
+size'', but the size of a symbol shape depends only on the current values of
+parameters like |minimum height| or |inner xsep|.
+
+For these reasons, the circuit libraries introduce the concept of a
+\emph{symbol graphic}. This is a style that causes a |\node| to not only have
+the correct shape, but also the correct size and the correct path usage. More
+generally, this style may set up things in any way so that the ``symbol looks
+correct''. When you write, for instance, |\node[diode]|, then the style called
+|diode graphic| is used, which in turn is set to something like
+|shape=diode IEC,draw,minimum height=...|.
+
+Here is an overview of the different kinds of circuit libraries:
+%
+\begin{itemize}
+ \item The \tikzname-library |circuits| defines general keys for creating
+ circuits. Mostly, these keys are useful for defining more specialized
+ libraries.
+
+ You normally do not use this library directly since it does not define
+ any symbol graphics.
+ \item The \tikzname-library |circuits.logic| defines keys for creating
+ logical gates like and-gates or xor-gates. However, this library also
+ does not actually define any symbol graphics; this is done by two
+ sublibraries:
+ %
+ \begin{itemize}
+ \item The library |circuits.logic.US| defines symbol graphics that
+ cause the logical gates to be rendered in the ``US-style''. It
+ includes all of the above libraries and you can use this
+ library directly.
+ \item The library |circuits.logic.IEC| also defines symbol graphics
+ for logical gates, but it uses rectangular gates rather that
+ the round US-gates. This library can coexist peacefully with
+ the above library, you can change which symbol graphics are
+ used ``on the fly''.
+ \end{itemize}
+ \item The \tikzname-library |cirucits.ee| defines keys for symbols from
+ electrical engineering like resistors or capacitors. Again,
+ sublibraries define the actual symbol graphics.
+ %
+ \begin{itemize}
+ \item The library |circuits.ee.IEC| defines symbol shapes that
+ follow the IEC norm.
+ \end{itemize}
+ \item The \pgfname-libraries |shapes.gates.*| define (circuit) symbol
+ shapes. However, you normally do not use these shapes directly, rather
+ you use a style that uses an appropriate symbol graphic, which in turn
+ uses one of these shapes.
+\end{itemize}
+
+Let us have a look at a simple example. Suppose we wish to create a logical
+circuit. Then we first have to decide which symbol graphics we would like to
+use. Suppose we wish to use the US-style, then we would include the library
+|circuits.logic.US|. If you wish to use IEC-style symbols, use
+|circuits.logic.IEC|. If you cannot decide, include both:
+%
+\begin{codeexample}[code only]
+\usetikzlibrary{circuits.logic.US,circuits.logic.IEC}
+\end{codeexample}
+%
+To create a picture that contains a US-style circuit you can now use the option
+|circuit logic US|. This will set up keys like |and gate| to create use an
+appropriate symbol graphic for rendering an |and gate|. Using the
+|circuit logic IEC| instead will set up |and gate| to use another symbol
+graphic.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit logic US]
+ \matrix[column sep=7mm]
+ {
+ \node (i0) {0}; & & \\
+ & \node [and gate] (a1) {}; & \\
+ \node (i1) {0}; & & \node [or gate] (o) {};\\
+ & \node [nand gate] (a2) {}; & \\
+ \node (i2) {1}; & & \\
+ };
+ \draw (i0.east) -- ++(right:3mm) |- (a1.input 1);
+ \draw (i1.east) -- ++(right:3mm) |- (a1.input 2);
+ \draw (i1.east) -- ++(right:3mm) |- (a2.input 1);
+ \draw (i2.east) -- ++(right:3mm) |- (a2.input 2);
+ \draw (a1.output) -- ++(right:3mm) |- (o.input 1);
+ \draw (a2.output) -- ++(right:3mm) |- (o.input 2);
+ \draw (o.output) -- ++(right:3mm);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit logic IEC]
+ \matrix[column sep=7mm]
+ {
+ \node (i0) {0}; & & \\
+ & \node [and gate] (a1) {}; & \\
+ \node (i1) {0}; & & \node [or gate] (o) {};\\
+ & \node [nand gate] (a2) {}; & \\
+ \node (i2) {1}; & & \\
+ };
+ \draw (i0.east) -- ++(right:3mm) |- (a1.input 1);
+ \draw (i1.east) -- ++(right:3mm) |- (a1.input 2);
+ \draw (i1.east) -- ++(right:3mm) |- (a2.input 1);
+ \draw (i2.east) -- ++(right:3mm) |- (a2.input 2);
+ \draw (a1.output) -- ++(right:3mm) |- (o.input 1);
+ \draw (a2.output) -- ++(right:3mm) |- (o.input 2);
+ \draw (o.output) -- ++(right:3mm);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Annotations}
+
+An \emph{annotation} is a little extra drawing that can be added to a symbol.
+For instance, when you add two little parallel arrows pointing away from some
+electrical element, this usually means that the element is light emitting.
+
+Instead of having one symbol for ``diode'' and another for ``light emitting
+diode'', there is just one |diode| symbol, but you can add the |light emitting|
+annotation to it. This is done by passing the annotation as a parameter to the
+symbol as in the following example:
+%
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \draw (0,0) to [diode={light emitting}] (3,0)
+ to [resistor={adjustable}] (3,2);
+\end{codeexample}
+
+
+\subsection{The Base Circuit Library}
+
+\begin{tikzlibrary}{circuits}
+ This library is a base library that is included by other circuit libraries.
+ You do not include it directly, but you will typically use some of the
+ general keys, described below.
+\end{tikzlibrary}
+
+\begin{key}{/tikz/circuits}
+ This key should be passed as an option to a picture or a scope that contains
+ a circuit. It will do some internal setups. This key is normally called by
+ more specialized keys like |circuit ee IEC|.
+\end{key}
+
+
+\subsubsection{Symbol Size}
+
+\begin{key}{/tikz/circuit symbol unit=\meta{dimension} (initially 7pt)}
+ This dimension is a ``unit'' for the size of symbols. The libraries
+ generally define the sizes of symbols relative to this dimension. For
+ instance, the longer side of an inductor is, by default, in the IEC library
+ equal to five times this \meta{dimension}. When you change this
+ \meta{dimension}, the size of all symbols will automatically change
+ accordingly.
+
+ Note, that it is still possible to overwrite the size of any particular
+ symbol. These settings apply only to the default sizes.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC]
+ \draw (0,1) to [resistor] (3.5,1);
+ \draw[circuit symbol unit=14pt]
+ (0,0) to [resistor] (3.5,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{stylekey}{/tikz/huge circuit symbols}
+ This style sets the default circuit symbol unit to |10pt|.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/large circuit symbols}
+ This style sets the default circuit symbol unit to |8pt|.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/medium circuit symbols}
+ This style sets the default circuit symbol unit to |7pt|.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/small circuit symbols}
+ This style sets the default circuit symbol unit to |6pt|.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/tiny circuit symbols}
+ This style sets the default circuit symbol unit to |5pt|.
+\end{stylekey}
+
+\begin{key}{/tikz/circuit symbol size=|width| \meta{width} |height| \meta{height}}
+ This key sets |minimum height| to \meta{height} times the current value of
+ the circuit symbol unit and the |minimum width| to \meta{width} times this
+ value. Thus, this option can be used with a node command to set the size of
+ the node as a multiple of the circuit symbol unit.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC]
+ \draw (0,1) to [resistor] (2,1) to[inductor] (4,1);
+
+ \begin{scope}
+ [every resistor/.style={circuit symbol size=width 3 height 1}]
+ \draw (0,0) to [resistor] (2,0) to[inductor] (4,0);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Declaring New Symbols}
+
+\begin{key}{/tikz/circuit declare symbol=\meta{name}}
+ This key is used to declare a symbol. It does not cause this symbol to be
+ shown nor does it set a graphic to be used for the symbol, it simply
+ ``prepares'' several keys that can later be used to draw a symbol and to
+ configure it.
+
+ In detail, the first key that is defined is just called \meta{name}. This
+ key should be given as an option to a |node| or on a |to| path, as
+ explained below. The key will take options, which can be used to influence
+ the way the symbol graphic is rendered.
+
+ Let us have a look at an example. Suppose we want to define a symbol called
+ |foo|, which just looks like a simple rectangle. We could then say
+ %
+\begin{codeexample}[code only]
+\tikzset{circuit declare symbol=foo}
+\end{codeexample}
+ %
+ The symbol could now be used like this:
+ %
+\begin{codeexample}[code only]
+ \node [foo] at (1,1) {};
+ \node [foo={red}] at (2,1) {};
+\end{codeexample}
+
+ However, in the above example we would not actually see anything since we
+ have not yet set up the graphic to be used by |foo|. For this, we must use
+ a key called |set foo graphic| or, generally, |set| \meta{name} |graphic|.
+ This key gets graphic options as parameter that will be set when a symbol
+ |foo| should be shown:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [circuit declare symbol=foo,
+ set foo graphic={draw,shape=rectangle,minimum size=5mm}]
+
+ \node [foo] at (1,1) {};
+ \node [foo={red}] at (2,1) {};
+\end{tikzpicture}
+\end{codeexample}
+
+ In detail, when you use the key \meta{name}=\meta{options} with a node, the
+ following happens:
+ %
+ \begin{enumerate}
+ \item The |inner sep| is set to |0.5pt|.
+ \item The following style is executed:
+ %
+ \begin{stylekey}{/tikz/every circuit symbol}
+ Use this style to set up things in general.
+ \end{stylekey}
+ \item The graphic options that have been set using |set| \meta{name}
+ |graphic| are set.
+ \item The style |every |\meta{name} is executed. You can use it to
+ configure the symbol further.
+ \item The \meta{options} are executed.
+ \end{enumerate}
+
+ The key \meta{name} will have a different effect when it is used on a |to|
+ path command inside a |circuit| environment (the |circuit| environment sets
+ up |to| paths in such a way that the use of a key declared using
+ |circuit declare symbol| is automatically detected). When \meta{name} is
+ used on a |to| path, the above actions also happen (setting the inner
+ separation, using the symbol graphic, and so on), but they are passed to
+ the key |circuit handle symbol|, which is explained next.
+\end{key}
+
+\begin{key}{/tikz/circuit handle symbol=\meta{options}}
+ This key is mostly used internally. Its purpose is to render a symbol. The
+ effect of this key differs, depending on whether it is used as the optional
+ argument of a |to| path command or elsewhere.
+
+ If the key is not used as an argument of a |to| path command, the
+ \meta{options} are simply executed.
+
+ The more interesting case happens when the key is given on a |to| path
+ command. In this case, several things happen:
+ %
+ \begin{enumerate}
+ \item The |to| path is locally changed and set to an internal path
+ (which you should not try to change) that consists mostly of a
+ single straight line.
+ \item The \meta{options} are tentatively executed with filtering
+ switched on. Everything is filtered out, except for the key |pos|
+ and also the styles |at start|, |very near start|, |near start|,
+ |midway|, |near end|, |very near end|, and |at end|. If none of
+ them is found, |midway| is used.
+ \item The filtered option is used to determine a position for the
+ symbol on the path. At the given position (with |pos=0|
+ representing the start and |pos=1| representing the end), a node
+ will be added to the path (in a manner to be described presently).
+ \item This node gets \meta{options} as its option list.
+ \item The node is added by virtue of a special |markings| decoration.
+ This means that a |mark| command is executed that causes the node
+ to be placed as a mark on the path.
+ \item The marking decoration will automatically subdivide the path and
+ cause a line to be drawn from the start of the path to the node's
+ border (at the position that lies on a line from the node's center
+ to the start of the path) and then from the node's border (at a
+ position on the other side of the node) to the end of the path.
+ \item The marking decoration will also take care of the case that
+ multiple marks are present on a path, in this case the lines from
+ and to the borders of the nodes are only between consecutive nodes.
+ \item The marking decoration will also rotate the coordinate system in
+ such a way that the $x$-axis points along the path. Thus, if you
+ use the |transform shape| option, the node will ``point along'' the
+ path.
+ \item In case a node is at |pos=0| or at |pos=1| some special code will
+ suppress the superfluous lines to the start or end of the path.
+ \end{enumerate}
+
+ The net effect of all of the above is that a node will be placed ``on the
+ path'' and the path will have a ``gap'' just large enough to encompass the
+ node. Another effect is that you can use this key multiple times on a path
+ to add several node to a path, provided they do not overlap.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit]
+ \draw (0,0) to [circuit handle symbol={draw,shape=rectangle,near start},
+ circuit handle symbol={draw,shape=circle,near end}] (3,2);
+ \end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[transform shape,circuit]
+ \draw (0,0) to [circuit handle symbol={draw,shape=rectangle,at start},
+ circuit handle symbol={draw,shape=circle,near end}] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Pointing Symbols in the Right Direction}
+
+Unlike normal nodes, which generally should not be rotated since this will make
+their text hard to read, symbols often need to be rotated. There are two ways
+of achieving such rotations:
+%
+\begin{enumerate}
+ \item When you place a symbol on a |to| path, the graphic symbol is
+ automatically rotated such that it ``points along the path''. Here is
+ an examples that shows how the inductor shape (which looks, unrotated,
+ like this: \tikz[circuit ee IEC]\node[inductor]{};) is automatically
+ rotated around:
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \draw (3,0) to[inductor] (1,0) to[inductor] (0,2);
+\end{codeexample}
+ %
+ \item Many shapes cannot be placed ``on'' a path in this way, namely
+ whenever there are more than two possible inputs. Also, you may wish to
+ place the nodes first, possibly using a matrix, and connect them
+ afterwards. In this case, you can simply add rotations like |rotate=90|
+ to the shapes to rotate them. The following four keys make this
+ slightly more convenient:
+ %
+ \begin{key}{/tikz/point up}
+ This is the same as |rotate=90|.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \node [diode,point up] {};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/point down}
+ This is the same as |rotate=-90|.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \node [diode,point down] {};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/point left}
+ This is the same as |rotate=-180|.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \node [diode,point left] {};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/point right}
+ This key has no effect.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \node [diode,point right] {};
+\end{codeexample}
+ \end{key}
+\end{enumerate}
+
+
+\subsubsection{Info Labels}
+
+Info labels are used to add text to a circuit symbol. Unlike normal nodes like
+a rectangle, circuit symbols typically do not have text ``on'' them, but the
+text is placed next to them (like the text ``$3\,\Omega$'' next to a resistor).
+
+\tikzname\ already provides the |label| option for this purpose. The |info|
+option is built on top of this option, but it comes in some predefined variants
+that are especially useful in conjunction with circuits.
+
+\begin{key}{/tikz/info=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}}
+ This key has nearly the same effect as the |label| key, only the following
+ style is used additionally automatically:
+ %
+ \begin{stylekey}{/tikz/every info}
+ Set this style to configure the styling of info labels. Since this
+ key is \emph{not} used with normal labels, it provides an easy way
+ of changing the way info labels look without changing other
+ labels.
+ \end{stylekey}
+ %
+ The \meta{options} and \meta{angle} are passed directly to the |label|
+ command.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,every info/.style=red]
+ \node [resistor,info=$3\Omega$] {};
+\end{tikzpicture}
+\end{codeexample}
+
+ You will find a detailed discussion of the |label| option on
+ page~\pageref{label-option}.
+
+ Hint: To place some text \emph{on} the main node, use |center| as the
+ \meta{angle}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,every info/.style=red]
+ \node [resistor,info=center:$3\Omega$] {};
+ \node [resistor,point up,info=center:$R_1$] at (2,0) {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/info'=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}}
+ This key works exactly like the |info| key, only in case the \meta{angle}
+ is missing, it defaults to |below| instead of the current value of
+ |label position|, which is usually |above|. This means that when you use
+ |info|, you get a label above the node, while when you use the |info'| key
+ you get a label below the node. In case the node has been rotated, the
+ positions of the info nodes are rotated accordingly.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,every info/.style=red]
+ \draw (0,0) to[resistor={info={$3\Omega$},info'={$R_1$}}] (3,0)
+ to[resistor={info={$4\Omega$},info'={$R_2$}}] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/info sloped=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}}
+ This key works like |info|, only the |transform shape| option is set when
+ the label is drawn, causing it to follow the sloping of the main node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,every info/.style=red]
+ \draw (0,0) to[resistor={info sloped={$3\Omega$}}] (3,0)
+ to[resistor={info sloped={$4\Omega$}}] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/info' sloped=}
+ This is a combination of |info'| and |info sloped|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,every info/.style=red]
+ \draw (0,0) to[resistor={info' sloped={$3\Omega$}}] (3,0)
+ to[resistor={info' sloped={$4\Omega$}}] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/circuit declare unit=\marg{name}\marg{unit}}
+ This key is used to declare keys that make it easy to attach physical units
+ to nodes. The idea is that instead of |info=$3\Omega$| you can write
+ |ohm=3| or instead of |info'=$5\mathrm{S}$| you can write |siemens'=5|.
+
+ In detail, four keys are defined, namely |/tikz/|\meta{name},
+ |/tikz/|\meta{name}|'|, |/tikz/|\meta{name} |sloped|, and
+ |/tikz/|\meta{name}|'| |sloped|. The arguments of all of these keys are of
+ the form \opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{value} and it is
+ passed (slightly modified) to the corresponding key |info|, |info'|, |info|
+ |sloped|, or |info'| |sloped|. The ``slight modification'' is the
+ following: The text that is passed to the, say, |info| key is not
+ \meta{value}, but rather |$\mathrm{|\meta{value}\meta{unit}|}$|
+
+ This means that after you said |circuit declare unit={ohm}{\Omega}|, then
+ |ohm=5k| will have the same effect as
+ |info={[every ohm]$\mathrm{5k\Omega}$}|. Here, |every ohm| is a style that
+ allows you to configure the appearance of this unit. Since the |info| key
+ is used internally, by changing the |every info| style, you can change the
+ appearance of all units infos.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC,circuit declare unit={my ohm}{O}]
+ \draw (0,0) to[resistor={my ohm' sloped=3}] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Declaring and Using Annotations}
+
+Annotations are quite similar to info labels. The main difference is that they
+generally cause something to be drawn by default rather than some text to be
+added (although an annotation might also add some text).
+
+Annotations can be declared using the following key:
+
+\begin{key}{/tikz/circuit declare annotation=\marg{name}\marg{distance}\marg{path}}
+ This key is used to declare an annotation named \meta{name}. Once declared,
+ it can be used as an argument of a symbol and will add the drawing in
+ \meta{path} to the symbol. In detail, the following happens:
+
+
+ \textbf{The Main Keys.}
+ Two keys called \meta{name} and \meta{name}|'| are defined. The second
+ causes the annotation to be ``mirrored and placed on the other side'' of
+ the symbol. Both of these keys may also take further keys as parameter like
+ |info| keys. Whenever the \meta{name} key is used, a local scope is opened
+ and in this scope the following things are done:
+ %
+ \begin{enumerate}
+ \item The style |every| \meta{name} is executed.
+ \item The following style is executed and then |arrows=->|:
+ %
+ \begin{stylekey}{/tikz/annotation arrow}
+ This style should set the |>| key to some desirable arrow tip.
+ \end{stylekey}
+ \item The coordinate system is shifted such that the origin is at the
+ north anchor of the symbol. (For the \meta{name}|'| key the
+ coordinate system is flipped and shifted such that the origin is at
+ the south anchor of the symbol.)
+ \item The |label distance| is locally set to \meta{distance}.
+ \item The parameter options given to the \meta{name} key are executed.
+ \item The \meta{path} is executed.
+ \end{enumerate}
+
+
+ \textbf{Usage.}
+ What all of the above amounts to is best explained by an example. Suppose
+ we wish to create an annotation that looks like a little circular arrow
+ (like \tikz \draw [->] (0,0) arc (-270:80:1ex);). We could then say:
+ %
+\begin{codeexample}[code only]
+\tikzset{circuit declare annotation=
+ {circular annotation}
+ {9pt}
+ {(0pt,8pt) arc (-270:80:3.5pt)}
+}
+\end{codeexample}
+ %
+ We can then use it like this:
+ %
+\tikzset{circuit declare annotation=
+ {circular annotation}
+ {8pt}
+ {(0pt,8pt) arc (-270:80:3.5pt)}
+}
+\begin{codeexample}[]
+\tikz[circuit ee IEC]
+ \draw (0,0) to [resistor={circular annotation}] (3,0);
+\end{codeexample}
+ %
+ Well, not very impressive since we do not see anything. This is due to the
+ fact that the \meta{path} becomes part of a path that contains the symbol
+ node an nothing else. This path is not drawn or filled, so we do not see
+ anything. What we must do is to use an |edge| path operation:
+ %
+\begin{codeexample}[]
+\tikzset{circuit declare annotation={circular annotation}{9pt}
+ {(0pt,8pt) edge[to path={arc(-270:80:3.5pt)}] ()}
+}
+\tikz[circuit ee IEC]
+ \draw (0,0) to [resistor={circular annotation}] (3,0)
+ to [capacitor={circular annotation'}] (3,2);
+\end{codeexample}
+ %
+ The \meta{distance} is important for the correct placement of additional
+ |info| labels. When an annotation is present, the info labels may need to
+ be moved further away from the symbol, but not always. For this reason, an
+ annotation defines an additional \meta{distance} that is applied to all
+ info labels given as parameters to the annotation. Here is an example, that
+ shows the difference:
+ %
+\tikzset{circuit declare annotation={circular annotation}{9pt}
+ {(0pt,8pt) edge[to path={arc (-270:80:3.5pt)}] ()}
+}
+\begin{codeexample}[]
+\tikz[circuit ee IEC]
+ \draw (0,0) to [resistor={circular annotation,ohm=5}] (2,0)
+ to [resistor={circular annotation={ohm=5}}] (4,0);
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Theming Symbols}
+\label{section-theming-symbols}
+
+For each symbol, a certain graphical representation is chosen to actually show
+the symbol. You can modify this graphical representation in several ways:
+%
+\begin{itemize}
+ \item You can select a different library and use a different |circuit ...|
+ key. This will change all graphics used for the symbols.
+ \item You can generally change the size of graphic symbols by setting
+ |circuit size unit| to a different value or using a key like
+ |small circuit symbols|.
+ \item You can add options to the graphics used by symbols either globally
+ by setting the |every circuit| |symbol| style or locally by setting the
+ |every| \meta{name} style, where \meta{name} is the name of a symbol.
+ For instance, in the following picture the symbols are ridiculously
+ thick and resistors are red.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [circuit ee IEC,
+ every circuit symbol/.style={ultra thick},
+ every resistor/.style={red}]
+
+ \draw (0,0) to [inductor] ++(right:3) to [resistor] ++(up:2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \item You can selectively change the graphic used for a symbol by saying
+ |set resistor graphic=|.
+ \item You can change one or more of the following styles:
+ %
+ \begin{stylekey}{/tikz/circuit symbol open (initially draw)}
+ This style is used with symbols that consist of lines that surround
+ some area. For instance, the IEC version of a resistor is an open
+ symbol.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC,
+ circuit symbol open/.style={thick,draw,fill=yellow}]
+ \draw (0,0) to [inductor] ++(right:3) to [resistor] ++(up:2);
+\end{codeexample}
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/circuit symbol filled (initially {draw,fill=black})}
+ This style is used with symbols that are completely filled. For
+ instance, the variant IEC version of an inductor is a filled, black
+ rectangle.
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/circuit symbol lines (initially draw)}
+ This style is used with symbols that consist only of lines that do
+ not surround anything. Examples are a capacitor.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC,
+ circuit symbol lines/.style={thick,draw=red}]
+ \draw (0,0) to [capacitor] ++(right:3) to [resistor] ++(up:2);
+\end{codeexample}
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/circuit symbol wires (initially draw)}
+ This style is used for symbols that consist only of ``wires''. The
+ difference to the previous style is that a symbol consisting of
+ wires will look strange when the lines are thicker than the lines
+ of normal wires, while for symbols consisting of lines (but not
+ wires) it may look nice to make them thicker. An example is the
+ |make contact| symbol.
+
+ Compare
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC,circuit symbol lines/.style={draw,very thick}]
+ \draw (0,0) to [capacitor={near start},
+ make contact={near end}] (3,0);
+\end{codeexample}
+ %
+ to
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC,circuit symbol wires/.style={draw,very thick}]
+ \draw (0,0) to [capacitor={near start},
+ make contact={near end}] (3,0);
+\end{codeexample}
+ \end{stylekey}
+\end{itemize}
+
+All circuit environments like |circuit logic IEC| mainly use options like
+|set and gate graphic=...| to set up the graphics used for a certain symbol. It
+turns out that graphic hidden in the ``|...|'' part is also always available as
+a separate style, whose name contains the library's initials. For instance, the
+|circuit logic IEC| option actually contains the following command:
+%
+\begin{codeexample}[code only]
+ set and gate graphic = and gate IEC graphic,
+\end{codeexample}
+%
+The |and gate IEC graphic| style, in turn, is defined as follows:
+%
+\begin{codeexample}[code only]
+\tikzset{and gate IEC graphic/.style=
+ {
+ circuit symbol open,
+ circuit symbol size=width 2.5 height 4,
+ shape=and gate IEC,
+ inner sep=.5ex
+ }
+}
+\end{codeexample}
+
+Normally, you do not need to worry about this, since you will not need to
+access a style like |and gate IEC graphic| directly; you will only use the
+|and gate| key. However, sometimes libraries define \emph{variants} of a
+graphic; for instance, there are two variants for the resistor graphic in the
+IEC library. In this case you can set the graphic for the resistor to this
+variant (or back to the original) by saying |set resistor graphic| yourself:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit ee IEC]
+ % Standard resistor
+ \draw (0,2) to [resistor] (3,2);
+
+ % Var resistor
+ \begin{scope}[set resistor graphic=var resistor IEC graphic]
+ \draw (0,1) to [resistor] (3,1);
+
+ % Back to original
+ \draw [set resistor graphic=resistor IEC graphic]
+ (0,0) to [resistor] (3,0);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Logical Circuits}
+
+\subsubsection{Overview}
+
+A \emph{logical circuit} is a circuit that contains what we call \emph{logical
+gates} like an |and gate| or an |xor gate|. The logical libraries are intended
+to make it easy to draw such circuits.
+
+In the following, we first have a look at the different libraries that can be
+used in principle and how the symbols look like. Then we have a more detailed
+look at how the symbols are used. Finally, we discuss the implementation
+details.
+
+There are different ways of depicting logical gates, which is why there are
+different (sub-)libraries for drawing them. They provide the necessary
+graphical representations of the symbols declared in the following library:
+
+\begin{tikzlibrary}{circuits.logic}
+ This library declares the logical gate symbols, but does not provide the
+ symbol graphics. The library also defines the following key which, however,
+ is also only used indirectly, namely by other libraries:
+ %
+ \begin{key}{/tikz/circuit logic}
+ This style calls the keys |circuit| (which internally calls
+ |every circuit|, then it defines the |inputs| key and it calls the
+ |every circuit logic| key.
+ %
+ \begin{key}{/tikz/inputs=\meta{inputs}}
+ This key is defined only inside the scope of a |circuit logic|.
+ There, it has the same effect as |logic gate inputs|, described on
+ page~\pageref{logic-gate-inputs}.
+ \end{key}
+ %
+ \begin{stylekey}{/tikz/every circuit logic}
+ Use this key to configure the appearance of logical circuits.
+ \end{stylekey}
+ \end{key}
+\end{tikzlibrary}
+
+Since the |circuits.logic| library does not define any actual graphics, you need
+to use one of the following libraries, instead:
+
+\begin{pgflibrary}{circuits.logic.IEC}
+ This library provides graphics based on gates recommended by the
+ International Electrotechnical Commission. When you include this library,
+ you can use the following key to set up a scope that contains a logical
+ circuit where the gates are shown in this style.
+
+ \begin{key}{/tikz/circuit logic IEC}
+ This key calls |circuit logic| and installs the IEC-like graphics for
+ the logical symbols like |and gate|.
+
+ As explained in Section~\ref{section-theming-symbols}, for each graphic
+ symbol of the library there is also a style that stores this particular
+ appearance. These keys are called |and gate IEC graphic|,
+ |or gate IEC graphic|, and so on.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit logic IEC,
+ every circuit symbol/.style={
+ logic gate IEC symbol color=black,
+ fill=blue!20,draw=blue,very thick}]
+ \matrix[column sep=7mm]
+ {
+ \node (i0) {0}; & & \\
+ & \node [and gate] (a1) {}; & \\
+ \node (i1) {0}; & & \node [or gate] (o) {};\\
+ & \node [nand gate] (a2) {}; & \\
+ \node (i2) {1}; & & \\
+ };
+ \draw (i0.east) -- ++(right:3mm) |- (a1.input 1);
+ \draw (i1.east) -- ++(right:3mm) |- (a1.input 2);
+ \draw (i1.east) -- ++(right:3mm) |- (a2.input 1);
+ \draw (i2.east) -- ++(right:3mm) |- (a2.input 2);
+ \draw (a1.output) -- ++(right:3mm) |- (o.input 1);
+ \draw (a2.output) -- ++(right:3mm) |- (o.input 2);
+ \draw (o.output) -- ++(right:3mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{pgflibrary}
+
+\begin{pgflibrary}{circuits.logic.US}
+ This library provides graphics showing ``American'' logic gates. It defines
+ the following key:
+
+ \begin{key}{/tikz/circuit logic US}
+ This style calls |circuit logic| and installs US-like graphics for the
+ logical symbols like |and gate|. For instance, it says
+ %
+\begin{codeexample}[code only]
+set and gate graphic = and gate US graphic
+\end{codeexample}
+
+ Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit logic CDH,
+ tiny circuit symbols,
+ every circuit symbol/.style={
+ fill=white,draw}]
+ \matrix[column sep=7mm]
+ {
+ \node (i0) {0}; & & \\
+ & \node [and gate] (a1) {}; & \\
+ \node (i1) {0}; & & \node [or gate] (o) {};\\
+ & \node [nand gate] (a2) {}; & \\
+ \node (i2) {1}; & & \\
+ };
+ \draw (i0.east) -- ++(right:3mm) |- (a1.input 1);
+ \draw (i1.east) -- ++(right:3mm) |- (a1.input 2);
+ \draw (i1.east) -- ++(right:3mm) |- (a2.input 1);
+ \draw (i2.east) -- ++(right:3mm) |- (a2.input 2);
+ \draw (a1.output) -- ++(right:3mm) |- (o.input 1);
+ \draw (a2.output) -- ++(right:3mm) |- (o.input 2);
+ \draw (o.output) -- ++(right:3mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{pgflibrary}
+
+\begin{pgflibrary}{circuits.logic.CDH}
+ This library provides graphics based on the logic symbols used in A. Croft,
+ R. Davidson, and M. Hargreaves (1992), \emph{Engineering Mathematics},
+ Addison-Wesley, 82--95. They are identical to the US-style symbols, except
+ for the and- and nand-gates.
+
+ \begin{key}{/tikz/circuit logic CDH}
+ This key calls |circuit logic US| and installs the two special and- and
+ nand-gates, that is, it uses |set and gate graphic| with
+ |and gate CDH graphic| and likewise for nand-gates.
+ \end{key}
+\end{pgflibrary}
+
+Inside |circuit logic XYZ| scopes, you can now use the keys shown in
+Section~\ref{section-logic-symbols}. We have a more detailed look at one of
+them, all the other work the same way:
+
+\begin{key}{/tikz/and gate}
+ This key should be passed to a |node| command. It will cause the node to
+ ``look like'' an |and gate|, where the exact appearance of the gate is
+ dictated by the which circuit environment is used. To further configure the
+ appearance of the |and gate|, see Section~\ref{section-theming-symbols}.
+ %
+\begin{codeexample}[]
+\tikz [circuit logic IEC] \node [and gate] {$A$};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz [circuit logic US]
+{
+ \node [and gate,point down] {$A$};
+ \node [and gate,point down,info=center:$A$] at (1,0) {};
+}
+\end{codeexample}
+
+ \medskip\textbf{Inputs.}
+ Multiple inputs can be specified for a logic gate (provided they support
+ multiple inputs: a not gate -- also known as an inverter -- does not).
+ However, there is an upper limit for the number of inputs which has been
+ set to 1024, which should be \emph{way} more than would ever be needed.
+
+ The following key is used to configure the inputs. It is available only
+ inside a |circuit logic| environment.
+
+ \begin{key}{/tikz/inputs=\meta{input list} (initially \char`\{normal,normal\char`\})}
+ If a gate has $n$ inputs, the \meta{input list} should consists of $n$
+ letters, each being |i| for ``inverted'' or |n| for ``normal''.
+ Inverted gates will be indicated by a little circle. In any case the
+ anchors for the inputs will be set up appropriately, numbered from top
+ to bottom |input 1|, |input 2|, \ldots and so on. If the gate only
+ supports one input the anchor is simply called |input| with no
+ numerical index.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[circuit logic IEC]
+ \node[and gate,inputs={inini}] (A) {};
+ \foreach \a in {1,...,5}
+ \draw (A.input \a -| -1,0) -- (A.input \a);
+ \draw (A.output) -- ++(right:5mm);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ (This key is just a shorthand for |logic gate inputs|, described in detail
+ on page~\pageref{logic-gate-inputs}. There you will also find descriptions
+ of how to configure the size of the inverted circles and the way the symbol
+ size increases when there are too many inputs.)
+
+ \textbf{Output.}
+ Every logic gate has one anchor called |output|.
+\end{key}
+
+
+\subsubsection{Symbols: The Gates}
+\label{section-logic-symbols}
+
+The following table shows which symbols are declared by the main
+|circuits.logic| library and their appearance in the different sublibraries.
+\medskip
+
+\def\gateexamples#1{%
+ \texttt{#1}
+ \indexkey{#1} &
+ \tikz[baseline,circuit logic IEC] \node[#1,label=] {}; &
+ \tikz[baseline,circuit logic US] \node[#1] {}; &
+ \tikz[baseline,circuit logic CDH] \node[#1] {};
+}
+\begin{tabular}{lccc}
+ \emph{Key} & \emph{Appearance inside} & \emph{Appearance inside} & \emph{Appearance inside} \\
+ & |circuit logic IEC| & |circuit logic US| & |circuit logic CDH| \\
+ \gateexamples{/tikz/and gate}\\
+ \gateexamples{/tikz/nand gate}\\
+ \gateexamples{/tikz/or gate}\\
+ \gateexamples{/tikz/nor gate}\\
+ \gateexamples{/tikz/xor gate}\\
+ \gateexamples{/tikz/xnor gate}\\
+ \gateexamples{/tikz/not gate}\\
+ \gateexamples{/tikz/buffer gate}
+\end{tabular}
+
+
+\subsubsection{Implementation: The Logic Gates Shape Library}
+
+The previous sections described the \tikzname\ interface for creating logical
+circuits. In this section we take a closer look at the underlying \pgfname\
+libraries.
+
+Just as there are several \tikzname\ circuit libraries, there are two
+underlying \pgfname\ shape libraries, one for creating US-style gates and one
+for IEC-style gates. These libraries define \emph{shapes} only. It is the job
+of the circuit libraries to ``theme'' them so that they ``look nice''. However,
+in principle, you can also use these shapes directly.
+
+Let us begin with the base library that defines the handling of inputs.
+
+\begin{pgflibrary}{shapes.gates.logic}
+ This library defines common keys used by all logical gate shapes.
+
+ \begin{key}{/pgf/logic gate inputs=\meta{input list} (initially \char`\{normal,normal\char`\})}
+ \label{logic-gate-inputs}%
+ Specify the inputs for the logic gate. The keyword |inverted| indicates
+ an inverted input which will mean \pgfname{} will draw a circle
+ attached to the main shape of the logic gate. Any keyword that is not
+ |inverted| will be treated as a ``normal'' or ``non-inverted'' input
+ (however, for readability, you may wish to use |normal| or
+ |non-inverted|), and \pgfname{} will not draw the circle. In both cases
+ the anchors for the inputs will be set up appropriately, numbered from
+ top to bottom |input 1|, |input 2|, \ldots and so on. If the gate only
+ supports one input the anchor is simply called |input| with no
+ numerical index.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[minimum height=0.75cm]
+ \node[and gate IEC, draw, logic gate inputs={inverted, normal, inverted}]
+ (A) {};
+ \foreach \a in {1,...,3}
+ \draw (A.input \a -| -1,0) -- (A.input \a);
+ \draw (A.output) -- ([xshift=0.5cm]A.output);
+\end{tikzpicture}
+\end{codeexample}
+
+ For multiple inputs it may be somewhat unwieldy to specify a long list,
+ thus, the following ``shorthand'' is permitted (this is an extension of
+ ideas due to Jürgen Werber and Christoph Bartoschek): Using |i| for
+ inverted and |n| for normal inputs, \meta{input list} can be specified
+ \emph{without the commas}. So, for example, |ini| is equivalent to
+ |inverted, normal, inverted|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[minimum height=0.75cm]
+ \node[or gate US, draw,logic gate inputs=inini] (A) {};
+ \foreach \a in {1,...,5}
+ \draw (A.input \a -| -1,0) -- (A.input \a);
+ \draw (A.output) -- ([xshift=0.5cm]A.output);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The height of the gate may be increased to accommodate the number of
+ inputs. In fact, it depends on three variables: $n$, the number of inputs,
+ $r$, the radius of the circle used to indicate an inverted input and $s$,
+ the distance between the centers of the inputs. The default height is then
+ calculated according to the expression $(n+1)\times\max(2r,s)$. This then
+ may be increased to accommodate the node contents or any minimum size
+ specifications.
+
+ The radius of the inverted input circle and the distance between the
+ centers of the inputs can be customized using the following keys:
+
+ \begin{key}{/pgf/logic gate inverted radius=\meta{length} (initially 2pt)}
+ Set the radius of the circle that is used to indicate inverted inputs.
+ This is also the radius of the circle used for the inverted output of
+ the |nand|, |nor|, |xnor| and |not| gates.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[minimum height=0.75cm]
+ \tikzset{every node/.style={shape=nand gate CDH, draw, logic gate inputs=ii}}
+ \node[logic gate inverted radius=2pt] {A};
+ \node[logic gate inverted radius=4pt] at (0,-1) {B};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/logic gate input sep=\meta{length} (initially .125cm)}
+ Set the distance between the \emph{centers} of the inputs to the logic
+ gate.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[minimum size=0.75cm]
+ \draw [help lines] grid (3,2);
+ \tikzset{every node/.style={shape=and gate IEC, draw, logic gate inputs=ini}}
+ \node[logic gate input sep=0.33333cm] at (1,1)(A) {A};
+ \node[logic gate input sep=0.5cm] at (3,1) (B) {B};
+ \foreach \a in {1,...,3}
+ \draw (A.input \a -| 0,0) -- (A.input \a)
+ (B.input \a -| 2,0) -- (B.input \a);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \pgfname{} will increase the size of the logic gate to accommodate the
+ number of inputs, and the size of the inverted radius and the separation
+ between the inputs. However with all shapes in this library, any increase
+ in size (including any minimum size requirements) will be applied so that
+ the default aspect ratio is unaltered. This means that changing the height
+ will change the width and vice versa.
+\end{pgflibrary}
+
+
+\subsubsection{Implementation: The US-Style Logic Gates Shape Library}
+
+\begin{pgflibrary}{shapes.gates.logic.US}
+ This library provides ``American'' logic gate shapes whose names are
+ suffixed with the identifier |US|. Additionally, alternative |and| and
+ |nand| gates are provided which are based on the logic symbols used in A.
+ Croft, R. Davidson, and M. Hargreaves (1992), \emph{Engineering
+ Mathematics}, Addison-Wesley, 82--95. These two shapes are suffixed with
+ |CDH|.
+
+ The ``compass point'' anchors apply to the main part of the shape and do
+ not include any inverted inputs or outputs. This library provides an
+ additional feature to facilitate the relative positioning of logic gates:
+
+ \begin{key}{/pgf/logic gate anchors use bounding box=\meta{boolean} (initially false)}
+ When set to |true| this key will ensure that the compass point anchors
+ use the bounding rectangle of the main shape, which, ignore any
+ inverted inputs or outputs, but includes any |outer sep|. This
+ \emph{only} affects the compass point anchors and is not set on a shape
+ by shape basis: whether the bounding box is used is determined by value
+ of this key when the anchor is accessed.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[minimum height=1.5cm]
+ \node[xnor gate US, draw, gray!50,line width=2pt] (A) {};
+ \foreach \x/\y/\z in {false/blue/1pt, true/red/2pt}
+ \foreach \a in {north, south, east, west, north east,
+ south east, north west, south west}
+ \draw[logic gate anchors use bounding box=\x, color=\y]
+ (A.\a) circle(\z);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ The library defines a number of shapes. For each shape the allowed number
+ of inputs is also shown:
+ %
+ \begin{itemize}
+ \item |and gate US|, two or more inputs
+ \item |and gate CDH|, two or more inputs
+ \item |nand gate US|, two or more inputs
+ \item |nand gate CDH|, two or more inputs
+ \item |or gate US|, two or more inputs
+ \item |nor gate US|, two or more Inputs
+ \item |xor gate US|, two inputs
+ \item |xnor gate US|, two inputs
+ \item |not gate US|, one input
+ \item |buffer gate US|, one input
+ \end{itemize}
+
+ In the following, we only have a detailed look at the anchors defined by
+ one of them. We choose the |nand gate US| because it shows all the
+ ``interesting'' anchors.
+
+ \begin{shape}{nand gate US}
+ This shape is a nand gate, which supports two or more inputs. If less
+ than two inputs are specified an error will result. The anchors for
+ this gate with two non-inverted inputs (using the normal compass point
+ anchors) are shown below. Anchor |30| is an example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=nand gate US,shape example, inner sep=0cm,
+ logic gate inputs={in},
+ logic gate inverted radius=.5cm] {Nand Gate\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {center/above, text/above, 30/above right,
+ mid/right, mid east/left, mid west/above,
+ base/below, base east/below, base west/left,
+ north/above, south/below, east/above, west/above,
+ north east/above, south east/below, south west/below, north west/above,
+ output/right, input 1/above, input 2/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+
+ (For the definition of the |shape example| style, see
+ Section~\ref{section-libs-shapes}.)
+ \end{shape}
+\end{pgflibrary}
+
+
+\subsubsection{Implementation: The IEC-Style Logic Gates Shape Library}
+
+\begin{pgflibrary}{shapes.gates.logic.IEC}
+ This library provides rectangular logic gate shapes. These shapes are
+ suffixed with |IEC| as they are based on gates recommended by the
+ International Electrotechnical Commission.
+
+ By default each gate is drawn with a symbol, $\char`\&$ for |and| and
+ |nand| gates, $\geq1$ for |or| and |nor| gates, $1$ for |not| and |buffer|
+ gates, and $=1$ for |xor| and |xnor| gates. These symbols are drawn
+ automatically (internally they are drawn using the ``foreground'' path),
+ and are not strictly speaking part of the node contents. However, the gate
+ is enlarged to make sure the symbols are within the border of the node. It
+ is possible to change the symbols and their position within the node using
+ the following keys:
+
+ \begin{key}{/pgf/and gate IEC symbol=\meta{text} (initially \char`\\char\char`\`\char`\\\char`\&)}
+ Set the symbol for the |and gate|. Note that if the node is filled,
+ this color will be used for the symbol, making it invisible, so it will
+ be necessary set \meta{text} to something like |\color{black}\char`\&|.
+ Alternatively, the |logic gate IEC symbol color| key can be used to set
+ the color of all symbols simultaneously.
+
+ In \tikzname, when the |use IEC style logic gates| key has been used,
+ this key can be replaced by |and gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/nand gate IEC symbol=\meta{text} (initially \char`\\char\char`\`\char`\\\char`\&)}
+ Set the symbol for the |nand gate|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |nand gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/or gate IEC symbol=\meta{text} (initially \char`\$\char`\\geq1\char`\$)}
+ Set the symbol for the |or gate|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |or gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/nor gate IEC symbol=\meta{text} (initially \char`\$\char`\\geq1\char`\$)}
+ Set the symbol for the |nor gate|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |nor gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/xor gate IEC symbol=\meta{text} (initially \char`\{\char`\$=1\char`\$\char`\})}
+ Set the symbol for the |xor gate|. Note the necessity for braces, as
+ the symbol contains |=|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |xor gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/xnor gate IEC symbol=\meta{text} (initially \char`\{\char`\$=1\char`\$\char`\})}
+ Set the symbol for the |xnor gate|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |xnor gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/not gate IEC symbol=\meta{text} (initially 1)}
+ Set the symbol for the |not gate|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |not gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/buffer gate IEC symbol=\meta{text} (initially 1)}
+ Set the symbol for the |buffer gate|. In \tikzname, when the
+ |use IEC style logic gates| key has been used, this key can be replaced
+ by |buffer gate symbol|.
+ \end{key}
+
+ \begin{key}{/pgf/logic gate IEC symbol align=\meta{align} (initially top)}
+ Set the alignment of the logic gate symbol (in \tikzname, when the
+ |use IEC style logic gates| key has been used, |IEC| can be omitted).
+ The specification in \meta{align} is a comma separated list from |top|,
+ |bottom|, |left| or |right|. The distance between the border of the
+ node and the outer edge of the symbol is determined by the values of
+ the |inner xsep| and |inner ysep|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[minimum size=1cm, use IEC style logic gates]
+ \tikzset{every node/.style={nor gate, draw}}
+ \node (A) at (0,1.5) {};
+ \node [logic gate symbol align={bottom, right}] (B) at (0,0) {};
+ \foreach \g in {A, B}{
+ \foreach \i in {1,2}
+ \draw ([xshift=-0.5cm]\g.input \i) -- (\g.input \i);
+ \draw (\g.output) -- ([xshift=0.5cm]\g.output);
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/logic gate IEC symbol color=\meta{color}}
+ This key sets the color for all symbols simultaneously. This color can
+ be overridden on a case by case basis by specifying a color when
+ setting the symbol text.
+ \end{key}
+
+ The library defines the following shapes:
+ %
+ \begin{itemize}
+ \item |and gate IEC|, two or more inputs
+ \item |nand gate IEC|, two or more inputs
+ \item |or gate IEC|, two or more inputs
+ \item |nor gate IEC|, two or more inputs
+ \item |xor gate IEC|, two inputs
+ \item |xnor gate IEC|, two inputs
+ \item |not gate IEC|, one input
+ \item |buffer gate IEC|, one input
+ \end{itemize}
+
+ Again, we only have a look at the nand-gate in more detail:
+
+ \begin{shape}{nand gate IEC}
+ This shape is a nand gate. It supports two or more inputs. If less than
+ two inputs are specified an error will result. The anchors for this
+ gate with two inverted inputs are shown below. Anchor |30| is an
+ example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=nand gate IEC ,shape example, inner xsep=1cm, inner ysep=1cm,
+ minimum height=6cm, nand gate IEC symbol=\color{black!30}\char`\&,
+ logic gate inputs={in},
+ logic gate inverted radius=0.65cm]
+ {Nand Gate\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {center/above, text/above, 30/above right,
+ mid/right, mid east/left, mid west/above,
+ base/below, base east/below, base west/left,
+ north/above, south/below, east/above, west/above,
+ north east/above, south east/below, south west/below, north west/above,
+ output/right, input 1/above, input 2/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ \end{shape}
+\end{pgflibrary}
+
+
+\subsection{Electrical Engineering Circuits}
+
+\subsubsection{Overview}
+
+An \emph{electrical engineering circuit} contains symbols like resistors or
+capacitors or voltage sources and annotations like the two arrows pointing
+toward an element whose behaviour is light dependent. The electrical
+engineering libraries, abbreviated ee-libraries, provide such symbols and
+annotations.
+
+Just as for logical gates, there are different ways of drawing ee-symbols.
+Currently, there is one main library for drawing circuits, which uses the
+graphics from the International Electrotechnical Commission, but you can add
+your own libs. This is why, just as for logical gates, there is a base library
+and more specific libraries.
+
+\begin{tikzlibrary}{circuits.ee}
+ This library declares the ee symbols, but (mostly) does not provide the
+ symbol graphics, which is left to the sublibraries. Just like the logical
+ gates library, a key is defined that is normally only used internally:
+ %
+ \begin{key}{/tikz/circuit ee}
+ This style calls the keys |circuit| (which internally calls
+ |every circuit| and the following style:
+ %
+ \begin{stylekey}{/tikz/every circuit ee}
+ Use this key to configure the appearance of logical circuits.
+ \end{stylekey}
+ \end{key}
+
+ The library also declares some standard annotations and units.
+\end{tikzlibrary}
+
+As for logical circuits, to draw a circuit the first step is to include a
+library containing the symbols graphics. Currently, you have to include
+|circuits.ee.IEC|.
+
+\begin{tikzlibrary}{circuits.ee.IEC}
+ When this library is loaded, you can use the following style:
+ %
+ \begin{key}{/tikz/circuit ee IEC}
+ This style calls |circuit ee| and installs the IEC-like graphics for
+ the logical symbols like |resistor|.
+ \end{key}
+\end{tikzlibrary}
+
+Inside the |circuit ee IEC| scope, you can now use the keys for symbols, units,
+and annotations listed in the later sections. We have a more detailed look at
+one of each of them, all the others work the same way.
+
+Let us start with an example of a symbol: the resistor symbol. The other
+predefined symbols are listed in Section~\ref{section-circuits-ee-symbols} and
+later sections.
+
+\begin{key}{/tikz/resistor=\opt{\meta{options}}}
+ This key should be used with a |node| path command or with the |to| path
+ command.
+
+ \medskip\textbf{Using the Key with Normal Nodes.}
+ When used with a node, it will cause this node to ``look like'' a resistor
+ (by default, in the IEC library, this is just a simple rectangle).
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \node [resistor] {};
+\end{codeexample}
+
+ Unlike normal nodes, a resistor node generally should not take any text (as
+ in |node [resistor] {foo}|). Instead, the labeling of resistors should be
+ done using the |label|, |info| and |ohm| options.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \node [resistor,ohm=5] {};
+\end{codeexample}
+
+ The \meta{options} make no real sense when the |resistor| option is used
+ with a normal node, you can just as well given them to the |node| itself.
+ Thus, the following has the same effect as the above example:
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \node [resistor={ohm=5}] {};
+\end{codeexample}
+
+ In a circuit, you will often wish to rotate elements. For this, the options
+ |point up|, |point down|, |point left| or |point right| may be especially
+ useful. They are just shorthands for appropriate rotations like
+ |rotate=90|.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] {
+ \node (R1) [resistor,point up,ohm=5] at (3,1) {};
+ \node (R2) [resistor,ohm=10k] at (0,0) {};
+ \draw (R2) -| (R1);
+}
+\end{codeexample}
+
+ \medskip\textbf{Using the Key on a To Path.}
+ When the |resistor| key is used on a |to| path inside a |circuit ee IEC|,
+ the |circuit handle symbol| key is called internally. This has a whole
+ bunch of effects:
+ %
+ \begin{enumerate}
+ \item The path currently being constructed is cut up to make place for
+ a node.
+ \item This node will be a |resistor node| that is rotated so that it
+ points ``along'' the path (unless an option like |shift only| or an
+ extra rotation is used to change this).
+ \item The \meta{options} passed to the |resistor| key are passed on to
+ the node.
+ \item The \meta{options} are pre-parsed to identify a |pos| key or a
+ key like |at start| or |midway|. These keys are used to determine
+ where on the |to| path the node will lie.
+ \end{enumerate}
+
+ Since the \meta{options} of the |resistor| key are passed on to the
+ resistor node on the path, you can use it to add labels to the node. Here
+ is a simple example:
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \draw (0,0) to [resistor=red] (3,0)
+ to [resistor={ohm=2\mu}] (3,2);
+\end{codeexample}
+
+ You can add multiple labels to a resistor and you can have multiple
+ resistors (or other elements) on a single path.
+
+ \medskip\textbf{Inputs, Outputs, and Anchors.}
+ Like the logical gates, all ee-symbols have an |input| and an |output|
+ anchor. Special-purpose-nodes may have even more anchors of this type.
+ Furthermore, the ee-symbols-nodes also have four standard compass direction
+ anchors.
+
+ \medskip\textbf{Changing the Appearance.}
+ To configure the appearance of all |resistor|s, see
+ Section~\ref{section-theming-symbols}. You can use the \meta{options} to
+ locally change the appearance of a single resistor.
+\end{key}
+
+Let us now have a look at an example of a unit: the Ohm unit. The other
+predefined units are listed in Section~\ref{section-circuits-units}.
+
+\begin{key}{/tikz/ohm=\meta{value}}
+ This key is used to add an |info| label to a node with a special text:
+ |$\mathrm{|\meta{value}|\Omega}$|. In other words, the |ohm| key can only
+ be used with the options of a node and, when used, it will cause the
+ \meta{value} to be placed next to the node, followed by $\Omega$. Since the
+ \meta{value} is typeset inside a |\mathrm| command, when you write |ohm=5k|
+ you get $\mathrm{5k\Omega}$, |ohm=5p| yields $\mathrm{5p\Omega}$, and
+ |ohm=5.6\cdot 10^{2}\mu| yields $\mathrm{5.6\cdot 10^{2}\mu\Omega}$.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \draw (0,0) to [resistor={ohm=5M}] (0,2);
+\end{codeexample}
+
+ Instead of |ohm| you can also use |ohm'|, which places the label on the
+ other side.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \draw (0,0) to [resistor={ohm'=5M}] (0,2);
+\end{codeexample}
+
+ Finally, there are also keys |ohm sloped| and |ohm' sloped| for having the
+ info label rotate together with the main node.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+ \draw (0,0) to [resistor={ohm sloped=5M}] (0,2)
+ (2,0) to [resistor={ohm' sloped=6f}] (2,2);
+\end{codeexample}
+
+ You can configure the appearance of an Ohm info label using the key
+ |every ohm|.
+\end{key}
+
+Finally, let us have a look at an annotation: the |light emitting| annotation.
+The other predefined units are listed in
+Section~\ref{section-circuits-annotations}.
+
+\begin{key}{/tikz/light emitting=\opt{\meta{options}}}
+ Like a unit, an annotation should be given as an additional option to a
+ node. It causes some drawings (in this case, two parallel lines) to be
+ placed next to the node.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC] \draw (0,0) to [diode=light emitting] (2,0);
+\end{codeexample}
+
+ The \meta{options} can be used for three different things:
+ %
+ \begin{enumerate}
+ \item You can use keys like |red| to change the appearance of this
+ annotation, locally.
+ \item You can use keys like |<-| or |-latex| to change the direction
+ and kinds of arrows used in the annotation.
+ \item You can use info labels like |ohm=5| or |info=foo| inside the
+ \meta{options}. These info labels will be added to the main node
+ (not to the annotation itself), but the label distance will have
+ been changed to accommodate for the space taken up by the
+ annotation.
+ %
+\begin{codeexample}[]
+\tikz [circuit ee IEC]
+{
+ \draw (0,2) to [diode={light emitting,info=not good}] (2,2);
+ \draw (0,0) to [diode={light emitting={info=better},
+ info'=also good}] (2,0);
+}
+\end{codeexample}
+ \end{enumerate}
+
+ In addition to |light emitting| there is also a key called
+ |light emitting'|, which simply places the annotation on the other side of
+ the node.
+
+ You can configure the appearance of annotations in three ways:
+ %
+ \begin{itemize}
+ \item You can set the |every circuit annotation| style.
+ \item You can set the |every light emitting| style.
+ \item You can set the following key:
+ %
+ \begin{stylekey}{/tikz/annotation arrow}
+ This style should set the default |>| arrow to some nice value.
+ \end{stylekey}
+ \end{itemize}
+\end{key}
+
+\def\eelineexample#1#2{%
+ \texttt{#1}\indexkey{#1}
+ &
+ \tikz[baseline=-.5ex,circuit ee IEC] \draw (0,0) to [#1] (3,0);
+ &
+ \relax\def\temp{#2}
+ \ifx\temp\empty\else
+ {\tikz[baseline=-.5ex,circuit ee IEC,set #2 graphic=var #2 IEC graphic]
+ \draw (0,0) to [#2] (3,0);}
+ \fi \\[.2em]
+}
+\def\eeendexample#1#2{%
+ \texttt{#1}\indexkey{#1}
+ &
+ \tikz[baseline=-.5ex,circuit ee IEC] \draw (0,0) to [#1={at end}] (1.5,0)(3,0);
+ &
+ \relax\def\temp{#2}
+ \ifx\temp\empty\else
+ {\tikz[baseline=-.5ex,circuit ee IEC,set #2 graphic=var #2 IEC graphic]
+ \draw (0,0) to [#2={at end}] (1.5,0)(3,0);}
+ \fi \\[.2em]
+}
+\def\unitexample#1{%
+ \texttt{#1}\indexkey{#1}
+ &
+ \tikz [baseline,inner sep=0pt] \node[#1=1] {};\\
+}
+\def\annotationexample#1{%
+ \texttt{#1}\indexkey{#1}
+ &
+ \tikz[baseline=-.5ex,circuit ee IEC]
+ \draw (0,0) to [resistor={#1}] (2,0)
+ to [diode ={#1'}] (4,0);\\
+}
+\def\empty{}
+
+
+\subsubsection{Symbols: Indicating Current Directions}
+\label{section-ee-symbols}
+\label{section-circuits-ee-symbols}
+
+There \todosp{why two labels? The first doesn't seem to be used.} are two
+symbols for indicating current directions. These symbols are defined directly
+inside |circuit ee|.
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}ll}
+ \emph{Key} & \emph{Appearance}\\[.25em]
+ \eelineexample{/tikz/current direction}{}
+ \eelineexample{/tikz/current direction'}{}
+\end{tabular}
+
+\medskip
+The examples have been produced by (in essence)
+|\draw (0,0) to[|\meta{symbol name}|] (3,0);|.
+
+
+\subsubsection{Symbols: Basic Elements}
+
+The following table show basic symbols as they are depicted inside the
+|circuit ee IEC| environment. To install one of alternate graphics, you have to
+say |set| \meta{symbol name} |graphic=var| \meta{symbol name} |IEC graphic|.
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}ll}
+ \emph{Key} & \emph{Appearance} & \emph{Alternate appearance} \\[.25em]
+ \eelineexample{/tikz/resistor}{resistor}
+ \eelineexample{/tikz/inductor}{inductor}
+ \eelineexample{/tikz/capacitor}{}
+ \eelineexample{/tikz/battery}{}
+ \eelineexample{/tikz/bulb}{}
+ \eelineexample{/tikz/current source}{}
+ \eelineexample{/tikz/voltage source}{}
+ \eelineexample{/tikz/ac source}{}
+ \eelineexample{/tikz/dc source}{}
+ \eeendexample{/tikz/ground}{}
+\end{tabular}
+
+
+\subsubsection{Symbols: Diodes}
+
+The following table shows diodes as they are depicted inside the
+|circuit ee IEC| environment.
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}ll}
+ \emph{Key} & \emph{Appearance} & \emph{Alternate appearance} \\[.25em]
+ \eelineexample{/tikz/diode}{diode}
+ \eelineexample{/tikz/Zener diode}{Zener diode}
+ \eelineexample{/tikz/Schottky diode}{Schottky diode}
+ \eelineexample{/tikz/tunnel diode}{tunnel diode}
+ \eelineexample{/tikz/backward diode}{backward diode}
+ \eelineexample{/tikz/breakdown diode}{breakdown diode}
+\end{tabular}
+
+
+\subsubsection{Symbols: Contacts}
+
+The following table shows contacts as they are depicted inside the
+|circuit ee IEC| environment.
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}ll}
+ \emph{Key} & \emph{Appearance} & \emph{Alternate appearance} \\[.25em]
+ \eelineexample{/tikz/contact}{}
+ \eelineexample{/tikz/make contact}{make contact}
+ \eelineexample{/tikz/break contact}{}
+\end{tabular}
+
+
+\subsubsection{Symbols: Measurement devices}
+
+The following table shows measurement devices as they are depicted inside the
+|circuit ee IEC| environment.
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}ll}
+ \emph{Key} & \emph{Appearance} \\[.25em]
+ \eelineexample{/tikz/amperemeter}{}
+ \eelineexample{/tikz/voltmeter}{}
+ \eelineexample{/tikz/ohmmeter}{}
+\end{tabular}
+
+
+\subsubsection{Units}
+\label{section-circuits-units}
+
+The |circuits.ee| library predefines the following unit keys:
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}c}
+ \emph{Key} & \emph{Appearance of $1$ unit} \\[.25em]
+ \unitexample{/tikz/ampere}
+ \unitexample{/tikz/volt}
+ \unitexample{/tikz/ohm}
+ \unitexample{/tikz/siemens}
+ \unitexample{/tikz/henry}
+ \unitexample{/tikz/farad}
+ \unitexample{/tikz/coulomb}
+ \unitexample{/tikz/voltampere}
+ \unitexample{/tikz/watt}
+ \unitexample{/tikz/hertz}
+\end{tabular}
+
+
+\subsubsection{Annotations}
+\label{section-circuits-annotations}
+
+The |circuits.ee.IEC| library defines the following annotations:
+\medskip
+
+\noindent
+\begin{tabular}{p{5cm}ll}
+ \emph{Key} & \emph{Appearance} \\[.25em]
+ \annotationexample{/tikz/light emitting}
+ \annotationexample{/tikz/light dependent}
+ \annotationexample{/tikz/direction info}
+ \annotationexample{/tikz/adjustable}
+\end{tabular}
+\medskip
+
+The lines have been produced using, in essence,
+%
+\begin{codeexample}[code only]
+\draw (0,0) to [resistor=light emitting] (2,0) to [diode=light emitting'] (4,0);
+\end{codeexample}
+%
+and similarly for the other annotations.
+
+
+\subsubsection{Implementation: The EE-Symbols Shape Library}
+
+The \tikzname\ libraries depend on two shape libraries, which are included
+automatically. Usually, you will not need to use these shapes directly.
+
+\begin{pgflibrary}{shapes.gates.ee}
+ This library defines basic shapes that can be used by all ee-circuit
+ libraries. Currently, it defines the following shapes:
+ %
+ \begin{itemize}
+ \item |rectangle ee|
+ \item |circle ee|
+ \item |direction ee|
+ \end{itemize}
+ %
+ Additionally, the library defines the following arrow tip: The
+ |direction ee| arrow tip is basically the same as a |triangle 45| arrow tip
+ with rounded joins.
+
+ \begin{tabular}{ll}
+ \symarrow{direction ee}
+ \end{tabular}
+
+ However, unlike normal arrow tips, its size does \emph{not} depend on the
+ current line width. Rather, it depends on the value of its arrow options,
+ which should be set to the desired size. Thus, you should say something
+ like |\pgfsetarrowoptions{direction ee}{5pt}| to set the size of the arrow.
+\end{pgflibrary}
+
+\begin{shape}{rectangle ee}
+ This shape is completely identical to a normal |rectangle|, only there are
+ two additional anchors: The |input| anchor is an alias for the |west|
+ anchor, while the |output| anchor is an alias for the |east| anchor.
+\end{shape}
+
+\begin{shape}{circle ee}
+ Like the |rectangle ee| shape, only for circles.
+\end{shape}
+
+\begin{shape}{direction ee}
+ This shape is rather special. It is intended to be used to ``turn an arrow
+ tip into a shape''. First, you should set the following key to the name of
+ an arrow tip:
+ %
+ \begin{key}{/pgf/direction ee arrow=\meta{right arrow tip name}}
+ The value of this key will be used for the arrow tip depicted in an
+ |direction ee| shape.
+ \end{key}
+ %
+ When a node of shape |direction ee| is created, several things happen:
+ %
+ \begin{enumerate}
+ \item The size of the shape is computed according to the following
+ rules: The width of the shape is set up so that the left border of
+ the shape is at the left end of the arrow tip and the right border
+ is at the right end of the arrow tip. These left and right ``ends''
+ of the arrow are the tip end and the back end specified by the
+ arrow itself (see Section~\ref{section-arrow-terminology} for
+ details). You usually need not worry about this width setting.
+
+ By comparison, the height of the arrow is given by the current
+ setting of |minimum height|. Thus, this key must have been set up
+ correctly to reflect the ``real'' height of the arrow tip. The
+ reason is that the height of an arrow is not specified when arrows
+ are declared and is, thus, not available, here.
+
+ Possibly, the height computation will change in the future to
+ reflect the real height of the arrow, so you should generally set
+ up the |minimum height| to be the same as the real height.
+ \item A straight line from left to right inside the shape's boundaries
+ is added to the background path.
+ \item The arrow tip, pointing right, is drawn before the background
+ path.
+ \end{enumerate}
+ %
+ The anchors of this shape are just the compass anchors, which lie on a
+ rectangle whose width and height are the above-computed height and width.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfsetarrowoptions{direction ee}{6cm}
+ \node[name=s,shape=direction ee,shape example,minimum height=0.7654*6cm] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[direction ee arrow=angle 45]
+ \node[name=s,shape=direction ee,shape example,minimum height=1.75cm] {};
+ \foreach \anchor/\placement in {north/above, south/below,
+ output/right, input/left}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+\subsubsection{Implementation: The IEC-Style EE-Symbols Shape Library}
+
+\begin{pgflibrary}{shapes.gates.ee.IEC}
+ This library defines shapes for depicting ee symbols according to the IEC
+ recommendations. These shapes will typically be used in conjunction with
+ the graphic mechanism detailed earlier, but you can also used them
+ directly.
+\end{pgflibrary}
+
+\begin{shape}{generic circle IEC}
+ This shape inherits from |circle ee|, which in turn is just a normal
+ |circle| with additional |input| and |output| anchors at the left and right
+ ends. However, additionally, this shape allows you to specify a path that
+ should be added before the background path using the following key:
+ %
+ \begin{key}{/pgf/generic circle IEC/before background=\meta{code}}
+ When a node of shape |generic circle IEC| is created, the current
+ setting of this key is used as the ``before background path''. This
+ means that after the circle's background has been
+ drawn/filled/whatever, the \meta{code} is executed.
+
+ When the \meta{code} is executed, the coordinate system will have been
+ transformed in such a way that the point $(1\mathrm{pt},0\mathrm{pt})$
+ lies at the right end of the circle and $(0\mathrm{pt},1\mathrm{pt})$
+ lies at the top of the circle. (More precisely, these points will lie
+ exactly on the middle of the radial line.)
+ \end{key}
+ %
+ Here is an examples of how to use this shape:
+ %
+\begin{codeexample}[]
+\tikz \node [generic circle IEC,
+ /pgf/generic circle IEC/before background={
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{1pt}{0pt}}
+ \pgfpathlineto{\pgfpoint{0pt}{1pt}}
+ \pgfpathlineto{\pgfpoint{-0.5pt}{-0.5pt}}
+ \pgfusepathqstroke
+ },
+ draw] {Hello world};
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{generic diode IEC}
+ This shape is used to depict diodes. The main shape is taken up by a
+ ``right pointing'' triangle. The anchors are positioned on the border of a
+ rectangle around the diode, see the below example. The diode's size is
+ based on the current settings of |minimum width| and |minimum height|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[name=s,shape=generic diode IEC,shape example,minimum size=6cm] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+
+ This shape, like the |generic circle IEC| shape, is generic in the sense
+ that there is a special key that is used for the before background
+ drawings:
+ %
+ \begin{key}{/pgf/generic diode IEC/before background=\meta{code}}
+ Similarly to the |generic circle IEC| shape, when a node of shape
+ |generic diode IEC| is created, the current setting of this key is used
+ as the ``before background path''. When the \meta{code} is executed,
+ the coordinate system will have been transformed in such a way that the
+ origin is at the ``tip'' of the diode's triangle, the point
+ $(0\mathrm{pt},1\mathrm{pt})$ is exactly half the diode's height above
+ this origin, and the point $(1\mathrm{pt},0\mathrm{pt})$ is half the
+ diode's height to the right of the origin.
+
+ The idea is that you use this key to draw different kinds of diode
+ endings.
+ %
+\begin{codeexample}[]
+\tikz \node [minimum size=1cm,generic diode IEC,
+ /pgf/generic diode IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{.5pt}{-1pt}}
+ \pgfpathmoveto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{1pt}}
+ \pgfpathlineto{\pgfqpoint{.5pt}{1pt}}
+ \pgfusepathqstroke
+ },
+ draw] {};
+\end{codeexample}
+ \end{key}
+\end{shape}
+
+\begin{shape}{breakdown diode IEC}
+ This shape is used to depict a bidirectional breakdown diode. The diode's
+ size is based on the current settings of |minimum width| and
+ |minimum height|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[name=s,shape=breakdown diode IEC,shape example,minimum width=6cm,minimum height=4cm] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{var resistor IEC}
+ This shape is used to depict a variant version of a resistor. Its size is
+ computed as for a rectangle (thus, its size depends things like the
+ |minimum height|). Then, inside this rectangle, a background path is set up
+ according to the following rule: Starting from the left end, zigzag
+ segments are added to the path. Each segment consists of a line at a 45
+ degree angle going up to the top of the rectangle, then going down to the
+ bottom, then going up to mid height of the node. As many segments as
+ possible are put inside as possible. The last segment is then connected to
+ the output anchor via a straight line.
+
+ All of this means that, in general, the shape should be much wider than
+ high.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[name=s,shape=var resistor IEC,shape example,minimum width=7cm,minimum height=1cm] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{inductor IEC}
+ This shape is used to depict an inductor, using a bumpy line. Its size is
+ computed as follows: Any text and |inner sep| are ignored (and should
+ normally not be given). The |minimum height| plus (twice) the |outer ysep|
+ specify the distance between the |north| and |south| anchors, similarly for
+ the |minimum width| plus the |outer xsep| for the |east| and |west|. The
+ bumpy line is drawn starting from the lower left corner to the lower right
+ corner with bumps being half-circles whose height is exactly the
+ |minimum height|. The |center| of the shape is just above the |south|
+ anchor, at a distance of the |outer ysep|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[name=s,shape=inductor IEC,shape example,minimum width=7cm,minimum height=1cm] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Just as for a |var resistor IEC|, as many bumps as possible are added and
+ the last bump is connected to the output anchor via a straight line.
+\end{shape}
+
+\begin{shape}{capacitor IEC}
+ This shape is based on a |rectangle ee|. However, instead of a rectangle as
+ the background path, only the ``left and right lines'' that make up the
+ rectangle are drawn.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[name=s,shape=capacitor IEC,shape example,
+ minimum width=2cm,minimum height=3cm,inner sep=0pt] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{battery IEC}
+ This shape is similar to a |capacitor IEC|, however, the right line is only
+ half the height of the left line.
+ %
+\begin{codeexample}[]
+\tikz \node[shape=battery IEC,shape example,minimum size=2cm,
+ inner sep=0pt] {};
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{ground IEC}
+ This shape is similar to a |batter IEC|, only three lines of different
+ heights are drawn.
+ %
+\begin{codeexample}[]
+\tikz \node[shape=ground IEC,shape example,minimum size=2cm,
+ inner sep=0pt] {};
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{make contact IEC}
+ This shape consists of a line going from the lower left corner to the upper
+ right corner. The size and anchors of this shape are computed in the same
+ way as for an |inductor IEC|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[name=s,shape=make contact IEC,shape example,minimum width=3cm,minimum height=1cm] {};
+ \foreach \anchor/\placement in
+ {center/above, 30/above right,
+ north/above, south/below, east/left, west/right,
+ north east/above, south east/below, south west/below, north west/above,
+ input/left,output/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{var make contact IEC}
+ This shape works like |make contact IEC|, only a little circle is added to
+ the path at the lower left corner. The radius of this circle is one twelfth
+ of the width of the node.
+ %
+\begin{codeexample}[]
+\tikz \node[shape=var make contact IEC,shape example,
+ minimum height=1cm,minimum width=3cm,inner sep=0pt] {};
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{break contact IEC}
+ This shape depicts a contact that can be broken. It works like
+ |make contact IEC|.
+ %
+\begin{codeexample}[]
+\tikz \node[shape=break contact IEC,shape example,
+ minimum height=1cm,minimum width=3cm,inner sep=0pt] {};
+\end{codeexample}
+ %
+\end{shape}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-decorations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-decorations.tex
new file mode 100644
index 0000000000..60a4801c7d
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-decorations.tex
@@ -0,0 +1,2160 @@
+% Copyright 2013 by Mark Wibrow and Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Decoration Library}
+\label{section-library-decorations}
+
+
+\subsection{Overview and Common Options}
+
+The decoration libraries define a number of (more or less useful) decorations
+that can be applied to paths. The usage of decorations is not covered in the
+present section, please consult Sections~\ref{section-tikz-decorations}, which
+explains how decorations are used in \tikzname, and
+\ref{section-base-decorations}, which explains how new decorations can be
+defined.
+
+The decorations are influenced by a number of parameters that can be set using
+the |decoration| option. These parameters are typically shared between
+different decorations. In the following, the general options are documented
+(they are defined directly in the |decoration| module), special-purpose keys
+are documented with the decoration that uses it.
+
+Since you are encouraged to use these keys to make your own decorations
+configurable, it is indicated for each key where the value is stored (so that
+you can access it). Note that some values are stored in \TeX\ dimension
+registers while others are stored in macros.
+
+\begin{key}{/pgf/decoration/amplitude=\meta{dimension} (initially 2.5pt)}
+ This key determines the ``desired height'' (or amplitude) of decorations
+ for which this makes sense. For instance, the initial value of |2.5pt|
+ means that deforming decorations should deform a path by up to 2.5pt away
+ from the original path.
+
+ This key sets the \TeX-dimension |\pgfdecorationsegmentamplitude|.
+\end{key}
+
+\begin{key}{/pgf/decoration/meta-amplitude=\meta{dimension} (initially 2.5pt)}
+ This key determines the amplitude for a meta-decoration.
+
+ The key sets the \TeX-macro (!) |\pgfmetadecorationsegmentamplitude|.
+\end{key}
+
+\begin{key}{/pgf/decoration/segment length=\meta{dimension} (initially 10pt)}
+ Many decorations are made up of small segments. This key determines the
+ desired length of such segments.
+
+ This key sets the \TeX-dimension |\pgfdecorationsegmentlength|.
+\end{key}
+
+\begin{key}{/pgf/decoration/meta-segment length=\meta{dimension} (initially 1cm)}
+ This determined the length of the meta-segments from which a
+ meta-decoration is made up.
+
+ This key sets the \TeX-macro (!) |\pgfmetadecorationsegmentlength|.
+\end{key}
+
+\begin{key}{/pgf/decoration/angle=\meta{degree} (initially 45)}
+ The way some decorations look like depends on a configurable angle. For
+ instance, a |wave| decoration consists of arcs and the opening angle of
+ these arcs is given by the |angle|.
+
+ This key sets the \TeX-macro |\pgfdecorationsegmentangle|.
+\end{key}
+
+\begin{key}{/pgf/decoration/aspect=\meta{factor} (initially 0.5)}
+ For some decorations there is a natural aspect ratio. For instance,
+ for a |brace| decoration the aspect ratio determines where the brace
+ point will be.
+
+ This key sets the \TeX-macro |\pgfdecorationsegmentaspect|.
+\end{key}
+
+\begin{key}{/pgf/decoration/start radius=\meta{dimension} (initially 2.5pt)}
+ For some decorations there is a natural start radius (of some circle,
+ presumably).
+
+ This key stores the value directly inside the key.
+\end{key}
+
+\begin{key}{/pgf/decoration/end radius=\meta{dimension} (initially 2.5pt)}
+ For some decorations there is a natural end radius (of some circle,
+ presumably).
+
+ This key stores the value directly inside the key.
+\end{key}
+
+\begin{stylekey}{/pgf/decoration/radius=\meta{dimension}}
+ Sets the start and end radius simultaneously.
+\end{stylekey}
+
+\begin{key}{/pgf/decoration/path has corners=\meta{boolean} (initially false)}
+ This is a hint to the decoration code as to whether the path has corners or
+ not. If a path has a sharp corner, setting this option to |true| may result
+ in better rendering of the decoration because the joins of input segments
+ are approached ``more carefully'' than when this key is set to false.
+ However, if the path is, say, a smooth circle, setting this key to |true|
+ will usually look worse. Most decorations ignore this key, anyway.
+ Internally, it sets the \TeX-if |\ifpgfdecoratepathhascorners|.
+\end{key}
+
+
+\subsection{Path Morphing Decorations}
+
+\begin{pgflibrary}{decorations.pathmorphing}
+ A \emph{path morphing decoration} ``morphs'' or ``deforms'' the
+ to-be-decorated path. This means that what used to be a straight line might
+ afterwards be a snaking curve and have bumps. However, a line is still a
+ line and path deforming decorations do not change the number of subpaths.
+ For instance, if the path used to consist of two circles and an open arc,
+ the path will, after the decoration process, still consist of two closed
+ subpaths and one open subpath.
+\end{pgflibrary}
+
+
+\subsubsection{Decorations Producing Straight Line Paths}
+
+The following deformations use only straight lines in order to morph the paths.
+
+\begin{decoration}{lineto}
+ This decoration replaces the path by straight lines. For each curve, the
+ path simply goes directly from the start point to the end point. In the
+ following example, the arc actually consist of two subcurves.
+
+ This decoration is actually always defined when the decoration module is
+ loaded, but it is documented here for consistency.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=lineto]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{straight zigzag}
+ This (meta-)decoration decorates the path by alternating between |curveto|
+ and |zigzag| decorations. It always finishes with the |curveto| decoration.
+ The following parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |amplitude| determines how much the zigzag line raises above and
+ falls below a straight line to the target point.
+ \item |segment length| determines the length of a complete ``up-down''
+ cycle.
+ \item |meta-segment length| determines the length of the |curveto| and the
+ |zigzag| decorations.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={straight zigzag,meta-segment length=1.1cm}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{random steps}
+ This decoration consists of straight line segments. The line segments head
+ towards the target, but each step is randomly shifted a little bit. The
+ following parameters influence the decorations:
+ %
+ \begin{itemize}
+ \item |segment length| determines the basic length of each step.
+ \item |amplitude| The end of each step is perturbed both in $x$- and in
+ $y$-direction by two values drawn uniformly from the interval
+ $[-d,d]$, where $d$ is the value of |amplitude|.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [decoration={random steps,segment length=2mm}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{saw}
+ This decoration looks like the blade of a saw. The following parameters
+ influence the decoration:
+ %
+ \begin{itemize}
+ \item |amplitude| determines how much each spike raises above the
+ straight line.
+ \item |segment length| determines the length each spike.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=saw]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{zigzag}
+ This decoration looks like a zigzag line. The following parameters
+ influence the decoration:
+ %
+ \begin{itemize}
+ \item |amplitude| determines how much the zigzag line raises above and
+ falls below a straight line to the target point.
+ \item |segment length| determines the length of a complete ``up-down''
+ cycle.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=zigzag]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+
+\subsubsection{Decorations Producing Curved Line Paths}
+
+\begin{decoration}{bent}
+ This decoration adds a slightly bent line from the start to the target. The
+ amplitude of the bend is given |amplitude| (an amplitude of zero gives a
+ straight line).
+ %
+ \begin{itemize}
+ \item |amplitude| determines the amplitude of the bend.
+ \item |aspect| determines how tight the bend is. A good value is around
+ |0.3|.
+ \end{itemize}
+ %
+ Note that this decoration makes only little sense for curves. You should
+ apply it only to straight lines.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=bent]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) -- (1.5,2) -- (0,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={bent,aspect=.3}]
+ \draw [decorate,fill=yellow!80!black] (0,0) rectangle (3.5,2);
+ \node[circle,draw] (A) at (.5,.5) {A};
+ \node[circle,draw] (B) at (3,1.5) {B};
+ \draw[->,decorate] (A) -- (B);
+ \draw[->,decorate] (B) -- (A);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{bumps}
+ This decoration replaces the path by little half ellipses. The following
+ parameters influence it.
+ %
+ \begin{itemize}
+ \item |amplitude| determines the height of the half ellipse.
+ \item |segment length| determines the width of the half ellipse.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=bumps]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{coil}
+ This decoration replaces the path by a coiled line. To understand how this
+ works, imagine a three-dimensional spring. The spring's axis points along
+ the path toward the target. Then, we ``view'' the spring from a certain
+ angle. If we look ``straight from the side'' we will see a perfect sine
+ curve, if we look ``more from the front'' we will see a coil. The following
+ parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |amplitude| determines how much the coil rises above the path and
+ falls below it. Thus, this is the radius of the coil.
+ \item |segment length| determines the distance between two consecutive
+ ``curls''. Thus, when the spring is see ``from the side'' this will
+ be the wave length of the sine curve.
+ \item |aspect| determines the ``viewing direction''. A value of |0|
+ means ``looking from the side'' and a value of |0.5|, which is the
+ default, means ``look more from the front''.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=coil]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [decoration={coil,aspect=0.3,segment length=3mm,amplitude=3mm}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{curveto}
+ This decoration simply yields a line following the original path. This
+ means that (ideally) it does not change the path and follows any curves in
+ the path (hence the name). In reality, due to the internals of how
+ decorations are implemented, this decoration actually replaces the path by
+ numerous small straight lines.
+
+ This decoration is mostly useful in conjunction with meta-decorations. It
+ is also actually defined in the decoration module and is always available.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=curveto]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{snake}
+ This decoration replaces the path by a line that looks like a snake seen
+ from above. More precisely, the snake is a sine wave with a ``softened''
+ start and ending. The following parameters influence the snake:
+ %
+ \begin{itemize}
+ \item |amplitude| determines the sine wave's amplitude.
+ \item |segment length| determines the sine wave's wavelength.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=snake]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+
+\subsection{Path Replacing Decorations}
+
+\begin{pgflibrary}{decorations.pathreplacing}
+ This library defines decorations that replace the to-be-decorated path by
+ another path. Unlike morphing decorations, the replaced path might be quite
+ different, for instance a straight line might be replaced by a set of
+ circles. Note that filling a path that has been replaced using one of the
+ decorations in this library typically does not fill the original area but,
+ rather, the smaller area of the newly-created path segments.
+\end{pgflibrary}
+
+\begin{decoration}{border}
+ This decoration adds straight lines to the path that are at a specific
+ angle to the line toward the target. The idea is to add these little lines
+ to indicate the ``border'' of an area. The following parameters influence
+ the decoration:
+ %
+ \begin{itemize}
+ \item |segment length| determines the distance between consecutive
+ ticks.
+ \item |amplitude| determines the length of the ticks.
+ \item |angle| determines the angle between the ticks and the line of
+ the path.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=border]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate,draw,red}]
+ (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{brace}
+ This decoration replaces a straight line path by a long brace. The left and
+ right end of the brace will be exactly on the start and endpoint of the
+ decoration. The decoration really only makes sense for paths that are a
+ straight line.
+ %
+ \begin{itemize}
+ \item |amplitude| determines how much the brace rises above the path.
+ \item |aspect| determines the fraction of the total length where the
+ ``middle part'' of the brace will be.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=brace]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{expanding waves}
+ This decoration adds arcs to the path that get bigger along the line
+ towards the target. The following parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |segment length| determines the distance between consecutive
+ arcs.
+ \item |angle| determines the opening angle below and above the path.
+ Thus, the total opening angle is twice this angle.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={expanding waves,angle=5}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{moveto}
+ This decoration simply jumps to the end of the path using a move-to path
+ operation. It is mainly useful as |pre=moveto| or |post=moveto|
+ decorations.
+
+ This decoration is actually always defined when the decoration module is
+ loaded, but it is documented here for consistency.
+\end{decoration}
+
+\begin{decoration}{ticks}
+ This decoration replaces the path by straight lines that are orthogonal to
+ the path. The following parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |segment length| determines the distance between consecutive
+ ticks.
+ \item |amplitude| determines half the length of the ticks.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=ticks]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{waves}
+ This decoration replaces the path by arcs that have a constant size. The
+ following parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |segment length| determines the distance between consecutive
+ arcs.
+ \item |angle| determines the opening angle below and above the path.
+ Thus, the total opening angle is twice this angle.
+ \item |radius| determines the radius of each arc.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={waves,radius=4mm}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{show path construction}
+ This decoration allows ``something different'' to be done for each
+ \emph{type} of input segment (i.e., moveto, lineto, curveto or closepath).
+ Typically, each segment will be replaced with another path, but this need
+ not necessarily be the case.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth, every node/.style={midway, sloped, font=\tiny},
+ decoration={show path construction,
+ moveto code={
+ \fill [red] (\tikzinputsegmentfirst) circle (2pt)
+ node [fill=none, below] {moveto};},
+ lineto code={
+ \draw [blue,->] (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
+ node [above] {lineto};
+ },
+ curveto code={
+ \draw [green!75!black,->] (\tikzinputsegmentfirst) .. controls
+ (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
+ ..(\tikzinputsegmentlast) node [above] {curveto};
+ },
+ closepath code={
+ \draw [orange,->] (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
+ node [above] {closepath};}
+ }]
+ \draw [help lines] grid (3,2);
+ \path [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+ The following keys can be used to specify the code to execute for each type
+ of input segment.
+
+ \begin{key}{/pgf/decoration/moveto code=\meta{code} (initially \char`\{\char`\})}
+ Set the code to be executed for every moveto input segment. It is
+ important to remember that the transformations applied by the
+ decoration automaton are turned \emph{off} when \meta{code} is
+ executed.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/lineto code=\meta{code} (initially \char`\{\char`\})}
+ Set the code to be executed for every lineto input segment.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/curveto code=\meta{code} (initially \char`\{\char`\})}
+ Set the code to be executed for every curveto input segment.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/closepath code=\meta{code} (initially \char`\{\char`\})}
+ Set the code to be executed for every closepath input segment.
+ \end{key}
+
+ Within \meta{code} the first and last points on the current input segment
+ can be accessed using |\pgfpointdecoratedinputsegmentfirst| and
+ |\pgfpointdecoratedinputsegmentlast|. For curves, the control (support)
+ points can be accessed using |\pgfpointdecoratedinputsegmentsupporta| and
+ |\pgfpointdecoratedinputsegmentsupportb|.
+
+ In \tikzname, you can use the following macros inside a \tikzname{}
+ coordinate.
+
+ \begin{command}{\tikzinputsegmentfirst}
+ The first point on the current input segment path.
+ \end{command}
+
+ \begin{command}{\tikzinputsegmentlast}
+ The last point on the current input segment path.
+ \end{command}
+
+ \begin{command}{\tikzinputsegmentsupporta}
+ The first support on the curveto input segment path.
+ \end{command}
+
+ \begin{command}{\tikzinputsegmentsupportb}
+ The second support on the curveto input segment path.
+ \end{command}
+ %
+{\tikzexternaldisable
+\begin{codeexample}[]
+\tikzset{
+ show curve controls/.style={
+ decoration={
+ show path construction,
+ curveto code={
+ \draw [blue, dashed]
+ (\tikzinputsegmentfirst) -- (\tikzinputsegmentsupporta)
+ node [at end, cross out, draw, solid, red, inner sep=2pt]{};
+ \draw [blue, dashed]
+ (\tikzinputsegmentsupportb) -- (\tikzinputsegmentlast)
+ node [at start, cross out, draw, solid, red, inner sep=2pt]{};
+ }
+ },decorate
+ }
+}
+
+\tikzpicture
+ \draw [postaction=show curve controls, thick]
+ (0,2) .. controls (2.5,1.5) and (0.5,0.5) .. (3,0);
+\endtikzpicture
+\end{codeexample}
+}%
+ %
+\end{decoration}
+
+
+\subsection{Marking Decorations}
+
+\subsubsection{Overview}
+
+A \emph{marking on a path} is any kind of graphic that is placed on a specific
+position on a path. Markings are useful in rather diverse situations: you can
+use them to, say, place little ``footsteps'' along a path as if someone where
+walking along the path; to place arrow tips on the middle of a path to indicate
+the ``direction'' in which something is flowing; or you can use them to place
+informative information at certain positions of a path.
+
+For historical reasons there are three different libraries for placing marks on
+a path. They differ in what kind of markings can be added to a path. We start
+with the most general and most useful of these libraries.
+
+
+\subsection{Arbitrary Markings}
+
+\begin{pgflibrary}{decorations.markings}
+ Markings are arbitrary ``marks'' that can be put on a path. Marks can be
+ arrow tips or nodes or even whole pictures.
+\end{pgflibrary}
+
+\begin{decoration}{markings}
+ A \emph{marking} can be thought of a ``little picture'' or more precisely
+ of ``some scope contents'' that is placed ``on'' a path at a certain
+ position. Suppose the marking should be a simple cross. We can produce this
+ with the following code:
+ %
+\begin{codeexample}[code only]
+\draw (-2pt,-2pt) -- (2pt,2pt);
+\draw (2pt,-2pt) -- (-2pt,2pt);
+\end{codeexample}
+ %
+ If we use this code as a marking at position |2cm| on a path, then the
+ following happens: \pgfname\ determines the position on the path that is
+ 2cm along the path. Then is translates the coordinate system to this
+ position and rotates it such that the positive $x$-axis is tangent to the
+ path. Then a protective scope is created, inside which the above code is
+ executed -- resulting in a little cross on the path.
+
+ The |markings| decoration allows you to place one or more such markings on
+ a path. The decoration destroys the input path (except in certain cases,
+ detailed later), which means that it uses the path for determining
+ positions on the path, but after the decoration is done this path is gone.
+ You typically need to use a |postaction| to add markings.
+
+ Let us start with the above example in real code:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={
+ markings,% switch on markings
+ mark=% actually add a mark
+ at position 2cm
+ with
+ {
+ \draw (-2pt,-2pt) -- (2pt,2pt);
+ \draw (2pt,-2pt) -- (-2pt,2pt);
+ }
+ }
+ ]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ We can also add the cross repeatedly:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={
+ markings,% switch on markings
+ mark=% actually add a mark
+ between positions 0 and 1 step 5mm
+ with
+ {
+ \draw (-2pt,-2pt) -- (2pt,2pt);
+ \draw (2pt,-2pt) -- (-2pt,2pt);
+ }
+ }
+ ]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ The |mark| decoration option is used to specify a marking. It comes in two
+ versions:
+ %
+ \begin{key}{/pgf/decoration/mark=\texttt{at position} \meta{pos}| with |\meta{code}}
+ The options specifies that when a |marking| decoration is applied,
+ there should be a marking at position \meta{pos} on the path whose code
+ is given by \meta{code}.
+
+ The \meta{pos} can have four different forms:
+ %
+ \begin{enumerate}
+ \item It can be a non-negative dimension like |0pt| or |2cm| or
+ |5cm/2|. In this case, it refers to the position along the path
+ that is this far displaced from the start.
+ \item It can be a negative dimension like |-1cm-2pt| or |-1sp|. In
+ this case, the position is taken from the end of the path.
+ Thus, |-1cm| is the position that is $-1$cm displaced from the
+ end of the path.
+ \item It can be a dimensionless non-negative number like |1/2| or
+ |0.333+2*0.1|. In this case, the \meta{pos} is interpreted as a
+ factor of the total path length. Thus, a \meta{pos} or |0.5|
+ refers to the middle of the path, |0.1| is near the start, and
+ so on.
+ \item It can be a dimensionless negative number like |-0.1|. Then,
+ again, the fraction of the path length counts ``from the end''.
+ \end{enumerate}
+
+ The \meta{pos} determines a position on the path. When the marking is
+ applied, the (high level) coordinate system will have been transformed
+ so that the origin lies at this position and the positive $x$-axis
+ points along the path. For this coordinate system, the \meta{code} is
+ executed. It can contain all sorts of graphic drawing commands,
+ including (even named) nodes.
+
+ If the position lies past the end of the path (for instance if
+ \meta{pos} is set to |1.2|), the marking will not be drawn.
+
+ It is possible to give the |mark| option several times, which causes
+ several markings to be applied. In this case, however, it is necessary
+ that the positions on the path are in increasing order. That is, it is
+ not allowed (and will result in chaos) to have a marking that lies
+ earlier on the path to follow a marking that is later on the path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={
+ markings,% switch on markings
+ mark=at position 1cm with \node[red]{1cm};,
+ mark=at position .5 with \node[green]{mid};,
+ mark=at position -1cm with {\node[blue,transform shape]{1cm from end};}}
+ ]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ Here is an example that shows how markings can be used to place text on
+ plots:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[domain=0:4,label/.style={postaction={
+ decorate,
+ decoration={
+ markings,
+ mark=at position .75 with \node #1;}}}]
+ \draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,3.9);
+
+ \draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$};
+ \draw[->] (0,-1.2) -- (0,4.2) node[above] {$f(x)$};
+
+ \draw[red,label={[above left]{$f(x)=x$}}] plot (\x,\x);
+ \draw[blue,label={[below left]{$f(x)=\sin x$}}] plot (\x,{sin(\x r)});
+ \draw[orange,label={[right]{$f(x)= \frac{1}{20} \mathrm e^x$}}] plot (\x,{0.05*exp(\x)});
+\end{tikzpicture}
+\end{codeexample}
+
+ When the \meta{code} is being executed, two special keys will have been
+ set up, whose value may be of interest:
+ %
+ \begin{key}{/pgf/decoration/mark info/sequence number}
+ This key can only be read. Its value (which can be obtained using
+ the |\pgfkeysvalueof| command) is a ``sequence number'' of the
+ mark. The first mark that is added to a path has number |1|, the
+ second number |2|, and so on. This key is mainly useful in
+ conjunction with repeated markings (see below).
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration/mark info/distance from start}
+ This key can only be read. Its value is the distance of the marking
+ from the start of the path in points. For instance, if the path
+ length is 100pt and the marking is in the middle of the path, the
+ value of this key would be |50.0pt|.
+ \end{key}
+ \end{key}
+
+ A second way to use the |mark| key is the following:
+ %
+ \begin{key}{/pgf/decoration/mark=|between positions|
+ \meta{start pos} |and| \meta{end pos} |step|
+ \meta{stepping} |with| \meta{code}%
+ }
+ This works similarly to the |at position| version of this option, only
+ multiple marks are placed, starting at \meta{start pos} and then spaced
+ apart by \meta{stepping}. The \meta{start pos}, the \meta{end pos}, and
+ also the \meta{stepping} may all be specified in the same way as for
+ the |at position| version, that is, either using units or no units and
+ also using positive or negative values.
+
+ Let us start with a simple example in which we place ten crosses along
+ a path starting with the beginning of the path ($\meta{start pos} = 0$)
+ and ending at the end ($\meta{end pos} = 1$).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={markings,
+ mark=between positions 0 and 1 step 0.1
+ with { \draw (-2pt,-2pt) -- (2pt,2pt);
+ \draw (2pt,-2pt) -- (-2pt,2pt); }} ]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the next example we place arrow shapes on the path instead of
+ crosses. Note the use of the |transform shape| option to ensure that
+ the nodes are actually rotated.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={markings,
+ mark=between positions 0 and 1 step 1cm
+ with { \node [single arrow,fill=red,
+ single arrow head extend=3pt,transform shape] {};}}]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ Using the key |sequence number| we can also ``number'' the nodes and
+ even refer to them later on.
+ %
+% FIXME: the automatic key highlighting fails here!
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={markings,
+ mark=between positions 0 and 1 step 1cm with {
+ \node [draw,
+ name=mark-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number},
+ transform shape]
+ {\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}};}}]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+ \draw [red,->] (mark-3) -- (mark-7);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the following example we use the distance info to place ``length
+ information'' on a path:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={markings,
+ % Main marks
+ mark=between positions 0 and 1 step 40pt with
+ { \draw [help lines] (0,0) -- (0,0.5)
+ node[above,font=\tiny]{
+ \pgfkeysvalueof{/pgf/decoration/mark info/distance from start}}; },
+ mark=at position -0.1pt with
+ { \draw [help lines] (0,0) -- (0,0.5)
+ node[above,font=\tiny]{
+ \pgfkeysvalueof{/pgf/decoration/mark info/distance from start}}; }}]
+ \draw [help lines] grid (5,3);
+ \draw [postaction={decorate}] (0,0) .. controls (8,3) and (0,3) .. (5,0) ;
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/reset marks}
+ Since |mark| options accumulate, there needs to be a way to ``reset''
+ things, so that any |mark| options set in an enclosing scope do not
+ interfere. This option does exactly this. Note that when the
+ \meta{code} of a marking is executed, the markings are automatically
+ reset.
+ \end{key}
+
+ As mentioned earlier, the decoration usually destroys the path. However,
+ this is no longer the case when the following key is set:
+ %
+ \begin{key}{/pgf/decoration/mark connection node=\meta{node name} (initially empty)}
+ When this key is set to a non-empty \meta{node name} while the
+ decoration is being processed, the following happens: The marking code
+ should, among possibly other things, define a node named \meta{node
+ name}. Then, the output path of this decoration will contain a line-to
+ to ``one end'' of this node, followed by a moveto to the ``other end''
+ of the node. More precisely, the first end is given by the position on
+ the border of \meta{node name} that lies in the direction ``from which
+ the path heads toward the node'' while the other end lies on the border
+ ``where the path heads away from the node''. Furthermore, this option
+ causes the decoration to end with a line-to to the end instead of a
+ move-to.
+
+ The net effect of all this is that when you decorate a straight line
+ with one or more markings that contain just a node, the line will
+ effectively connect these nodes.
+
+ Here are two examples that show how this works:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={markings,
+ mark connection node=my node,
+ mark=at position .5 with
+ {\node [draw,blue,transform shape] (my node) {my node};}}]
+ \draw [help lines] grid (3,2);
+ \draw decorate { (0,0) -- (3,2) };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={markings,
+ mark connection node=my node,
+ mark=at position .25 with
+ {\node [draw,red] (my node) {my node};}}]
+ \draw [help lines] grid (3,2);
+ \draw decorate { (0,0) -- (3,2) };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{decoration}
+
+
+\subsubsection{Arrow Tip Markings}
+
+Frequent markings that are hard to create correctly are arrow tips. For them,
+two special commands are available when the \meta{code} of a |mark| option is
+executed. (They are only defined in this code):
+
+\begin{command}{\arrow\opt{\oarg{options}}\marg{arrow end tip}}
+ This command simply draws the \meta{arrow end tip} at the origin, pointing
+ right. This is exactly what you need when you want to draw an arrow tip as
+ a marking.
+
+ The \meta{options} can only be given when \tikzname\ is used. In this case,
+ they are executed in a scope that contains the arrow tip.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={
+ markings,% switch on markings
+ mark=at position 1cm with {\node[red]{1cm};},
+ mark=at position .75 with {\arrow[blue,line width=2mm]{>}},
+ mark=at position -1cm with {\arrowreversed[black]{stealth}}}
+ ]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ Here is a more useful example:
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={
+ markings,% switch on markings
+ mark=between positions 0 and .75 step 4mm with {\arrow{stealth}},
+ mark=between positions .75 and 1 step 4mm with {\arrowreversed{stealth}}}
+ ]
+ \draw [help lines] grid (3,2);
+ \draw [postaction={decorate}] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\arrowreversed\opt{\oarg{options}}\marg{arrow end tip}}
+ As above, only the arrow end tip is flipped and points in the other
+ direction.
+\end{command}
+
+
+\subsubsection{Footprint Markings}
+
+\begin{pgflibrary}{decorations.footprints}
+ The decorations of this library can be used to decorate a path with little
+ footprints, as if someone had ``walked'' along the path.
+\end{pgflibrary}
+
+\begin{decoration}{footprints}
+ The footprint decoration adds little footprints around the path. They start
+ with the left foot.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={footprints,foot length=5pt,stride length=10pt}]
+ \draw [help lines] grid (3,3);
+ \fill [decorate] (0,0) -- (3,2) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ You can influence the way this decoration looks using the following
+ options:
+ %
+ \begin{key}{/pgf/decoration/foot length (initially 10pt)}
+ The length or size of the footprint itself. A larger value makes the
+ footprint larger, but does not change the stride length.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={footprints,foot length=20pt}]
+ \fill [decorate] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration/stride length (initially 30pt)}
+ The length of strides. This is the distance between the beginnings of
+ left footprints along the path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={footprints,stride length=50pt}]
+ \fill [decorate] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration/foot sep (initially 4pt)}
+ The separation in the middle between the footprints. The footprints are
+ moved away from the path by half this amount.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={footprints,foot sep=10pt}]
+ \fill [decorate] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration/foot angle (initially 10)}
+ Footprints are rotated by this much.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={footprints,foot angle=60}]
+ \fill [decorate] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/decoration/foot of (initially human)}
+ The species whose footprints are shown. Possible values are:
+
+ \def\render#1{
+ \texttt{#1} &
+ \tikz [baseline,decoration={footprints,foot of=#1}]
+ \fill [decorate] (0,0) -- (6,0); \\[3em]
+ }
+ \begin{tabular}{ll}
+ \emph{Species} & \emph{Result} \\[1em]
+ \render{gnome}
+ \render{human}
+ \render{bird}
+ \render{felis silvestris}
+ \end{tabular}
+ \end{key}
+\end{decoration}
+
+
+\subsubsection{Shape Background Markings}
+
+The third library for adding markings uses the background paths of certain
+shapes. This library is included mostly for historical reasons, using the
+|markings| library is usually preferable.
+
+\begin{pgflibrary}{decorations.shapes}
+ This library defines decorations that use shapes or shape-like drawings to
+ decorate a path. The following options are common options used by the
+ decorations in this library:
+
+ \begin{key}{/pgf/decoration/shape width=\meta{dimension} (initially 2.5pt)}
+ The desired width of the shapes. For decorations that support varying
+ shape sizes, this key sets both the start and end width (which can be
+ overwritten using options like |shape start width|).
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape height=\meta{dimension} (initially 2.5pt)}
+ Works like the previous key, only for the height.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape size=\meta{dimension}}
+ Sets the desired width and height simultaneously.
+ \end{key}
+
+ For the exact places and macros where these keys store the values, please
+ consult the beginning of the code of the library.
+\end{pgflibrary}
+
+\begin{decoration}{crosses}
+ This decoration replaces the path by (diagonal) crosses. The following
+ parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |segment length| determines the distance between (the centers of)
+ consecutive crosses.
+ \item |shape height| determines the height of each cross.
+ \item |shape width| determines the width of each cross.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=crosses]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{triangles}
+ This decoration replaces the path by triangles that point along the path.
+ The following parameters influence the decoration:
+ %
+ \begin{itemize}
+ \item |segment length| determines the distance between consecutive
+ triangles.
+ \item |shape height| determines the height of the triangle side that is
+ orthogonal to the path.
+ \item |shape width| determines the width of the triangle.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=triangles]
+ \draw [help lines] grid (3,2);
+ \draw [decorate,fill=yellow!80!black] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{shape backgrounds}
+ This is a general decoration that replaces the to-be-decorated path by
+ repeated copies of the background path of an arbitrary shape that has
+ previously been defined using the |\pgfdeclareshape| command (that is, you
+ can use any shape in the shape libraries).
+
+ Please note that the background path of the shapes is used, but \emph{no
+ nodes are created}. This means that \emph{you cannot have text inside the
+ shapes of this path, you cannot name them, or refer to them.} Finally, this
+ decoration \emph{will not work with shapes that depend strongly on the
+ size of the text box (like the arrow shapes).} If any of these restrictions
+ pose a problem, use the |markings| library instead.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={shape backgrounds,shape=star,shape size=5pt}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikzset{paint/.style={ draw=#1!50!black, fill=#1!50 },
+ decorate with/.style=
+ {decorate,decoration={shape backgrounds,shape=#1,shape size=2mm}}}
+\begin{tikzpicture}
+ \draw [decorate with=dart, paint=red] (0,1.5) -- (3,1.5);
+ \draw [decorate with=diamond, paint=green] (0,1) -- (3,1);
+ \draw [decorate with=rectangle, paint=blue] (0,0.5) -- (3,0.5);
+ \draw [decorate with=circle, paint=yellow] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ All shapes are positioned by the anchor that is specified via the |anchor|
+ decoration option:
+
+ \begin{key}{/pgf/decoration/anchor=\meta{anchor} (initially center)}
+ The anchor used to position the shape backgrounds.
+ \end{key}
+
+ A shape background path is added at the start point of the path and, if the
+ distance between the shapes is appropriate, at the end point of the path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={
+ shape backgrounds,shape=regular polygon,shape size=4mm}]
+ \draw [help lines] grid (3,2);
+ \draw [thick] (0,0) -- (2,2) (1,0) -- (3,0);
+ \draw [red, decorate, decoration={shape sep=.5cm}] (1,0) -- (3,0);
+ \draw [blue, decorate, decoration={shape sep=.5cm}] (0,0) -- (2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ Keys for customizing specific shapes can be specified (e.g., |star points|,
+ |cloud puffs|, |kite angles|, and so on). The size of the shape is
+ ``enforced'' using transformations. This means that the shape is typeset
+ with an empty text box and some default size values, resulting in an
+ initial shape. This shape is then rescaled using coordinate transformations
+ so that it has the desired size (which may vary as we travel along the
+ to-be-decorated path). This means that settings involving angles and
+ distances may not appear entirely accurate. More general options such as
+ |inner sep| and |minimum size| will be ignored, but transformations can be
+ applied to each segment as described below.
+ %
+\begin{codeexample}[]
+\tikzset{
+ paint/.style={draw=#1!50!black, fill=#1!50},
+ my star/.style={decorate,decoration={shape backgrounds,shape=star},
+ star points=#1}
+}
+\begin{tikzpicture}[decoration={shape sep=.5cm, shape size=.5cm}]
+ \draw [my star=9, paint=red] (0,1.5) -- (3,1.5);
+ \draw [my star=5, paint=blue] (0,.75) -- (3,.75);
+ \draw [my star=5, paint=yellow, shape border rotate=30] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ There are various keys to control the drawing of the shape decoration.
+
+ \begin{key}{/pgf/decoration/shape=\meta{shape name} (initially circle)}
+ The shape whose background path is used.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape sep=\meta{spacing} (initially {.25cm, between centers})}
+ Set the spacing between the shapes on the decorations path. This can be
+ just a distance on its own, but the additional keywords
+ |between centers|, and |between borders| (which must be preceded by a
+ comma), specify that the distance is between the center anchors of the
+ shapes or between the edges of the \emph{boundaries} of the shape
+ borders.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ decoration={shape backgrounds,shape size=.5cm,shape=signal},
+ signal from=west, signal to=east,
+ paint/.style={decorate, draw=#1!50!black, fill=#1!50}]
+ \draw [help lines] grid (3,2);
+ \draw [paint=red, decoration={shape sep=.5cm}]
+ (0,2) -- (3,2);
+ \draw [paint=green, decoration={shape sep={1cm, between centers}}]
+ (0,1) -- (3,1);
+ \draw [paint=blue, decoration={shape sep={1cm, between borders}}]
+ (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape evenly spread=\meta{number}}
+ This key overrides the |shape sep| key and forces the decoration to fit
+ \meta{number} shapes evenly across the path. If \meta{number} is less
+ than |1|, then no shapes will be used. If \meta{number} equals |1|,
+ then one shape is put in the middle of the path. The additional
+ keywords |by centers| (the default, if no keyword is specified) and
+ |by borders| can be used (both preceded by a comma), to specify how the
+ distance between shapes is determined. These keywords will only have a
+ noticeable effect if the shapes sizes differ over time.
+ %
+\begin{codeexample}[]
+\tikzset{
+ paint/.style={draw=#1!50!black, fill=#1!50},
+ spreading/.style={
+ decorate,decoration={shape backgrounds, shape=rectangle,
+ shape start size=4mm,shape end size=1mm,shape evenly spread={#1}}}
+}
+\begin{tikzpicture}
+ \fill [paint=green,spreading={5, by borders},
+ decoration={shape scaled}] (0,2) -- (3,2);
+ \fill [paint=blue,spreading={5, by centers},
+ decoration={shape scaled}] (0,1.5) -- (3,1.5);
+ \fill [paint=red, spreading=5] (0,1) -- (3,1);
+ \fill [paint=orange, spreading=4] (0,.5) -- (3,.5);
+ \fill [paint=gray, spreading=1] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape sloped=\opt{\meta{boolean}} (initially true)}
+ By default, shapes are rotated to the slope of the decorations path. If
+ \meta{boolean} is the value |false|, then this rotation is turned off.
+ Internally this sets the \TeX-if |\ifpgfshapedecorationsloped|
+ accordingly.
+ %
+\begin{codeexample}[]
+\tikzset{
+ paint/.style={draw=#1!50!black, fill=#1!50}
+}
+\begin{tikzpicture}[decoration={
+ shape width=.65cm, shape height=.45cm,
+ shape=isosceles triangle, shape sep=.75cm,
+ shape backgrounds}]
+ \draw [help lines] grid (3,2);
+ \draw [paint=red,decorate] (0,0) -- (2,2);
+ \draw [paint=blue,decorate,decoration={shape sloped=false}]
+ (1,0) -- (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ It is possible to scale the width and height of the shapes along the length
+ of the decorations path. The shapes are scaled between the starting size
+ and the ending size. The following keys customize the way the decoration
+ shapes are scaled:
+
+ \begin{key}{/pgf/decoration/shape scaled=\meta{boolean} (initially false)}
+\begin{codeexample}[]
+\tikzset{
+ bigger/.style={decoration={shape start size=.125cm, shape end size=.5cm}},
+ smaller/.style={decoration={shape start size=.5cm, shape end size=.125cm}},
+ decoration={shape backgrounds,
+ shape sep={.25cm, between borders},shape scaled}
+}
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \fill [decorate, bigger, red!50] (0,1) -- (3,2);
+ \fill [decorate, smaller, blue!50] (0,0) -- (3,1);
+\end{tikzpicture}
+\end{codeexample}
+
+ If this key is set to false (which is the default), then only the start
+ width and height are used. Note that the keys |shape width| and
+ |shape height| set the start and end height simultaneously.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape start width=\meta{length} (initially 2.5pt)}
+ The starting width of the shape.
+ \end{key}%
+
+ \begin{key}{/pgf/decoration/shape start height=\meta{length} (initially 2.5pt)}
+ The starting height of the shape.
+ \end{key}%
+
+ \begin{stylekey}{/pgf/decoration/shape start size=\meta{length}}
+ Sets both the start height and start width simultaneously.
+ \end{stylekey}%
+
+ \begin{key}{/pgf/decoration/shape end width=\meta{length} (initially 2.5pt)}
+ The recommended ending width of the shape. Note that this is the width
+ that a shape will take only if it is drawn exactly at the end of the
+ path.
+ %
+\begin{codeexample}[]
+\tikzset{
+ bigger/.style={decoration={shape start size=.25cm, shape end size=1cm}},
+ smaller/.style={decoration={shape start size=1cm, shape end size=.25cm}},
+ decoration={shape backgrounds,
+ shape sep={.25cm, between borders},shape scaled}
+}
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \fill [decorate,bigger,
+ decoration={shape sep={.25cm, between borders}}, blue!50]
+ (0,1.5) -- (3,1.5);
+ \fill [decorate,smaller,
+ decoration={shape sep={1cm, between centers}}, red!50]
+ (0,.5) -- (3,.5);
+ \draw [gray, dotted] (0,1.625) -- (3,2) (0,1.375) -- (3,1)
+ (0,1) -- (3,.625) (0,0) -- (3,.375);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/shape end height=\meta{length}}
+ The recommended ending height of the shape.
+ \end{key}
+
+ \begin{stylekey}{/pgf/decoration/shape end size=\meta{length}}
+ Set both the end height and end width simultaneously.
+ \end{stylekey}
+\end{decoration}
+
+
+\subsection{Text Decorations}
+
+\begin{pgflibrary}{decorations.text}
+ The decoration in this library decorates the path with some text. This can
+ be used to draw text that follows a curve.
+\end{pgflibrary}
+
+\begin{decoration}{text along path}
+ This decoration decorates the path with text. This drawing of the text is a
+ ``side effect'' of the decoration. The to-be-decorated path is only used to
+ determine where the characters should be put and it is thrown away after
+ the decoration is done. This is why no line is shown in the following
+ example.
+ %
+\begin{codeexample}[]
+\catcode`\|12
+\begin{tikzpicture}[decoration={text along path,
+ text={Some long text along a ridiculously long curve that}}]
+ \draw [help lines] grid (3,2);
+ \draw [decorate] (0,0) -- (3,1) arc (0:180:1.5 and 1);
+\end{tikzpicture}
+\end{codeexample}
+
+ \pgfname{} ``does its best'' to typeset the text, however you should note
+ the following points:
+ %
+ \begin{itemize}
+ \item Each character in the text is typeset in a separate |\hbox|. This
+ means that if you want fancy things like kerning or ligatures you
+ will have to manually annotate the characters in the decoration
+ text within a group, for example, |W{\kern-1ptA}TER|.
+ \item Each character is positioned using the center of its baseline. To
+ move the text vertically (relative to the path), the additional
+ transform key should be used.
+ \item No attempt is made to ensure characters do not overlap when the
+ angle between segments is considerably less than 180$^\circ$ (this
+ is tricky to do in \TeX{} without a huge processing overhead). In
+ general this should not be too much of a problem, but, once again,
+ kerning can be used in most cases to overcome any undesirable
+ effects.
+ \item It is only possible to typeset text in math mode under
+ considerable restrictions. Math mode is entered and exited using
+ any character of category code 3 (e.g., in plain \TeX{} this is |$|). %$
+ Math subscripts and superscripts need to be contained within
+ braces (e.g., |{^y_i}|) as do commands like |\times| or |\cdot|.
+ However, even modestly complex mathematical typesetting is
+ unlikely to be successful along a path (or even desirable).
+ \item Some inaccuracies in positioning may be particularly apparent at
+ input segment boundaries. This can (unfortunately) only be solved
+ on a case-by-case basis by individually kerning the offending
+ characters within a group.
+ \end{itemize}
+
+ The following keys are used by the |text| decoration:
+ %
+ \begin{key}{/pgf/decoration/text=\meta{text} (initially \normalfont empty)}
+ Sets the text to typeset along the curve. Consecutive spaces are
+ ignored, so |\ | (or |\space| in \LaTeX) should be used to insert
+ multiple spaces. It is possible to format the text using normal
+ formatting commands, such as |\it|, |\bf| and |\color|, within
+ customizable delimiters. Initially these delimiters are both
+ {\tt\char`\|} (however, care will be needed regarding the category
+ codes of delimiters -- see below).
+ %
+{\catcode`\|12
+\begin{codeexample}[]
+\catcode`\|12
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \path [decorate,decoration={text along path,
+ text={a big |\color{green}|green|| juicy apple.}}]
+ (0,0) .. controls (0,2) and (3,0) .. (3,2);
+\end{tikzpicture}
+\end{codeexample}
+}
+ %
+ By following the first delimiter with |+|, the formatting commands are
+ added to any existing formatting.
+ %
+{\catcode`\|12
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \path [decorate,decoration={text along path,
+ text={a |\large|big |+\bf\color{red}|red|| juicy apple.}}]
+ (0,0) .. controls (0,2) and (3,0) .. (3,2);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+ Internally, the text is stored in the macro |\pgfdecorationtext|. Any
+ characters that have not been typeset when the end of the path has been
+ reached will be stored in |\pgfdecorationrestoftext|.
+ \end{key}
+
+{\catcode`\|12
+ \begin{key}{/pgf/decoration/text format delimiters=\marg{before}\marg{after} (initially \char`\{|\char`\}\char`\{\char`\})}
+ \catcode`\|13
+
+ Set the characters that the text decoration will use to parse
+ formatting commands. If \meta{after} is empty, then \meta{before} will
+ be used for both delimiters. In general you should stick to characters
+ whose category codes are |11| or |12|. As |+| is used to indicate that
+ the specified format commands are added to any existing ones, you
+ should avoid using |+| as a delimiter.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \path [decorate, decoration={text along path,text format delimiters={[}{]},
+ text={A big [\color{red}]red[] and [\color{green}]green[] apple.}}]
+ (0,0) .. controls (0,2) and (3,0) .. (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+}
+
+ \begin{key}{/pgf/decoration/text color=\meta{color} (initially black)}
+ The color of the text.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/reverse path=\meta{boolean} (initially false)}
+ This key reverses the path. This is especially useful for typesetting
+ text along different sides of curves.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw [gray, ->]
+ [postaction={decoration={text along path,
+ text={a big juicy apple}, text color=red}, decorate}]
+ [postaction={decoration={text along path,
+ text={a big juicy apple}, text color=blue, reverse path}, decorate}]
+ (3,0) .. controls (3,2) and (0,2) .. (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text align={\ttfamily\char`\{}\meta{alignment options}{\ttfamily\char`\}}}
+ This changes the key path to |/pgf/decoration/text align| and executes
+ \meta{alignment options}.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text align/align=\meta{alignment} (initially left)}
+ Aligns the text according to \meta{alignment}, which should be one of
+ |left|, |right|, or |center|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+\draw [help lines] grid (3,2);
+\draw [red, dashed]
+[postaction={decoration={text along path, text={a big juicy apple},
+ text align={align=right}}, decorate}]
+(0,0) .. controls (0,2) and (3,2) .. (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{stylekey}{/pgf/decoration/text align/left}
+ Aligns the text to the left end of the path.
+ \end{stylekey}
+
+ \begin{stylekey}{/pgf/decoration/text align/right}
+ Aligns the text to the right end of the path.
+ \end{stylekey}
+
+ \begin{stylekey}{/pgf/decoration/text align/center}
+ Aligns the text to the center of the path.
+ \end{stylekey}
+
+ \begin{key}{/pgf/decoration/text align/left indent=\meta{length} (initially 0pt)}
+ Specifies a distance which the automaton should move along before it
+ starts typesetting the text.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text align/right indent=\meta{length} (initially 0pt)}
+ Specifies a distance before the end of the path, where the automaton
+ should stop typesetting the text.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text align/fit to path=\meta{boolean} (initially false)}
+ This key makes the decoration automaton try to fit the text to the
+ length of the path. The automaton shifts forward by a small amount
+ between each character in order to fit the text to the path. If,
+ however, the length of the text is longer than the length of the path
+ (i.e., the automaton would have to shift \emph{backwards} between
+ characters) this key will have no effect.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw [red, dashed]
+ [postaction={decoration={text along path, text={a big juicy apple},
+ text align=fit to path}, decorate}]
+ (0,0) .. controls (0,2) and (3,2) .. (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text align/fit to path stretching spaces=\meta{boolean} (initially false)}
+ This key works like the previous key except the automaton shifts
+ forward only for space characters (including |\space|, but
+ \emph{excluding} |\ |).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw [red, dashed]
+ [postaction={decoration={text along path, text={a big juicy apple},
+ text align={fit to path stretching spaces}}, decorate}]
+ (0,0) .. controls (0,2) and (3,2) .. (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{decoration}
+
+\begin{decoration}{text effects along path}
+ This decoration is similar to the |text along path| decoration except that
+ each character is inserted into the picture as a \tikzname\ node, and node
+ options (such as |text|, |scale| and |opacity|) can be used to create `text
+ effects'.
+ %
+\begin{codeexample}[]
+\bfseries\large
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!}, text align=center,
+ text effects/.cd,
+ character count=\i, character total=\n,
+ characters={evaluate={\c=\i/\n*100;}, text along path, text=red!\c!orange},
+ character widths={text along path, xslant=0, yscale=1}}]
+
+\path [postaction={decorate}, preaction={decorate,
+ text effects={characters/.append={yscale=-1.5, opacity=0.5,
+ text=gray, xslant=(\i/\n-0.5)*3}}}]
+ (0,0) .. controls ++(2,1) and ++(-2,-1) .. (3,4);
+\end{tikzpicture}
+\end{codeexample}
+
+ There are some important differences between this decoration and the |text
+ along path| decoration:
+ %
+ \begin{itemize}
+ \item formatting (e.g., font and color) cannot be specified in the
+ decoration text. They can only be specified using the keys
+ described below.
+ \item as a consequence of using the \tikzname\ node options, this
+ decoration is only available in \tikzname.
+ \item due to the number of computations involved, this is quite a slow
+ decoration.
+ \end{itemize}
+
+ The following keys are shared with the |text along path| decoration:
+
+ \begin{key}{/pgf/decoration/text=\marg{text}}
+ Set the text this decoration will use. Braces can be used to group
+ multiple characters together, or commands that should not be expanded
+ until they are typset, for example |gr{\"o}{\ss}eren|. You should
+ \emph{not} use the formatting delimiters or math mode characters that
+ the |text along path| decoration supports.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text align=\meta{align}}
+ This sets the alignment of the text along the path. The \meta{align}
+ argument should be |left|, |right| or |center|. Spreading the text out,
+ or stretching the spaces between words is \emph{not} supported.
+ \end{key}
+
+ The decoration text can be thought of as consisting of \emph{characters}
+ arranged in to sequences of \emph{letters} to make \emph{words} which are
+ separated by a \emph{word separator}. This, however, does not mean that you
+ are limited to using only natural language as the decoration text.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={000-001-010-011-100-101-110-111},
+ text effects/.cd,
+ path from text,
+ word separator=-,
+ every letter/.style={shape=rectangle, fill=blue!20, draw=blue!40}}]
+
+\path [decorate] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ In addition, it is possible to replace characters with \tikzname\ code:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={000-001-010-011-100-101-110-111}, text align=center,
+ text effects/.cd,
+ word separator=-,
+ replace characters=0 with {\fill [purple] circle [radius=2pt]; },
+ replace characters=1 with {\fill [orange] circle [radius=2pt]; },
+ replace characters=- with {\path circle [radius=2pt]; },
+ every letter/.style={shape=rectangle, fill=blue!20, draw=blue!40}}]
+
+\path [decorate] (0,0) .. controls ++(2,0) and ++(-2,0) .. (3,4);
+\end{tikzpicture}
+\end{codeexample}
+
+ There are many keys and styles that can be used to add effects to the
+ decoration text. Many of these keys have the parent path
+ |/pgf/decoration/text effects/|, but for convenience, these keys can be
+ accessed using the following key:
+
+ \begin{key}{/tikz/text effects=\marg{options}}
+ Execute every option in \marg{options} with the key path for each option
+ temporarily set to |/pgf/decoration/text effects/|.
+ \end{key}
+
+ The following keys can be used to customise the
+ appearance of text in the |text effects along path|
+ decoration.
+
+ \begin{stylekey}{/pgf/decoration/text effects/every character}
+ Set the effects that will be applied to every character in the
+ decoration text. The effects will typically be \tikzname\ node options.
+ Initially, this style is empty so the decoration simply positions nodes
+ at the appropriate position along the path. In order to make the text
+ `follow the path' like the |text along path| decoration the following
+ key can be added to the |every character| style.
+ \end{stylekey}
+
+ \begin{stylekey}{/pgf/decoration/text effects/text along path}
+ This style automatically sets the \tikzname\ keys |transform shape| (to
+ make the character slope with the path), |anchor=baseline| (to make the
+ baseline of the characters `sit' on the path) and |inner xsep=0pt| (to
+ horizontally fit each node to the character it contains, reducing the
+ spacing between characters).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!}}]
+
+\path [draw=red, dotted, postaction={decorate}]
+ (0,0) .. controls ++(1,0) and ++(-1,0) .. (3,2);
+\path [draw=blue, dotted, yshift=1cm, postaction={decorate},
+ text effects={text along path}]
+ (0,0) .. controls ++(1,0) and ++(-1,0) .. (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{key}{/pgf/decoration/text effects/characters=\marg{effects}}
+ Shorthand for the |every character|.
+ \end{key}
+
+ \begin{stylekey}{/pgf/decoration/text effects/character \meta{number}}
+ Specify additional effects for the character \meta{number}.
+ \end{stylekey}
+
+ \begin{stylekey}{/pgf/decoration/text effects/every letter}
+ Specify additional effects for every letter (i.e., every character that
+ isn't the word separator) in the decoration text.
+ \end{stylekey}
+
+ \begin{stylekey}{/pgf/decoration/text effects/letter \meta{number}}
+ Specify the effects for letter \meta{number} in \emph{every} word.
+ \end{stylekey}
+
+
+\begin{stylekey}{/pgf/decoration/text effects/every first letter}
+ Specify additional effects for the first letter in \emph{every} word.
+\end{stylekey}
+
+\begin{stylekey}{/pgf/decoration/text effects/every last letter}
+ Specify additional effects for the last letter in \emph{every} word.
+\end{stylekey}
+
+\begin{stylekey}{/pgf/decoration/text effects/every word}
+ Specify additional effects for every word in the decoration text.
+\end{stylekey}
+
+\begin{stylekey}{/pgf/decoration/text effects/word \meta{number}}
+ Specify additional effects for word \meta{number} in the decoration text.
+\end{stylekey}
+
+\begin{stylekey}{/pgf/decoration/text effects/word \meta{m} letter \meta{n}}
+ Specify additional effects for letter \meta{n} in word \meta{m} in the
+ decoration text.
+\end{stylekey}
+
+\begin{stylekey}{/pgf/decoration/text effects/every word separator}
+ Specify additional effects for every character that is a word separator.
+\end{stylekey}
+
+\begin{key}{/pgf/decoration/text effects/word separator=\meta{character} (initially space)}
+ Specify the character that is to be used as the word separator. This
+ \emph{must} be a single character such as |a| or |-| or the special value
+ |space| (which should be used to indicate that spaces should be used as the
+ separator).
+\end{key}
+
+ By default, the width for each character is calculated according to the
+ bounding box of the node in which it is contained. However, if the node is
+ rotated or slanted, or has a substantial |inner sep|, this bounding box
+ will be quite big. The following key enables different effects to be
+ applied to the node that is used to calculate the width.
+
+ \begin{stylekey}{/pgf/decoration/text effects/every character width}
+ This style is applied to the (invisible) nodes used for calculating the
+ width of a character node.
+ \end{stylekey}
+
+ \begin{key}{/pgf/decoration/text effects/character widths=\marg{effects}}
+ Shorthand for the |every character width| style.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!}, text align=center,
+ text effects/.cd,
+ character count=\i,
+ characters={xslant=0.5, text along path, name=c-\i}}]
+
+\path [decorate] (0,0) -- (3,2);
+\path [decorate,
+ text effects={character widths={inner xsep=0pt, xslant=0}}]
+ (0,1) -- (3,3);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ It is possible to parameterize effects, perhaps for doing calculations, or
+ labelling nodes based on the number of the character in the decoration
+ text. To access the number of the character, and the total number of
+ characters the following keys can be used. However, these keys should
+ \emph{not} be used inside the style keys given above.
+
+ \begin{key}{/pgf/decoration/text effects/character count=\meta{macro}}
+ Store the number of the character being typeset in \meta{macro}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text,
+ character count=\i, every word separator/.style={fill=red!30},
+ characters={text along path, shape=circle, fill=gray!50}}]
+
+\path [decorate, text effects={characters/.append={label=above:\footnotesize\i}}] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/character total=\meta{macro}}
+ Store the total number of the characters in the decoration text in
+ \meta{macro}. This key can be used with the |character count| key to
+ produce some quite pleasing effects:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ character count=\i, character total=\n,
+ characters={text along path, evaluate={\c=\i/\n*100;},
+ text=orange!\c!blue, scale=\i/\n+0.5}}]
+
+\path [decorate]
+ (0,0) .. controls ++(1,0) and ++(-1,0) .. (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/letter count=\meta{macro}}
+ Store the number of letter being typeset (i.e., the position of the
+ character in the word) in \meta{macro}. Numbering starts at |1| and the
+ character acting as a word separator is numbered |0|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, letter count=\i, every word separator/.style={fill=red!30},
+ characters={text along path, shape=circle, fill=gray!50}}]
+
+\path [decorate, text effects={characters/.append={label=above:\footnotesize\i}}] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text/effetcs/letter total=\meta{macro}}
+ Store the number of letters in the current word in \meta{macro}. When
+ the character is the word separator, this value is |0|.
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/word count=\meta{macro}}
+ Store the number of words in the decoration text in \meta{macro}.
+ Numbering starts at |1|. When the character is the word separator,
+ \meta{macro} takes the number of the previous word. If the decoration
+ text starts with a word separator \meta{macro} will be |0|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, word count=\i, every word separator/.style={fill=red!30},
+ characters={text along path, shape=circle, fill=gray!50}}]
+
+ \path [decorate, text effects={characters/.append={label=above:\footnotesize\i}}] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/word total=\meta{macro}}
+ Store the total number of words in the decoration text in \meta{macro}.
+ \end{key}
+
+ It is also possible to apply effects to specific characters such as
+ coloring every instance of the character |a|, or changing the font of every
+ |T| in the decoration text:
+
+ \begin{key}{/pgf/decoration/text effects/style characters=\marg{characters} with \marg{effects}}
+ This key enables \meta{effects} to be applied to every character in the
+ decoration text that is specified in \meta{characters}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={Falsches {\"U}ben von Xylophonmusik qu{\"a}lt jeden gr{\"o}{\ss}eren Zwerg},
+ text effects/.cd,
+ path from text,
+ style characters=aeiou{\"U}{\"a}{\"o} with {text=blue},
+ characters={text along path}}]
+
+\path [decorate] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/path from text=\opt{\marg{true or false}} (default true)}
+ When this key is set to |true| and the decorated path consists only of
+ a single point, the decoration will calculate the width of the
+ decoration text using all the specified parameters as if the decorated
+ path was actually a straight line starting from the given point. This
+ `virtual' straight line is then decorated with the text.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text,
+ character count=\i, character total=\n,
+ characters={text along path, scale=\i/\n+0.5}}]
+
+\path [decorate] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/path from text angle=\meta{angle}}
+ When used in conjunction with the |path from text| key, the straight
+ line that is used as the decorated path is rotated by \meta{angle}
+ around the starting point.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60,
+ character count=\i, character total=\n,
+ characters={text along path, scale=\i/\n+0.5}}]
+
+\path [decorate] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/fit text to path=\opt{\meta{true or false}} (default true)}
+ This key will make the decoration increase the space between characters
+ so that the entire path is used by the decoration.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/every character/.style={text along path}}]
+
+\path [draw=gray, postaction={decorate}, rotate=90]
+ (0,0) .. controls ++(2,0) and ++(-1,0) .. (5,-1);
+\path [draw=gray, postaction={decorate}, rotate=90, yshift=-1cm,
+ text effects={fit text to path}]
+ (0,0) .. controls ++(2,0) and ++(-1,0) .. (5,-1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/scale text to path=\opt{\meta{true or false}} (default true)}
+ This key will make the decoration scale the text so that the entire
+ path is used by the decoration.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/every character/.style={text along path}}]
+
+\path [draw=gray, postaction={decorate}, rotate=90]
+ (0,0) .. controls ++(2,0) and ++(-1,0) .. (5,-1);
+\path [draw=gray, postaction={decorate}, rotate=90, yshift=-1cm,
+ text effects={scale text to path}]
+ (0,0) .. controls ++(2,0) and ++(-1,0) .. (5,-1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/reverse text}
+ Reverse the order of the characters in the decoration text. This may be
+ useful if using `right-to-left` languages. Unfortunately, any leading
+ `soft' spaces in the original text will be lost.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60,
+ reverse text,
+ character count=\i, character total=\n,
+ characters={text along path, scale=\i/\n+0.5}}]
+
+\path [decorate] (0,0) .. controls ++(1,0) and ++(-1,0) .. (3,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ It is important to note that the |reverse text| key reverses the text
+ \emph{before} doing anything else. This means that the numbering of
+ characters, letters and words will still be in the normal order, so any
+ parameterized effects will have to take this into account.
+ Alternatively, to get the numbering to follow the reversed text, it is
+ possible to reverse the path and then invert the scale:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60,
+ character count=\i, character total=\n,
+ characters={text along path, scale=\i/\n+0.5}}]
+
+\path [decorate, text effects={reverse text}] (0,0);
+\path [blue, decorate, decoration={reverse path},
+ text effects={characters/.append={scale=-1}}] (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/group letters}
+ Group sequences of letters together so they are treated as a single
+ `character'.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60,
+ every word separator/.style={fill=none},
+ character count=\i, character total=\n,
+ characters={text along path, fill=gray!50, scale=\i/\n+0.5}}]
+
+\path [decorate] (0,0);
+\path [decorate, text effects={group letters,
+ characters/.append={fill=red!20}}]
+ (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The order in which the |reverse text| and |group letters| keys are applied
+ is important:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60,
+ every word separator/.style={fill=none},
+ character count=\i, character total=\n,
+ characters={text along path, fill=gray!50, scale=\i/\n+0.5}}]
+
+\path [decorate, text effects={reverse text, group letters}] (0,0);
+\path [decorate, text effects={group letters, reverse text,
+ characters/.append={fill=red!20}}] (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/pgf/decoration/text effects/repeat text=\opt{\meta{times}}}
+ Usually, when the decoration runs out of text, it simply stops. This
+ key will make the decoration repeat the decoration text for the
+ specified number of \meta{times}. If no value is given the text will be
+ repeated until the path is finished. There are two points to remember
+ however. Firstly the numbering of characters, letters and words will be
+ restarted each time the text is repeated. Secondly, the options for
+ alignment, scaling or fitting the text to the path, fitting the path to
+ the text, and so on, are computed using the decoration text before the
+ decoration starts. If any of these options are given the behaviour of
+ the |repeat text| key is undefined, but typically it will be ignored.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!\ },
+ text effects/.cd,
+ repeat text,
+ character count=\m, character total=\n,
+ characters={text along path, scale=0.5+\m/\n/2}}]
+
+\path [draw=gray, ultra thin, postaction=decorate]
+ (180:2) \foreach \a in {0,...,12}{ arc (180-\a*90:90-\a*90:1.5-\a/10) };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/character command=\meta{macro}}
+ This key specifies a command that is executed when each character is
+ placed in the node. The \meta{macro} should be an ordinary \TeX\ macro
+ which takes one argument. The argument will be a macro which when
+ expanded will contain the current character.
+ %
+\begin{codeexample}[]
+\def\mycommand#1{#1$_\n$}
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60, group letters,
+ word count=\n,
+ every word/.style={character command=\mycommand},
+ characters={text along path}}]
+
+\path [decorate] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/decoration/text effects/replace characters=\meta{characters} with \marg{code}}
+ Replace the node for each character in \meta{characters} with
+ \meta{code}. The \meta{code} can be thought of as describing a little
+ picture or marking which will be used instead of the character node.
+ The origin will be the current point along the decoration path. Any
+ transformations associated with the \meta{characters} (e.g., applied
+ with the |every character| or |every letter| styles) will also be
+ applied to \meta{code}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text effects along path,
+ text={text effects along path!},
+ text effects/.cd,
+ path from text, path from text angle=60,
+ replace characters=e with {\fill [red!20] (0,1mm) circle [radius=1mm];},
+ replace characters=a with {\fill [black!20] (0,1mm) circle [radius=1mm];},
+ character count=\i, character total=\n,
+ characters={text along path, scale=\i/\n+0.5}}]
+
+\path [decorate] (0,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{decoration}
+
+
+\subsection{Fractal Decorations}
+
+\begin{pgflibrary}{decorations.fractals}
+ The decorations of this library can be used to create fractal lines. To use
+ them, you typically have to apply the decoration repeatedly to an
+ originally straight path.
+\end{pgflibrary}
+
+\begin{decoration}{Koch curve type 1}
+ This decoration replaces a straight line by a ``rectangular bump''. By
+ repeatedly applying this replacement, different levels of the Koch curve
+ fractal can be created. Its Hausdorff dimension is $\log 5/\log 3$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=Koch curve type 1]
+ \draw decorate{ (0,0) -- (3,0) };
+ \draw decorate{ decorate{ (0,-1.5) -- (3,-1.5) }};
+ \draw decorate{ decorate{ decorate{ (0,-3) -- (3,-3) }}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{Koch curve type 2}
+ This decoration replaces a straight line by a ``rectangular sine''. Its
+ Hausdorff dimension is $3/2$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=Koch curve type 2]
+ \draw decorate{ (0,0) -- (3,0) };
+ \draw decorate{ decorate{ (0,-2) -- (3,-2) }};
+ \draw decorate{ decorate{ decorate{ (0,-4) -- (3,-4) }}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{Koch snowflake}
+ This decoration replaces a straight line by a ``line with a spike''. The
+ Hausdorff dimension of Koch's snowflake's is $\log 4/\log 3$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=Koch snowflake]
+ \draw decorate{ (0,0) -- (3,0) };
+ \draw decorate{ decorate{ (0,-1) -- (3,-1) }};
+ \draw decorate{ decorate{ decorate{ (0,-2) -- (3,-2) }}};
+ \draw decorate{ decorate{ decorate{ decorate{ (0,-3) -- (3,-3) }}}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
+
+\begin{decoration}{Cantor set}
+ This decoration replaces a straight line by a ``line with a gap in the
+ middle''. The Hausdorff dimension of the Cantor set is $\log 2/\log 3$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=Cantor set,very thick]
+ \draw decorate{ (0,0) -- (3,0) };
+ \draw decorate{ decorate{ (0,-.5) -- (3,-.5) }};
+ \draw decorate{ decorate{ decorate{ (0,-1) -- (3,-1) }}};
+ \draw decorate{ decorate{ decorate{ decorate{ (0,-1.5) -- (3,-1.5) }}}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{decoration}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-edges.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-edges.tex
new file mode 100644
index 0000000000..09666becea
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-edges.tex
@@ -0,0 +1,329 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{To Path Library}
+\label{library-to-paths}
+
+\begin{tikzlibrary}{topaths}
+ This library provides predefined to paths for use with the |to| path
+ operation. After loading this package, you can say for instance |to [loop]|
+ to add a loop to a node.
+
+ This library is loaded automatically by \tikzname, so you do not need to
+ load it yourself.
+\end{tikzlibrary}
+
+
+\subsection{Straight Lines}
+
+The following style installs a to path that is simply a straight line from the
+start coordinate to the target coordinate.
+
+\begin{key}{/tikz/line to}
+ Causes a straight line to be added to the path upon a |to| or an |edge|
+ operation.
+ %
+\begin{codeexample}[]
+\tikz {\draw (0,0) to[line to] (1,0);}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Move-Tos}
+
+The following style installs a to path that simply ``jumps'' to the target
+coordinate.
+
+\begin{key}{/tikz/move to}
+ Causes a move to be added to the path upon a |to| or an |edge| operation.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) to[line to] (1,0)
+ to[move to] (2,0) to[line to] (3,0);
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Curves}
+
+The |curve to| style causes the to path to be set to a curve. The exact way
+this curve looks can be influenced via a number of options.
+
+\begin{key}{/tikz/curve to}
+ Specifies that the |to path| should be a curve. This curve will leave the
+ start coordinate at a certain angle, which can be specified using the |out|
+ option. It reaches the target coordinate also at a certain angle, which is
+ specified using the |in| option. The control points of the curve are at a
+ certain distance that is computed in different ways, depending on which
+ options are set.
+
+ All of the following options implicitly cause the |curve to| style to be
+ installed.
+
+ \begin{key}{/tikz/out=\meta{angle}}
+ The angle at which the curve leaves the start coordinate. If the start
+ coordinate is a node, the start coordinate is the point on the border
+ of the node at the given \meta{angle}. The control point will, thus,
+ lie at a certain distance in the direction \meta{angle} from the start
+ coordinate.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[out=45,in=135]
+ \draw (0,0) to (1,0)
+ (0,0) to (2,0)
+ (0,0) to (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/in=\meta{angle}}
+ The angle at which the curve reaches the target coordinate.
+ \end{key}
+
+ \begin{key}{/tikz/relative=\meta{true or false} (default true)}
+ This option tells \tikzname\ whether the |in| and |out| angles should
+ be considered absolute or relative. Absolute means that an |out| angle
+ of 30$^\circ$ means that the curve leaves the start coordinate at an
+ angle of 30$^\circ$ relative to the paper (unless, of course, further
+ transformations have been installed). A \emph{relative} angle is, by
+ comparison, measured relative to a straight line from the start
+ coordinate to the target coordinate. Thus, a relative angle of
+ 30$^\circ$ means that the curve will bend to the left from the line
+ going straight from the start to the target. For the target, the
+ relative coordinate is measured in the same manner, namely relative to
+ the line going from the start to the target. Thus, an angle of
+ 150$^\circ$ means that the curve will reach target coming slightly from
+ the left.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[out=45,in=135,relative]
+ \draw (0,0) to (1,0)
+ to (2,1)
+ to (2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[out=90,in=90,relative]
+ \node [circle,draw] (a) at (0,0) {a};
+ \node [circle,draw] (b) at (1,1) {b};
+ \node [circle,draw] (c) at (2,2) {c};
+
+ \path (a) edge (b)
+ edge (c);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/bend left=\meta{angle} (default \normalfont last value)}
+ This option sets |out=|\meta{angle}|,in=|$180-\meta{angle}$|,relative|.
+ If no \meta{angle} is given, the last given |bend left| or |bend right|
+ angle is used.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid]
+ \node[state,initial] (q_0) {$q_0$};
+ \node[state] (q_1) [right=of q_0] {$q_1$};
+ \node[state,accepting](q_2) [right=of q_1] {$q_2$};
+
+ \path[->] (q_0) edge node [above] {0} (q_1)
+ edge [loop above] node {1} ()
+ edge [bend left] node [above] {1} (q_2)
+ edge [bend right] node [below] {0} (q_2)
+ (q_1) edge node [above] {1} (q_2);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \angle in {0,45,...,315}
+ \node[rectangle,draw=black!50] (\angle) at (\angle:2) {\angle};
+
+ \foreach \from/\to in {0/45,45/90,90/135,135/180,
+ 180/225,225/270,270/315,315/0}
+ \path (\from) edge [->,bend right=22,looseness=0.8] (\to)
+ edge [<-,bend left=22,looseness=0.8] (\to);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/bend right=\meta{angle} (default \normalfont last value)}
+ Works like the |bend left| option, only the bend is to the other side.
+ \end{key}
+
+ \begin{key}{/tikz/bend angle=\meta{angle}}
+ Sets the angle to be used by the |bend left| or |bend right|, but
+ without actually selecting the |curve to| or the |relative| option.
+ This is useful for globally specifying a |bend angle| for a whole
+ picture.
+ \end{key}
+
+ \begin{key}{/tikz/looseness=\meta{number} (initially 1)}
+ This number specifies how ``loose'' the curve will be. In detail, the
+ following happens: \tikzname\ computes the distance between the start
+ and the target coordinate (if the start and/or target coordinate are
+ nodes, the distance is computed between the points on their border).
+ This distance is then multiplied by a fixed factor and also by the
+ factor \meta{number}. The resulting distance, let us call it $d$, is
+ then used as the distance of the control points from the start and
+ target coordinates.
+
+ The fixed factor has been chosen in such a way that if \meta{number} is
+ |1|, if the |in| and |out| angles differ by 90$\circ$, then a quarter
+ circle results:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) to [out=0,in=-90] (1,1);
+\tikz \draw (0,0) to [out=0,in=-90,looseness=0.5] (1,1);
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/out looseness=\meta{number}}
+ Specifies the looseness factor for the out distance only.
+ \end{key}
+
+ \begin{key}{/tikz/in looseness=\meta{number}}
+ Specifies the looseness factor for the in distance only.
+ \end{key}
+ %
+ \begin{key}{/tikz/min distance=\meta{distance}}
+ If the computed distance for the start and target coordinates are below
+ \meta{distance}, then \meta{distance} is used instead.
+ \end{key}
+ %
+ \begin{key}{/tikz/max distance=\meta{distance}}
+ If the computed distance for the start and target coordinates are above
+ \meta{distance}, then \meta{distance} is used instead.
+ \end{key}
+ %
+ \begin{key}{/tikz/out min distance=\meta{distance}}
+ The minimum distance set only for the start coordinate.
+ \end{key}
+ %
+ \begin{key}{/tikz/out max distance=\meta{distance}}
+ The maximum distance set only for the start coordinate.
+ \end{key}
+ %
+ \begin{key}{/tikz/in min distance=\meta{distance}}
+ The minimum distance set only for the target coordinate.
+ \end{key}
+ %
+ \begin{key}{/tikz/in max distance=\meta{distance}}
+ The maximum distance set only for the target coordinate.
+ \end{key}
+ %
+ \begin{key}{/tikz/distance=\meta{distance}}
+ Set the minimum and maximum distance to the same value \meta{distance}.
+ Note that this causes any computed distance $d$ to be ignored and
+ \meta{distance} to be used instead.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[out=45,in=135,distance=1cm]
+ \draw (0,0) to (1,0)
+ (0,0) to (2,0)
+ (0,0) to (3,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+ %
+ \begin{key}{/tikz/out distance=\meta{distance}}
+ Sets the minimum and maximum out distance.
+ \end{key}
+ %
+ \begin{key}{/tikz/in distance=\meta{distance}}
+ Sets the minimum and maximum in distance.
+ \end{key}
+ %
+ \begin{key}{/tikz/out control=\meta{coordinate}}
+ This option causes the \meta{coordinate} to be used as the start
+ control point. All computations of $d$ are ignored. You can use a
+ coordinate like |+(1,0)| to specify a point relative to the start
+ coordinate.
+ \end{key}
+ %
+ \begin{key}{/tikz/in control=\meta{coordinate}}
+ This option causes the \meta{coordinate} to be used as the target
+ control point.
+ \end{key}
+ %
+ \begin{key}{/tikz/controls=\meta{coordinate}| and |\meta{coordinate}}
+ This option causes the \meta{coordinate}s to be used as control points.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) to [controls=+(90:1) and +(90:1)] (3,0);
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsection{Loops}
+
+\begin{key}{/tikz/loop}
+ This key is similar to the |curve to| key, but differs in the following
+ ways: First, the actual target coordinate is ignored and the start
+ coordinate is used as the target coordinate. Thus, it is allowed not to
+ provide any target coordinate, which can be useful with unnamed nodes.
+ Second, the |looseness| is set to |8| and the |min distance| to |5mm|.
+ These settings result in rather nice loops when the opening angle
+ (difference between |in| and |out|) is 30$^\circ$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circle,draw] {a} edge [in=30,out=60,loop] ();
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{stylekey}{/tikz/loop above}
+ Sets the |loop| style and sets in and out angles such that loop is above
+ the node. Furthermore, the |above| option is set, which causes a node label
+ to be placed at the correct position.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circle,draw] {a} edge [loop above] node {x} ();
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/loop below}
+ Works like the previous option.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/loop left}
+ Works like the previous option.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/loop right}
+ Works like the previous option.
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/every loop (initially {->,shorten >=1pt})}
+ This style is installed at the beginning of every loop.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every loop/.style={}]
+ \draw (0,0) to [loop above] () to [loop right] ()
+ to [loop below] () to [loop left] ();
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-er.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-er.tex
new file mode 100644
index 0000000000..691d4e1d79
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-er.tex
@@ -0,0 +1,155 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Entity-Relationship Diagram Drawing Library}
+
+\begin{tikzlibrary}{er}
+ This packages provides styles for drawing entity-relationship diagrams.
+\end{tikzlibrary}
+
+This library is intended to help you in creating E/R-diagrams. It defines only
+few new styles, but using the style |entity| instead of saying |rectangle,draw|
+makes the code more expressive.
+
+
+\subsection{Entities}
+
+The package defines a simple style for drawing entities:
+
+\begin{stylekey}{/tikz/entity}
+ This style is to be used with nodes that represent entity types. It causes
+ the node's shape to be set to a rectangle that is drawn and whose minimum
+ size and width are set to sensible values.
+
+ Note that this style is called |entity| despite the fact that it is to be
+ used for nodes representing entity \emph{types} (the difference between an
+ entity and an entity type is the same as the difference between an object
+ and a class in object-oriented programming). If this bothers you, feel free
+ to define a style |entity type| instead.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[entity] (sheep) {Sheep};
+ \node[entity] (genome) [right=of sheep] {Genome};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every entity}
+ This style is evoked by the style |entity|. To change the appearance of
+ entities, you can change this style.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every entity/.style={draw=blue!50,fill=blue!20,thick}]
+ \node[entity] (sheep) {Sheep};
+ \node[entity] (genome) [right=of sheep] {Genome};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Relationships}
+
+Relationships are drawn using styles that are very similar to the styles for
+entities.
+
+\begin{stylekey}{/tikz/relationship}
+ This style works like |entity|, only it is to be used for relationships.
+ Again, |relationship|s are actually relationship types.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[entity] (sheep) at (0,0) {Sheep};
+ \node[entity] (genome) at (2,0) {Genome};
+ \node[relationship] at (1,1.5) {has}
+ edge (sheep)
+ edge (genome);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every relationship}
+ Works like |every entity|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every entity/.style={fill=blue!20,draw=blue,thick},
+ every relationship/.style={fill=orange!20,draw=orange,thick,aspect=1.5}]
+ \node[entity] (sheep) at (0,0) {Sheep};
+ \node[entity] (genome) at (2,0) {Genome};
+ \node[relationship] at (1,1.5) {has}
+ edge (sheep)
+ edge (genome);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Attributes}
+
+\begin{stylekey}{/tikz/attribute}
+ This style is used to indicate that a node is an attribute. To connect an
+ attribute to its entity, you can use, for example, the |child| command or
+ the |pin| option.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[entity] (sheep) {Sheep}
+ child {node[attribute] {name}}
+ child {node[attribute] {color}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every pin edge/.style=draw]
+ \node[entity,pin={[attribute]60:name},pin={[attribute]120:color}] {Sheep};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/key attribute}
+ This style is intended for key attributes. By default, the will cause the
+ attribute to be typeset in italics. Typically, underlining is used instead,
+ but that looks ugly and it is difficult to implement in \TeX.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every attribute}
+ This style is used with every attribute, and therefore also for every key
+ attribute.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [text depth=1pt,
+ every attribute/.style={fill=black!20,draw=black},
+ every entity/.style={fill=blue!20,draw=blue,thick},
+ every relationship/.style={fill=orange!20,draw=orange,thick,aspect=1.5}]
+
+ \node[entity] (sheep) at (0,0) {Sheep}
+ child {node [key attribute] {name}};
+ \node[entity] (genome) at (2,0) {Genome};
+ \node[relationship] at (1,1.5) {has}
+ edge (sheep)
+ edge (genome);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-external.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-external.tex
new file mode 100644
index 0000000000..db97f4400e
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-external.tex
@@ -0,0 +1,1226 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Externalization Library}
+\label{section-libs-external}
+
+{
+\pgfkeys{
+ /pdflinks/search key prefixes in/.add={/tikz/external/,}{}
+}
+{\noindent {\emph{by Christian Feuersänger}}}
+
+\begin{tikzlibrary}{external}
+ This library provides a high-level automatic or semi--automatic export
+ feature for \tikzname\ pictures. Its purpose is to convert each picture to
+ a separate \pdf\ without changing the document as such.
+
+ It also externalizes |\label| information (and other aux file related
+ stuff) using auxiliary files.
+\end{tikzlibrary}
+
+
+\subsection{Overview}
+
+There are several reasons why external images for at least some pictures are of
+interest:
+%
+\begin{enumerate}
+ \item Larger picture require a considerable amount of time, which is
+ necessary for every compilation. However, only few images will change
+ from run to run. It can simply save time to export finished images and
+ include them as final graphics.
+ \item It may be desirable to have final images for some graphics, for
+ example to include them in third--party programs or to communicate them
+ electronically.
+ \item It may be necessary to typeset a file in environments where \pgfname\
+ and \tikzname\ are not available. In this case, external images are the
+ only way to ensure compatibility.
+\end{enumerate}
+%
+The purpose of this library is to provide a way to export any \tikzname-picture
+to separate \pdf\ (or \eps) images without changing the main document. It is
+actually a simple user interface to the |\beginpgfgraphicnamed| $\dotsc$
+|\endpgfgraphicnamed| framework of \pgfname\ which is discussed in
+section~\ref{section-external}.
+
+
+\subsection{Requirements}
+
+For most users, the library does not need special attention since requirements
+are met anyway. It collects all tokens between |\begin{tikzpicture}| and the
+next following |\end{tikzpicture}| and replaces them by the appropriate
+graphics or it takes steps to generate such an image.
+%For Con\TeX t and plain \TeX\ users, the appropriate begin and end picture
+%statements apply.
+
+It can't expand macros during this step, so the only requirement is that every
+picture's end is directly reachable from its beginning, without further macro
+expansion. Furthermore, the library assumes that all \LaTeX\ pictures are ended
+with |\end{tikzpicture}|.
+%In Con\TeX t, the end command is assumed to be |\stoptikzpicture| and for plain
+%\TeX\ it is |\endtikzpicture|.
+
+The library always searches for the \emph{next} picture's end,
+|\end{tikzpicture}|. As a consequence, you can't use nested pictures directly.
+You \emph{can} nest pictures, but you have to avoid that the nested picture's
+|\end| command is found before the outer |\end| command (for example using
+bracing constructs or by writing the nested picture into a separate macro
+call).
+
+Consider using the |\tikzexternaldisable| method in case you'd like to skip
+selected pictures which do not meet the requirements.
+
+
+\subsection{A Word About Con\TeX t And Plain \TeX}
+
+Currently, the basic layer backend |\beginpgfgraphicnamed| $\dotsc$
+|\endpgfgraphicnamed| relies on \LaTeX\ only, so externalization is currently
+only supported for \LaTeX.
+%The library comes in three different versions, one for \LaTeX, one for Con\TeX
+%t and one for plain \TeX. For reasons of simplicity, examples in this manual
+%only refer to \LaTeX\ (especially |pdflatex|).
+
+
+\subsection{Externalizing Graphics}
+
+After loading the library, a call to |\tikzexternalize| is necessary to
+activate the externalization.
+%
+\begin{codeexample}[code only]
+\documentclass{article}
+% main document, called main.tex
+\usepackage{tikz}
+
+\usetikzlibrary{external}
+\tikzexternalize % activate!
+
+\begin{document}
+\begin{tikzpicture}
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+
+A simple image is \tikz \fill (0,0) circle(5pt);.
+\end{document}
+\end{codeexample}
+
+The method works as follows: if the document is typeset normally, the library
+searches for replacement images for every picture. Filenames are generated
+automatically in the default configuration. In our case, the two file names
+will be |main-figure0| and |main-figure1|. If they exist, those images are
+simply included and the pictures as such are not processed. If graphics files
+do not exist, steps are taken to generate the missing ones. Since (currently)
+only one output file can be set, each missing image needs to be generated by a
+separate run of \LaTeX\ in which the |\jobname| is set to the desired image
+file name. In the default configuration |mode=convert with system call|, these
+commands are issued automatically by using the |\write18| method to call system
+commands. It is also possible to output every required file name or to generate
+a |makefile|; users will need to issue the required commands manually (or with
+|make|). The probably most comfortable way is to use the default configuration
+with
+%
+\begin{codeexample}[code only, tikz syntax=false]
+pdflatex -shell-escape main
+\end{codeexample}
+%
+\noindent which authorizes |pdflatex| to call itself recursively to generate
+the images. When it finishes, all images are generated and the document already
+includes them.
+
+From this point on, successive runs of \LaTeX\ will use the final graphics
+files, the pictures won't be used anymore.
+Section~\ref{section-libs-external-nopgf} contains details about how to submit
+such a file to environments where \pgfname\ is not available.
+
+\begin{command}{\tikzexternalize\oarg{optional arguments}}
+ This command activates the externalization. It installs commands to replace
+ every \tikzname-picture. It needs to be called before |\begin{document}|
+ because it may need to install its separate shipout routine.
+
+ The \meta{optional arguments} can be any of the keys described below.
+
+ Note that the generation/modification of auxiliary files like |.aux|,
+ |.toc| etc.\ is usually suppressed while a single image is externalized
+ (details for |\label| support follow).
+
+ It is also possible to write |\tikzexternalize|\marg{main job name} if the
+ argument is delimited by curly braces. This case is mainly for backwards
+ compatibility and is no longer necessary. Since it might be useful in rare
+ circumstances, it is documented in section~\ref{sec:external:detail}.
+
+ A detailed description about the process of externalization is provided in
+ section~\ref{sec:external:detail}.
+
+ \begin{command}{\tikzexternalrealjob}
+ After the library is loaded, this macro will \emph{always} contain the
+ correct main job's name (in the example above, it is |main|). It is to
+ be used instead of |\jobname| when the externalization is in effect.
+ \end{command}
+ %
+ \begin{command}{\pgfactualjobname}
+ Once |\tikzexternalize| has been called, |\pgfactualjobname| contains
+ the name of the currently generated output file (which may be |main| or
+ |main-figure0| or |main-figure1| in our example above).
+ \end{command}
+ %
+ \begin{command}{\jobname}
+ The value of |\jobname| is one of |\tikzexternalrealjob| or
+ |\pgfactualjobname|, depending on the configuration. In short: if
+ auxiliary file support (|\label| and |\ref|) is activated,
+ |\jobname=\tikzexternalrealjob| (since that's the base file name of
+ auxiliary files).
+ \end{command}
+\end{command}
+
+\begin{key}{/tikz/external/system call=\marg{template}}
+\label{extlib:systemcall:option}
+ A template string used to generate system calls. Inside of \marg{template},
+ the macro |\image| can be used as placeholder for the image which is about
+ to be generated while |\texsource| contains the main file name (in truth,
+ it contains |\input|\marg{main file name}, but that doesn't matter).
+
+ The default depends on the value of |\pgfsysdriver|. For
+ |pgfsys-pdftex.def|, it is
+ %
+\begin{codeexample}[code only]
+\tikzset{external/system call={pdflatex \tikzexternalcheckshellescape -halt-on-error
+ -interaction=batchmode -jobname "\image" "\texsource"}}
+\end{codeexample}
+ %
+ \noindent where \declareandlabel{\tikzexternalcheckshellescape} inserts the
+ value of the configuration key |shell escape| if and only if the current
+ document has been typeset with |-shell-escape|\footnote{Note that this is
+ always true for the default configuration. This security consideration
+ applies mainly for \texttt{mode=list and make} which will also work
+ \emph{without} shell escapes.}.
+
+ Other drivers result in slightly different calls. There is support for
+ |lualatex|, |xelatex|, and |dvips|. The precise values are written to the
+ |.log| file as soon as you attempt to compile a document.
+
+ The argument \marg{template} will be expanded using |\edef|, so any control
+ sequences will be expanded. During this evaluation, `|\\|' will result in a
+ normal backslash, `|\|'. Furthermore, double quotes `|"|', single quotes
+ `|'|', semicolons and dashes `|-|' will be made to normal characters if any
+ package uses them as macros. This ensures compatibility with the |german|
+ package, for example.
+\end{key}
+
+\begin{key}{/tikz/external/shell escape=\marg{command-line arg} (initially -shell-escape)}
+ Contains the command line option for |latex| which enables the |\write18|
+ feature. For \TeX-Live, this is |-shell-escape|. For MiK\TeX, you should
+ use |\tikzexternalize[shell escape=-enable-write18]|.
+\end{key}
+
+
+\subsubsection{Support for Labels and References In External Files}
+
+The |external| library comes with extra support for |\label| and |\ref| (and
+other commands which usually store information in the |.aux| file) inside an
+external files.
+
+In particular, it supports the two use-cases
+%
+\begin{enumerate}
+ \item[a)] |\ref| to something in the main document inside an externalized
+ graphics or
+ \item[b)] |\label| in the externalized graphics which is referenced in the
+ main document.
+\end{enumerate}
+
+The only restriction is that you need to compile your document multiple times
+(as usual for references).
+
+\paragraph{NOTE:}
+support for a) is unavailable for versions up to and including \pgfname\ 3.0.1.
+
+\begin{key}{/tikz/external/aux in dpth=\marg{boolean} (initially true)}
+ Allows to enable or disable the feature which handles references and labels
+ as part of image externalization. Disabling it will safe one |\newwrite|
+ command, i.e.\ a write register.
+
+ Also see the |disable dependency files| feature.
+
+ Here are some implementation details on how references within/from external
+ graphics work for those who would like to know the details:
+
+ For point a), a |\ref| inside of an externalized graphics works by reading
+ the main document's |.aux| file. To this end, the standard
+ |mode=convert with system call| detects such references and reschedules the
+ externalization to |\end{document}.|\footnote{Note that this requires the
+ \texttt{atveryend} package. The purpose to reschedule the externalization
+ is to access the main job's aux file, but only after it has been written
+ completely.} Other values of |mode| require just one attempt to externalize
+ the picture.
+
+ Note that |\pageref| is not supported (sorry).
+
+ Point b) works as follows: a |\label| inside of an externalized graphics
+ causes the external library to generate separate auxiliary files for every
+ external image. These files are called \meta{imagename}|.dpth|. The
+ extension |.dpth| indicates that the file also contains the image's depth
+ (the |baseline| key of \tikzname). Furthermore, anything which would have
+ been written to an |.aux| file will be redirected to the |.dpth| file --
+ but only things which occur inside of the externalized |tikzpicture|
+ environment. When the main document loads the image, it will copy the
+ |.dpth| file into the main |.aux| file. Then, successive compilations of
+ the main document contain the external |\label| information. In other
+ words, a |\label| in an external graphics needs the following work flow:
+ %
+ \begin{enumerate}
+ \item The external graphics needs to be generated together with its
+ |.dpth| (usually automatically by \tikzname).
+ \item The main document includes the external graphics and copies the
+ |.dpth| content into its main |.aux| file.
+ \item The main document needs to be translated once again to re-read
+ its |.aux| file\footnote{Note that it is not possible to activate
+ the content of an auxiliary file after \texttt{\textbackslash
+ begin\{document\}} in \LaTeX.}.
+ \end{enumerate}
+
+ This does also work if a |\label|/|\ref| combination is implemented itsself
+ by a |tikzpicture| (a feature offered by |pgfplots|).
+\end{key}
+
+
+\subsubsection{Customizing the Generated File Names}
+
+The default filename for externalized graphics is `\meta{real file
+name}|-figure_|\meta{number}' where \meta{number} ranges from $0$ to whatever
+is required. However, there are a couple of ways to change the generated
+filenames:
+%
+\begin{itemize}
+ \item Changing the overall file name using a |prefix|,
+ \item Changing the file name for a single figure using
+ |\tikzsetnextfilename|,
+ \item Changing the file name for a restricted set of figures using
+ |figure name|.
+\end{itemize}
+
+\begin{key}{/tikz/external/prefix=\marg{file name prefix} (initially empty)}
+ A shortcut for |\tikzsetexternalprefix|\marg{file name prefix}, see below.
+\end{key}
+
+\begin{command}{\tikzsetexternalprefix\marg{file name prefix}}
+ Assigns a common prefix used by all file names. For example,
+ %
+\begin{codeexample}[code only]
+\tikzsetexternalprefix{figures/}
+\end{codeexample}
+ %
+ will prepend |figures/| to every external graphics file name.
+
+ Please note that |\tikzsetexternalprefix| is the \emph{only} way to assign
+ a prefix in case you want to prepare your document for environments where
+ \pgfname\ is not installed (see section~\ref{section-libs-external-nopgf}).
+\end{command}
+
+\begin{command}{\tikzsetnextfilename\marg{file name}}
+ Sets the file name for the \emph{next} \tikzname\ picture or |\tikz| short
+ command. It will \emph{only} be used for the next picture.
+
+ Pictures for which no explicit file name has been set (or the next file
+ name is empty) will get automatically generated file names.
+
+ Please note that |prefix| will still be prepended to \marg{file name}.
+ %
+\begin{codeexample}[code only]
+\documentclass{article}
+% main document, called main.tex
+\usepackage{tikz}
+
+\usetikzlibrary{external}
+\tikzexternalize[prefix=figures/] % activate
+
+\begin{document}
+
+\tikzsetnextfilename{trees}
+\begin{tikzpicture} % will be written to 'figures/trees.pdf'
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+
+\tikzsetnextfilename{simple}
+A simple image is \tikz \fill (0,0) circle(5pt);. % will be written to 'figures/simple.pdf'
+
+\begin{tikzpicture} % will be written to 'figures/main-figure0.pdf'
+ \draw[help lines] (0,0) grid (5,5);
+\end{tikzpicture}
+\end{document}
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+pdflatex -shell-escape main
+\end{codeexample}
+ %
+\end{command}
+
+\begin{key}{/tikz/external/figure name=\marg{name}}
+ Same as |\tikzsetfigurename|\marg{name}.
+\end{key}
+
+\begin{command}{\tikzsetfigurename\marg{name}}
+ Changes the names of \emph{all} following figures. It is possible to change
+ |figure name| during the document either using
+ |\tikzset{external/figure name|=\marg{name}|}| or with this command. A
+ unique counter will be used for each different \marg{name}, and each
+ counter will start at $0$.
+
+ The value of |prefix| will be applied after |figure name| has been
+ evaluated.
+ %
+\begin{codeexample}[code only]
+\documentclass{article}
+% main document, called main.tex
+\usepackage{tikz}
+
+\usetikzlibrary{external}
+\tikzexternalize % activate
+
+\begin{document}
+
+\begin{tikzpicture} % will be written to 'main-figure0.pdf'
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+
+{
+ \tikzsetfigurename{subset_}
+ A simple image is \tikz \fill (0,0) circle(5pt);. % will be written to 'subset_0.pdf'
+
+ \begin{tikzpicture} % will be written to 'subset_1.pdf'
+ \draw[help lines] (0,0) grid (5,5);
+ \end{tikzpicture}
+}% here, the old file name will be restored:
+
+\begin{tikzpicture} % will be written to 'main-figure1.pdf'
+ \draw (0,0) -- (5,5);
+\end{tikzpicture}
+\end{document}
+\end{codeexample}
+ %
+ The scope of |figure name| ends with the next closing brace.
+
+ Remark: Use |\tikzset{external/figure name/.add={prefix_}{_suffix_}}| to
+ add a |prefix_| and a |_suffix_| to the actual value of |figure name|.
+\end{command}
+
+\begin{command}{\tikzappendtofigurename\marg{suffix}}
+ Appends \meta{suffix} to the actual value of |figure name|.
+
+ It is a shortcut for |\tikzset{external/figure name/.add={}|\marg{suffix}|}|
+ (a shortcut which is also supported if \tikzname\ is not installed, see
+ below).
+\end{command}
+
+
+\subsubsection{Remaking Figures or Skipping Figures}
+
+\begin{command}{\tikzpicturedependsonfile\marg{file name}}
+ Adds a dependency for the \emph{next} picture which is about to be
+ externalized. If the command is invoked within a picture environment, it
+ adds a dependency for the surrounding picture. Dependencies are written
+ into \meta{target file}|.dep| in the format
+
+ \meta{target file}|.\tikzexternalimgextension: |\meta{file name}.
+
+ The effect is that if \meta{file name} changes, the external graphics
+ associated with the picture shall be remade.
+
+ This command uses the contents of
+ \declareandlabel{\tikzexternalimgextension} to check for graphics. If you
+ encounter difficulties with image extensions, consider redefining this
+ macro (after |\tikzexternalize|).
+
+ \paragraph{Limitations:}
+ this command is currently only supported for |mode=list and make| and the
+ generated |makefile|.
+\end{command}
+
+\begin{command}{\tikzexternalfiledependsonfile\marg{external graphics}\marg{file name}}
+ A variant of |\tikzpicturedependsonfile| which adds a dependency for an
+ \meta{external graphics}. The argument \meta{external graphics} must be the
+ path as it would have been generated by the external library, i.e.\ without
+ file extension but including any prefixes.
+\end{command}
+
+\begin{key}{/tikz/external/disable dependency files}
+ Allows to (irreversibly) disable the generation of file dependencies.
+ Disabling it will safe one |\newwrite| command, i.e.\ a write register.
+ Note that the write register is only allocated if the feature has been used
+ at all. This key needs to be provided as argument to |\tikzexternalize| (or
+ it needs to be set before calling |\tikzexternalize|).
+
+ Also see the |aux in dpth| key.
+\end{key}
+
+\begin{key}{/tikz/external/force remake=\marg{boolean} (default true)}
+ A boolean which is used to customize the up-to-date checks of all following
+ figures. Every up-to-date check will fail, resulting in automatic
+ regeneration of every following figure.
+ %
+\begin{codeexample}[code only]
+\tikzset{external/force remake}
+\begin{tikzpicture}
+ \draw (0,0) circle(5pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ You can also use |force remake| inside of a local \TeX\ group to remake
+ only selected pictures. The example
+ %
+\begin{codeexample}[code only]
+\tikz \draw (0,0) -- (1,1);
+
+{
+\tikzset{external/force remake}
+\begin{tikzpicture}
+ \draw (0,0) circle(5pt);
+\end{tikzpicture}
+}
+
+\tikz \draw (0,0) -- (1,1);
+\end{codeexample}
+ will only apply |force remake| to the second figure.
+
+ Up-to-date checks are applied for |mode=convert with system call| and the
+ makefile generated by |mode=list and make|.
+\end{key}
+
+\begin{key}{/tikz/external/remake next=\marg{boolean} (default true)}
+ A variant of |force remake| which applies only to the next image.
+\end{key}
+
+\begin{key}{/tikz/external/export next=\marg{boolean} (default true)}
+ A boolean which can be used to disable the export mechanism for single pictures.
+\end{key}
+
+\begin{key}{/tikz/external/export=\marg{boolean} (initially true)}
+ A boolean which can be used to disable the export mechanism for all
+ pictures inside of the current \TeX-scope.
+ %
+\begin{codeexample}[code only]
+\begin{document}
+\begin{tikzpicture} % will be exported
+ ...
+\end{tikzpicture}
+
+{
+\tikzset{external/export=false}
+\begin{tikzpicture} % won't be exported
+ ...
+\end{tikzpicture}
+...
+}
+
+\begin{tikzpicture} % will be exported
+ ...
+\end{tikzpicture}
+\end{document}
+\end{codeexample}
+ %
+ For \LaTeX, the feature lasts until the next |\end|\marg{$\cdot$} (this
+ holds for every call to |\tikzset|).
+\end{key}
+
+\begin{key}{/tikz/external/up to date check=\marg{choice} (initially md5)}
+ The |external| lib has to decide when some existing figure is up-to-date.
+ In such a case, it can be used without remaking it. Outdated pictures will
+ be remade.
+
+ The key |up to date check| allows to choose among a couple of heuristics
+ which are supposed to catch the most important reasons to remake a figure.
+
+ The |up to date check| can be overrule by any of the |force remake| or
+ |remake next| keys: if one of them is true, the figure is not up-to-date.
+
+ The choice \declare{simple} is based on the existence of the file: the file
+ is up-to-date if and only if it exists.
+
+ The choice \declare{md5} generates an MD5 checksum of the picture for which
+ the up-to-date check is running. The MD5 is compared against the MD5 of the
+ previous run, which, in turn, will be written into an extra file with the
+ extension |.md5|. This file will be modified if and only if the MD5
+ comparison indicates a difference. The MD5 computation is based on the
+ pdf\TeX\ method |\pdfmdfivesum|. If it is unavailable for some reason, the
+ choice |diff| will be used instead.
+
+ The choice \declare{diff} is the same as MD5 -- except that it compares the
+ picture content as-is instead of a hash. The |.md5| file will be used to
+ compare an old version with the current one -- but its content is some
+ ``normalized'' version of the picture for internal use.
+
+ \paragraph{Attention:}
+ the content--based strategies |md5| and |diff| operate on the picture
+ content -- and only on the picture content. Here, ``picture content'' only
+ includes the top--level tokens; no expansion is applied and no included
+ files are part of the strategies. If you change preamble styles, you have
+ to rebuild the figures manually (for example by deleting the generated
+ graphics files). If you have include files, consider using
+ |\tikzpicturedependsonfile| and its variants. Since this key provides
+ heuristics, you should always remake your figures before you finally
+ publish your document. Example: Suppose we have the following picture which
+ depends on a command |\mycommand|:
+ %
+\begin{codeexample}[code only]
+\def\mycommand{My comment}
+
+\begin{tikzpicture}
+
+\node at (0,0) {\mycommand};
+
+\end{tikzpicture}
+\end{codeexample}
+ %
+ What happens if you change ``My comment'' to ``My super comment''? Well,
+ |external| will \emph{not} pick it up; you will need to handle this
+ manually. However, if you modify anything between |\begin{tikzpicture}| and
+ |\end{tikzpicture}|, the external library \emph{will} pick it up and
+ regenerate the picture.
+
+ The |up to date check| is applied for |mode=convert with system call| and
+ |mode=list and make|.
+\end{key}
+
+\begin{command}{\tikzexternaldisable}
+ Allows to disable the complete externalization. While |export next| will
+ still collect the contents of picture environments, this command uninstalls
+ the hooks for the external library completely. Thus, nested picture
+ environments or environments where |\end{tikzpicture}| is not directly
+ reachable won't produce compilation failures -- although it is not possible
+ to externalize them automatically.
+
+ The externalization remains disabled until the end of the next \TeX\ group
+ (or environment) or until the next call to |\tikzexternalenable|.
+\end{command}
+
+\begin{command}{\tikzexternalenable}
+ Re-enables a previously running externalization after |\tikzexternaldisable|.
+\end{command}
+
+
+\subsubsection{Customizing the Externalization}
+
+\begin{key}{/tikz/external/figure list=\marg{boolean} (initially true)}
+ A boolean which configures whether a figure list shall be generated. A
+ figure list is an output file named \marg{jobname}|.figlist| which is
+ filled with file names of each figure, one per line.
+
+ This file is not used by \TeX\ anymore, its purpose is to issue the
+ required conversion commands |pdflatex -jobname |\marg{picture file name}
+ \marg{main file} manually (or in a script). See
+ section~\ref{sec:external:detail} for the details about the expected system
+ call (or activate |mode=convert with system call| and inspect your log
+ file).
+ %
+\begin{codeexample}[code only]
+\documentclass{article}
+% main document, called main.tex
+\usepackage{tikz}
+
+\usetikzlibrary{external}
+\tikzexternalize[
+ mode=graphics if exists,
+ figure list=true,
+ prefix=figures/]
+
+\begin{document}
+
+\tikzsetnextfilename{trees}
+\begin{tikzpicture}
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+
+\tikzsetnextfilename{simple}
+A simple image is \tikz \fill (0,0) circle(5pt);.
+
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (5,5);
+\end{tikzpicture}
+\end{document}
+\end{codeexample}
+
+\begin{codeexample}[code only, tikz syntax=false]
+pdflatex main
+\end{codeexample}
+ %
+ generates |main.figlist| containing
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+figures/trees
+figures/simple
+figures/main-figure0
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/external/mode=\marg{choice} (initially convert with system call)}
+ Configures what to do with \tikzname\ pictures (unless we are currently
+ externalizing one particular image, in that case, these modes are ignored).
+
+ The preconfigured mode |convert with system call| checks whether external
+ graphics files are up-to-date and includes them if that is the case. Any
+ picture which is not up-to-date will be generated automatically using a
+ system call. The system call can be configured using the |system call|
+ template. The up-to-date check is applied according to the
+ |up to date check| key. As soon as |convert with system call| is set, the
+ |figure list| will be disabled -- such a file is not required. In case you
+ still need or want it, you can enable it after setting |mode|.
+
+ Please note that system calls may be disabled for security reasons. For
+ pdflatex, they can be enabled using
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+pdflatex -shell-escape
+\end{codeexample}
+ %
+ while other \TeX\ variants may need other switches. The feature is
+ sometimes called |\write18|.
+
+ The choice |only graphics| always tries to replace pictures with external
+ graphics. It is an error if the graphics file does not exist.
+
+ The choice |no graphics| (or, equivalently, |only pictures|) typesets
+ \tikzname\ pictures without checking for external graphics.
+
+ A mixture is |graphics if exists|, it checks whether a suitable graphics
+ file exists and includes it if that is the case. If it does not exist, the
+ picture is typeset using \TeX.
+
+ Mode |list only| skips every \tikzname\ picture; it only generates the file
+ \marg{main file}|.figlist| containing file names for every picture, the
+ contents of any picture environment is thrown away and a replacement text
+ is shown. This implies |figure list=true|. See also the |list and make|
+ mode which includes available graphics.
+
+ The mode |list and make| is similar to |list only|: it generates the same
+ file \marg{main file}|.figlist|, but any images which exist already are
+ included as graphics instead of ignoring them. Furthermore, this mode
+ generates an additional file: \marg{main file}.makefile. This allows to use
+ a work flow like
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+% step 1: generate main.makefile:
+pdflatex main
+% step 2: generate ALL graphics on 2 processors:
+make -j 2 -f main.makefile
+% step 3: include the graphics:
+pdflatex main
+\end{codeexample}
+ %
+ \noindent This last make method is optional: |list and make| just assumes
+ that images are generated somehow (not necessarily with the generated
+ makefile). The generated makefile allows parallel externalization of
+ graphics on multi-core systems and it supports any file dependencies
+ configured with |\tikzpicturedependsonfile|. Furthermore, it respects the
+ |force remake| and |remake next| keys.
+\end{key}
+
+\begin{key}{/tikz/external/verbose IO=\marg{boolean} (initially true)}
+ A boolean which configures whether I/O operations shall be listed in the
+ logfile.
+\end{key}
+
+\begin{key}{/tikz/external/verbose optimize=\marg{boolean} (initially true)}
+ A boolean which configures whether optimization operations shall be listed
+ in the logfile.
+\end{key}
+
+\begin{key}{/tikz/external/verbose=\marg{boolean} (initially true)}
+ Sets all verbosity flags to \meta{boolean}.
+\end{key}
+
+\begin{key}{/tikz/external/optimize=\marg{boolean} (initially true)}
+ Configures whether the conversion process shall be optimized. This affects
+ only the case when |\jobname| differs from the main file name, i.e.\ when
+ single pictures are converted.
+
+ In that case, the main file is compiled as usual -- but everything except
+ the selected picture is thrown away. If optimization is enabled, all other
+ pictures won't be processed at all. Furthermore, expensive commands which
+ do not contribute to the selected picture will be thrown away as well.
+
+ The default implementation discards |\includegraphics| commands which are
+ \emph{not} inside of the selected picture to reduce conversion time.
+
+ It is possible to add commands which shall be optimized away, see below.
+\end{key}
+
+\begin{key}{/tikz/external/optimize command away=\meta{\textbackslash command}\marg{required argument count}}
+ Installs commands to optimize \meta{\textbackslash command} away. As is
+ described above, optimization applies to the case when single pictures are
+ converted: one usually doesn't need to process (probably expensive)
+ commands which do not contribute to the selected picture.
+
+ The argument \marg{required argument count} is either empty or a
+ non-negative integer between $0$ and $9$. It denotes the number of
+ arguments which should be consumed after \meta{\textbackslash command}. In
+ any case, one argument in square brackets after the command will be
+ recognized as well. To be more precise, the following cases for arguments
+ of \meta{\textbackslash command} are supported:
+ %
+ \begin{enumerate}
+ \item If \marg{required argument count} is empty (the default),
+ \meta{\textbackslash command} may take one optional argument in
+ square brackets and one in curly braces (which is also optional).
+ \item If \marg{required argument count} is not empty,
+ \marg{\textbackslash command} may take one optional argument in
+ square brackets. Furthermore, it expects exactly \marg{required
+ argument count} following arguments.
+ \end{enumerate}
+
+ Example:
+ %
+\begin{codeexample}[code only]
+\tikzset{external/optimize command away=\includegraphics}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+\newcommand{\myExpensiveMacro}[1]{Very expensive!}
+
+\tikzset{external/optimize command away=\myExpensiveMacro}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+\newcommand{\myExpensiveMacroWithThreeArgs}[3]{Very expensive!}
+
+\tikzset{external/optimize command away={\myExpensiveMacroWithThreeArgs}{3}}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+% A command with optional argument:
+\newcommand{\aFurtherExample}[3][]{Very expensive!}
+
+% consume only two arguments: the first optional one will be processed
+% anyway:
+\tikzset{external/optimize command away={\myExpensiveMacroWithThreeArgs}{2}}
+\end{codeexample}
+ %
+ The argument \meta{\textbackslash command} must be the name of a single
+ macro. Any occurrence of this macro, together with its arguments, will be
+ removed.
+ %
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ % this picture is currently converted!
+\end{tikzpicture}
+
+This here is outside of the converted picture and contains \myExpensiveMacro. It will be discarded.
+
+This call: \myExpensiveMacro[argument=value]{Argument} as well.
+And this here: \myExpensiveMacro{Argument} also.
+\end{codeexample}
+
+ The default is to optimize |\includegraphics| away.
+
+ This key is actually a style which sets the |optimize/install| and
+ |optimize/restore| keys.
+\end{key}
+
+\begin{key}{/tikz/external/optimize/install}
+ A command key which contains code to install optimizations. You can append
+ code here (or clear the macro) if you need to modify the optimization.
+\end{key}
+
+\begin{key}{/tikz/external/optimize/restore}
+ A command key which contains code to undo optimizations. You can append
+ code here (or clear the macro) if you need to modify the optimization.
+\end{key}
+
+\begin{key}{/tikz/external/only named=\marg{boolean} (initially false)}
+ If enabled, only pictures for which file names have been set explicitly
+ using |\tikzsetnextfilename| will be considered, no file names will be
+ generated automatically.
+\end{key}
+
+\begin{key}{/pgf/images/include external (initially \textbackslash pgfimage\{\#1\})}
+\index{External Graphics!Bounding Box Issues}
+ This command key constitutes the public interface to exchange the
+ |\includegraphics| command used for the image inclusion. If can be
+ overwritten using |include external/.code=|\marg{\TeX\ code}.
+
+ Its description can be found in the corresponding basic layer documentation
+ on page~\pageref{pgf:includeexternalkey}.
+
+ Just one example here: you can use
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/images/include external/.code={\includegraphics[viewport=0 0 211.28 175.686]{#1}}}
+\end{codeexample}
+ %
+ to manually change the viewport (bounding box) for included graphics.
+
+ Another example (of probably limited use) is
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/images/include external/.code={\href{file:#1}{\pgfimage{#1}}}}
+\end{codeexample}
+ %
+ \noindent which will generate a clickable hyperlink around the image.
+ Clicking on it opens the single exported file\footnote{This requires all
+ external graphics files in the same base directory as the main |.pdf|
+ file.}.
+
+ If you want to limit the effects of this key to just one externalized
+ figure, use
+ %
+\begin{codeexample}[code only]
+{
+ \pgfkeys{/pgf/images/include external/.code={\includegraphics[viewport=0 0 211.28 175.686]{#1}}}
+ \begin{tikzpicture}
+ ...
+ \end{tikzpicture}
+}% this brace ends the effect of `include external'
+\end{codeexample}
+ %
+\end{key}
+
+\begin{command}{\tikzifexternalizing\marg{true code}\marg{false code}}
+ This command can be used to check whether an image is currently written to
+ its separate graphics file (if the ``grab'' procedure is running). If so,
+ the \marg{true code} will be executed. If not, that means if the main
+ document is being typeset normally, the \marg{false code} will be invoked.
+
+ This command must be used \emph{after} |\tikzexternalize|.
+\end{command}
+
+\begin{command}{\tikzifexternalizingnext\marg{true code}\marg{false code}}
+ Like |\tikzifexternalizing|, but this variant also checks if the next
+ following figure is the one which is about to be written to its separate
+ graphics file.
+\end{command}
+
+
+\subsubsection{Details About The Process}
+\label{sec:external:detail}
+
+The standard run |pdflatex |\meta{main document} causes the |external| library
+to check every occurrence of |\begin{tikzpicture}| and every |\tikz| short
+command. If it finds a picture which shall be exported, it queries the
+respective file name and checks whether the file exists already. If so, it
+includes the external graphics. If not, it requires an externalization which
+can be done automatically (the default), semi-automatically (with
+|mode=list and make|) or manually (by issuing the requires system calls
+somehow).
+
+The library can detect whether it runs in ``conversion mode'', i.e.\ if it
+should only process a single image. To do so, it checks whether the internal
+macro \declareandlabel{\tikzexternalrealjob} exists. If so, its contents is
+assumed to be \meta{main document} (without the suffix |.tex|). Usually, this
+macro is set by the conversion system call,
+%
+\begin{codeexample}[code only, tikz syntax=false]
+pdflatex -jobname "main-figure0" "\def\tikzexternalrealjob{main}\input{main}"
+\end{codeexample}
+%
+\noindent where |main-figure0| is the picture we are currently externalizing
+and |main.tex| is the main document.
+
+As soon as ``conversion mode'' has been detected, \pgfname\ changes the output
+routine. The complete file |main.tex| is processed as normal, but only the part
+of the desired picture will be written to the output file, in our case
+|main-figure0.pdf|. The rest of the document is silently thrown away. Of
+course, such a conversion process is quite expensive since we need to do it for
+every picture. Since everything except the current picture is thrown away, the
+library skips all other pictures. Furthermore, any |\includegraphics| commands
+which are outside of the converted \tikzname-picture will be skipped as well.
+Thus, the conversion process should be much faster than typesetting the
+complete document, but it still requires its time. Eventually, the call
+|\input{main}| returns and the picture is ready. From this point on, the
+external graphics will be used.
+
+There is another possibility to communicate \meta{main document} to the
+subprocess performing the externalization: namely to write
+`|\tikzexternalize{main}|' into the document. In this case, the conversion
+system call will be
+%
+\begin{codeexample}[code only, tikz syntax=false]
+pdflatex -jobname "main-figure0" "main"
+\end{codeexample}
+%
+\noindent and the contents of |\tikzexternalrealjob| is set automatically. This
+case is detected by |\tikzexternalize|, and the |system call| is updated
+automatically (by patching its |\texsource| template argument). It is not
+necessary to change the |system call| manually.
+
+The sequence in which system calls are performed and the decision whether they
+are issued automatically is governed by the |mode| key, consult its
+documentation for details.
+
+
+\subsection{Using External Graphics Without \textmd{\pgfname}\ Installed}
+\label{section-libs-external-nopgf}
+
+Given that every picture has been exported correctly, one may want to compile a
+file without \pgfname\ and \tikzname\ installed. \tikzname\ comes with a
+minimal package which contains just enough commands to replace every
+|tikzpicture| environment and the |\tikz| short command with the appropriate
+external graphics. It can be found at
+%
+\begin{codeexample}[code only, tikz syntax=false]
+latex/pgf/utilities/tikzexternal.sty
+\end{codeexample}
+%
+\noindent and needs to be used instead of |\usepackage{tikz}|. So, we uncomment
+|\usepackage{tikz}| and our example from the beginning becomes
+%
+\begin{codeexample}[code only]
+\documentclass{article}
+% main document, called main.tex
+%\usepackage{tikz}
+
+\usepackage{graphicx}
+\usepackage{tikzexternal}
+
+%\usetikzlibrary{external}
+\tikzexternalize
+
+\begin{document}
+\begin{tikzpicture}
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+
+A simple image is \tikz \fill (0,0) circle(5pt);.
+
+Furthermore, we might want to draw \tikz[baseline]\draw (0,-1) rectangle (1,1);
+\end{document}
+\end{codeexample}
+%
+\noindent where the following files are necessary to compile the document:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+tikzexternal.sty
+main.tex
+main-figure0.pdf
+main-figure1.pdf
+main-figure2.pdf
+\end{codeexample}
+%
+\noindent If there are any `|.dpth|' files, for example |main-figure2.dpth|,
+these files are also required. They contain information for the \tikzname\
+|baseline| option (or |\label|s inside external graphics).
+
+Just copy the |.sty| file into the directory of your |main.tex| file and use it
+as part of your document.
+
+Please keep in mind, that only |tikzpicture| environments and |\tikz| short
+images are available within the externalization framework. Additionally, calls
+to |\tikzset| and |\pgfkeys| won't lead to compilation errors because they are
+simply ignored. But since |pgfkeys| is not available, any option supplied to
+|\tikzexternalize| is \emph{ignored}.
+
+\paragraph{Attention:}
+Since the simple replacement |\usepackage{tikzexternal}| doesn't support the
+key--value interface, you \emph{need} to use |\tikzsetexternalprefix| instead
+of the |prefix| option and |\tikzsetfigurename| instead of the |figure name|
+option since |\tikzset| is not available in such a context.
+
+\paragraph{Remark:}
+Some of the features of this library are mainly useful to improve the speed of
+successive document compilations. In other words: you can't use all features in
+this context, keep it simple.
+
+
+\subsection{\texttt{eps} Graphics Export}
+
+It is also possible to use \eps\ graphics instead of \pdf\ files. There are
+different ways to produce them, for example to use |pdflatex| and call
+|pdftops -eps |\marg{pdf file} \marg{eps file} afterwards. You could add this
+command to the |system call| option.
+
+Alternatively, you can use |latex| and |dvips| for image conversion as is
+explained for the |system call| option, see
+page~\pageref{extlib:systemcall:option}. See the documentation for the basic
+level externalization in section~\ref{section-external} for restrictions of
+other drivers.
+
+
+\subsection{Bitmap Graphics Export}
+
+Occasionally, you may have an extremely large graphics which takes long times
+to render. It might be interesting to generate a bitmap (raster) image, which
+displays much faster (for example in a presentation). I have used this feature
+to speed-up the display of large shadings.
+
+The |external| library can be customized to export bitmap images -- with the
+help of external programs. Due to the dependence of external programs, you may
+need to adjust these commands manually. For example, on my computer, the
+ImageMagick Suite is installed which comes with the |convert| tool. Together
+with |pdflatex|, I can define the following style:
+%
+\begin{codeexample}[code only]
+\tikzset{
+ % Defines a custom style which generates BOTH, .pdf and .png export
+ % but prefers the .png on inclusion.
+ %
+ % This style is not pre-defined, you may need to copy-paste and
+ % adjust it.
+ png export/.style={
+ external/system call/.add=
+ {}
+ {; convert -density 300 -transparent white "\image.pdf" "\image.png"},
+ %
+ /pgf/images/external info,
+ /pgf/images/include external/.code={%
+ \includegraphics
+ [width=\pgfexternalwidth,height=\pgfexternalheight]
+ {##1.png}%
+ },
+ }
+}
+\end{codeexample}
+%
+\noindent The example above defines a new style called `|png export|' which,
+when it is set with |\tikzset{png export}| somewhere in the document, modifies
+the configuration for both file generation and file input. The file generation
+is modified by appending the ImageMagick command to |system call| (separated by
+`|;|' as usual on Linux). This is, in principle, enough to generate a |.png|
+file. The |include external| command is overwritten such that it uses the
+|.png| file instead of the |.pdf| file (which exists as well in the
+configuration above). But since a |.png| file can have a much higher resolution
+than the desired image dimensions, we have to add |width| and |height|
+explicitly. Usually, the |external| library does not provide size information
+(it is unnecessary for |.pdf| or |.eps| since these formats have their bounding
+box information). To enable size information, the style uses the
+|external info| key, which, in turn, provides the |\pgfexternalwidth| and
+|\pgfexternalheight| commands.
+
+Now we can use |\tikzset{png export}| either document-wide or just for one
+particular image. The configuration remains in effect until the end of the
+current environment (or until the next closing curly brace `|}|').
+
+\begin{key}{/pgf/images/external info=\marg{boolean} (initially false)}
+ If this key is activated, the size for any externalized image will be
+ stored explicitly into the associated |.dpth| file.
+
+ When the file is included by |\pgfincludeexternalgraphics| (or
+ automatically by the |external| library), the width is available as
+ \declareandlabel{\pgfexternalwidth} and the height as
+ \declareandlabel{\pgfexternalheight}.
+\end{key}
+
+
+\subsection{Compatibility Issues}
+
+\subsubsection{References In External Pictures}
+
+It is allowed if a picture contains references, for example
+|\tikz \node {Reference to \ref{a:label}};|.
+
+There is just one issue: if the main job is currently compiling, its |.aux|
+file is not in its final state (even worse: it may not be readable at all). The
+picture externalization, however, needs the main |.aux| file to query any
+references.
+
+Thus, you \emph{will} need to invoke
+|pdflatex -jobname |\meta{image}| |\meta{mainfile} \emph{manually}
+for any image which contains references.
+
+This problem arises only for |mode=convert with system call|. In this case,
+the |external| library creates a special |\jobname.auxlock| file to check
+whether the main |.aux| file is currently usable.
+
+
+\subsubsection{Compatibility With Other Libraries or Packages}
+
+The |external| library has the following compatibility issues:
+%
+\begin{enumerate}
+ \item The |external| library comes with special support for
+ |\usetikzlibrary{fadings}|: the |fadings| library may define local
+ pictures which would be externalized (although they shouldn't). There
+ is special handling to suppress this bug if |\tikzexternalize| is
+ called \emph{after} |\usetikzlibrary{fadings}| or if all fadings are
+ defined \emph{before} |\tikzexternalize|.
+ \item Problems have been reported when using |\tikzexternalize| (or the
+ basic layer externalization) together with |\usepackage{glossary}|.
+ This problem disappears if |\tikzexternalize| is called \emph{before}
+ |\usepackage{glossary}|.
+ \item Problems with |\usepackage{pdfpages}| and |\usepackage{vmargin}|: The
+ |external| library replaces the current shipout routine of \TeX\ during
+ its externalization. This might raise problems with other packages
+ which also manipulate the shipout routine (like the mentioned ones). To
+ fix those problems, use
+ %
+\begin{codeexample}[code only]
+
+\usetikzlibrary{external}
+
+\tikzifexternalizing{%
+ % don't include package XYZ here
+}{%
+ \usepackage{pdfpages}
+ \usepackage{vmargin}
+ ...
+}%
+\end{codeexample}
+ %
+ This uses the requested packages for the main document, but not for the
+ single, exported graphics.
+\end{enumerate}
+
+In general, the |\tikzifexternalizing| feature might be used to solve package
+conflicts and the |\tikzexternaldisable| and |\tikzexternalenable| features can
+be used to solve problems with single pictures.
+
+
+\subsubsection{Compatibility With Bounding Box Restrictions}
+
+Bounding box restrictions provide no problem when used with \eps\ graphics.
+However, they pose problems for |pdflatex|, so you may need to use the
+|latex|/|dvips| combination if you use bounding box restrictions and
+externalization. Currently, the only possibility for bounding box restrictions
+and |pdflatex| is to use a combination of |trim left|/|trim right|/|baseline|:
+these keys do not \emph{really} truncate the bounding box, they only store
+horizontal and vertical shifts (also see the |trim lowlevel| key in this
+context).
+
+
+\subsubsection{Interoperability With The Basic Layer Externalization}
+
+This library is fully compatible with
+|\beginpgfgraphicnamed|$\dotsc$|\endpgfgraphicnamed| environments. However, you
+will need to use the |export next=false| key to avoid conflicts:
+%
+\begin{codeexample}[code only]
+\beginpgfgraphicnamed{picture4}
+\tikzset{external/export next=false}
+\begin{tikzpicture}
+ \draw (0,0) -- (4,4);
+\end{tikzpicture}
+\endpgfgraphicnamed
+\end{codeexample}
+%
+Please keep in mind that file prefixes do not apply to the basic layer.
+}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fadings.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fadings.tex
new file mode 100644
index 0000000000..c42e10a216
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fadings.tex
@@ -0,0 +1,51 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Fading Library}
+\label{section-library-fadings}
+
+\begin{pgflibrary}{fadings}
+ The package defines a number of fadings, see
+ Section~\ref{section-tikz-transparency} for an introduction. The
+ \tikzname\ version defines special \tikzname\ commands for creating
+ fadings. These commands are explained in
+ Section~\ref{section-tikz-transparency}.
+\end{pgflibrary}
+
+\newcommand\fadingindex[1]{%
+ \index{#1@\protect\texttt{#1} fading}%
+ \index{Fadings!#1@\protect\texttt{#1}}%
+ \texttt{#1}&
+ \begin{tikzpicture}[baseline=5mm-.5ex]
+ \fill [black!20] (0,0) rectangle (1,1);
+ \path [pattern=checkerboard,pattern color=black!30] (0,0) rectangle (1,1);
+
+ \fill [path fading=#1,blue] (0,0) rectangle (1,1);
+ \end{tikzpicture} \\[4.5mm]
+}
+
+\noindent
+\begin{tabular}{ll}
+ \emph{Fading name} & \emph{Example (solid blue faded on checkerboard)} \\[1mm]
+ \fadingindex{west}
+ \fadingindex{east}
+ \fadingindex{north}
+ \fadingindex{south}
+ \fadingindex{circle with fuzzy edge 10 percent}
+ \fadingindex{circle with fuzzy edge 15 percent}
+ \fadingindex{circle with fuzzy edge 20 percent}
+ \fadingindex{fuzzy ring 15 percent}
+\end{tabular}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex
new file mode 100644
index 0000000000..1e0fbbd8f2
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fit.tex
@@ -0,0 +1,161 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Fitting Library}
+\label{section-library-fit}
+
+\begin{tikzlibrary}{fit}
+ The library defines (currently only two) options for fitting a node so that
+ it contains a set of coordinates.
+\end{tikzlibrary}
+
+When you load this library, the following options become available:
+
+\begin{key}{/tikz/fit=\meta{coordinates or nodes}}
+ This option must be given to a |node| path command. The \meta{coordinates
+ or nodes} should be a sequence of \tikzname\ coordinates or node names,
+ one directly after the other without commas (like with the
+ |plot coordinates| path operation). Examples are |(1,0) (2,2)| or
+ |(a) (1,0) (b)|, where |a| and |b| are nodes.
+
+ For this sequence of coordinates, a minimal bounding box is computed that
+ encompasses all the listed \meta{coordinates or nodes}. For coordinates in
+ the list, the bounding box is guaranteed to contain this coordinate, for
+ nodes it is guaranteed to contain the |east|, |west|, |north| and |south|
+ anchors of the node. In principle (the details will be explained in a
+ moment), things are now set up such that the text box of the node will be
+ exactly this bounding box.
+
+ Here is an example: We fit several points in a rectangular node. By setting
+ the |inner sep| to zero, we see exactly the text box of the node. Then we
+ fit these points again in a circular node. Note how the circle encompasses
+ exactly the same bounding box.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[inner sep=0pt,thick,
+ dot/.style={fill=blue,circle,minimum size=3pt}]
+ \draw[help lines] (0,0) grid (3,2);
+ \node[dot] (a) at (1,1) {};
+ \node[dot] (b) at (2,2) {};
+ \node[dot] (c) at (1,2) {};
+ \node[dot] (d) at (1.25,0.25) {};
+ \node[dot] (e) at (1.75,1.5) {};
+
+ \node[draw=red, fit=(a) (b) (c) (d) (e)] {box};
+ \node[draw,circle,fit=(a) (b) (c) (d) (e)] {};
+\end{tikzpicture}
+\end{codeexample}
+
+ Every time the |fit| option is used, the following style is also applied to
+ the node:
+ %
+ \begin{stylekey}{/tikz/every fit (initially \normalfont empty)}
+ Set this style to change the appearance of a node that uses the |fit|
+ option.
+ \end{stylekey}
+
+ The exact effects of the |fit| option are the following:
+ %
+ \begin{enumerate}
+ \item A minimal bounding box containing all coordinates is computed.
+ Note that if a coordinate like |(a)| is used that contains a node
+ name, this has the same effect as explicitly providing the
+ |(a.north)| and |(a.south)| and |(a.west)| and |(a.east)|. If you
+ wish to refer only to the center of the |a| node, use |(a.center)|
+ instead.
+ \item The |text width| option is set to the width of this bounding box.
+ \item The |align=center| option is set.
+ \item The |anchor| is set to |center|.
+ \item The |at| position of the node is set to the center of the
+ computed bounding box.
+ \item After the node has been typeset, its height and depth are
+ adjusted such that they add up to the height of the computed
+ bounding box and such that the text of the node is vertically
+ centered inside the box.
+ \end{enumerate}
+ %
+ The above means that, generally speaking, if the node contains text like
+ |box| in the above example, it will be centered inside the box. It will be
+ difficult to put the text elsewhere, in particular, changing the |anchor|
+ of the node will not have the desired effect. Instead, what you should do
+ is to create a node with the |fit| option that does not contain any text,
+ give it a name, and then use normal nodes to add text at the desired
+ positions. Alternatively, consider using the |label| or |pin| options.
+
+ Suppose, for instance, that in the above example we want the word ``box''
+ to appear inside the box, but at its top. This can be achieved as follows:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[inner sep=0pt,thick,
+ dot/.style={fill=blue,circle,minimum size=3pt}]
+ \draw[help lines] (0,0) grid (3,2);
+ \node[dot] (a) at (1,1) {};
+ \node[dot] (b) at (2,2) {};
+ \node[dot] (c) at (1,2) {};
+ \node[dot] (d) at (1.25,0.25) {};
+ \node[dot] (e) at (1.75,1.5) {};
+
+ \node[draw=red,fit=(a) (b) (c) (d) (e)] (fit) {};
+ \node[below] at (fit.north) {box};
+\end{tikzpicture}
+\end{codeexample}
+
+ Here is a real-life example that uses fitting:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [vertex/.style={minimum size=2pt,fill,draw,circle},
+ open/.style={fill=none},
+ sibling distance=1.5cm,level distance=.75cm,
+ every fit/.style={ellipse,draw,inner sep=-2pt},
+ leaf/.style={label={[name=#1]below:$#1$}},auto]
+
+ \node [vertex] (root) {}
+ child { node [vertex,open] {}
+ child { node [vertex,open] {}
+ child { node [vertex] (b's parent) {}
+ child { node [vertex] {}
+ child { node [vertex,leaf=d] {} }
+ child { node [vertex,leaf=e] {} } }
+ child { node [vertex,leaf=b] {} } }
+ child { node [vertex,leaf=a] {} } }
+ child { node [coordinate] {}
+ child[missing]
+ child { node [vertex] (f's parent) {}
+ child { node [vertex,leaf=c] {} }
+ child { node [vertex,leaf=f] {} } } }
+ edge from parent node {$\rho$} };
+
+ \node [fit=(d) (e) (b) (b's parent),label=above left:$F^{(b,R)}$] {};
+ \node [fit=(c) (f) (f's parent),label=above right:$F^{(c,R)}$] {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rotate fit=\meta{angle} (initially 0)}
+ This key fits \meta{coordinates or nodes} inside a node that is rotated by
+ \meta{angle}. As a side effect, it also sets the |/tikz/rotate| key.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[inner sep=0pt,thick,
+ dot/.style={fill=blue,circle,minimum size=3pt}]
+ \draw[help lines] (0,0) grid (3,2);
+ \node[dot] (a) at (1,1) {};
+ \node[dot] (b) at (2,2) {};
+ \node[dot] (c) at (1,2) {};
+ \node[dot] (d) at (1.25,0.25) {};
+ \node[dot] (e) at (1.75,1.5) {};
+ \node[draw, fit=(a) (b) (c) (d) (e)] {};
+ \node[draw=red, rotate fit=30, fit=(a) (b) (c) (d) (e)] {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fixedpoint.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fixedpoint.tex
new file mode 100644
index 0000000000..238d0c16ad
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fixedpoint.tex
@@ -0,0 +1,120 @@
+% Copyright 2008 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Fixed Point Arithmetic Library}
+
+\begin{pgflibrary}{fixedpointarithmetic}
+ This library provides an interface to the \LaTeX{} package |fp| for fixed
+ point arithmetic. In addition to loading this library you must ensure |fp|
+ is loaded, otherwise errors will occur.
+\end{pgflibrary}
+
+
+\subsection{Overview}
+
+Whilst the mathematical engine that comes with \pgfname{} is reasonably fast
+and flexible when it comes to parsing, the accuracy tends to be fairly low,
+particularly for expressions involving many operations chained together. In
+addition the range of values that can be computed is very small:
+$\pm16383.99999$. Conversely, the |fp| package has a reasonably high accuracy,
+and can perform computations over a wide range of values (approximately
+$\pm9.999\times10^{17}$), but is comparatively slow and not very flexible,
+particularly regarding parsing.
+
+This library enables the combination of the two: the flexible parser of the
+\pgfname{} mathematical engine with the evaluation accuracy of |fp|. There are,
+however, a number of important points to bear in mind:
+%
+\begin{itemize}
+ \item Whilst |fp| supports very large numbers, \pgfname{} and \tikzname{}
+ do not. It is possible to calculate the result of |2^20| or
+ |1.2e10+3.4e10|, but it is not possible to use these results in
+ pictures directly without some ``extra work''.
+ \item The \pgfname{} mathematical engine will still be used to evaluate
+ lengths, such as |10pt| or |3em|, so it is not possible for an length
+ to exceed the range of values supported by \TeX-dimensions
+ ($\pm16383.99999$pt), even though the resulting expression is within
+ the range of |fp|. So, for example, one can calculate |3cm*10000|, but
+ not |3*10000cm|.
+ \item Not all of the functions listed in Section~\ref{pgfmath-syntax}, have
+ been mapped onto |fp| equivalents. Of those that have been, it is not
+ guaranteed that functions will perform in the same way as they do in
+ \pgfname. Reference should be made to the documentation for |fp|.
+ \item In \pgfname, trigonometric functions such as |sin| and |cos| assume
+ arguments are in degrees, and functions such as |asin| and |acos|
+ return results in degrees. Although |fp| uses radians for such
+ functions, \pgfname{} automatically converts arguments from degrees to
+ radians, and converts results from radians to degrees, to ensure
+ everything ``works properly''.
+ \item The overall speed will actually be slower than using \pgfname{}
+ mathematical engine. The calculating power of |fp| comes at the cost of
+ an increased processing time.
+\end{itemize}
+
+
+\subsection{Using Fixed Point Arithmetic in PGF and \tikzname}
+
+The following key is provided to use |fp| in \pgfname{} and \tikzname:
+
+\begin{key}{/pgf/fixed point arithmetic=\meta{options}}
+\keyalias{tikz}
+ This key will set the key path to |/pgf/fixed point|, and execute
+ \meta{options}. Then it will install the necessary commands so that the
+ \pgfname{} parser will use |fp| to perform calculations. The best way to
+ use this key is as an argument to a scope or picture. This means that |fp|
+ does not always have to be used, and \pgfname{} can use its own
+ mathematical engine at other times, which can lead to a significant
+ reduction in the time for a document to compile.
+\end{key}
+
+Currently there are only a few keys key supported for \meta{options}:
+
+\begin{key}{/pgf/fixed point/scale results=\meta{factor}}
+ As noted above, |fp| can process a far greater range of numbers than
+ \pgfname{} and \tikzname{}. In order to use results from |fp| in a
+ |{pgfpicture}| or a |{tikzpicture}| they need to be scaled. When this key
+ is used \pgfname{} will scale results of any evaluation by \meta{factor}.
+ However, as it is not desirable for every part of every expression to be
+ scaled, scaling will only take place if a special prefix |*| is used. If
+ |*| is used at the beginning of an expression the evaluation of the
+ expression will evaluated and then multiplied by \meta{factor}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[fixed point arithmetic={scale results=10^-6}]
+\draw [help lines] grid (3,2);
+\draw (0,0) -- (2,2);
+\draw [red, line width=4pt] (*1.0e6,0) -- (*3.0e6,*2.0e6);
+\end{tikzpicture}
+\end{codeexample}
+
+ A special case of scaling involves plots of data containing large numbers
+ from files. It is possible to ``pre-process'' a file, typically using the
+ application that generates the data, to either precede the relevant column
+ with |*| or to perform the scaling as part of the calculation process.
+ However, it may be desirable for the data in a plot to appear in a table as
+ well, so, two files would be required, one pre-processed for plotting, and
+ one not. This extra work may be undesirable so the following keys are
+ provided:
+
+ \begin{key}{/pgf/fixed point/scale file plot x=\meta{factor}}
+ This key will scale the first column of data read from a file before it
+ is plotted. It is independent of the |scale results| key.
+ \end{key}
+
+ \begin{key}{/pgf/fixed point/scale file plot y=\meta{factor}}
+ This key will scale the second column of data read from a file before
+ it is plotted.
+ \end{key}
+
+ \begin{key}{/pgf/fixed point/scale file plot z=\meta{factor}}
+ This key will scale the third column of data read from a file before it
+ is plotted.
+ \end{key}
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-folding.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-folding.tex
new file mode 100644
index 0000000000..cd9092874c
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-folding.tex
@@ -0,0 +1,252 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Paper-Folding Diagrams Library}
+\label{section-calender-folding}
+
+\begin{tikzlibrary}{folding}
+ This library defines pic types for creating paper-folding diagrams. Many
+ thanks to Nico van Cleemput for providing most of the code.
+\end{tikzlibrary}
+
+Here is a big example that produces a diagram for a calendar:
+%
+\begin{codeexample}[leave comments]
+\sffamily\scriptsize
+\tikz \pic [
+ transform shape,
+ every calendar/.style={
+ at={(-8ex,4ex)},
+ week list,
+ month label above centered,
+ month text=\bfseries\textcolor{red}{\%mt} \%y0,
+ if={(Sunday) [black!50]}
+ },
+ folding line length=2.5cm,
+ face 1={ \calendar [dates=\the\year-01-01 to \the\year-01-last];},
+ face 2={ \calendar [dates=\the\year-02-01 to \the\year-02-last];},
+ face 3={ \calendar [dates=\the\year-03-01 to \the\year-03-last];},
+ face 4={ \calendar [dates=\the\year-04-01 to \the\year-04-last];},
+ face 5={ \calendar [dates=\the\year-05-01 to \the\year-05-last];},
+ face 6={ \calendar [dates=\the\year-06-01 to \the\year-06-last];},
+ face 7={ \calendar [dates=\the\year-07-01 to \the\year-07-last];},
+ face 8={ \calendar [dates=\the\year-08-01 to \the\year-08-last];},
+ face 9={ \calendar [dates=\the\year-09-01 to \the\year-09-last];},
+ face 10={\calendar [dates=\the\year-10-01 to \the\year-10-last];},
+ face 11={\calendar [dates=\the\year-11-01 to \the\year-11-last];},
+ face 12={\calendar [dates=\the\year-12-01 to \the\year-12-last];}
+] {dodecahedron folding};
+\end{codeexample}
+
+The foldings are sorted by number of faces.
+
+\begin{pictype}{tetrahedron folding}{}
+ This pic type draws a folding diagram for a tetrahedron. The following keys
+ influence the pic:
+ %
+ \begin{key}{/tikz/folding line length=\meta{dimension}}
+ Sets the length of the base line for folding. For the dodecahedron this
+ is the length of all the sides of the pentagons.
+ \end{key}
+ %
+ \begin{key}{/tikz/face 1=\meta{code}}
+ The \meta{code} is executed for the first face of the dodecahedron.
+ When it is executed, the coordinate system will have been shifted and
+ rotated such that it lies at the middle of the first face of the
+ dodecahedron.
+ \end{key}
+ %
+ \begin{key}{/tikz/face 2=\meta{code}}
+ Same as |face 1|, but for the second face.
+ \end{key}
+ %
+ \begin{key}{/tikz/face 3=\meta{code}}
+ \end{key}
+ %
+ \begin{key}{/tikz/face 4=\meta{code}}
+ \end{key}
+ %
+ There are further similar options for more faces (for commands shown
+ later).
+
+ Here is a simple example:
+ %
+\begin{codeexample}[]
+\tikz \pic [
+ transform shape,
+ folding line length=6mm,
+ face 1={ \node[red] {1};},
+ face 2={ \node {2};},
+ face 3={ \node {3};},
+ face 4={ \node {4};}
+] {tetrahedron folding};
+\end{codeexample}
+
+ The appearance of the cut and folding lines can be influenced using the
+ following styles:
+ %
+ \begin{stylekey}{/tikz/every cut (initially \normalfont empty)}
+ Executed for every line that should be cut using scissors.
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/every fold (initially help lines)}
+ Executed for every line that should be folded.
+ %
+\begin{codeexample}[]
+\tikz \pic[
+ every cut/.style=red,
+ every fold/.style=dotted,
+ folding line length=6mm
+] { tetrahedron folding };
+\end{codeexample}
+ \end{stylekey}
+
+ There is one style that is mainly useful for the present documentation:
+ %
+ \begin{stylekey}{/tikz/numbered faces}
+ Sets |face |\meta{i} to |\node {|\meta{i}|};| for all~$i$.
+ \end{stylekey}
+\end{pictype}
+
+\begin{pictype}{tetrahedron truncated folding}{}
+ A folding of a truncated tetrahedron.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { tetrahedron truncated folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{cube folding}{}
+ A folding of a cube.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { cube folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{cube truncated folding}{}
+ A folding of a truncated cube.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { cube truncated folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{octahedron folding}{}
+ A folding of an octahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { octahedron folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{octahedron folding}{}
+ A folding of a truncated octahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { octahedron truncated folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{dodecahedron folding}{}
+ A folding of a dodecahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { dodecahedron folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{dodecahedron' folding}{}
+ This is an alternative folding of a dodecahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { dodecahedron' folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{cuboctahedron folding}{}
+ A folding of a cuboctahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { cuboctahedron folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{cuboctahedron truncated folding}{}
+ A folding of a truncated cuboctahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { cuboctahedron truncated folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{icosahedron folding}{}
+ A folding of an icosahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { icosahedron folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{rhombicuboctahedron folding}{}
+ A folding of an rhombicuboctahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { rhombicuboctahedron folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{snub cube folding}{}
+ A folding of a snub cube.
+ %
+\begin{codeexample}[width=5cm]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { snub cube folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+\begin{pictype}{icosidodecahedron folding}{}
+ A folding of an icosidodecahedron.
+ %
+\begin{codeexample}[]
+\tikz \pic [folding line length=6mm, numbered faces, transform shape]
+ { icosidodecahedron folding };
+\end{codeexample}
+ %
+\end{pictype}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fpu.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fpu.tex
new file mode 100644
index 0000000000..bdc58135ef
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-fpu.tex
@@ -0,0 +1,677 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Floating Point Unit Library}
+\label{pgfmath-floatunit}
+\label{section-library-fpu}
+
+{\noindent {\emph{by Christian Feuersänger}}}
+
+\begingroup
+\pgfqkeys{/pgf/number format}{sci}
+\pgfkeys{/pgf/fpu}
+
+\begin{pgflibrary}{fpu}
+ The floating point unit (fpu) allows the full data range of scientific
+ computing for use in \pgfname. Its core is the \pgfname\ math routines for
+ mantissa operations, leading to a reasonable trade--of between speed and
+ accuracy. It does not require any third--party packages or external
+ programs.
+\end{pgflibrary}
+
+
+\subsection{Overview}
+
+The fpu provides a replacement set of math commands which can be installed in
+isolated placed to achieve large data ranges at reasonable accuracy. It
+provides at least%
+ \footnote{To be more precise, the FPU's exponent is currently a 32 bit
+ integer. That means it supports a significantly larger data range than an
+ IEEE double precision number -- but if a future \TeX\ version may provide
+ low-level access to doubles, this may change.}%
+the IEEE double precision data range, $\pgfmathprintnumber{-1e+324}, \dotsc,
+\pgfmathprintnumber{+1e324}$. The absolute smallest number bigger than zero is
+$\pgfmathprintnumber{1e-324}$. The FPU's relative precision is at least
+$\pgfmathprintnumber{1e-4}$ although operations like addition have a relative
+precision of $\pgfmathprintnumber{1e-6}$.
+
+Note that the library has not really been tested together with any drawing
+operations. It should be used to work with arbitrary input data which is then
+transformed somehow into \pgfname\ precision. This, in turn, can be processed
+by \pgfname.
+
+
+\subsection{Usage}
+
+\begin{key}{/pgf/fpu=\marg{boolean} (default true)}
+ This key installs or uninstalls the FPU. The installation exchanges any
+ routines of the standard math parser with those of the FPU: |\pgfmathadd|
+ will be replaced with |\pgfmathfloatadd| and so on. Furthermore, any number
+ will be parsed with |\pgfmathfloatparsenumber|.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/fpu}
+\pgfmathparse{1+1}\pgfmathresult
+\end{codeexample}
+ %
+ \noindent The FPU uses a low-level number representation consisting of
+ flags, mantissa and exponent%
+ \footnote{Users should \emph{always} use high
+ level routines to manipulate floating point numbers as the format may
+ change in a future release.}.%
+ To avoid unnecessary format conversions, |\pgfmathresult| will usually
+ contain such a cryptic number. Depending on the context, the result may
+ need to be converted into something which is suitable for \pgfname\
+ processing (like coordinates) or may need to be typeset. The FPU provides
+ such methods as well.
+
+%--------------------------------------------------
+% \begin{codeexample}[]
+% \begin{tikzpicture}
+% \fill[red,fpu,/pgf/fpu/scale results=1e-10] (*1.234e10,*1e10) -- (*2e10,*2e10);
+% \end{tikzpicture}
+% \end{codeexample}
+%--------------------------------------------------
+
+ Use |fpu=false| to deactivate the FPU. This will restore any change. Please
+ note that this is not necessary if the FPU is used inside of a \TeX\ group
+ -- it will be deactivated afterwards anyway.
+
+ It does not hurt to call |fpu=true| or |fpu=false| multiple times.
+
+ Please note that if the |fixed point arithmetics| library of \pgfname\ will
+ be activated after the FPU, the FPU will be deactivated automatically.
+\end{key}
+
+\begin{key}{/pgf/fpu/output format=\mchoice{float,sci,fixed} (initially float)}
+ This key allows to change the number format in which the FPU assigns
+ |\pgfmathresult|.
+
+ The predefined choice |float| uses the low-level format used by the FPU.
+ This is useful for further processing inside of any library.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/fpu,/pgf/fpu/output format=float}
+\pgfmathparse{exp(50)*42}\pgfmathresult
+\end{codeexample}
+
+ The choice |sci| returns numbers in the format
+ \meta{mantissa}|e|\meta{exponent}. It provides almost no computational
+ overhead.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}
+\pgfmathparse{4.22e-8^-2}\pgfmathresult
+\end{codeexample}
+
+ The choice |fixed| returns normal fixed point numbers and provides the
+ highest compatibility with the \pgfname\ engine. It is activated
+ automatically in case the FPU scales results.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}
+\pgfmathparse{sqrt(1e-12)}\pgfmathresult
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/fpu/scale results=\marg{scale}}
+ A feature which allows semi-automatic result scaling. Setting this key has
+ two effects: first, the output format for \emph{any} computation will be
+ set to |fixed| (assuming results will be processed by \pgfname's kernel).
+ Second, any expression which starts with a star, |*|, will be multiplied
+ with \meta{scale}.
+\end{key}
+
+\begin{keylist}{
+ /pgf/fpu/scale file plot x=\marg{scale},%
+ /pgf/fpu/scale file plot y=\marg{scale},%
+ /pgf/fpu/scale file plot z=\marg{scale}%
+}
+ These keys will patch \pgfname's |plot file| command to automatically scale
+ single coordinates by \meta{scale}.
+
+ The initial setting does not scale |plot file|.
+\end{keylist}
+
+\begin{command}{\pgflibraryfpuifactive\marg{true-code}\marg{false-code}}
+ This command can be used to execute either \meta{true-code} or
+ \meta{false-code}, depending on whether the FPU has been activated or not.
+\end{command}
+
+
+\subsection{Comparison to the fixed point arithmetics library}
+
+There are other ways to increase the data range and/or the precision of
+\pgfname's math parser. One of them is the |fp| package, preferable combined
+with \pgfname's |fixed point arithmetic| library. The differences between the
+FPU and |fp| are:
+%
+\begin{itemize}
+ \item The FPU supports at least the complete IEEE double precision number
+ range, while |fp| covers only numbers of magnitude
+ $\pm\pgfmathprintnumber{1e17}$.
+ \item The FPU has a uniform relative precision of about 4--5 correct
+ digits. The fixed point library has an absolute precision which may
+ perform good in many cases -- but will fail at the ends of the data
+ range (as every fixed point routines does).
+ \item The FPU has potential to be faster than |fp| as it has access to fast
+ mantissa operations using \pgfname's math capabilities (which use \TeX\
+ registers).
+\end{itemize}
+
+
+\subsection{Command Reference and Programmer's Manual}
+
+\subsubsection{Creating and Converting Floats}
+
+\begin{command}{\pgfmathfloatparsenumber\marg{x}}
+ Reads a number of arbitrary magnitude and precision and stores its result
+ into |\pgfmathresult| as floating point number $m \cdot 10^e$ with mantissa
+ and exponent base~$10$.
+
+ The algorithm and the storage format is purely text-based. The number is
+ stored as a triple of flags, a positive mantissa and an exponent, such as
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{2}
+\pgfmathresult
+\end{codeexample}
+ %
+ Please do not rely on the low-level representation here, use
+ |\pgfmathfloattomacro| (and its variants) and |\pgfmathfloatcreate| if you
+ want to work with these components.
+
+ The flags encoded in |\pgfmathresult| are represented as a digit where
+ `$0$' stands for the number $\pm 0\cdot 10^0$, `$1$' stands for a positive
+ sign, `$2$' means a negative sign, `$3$' stands for `not a number', `$4$'
+ means $+\infty$ and `$5$' stands for $-\infty$.
+
+ The mantissa is a normalized real number $m \in \mathbb{R}$, $1 \le m <
+ 10$. It always contains a period and at least one digit after the period.
+ The exponent is an integer.
+
+ Examples:
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{0}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E.
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{0.2}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E.
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{42}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E.
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{20.5E+2}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E.
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{1e6}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E.
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{5.21513e-11}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E.
+\end{codeexample}
+ %
+ The argument \meta{x} may be given in fixed point format or the scientific
+ ``e'' (or ``E'') notation. The scientific notation does not necessarily
+ need to be normalized. The supported exponent range is (currently) only
+ limited by the \TeX-integer range (which uses 31 bit integer numbers).
+\end{command}
+
+\begin{key}{/pgf/fpu/handlers/empty number=\marg{input}\marg{unreadable part}}
+ This command key is invoked in case an empty string is parsed inside of
+ |\pgfmathfloatparsenumber|. You can overwrite it to assign a replacement
+ |\pgfmathresult| (in float!).
+
+ The initial setting is to invoke |invalid number|, see below.
+\end{key}
+
+\begin{key}{/pgf/fpu/handlers/invalid number=\marg{input}\marg{unreadable part}}
+ This command key is invoked in case an invalid string is parsed inside of
+ |\pgfmathfloatparsenumber|. You can overwrite it to assign a replacement
+ |\pgfmathresult| (in float!).
+
+ The initial setting is to generate an error message.
+\end{key}
+
+\begin{key}{/pgf/fpu/handlers/wrong lowlevel format=\marg{input}\marg{unreadable part}}
+ This command key is invoked whenever |\pgfmathfloattoregisters| or its
+ variants encounter something which is not a properly formatted low-level
+ floating point number. As for |invalid number|, this key may assign a new
+ |\pgfmathresult| (in floating point) which will be used instead of the
+ offending \meta{input}.
+
+ The initial setting is to generate an error message.
+\end{key}
+
+\begin{command}{\pgfmathfloatqparsenumber\marg{x}}
+ The same as |\pgfmathfloatparsenumber|, but does not perform sanity checking.
+\end{command}
+
+\begin{command}{\pgfmathfloattofixed{\marg{x}}}
+ Converts a number in floating point representation to a fixed point number.
+ It is a counterpart to |\pgfmathfloatparsenumber|. The algorithm is purely
+ text based and defines |\pgfmathresult| as a string sequence which
+ represents the floating point number \meta{x} as a fixed point number (of
+ arbitrary precision).
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{0.00052}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E
+$\to$
+\pgfmathfloattofixed{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{123.456e4}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E
+$\to$
+\pgfmathfloattofixed{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathfloattoint\marg{x}}
+ Converts a number from low-level floating point representation to an
+ integer (by truncating the fractional part).
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{123456}
+\pgfmathfloattoint{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+
+ See also |\pgfmathfloatint| which returns the result as float.
+\end{command}
+
+\begin{command}{\pgfmathfloattosci\marg{float}}
+ Converts a number from low-level floating point representation to
+ scientific format, $1.234e4$. The result will be assigned to the macro
+ |\pgfmathresult|.
+\end{command}
+
+\begin{command}{\pgfmathfloatvalueof\marg{float}}
+ Expands a number from low-level floating point representation to scientific
+ format, $1.234e4$.
+
+ Use |\pgfmathfloatvalueof| in contexts where only expandable macros are
+ allowed.
+\end{command}
+
+\begin{command}{\pgfmathfloatcreate{\marg{flags}}{\marg{mantissa}}{\marg{exponent}}}
+ Defines |\pgfmathresult| as the floating point number encoded by
+ \meta{flags}, \meta{mantissa} and \meta{exponent}.
+
+ All arguments are characters and will be expanded using |\edef|.
+ %
+\begin{codeexample}[]
+\pgfmathfloatcreate{1}{1.0}{327}
+\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
+Flags: \F; Mantissa \M; Exponent \E
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathfloatifflags\marg{floating point number}\marg{flag}\marg{true-code}\marg{false-code}}
+ Invokes \meta{true-code} if the flag of \meta{floating point number} equals
+ \meta{flag} and \meta{false-code} otherwise.
+
+ The argument \meta{flag} can be one of
+ %
+ \begin{description}
+ \item[0] to test for zero,
+ \item[1] to test for positive numbers,
+ \item[+] to test for positive numbers,
+ \item[2] to test for negative numbers,
+ \item[-] to test for negative numbers,
+ \item[3] for ``not-a-number'',
+ \item[4] for $+\infty$,
+ \item[5] for $-\infty$.
+ \end{description}
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{42}
+\pgfmathfloatifflags{\pgfmathresult}{0}{It's zero!}{It's not zero!}
+\pgfmathfloatifflags{\pgfmathresult}{1}{It's positive!}{It's not positive!}
+\pgfmathfloatifflags{\pgfmathresult}{2}{It's negative!}{It's not negative!}
+
+% or, equivalently
+\pgfmathfloatifflags{\pgfmathresult}{+}{It's positive!}{It's not positive!}
+\pgfmathfloatifflags{\pgfmathresult}{-}{It's negative!}{It's not negative!}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathfloattomacro{\marg{x}}{\marg{flagsmacro}}{\marg{mantissamacro}}{\marg{exponentmacro}}}
+ Extracts the flags of a floating point number \meta{x} to
+ \meta{flagsmacro}, the mantissa to \meta{mantissamacro} and the exponent to
+ \meta{exponentmacro}.
+\end{command}
+
+\begin{command}{\pgfmathfloattoregisters{\marg{x}}{\marg{flagscount}}{\marg{mantissadimen}}{\marg{exponentcount}}}
+ Takes a floating point number \meta{x} as input and writes flags to count
+ register \meta{flagscount}, mantissa to dimen register \meta{mantissadimen}
+ and exponent to count register \meta{exponentcount}.
+
+ Please note that this method rounds the mantissa to \TeX-precision.
+\end{command}
+
+\begin{command}{\pgfmathfloattoregisterstok{\marg{x}}{\marg{flagscount}}{\marg{mantissatoks}}{\marg{exponentcount}}}
+ A variant of |\pgfmathfloattoregisters| which writes the mantissa into a
+ token register. It maintains the full input precision.
+\end{command}
+
+\begin{command}{\pgfmathfloatgetflags{\marg{x}}{\marg{flagscount}}}
+ Extracts the flags of \meta{x} into the count register \meta{flagscount}.
+\end{command}
+
+\begin{command}{\pgfmathfloatgetflagstomacro{\marg{x}}{\marg{macro}}}
+ Extracts the flags of \meta{x} into the macro \meta{macro}.
+\end{command}
+
+\begin{command}{\pgfmathfloatgetmantissa{\marg{x}}{\marg{mantissadimen}}}
+ Extracts the mantissa of \meta{x} into the dimen register
+ \meta{mantissadimen}.
+\end{command}
+
+\begin{command}{\pgfmathfloatgetmantissatok{\marg{x}}{\marg{mantissatoks}}}
+ Extracts the mantissa of \meta{x} into the token register
+ \meta{mantissatoks}.
+\end{command}
+
+\begin{command}{\pgfmathfloatgetexponent{\marg{x}}{\marg{exponentcount}}}
+ Extracts the exponent of \meta{x} into the count register
+ \meta{exponentcount}.
+\end{command}
+
+
+\subsubsection{Symbolic Rounding Operations}
+
+Commands in this section constitute the basic level implementations of the
+rounding routines. They work symbolically, i.e.\ they operate on text, not on
+numbers and allow arbitrarily large numbers.
+
+\begin{command}{\pgfmathroundto{\marg{x}}}
+ Rounds a fixed point number to prescribed precision and writes the result
+ to |\pgfmathresult|.
+
+ The desired precision can be configured with
+ |/pgf/number format/precision|, see section~\ref{pgfmath-numberprinting}.
+ This section does also contain application examples.
+
+ Any trailing zeros after the period are discarded. The algorithm is purely
+ text based and allows to deal with precisions beyond \TeX's fixed point
+ support.
+
+ As a side effect, the global boolean |\ifpgfmathfloatroundhasperiod| will
+ be set to true if and only if the resulting mantissa has a period.
+ Furthermore, |\ifpgfmathfloatroundmayneedrenormalize| will be set to true
+ if and only if the rounding result's floating point representation would
+ have a larger exponent than \meta{x}.
+ %
+\begin{codeexample}[]
+\pgfmathroundto{1}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathroundto{4.685}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathroundto{19999.9996}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathroundtozerofill{\marg{x}}}
+ A variant of |\pgfmathroundto| which always uses a fixed number of digits
+ behind the period. It fills missing digits with zeros.
+ %
+\begin{codeexample}[]
+\pgfmathroundtozerofill{1}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathroundto{4.685}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathroundtozerofill{19999.9996}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathfloatround{\marg{x}}}
+ Rounds a normalized floating point number to a prescribed precision and
+ writes the result to |\pgfmathresult|.
+
+ The desired precision can be configured with
+ |/pgf/number format/precision|, see section~\ref{pgfmath-numberprinting}.
+
+ This method employs |\pgfmathroundto| to round the mantissa and applies
+ renormalization if necessary.
+
+ As a side effect, the global boolean |\ifpgfmathfloatroundhasperiod| will
+ be set to true if and only if the resulting mantissa has a period.
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{52.5864}
+\pgfmathfloatround{\pgfmathresult}
+\pgfmathfloattosci{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{9.995}
+\pgfmathfloatround{\pgfmathresult}
+\pgfmathfloattosci{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathfloatroundzerofill{\marg{x}}}
+ A variant of |\pgfmathfloatround| produces always the same number of digits
+ after the period (it includes zeros if necessary).
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{52.5864}
+\pgfmathfloatroundzerofill{\pgfmathresult}
+\pgfmathfloattosci{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathfloatparsenumber{9.995}
+\pgfmathfloatroundzerofill{\pgfmathresult}
+\pgfmathfloattosci{\pgfmathresult}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Math Operations Commands}
+
+This section describes some of the replacement commands in more detail.
+
+Please note that these commands can be used even if the |fpu| as such has not
+been activated -- it is sufficient to load the library.
+
+\begin{command}{\pgfmathfloat\meta{op}}
+ Methods of this form constitute the replacement operations where \meta{op}
+ can be any of the well-known math operations.
+
+ Thus, \declareandlabel{\pgfmathfloatadd} is the counterpart for
+ |\pgfmathadd| and so on. The semantics and number of arguments is the same,
+ but all input and output arguments are \emph{expected} to be floating point
+ numbers.
+\end{command}
+
+\begin{command}{\pgfmathfloattoextentedprecision{\marg{x}}}
+ Renormalizes \meta{x} to extended precision mantissa, meaning $100 \le m <
+ 1000$ instead of $1 \le m < 10$.
+
+ The ``extended precision'' means we have higher accuracy when we apply
+ pgfmath operations to mantissas.
+
+ The input argument is expected to be a normalized floating point number;
+ the output argument is a non-normalized floating point number (well,
+ normalized to extended precision).
+
+ The operation is supposed to be very fast.
+\end{command}
+
+\begin{command}{\pgfmathfloatsetextprecision\marg{shift}}
+ Sets the precision used inside of |\pgfmathfloattoextentedprecision| to
+ \meta{shift}.
+
+ The different choices are
+
+ \begin{tabular}{llrll}
+ 0 & normalization to & $0$ & $\le m < 1$ & (disable extended precision) \\
+ 1 & normalization to & $10$ & $\le m < 100$ & \\
+ 2 & normalization to & $100$ & $\le m < 1000$ & (default of |\pgfmathfloattoextentedprecision|) \\
+ 3 & normalization to & $1000$ & $\le m < 10000$ & \\
+ \end{tabular}
+\end{command}
+
+\begin{command}{\pgfmathfloatlessthan{\marg{x}}{\marg{y}}}
+ Defines |\pgfmathresult| as $1.0$ if $\meta{x} < \meta{y}$, but $0.0$
+ otherwise. It also sets the global \TeX-boolean |\pgfmathfloatcomparison|
+ accordingly. The arguments \meta{x} and \meta{y} are expected to be numbers
+ which have already been processed by |\pgfmathfloatparsenumber|. Arithmetic
+ is carried out using \TeX-registers for exponent- and mantissa comparison.
+\end{command}
+
+\begin{command}{\pgfmathfloatmultiplyfixed\marg{float}\marg{fixed}}
+ Defines |\pgfmathresult| to be $\meta{float} \cdot \meta{fixed}$ where
+ \meta{float} is a floating point number and \meta{fixed} is a fixed point
+ number. The computation is performed in floating point arithmetics, that
+ means we compute $m \cdot \meta{fixed}$ and renormalize the result where
+ $m$ is the mantissa of \meta{float}.
+
+ This operation renormalizes \meta{float} with
+ |\pgfmathfloattoextentedprecision| before the operation, that means it is
+ intended for relatively small arguments of \meta{fixed}. The result is a
+ floating point number.
+\end{command}
+
+\begin{command}{\pgfmathfloatifapproxequalrel\marg{a}\marg{b}\marg{true-code}\marg{false-code}}
+ Computes the relative error between \meta{a} and \meta{b} (assuming
+ \meta{b}$\neq 0$) and invokes \meta{true-code} if the relative error is
+ below |/pgf/fpu/rel thresh| and \meta{false-code} if that is not the case.
+
+ The input arguments will be parsed with |\pgfmathfloatparsenumber|.
+
+ \begin{key}{/pgf/fpu/rel thresh=\marg{number} (initially 1e-4)}
+ A threshold used by |\pgfmathfloatifapproxequalrel| to decide whether
+ numbers are approximately equal.
+ \end{key}
+\end{command}
+
+\begin{command}{\pgfmathfloatshift{\marg{x}}{\marg{num}}}
+ Defines |\pgfmathresult| to be $\meta{x} \cdot 10^{\meta{num}}$. The
+ operation is an arithmetic shift base ten and modifies only the exponent of
+ \meta{x}. The argument \meta{num} is expected to be a (positive or
+ negative) integer.
+\end{command}
+
+\begin{command}{\pgfmathfloatabserror\marg{x}\marg{y}}
+ Defines |\pgfmathresult| to be the absolute error between two floating
+ point numbers $x$ and $y$, $\lvert x - y\rvert $ and returns the result as
+ floating point number.
+\end{command}
+
+\begin{command}{\pgfmathfloatrelerror\marg{x}\marg{y}}
+ Defines |\pgfmathresult| to be the relative error between two floating
+ point numbers $x$ and $y$, $\lvert x - y\rvert / \lvert y \rvert$ and
+ returns the result as floating point number.
+\end{command}
+
+\begin{command}{\pgfmathfloatint\marg{x}}
+ Returns the integer part of the floating point number \meta{x}, by
+ truncating any digits after the period. This methods truncates the absolute
+ value $\rvert x \lvert$ to the next smaller integer and restores the
+ original sign afterwards.
+
+ The result is returned as floating point number as well.
+
+ See also |\pgfmathfloattoint| which returns the number in integer format.
+\end{command}
+
+\begin{command}{\pgfmathlog{\marg{x}}}
+ Defines |\pgfmathresult| to be the natural logarithm of \meta{x},
+ $\ln(\meta{x})$. This method is logically the same as |\pgfmathln|, but it
+ applies floating point arithmetics to read number \meta{x} and employs the
+ logarithm identity \[ \ln(m \cdot 10^e) = \ln(m) + e \cdot \ln(10) \] to
+ get the result. The factor $\ln(10)$ is a constant, so only $\ln(m)$ with
+ $1 \le m < 10$ needs to be computed. This is done using standard pgf math
+ operations.
+
+ Please note that \meta{x} needs to be a number, expression parsing is not
+ possible here.
+
+ If \meta{x} is \emph{not} a bounded positive real number (for example
+ $\meta{x} \le 0$), |\pgfmathresult| will be \emph{empty}, no error message
+ will be generated.
+ %
+\begin{codeexample}[]
+\pgfmathlog{1.452e-7}
+\pgfmathresult
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfmathlog{6.426e+8}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Accessing the Original Math Routines for Programmers}
+
+As soon as the library is loaded, every private math routine will be copied to
+a new name. This allows library and package authors to access the \TeX-register
+based math routines even if the FPU is activated. And, of course, it allows the
+FPU as such to perform its own mantissa computations.
+
+The private implementations of \pgfname\ math commands, which are of the form
+|\pgfmath|\meta{name}|@|, will be available as|\pgfmath@basic@|\meta{name}|@|
+as soon as the library is loaded.
+
+\endgroup
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-lsystems.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-lsystems.tex
new file mode 100644
index 0000000000..c46b8ed5f5
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-lsystems.tex
@@ -0,0 +1,384 @@
+% Copyright 2008 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.
+
+
+\section{Lindenmayer System Drawing Library}
+
+\subsection{Overview}
+
+Lindenmayer systems (also commonly known as ``L-systems''), were originally
+developed by Aristid Lindenmayer as a theory of algae growth patterns and then
+subsequently used to model branching patterns in plants and produce fractal
+patterns. Typically, an L-system consists of a set of symbols, each of which is
+associated with some graphical action (such as ``turn left'' or ``move
+forward'') and a set of rules (``production'' or ``rewrite'' rules). Given a
+string of symbols, the rewrite rules are applied several times and the when
+resulting string is processed the action associated with each symbol is
+executed.
+
+In \pgfname, L-systems can be used to create simple 2-dimensional fractal
+patterns\ldots
+%
+\begin{codeexample}[pre={\expandafter\let\csname pgf@lsystem@Koch curve\endcsname=\relax}]
+\begin{tikzpicture}
+\pgfdeclarelindenmayersystem{Koch curve}{
+ \rule{F -> F-F++F-F}
+}
+
+\shadedraw [top color=white, bottom color=blue!50, draw=blue!50!black]
+ [l-system={Koch curve, step=2pt, angle=60, axiom=F++F++F, order=3}]
+ lindenmayer system -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+%
+\noindent\ldots and ``plant like'' patterns\ldots
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+\draw [green!50!black, rotate=90]
+ [l-system={rule set={F -> FF-[-F+F]+[+F-F]}, axiom=F, order=4, step=2pt,
+ randomize step percent=25, angle=30, randomize angle percent=5}]
+ lindenmayer system;
+\end{tikzpicture}
+\end{codeexample}
+%
+\noindent \ldots but it is important to bear in mind that even moderately
+complex L-systems can exceed the available memory of \TeX, and can be very
+slow. If possible, you are advised to increase the main memory and save stack
+to their maximum possible values for your particular \TeX{} distribution.
+However, even by doing this you may find you still run out of memory quite
+quickly.
+
+For an excellent introduction to L-systems (containing some ``really cool''
+pictures -- many of which are sadly not possible in \pgfname) see \emph{The
+Algorithmic Beauty of Plants} by Przemyslaw Prusinkiewicz and Aristid
+Lindenmayer (which is freely available via the internet).
+
+\begin{pgflibrary}{lindenmayersystems}
+ This \pgfname-library provides basic commands for defining and using simple
+ L-systems. The \tikzname-library provides, furthermore, a front end for
+ using L-systems in \tikzname.
+\end{pgflibrary}
+
+
+\subsubsection{Declaring L-systems}
+
+Before an L-system can be used, it must be declared using the following
+command:
+
+\begin{command}{\pgfdeclarelindenmayersystem\marg{name}\marg{specification}}
+ This command declares a Lindenmayer system called \meta{name}. The
+ \meta{specification} argument contains a description of the L-system's
+ symbols and rules. Two commands |\symbol| and |\rule| are only defined when
+ the \meta{specification} argument is executed.
+
+ \begin{command}{\symbol\marg{name}\marg{code}}
+ This defines a symbol called \meta{name} for a specific L-system,
+ and associates it with \meta{code}.
+
+ A symbol should consist of a single alpha-numeric character (i.e.,
+ |A|-|Z|, |a|-|z| or |0|-|9|). The symbols |F|, |f|, |+|, |-|, |[| and
+ |]| are available by default so do not need to be defined for each
+ L-system. However, if you are feeling adventurous, they can be
+ redefined for specific L-systems if required. The L-system treats the
+ default symbols as follows (the commands they execute are described
+ below):
+ %
+ \begin{itemize}
+ \item |F| move forward a certain distance, drawing a line. Uses
+ |\pgflsystemdrawforward|.
+ \item |f| move forward a certain distance, without drawing a line.
+ Uses |\pgflsystemmoveforward|.
+ \item |+| turn left by some angle. Uses |\pgflsystemturnleft|.
+ \item |-| turn right by some angle. Uses |\pgflsystemturnright|.
+ \item |[| save the current state (i.e., the position and
+ direction). Uses |\pgflsystemsavestate|.
+ \item |]| restore the last saved state. Uses
+ |\pgflsystemrestorestate|.
+ \end{itemize}
+
+ The symbols |[| and |]| act like a stack: |[| pushes the state of the
+ L-system on to the stack, and |]| pops a state off the stack.
+
+ When \meta{code} is executed, the transformation matrix is set up so
+ that the origin is at the current position and the positive x-axis
+ ``points forward'', so |\pgfpathlineto{\pgfpoint{1cm}{0cm}}| draws a
+ line 1cm forward.
+
+ The following keys can alter the production of an L-system. However,
+ they do not store values in themselves.
+
+ \begin{key}{/pgf/lindenmayer system/step=\meta{length} (initially 5pt)}
+ How far the L-system moves forward if required. This key sets the
+ \TeX{} dimension |\pgflsystemstep|.
+ \end{key}
+
+ \begin{key}{/pgf/lindenmayer system/randomize step percent=\meta{percentage} (initially 0)}
+ If the step is to be randomized, this key specifies by how much.
+ The value is stored in the \TeX{} macro
+ |\pgflsystemrandomizesteppercent|.
+ \end{key}
+
+ \begin{key}{/pgf/lindenmayer system/left angle=\meta{angle} (initially 90)}
+ This key sets the angle through which the L-system turns when it
+ turns left. The value is stored in the \TeX{} macro
+ |\pgflsystemrleftangle|.
+ \end{key}
+
+ \begin{key}{/pgf/lindenmayer system/right angle=\meta{angle} (initially 90)}
+ This key sets the angle through which the L-system turns when it
+ turns right. The value is stored in the \TeX{} macro
+ |\pgflsystemrrightangle|.
+ \end{key}
+
+ \begin{key}{/pgf/lindenmayer system/randomize angle percent=\meta{percentage} (initially 0)}
+ If the angles are to be randomized, this key specifies by how much.
+ The value is stored in the \TeX{} macro
+ |\pgflsystemrandomizeanglepercent|.
+ \end{key}
+
+ For speed and convenience, when the code for a symbol is executed, the
+ following commands are available.
+
+ \begin{command}{\pgflsystemcurrentstep}
+ The current ``step'' of the L-system (i.e., how far the system
+ will move forward if required). This is initially set to the
+ value in the \TeX-dimensions |\pgflsystemstep|, but the actual
+ value may be changed if |\pgflsystemrandomizestep| is used
+ (see below).
+ \end{command}
+
+ \begin{command}{\pgflsystemcurrentleftangle}
+ The angle the L-system will turn when it turns left.
+ The value stored in this macro may be changed if
+ |\pgflsystemrandomizeleftangle| is used.
+ \end{command}
+
+ \begin{command}{\pgflsystemcurrentrightangle}
+ The angle the L-system will turn when it turns right.
+ The value stored in this macro may be changed if
+ |\pgflsystemrandomizerightangle| is used.
+ \end{command}
+
+ The following commands may be useful if you wish to define your own
+ symbols.
+
+ \begin{command}{\pgflsystemrandomizestep}
+ Randomizes the value in |\pgflsystemcurrentstep| according to the
+ current value of the key |randomize step percent|.
+ \end{command}
+
+ \begin{command}{\pgflsystemrandomizeleftangle}
+ Randomizes the value in |\pgflsystemcurrentleftangle| according to
+ the value of the |randomize angle percent| key.
+ \end{command}
+
+ \begin{command}{\pgflsystemrandomizerightangle}
+ Randomizes the value in |\pgflsystemcurrentrightangle| according
+ to the value of the |randomize angle| key.
+ \end{command}
+
+ \begin{command}{\pgflsystemdrawforward}
+ Move forward in the current direction, by |\pgflsystemcurrentstep|,
+ drawing a line in the process. This macro calls
+ |\pgflsystemrandomizestep|. Internally, \pgfname{} simply shifts
+ the transformation matrix in the positive direction of the current
+ (transformed) x-axis by |\pgflsystemstep| and then executes a
+ line-to to the (newly transformed) origin.
+ \end{command}
+
+ \begin{command}{\pgflsystemmoveforward}
+ Move forward in the current direction, by |\pgflsystemcurrentstep|,
+ without drawing a line. This macro calls
+ |\pgflsystemrandomizestep|. \pgfname{} executes a transformation as
+ above, but executes a move-to to the (newly transformed) origin.
+ \end{command}
+
+ \begin{command}{\pgflsystemturnleft}
+ Turn left by |\pgflsystemcurrentleftangle|. Internally, \pgfname{}
+ simply rotates the transformation matrix. This macro calls
+ |\pgflsystemrandomizeleftangle|.
+ \end{command}
+
+ \begin{command}{\pgflsystemturnright}
+ Turn right by |\pgflsystemcurrentrightangle|. Internally,
+ \pgfname{} simply rotates the transformation matrix. This macro
+ calls |\pgflsystemrandomizerightangle|.
+ \end{command}
+
+ \begin{command}{\pgflsystemsavestate}
+ Save the current position and orientation. Internally, \pgfname{}
+ simply starts a new \TeX-group.
+ \end{command}
+
+ \begin{command}{\pgflsystemrestorestate}
+ Restore the last saved position and orientation. Internally,
+ \pgfname{} closes a \TeX-group, restoring the transformation matrix
+ of the outer scope, and a move-to command is executed to the
+ (transformed) origin.
+ \end{command}
+ \end{command}
+
+ \begin{command}{\rule{\ttfamily\char`\{}\meta{head}{\ttfamily->}\meta{body}{\ttfamily\char`\}}}
+ Declare a rule. \meta{head} should consist of a single symbol, which
+ need not have been declared using |\symbol| or exist as a default
+ symbol (in fact, the more interesting L-systems depend on using symbols
+ with no corresponding code, to control the ``growth'' of the system).
+ \meta{body} consists of a string of symbols, which again need not
+ necessarily have any code associated with them.
+ \end{command}
+
+ As an example, the following shows an L-system that uses some of these
+ commands. This example illustrates the point that some symbols, in this
+ case |A| and |B|, do not have to have code associated with them. They
+ simply control the growth of the system.
+ %
+\begin{codeexample}[pre={\nullfont\expandafter\let\csname pgf@lsystem@Hilbert curve\endcsname=\relax}]
+\pgfdeclarelindenmayersystem{Hilbert curve}{
+ \symbol{X}{\pgflsystemdrawforward}
+ \symbol{+}{\pgflsystemturnright} % Explicitly define + and - symbols.
+ \symbol{-}{\pgflsystemturnleft}
+ \rule{A -> +BX-AXA-XB+}
+ \rule{B -> -AX+BXB+XA-}
+}
+\tikz\draw[lindenmayer system={Hilbert curve, axiom=A, order=4, angle=90}]
+ lindenmayer system;
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Using Lindenmayer Systems}
+
+\subsubsection{Using L-Systems in PGF}
+
+The following command is used to run an L-system in \pgfname:
+%
+\begin{command}{\pgflindenmayersystem\marg{name}\marg{axiom}\marg{order}}
+ Runs the L-system called \meta{name} using the input string \meta{axiom}
+ for \meta{order} iterations. In general, prior to calling this command, the
+ transformation matrix should be set appropriately for shifting and
+ rotating, and a move-to to the (transformed) origin should be executed.
+ This origin will be where the L-system starts. In addition, the relevant
+ keys should be set appropriately.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \pgfset{lindenmayer system/.cd, angle=60, step=2pt}
+ \foreach \x/\y in {0cm/1cm, 1.5cm/1.5cm, 2.5cm/0.5cm, 1cm/0cm}{
+ \pgftransformshift{\pgfqpoint{\x}{\y}}
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgflindenmayersystem{Koch curve}{F++F++F}{2}
+ \pgfusepath{stroke}
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that it is perfectly feasible for an L-system to define special
+ symbols which perform the move-to and use-path operations.
+ %
+\end{command}
+
+
+\subsubsection{Using L-Systems in Ti\emph{k}Z}
+
+In \tikzname, an L-system is created using a path operation. However,
+\tikzname{} is more flexible regarding the positioning of the L-system and also
+provides keys to create L-systems ``on-line''.
+
+\begin{pathoperation}{lindenmayer system}{ \opt{|[|\meta{keys}|]|}}
+ This will run an L-system according to the parameters specified in
+ \meta{keys} (which can also contain normal \tikz{} keys such as |draw| or
+ |thin|). The syntax is flexible regarding the L-system parameters and the
+ following all do the same thing:
+ %
+\begin{codeexample}[code only]
+\draw lindenmayer system [lindenmayer system={Hilbert curve, axiom=4, order=3}];
+\end{codeexample}
+
+\begin{codeexample}[code only]
+\draw [lindenmayer system={Hilbert curve, axiom=4, order=3}] lindenmayer system;
+\end{codeexample}
+
+\begin{codeexample}[code only]
+\tikzset{lindenmayer system={Hilbert curve, axiom=4, order=3}}
+\draw lindenmayer system;
+\end{codeexample}
+ %
+\end{pathoperation}
+
+\begin{pathoperation}{l-system}{ \opt{|[|\meta{keys}|]|}}
+ A more compact version of the |lindenmayer system| path command.
+\end{pathoperation}
+
+This library adds some additional keys for specifying L-systems. These keys
+only work in \tikzname{} and all have the same path, namely, |/pgf/lindenmayer|
+|system|, but the following keys are provided for convenience, so that you do
+not have to keep repeating this path:
+
+\begin{stylekey}{/pgf/lindenmayer system=\marg{keys}}
+\keyalias{tikz}
+ This key changes the key path to |/pgf/lindenmayer systems| and executes
+ \meta{keys}.
+\end{stylekey}
+
+\begin{stylekey}{/pgf/l-system=\marg{keys}}
+\keyalias{tikz}
+ A more compact version of the previous key.
+\end{stylekey}
+
+\begin{key}{/pgf/lindenmayer system/name=\marg{name}}
+ Sets the name for the L-system.
+\end{key}
+
+\begin{key}{/pgf/lindenmayer system/axiom=\marg{string}}
+ Sets the axiom (or input string) for the L-system.
+\end{key}
+
+\begin{key}{/pgf/lindenmayer system/order=\marg{integer}}
+ Sets the number of iterations the L-system will perform.
+\end{key}
+
+\begin{key}{/pgf/lindenmayer system/rule set=\marg{list}}
+ This key allows an (anonymous) L-system to be declared ``on-line''. There
+ is, however, a restriction that only the default symbols can be used for
+ drawing (empty symbols can still be used to control the growth of the
+ system). The rules in \meta{list} should be separated by commas.
+ %
+\begin{codeexample}[]
+\tikz[rotate=65]\draw [green!60!black] l-system
+ [l-system={rule set={F -> F[+F]F[-F]}, axiom=F, order=4, angle=25,step=3pt}];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/lindenmayer system/anchor=\meta{anchor}}
+ Be default, when this key is not used, the L-system will start from the
+ last specified coordinate. By using this key, the L-system will be placed
+ inside a special (rectangle) node which can be positioned using
+ \meta{anchor}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[l-system={step=1.75pt, order=5, angle=60}]
+ \pgfdeclarelindenmayersystem{Sierpinski triangle}{
+ \symbol{X}{\pgflsystemdrawforward}
+ \symbol{Y}{\pgflsystemdrawforward}
+ \rule{X -> Y-X-Y}
+ \rule{Y -> X+Y+X}
+ }
+ \draw [help lines] grid (3,2);
+ \draw [red] (0,0) l-system
+ [l-system={Sierpinski triangle, axiom=+++X, anchor=south west}];
+ \draw [blue] (3,2) l-system
+ [l-system={Sierpinski triangle, axiom=X, anchor=north east}];
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-math.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-math.tex
new file mode 100644
index 0000000000..d090ccae99
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-math.tex
@@ -0,0 +1,472 @@
+% Copyright 2013 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Math Library}
+\label{section-library-math}
+
+\begin{tikzlibrary}{math}
+ This library defines a simple mathematical language to define simple
+ functions and perform sequences of basic mathematical operations.
+\end{tikzlibrary}
+
+
+\subsection{Overview}
+
+\pgfname\ and \tikzname\ both use the \pgfname\ mathematical engine which
+provides many commands for parsing expressions. Unfortunately the \pgfname\
+math engine is somewhat cumbersome for long sequences of mathematical
+operations, particularly when assigning values to multiple variables. The
+\tikzname\ |calc| library provides some additional ``convenience'' operations
+for doing calculations (particularly with coordinates), but this can only be
+used inside \tikzname\ path commands.
+
+This |math| library provides a means to perform sequences of mathematical
+operations in a more `user friendly' manner than the \pgfname\ math engine. In
+addition, the coordinate calculations of the |calc| library can be accessed
+(provided it is loaded).
+%
+However as the |math| library uses the \pgfname\ math engine -- which uses pure
+\TeX\ to perform all its calculations -- it is subject to the same speed and
+accuracy limitations. It is worth bearing this in mind, before trying to
+implement algorithms requiring intensive and highly accurate computation. You
+can, of course use the |fp| or the |fpu| libraries to increase the accuracy
+(but not necessarily the speed) of computations.
+
+For most purposes, the features provided by this library are accessed using the
+following command:
+
+\begin{command}{\tikzmath\texttt{\{}\meta{statements}\texttt{\}}}
+ This command process a series of \meta{statements} which can represent
+ assignments, function definitions, conditional evaluation, and iterations.
+ It provides, in effect, a miniature mathematical language to perform basic
+ mathematical operations. Perhaps the most important thing to remember is
+ that \emph{every statement should end with a semi-colon}. This is likely to
+ be the most common reason why the |\tikzmath| command fails.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ % Adapted from http://www.cs.northwestern.edu/academics/courses/110/html/fib_rec.html
+ function fibonacci(\n) {
+ if \n == 0 then {
+ return 0;
+ } else {
+ return fibonacci2(\n, 0, 1);
+ };
+ };
+ function fibonacci2(\n, \p, \q) {
+ if \n == 1 then {
+ return \q;
+ } else {
+ return fibonacci2(\n-1, \q, \p+\q);
+ };
+ };
+ int \f, \i;
+ for \i in {0,1,...,20}{
+ \f = fibonacci(\i);
+ print {\f, };
+ };
+}
+\end{codeexample}
+ %
+\end{command}
+
+In addition to this command the following key is provided:
+
+\begin{key}{/tikz/evaluate={\meta{statements}}}
+ This key simply executes |\tikzmath{|\meta{statements}|}|.
+ %
+\begin{codeexample}[]
+\tikz[x=0.25cm,y=0.25cm,
+ evaluate={
+ int \i, \j;
+ for \i in {0,...,10}{
+ for \j in {0,...,10}{
+ \a{\i,\j} = (\i+\j)*5;
+ };
+ };
+ }
+]
+\foreach \i in {0,...,10}
+ \foreach \j in {0,...,10}
+ \fill [red!\a{\i,\j}!yellow] (\i,\j) rectangle ++(1, 1);
+
+\end{codeexample}
+ %
+\end{key}
+
+The following sections describe the miniature language that this library
+provides and can be used in the |\tikzmath| command and the |evaluate| key.
+The language consists only of simple keywords and expressions but the
+mini-parser allows you to format code in a reasonably versatile way (much like
+the |tikz| parser) except that \emph{all the keywords must be followed by at
+least one space}. This is the second most important thing to remember (after
+remembering to insert semi-colons at the end of every statement).
+
+
+\subsection{Assignment}
+
+In the simplest case, you will want to evaluate an expression and assign it to
+a macro, or a \TeX\ count or dimension register. In this case, use of the
+|math| library is straightforward:
+%
+\begin{codeexample}[]
+\newcount\mycount
+\newdimen\mydimen
+\tikzmath{
+ \a = 4*5+6;
+ \b = sin(30)*4;
+ \mycount = log10(2048) / log10(2);
+ \mydimen = 15^2;
+}
+\a, \b, \the\mycount, \the\mydimen
+\end{codeexample}
+
+In addition, \TeX-macros (\emph{not} \TeX\ registers) can be suffixed with an
+index, similar to indices in mathematical notation, for example, $x_1$, $x_2$,
+$x_3$:
+%
+\begin{codeexample}[]
+\tikzmath{
+ \x1 = 3+4; \x2 = 30+40; \x3 = 300+400;
+}
+\x1, \x2, \x3
+\end{codeexample}
+
+The index does not have to be a number. By using braces |{}|, more
+sophisticated indices can be created:
+%
+\begin{codeexample}[]
+\tikzmath{
+ \c{air} = 340; \c{water} = 1435; \c{steel} = 6100;
+}
+\foreach \medium in {air,steel}{The speed of sound in \medium\ is \c{\medium} m/s. }
+\end{codeexample}
+
+You should not, however, try to mix indexed and non-indexed variables. Once an
+assignment is made using an index, the |math| library expects all instances of
+the variable on the right hand side of an assignment to be followed by an
+index. This effect is reversed if you subsequently make an assignment to the
+variable without an index: the |math| library (or to be precise the \pgfname\
+math-engine) will then ignore any index following the variable on the right
+hand side of an assignment.
+
+In some cases, you may wish to assign a value or expression to a variable
+without evaluating it with the \pgfname\ math-engine. In this case, you can use
+the following keyword:
+
+\begin{math-keyword}{{let} \meta{variable} \texttt{=} \meta{expression}\texttt{;}}
+ This keyword assigns \meta{expression} to \meta{variable} without
+ evaluation. The \meta{expression} is however fully expanded using |\edef|.
+ Any spaces preceding \meta{expression} are removed, but any trailing spaces
+ (before the semi-colon) are included.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ let \x = (5*4)+1;
+ let \c1 = blue;
+}
+\x, ``\c1''
+\end{codeexample}
+ %
+\end{math-keyword}
+
+
+\subsection{Integers, ``Real'' Numbers, and Coordinates}
+
+By default, assignments are made by evaluating expressions using the \pgfname\
+math-engine and results are usually returned as number with a decimal point
+(unless you are assigning to a count register or use the |int| function).
+%
+As this is not always desirable, the |math| library allows variables -- which
+\emph{must} be \TeX\ macros -- to be `declared' as being a particular `type'.
+The library recognizes three types: integers (numbers without a decimal point),
+real numbers (numbers with a decimal point\footnote{Strictly speaking, due to
+the finite range and precision of \TeX\ numerical capabilities, the term
+``real'' is not correct.}), and coordinates.
+
+To declare a variable as being one of the three types, you can use the
+keywords shown below. It is important to remember that by telling the |math|
+library you want it to do a particular assignment for a variable, it will also
+do the same assignment when the variable is indexed.
+%
+\begin{codeexample}[]
+\tikzmath{
+ integer \x;
+ \x1 = 3+4; \x2 = 30+40; \x3 = 300+400;
+}
+\x1, \x2, \x3
+\end{codeexample}
+
+%But, if you want integer results without using a count register or the
+%|int| function, you can use a keyword to indicate this:
+
+\begin{math-keyword}{{integer} \meta{variable}\opt{\texttt{,} \meta{additional variables}}\texttt{;}}
+ The |integer| keyword indicates that assignments to the \meta{variable} or
+ the comma separated list of \meta{additional variables} should be truncated
+ (not rounded) to integers. The variables should be ordinary macros --
+ \emph{not} \TeX\ registers. In addition the variables should \emph{not} be
+ indexed.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ integer \x, \y, \z;
+ \x = 4*5+6;
+ \y = sin(30)*4;
+ \z = log10(512) / log10(2);
+ print {$x=\x$, $y=\y$, $z=\z$};
+}
+\end{codeexample}
+ %
+\end{math-keyword}
+
+\begin{math-keyword}{{int} \meta{variable}\opt{\texttt{,} \meta{additional variables}}\texttt{;}}
+ Short version of the |integer| keyword.
+\end{math-keyword}
+
+Having declared a variable as an integer, the |math| library will continue to
+assign only integers to that variable within the current \TeX\ scope. If you
+wish to assign non-integer (i.e., \emph{real}) numbers to the same variable,
+the following keyword can be used.
+
+\begin{math-keyword}{{real} \meta{variable}\opt{\texttt{,} \meta{additional variables}}\texttt{;}}
+ The |real| keyword ensures that assignments \meta{variable} (and
+ \meta{additional variables}) will not be truncated to integers.
+\end{math-keyword}
+
+In order to take advantage of |math| library interface to the |calc| library
+you must indicate that a variable is to be assigned coordinates, using the
+following keyword.
+
+\begin{math-keyword}{{coordinate} \meta{variable}\opt{\texttt{,} \meta{additional variables}}\texttt{;}}
+ This keyword enables \tikzname-style coordinates such as |(2cm,3pt)| or
+ |(my node.east)| to be parsed and assigned to \meta{variable} in the form
+ $x,y$, which can then be used in a |tikzpicture|:
+ %
+\begin{codeexample}[]
+\tikzmath{
+ coordinate \c;
+ \c = (45:10pt);
+}
+\tikz\draw (0,0) -- (\c);
+\end{codeexample}
+
+ If the \tikzname\ |calc| library is loaded, coordinate calculations can be
+ performed; the coordinate expression does not have to be surrounded by
+ |($|\ldots|$)|.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ coordinate \c, \d;
+ \c = (-1,2)+(1,-1);
+ \d = (4,1)-(2,-1);
+}
+\tikz\draw (\c) -- (\d);
+\end{codeexample}
+
+ In addition to assigning the $x$ and $y$ coordinates to \meta{variable}
+ (possibly with an optional index), two further variables are defined. The
+ first takes the name of \meta{variable} (e.g., |\c|) suffixed with |x|
+ (i.e., |\cx|) and is assigned the $x$ coordinate of |\c|. The second takes
+ the name of \meta{variable} suffixed with |y| (i.e., |\cy|) and is assigned
+ the $y$ coordinate of |\c|.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ coordinate \c;
+ \c1 = (30:20pt);
+ \c2 = (210:20pt);
+}
+\tikz\draw (\cx1,\cy1) -- (\cx2,\cy1) -- (\cx2,\cy2) -- (\cx1,\cy2);
+\end{codeexample}
+ %
+\end{math-keyword}
+
+%\begin{math-keyword}{{point} \meta{variable}\opt{\texttt{,} \meta{additional variables}}\texttt{;}}
+% The |point| keyword is a synonym for the |coordinate| keyword and performs
+% the same function.
+%\end{math-keyword}
+
+
+\subsection{Repeating Things}
+
+\begin{math-keyword}{{for} \meta{variable} \texttt{in \{}\meta{list}\texttt{\}\{}\meta{expressions}\texttt{\};}}
+ This is a ``trimmed down'' version of the |\foreach| command available as
+ part of \pgfname\ and \tikzname, but cannot currently be used outside of
+ the |\tikzmath| command. It is important to note the following:
+ %
+ \begin{itemize}
+ \item Every value in \meta{list} is evaluated using the \pgfname\
+ mathematical engine. However, if an item in \meta{list} contains a
+ comma, it \emph{must} be surrounded by braces, for example,
+ |{mod(5, 2)}|.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ int \x, \v;
+ \v=1;
+ for \x in {1,...,{random(3,10)}}{
+ \v=\v*2;
+ };
+ print {$x=\x, v=\v$};
+}
+\end{codeexample}
+ %
+ \item Because each item is evaluated, you cannot use \tikzname\
+ coordinates in \meta{list}.
+ \item Only single variable assignment is supported.
+ \item The ``dots notation'' (e.\,g., |1,2,...,9|) can be used in
+ \meta{list}, but is not as sophisticated as the \pgfname\
+ |\foreach| command. In particular, contextual replacement is not
+ possible.
+ \item Assignments that occur in the loop body \emph{are not scoped}.
+ They last beyond the body of each iteration and the end of the
+ |for| statement. This includes the values assigned to the
+ \meta{variable}.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ int \x, \y;
+ \y = 0;
+ for \x1 in {1,...,5}{
+ for \x2 in {10,20,...,50}{
+ \y = \y+\x1*\x2;
+ };
+ };
+}
+$x_1=\x1, x_2=\x2, y=\y$
+\end{codeexample}
+ \end{itemize}
+\end{math-keyword}
+
+
+\subsection{Branching Statements}
+
+Sometimes you may wish to execute different statements depending on the value
+of an expression. In this case the following keyword can be used:
+
+\begin{math-keyword}{{if} \meta{condition} \texttt{then \{}\meta{if-non-zero-statements}\texttt{\};}}
+ This keyword executes \meta{if-non-zero-statements} if the expression in
+ \meta{condition} evaluates to any value other than zero.
+\end{math-keyword}
+
+\begin{math-keyword}{{if} \meta{condition} \texttt{then \{}\meta{if-non-zero-statements}\texttt{\}} \texttt{else} \texttt{\{}\meta{if-zero-statements}\texttt{\}}\texttt{;}}
+ This keyword executes \meta{if-non-zero-statements} if the expression in
+ \meta{condition} evaluates to any value other than zero and the
+ \meta{if-zero-statements} are executed if the expression in
+ \meta{condition} evaluates to zero.
+ %
+\begin{codeexample}[]
+ \begin{tikzpicture}
+ \tikzmath{
+ int \x;
+ for \k in {0,10,...,350}{
+ if \k>260 then { let \c = orange; } else {
+ if \k>170 then { let \c = blue; } else {
+ if \k>80 then { let \c = red; } else {
+ let \c = green; }; }; };
+ {
+ \path [fill=\c!50, draw=\c] (\k:0.5cm) -- (\k:1cm) --
+ (\k+5:1cm) -- (\k+5:0.5cm) -- cycle;
+ };
+ };
+ }
+ \end{tikzpicture}
+\end{codeexample}
+ %
+\end{math-keyword}
+
+
+\subsection{Declaring Functions}
+
+You can add functions by using the following keywords:
+
+\begin{math-keyword}{{function} \meta{name}\texttt{(}\meta{arguments}\texttt{) \{} \meta{definition} \texttt{\};}}
+ This keyword works much like the |declare function| provided by the
+ \pgfname\ math-engine. The function \meta{name} can be any name that is not
+ already a function name in the current scope. The list of \meta{arguments}
+ are comma separated \TeX\ macros such as |\x|, or |\y| (it is not possible
+ to declare functions that take variable numbers of arguments). If the
+ function takes no arguments then the parentheses need not be used. It is
+ very important to note that the arrays that the \pgfname\ math engine
+ supports \emph{cannot currently be passed as arguments to functions}.
+
+ The function \meta{definition} should be a sequence of statements that can
+ be parsed by the |\tikzmath| command and should use the commands specified
+ in the \meta{arguments}. The |return| keyword (described below) should be
+ used to indicate the value returned by the function.
+ %
+ Although \meta{definition} can take any statements accepted by |\tikzmath|,
+ it is not advisable try to define functions inside other functions.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ function product(\x,\y) {
+ return \x*\y;
+ };
+ int \i, \i, \k;
+ \i = random(1,10);
+ \j = random(20, 40);
+ \k = product(\i, \j);
+ print { $\i\times \j = \k$ };
+}
+\end{codeexample}
+ %
+\end{math-keyword}
+
+\begin{math-keyword}{{return} \meta{expression}\texttt{;}}
+ This keyword should be used as the last executed statement in a function
+ definition to indicate the value that should be returned.
+\end{math-keyword}
+
+
+\subsection{Executing Code Outside the Parser}
+
+Sometimes you may wish to do ``something'' outside the parser, perhaps display
+some intermediate result or execute some code. In this case you have two
+options. Firstly, the following keyword can be used:
+
+\begin{math-keyword}{{print} \texttt{\{}\meta{code}\texttt{\};}}
+ Execute \meta{code} immediately. This is intended as convenience keyword
+ for displaying information in a document (analogous to the |print| command
+ in real programming languages). The \meta{code} is executed inside a \TeX\
+ group.
+ %
+\begin{codeexample}[]
+\tikzmath{
+ int \x, \y, \z;
+ \x = random(2, 5);
+ for \y in {0,...,6}{
+ \z = \x^\y;
+ print {$\x^\y=\z$, };
+ };
+}
+\end{codeexample}
+ %
+\end{math-keyword}
+
+Secondly, if a statement begins with a brace |{|, then everything up to the
+closing brace |}| is collected and executed (the closing brace \emph{must} be
+followed by a semi-colon). Like the |print| keyword, the contents of the braces
+is executed inside a \TeX\ group. Unlike the |print| keyword, the brace
+notation can be used in functions so that |tikz| path commands can be safely
+executed inside a |tikzpicture|.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+\draw [help lines] grid (3,2);
+\tikzmath{
+ coordinate \c;
+ for \x in {0,10,...,360}{
+ \c = (1.5cm, 1cm) + (\x:1cm and 0.5cm);
+ { \fill (\c) circle [radius=1pt]; };
+ };
+}
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-matrices.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-matrices.tex
new file mode 100644
index 0000000000..5eaed540fa
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-matrices.tex
@@ -0,0 +1,332 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Matrix Library}
+
+\begin{tikzlibrary}{matrix}
+ This library package defines additional styles and options for creating
+ matrices.
+\end{tikzlibrary}
+
+
+\subsection{Matrices of Nodes}
+
+A \emph{matrix of nodes} is a \tikzname\ matrix in which each cell contains a
+node. In this case it is bothersome having to write |\node{| at the beginning
+of each cell and |};| at the end of each cell. The following key simplifies
+typesetting such matrices.
+
+\begin{key}{/tikz/matrix of nodes}
+ Conceptually, this key adds |\node{| at the beginning and |};| at the end
+ of each cell and sets the |anchor| of the node to |base|. Furthermore, it
+ adds the option |name| option to each node, where the name is set to
+ \meta{matrix name}|-|\meta{row number}|-|\meta{column number}. For
+ example, if the matrix has the name |my matrix|, then the node in the
+ upper left cell will get the name |my matrix-1-1|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix (magic) [matrix of nodes]
+ {
+ 8 & 1 & 6 \\
+ 3 & 5 & 7 \\
+ 4 & 9 & 2 \\
+ };
+
+ \draw[thick,red,->] (magic-1-1) |- (magic-2-3);
+\end{tikzpicture}
+\end{codeexample}
+
+ You may wish to add options to certain nodes in the matrix. This can be
+ achieved in three ways.
+ %
+ \begin{enumerate}
+ \item You can modify, say, the |row 2 column 3| style to pass special
+ options to this particular cell.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[row 2 column 3/.style=red]
+ \matrix [matrix of nodes]
+ {
+ 8 & 1 & 6 \\
+ 3 & 5 & 7 \\
+ 4 & 9 & 2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \item At the beginning of a cell, you can use a special syntax. If a
+ cell starts with a vertical bar, then everything between this bar
+ and the next bar is passed on to the |node| command.
+ %
+{\catcode`\|=12
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of nodes]
+ {
+ 8 & 1 & 6 \\
+ 3 & 5 & |[red]| 7 \\
+ 4 & 9 & 2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+}
+ %
+ You can also use an option like \verb!|[red] (seven)|! to give a
+ different name to the node.
+
+ Note that the |&| character also takes an optional argument, which
+ is an extra column skip.
+ %
+{\catcode`\|=12
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of nodes]
+ {
+ 8 &[1cm] 1 &[3mm] |[red]| 6 \\
+ 3 & 5 & |[red]| 7 \\
+ 4 & 9 & 2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+}
+ \item If your cell starts with a |\path| command or any command that
+ expands to |\path|, which includes |\draw|, |\node|, |\fill| and
+ others, the |\node{| startup code and the |};| code are suppressed.
+ This means that for this particular cell you can provide totally
+ different contents.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of nodes]
+ {
+ 8 & 1 & 6 \\
+ 3 & 5 & \node[red]{7}; \draw(0,0) circle(10pt);\\
+ 4 & 9 & 2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{enumerate}
+\end{key}
+
+\begin{key}{/tikz/matrix of math nodes}
+ This style is almost the same as the previous style, only |$| is added %$
+ at the beginning and at the end of each node, so math mode will be switched
+ on in all nodes.
+ %
+{\catcode`\|=12
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of math nodes]
+ {
+ a_8 & a_1 & a_6 \\
+ a_3 & a_5 & |[red]| a_7 \\
+ a_4 & a_9 & a_2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+}
+\end{key}
+
+\begin{key}{/tikz/nodes in empty cells=\meta{true or false} (default true)}
+ When set to |true|, a node (with empty contents) is put in empty cells.
+ Normally, empty cells are just, well, empty. The style can be used together
+ with both a |matrix of nodes| and a |matrix of math nodes|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of math nodes,nodes={circle,draw}]
+ {
+ a_8 & & a_6 \\
+ a_3 & & a_7 \\
+ a_4 & a_9 & \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of math nodes,nodes={circle,draw},nodes in empty cells]
+ {
+ a_8 & & a_6 \\
+ a_3 & & a_7 \\
+ a_4 & a_9 & \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{End-of-Lines and End-of-Row Characters in Matrices of Nodes}
+
+Special care must be taken about the usage of the |\\| command inside a matrix
+of nodes. The reason is that this character is overloaded in \TeX: On the one
+hand, it is used to denote the end of a line in normal text; on the other hand
+it is used to denote the end of a row in a matrix. Now, if a matrix contains
+node which in turn may have multiple lines, it is unclear which meaning of |\\|
+should be used.
+
+This problem arises only when you use the |text width| option of nodes. Suppose
+you write a line like
+%
+\begin{codeexample}[code only]
+\matrix [text width=5cm,matrix of nodes]
+{
+ first row & upper line \\ lower line \\
+ second row & hmm \\
+};
+\end{codeexample}
+%
+This leaves \TeX\ trying to riddle out how many rows this matrix should have.
+Do you want two rows with the upper right cell containing a two-line text. Or
+did you mean a three row matrix with the second row having only one cell?
+
+Since \TeX\ is not clairvoyant, the following rules are used:
+%
+\begin{enumerate}
+ \item Inside a matrix, the |\\| command, by default, signals the end of the
+ row, not the end of a line in a cell.
+ \item However, there is an exception to this rule: If a cell starts with a
+ \TeX-group (this is, with |{|), then inside this first group the |\\|
+ command retains the meaning of ``end of line'' character. Note that
+ this special rule works only for the first group in a cell and this
+ group must be at the beginning.
+\end{enumerate}
+
+The net effect of these rules is the following: Normally, |\\| is an end-of-row
+indicator; if you want to use it as an end-of-line indicator in a cell, just
+put the whole cell in curly braces. The following example illustrates the
+difference:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of nodes,nodes={text width=16mm,draw}]
+ {
+ row 1 & upper line \\ lower line \\
+ row 2 & hmm \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of nodes,nodes={text width=16mm,draw}]
+ {
+ row 1 & {upper line \\ lower line} \\
+ row 2 & hmm \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Note that this system is not fool-proof. If you write things like |a&b{c\\d}\\|
+in a matrix of nodes, an error will result (because the second cell did not
+start with a brace, so |\\| retained its normal meaning and, thus, the second
+cell contained the text |b{c|, which is not balanced with respect to the number
+of braces).
+
+
+\subsection{Delimiters}
+
+Delimiters are parentheses or braces to the left and right of a formula or a
+matrix. The matrix library offers options for adding such delimiters to a
+matrix. However, delimiters can actually be added to any node that has the
+standard anchors |north|, |south|, |north west| and so on. In particular, you
+can add delimiters to any |rectangle| box. They are implemented by ``measuring
+the height'' of the node and then adding a delimiter of the correct size to the
+left or right using some after node magic.
+
+\begin{key}{/tikz/left delimiter=\meta{delimiter}}
+ This option can be given to a any node that has the standard anchors
+ |north|, |south| and so on. The \meta{delimiter} can be any delimiter that
+ is acceptable to \TeX's |\left| command.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of math nodes,left delimiter=(,right delimiter=\}]
+ {
+ a_8 & a_1 & a_6 \\
+ a_3 & a_5 & a_7 \\
+ a_4 & a_9 & a_2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [fill=red!20,left delimiter=(,right delimiter=\}]
+ {$\displaystyle\int_0^1 x\,dx$};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every delimiter (initially \normalfont empty)}
+ This style is executed for every delimiter. You can use it to shift or
+ color delimiters or do whatever.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/every left delimiter (initially \normalfont empty)}
+ This style is additionally executed for every left delimiter.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every left delimiter/.style={red,xshift=1ex},
+ every right delimiter/.style={xshift=-1ex}]
+ \matrix [matrix of math nodes,left delimiter=(,right delimiter=\}]
+ {
+ a_8 & a_1 & a_6 \\
+ a_3 & a_5 & a_7 \\
+ a_4 & a_9 & a_2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{key}
+
+\begin{key}{/tikz/right delimiter=\meta{delimiter}}
+ Works as above.
+ %
+ \begin{stylekey}{/tikz/every right delimiter (initially \normalfont empty)}
+ Works as above.
+ \end{stylekey}
+\end{key}
+
+\begin{key}{/tikz/above delimiter=\meta{delimiter}}
+ This option allows you to add a delimiter above the node. It is implemented
+ by rotating a left delimiter.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of math nodes,%
+ left delimiter=\|,right delimiter=\rmoustache,%
+ above delimiter=(,below delimiter=\}]
+ {
+ a_8 & a_1 & a_6 \\
+ a_3 & a_5 & a_7 \\
+ a_4 & a_9 & a_2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every above delimiter (initially \normalfont empty)}
+ Works as above.
+ \end{stylekey}
+\end{key}
+
+\begin{key}{/tikz/below delimiter=\meta{delimiter}}
+ Works as above.
+ \begin{stylekey}{/tikz/every below delimiter (initially \normalfont empty)}
+ Works as above.
+ \end{stylekey}
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-mindmaps.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-mindmaps.tex
new file mode 100644
index 0000000000..47bc68db89
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-mindmaps.tex
@@ -0,0 +1,521 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Mindmap Drawing Library}
+
+\begin{tikzlibrary}{mindmap}
+ This packages provides styles for drawing mindmap diagrams.
+\end{tikzlibrary}
+
+
+\subsection{Overview}
+
+This library is intended to make the creation of mindmaps or concept maps
+easier. A \emph{mindmap} is a graphical representation of a concept together
+with related concepts and annotations. Mindmaps are, essentially, trees,
+possibly with a few extra edges added, but they are usually drawn in a special
+way: The root concept is placed in the middle of the page and is drawn as a
+huge circle, ellipse, or cloud. The related concepts then ``leave'' this root
+concept via branch-like tendrils.
+
+The mindmap library of \tikzname\ produces mindmaps that look a bit different
+from the standard mindmaps: While the big root concept is still a circle,
+related concepts are also depicted as (smaller) circles. The related concepts
+are linked to the root concept via organic-looking connections. The overall
+effect is visually rather pleasing, but readers may not immediately think of a
+mindmap when they see a picture created with this library.
+
+Although it is not strictly necessary, you will usually create mindmaps using
+\tikzname's tree mechanism and some of the styles and macros of the package
+work best when used inside trees. However, it is still possible and sometimes
+necessary to treat parts of a mindmap as a graph with arbitrary edges and this
+is also possible.
+
+
+\subsection{The Mindmap Style}
+
+Every mindmap should be put in a scope or a picture where the |mindmap| style
+is used. This style installs some internal settings.
+
+\begin{stylekey}{/tikz/mindmap}
+ Use this style with all pictures or at least scopes that contain a mindmap.
+ It installs a whole bunch of settings that are useful for drawing mindmaps.
+ %
+\begin{codeexample}[]
+\tikz[mindmap,concept color=red!50]
+ \node [concept] {Root concept}
+ child[grow=right] {node[concept] {Child concept}};
+\end{codeexample}
+ %
+ The sizes of concepts are predefined in such a way that a medium-size
+ mindmap will fit on an A4 page (more or less).
+ %
+ \begin{stylekey}{/tikz/every mindmap}
+ This style is included by the |mindmap| style. Change this style to add
+ special settings to your mindmaps.
+ %
+\begin{codeexample}[]
+\tikz[large mindmap,concept color=red!50]
+ \node [concept] {Root concept}
+ child[grow=right] {node[concept] {Child concept}};
+\end{codeexample}
+ \end{stylekey}
+
+ \paragraph{Remark:}
+ Note that |mindmap| redefines |font| sizes and |sibling angle| depending on
+ the current concept level (i.e. inside of |level 1 concept|,
+ |level 2 concept| etc.). Thus, if you need to redefine these variables, use
+
+ |level 1 concept/.append style={font=\small}|
+
+ \noindent or
+
+ |level 2 concept/.append style={sibling distance=90}|
+
+ \noindent \emph{after} the |mindmap| style.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/small mindmap}
+ This style includes the |mindmap| style, but additionally changes the
+ default size of concepts, fonts and distances so that a medium-sized
+ mindmap will fit on an A5 page (A5 pages are half as large as A4 pages).
+ Mindmaps with |small mindmap| will also fit onto a standard frame of the
+ |beamer| package.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/large mindmap}
+ This style includes the |mindmap| style, but additionally changes the
+ default size of concepts, fonts and distances so that a medium-sized
+ mindmap will fit on an A3 page (A3 pages are twice as large as A4 pages).
+\end{stylekey}
+
+\begin{stylekey}{/tikz/huge mindmap}
+ This style causes concepts to be even bigger and it is best used with A2
+ paper and above.
+\end{stylekey}
+
+
+\subsection{Concepts Nodes}
+
+The basic entities of mindmaps are called \emph{concepts} in \tikzname. A
+concept is a node of style |concept| and it must be circular for some of the
+connection macros to work.
+
+
+\subsubsection{Isolated Concepts}
+
+The following styles influence how isolated concepts are rendered:
+
+\begin{stylekey}{/tikz/concept}
+ This style should be used with all nodes that are concepts, although some
+ styles like |extra concept| install this style automatically.
+
+ Basically, this style makes the concept node circular and installs a
+ uniform color called |concept color|, see below. Additionally, the style
+ |every concept| is called.
+ %
+\begin{codeexample}[]
+\tikz[mindmap,concept color=red!50] \node [concept] {Some concept};
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every concept}
+ In order to change the appearance of concept nodes, you should change
+ this style. Note, however, that the color of a concept should be
+ uniform for some of the connection bar stuff to work, so you should not
+ change the color or the draw/fill state of concepts using this option.
+ It is mostly useful for changing the text color and font.
+ \end{stylekey}
+
+ \begin{key}{/tikz/concept color=\meta{color}}
+ This option tells \tikzname\ which color should be used for filling and
+ stroking concepts. The difference between this option and just setting
+ |every concept| to the desired color is that this option allows
+ \tikzname\ to keep track of the colors used for concepts. This is
+ important when you \emph{change} the color between two connected
+ concepts. In this case, \tikzname\ can automatically create a shading
+ that provides a smooth transition between the old and the new concept
+ color; we will come back to this in the next section.
+ \end{key}
+\end{stylekey}
+
+\begin{stylekey}{/tikz/extra concept}
+ This style is intended for concepts that are not part of the ``mindmap
+ tree'', but stand beside it. Typically, they will have a subdued color or
+ be smaller. In order to have these concepts appear in a uniform way and in
+ order to indicate in the code that these concepts are additional, you can
+ use this style.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[mindmap,concept color=blue!80]
+ \node [concept] {Root concept};
+ \node [extra concept] at (10,0) {extra concept};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \begin{stylekey}{/tikz/every extra concept}
+ Change this style to change the appearance of extra concepts.
+ \end{stylekey}
+\end{stylekey}
+
+
+\subsubsection{Concepts in Trees}
+
+As pointed out earlier, \tikzname\ assumes that your mindmap is built using the
+|child| facilities of \tikzname. There are numerous options that influence how
+concepts are rendered at the different levels of a tree.
+
+\begin{stylekey}{/tikz/root concept}
+ This style is used for the roots of mindmap trees. By adding something to
+ this, you can change how the root of a mindmap will be rendered.
+ %
+\begin{codeexample}[]
+\tikz
+ [root concept/.append style={concept color=blue!80,minimum size=3.5cm},
+ mindmap]
+ \node [concept] {Root concept};
+\end{codeexample}
+
+ Note that styles like |large mindmap| redefine these styles, so you should
+ add something to this style only inside the picture.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/level 1 concept}
+ The |mindmap| style adds this style to the |level 1| style. This means that
+ the first level children of a mindmap tree will use this style.
+ %
+\begin{codeexample}[]
+\tikz
+ [root concept/.append style={concept color=blue!80},
+ level 1 concept/.append style={concept color=red!50},
+ mindmap]
+ \node [concept] {Root concept}
+ child[grow=30] {node[concept] {child}}
+ child[grow=0 ] {node[concept] {child}};
+\end{codeexample}
+\end{stylekey}
+
+\begin{stylekey}{/tikz/level 2 concept}
+ Works like |level 1 concept|, only for second level children.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/level 3 concept}
+ Works like |level 1 concept|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/level 4 concept}
+ Works like |level 1 concept|. Note that there are no fifth and higher level
+ styles, you need to modify |level 5| directly in such cases.
+\end{stylekey}
+
+\begin{key}{/tikz/concept color=\meta{color}}
+ We saw already that this option is used to change the color of concepts. We
+ now have a look at its effect when used on child nodes of a concept.
+ Normally, this option simply changes the color of the children. However,
+ when the option is given as an option to the |child| operation (and not to
+ the |node| operation and also not as an option to all children via the
+ |level 1| style), \tikzname\ will smoothly change the concept color from
+ the parent's color to the color of the child concept.
+
+ Here is an example:
+ %
+\begin{codeexample}[]
+\tikz[mindmap,concept color=blue!80]
+ \node [concept] {Root concept}
+ child[concept color=red,grow=30] {node[concept] {Child concept}}
+ child[concept color=orange,grow=0] {node[concept] {Child concept}};
+\end{codeexample}
+
+ In order to have a concept color which changes with the hierarchy level, a
+ tiny bit of magic is needed:
+% FIXME: is this a bug in the software!? The root concept is black!?
+\begin{codeexample}[]
+\tikz[mindmap,text=white,
+ root concept/.style={concept color=blue},
+ level 1 concept/.append style=
+ {every child/.style={concept color=blue!50}}]
+ \node [concept] {Root concept}
+ child[grow=30] {node[concept] {child}}
+ child[grow=0 ] {node[concept] {child}};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Connecting Concepts}
+
+\subsubsection{Simple Connections}
+
+The easiest way to connect two concepts is to draw a line between them. In
+order to give such lines a consistent appearance, it is recommendable to use
+the following style when drawing such lines:
+
+\begin{stylekey}{/tikz/concept connection}
+ This style can be used for lines between two concepts. Feel free to
+ redefine this style.
+\end{stylekey}
+
+A problem arises when you need to connect concepts after the main mindmap has
+been drawn. In this case you will want the connection lines to lie
+\emph{behind} the main mindmap. However, you can draw the lines only after the
+coordinates of the concepts have been determined. In this case you should place
+the connecting lines on a background layer as in the following example:
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [root concept/.append style={concept color=blue!20,minimum size=2cm},
+ level 1 concept/.append style={sibling angle=45},
+ mindmap]
+ \node [concept] {Root concept}
+ [clockwise from=45]
+ child { node[concept] (c1) {child}}
+ child { node[concept] (c2) {child}}
+ child { node[concept] (c3) {child}};
+ \begin{pgfonlayer}{background}
+ \draw [concept connection] (c1) edge (c2)
+ edge (c3)
+ (c2) edge (c3);
+ \end{pgfonlayer}
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Circle Connection Bar Decoration}
+
+Instead of a simple line between two concepts, you can also add a bar between
+the two nodes that has slightly organic ends. These bars are also used by
+default as the edges from parents in the mindmap tree.
+
+For the drawing of the bars a special decoration is used, which is defined in
+the mindmap library:
+
+\begin{decoration}{circle connection bar}
+ This decoration can be used to connect two circles. The start of the
+ to-be-decorated path should lie on the border of the first circle, the end
+ should lie on the border of the second circle. The following two decoration
+ keys should be initialized with the sizes of the circles:
+ %
+ \begin{itemize}
+ \item |start radius|
+ \item |end radius|
+ \end{itemize}
+ %
+ Furthermore, the following two decoration keys influence the decoration:
+ %
+ \begin{itemize}
+ \item |amplitude|
+ \item |angle|
+ \end{itemize}
+ %
+ The decoration turns a straight line into a path that starts on the border
+ of the first circle at the specified angle relative to the line connecting
+ the centers of the circles. The path then changes into a rectangle whose
+ thickness is given by the amplitude. Finally, the path ends with the same
+ angles on the second circle.
+
+ Here is an example that should make this clearer:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [decoration={start radius=1cm,end radius=.5cm,amplitude=2mm,angle=30}]
+ \fill[blue!20] (0,0) circle (1cm);
+ \fill[red!20] (2.5,0) circle (.5cm);
+
+ \filldraw [draw=red,fill=black,
+ decorate,decoration=circle connection bar] (1,0) -- (2,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ As can be seen, the decorated path consists of three parts and is not
+ really useful for drawing. However, if you fill the decorated path only,
+ and if you use the same color as for the circles, the result is better.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [blue!50,decoration={start radius=1cm,
+ end radius=.5cm,amplitude=2mm,angle=30}]
+ \fill (0,0) circle (1cm);
+ \fill (2.5,0) circle (.5cm);
+
+ \fill [decorate,decoration=circle connection bar] (1,0) -- (2,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the above example you may notice the small white line between the
+ circles and the decorated path. This is due to rounding errors.
+ Unfortunately, for larger distances, the errors can accumulate quite
+ strongly, especially since \tikzname\ and \TeX\ are not very good at
+ computing square roots. For this reason, it is a good idea to make the
+ circles slightly larger to cover up such problems. When using nodes of
+ shape |circle|, you can just add the |draw| option with a |line width| of
+ one or two points (for very large distances you may need line width up to
+ 4pt).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [blue!50,decoration={start radius=1cm,
+ end radius=.5cm,amplitude=2mm,angle=30}]
+ \fill (0,0) circle (1cm+1pt);
+ \fill (2.4,0) circle (.5cm+1pt);
+
+ \fill [decorate,decoration=circle connection bar] (1,0) -- (1.9,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ % FIXME: this paragraph appears to be deprecated:
+ %Note the slightly strange |outer sep=0pt|. This is needed so that
+ %the decorated path lies on the border of the filled circle, not on the
+ %border of the stroked circle (which is slightly larger and this
+ %slightly larger size is exactly what we wish to use to cover up the
+ %rounding errors).
+\end{decoration}
+
+
+\subsubsection{The Circle Connection Bar To-Path}
+
+The |circle connection bar| decoration is a bit complicated to use. Especially
+specifying the radii is quite bothersome (the amplitude and the angle can be
+set once and for all). For this reason, the mindmap library defines a special
+to-path that performs the necessary computations for you.
+
+\begin{stylekey}{/tikz/circle connection bar}
+ This style installs a rather involved to-path. Unlike normal to-paths, this
+ path requires that the start and the target of the to-path are named nodes
+ of shape |circle| -- if this is not the case, this path will produce
+ errors.
+
+ Assuming that the start and the target are circles, the to-path will first
+ compute the radii of these circles (by measuring the distance from the
+ |center| anchor to some anchor on the border) and will set the
+ |start circle| keys accordingly. Next, the |fill| option is set to the
+ |concept color| while |draw=none| is set. The decoration is set to
+ |circle connection bar|. Finally, the following style is included:
+ %
+ \begin{stylekey}{/tikz/every circle connection bar}
+ Redefine this style to change the appearance of circle connection bar
+ to-paths.
+ \end{stylekey}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[concept color=blue!50,blue!50,outer sep=0pt]
+ \node (n1) at (0,0) [circle,minimum size=2cm,fill,draw,thick] {};
+ \node (n2) at (2.5,0) [circle,minimum size=1cm,fill,draw,thick] {};
+
+ \path (n1) to[circle connection bar] (n2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Note that it is not a good idea to have more than one |to| operation
+ together with the option |circle connection bar| in a single |\path|. Use
+ the |edge| operation, instead, for creating multiple connections and this
+ operation creates a new scope for each edge.
+\end{stylekey}
+
+In a mindmap we sometimes want colors to change from one concept color to
+another. Then, the connection bar should, ideally, consist of a smooth
+transition between these two colors. Getting this right using shadings is a bit
+tricky if you try this ``by hand'', so the mindmap library provides a special
+option for facilitating this procedure.
+
+\begin{key}{/tikz/circle connection bar switch color=|from (|\meta{first color}|) to (|\meta{second color}|)|}
+ This style works similarly to the |circle connection bar|. The only
+ difference is that instead of filling the path with a single color a
+ shading is used.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[outer sep=0pt]
+ \node (n1) at (0,0) [circle,minimum size=2cm,fill,draw,thick,red] {};
+ \node (n2) at (30:2.5) [circle,minimum size=1cm,fill,draw,thick,blue] {};
+
+ \path (n1) to[circle connection bar switch color=from (red) to (blue)] (n2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Tree Edges}
+
+Most of the time, concepts in a mindmap are connected automatically when the
+mindmap is built as a tree. The reason is that the |mindmap| installs a
+|circle connection bar| path as the |edge from parent path|. Also, the
+|mindmap| option takes care of things like setting the correct |draw| and
+|outer sep| settings and some other stuff.
+
+In detail, the |mindmap| option sets the |edge from parent path| to a path that
+uses the to-path |circle connection bar| to connect the parent node and the
+child node. The |concept color| option (locally) changes this by using
+|circle connection bar switch color| instead with the from-color set to the old
+(parent's) concept color and the to-color set to the new (child's) concept
+color. This means that when you provide the |concept color| option to a |child|
+command, the color will change from the parent's concept color to the specified
+color.
+
+Here is an example of a tree built in this way:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path[mindmap,concept color=black,text=white]
+ node[concept] {Computer Science}
+ [clockwise from=0]
+ % note that `sibling angle' can only be defined in
+ % `level 1 concept/.append style={}'
+ child[concept color=green!50!black] {
+ node[concept] {practical}
+ [clockwise from=90]
+ child { node[concept] {algorithms} }
+ child { node[concept] {data structures} }
+ child { node[concept] {pro\-gramming languages} }
+ child { node[concept] {software engineer\-ing} }
+ }
+ child[concept color=blue] {
+ node[concept] {applied}
+ [clockwise from=-30]
+ child { node[concept] {databases} }
+ child { node[concept] {WWW} }
+ }
+ child[concept color=red] { node[concept] {technical} }
+ child[concept color=orange] { node[concept] {theoretical} };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Adding Annotations}
+
+An \emph{annotation} is some text outside a mindmap that, unlike an extra
+concept, simply explains something in the mindmap. The following style is
+mainly intended to help readers of the code see that a node in an annotation
+node.
+
+\begin{stylekey}{/tikz/annotation}
+ This style indicates that a node is an annotation node. It includes the
+ style |every annotation|, which allows you to change this style in a
+ convenient fashion.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [mindmap,concept color=blue!80,
+ every annotation/.style={fill=red!20}]
+ \node [concept] (root) {Root concept};
+
+ \node [annotation,right] at (root.east)
+ {The root concept is, in general, the most important concept.};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \begin{stylekey}{/tikz/every annotation}
+ This style is included by |annotation|.
+ \end{stylekey}
+\end{stylekey}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-patterns.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-patterns.tex
new file mode 100644
index 0000000000..d714b8fa86
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-patterns.tex
@@ -0,0 +1,354 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Pattern Library}
+\label{section-library-patterns}
+
+\begin{pgflibrary}{patterns}
+ The package defines patterns for filling areas.
+\end{pgflibrary}
+
+
+\newcommand\patternindex[1]{%
+ \index{#1@\protect\texttt{#1} pattern}%
+ \index{Patterns!#1@\protect\texttt{#1}}%
+ \texttt{#1}&
+ \begin{tikzpicture}[baseline=.5ex]
+
+ % Background
+ \pattern [path fading=west,pattern=checkerboard light gray]
+ (0,0) rectangle (5cm,2em);
+
+ \pattern [pattern=#1,pattern color=black] (0,0) rectangle +(1.5cm,2em);
+ \pattern [pattern=#1,pattern color=blue] (1.75,0) rectangle +(1.5cm,2em);
+ \pattern [pattern=#1,pattern color=red] (3.5,0) rectangle +(1.5cm,2em);
+ \end{tikzpicture} \\[1ex]
+}
+
+\newcommand\patternindexinherentlycolored[1]{%
+ \index{#1@\protect\texttt{#1} pattern}%
+ \index{Patterns!#1@\protect\texttt{#1}}%
+ \texttt{#1}&
+ \begin{tikzpicture}[baseline=.5ex]
+
+ % Background
+ \pattern [path fading=west,pattern=checkerboard light gray]
+ (0,0) rectangle (5cm,2em);
+
+ \pattern [pattern=#1,pattern color=blue] (0,0) rectangle +(5cm,2em);
+ \end{tikzpicture} \\[1ex]
+}
+
+
+\subsection{Form-Only Patterns}
+
+\begin{tabular}{ll}
+ \emph{Pattern name}
+ & \emph{Example (pattern in black, blue, and red on faded checkerboard)} \\
+ \patternindex{horizontal lines}
+ \patternindex{vertical lines}
+ \patternindex{north east lines}
+ \patternindex{north west lines}
+ \patternindex{grid}
+ \patternindex{crosshatch}
+ \patternindex{dots}
+ \patternindex{crosshatch dots}
+ \patternindex{fivepointed stars}
+ \patternindex{sixpointed stars}
+ \patternindex{bricks}
+ \patternindex{checkerboard}
+\end{tabular}
+
+
+\subsection{Inherently Colored Patterns}
+
+\begin{tabular}{ll}
+ \emph{Pattern name} & \emph{Example} \\
+ \patternindexinherentlycolored{checkerboard light gray}
+ \patternindexinherentlycolored{horizontal lines light gray}
+ \patternindexinherentlycolored{horizontal lines gray}
+ \patternindexinherentlycolored{horizontal lines dark gray}
+ \patternindexinherentlycolored{horizontal lines light blue}
+ \patternindexinherentlycolored{horizontal lines dark blue}
+ \patternindexinherentlycolored{crosshatch dots gray}
+ \patternindexinherentlycolored{crosshatch dots light steel blue}
+\end{tabular}
+
+\subsection{User-Defined Patterns}
+\label{section-library-patterns-meta}
+
+\noindent\emph{by Mark Wibrow}
+
+\begin{pgflibrary}{patterns.meta}
+ Define your own patterns with a syntax similar to |arrows.meta|.
+\end{pgflibrary}
+
+\emph{Caveat:} This library is currently experimental and might change without
+notice. There are some known shortcomings that will hopefully be fixed in the
+future.
+
+\begin{command}{\pgfdeclarepattern\marg{config}}
+ This command is used to declare a new pattern. In contrast to the normal
+ patterns and in the spirit of |arrows.meta| this command takes a list of
+ keys and values to define the pattern. The following keys are available:
+ %
+\begin{key}{/pgf/patterns/name=\meta{name}}
+ The name of the pattern by which it can be used later on.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/type=\meta{type} (default uncolored)}
+ The type of the pattern maps to what was called ``form only'' and ``inherently colored'' in the language of the normal patterns.
+ The available choices are:
+ \begin{itemize}
+ \item |uncolored| the pattern will obey the surrounding color.
+ \item |colored| the pattern will have an intrinsic color.
+ \item |form only| synonym for |uncolored|
+ \item |inherently colored| synonym for |colored|
+ \end{itemize}
+\end{key}
+ %
+\begin{key}{/pgf/patterns/x=\meta{dimension} (default 1cm)}
+ Unit vector of the coordinate system in the $x$-direction.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/y=\meta{dimension} (default 1cm)}
+ Unit vector of the coordinate system in the $y$-direction.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/parameters=\meta{comma separated list} (default empty)}
+ A list of parameters that are passed to the pattern. This is usually a
+ list of TeX macros. It is very important that these macros are fully
+ expandable because the values they hold are being used for deduplication in
+ the PDF file.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/defaults=\meta{comma separated list} (default empty)}
+ This list holds default assignments to the parameters passed to the
+ pattern. The default keys can then be found under the |/pgf/pattern keys/|
+ prefix.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/bottom left=\meta{pgfpoint}}
+ Bottom left corner of the pattern's bounding box, e.g.\
+ |\pgfqpoint{-.1pt}{-.1pt}|.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/top right=\meta{pgfpoint}}
+ Top right corner of the pattern's bounding box, e.g.\
+ |\pgfqpoint{3.1pt}{3.1pt}|.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/tile size=\meta{pgfpoint}}
+ Width and height of a single of the pattern as a \pgfname\ point
+ specification, i.e. the $x$ coordinate is the width and the $y$ coordinate
+ is the height, e.g.\ |\pgfqpoint{3pt}{3pt}|.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/tile transformation=\meta{pgftransformation} (default empty)}
+ A \pgfname\ transformation, e.g.\ |\pgftransformrotate{30}|.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/code=\meta{code}}
+ The code should be \pgfname\ code than can be protocolled. It should not
+ contain any color code or nodes.
+\end{key}
+ %
+\begin{key}{/pgf/patterns/set up code=\meta{code} (default empty)}
+ This code can be set if parameters have to be preprocessed before the
+ actual pattern code can be run.
+\end{key}
+ %
+\end{command}
+
+\begin{codeexample}[preamble={\usetikzlibrary{patterns.meta}}]
+\pgfdeclarepattern{
+ name=hatch,
+ parameters={\hatchsize,\hatchangle,\hatchlinewidth},
+ bottom left={\pgfpoint{-.1pt}{-.1pt}},
+ top right={\pgfpoint{\hatchsize+.1pt}{\hatchsize+.1pt}},
+ tile size={\pgfpoint{\hatchsize}{\hatchsize}},
+ tile transformation={\pgftransformrotate{\hatchangle}},
+ code={
+ \pgfsetlinewidth{\hatchlinewidth}
+ \pgfpathmoveto{\pgfpoint{-.1pt}{-.1pt}}
+ \pgfpathlineto{\pgfpoint{\hatchsize+.1pt}{\hatchsize+.1pt}}
+ \pgfpathmoveto{\pgfpoint{-.1pt}{\hatchsize+.1pt}}
+ \pgfpathlineto{\pgfpoint{\hatchsize+.1pt}{-.1pt}}
+ \pgfusepath{stroke}
+ }
+}
+
+\tikzset{
+ hatch size/.store in=\hatchsize,
+ hatch angle/.store in=\hatchangle,
+ hatch line width/.store in=\hatchlinewidth,
+ hatch size=5pt,
+ hatch angle=0pt,
+ hatch line width=.5pt,
+}
+
+\begin{tikzpicture}
+\foreach \r in {1,...,4}
+ \draw [pattern=hatch, pattern color=red]
+ (\r*3,0) rectangle ++(2,2);
+
+\foreach \r in {1,...,4}
+ \draw [pattern=hatch, pattern color=green, hatch size=2pt]
+ (\r*3,3) rectangle ++(2,2);
+
+\foreach \r in {1,...,4}
+ \draw [pattern=hatch, pattern color=blue, hatch size=10pt, hatch angle=21]
+ (\r*3,6) rectangle ++(2,2);
+
+\foreach \r in {1,...,4}
+ \draw [pattern=hatch, pattern color=orange, hatch line width=2pt]
+ (\r*3,9) rectangle ++(2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{command}{\tikzdeclarepattern\marg{config}}
+ A pattern declared with |\pgfdeclarepattern| can only execute \pgfname\
+ code. This command extends the functionality to also allow \tikzname\
+ code. All the same keys of |\pgfdeclarepattern| are valid, but some of
+ them have been overloaded to give a more natural \tikzname\ syntax.
+ %
+\begin{key}{/tikz/patterns/bottom left=\meta{point}}
+ Instead of a \pgfname\ name point, this key takes a \tikzname\ point, e.g.\
+ |(-.1,-.1)|.
+\end{key}
+ %
+\begin{key}{/tikz/patterns/top right=\meta{point}}
+ Instead of a \pgfname\ name point, this key takes a \tikzname\ point, e.g.\
+ |(3.1,3.1)|.
+\end{key}
+ %
+\begin{key}{/tikz/patterns/tile size=\meta{point}}
+ Instead of a \pgfname\ name point, this key takes a \tikzname\ point, e.g.\
+ |(3,3)|.
+\end{key}
+ %
+\begin{key}{/tikz/patterns/tile transformation=\meta{transformation}}
+ Instead of a \pgfname\ transformation, this key takes a list of keys and
+ value and extracts the resulting transformation from them, e.g.\
+ |rotate=30|.
+\end{key}
+
+ In addition to the overloaded keys, some new keys have been added.
+ %
+\begin{key}{/tikz/patterns/bounding box=\meta{point} and \meta{point}}
+ This is a shorthand to set the bounding box. It will assign the first
+ point to |bottom left| and the second point to |top right|.
+\end{key}
+ %
+\begin{key}{/tikz/patterns/infer tile bounding box=\meta{dimension} (default 0pt)}
+ Instead of specifying the bounding box by hand, you can ask \tikzname\ to
+ infer the size of the bounding box for you. The \meta{dimension} parameter
+ is padding that is added around the bounding box.
+\end{key}
+ %
+\end{command}
+
+\begin{codeexample}[preamble={\usetikzlibrary{patterns.meta}}]
+\tikzdeclarepattern{
+ name=flower,
+ type=colored,
+ bottom left={(-.1pt,-.1pt)},
+ top right={(10.1pt,10.1pt)},
+ tile size={(10pt,10pt)},
+ code={
+ \tikzset{x=1pt,y=1pt}
+ \path [draw=green] (5,2.5) -- (5, 7.5);
+ \foreach \i in {0,60,...,300}
+ \path [fill=pink, shift={(5,7.5)}, rotate=-\i]
+ (0,0) .. controls ++(120:4) and ++(60:4) .. (0,0);
+ \path [fill=red] (5,7.5) circle [radius=1];
+ \foreach \i in {-45,45}
+ \path [fill=green, shift={(5,2.5)}, rotate=-\i]
+ (0,0) .. controls ++(120:4) and ++(60:4) .. (0,0);
+ }
+}
+
+\tikz\draw [pattern=flower] circle [radius=1];
+\end{codeexample}
+
+\begin{codeexample}[preamble={\usetikzlibrary{patterns.meta}}]
+\tikzdeclarepattern{
+ name=Stars,
+ type=uncolored,
+ bounding box={(-5pt,-5pt) and (5pt,5pt)},
+ tile size={(\tikztilesize,\tikztilesize)},
+ parameters={\tikzstarpoints,\tikzstarradius,\tikzstarrotate,\tikztilesize},
+ tile transformation={rotate=\tikzstarrotate},
+ defaults={
+ points/.store in=\tikzstarpoints,points=5,
+ radius/.store in=\tikzstarradius,radius=3pt,
+ rotate/.store in=\tikzstarrotate,rotate=0,
+ tile size/.store in=\tikztilesize,tile size=10pt,
+ },
+ code={
+ \pgfmathparse{180/\tikzstarpoints}\let\a=\pgfmathresult
+ \fill (90:\tikzstarradius) \foreach \i in {1,...,\tikzstarpoints}{
+ -- (90+2*\i*\a-\a:\tikzstarradius/2) -- (90+2*\i*\a:\tikzstarradius)
+ } -- cycle;
+ }
+}
+
+\begin{tikzpicture}
+ \draw[pattern=Stars,pattern color=blue] (0,0) rectangle ++(2,2);
+ \draw[pattern={Stars[points=7,tile size=15pt]}] (2,0) rectangle ++(2,2);
+ \draw[pattern={Stars[rotate=45]},pattern color=red] (0,2) rectangle ++(2,2);
+ \draw[pattern={Stars[rotate=30,points=4,radius=5pt]}] (2,2) rectangle ++(2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+Instead of macros you can also use \pgfname\ keys as parameters, if that is
+what you prefer.
+\begin{codeexample}[preamble={\usetikzlibrary{patterns.meta}}]
+\tikzdeclarepattern{
+ name=lines,
+ parameters={
+ \pgfkeysvalueof{/pgf/pattern keys/size},
+ \pgfkeysvalueof{/pgf/pattern keys/angle},
+ \pgfkeysvalueof{/pgf/pattern keys/line width},
+ },
+ bounding box={(-.1pt,-.1pt) and
+ (\pgfkeysvalueof{/pgf/pattern keys/size}+.1pt,
+ \pgfkeysvalueof{/pgf/pattern keys/size}+.1pt)},
+ tile size={(\pgfkeysvalueof{/pgf/pattern keys/size},
+ \pgfkeysvalueof{/pgf/pattern keys/size})},
+ tile transformation={rotate=\pgfkeysvalueof{/pgf/pattern keys/angle}},
+ defaults={
+ size/.initial=5pt,
+ angle/.initial=0,
+ line width/.initial=.4pt,
+ },
+ code={
+ \draw[line width=\pgfkeysvalueof{/pgf/pattern keys/line width}]
+ (0,0) -- (\pgfkeysvalueof{/pgf/pattern keys/size},
+ \pgfkeysvalueof{/pgf/pattern keys/size});
+ }
+}
+
+\begin{tikzpicture}
+ \draw[pattern={lines[size=10pt,line width=.8pt,angle=10]},
+ pattern color=red] (0,0) rectangle ++(2,2);
+ \draw[pattern={lines[size= 5pt,line width=.8pt,angle=40]},
+ pattern color=blue] (2,0) rectangle ++(2,2);
+ \draw[pattern={lines[size=10pt,line width=.4pt,angle=90]},
+ pattern color=green] (0,2) rectangle ++(2,2);
+ \draw[pattern={lines[size= 2pt,line width= 1pt,angle=70]},
+ pattern color=orange] (2,2) rectangle ++(2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-perspective.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-perspective.tex
new file mode 100644
index 0000000000..61ed10179e
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-perspective.tex
@@ -0,0 +1,418 @@
+\section{Three Point Perspective Drawing Library}
+
+\noindent\emph{by Max Snippe}
+
+\begin{tikzlibrary}{perspective}
+ This library provides tools for perspective drawing with one, two, or three
+ vanishing points.
+\end{tikzlibrary}
+
+\subsection{Coordinate Systems}
+
+\begin{coordinatesystem}{three point perspective}
+ The |three point perspective| coordinate system is very similar to the |xyz|
+ coordinate system, save that it will display the provided coordinates with a
+ perspective projection.
+ %
+ \begin{key}{/tikz/cs/x=\meta{number} (initially 0)}
+ The $x$ component of the coordinate. Should be given \emph{without} unit.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/y=\meta{number} (initially 0)}
+ Same as |x|.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/z=\meta{number} (initially 0)}
+ Same as |x|.
+ \end{key}
+\end{coordinatesystem}
+
+\begin{coordinatesystem}{tpp}
+ The |tpp| coordinate system is an alias for the |three point perspective|
+ coordinate system.
+\end{coordinatesystem}
+
+\subsection{Setting the view}
+
+\begin{key}{/tikz/3d view=\marg{azimuth}\marg{elevation}
+ (default \{-30\}\{15\})}
+ With the |3d view| option, the projection of the 3D coordinates on the 2D page
+ is defined. It is determined by rotating the coordinate system by
+ $-\meta{azimuth}$ around the $z$-axis, and by \meta{elevation} around the
+ (new) $x$-axis, as shown below.
+
+ \begin{tikzpicture}[
+ viewpoint/.pic={
+ \draw (22.5:0.45) -- (0,0) -- (-22.5:0.45);
+ \draw (0,0) ++ (22.5:0.35) arc (22.5:-22.5:0.35);
+ \draw (0.225,0) circle (0.02 and 0.09);
+ }]
+ \begin{scope}[3d view={-20}{20}]
+ \draw[->] (-3,0,0) -- (3,0,0) node[pos=1.05]{x};
+ \draw[->] (0,-3,0) -- (0,3,0) node[pos=1.05]{y};
+ \draw[->] (0,0,-1) -- (0,0,3) node[pos=1.05]{z};
+
+ \pgfmathsetmacro\az{50}
+ \begin{scope}[canvas is xy plane at z=0]
+ \draw[->] (0,0) ++(0,-2) arc (-90:-90+\az:2) coordinate[pos=0.5](az);
+ \draw (az) -- ++(-90+\az/2:1) node[below]{\meta{azimuth}};
+ \draw[dashed] (0,0) -- ++(-90+\az:3);
+ \end{scope}
+ \begin{scope}[rotate around z=\az]
+ \pgfmathsetmacro\el{50}
+ \begin{scope}[canvas is yz plane at x=0]
+ \draw[->] (0,0) ++(-2.5,0) arc (180:180-\el:2.5)
+ coordinate[pos=0.5](el);
+ \draw (el) -- ++(180-\el/2:1) node[above]{\meta{elevation}};
+ \draw[dashed] (0,0) --
+ pic[solid,sloped,transform shape,pos=1.2]{viewpoint} ++(180-\el:3);
+ \end{scope}
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}
+
+ For example, when both \meta{azimuth} and \meta{elevation} are 0$^\circ$,
+ $+z$ will be pointing upward, and $+x$ will be pointing right. The default is
+ as shown below.
+\begin{codeexample}[]
+\begin{tikzpicture}[3d view]
+ \draw[->] (-1,0,0) -- (1,0,0) node[pos=1.1]{x};
+ \draw[->] (0,-1,0) -- (0,1,0) node[pos=1.1]{y};
+ \draw[->] (0,0,-1) -- (0,0,1) node[pos=1.1]{z};
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+
+\begin{stylekey}{/tikz/isometric view}
+ A special kind of |3d view| is isometric, which can be set with the
+ |isometric view| style. It simply sets |3d view={-45}{35.26}|. The value for
+ \meta{elevation} is determined with $\arctan(1/\sqrt{2})$. In isometric
+ projection the angle between any pair of axes is 120$^\circ$, as shown below.
+\begin{codeexample}[]
+\begin{tikzpicture}[isometric view]
+ \draw[->] (-1,0,0) -- (1,0,0) node[pos=1.1]{x};
+ \draw[->] (0,-1,0) -- (0,1,0) node[pos=1.1]{y};
+ \draw[->] (0,0,-1) -- (0,0,1) node[pos=1.1]{z};
+\end{tikzpicture}
+\end{codeexample}
+\end{stylekey}
+
+\subsection{Defining the perspective}
+
+\newcommand\simplecuboid[3]{%
+ \fill[gray!80!white] (tpp cs:x=0,y=0,z=#3)
+ -- (tpp cs:x=0,y=#2,z=#3)
+ -- (tpp cs:x=#1,y=#2,z=#3)
+ -- (tpp cs:x=#1,y=0,z=#3) -- cycle;
+ \fill[gray] (tpp cs:x=0,y=0,z=0)
+ -- (tpp cs:x=0,y=0,z=#3)
+ -- (tpp cs:x=0,y=#2,z=#3)
+ -- (tpp cs:x=0,y=#2,z=0) -- cycle;
+ \fill[gray!50!white] (tpp cs:x=0,y=0,z=0)
+ -- (tpp cs:x=0,y=0,z=#3)
+ -- (tpp cs:x=#1,y=0,z=#3)
+ -- (tpp cs:x=#1,y=0,z=0) -- cycle;}
+
+\newcommand{\simpleaxes}[3]{%
+ \draw[->] (-0.5,0,0) -- (#1,0,0) node[pos=1.1]{x};
+ \draw[->] (0,-0.5,0) -- (0,#2,0) node[pos=1.1]{y};
+ \draw[->] (0,0,-0.5) -- (0,0,#3) node[pos=1.1]{z};}
+
+In this section, the following example cuboid will be used with various scaling.
+As a reference, the axes will be shown too, without perspective projection.
+\begingroup
+\let\simplecuboid\relax
+\let\simpleaxes\relax
+\begin{codeexample}[]
+\newcommand\simplecuboid[3]{%
+ \fill[gray!80!white] (tpp cs:x=0,y=0,z=#3)
+ -- (tpp cs:x=0,y=#2,z=#3)
+ -- (tpp cs:x=#1,y=#2,z=#3)
+ -- (tpp cs:x=#1,y=0,z=#3) -- cycle;
+ \fill[gray] (tpp cs:x=0,y=0,z=0)
+ -- (tpp cs:x=0,y=0,z=#3)
+ -- (tpp cs:x=0,y=#2,z=#3)
+ -- (tpp cs:x=0,y=#2,z=0) -- cycle;
+ \fill[gray!50!white] (tpp cs:x=0,y=0,z=0)
+ -- (tpp cs:x=0,y=0,z=#3)
+ -- (tpp cs:x=#1,y=0,z=#3)
+ -- (tpp cs:x=#1,y=0,z=0) -- cycle;}
+\newcommand{\simpleaxes}[3]{%
+ \draw[->] (-0.5,0,0) -- (#1,0,0) node[pos=1.1]{x};
+ \draw[->] (0,-0.5,0) -- (0,#2,0) node[pos=1.1]{y};
+ \draw[->] (0,0,-0.5) -- (0,0,#3) node[pos=1.1]{z};}
+
+\begin{tikzpicture}[3d view]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+\endgroup
+
+\begin{key}{/tikz/perspective=\meta{vanishing points}
+ (default p=\{(10,0,0)\},q=\{(0,10,0)\},r=\{(0,0,20)\})}
+ The `strength' of the perspective can be determined by setting the location of
+ the vanishing points. The default values have a stronger perspective towards
+ $x$ and $y$ than towards $z$, as shown below.
+\begin{codeexample}[]
+\begin{tikzpicture}[3d view,perspective]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+ From this example it also shows that the maximum dimensions of the cuboid are
+ no longer 2 by 2 by 2. This is inherent to the perspective projection.
+ %
+ \begin{key}{/tikz/perspective/p=\marg{x,y,z} (initially (0,0,0))}
+ The location of the vanishing point that determines the `strength' of the
+ perspective in $x$-direction can be set with the |p| key.
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ p = {(5,0,0)}}]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+ Note also that when only |p| is provided, the perspective in $y$ and $z$
+ direction is turned off.
+
+ To turn of the perspective in $x$-direction, one must set the $x$ component
+ of |p| to \texttt{0} (e.g. |p={(0,a,b)}|, where \texttt{a} and \texttt{b}
+ can be any number and will be ignored). Or one can provide |q| and |r| and
+ omit |p|.
+
+ By changing the $y$ and $z$ components of |p|, one can achieve various
+ effects.
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ p = {(5,0,1)}}]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ p = {(5,1,0)}}]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ p = {(5,1,1)}}]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/perspective/q=\marg{x,y,z} (initially (0,0,0))}
+ Similar to |p|, but can be turned off by setting its $y$ component to
+ \texttt{0}.
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ q = {(0,5,0)}}]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/perspective/r=\marg{x,y,z} (initially (0,0,0))}
+ Similar to |p|, but can be turned off by setting its $z$ component to
+ \texttt{0}.
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ r = {(0,0,5)}}]
+ \simplecuboid{2}{2}{2}
+ \simpleaxes{2}{2}{2}
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+\subsection{Shortcomings}
+ Currently a number of things are not working, mostly due to the fact that PGF
+ uses a 2D coordinate system underwater, and perspective projection is a
+ non-linear affine transformation which needs to be aware of all three
+ coordinates. These three coordinates are currently lost when processing a 3D
+ coordinate.
+ The issues include, but possibly are not limited to:
+ \begin{itemize}
+ \item Keys like |shift|, |xshift|, |yshift| are not working
+ \item Keys like |rotate around x|, |rotate around y|, and |rotate around z|
+ are not working
+ \item Units are not working
+ \item Most keys from the |3d| library are unsupported, e.g. all the
+ |canvas is .. plane| keys.
+ \end{itemize}
+
+\subsection{Examples}
+An |r| that lies `below' your drawing can mimic a macro effect.
+\nopagebreak
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ isometric view,
+ perspective={
+ p = {(8,0,0)},
+ q = {(0,8,0)},
+ r = {(0,0,-8)}}]
+
+ \simplecuboid{2}{2}{2}]
+
+\end{tikzpicture}
+\end{codeexample}
+
+A peculiar phenomenon inherent to perspective drawing, is that however great
+your coordinate will become in the direction of the vanishing point, it will
+never reach it.
+\nopagebreak
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ isometric view,
+ perspective={
+ p = {(4,0,0)},
+ q = {(0,4,0)}}]
+
+ \node[fill=red,circle,inner sep=1.5pt,label=above:p] at (4,0,0){};
+
+ \foreach \i in {0,...,100}{
+ \filldraw[fill = gray] (tpp cs:x=\i,y=0,z=0)
+ -- (tpp cs:x=\i+0.5,y=0,z=0)
+ -- (tpp cs:x=\i+0.5,y=2,z=0)
+ -- (tpp cs:x=\i,y=2,z=0)
+ -- cycle;}
+\end{tikzpicture}
+\end{codeexample}
+
+Even for simple examples, the added perspective might add another `dimension' to
+your drawing. In this case, two vanishing points give a more intuitive result
+then three would.
+\nopagebreak
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ scale=0.7,
+ 3d view,
+ perspective={
+ p = {(20,0,0)},
+ q = {(0,20,0)}}]
+
+ \filldraw[fill=brown] (tpp cs:x=0,y=0,z=0)
+ -- (tpp cs:x=0,y=4,z=0)
+ -- (tpp cs:x=0,y=4,z=2)
+ -- (tpp cs:x=0,y=2,z=4)
+ -- (tpp cs:x=0,y=0,z=2) -- cycle;
+ \filldraw[fill=red!70!black] (tpp cs:x=0,y=0,z=2)
+ -- (tpp cs:x=5,y=0,z=2)
+ -- (tpp cs:x=5,y=2,z=4)
+ -- (tpp cs:x=0,y=2,z=4) -- cycle;
+ \filldraw[fill=brown!80!white] (tpp cs:x=0,y=0,z=0)
+ -- (tpp cs:x=0,y=0,z=2)
+ -- (tpp cs:x=5,y=0,z=2)
+ -- (tpp cs:x=5,y=0,z=0) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+With the vanishing points nearby, the distortion of parallel lines becomes very
+strong. This might lead to \texttt{Dimension too large} errors.
+\nopagebreak
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ 3d view,
+ perspective={
+ p = {(2,0,0)},
+ q = {(0,2,0)},
+ r = {(0,0,2)}},
+ scale=4,
+ vanishing point/.style={fill,circle,inner sep=2pt}]
+
+ \simplecuboid{3}{1}{2}
+
+ \node[vanishing point,label = right:p] (p) at (2,0,0){};
+ \node[vanishing point,label = left:q] (q) at (0,2,0){};
+ \node[vanishing point,label = above:r] (r) at (0,0,2){};
+
+ \begin{scope}[dotted]
+ \foreach \y in {0,1}{
+ \foreach \z in {0,2}{
+ \draw (tpp cs:x=0,y=\y,z=\z) -- (p.center);}}
+ \foreach \x in {0,3}{
+ \foreach \z in {0,2}{
+ \draw (tpp cs:x=\x,y=0,z=\z) -- (q.center);}}
+ \foreach \x in {0,3}{
+ \foreach \y in {0,1}{
+ \draw (tpp cs:x=\x,y=\y,z=0) -- (r.center);}}
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+% A more complex example.
+\iffalse
+Of course these examples can become as complex as desired, but as with any 3D
+drawing using \tikzname, the order of drawing commands is important and can
+become increasingly more complex.
+\nopagebreak
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ cycle of vertices/.style 2 args={
+ insert path={
+ foreach \i [count=\j,evaluate=\j as \k using
+ {ifthenelse(\j==1,"","-- "}] in {#2}{\k (vert-#1-\i)} -- cycle}},
+ scale=0.7,
+ line join=round,
+ bottom/.style={draw=white!50!black,fill=white!40!black},
+ front/.style={draw=white!50!black,fill=black},
+ side/.style={draw=white!50!black,fill=white!80!black},
+]
+ \begin{scope}[
+ 3d view={-20}{0},
+ perspective={
+ p = {(20,0,0)},
+ q = {(0,20,0)},
+ r = {(5,1,50)},
+ }]
+ \path foreach \x/\y/\z [count=\i] in {
+ 3.5/2.0/0.0,3.5/2.0/4.0,6.0/2.0/4.0,6.5/2.0/3.5,6.5/2.0/0.5,6.0/2.0/0.0,
+ 4.5/2.0/1.0,4.5/2.0/3.0,5.5/2.0/3.0,5.5/2.0/1.0,3.5/0.0/0.0,3.5/0.0/4.0,
+ 6.0/0.0/4.0,6.5/0.0/3.5,6.5/0.0/0.5,6.0/0.0/0.0,4.5/0.0/1.0,4.5/0.0/3.0,
+ 5.5/0.0/3.0,5.5/0.0/1.0%
+ }{(tpp cs:x=\x,y=\y,z=\z) coordinate[name=vert-D-\i]};
+ \filldraw[front,cycle of vertices={D}{1,...,6},
+ cycle of vertices={D}{7,10,9,8}];
+ \filldraw[side,cycle of vertices={D}{10,9,19,20}];
+ \filldraw[bottom,cycle of vertices={D}{8,9,19,18}];
+ \filldraw[front,cycle of vertices={D}{11,...,16},
+ cycle of vertices={D}{17,20,19,18}];
+ \filldraw[side,cycle of vertices={D}{1,2,12,11}];
+ % '3'
+ \path foreach \x/\y/\z [count=\i] in {
+ 0.0/2.0/0.0,0.0/2.0/1.0,2.0/2.0/1.0,2.0/2.0/1.5,0.0/2.0/1.5,0.0/2.0/2.5,
+ 2.0/2.0/2.5,2.0/2.0/3.0,0.0/2.0/3.0,0.0/2.0/4.0,3.0/2.0/4.0,3.0/2.0/0.0,
+ 0.0/0.0/0.0,0.0/0.0/1.0,2.0/0.0/1.0,2.0/0.0/1.5,0.0/0.0/1.5,0.0/0.0/2.5,
+ 2.0/0.0/2.5,2.0/0.0/3.0,0.0/0.0/3.0,0.0/0.0/4.0,3.0/0.0/4.0,3.0/0.0/0.0%
+ }{(tpp cs:x=\x,y=\y,z=\z) coordinate[name=vert-3-\i]};
+ \filldraw[front,cycle of vertices={3}{1,...,12}];
+ \filldraw[side,cycle of vertices={3}{3,4,16,15}];
+ \filldraw[side,cycle of vertices={3}{7,8,20,19}];
+ \filldraw[side,cycle of vertices={3}{1,2,14,13}];
+ \filldraw[side,cycle of vertices={3}{5,6,18,17}];
+ \filldraw[side,cycle of vertices={3}{9,10,22,21}];
+ \filldraw[bottom,cycle of vertices={3}{4,5,17,16}];
+ \filldraw[bottom,cycle of vertices={3}{8,9,21,20}];
+ \filldraw[front,cycle of vertices={3}{13,...,24}];
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+\fi \ No newline at end of file
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-petri.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-petri.tex
new file mode 100644
index 0000000000..ccf0356091
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-petri.tex
@@ -0,0 +1,380 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Petri-Net Drawing Library}
+
+\begin{tikzlibrary}{petri}
+ This packages provides shapes and styles for drawing Petri nets.
+\end{tikzlibrary}
+
+
+\subsection{Places}
+
+The package defines a style for drawing places of Petri nets.
+
+\begin{stylekey}{/tikz/place}
+ This style indicates that a node is a place of a Petri net. Usually, the
+ text of the node should be empty since places do not contain any text. You
+ should use the |label| option to add text outside the node like its name or
+ its capacity. You should use the |tokens| options, explained in
+ Section~\ref{section-tokens}, to add tokens inside the place.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place,label=above:$p_1$,tokens=2] (p1) {};
+ \node[place,label=below:$p_2\ge1$,right=of p1] (p2) {};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every place}
+ This style is evoked by the style |place|. To change the appearance of
+ places, you can change this style.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every place/.style={draw=blue,fill=blue!20,thick,minimum size=9mm}]
+ \node[place,tokens=7,label=above:$p_1$] (p1) {};
+ \node[place,structured tokens={3,2,9},
+ label=below:$p_2\ge1$,right=of p1] (p2) {};
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{stylekey}
+
+
+\subsection{Transitions}
+
+Transitions are also nodes. They should be drawn using the following style:
+
+\begin{stylekey}{/tikz/transition}
+ This style indicates that a node is a transition. As for places, the text
+ of a transition should be empty and the |label| option should be used for
+ adding labels.
+
+ To connect a transition to places, you can use the |edge| command as in the
+ following example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place,tokens=2,label=above:$p_1$] (p1) {};
+ \node[place,label=above:$p_2\ge1$,right=of p1] (p2) {};
+
+ \node[transition,below right=of p1,label=below:$t_1$] {}
+ edge[pre] (p1)
+ edge[post] node[auto] {2} (p2);
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{stylekey}{/tikz/every transition}
+ This style is evoked by the style |transition|.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/pre}
+ This style can be used with paths leading \emph{from} a transition
+ \emph{to} a place to indicate that the place is in the pre-set of the
+ transition. By default, this style is |<-,shorten <=1pt|, but feel free
+ to redefine it.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/post}
+ This style is also used with paths leading \emph{from} a transition
+ \emph{to} a place, but this time the place is in the post-set of the
+ transition. Again, feel free to redefine it.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/pre and post}
+ This style is to be used to indicate that a place is both in the pre-
+ and post-set of a transition.
+ \end{stylekey}
+\end{stylekey}
+
+
+\subsection{Tokens}
+\label{section-tokens}
+
+Interestingly, the most complicated aspect of drawing Petri nets in \tikzname\
+turns out to be the placement of tokens.
+
+Let us start with a single token. They are also nodes and there is a simple
+style for typesetting them.
+
+\begin{stylekey}{/tikz/token}
+ This style indicates that a node is a token. By default, this causes the
+ node to be a small black circle. Unlike places and transitions, it
+ \emph{does} make sense to provide text for the token node. Such text will
+ be typeset in a tiny font and in white on black (naturally, you can easily
+ change this by setting the style |every token|).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place,label=above:$p_1$] (p1) {};
+ \node[token] at (p1) {};
+
+ \node[place,label=above:$p_2$,right=of p1] (p2) {};
+ \node[token] at (p2) {$y$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \begin{stylekey}{/tikz/every token}
+ Change this style to change the appearance of tokens.
+ \end{stylekey}
+\end{stylekey}
+
+In the above example, it is bothersome that we need an extra command for the
+token node. Worse, when we have \emph{two} tokens on a node, it is difficult to
+place both nodes inside the node without overlap.
+
+The Petri net library offers a solution to this problem: The
+|children are tokens| style.
+
+\begin{stylekey}{/tikz/children are tokens}
+ The idea behind this style is to use trees mechanism for placing tokens.
+ Every token lying on a place is treated as a child of the node. Normally
+ this would have the effect that the tokens are placed below the place and
+ they would be connected to the place by an edge. The |children are tokens|
+ style, however, redefines the growth function of trees such that it places
+ the children next to each other inside (or, rather, on top) of the place
+ node. Additionally, the edge from the parent node is not drawn.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place,label=above:$p_1$] {}
+ [children are tokens]
+ child {node [token] {1}}
+ child {node [token] {2}}
+ child {node [token] {3}};
+\end{tikzpicture}
+\end{codeexample}
+
+ In detail, what happens is the following: Tree growth functions tell
+ \tikzname\ where it should place the children of nodes. These functions get
+ passed the number of children that a node has an the number of the child
+ that should be placed. The special tree growth function for tokens has a
+ special mapping for each possible number of children up to nine children.
+ This mapping decides for each child where it should be placed on top of the
+ place. For example, a single child is placed directly on top of the place.
+ Two children are placed next to each other, separated by the
+ |token distance|. Three children are placed in a triangle whose side
+ lengths are |token distance|; and so on up to nine tokens. If you wish to
+ place more than nice tokens on a place, you will have to write your own
+ placement code.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place,label=above:$p_2$] {}
+ [children are tokens]
+ child {node [token] {1}}
+ child {node [token,fill=red] {2}}
+ child {node [token,fill=red] {2}}
+ child {node [token] {1}};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/token distance=\meta{distance}}
+ This specifies the distance between the centers of the tokens in the
+ arrangements of the option |children are tokens|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place,label=above:$p_3$] {}
+ [children are tokens,token distance=1.1ex]
+ child {node [token] {}}
+ child {node [token,red] {}}
+ child {node [token,blue] {}}
+ child {node [token] {}};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{stylekey}
+
+The |children are tokens| option gives you a lot of flexibility, but it is a
+bit cumbersome to use. For this reason there are some options that help in
+standard situations. They all use |children are tokens| internally, so any
+change to, say, the |every token| style will affect how these options depict
+tokens.
+
+\begin{key}{/tikz/tokens=\meta{number}}
+ This option is given to a |place| node, not to a |token| node. The effect
+ of this option is to add \meta{number} many child nodes to the place, each
+ having the style |token|. Thus, the following two pieces of codes have the
+ same effect:
+ %
+\begin{codeexample}[]
+\tikz
+ \node[place] {}
+ [children are tokens]
+ child {node [token] {}}
+ child {node [token] {}}
+ child {node [token] {}};
+\tikz
+ \node[place,tokens=3] {};
+\end{codeexample}
+ %
+ It is legal to say |tokens=0|, no tokens are drawn in this case. This
+ option does not handle ten or more tokens correctly. If you need this many
+ tokens, you will have to program your own code.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every place/.style={minimum size=9mm}]
+
+ \foreach \x/\y/\tokennumber in {0/2/1,1/2/2,2/2/3,
+ 0/1/4,1/1/5,2/1/6,
+ 0/0/7,1/0/8,2/0/9}
+ \node [place,tokens=\tokennumber] at (\x,\y) {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/colored tokens=\meta{color list}}
+ This option, which must also be given when a place node is being created,
+ gets a list of colors as parameter. It will then add as many tokens to the
+ place as there are colors in this list, each filled correspondingly.
+ %
+\begin{codeexample}[]
+\tikz \node[place,colored tokens={black,black,red,blue}] {};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/structured tokens=\meta{token texts}}
+ This option, which must again be passed to a place, gets a list of texts
+ for tokens. For each text, a new token will be added to the place.
+ %
+\begin{codeexample}[]
+\tikz \node[place,structured tokens={$x$,$y$,$z$}] {};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every place/.style={minimum size=9mm}]
+
+ \foreach \x/\y/\tokennumber in {0/2/1,1/2/2,2/2/3,
+ 0/1/4,1/1/5,2/1/6,
+ 0/0/7,1/0/8,2/0/9}
+ \node [place,structured tokens={1,...,\tokennumber}] at (\x,\y) {};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ If you use lots of structured tokens, consider redefining the |every token|
+ style so that the tokens are larger.
+\end{key}
+
+
+\subsection{Examples}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[yscale=-1.6,xscale=1.5,thick,
+ every transition/.style={draw=red,fill=red!20,minimum size=3mm},
+ every place/.style={draw=blue,fill=blue!20,minimum size=6mm}]
+
+ \foreach \i in {1,...,6} {
+ \node[place,label=left:$p_\i$] (p\i) at (0,\i) {};
+ \node[place,label=right:$q_\i$] (q\i) at (8,\i) {};
+ }
+ \foreach \name/\var/\vala/\valb/\height/\x in
+ {m1/m_1/f/t/2.25/3,m2/m_2/f/t/2.25/5,h/\mathit{hold}/1/2/4.5/4} {
+ \node[place,label=above:{$\var = \vala$}] (\name\vala) at (\x,\height) {};
+ \node[place,yshift=-8mm,label=below:{$\var = \valb$}] (\name\valb) at (\x,\height) {};
+ }
+ \node[token] at (p1) {}; \node[token] at (q1) {};
+ \node[token] at (m1f) {}; \node[token] at (m2f) {};
+ \node[token] at (h1) {};
+
+ \node[transition] at (1.5,1.5) {} edge [pre] (p1) edge [post] (p2);
+ \node[transition] at (1.5,2.5) {} edge [pre] (p2) edge[pre] (m1f)
+ edge [post](p3) edge[post] (m1t);
+ \node[transition] at (1.5,3.3) {} edge [pre] (p3) edge [post] (p4)
+ edge [pre and post] (h1);
+ \node[transition] at (1.5,3.7) {} edge [pre] (p3) edge [pre] (h2)
+ edge [post] (p4) edge [post] (h1.west);
+ \node[transition] at (1.5,4.3) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (m2f);
+ \node[transition] at (1.5,4.7) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (h2);
+ \node[transition] at (1.5,5.5) {} edge [pre] (p5) edge [pre] (m1t)
+ edge [post] (p6) edge [post] (m1f);
+ \node[transition] at (1.5,6.5) {} edge [pre] (p6) edge [post] (p1.south east);
+ \node[transition] at (6.5,1.5) {} edge [pre] (q1) edge [post] (q2);
+ \node[transition] at (6.5,2.5) {} edge [pre] (q2) edge [pre] (m2f)
+ edge [post] (q3) edge [post] (m2t);
+ \node[transition] at (6.5,3.3) {} edge [pre] (q3) edge [post] (q4)
+ edge [pre and post] (h2);
+ \node[transition] at (6.5,3.7) {} edge [pre] (q3) edge [pre] (h1)
+ edge [post] (q4) edge [post] (h2.east);
+ \node[transition] at (6.5,4.3) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (m1f);
+ \node[transition] at (6.5,4.7) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (h1);
+ \node[transition] at (6.5,5.5) {} edge [pre] (q5) edge [pre] (m2t)
+ edge [post] (q6) edge [post] (m2f);
+ \node[transition] at (6.5,6.5) {} edge [pre] (q6) edge [post] (q1.south west);
+\end{tikzpicture}
+\end{codeexample}
+
+Here is the same net once more, but with these styles changes:
+%
+\begin{codeexample}[code only]
+\begin{tikzpicture}[yscale=-1.1,thin,>=stealth,
+ every transition/.style={fill,minimum width=1mm,minimum height=3.5mm},
+ every place/.style={draw,thick,minimum size=6mm}]
+\end{codeexample}
+
+\begin{tikzpicture}[yscale=-1.1,thin,>=stealth,
+ every transition/.style={fill,minimum width=1mm,minimum height=3.5mm},
+ every place/.style={draw,thick,minimum size=6mm}]
+
+ \foreach \i in {1,...,6} {
+ \node[place,label=left:$p_\i$] (p\i) at (0,\i) {};
+ \node[place,label=right:$q_\i$] (q\i) at (8,\i) {};
+ }
+ \foreach \name/\var/\vala/\valb/\height/\x in
+ {m1/m_1/f/t/2.25/3,m2/m_2/f/t/2.25/5,h/\mathit{hold}/1/2/4.5/4} {
+ \node[place,label=above:{$\var = \vala$}] (\name\vala) at (\x,\height) {};
+ \node[place,yshift=-8mm,label=below:{$\var = \valb$}] (\name\valb) at (\x,\height) {};
+ }
+ \node[token] at (p1) {}; \node[token] at (q1) {};
+ \node[token] at (m1f) {}; \node[token] at (m2f) {};
+ \node[token] at (h1) {};
+
+ \node[transition] at (1.5,1.5) {} edge [pre] (p1) edge [post] (p2);
+ \node[transition] at (1.5,2.5) {} edge [pre] (p2) edge [pre] (m1f)
+ edge [post] (p3) edge [post] (m1t);
+ \node[transition] at (1.5,3.3) {} edge [pre] (p3) edge [post] (p4)
+ edge [pre and post] (h1);
+ \node[transition] at (1.5,3.7) {} edge [pre] (p3) edge [pre] (h2)
+ edge [post] (p4) edge [post] (h1.west);
+ \node[transition] at (1.5,4.3) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (m2f);
+ \node[transition] at (1.5,4.7) {} edge [pre] (p4) edge [post] (p5)
+ edge [pre and post] (h2);
+ \node[transition] at (1.5,5.5) {} edge [pre] (p5) edge [pre] (m1t)
+ edge [post] (p6) edge [post] (m1f);
+ \node[transition] at (1.5,6.5) {} edge [pre] (p6) edge [post] (p1.south east);
+ \node[transition] at (6.5,1.5) {} edge [pre] (q1) edge [post] (q2);
+ \node[transition] at (6.5,2.5) {} edge [pre] (q2) edge [pre] (m2f)
+ edge [post] (q3) edge [post] (m2t);
+ \node[transition] at (6.5,3.3) {} edge [pre] (q3) edge [post] (q4)
+ edge [pre and post] (h2);
+ \node[transition] at (6.5,3.7) {} edge [pre] (q3) edge [pre] (h1)
+ edge [post] (q4) edge [post] (h2.east);
+ \node[transition] at (6.5,4.3) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (m1f);
+ \node[transition] at (6.5,4.7) {} edge [pre] (q4) edge [post] (q5)
+ edge [pre and post] (h1);
+ \node[transition] at (6.5,5.5) {} edge [pre] (q5) edge [pre] (m2t)
+ edge [post] (q6) edge [post] (m2f);
+ \node[transition] at (6.5,6.5) {} edge [pre] (q6) edge [post] (q1.south west);
+\end{tikzpicture}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-handlers.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-handlers.tex
new file mode 100644
index 0000000000..cf20bc8476
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-handlers.tex
@@ -0,0 +1,694 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Plot Handler Library}
+\label{section-library-plothandlers}
+
+\begin{pgflibrary}{plothandlers}
+ This library packages defines additional plot handlers, see
+ Section~\ref{section-plot-handlers} for an introduction to plot handlers.
+ The additional handlers are described in the following.
+
+ This library is loaded automatically by \tikzname.
+\end{pgflibrary}
+
+
+\subsection{Curve Plot Handlers}
+
+\begin{command}{\pgfplothandlercurveto}
+ This handler will issue a |\pgfpathcurveto| command for each point of the
+ plot, \emph{except} possibly for the first. As for the line-to handler,
+ what happens with the first point can be specified using
+ |\pgfsetmovetofirstplotpoint| or |\pgfsetlinetofirstplotpoint|.
+
+ Obviously, the |\pgfpathcurveto| command needs, in addition to the points
+ on the path, some control points. These are generated automatically using a
+ somewhat ``dumb'' algorithm: Suppose you have three points $x$, $y$, and
+ $z$ on the curve such that $y$ is between $x$ and $z$:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlercurveto
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ In order to determine the control points of the curve at the point $y$, the
+ handler computes the vector $z-x$ and scales it by the tension factor (see
+ below). Let us call the resulting vector $s$. Then $y+s$ and $y-s$ will be
+ the control points around $y$. The first control point at the beginning of
+ the curve will be the beginning itself, once more; likewise the last
+ control point is the end itself.
+\end{command}
+
+\begin{command}{\pgfsetplottension\marg{value}}
+ Sets the factor used by the curve plot handlers to determine the distance
+ of the control points from the points they control. The higher the
+ curvature of the curve points, the higher this value should be. A value of
+ $1$ will cause four points at quarter positions of a circle to be connected
+ using a circle. The default is $0.5$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfsetplottension{0.75}
+ \pgfplothandlercurveto
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerclosedcurve}
+ This handler works like the curve-to plot handler, only it will add a new
+ part to the current path that is a closed curve through the plot points.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerclosedcurve
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Constant Plot Handlers}
+
+There are several plot handlers which produce piecewise constant interpolations
+between successive points:
+
+\begin{command}{\pgfplothandlerconstantlineto}
+ This handler works like the line-to plot handler, only it will produce a
+ connected, piecewise constant path to connect the points.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerconstantlineto
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerconstantlinetomarkright}
+ A variant of |\pgfplothandlerconstantlineto| which places its mark on the
+ right line ends.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerconstantlinetomarkright
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerconstantlinetomarkmid}
+ A variant of |\pgfplothandlerconstantlineto| which places its mark on the
+ center of the line.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerconstantlinetomarkmid
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The plot handler always connects two data points by a horizontal line
+ starting from the previous data points, followed by a vertical line in the
+ middle between the two data points, followed by a horizontal line between
+ the middle and the current data point. This results in a symmetric constant
+ plot handler for constant mesh width.
+\end{command}
+
+\begin{command}{\pgfplothandlerjumpmarkleft}
+ This handler works like the line-to plot handler, only it will produce a
+ non-connected, piecewise constant path to connect the points. If there are
+ any plot marks, they will be placed on the left open pieces.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerjumpmarkleft
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerjumpmarkright}
+ This handler works like the line-to plot handler, only it will produce a
+ non-connected, piecewise constant path to connect the points. If there are
+ any plot marks, they will be placed on the right open pieces.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerjumpmarkright
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerjumpmarkmid}
+ This handler works like the |\pgfplothandlerconstantlinetomarkmid|, but it
+ will produce a non-connected, piecewise constant path to connect the
+ points. If there are any plot marks, they will be placed in the center of
+ the horizontal line segment..
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerjumpmarkmid
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ See |\pgfplothandlerconstantlinetomarkmid| for details.
+\end{command}
+
+
+\subsection{Comb Plot Handlers}
+
+There are three ``comb'' plot handlers. Their name stems from the fact that the
+plots they produce look like ``combs'' (more or less).
+
+\begin{command}{\pgfplothandlerxcomb}
+ This handler converts each point in the plot stream into a line from the
+ $y$-axis to the point's coordinate, resulting in a ``horizontal comb''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerxcomb
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerycomb}
+ This handler converts each point in the plot stream into a line from the
+ $x$-axis to the point's coordinate, resulting in a ``vertical comb''.
+
+ This handler is useful for creating ``bar diagrams''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerycomb
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerpolarcomb}
+ This handler converts each point in the plot stream into a line from the
+ origin to the point's coordinate.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerpolarcomb
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\pgfname\ bar or comb plots usually draw something from zero to the current
+plot's coordinate. The ``zero'' offset can be changed using an input stream
+which returns the desired offset successively for each processed coordinate.
+
+There are two such streams, which can be configured independently. The first
+one returns ``zeros'' for coordinate~$x$, the second one returns ``zeros'' for
+coordinate~$y$. They are used as follows.
+%
+\begin{codeexample}[code only]
+\pgfplotxzerolevelstreamstart
+\pgfplotxzerolevelstreamnext % assigns \pgf@x
+\pgfplotxzerolevelstreamnext
+\pgfplotxzerolevelstreamnext
+\pgfplotxzerolevelstreamend
+\end{codeexample}
+%
+\begin{codeexample}[code only]
+\pgfplotyzerolevelstreamstart
+\pgfplotyzerolevelstreamnext % assigns \pgf@x
+\pgfplotyzerolevelstreamend
+\end{codeexample}
+%
+Different zero level streams can be implemented by overwriting these macros.
+
+\begin{command}{\pgfplotxzerolevelstreamconstant\marg{dimension}}
+ This zero level stream always returns \marg{dimension} instead of $x=0$pt.
+
+ It is used for |xcomb| and |xbar|.
+\end{command}
+
+\begin{command}{\pgfplotyzerolevelstreamconstant\marg{dimension}}
+ This zero level stream always returns \marg{dimension} instead of $y=0$pt.
+
+ It is used for |ycomb| and |ybar|.
+\end{command}
+
+
+\subsection{Bar Plot Handlers}
+\label{section-plotlib-bar-handlers}
+
+While comb plot handlers produce a line-to operation to generate combs, bar
+plot handlers employ rectangular shapes, allowing filled bars (or pattern
+bars).
+
+\begin{command}{\pgfplothandlerybar}
+ This handler converts each point in the plot stream into a rectangle from
+ the $x$-axis to the point's coordinate. The rectangle is placed centered at
+ the $x$-axis.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerybar
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlerxbar}
+ This handler converts each point in the plot stream into a rectangle from
+ the $y$-axis to the point's coordinate. The rectangle is placed centered at
+ the $y$-axis.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlerxbar
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\label{key-bar-width}%
+\begin{key}{/pgf/bar width=\marg{dimension} (initially 10pt)}
+\keyalias{tikz}
+ Sets the width of |\pgfplothandlerxbar| and |\pgfplothandlerybar| to
+ \marg{dimension}. The argument \marg{dimension} will be evaluated using the
+ math parser.
+\end{key}
+
+\label{key-bar-shift}%
+\begin{key}{/pgf/bar shift=\marg{dimension} (initially 0pt)}
+\keyalias{tikz}
+ Sets a shift used by |\pgfplothandlerxbar| and |\pgfplothandlerybar| to
+ \marg{dimension}. It has the same effect as |xshift|, but it applies only
+ to those bar plots. The argument \marg{dimension} will be evaluated using
+ the math parser.
+\end{key}
+
+\begin{command}{\pgfplotbarwidth}
+ Expands to the value of |/pgf/bar width|.
+\end{command}
+
+\begin{command}{\pgfplothandlerybarinterval}
+ This handler is a variant of |\pgfplothandlerybar| which works with
+ intervals instead of points.
+
+ Bars are drawn between successive input coordinates and the width is
+ determined relatively to the interval length.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,2) node {$x_1$} (1,1) node {$x_2$} (2,.5) node {$x_3$} (4,0.7) node {$x_4$};
+ \pgfplothandlerybarinterval
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{2cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreampoint{\pgfpoint{4cm}{0.7cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ In more detail, if $(x_i,y_i)$ and $(x_{i+1},y_{i+1})$ denote successive
+ input coordinates, the bar will be placed above the interval
+ $[x_i,x_{i+1}]$, centered at
+ %
+ \[ x_i + \text{\meta{bar interval shift}} \cdot (x_{i+1} - x_i) \]
+ %
+ with width
+ %
+ \[ \text{\meta{bar interval width}} \cdot (x_{i+1} - x_i). \]
+ %
+ Here, \meta{bar interval shift} and \meta{bar interval width} denote the
+ current values of the associated options.
+
+ If you have $N+1$ input points, you will get $N$ bars (one for each
+ interval). The $y$~value of the last point will be ignored.
+\end{command}
+
+\begin{command}{\pgfplothandlerxbarinterval}
+ As |\pgfplothandlerybarinterval|, this handler provides bar plots with
+ relative bar sizes and offsets, one bar for each $y$~coordinate interval.
+\end{command}
+
+\label{key-bar-interval-shift}%
+\begin{key}{/pgf/bar interval shift=\marg{factor} (initially 0.5)}
+\keyalias{tikz}
+ Sets the \emph{relative} shift of |\pgfplothandlerxbarinterval| and
+ |\pgfplothandlerybarinterval| to \meta{factor}. As
+ |/pgf/bar interval width|, the argument is relative to the interval length
+ of the input coordinates.
+
+ The argument \marg{scale} will be evaluated using the math parser.
+\end{key}
+
+\label{key-bar-interval-width}%
+\begin{key}{/pgf/bar interval width=\marg{scale} (initially 1)}
+\keyalias{tikz}
+ Sets the \emph{relative} width of |\pgfplothandlerxbarinterval| and
+ |\pgfplothandlerybarinterval| to \marg{scale}. The argument is relative to
+ $(x_{i+1} - x_i)$ for $y$~bar plots and relative to $(y_{i+1}-y_i)$ for
+ $x$~bar plots.
+
+ The argument \marg{scale} will be evaluated using the math parser.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[bar interval width=0.5]
+ \draw[gray]
+ (0,3) -- (0,-0.1)
+ (1,3) -- (1,-0.1)
+ (2,3) -- (2,-0.1)
+ (4,3) -- (4,-0.1);
+ \pgfplothandlerybarinterval
+ \begin{scope}[bar interval shift=0.25,fill=blue]
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{2cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreampoint{\pgfpoint{4cm}{0.7cm}}
+ \pgfplotstreamend
+ \pgfusepath{fill}
+ \end{scope}
+ \begin{scope}[bar interval shift=0.75,fill=red]
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{3cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{0.2cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.7cm}}
+ \pgfplotstreampoint{\pgfpoint{4cm}{0.2cm}}
+ \pgfplotstreamend
+ \pgfusepath{fill}
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Please note that bars are always centered, so we have to use shifts $0.25$
+ and $0.75$ instead of $0$ and $0.5$.
+\end{key}
+
+
+\subsection{Gapped Plot Handlers}
+\label{section-plot-gapped}
+
+\begin{command}{\pgfplothandlergaplineto}
+ This handler will connect the points of the plots by straight line
+ segments. However, at the start and the end of the lines there will be a
+ small gap, given by the following key:
+ %
+ \begin{key}{/pgf/gap around stream point=\meta{dimension} (initially 1.5pt)}
+ The \meta{dimension} by which the lines between consecutive stream
+ points are shortened at the beginning and end.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfplothandlergaplineto
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfplothandlergapcycle}
+ Works like |\pgfplothandlergaplineto|, but the last point is connected to
+ the first in the same fashion:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pgfplothandlergapcycle
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Mark Plot Handler}
+\label{section-plot-marks}
+
+\begin{command}{\pgfplothandlermark\marg{mark code}}
+ This command will execute the \meta{mark code} for some points of the plot,
+ but each time the coordinate transformation matrix will be set up such that
+ the origin is at the position of the point to be plotted. This way, if the
+ \meta{mark code} draws a little circle around the origin, little circles
+ will be drawn at some point of the plot.
+
+ By default, a mark is drawn at all points of the plot. However, two
+ parameters $r$ and $p$ influence this. First, only every $r$th mark is
+ drawn. Second, the first mark drawn is the $p$th. These parameters can be
+ influenced using the commands below.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlermark{\pgfpathcircle{\pgfpointorigin}{4pt}\pgfusepath{stroke}}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+
+ Typically, the \meta{code} will be |\pgfuseplotmark{|\meta{plot mark
+ name}|}|, where \meta{plot mark name} is the name of a predefined plot
+ mark.
+\end{command}
+
+\begin{command}{\pgfsetplotmarkrepeat\marg{repeat}}
+ Sets the $r$ parameter to \meta{repeat}, that is, only every $r$th mark
+ will be drawn.
+\end{command}
+
+\begin{command}{\pgfsetplotmarkphase\marg{phase}}
+ Sets the $p$ parameter to \meta{phase}, that is, the first mark to be drawn
+ is the $p$th, followed by the $(p+r)$th, then the $(p+2r)$th, and so on.
+\end{command}
+
+\begin{command}{\pgfplothandlermarklisted\marg{mark code}\marg{index list}}
+ This command works similar to the previous one. However, marks will only be
+ placed at those indices in the given \meta{index list}. The syntax for the
+ list is the same as for the |\foreach| statement. For example, if you
+ provide the list |1,3,...,25|, a mark will be placed only at every second
+ point. Similarly, |1,2,4,8,16,32| yields marks only at those points that
+ are powers of two.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlermarklisted
+ {\pgfpathcircle{\pgfpointorigin}{4pt}\pgfusepath{stroke}}
+ {1,3}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfuseplotmark\marg{plot mark name}}
+ Draws the given \meta{plot mark name} at the origin. The \meta{plot mark
+ name} must have been previously declared using |\pgfdeclareplotmark|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlermark{\pgfuseplotmark{pentagon}}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfdeclareplotmark\marg{plot mark name}\marg{code}}
+ Declares a plot mark for later used with the |\pgfuseplotmark| command.
+ %
+\begin{codeexample}[]
+\pgfdeclareplotmark{my plot mark}
+ {\pgfpathcircle{\pgfpoint{0cm}{1ex}}{1ex}\pgfusepathqstroke}
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfplothandlermark{\pgfuseplotmark{my plot mark}}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsetplotmarksize\marg{dimension}}
+ This command sets the \TeX\ dimension |\pgfplotmarksize| to
+ \meta{dimension}. This dimension is a ``recommendation'' for plot mark code
+ at which size the plot mark should be drawn; plot mark code may choose to
+ ignore this \meta{dimension} altogether. For circles, \meta{dimension}
+ should be the radius, for other shapes it should be about half the
+ width/height.
+
+ The predefined plot marks all take this dimension into account.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[gray] (0,0) node {x} (1,1) node {y} (2,.5) node {z};
+ \pgfsetplotmarksize{1ex}
+ \pgfplothandlermark{\pgfuseplotmark{*}}
+ \pgfplotstreamstart
+ \pgfplotstreampoint{\pgfpoint{0cm}{0cm}}
+ \pgfplotstreampoint{\pgfpoint{1cm}{1cm}}
+ \pgfplotstreampoint{\pgfpoint{2cm}{0.5cm}}
+ \pgfplotstreamend
+ \pgfusepath{stroke}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{textoken}{\pgfplotmarksize}
+ A \TeX\ dimension that is a ``recommendation'' for the size of plot marks.
+\end{textoken}
+
+The following plot marks are predefined (the filling color has been set to
+yellow):
+
+\medskip
+\begin{tabular}{lc}
+ \plotmarkentry{*}
+ \plotmarkentry{x}
+ \plotmarkentry{+}
+\end{tabular}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-marks.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-marks.tex
new file mode 100644
index 0000000000..5abc0ff16f
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-plot-marks.tex
@@ -0,0 +1,116 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Plot Mark Library}
+
+\begin{pgflibrary}{plotmarks}
+ This library defines a number of plot marks.
+\end{pgflibrary}
+
+This library defines the following plot marks in addition to |*|, |x|, and |+|
+(the filling color has been set to a dark yellow):
+
+{
+\catcode`\|=12
+\medskip
+\begin{tabular}{lc}
+ \plotmarkentry{-}
+ \index{*vbar@\protect\texttt{\protect\myvbar} plot mark}%
+ \index{Plot marks!*vbar@\protect\texttt{\protect\myvbar}}
+ %
+ \texttt{\char`\\pgfuseplotmark\char`\{\declare{|}\char`\}} &
+ \tikz\draw [color=black!25] plot [
+ mark=|,mark options={fill=yellow,draw=black}
+ ] coordinates {(0,0) (.5,0.2) (1,0) (1.5,0.2)};\\
+ \plotmarkentry{o}
+ \plotmarkentry{asterisk}
+ \plotmarkentry{star}
+ \plotmarkentry{10-pointed star}
+ \plotmarkentry{oplus}
+ \plotmarkentry{oplus*}
+ \plotmarkentry{otimes}
+ \plotmarkentry{otimes*}
+ \plotmarkentry{square}
+ \plotmarkentry{square*}
+ \plotmarkentry{triangle}
+ \plotmarkentry{triangle*}
+ \plotmarkentry{diamond}
+ \plotmarkentry{diamond*}
+ \plotmarkentry{halfdiamond*}
+ \plotmarkentry{halfsquare*}
+ \plotmarkentry{halfsquare right*}
+ \plotmarkentry{halfsquare left*}
+ \plotmarkentry{pentagon}
+ \plotmarkentry{pentagon*}
+ \plotmarkentry{Mercedes star}
+ \plotmarkentry{Mercedes star flipped}
+ \plotmarkentry{halfcircle}
+ \plotmarkentry{halfcircle*}
+ \plotmarkentry{heart}
+ \plotmarkentry{text}
+\end{tabular}
+}
+
+Note that each of the provided marks can be rotated freely by means of
+|mark options={rotate=90}| or |every mark/.append style={rotate=90}|.
+
+\begin{key}{/pgf/mark color=\marg{color} (initially empty)}
+ Defines the additional fill color for the |halfcircle|, |halfcircle*|,
+ |halfdiamond*| and |halfsquare*| markers. An empty value uses |white|
+ (which is the initial configuration). The special value |none| disables
+ filling of the respective parts.
+
+ Note that |halfsquare| will be filled with |mark color|, and the starred
+ variant |halfsquare*| will be filled half with |mark color| and half with
+ the actual |fill| color.
+\end{key}
+
+
+{
+\def\showit#1{%
+ \tikz\draw[color=black!25] plot[#1,mark options={fill=examplefill,draw=black}] coordinates{(0,0) (.5,0.2) (1,0) (1.5,0.2)};}%
+
+\begin{key}{/pgf/text mark=\marg{text} (initially p)}
+ Changes the text shown by |mark=text|.
+
+ With |/pgf/text mark=m|: \pgfkeys{/pgf/text mark=m}\showit{mark=text}
+
+ With |/pgf/text mark=A|: \pgfkeys{/pgf/text mark=A}\showit{mark=text}
+
+ There is no limitation about the number of characters or whatever. In fact,
+ any \TeX\ material can be inserted as \marg{text}, including images.
+\end{key}
+
+\begin{key}{/pgf/text mark as node=\marg{boolean} (initially false)}
+ Configures how |mark=text| will be drawn: either as |\node| or as |\pgftext|.
+
+ The first choice is highly flexible and possibly slow, the second is very
+ fast and usually enough.
+\end{key}
+
+\begin{key}{/pgf/text mark style=\marg{options for \texttt{mark=text}}}
+ Defines a set of options which control the appearance of |mark=text|.
+
+ If |/pgf/text mark as node=false| (the default), \marg{options} is provided
+ as argument to |\pgftext| -- which provides only some basic keys like
+ |left|, |right|, |top|, |bottom|, |base| and |rotate|.
+
+ If |/pgf/text mark as node=true|, \marg{options} is provided as argument to
+ |\node|. This means you can provide a very powerful set of options
+ including |anchor|, |scale|, |fill|, |draw|, |rounded corners| etc.
+\end{key}
+
+}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-profiler.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-profiler.tex
new file mode 100644
index 0000000000..2e5d0b0186
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-profiler.tex
@@ -0,0 +1,242 @@
+% Copyright 2010 by Christian Feuersaenger
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Profiler Library}
+
+{\noindent {\emph{by Christian Feuersänger}}}
+
+\begin{pgflibrary}{profiler}
+ A library to simplify the optimization of runtime speed of \TeX\ programs.
+
+ It relies on the |pdftex| primitive
+ \declareandlabel{\pdfelapsedtime}\footnote{The primitive is emulated in
+ lua\TeX.} to count (fractional) seconds and counts total time and self time
+ for macro invocations.
+\end{pgflibrary}
+
+
+\subsection{Overview}
+
+The intended audience for this library are people writing \TeX\ code which
+should be optimized. It is certainly \emph{not} useful for the end-user.
+
+The work flow for the optimization is simple: the preamble contains
+configuration commands like
+%
+\begin{codeexample}[code only]
+\usepgflibrary{profiler}
+\pgfprofilenewforenvironment{tikzpicture}
+\pgfprofilenewforcommand{\pgfkeys}{1}
+\end{codeexample}
+%
+\noindent and then, the time between |\begin{tikzpicture}| and
+|\end{tikzpicture}| and the time required to call |\pgfkeys| will be collected.
+
+At the end, a short usage summary like
+%
+\begin{codeexample}[code only, tikz syntax=false]
+ pgflibraryprofiler(main job) {total time=1.07378sec; (100.0122%) self time=0.034sec; (3.1662%)}
+ pgflibraryprofiler(<ENV>tikzpicture) {total time=1.03978sec; (96.84601%) self time=1.00415sec; (93.52722%)}
+ pgflibraryprofiler(<CS>pgfkeys) {total time=0.03563sec; (3.31726%) self time=0.03563sec; (3.31726%)}
+\end{codeexample}
+%
+\noindent will be provided in the log file, furthermore, the same information
+is available in a text table called |\jobname.profiler.|\meta{datetime}|.dat|
+which is of the form:
+%
+\begin{codeexample}[code only, tikz syntax=false]
+profilerentry totaltime[s] totaltime[percent] selftime[s] selftime[percent]
+main job 1.07378 100.0122 0.034 3.1662
+<ENV>tikzpicture 1.03978 96.84601 1.00415 93.52722
+<CS>pgfkeys 0.03563 3.31726 0.03563 3.31726
+\end{codeexample}
+%
+Here, the |totaltime| means the time used for all invocations of the respective
+profiler entry (one row in the table). The |selftime| measures time which is
+not already counted for in another profiler entry which has been invoked within
+the current one. The example above is not very exciting: the main job consists
+only of several (quite complex) pictures and nothing else. Thus, its total time
+is large. However, the self time is very small because the |tikzpicture|s are
+counted separately, and they have been invoked within the |main job|. The
+|\pgfkeys| control sequence has been invoked within the |tikzpicture|, that's
+why the |selftime| for the |tikzpicture| is a little bit smaller than its
+|totaltime|.
+
+
+\subsection{Requirements}
+
+The library works with |pdftex| and |luatex|. Furthermore, it requires a more
+or less recent version of |pdftex| which supports the |\pdfelapsedtime|
+directive.
+
+
+\subsection{Defining Profiler Entries}
+
+Unlike profilers for C/C++ or java, this library doesn't extract information
+about every \TeX\ macro automatically, nor does it collect information for each
+of them. Instead, every profiler entry needs to be defined explicitly. Only
+defined profiler entries will be processed.
+
+\begin{command}{\pgfprofilenew\marg{name}}
+ Defines a new profiler entry named \meta{name}.
+
+ This updates a set of internal registers used to track the profiler entry.
+ The \meta{name} can be arbitrary, it doesn't need to be related to any
+ \TeX\ macro.
+
+ The actual job of counting seconds is accomplished using
+ |\pgfprofilestart|\marg{name} followed eventually by the command
+ |\pgfprofileend|\marg{name}.
+
+ It doesn't hurt if |\pgfprofilenew| is called multiple times with the same
+ name.
+\end{command}
+
+\begin{command}{\pgfprofilenewforcommand\oarg{profiler entry name}\marg{\textbackslash macro}\marg{arguments}}
+ Defines a new profiler entry which will measure the time spent in
+ \meta{\textbackslash macro}. This calls |\pgfprofilenew| and replaces the
+ current definition of \meta{\textbackslash macro} with a new one.
+
+ If \oarg{profiler entry name} has been provided, this defines the argument
+ for |\pgfprofilenew|. It is allowed to use the same name for multiple
+ commands; in this case, they are treated as if it where the same command.
+ If the optional argument is not used, the profiler entry will be called
+ `\declareandlabel{\pgfprofilecs}\meta{macro}' (\meta{macro} without
+ backslash) where |\pgfprofilecs| is predefined to be |<CS>|.
+
+ The replacement macro will collect all required arguments, start counting,
+ invoke the original macro definition and stop counting.
+
+ The following macro types are supported within |\pgfprofilenewforcommand|:
+ %
+ \begin{itemize}
+ \item commands which take one (optional) argument in square brackets
+ followed by one optional argument which has to be delimited by
+ curly braces (use an empty argument for \meta{arguments} in this
+ case),
+ \item commands which take one (optional) argument in square brackets
+ and \emph{exactly} \meta{arguments} arguments afterwards.
+ \end{itemize}
+
+ Take a look at |\pgfprofilenewforcommandpattern| in case you have more
+ complicated commands.
+
+ Note that the library can't detect if a command has been redefined
+ somewhere.
+\end{command}
+
+\begin{command}{\pgfprofilenewforcommandpattern\oarg{profiler entry name}\marg{\textbackslash macro}\marg{argument pattern}\marg{invocation pattern}}
+ A variant of |\pgfprofilenewforcommand| which can be used with arbitrary
+ \meta{argument patterns}. Example:
+ %
+\begin{codeexample}[code only]
+\def\mymacro#1\to#2\in#3{ ... }
+\pgfprofilenewforcommandpattern{\mymacro}{#1\to#2\in#3}{{#1}\to{#2}\in{#3}}
+\end{codeexample}
+
+ Note that |\pgfprofilenewforcommand| is a special case of
+ |\pgfprofilenewforcommandpattern|:
+ %
+\begin{codeexample}[code only]
+\def\mymacro#1#2{ ... }
+\pgfprofilenewforcommand\macro{2}
+\pgfprofilenewforcommandpattern{\mymacro}{#1#2}{{#1}{#2}}
+\end{codeexample}
+ %
+ Thus, \meta{argument pattern} is a copy-paste from the definition of your
+ command. The \meta{invocation pattern} is used by the profiler library to
+ invoke the \emph{original} command, so it is closely related to
+ \meta{argument pattern}, but it needs extra curly braces around each
+ argument.
+
+ The behavior of |\pgfprofilenewforcommandpattern| is the same as discussed
+ above: it defines a new profiler entry which will measure the time spent in
+ \meta{\textbackslash macro}. The details about this definition has already
+ been described. Note that up to one optional argument in square brackets is
+ also checked automatically.
+
+ If you like to profile a command which doesn't match here for whatever
+ reasons, you'll have to redefine it manually and insert |\pgfprofilestart|
+ and |\pgfprofileend| in appropriate places.
+\end{command}
+
+\begin{command}{\pgfprofileshowinvocationsfor\marg{profiler entry name}}
+ Enables verbose output for \emph{every} invocation of \meta{profiler entry
+ name}.
+
+ This is only available for profiler entries for commands (those created by
+ |\pgfprofilenewforcommand| for example). It will also show all given
+ arguments.
+\end{command}
+
+\begin{command}{\pgfprofileshowinvocationsexpandedfor\marg{profiler entry name}}
+ A variant of |\pgfprofileshowinvocationsfor| which will expand all
+ arguments for \meta{profiler entry name} before showing them. The
+ invocation as such is not affected by this expansion.
+
+ This expansion (with |\edef|) might yield unrecoverable errors for some
+ commands. Handle with care.
+\end{command}
+
+\begin{command}{\pgfprofilenewforenvironment\oarg{profiler entry name}\marg{environment name}}
+ Defines a new profiler entry which measures time spent in the environment
+ \meta{environment name}.
+
+ This calls |\pgfprofilenew| and handles the begin/end of the environment
+ automatically.
+
+ The argument for |\pgfprofilenew| is \meta{profiler entry name}, or, if
+ this optional argument is not used, it is
+ `\declareandlabel{\pgfprofileenv}\meta{environment name}' where
+ |\pgfprofileenv| is predefined as |<ENV>|. Again, it is permitted to use
+ the same \meta{profiler entry name} multiple times to merge different
+ commands into one output section.
+\end{command}
+
+\begin{command}{\pgfprofilestart\marg{profiler entry name}}
+ Starts (or resumes) timing of \meta{profiler entry name}. The argument must
+ have been declared in the preamble using |\pgfprofilenew|.
+
+ Nested calls of |\pgfprofilestart| with the same argument will be ignored.
+
+ The invocation of this command doesn't change the environment: it doesn't
+ introduce any \TeX\ groups nor does it modify the token list.
+\end{command}
+
+\begin{command}{\pgfprofileend\marg{profiler entry name}}
+ Stops (or interrupts) timing of \meta{profiler entry name}.
+
+ This command finishes a preceding call to |\pgfprofilestart|.
+\end{command}
+
+\begin{command}{\pgfprofilepostprocess}
+ For \LaTeX, this command is installed automatically in |\end{document}|. It
+ stops all running timings, evaluates them and returns the result into the
+ logfile. Furthermore, it generates a text table called
+ |\jobname.profiler.|\meta{YYYY}|-|\meta{MM}|-|\meta{DD}|_|\meta{HH}|h_|\meta{MM}|m.dat|
+ with the same information.
+
+ Note that the profiler library predefines two profiler entries, namely
+ |main job| which counts time from the beginning of the document until
+ |\pgfprofilepostprocess| and |preamble| which counts time from the
+ beginning of the document until |\begin{document}|.
+\end{command}
+
+\begin{command}{\pgfprofilesetrel\marg{profiler entry name} (initially main job)}
+ Sets the profiler entry whose total time will be used to compute all other
+ relative times. Thus, \meta{profiler entry name} will use $100\%$ of the
+ total time per definition, all other relative times are relative to this
+ one.
+\end{command}
+
+\begin{command}{\pgfprofileifisrunning\marg{profiler entry name}\marg{true code}\marg{false code}}
+ Invokes \marg{true code} if \marg{profiler entry name} is currently running
+ and \marg{false code} otherwise.
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-rdf.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-rdf.tex
new file mode 100644
index 0000000000..d972c80c5a
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-rdf.tex
@@ -0,0 +1,1040 @@
+% Copyright 2016 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Resource Description Framework Library}
+\label{section-library-rdf}
+\label{section-tikz-rdf}
+
+With \todosp{why two labels? Both don't seem to be used.} certain output
+formats (in particular, with \textsc{svg}), \tikzname\ can add \emph{semantic
+annotations} to an output file. Consider as an example the drawing of a finite
+automaton. In your \TeX\ code, you might have a nice description of the
+automaton like the following:
+%
+\begin{codeexample}[code only]
+\tikz[automaton] \graph { a[state, initial] ->[transition] b [state] ->[transition] c[state, final] };
+\end{codeexample}
+%
+This description of the automaton carries a lot of ``semantic information''
+like the information that the node |a| is not just some node, but actually the
+initial state of the automaton, while |c| is a final state. Unfortunately, in
+the output produced \tikzname, this information is normally ``lost'': In the
+output, |a| is only a short text, possibly with a circle drawn around it; but
+there is no information that \emph{this} text and \emph{this} circle together
+form the state of an automaton.
+
+As a human (more precisely, as a computer scientist), you might ``see'' that
+the text and the circle form a state, but most software will have a very hard
+time retrieving this semantic information from the output. In particular, it is
+more or less impossible to design a search engine that you can query to find,
+say, ``all automata with three states'' in a document.
+
+This is the point were \emph{semantic annotations} come in. These are small
+labels or ``hints'' in the \emph{output} that tell you (and, more importantly,
+a program) that the text and the circle together form a state of an automaton.
+There is a standard for specifying such annotations (``resource description
+framework annotations'', abbreviated \textsc{rdf}a) and \tikzname\ provides a
+way of adding such annotations to an output file using the |rdf engine| key,
+explained in a moment. Note, however, that the output format must support such
+annotations; currently \tikzname\ only supports \textsc{svg}.
+
+
+\subsection{Starting the RDF Engine}
+
+\begin{tikzlibrary}{rdf}
+ You need to load this library for the keys described in the following.
+ However, even when this library is loaded, \textsc{rdf} information is only
+ written to the output inside scopes where the following key is set:
+ %
+ \begin{key}{/tikz/rdf engine on}
+ Switches ``on'' the generation of \textsc{rdf} information for the
+ current \TeX\ scope. The idea is that libraries can internally use the
+ |rdf engine| key (explained below) a lot in order to provide good
+ semantic information in the output when desired, but need not worry
+ that this will bloat output files since users have to use this key
+ explicitly to include semantic information in the output.
+ \end{key}
+\end{tikzlibrary}
+
+\begin{key}{/tikz/rdf engine=\meta{rdf keys}}
+ This key only has an effect when |rdf engine on| is called, otherwise the
+ argument is silently ignored. The \meta{rdf keys} get executed with the
+ path prefix |/tikz/rdf engine| at the beginning of the current scope (for a
+ node, at the beginning of the node's scope). Depending on which keys are
+ used, semantic information gets to be added to the output.
+
+ Note that you cannot simply the keys with path prefix |/tikz/rdf engine|
+ directly since they need to be executed at very specific times during
+ \tikzname's processing of scopes. Always call those keys via this key.
+\end{key}
+
+The following key is useful for generally setting the prefix for a larger
+number of annotations:
+
+\begin{key}{/tikz/rdf engine/prefix=\meta{prefix: iri}}
+ Inside the current scope, you can use \meta{prefix}|:| inside curies
+ (compact universal resource identifier expressions, see the \textsc{rdfa}
+ specification) as an abbreviation for the \meta{iri}. (It has the same
+ effect as the |prefix| attribute in \textsc{rdf}a.) You can use this key
+ several times for a given scope.
+ %
+\begin{codeexample}[code only]
+\scoped [rdf engine = {
+ prefix = {rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns\tikzrdfhashmark},
+ prefix = {automata: http://www.tcs.uni-luebeck.de/ontologies/2016/04/28/automata/},
+ statement = { ..., predicate = rdf:type, object = automata:state },
+ statement = { ..., predicate = rdf:type, object = automata:final },
+ }] ...
+\end{codeexample}
+ %
+ The above could also be written more verbosely as
+ %
+\begin{codeexample}[code only]
+\scoped [rdf engine = {
+ statement = { ...,
+ predicate = http://www.w3.org/1999/02/22-rdf-syntax-ns\tikzrdfhashmark type,
+ object = http://www.tcs.uni-luebeck.de/ontologies/2016/04/28/automata/state }
+ },
+ statement = { ...,
+ predicate = http://www.w3.org/1999/02/22-rdf-syntax-ns\tikzrdfhashmark type,
+ object = http://www.tcs.uni-luebeck.de/ontologies/2016/04/28/automata/final }
+ }] ...
+\end{codeexample}
+
+ The use of the command |\tikzrdfhashmark| is necessary since \TeX\ assigns
+ a special meaning to hash marks. The command simple expands to a ``normal''
+ hash mark for use in texts.
+ %
+ \begin{command}{\tikzrdfhashmark}
+ Expands to |#| with catcode 11.
+ \end{command}
+\end{key}
+
+
+\subsection{Creating Statements}
+
+\tikzname's method of adding semantic information to an output is based on the
+principles underlying the \emph{resource description framework} (\textsc{rdf}).
+In this framework, all semantic information is encoded using a large graph
+consisting of nodes and connecting directed edges, but the nodes are called
+\emph{resources} and the edges are called \emph{statements}. A resource is
+identified by an \textsc{iri}, an \emph{internationalized resource identifier,}
+which basically looks like the well-known \textsc{url}s, but allows additional
+Unicode characters. Note that these \textsc{iri}s do not need to point to
+``real'' webpages, they are just a way of conceptually identifying resources
+uniquely and permanently. Similarly, each edge (statement) of the \textsc{rdf}
+graph has such an \textsc{iri} attached to it, which identifies the ``flavour''
+of the arc.
+
+In a ``mathematical'' graph, each edge has a ``tail'' and a ``head'' vertex and
+a label, but in the context of the resource description framework these notions
+are called differently: As mentioned before, an edge is called a
+\emph{statement}, the tail of this edge is called the \emph{subject}, the head
+is called the \emph{object} (in the linguistic sense), and the label is called
+the \emph{predicate}. Thus, a statement is -- quite fittingly -- a triple
+``subject predicate object''.
+
+Note that in the \textsc{rdf} framework \emph{all} semantic information must be
+encoded using statements of this fixed kind. Many semantic notions are easy to
+store in this way such as ``Albert Einstein was a physicist'' (``Albert
+Einstein'' is the subject, ``was'' is the predicate, ``a physicist'' is the
+object), but other notions do not fit well like ``The automaton has states
+$q_1$, $q_2$, $q_a$, and $q_b$'' since there are several objects in the
+statement. Nevertheless, all information must be encoded as simple statements
+with a single subject, a single predicate, and a single object.
+
+You add an \textsc{rdf} statement to the output file using the following key:
+
+\begin{key}{/tikz/rdf engine/statement=\marg{options}}
+ Each use of this key will add one \textsc{rdf} statement to the output
+ file. The \meta{options} will be executed with the path prefix
+ |/tikz/rdf engine/statements| and must use the three keys |subject|,
+ |predicate|, and |object| to specify the three components of the statement
+ (these keys can, however, be called by styles internally, so not all
+ statements will explicitly set these three keys). Note that \emph{all three
+ must always be set}, it is \emph{not} possible to setup, say, just a
+ subject for a scope and then omit the subject for statements inside the
+ scope. (However, using styles you can setup things in such a way that a
+ certain subject is used for several statements.)
+ %
+\begin{codeexample}[code only]
+\tikz [rdf engine = {
+ statement = {
+ subject = http://www.example.org/persons/Einstein,
+ predicate = http://www.example.org/predicates/isA,
+ object = http://www.example.org/professions/physicist
+ },
+ statement = {
+ subject = http://www.example.org/persons/Curie,
+ predicate = http://www.example.org/predicates/isA,
+ object = http://www.example.org/professions/physicist
+ }}] { ... }
+\end{codeexample}
+
+ The statements are normally added at the beginning of the scope where the
+ |rdf enging| command is used (except when the |object| is |scope content|,
+ which is explained later). This means that when you use |prefix| inside an
+ |rdf engine| command, it will apply to all statements, regardless of the
+ order.
+
+ \begin{key}{/tikz/rdf engine/statements/subject=\meta{subject}}
+ Sets the subject of the to-be-created statement. The \meta{subject} can
+ be in one of two possible formats:
+ %
+ \begin{enumerate}
+ \item A curie (a \emph{compact universal resource identifier
+ expression,} see the \textsc{rdfa} specification for details).
+ Examples are standard \textsc{url}s like
+ |http://www.example.org|, but also text like |#my_automaton|.
+ Note that in order to include a hashmark in a curie you should
+ use the command |\tikzrdfhashmark|, which expands to a hash
+ mark (\TeX\ treats hash marks in a special way, which is why
+ this command is used here).
+ \item When the \meta{subject} starts with an opening parenthesis,
+ that is, with ``|(|'', the \meta{subject} must have the form
+ |(|\meta{node or scope name}|)|. In this case, the \meta{node
+ or scope name} must be the name of an already existing node
+ (the current node or scope is considered as ``existing'' here).
+ Then, the curie |#|\meta{id} is used as subject, where the
+ \meta{id} is a unique internal identifier for the node.
+
+ As an example, suppose you wish to specify that a node has some
+ other node as child, you could write the following:
+ %
+\begin{codeexample}[code only]
+\tikz [ rdf engine = { prefix = { rels: http://www.example.org/relations/} } ] {
+ \node (fritz) { Fritz };
+ \node (heinz) at (2,0) { Heinz };
+ \draw [->] (fritz) -- (heinz)
+ [rdf engine = {
+ statement = {
+ subject = (fritz),
+ predicate = rels:isSonOf,
+ object = (heinz)
+ } } ];
+}
+\end{codeexample}
+ \end{enumerate}
+ %
+ You can use a macro as \meta{subject}, it will be expanded before the
+ above syntax check is done.
+
+ If you use the |subject| key several times inside a single |statement|
+ command, (only) the last subject is used.
+ \end{key}
+
+ \begin{key}{/tikz/rdf engine/statements/predicate=\meta{predicate}}
+ Sets the predicate for the statement. The syntax is exactly the same as
+ for the subject. Unlike for subjects, you can use the predicate key
+ several times inside a single statement and the uses will
+ ``accumulate'' and several statements are created, namely one statement
+ for each use of |predicate| for the subject and object specified inside
+ the use of |statement|. This behavior is not very systematic (it
+ violates the rule ``one statement per |statement|'') and you should
+ normally use the |statement| once for each use of the |predicate|
+ key. However, in conjunction with the object |scope content| it is
+ necessary to allow this behavior.
+ \end{key}
+
+ \begin{key}{/tikz/rdf engine/statements/object=\meta{object}}
+ Sets the object for the statement. The syntax allowed for the
+ \meta{object} is as follows:
+ %
+ \begin{enumerate}
+ \item As for |subject| and |predicate| you can use a curie here.
+ This is the default unless one of the following special cases
+ is used:
+ \item As for |subject| and |predicate|, you can use the syntax
+ |(|\meta{name of node or scope}|)| to create and use a curie
+ for the node or scope.
+ \item If the \meta{object} starts with |"|, it must have the syntax
+ |"|\meta{literals}|"|. In this case, the object of the
+ statement is not a curie (not a normal ``resource'') but the
+ string of \meta{literals} given.
+ \item If the \meta{object} is the text ``|scope content|'', the
+ object of the statement is actually the whole contents of the
+ scope to which this statement is attached.
+ \item The two previous cases can be combined in the form of an
+ object of the form |"|\meta{literals}|" and scope content|. In
+ this case, the contents of the scope is ``normally'' the
+ object, but this gets ``overruled'' by the \meta{literals}.
+ Formally, this means that the object is the \meta{literals},
+ but the intended semantics is that the object is the scope
+ content, only for further processing it should be considered to
+ be \meta{literals}. A typical example is the case where the
+ scope content is, say, the text ``January 1st, 2000'' but the
+ \meta{literals} are set to |2000-01-01|, which is easier for
+ software to process:
+ %
+\begin{codeexample}[code only]
+\node [rdf engine = {
+ statement = {
+ subject = ...,
+ predicate = dc:Date,
+ object = "2000-01-01" and scope content
+ } } ] { January 1st, 2000 };
+\end{codeexample}
+ \end{enumerate}
+ %
+ For the last two cases, only one statement may be given per scope that
+ has the |scope content| as its object; if more than one is given, the
+ last one wins. This is the reason why several uses of |predicate| are
+ allowed in a |statement|.
+ \end{key}
+
+ \begin{key}{/tikz/rdf engine/statements/has type=\meta{type}}
+ This style is a shorthand for |predicate=rdf:type| and
+ |object=|\meta{type}.
+ \end{key}
+\end{key}
+
+
+\subsection{Creating Resources}
+
+In \textsc{rdf} statements, when you can use the name of a \tikzname\ scope or
+node surrounded by parenthesis, a curie is inserted into the output that
+references this scope or node. While this makes it easy to describe
+relationships between existing nodes, in library code (\textsc{rdf} generation
+code added to library styles and gets executed as a ``byproduct'') there are
+two situations where this method is insufficient:
+%
+\begin{enumerate}
+ \item You may sometimes wish to create additional resources in the
+ \textsc{rdf} graph that are not represented by any concrete node or
+ scope in the \tikzname\ picture. For instance, a finite automaton has a
+ set of states and a set of transitions, but neither of these
+ ``containers'' has any concrete representation in the output. One
+ could, of course, create ``dummy scopes'' for this purpose, but this is
+ rather hard to do inside styles of a library.
+ \item You may not know the name of the current scope in library code. For
+ instance, a style like |state|, which can be added to a node to
+ indicate that the node is supposed to be a state in a finite automaton,
+ might contain something like the following code:
+ %
+\begin{codeexample}[code only]
+state/.style = {
+ draw, circle, minimum size = ...,
+ rdf engine = {
+ subject = ???,
+ predicate = rdf:type,
+ object = automata:state
+ }
+}
+\end{codeexample}
+ %
+ The problem is, of course, what should be passed to the |subject|. We
+ cannot even write something like |(\tikz@fig@name)| since no name may
+ have been set for the state.
+\end{enumerate}
+
+Each of the above problems is solved by a special keys:
+
+\begin{key}{/tikz/rdf engine/get new resource curie=\meta{macro}}
+ The \meta{macro} will be set to a new unique curie that can be used
+ anywhere where a curie is allowed. Here is an example how we can add a
+ state and a transition container to an automaton, both of which have no
+ corresponding scope in \tikzname.
+ %
+\begin{codeexample}[code only]
+\tikz [ name = my automaton,
+ rdf engine = {
+ get new resource curie = \statecurie,
+ get new resource curie = \transitiocurie,
+ statement = {
+ subject = (my automaton),
+ predicate = automata:hasStateSet,
+ object = \statecurie },
+ statement = {
+ subject = \statecurie,
+ hat type = automata:stateSet },
+ statement = {
+ subject = (my automaton),
+ predicate = automata:hasTransitionSet,
+ object = \transitiocurie },
+ statement = {
+ subject = \transitiocurie,
+ hat type = automata:transitionSet } } ] { ... }
+\end{codeexample}
+ %
+ The \meta{macro} will be valid for the whole scope.
+\end{key}
+
+\begin{key}{/tikz/rdf engine/get scope curie=\meta{macro}}
+ The \meta{macro} will be set to a unique curie that represents the scope or
+ node. If the scope is named (using the |name| key or the special
+ parenthesis syntax for nodes) and this name is later referenced in another
+ statement, the same curie will be generated. Note how in the following code
+ no name is given for the automaton, which means that the whole \textsc{rdf}
+ code could be moved inside a style like |finite automaton| or something
+ similar.
+ %
+\begin{codeexample}[code only]
+\tikz [ rdf engine = {
+ get new resource curie = \statecurie,
+ get new resource curie = \transitiocurie,
+ get scope curie = \automatoncurie,
+ statement = {
+ subject = \automatoncurie,
+ predicate = automata:hasStateSet,
+ object = \statecurie },
+ statement = {
+ subject = \statecurie,
+ hat type = automata:stateSet },
+ statement = {
+ subject = \automatoncurie,
+ predicate = automata:hasTransitionSet,
+ object = \transitiocurie },
+ statement = {
+ subject = \transitiocurie,
+ hat type = automata:transitionSet } } ] { ... }
+\end{codeexample}
+ %
+ The \meta{macro} will be valid for the whole scope.
+\end{key}
+
+The following key builds on the above keys:
+%
+\begin{key}{/tikz/rdf engine/scope is new context}
+ This key executes |get scope curie=\tikzrdfcontext|, thereby setting the
+ macro |\tikzrdfcontext| to the current scope. The idea is the key is used
+ with ``major resources'' and that keys can use this macro as the |subject|
+ of statements if no subject is given explicitly. For instance, a |title|
+ key might be defined as follows:
+ %
+\begin{codeexample}[code only]
+title/.style = {
+ rdf engine = { statement = {
+ subject = \tikzrdfcontext,
+ predicate = dc:Title,
+ object = "#1"
+} } }
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Creating Containers}
+
+A \emph{container} is a resource that represents a set or a sequence of
+elements. In \textsc{rdf} this is modeled by having a statement say that the
+type of the resource is something special like |rdf:Seq| and then for each
+member resource of the container add a statement saying that the container has
+as its $i$th member the member resource. Here is an example of a container
+with two elements:
+%
+\begin{codeexample}[code only]
+\tikz {
+ \node (safe) { Safe }
+ child { node (coins) {Coins} }
+ child { node (gold) {Gold} };
+
+ \scoped [rdf engine = {
+ statement = {
+ subject = (safe),
+ has type = rdf:Seq
+ },
+ statement = {
+ subject = (safe),
+ predicate = rdf:_1,
+ object = (coins)
+ },
+ statement = {
+ subject = (safe),
+ predicate = rdf:_2,
+ object = (gold)
+ } }];
+}
+\end{codeexample}
+
+However, the above code is error-prone and does not integrate well with styles
+and libraries. For this reason, \tikzname\ offers some styles that may help in
+creating containers:
+
+\begin{key}{/tikz/rdf engine/statements/is a container}
+ Add this key to a statement in order to tell \tikzname\ that it should
+ setup a special counter for the subject of the statement that keeps track
+ of the container's children.
+\end{key}
+
+\begin{key}{/tikz/rdf engine/statements/has as member}
+ This key may only be added to statements whose subject was previously used
+ as a subject in a statement containing the |is a container| key. In this
+ case, the internal counter will be increased and the predicate will be set
+ to |rdf:_|\meta{count}. This means that we can write the above code as:
+ %
+\begin{codeexample}[code only]
+\tikz { ...
+
+ \scoped [rdf engine = {
+ statement = {
+ subject = (safe),
+ has type = rdf:Seq,
+ is a container,
+ },
+ statement = {
+ subject = (safe),
+ has as member,
+ object = (coins)
+ },
+ statement = {
+ subject = (safe),
+ has as member,
+ object = (gold)
+ } }];
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rdf engine/statements/is a sequence}
+ This is a shorthand for |predicate = rdf:Seq, is a container|. In the above
+ example we could say:
+ %
+\begin{codeexample}[code only]
+\tikz { ...
+
+ \scoped [rdf engine = {
+ statement = {
+ subject = (safe),
+ is a sequence
+ },
+ ... } ]; }
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rdf engine/statements/is a bag}
+ This is a shorthand for |predicate = rdf:Bag, is a container|.
+\end{key}
+
+\begin{key}{/tikz/rdf engine/statements/is an alternative}
+ This is a shorthand for |predicate = rdf:Alt, is a container|.
+\end{key}
+
+
+\subsection{Creating Semantic Information Inside Styles and Libraries}
+
+\begingroup
+
+The \textsc{rdf} library was designed in such a way that normal document
+authors do not need to use the keys of the library explicitly, except possibly
+for saying |rdf engine on| somewhere at the beginning. Instead, library authors
+should include the necessary commands to generate \textsc{rdf} information that
+is then automatically included in the output. Furthermore, if the author does
+not ``switch on'' the generation of \textsc{rdf} information, all uses of
+|rdf engine| will simply be ignored silently and neither the speed of
+compilation nor the size of the generated files is impacted.
+
+
+\subsubsection{An Example Library for Drawing Finite Automata}
+
+In the following, we have a look at how a library might be augmented by
+\textsc{rdf} generation keys. The library we augment is a (fictitious) library
+for drawing finite automata. The library offers the following styles:
+%
+\begin{enumerate}
+ \item |dfa| and |nfa| can be added to a scope to indicate that the scope
+ contains a deterministic or a nondeterministic finite automaton.
+ \item |state| can be added to a node to indicate that the node is a state
+ in the automaton.
+ \item |initial| and |final| are used to indicate that a state is an initial
+ or final state, which should be rendered in a special way.
+ \item |transition| can be added to an edge to indicate that there is a
+ transition in the automaton from the first state to the second state.
+ The style takes a parameter which is the symbol read by the automaton.
+\end{enumerate}
+
+Here are some possible definitions of these keys that do not (yet) generate
+\textsc{rdf} information:
+%
+\begin{codeexample}[code only, setup code]
+\tikzset {
+ dfa/.style = { semithick, > = To [sep] },
+ nfa/.style = { semithick, > = To [sep] },
+ state/.style = { circle, draw, minimum size = 1cm },
+ final/.style = { double },
+ initial/.style = { draw = red }, % to keep things simple
+ transition/.style = { edge label = {$#1$} } }
+\end{codeexample}
+
+The library could be used as follows:
+%
+\begin{codeexample}[width=5cm]
+\tikz [dfa]
+ \graph [math nodes, grow right = 1.5cm] {
+ q_0 [state, initial] -> [transition = a]
+ q_1 [state] -> [transition = b, loop above]
+ q_1 -> [transition = a]
+ q_2 [state, final]
+ };
+\end{codeexample}
+
+
+\subsubsection{Adding Semantic Information About the Automata as a Whole}
+
+Let us change the different keys so that they add \textsc{rdf} information to
+the output. For this, we first need an ontology that defines notions like
+``state'' or ``deterministic finite automaton''. For the purposes of this
+example, we just assume that such an ontology exists at
+|http://www.tcs.uni-luebeck.de/ontologies/automata/|. The new definition of the
+|dfa| key might start as follows (we will extend these later on):
+%
+\begin{codeexample}[code only]
+dfa/.style = {
+ semithick, > = To [sep], % as before,
+ rdf engine = {
+ %
+ % Setup prefix:
+ prefix = { automata: http://www.tcs.uni-luebeck.de/ontologies/automata/ },
+ %
+ % Get the curie of the automaton and store it in a macro for later use:
+ get scope curie = \mylibAutomatonCurie,
+ %
+ % Make a statement that the resource is, indeed, an automaton:
+ statement = {
+ subject = \mylibAutomatonCurie,
+ has type = automata:types/automaton },
+ %
+ % Make a statement that the automaton is deterministic:
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:properties/deterministic,
+ object = "yes" } } }
+\end{codeexample}
+
+The definition of the style |nfa| would be exactly the same as for |dfa|,
+except, of course, that the last statement would have |"no"| as object. Note
+that the original styles |dfa| and |nfa| has identical definitions since,
+indeed, there is no ``visual'' difference between the two. In contrast, the
+\textsc{rdf} information stores this information in the output.
+
+
+\subsubsection{Adding Semantic Information About the States}
+
+We next augment the styles for creating states and marking them as final or
+initial. We could do the following (note that we do not setup the prefix since
+this has been done by the surrounding |dfa| or |nfa| key):
+%
+\begin{codeexample}[code only]
+state/.style = {
+ circle, draw, minimum size = 1cm, % as before,
+ rdf engine = {
+ get scope curie = \mylibStateCurie,
+ statement = {
+ subject = \mylibStateCurie,
+ has type = automata:types/state },
+ statement = {
+ subject = \mylibStateCurie,
+ predicate = rdf:value,
+ object = scope content } } }
+\end{codeexample}
+
+The first statement tells us that the circle with its contents is a state (and
+not just ``any'' fancy circle). The second statement tells us that the
+``value'' of this state is the content. One might argue that, instead, only the
+number itself (like ``$q_0$'' or perhaps only ``$0$'') should be the ``value''
+or, perhaps, a different property should actually be used (like
+|automata:stateNumber| or something like that). However, these are questions of
+ontological modeling, not of the use of the \textsc{rdf} engine.
+
+What is definitely missing from the above definition is a link between the
+automaton resource and the state resource. Note that the state's rendering code
+will be inside the scope of the automaton, so, in a sense, the state is
+``inside'' the automaton in the output. However, the nesting of scopes is
+\emph{not} part of the \textsc{rdf} graph; we must make these relationships
+explicit using statements. One way to achieve this would be to add the
+following to the |state| style:
+%
+\begin{codeexample}[code only]
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:hasAsAState,
+ object = \mylibStateCurie }
+\end{codeexample}
+
+Note that we can access the macro |\mylibAutomatonCurie| here since this will
+have been setup by the surrounding |dfa| or |nfa| key. While the above is
+possible and legitimate, we will see a better solution using containers in a
+moment (``better'' in the sense that the ontological model is easier to process
+by software).
+
+The two styles |final| and |initial| are easy to augment:
+%
+\begin{codeexample}[code only]
+final/.style = {
+ double, % as before,
+ rdf engine = {
+ get scope curie = \mylibStateCurie,
+ statement = {
+ subject = \mylibStateCurie,
+ has type = automata:properties/final } } }
+\end{codeexample}
+
+Note that when we write |node [state, final] ...| the state now has two types:
+It has type |automata:types/state| and also |automata:properties/final|. This
+is perfectly legitimate. Also note that I added |get scope curie| to the above
+definition, which may seem superfluous since the |state| style already executes
+this key to get a curie for the state resource. However, users should be free
+to write |node [final, state] ...| and, now, the |final| key will be executed
+first.
+
+The style for |initial| is the same as for |final| only with a different type.
+
+
+\subsubsection{Adding Semantic Information About the Transitions}
+
+A transition is, essentially, a labeled edge from a state to another state. It
+may seem tempting to model them as a statement with the first state as its
+subject and the second state as the object and the transition's symbol as the
+label (turned into a curie in some appropriate way). However, closer inspection
+shows that this is not a good way of modeling transitions: In essence, it is
+just coincidence that the \textsc{rdf} graph happens to be a directed graph
+and, at the same time, the thing we describe by it (the automaton) can also be
+viewed as a directed graph. If, for instance, we consider alternating automata
+where a transition can involve more than two states, the simple model breaks
+down.
+
+The ``right'' way of modeling a transition is to treat the transition as a
+resource of its own and then make statements like ``the transition has this
+state as its old state''. This turns out to be relatively easy to achieve:
+%
+\begin{codeexample}[code only]
+transition/.style = {
+ edge label = {#1}, % as before,
+ rdf engine = {
+ get scope curie = \mylibTransitionCurie,
+ statement = {
+ subject = \mylibTransitionCurie,
+ has type = automata:types/transition },
+ statement = {
+ subject = \mylibTransitionCurie,
+ predicate = automata:properties/symbolReadFromTape,
+ object = "#1" },
+ statement = {
+ subject = \mylibTransitionCurie,
+ predicate = automata:relations/oldState,
+ object = (\tikztostart) },
+ statement = {
+ subject = \mylibTransitionCurie,
+ predicate = automata:relations/newState,
+ object = (\tikztotarget) } } }
+\end{codeexample}
+
+
+\subsubsection{Using Containers}
+
+As a last step we wish to organize the states and transitions using containers.
+As explained earlier, we can easily add statements linking our automaton to the
+states and to the transitions, but the \textsc{rdf} standard has standard way
+of specifying that a set of resources form a logical sequence: containers.
+
+In case automata contained \emph{only} states, we could setup the automaton
+itself to be the container and the states to be its elements. However, the
+automaton has states and transitions and in this example I would like to keep
+these in separate containers. Thus, we must create two containers and then make
+statements that the automaton contains these two containers. Since these
+containers do not have any accompanying visual representation, we use the
+|get new resource curie| key to create new resources that are purely for
+descriptive purposes inside the \textsc{rdf} graph:
+%
+\begin{codeexample}[code only]
+dfa/.style = {
+ semithick, > = To [sep], % as before,
+ rdf engine = {
+ prefix = { automata: http://www.tcs.uni-luebeck.de/ontologies/automata/ },
+ get scope curie = \mylibAutomatonCurie,
+ statement = { ... as before that automaton has type automata:types/automaton ... },
+ statement = { ... as before that automaton is deterministic ... },
+ get new resource curie = \mylibStateContainerCurie,
+ statement = {
+ subject = \mylibStateContainerCurie,
+ is a sequence },
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:relations/hasAsStateContainer,
+ object = \mylibStateContainerCurie },
+ get new resource curie = \mylibTransitionContainerCurie,
+ statement = {
+ subject = \mylibTransitionContainerCurie,
+ is a sequence },
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:relations/hasAsTransitionContainer,
+ object = \mylibTransitionContainerCurie } } }
+\end{codeexample}
+
+We can now modify the |state| style as follows:
+%
+\begin{codeexample}[code only]
+state/.style = {
+ circle, draw, minimum size = 1cm, % as before,
+ rdf engine = {
+ get scope curie = \mylibStateCurie,
+ statement = { ... as before ... },
+ statement = { ... as before ... },
+ statement = {
+ subject = \mylibStateContainerCurie,
+ has as member,
+ object = \mylibStateCurie } } }
+\end{codeexample}
+
+The modification for the |transition| style is similar:
+%
+\begin{codeexample}[code only]
+transition/.style = {
+ edge label = {#1}, % as before,
+ rdf engine = {
+ get scope curie = \mylibTransitionCurie,
+ statement = { ... as before ... },
+ statement = { ... as before ... },
+ statement = { ... as before ... },
+ statement = { ... as before ... },
+ statement = {
+ subject = \mylibTransitionContainerCurie,
+ has as member,
+ object = \mylibTransitionCurie } } }
+\end{codeexample}
+
+
+\subsubsection{The Resulting RDF Graph}
+
+Putting it all together, we now get the following library code:
+%
+\begin{codeexample}[setup code, multipage]
+\tikzset {
+ dfa/.style = {
+ semithick, > = To [sep], % as before,
+ rdf engine = {
+ prefix = { automata: http://www.tcs.uni-luebeck.de/ontologies/automata/ },
+ get scope curie = \mylibAutomatonCurie,
+ statement = {
+ subject = \mylibAutomatonCurie,
+ has type = automata:types/automaton },
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:properties/deterministic,
+ object = "yes" },
+ get new resource curie = \mylibStateContainerCurie,
+ statement = {
+ subject = \mylibStateContainerCurie,
+ is a sequence },
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:relations/hasAsStateContainer,
+ object = \mylibStateContainerCurie },
+ get new resource curie = \mylibTransitionContainerCurie,
+ statement = {
+ subject = \mylibTransitionContainerCurie,
+ is a sequence },
+ statement = {
+ subject = \mylibAutomatonCurie,
+ predicate = automata:relations/hasAsTransitionContainer,
+ object = \mylibTransitionContainerCurie } } },
+ state/.style = {
+ circle, draw, minimum size = 1cm, % as before,
+ rdf engine = {
+ get scope curie = \mylibStateCurie,
+ statement = {
+ subject = \mylibStateCurie,
+ has type = automata:types/state },
+ statement = {
+ subject = \mylibStateCurie,
+ predicate = rdf:value,
+ object = scope content },
+ statement = {
+ subject = \mylibStateContainerCurie,
+ has as member,
+ object = \mylibStateCurie } } },
+ initial/.style = {
+ draw = red, % as before,
+ rdf engine = {
+ get scope curie = \mylibStateCurie,
+ statement = {
+ subject = \mylibStateCurie,
+ has type = automata:properties/initial } } },
+ final/.style = {
+ double, % as before,
+ rdf engine = {
+ get scope curie = \mylibStateCurie,
+ statement = {
+ subject = \mylibStateCurie,
+ has type = automata:properties/final } } },
+ transition/.style = {
+ edge label = {$#1$}, % as before,
+ rdf engine = {
+ get scope curie = \mylibTransitionCurie,
+ statement = {
+ subject = \mylibTransitionCurie,
+ has type = automata:types/transition },
+ statement = {
+ subject = \mylibTransitionCurie,
+ predicate = automata:properties/symbolReadFromTape,
+ object = "#1" },
+ statement = {
+ subject = \mylibTransitionCurie,
+ predicate = automata:relations/oldState,
+ object = (\tikztostart) },
+ statement = {
+ subject = \mylibTransitionCurie,
+ predicate = automata:relations/newState,
+ object = (\tikztotarget) },
+ statement = {
+ subject = \mylibTransitionContainerCurie,
+ has as member,
+ object = \mylibTransitionCurie } } }
+}
+\end{codeexample}
+
+\emph{Using} this code is still ``as easy as before'', indeed, the code for
+creating the automaton is perfectly unchanged:
+%
+\begin{codeexample}[width=5cm]
+\tikzset { rdf engine on }
+\tikz [dfa]
+ \graph [math nodes, grow right = 1.5cm] {
+ q_0 [state, initial] -> [transition = a]
+ q_1 [state] -> [transition = b, loop above]
+ q_1 -> [transition = a]
+ q_2 [state, final]
+ };
+\end{codeexample}
+
+Let us now have a look at the result. If the above is processed using \TeX\ and
+transformed to \textsc{svg} code, the following results (reformatted and
+slightly simplified):
+%
+\begin{codeexample}[multipage]
+<g id="pgf3" prefix=" automata: http://www.tcs.uni-luebeck.de/ontologies/automata/ ">
+ <!-- The automaton -->
+ <g about="#pgf3" property="rdf:type" resource="automata:types/automaton" />
+ <g about="#pgf3" property="automata:properties/deterministic" content="yes" />
+ <g about="#pgf4" property="rdf:type" resource="rdf:Seq" />
+ <g about="#pgf3" property="automata:relations/hasAsStateContainer" resource="#pgf4" />
+ <g about="#pgf5" property="rdf:type" resource="rdf:Seq" />
+ <g about="#pgf3" property="automata:relations/hasAsTransitionContainer" resource="#pgf5" />
+ <g id="pgf6" about="#pgf6" property="rdf:value">
+ <!-- State $q_0$ -->
+ <g about="#pgf6" property="rdf:type" resource="automata:types/state" />
+ <g about="#pgf4" property="rdf:_1" resource="#pgf6" />
+ <g about="#pgf6" property="rdf:type" resource="automata:properties/initial" />
+ <g stroke="#f00"> <!-- Red Line -->
+ <path id="pgf6bp" d="M 14.22636 0.0 C 14.22636 7.8571 7.8571 14.22636 0.0 14.22636 ..." />
+ ...
+ </g>
+ </g>
+ <g id="pgf7" about="#pgf7" property="rdf:value">
+ <!-- State $q_1$ -->
+ <g about="#pgf7" property="rdf:type" resource="automata:types/state" />
+ <g about="#pgf4" property="rdf:_2" resource="#pgf7" />
+ <path id="pgf7bp" d="M 56.90549 0.0 C 56.90549 7.8571 50.53622 14.22636 42.67912 14.22636 ..." />
+ ...
+ </g>
+ <g id="pgf8" >
+ <!-- Transition from $q_0$ to $q_1$ -->
+ <g about="#pgf8" property="rdf:type" resource="automata:types/transition" />
+ <g about="#pgf8" property="automata:properties/symbolReadFromTape" content="a" />
+ <g about="#pgf8" property="automata:relations/oldState" resource="#pgf6" />
+ <g about="#pgf8" property="automata:relations/newState" resource="#pgf7" />
+ <g about="#pgf5" property="rdf:_1" resource="#pgf8" />
+ <path id="pgf8p" d="M 14.52637 0.0 L 26.49275 0.0"/>
+ ...
+ </g>
+ <g id="pgf11" >
+ <!-- Transition loop at $q_1$ -->
+ <g about="#pgf11" property="rdf:type" resource="automata:types/transition" />
+ <g about="#pgf11" property="automata:properties/symbolReadFromTape" content="b" />
+ <g about="#pgf11" property="automata:relations/oldState" resource="#pgf7" />
+ <g about="#pgf11" property="automata:relations/newState" resource="#pgf7" />
+ <g about="#pgf5" property="rdf:_2" resource="#pgf11" />
+ <path id="pgf11p" d="M 38.91211 14.05888 C 33.07051 35.8591 51.00113 36.72765 47.05392 16.66444"/>
+ ...
+ </g>
+ <g id="pgf12" about="#pgf12" property="rdf:value">
+ <!-- State $q_2$ -->
+ <g about="#pgf12" property="rdf:type" resource="automata:types/state" />
+ <g about="#pgf4" property="rdf:_3" resource="#pgf12" />
+ <g about="#pgf12" property="rdf:type" resource="automata:properties/final" />
+ <g stroke-width="1.80002"> <!-- Double Line -->
+ <path id="pgf12bp" d="M 99.58461 0.0 C 99.58461 7.8571 93.21535 14.22636 85.35825 14.22636 ..." />
+ ...
+ </g>
+ </g>
+ <g id="pgf13" >
+ <!-- Transition from $q_1$ to $q_2$ -->
+ <g about="#pgf13" property="rdf:type" resource="automata:types/transition" />
+ <g about="#pgf13" property="automata:properties/symbolReadFromTape" content="a" />
+ <g about="#pgf13" property="automata:relations/oldState" resource="#pgf7" />
+ <g about="#pgf13" property="automata:relations/newState" resource="#pgf12" />
+ <g about="#pgf5" property="rdf:_3" resource="#pgf13" />
+ <path id="pgf13p" d="M 57.20549 0.0 L 69.17188 0.0"/>
+ ...
+ </g>
+</g>
+\end{codeexample}
+
+When this code is processed by some \textsc{rdf}a tool, the following graph
+will result where the blue nodes represent resources:
+
+\ifluatex
+\else
+ This example can only be typeset using Lua\TeX.
+ \endgroup\expandafter\endinput
+\fi
+
+{
+ \newbox\myboxa
+ \setbox\myboxa=\hbox{\tiny {\tikz\node[circle, draw=red, fill=white] {$q_0$};}}
+ \newbox\myboxb
+ \setbox\myboxb=\hbox{\tiny {\tikz\node[circle, draw,fill=white] {$q_1$};}}
+ \newbox\myboxc
+ \setbox\myboxc=\hbox{\tiny {\tikz\node[circle, draw,fill=white, double] {$q_2$};}}
+ \catcode`\_=11
+ \begin{tikzpicture}[font=\tiny\ttfamily, > = {Stealth [round, sep]}]
+ \graph [layered layout, sibling sep=1mm, sibling distance=0pt,
+ resource/.style = {align=left,font=\footnotesize\ttfamily, draw = blue, thick, fill=blue!20, rounded corners},
+ predicate/.style = {align=right,font=\scriptsize\ttfamily,fill=black!5,rotate=90,anchor=mid east, rounded corners},
+ tail anchor=south, head anchor=north] {
+ pgf3/\#pgf3[resource] -- /"rdf:type"[predicate] -> automaton[as={automata:\\types/\\automaton},resource];
+ pgf3/\#pgf3[resource] -- /"automata:\\properties/deterministic"[predicate] -> /{"yes"}[resource];
+ pgf4/\#pgf4[resource] -- /"rdf:type"[predicate] -> rdf:Seq[resource];
+ pgf3/\#pgf3[resource] -- /"automata:\\relations/\\hasAsStateContainer"[predicate] -> pgf4[resource];
+ pgf5/\#pgf5[resource] -- /"rdf:type"[predicate] -> rdf:Seq[resource];
+ pgf3/\#pgf3[resource] -- /"atuomata:\\relations/\\hasAsTransitionContainer"[predicate] -> pgf5[resource];
+ pgf6/\#pgf6[resource] -- /"rdf:value"[predicate] -> /[as={\box\myboxa},resource];
+ pgf6/\#pgf6[resource] -- /"rdf:type"[predicate] -> state/"automata:\\types/state"[resource];
+ pgf4/\#pgf4[resource] -- /"rdf:_1"[predicate] -> pgf6[resource];
+ pgf6/\#pgf6[resource] -- /"rdf:type"[predicate] -> initial/"automata:\\properties/\\initial"[resource];
+ pgf7/\#pgf7[resource] -- /"rdf:value"[predicate] -> /[as={\box\myboxb},resource];
+ pgf7/\#pgf7[resource] -- /"rdf:type"[predicate] -> state/"automata:\\types/state"[resource];
+ pgf4/\#pgf4[resource] -- /"rdf:_2"[predicate] -> pgf7[resource];
+ pgf12/\#pgf12[resource] -- /"rdf:value"[predicate] -> /[as={\box\myboxc},resource];
+ pgf12/\#pgf12[resource] -- /"rdf:type"[predicate] -> state/"automata:\\types/state"[resource];
+ pgf4/\#pgf4[resource] -- /"rdf:_3"[predicate] -> pgf12[resource];
+ pgf12/\#pgf12[resource] -- /"rdf:type"[predicate] -> final/"automata:\\properties/\\final"[resource];
+ pgf8/\#pgf8[resource] -- /"rdf:type"[predicate] -> transition/"automata:\\types/\\transition"[resource];
+ pgf8/\#pgf8[resource] -- /"automata:\\properties/\\symbolReadFromTape"[predicate] -> /{"a"}[resource];
+ pgf8/\#pgf8[resource] -- /"automata:\\relations/oldState"[predicate] -> pgf6[resource];
+ pgf8/\#pgf8[resource] -- /"automata:\\relations/newState"[predicate] -> pgf7[resource];
+ pgf5/\#pgf5[resource] -- /"rdf:_1"[predicate] -> pgf8[resource];
+ pgf11/\#pgf11[resource] -- /"rdf:type"[predicate] -> transition/"automata:\\types/\\transition"[resource];
+ pgf11/\#pgf11[resource] -- /"automata:\\properties/\\symbolReadFromTape"[predicate] -> /{"b"}[resource];
+ pgf11/\#pgf11[resource] -- /"automata:\\relations/oldState"[predicate] -> pgf7[resource];
+ pgf11/\#pgf11[resource] -- /"automata:\\relations/newState"[predicate] -> pgf7[resource];
+ pgf5/\#pgf5[resource] -- /"rdf:_2"[predicate] -> pgf11[resource];
+ pgf13/\#pgf13[resource] -- /"rdf:type"[predicate] -> transition/"automata:\\types/\\transition"[resource];
+ pgf13/\#pgf13[resource] -- /"automata:\\properties/\\symbolReadFromTape"[predicate] -> /{"a"}[resource];
+ pgf13/\#pgf13[resource] -- /"automata:\\relations/oldState"[predicate] -> pgf7[resource];
+ pgf13/\#pgf13[resource] -- /"automata:\\relations/newState"[predicate] -> pgf12[resource];
+ pgf5/\#pgf5[resource] -- /"rdf:_3"[predicate] -> pgf13[resource];
+ };
+\end{tikzpicture}
+}
+
+\endgroup
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadings.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadings.tex
new file mode 100644
index 0000000000..5666c1a07d
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadings.tex
@@ -0,0 +1,228 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Shadings Library}
+\label{section-library-shadings}
+
+\begin{pgflibrary}{shadings}
+ The package defines a number of shadings in addition to the ball and axis
+ shadings that are available by default.
+\end{pgflibrary}
+
+In the following, the shadings defined in the library are listed in
+alphabetical order. The colors of some of these shadings can be configured
+using special options (like |left color|). These options implicitly select the
+shading.
+
+The three shadings |axis|, |ball|, and |radial| are always defined, even when
+this library is not used.
+
+\begin{shading}{axis}
+ In this always-defined shading the colors change gradually between three
+ horizontal lines. The top line is at the top (uppermost) point of the path,
+ the middle is in the middle, the bottom line is at the bottom of the path.
+ %
+ \begin{key}{/tikz/top color=\meta{color}}
+ This option sets the color to be used at the top in an |axis| shading.
+ When this option is given, several things happen:
+ %
+ \begin{enumerate}
+ \item The |shade| option is selected.
+ \item The |shading=axis| option is selected.
+ \item The middle color of the axis shading is set to the average of
+ the given top color \meta{color} and of whatever color is
+ currently selected for the bottom.
+ \item The rotation angle of the shading is set to 0.
+ \end{enumerate}
+ %
+\begin{codeexample}[]
+\tikz \draw[top color=red] (0,0) rectangle (2,1);
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/bottom color=\meta{color}}
+ This option works like |top color|, only for the bottom color.
+ \end{key}
+
+ \begin{key}{/tikz/middle color=\meta{color}}
+ This option specifies the color for the middle of an axis shading. It
+ also sets the |shade| and |shading=axis| options, but it does not
+ change the rotation angle.
+
+ \emph{Note:} Since both |top color| and |bottom color| change the
+ middle color, this option should be given \emph{last} if all of these
+ options need to be given:
+ %
+\begin{codeexample}[]
+\tikz \draw[top color=white,bottom color=black,middle color=red]
+ (0,0) rectangle (2,1);
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/left color=\meta{color}}
+ This option does exactly the same as |top color|, except that the
+ shading angle is set to $90^\circ$.
+ \end{key}
+
+ \begin{key}{/tikz/right color=\meta{color}}
+ Works like |left color|.
+ \end{key}
+\end{shading}
+
+\begin{shading}{ball}
+ This always-defined shading fills the path with a shading that ``looks like
+ a ball''. The default ``color'' of the ball is blue (for no particular
+ reason).
+
+ \begin{key}{/tikz/ball color=\meta{color}}
+ This option sets the color used for the ball shading. It sets the
+ |shade| and |shading=ball| options. Note that the ball will never
+ ``completely'' have the color \meta{color}. At its ``highlight'' spot a
+ certain amount of white is mixed in, at the border a certain amount of
+ black. Because of this, it also makes sense to say |ball color=white|
+ or |ball color=black|
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \shade[ball color=white] (0,0) circle (2ex);
+ \shade[ball color=red] (1,0) circle (2ex);
+ \shade[ball color=black] (2,0) circle (2ex);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{shading}
+
+\begin{shading}{bilinear interpolation}
+ This shading fills a rectangle with colors that a bilinearly interpolated
+ between the colors in the four corners of the rectangle. These four colors
+ are called |lower left|, |lower right|, |upper left|, and |upper right|. By
+ changing these color, you can change the way the shading looks. The library
+ also defines four options, called the same way, that can be used to set
+ these colors and select the shading implicitly.
+ %
+\begin{codeexample}[]
+\tikz
+ \shade[upper left=red,upper right=green,
+ lower left=blue,lower right=yellow]
+ (0,0) rectangle (3,2);
+\end{codeexample}
+
+ \begin{key}{/tikz/lower left=\meta{color} (initially white)}
+ Sets the color to be used in a |bilinear interpolation| shading for the
+ lower left corner. Also, this options selects this shading and sets the
+ |shade| option.
+ \end{key}
+
+ \begin{key}{/tikz/upper left=\meta{color} (initially white)}
+ Works like |lower left|.
+ \end{key}
+
+ \begin{key}{/tikz/upper right=\meta{color} (initially white)}
+ Works like |lower left|.
+ \end{key}
+
+ \begin{key}{/tikz/lower right=\meta{color} (initially white)}
+ Works like |lower left|.
+ \end{key}
+\end{shading}
+
+\begin{shading}{color wheel}
+\label{shading-color-wheel}%
+ This shading fills the path with a color wheel.
+ %
+\begin{codeexample}[]
+\tikz \shade[shading=color wheel] (0,0) circle (1.5);
+\end{codeexample}
+ %
+ To produce a color ring, cut out a circle from the color wheel:
+ %
+\begin{codeexample}[]
+\tikz \shade[shading=color wheel] [even odd rule]
+ (0,0) circle (1.5)
+ (0,0) circle (1);
+\end{codeexample}
+ %
+\end{shading}
+
+\begin{shading}{color wheel black center}
+ This shading looks like a color wheel, but the brightness drops to zero in
+ the center.
+ %
+\begin{codeexample}[]
+\tikz \shade[shading=color wheel black center] (0,0) circle (1.5);
+\end{codeexample}
+ %
+\end{shading}
+
+\begin{shading}{color wheel white center}
+ This shading looks like a color wheel, but the saturation drops to zero in
+ the center.
+ %
+\begin{codeexample}[]
+\tikz \shade[shading=color wheel white center] (0,0) circle (1.5);
+\end{codeexample}
+ %
+\end{shading}
+
+\makeatletter
+\begin{shading}{Mandelbrot set}
+ This shading is just for fun. It fills the path with a zoomable Mandelbrot
+ set. Note that this is \emph{not} a bitmap graphic. Rather, the Mandelbrot
+ set is \emph{computed by the \textsc{pdf} renderer} and can be zoomed
+ arbitrarily (give it a try, if you have a fast computer).
+ %
+\pgfutil@ifluatex
+\begin{codeexample}[]
+\tikz \shade[shading=Mandelbrot set] (0,0) rectangle (2,2);
+\end{codeexample}
+\else
+% dvips causes very ugly error messages when converting this to PDF...
+[Compilation disabled. Please use the lua manual.]
+\begin{codeexample}[code only]
+\tikz \shade[shading=Mandelbrot set] (0,0) rectangle (2,2);
+\end{codeexample}
+\fi
+ %
+\end{shading}
+\makeatother
+
+\begin{shading}{radial}
+ This always-defined shading fills the path with a gradual sweep from a
+ certain color in the middle to another color at the border. If the path is
+ a circle, the outer color will be reached exactly at the border. If the
+ shading is not a circle, the outer color will continue a bit towards the
+ corners. The default inner color is gray, the default outer color is white.
+ %
+ \begin{key}{/tikz/inner color=\meta{color}}
+ This option sets the color used at the center of a |radial| shading.
+ When this option is used, the |shade| and |shading=radial| options are
+ set.
+ %
+\begin{codeexample}[]
+\tikz \draw[inner color=red] (0,0) rectangle (2,1);
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/outer color=\meta{color}}
+ This option sets the color used at the border and outside of a |radial|
+ shading.
+ %
+\begin{codeexample}[]
+\tikz \draw[outer color=red,inner color=white]
+ (0,0) rectangle (2,1);
+\end{codeexample}
+ \end{key}
+\end{shading}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadows.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadows.tex
new file mode 100644
index 0000000000..93b6feaced
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shadows.tex
@@ -0,0 +1,291 @@
+% Copyright 2007 by Till Tantau and Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Shadows Library}
+\label{section-libs-shadows}
+
+\begin{pgflibrary}{shadows}
+ This library defines styles that help adding a (partly) transparent shadow
+ to a path or node.
+\end{pgflibrary}
+
+
+\subsection{Overview}
+
+A \emph{shadow} is usually a black or gray area that is drawn behind a path or
+a node, thereby adding visual depth to a picture. The |shadows| library defines
+options that make it easy to add shadows to paths. Internally, these options
+are based on using the |preaction| option to use a path twice: Once for drawing
+the shadow (slightly shifted) and once for actually using the path.
+
+Note that you can only add shadows to \emph{paths}, not to whole scopes.
+
+In addition to the general |shadow| option, there exist special options like
+|circular shadow|. These can only (sensibly) be used with a special kind of
+path (for |circular shadow|, a circle) and, thus, they are not as general. The
+advantage is, however, that they are more visually pleasing since these shadows
+blend smoothly with the background. Note that these special shadows use
+fadings, which few printers will support.
+
+
+\subsection{The General Shadow Option}
+
+The shadows are internally created by using a single option called
+|general shadow|. The different options like |drop shadow| or |copy shadow|
+only differ in the commands that they preset.
+
+You will not need to use this option directly under normal circumstances.
+
+\begin{key}{/tikz/general shadow=\meta{shadow options} (default \normalfont empty)}
+ This option should be given to a |\path| or a |node|. It has the following
+ effect: Before the path is used normally, it is used once with the
+ \meta{shadow options} in force. Furthermore, when the path is ``preused''
+ in this way, it is shifted and scaled a little bit.
+
+ In detail, the following happens: A |preaction| is used to paint the path
+ in a special manner before it is actually painted. This ``special'' manner
+ is as follows: The options in \meta{shadow options} are used for painting
+ this path. Typically, the \meta{shadow options} will contain options like
+ |fill=black| to create, say, a black shadow. Furthermore, after the
+ \meta{shadow options} have been set up, the following extra canvas
+ transformations are applied to the path: It is scaled by |shadow scale|
+ (with the origin of scaling at the path's center) and it is shifted by
+ |shadow xshift| and |shadow yshift|.
+
+ Note that since scaling and shifting is done using canvas transformations,
+ shadows are not taken into account when the picture's bounding box is
+ computed.
+ %
+\begin{codeexample}[]
+\tikz [even odd rule]
+ \draw [general shadow={fill=red}] (0,0) circle (.5) (0.5,0) circle (.5);
+\end{codeexample}
+
+ \begin{key}{/tikz/shadow scale=\meta{factor} (initially 1)}
+ Shadows are scaled by \meta{factor}.
+ %
+\begin{codeexample}[]
+\tikz [even odd rule]
+ \draw [general shadow={fill=red,shadow scale=1.25}]
+ (0,0) circle (.5) (0.5,0) circle (.5);
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/shadow xshift=\meta{dimension} (initially 0pt)}
+ Shadows are shifted horizontally by \meta{dimension}.
+ %
+\begin{codeexample}[]
+\tikz [even odd rule]
+ \draw [general shadow={fill=red,shadow xshift=-5pt}]
+ (0,0) circle (.5) (0.5,0) circle (.5);
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/shadow yshift=\meta{dimension} (initially 0pt)}
+ Shadows are shifted vertically by \meta{dimension}.
+ \end{key}
+\end{key}
+
+
+\subsection{Shadows for Arbitrary Paths and Shapes}
+
+\subsubsection{Drop Shadows}
+
+\begin{key}{/tikz/drop shadow=\meta{shadow options} (default \normalfont empty)}
+ This option adds a drop shadow to a |\path| or a |node|. It uses the
+ |general shadow| and passes the \meta{shadow options} to it, plus, before
+ them, the following extra options:
+ %
+\begin{codeexample}[code only]
+ shadow scale=1, shadow xshift=.5ex, shadow yshift=-.5ex,
+ opacity=.5, fill=black!50, every shadow
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz [even odd rule]
+ \filldraw [drop shadow,fill=white] (0,0) circle (.5) (0.5,0) circle (.5);
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \i in {1,...,4}
+ \node[starburst,drop shadow,fill=white,draw] at (0,\i) {Burst \i};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \filldraw [drop shadow={opacity=1},fill=white]
+ (1,2) circle (.5) (1.5,2) circle (.5);
+
+ \filldraw [drop shadow={opacity=0.25},fill=white]
+ (1,.5) circle (.5) (1.5,.5) circle (.5);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{stylekey}{/tikz/every shadow (initially \normalfont empty)}
+ This style is executed in addition to any \meta{shadow options} for each
+ shadow. Use this style to reconfigure the way shadows are drawn.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every shadow/.style={opacity=.8,fill=blue!50!black}]
+ \filldraw [drop shadow,fill=white] (0,0) circle (.5) (0.5,0) circle (.5);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsubsection{Copy Shadows}
+
+A \emph{copy shadow} is not really a shadow. Rather, it looks like another copy
+of the path drawn behind the path and a little bit offset. This creates the
+visual impression of having multiple copies of the path/object present.
+
+\begin{key}{/tikz/copy shadow=\meta{shadow options} (default \normalfont empty)}
+ This shadow installs the following default options:
+ %
+\begin{codeexample}[code only]
+ shadow scale=1, shadow xshift=.5ex, shadow yshift=-.5ex, every shadow
+\end{codeexample}
+ %
+ Furthermore, the options |fill=|\meta{fill color} and |draw=|\meta{draw
+ color} are also set, where the \meta{fill color} and \meta{draw color} are
+ the fill and draw colors used for the main path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [copy shadow,fill=blue!20,draw=blue,thick] {Hello World!};
+
+ \node at (0,-1) [copy shadow={shadow xshift=1ex,shadow yshift=1ex},
+ fill=blue!20,draw=blue,thick]
+ {Hello World!};
+
+ \node at (0,-2) [copy shadow={opacity=.5},tape,
+ fill=blue!20,draw=blue,thick]
+ {Hello World!};
+
+ % We have to repeat the left color since shadings are not
+ % automatically applied to shadows
+ \node at (0,-3) [copy shadow={left color=blue!50},
+ left color=blue!50,draw=blue,thick]
+ {Hello World!};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/double copy shadow=\meta{shadow options} (default \normalfont empty)}
+ This shadow works like a |copy shadow|, only the shadow is added twice, the
+ second time with the double |xshift| and |yshift|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [double copy shadow,fill=blue!20,draw=blue,thick] {Hello World!};
+
+ \node at (0,-1) [double copy shadow={shadow xshift=1ex,shadow yshift=1ex},
+ fill=blue!20,draw=blue,thick]
+ {Hello World!};
+
+ \node at (0,-2) [double copy shadow={opacity=.5},tape,
+ fill=blue!20,draw=blue,thick]
+ {Hello World!};
+
+ \node at (0,-3) [double copy shadow={left color=blue!50},
+ left color=blue!50,draw=blue,thick]
+ {Hello World!};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Shadows for Special Paths and Nodes}
+
+The shadows in this section should normally be added only to paths that have a
+special shape. They will look strange with other shapes.
+
+\begin{key}{/tikz/circular drop shadow=\meta{shadow options}}
+ This shadow works like a drop shadow, only it adds a circular fading to the
+ shadow. This means that the shadow will fade out at the border. The
+ following options are preset for this shadow:
+ %
+\begin{codeexample}[code only]
+ shadow scale=1.1, shadow xshift=.3ex, shadow yshift=-.3ex,
+ fill=black, path fading={circle with fuzzy edge 15 percent},
+ every shadow,
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \i in {1,...,8}
+ \node[circle,circular drop shadow,draw=blue,fill=blue!20,thick]
+ at (\i*45:1) {Circle \i};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/circular glow=\meta{shadow options}}
+ This shadow works much like the |circular shadow|, only it is not shifted.
+ This creates a visual effect of a ``glow'' behind the circle. The following
+ options are preset for this shadow:
+ %
+\begin{codeexample}[code only]
+ shadow scale=1.25, shadow xshift=0pt, shadow yshift=0pt,
+ fill=black, path fading={circle with fuzzy edge 15 percent},
+ every shadow,
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \i in {1,...,8}
+ \node[circle,circular glow,fill=red!20,draw=red,thick]
+ at (\i*45:1) {Circle \i};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \i in {1,...,8}
+ \node[circle,circular glow={fill=white},fill=red!20,draw=red,thick]
+ at (\i*45:1) {Circle \i};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \i in {1,...,8}
+ \node[circle,circular glow={fill=green},fill=black,text=green!50!black]
+ at (\i*45:1) {Circle \i};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ An especially interesting effect can be achieved by only using the glow and
+ not filling the path:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \i in {1,...,8}
+ \node[circle,circular glow={fill=red!\i0}]
+ at (\i*45:1) {Circle \i};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shapes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shapes.tex
new file mode 100644
index 0000000000..be536402d3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-shapes.tex
@@ -0,0 +1,2295 @@
+% Copyright 2007 by Till Tantau and Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Shape Library}
+\label{section-libs-shapes}
+
+\subsection{Overview}
+
+In addition to the standard shapes |rectangle|, |circle| and |coordinate|,
+there exist a number of additional shapes defined in different shape libraries.
+Most of these shapes have been contributed by Mark Wibrow. In the present
+section, these shapes are described. Note that the library |shapes| is provided
+for compatibility only. Please include sublibraries like |shapes.geometric| or
+|shapes.misc| directly.
+
+The appearance of shapes is influenced by numerous parameters like
+|minimum height| or |inner xsep|. These general parameters are documented in
+Section~\ref{section-shape-common-options}
+
+In all of the examples presented in this section, the following |shape example|
+style is used:
+%
+\begin{codeexample}[code only]
+\tikzset{
+ shape example/.style= {color = black!30,
+ draw,
+ fill = yellow!30,
+ line width = .5cm,
+ inner xsep = 2.5cm,
+ inner ysep = 0.5cm}
+}
+\end{codeexample}
+
+
+\subsection{Predefined Shapes}
+\label{section-predefined-shapes}
+
+The three shapes |rectangle|, |circle|, and |coordinate| are always defined and
+no library needs to be loaded for them. While the |coordinate| shape defines
+only the |center| anchor, the other two shapes define a standard set of
+anchors.
+
+\begin{shape}{circle}
+ This shape draws a tightly fitting circle around the text. The following
+ figure shows the anchors this shape defines; the anchors |10| and |130| are
+ example of border anchors.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=circle,shape example] {Circle\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/above, east/right,
+ mid west/right, mid/above, mid east/left,
+ base west/left, base/below, base east/right,
+ south west/below left, south/below, south east/below right,
+ text/left, 10/right, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{rectangle}
+ This shape, which is the standard, is a rectangle around the text. The
+ inner and outer separations (see Section~\ref{section-shape-seps})
+ influence the white space around the text. The following figure shows the
+ anchors this shape defines; the anchors |10| and |130| are example of
+ border anchors.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=rectangle,shape example] {Rectangle\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/above, east/right,
+ mid west/right, mid/above, mid east/left,
+ base west/left, base/below, base east/right,
+ south west/below left, south/below, south east/below right,
+ text/left, 10/right, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+\subsection{Geometric Shapes}
+
+\begin{pgflibrary}{shapes.geometric}
+ This library defines different shapes that correspond to basic geometric
+ objects like ellipses or polygons.
+\end{pgflibrary}
+
+\begin{shape}{diamond}
+ This shape is a diamond tightly fitting the text box. The ratio between
+ width and height is 1 by default, but can be changed by setting the shape
+ aspect ratio using the following \pgfname{} key (to use this key in
+ \tikzname{} simply remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/aspect=\meta{value} (initially 1.0)}
+ The aspect is a recommendation for the quotient of the width and the
+ height of a shape. This key calls the macro |\pgfsetshapeaspect|.
+ \end{key}
+
+ The following figure shows the anchors this shape defines; the anchors |10|
+ and |130| are example of border anchors.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=diamond,shape example] {Diamond\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/above, east/right,
+ mid/above,
+ base/below,
+ south west/below left, south/below, south east/below right,
+ text/left, 10/right, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{ellipse}
+ This shape is an ellipse tightly fitting the text box, if no inner
+ separation is given. The following figure shows the anchors this shape
+ defines; the anchors |10| and |130| are example of border anchors.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=ellipse,shape example] {Ellipse\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/above, east/right,
+ mid west/right, mid/above, mid east/left,
+ base west/left, base/below, base east/right,
+ south west/below left, south/below, south east/below right,
+ text/left, 10/right, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{trapezium}
+ This shape is a trapezium, that is, a quadrilateral with a single pair of
+ parallel lines (this can sometimes be known as a trapezoid). The trapezium
+ shape supports the rotation of the shape border, as described in
+ Section~\ref{section-rotating-shape-borders}.
+
+ The lower internal angles at the lower corners of the trapezium can be
+ specified independently, and the resulting extensions are in addition to
+ the natural dimensions of the node contents (which includes any
+ |inner sep|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={trapezium, draw}]
+ \node at (0,2) {A};
+ \node[trapezium left angle=75, trapezium right angle=45]
+ at (0,1) {B};
+ \node[trapezium left angle=120, trapezium right angle=60]
+ at (0,0) {C};
+\end{tikzpicture}
+\end{codeexample}
+
+ The \pgfname{} keys to set the lower internal angles of the trapezium are
+ shown below. To use these keys in \tikzname, simply remove the
+ \declare{|/pgf/|} path.
+
+ \begin{key}{/pgf/trapezium left angle=\meta{angle} (initially 60)}
+ Sets the lower internal angle of the left side.
+ \end{key}
+
+ \begin{key}{/pgf/trapezium right angle=\meta{angle} (initially 60)}
+ Sets the lower internal angle of the right side.
+ \end{key}
+
+ \begin{stylekey}{/pgf/trapezium angle=\meta{angle}}
+ This key stores no value itself, but sets the value of the previous two
+ keys to \meta{angle}.
+ \end{stylekey}
+
+ Regardless of the rotation of the shape border, the width and height of the
+ trapezium are as follows:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth, every node/.style={text=black},
+ shape border uses incircle, shape border rotate=60]
+ \node [trapezium, fill=gray!25, minimum width=2cm] (t) {};
+ \draw [red, <->] (t.bottom left corner) -- (t.bottom right corner)
+ node [midway, below right] {width};
+ \draw [red, <->] (t.top side) -- (t.bottom side)
+ node [at start, above] {height};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/pgf/trapezium stretches=\meta{boolean} (default true)}
+ This key controls whether \pgfname{} allows the width and the height of
+ the trapezium to be enlarged independently, when considering any
+ minimum size specification. This is initially |false|, ensuring that
+ the shape ``looks the same but bigger'' when enlarged.
+ %
+\begin{codeexample}[]
+\tikzset{my node/.style={trapezium, fill=#1!20, draw=#1!75, text=black}}
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \node [my node=red] {A};
+ \node [my node=green, minimum height=1.5cm] at (1, 1.25) {B};
+ \node [my node=blue, minimum width=1.5cm] at (2, 0) {C};
+\end{tikzpicture}
+\end{codeexample}
+
+ By setting \meta{boolean} to |true|, the trapezium can be stretched
+ horizontally or vertically.
+ %
+\begin{codeexample}[]
+\tikzset{my node/.style={trapezium, fill=#1!20, draw=#1!75, text=black}}
+\begin{tikzpicture}
+\tikzset{trapezium stretches=true}
+ \draw [help lines] grid (3,2);
+ \node [my node=red] {A};
+ \node [my node=green, minimum height=1.5cm] at (1, 1.25) {B};
+ \node [my node=blue, minimum width=1.5cm] at (2, 0) {C};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/trapezium stretches body=\meta{boolean} (default true)}
+ This is similar to the |trapezium stretches| key except that when
+ \meta{boolean} is |true|, \pgfname{} enlarges only the body of the
+ trapezium when applying minimum width.
+ %
+\begin{codeexample}[]
+\tikzset{my node/.style={trapezium, fill=#1!20, draw=#1!75, text=black}}
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \node [my node=red] at (1.5,.25) {A};
+ \node [my node=green, minimum width=3cm, trapezium stretches]
+ at (1.5,1) {B};
+ \node [my node=blue, minimum width=3cm, trapezium stretches body]
+ at (1.5,1.75) {C};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for the trapezium are shown below. The anchor |160| is an
+ example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=trapezium, shape example, inner sep=1cm]
+ {Trapezium\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {bottom left corner/below, top right corner/right,
+ top left corner/left, bottom right corner/below,
+ bottom side/below, left side/left,
+ right side/right, top side/above,
+ center/above, text/below, mid/right, base/below,
+ mid west/right, base west/below, mid east/left, base east/below,
+ west/above, east/above, north/below, south/above,
+ north west/above, north east/above,
+ south west/below, south east/below, 160/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{semicircle}
+ This shape is a semicircle, which tightly fits the node contents. This
+ shape supports the rotation of the shape border, as described in
+ Section~\ref{section-rotating-shape-borders}. The anchors for the
+ |semicircle| shape are shown below. Anchor |30| is an example of a border
+ anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=semicircle,shape border rotate=0,shape example, inner sep=1cm]
+ {Semicircle\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {apex/above, arc start/below, arc end/below, chord center/below,
+ center/above, base/below, mid/right, text/left,
+ base west/below, base east/below, mid west/left, mid east/right,
+ north/below, south/above, east/above, west/above,
+ north west/above left, north east/above right,
+ south west/below, south east/below, 30/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{regular polygon}
+ This shape is a regular polygon, which, by default, is drawn so that a side
+ (rather than a corner) is always at the bottom. This shape supports the
+ rotation as described in Section~\ref{section-rotating-shape-borders}, but
+ the border of the polygon is \emph{always} constructed using the incircle,
+ whose radius is calculated to tightly fit the node contents (including any
+ |inner sep|).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \a in {3,...,7}{
+ \draw[red, dashed] (\a*2,0) circle(0.5cm);
+ \node[regular polygon, regular polygon sides=\a, draw,
+ inner sep=0.3535cm] at (\a*2,0) {};
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ If the node is enlarged to any specified minimum size, this is interpreted
+ as the diameter of the circumcircle, that is, the circle that passes
+ through all the corners of the polygon border.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \a in {3,...,7}{
+ \draw[blue, dashed] (\a*2,0) circle(0.5cm);
+ \node[regular polygon, regular polygon sides=\a, minimum size=1cm, draw] at (\a*2,0) {};
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ There is a \pgfname{} key to set the number of sides for the regular
+ polygon. To use this key in \tikzname, simply remove the \declare{|/pgf/|}
+ path.
+
+ \begin{key}{/pgf/regular polygon sides=\meta{integer} (initially 5)}
+ \end{key}
+
+ The anchors for a regular polygon shape are shown below. The anchor |75| is
+ an example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=regular polygon, shape example, inner sep=.5cm]
+ {Regular Polygon\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {corner 1/above, corner 2/above, corner 3/left, corner 4/right, corner 5/above,
+ side 1/above, side 2/left, side 3/below, side 4/right, side 5/above,
+ center/above, text/left, mid/right, base/below, 75/above,
+ west/above, east/above, north/below, south/above,
+ north east/below, south east/above, north west/below, south west/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{star}
+ This shape is a star, which by default (minus any transformations) is drawn
+ with the first point pointing upwards. This shape supports the rotation as
+ described in Section~\ref{section-rotating-shape-borders}, but the border
+ of the star is \emph{always} constructed using the incircle.
+
+ A star should be thought of as having a set of ``inner points'' and ``outer
+ points''. The inner points of the border are based on the radius of the
+ circle which tightly fits the node contents, and the outer points are based
+ on the circumcircle, the circle that passes through every outer point. Any
+ specified minimum size, width or height, is interpreted as the diameter of
+ the circumcircle.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (2,2);
+ \draw [blue, dashed] (1,1) circle(1cm);
+ \draw [red, dashed] (1,1) circle(.5cm);
+ \node [star, star point height=.5cm, minimum size=2cm, draw]
+ at (1,1) {S};
+\end{tikzpicture}
+\end{codeexample}
+
+ The \pgfname{} keys to set the number of star points, and the height of the
+ star points, are shown below. To use these keys in \tikzname, simply remove
+ the \declare{|/pgf/|} path.
+
+ \begin{key}{/pgf/star points=\meta{integer} (initially 5)}
+ Sets the number of points for the star.
+ \end{key}
+
+ \begin{key}{/pgf/star point height=\meta{distance} (initially .5cm)}
+ Sets the height of the star points. This is the distance between the
+ inner point and outer point radii. If the star is enlarged to some
+ specified minimum size, the inner radius is increased to maintain the
+ point height.
+ \end{key}
+
+ \begin{key}{/pgf/star point ratio=\meta{number} (initially 1.5)}
+ Sets the ratio between the inner point and outer point radii. If the
+ star is enlarged to some specified minimum size, the inner radius is
+ increased to maintain the ratio.
+ \end{key}
+
+ The inner and outer points form the principle anchors for the star, as
+ shown below (anchor |75| is an example of a border anchor).
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=star, star points=5, star point ratio=1.65, shape example, inner sep=1.5cm]
+ {Star\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {inner point 1/above, inner point 2/above, inner point 3/below, inner point 4/right,
+ inner point 5/above, outer point 1/above, outer point 2/above, outer point 3/left,
+ outer point 4/right, outer point 5/above,
+ center/above, text/left, mid/right, base/below, 75/above,
+ west/above, east/above, north/below, south/above,
+ north east/below, south east/above, north west/below, south west/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{isosceles triangle}
+ This shape is an isosceles triangle, which supports the rotation of the
+ shape border, as described in Section~\ref{section-rotating-shape-borders}.
+ The angle of rotation determines the direction in which the apex of the
+ triangle points (provided no other transformations are applied). However,
+ regardless of the rotation of the shape border, the width and height are
+ always considered as follows:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth, every node/.style={text=black},
+ shape border uses incircle, shape border rotate=-30]
+ \node [isosceles triangle, fill=gray!25, minimum width=1.5cm] (t) {};
+ \draw [red, <->] (t.left corner) -- (t.right corner)
+ node [midway, above left] {width};
+ \draw [red, <->] (t.apex) -- (t.lower side)
+ node [midway, above right] {height};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are \pgfname{} keys to customize this shape. To use these keys in
+ \tikzname, simply remove the \declare{|/pgf/|} path.
+
+ \begin{key}{/pgf/isosceles triangle apex angle=\meta{angle} (initially 30)}
+ Sets the angle of the apex of the isosceles triangle.
+ \end{key}
+
+ \begin{key}{/pgf/isosceles triangle stretches=\meta{boolean} (default true)}
+ By default \meta{boolean} is |false|. This means, that when applying
+ any minimum width or minimum height requirements, increasing the height
+ will increase the width (and vice versa), in order to keep the apex
+ angle the same.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[paint/.style={draw=#1!75, fill=#1!20}]
+ \tikzset{every node/.style={isosceles triangle, draw, inner sep=0pt,
+ anchor=left corner, shape border rotate=90}}
+ \draw[help lines] grid(4,2);
+ \foreach \a/\c in {1.5/blue, 1/green, 0.5/red}{
+ \node[paint=\c, minimum height=\a cm] at (0,0) {};
+ \node[paint=\c, minimum width=\a cm] at (2,0) {};
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ However, by setting \meta{boolean} to |true|, minimum width and height
+ can be applied independently.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[paint/.style={draw=#1!75, fill=#1!20}]
+ \tikzset{every node/.style={isosceles triangle, draw, inner sep=0pt,
+ anchor=south, shape border rotate=90, isosceles triangle stretches}}
+ \draw[help lines] grid(4,2);
+ \foreach \a/\c in {1.5/blue, 1/green, 0.5/red}{
+ \node[paint=\c, minimum height=\a cm, minimum width=1.5cm] at (0.75,0) {};
+ \node[paint=\c, minimum width=\a cm, minimum height=1.5cm] at (3,0) {};
+ }
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for the |isosceles triangle| are shown below (anchor |150| is
+ an example of a border anchor). Note that, somewhat confusingly, the anchor
+ names such as |left side| and |right corner| are named as if the triangle
+ is rotated to 90 degrees. Note also that the |center| anchor does not
+ necessarily correspond to any kind of geometric center.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=isosceles triangle, shape example, inner xsep=1cm]
+ {Isosceles Triangle\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {apex/above, left corner/right, right corner/right,
+ left side/above, right side/below, lower side/right,
+ center/above, text/right, 150/above,
+ mid/right, mid west/above, mid east/right,
+ base/below, base west/below, base east/below,
+ west/above, east/below, north/below, south/above,
+ north west/below, north east/below,
+ south west/above, south east/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\par\leavevmode
+\begin{shape}{kite}
+ This shape is a kite, which supports the rotation of the shape border, as
+ described in Section~\ref{section-rotating-shape-borders}. There are
+ \pgfname{} keys to specify the upper and lower vertex angles of the kite.
+ To use these keys in \tikzname, simply remove the \declare{|/pgf/|} path.
+
+ \begin{key}{/pgf/kite upper vertex angle=\meta{angle} (initially 120)}
+ Sets the upper internal angle of the kite.
+ \end{key}
+
+ \begin{key}{/pgf/kite lower vertex angle=\meta{angle} (initially 60)}
+ Sets the lower internal angle of the kite.
+ \end{key}
+
+ \begin{key}{/pgf/kite vertex angles=\meta{angle specification}}
+ This key sets the keys for both the upper and lower vertex angles (it
+ stores no value itself). \meta{angle specification} can be pair of
+ angles in the form \meta{upper angle} |and| \meta{lower angle}, or a
+ single angle. In this latter case, both the upper and lower vertex
+ angles will be the same.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={kite, draw}]
+ \node[kite upper vertex angle=135, kite lower vertex angle=70] at (0,0) {A};
+ \node[kite vertex angles=90 and 45] at (1,0) {B};
+ \node[kite vertex angles=60] at (2,0) {C};
+\end{tikzpicture}
+\end{codeexample}
+
+ The anchors for the |kite| are shown below. Anchor |110| is an example of a
+ border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=kite, shape example, inner sep=1.5cm]
+ {Kite\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {upper vertex/above, left vertex/above, lower vertex/below,
+ right vertex/above, upper left side/above, upper right side/above,
+ lower left side/below, lower right side/below,
+ center/above, text/left, mid/right, base/below,
+ mid west/left, base west/below, mid east/right, base east/below,
+ west/above, east/above, north/below, south/above,
+ north west/left, north east/right,
+ south west/above, south east/above, 110/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{dart}
+ This shape is a dart (which can also be known as an arrowhead or concave
+ kite). This shape supports the rotation of the shape border, as described
+ in Section~\ref{section-rotating-shape-borders}. The angle of the border
+ rotation determines the direction in which the dart points (unless other
+ transformations have been applied).
+
+ There are \pgfname{} keys to set the angle for the `tip' of the dart and
+ the angle between the `tails' of the dart. To use these keys in \tikzname,
+ simply remove the \declare{|/pgf/|} path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[dart, draw, gray, shape border uses incircle, shape border rotate=45]
+ (d) {dart};
+ \draw [<->] (d.tip)++(202.5:.5cm) arc(202.5:247.5:.5cm);
+ \node [left=.5cm] at (d.tip) {tip angle};
+ \draw [<->] (d.tail center)++(157.5:.5cm) arc(157.5:292.5:.5cm);
+ \node [right] at (d.tail center) {tail angle};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/pgf/dart tip angle=\meta{angle} (initially 45)}
+ Sets the angle at the tip of the dart.
+ \end{key}
+
+ \begin{key}{/pgf/dart tail angle=\meta{angle} (initially 135)}
+ Sets the angle between the tails of the dart.
+ \end{key}
+
+ The anchors for the |dart| shape are shown below (note that the shape is
+ rotated 90 degrees anti-clockwise). Anchor |110| is an example of a border
+ anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=dart, shape border rotate=90, shape example, inner sep=1.25cm]
+ {Dart\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {tip/above, tail center/below, right tail/below,
+ left tail/below, right tail/below, left side/left, right side/right,
+ center/above, text/left, mid/right, base/below,
+ mid west/left, base west/below, mid east/right, base east/below,
+ west/above, east/above, north/below, south/above,
+ north west/left, north east/right, south west/above, south east/above,
+ 110/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{circular sector}
+ This shape is a circular sector (which can also be known as a wedge). This
+ shape supports the rotation of the shape border, as described in
+ Section~\ref{section-rotating-shape-borders}. The angle of the border
+ rotation determines the direction in which the `apex' of the sector points
+ (unless other transformations have been applied).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ every node/.style={circular sector, shape border uses incircle, draw},
+]
+ \node at (0,0) {A};
+ \node [shape border rotate=30] at (1.5,0) {A};
+\end{tikzpicture}
+\end{codeexample}
+
+ There is a \pgfname{} key to set the central angle of the sector, which is
+ expected to be less than 180 degrees. To use this key in \tikzname, simply
+ remove the \declare{|/pgf/|} path.
+
+ \begin{key}{/pgf/circular sector angle=\meta{angle} (initially 60)}
+ Sets the central angle of the sector.
+ \end{key}
+
+ The anchors for the circular sector shape are shown below. Anchor |30| is
+ an example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=circular sector, style=shape example, inner sep=1cm]
+ {Circular Sector\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {sector center/above, arc start/below, arc end/below, arc center/below,
+ center/above, base/below, mid/right, text/below,
+ north/below, south/above, east/below, west/above,
+ north west/above left, north east/above right,
+ south west/below, south east/below, 30/right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{cylinder}
+ This shape is a 2-dimensional representation of a cylinder, which supports
+ the rotation of the shape border as described in
+ Section~\ref{section-rotating-shape-borders}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[cylinder, draw, shape aspect=.5] {ABC};
+\end{tikzpicture}
+\end{codeexample}
+
+ Regardless the rotation of the shape border, the height is always the
+ distance between the curved ends, and the width is always the distance
+ between the straight sides.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth]
+ \node [cylinder, gray!50, rotate=30, draw,
+ minimum height=2cm, minimum width=1cm] (c) {Cylinder};
+ \draw[red, <->] (c.top) -- (c.bottom)
+ node [at end, below, black] {height};
+ \draw[red, <->] (c.north) -- (c.south)
+ node [at start, above, black] {width};
+\end{tikzpicture}
+\end{codeexample}
+
+ Enlarging the shape to some minimum height will stretch only the body of
+ the cylinder. By contrast, enlarging the shape to some minimum width will
+ stretch the curved ends.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[shape aspect=.5]
+ \tikzset{every node/.style={cylinder, shape border rotate=90, draw}}
+ \node [minimum height=1.5cm] {A};
+ \node [minimum width=1.5cm] at (1.5,0) {B};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are various keys to customize this shape (to use \pgfname{} keys in
+ \tikzname{}, simply remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/aspect=\meta{value} (initially 1.0)}
+ The aspect is a recommendation for the quotient of the radii of the
+ cylinder end. This may be ignored if the shape is enlarged to some
+ minimum width.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[]
+ \tikzset{every node/.style={cylinder, shape border rotate=90, draw}}
+ \node [aspect=1.0] {A};
+ \node [aspect=0.5] at (1,0) {B};
+ \node [aspect=0.25] at (2,0) {C};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/cylinder uses custom fill=\meta{boolean} (default true)}
+ This enables the use of a custom fill for the body and the end of the
+ cylinder. The background path for the shape should not be filled (e.g.,
+ in \tikzname{}, the |fill| option for the node must be implicity or
+ explicitly set to |none|). Internally, this key sets the \TeX-if
+ |\ifpgfcylinderusescustomfill| appropriately.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[aspect=0.5]
+ \node [cylinder, cylinder uses custom fill, cylinder end fill=red!50,
+ cylinder body fill=red!25] {Cylinder};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/pgf/cylinder end fill=\meta{color} (initially white)}
+ Sets the color for the end of the cylinder.
+ \end{key}
+
+ \begin{key}{/pgf/cylinder body fill=\meta{color} (initially white)}
+ Sets the color for the body of the cylinder.
+ \end{key}
+
+ The anchors of this shape are shown below (anchor |160| is an example of a
+ border anchor). Note that the cylinder shape does not distinguish between
+ |outer xsep| and |outer ysep|. Only the larger of the two values is used
+ for the shape. Note also the difference between the |center| and
+ |shape center| anchors: |center| is the center of the cylinder body and
+ also the center of rotation. The |shape center| is the center of the shape
+ which includes the 2-dimensional representation of the cylinder top.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=cylinder, shape example, aspect=.5, inner xsep=3cm,
+ inner ysep=1cm] {Cylinder\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {before top/above, top/above, after top/below,
+ before bottom/below, bottom/above, after bottom/above,
+ mid/right, mid west/right, mid east/left,
+ base/below, base west/below, base east/below,
+ center/above, text/above, shape center/right,
+ west/right, east/left, north/above, south/below,
+ north west/below, north east/above,
+ south west/above, south east/below, 160/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+\subsection{Symbol Shapes}
+
+\begin{pgflibrary}{shapes.symbols}
+ This library defines shapes that can be used for drawing symbols like a
+ forbidden sign or a cloud.
+\end{pgflibrary}
+
+\begin{shape}{correct forbidden sign}
+ This shape places the node inside a circle with a diagonal from the upper
+ left to the lower right added. The circle is part of the background, the
+ diagonal line part of the foreground path; thus, the diagonal line is on
+ top of the text.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [correct forbidden sign,line width=1ex,draw=red,fill=white] {Smoking};
+\end{tikzpicture}
+\end{codeexample}
+
+ The shape inherits all anchors from the |circle| shape.
+\end{shape}
+
+\begin{shape}{forbidden sign}
+ This shape is like |correct forbidden sign|, only the line goes from the
+ lower left to the upper right. The strange naming of these shapes is for
+ historical reasons.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [forbidden sign,line width=1ex,draw=red,fill=white] {Smoking};
+\end{tikzpicture}
+\end{codeexample}
+
+ The shape inherits all anchors from the |circle| shape.
+\end{shape}
+
+\begin{shape}{magnifying glass}
+ This shape places the node inside a circle with a handle attached to the
+ node. The angle of the handle and its length can be adjusted using two
+ keys:
+
+ \begin{key}{/pgf/magnifying glass handle angle fill=\meta{degree} (default -45)}
+ The angle of the handle.
+ \end{key}
+
+ \begin{key}{/pgf/magnifying glass handle angle aspect=\meta{factor} (default 1.5)}
+ The length of the handle as a multiple of the circle radius.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [magnifying glass,line width=1ex,draw] {huge};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The shape inherits all anchors from the |circle| shape.
+\end{shape}
+
+\begin{shape}{cloud}
+ This shape is a cloud, drawn to tightly fit the node contents (strictly
+ speaking, using an ellipse which tightly fits the node contents --
+ including any |inner sep|).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[cloud, draw, fill=gray!20, aspect=2] {ABC};
+ \node[cloud, draw, fill=gray!20] at (1.5,0) {D};
+\end{tikzpicture}
+\end{codeexample}
+
+ A cloud should be thought of as having a number of ``puffs'', which are the
+ individual arcs drawn around the border. There are \pgfname{} keys to
+ specify how the cloud is drawn (to use these keys in \tikzname{}, simply
+ remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/cloud puffs=\meta{integer} (initially 10)}
+ Sets the number of puffs for the cloud.
+ \end{key}
+
+ \begin{key}{/pgf/cloud puff arc=\meta{angle} (initially 135)}
+ Sets the length of the puff arc (in degrees). A shorter arc can produce
+ better looking joins between puffs for larger line widths.
+ \end{key}
+
+ Like the diamond shape, the cloud shape also uses the \declare{|aspect|}
+ key to determine the ratio of the width and the height of the cloud.
+ However, there may be circumstances where it may be undesirable to
+ continually specify the |aspect| for the cloud. Therefore, the following
+ key is implemented:
+
+ \begin{key}{/pgf/cloud ignores aspect=\meta{boolean} (default true)}
+ Instruct \pgfname{} to ignore the |aspect| key. Internally, the \TeX-if
+ |\ifpgfcloudignoresaspect| is set appropriately. The initial value is
+ |false|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[aspect=1, every node/.style={cloud, cloud puffs=11, draw}]
+ \node [fill=gray!20] {rain};
+ \node [cloud ignores aspect, fill=white] at (1.5,0) {snow};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ Any minimum size requirements are applied to the ``circum-ellipse'', which
+ is the ellipse which passes through all the midpoints of the puff arcs.
+ These requirements are considered \emph{after} any aspect specification is
+ applied.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw [blue, dashed] (1.5, 1) ellipse (1.5cm and 1cm);
+ \node [cloud, cloud puffs=9, draw, minimum width=3cm, minimum height=2cm]
+ at (1.5, 1) {};
+\end{tikzpicture}
+\end{codeexample}
+
+ The anchors for the cloud shape are shown below for a cloud with eleven
+ puffs. Anchor 70 is an example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=cloud, style=shape example, cloud puffs=11, aspect=1.5,
+ cloud puff arc=120,inner ysep=1cm] {Cloud\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {puff 1/above, puff 2/above, puff 3/above, puff 4/below,
+ puff 5/left, puff 6/below, puff 7/below, puff 8/right,
+ puff 9/below, puff 10/above, puff 11/above, 70/right,
+ center/above, base/below, mid/right, text/left,
+ north/below, south/below, east/above, west/above,
+ north west/left, north east/right,
+ south west/below, south east/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{starburst}
+ This shape is a randomly generated elliptical star, which supports the
+ rotation of the shape border as described in
+ Section~\ref{section-rotating-shape-borders}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[starburst, fill=yellow, draw=red, line width=2pt] {\bf BANG!};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Like the |star| shape, the starburst should be thought of as having a set
+ of inner points and outer points. The inner points lie on the ellipse which
+ tightly fits the node contents (including any |inner sep|).
+
+ Using a specified `starburst point height' value, the outer points are
+ generated randomly between this value and one quarter of this value. For a
+ given starburst shape, the angle between each point is fixed, and is
+ determined by the number of points specified for the starburst.
+
+ It is important to note that, whilst the maximum possible point height is
+ used to calculate minimum width or height requirements, the outer points
+ are randomly generated, so there is (unfortunately) no guarantee that any
+ such requirements will be fully met.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] grid(3,2);
+ \node[starburst, draw, minimum width=3cm, minimum height=2cm]
+ at (1.5, 1) {\bf BOOM!};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are \pgfname{} keys to control the drawing of the starburst shape. To
+ use these keys in \tikzname, simply remove the \declare{|/pgf/|} path.
+
+ \begin{key}{/pgf/starburst points=\meta{integer} (initially 17)}
+ Sets the number of outer points for the starburst.
+ \end{key}
+ %
+ \begin{key}{/pgf/starburst point height=\meta{length} (initially .5cm)}
+ Sets the \emph{maximum} distance between the inner point radius and the
+ outer point radius.
+ \end{key}
+
+ \begin{key}{/pgf/random starburst=\meta{integer} (initially 100)}
+ Sets the seed for the random number generator for creating the
+ starburst. The maximum value for \meta{integer} is |16383|. If
+ \meta{integer}|=0|, the random number generator will not be used, and
+ the maximum point height will be used for all outer points. If
+ \meta{integer} is omitted, a seed will be randomly chosen.
+ \end{key}
+
+ The basic anchors for a nine point |starburst| shape are shown below.
+ Anchor |80| is an example of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=starburst, starburst points=9, starburst point height=3.5cm,
+ style=shape example,inner sep=1cm]
+ {Starburst\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {outer point 1/above, outer point 2/above, outer point 3/right,
+ outer point 4/above, outer point 5/below, outer point 6/above,
+ outer point 7/left, outer point 8/above, outer point 9/above,
+ inner point 1/below, inner point 2/above, inner point 3/left,
+ inner point 4/above, inner point 5/above, inner point 6/above,
+ inner point 7/below, inner point 8/above, inner point 9/below,
+ center/above, text/left, mid/right, base/below, 80/above,
+ north/below, south/below, east/left, west/right,
+ north east/below, south west/below, south east/below, north west/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{signal}
+ This shape is a ``signal'' or sign shape, that is, a rectangle, with
+ optionally pointed sides. A signal can point ``to'' somewhere, with outward
+ points in that direction. It can also be ``from'' somewhere, with inward
+ points from that direction. The resulting points extend the node contents
+ (which include the |inner sep|).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every node/.style={signal, draw, text=white, signal to=nowhere}]
+ \node[fill=green!65!black, signal to=east] at (0,1) {To East};
+ \node[fill=red!65!black, signal from=east] at (0,0) {From East};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are \pgfname{} keys for drawing the signal shape (to use these keys
+ in \tikzname{}, simply remove the \declare{|/pgf/|} path):
+
+ \begin{key}{/pgf/signal pointer angle=\meta{angle} (initially 90)}
+ Sets the angle for the pointed sides of the shape. This angle is
+ maintained when enforcing any minimum size requirements, so
+ any adjustment to the width will affect the height, and vice versa.
+ \end{key}
+
+ \begin{key}{/pgf/signal from=\meta{direction}\space\opt{and \meta{opposite direction}} (initially nowhere)}
+ Sets which sides take an inward pointer (i.e., that points towards the
+ center of the shape). The possible values for \meta{direction} and
+ \meta{opposite direction} are the compass point directions |north|,
+ |south|, |east| and |west| (or |above|, |below|, |right| and |left|).
+ An additional keyword |nowhere| can be used to reset the sides so they
+ have no pointers. When used with |signal from| key, this only resets
+ inward pointers; used with the |signal to| key, it only resets outward
+ pointers.
+ \end{key}
+
+ \begin{key}{/pgf/signal to=\meta{direction}\space\opt{and \meta{opposite direction}} (initially east)}
+ Sets which sides take an outward pointer (i.e., that points away from
+ the shape).
+ \end{key}
+
+ Note that \pgfname{} will ignore any instruction to use directions that are
+ not opposites (so using the value |east and north|, will result in only
+ |north| being assigned a pointer). This is also the case if non-opposite
+ values are used in the |signal to| and |signal from| keys at the same time.
+ So, for example, it is not possible for a signal to have an outward point
+ to the left, and also have an inward point from below.
+
+ The anchors for the signal shape are shown below. Anchor |70| is an example
+ of a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=signal, signal from=west, shape example, inner sep=2cm]
+ {Signal\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {text/left, center/above, 70/above,
+ base/below, base east/below, base west/below,
+ mid/right, mid east/above left, mid west/above left,
+ north/above, south/below,
+ east/above, west/above,
+ north west/above, north east/above,
+ south west/below, south east/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{tape}
+ This shape is a rectangle with optional, ``bendy'' top and bottom sides,
+ which tightly fits the node contents (including the |inner sep|).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[tape, draw]{ABCD};
+ \node[tape, draw, tape bend top=none] at (1.5, 0) {EFGH};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are \pgfname{} keys to specify which sides bend and how high the
+ bends are (to use these keys in \tikzname{}, simply remove the
+ \declare{|/pgf/|} path):
+
+ \begin{key}{/pgf/tape bend top=\meta{bend style} (initially in and out)}
+ Specifies how the top side bends. The \meta{bend style} is either
+ |in and out|, |out and in| or |none| (i.e., a straight line). The
+ bending sides are drawn in a clockwise direction, and using the bend
+ style |in and out| will mean the side will first bend inwards and then
+ bend outwards. The opposite holds true for |out and in|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[-stealth]
+ \node[tape, draw, gray, minimum width=2cm](t){Tape};
+ \draw [blue]([yshift=5pt] t.north west) -- ([yshift=5pt]t.north east)
+ node[midway, above, black]{in and out};
+ \draw [blue]([yshift=-5pt]t.south east) -- ([yshift=-5pt]t.south west)
+ node[sloped, allow upside down, midway, above, black]{in and out};
+\end{tikzpicture}
+\end{codeexample}
+
+ This might take a bit of getting used to, but just remember that when
+ you want the bendy sides to be parallel, the sides take the same bend
+ style. It is possible for the top and bottom sides to take opposite
+ bend styles, but the author of this shape cannot think of a single use
+ for such a combination.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={tape, draw}]
+ \node [tape bend top=out and in, tape bend bottom=out and in] {Parallel};
+ \node at (2,0) [tape bend bottom=out and in] {Why?};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/tape bend bottom=\meta{bend style} (initially in and out)}
+ Specifies how the bottom side bends.
+ \end{key}%
+
+ \begin{key}{/pgf/tape bend height=\meta{length} (initially 5pt)}
+ Sets the total height for a side with a bend.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth]
+ \draw [help lines] grid(3,2);
+ \node [tape, fill, minimum size=2cm, red!50, tape bend top=none,
+ tape bend height=1cm] at (1.5,1.5) (t) {};
+ \draw [|<->|, blue] (1.5,0) -- (1.5,1)
+ node [at end, above, black]{tape bend height};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for the tape shape are shown below. Anchor |60| is an example
+ of a border anchor. Note that border anchors will snap to the center of
+ convex curves (i.e.\ when bending in).
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=tape, tape bend height=1cm, shape example, inner xsep=3cm]
+ {Tape\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {text/left, center/above, 60/above,
+ base/below, base east/below, base west/below,
+ mid/right, mid east/left, mid west/right,
+ north/above, south/below, east/above, west/above,
+ north west/above, north east/above,
+ south west/below, south east/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{magnetic tape}
+ This shape represents a `magnetic tape' or any sequential data store that
+ is sometimes used in flowcharts. It is essentially a circle with a little
+ tail:
+ %
+\begin{codeexample}[]
+\tikz\node [magnetic tape, draw] (A) {A};
+\end{codeexample}
+
+ The following keys can be used to customise the |magnetic tape| shape:
+
+ \begin{key}{/pgf/magnetic tape tail extend=\meta{distance} (initially 0cm)}
+ This key sets how far the tail extends beyond the radius of the tape.
+ Negative values will be ignored.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={magnetic tape, draw}]
+ \node [magnetic tape tail extend=0cm] at (0,0) {A};
+ \node [magnetic tape tail extend=0.25cm] at (0,1) {B};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/magnetic tape tail=\meta{proportion} (initially 0.15)}
+ This key sets the thickness of the `tail' to be \meta{proportion} times
+ the radius of the shape. The \meta{proportion} should be between |0.0|
+ and |1.0|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={magnetic tape, draw}]
+ \node [magnetic tape tail=0.5, magnetic tape tail extend=0.5cm] {A};
+ \node [magnetic tape tail=0.25] at (0,1) {B};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The following figure shows the anchors this shape defines; the anchors 10
+ and 130 are example of border anchors.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+\node[name=s,shape=magnetic tape,shape example,inner sep=0.75cm,
+magnetic tape tail extend=0.5cm]
+ {Magnetic Tape\vrule width 1pt height 2cm};
+\foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/above, east/right,
+ mid west/right, mid/right, mid east/left,
+ base west/below, base/below, base east/right,
+ south west/below left, south/below, south east/left,
+ text/left, 10/right, 130/above,
+ tail east/right, tail south east/below, tail north east/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+\subsection{Arrow Shapes}
+
+\begin{pgflibrary}{shapes.arrows}
+ This library defines arrow shapes. Note that an arrow shape is something
+ quite different from a (normal) arrow tip: It is a shape that just
+ ``happens'' to ``look like'' an arrow. In particular, you cannot use these
+ shapes as arrow tips.
+\end{pgflibrary}
+
+\begin{shape}{single arrow}
+ This shape is an arrow, which tightly fits the node contents (including any
+ |inner sep|). This shape supports the rotation of the shape border, as
+ described in Section~\ref{section-rotating-shape-borders}. The angle of
+ rotation determines in which direction the arrow points (provided no other
+ rotational transformations are applied).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={single arrow, draw},
+ rotate border/.style={shape border uses incircle, shape border rotate=#1}]
+ \node {right};
+ \node at (2,0) [shape border rotate=90]{up};
+ \node at (1,1) [rotate border=37, inner sep=0pt]{$37^\circ$};
+\end{tikzpicture}
+\end{codeexample}
+
+ Regardless of the rotation of the arrow border, the width is measured
+ between the back ends of the arrow head, and the height is measured from
+ the arrow tip to the end of the arrow tail.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth,
+ rotate border/.style={shape border uses incircle, shape border rotate=#1}]
+ \node[rotate border=-30, fill=gray!25, minimum height=3cm, single arrow,
+ single arrow head extend=.5cm, single arrow head indent=.25cm] (arrow) {};
+ \draw[red, <->] (arrow.before tip) -- (arrow.after tip)
+ node [near end, left, black] {width};
+ \draw[red, <->] (arrow.tip) -- (arrow.tail)
+ node [near end, below left, black] {height};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are \pgfname{} keys that can be used to customize this shape (to use
+ these keys in \tikzname{}, simply remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/single arrow tip angle=\meta{angle} (initially 90)}
+ Sets the angle for the arrow tip. Enlarging the arrow to some minimum
+ width may increase the height of the shape to maintain this angle.
+ \end{key}
+
+ \begin{key}{/pgf/single arrow head extend=\meta{length} (initially .5cm)}
+ This sets the distance between the tail of the arrow and the outer end
+ of the arrow head. This may change if the shape is enlarged to some
+ minimum width.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[single arrow, draw, single arrow head extend=.5cm, gray!50, rotate=60]
+ (a) {Arrow};
+ \draw[red, |<->|] (a.before tip) -- (a.before head)
+ node [midway, below, sloped, black] {head extend};
+\end{tikzpicture}
+\end{codeexample}
+\end{key}
+
+ \begin{key}{/pgf/single arrow head indent=\meta{length} (initially 0cm)}
+ This moves the point where the arrow head joins the shaft of the arrow
+ \emph{towards} the arrow tip, by \meta{length}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={single arrow, draw=none, rotate=60}]
+ \node [fill=red!50] {arrow 1};
+ \node [fill=blue!50, single arrow head indent=1ex] at (1.5,0) {arrow 2};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for this shape are shown below (anchor |20| is an example of a
+ border anchor).
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=single arrow, shape example, single arrow head extend=1.5cm]
+ {Single Arrow\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {text/above, center/above, 20/above,
+ mid west/left, mid/above, mid east/above left,
+ base west/below, base/below, base east/below,
+ tip/above, before tip/above, after tip/below, before head/above,
+ after head/below, after tail/above, before tail/below, tail/right,
+ north/above, south/below, east/below, west/above,
+ north west/above, north east/below, south west/below, south east/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{double arrow}
+ This shape is a double arrow, which tightly fits the node contents
+ (including any |inner sep|), and supports the rotation of the shape border,
+ as described in Section~\ref{section-rotating-shape-borders}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={double arrow, draw}]
+ \node [double arrow, draw] {Left or Right};
+\end{tikzpicture}
+\end{codeexample}
+
+ The double arrow behaves exactly like the single arrow, so you need to
+ remember that the width is \emph{always} the distance between the back ends
+ of the arrow heads, and the height is \emph{always} the tip-to-tip
+ distance.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth,
+ rotate border/.style={shape border uses incircle, shape border rotate=#1}]
+ \node[rotate border=210, fill=gray!25, minimum height=3cm, double arrow,
+ double arrow head extend=.5cm, double arrow head indent=.25cm] (arrow) {};
+ \draw[red, <->] (arrow.before tip 1) -- (arrow.after tip 1)
+ node [near start, right, black] {width};
+ \draw[red, <->] (arrow.tip 1) -- (arrow.tip 2)
+ node [near end, above left, black] {height};
+\end{tikzpicture}
+\end{codeexample}
+
+ The \pgfname{} keys that can be used to customize the double arrow behave
+ similarly to the keys for the single arrow (to use these keys in
+ \tikzname{}, simply remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/double arrow tip angle=\meta{angle} (initially 90)}
+ Sets the angle for the arrow tip. Enlarging the arrow to some minimum
+ width may increase the height of the shape to maintain this angle.
+ \end{key}
+
+ \begin{key}{/pgf/double arrow head extend=\meta{length} (initially .5cm)}
+ This sets the distance between the shaft of the arrow and the outer end
+ of the arrow heads. This may change if the shape is enlarged to some
+ minimum width.
+ \end{key}
+
+ \begin{key}{/pgf/double arrow head indent=\meta{length} (initially 0cm)}
+ This moves the point where the arrow heads join the shaft of the arrow
+ \emph{towards} the arrow tips, by \meta{length}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={double arrow, draw=none, rotate=-60}]
+ \node [fill=red!50] {arrow 1};
+ \node [fill=blue!50, double arrow head indent=1ex] at (1.5,0) {arrow 2};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for this shape are shown below (anchor |20| is an example of a
+ border anchor).
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=double arrow, double arrow head extend=1.5cm, shape example, inner xsep=2cm]
+ {Double Arrow\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {text/above, center/above, 20/above,
+ mid west/above right, mid/above, mid east/above left,
+ base west/below, base/below, base east/below,
+ before head 1/above, before tip 1/above, tip 1/above, after tip 1/below, after head 1/below,
+ before head 2/above, before tip 2/below, tip 2/above, after tip 2/above, after head 2/below,
+ north/above, south/below, east/below, west/below,
+ north west/below, north east/below, south west/above, south east/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{arrow box}
+ This shape is a rectangle with optional arrows which extend from the four
+ sides.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[arrow box, draw] {A};
+ \node[arrow box, draw, arrow box arrows={north:.5cm, west:0.75cm}]
+ at (2,0) {B};
+\end{tikzpicture}
+\end{codeexample}
+
+ Any minimum size requirements are applied to the main rectangle
+ \emph{only}. This does not pose too many problems if you wish to
+ accommodate the length of the arrows, as it is possible to specify the
+ length of each arrow independently, from either the border of the rectangle
+ (the default) or the center of the rectangle.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \tikzset{box/.style={arrow box, fill=#1}}
+ \draw [help lines] grid(3,2);
+ \node[box=blue!50, arrow box arrows={east:2cm}] at (1,1.5){One};
+ \node[box=red!50, arrow box arrows={east:2cm from center}] at (1,0.5){Two};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are various \pgfname{} keys for drawing this shape (to use these keys
+ in \tikzname, simply remove the \declare{/pgf/} path).
+
+\begin{key}{/pgf/arrow box tip angle=\meta{angle} (initially 90)}
+ Sets the angle at the arrow tip for all four arrows.
+\end{key}
+
+\begin{key}{/pgf/arrow box head extend=\meta{length} (initially .125cm)}
+ Sets the distance the arrow head extends away from the shaft of the arrow.
+ This applies to all arrows.
+\end{key}
+
+\begin{key}{/pgf/arrow box head indent=\meta{length} (initially 0cm)}
+ Moves the point where the arrow head joins the shaft of the arrow
+ \emph{towards} the arrow tip. This applies to all arrows.
+\end{key}
+
+\begin{key}{/pgf/arrow box shaft width=\meta{length} (initially .125cm)}
+ Sets the width of the shaft of all arrows.
+\end{key}
+
+\begin{key}{/pgf/arrow box north arrow=\meta{distance} (initially .5cm)}
+ Sets the distance the north arrow extends from the node. By default this is
+ from the border of the shape, but by using the additional keyword
+ |from center|, the distance will be measured from the center of the shape.
+ If \meta{distance} is |0pt| or a negative distance, the arrow will not be
+ drawn.
+\end{key}
+
+\begin{key}{/pgf/arrow box south arrow=\meta{distance} (initially .5cm)}
+ Sets the distance the south arrow extends from the node.
+\end{key}
+
+\begin{key}{/pgf/arrow box east arrow=\meta{distance} (initially .5cm)}
+ Sets the distance the east arrow extends from the node.
+\end{key}
+
+\begin{key}{/pgf/arrow box west arrow=\meta{distance} (initially .5cm)}
+ Sets the distance the west arrow extends from the node.
+\end{key}
+
+\begin{key}{/pgf/arrow box arrows={\ttfamily\char`\{}\meta{list}{\ttfamily\char`\}}}
+ Sets the distance that all arrows extend from the node. The specification
+ in \meta{list} consists of the four compass points |north|, |south|, |east|
+ or |west|, separated by commas (so the list must be contained within
+ braces). The distances can be specified after each side separated by a
+ colon (e.g., |north:1cm|, or |west:5cm from center|). If an item specifies
+ no distance, the most recently specified distance will be used (at the
+ start of the list this is |0cm|, so the first item in the list should
+ specify a distance). Any sides not specified will not be drawn with an
+ arrow.
+\end{key}
+
+The anchors for this shape are shown below (unfortunately, due to its size,
+this example must be rotated). Anchor |75| is an example of a border anchor. If
+a side is drawn without an arrow, the anchors for that arrow should be
+considered unavailable. They are (unavoidably) defined, but default to the
+center of the appropriate side.
+%
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[shape=arrow box, shape example, inner xsep=1cm, inner ysep=1.5cm, arrow box shaft width=2cm,
+ arrow box arrows={north:3.5cm from border, south, east:5cm from border, west},
+ arrow box head extend=0.75cm, rotate=-90](s) {Arrow Box\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {center/above, text/above, mid/right, base/below, 75/above,
+ mid east/right, mid west/left, base east/right, base west/left,
+ north/below, south/below, east/below, west/below,
+ north east/above, south east/above, south west/below, north west/below,
+ north arrow tip/above,south arrow tip/above, east arrow tip/above, west arrow tip/above,
+ before north arrow/above, before north arrow head/below left, before north arrow tip/above left,
+ after north arrow tip/above right, after north arrow head/below right, after north arrow/below,
+ before south arrow/below, before south arrow head/above right, before south arrow tip/below right,
+ after south arrow tip/below left, after south arrow head/above left, after south arrow/above,
+ before east arrow/above, before east arrow head/above right, before east arrow tip/above,
+ after east arrow tip/below, after east arrow head/below right, after east arrow/below,
+ before west arrow/below, before west arrow head/below left, before west arrow tip/below,
+ after west arrow tip/above, after west arrow head/above left, after west arrow/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement, rotate=-90] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+%
+\end{shape}
+
+
+\subsection{Shapes with Multiple Text Parts}
+
+\begin{pgflibrary}{shapes.multipart}
+ This library defines general-purpose shapes that are composed of multiple
+ (text) parts.
+\end{pgflibrary}
+
+
+\begin{shape}{circle split}
+ This shape is a multi-part shape consisting of a circle with a line in the
+ middle. The upper part is the main part (the |text| part), the lower part
+ is the |lower| part.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circle split,draw,double,fill=red!20]
+ {
+ $q_1$
+ \nodepart{lower}
+ $00$
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ The shape inherits all anchors from the |circle| shape and defines the
+ |lower| anchor in addition. See also the following figure:
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=circle split,shape example] {text\nodepart{lower}lower};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/below, east/right,
+ mid west/right, mid/above, mid east/left,
+ base west/left, base/below, base east/right,
+ south west/below left, south/below, south east/below right,
+ text/left, lower/left, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{circle solidus}
+ This shape (due to Manuel Lacruz) is similar to the split circle, but the
+ two text parts are arranged diagonally.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circle solidus,draw,double,fill=red!20]
+ {
+ $q_1$
+ \nodepart{lower}
+ $00$
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=circle solidus,shape example,inner xsep=1cm] {text\nodepart{lower}lower};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/below, east/right,
+ mid west/right, mid/above, mid east/left,
+ base west/left, base/below, base east/right,
+ south west/below left, south/below, south east/below right,
+ text/left, lower/left, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{ellipse split}
+ This shape is a multi-part shape consisting of an ellipse with a line in
+ the middle. The upper part is the main part (the |text| part), the lower
+ part is the |lower| part. The anchors for this shape are shown below.
+ Anchor |60| is a border anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=ellipse split,shape example] {text\nodepart{lower}lower};
+ \foreach \anchor/\placement in
+ {center/below, text/left, lower/left, 60/above right,
+ mid/above, mid east/above, mid west/above,
+ base/right, base east/left, base west/right,
+ north/above, south/below, east/below, west/below,
+ north east/above, south east/below, south west/below, north west/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{rectangle split}
+ This shape is a rectangle which can be split either horizontally or
+ vertically into several parts.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[my shape/.style={
+ rectangle split, rectangle split parts=#1, draw, anchor=center}]
+ \node [my shape=5] at (0,1)
+ {a\nodepart{two}b\nodepart{three}c\nodepart{four}d\nodepart{five}e};
+ \node [my shape=5, rectangle split horizontal] at (2,2)
+ {1\nodepart{two}2\nodepart{three}3\nodepart{four}4\nodepart{five}5};
+ \node [my shape=3] at (3,0.5)
+ {A\nodepart{two}B\nodepart{three}C};
+ \node [my shape=4, rectangle split horizontal] at (1.5,0.5)
+ {1\nodepart{two}2\nodepart{three}3\nodepart{four}4};
+\end{tikzpicture}
+\end{codeexample}
+
+ The shape can be split into a maximum of twenty parts. However, to avoid
+ allocating a lot of unnecessary boxes, \pgfname{} only allocates four boxes
+ by default. To use the |rectangle| |split| shape with more than four boxes,
+ the extra boxes must be allocated manually in advance (perhaps using
+ |\newbox| or |\let|). The boxes take the form
+ |\pgfnodepart|\meta{number}|box|, where \meta{number} is from the cardinal
+ numbers |one|, |two|, |three|, \ldots{} and so on. |\pgfnodepartonebox| is
+ special in that it is synonymous with |\pgfnodeparttextbox|. For
+ compatibility with earlier versions of this shape, the boxes
+ |\pgfnodeparttwobox|, |\pgfnodepartthreebox| and |\pgfnodepartfourbox|, can
+ be referred to using the ordinal numbers: |\pgfnodepartsecondbox|,
+ |\pgfnodepartthirdbox| and |\pgfnodepartfourthbox|. In order to facilitate
+ the allocation of these extra boxes, the following key is provided:
+
+ \begin{key}{/pgf/rectangle split allocate boxes=\meta{number}}
+ This key checks if \meta{number} boxes have been allocated, and if not,
+ it allocates the required boxes using |\newbox| (some ``magic'' is
+ performed to get around the fact that |\newbox| is declared |\outer| in
+ plain \TeX).
+ \end{key}
+
+ When split vertically, the rectangle split will meet any |minimum width|
+ requirements, but any |minimum height| will be ignored. Conversely when
+ split horizontally, |minimum height| requirements will be met, but any
+ |minimum width| will be ignored. In addition, |inner sep| is applied to
+ every part that is used, so it cannot be specified independently for a
+ particular part.
+
+ There are several \pgfname{} keys to specify how the shape is drawn. To use
+ these keys in \tikzname, simply remove the \declare{|/pgf/|} path:
+
+ \begin{key}{/pgf/rectangle split parts=\meta{number} (initially 4)}
+ Split the rectangle into \meta{number} parts, which should be in the
+ range |1| to |20|. If more than four parts are needed, the boxes should
+ be allocated in advance as described above.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every text node part/.style={align=center}]
+ \node[rectangle split, rectangle split parts=3, draw, text width=2.75cm]
+ {Student
+ \nodepart{two}
+ age:int \\
+ name:String
+ \nodepart{three}
+ getAge():int \\
+ getName():String};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split horizontal=\opt{\meta{boolean}} (default true)}
+ This key determines whether the rectangle is split horizontally or
+ vertically
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split ignore empty parts=\opt{\meta{boolean}} (default true)}
+ When \meta{boolean} is true, \pgfname{} will ignore any part that is
+ empty \emph{except the text part}. This effectively overrides the
+ |rectangle split parts| key in that, if 3 parts (for example) are
+ specified, but one is empty, only two will be shown.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw, anchor=text, rectangle split,
+ rectangle split parts=3}]
+ \node {text \nodepart{second} \nodepart{third}third};
+ \node [rectangle split ignore empty parts] at (2,0)
+ {text \nodepart{second} \nodepart{third}third};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/rectangle split empty part width=\meta{length} (initially 1ex)}
+ Sets the default width for a node part box if it is empty and empty
+ parts are not ignored.
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split empty part height=\meta{length} (initially 1ex)}
+ Sets the default height for a node part box if it is empty and empty
+ parts are not ignored.
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split empty part depth=\meta{length} (initially 0ex)}
+ Sets the default depth for a node part box if it is empty and empty
+ parts are not ignored.
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split part align={\ttfamily\char`\{}\meta{list}{\ttfamily\char`\}} (initially center)}
+ Sets the alignment of the boxes inside the node parts. Each item in
+ \meta{list} should be separated by commas (so if there is more than one
+ item in \meta{list}, it must be surrounded by braces).
+
+ When the rectangle is split vertically, the entries in \meta{list} must
+ be one of |left|, |right|, or |center|. If \meta{list} has less entries
+ than node parts then the remaining boxes are aligned according to the
+ last entry in the list. Note that this only aligns the boxes in each
+ part and \emph{does not} affect the alignment of the contents of the
+ boxes.
+ %
+\begin{codeexample}[]
+\def\x{one \nodepart{two} 2 \nodepart{three} three \nodepart{four} 4}
+\begin{tikzpicture}[
+ every node/.style={rectangle split, rectangle split parts=4,
+ draw}
+ ]
+ \node[rectangle split part align={center, left, right}] at (0,0) {\x};
+ \node[rectangle split part align={center, left}] at (1.25,0) {\x};
+ \node[rectangle split part align={center}] at (2.5,0) {\x};
+\end{tikzpicture}
+\end{codeexample}
+
+ When the rectangle is split horizontally, the entries in \meta{list}
+ must be one of |top|, |bottom|, |center| or |base|. Note that using the
+ value |base| will only make sense if all the node part boxes are being
+ aligned in this way. This is because the |base| value aligns the boxes
+ in relation to each other, whereas the other values align the boxes in
+ relation to the part of the shape they occupy.
+ %
+\begin{codeexample}[]
+\def\x{\Large w\nodepart{two}x\nodepart{three}\Huge y\nodepart{four}\tiny z}
+\begin{tikzpicture}[
+ every node/.style={rectangle split, rectangle split parts=4,
+ draw, rectangle split horizontal}
+ ]
+ \node[rectangle split part align={center, top, bottom}] at (0,0) {\x};
+ \node[rectangle split part align={center, top}] at (0,-1.25) {\x};
+ \node[rectangle split part align={center}] at (0,-2.5) {\x};
+ \node[rectangle split part align=base] at (0,-3.75) {\x};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split draw splits=\opt{\meta{boolean}} (default true)}
+ Sets whether the line or lines between node parts will be drawn.
+ Internally, this sets the \TeX-if |\ifpgfrectanglesplitdrawsplits|
+ appropriately.
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split use custom fill=\opt{\meta{boolean}} (default true)}
+ This enables the use of a custom fill for each of the node parts
+ (including the area covered by the |inner sep|). The background path
+ for the shape should not be filled (e.g., in \tikzname{}, the |fill|
+ option for the node must be implicity or explicitly set to |none|).
+ Internally, this key sets the \TeX-if
+ |\ifpgfrectanglesplitusecustomfill| appropriately.
+ \end{key}
+
+ \begin{key}{/pgf/rectangle split part fill={\ttfamily\char`\{}\meta{list}{\ttfamily\char`\}} (initially white)}
+ Sets the custom fill color for each node part shape. The items in
+ \meta{list} should be separated by commas (so if there is more than one
+ item in \meta{list}, it must be surrounded by braces). If \meta{list}
+ has less entries than node parts, then the remaining node parts use the
+ color from the last entry in the list. This key will automatically set
+ |/pgf/rectangle split use custom fill|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \tikzset{every node/.style={rectangle split, draw, minimum width=.5cm}}
+ \node[rectangle split part fill={red!50, green!50, blue!50, yellow!50}] {};
+ \node[rectangle split part fill={red!50, green!50, blue!50}] at (0.75,0) {};
+ \node[rectangle split part fill={red!50, green!50}] at (1.5,0) {};
+ \node[rectangle split part fill={red!50}] at (2.25,0) {};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for the |rectangle split| shape split vertically into four, are
+ shown below (anchor |70| is an example of a border angle). When a node part
+ is missing, the anchors prefixed with the name of that node part should be
+ considered unavailable. They are (unavoidably) defined, but default to
+ other anchor positions.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=rectangle split, rectangle split parts=4, shape example,
+ inner ysep=0.75cm]
+ {\nodepart{text}text\nodepart{two}two
+ \nodepart{three}three\nodepart{four}four};
+ \foreach \anchor/\placement in
+ {text/left, text east/above, text west/above,
+ two/left, two east/above, two west/above,
+ three/left, three east/below, three west/below,
+ four/left, four east/below, four west/below,
+ text split/left, text split east/above, text split west/above,
+ two split/left, two split east/above, two split west/above,
+ three split/left, three split east/below, three split west/below,
+ north/above, south/below, east/below, west/below,
+ north west/above, north east/above, south west/below, south east/below,
+ center/above, 70/above, mid/above, base/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+\subsection{Callout Shapes}
+
+\begin{pgflibrary}{shapes.callouts}
+ Producing basic callouts can be done quite easily in \pgfname{} and
+ \tikzname{} by creating a node and then subsequently drawing a path from
+ the border of the node to the required point. This library provides more
+ fancy, `balloon'-style callouts.
+\end{pgflibrary}
+
+Callouts consist of a main shape and a pointer (which is part of the shape)
+which points to something in (or outside) the picture. The position on the
+border of the main shape to which the pointer is connected is determined
+automatically. However, the pointer is ignored when calculating the minimum
+size of the shape, and also when positioning anchors.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture]
+ \node[ellipse callout, draw] (hallo) {Hallo!};
+\end{tikzpicture}
+\end{codeexample}
+
+There are two kinds of pointer: the ``relative'' pointer and the ``absolute''
+pointer. The relative pointer calculates the angle of a specified coordinate
+relative to the center of the main shape, locates the point on the border to
+which this angle corresponds, and then adds the coordinate to this point. This
+seemingly over-complex approach means than you do not have to guess the size of
+the main shape: the relative pointer will always be outside. The absolute
+pointer, on the other hand, is much simpler: it points to the specified
+coordinate absolutely (and can even point to named coordinates in different
+pictures).
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture, note/.style={rectangle callout, fill=#1}]
+ \draw [help lines] grid(3,2);
+ \node [note=red!50, callout relative pointer={(0,1)}] at (3,1) {Relative};
+ \node [note=blue!50, callout absolute pointer={(0,1)}] at (1,0) {Absolute};
+ \node [note=green!50, opacity=.5, overlay,
+ callout absolute pointer={(hallo.south)}] at (1,2) {Outside};
+\end{tikzpicture}
+\end{codeexample}
+
+The following keys are common to all callouts. Please remember that the
+|callout| |relative| |pointer|, and |callout| |absolute| |pointer| keys take a
+different format for their value depending on whether they are being used in
+\pgfname{} or \tikzname{}.
+
+\begin{key}{/pgf/callout relative pointer=\meta{coordinate} (initially {\ttfamily\char`\\pgfpointpolar\char`\{315\char`\}\char`\{.5cm\char`\}})}
+ Sets the vector of the callout pointer `relative' to the callout shape.
+\end{key}
+
+\begin{key}{/pgf/callout absolute pointer=\meta{coordinate}}
+ Sets the vector of the callout pointer absolutely within the picture.
+\end{key}
+
+\begin{key}{/tikz/callout relative pointer=\meta{coordinate} (initially {(315:.5cm)})}
+ The \tikzname{} version of the |callout relative pointer| key. Here,
+ \meta{coordinate} can be specified using the \tikzname{} format for
+ coordinates.
+\end{key}
+
+\begin{key}{/tikz/callout absolute pointer=\meta{coordinate}}
+ The \tikzname{} version of the |callout absolute pointer| key. Here,
+ \meta{coordinate} can be specified using the \tikzname{} format for
+ coordinates.
+\end{key}
+
+It is also possible to shorten the pointer by some distance, using the
+following key:
+
+\begin{key}{/pgf/callout pointer shorten=\meta{distance} (initially 0cm)}
+ Moves the callout pointer towards the center of the callout's main shape by
+ \meta{distance}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \tikzset{callout/.style={ellipse callout, callout pointer arc=30,
+ callout absolute pointer={#1}}}
+ \draw (0,0) grid (3,2);
+ \node[callout={(3,1.5)}, fill=red!50] at (0,1.5) {A};
+ \node[callout={(3,.5)}, fill=green!50, callout pointer shorten=1cm]
+ at (0,.5) {B};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{shape}{rectangle callout}
+ This shape is a callout whose main shape is a rectangle, which tightly fits
+ the node contents (including any |inner sep|). It supports the keys
+ described above and also the following key:
+
+ \begin{key}{/pgf/callout pointer width=\meta{length} (initially .25cm)}
+ Sets the width of the pointer at the border of the rectangle.
+ \end{key}
+
+ The anchors for this shape are shown below (anchor |60| is an example of a
+ border anchor). The pointer direction is ignored when placing anchors.
+ Additionally, when using an absolute pointer, the |pointer| anchor should
+ not to be used to used to position the shape as it is calculated whilst the
+ shape is being drawn.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=rectangle callout, callout relative pointer={(1.25cm,-1cm)},
+ callout pointer width=2cm, shape example, inner xsep=2cm, inner ysep=1cm]
+ {Rectangle Callout\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {center/above, text/below, 60/above,
+ mid/right, mid west/left, mid east/right,
+ base/below, base west/below, base east/below,
+ north/above, south/below, east/above, west/above,
+ north west/above, north east/above,
+ south west/below, south east/below,
+ pointer/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{ellipse callout}
+ This shape is a callout whose main shape is an ellipse, which tightly fits
+ the node contents (including any |inner sep|). It uses the
+ |absolute callout pointer|, |relative callout pointer| and
+ |callout pointer shorten| keys, and also the following key:
+
+ \begin{key}{/pgf/callout pointer arc=\meta{angle} (initially 15)}
+ Sets the width of the pointer at the border of the ellipse according to
+ an arc of length \meta{angle}.
+ \end{key}
+
+ The anchors for this shape are shown below (anchor |60| is an example of a
+ border anchor). The pointer direction is ignored when placing anchors and
+ the |pointer| anchor can only be used to position the shape when the
+ relative anchor is specified.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=ellipse callout, callout relative pointer={(1.25cm,-1cm)},
+ callout pointer width=2cm, shape example, inner xsep=1cm, inner ysep=.5cm]
+ {Ellipse Callout\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {center/above, text/below, 60/above,
+ mid/above, mid west/right, mid east/left,
+ base/below, base west/below, base east/below,
+ north/above, south/below, east/above, west/above,
+ north west/above left, north east/above right,
+ south west/below left, south east/below right,
+ pointer/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{cloud callout}
+ This shape is a callout whose main shape is a cloud which fits the node
+ contents. The pointer is segmented, consisting of a series of shrinking
+ ellipses. This callout requires the symbol shape library (for the cloud
+ shape). If this library is not loaded an error will result.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[cloud callout, cloud puffs=15, aspect=2.5, cloud puff arc=120,
+ shading=ball,text=white] {\bf Imagine...};
+\end{tikzpicture}
+\end{codeexample}
+
+ The |cloud callout| supports the |absolute callout pointer|,
+ |relative callout pointer| and |callout pointer shorten| keys, as described
+ above. The main shape can be modified using the same keys as the |cloud|
+ shape. The following keys are also supported:
+
+ \begin{key}{/pgf/callout pointer start size=\meta{value} (initially .2 of callout)}
+ Sets the size of the first segment in the pointer (i.e., the segment
+ nearest the main cloud shape). There are three possible forms for
+ \meta{value}:
+ %
+ \begin{itemize}
+ \item A single dimension (e.g., |5pt|), in which case the first
+ ellipse will have equal diameters of 5pt.
+ \item Two dimensions (e.g., |10pt and 2.5pt|), which sets the $x$
+ and $y$ diameters of the first ellipse.
+ \item A decimal fraction (e.g., |.2 of callout|), in which case the
+ $x$ and $y$ diameters of the first ellipse will be set as
+ fractions of the width and height of the main shape. The
+ keyword |of callout| cannot be omitted.
+ \end{itemize}
+ \end{key}
+
+ \begin{key}{/pgf/callout pointer end size=\meta{value} (initially .1 of callout)}
+ Sets the size of the last ellipse in the pointer.
+ \end{key}
+
+ \begin{key}{/pgf/callout pointer segments=\meta{number} (initially 2)}
+ Sets the number of segments in the pointer. Note that \pgfname{} will
+ happily overlap segments if too many are specified.
+ \end{key}
+
+ The anchors for this shape are shown below (anchor |70| is an example of a
+ border anchor). The pointer direction is ignored when placing anchors and
+ the pointer anchor can only be used to position the shape when the relative
+ anchor is specified. Note that the center of the last segment is drawn at
+ the |pointer| anchor.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s, shape=cloud callout, style=shape example, cloud puffs=11, aspect=1.5,
+ cloud puff arc=120,inner xsep=.5cm, callout pointer start size=.25 of callout,
+ callout pointer end size=.15 of callout, callout relative pointer={(315:4cm)},
+ callout pointer segments=2] {Cloud Callout\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {puff 1/above, puff 2/above, puff 3/above, puff 4/below,
+ puff 5/left, puff 6/below, puff 7/below, puff 8/right,
+ puff 9/below, puff 10/above, puff 11/above, 70/right,
+ center/above, base/below, mid/right, text/left,
+ north/below, south/below, east/above, west/above,
+ north west/left, north east/right,
+ south west/below, south east/below,pointer/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+\subsection{Miscellaneous Shapes}
+
+\begin{pgflibrary}{shapes.misc}
+ This library defines general-purpose shapes that do not fit into the
+ previous categories.
+\end{pgflibrary}
+
+\begin{shape}{cross out}
+ This shape ``crosses out'' the node. Its foreground path are simply two
+ diagonal lines between the corners of the node's bounding box. Here is an
+ example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \node [cross out,draw=red] at (1.5,1) {cross out};
+\end{tikzpicture}
+\end{codeexample}
+
+ A useful application is inside text as in the following example:
+ %
+\begin{codeexample}[]
+Cross \tikz[baseline] \node [cross out,draw,anchor=text] {me}; out!
+\end{codeexample}
+
+ This shape inherits all anchors from the |rectangle| shape, see also the
+ following figure:
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=cross out,shape example] {cross out\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {north west/above left, north/above, north east/above right,
+ west/left, center/above, east/right,
+ mid west/right, mid/above, mid east/left,
+ base west/left, base/below, base east/right,
+ south west/below left, south/below, south east/below right,
+ text/left, 10/right, 130/above}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{strike out}
+ This shape is identical to the |cross out| shape, only its foreground path
+ consists of a single line from the lower left to the upper right.
+ %
+\begin{codeexample}[]
+Strike \tikz[baseline] \node [strike out,draw,anchor=text] {me}; out!
+\end{codeexample}
+
+ See the |cross out| shape for the anchors.
+\end{shape}
+
+\begin{shape}{rounded rectangle}
+ This shape is a rectangle which can have optionally rounded sides.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[rounded rectangle, draw, fill=red!20]{Hallo};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are keys to specify how the sides are rounded (to use these keys in
+ \tikzname, simply remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/rounded rectangle arc length=\meta{angle} (initially 180)}
+ Sets the length of the arcs for the rounded ends. Recommended values
+ for \meta{angle} are between |90| and |180|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix[row sep=5pt, every node/.style={draw, rounded rectangle}]{
+ \node[rounded rectangle arc length=180] {180}; \\
+ \node[rounded rectangle arc length=120] {120}; \\
+ \node[rounded rectangle arc length=90] {90}; \\};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/rounded rectangle west arc=\meta{arc type} (initially convex)}
+ Sets the style of the rounding for the left side. The permitted values
+ for \meta{arc type} are |concave|, |convex|, or |none|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix[row sep=5pt, every node/.style={draw, rounded rectangle}]{
+ \node[rounded rectangle west arc=concave] {Concave}; \\
+ \node[rounded rectangle west arc=convex] {Convex}; \\
+ \node[rounded rectangle left arc=none] {None}; \\};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{stylekey}{/pgf/rounded rectangle left arc=\meta{arc type}}
+ Alternative key for specifying the west arc.
+ \end{stylekey}
+
+ \begin{key}{/pgf/rounded rectangle east arc=\meta{arc type} (initially convex)}
+ Sets the style of the rounding for the east side.
+ \end{key}
+
+ \begin{stylekey}{/pgf/rounded rectangle right arc=\meta{arc type}}
+ Alternative key for specifying the east arc.
+ \end{stylekey}
+
+ The anchors for this shape are shown below (anchor |10| is an example of a
+ border angle). Note that if only one side is rounded, the |center| anchor
+ will not be the precise center of the shape.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=rounded rectangle, shape example, inner xsep=1.5cm, inner ysep=1cm]
+ {Rounded Rectangle\vrule width 1pt height 2cm};
+ \foreach \anchor/\placement in
+ {center/above, text/below, 10/above,
+ mid/above, mid west/right, mid east/left,
+ base/below, base west/below, base east/below,
+ north/above, south/below, east/above, west/above,
+ north west/above left, north east/above right,
+ south west/below left, south east/below right}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+\begin{shape}{chamfered rectangle}
+ This shape is a rectangle with optionally chamfered corners.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[chamfered rectangle, white, fill=red, double=red, draw, very thick]
+ {\bf STOP!};
+\end{tikzpicture}
+\end{codeexample}
+
+ There are \pgfname{} keys to specify how this shape is drawn (to use these
+ keys in \tikzname{} simply remove the \declare{|/pgf/|} path).
+
+ \begin{key}{/pgf/chamfered rectangle angle=\meta{angle} (initially 45)}
+ Sets the angle \emph{from the vertical} for the chamfer.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \tikzset{every node/.style={chamfered rectangle, draw}}
+ \node[chamfered rectangle angle=30] {abc};
+ \node[chamfered rectangle angle=60] at (1.5,0) {123};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/chamfered rectangle xsep=\meta{length} (initially .666ex)}
+ Sets the distance that the chamfer extends horizontally beyond the node
+ contents (which includes the |inner sep|). If \meta{length} is large,
+ such that the top and bottom chamfered edges would cross, then
+ \meta{length} is ignored and the chamfered edges are drawn so that they
+ meet in the middle.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \tikzset{every node/.style={chamfered rectangle, draw}}
+ \node[chamfered rectangle xsep=2pt] {def};
+ \node[chamfered rectangle xsep=2cm] at (1.5,0) {456};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/chamfered rectangle ysep=\meta{length} (initially .666ex)}
+ Sets the distance that the chamfer extends vertically beyond the node
+ contents. If \meta{length} is large, such that the left and right
+ chamfered edges would cross, then \meta{length} is ignored and the
+ chamfered edges are drawn so that they meet in the middle.
+ \end{key}
+
+ \begin{key}{/pgf/chamfered rectangle sep=\meta{length} (initially .666ex)}
+ Sets both the |xsep| and |ysep| simultaneously.
+ \end{key}
+
+ \begin{key}{/pgf/chamfered rectangle corners=\meta{list} (initially chamfer all)}
+ Specifies which corners are chamfered. The corners are identified by
+ their ``compass point'' directions (i.e.\ |north east|, |north west|,
+ |south west|, and |south east|), and must be separated by commas (so if
+ there is more than one corner in the list, it must be surrounded by
+ braces). Any corners not mentioned in \meta{list} are automatically not
+ chamfered. Two additional values |chamfer all| and |chamfer none|, are
+ also permitted.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \tikzset{every node/.style={chamfered rectangle, draw}}
+ \node[chamfered rectangle corners=north west] {ghi};
+ \node[chamfered rectangle corners={north east, south east}] at (1.5,0) {789};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ The anchors for this shape are shown below (anchor |60| is an example of a
+ border angle.
+ %
+\begin{codeexample}[]
+\Huge
+\begin{tikzpicture}
+ \node[name=s,shape=chamfered rectangle, chamfered rectangle sep=1cm,
+ shape example, inner ysep=1cm, inner xsep=.75cm]
+ {Chamfered Rectangle\vrule width1pt height2cm};
+ \foreach \anchor/\placement in
+ {text/right, center/above, 70/above,
+ base/below, base east/left, base west/right,
+ mid/right, mid east/above, mid west/above,
+ north/above, south/below, east/above, west/above,
+ before north east/above, north east/above, after north east/above,
+ before north west/above, north west/above, after north west/above,
+ before south west/below, south west/below, after south west/below,
+ before south east/below, south east/below, after south east/below}
+ \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
+ node[\placement] {\scriptsize\texttt{(s.\anchor)}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{shape}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-spy.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-spy.tex
new file mode 100644
index 0000000000..b20b312e0e
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-spy.tex
@@ -0,0 +1,463 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Spy Library: Magnifying Parts of Pictures}
+\label{section-library-spy}
+
+\begin{tikzlibrary}{spy}
+ The package defines options for creating pictures in which some part of the
+ picture is repeated in another area in a magnified way (as if you were
+ looking through a spyglass, hence the name).
+\end{tikzlibrary}
+
+
+\subsection{Magnifying a Part of a Picture}
+
+The idea behind the |spy| library is to make is easy to create high-density
+pictures in which some important parts are repeated somewhere, but magnified as
+if you were looking through a spyglass:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using outlines={circle, magnification=4, size=2cm, connect spies}]
+
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw [decoration=Koch curve type 1]
+ decorate { decorate{ decorate{ decorate{ (0,0) -- (2,0) }}}};
+
+ \spy [red] on (1.6,0.3)
+ in node [left] at (3.5,-1.25);
+
+ \spy [blue, size=1cm] on (1,1)
+ in node [right] at (0,-1.25);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[spy using overlays={size=12mm}]
+ \draw [decoration=Koch snowflake]
+ decorate { decorate{ decorate{ decorate{ (0,0) -- (2,0) }}}};
+
+ \spy [green,magnification=3] on (0.6,0.1) in node at (-0.3,-1);
+ \spy [blue,magnification=5] on (1,0.5) in node at (1,-1);
+ \spy [red,magnification=10] on (1.6,0.1) in node at (2.3,-1);
+\end{tikzpicture}
+\end{codeexample}
+
+Note that this magnification uses what is called a \emph{canvas transformation}
+in this manual: Everything is magnified, including line width and text.
+
+In order for ``spying'' to work, the picture obviously has to be drawn several
+times: Once at its normal size and then again for each ``magnifying glass''.
+Several keys and commands work in concert to make this possible:
+%
+\begin{itemize}
+ \item You need to make \tikzname\ aware of the fact that a picture (or just
+ a scope) is to be magnified. This is done by adding the special key
+ |spy scope| to a |{scope}| or |{tikzpicture}| (which is also just a
+ scope). Some special keys like |spy using outlines| implicitly set the
+ |spy scope|.
+ \item Inside this scope you may then use the command |\spy|, which is only
+ available inside such scopes (so there is no danger of you
+ inadvertently using this command outside such a scope). This command
+ has a special syntax and will (at some point) create two nodes: One
+ node that shows the magnified picture (called the \emph{spy-in node})
+ and another node showing which part of the original picture is
+ magnified (called the \emph{spy-on} node). The spy-in node is, indeed,
+ a normal node, so it can have any shape or border that you like and you
+ can apply all of \tikzname's advanced features to it. The only
+ difference compared to a normal node is that instead of some ``text''
+ it contains a magnified version of the picture, clipped to the size of
+ the node.
+
+ The |\spy| command does not create the nodes immediately. Rather, the
+ creation of these nodes is postponed till the end of the |spy scope| in
+ which the |\spy| command is used. This is necessary since in order to
+ repeat the whole scope inside the node containing the magnified
+ version, the whole picture needs to be available when this node is
+ created.
+\end{itemize}
+
+A basic question any library for ``magnifying things'' has to address is how
+you specify which part of the picture is to be magnified (the spy-on node) and
+where this magnified part is to be shown (the spy-in node). There are two
+possible ways:
+%
+\begin{enumerate}
+ \item You specify the size and position of the spy-on node. Then the size
+ of the spy-in node is determined by the size of the spy-on node and the
+ magnification factor -- you can still decide where the spy-in node
+ should be placed, but not its size.
+ \item Alternatively, you specify the size and position of the spy-in node.
+ Then, similarly to the first case, the size of the spy-on node is
+ determined implicitly and you can only decide where the spy-on node
+ should be placed, but not its size.
+\end{enumerate}
+
+The |spy| library uses the second method: You specify the size and position of
+the spy-in nodes, the sizes of the spy-on nodes are then computed
+automatically.
+
+
+\subsection{Spy Scopes}
+
+\begin{key}{/tikz/spy scope=\meta{options} (default \normalfont empty)}
+ This option may be used with a |{scope}| or any environment that creates
+ such a scope internally (like |{tikzpicture}|). It has the following
+ effects:
+ %
+ \begin{itemize}
+ \item It resets a number of graphic state parameters, including the
+ color, line style, and others. This is necessary for technical
+ reasons.
+ \item It tells \tikzname\ that the content of the scope should be saved
+ internally in a special box.
+ \item It defines the command |\spy| so that it can be used inside the
+ scope.
+ \item At the end of the scope, the nodes belonging to the |\spy|
+ commands used inside the scope are created.
+ \item The \meta{options} are saved in an internal style. Each time
+ |\spy| is used, these \meta{options} will be used.
+ \item Three keys are defined that provide useful shortcuts:
+ %
+ \begin{key}{/tikz/size=\meta{dimension}}
+ Inside a |spy scope|, this is a shortcut for |minimum size|.
+ \end{key}
+ %
+ \begin{key}{/tikz/height=\meta{dimension}}
+ Inside a |spy scope|, this is a shortcut for |minimum height|.
+ \end{key}
+ %
+ \begin{key}{/tikz/width=\meta{dimension}}
+ Inside a |spy scope|, this is a shortcut for |minimum width|.
+ \end{key}
+ \end{itemize}
+ %
+ It is permissible to nest |spy scopes|. In this case, all |\spy| commands
+ inside the inner |spy scope| only have an effect on material inside the
+ scope, whereas |\spy| commands outside the inner |spy scope| but inside the
+ outer |spy scope| allow you to ``spy on the spy''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using outlines={rectangle, red, magnification=5,
+ size=1.5cm, connect spies}]
+
+ \begin{scope}
+ [spy using outlines={circle, blue,
+ magnification=3, size=1.5cm, connect spies}]
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw [decoration=Koch curve type 1]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy on (1.6,0.3) in node (zoom) [left] at (3.5,-1.25);
+ \end{scope}
+
+ \spy on (zoom.north west) in node [right] at (0,-1.25);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{The Spy Command}
+
+\begin{command}{\spy \opt{\oarg{options}} |on| \meta{coordinate} \texttt{in node} \meta{node options}|;|}
+ This command can only be used inside a |spy scope|. Let us start with the
+ syntax:
+ %
+ \begin{itemize}
+ \item The |\spy| command is not a special case of |\path|. Rather, it
+ has a small parser of its own.
+ \item Following the optional \meta{options}, you must write |on|,
+ followed by a coordinate. This coordinate will be the center of the
+ area that is to be magnified.
+ \item Following the \meta{coordinate}, you must write |in node|
+ followed by some \meta{node options}. The syntax for these options
+ is the same as for a normal |node| path command, such as |[left]|
+ or |(foo) [red] at (bar)|. \emph{However}, \meta{node options} are
+ \emph{not} followed by a curly brace. Rather, the \meta{node
+ options} must directly be followed by a semicolon.
+ \end{itemize}
+ %
+ The effect of this command is the following: The \meta{options},
+ \meta{coordinate}, and \meta{node options} are stored internally till the
+ end of the current |spy scope|. This means that, in particular, you can
+ reference any node inside the |spy scope|, even if it is not yet defined
+ when the |\spy| command is given. At the end of the current |spy scope|,
+ two nodes are created, called the \emph{spy-in node} and the \emph{spy-on
+ node}.
+ %
+ \begin{itemize}
+ \item The \emph{spy-in node} is the node that contains a magnified part
+ of the picture (the node \emph{in} which we see on what we spy).
+ This node is, indeed, a normal \tikzname\ node, so you can use all
+ standard options to style this node. In particular, you can specify
+ a shape or a border color or a drop shadow or whatever. The only
+ thing that is special about this node is that instead of containing
+ some normal text, its ``text'' is the magnified picture.
+
+ To be precise, the picture of the |spy scope| is scaled by a
+ certain factor, specified by the |lens| or |magnification| options
+ discussed below, and is shifted in such a way that the
+ \meta{coordinate} lies at the center of the spy-on node.
+ \item The \emph{spy-on node} is a node that is centered on the
+ \meta{coordinate} and whose size reflects exactly the area shown
+ inside the spy-in node (the node containing \emph{on} what we spy).
+ \end{itemize}
+
+ Let us now go over what happens in detail when the two nodes are
+ created:
+ %
+ \begin{enumerate}
+ \item A scope is started. Two sets of options are used with this scope:
+ First, the options passed to the enclosing |spy scope| and then the
+ \meta{options} (which will, thus, overrule the options of the
+ |spy scope|).
+ \item Then, the spy-on node is created. However, we will first discuss
+ the spy-in node.
+ \item The spy-in node is created after the spy-on node (and, hence,
+ will cover the spy-on node in case they overlap). When this node is
+ created, the \meta{node options} are used in addition to the effect
+ caused by the \meta{options} and the options of the |{spy scope}|.
+ Additionally, the following style is used:
+ %
+ \begin{stylekey}{/tikz/every spy in node}
+ This style is used with every spy-in node.
+ \end{stylekey}
+ %
+ The position of the node (the |at| option) is set to the
+ \meta{coordinate} by default, so that it will cover the
+ to-be-magnified area. You can change this by providing the |at|
+ option yourself:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using outlines={circle, magnification=3, size=1cm}]
+
+ \draw [decoration=Koch curve type 1]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [red] on (1.6,0.3) in node;
+ \spy [blue] on (1,1) in node at (1,-1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ No ``text'' can be specified for the node. Rather, the ``text''
+ shown inside this node is the picture of the current |spy scope|,
+ but canvas-transformed according to the following key:
+ %
+ \begin{key}{/tikz/lens=\meta{options}}
+ The \meta{options} should contain transformation commands like
+ |scale| or |rotate|. These transformations are applied to the
+ picture when it is shown inside the spy-on node.
+ \end{key}
+ %
+ Since the most common transformation is undoubtedly a simple
+ scaling, there is a special style for this:
+ %
+ \begin{key}{/tikz/magnification=\meta{number}}
+ This has the same effect as saying
+ |lens={scale=|\meta{number}|}|.
+ \end{key}
+ %
+ Now, usually the size of a node is determined in such a way that it
+ ``fits'' around the text of the node. For a spy-on node this is not
+ a good approach since the ``text'' of this node would contain ``the
+ whole picture''. Because of this, \tikzname\ acts as if the
+ ``text'' of the node has zero size. You must then use keys like
+ |minimum size| to cause the node to have a certain size. Note that
+ the key |size| is an abbreviation for |minimum size| inside a spy
+ scope.
+
+ You can name the spy-on node in the usual ways. Additionally, the
+ node is (also) always named |tikzspyinnode|. Following the spy
+ scope, you can use this node like any other node:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \begin{scope}
+ [spy using outlines={circle, magnification=3, size=2cm, connect spies}]
+
+ \draw [decoration=Koch curve type 1]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [red] on (1.6,0.3) in node (a) [left] at (3.5,-1.25);
+
+ \spy [blue, size=1cm] on (1,1) in node (b) [right] at (0,-1.25);
+ \end{scope}
+ \draw [ultra thick, green!50!black] (b) -- (a.north west);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \item Once both nodes have been created, the current value of the
+ following key is used to connect them:
+ %
+ \begin{key}{/tikz/spy connection path=\meta{code} (initially \normalfont empty)}
+ The \meta{code} is executed after the spy-on and spy-in nodes
+ have just been created. Inside this \meta{code}, the two nodes
+ can be accessed as |tikzspyinnode| and |tikzspyonnode|. For
+ example, the key |connect spies| sets this command to
+ %
+\begin{codeexample}[code only]
+\draw[thin] (tikzspyonnode) -- (tikzspyinnode);
+\end{codeexample}
+ \end{key}
+ \end{enumerate}
+ %
+ Returning to the creation of the spy-in node: This node is centered on
+ \meta{coordinate} (more precisely, its anchor is set to |center| and the
+ |at| option is set to \meta{coordinate}). Its size and shape are initially
+ determined in the same way as the size and shape of the spy-on node
+ (unless, of course, you explicitly provide a different shape for, say, the
+ spy-on node locally, which is not really a good idea). Then, additionally,
+ the \emph{inverted} transformation done by the |lens| option is applied,
+ resulting in a node whose size and shape exactly corresponds to the area in
+ the picture that is shown in the spy-on node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using outlines={lens={scale=3,rotate=20}, size=2cm, connect spies}]
+
+ \draw [decoration=Koch curve type 1]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [red] on (1.6,0.3) in node at (2.5,-1.25);
+\end{tikzpicture}
+\end{codeexample}
+
+ Like for the spy-in node, a style can be used to format the spy-on node:
+ %
+ \begin{stylekey}{/tikz/every spy on node}
+ This style is used with every spy-on node.
+ \end{stylekey}
+ %
+ The spy-on node is named |tikzspyonnode| (but, as always, this node is only
+ available after the spy scope). If you have multiple spy-on nodes and you
+ would like to access all of them, you need to use the |name| key inside the
+ |every spy on node| style.
+
+ The |inner sep| and |outer sep| of both spy-in and spy-on nodes are set to
+ |0pt|.
+\end{command}
+
+
+\subsection{Predefined Spy Styles}
+
+There are some predefined styles that make using the |spy| library easier. The
+following two styles can be used instead of |spy scope|, they pass their
+\meta{options} directly to |spy scope|. They additionally set up the graphic
+styles to be used for the spy-in nodes and the spy-on nodes in some special
+way.
+
+\begin{key}{/tikz/spy using outlines=\meta{options} (default \normalfont empty)}
+ This key creates a |spy scope| in which the spy-in node is drawn, but not
+ filled, using a thick line; and the spy-on node is drawn, but not filled,
+ using a very thin line.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using outlines={circle, magnification=3, size=1cm, connect spies}]
+
+ \draw [decoration=Koch curve type 1]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [red] on (1.6,0.3) in node at (3,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/spy using overlays=\meta{options} (default \normalfont empty)}
+ This key creates a |spy scope| in which both the spy-in and spy-on nodes
+ are filled, but with the fill opacity set to 20\%.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using overlays={circle, magnification=3, size=1cm, connect spies}]
+
+ \draw [decoration=Koch curve type 1]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [green] on (1.6,0.3) in node at (3,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+The following style is useful for connecting the spy-in and the spy-on nodes:
+
+\begin{key}{/tikz/connect spies}
+ Causes the spy-in and the spy-on nodes to be connected by a thin line.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy using overlays={circle, magnification=3, size=1cm}]
+
+ \draw [decoration=Koch curve type 2]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [green] on (1.6,0.1) in node at (3,1);
+ \spy [red,connect spies] on (0.5,0.4) in node at (1,1.5);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Examples}
+
+Usually, the spy-in node and the spy-on node should have the same shape.
+However, you might also wish to use the |circle| shape for the spy-on node and
+the |magnifying glass| shape for the spy-in node:
+%
+\begin{codeexample}[]
+\tikzset{spy using mag glass/.style={
+ spy scope={
+ every spy on node/.style={
+ circle,
+ fill, fill opacity=0.2, text opacity=1},
+ every spy in node/.style={
+ magnifying glass, circular drop shadow,
+ fill=white, draw, ultra thick, cap=round},
+ #1
+ }}}
+\begin{tikzpicture}[spy using mag glass={magnification=3, size=1cm}]
+ \draw [decoration=Koch curve type 2]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy [green!50!black] on (1.6,0.1) in node at (2.5,-0.5);
+\end{tikzpicture}
+\end{codeexample}
+
+With the magnifying glass, you can also put it ``on top'' of the picture
+itself:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [spy scope={magnification=4, size=1cm},
+ every spy in node/.style={
+ magnifying glass, circular drop shadow,
+ fill=white, draw, ultra thick, cap=round}]
+
+ \draw [decoration=Koch curve type 2]
+ decorate{ decorate{ decorate{ (0,0) -- (2,0) }}};
+
+ \spy on (1.6,0.1) in node;
+\end{tikzpicture}
+\end{codeexample}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-svg-path.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-svg-path.tex
new file mode 100644
index 0000000000..120eb1d9a7
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-svg-path.tex
@@ -0,0 +1,58 @@
+% Copyright 2009 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{SVG-Path Library}
+\label{section-library-svg-path}
+
+\begin{pgflibrary}{svg.path}
+ This library defines a command that allows you to specify a path using the
+ \textsc{svg}-syntax.
+\end{pgflibrary}
+
+\begin{command}{\pgfpathsvg\marg{path}}
+ This command extends the current path by a \meta{path} given in the
+ \textsc{svg}-path-data syntax. This syntax is described in detail in
+ Section~8.3 of the \textsc{svg}-specification, Version~1.1.
+
+ In principle, the complete syntax is supported and the library just
+ provides a parser and a mapping to basic layer commands. For instance,
+ |M 0 10| is mapped to |\pgfpathmoveto{\pgfpoint{0pt}{10pt}}|. There are,
+ however, a few things to be aware of:
+ %
+ \begin{itemize}
+ \item The computation underlying the arc commands |A| and |a| are not
+ numerically stable, which may result in quite imprecise arcs.
+ Bézier curves, both quadratic and cubic, are not affected, neither
+ are arcs spanning degrees that are multiples of $90^{\circ}$.
+ \item The dimensionless units of \textsc{svg} are always interpreted as
+ points (|pt|). This is a problem with paths like |M 20000 0|, which
+ will raise an error message since \TeX\ cannot handle dimensions
+ larger than about 16\,000 points.
+ \item All coordinate and canvas transformations apply to the path in
+ the usual fashion.
+ \item The |\pgfpathsvg| command can be freely intermixed with other
+ path commands.
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfpathsvg{M 0 0 l 20 0 0 20 -20 0 q 10 0 10 10
+ t 10 10 10 10 h -50 z}
+ \pgfusepath{stroke}
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-through.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-through.tex
new file mode 100644
index 0000000000..1222d1ec03
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-through.tex
@@ -0,0 +1,43 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Through Library}
+\label{section-through-library}
+
+\begin{tikzlibrary}{through}
+ This library defines keys for creating shapes that go through given points.
+\end{tikzlibrary}
+
+\begin{key}{/tikz/circle through=\meta{coordinate}}
+ When this key is given as an option to a node, the following happens:
+ %
+ \begin{enumerate}
+ \item The |inner sep| and the |outer sep| are set to zero.
+ \item The shape is set to |circle|.
+ \item The |minimum size| is set such that the circle around the center
+ of the node (which is specified using |at|), goes through
+ \meta{coordinate}.
+ \end{enumerate}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \node (a) at (2,1.5) {$a$};
+ \node [draw] at (1,1) [circle through={(a)}] {$c$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-trees.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-trees.tex
new file mode 100644
index 0000000000..92f2080921
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-trees.tex
@@ -0,0 +1,196 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tree Library}
+\label{section-tree-library}
+
+\begin{tikzlibrary}{trees}
+ This packages defines styles to be used when drawing trees.
+\end{tikzlibrary}
+
+
+\subsection{Growth Functions}
+
+The package |trees| defines two new growth functions. They are installed using
+the following options:
+
+\begin{key}{/tikz/grow via three points=\texttt{one child at (}\meta{x}
+ \texttt{) and two children at (}\meta{y}\texttt{) and (}\meta{z}|)|%
+}
+ This option installs a growth function that works as follows: If a parent
+ node has just one child, this child is placed at \meta{x}. If the parent
+ node has two children, these are placed at \meta{y} and \meta{z}. If the
+ parent node has more than two children, the children are placed at points
+ that are linearly extrapolated from the three points \meta{x}, \meta{y},
+ and \meta{z}. In detail, the position is $x + \frac{n-1}{2}(y-x) +
+ (c-1)(z-y)$, where $n$ is the number of children and $c$ is the number of
+ the current child (starting with~$1$).
+
+ The net effect of all this is that if you have a certain ``linear
+ arrangement'' in mind and use this option to specify the placement of a
+ single child and of two children, then any number of children will be
+ placed correctly.
+
+ Here are some arrangements based on this growth function. We start with a
+ simple ``above'' arrangement:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[grow via three points={%
+ one child at (0,1) and two children at (-.5,1) and (.5,1)}]
+ \node at (0,0) {one} child;
+ \node at (0,-1.5) {two} child child;
+ \node at (0,-3) {three} child child child;
+ \node at (0,-4.5) {four} child child child child;
+\end{tikzpicture}
+\end{codeexample}
+
+ The next arrangement places children above, but ``grows only to the
+ right''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[grow via three points={%
+ one child at (0,1) and two children at (0,1) and (1,1)}]
+ \node at (0,0) {one} child;
+ \node at (0,-1.5) {two} child child;
+ \node at (0,-3) {three} child child child;
+ \node at (0,-4.5) {four} child child child child;
+\end{tikzpicture}
+\end{codeexample}
+
+ In the final arrangement, the children are placed along a line going down
+ and right.
+\begin{codeexample}[]
+\begin{tikzpicture}[grow via three points={%
+ one child at (-1,-.5) and two children at (-1,-.5) and (0,-.75)}]
+ \node at (0,0) {one} child;
+ \node at (0,-1.5) {two} child child;
+ \node at (0,-3) {three} child child child;
+ \node at (0,-4.5) {four} child child child child;
+\end{tikzpicture}
+\end{codeexample}
+
+ These examples should make it clear how you can create new styles to
+ arrange your children along a line.
+\end{key}
+
+\begin{key}{/tikz/grow cyclic}
+ This style causes the children to be arranged ``on a circle''. For this,
+ the children are placed at distance |\tikzleveldistance| from the parent
+ node, but not on a straight line, but on points on a circle. Instead of a
+ sibling distance, there is a |sibling angle| that denotes the angle between
+ two given children.
+ %
+ \begin{key}{/tikz/sibling angle=\meta{angle}}
+ Sets the angle between siblings in the |grow cyclic| style.
+ \end{key}
+ %
+ Note that this function will rotate the coordinate system of the children
+ to ensure that the grandchildren will grow in the right direction.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [grow cyclic,
+ level 1/.style={level distance=8mm,sibling angle=60},
+ level 2/.style={level distance=4mm,sibling angle=45},
+ level 3/.style={level distance=2mm,sibling angle=30}]
+ \coordinate [rotate=-90] % going down
+ child foreach \x in {1,2,3}
+ {child foreach \x in {1,2,3}
+ {child foreach \x in {1,2,3}}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/clockwise from=\meta{angle}}
+ This option also causes children to be arranged on a circle. However, the
+ rule for placing children is simpler than with the |grow cyclic| style: The
+ first child is placed at \meta{angle} at a distance of
+ |\tikzleveldistance|. The second child is placed at the same distance from
+ the parent, but at angle \meta{angle}${}-{}$|\tikzsiblingangle|. The third
+ child is displaced by another |\tikzsiblingangle| in a clockwise fashion,
+ and so on.
+
+ Note that this function will not rotate the coordinate system.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ [clockwise from=30,sibling angle=30]
+ child {node {$30$}}
+ child {node {$0$}}
+ child {node {$-30$}}
+ child {node {$-60$}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/counterclockwise from=\meta{angle}}
+ Works the same way as |clockwise from|, but sibling angles are added
+ instead of subtracted.
+\end{key}
+
+
+\subsection{Edges From Parent}
+
+The following styles can be used to modify how the edges from parents are
+drawn:
+
+\begin{stylekey}{/tikz/edge from parent fork down}
+ This style will draw a line from the parent downwards (for half the level
+ distance) and then on to the child using only horizontal and vertical
+ lines.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ [edge from parent fork down]
+ child {node {left}}
+ child {node {right}
+ child[child anchor=north east] {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/edge from parent fork right}
+ This style behaves similarly, only it will first draw its edge to the
+ right.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ [edge from parent fork right,grow=right]
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/edge from parent fork left}
+ Behaves similarly to the previous styles.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/edge from parent fork up}
+ Behaves similarly to the previous styles.
+\end{stylekey}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-turtle.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-turtle.tex
new file mode 100644
index 0000000000..6c1187e0c3
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-turtle.tex
@@ -0,0 +1,117 @@
+% Copyright 2008 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Turtle Graphics Library}
+\label{section-library-tutrle}
+
+\begin{pgflibrary}{turtle}
+ This little library defines some keys to create simple turtle graphics in
+ the tradition of the Logo programming language. These commands are mostly
+ for fun, but they can also be used for more ``serious'' business.
+ %
+\begin{codeexample}[]
+\tikz[turtle/distance=2mm]
+ \draw [turtle={home,forward,right,forward,left,forward,left,forward}];
+\end{codeexample}
+ %
+\end{pgflibrary}
+
+Even though the |turtle| keys looks like an option, it uses the |insert path|
+option internally to produce a path.
+
+The basic drawing model behind the turtle graphics is very simple: There is a
+(virtual) \emph{turtle} that crawls around the page, thereby extending the
+path. The turtle always heads in a certain direction. When you move the turtle
+forward, you extend the path in that direction; turning the turtle just changes
+the direction, it does not cause anything to be drawn.
+
+The turtle always moves relative to the last current point of the path and you
+can mix normal path commands with turtle commands. However, the direction of
+the turtle is managed independently of other path commands.
+
+\begin{key}{/tikz/turtle=\meta{keys}}
+ This key executes the \meta{keys} with the current key path set to
+ |/tikz/turtle|.
+ %
+\begin{codeexample}[]
+\tikz[turtle/distance=2mm]
+ \draw [turtle={home,fd,rt,fd,lt,fd,lt,fd}];
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/turtle/home}
+ Places the turtle at the origin and lets it head upward.
+\end{key}
+
+\begin{key}{/tikz/turtle/forward=\meta{distance} (default \normalfont see text)}
+ Makes the turtle move forward by the given \meta{distance}. If no
+ \meta{distance} is specified, the current value of the following key is
+ used:
+ %
+ \begin{key}{/tikz/turtle/distance=\meta{distance} (initially 1cm)}
+ The default distance by which the turtle advances.
+ \end{key}
+ %
+ ``Moving forward the turtle'' actually means that, relative to the current
+ last point on the path, a point at the given \meta{distance} in the
+ direction the turtle is currently heading is computed. Then, the operation
+ |to[turtle/how]| is used to extend the path to this point.
+ %
+ \begin{stylekey}{/tikz/turtle/how (initially \normalfont empty)}
+ This style can set up the |to path| used by turtles. By setting this
+ style you can change the to-path:
+ %
+\begin{codeexample}[]
+\tikz \draw [turtle={how/.style={bend left},home,forward,right,forward}];
+\end{codeexample}
+ \end{stylekey}
+\end{key}
+
+\begin{key}{/tikz/turtle/fd}
+ An abbreviation for the |forward| key.
+\end{key}
+
+\begin{key}{/tikz/turtle/back=\meta{distance} (default \normalfont see text)}
+ This has the same effect as a |turtle/forward| for the negated
+ \meta{distance} value.
+\end{key}
+
+\begin{key}{/tikz/turtle/bk}
+ An abbreviation for the |back| key.
+\end{key}
+
+\begin{key}{/tikz/turtle/left=\meta{angle} (default 90)}
+ Turns the turtle left by the given angle.
+\end{key}
+
+\begin{key}{/tikz/turtle/lt}
+ An abbreviation for the |left| key.
+\end{key}
+
+\begin{key}{/tikz/turtle/right=\meta{angle} (default 90)}
+ Turns the turtle right by the given angle.
+\end{key}
+
+\begin{key}{/tikz/turtle/rt}
+ An abbreviation for the |right| key.
+\end{key}
+
+Turtle graphics are especially nice in conjunction with the |\foreach|
+statement:
+
+\begin{codeexample}[]
+\tikz \filldraw [thick,blue,fill=blue!20]
+ [turtle=home]
+ \foreach \i in {1,...,5}
+ {
+ [turtle={forward,right=144}]
+ };
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-library-views.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-views.tex
new file mode 100644
index 0000000000..c7724e72c4
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-library-views.tex
@@ -0,0 +1,127 @@
+% Copyright 2016 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Views Library}
+\label{section-library-views}
+
+\begin{tikzlibrary}{views}
+ This library is used for creating \emph{views}, which are transformations
+ of a part of a picture so that this part ``fits'' into a ``viewbox''.
+ Mostly, views are useful in conjunction with animations.
+\end{tikzlibrary}
+
+A \emph{view} is essentially a ``window'' through which you see a graphic. To
+establish a view, you specify a rectangle -- which is the window -- and another
+rectangle surrounding the to-be-viewed graphic. The graphic will then be
+rescaled and shifted in such a way that the to-be-viewed rectangle matches the
+view's rectangle as well as possible. Note that establishing a view causes a
+\emph{canvas} transformation to be installed, not a coordinate transformation.
+
+View boxes are only seldom needed in normal graphics; you may prefer to use
+coordinate transformations or the |spy| library. Their main application is with
+animations since you can \emph{animate} the to-be-viewed rectangle. This makes
+it easy to create animations in which you zoom in, zoom out, and pan a graphic.
+
+\begin{key}{/tikz/meet=\meta{to-be-viewed corner}
+ \opt{|rectangle|} \meta{to-be-viewed corner} \opt{|at|
+ \meta{window corner} |rectangle| \meta{window corner}}%
+}
+ Use this key with a scope to establish a view for the scope. In the
+ argument to the |meet| key, both |rectangle| texts are optional. Also,
+ everything following |at| is optional; when it is missing, the \meta{window
+ corner}s are assumed to be the same as the \meta{to-be-viewed corner}s. The
+ latter are two corners of a rectangle that should be transformed in such a
+ way that it fits inside the rectangle described by the two window corners.
+
+ More precisely, at the beginning of the scope a canvas transformation is
+ installed that scales and translates the canvas is such a way that
+ %
+ \begin{enumerate}
+ \item the center of the to-be-viewed rectangle lies at the center of
+ the window rectangle and
+ \item the to-be-viewed rectangle has maximum size that it still fits
+ inside the window rectangle.
+ \end{enumerate}
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [red, very thick] (0,0) rectangle (20mm,20mm);
+ \begin{scope}[meet = {(0.5,0.5) (2.5,1.5) at (0,0) (2,2)}]
+ \draw [blue, very thick] (5mm,5mm) rectangle (25mm,15mm);
+ \draw [thick] (1,1) circle [x radius=5mm, y radius=10mm] node {Hi};
+ \end{scope} }
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [red, very thick] (0,0) rectangle (20mm,20mm);
+ \begin{scope}[slice = {(0.5,0.5) (2.5,1.5) at (0,0) (2,2)}]
+ \draw [blue, very thick] (5mm,5mm) rectangle (25mm,15mm);
+ \draw [thick] (1,1) circle [x radius=5mm, y radius=10mm] node {Hi};
+ \end{scope} }
+\end{codeexample}
+
+ As mentioned earlier, the main use of views is in conjunction with
+ animations. In order to animate a view, you specify the scope containing
+ the |meet| command as the target object and then animate its |:view|
+ attribute:
+ %
+\begin{codeexample}[]
+\tikz [animate = {
+ my scope:view = {
+ begin on = { click, of next = here },
+ 0s = "{(0.5,0.5) (2.5,1.5)}",
+ 2s = "{(0.5,0) (1.5,2)}", forever
+ }}] {
+ \draw [red, fill=red!20, very thick, name=here]
+ (0,0) rectangle (20mm,20mm);
+ \begin{scope}[name = my scope,
+ meet = {(0.5,0.5) (2.5,1.5) at (0,0) (2,2)}]
+ \draw [blue, very thick] (5mm,5mm) rectangle (25mm,15mm);
+ \draw [thick] (1,1) circle [x radius=5mm, y radius=10mm] node {Hi};
+ \end{scope} }
+\end{codeexample}
+ %
+ You can, of course, also specify the animation using the |animate myself:|
+ key when you specify the animation inside the scope:
+ %
+\begin{codeexample}[]
+\tikz [animate = {
+ my scope:view = {
+ }}] {
+ \draw [red, fill=red!20, very thick, name=here]
+ (0,0) rectangle (20mm,20mm);
+ \begin{scope}[animate = { myself: = { :view = {
+ begin on = { click, of = here },
+ 0s = "{(0.5,0.5) (2.5,1.5)}",
+ 2s = "{(0.5,0) (1.5,2)}", forever }}},
+ slice = {(0.5,0.5) (2.5,1.5) at (0,0) (2,2)}]
+ \draw [blue, very thick] (5mm,5mm) rectangle (25mm,15mm);
+ \draw [thick] (1,1) circle [x radius=5mm, y radius=10mm] node {Hi};
+ \end{scope} }
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/view}
+ This is an alias for |/tikz/meet|.
+\end{key}
+
+\begin{key}{/tikz/slice=\meta{to-be-viewed corner}
+ \opt{|rectangle|} \meta{to-be-viewed corner} \opt{|at|
+ \meta{window corner} |rectangle| \meta{window corner}}%
+}
+ This key works exactly like |meet|, only the second rule is changed:
+ %
+ \begin{enumerate}
+ \item[$2'$.] the to-be-viewed rectangle has minimal size that it
+ encompasses all of the window rectangle.
+ \end{enumerate}
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-license.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-license.tex
new file mode 100644
index 0000000000..c78b5f85ce
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-license.tex
@@ -0,0 +1,1229 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Licenses and Copyright}
+\label{section-license}
+
+\subsection{Which License Applies?}
+
+Different parts of the \pgfname\ package are distributed under different
+licenses:
+%
+\begin{enumerate}
+ \item The \emph{code} of the package is dual-license. This means that you
+ can decide which license you wish to use when using the \pgfname\
+ package. The two options are:
+ %
+ \begin{enumerate}
+ \item You can use the \textsc{gnu} Public License, version 2.
+ \item You can use the \LaTeX\ Project Public License, version
+ 1.3c.
+ \end{enumerate}
+ \item The \emph{documentation} of the package is also dual-license.
+ Again, you can choose between two options:
+ %
+ \begin{enumerate}
+ \item You can use the \textsc{gnu} Free Documentation License,
+ version 1.2.
+ \item You can use the \LaTeX\ Project Public License, version
+ 1.3c.
+ \end{enumerate}
+\end{enumerate}
+
+The ``documentation of the package'' refers to all files in the subdirectory
+|doc| of the |pgf| package. A detailed listing can be found in the file
+|doc/generic/pgf/licenses/manifest-documentation.txt|. All files in other
+directories are part of the ``code of the package''. A detailed listing can be
+found in the file |doc/generic/pgf/licenses/manifest-code.txt|.
+
+In the rest of this section, the licenses are presented. The following text is
+copyrighted, see the plain text versions of these licenses in the directory
+|doc/generic/pgf/licenses| for details.
+
+The example picture used in this manual, the Brave \textsc{gnu} World logo, is
+taken from the Brave \textsc{gnu} World homepage, where it is copyrighted as
+follows: ``Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Georg C.~F.\ Greve.
+Permission is granted to make and distribute verbatim copies of this transcript
+as long as the copyright and this permission notice appear.''
+
+
+\subsection{The GNU Public License, Version 2}
+
+\subsubsection{Preamble}
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the \textsc{gnu} General Public License is
+intended to guarantee your freedom to share and change free software---to make
+sure the software is free for all its users. This General Public License
+applies to most of the Free Software Foundation's software and to any other
+program whose authors commit to using it. (Some other Free Software Foundation
+software is covered by the \textsc{gnu} Library General Public License
+instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have. You must
+make sure that they, too, receive or can get the source code. And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish
+to avoid the danger that redistributors of a free program will individually
+obtain patent licenses, in effect making the program proprietary. To prevent
+this, we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+
+\subsubsection{Terms and Conditions For Copying, Distribution and Modification}
+
+\begin{enumerate}
+ \addtocounter{enumi}{-1}
+ \item This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The ``Program'',
+ below, refers to any such program or work, and a ``work based on the
+ Program'' means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term ``modification''.) Each
+ licensee is addressed as ``you''.
+
+ Activities other than copying, distribution and modification are not
+ covered by this License; they are outside its scope. The act of
+ running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the Program).
+ Whether that is true depends on what the Program does.
+ \item You may copy and distribute verbatim copies of the Program's source
+ code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of this
+ License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy, and
+ you may at your option offer warranty protection in exchange for a
+ fee.
+ \item You may modify your copy or copies of the Program or any portion of
+ it, thus forming a work based on the Program, and copy and distribute
+ such modifications or work under the terms of Section 1 above,
+ provided that you also meet all of these conditions:
+ %
+ \begin{enumerate}
+ \item You must cause the modified files to carry prominent
+ notices stating that you changed the files and the date of
+ any change.
+ \item You must cause any work that you distribute or publish,
+ that in whole or in part contains or is derived from the
+ Program or any part thereof, to be licensed as a whole at
+ no charge to all third parties under the terms of this
+ License.
+ \item If the modified program normally reads commands
+ interactively when run, you must cause it, when started
+ running for such interactive use in the most ordinary way,
+ to print or display an announcement including an
+ appropriate copyright notice and a notice that there is no
+ warranty (or else, saying that you provide a warranty) and
+ that users may redistribute the program under these
+ conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive
+ but does not normally print such an announcement, your work
+ based on the Program is not required to print an
+ announcement.)
+ \end{enumerate}
+ %
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Program,
+ and can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works. But when you
+ distribute the same sections as part of a whole which is a work based
+ on the Program, the distribution of the whole must be on the terms of
+ this License, whose permissions for other licensees extend to the
+ entire whole, and thus to each and every part regardless of who wrote
+ it.
+
+ Thus, it is not the intent of this section to claim rights or contest
+ your rights to work written entirely by you; rather, the intent is to
+ exercise the right to control the distribution of derivative or
+ collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on a
+ volume of a storage or distribution medium does not bring the other
+ work under the scope of this License.
+ \item You may copy and distribute the Program (or a work based on it,
+ under Section~2) in object code or executable form under the terms of
+ Sections~1 and 2 above provided that you also do one of the
+ following:
+ %
+ \begin{enumerate}
+ \item Accompany it with the complete corresponding
+ machine-readable source code, which must be distributed
+ under the terms of Sections~1 and 2 above on a medium
+ customarily used for software interchange; or,
+ \item Accompany it with a written offer, valid for at least
+ three years, to give any third party, for a charge no more
+ than your cost of physically performing source
+ distribution, a complete machine-readable copy of the
+ corresponding source code, to be distributed under the
+ terms of Sections~1 and 2 above on a medium customarily
+ used for software interchange; or,
+ \item Accompany it with the information you received as to the
+ offer to distribute corresponding source code. (This
+ alternative is allowed only for noncommercial distribution
+ and only if you received the program in object code or
+ executable form with such an offer, in accord with
+ Subsubsection~b above.)
+ \end{enumerate}
+ %
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete source
+ code means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to
+ control compilation and installation of the executable. However, as
+ a special exception, the source code distributed need not include
+ anything that is normally distributed (in either source or binary
+ form) with the major components (compiler, kernel, and so on) of the
+ operating system on which the executable runs, unless that component
+ itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+ \item You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights, from
+ you under this License will not have their licenses terminated so
+ long as such parties remain in full compliance.
+ \item You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify or
+ distribute the Program or its derivative works. These actions are
+ prohibited by law if you do not accept this License. Therefore, by
+ modifying or distributing the Program (or any work based on the
+ Program), you indicate your acceptance of this License to do so, and
+ all its terms and conditions for copying, distributing or modifying
+ the Program or works based on it.
+ \item Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program subject
+ to these terms and conditions. You may not impose any further
+ restrictions on the recipients' exercise of the rights granted
+ herein. You are not responsible for enforcing compliance by third
+ parties to this License.
+ \item If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent issues),
+ conditions are imposed on you (whether by court order, agreement or
+ otherwise) that contradict the conditions of this License, they do
+ not excuse you from the conditions of this License. If you cannot
+ distribute so as to satisfy simultaneously your obligations under
+ this License and any other pertinent obligations, then as a
+ consequence you may not distribute the Program at all. For example,
+ if a patent license would not permit royalty-free redistribution of
+ the Program by all those who receive copies directly or indirectly
+ through you, then the only way you could satisfy both it and this
+ License would be to refrain entirely from distribution of the
+ Program.
+
+ If any portion of this section is held invalid or unenforceable under
+ any particular circumstance, the balance of the section is intended
+ to apply and the section as a whole is intended to apply in other
+ circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of any
+ such claims; this section has the sole purpose of protecting the
+ integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed to
+ be a consequence of the rest of this License.
+ \item If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces, the
+ original copyright holder who places the Program under this License
+ may add an explicit geographical distribution limitation excluding
+ those countries, so that distribution is permitted only in or among
+ countries not thus excluded. In such case, this License incorporates
+ the limitation as if written in the body of this License.
+ \item The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies to
+ it and ``any later version'', you have the option of following the
+ terms and conditions either of that version or of any later version
+ published by the Free Software Foundation. If the Program does not
+ specify a version number of this License, you may choose any version
+ ever published by the Free Software Foundation.
+ \item If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted by
+ the Free Software Foundation, write to the Free Software Foundation;
+ we sometimes make exceptions for this. Our decision will be guided
+ by the two goals of preserving the free status of all derivatives of
+ our free software and of promoting the sharing and reuse of software
+ generally.
+\end{enumerate}
+
+
+\subsubsection{No Warranty}
+
+\begin{enumerate}
+ \addtocounter{enumi}{9}
+ \item Because the program is licensed free of charge, there is no
+ warranty for the program, to the extent permitted by applicable law.
+ Except when otherwise stated in writing the copyright holders and/or
+ other parties provide the program ``as is'' without warranty of any
+ kind, either expressed or implied, including, but not limited to, the
+ implied warranties of merchantability and fitness for a particular
+ purpose. The entire risk as to the quality and performance of the
+ program is with you. Should the program prove defective, you assume
+ the cost of all necessary servicing, repair or correction.
+ \item In no event unless required by applicable law or agreed to in
+ writing will any copyright holder, or any other party who may modify
+ and/or redistribute the program as permitted above, be liable to you
+ for damages, including any general, special, incidental or
+ consequential damages arising out of the use or inability to use the
+ program (including but not limited to loss of data or data being
+ rendered inaccurate or losses sustained by you or third parties or a
+ failure of the program to operate with any other programs), even if
+ such holder or other party has been advised of the possibility of
+ such damages.
+\end{enumerate}
+
+
+\providecommand{\LPPLsection}{\subsection}
+\providecommand{\LPPLsubsection}{\subsubsection}
+\providecommand{\LPPLsubsubsection}{\subsubsection}
+\providecommand{\LPPLparagraph}{\paragraph}
+
+
+% The file lppl.tex, some minor typographic changes:
+
+%
+% $Id$
+%
+% Copyright 1999 2002-2006 LaTeX3 Project
+% Everyone is allowed to distribute verbatim copies of this
+% license document, but modification of it is not allowed.
+%
+%
+% If you wish to load it as part of a ``doc'' source, you have to
+% ensure that a) % is a comment character and b) that short verb
+% characters are being turned off, i.e.,
+%
+% \DeleteShortVerb{\'} % or whatever was made a shorthand
+% \MakePercentComment
+% \input{lppl}
+% \MakePercentIgnore
+% \MakeShortVerb{\'} % turn it on again if necessary
+%
+%
+% By default the license is produced with \section* as the highest
+% heading level. If this is not appropriate for the document in which
+% it is included define the commands listed below before loading this
+% document, e.g., for inclusion as a separate chapter define:
+%
+% \providecommand{\LPPLsection}{\chapter*}
+% \providecommand{\LPPLsubsection}{\section*}
+% \providecommand{\LPPLsubsubsection}{\subsection*}
+% \providecommand{\LPPLparagraph}{\subsubsection*}
+%
+%
+% To allow cross-referencing the headings \label's have been attached
+% to them, all starting with ``LPPL:''. As by default headings without
+% numbers are produced, this will only allow page references.
+% However, you can use the titleref package to produce textual
+% references or you change the definitions of \LPPLsection, and
+% friends to generated numbered headings.
+%
+%
+% We want it to be possible that this file can be processed by
+% (pdf)LaTeX on its own, or that this file can be included in another
+% LaTeX document without any modification whatsoever.
+% Hence the little test below.
+%
+%
+\makeatletter
+\ifx\@preamblecmds\@notprerr
+ % In this case the preamble has already been processed so this file
+ % is loaded as part of another document; just enclose everything in
+ % a group
+ \let\LPPLicense\bgroup
+ \let\endLPPLicense\egroup
+\else
+ % In this case the preamble has not been processed yet so this file
+ % is processed by itself.
+ \documentclass{article}
+ \let\LPPLicense\document
+ \let\endLPPLicense\enddocument
+\fi
+\makeatother
+
+
+\begin{LPPLicense}
+ \providecommand{\LPPLsection}{\section*}
+ \providecommand{\LPPLsubsection}{\subsection*}
+ \providecommand{\LPPLsubsubsection}{\subsubsection*}
+ \providecommand{\LPPLparagraph}{\paragraph*}
+ \providecommand*{\LPPLfile}[1]{\texttt{#1}}
+ \providecommand*{\LPPLdocfile}[1]{`\LPPLfile{#1.tex}'}
+ \providecommand*{\LPPL}{\textsc{lppl}}
+
+ \LPPLsection{The \LaTeX\ Project Public License, Version 1.3c 2006-05-20}
+ \label{LPPL:LPPL}
+
+% \textbf{Copyright 1999, 2002--2006 \LaTeX3 Project}
+% \begin{quotation}
+% Everyone is allowed to distribute verbatim copies of this
+% license document, but modification of it is not allowed.
+% \end{quotation}
+
+ \LPPLsubsection{Preamble}
+ \label{LPPL:Preamble}
+
+ The \LaTeX\ Project Public License (\LPPL) is the primary license under
+ which the \LaTeX\ kernel and the base \LaTeX\ packages are distributed.
+
+ You may use this license for any work of which you hold the copyright and
+ which you wish to distribute. This license may be particularly suitable if
+ your work is \TeX-related (such as a \LaTeX\ package), but it is written in
+ such a way that you can use it even if your work is unrelated to \TeX.
+
+ The section `\textsc{whether and how to distribute works under this
+ license}', below, gives instructions, examples, and recommendations for
+ authors who are considering distributing their works under this license.
+
+ This license gives conditions under which a work may be distributed and
+ modified, as well as conditions under which modified versions of that work
+ may be distributed.
+
+ We, the \LaTeX3 Project, believe that the conditions below give you the
+ freedom to make and distribute modified versions of your work that conform
+ with whatever technical specifications you wish while maintaining the
+ availability, integrity, and reliability of that work. If you do not see
+ how to achieve your goal while meeting these conditions, then read the
+ document \LPPLdocfile{cfgguide} and \LPPLdocfile{modguide} in the base
+ \LaTeX\ distribution for suggestions.
+
+
+ \LPPLsubsection{Definitions}
+ \label{LPPL:Definitions}
+
+ In this license document the following terms are used:
+
+ \begin{description}
+ \item[Work] Any work being distributed under this License.
+ \item[Derived Work] Any work that under any applicable law is
+ derived from the Work.
+ \item[Modification] Any procedure that produces a Derived Work under
+ any applicable law -- for example, the production of a file
+ containing an original file associated with the Work or a
+ significant portion of such a file, either verbatim or with
+ modifications and/or translated into another language.
+ \item[Modify] To apply any procedure that produces a Derived Work
+ under any applicable law.
+ \item[Distribution] Making copies of the Work available from one
+ person to another, in whole or in part. Distribution includes (but
+ is not limited to) making any electronic components of the Work
+ accessible by file transfer protocols such as \textsc{ftp} or
+ \textsc{http} or by shared file systems such as Sun's Network File
+ System (\textsc{nfs}).
+ \item[Compiled Work] A version of the Work that has been processed
+ into a form where it is directly usable on a computer system.
+ This processing may include using installation facilities provided
+ by the Work, transformations of the Work, copying of components of
+ the Work, or other activities. Note that modification of any
+ installation facilities provided by the Work constitutes
+ modification of the Work.
+ \item[Current Maintainer] A person or persons nominated as such
+ within the Work. If there is no such explicit nomination then it
+ is the `Copyright Holder' under any applicable law.
+ \item[Base Interpreter] A program or process that is normally needed
+ for running or interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these are
+ not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `\LaTeX-Format' or in the case of files belonging to the
+ `\LaTeX-format' a program implementing the `\TeX{} language'.
+ \end{description}
+
+
+ \LPPLsubsection{Conditions on Distribution and Modification}
+ \label{LPPL:Conditions}
+
+ \begin{enumerate}
+ \item Activities other than distribution and/or modification of the
+ Work are not covered by this license; they are outside its scope.
+ In particular, the act of running the Work is not restricted and
+ no requirements are made concerning any offers of support for the
+ Work.
+ \item\label{LPPL:item:distribute} You may distribute a complete,
+ unmodified copy of the Work as you received it. Distribution of
+ only part of the Work is considered modification of the Work, and
+ no right to distribute such a Derived Work may be assumed under the
+ terms of this clause.
+ \item You may distribute a Compiled Work that has been generated from
+ a complete, unmodified copy of the Work as distributed under
+ Clause~\ref{LPPL:item:distribute} above, as long as that Compiled
+ Work is distributed in such a way that the recipients may install
+ the Compiled Work on their system exactly as it would have been
+ installed if they generated a Compiled Work directly from the Work.
+ \item\label{LPPL:item:currmaint} If you are the Current Maintainer of
+ the Work, you may, without restriction, modify the Work, thus
+ creating a Derived Work. You may also distribute the Derived Work
+ without restriction, including Compiled Works generated from the
+ Derived Work. Derived Works distributed in this manner by the
+ Current Maintainer are considered to be updated versions of the
+ Work.
+ \item If you are not the Current Maintainer of the Work, you may modify
+ your copy of the Work, thus creating a Derived Work based on the
+ Work, and compile this Derived Work, thus creating a Compiled Work
+ based on the Derived Work.
+ \item\label{LPPL:item:conditions} If you are not the Current Maintainer
+ of the Work, you may distribute a Derived Work provided the
+ following conditions are met for every component of the Work unless
+ that component clearly states in the copyright notice that it is
+ exempt from that condition. Only the Current Maintainer is allowed
+ to add such statements of exemption to a component of the Work.
+ %
+ \begin{enumerate}
+ \item If a component of this Derived Work can be a direct
+ replacement for a component of the Work when that component
+ is used with the Base Interpreter, then, wherever this
+ component of the Work identifies itself to the user when
+ used interactively with that Base Interpreter, the
+ replacement component of this Derived Work clearly and
+ unambiguously identifies itself as a modified version of
+ this component to the user when used interactively with
+ that Base Interpreter.
+ \item Every component of the Derived Work contains prominent
+ notices detailing the nature of the changes to that
+ component, or a prominent reference to another file that is
+ distributed as part of the Derived Work and that contains a
+ complete and accurate log of the changes.
+ \item No information in the Derived Work implies that any
+ persons, including (but not limited to) the authors of the
+ original version of the Work, provide any support,
+ including (but not limited to) the reporting and handling
+ of errors, to recipients of the Derived Work unless those
+ persons have stated explicitly that they do provide such
+ support for the Derived Work.
+ \item You distribute at least one of the following with the
+ Derived Work:
+ %
+ \begin{enumerate}
+ \item A complete, unmodified copy of the Work; if your
+ distribution of a modified component is made by
+ offering access to copy the modified component from
+ a designated place, then offering equivalent access
+ to copy the Work from the same or some similar
+ place meets this condition, even though third
+ parties are not compelled to copy the Work along
+ with the modified component;
+ \item Information that is sufficient to obtain a
+ complete, unmodified copy of the Work.
+ \end{enumerate}
+ \end{enumerate}
+ %
+ \item If you are not the Current Maintainer of the Work, you may
+ distribute a Compiled Work generated from a Derived Work, as long
+ as the Derived Work is distributed to all recipients of the
+ Compiled Work, and as long as the conditions of
+ Clause~\ref{LPPL:item:conditions}, above, are met with regard to
+ the Derived Work.
+ \item The conditions above are not intended to prohibit, and hence do
+ not apply to, the modification, by any method, of any component so
+ that it becomes identical to an updated version of that component
+ of the Work as it is distributed by the Current Maintainer under
+ Clause~\ref{LPPL:item:currmaint}, above.
+ \item Distribution of the Work or any Derived Work in an alternative
+ format, where the Work or that Derived Work (in whole or in part)
+ is then produced by applying some process to that format, does not
+ relax or nullify any sections of this license as they pertain to
+ the results of applying that process.
+ \item \null
+ \begin{enumerate}
+ \item A Derived Work may be distributed under a different
+ license provided that license itself honors the conditions
+ listed in Clause~\ref{LPPL:item:conditions} above, in
+ regard to the Work, though it does not have to honor the
+ rest of the conditions in this license.
+ \item If a Derived Work is distributed under a different license,
+ that Derived Work must provide sufficient documentation as part
+ of itself to allow each recipient of that Derived Work to honor
+ the restrictions in Clause~\ref{LPPL:item:conditions} above,
+ concerning changes from the Work.
+ \end{enumerate}
+ %
+ \item This license places no restrictions on works that are unrelated
+ to the Work, nor does this license place any restrictions on
+ aggregating such works with the Work by any means.
+ \item Nothing in this license is intended to, or may be used to, prevent
+ complete compliance by all parties with all applicable laws.
+ \end{enumerate}
+
+
+ \LPPLsubsection{No Warranty}
+ \label{LPPL:Warranty}
+
+ There is no warranty for the Work. Except when otherwise stated in
+ writing, the Copyright Holder provides the Work `as is', without warranty
+ of any kind, either expressed or implied, including, but not limited to,
+ the implied warranties of merchantability and fitness for a particular
+ purpose. The entire risk as to the quality and performance of the Work is
+ with you. Should the Work prove defective, you assume the cost of all
+ necessary servicing, repair, or correction.
+
+ In no event unless required by applicable law or agreed to in writing will
+ The Copyright Holder, or any author named in the components of the Work, or
+ any other party who may distribute and/or modify the Work as permitted
+ above, be liable to you for damages, including any general, special,
+ incidental or consequential damages arising out of any use of the Work or
+ out of inability to use the Work (including, but not limited to, loss of
+ data, data being rendered inaccurate, or losses sustained by anyone as a
+ result of any failure of the Work to operate with any other programs), even
+ if the Copyright Holder or said author or said other party has been advised
+ of the possibility of such damages.
+
+
+ \LPPLsubsection{Maintenance of The Work}
+ \label{LPPL:Maintenance}
+
+ The Work has the status `author-maintained' if the Copyright Holder
+ explicitly and prominently states near the primary copyright notice in the
+ Work that the Work can only be maintained by the Copyright Holder or simply
+ that it is `author-maintained'.
+
+ The Work has the status `maintained' if there is a Current Maintainer who
+ has indicated in the Work that they are willing to receive error reports
+ for the Work (for example, by supplying a valid e-mail address). It is not
+ required for the Current Maintainer to acknowledge or act upon these error
+ reports.
+
+ The Work changes from status `maintained' to `unmaintained' if there is no
+ Current Maintainer, or the person stated to be Current Maintainer of the
+ work cannot be reached through the indicated means of communication for a
+ period of six months, and there are no other significant signs of active
+ maintenance.
+
+ You can become the Current Maintainer of the Work by agreement with any
+ existing Current Maintainer to take over this role.
+
+ If the Work is unmaintained, you can become the Current Maintainer of the
+ Work through the following steps:
+ %
+ \begin{enumerate}
+ \item Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of an
+ Internet or similar search.
+ \item If this search is successful, then enquire whether the Work is
+ still maintained.
+ %
+ \begin{enumerate}
+ \item If it is being maintained, then ask the Current
+ Maintainer to update their communication data within one
+ month.
+ \item\label{LPPL:item:intention} If the search is unsuccessful
+ or no action to resume active maintenance is taken by the
+ Current Maintainer, then announce within the pertinent
+ community your intention to take over maintenance. (If the
+ Work is a \LaTeX{} work, this could be done, for example,
+ by posting to \texttt{comp.text.tex}.)
+ \end{enumerate}
+ %
+ \item {}
+ \begin{enumerate}
+ \item If the Current Maintainer is reachable and agrees to
+ pass maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+ \item\label{LPPL:item:announce} If the Current Maintainer is
+ not reachable and the Copyright Holder agrees that maintenance
+ of the Work be passed to you, then this takes effect
+ immediately upon announcement.
+ \end{enumerate}
+ %
+ \item\label{LPPL:item:change} If you make an `intention
+ announcement' as described in~\ref{LPPL:item:intention} above and
+ after three months your intention is challenged neither by the
+ Current Maintainer nor by the Copyright Holder nor by other people,
+ then you may arrange for the Work to be changed so as to name you
+ as the (new) Current Maintainer.
+ \item If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed under
+ the terms of~\ref{LPPL:item:announce} or~\ref{LPPL:item:change},
+ then that Current Maintainer must become or remain the Current
+ Maintainer upon request provided they then update their
+ communication data within one month.
+ \end{enumerate}
+ %
+ A change in the Current Maintainer does not, of itself, alter the fact that
+ the Work is distributed under the \LPPL\ license.
+
+ If you become the Current Maintainer of the Work, you should immediately
+ provide, within the Work, a prominent and unambiguous statement of your
+ status as Current Maintainer. You should also announce your new status to
+ the same pertinent community as in~\ref{LPPL:item:intention} above.
+
+
+ \LPPLsubsection{Whether and How to Distribute Works under This License}
+ \label{LPPL:Distribute}
+
+ This section contains important instructions, examples, and recommendations
+ for authors who are considering distributing their works under this
+ license. These authors are addressed as `you' in this section.
+
+
+ \LPPLsubsubsection{Choosing This License or Another License}
+ \label{LPPL:Choosing}
+
+ If for any part of your work you want or need to use \emph{distribution}
+ conditions that differ significantly from those in this license, then do
+ not refer to this license anywhere in your work but, instead, distribute
+ your work under a different license. You may use the text of this license
+ as a model for your own license, but your license should not refer to the
+ \LPPL\ or otherwise give the impression that your work is distributed under
+ the \LPPL.
+
+ The document \LPPLdocfile{modguide} in the base \LaTeX\ distribution
+ explains the motivation behind the conditions of this license. It
+ explains, for example, why distributing \LaTeX\ under the \textsc{gnu}
+ General Public License (\textsc{gpl}) was considered inappropriate. Even
+ if your work is unrelated to \LaTeX, the discussion in
+ \LPPLdocfile{modguide} may still be relevant, and authors intending to
+ distribute their works under any license are encouraged to read it.
+
+
+ \LPPLsubsubsection{A Recommendation on Modification Without Distribution}
+ \label{LPPL:WithoutDistribution}
+
+ It is wise never to modify a component of the Work, even for your own
+ personal use, without also meeting the above conditions for distributing
+ the modified component. While you might intend that such modifications
+ will never be distributed, often this will happen by accident -- you may
+ forget that you have modified that component; or it may not occur to you
+ when allowing others to access the modified version that you are thus
+ distributing it and violating the conditions of this license in ways that
+ could have legal implications and, worse, cause problems for the community.
+ It is therefore usually in your best interest to keep your copy of the Work
+ identical with the public one. Many works provide ways to control the
+ behavior of that work without altering any of its licensed components.
+
+
+ \LPPLsubsubsection{How to Use This License}
+ \label{LPPL:HowTo}
+
+ To use this license, place in each of the components of your work both an
+ explicit copyright notice including your name and the year the work was
+ authored and/or last substantially modified. Include also a statement that
+ the distribution and/or modification of that component is constrained by
+ the conditions in this license.
+
+ Here is an example of such a notice and statement:
+ %
+\begin{verbatim}
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % 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 M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+\end{verbatim}
+
+ Given such a notice and statement in a file, the conditions given in this
+ license document would apply, with the `Work' referring to the three files
+ `\LPPLfile{pig.dtx}', `\LPPLfile{pig.ins}', and `\LPPLfile{pig.sty}' (the
+ last being generated from `\LPPLfile{pig.dtx}' using `\LPPLfile{pig.ins}'),
+ the `Base Interpreter' referring to any `\LaTeX-Format', and both
+ `Copyright Holder' and `Current Maintainer' referring to the person `M. Y.
+ Name'.
+
+ If you do not want the Maintenance section of \LPPL\ to apply to your Work,
+ change `maintained' above into `author-maintained'. However, we recommend
+ that you use `maintained' as the Maintenance section was added in order to
+ ensure that your Work remains useful to the community even when you can no
+ longer maintain and support it yourself.
+
+
+ \LPPLsubsubsection{Derived Works That Are Not Replacements}
+ \label{LPPL:NotReplacements}
+
+ Several clauses of the \LPPL\ specify means to provide reliability and
+ stability for the user community. They therefore concern themselves with
+ the case that a Derived Work is intended to be used as a (compatible or
+ incompatible) replacement of the original Work. If this is not the case
+ (e.g., if a few lines of code are reused for a completely different task),
+ then clauses 6b and 6d shall not apply.
+
+
+ \LPPLsubsubsection{Important Recommendations}
+ \label{LPPL:Recommendations}
+
+ \LPPLparagraph{Defining What Constitutes the Work}
+
+ The \LPPL\ requires that distributions of the Work contain all the files of
+ the Work. It is therefore important that you provide a way for the
+ licensee to determine which files constitute the Work. This could, for
+ example, be achieved by explicitly listing all the files of the Work near
+ the copyright notice of each file or by using a line such as:
+ %
+\begin{verbatim}
+ % This work consists of all files listed in manifest.txt.
+\end{verbatim}
+ %
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you to
+ comprise the Work and, in such a case, the licensee would be entitled to
+ make reasonable conjectures as to which files comprise the Work.
+\end{LPPLicense}
+
+
+\subsection{GNU Free Documentation License, Version 1.2, November 2002}
+\label{label_fdl}
+
+% \textbf{Copyright 2000,2001,2002 Free Software Foundation, Inc.}\par
+% 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+% \begin{quotation}
+% Everyone is allowed to distribute verbatim copies of this
+% license document, but modification of it is not allowed.
+% \end{quotation}
+
+\subsubsection{Preamble}
+
+The purpose of this License is to make a manual, textbook, or other functional
+and useful document ``free'' in the sense of freedom: to assure everyone the
+effective freedom to copy and redistribute it, with or without modifying it,
+either commercially or noncommercially. Secondarily, this License preserves for
+the author and publisher a way to get credit for their work, while not being
+considered responsible for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative works of
+the document must themselves be free in the same sense. It complements the GNU
+General Public License, which is a copyleft license designed for free software.
+
+We have designed this License in order to use it for manuals for free software,
+because free software needs free documentation: a free program should come with
+manuals providing the same freedoms that the software does. But this License
+is not limited to software manuals; it can be used for any textual work,
+regardless of subject matter or whether it is published as a printed book. We
+recommend this License principally for works whose purpose is instruction or
+reference.
+
+
+\subsubsection{Applicability and definitions}
+
+This License applies to any manual or other work, in any medium, that contains
+a notice placed by the copyright holder saying it can be distributed under the
+terms of this License. Such a notice grants a world-wide, royalty-free
+license, unlimited in duration, to use that work under the conditions stated
+herein. The \textbf{``Document''}, below, refers to any such manual or work.
+Any member of the public is a licensee, and is addressed as \textbf{``you''}.
+You accept the license if you copy, modify or distribute the work in a way
+requiring permission under copyright law.
+
+A \textbf{``Modified Version''} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with modifications
+and/or translated into another language.
+
+A \textbf{``Secondary Section''} is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the publishers
+or authors of the Document to the Document's overall subject (or to related
+matters) and contains nothing that could fall directly within that overall
+subject. (Thus, if the Document is in part a textbook of mathematics, a
+Secondary Section may not explain any mathematics.) The relationship could be
+a matter of historical connection with the subject or with related matters, or
+of legal, commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{``Invariant Sections''} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice that says
+that the Document is released under this License. If a section does not fit
+the above definition of Secondary then it is not allowed to be designated as
+Invariant. The Document may contain zero Invariant Sections. If the Document
+does not identify any Invariant Sections then there are none.
+
+The \textbf{``Cover Texts''} are certain short passages of text that are
+listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may be at most
+5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{``Transparent''} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the general public,
+that is suitable for revising the document straightforwardly with generic text
+editors or (for images composed of pixels) generic paint programs or (for
+drawings) some widely available drawing editor, and that is suitable for input
+to text formatters or for automatic translation to a variety of formats
+suitable for input to text formatters. A copy made in an otherwise Transparent
+file format whose markup, or absence of markup, has been arranged to thwart or
+discourage subsequent modification by readers is not Transparent. An image
+format is not Transparent if used for any substantial amount of text. A copy
+that is not ``Transparent'' is called \textbf{``Opaque''}.
+
+Examples of suitable formats for Transparent copies include plain ASCII without
+markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly
+available DTD, and standard-conforming simple HTML, PostScript or PDF designed
+for human modification. Examples of transparent image formats include PNG, XCF
+and JPG. Opaque formats include proprietary formats that can be read and
+edited only by proprietary word processors, SGML or XML for which the DTD
+and/or processing tools are not generally available, and the machine-generated
+HTML, PostScript or PDF produced by some word processors for output purposes
+only.
+
+The \textbf{``Title Page''} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material this
+License requires to appear in the title page. For works in formats which do
+not have any title page as such, ``Title Page'' means the text near the most
+prominent appearance of the work's title, preceding the beginning of the body
+of the text.
+
+A section \textbf{``Entitled XYZ''} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following text
+that translates XYZ in another language. (Here XYZ stands for a specific
+section name mentioned below, such as \textbf{``Acknowledgements''},
+\textbf{``Dedications''}, \textbf{``Endorsements''}, or \textbf{``History''}.)
+To \textbf{``Preserve the Title''} of such a section when you modify the
+Document means that it remains a section ``Entitled XYZ'' according to this
+definition.
+
+The Document may include Warranty Disclaimers next to the notice which states
+that this License applies to the Document. These Warranty Disclaimers are
+considered to be included by reference in this License, but only as regards
+disclaiming warranties: any other implication that these Warranty Disclaimers
+may have is void and has no effect on the meaning of this License.
+
+
+\subsubsection{Verbatim Copying}
+
+You may copy and distribute the Document in any medium, either commercially or
+noncommercially, provided that this License, the copyright notices, and the
+license notice saying this License applies to the Document are reproduced in
+all copies, and that you add no other conditions whatsoever to those of this
+License. You may not use technical measures to obstruct or control the reading
+or further copying of the copies you make or distribute. However, you may
+accept compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section~3.
+
+You may also lend copies, under the same conditions stated above, and you may
+publicly display copies.
+
+
+\subsubsection{Copying in Quantity}
+
+If you publish printed copies (or copies in media that commonly have printed
+covers) of the Document, numbering more than 100, and the Document's license
+notice requires Cover Texts, you must enclose the copies in covers that carry,
+clearly and legibly, all these Cover Texts: Front-Cover Texts on the front
+cover, and Back-Cover Texts on the back cover. Both covers must also clearly
+and legibly identify you as the publisher of these copies. The front cover
+must present the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition. Copying with
+changes limited to the covers, as long as they preserve the title of the
+Document and satisfy these conditions, can be treated as verbatim copying in
+other respects.
+
+If the required texts for either cover are too voluminous to fit legibly, you
+should put the first ones listed (as many as fit reasonably) on the actual
+cover, and continue the rest onto adjacent pages.
+
+If you publish or distribute Opaque copies of the Document numbering more than
+100, you must either include a machine-readable Transparent copy along with
+each Opaque copy, or state in or with each Opaque copy a computer-network
+location from which the general network-using public has access to download
+using public-standard network protocols a complete Transparent copy of the
+Document, free of added material. If you use the latter option, you must take
+reasonably prudent steps, when you begin distribution of Opaque copies in
+quantity, to ensure that this Transparent copy will remain thus accessible at
+the stated location until at least one year after the last time you distribute
+an Opaque copy (directly or through your agents or retailers) of that edition
+to the public.
+
+It is requested, but not required, that you contact the authors of the Document
+well before redistributing any large number of copies, to give them a chance to
+provide you with an updated version of the Document.
+
+
+\subsubsection{Modifications}
+
+You may copy and distribute a Modified Version of the Document under the
+conditions of sections 2 and 3 above, provided that you release the Modified
+Version under precisely this License, with the Modified Version filling the
+role of the Document, thus licensing distribution and modification of the
+Modified Version to whoever possesses a copy of it. In addition, you must do
+these things in the Modified Version:
+%
+\begin{itemize}
+ \item[A.] Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the History
+ section of the Document). You may use the same title as a previous
+ version if the original publisher of that version gives permission.
+ \item[B.] List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in the
+ Modified Version, together with at least five of the principal
+ authors of the Document (all of its principal authors, if it has
+ fewer than five), unless they release you from this requirement.
+ \item[C.] State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+ \item[D.] Preserve all the copyright notices of the Document.
+ \item[E.] Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+ \item[F.] Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified Version under
+ the terms of this License, in the form shown in the Addendum below.
+ \item[G.] Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's license
+ notice.
+ \item[H.] Include an unaltered copy of this License.
+ \item[I.] Preserve the section Entitled ``History'', Preserve its Title,
+ and add to it an item stating at least the title, year, new authors,
+ and publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled ``History'' in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+ \item[J.] Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions it
+ was based on. These may be placed in the ``History'' section. You
+ may omit a network location for a work that was published at least
+ four years before the Document itself, or if the original publisher
+ of the version it refers to gives permission.
+ \item[K.] For any section Entitled ``Acknowledgements'' or
+ ``Dedications'', Preserve the Title of the section, and preserve in
+ the section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+ \item[L.] Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the equivalent
+ are not considered part of the section titles.
+ \item[M.] Delete any section Entitled ``Endorsements''. Such a section
+ may not be included in the Modified Version.
+ \item[N.] Do not retitle any existing section to be Entitled
+ ``Endorsements'' or to conflict in title with any Invariant Section.
+ \item[O.] Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or appendices that
+qualify as Secondary Sections and contain no material copied from the Document,
+you may at your option designate some or all of these sections as invariant.
+To do this, add their titles to the list of Invariant Sections in the Modified
+Version's license notice. These titles must be distinct from any other section
+titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains nothing
+but endorsements of your Modified Version by various parties--for example,
+statements of peer review or that the text has been approved by an organization
+as the authoritative definition of a standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a passage
+of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts
+in the Modified Version. Only one passage of Front-Cover Text and one of
+Back-Cover Text may be added by (or through arrangements made by) any one
+entity. If the Document already includes a cover text for the same cover,
+previously added by you or by arrangement made by the same entity you are
+acting on behalf of, you may not add another; but you may replace the old one,
+on explicit permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License give
+permission to use their names for publicity for or to assert or imply
+endorsement of any Modified Version.
+
+
+\subsubsection{Combining Documents}
+
+You may combine the Document with other documents released under this License,
+under the terms defined in section 4 above for modified versions, provided that
+you include in the combination all of the Invariant Sections of all of the
+original documents, unmodified, and list them all as Invariant Sections of your
+combined work in its license notice, and that you preserve all their Warranty
+Disclaimers.
+
+The combined work need only contain one copy of this License, and multiple
+identical Invariant Sections may be replaced with a single copy. If there are
+multiple Invariant Sections with the same name but different contents, make the
+title of each such section unique by adding at the end of it, in parentheses,
+the name of the original author or publisher of that section if known, or else
+a unique number. Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History'' in the
+various original documents, forming one section Entitled ``History''; likewise
+combine any sections Entitled ``Acknowledgements'', and any sections Entitled
+``Dedications''. You must delete all sections Entitled ``Endorsements''.
+
+
+\subsubsection{Collection of Documents}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this License
+in the various documents with a single copy that is included in the collection,
+provided that you follow the rules of this License for verbatim copying of each
+of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute it
+individually under this License, provided you insert a copy of this License
+into the extracted document, and follow this License in all other respects
+regarding verbatim copying of that document.
+
+
+\subsubsection{Aggregating with independent Works}
+
+A compilation of the Document or its derivatives with other separate and
+independent documents or works, in or on a volume of a storage or distribution
+medium, is called an ``aggregate'' if the copyright resulting from the
+compilation is not used to limit the legal rights of the compilation's users
+beyond what the individual works permit. When the Document is included in an
+aggregate, this License does not apply to the other works in the aggregate
+which are not themselves derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these copies of the
+Document, then if the Document is less than one half of the entire aggregate,
+the Document's Cover Texts may be placed on covers that bracket the Document
+within the aggregate, or the electronic equivalent of covers if the Document is
+in electronic form. Otherwise they must appear on printed covers that bracket
+the whole aggregate.
+
+
+\subsubsection{Translation}
+
+Translation is considered a kind of modification, so you may distribute
+translations of the Document under the terms of section 4. Replacing Invariant
+Sections with translations requires special permission from their copyright
+holders, but you may include translations of some or all Invariant Sections in
+addition to the original versions of these Invariant Sections. You may include
+a translation of this License, and all the license notices in the Document, and
+any Warranty Disclaimers, provided that you also include the original English
+version of this License and the original versions of those notices and
+disclaimers. In case of a disagreement between the translation and the
+original version of this License or a notice or disclaimer, the original
+version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'',
+or ``History'', the requirement (section 4) to Preserve its Title (section 1)
+will typically require changing the actual title.
+
+
+\subsubsection{Termination}
+
+You may not copy, modify, sublicense, or distribute the Document except as
+expressly provided for under this License. Any other attempt to copy, modify,
+sublicense or distribute the Document is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+
+\subsubsection{Future Revisions of this License}
+
+The Free Software Foundation may publish new, revised versions of the GNU Free
+Documentation License from time to time. Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns. See http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number. If the
+Document specifies that a particular numbered version of this License ``or any
+later version'' applies to it, you have the option of following the terms and
+conditions either of that specified version or of any later version that has
+been published (not as a draft) by the Free Software Foundation. If the
+Document does not specify a version number of this License, you may choose any
+version ever published (not as a draft) by the Free Software Foundation.
+
+
+\subsubsection{Addendum: How to use this License for your documents}
+
+To use this License in a document you have written, include a copy of the
+License in the document and put the following copyright and license notices
+just after the title page:
+
+\bigskip
+\begin{quote}
+ Copyright \copyright \textsc{year your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+\end{quote}
+\bigskip
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace
+the ``with \dots\ Texts''. line with this:
+
+\bigskip
+\begin{quote}
+ with the Invariant Sections being \textsc{list their titles}, with the
+ Front-Cover Texts being \textsc{list}, and with the Back-Cover
+ Texts being \textsc{list}.
+\end{quote}
+\bigskip
+
+If you have Invariant Sections without Cover Texts, or some other combination
+of the three, merge those two alternatives to suit the situation.
+
+If your document contains nontrivial examples of program code, we recommend
+releasing these examples in parallel under your choice of free software
+license, such as the GNU General Public License, to permit their use in free
+software.
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "beameruserguide"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-main-body.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-main-body.tex
new file mode 100644
index 0000000000..9abbb6f3d5
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-main-body.tex
@@ -0,0 +1,857 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\begin{document}
+
+% The titlepage
+
+\newbox\mybox
+{
+ \parindent0pt
+ \null
+ \colorlet{mintgreen}{green!50!black!50}
+
+ \thispagestyle{empty}
+ \vskip3cm
+ \vfill
+ \hfil
+ \begin{tikzpicture}[overlay]
+ \coordinate (front) at (0,0);
+ \coordinate (horizon) at (0,.31\paperheight);
+ \coordinate (bottom) at (0,-.6\paperheight);
+ \coordinate (sky) at (0,.57\paperheight);
+ \coordinate (left) at (-.51\paperwidth,0);
+ \coordinate (right) at (.51\paperwidth,0);
+
+ \shade [bottom color=blue!30!black!10,top color=blue!30!black!50]
+ ([yshift=-5mm]horizon -| left) rectangle (sky -| right);
+ \shade [bottom color=black!70!green!25,top color=black!70!green!10]
+ (front -| left) -- (horizon -| left)
+ decorate [decoration=random steps] { -- (horizon -| right) }
+ -- (front -| right) -- cycle;
+ \shade [top color=black!70!green!25,bottom color=black!25]
+ ([yshift=-5mm-1pt]front -| left) rectangle ([yshift=1pt]front -| right);
+ \fill [black!25] (bottom -| left) rectangle ([yshift=-5mm]front -| right);
+
+ \def\nodeshadowed[#1]#2;{\node[scale=2,above,#1]{\global\setbox\mybox=\hbox{#2}\copy\mybox};
+ \node[scale=2,above,#1,yscale=-1,scope fading=south,opacity=0.4]{\box\mybox};}
+
+ \nodeshadowed [at={(-5,5 )},yslant=0.05] {\Huge Ti\textcolor{orange}{\emph{k}}Z};
+ \nodeshadowed [at={( 0,5.3)}] {\huge \textcolor{mintgreen}{\&}};
+ \nodeshadowed [at={( 5,5 )},yslant=-0.05] {\Huge \textsc{PGF}};
+ \nodeshadowed [at={( 0,2 )}] {Manual for Version \pgftypesetversion};
+
+ \foreach \where in {-9cm,9cm}
+ {\nodeshadowed [at={(\where,5cm)}] {
+ % TODO: Nesting tikzpictures is NOT supported
+ \tikz \draw [green!20!black, rotate=90]
+ [l-system={rule set={F -> FF-[-F+F]+[+F-F]}, axiom=F, order=4,
+ step=2pt, randomize step percent=50, angle=30, randomize angle percent=5}]
+ lindenmayer system;};}
+
+ \foreach \i in {0.5,0.6,...,2}
+ \fill [white,decoration=Koch snowflake,opacity=.9]
+ [shift=(horizon),shift={(rand*11,rnd*7)},scale=\i]
+ [double copy shadow={opacity=0.2,shadow xshift=0pt,shadow
+ yshift=3*\i pt,fill=white,draw=none}]
+ decorate {
+ decorate {
+ decorate {
+ (0,0) -- ++(60:1) -- ++(-60:1) -- cycle
+ }
+ }
+ };
+
+ \node (left text) [text width=.5\paperwidth-2cm,below right,at={(-.5\paperwidth+1cm,-1.5cm)}]
+ {
+ \fontencoding{T1}
+ \fontfamily{pcr}
+ \def\textbraceleft{\char`\{}
+ \def\textbraceright{\char`\}}
+ \def\textbackslash{\char`\\}
+ \begin{lstlisting}[basicstyle=\scriptsize\color{black},
+ keywordstyle=\bfseries\color{white},
+ identifierstyle=\bfseries\color{black},
+ keywords={tikzpicture,shade,fill,draw,path,node},
+ literate={-}{{-}}1]
+\begin{tikzpicture}
+ \coordinate (front) at (0,0);
+ \coordinate (horizon) at (0,.31\paperheight);
+ \coordinate (bottom) at (0,-.6\paperheight);
+ \coordinate (sky) at (0,.57\paperheight);
+ \coordinate (left) at (-.51\paperwidth,0);
+ \coordinate (right) at (.51\paperwidth,0);
+
+ \shade [bottom color=white,
+ top color=blue!30!black!50]
+ ([yshift=-5mm]horizon -| left)
+ rectangle (sky -| right);
+
+ \shade [bottom color=black!70!green!25,
+ top color=black!70!green!10]
+ (front -| left) -- (horizon -| left)
+ decorate [decoration=random steps] {
+ -- (horizon -| right) }
+ -- (front -| right) -- cycle;
+
+ \shade [top color=black!70!green!25,
+ bottom color=black!25]
+ ([yshift=-5mm-1pt]front -| left)
+ rectangle ([yshift=1pt]front -| right);
+
+ \fill [black!25]
+ (bottom -| left)
+ rectangle ([yshift=-5mm]front -| right);
+
+ \def\nodeshadowed[#1]#2;{
+ \node[scale=2,above,#1]{
+ \global\setbox\mybox=\hbox{#2}
+ \copy\mybox};
+ \node[scale=2,above,#1,yscale=-1,
+ scope fading=south,opacity=0.4]{\box\mybox};
+ }
+\end{lstlisting}
+};
+
+ \node (right text) [text width=.5\paperwidth-2cm,below right,at={(1cm,-1.5cm)}]
+ {
+ \fontencoding{T1}
+ \fontfamily{pcr}
+ \def\textbraceleft{\char`\{}
+ \def\textbraceright{\char`\}}
+ \def\textbackslash{\char`\\}
+ \begin{lstlisting}[basicstyle=\scriptsize\color{black},
+ keywordstyle=\bfseries\color{white},
+ identifierstyle=\bfseries\color{black},
+ keywords={tikzpicture,shade,fill,draw,path,node},
+ literate={-}{{-}}1]
+ \nodeshadowed [at={(-5,8 )},yslant=0.05]
+ {\Huge Ti\textcolor{orange}{\emph{k}}Z};
+ \nodeshadowed [at={( 0,8.3)}]
+ {\huge \textcolor{green!50!black!50}{\&}};
+ \nodeshadowed [at={( 5,8 )},yslant=-0.05]
+ {\Huge \textsc{PGF}};
+ \nodeshadowed [at={( 0,5 )}]
+ {Manual for Version \pgftypesetversion};
+
+ \foreach \where in {-9cm,9cm} {
+ \nodeshadowed [at={(\where,5cm)}] { \tikz
+ \draw [green!20!black, rotate=90,
+ l-system={rule set={F -> FF-[-F+F]+[+F-F]},
+ axiom=F, order=4,step=2pt,
+ randomize step percent=50, angle=30,
+ randomize angle percent=5}] l-system; }}
+
+ \foreach \i in {0.5,0.6,...,2}
+ \fill
+ [white,opacity=\i/2,
+ decoration=Koch snowflake,
+ shift=(horizon),shift={(rand*11,rnd*7)},
+ scale=\i,double copy shadow={
+ opacity=0.2,shadow xshift=0pt,
+ shadow yshift=3*\i pt,fill=white,draw=none}]
+ decorate {
+ decorate {
+ decorate {
+ (0,0)- ++(60:1) -- ++(-60:1) -- cycle
+ } } };
+
+ \node (left text) ...
+ \node (right text) ...
+
+ \fill [decorate,decoration={footprints,foot of=gnome},
+ opacity=.5,brown] (rand*8,-rnd*10)
+ to [out=rand*180,in=rand*180] (rand*8,-rnd*10);
+\end{tikzpicture}
+ \end{lstlisting}
+ };
+
+ \fill [decorate,decoration=footprints,
+ decoration={footprints,foot of=gnome},
+ opacity=.5,brown] (rand*8,-rnd*10)
+ to [out=rand*180,in=rand*180] (rand*8,-rnd*10);
+\end{tikzpicture}
+\vfill
+\vbox{}
+\clearpage
+}
+
+{
+ \vbox{}
+ \vskip0pt plus 1fill
+ Für meinen Vater, damit er noch viele schöne \TeX-Graphiken
+ erschaffen kann.
+ \vskip1em
+ \hfill\emph{Till}
+ \vskip0pt plus 3fill
+
+ \parindent=0pt
+ Copyright 2007 to 2013 by Till Tantau
+
+ \medskip
+ Permission is granted to copy, distribute and/or modify \emph{the
+ documentation} under the terms of the \textsc{gnu} Free Documentation
+ License, Version 1.2 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, no Front-Cover Texts, and no
+ Back-Cover Texts. A copy of the license is included in the section entitled
+ \textsc{gnu} Free Documentation License.
+
+ \medskip
+ Permission is granted to copy, distribute and/or modify \emph{the code of the
+ package} under the terms of the \textsc{gnu} Public License, Version 2 or any
+ later version published by the Free Software Foundation. A copy of the
+ license is included in the section entitled \textsc{gnu} Public License.
+
+ \medskip
+ Permission is also granted to distribute and/or modify \emph{both the
+ documentation and the code} under the conditions of the LaTeX Project Public
+ License, either version 1.3 of this license or (at your option) any later
+ version. A copy of the license is included in the section entitled \LaTeX\
+ Project Public License.
+
+ \vbox{}
+ \clearpage
+}
+
+
+\title{\bfseries The \tikzname\ and {\Large PGF} Packages\\
+ \large Manual for version \pgfversion\\[1mm]
+\large\href{https://github.com/pgf-tikz/pgf}{\texttt{https://github.com/pgf-tikz/pgf}}}
+\author{Till Tantau\footnote{Editor of this documentation. Parts of
+ this documentation have been written by other authors as indicated
+ in these parts or chapters and in Section~\ref{section-authors}.}\\
+ \normalsize Institut für Theoretische Informatik\\[-1mm]
+ \normalsize Universität zu Lübeck}
+
+\maketitle
+\label{table-of-contents}
+
+\tableofcontents
+
+\clearpage
+
+
+\include{pgfmanual-en-introduction}
+
+
+
+\part{Tutorials and Guidelines}
+
+{\Large \emph{by Till Tantau}}
+
+\bigskip
+\noindent To help you get started with \tikzname, instead of a long
+installation and configuration section, this manual starts with tutorials. They
+explain all the basic and some of the more advanced features of the system,
+without going into all the details. This part also contains some guidelines on
+how you should proceed when creating graphics using \tikzname.
+
+\vskip3cm
+
+\begin{codeexample}[graphic=white,width=0pt]
+\tikz \draw[thick,rounded corners=8pt]
+ (0,0) -- (0,2) -- (1,3.25) -- (2,2) -- (2,0) -- (0,2) -- (2,2) -- (0,0) -- (2,0);
+\end{codeexample}
+
+
+\include{pgfmanual-en-tutorial}
+\include{pgfmanual-en-tutorial-nodes}
+\include{pgfmanual-en-tutorial-Euclid}
+\include{pgfmanual-en-tutorial-chains}
+\include{pgfmanual-en-tutorial-map}
+\include{pgfmanual-en-guidelines}
+
+
+
+\part{Installation and Configuration}
+
+{\Large \emph{by Till Tantau}}
+
+
+\bigskip
+\noindent This part explains how the system is installed. Typically, someone
+has already done so for your system, so this part can be skipped; but if this
+is not the case and you are the poor fellow who has to do the installation,
+read the present part.
+
+
+\vskip1cm
+
+\begin{codeexample}[graphic=white]
+\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,on grid,semithick,
+ every state/.style={fill=red,draw=none,circular drop shadow,text=white}]
+
+ \node[initial,state] (A) {$q_a$};
+ \node[state] (B) [above right=of A] {$q_b$};
+ \node[state] (D) [below right=of A] {$q_d$};
+ \node[state] (C) [below right=of B] {$q_c$};
+ \node[state] (E) [below=of D] {$q_e$};
+
+ \path (A) edge node {0,1,L} (B)
+ edge node {1,1,R} (C)
+ (B) edge [loop above] node {1,1,L} (B)
+ edge node {0,1,L} (C)
+ (C) edge node {0,1,L} (D)
+ edge [bend left] node {1,0,R} (E)
+ (D) edge [loop below] node {1,1,R} (D)
+ edge node {0,1,R} (A)
+ (E) edge [bend left] node {1,0,R} (A);
+
+ \node [right=1cm,text width=8cm] at (C)
+ {
+ The current candidate for the busy beaver for five states. It is
+ presumed that this Turing machine writes a maximum number of
+ $1$'s before halting among all Turing machines with five states
+ and the tape alphabet $\{0, 1\}$. Proving this conjecture is an
+ open research problem.
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\include{pgfmanual-en-installation}
+\include{pgfmanual-en-license}
+\include{pgfmanual-en-drivers}
+
+
+
+\part{Ti\emph{k}Z ist \emph{kein} Zeichenprogramm}
+\label{part-tikz}
+
+{\Large \emph{by Till Tantau}}
+
+
+\bigskip
+\noindent
+\vskip3cm
+\begin{codeexample}[graphic=white]
+
+\begin{tikzpicture}[angle radius=.75cm]
+
+ \node (A) at (-2,0) [red,left] {$A$};
+ \node (B) at ( 3,.5) [red,right] {$B$};
+ \node (C) at (-2,2) [blue,left] {$C$};
+ \node (D) at ( 3,2.5) [blue,right] {$D$};
+ \node (E) at (60:-5mm) [below] {$E$};
+ \node (F) at (60:3.5cm) [above] {$F$};
+
+ \coordinate (X) at (intersection cs:first line={(A)--(B)}, second line={(E)--(F)});
+ \coordinate (Y) at (intersection cs:first line={(C)--(D)}, second line={(E)--(F)});
+
+ \path
+ (A) edge [red, thick] (B)
+ (C) edge [blue, thick] (D)
+ (E) edge [thick] (F)
+ pic ["$\alpha$", draw, fill=yellow] {angle = F--X--A}
+ pic ["$\beta$", draw, fill=green!30] {angle = B--X--F}
+ pic ["$\gamma$", draw, fill=yellow] {angle = E--Y--D}
+ pic ["$\delta$", draw, fill=green!30] {angle = C--Y--E};
+
+ \node at ($ (D)!.5!(B) $) [right=1cm,text width=6cm,rounded corners,fill=red!20,inner sep=1ex]
+ {
+ When we assume that $\color{red}AB$ and $\color{blue}CD$ are
+ parallel, i.\,e., ${\color{red}AB} \mathbin{\|} \color{blue}CD$,
+ then $\alpha = \gamma$ and $\beta = \delta$.
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\include{pgfmanual-en-tikz-design}
+\include{pgfmanual-en-tikz-scopes}
+\include{pgfmanual-en-tikz-coordinates}
+\include{pgfmanual-en-tikz-paths}
+\include{pgfmanual-en-tikz-actions}
+\include{pgfmanual-en-tikz-arrows}
+\include{pgfmanual-en-tikz-shapes}
+\include{pgfmanual-en-tikz-pics}
+\include{pgfmanual-en-tikz-graphs}
+\include{pgfmanual-en-tikz-matrices}
+\include{pgfmanual-en-tikz-trees}
+\include{pgfmanual-en-tikz-plots}
+\include{pgfmanual-en-tikz-transparency}
+\include{pgfmanual-en-tikz-decorations}
+\include{pgfmanual-en-tikz-transformations}
+\include{pgfmanual-en-tikz-animations}
+
+
+
+\part{Graph Drawing}
+\label{part-gd}
+
+{\Large \emph{by Till Tantau et al.}}
+
+\bigskip
+\noindent
+\emph{Graph drawing algorithms} do the tough work of computing a layout of a
+graph for you. \tikzname\ comes with powerful such algorithms, but you can also
+implement new algorithms in the Lua programming language. \vskip1cm
+
+\ifluatex
+\begin{codeexample}[graphic=white]
+\tikz [nodes={text height=.7em, text depth=.2em,
+ draw=black!20, thick, fill=white, font=\footnotesize},
+ >=spaced stealth', rounded corners, semithick]
+ \graph [layered layout, level distance=1cm, sibling sep=.5em, sibling distance=1cm] {
+ "5th Edition" -> { "6th Edition", "PWB 1.0" };
+ "6th Edition" -> { "LSX" [>child anchor=45], "1 BSD", "Mini Unix", "Wollongong", "Interdata" };
+ "Interdata" -> { "Unix/TS 3.0", "PWB 2.0", "7th Edition" };
+ "7th Edition" -> { "8th Edition", "32V", "V7M", "Ultrix-11", "Xenix", "UniPlus+" };
+ "V7M" -> "Ultrix-11";
+ "8th Edition" -> "9th Edition";
+ "1 BSD" -> "2 BSD" -> "2.8 BSD" -> { "Ultrix-11", "2.9 BSD" };
+ "32V" -> "3 BSD" -> "4 BSD" -> "4.1 BSD" -> { "4.2 BSD", "2.8 BSD", "8th Edition" };
+ "4.2 BSD" -> { "4.3 BSD", "Ultrix-32" };
+ "PWB 1.0" -> { "PWB 1.2" -> "PWB 2.0", "USG 1.0" -> { "CB Unix 1", "USG 2.0" }};
+ "CB Unix 1" -> "CB Unix 2" -> "CB Unix 3" -> { "Unix/TS++", "PDP-11 Sys V" };
+ { "USG 2.0" -> "USG 3.0", "PWB 2.0", "Unix/TS 1.0" } -> "Unix/TS 3.0";
+ { "Unix/TS++", "CB Unix 3", "Unix/TS 3.0" } -> "TS 4.0" -> "System V.0" -> "System V.2" -> "System V.3";
+ };
+\end{codeexample}
+
+\else
+ You need to use Lua\TeX\ to typeset this part of the manual (and, also, to
+ use algorithmic graph drawing).
+\fi
+
+
+\include{pgfmanual-en-gd-overview}
+\include{pgfmanual-en-gd-usage-tikz}
+\include{pgfmanual-en-gd-usage-pgf}
+\include{pgfmanual-en-gd-trees}
+\include{pgfmanual-en-gd-layered}
+\include{pgfmanual-en-gd-force}
+\include{pgfmanual-en-gd-circular}
+\include{pgfmanual-en-gd-phylogenetics}
+\include{pgfmanual-en-gd-edge-routing}
+%
+% XXX : disabled because of
+% 1. compile-time dependencies which are hard to resolve
+% 2. it is "hardly usable anyway" (TT)
+%\include{pgfmanual-en-gd-ogdf}
+\include{pgfmanual-en-gd-algorithm-layer}
+\include{pgfmanual-en-gd-algorithms-in-c}
+\include{pgfmanual-en-gd-display-layer}
+\include{pgfmanual-en-gd-binding-layer}
+
+
+
+\part{Libraries}
+\label{part-libraries}
+
+{\Large \emph{by Till Tantau}}
+
+
+\bigskip
+\noindent
+In this part the library packages are documented. They provide additional
+predefined graphic objects like new arrow heads or new plot marks, but
+sometimes also extensions of the basic \pgfname\ or \tikzname\ system. The
+libraries are not loaded by default since many users will not need them.
+
+\medskip
+\noindent
+\begin{codeexample}[graphic=white]
+\tikzset{
+ ld/.style={level distance=#1},lw/.style={line width=#1},
+ level 1/.style={ld=4.5mm, trunk, lw=1ex ,sibling angle=60},
+ level 2/.style={ld=3.5mm, trunk!80!leaf a,lw=.8ex,sibling angle=56},
+ level 3/.style={ld=2.75mm,trunk!60!leaf a,lw=.6ex,sibling angle=52},
+ level 4/.style={ld=2mm, trunk!40!leaf a,lw=.4ex,sibling angle=48},
+ level 5/.style={ld=1mm, trunk!20!leaf a,lw=.3ex,sibling angle=44},
+ level 6/.style={ld=1.75mm,leaf a, lw=.2ex,sibling angle=40},
+}
+\pgfarrowsdeclare{leaf}{leaf}
+ {\pgfarrowsleftextend{-2pt} \pgfarrowsrightextend{1pt}}
+{
+ \pgfpathmoveto{\pgfpoint{-2pt}{0pt}}
+ \pgfpatharc{150}{30}{1.8pt}
+ \pgfpatharc{-30}{-150}{1.8pt}
+ \pgfusepathqfill
+}
+
+\newcommand{\logo}[5]
+{
+ \colorlet{border}{#1}
+ \colorlet{trunk}{#2}
+ \colorlet{leaf a}{#3}
+ \colorlet{leaf b}{#4}
+ \begin{tikzpicture}
+ \scriptsize\scshape
+ \draw[border,line width=1ex,yshift=.3cm,
+ yscale=1.45,xscale=1.05,looseness=1.42]
+ (1,0) to [out=90, in=0] (0,1) to [out=180,in=90] (-1,0)
+ to [out=-90,in=-180] (0,-1) to [out=0, in=-90] (1,0) -- cycle;
+
+ \coordinate (root) [grow cyclic,rotate=90]
+ child {
+ child [line cap=round] foreach \a in {0,1} {
+ child foreach \b in {0,1} {
+ child foreach \c in {0,1} {
+ child foreach \d in {0,1} {
+ child foreach \leafcolor in {leaf a,leaf b}
+ { edge from parent [color=\leafcolor,-#5] }
+ } } }
+ } edge from parent [shorten >=-1pt,serif cm-,line cap=butt]
+ };
+
+ \node [align=center,below] at (0pt,-.5ex)
+ { \textcolor{border}{T}heoretical \\ \textcolor{border}{C}omputer \\
+ \textcolor{border}{S}cience };
+ \end{tikzpicture}
+}
+\begin{minipage}{3cm}
+ \logo{green!80!black}{green!25!black}{green}{green!80}{leaf}\\
+ \logo{green!50!black}{black}{green!80!black}{red!80!green}{leaf}\\
+ \logo{red!75!black}{red!25!black}{red!75!black}{orange}{leaf}\\
+ \logo{black!50}{black}{black!50}{black!25}{}
+\end{minipage}
+\end{codeexample}
+
+
+\include{pgfmanual-en-library-3d}
+\include{pgfmanual-en-library-angles}
+\include{pgfmanual-en-library-arrows}
+\include{pgfmanual-en-library-automata}
+\include{pgfmanual-en-library-babel}
+\include{pgfmanual-en-library-backgrounds}
+\include{pgfmanual-en-library-calc}
+\include{pgfmanual-en-library-calendar}
+\include{pgfmanual-en-library-chains}
+\include{pgfmanual-en-library-circuits}
+\include{pgfmanual-en-library-decorations}
+\include{pgfmanual-en-library-er}
+\include{pgfmanual-en-library-external}
+\include{pgfmanual-en-library-fadings}
+\include{pgfmanual-en-library-fit}
+\include{pgfmanual-en-library-fixedpoint}
+\include{pgfmanual-en-library-fpu}
+\include{pgfmanual-en-library-lsystems}
+\include{pgfmanual-en-library-math}
+\include{pgfmanual-en-library-matrices}
+\include{pgfmanual-en-library-mindmaps}
+\include{pgfmanual-en-library-folding}
+\include{pgfmanual-en-library-patterns}
+\include{pgfmanual-en-library-perspective}
+\include{pgfmanual-en-library-petri}
+\include{pgfmanual-en-library-plot-handlers}
+\include{pgfmanual-en-library-plot-marks}
+\include{pgfmanual-en-library-profiler}
+\include{pgfmanual-en-library-rdf}
+\include{pgfmanual-en-library-shadings}
+\include{pgfmanual-en-library-shadows}
+\include{pgfmanual-en-library-shapes}
+\include{pgfmanual-en-library-spy}
+\include{pgfmanual-en-library-svg-path}
+\include{pgfmanual-en-library-edges}
+\include{pgfmanual-en-library-through}
+\include{pgfmanual-en-library-trees}
+\include{pgfmanual-en-library-turtle}
+\include{pgfmanual-en-library-views}
+
+
+
+\part{Data Visualization}
+\label{part-dv}
+
+{\Large \emph{by Till Tantau}}
+
+\bigskip
+\noindent
+
+\begin{codeexample}[graphic=white]
+\tikz \datavisualization [scientific axes=clean]
+[
+ visualize as smooth line=Gaussian,
+ Gaussian={pin in data={text={$e^{-x^2}$},when=x is 1}}
+]
+data [format=function] {
+ var x : interval [-7:7] samples 51;
+ func y = exp(-\value x*\value x);
+}
+[
+ visualize as scatter,
+ legend={south east outside},
+ scatter={
+ style={mark=*,mark size=1.4pt},
+ label in legend={text={
+ $\sum_{i=1}^{10} x_i$, where $x_i \sim U(-1,1) $}}}
+]
+data [format=function] {
+ var i : interval [0:1] samples 20;
+ func y = 0;
+ func x = (rand + rand + rand + rand + rand +
+ rand + rand + rand + rand + rand);
+};
+\end{codeexample}
+
+
+\include{pgfmanual-en-dv-introduction}
+\include{pgfmanual-en-dv-main}
+\include{pgfmanual-en-dv-formats}
+\include{pgfmanual-en-dv-axes}
+\include{pgfmanual-en-dv-visualizers}
+\include{pgfmanual-en-dv-stylesheets}
+\include{pgfmanual-en-dv-polar}
+\include{pgfmanual-en-dv-backend}
+
+
+
+\part{Utilities}
+\label{part-utilities}
+
+{\Large \emph{by Till Tantau}}
+
+
+\bigskip
+\noindent
+The utility packages are not directly involved in creating graphics, but you
+may find them useful nonetheless. All of them either directly depend on
+\pgfname\ or they are designed to work well together with \pgfname\ even though
+they can be used in a stand-alone way.
+
+\vskip2cm
+\medskip
+\noindent
+\begin{codeexample}[graphic=white]
+\begin{tikzpicture}[scale=2]
+ \shade[top color=blue,bottom color=gray!50] (0,0) parabola (1.5,2.25) |- (0,0);
+ \draw (1.05cm,2pt) node[above] {$\displaystyle\int_0^{3/2} \!\!x^2\mathrm{d}x$};
+
+ \draw[help lines] (0,0) grid (3.9,3.9)
+ [step=0.25cm] (1,2) grid +(1,1);
+
+ \draw[->] (-0.2,0) -- (4,0) node[right] {$x$};
+ \draw[->] (0,-0.2) -- (0,4) node[above] {$f(x)$};
+
+ \foreach \x/\xtext in {1/1, 1.5/1\frac{1}{2}, 2/2, 3/3}
+ \draw[shift={(\x,0)}] (0pt,2pt) -- (0pt,-2pt) node[below] {$\xtext$};
+
+ \foreach \y/\ytext in {1/1, 2/2, 2.25/2\frac{1}{4}, 3/3}
+ \draw[shift={(0,\y)}] (2pt,0pt) -- (-2pt,0pt) node[left] {$\ytext$};
+
+ \draw (-.5,.25) parabola bend (0,0) (2,4) node[below right] {$x^2$};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\include{pgfmanual-en-pgfkeys}
+\include{pgfmanual-en-pgffor}
+\include{pgfmanual-en-pgfcalendar}
+\include{pgfmanual-en-pages}
+\include{pgfmanual-en-xxcolor}
+\include{pgfmanual-en-module-parser}
+
+
+
+\part{Mathematical and Object-Oriented Engines}
+
+{\Large \emph{by Mark Wibrow and Till Tantau}}
+
+
+\bigskip
+\noindent
+\pgfname\ comes with two useful engines: One for doing mathematics, one for
+doing object-oriented programming. Both engines can be used independently of
+the main \pgfname.
+
+The job of the mathematical engine is to support mathematical operations like
+addition, subtraction, multiplication and division, using both integers and
+non-integers, but also functions such as square-roots, sine, cosine, and
+generate pseudo-random numbers. Mostly, you will use the mathematical
+facilities of \pgfname\ indirectly, namely when you write a coordinate like
+|(5cm*3,6cm/4)|, but the mathematical engine can also be used independently of
+\pgfname\ and \tikzname.
+
+The job of the object-oriented engine is to support simple object-oriented
+programming in \TeX. It allows the definition of \emph{classes} (without
+inheritance), \emph{methods}, \emph{attributes} and \emph{objects}.
+
+\vskip1cm
+\begin{codeexample}[graphic=white]
+\pgfmathsetseed{1}
+\foreach \col in {black,red,green,blue}
+{
+ \begin{tikzpicture}[x=10pt,y=10pt,ultra thick,baseline,line cap=round]
+ \coordinate (current point) at (0,0);
+ \coordinate (old velocity) at (0,0);
+ \coordinate (new velocity) at (rand,rand);
+
+ \foreach \i in {0,1,...,100}
+ {
+ \draw[\col!\i] (current point)
+ .. controls ++([scale=-1]old velocity) and
+ ++(new velocity) .. ++(rand,rand)
+ coordinate (current point);
+ \coordinate (old velocity) at (new velocity);
+ \coordinate (new velocity) at (rand,rand);
+ }
+ \end{tikzpicture}
+}
+\end{codeexample}
+
+
+\include{pgfmanual-en-math-design}
+\include{pgfmanual-en-math-parsing}
+\include{pgfmanual-en-math-commands}
+\include{pgfmanual-en-math-algorithms}
+\include{pgfmanual-en-math-numberprinting}
+\include{pgfmanual-en-oo}
+
+
+
+\part{The Basic Layer}
+
+{\Large \emph{by Till Tantau}}
+
+
+\bigskip
+\noindent
+\vskip1cm
+\begin{codeexample}[graphic=white]
+\begin{tikzpicture}
+ \draw[gray,very thin] (-1.9,-1.9) grid (2.9,3.9)
+ [step=0.25cm] (-1,-1) grid (1,1);
+ \draw[blue] (1,-2.1) -- (1,4.1); % asymptote
+
+ \draw[->] (-2,0) -- (3,0) node[right] {$x(t)$};
+ \draw[->] (0,-2) -- (0,4) node[above] {$y(t)$};
+
+ \foreach \pos in {-1,2}
+ \draw[shift={(\pos,0)}] (0pt,2pt) -- (0pt,-2pt) node[below] {$\pos$};
+
+ \foreach \pos in {-1,1,2,3}
+ \draw[shift={(0,\pos)}] (2pt,0pt) -- (-2pt,0pt) node[left] {$\pos$};
+
+ \fill (0,0) circle (0.064cm);
+ \draw[thick,parametric,domain=0.4:1.5,samples=200]
+ % The plot is reparameterised such that there are more samples
+ % near the center.
+ plot[id=asymptotic-example] function{(t*t*t)*sin(1/(t*t*t)),(t*t*t)*cos(1/(t*t*t))}
+ node[right] {$\bigl(x(t),y(t)\bigr) = (t\sin \frac{1}{t}, t\cos \frac{1}{t})$};
+
+ \fill[red] (0.63662,0) circle (2pt)
+ node [below right,fill=white,yshift=-4pt] {$(\frac{2}{\pi},0)$};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\include{pgfmanual-en-base-design}
+\include{pgfmanual-en-base-scopes}
+\include{pgfmanual-en-base-points}
+\include{pgfmanual-en-base-paths}
+\include{pgfmanual-en-base-decorations}
+\include{pgfmanual-en-base-actions}
+\include{pgfmanual-en-base-arrows}
+\include{pgfmanual-en-base-nodes}
+\include{pgfmanual-en-base-matrices}
+\include{pgfmanual-en-base-transformations}
+\include{pgfmanual-en-base-patterns}
+\include{pgfmanual-en-base-images}
+\include{pgfmanual-en-base-external}
+\include{pgfmanual-en-base-plots}
+\include{pgfmanual-en-base-layers}
+\include{pgfmanual-en-base-shadings}
+\include{pgfmanual-en-base-transparency}
+\include{pgfmanual-en-base-animations}
+\include{pgfmanual-en-base-internalregisters}
+\include{pgfmanual-en-base-quick}
+
+
+
+\part{The System Layer}
+\label{part-system}
+
+{\Large \emph{by Till Tantau}}
+
+
+\bigskip
+\noindent
+This part describes the low-level interface of \pgfname, called the
+\emph{system layer}. This interface provides a complete abstraction of the
+internals of the underlying drivers.
+
+Unless you intend to port \pgfname\ to another driver or unless you intend to
+write your own optimized frontend, you need not read this part.
+
+In the following it is assumed that you are familiar with the basic workings of
+the |graphics| package and that you know what \TeX-drivers are and how they
+work.
+
+\vskip1cm
+\begin{codeexample}[graphic=white]
+\begin{tikzpicture}
+ [shorten >=1pt,->,
+ vertex/.style={circle,fill=black!25,minimum size=17pt,inner sep=0pt}]
+
+ \foreach \name/\x in {s/1, 2/2, 3/3, 4/4, 15/11, 16/12, 17/13, 18/14, 19/15, t/16}
+ \node[vertex] (G-\name) at (\x,0) {$\name$};
+
+ \foreach \name/\angle/\text in {P-1/234/5, P-2/162/6, P-3/90/7, P-4/18/8, P-5/-54/9}
+ \node[vertex,xshift=6cm,yshift=.5cm] (\name) at (\angle:1cm) {$\text$};
+
+ \foreach \name/\angle/\text in {Q-1/234/10, Q-2/162/11, Q-3/90/12, Q-4/18/13, Q-5/-54/14}
+ \node[vertex,xshift=9cm,yshift=.5cm] (\name) at (\angle:1cm) {$\text$};
+
+ \foreach \from/\to in {s/2,2/3,3/4,3/4,15/16,16/17,17/18,18/19,19/t}
+ \draw (G-\from) -- (G-\to);
+
+ \foreach \from/\to in {1/2,2/3,3/4,4/5,5/1,1/3,2/4,3/5,4/1,5/2}
+ { \draw (P-\from) -- (P-\to); \draw (Q-\from) -- (Q-\to); }
+
+ \draw (G-3) .. controls +(-30:2cm) and +(-150:1cm) .. (Q-1);
+ \draw (Q-5) -- (G-15);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\include{pgfmanual-en-pgfsys-overview}
+\include{pgfmanual-en-pgfsys-commands}
+\include{pgfmanual-en-pgfsys-paths}
+\include{pgfmanual-en-pgfsys-protocol}
+\include{pgfmanual-en-pgfsys-animations}
+
+
+
+\part{References and Index}
+
+\vskip1cm
+\begin{codeexample}[graphic=white]
+\begin{tikzpicture}
+ \draw[line width=0.3cm,color=red!30,line cap=round,line join=round] (0,0)--(2,0)--(2,5);
+ \draw[help lines] (-2.5,-2.5) grid (5.5,7.5);
+ \draw[very thick] (1,-1)--(-1,-1)--(-1,1)--(0,1)--(0,0)--
+ (1,0)--(1,-1)--(3,-1)--(3,2)--(2,2)--(2,3)--(3,3)--
+ (3,5)--(1,5)--(1,4)--(0,4)--(0,6)--(1,6)--(1,5)
+ (3,3)--(4,3)--(4,5)--(3,5)--(3,6)
+ (3,-1)--(4,-1);
+ \draw[below left] (0,0) node(s){$s$};
+ \draw[below left] (2,5) node(t){$t$};
+ \fill (0,0) circle (0.06cm) (2,5) circle (0.06cm);
+ \draw[->,rounded corners=0.2cm,shorten >=2pt]
+ (1.5,0.5)-- ++(0,-1)-- ++(1,0)-- ++(0,2)-- ++(-1,0)-- ++(0,2)-- ++(1,0)--
+ ++(0,1)-- ++(-1,0)-- ++(0,-1)-- ++(-2,0)-- ++(0,3)-- ++(2,0)-- ++(0,-1)--
+ ++(1,0)-- ++(0,1)-- ++(1,0)-- ++(0,-1)-- ++(1,0)-- ++(0,-3)-- ++(-2,0)--
+ ++(1,0)-- ++(0,-3)-- ++(1,0)-- ++(0,-1)-- ++(-6,0)-- ++(0,3)-- ++(2,0)--
+ ++(0,-1)-- ++(1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+\printindex
+
+%\typeout{Examples: \the\codeexamplecount}%
+\end{document}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "~/pgf/doc/generic/pgf/version-for-luatex/en/pgfmanual"
+%%% coding: iso-latin-1-unix
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-main-preamble.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-main-preamble.tex
new file mode 100644
index 0000000000..0909945567
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-main-preamble.tex
@@ -0,0 +1,374 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\def\xcolorversion{2.00}
+
+\usepackage[version=latest]{pgf}
+
+\usepackage{xkeyval,calc,listings,tikz,fp}
+
+\usepackage{imakeidx}
+\makeindex
+\usepackage{hyperref}
+\hypersetup{%
+ colorlinks=false, % use true to enable colors below:
+ linkcolor=blue,%red,
+ filecolor=blue,%magenta,
+ urlcolor=blue,%cyan,
+ citecolor=blue,
+ pdfborder=0 0 0,
+}
+
+% We need lots of libraries...
+\usetikzlibrary{
+ 3d,
+ arrows,
+ arrows.spaced,
+ arrows.meta,
+ bending,
+ babel,
+ calc,
+ fit,
+ patterns,
+ patterns.meta,
+ plotmarks,
+ shapes.geometric,
+ shapes.misc,
+ shapes.symbols,
+ shapes.arrows,
+ shapes.callouts,
+ shapes.multipart,
+ shapes.gates.logic.US,
+ shapes.gates.logic.IEC,
+ circuits.logic.US,
+ circuits.logic.IEC,
+ circuits.logic.CDH,
+ circuits.ee.IEC,
+ datavisualization,
+ datavisualization.polar,
+ datavisualization.formats.functions,
+ er,
+ automata,
+ backgrounds,
+ chains,
+ topaths,
+ trees,
+ petri,
+ mindmap,
+ matrix,
+ calendar,
+ folding,
+ fadings,
+ shadings,
+ spy,
+ through,
+ turtle,
+ positioning,
+ scopes,
+ decorations.fractals,
+ decorations.shapes,
+ decorations.text,
+ decorations.pathmorphing,
+ decorations.pathreplacing,
+ decorations.footprints,
+ decorations.markings,
+ shadows,
+ lindenmayersystems,
+ intersections,
+ fixedpointarithmetic,
+ fpu,
+ svg.path,
+ external,
+ graphs,
+ graphs.standard,
+ quotes,
+ math,
+ angles,
+ views,
+ animations,
+ rdf,
+ perspective,
+}
+
+\usepackage{ifluatex}
+\newif\ifgdccodebasic
+\newif\ifgdccodeogdf
+
+\ifluatex
+
+ \usetikzlibrary{graphdrawing}
+ \usegdlibrary{trees,circular,layered,examples,force,phylogenetics,routing}
+
+ % Test whether C code is available:
+ \directlua{
+ if pcall(require,'pgf_gd_examples_c_SimpleDemoC') then
+ tex.print('\string\\gdccodebasictrue')
+ end
+ }
+
+ \ifgdccodebasic
+ \usegdlibrary{pgf_gd_examples_c_SimpleDemoC,pgf_gd_examples_c_SimpleDemoCPlusPlus}
+
+ % Test whether OGDF code is available:
+ \directlua{
+ if pcall(require,'pgf_gd_ogdf_c_SimpleDemoOGDF') then
+ tex.print('\string\\gdccodeogdftrue')
+ end
+ }
+
+ \ifgdccodeogdf
+ \usegdlibrary{pgf_gd_ogdf_c_SimpleDemoOGDF,ogdf}
+ \fi
+
+ \fi
+
+\fi
+
+\def\LuaTeX{Lua\TeX}%
+
+
+
+\iffalse
+%\iftrue
+ \tikzexternalize[
+ mode=list only,export=true,% simply skips EVERY picture -> good for debugging the text.
+ ]{pgfmanual}
+
+ \tikzifexternalizing{%
+ \pgfkeys{/pdflinks/codeexample links=false}%
+ }{}%
+\fi
+
+
+\usepackage[a4paper,left=2.25cm,right=2.25cm,top=2.5cm,bottom=2.5cm,nohead]{geometry}
+\usepackage{amsmath,amssymb}
+\usepackage{xxcolor}
+\usepackage{pifont}
+
+\ifluatex
+% \usepackage[no-math]{fontspec}
+% \usepackage{luatextra}
+
+ % TT: I have commented luatextra since it loads fontspec, which
+ % currently breaks "$\mathrm{\Omega}$" (nothing is
+ % shown). Also, fontspec loads so much stuff, I'm not really sure
+ % any of it is needed...
+
+ % \filedescription is defined in expl3, required by fontspec,
+ % required by luatextra. Needs to be \relaxed since
+ % pgfmanual-en-macros.tex defines an environment named filedescription
+ \let\filedescription\relax
+ \usepackage[utf8]{luainputenc}
+ % dvisvgm does not support OpenType fonts so we have to bite the bullet and
+ % use T1 where quotes are weird. In LuaTeX \outputmode=0 means DVI.
+ \ifnum\outputmode=0
+ \usepackage[T1]{fontenc}
+ \fi
+\else
+ \usepackage[utf8]{inputenc}
+ \usepackage[T1]{fontenc}
+\fi
+
+\graphicspath{{../../images/}}
+\input{../../macros/pgfmanual-en-macros}
+
+\usepackage{todonotes}
+\newcommand\todosp[2][]{% % Stefan Pinnow
+ \todo[
+ disable,
+ color=blue!40,
+ #1]{#2}
+}
+
+\makeatletter
+\renewcommand*\l@section[2]{%
+ \ifnum \c@tocdepth >\z@
+ \addpenalty\@secpenalty
+ \addvspace{1.0em \@plus\p@}%
+ \setlength\@tempdima{2.5em}%
+ \begingroup
+ \parindent \z@ \rightskip \@pnumwidth
+ \parfillskip -\@pnumwidth
+ \leavevmode \bfseries
+ \advance\leftskip\@tempdima
+ \hskip -\leftskip
+ #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+ \endgroup
+ \fi}
+\renewcommand*\l@subsection{\@dottedtocline{2}{2.5em}{3.3em}}
+\renewcommand*\l@subsubsection{\@dottedtocline{3}{5.8em}{4.2em}}
+\def\@pnumwidth{2.2em}
+\makeatother
+
+%\includeonly{pgfmanual-en-library-profiler}
+
+% Global styles:
+\tikzset{
+ every plot/.style={prefix=plots/pgf-},
+ shape example/.style={
+ color=black!30,
+ draw,
+ fill=yellow!30,
+ line width=.5cm,
+ inner xsep=2.5cm,
+ inner ysep=0.5cm}
+}
+
+\index{Options for graphics|see{Graphic options and styles}}
+\index{Styles for graphics|see{Graphic options and styles}}
+\index{Options for packages|see{Package options}}
+\index{Handlers for keys|see{Key handlers}}
+\index{File|see{Packages and files}}
+\index{Layout|see{Page layout}}
+\index{Node|see{Predefined node}}
+\index{Data formats|see{Formats}}
+
+
+% Animations:
+
+\tikzset{make snapshot if necessary}
+
+
+%% -----------------------------------------------------------------------------
+%\includeonly{
+%% pgfmanual-en-introduction,
+%% pgfmanual-en-tutorial,
+%% pgfmanual-en-tutorial-nodes,
+%% pgfmanual-en-tutorial-Euclid,
+%% pgfmanual-en-tutorial-chains,
+%% pgfmanual-en-tutorial-map,
+%% pgfmanual-en-guidelines,
+%% pgfmanual-en-installation,
+%% pgfmanual-en-license,
+%% pgfmanual-en-drivers,
+%% pgfmanual-en-tikz-design,
+%% pgfmanual-en-tikz-scopes,
+%% pgfmanual-en-tikz-coordinates,
+%% pgfmanual-en-tikz-paths,
+%% pgfmanual-en-tikz-actions,
+%% pgfmanual-en-tikz-arrows,
+%% pgfmanual-en-tikz-shapes,
+%% pgfmanual-en-tikz-pics,
+%% pgfmanual-en-tikz-graphs,
+%% pgfmanual-en-tikz-matrices,
+%% pgfmanual-en-tikz-trees,
+%% pgfmanual-en-tikz-plots,
+%% pgfmanual-en-tikz-transparency,
+%% pgfmanual-en-tikz-decorations,
+%% pgfmanual-en-tikz-transformations,
+%% pgfmanual-en-tikz-animations,
+%% pgfmanual-en-gd-overview,
+%% pgfmanual-en-gd-usage-tikz,
+%% pgfmanual-en-gd-usage-pgf,
+%% pgfmanual-en-gd-trees,
+%% pgfmanual-en-gd-layered,
+%% pgfmanual-en-gd-force,
+%% pgfmanual-en-gd-circular,
+%% pgfmanual-en-gd-phylogenetics,
+%% pgfmanual-en-gd-edge-routing,
+%%% pgfmanual-en-gd-ogdf,
+%% pgfmanual-en-gd-algorithm-layer,
+%% pgfmanual-en-gd-algorithms-in-c,
+%% pgfmanual-en-gd-display-layer,
+%% pgfmanual-en-gd-binding-layer,
+%% pgfmanual-en-library-angles,
+%% pgfmanual-en-library-arrows,
+%% pgfmanual-en-library-automata,
+%% pgfmanual-en-library-babel,
+%% pgfmanual-en-library-backgrounds,
+%% pgfmanual-en-library-calc,
+%% pgfmanual-en-library-calendar,
+%% pgfmanual-en-library-chains,
+%% pgfmanual-en-library-circuits,
+%% pgfmanual-en-library-decorations,
+%% pgfmanual-en-library-er,
+%% pgfmanual-en-library-external,
+%% pgfmanual-en-library-fadings,
+%% pgfmanual-en-library-fit,
+%% pgfmanual-en-library-fixedpoint,
+%% pgfmanual-en-library-fpu,
+%% pgfmanual-en-library-lsystems,
+%% pgfmanual-en-library-math,
+%% pgfmanual-en-library-matrices,
+%% pgfmanual-en-library-mindmaps,
+%% pgfmanual-en-library-folding,
+%% pgfmanual-en-library-patterns,
+%% pgfmanual-en-library-petri,
+%% pgfmanual-en-library-plot-handlers,
+%% pgfmanual-en-library-plot-marks,
+%% pgfmanual-en-library-profiler,
+%% pgfmanual-en-library-rdf,
+%% pgfmanual-en-library-shadings,
+%% pgfmanual-en-library-shadows,
+%% pgfmanual-en-library-shapes,
+%% pgfmanual-en-library-spy,
+%% pgfmanual-en-library-svg-path,
+%% pgfmanual-en-library-edges,
+%% pgfmanual-en-library-through,
+%% pgfmanual-en-library-trees,
+%% pgfmanual-en-library-turtle,
+%% pgfmanual-en-library-views,
+%% pgfmanual-en-dv-introduction,
+%% pgfmanual-en-dv-main,
+%% pgfmanual-en-dv-formats,
+%% pgfmanual-en-dv-axes,
+%% pgfmanual-en-dv-visualizers,
+%% pgfmanual-en-dv-stylesheets,
+%% pgfmanual-en-dv-polar,
+%% pgfmanual-en-dv-backend,
+%% pgfmanual-en-pgfkeys,
+%% pgfmanual-en-pgffor,
+%% pgfmanual-en-pgfcalendar,
+%% pgfmanual-en-pages,
+%% pgfmanual-en-xxcolor,
+%% pgfmanual-en-module-parser,
+%% pgfmanual-en-math-design,
+%% pgfmanual-en-math-parsing,
+%% pgfmanual-en-math-commands,
+%% pgfmanual-en-math-algorithms,
+%% pgfmanual-en-math-numberprinting,
+%% pgfmanual-en-oo,
+%% pgfmanual-en-base-design,
+%% pgfmanual-en-base-scopes,
+%% pgfmanual-en-base-points,
+%% pgfmanual-en-base-paths,
+%% pgfmanual-en-base-decorations,
+%% pgfmanual-en-base-actions,
+%% pgfmanual-en-base-arrows,
+%% pgfmanual-en-base-nodes,
+%% pgfmanual-en-base-matrices,
+%% pgfmanual-en-base-transformations,
+%% pgfmanual-en-base-patterns,
+%% pgfmanual-en-base-images,
+%% pgfmanual-en-base-external,
+%% pgfmanual-en-base-plots,
+%% pgfmanual-en-base-layers,
+%% pgfmanual-en-base-shadings,
+%% pgfmanual-en-base-transparency,
+%% pgfmanual-en-base-animations,
+%% pgfmanual-en-base-internalregisters,
+%% pgfmanual-en-base-quick,
+%% pgfmanual-en-pgfsys-overview,
+%% pgfmanual-en-pgfsys-commands,
+%% pgfmanual-en-pgfsys-paths,
+%% pgfmanual-en-pgfsys-protocol,
+%% pgfmanual-en-pgfsys-animations,
+%}
+%% -----------------------------------------------------------------------------
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "~/pgf/doc/generic/pgf/version-for-luatex/en/pgfmanual"
+%%% coding: iso-latin-1-unix
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-main.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-main.tex
new file mode 100644
index 0000000000..8853888a5c
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-main.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\input{pgfmanual-en-main-preamble.tex}
+\input{pgfmanual-en-main-body.tex}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-math-algorithms.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-algorithms.tex
new file mode 100644
index 0000000000..1acec247f8
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-algorithms.tex
@@ -0,0 +1,207 @@
+% Copyright 2007 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Customizing the Mathematical Engine}
+\label{pgfmath-reimplement}
+
+Perhaps you have a desire for some function that \pgfname\ does not provide.
+Perhaps you are not happy with the accuracy or efficiency of some of the
+algorithms that are implemented in \pgfname. In these cases you will want to
+add a function to the parser or replace the current implementations of the
+algorithms with your own code.
+
+The mathematical engine was designed with such customization in mind. It is
+possible to add new functions, or modify the code for existing functions. Note,
+however, that whilst adding new operators is possible, it can be a rather
+tricky business and is only recommended for adventurous users.
+
+To add a new function to the math engine the following command can be used:
+
+\begin{command}{\pgfmathdeclarefunction\opt{|*|}\marg{name}\marg{number of arguments}\marg{code}}
+ This will set up the parser to recognize a function called \meta{name}. The
+ name of the function can consist of, uppercase or lowercase letters,
+ numbers or the underscore |_|. In line with many programming languages, a
+ function name cannot begin with a number or contain any spaces. The
+ function may not have been declared earlier, unless the optional star (|*|)
+ is provided, which forces an ``overwriting'' of the function by the new
+ function. Note that you \emph{should never change the arity of standard
+ functions} and you should normally use |\pgfmathredeclarefunction|,
+ which does not allow you to do anything wrong here.
+
+ The \meta{number of arguments} can be any positive integer, zero, or the
+ value |...|, which indicates a variable number of arguments. \pgfname{}
+ treats constants, such as |pi| and |e|, as functions with zero arguments.
+ Functions with more than nine arguments or with a variable number of
+ arguments are a ``bit special'' and are discussed below.
+
+ The effect of \meta{code} should be to set the macro |\pgfmathresult| to
+ the correct value (namely to the result of the computation without units).
+ Furthermore, the function should have no other side effects, that is, it
+ should not change any global values. As an example, consider the creation
+ of a new function |double|, which takes one argument, and returns the value
+ of that argument times two.
+ %
+\begin{codeexample}[]
+\makeatletter
+\pgfmathdeclarefunction{double}{1}{
+ \begingroup
+ \pgf@x=#1pt\relax
+ \multiply\pgf@x by2\relax
+ \pgfmathreturn\pgf@x
+ \endgroup
+}
+\makeatother
+\pgfmathparse{double(44.3)}\pgfmathresult
+\end{codeexample}
+
+ The macro |\pgfmathreturn|\meta{tokens} must be
+ directly followed by an |\endgroup| and will save the result of the
+ computation, by defining |\pgfmathresult| as the expansion of
+ \meta{tokens} (without units) outside the group, so \meta{tokens}
+ must be something that can be assigned to a dimension register.
+
+ Alternatively, the |\pgfmathsmuggle|\meta{macro} can be used. This must
+ also be directly followed by an |\endgroup| and will simply ``smuggle'' the
+ definition of \meta{macro} outside the \TeX-group.
+
+ By performing computations within a \TeX-group, \pgfname{} registers such
+ as |\pgf@x|, |\pgf@y| and |\c@pgf@counta|, |\c@pgfcountb|, and so forth,
+ can be used at will.
+
+ Beyond setting up the parser, this command also defines two macros which
+ provide access to the function independently of the parser:
+ %
+ \begin{itemize}
+ \item |\pgfmath|\meta{function name}
+
+ This macro will provide a ``public'' interface for the function
+ \meta{function name} allowing the function to be called
+ independently of the parser. All arguments passed to this macro are
+ evaluated using |\pgfmathparse| and then passed on to the following
+ macro:
+ \item |\pgfmath|\meta{function name}|@|
+
+ This macro is the ``private'' implementation of the function's
+ algorithm (but note that, for speed, the parser calls this macro
+ rather than the ``public'' one). Arguments passed to this macro are
+ expected to be numbers without units. It is defined using
+ \meta{code}, but need not be self-contained.
+ \end{itemize}
+
+ For functions that are declared with less than ten arguments, the public
+ macro is defined in the same way as normal \TeX{} macros using, for
+ example, |\def\pgfmathNoArgs{|\meta{code}|}| for a function with no
+ arguments, or |\def\pgfmathThreeArgs#1#2#3{|\meta{code}|}| for a function
+ with three arguments. The private macro is defined in the same way, and
+ each argument can therefore be accessed in \meta{code} using |#1|, |#2| and
+ so on.
+
+ For functions with more than nine arguments, or functions with a variable
+ number of arguments, these macros are only defined as taking \emph{one}
+ argument. The public macro expects its arguments to be comma separated, for
+ example, |\pgfmathVariableArgs{1.1,3.5,-1.5,2.6}|. Each argument is parsed
+ and passed on to the private macro as follows:
+ |\pgfmathVariableArgs@{{1.1}{3.5}{-1.5}{2.6}}|. This means that some
+ ``extra work'' will be required to access each argument (although it is a
+ fairly simple task).
+
+ Note that there are two exceptions to this arrangement: the public versions
+ of the |min| and |max| functions still take two arguments for compatibility
+ with older versions, but each of these arguments can take several comma
+ separated values.
+\end{command}
+
+To redefine a function use the following command:
+
+\begin{command}{\pgfmathredeclarefunction\marg{function name}\marg{algorithm code}}
+ This command redefines the |\pgfmath|\meta{function name}|@| macro with the
+ new \meta{algorithm code}. See the description of the
+ |\pgfmathdeclarefunction| for details. You cannot change the number of
+ arguments for an existing function.
+ %
+\begin{codeexample}[]
+\makeatletter
+\pgfmathdeclarefunction{foo}{1}{
+ \begingroup
+ \pgf@x=#1pt\relax
+ \multiply\pgf@x by2\relax
+ \pgfmathreturn\pgf@x
+ \endgroup
+}
+\pgfmathparse{foo(42)}\pgfmathresult
+\pgfmathredeclarefunction{foo}{
+ \begingroup
+ \pgf@x=#1pt\relax
+ \multiply\pgf@x by3\relax
+ \pgfmathreturn\pgf@x
+ \endgroup
+}
+\pgfmathparse{foo(42)}\pgfmathresult
+\makeatother
+\end{codeexample}
+ %
+\end{command}
+
+ \pgfname{} uses the last known definition of a function within the
+ prevailing scope, so it is possible for a function to be redefined locally.
+ You should also remember that any |.sty| or |.tex| file containing any
+ re-implementations should be loaded after |pgfmath|.
+
+ In addition to the above commands, the following key is provided to quickly
+ create simple ad hoc functions which can greatly improve the readability of
+ code, and is particularly useful in \tikzname{}:
+
+\begin{key}{/pgf/declare function=\meta{function definitions}}
+ This key allows simple functions to be created locally. Its use is perhaps
+ best illustrated by an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \draw [blue, thick, x=0.0085cm, y=1cm,
+ declare function={
+ sines(\t,\a,\b)=1 + 0.5*(sin(\t)+sin(\t*\a)+sin(\t*\b));
+ }]
+ plot [domain=0:360, samples=144, smooth] (\x,{sines(\x,3,5)});
+\end{tikzpicture}
+\end{codeexample}
+
+ Each definition in \meta{function definitions} takes the form
+ \meta{name}|(|\meta{arguments}|)=|\meta{definition}|;| (note the semicolon
+ at the end, this is very important). If multiple functions are being
+ defined, the semicolon is used to separate them (\emph{not} a comma). The
+ function \meta{name} can be any name that is not already a function name in
+ the current scope. The list of \meta{arguments} are commands such as |\x|,
+ or |\y| (it is not possible to declare functions that take variable numbers
+ of arguments using this key). If the function takes no arguments, then the
+ parentheses need not be used. The \meta{definition} should be an expression
+ that can be parsed by the mathematical engine and should use the commands
+ specified in \meta{arguments}.
+
+ When specifying multiple functions, functions that appear later on in
+ \meta{function definitions} can refer to earlier functions:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ declare function={
+ excitation(\t,\w) = sin(\t*\w);
+ noise = rnd - 0.5;
+ source(\t) = excitation(\t,20) + noise;
+ filter(\t) = 1 - abs(sin(mod(\t, 90)));
+ speech(\t) = 1 + source(\t)*filter(\t);
+ }
+]
+ \draw [help lines] (0,0) grid (3,2);
+ \draw [blue, thick, x=0.0085cm, y=1cm] (0,1) --
+ plot [domain=0:360, samples=144, smooth] (\x,{speech(\x)});
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-math-commands.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-commands.tex
new file mode 100644
index 0000000000..c6c0fef02c
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-commands.tex
@@ -0,0 +1,246 @@
+% Copyright 2007 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Additional Mathematical Commands}
+\label{pgfmath-commands}
+
+Instead of parsing and evaluating complex expressions, you can also use the
+mathematical engine to evaluate a single mathematical operation. The macros
+used for many of these computations are listed above in
+Section~\ref{pgfmath-functions}. \pgfname{} also provides some additional
+commands which are shown below:
+
+
+\subsection{Basic arithmetic functions}
+\label{pgfmath-commands-basic}
+
+In addition to the commands described in Section~\ref{pgfmath-functions-basic},
+the following command is provided:
+
+\begin{command}{\pgfmathreciprocal\marg{x}}
+ Defines |\pgfmathresult| as $1\div\meta{x}$. This provides greatest
+ accuracy when \mvar{x} is small.
+\end{command}
+
+
+\subsection{Comparison and logical functions}
+
+In addition to the commands described in
+Section~\ref{pgfmath-functions-comparison}, the following command was provided
+by Christian Feuers\"anger:
+
+\begin{command}{\pgfmathapproxequalto\marg{x}\marg{y}}
+ Defines |\pgfmathresult| 1.0 if $ \rvert \meta{x} - \meta{y} \lvert <
+ 0.0001$, but 0.0 otherwise. As a side-effect, the global boolean
+ |\ifpgfmathcomparison| will be set accordingly.
+\end{command}
+
+
+\subsection{Pseudo-Random Numbers}
+\label{pgfmath-random}
+
+In addition to the commands described in
+Section~\ref{pgfmath-functions-random}, the following commands are provided:
+
+\begin{command}{\pgfmathgeneratepseudorandomnumber}
+ Defines |\pgfmathresult| as a pseudo-random integer between 1 and
+ $2^{31}-1$. This uses a linear congruency generator, based on ideas of
+ Erich Janka.
+\end{command}
+
+\begin{command}{\pgfmathrandominteger\marg{macro}\marg{minimum}\marg{maximum}}
+ This defines \meta{macro} as a pseudo-randomly generated integer from the
+ range \meta{minimum} to \meta{maximum} (inclusive).
+ %
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \foreach \x in {1,...,50}{
+ \pgfmathrandominteger{\a}{1}{50}
+ \pgfmathrandominteger{\b}{1}{50}
+ \pgfpathcircle{\pgfpoint{+\a pt}{+\b pt}}{+2pt}
+ \color{blue!40!white}
+ \pgfsetstrokecolor{blue!80!black}
+ \pgfusepath{stroke, fill}
+ }
+\end{pgfpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathdeclarerandomlist\marg{list name}\{\marg{item-1}\marg{item 2}...\}}
+ This creates a list of items with the name \meta{list name}.
+\end{command}
+
+\begin{command}{\pgfmathrandomitem\marg{macro}\marg{list name}}
+ Select an item from a random list \meta{list name}. The
+ selected item is placed in \meta{macro}.
+\end{command}
+
+\begin{codeexample}[]
+\begin{pgfpicture}
+ \pgfmathdeclarerandomlist{color}{{red}{blue}{green}{yellow}{white}}
+ \foreach \a in {1,...,50}{
+ \pgfmathrandominteger{\x}{1}{85}
+ \pgfmathrandominteger{\y}{1}{85}
+ \pgfmathrandominteger{\r}{5}{10}
+ \pgfmathrandomitem{\c}{color}
+ \pgfpathcircle{\pgfpoint{+\x pt}{+\y pt}}{+\r pt}
+ \color{\c!40!white}
+ \pgfsetstrokecolor{\c!80!black}
+ \pgfusepath{stroke, fill}
+ }
+\end{pgfpicture}
+\end{codeexample}
+
+\begin{command}{\pgfmathsetseed\marg{integer}}
+ Explicitly sets the seed for the pseudo-random number generator. By default
+ it is set to the value of |\time|$\times$|\year|.
+\end{command}
+
+
+\subsection{Base Conversion}
+\label{pgfmath-bases}
+
+\pgfname{} provides limited support for conversion between
+\emph{representations} of numbers. Currently the numbers must be positive
+integers in the range $0$ to $2^{31}-1$, and the bases in the range $2$ to
+$36$. All digits representing numbers greater than 9 (in base ten), are
+alphabetic, but may be upper or lower case.
+
+In addition to the commands described in Section~\ref{pgfmath-functions-base},
+the following commands are provided:
+
+\begin{command}{\pgfmathbasetodec\marg{macro}\marg{number}\marg{base}}
+ Defines \meta{macro} as the result of converting \meta{number} from base
+ \meta{base} to base 10. Alphabetic digits can be upper or lower case.
+
+\medskip{\def\medskip{}
+
+\begin{codeexample}[]
+\pgfmathbasetodec\mynumber{107f}{16} \mynumber
+\end{codeexample}
+
+ \noindent Note that, as usual in \TeX, the braces around an argument can be
+ omitted if the argument is just a single token (a macro name is a single
+ token).
+ %
+\begin{codeexample}[]
+\pgfmathbasetodec\mynumber{33FC}{20} \mynumber
+\end{codeexample}
+
+}\medskip
+ %
+\end{command}
+
+\begin{command}{\pgfmathdectobase\marg{macro}\marg{number}\marg{base}}
+ Defines \meta{macro} as the result of converting \meta{number} from base 10
+ to base \meta{base}. Any resulting alphabetic digits are in \emph{lower
+ case}.
+ %
+\begin{codeexample}[]
+\pgfmathdectobase\mynumber{65535}{16} \mynumber
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathdectoBase\marg{macro}\marg{number}\marg{base}}
+ Defines \meta{macro} as the result of converting \meta{number} from base 10
+ to base \meta{base}. Any resulting alphabetic digits are in \emph{upper
+ case}.
+ %
+\begin{codeexample}[]
+\pgfmathdectoBase\mynumber{65535}{16} \mynumber
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathbasetobase\marg{macro}\marg{number}\marg{base-1}\marg{base-2}}
+ Defines \meta{macro} as the result of converting \meta{number} from base
+ \meta{base-1} to base \meta{base-2}. Alphabetic digits in \meta{number} can
+ be upper or lower case, but any resulting alphabetic digits are in
+ \emph{lower case}.
+ %
+\begin{codeexample}[]
+\pgfmathbasetobase\mynumber{11011011}{2}{16} \mynumber
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathbasetoBase\marg{macro}\marg{number}\marg{base-1}\marg{base-2}}
+ Defines \meta{macro} as the result of converting \meta{number} from base
+ \meta{base-1} to base \meta{base-2}. Alphabetic digits in \meta{number} can
+ be upper or lower case, but any resulting alphabetic digits are in
+ \emph{upper case}.
+ %
+\begin{codeexample}[]
+\pgfmathbasetoBase\mynumber{121212}{3}{12} \mynumber
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathsetbasenumberlength\marg{integer}}
+ Sets the number of digits in the result of a base conversion to
+ \meta{integer}. If the result of a conversion has less digits than this
+ number, it is prefixed with zeros.
+ %
+\begin{codeexample}[]
+\pgfmathsetbasenumberlength{8}
+\pgfmathdectobase\mynumber{15}{2} \mynumber
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathtodigitlist\marg{macro}\marg{number}}
+ This command converts \meta{number} into a comma-separated list of digits
+ and stores the result in \meta{macro}. The \marg{number} is \emph{not}
+ parsed before processing.
+ %
+\begin{codeexample}[]
+\pgfmathsetbasenumberlength{8}
+\begin{tikzpicture}[x=0.25cm, y=0.25cm]
+ \foreach \n [count=\y] in {0, 60, 102, 102, 126, 102, 102, 102, 0}{
+ \pgfmathdectobase{\binary}{\n}{2}
+ \pgfmathtodigitlist{\digitlist}{\binary}
+ \foreach \digit [count=\x, evaluate={\c=\digit*50+15;}] in \digitlist
+ \fill [fill=black!\c] (\x, -\y) rectangle ++(1,1);
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Angle Computations}
+
+Unlike the rest of the math engine, which is a ``standalone'' package, the
+following commands only work in conjunction with the core of \pgfname.
+
+\begin{command}{\pgfmathanglebetweenpoints\marg{p}\marg{q}}
+ Returns the angle of a line from \meta{p} to \meta{q} relative to a line
+ going straight right from \meta{p}.
+ %
+\begin{codeexample}[]
+\pgfmathanglebetweenpoints{\pgfpoint{1cm}{3cm}}{\pgfpoint{2cm}{4cm}}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathanglebetweenlines\marg{$p_1$}\marg{$q_1$}\marg{$p_2$}\marg{$q_2$}}
+ Returns the clockwise angle between a line going through $p_1$ and $q_1$
+ and a line going through $p_2$ and $q_2$.
+ %
+\begin{codeexample}[]
+\pgfmathanglebetweenlines{\pgfpoint{1cm}{3cm}}{\pgfpoint{2cm}{4cm}}
+ {\pgfpoint{0cm}{1cm}}{\pgfpoint{1cm}{0cm}}
+\pgfmathresult
+\end{codeexample}
+ %
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-math-design.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-design.tex
new file mode 100644
index 0000000000..43a93b08b5
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-design.tex
@@ -0,0 +1,95 @@
+% Copyright 2007 by Mark Wibrow and Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Design Principles}
+
+\pgfname{} needs to perform many computations while typesetting a picture. For
+this, \pgfname\ relies on a mathematical engine, which can also be used
+independently of \pgfname, but which is distributed as part of the \pgfname\
+package nevertheless. Basically, the engine provides a parsing mechanism
+similar to the \calcname{} package so that expressions like |2*3cm+5cm| can be
+parsed; but the \pgfname\ engine is more powerful and can be extended and
+enhanced.
+
+\pgfname{} provides enhanced functionality, which permits the parsing of
+mathematical operations involving integers and non-integers with or without
+units. Furthermore, various functions, including trigonometric functions and
+random number generators can also be parsed (see
+Section~\ref{pgfmath-parsing}). The \calcname{} macros |\setlength| and friends
+have \pgfname{} versions which can parse these operations and functions (see
+Section~\ref{pgfmath-registers}). Additionally, each operation and function has
+an independent \pgfname{} command associated with it (see
+Section~\ref{pgfmath-commands}), and can be accessed outside the parser.
+
+The mathematical engine of \pgfname\ is implicitly used whenever you specify a
+number or dimension in a higher-level macro. For instance, you can write
+|\pgfpoint{2cm+4cm/2}{3cm*sin(30)}| or suchlike. However, the mathematical
+engine can also be used independently of the \pgfname\ core, that is, you can
+also just load it to get access to a mathematical parser.
+
+
+\subsection{Loading the Mathematical Engine}
+
+The mathematical engine of \pgfname\ is loaded automatically by \pgfname, but
+if you wish to use the mathematical engine but you do not need \pgfname\
+itself, you can load the following package:
+
+\begin{package}{pgfmath}
+ This command will load the mathematical engine of \pgfname, but not
+ \pgfname{} itself. It defines commands like |\pgfmathparse|.
+\end{package}
+
+
+\subsection{Layers of the Mathematical Engine}
+
+Like \pgfname\ itself, the mathematical engine is also structured into
+different layers:
+%
+\begin{enumerate}
+ \item The top layer, which you will typically use directly, provides the
+ command |\pgfmathparse|. This command parses a mathematical expression
+ and evaluates it.
+
+ Additionally, the top layer also defines some additional functions
+ similar to the macros of the |calc| package for setting dimensions and
+ counters. These macros are just wrappers around the |\pgfmathparse|
+ macro.
+
+ \item The calculation layer provides macros for performing one specific
+ computation like computing a reciprocal or a multiplication. The parser
+ uses these macros for the actual computation.
+ \item The implementation layer provides the actual implementations of the
+ computations. These can be changed (and possibly be made more
+ efficient) without affecting the higher layers.
+\end{enumerate}
+
+
+\subsection{Efficiency and Accuracy of the Mathematical Engine}
+
+Currently, the mathematical algorithms are all implemented in \TeX. This poses
+some intriguing programming challenges as \TeX{} is a language for typesetting,
+rather than for general mathematics, and as with any programming language,
+there is a trade-off between accuracy and efficiency. If you find the level of
+accuracy insufficient for your purposes, you will have to replace the
+algorithms in the implementation layer.
+
+All the fancy mathematical ``bells-and-whistles'' that the parser provides,
+come with an additional processing cost, and in some instances, such as simply
+setting a length to |1cm|, with no other operations involved, the additional
+processing time is undesirable. To overcome this, the following feature is
+implemented: when no mathematical operations are required, an expression can be
+preceded by |+|. This will bypass the parsing process and the assignment will
+be orders of magnitude faster. This feature \emph{only} works with the macros
+for setting registers described in Section~\ref{pgfmath-registers}.
+%
+\begin{codeexample}[code only]
+\pgfmathsetlength\mydimen{1cm} % parsed : slower.
+\pgfmathsetlength\mydimen{+1cm} % not parsed : much faster.
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-math-numberprinting.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-numberprinting.tex
new file mode 100644
index 0000000000..9cd4a9a6dd
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-numberprinting.tex
@@ -0,0 +1,875 @@
+
+\section{Number Printing}
+\label{pgfmath-numberprinting}
+
+{\emph{An extension by Christian Feuersänger}}
+
+\medskip
+\noindent
+\pgfname\ supports number printing in different styles and rounds to arbitrary
+precision.
+
+\begin{command}{\pgfmathprintnumber\marg{x}}
+ Generates pretty-printed output for the (real) number \meta{x}. The input
+ number \meta{x} is parsed using |\pgfmathfloatparsenumber| which allows
+ arbitrary precision.
+
+ Numbers are typeset in math mode using the current set of number printing
+ options, see below. Optional arguments can also be provided using
+ |\pgfmathprintnumber[|\meta{options}|]|\meta{x}.
+\end{command}
+
+\begin{command}{\pgfmathprintnumberto\marg{x}\marg{macro}}
+ Returns the resulting number into \meta{macro} instead of typesetting it
+ directly.
+\end{command}
+
+\begin{key}{/pgf/number format/fixed}
+ Configures |\pgfmathprintnumber| to round the number to a fixed number of
+ digits after the period, discarding any trailing zeros.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed,precision=2}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-04}\hspace{1em}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{24415.98123}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+
+ See section~\ref{sec:number:styles} for how to change the appearance.
+\end{key}
+
+\begin{key}{/pgf/number format/fixed zerofill=\marg{boolean} (default true)}
+ Enables or disables zero filling for any number drawn in fixed point
+ format.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=2}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-04}\hspace{1em}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{24415.98123}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+ %
+ This key affects numbers drawn with |fixed| or |std| styles (the latter
+ only if no scientific format is chosen).
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,std,fixed zerofill,precision=2}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-05}\hspace{1em}
+\pgfmathprintnumber{1}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+
+ See section~\ref{sec:number:styles} for how to change the appearance.
+\end{key}
+
+\begin{key}{/pgf/number format/sci}
+ Configures |\pgfmathprintnumber| to display numbers in scientific format,
+ that means sign, mantissa and exponent (basis~$10$). The mantissa is
+ rounded to the desired |precision| (or |sci precision|, see below).
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,precision=2}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-04}\hspace{1em}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{24415.98123}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+
+ See section~\ref{sec:number:styles} for how to change the exponential
+ display style.
+\end{key}
+
+\begin{key}{/pgf/number format/sci zerofill=\marg{boolean} (default true)}
+ Enables or disables zero filling for any number drawn in scientific format.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,sci zerofill,precision=2}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-04}\hspace{1em}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{24415.98123}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+ %
+ As with |fixed zerofill|, this option does only affect numbers drawn in
+ |sci| format (or |std| if the scientific format is chosen).
+
+ See section~\ref{sec:number:styles} for how to change the exponential
+ display style.
+\end{key}
+
+\begin{stylekey}{/pgf/number format/zerofill=\marg{boolean} (default true)}
+ Sets both |fixed zerofill| and |sci zerofill| at once.
+\end{stylekey}
+
+\begin{keylist}{/pgf/number format/std,%
+ /pgf/number format/std=\meta{lower e},
+ /pgf/number format/std=\meta{lower e}:\meta{upper e}%
+}
+ Configures |\pgfmathprintnumber| to a standard algorithm. It chooses either
+ |fixed| or |sci|, depending on the order of magnitude. Let $n=s \cdot m
+ \cdot 10^e$ be the input number and $p$ the current precision. If $-p/2 \le
+ e \le 4$, the number is displayed using |fixed| format. Otherwise, it is
+ displayed using |sci| format.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,std,precision=2}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-04}\hspace{1em}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{24415.98123}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+ %
+ The parameters can be customized using the optional integer argument(s): if
+ $\text{\meta{lower e}} \le e \le \text{\meta{upper e}}$, the number is
+ displayed in |fixed| format, otherwise in |sci| format. Note that
+ \meta{lower e} should be negative for useful results. The precision used
+ for the scientific format can be adjusted with |sci precision| if
+ necessary.
+\end{keylist}
+
+\begin{keylist}{/pgf/number format/relative*=\meta{exponent base 10}}
+ Configures |\pgfmathprintnumber| to format numbers relative to an order of
+ magnitude, $10^r$, where $r$ is an integer number.
+
+ This key addresses different use-cases.
+
+ \paragraph{First use-case:}
+
+ provide a unified format for a \emph{sequence} of numbers. Consider the
+ following test:
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/relative*={1}}
+\pgfmathprintnumber{6.42e-16}\hspace{1em}
+\pgfmathprintnumber{1.2}\hspace{1em}
+\pgfmathprintnumber{6}\hspace{1em}
+\pgfmathprintnumber{20.6}\hspace{1em}
+\pgfmathprintnumber{87}
+\end{codeexample}
+ %
+ \noindent With any other style, the |6.42e-16| would have been formatted as
+ an isolated number. Here, it is rounded to |0| because when viewed relative
+ to $10^1$ (the exponent $1$ is the argument for |relative|), it has no
+ significant digits.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/relative*={2}}
+\pgfmathprintnumber{123.345}\hspace{1em}
+\pgfmathprintnumber{0.0012}\hspace{1em}
+\pgfmathprintnumber{0.0014}\hspace{1em}
+\end{codeexample}
+ %
+ \noindent The example above applies the initial |precision=2| to |123.345|
+ -- relative to $100$. Two significant digits of |123.345| relative to $100$
+ are |123|. Note that the ``$2$ significant digits of |123.345|'' translates
+ to ``round |1.2345| to $2$ digits'', which would yield |1.2300|. Similarly,
+ the other two numbers are |0| compared to $100$ using the given
+ |precision|.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/relative*={-3}}
+\pgfmathprintnumber{123.345}\hspace{1em}
+\pgfmathprintnumber{0.0012}\hspace{1em}
+\pgfmathprintnumber{0.0014}\hspace{1em}
+\end{codeexample}
+
+ \paragraph{Second use-case:}
+
+ improve rounding in the presence of \emph{inaccurate} numbers. Let us
+ suppose that some limited-precision arithmetics resulted in the result
+ |123456999| (like the |fpu| of \pgfname). You know that its precision is
+ about five or six significant digits. And you want to provide a fixed point
+ output. In this case, the trailing digits |....999| are a numerical
+ artifact due to the limited precision. Use |relative*=3,precision=0| to
+ eliminate the artifacts:
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,relative*={3},precision=0}
+\pgfmathprintnumber{123456999}\hspace{1em}
+\pgfmathprintnumber{123456999.12}
+\end{codeexample}
+ %
+ \noindent Here, |precision=0| means that we inspect |123456.999| and round
+ that number to $0$ digits. Finally, we move the period back to its initial
+ position. Adding |relative style=fixed| results in fixed point output
+ format:
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,relative*={3},precision=0,relative style=fixed}
+\pgfmathprintnumber{123456999}\hspace{1em}
+\pgfmathprintnumber{123456999.12}
+\end{codeexample}
+ %
+ \noindent Note that there is another alternative for this use-case which is
+ discussed later: the |fixed relative| style.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed relative,precision=6}
+\pgfmathprintnumber{123456999}\hspace{1em}
+\pgfmathprintnumber{123456999.12}
+\end{codeexample}
+
+ You might wonder why there is an asterisk in the key's name. The short
+ answer is: there is also a \declareandlabel{/pgf/number format/relative}
+ number printer which does unexpected things. The key |relative*| repairs
+ this. Existing code will still use the old behavior.
+
+ Technically, the key works as follows: as already explained above,
+ |relative*=3| key applied to |123456999.12| moves the period by three
+ positions and analyzes |123456.99912|. Mathematically speaking, we are
+ given a number $x = \pm m \cdot 10^e$ and we attempt to apply
+ |relative*=|$r$. The method then rounds $x / 10^r$ to |precision| digits.
+ Afterwards, it multiplies the result by $10^r$ and typesets it.
+\end{keylist}
+
+\begin{stylekey}{/pgf/number format/every relative}
+ A style which configures how the |relative| method finally displays its
+ results.
+
+ The initial configuration is
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/number format/every relative/.style=std}
+\end{codeexample}
+
+ Note that rounding is turned off when the resulting style is being
+ evaluated (since |relative| already rounded the number).
+
+ Although supported, I discourage from using |fixed zerofill| or
+ |sci zerofill| in this context -- it may lead to a suggestion of higher
+ precision than is actually used (because |fixed zerofill| might simply add
+ |.00| although there was a different information before |relative| rounded
+ the result).
+\end{stylekey}
+
+\begin{key}{/pgf/number format/relative style=\marg{options}}
+ The same as |every relative/.append style=|\marg{options}.
+\end{key}
+
+\begin{keylist}{/pgf/number format/fixed relative}
+ Configures |\pgfmathprintnumber| to format numbers in a similar way to the
+ |fixed| style, but the |precision| is interpreted relatively to the
+ number's exponent.
+
+ The motivation is to get the same rounding effect as for |sci|, but to
+ display the number in the |fixed| style:
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed relative,precision=3}
+\pgfmathprintnumber{1000.0123}\hspace{1em}
+\pgfmathprintnumber{100.0567}\hspace{1em}
+\pgfmathprintnumber{0.000010003452}\hspace{1em}
+\pgfmathprintnumber{0.010073452}\hspace{1em}
+\pgfmathprintnumber{1.23567}\hspace{1em}
+\pgfmathprintnumber{1003.75}\hspace{1em}
+\pgfmathprintnumber{1006.75}\hspace{1em}
+\end{codeexample}
+
+ The effect of |fixed relative| is that the number is rounded to
+ \emph{exactly} the first \meta{precision} non-zero digits, no matter how
+ many leading zeros the number might have.
+
+ Use |fixed relative| if you want |fixed| and if you know that only the
+ first $n$ digits are correct. Use |sci| if you need a scientific display
+ style and only the first $n$ digits are correct.
+
+ Note that |fixed relative| ignores the |fixed zerofill| flag.
+
+ See also the |relative*| key. Note that the |relative=|\marg{exponent} key
+ explicitly moves the period to some designated position before it attempts
+ to round the number. Afterwards, it ``rounds from the right'', i.e.\ it
+ rounds to that explicitly chosen digit position. In contrast to that,
+ |fixed relative| ``rounds from the left'': it takes the \emph{first}
+ non-zero digit, temporarily places the period after this digit, and rounds
+ that number. The rounding style |fixed| leaves the period where it is, and
+ rounds everything behind that digit. The |sci| style is similar to |fixed
+ relative|.
+\end{keylist}
+
+\begin{key}{/pgf/number format/int detect}
+ Configures |\pgfmathprintnumber| to detect integers automatically. If the
+ input number is an integer, no period is displayed at all. If not, the
+ scientific format is chosen.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,int detect,precision=2}
+\pgfmathprintnumber{15}\hspace{1em}
+\pgfmathprintnumber{20}\hspace{1em}
+\pgfmathprintnumber{20.4}\hspace{1em}
+\pgfmathprintnumber{0.01}\hspace{1em}
+\pgfmathprintnumber{0}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{command}{\pgfmathifisint\marg{number constant}\marg{true code}\marg{false code}}
+ A command which does the same check as |int detect|, but it invokes
+ \meta{true code} if the \meta{number constant} actually is an integer and
+ the \meta{false code} if not.
+
+ As a side-effect, |\pgfretval| will contain the parsed number, either in
+ integer format or as parsed floating point number.
+
+ The argument \meta{number constant} will be parsed with
+ |\pgfmathfloatparsenumber|.
+ %
+\begin{codeexample}[]
+15 \pgfmathifisint{15}{is an int: \pgfretval.}{is no int}\hspace{1em}
+15.5 \pgfmathifisint{15.5}{is an int: \pgfretval.}{is no int}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{key}{/pgf/number format/int trunc}
+ Truncates every number to integers (discards any digit after the period).
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,int trunc}
+\pgfmathprintnumber{4.568}\hspace{1em}
+\pgfmathprintnumber{5e-04}\hspace{1em}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{24415.98123}\hspace{1em}
+\pgfmathprintnumber{123456.12345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/frac}
+ Displays numbers as fractionals.
+ %
+\begin{codeexample}[width=3cm]
+\pgfkeys{/pgf/number format/frac}
+\pgfmathprintnumber{0.333333333333333}\hspace{1em}
+\pgfmathprintnumber{0.5}\hspace{1em}
+\pgfmathprintnumber{2.133333333333325e-01}\hspace{1em}
+\pgfmathprintnumber{0.12}\hspace{1em}
+\pgfmathprintnumber{2.666666666666646e-02}\hspace{1em}
+\pgfmathprintnumber{-1.333333333333334e-02}\hspace{1em}
+\pgfmathprintnumber{7.200000000000000e-01}\hspace{1em}
+\pgfmathprintnumber{6.666666666666667e-02}\hspace{1em}
+\pgfmathprintnumber{1.333333333333333e-01}\hspace{1em}
+\pgfmathprintnumber{-1.333333333333333e-02}\hspace{1em}
+\pgfmathprintnumber{3.3333333}\hspace{1em}
+\pgfmathprintnumber{1.2345}\hspace{1em}
+\pgfmathprintnumber{1}\hspace{1em}
+\pgfmathprintnumber{-6}
+\end{codeexample}
+
+ \begin{key}{/pgf/number format/frac TeX=\marg{\textbackslash macro} (initially \texttt{\textbackslash frac})}
+ Allows to use a different implementation for |\frac| inside of the
+ |frac| display type.
+ \end{key}
+
+ \begin{key}{/pgf/number format/frac denom=\meta{int} (initially empty)}
+ Allows to provide a custom denominator for |frac|.
+ %
+\begin{codeexample}[width=3cm]
+\pgfkeys{/pgf/number format/.cd,frac, frac denom=10}
+\pgfmathprintnumber{0.1}\hspace{1em}
+\pgfmathprintnumber{0.5}\hspace{1em}
+\pgfmathprintnumber{1.2}\hspace{1em}
+\pgfmathprintnumber{-0.6}\hspace{1em}
+\pgfmathprintnumber{-1.4}\hspace{1em}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/number format/frac whole=\mchoice{true,false} (initially true)}
+ Configures whether complete integer parts shall be placed in front of
+ the fractional part. In this case, the fractional part will be less
+ then $1$. Use |frac whole=false| to avoid whole number parts.
+ %
+\begin{codeexample}[width=3cm]
+\pgfkeys{/pgf/number format/.cd,frac, frac whole=false}
+\pgfmathprintnumber{20.1}\hspace{1em}
+\pgfmathprintnumber{5.5}\hspace{1em}
+\pgfmathprintnumber{1.2}\hspace{1em}
+\pgfmathprintnumber{-5.6}\hspace{1em}
+\pgfmathprintnumber{-1.4}\hspace{1em}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/number format/frac shift=\marg{integer} (initially 4)}
+ In case you experience problems because of stability problems, try
+ experimenting with a different |frac shift|. Higher shift values $k$
+ yield higher sensitivity to inaccurate data or inaccurate arithmetics.
+
+ Technically, the following happens. If $r < 1$ is the fractional part
+ of the mantissa, then a scale $i = 1/r \cdot 10^k$ is computed where
+ $k$ is the shift; fractional parts of $i$ are neglected. The value
+ $1/r$ is computed internally, its error is amplified.
+
+ If you still experience stability problems, use |\usepackage{fp}| in
+ your preamble. The |frac| style will then automatically employ the
+ higher absolute precision of |fp| for the computation of $1/r$.
+ \end{key}
+\end{key}
+
+\begin{key}{/pgf/number format/precision=\marg{number}}
+ Sets the desired rounding precision for any display operation. For
+ scientific format, this affects the mantissa.
+\end{key}
+
+\begin{key}{/pgf/number format/sci precision=\meta{number or empty} (initially empty)}
+ Sets the desired rounding precision only for |sci| styles.
+
+ Use |sci precision={}| to restore the initial configuration (which uses the
+ argument provided to |precision| for all number styles).
+\end{key}
+
+\begin{key}{/pgf/number format/read comma as period=\mchoice{true,false} (initially false)}
+ This is one of the few keys which allows to customize the number parser. If
+ this switch is turned on, a comma is read just as a period.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/read comma as period}
+\pgfmathprintnumber{1234,56}
+\end{codeexample}
+ %
+ This is typically undesired as it can cause side-effects with math parsing
+ instructions. However, it is supported to format input numbers or input
+ tables. Consider |use comma| to typeset the result with a comma as well.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ read comma as period,
+ use comma}
+\pgfmathprintnumber{1234,56}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Changing display styles}%
+\label{sec:number:styles}
+
+You can change the way how numbers are displayed. For example, if you use the
+`\texttt{fixed}' style, the input number is rounded to the desired precision
+and the current fixed point display style is used to typeset the number. The
+same is applied to any other format: first, rounding routines are used to get
+the correct digits, afterwards a display style generates proper \TeX-code.
+
+\begin{key}{/pgf/number format/set decimal separator=\marg{text}}
+ Assigns \marg{text} as decimal separator for any fixed point numbers
+ (including the mantissa in sci format).
+
+ Use |\pgfkeysgetvalue{/pgf/number format/set decimal separator}\value| to
+ get the current separator into |\value|.
+\end{key}
+
+\begin{stylekey}{/pgf/number format/dec sep=\marg{text}}
+ Just another name for |set decimal separator|.
+\end{stylekey}
+
+\begin{key}{/pgf/number format/set thousands separator=\marg{text}}
+ Assigns \marg{text} as thousands separator for any fixed point numbers
+ (including the mantissa in sci format).
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,
+ precision=2,
+ set thousands separator={}}
+\pgfmathprintnumber{1234.56}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,
+ precision=2,
+ set thousands separator={}}
+\pgfmathprintnumber{1234567890}
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,
+ precision=2,
+ set thousands separator={.}}
+\pgfmathprintnumber{1234567890}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,
+ precision=2,
+ set thousands separator={,}}
+\pgfmathprintnumber{1234567890}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,
+ precision=2,
+ set thousands separator={{{,}}}}
+\pgfmathprintnumber{1234567890}
+\end{codeexample}
+ %
+ The last example employs commas and disables the default comma-spacing.
+
+ Use |\pgfkeysgetvalue{/pgf/number format/set thousands separator}\value| to
+ get the current separator into |\value|.
+\end{key}
+
+\begin{stylekey}{/pgf/number format/1000 sep=\marg{text}}
+ Just another name for |set thousands separator|.
+\end{stylekey}
+
+\begin{key}{/pgf/number format/1000 sep in fractionals=\marg{boolean} (initially false)}
+ Configures whether the fractional part should also be grouped into groups
+ of three digits.
+
+ The value |true| will active the |1000 sep| for both, integer and
+ fractional parts. The value |false| will active |1000 sep| only for the
+ integer part.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ precision=999,
+ set thousands separator={\,},
+ 1000 sep in fractionals,
+ }
+\pgfmathprintnumber{1234.1234567}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,fixed zerofill,
+ precision=9,
+ set thousands separator={\,},
+ 1000 sep in fractionals,
+ }
+\pgfmathprintnumber{1234.1234567}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/min exponent for 1000 sep=\marg{number} (initially 0)}
+ Defines the smallest exponent in scientific notation which is required to
+ draw thousand separators. The exponent is the number of digits minus one,
+ so $\meta{number}=4$ will use thousand separators starting with $1e4 =
+ 10000$.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ int detect,
+ 1000 sep={\,},
+ min exponent for 1000 sep=0}
+\pgfmathprintnumber{5000}; \pgfmathprintnumber{1000000}
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ int detect,
+ 1000 sep={\,},
+ min exponent for 1000 sep=4}
+\pgfmathprintnumber{1000}; \pgfmathprintnumber{5000}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ int detect,
+ 1000 sep={\,},
+ min exponent for 1000 sep=4}
+\pgfmathprintnumber{10000}; \pgfmathprintnumber{1000000}
+\end{codeexample}
+ %
+ \noindent A value of |0| disables this feature (negative values are
+ ignored).
+\end{key}
+
+\begin{key}{/pgf/number format/use period}
+ A predefined style which installs periods ``\texttt{.}'' as decimal
+ separators and commas ``\texttt{,}'' as thousands separators. This style is
+ the default.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed,precision=2,use period}
+\pgfmathprintnumber{12.3456}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed,precision=2,use period}
+\pgfmathprintnumber{1234.56}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/use comma}
+ A predefined style which installs commas ``\texttt{,}'' as decimal
+ separators and periods ``\texttt{.}'' as thousands separators.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed,precision=2,use comma}
+\pgfmathprintnumber{12.3456}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,fixed,precision=2,use comma}
+\pgfmathprintnumber{1234.56}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/skip 0.=\marg{boolean} (initially false)}
+ Configures whether numbers like $0.1$ shall be typeset as $.1$ or not.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,precision=2,
+ skip 0.}
+\pgfmathprintnumber{0.56}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,
+ fixed,
+ fixed zerofill,precision=2,
+ skip 0.=false}
+\pgfmathprintnumber{0.56}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/showpos=\marg{boolean} (initially false)}
+ Enables or disables the display of plus signs for non-negative numbers.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/showpos}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/showpos=false}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,showpos,sci}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{stylekey}{/pgf/number format/print sign=\marg{boolean}}
+ A style which is simply an alias for |showpos=|\marg{boolean}.
+\end{stylekey}
+
+\begin{key}{/pgf/number format/sci 10e}
+ Uses $m \cdot 10^e$ for any number displayed in scientific format.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,sci 10e}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/sci 10\textasciicircum e}
+ The same as `|sci 10e|'.
+\end{key}
+
+\begin{key}{/pgf/number format/sci e}
+ Uses the `$1e{+}0$' format which is generated by common scientific tools
+ for any number displayed in scientific format.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,sci e}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/sci E}
+ The same with an uppercase `\texttt{E}'.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,sci E}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/sci subscript}
+ Typesets the exponent as subscript for any number displayed in scientific
+ format. This style requires very little space.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,sci subscript}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/sci superscript}
+ Typesets the exponent as superscript for any number displayed in scientific
+ format. This style requires very little space.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/number format/.cd,sci,sci superscript}
+\pgfmathprintnumber{12.345}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/number format/sci generic=\marg{keys}}
+ Allows to define an own number style for the scientific format. Here,
+ \meta{keys} can be one of the following choices (omit the long key prefix):
+
+ \begin{key}{/pgf/number format/sci generic/mantissa sep=\marg{text} (initially empty)}
+ Provides the separator between a mantissa and the exponent. It might be
+ |\cdot|, for example,
+ \end{key}
+ %
+ \begin{key}{/pgf/number format/sci generic/exponent=\marg{text} (initially empty)}
+ Provides text to format the exponent. The actual exponent is available
+ as argument |#1| (see below).
+ \end{key}
+ %
+\begin{codeexample}[]
+\pgfkeys{
+ /pgf/number format/.cd,
+ sci,
+ sci generic={mantissa sep=\times,exponent={10^{#1}}}}
+\pgfmathprintnumber{12.345};
+\pgfmathprintnumber{0.00012345}
+\end{codeexample}
+ %
+ The \meta{keys} can depend on three parameters, namely on |#1| which is the
+ exponent, |#2| containing the flags entity of the floating point number and
+ |#3| is the (unprocessed and unformatted) mantissa.
+
+ Note that |sci generic| is \emph{not} suitable to modify the appearance of
+ fixed point numbers, nor can it be used to format the mantissa (which is
+ typeset like fixed point numbers). Use |dec sep|, |1000 sep| and
+ |print sign| to customize the mantissa.
+\end{key}
+
+\begin{key}{/pgf/number format/retain unit mantissa=\mchoice{true,false} (initially true)}
+ Allows to omit a unit mantissa.
+ %
+\begin{codeexample}[]
+\pgfkeys{
+ /pgf/number format/.cd,
+ sci, retain unit mantissa=false}
+\pgfmathprintnumber{10.5};
+\pgfmathprintnumber{10};
+\pgfmathprintnumber{1010};
+\pgfmathprintnumber[precision=1]{-1010};
+\end{codeexample}
+ %
+ The feature is applied after rounding to the desired precision: if the
+ remaining mantissa is equal to~$1$, it will be omitted. It applies to all
+ styles involving the scientific format (including |std|).
+\end{key}
+
+\begin{key}{/pgf/number format/\protect\atmarktext dec sep mark=\marg{text}}
+ Will be placed right before the place where a decimal separator belongs to.
+ However, \marg{text} will be inserted even if there is no decimal
+ separator. It is intended as place-holder for auxiliary routines to find
+ alignment positions.
+
+ This key should never be used to change the decimal separator!
+ Use |dec sep| instead.
+\end{key}
+
+\begin{key}{/pgf/number format/\protect\atmarktext sci exponent mark=\marg{text}}
+ Will be placed right before exponents in scientific notation. It is
+ intended as place-holder for auxiliary routines to find alignment
+ positions.
+
+ This key should never be used to change the exponent!
+\end{key}
+
+\begin{key}{/pgf/number format/assume math mode=\marg{boolean} (default true)}
+ Set this to |true| if you don't want any checks for math mode. The initial
+ setting checks whether math mode is active using |\pgfutilensuremath| for
+ each final number.
+
+ Use |assume math mode=true| if you know that math mode is active. In that
+ case, the final number is typeset as-is, no further checking is performed.
+\end{key}
+
+\begin{stylekey}{/pgf/number format/verbatim}
+ A style which configures the number printer to produce verbatim text
+ output, i.\,e., it doesn't contain \TeX\ macros.
+ %
+\begin{codeexample}[]
+\pgfkeys{
+ /pgf/fpu,
+ /pgf/number format/.cd,
+ sci,
+ verbatim}
+\pgfmathprintnumber{12.345};
+\pgfmathprintnumber{0.00012345};
+\pgfmathparse{exp(15)}
+\pgfmathprintnumber{\pgfmathresult}
+\end{codeexample}
+ %
+ The style resets |1000 sep|, |dec sep|, |print sign|, |skip 0.| and sets
+ |assume math mode|. Furthermore, it installs a |sci generic| format for
+ verbatim output of scientific numbers.
+
+ However, it will still respect |precision|, |fixed zerofill|, |sci
+ zerofill| and the overall styles |fixed|, |sci|, |int detect| (and their
+ variants). It might be useful if you intend to write output files.
+\end{stylekey}
+
+
+%--------------------------------------------------
+% \subsubsection{Defining own display styles}
+% You can define own display styles, although this may require some insight into \TeX-programming. Here are two examples:
+% \begin{enumerate}
+% \item A new fixed point display style: The following code defines a new style named `\texttt{my own fixed point style}' which uses $1{\cdot}00$ instead of $1.00$.
+% \begin{lstlisting}
+% \def\myfixedpointstyleimpl#1.#2\relax{%
+% #1{\cdot}#2%
+% }%
+% \def\myfixedpointstyle#1{%
+% \pgfutilensuremath{%
+% \ifpgfmathfloatroundhasperiod
+% \expandafter\myfixedpointstyleimpl#1\relax
+% \else
+% #1%
+% \fi
+% }%
+% }
+% \pgfkeys{/my own fixed point style/.code={%
+% \let\pgfmathprintnumber@fixed@style=\myfixedpointstyle}
+% }%
+% \end{lstlisting}
+% You only need to overwrite the macro \lstinline!\pgfmathprintnumber@fixed@style!. This macro takes one argument (the result of any numerical computations). The \TeX-boolean \lstinline!\ifpgfmathfloatroundhasperiod! is true if and only if the input number contains a period.
+%
+% \item An example for a new scientific display style:
+% \begin{lstlisting}
+% % #1:
+% % 0 == '0' (the number is +- 0.0),
+% % 1 == '+',
+% % 2 == '-',
+% % 3 == 'not a number'
+% % 4 == '+ infinity'
+% % 5 == '- infinity'
+% % #2: the mantissa
+% % #3: the exponent
+% \def\myscistyle#1#2e#3\relax{%
+% ...
+% }
+% \pgfkeys{/my own sci style/.code={%
+% \let\pgfmathfloatrounddisplaystyle=\myscistyle},
+% }%
+% \end{lstlisting}
+% \end{enumerate}
+%--------------------------------------------------
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-math-parsing.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-parsing.tex
new file mode 100644
index 0000000000..4b3f793dad
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-math-parsing.tex
@@ -0,0 +1,1403 @@
+% Copyright 2007 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Mathematical Expressions}
+\label{pgfmath-syntax}
+
+The easiest way of using \pgfname's mathematical engine is to provide a
+mathematical expression given in familiar infix notation, for example,
+|1cm+4*2cm/5.5| or |2*3+3*sin(30)|. This expression can be parsed by the
+mathematical engine and the result can be placed in a dimension register, a
+counter, or a macro.
+
+It should be noted that all calculations must not exceed $\pm16383.99999$ at
+\emph{any} point, because the underlying computations rely on \TeX{}
+dimensions. This means that many of the underlying computations are necessarily
+approximate and, in addition, not very fast. \TeX{} is, after all, a
+typesetting language and not ideally suited to relatively advanced mathematical
+operations. However, it is possible to change the computations as described in
+Section~\ref{pgfmath-reimplement}.
+
+In the present section, the high-level macros for parsing an expression are
+explained first, then the syntax for expression is explained.
+
+
+\subsection{Parsing Expressions}
+\label{pgfmath-registers}
+\label{pgfmath-parsing}
+
+\subsubsection{Commands}
+
+The \todosp{why 2 labels?}basic command for invoking the parser of \pgfname's
+mathematical engine is the following:
+
+\begin{command}{\pgfmathparse\marg{expression}}
+ This macro parses \meta{expression} and returns the result without units in
+ the macro |\pgfmathresult|.
+
+ \example |\pgfmathparse{2pt+3.5pt}| will set |\pgfmathresult| to the text
+ |5.5|.
+
+ In the following, the special properties of this command are explained. The
+ exact syntax of mathematical expressions is explained in Sections
+ \ref{pgfmath-operators} and~\ref{pgfmath-functions}.
+ %
+ \begin{itemize}
+ \item The result stored in the macro |\pgfmathresult| is a decimal
+ \emph{without units}. This is true regardless of whether the
+ \meta{expression} contains any unit specification. All numbers with
+ units are converted to points first. See
+ Section~\ref{pgfmath-units} for details on units.
+ \item The parser will recognize \TeX{} registers and box dimensions, so
+ |\mydimen|, |0.5\mydimen|, |\wd\mybox|, |0.5\dp\mybox|,
+ |\mycount\mydimen| and so on can be parsed.
+ \item The $\varepsilon$-TeX\ extensions |\dimexpr|, |\numexpr|,
+ |\glueexpr|, and |\muexpr| are recognized and evaluated. The values
+ they result in will be used in the further evaluation, as if you
+ had put |\the| before them.
+ \item Parenthesis can be used to change the order of the evaluation.
+ \item Various functions are recognized, so it is possible to parse
+ |sin(.5*pi r)*60|, which means ``the sine of $0.5$ times $\pi$
+ radians, multiplied by 60''. The argument of functions can be any
+ expression.
+ \item Scientific notation in the form |1.234e+4| is recognized (but the
+ restriction on the range of values still applies). The exponent
+ symbol can be upper or lower case (i.e., |E| or |e|).
+ \item An integer with a zero-prefix (excluding, of course zero itself),
+ is interpreted as an octal number and is automatically converted to
+ base 10.
+ \item An integer with prefix |0x| or |0X| is interpreted as a
+ hexadecimal number and is automatically converted to base 10.
+ Alphabetic digits can be in uppercase or lowercase.
+ \item An integer with prefix |0b| or |0B| is interpreted as a binary
+ number and is automatically converted to base 10.
+ \item An expression (or part of an expression) surrounded with double
+ quotes (i.e., the character |"|) will not be evaluated. Obviously
+ this should be used with great care.
+ \end{itemize}
+\end{command}
+
+\begin{command}{\pgfmathqparse\marg{expression}}
+ This macro is similar to |\pgfmathparse|: it parses \meta{expression} and
+ returns the result in the macro |\pgfmathresult|. It differs in two
+ respects. Firstly, |\pgfmathqparse| does not parse functions, scientific
+ notation, the prefixes for binary octal, or hexadecimal numbers, nor does
+ it accept the special use of |"|, |?| or |:| characters. Secondly, numbers
+ in \meta{expression} \emph{must} specify a \TeX{} unit (except in such
+ instances as |0.5\pgf@x|), which greatly simplifies the problem of parsing
+ real numbers. As a result of these restrictions |\pgfmathqparse| is about
+ twice as fast as |\pgfmathparse|. Note that the result will still be a
+ number without units.
+\end{command}
+
+\begin{command}{\pgfmathpostparse}
+ At the end of the parse this command is executed, allowing some custom
+ action to be performed on the result of the parse. When this command is
+ executed, the macro |\pgfmathresult| will hold the result of the parse (as
+ always, without units). The result of the custom action should be used to
+ redefine |\pgfmathresult| appropriately. By default, this command is
+ equivalent to |\relax|. This differs from previous versions, where, if the
+ parsed expression contained no units, the result of the parse was scaled
+ according to the value in |\pgfmathresultunitscale| (which by default was
+ |1|).
+
+ This scaling can be turned on again using:
+ |\let\pgfmathpostparse=\pgfmathscaleresult|. Note, however that by scaling
+ the result, the base conversion functions will not work, and the |"|
+ character should not be used to quote parts of an expression.
+\end{command}
+
+Instead of the |\pgfmathparse| macro you can also use wrapper commands, whose
+usage is very similar to their cousins in the \calcname{} package. The only
+difference is that the expressions can be any expression that is handled by
+|\pgfmathparse|. For all of the following commands, if \meta{expression} starts
+with |+|, no parsing is done and a simple assignment or increment is done using
+normal \TeX\ assignments or increments. This will be orders of magnitude faster
+than calling the parser.
+
+The effect of the following commands is always local to the current \TeX\
+scope.
+
+\begin{command}{\pgfmathsetlength\marg{register}\marg{expression}}
+ Basically, this command sets the length of the \TeX{} \meta{register} to
+ the value specified by \meta{expression}. However, there is some fine
+ print:
+
+ First, in case \meta{expression} starts with a |+|, a simple \TeX\
+ assignment is done. In particular, \meta{register} can be a glue register
+ and \meta{expression} be something like |+1pt plus 1fil| and the
+ \meta{register} will be assigned the expected value.
+
+ Second, when the \meta{expression} does not start with |+|, it is first
+ parsed using |\pgfmathparse|, resulting in a (dimensionless) value
+ |\pgfmathresult|. Now, if the parser encountered the unit |mu| somewhere in
+ the expression, it assumes that \meta{register} is a |\muskip| register and
+ will try to assign to \meta{register} the value |\pgfmathresult| followed
+ by |mu|. Otherwise, in case |mu| was not encountered, it is assumed that
+ \meta{register} is a dimension register or a glue register and we assign
+ |\pgfmathresult| followed by |pt| to it.
+
+ The net effect of the above is that you can write things like
+ %
+\begin{codeexample}[]
+ \muskipdef\mymuskip=0
+ \pgfmathsetlength{\mymuskip}{1mu+3*4mu} \the\mymuskip
+\end{codeexample}
+ %
+\begin{codeexample}[]
+ \dimendef\mydimen=0
+ \pgfmathsetlength{\mydimen}{1pt+3*4pt} \the\mydimen
+\end{codeexample}
+ %
+\begin{codeexample}[]
+ \skipdef\myskip=0
+ \pgfmathsetlength{\myskip}{1pt+3*4pt} \the\myskip
+\end{codeexample}
+
+ One thing that will \emph{not} work is
+ |\pgfmathsetlength{\myskip}{1pt plus 1fil}| since the parser does not
+ support fill's. You can, however, use the |+| notation in this case:
+ %
+\begin{codeexample}[]
+ \skipdef\myskip=0
+ \pgfmathsetlength{\myskip}{+1pt plus 1fil} \the\myskip
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfmathaddtolength\marg{register}\marg{expression}}
+ Adds the value of \meta{expression} to the \TeX{} \meta{register}. All of
+ the special consideration mentioned for |\pgfmathsetlength| also apply here
+ in the same way.
+\end{command}
+
+\begin{command}{\pgfmathsetcount\marg{count register}\marg{expression}}
+ Sets the value of the \TeX{} \meta{count register}, to the \emph{truncated}
+ value specified by \meta{expression}.
+\end{command}
+
+\begin{command}{\pgfmathaddtocount\marg{count register}\marg{expression}}
+ Adds the \emph{truncated} value of \meta{expression} to the \TeX{}
+ \meta{count register}.
+\end{command}
+
+\begin{command}{\pgfmathsetcounter\marg{counter}\marg{expression}}
+ Sets the value of the \LaTeX{} \meta{counter} to the \emph{truncated} value
+ specified by \meta{expression}.
+\end{command}
+
+\begin{command}{\pgfmathaddtocounter\marg{counter}\marg{expression}}
+ Adds the \emph{truncated} value of \meta{expression} to \meta{counter}.
+\end{command}
+
+\begin{command}{\pgfmathsetmacro\marg{macro}\marg{expression}}
+ Defines \meta{macro} as the value of \meta{expression}. The result is a
+ decimal without units.
+\end{command}
+
+\begin{command}{\pgfmathsetlengthmacro\marg{macro}\marg{expression}}
+ Defines \meta{macro} as the value of \meta{expression} \LaTeX{} \emph{in
+ points}.
+\end{command}
+
+\begin{command}{\pgfmathtruncatemacro\marg{macro}\marg{expression}}
+ Defines \meta{macro} as the truncated value of \meta{expression}.
+\end{command}
+
+
+\subsubsection{Considerations Concerning Units}
+\label{pgfmath-units}
+
+As was explained earlier, the parser commands like |\pgfmathparse| will always
+return a result without units in it and all dimensions that have a unit like
+|10pt| or |1in| will first be converted to \TeX\ points (|pt|) and, then, the
+unit is dropped.
+
+Sometimes it is useful, nevertheless, to find out whether an expression or not.
+For this, you can use the following commands:
+
+{\let\ifpgfmathunitsdeclared\relax
+ \begin{command}{\ifpgfmathunitsdeclared}
+ After a call of |\pgfmathparse| this if will be true exactly if
+ some unit was encountered in the expression. It is always set
+ globally in each call.
+
+ Note that \emph{any} ``mentioning'' of a unit inside an
+ expression will set this \TeX-if to true. In particular, even an
+ expressionlike |2pt/1pt|, which arguably should be considered
+ ``scalar'' or ``unit-free'' will still have this \TeX-if set to
+ true. However, see the |scalar| function for a way to change
+ this.
+ \end{command}
+}
+
+\begin{math-function}{scalar(\mvar{value})}
+\mathcommand
+ This function is the identity function on its input, but it will reset the
+ \TeX-if |\ifpgfmathunitsdeclared|. Thus, it can be used to indicate that
+ the given \meta{value} should be considered as a ``scalar'' even when it
+ contains units; but note that it will work even when the \meta{value} is a
+ string or something else. The only effect of this function is to clear the
+ unit declaration.
+ %
+\begin{codeexample}[]
+\pgfmathparse{scalar(1pt/2pt)} \pgfmathresult\
+\ifpgfmathunitsdeclared with \else without \fi unit
+\end{codeexample}
+
+ Note, however, that this command (currently) really just clears the \TeX-if
+ as the input is scanned from left-to-right. Thus, even if there is a use of
+ a unit before the |scalar| function is used, the \TeX-if will be cleared:
+ %
+\begin{codeexample}[]
+\pgfmathparse{1pt+scalar(1pt)} \pgfmathresult\
+\ifpgfmathunitsdeclared with \else without \fi unit
+\end{codeexample}
+
+ The other way round, a use of a unit after the |scalar| function will set
+ the units once more.
+ %
+\begin{codeexample}[]
+\pgfmathparse{scalar(1pt)+1pt} \pgfmathresult\
+\ifpgfmathunitsdeclared with \else without \fi unit
+\end{codeexample}
+
+ For these reasons, you should use the function only on the outermost level
+ of an expression.
+
+ A typical use of this function is the following:
+ %
+\begin{codeexample}[]
+\tikz{
+ \coordinate["$A$"] (A) at (2,2);
+ \coordinate["$B$" below] (B) at (0,0);
+ \coordinate["$C$" below] (C) at (3,0);
+ \draw (A) -- (B) -- (C) -- cycle;
+ \path
+ let \p1 =($(A)-(B)$), \p2 =($(A)-(C)$),
+ \n1 = {veclen(\x1,\y1)}, \n2 = {veclen(\x2,\y2)}
+ in coordinate ["$D$" below] (D) at ($ (B)!scalar(\n1/(\n1+\n2))!(C) $);
+ \draw (A) -- (D);
+}
+\end{codeexample}
+ %
+\end{math-function}
+
+A special kind of units are \TeX's ``math units'' (|mu|). It will be treated as
+if |pt| had been used, but you can check whether an expression contained a math
+unit using the following:
+%
+{\let\ifpgfmathmathunitsdeclared\relax
+ \begin{command}{\ifpgfmathmathunitsdeclared}
+ This \TeX-if is similar to |\ifpgfmathunitsdeclared|, but it
+ is only set when the unit |mu| is encountered at least
+ once. In this case, |\ifpgfmathunitsdeclared| will \emph{also}
+ be set to true. The |scalar| function has no effect on this \TeX-if.
+ \end{command}
+}
+
+
+\subsection{Syntax for Mathematical Expressions: Operators}
+
+The syntax for the expressions recognized by |\pgfmathparse| and friends is
+rather straightforward. Let us start with the operators.
+
+\label{pgfmath-operators}
+
+The following operators (presented in the context in which they are used) are
+recognized:
+%
+\begin{math-operator}{+}{infix}{add}
+ Adds \mvar{x} to \mvar{y}.
+\end{math-operator}
+
+\begin{math-operator}{-}{infix}{subtract}
+ Subtracts \mvar{y} from \mvar{x}.
+\end{math-operator}
+
+\begin{math-operator}{-}{prefix}{neg}
+ Reverses the sign of \mvar{x}.
+\end{math-operator}
+
+\begin{math-operator}{*}{infix}{multiply}
+ Multiples \mvar{x} by \mvar{y}.
+\end{math-operator}
+
+\begin{math-operator}{/}{infix}{divide}
+ Divides \mvar{x} by \mvar{y}. An error will result if \mvar{y} is 0, or if
+ the result of the division is too big for the mathematical engine. Please
+ remember when using this command that accurate (and reasonably quick)
+ division of real numbers that are not integers is particularly tricky in
+ \TeX.
+\end{math-operator}
+
+\begin{math-operator}{\char`\^}{infix}{pow}
+ Raises \mvar{x} to the power \mvar{y}.
+\end{math-operator}
+
+\begin{math-operator}{\protect\exclamationmarktext}{postfix}{factorial}
+ Calculates the factorial of \mvar{x}.
+\end{math-operator}
+
+\begin{math-operator}{r}{postfix}{deg}
+ Converts \mvar{x} to degrees (\mvar{x} is assumed to be in radians). This
+ operator has the same precedence as multiplication.
+\end{math-operator}
+
+\begin{math-operators}{?}{:}{conditional}{ifthenelse}
+ |?| and |:| are special operators which can be used as a shorthand for |if|
+ \mvar{x} |then| \mvar{y} |else| \mvar{z} inside the parser. The expression
+ \mvar{x} is taken to be true if it evaluates to any non-zero value.
+\end{math-operators}
+
+\begin{math-operator}{==}{infix}{equal}
+ Returns |1| if \mvar{x}$=$\mvar{y}, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operator}{>}{infix}{greater}
+ Returns |1| if \mvar{x}$>$\mvar{y}, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operator}{<}{infix}{less}
+ Returns |1| if \mvar{x}$<$\mvar{y}, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operator}{\protect\exclamationmarktext=}{infix}{notequal}
+ Returns |1| if \mvar{x}$\neq$\mvar{y}, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operator}{>=}{infix}{notless}
+ Returns |1| if \mvar{x}$\geq$\mvar{y}, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operator}{<=}{infix}{notgreater}
+ Returns |1| if \mvar{x}$\leq$\mvar{y}, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operator}{{\char`\&}{\char`\&}}{infix}{and}
+ Returns |1| if both \mvar{x} and \mvar{y} evaluate to some non-zero value.
+ Both arguments are evaluated.
+\end{math-operator}
+
+{
+ \catcode`\|=12
+\begin{math-operator}[no index]{||}{infix}{or}
+ \index{*pgfmanualvbarvbarr@\protect\texttt{\protect\pgfmanualvbarvbar} math operator}%
+ \index{Math operators!*pgfmanualvbarvbar@\protect\texttt{\protect\pgfmanualvbarvbar}}%
+ Returns {\tt 1} if either \mvar{x} or \mvar{y} evaluate to some non-zero
+ value.
+\end{math-operator}
+}
+
+\begin{math-operator}{\protect\exclamationmarktext}{prefix}{not}
+ Returns |1| if \mvar{x} evaluates to zero, |0| otherwise.
+\end{math-operator}
+
+\begin{math-operators}{(}{)}{group}{}
+ These operators act in the usual way, that is, to control the order in
+ which operators are executed, for example, |(1+2)*3|. This includes the
+ grouping of arguments for functions, for example, |sin(30*10)| or
+ |mod(72,3)| (the comma character is also treated as an operator).
+
+ Parentheses for functions with one argument are not always necessary,
+ |sin 30| (note the space) is the same as |sin(30)|. However, functions have
+ the highest precedence so, |sin 30*10| is the same as |sin(30)*10|.
+\end{math-operators}
+
+\begin{math-operators}{\char`\{}{\char`\}}{array}{}
+ These operators are used to process array-like structures (within an
+ expression these characters do not act like \TeX{} grouping tokens). The
+ \meta{array specification} consists of comma separated elements, for
+ example, |{1, 2, 3, 4, 5}|. Each element in the array will be evaluated as
+ it is parsed, so expressions can be used. In addition, an element of an
+ array can be an array itself, allowing multiple dimension arrays to be
+ simulated: |{1, {2,3}, {4,5}, 6}|. When storing an array in a macro, do not
+ forget the surrounding braces: |\def\myarray{{1,2,3}}| not
+ |\def\myarray{1,2,3}|.
+ %
+\begin{codeexample}[]
+\def\myarray{{1,"two",2+1,"IV","cinq","sechs",sin(\i*5)*14}}
+\foreach \i in {0,...,6}{\pgfmathparse{\myarray[\i]}\pgfmathresult, }
+\end{codeexample}
+ %
+\end{math-operators}
+
+\chardef\lbrack=`\[
+\chardef\rbrack=`\]
+\begin{math-operators}{\lbrack}{\rbrack}{array access}{array}
+ |[| and |]| are two operators used in one particular circumstance: to
+ access an array (specified using the |{| and |}| operators) using the index
+ \mvar{x}. Indexing starts from zero, so, if the index is greater than, or
+ equal to, the number of values in the array, an error will occur, and zero
+ will be returned.
+ %
+\begin{codeexample}[]
+\def\myarray{{7,-3,4,-9,11}}
+\pgfmathparse{\myarray[3]} \pgfmathresult
+\end{codeexample}
+
+ If the array is defined to have multiple dimensions, then the array access
+ operators can be immediately repeated.
+ %
+\begin{codeexample}[]
+\def\print#1{\pgfmathparse{#1}\pgfmathresult}
+\def\identitymatrix{{{1,0,0},{0,1,0},{0,0,1}}}
+\tikz[x=0.5cm,y=0.5cm]\foreach \i in {0,1,2} \foreach \j in {0,1,2}
+ \node at (\j,-\i) [anchor=base] {\print{\identitymatrix[\i][\j]}};
+\end{codeexample}
+ %
+\end{math-operators}
+
+\begin{math-operators}{\char`\"}{\char`\"}{group}{}
+ These operators are used to quote \mvar{x}. However, as every expression is
+ expanded with |\edef| before it is parsed, macros (e.g., font commands like
+ |\tt| or |\Huge|) may need to be ``protected'' from this expansion (e.g.,
+ |\noexpand\Huge|). Ideally, you should avoid such macros anyway. Obviously,
+ these operators should be used with great care as further calculations are
+ unlikely to be possible with the result.
+ %
+\begin{codeexample}[]
+\def\x{5}
+\foreach \y in {0,10}{
+ \pgfmathparse{\x > \y ? "\noexpand\Large Bigger" : "\noexpand\tiny smaller"}
+ \x\ is \pgfmathresult\ than \y.
+}
+\end{codeexample}
+ %
+\end{math-operators}
+
+
+\subsection{Syntax for Mathematical Expressions: Functions}
+\label{pgfmath-functions}
+
+The following functions are recognized:
+
+\medskip
+\def\mathlink#1{\hyperlink{math:#1}{\tt#1}}
+\begin{tikzpicture}
+\foreach \f [count=\i from 0] in
+{abs,acos,add,and,array,asin,atan,atan2,bin,ceil,cos,
+ cosec,cosh,cot,deg,depth,div,divide,e,equal,factorial, false,
+ floor,frac,gcd,greater,height,hex,Hex,int,ifthenelse,iseven,isodd,isprime,
+ less,ln,log10,log2,max,min,mod,Mod,multiply,
+ neg,not,notequal,notgreater,notless,
+ oct,or,pi,pow,rad,rand,random,real,rnd,round,
+ scalar,sec,sign,sin,sinh,sqrt,subtract,tan,tanh,true, veclen,width}
+\node [anchor=base west] at ({int(\i/12)*2.5cm},{-mod(\i,12)*1.1*\baselineskip}) {\mathlink{\f}};
+\end{tikzpicture}
+\bigskip
+
+Each function has a \pgfname{} command associated with it (which is also shown
+with the function below). In general, the command is simply the name of the
+function prefixed with |\pgfmath|, for example, |\pgfmathadd|, but there are
+some notable exceptions.
+
+
+\subsubsection{Basic arithmetic functions}
+\label{pgfmath-functions-basic}
+
+\begin{math-function}{add(\mvar{x},\mvar{y})}
+\mathcommand
+ Adds $x$ and $y$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{add(75,6)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{subtract(\mvar{x},\mvar{y})}
+\mathcommand
+ Subtract $x$ from $y$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{subtract(75,6)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{neg(\mvar{x})}
+\mathcommand
+ This returns $-\mvar{x}$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{neg(50)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{multiply(\mvar{x},\mvar{y})}
+\mathcommand
+ Multiply $x$ by $y$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{multiply(75,6)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{divide(\mvar{x},\mvar{y})}
+\mathcommand
+ Divide $x$ by $y$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{divide(75,6)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{div(\mvar{x},\mvar{y})}
+\mathcommand
+ Divide $x$ by $y$ and return the integer part of the result.
+ %
+\begin{codeexample}[]
+\pgfmathparse{div(75,9)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{factorial(\mvar{x})}
+\mathcommand
+ Return \mvar{x}!.
+ %
+\begin{codeexample}[]
+\pgfmathparse{factorial(5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{sqrt(\mvar{x})}
+\mathcommand
+ Calculates $\sqrt{\textrm{\mvar{x}}}$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{sqrt(10)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{sqrt(8765.432)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{pow(\mvar{x},\mvar{y})}
+\mathcommand
+ Raises \mvar{x} to the power \mvar{y}. For greatest accuracy, \mvar{y}
+ should be an integer. If \mvar{y} is not an integer, the actual calculation
+ will be an approximation of $e^{y \ln(x)}$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{pow(2,7)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{e}
+\mathcommand
+ Returns the value 2.718281828.
+ %
+{
+\catcode`\^=7
+\begin{codeexample}[]
+\pgfmathparse{(e^2-e^-2)/2} \pgfmathresult
+\end{codeexample}
+}
+\end{math-function}
+
+\begin{math-function}{exp(\mvar{x})}
+\mathcommand
+{ \catcode`\^=7
+
+ Maclaurin series for $e^x$.
+}
+\begin{codeexample}[]
+\pgfmathparse{exp(1)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{exp(2.34)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{ln(\mvar{x})}
+\mathcommand
+{ \catcode`\^=7
+ An approximation for $\ln(\textrm{\mvar{x}})$. This uses an algorithm of
+ Rouben Rostamian, and coefficients suggested by Alain Matthes.
+}
+\begin{codeexample}[]
+\pgfmathparse{ln(10)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{ln(exp(5))} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{log10(\mvar{x})}
+\mathcommand[logten(\mvar{x})]
+ An approximation for $\log_{10}(\textrm{\mvar{x}})$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{log10(100)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{log2(\mvar{x})}
+\mathcommand[logtwo(\mvar{x})]
+ An approximation for $\log_2(\textrm{\mvar{x}})$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{log2(128)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{abs(\mvar{x})}
+\mathcommand
+ Evaluates the absolute value of $x$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{abs(-5)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{-abs(4*-3)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{mod(\mvar{x},\mvar{y})}
+\mathcommand
+ This evaluates \mvar{x} modulo \mvar{y}, using truncated division. The sign
+ of the result is the same as the sign of
+ $\frac{\textrm{\mvar{x}}}{\textrm{\mvar{y}}}$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{mod(20,6)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{mod(-100,30)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{Mod(\mvar{x},\mvar{y})}
+\mathcommand
+ This evaluates \mvar{x} modulo \mvar{y}, using floored division. The sign
+ of the result is never negative.
+ %
+\begin{codeexample}[]
+\pgfmathparse{Mod(-100,30)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{sign(\mvar{x})}
+\mathcommand
+ Returns the sign of $x$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{sign(-5)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{sign(0)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{sign(5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+
+\subsubsection{Rounding functions}
+\label{pgfmath-functions-rounding}
+
+\begin{math-function}{round(\mvar{x})}
+\mathcommand
+ Rounds \mvar{x} to the nearest integer. It uses ``asymmetric half-up''
+ rounding. So |1.5| is rounded to |2|, but |-1.5| is rounded to |-2|
+ (\emph{not} |-1|).
+ %
+\begin{codeexample}[]
+\pgfmathparse{round(32.5/17)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{round(398/12)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{floor(\mvar{x})}
+\mathcommand
+ Rounds \mvar{x} down to the nearest integer.
+ %
+\begin{codeexample}[]
+\pgfmathparse{floor(32.5/17)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{floor(398/12)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{floor(-398/12)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{ceil(\mvar{x})}
+\mathcommand
+ Rounds \mvar{x} up to the nearest integer.
+ %
+\begin{codeexample}[]
+\pgfmathparse{ceil(32.5/17)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{ceil(398/12)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{ceil(-398/12)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{int(\mvar{x})}
+\mathcommand
+ Returns the integer part of \mvar{x}.
+ %
+\begin{codeexample}[]
+\pgfmathparse{int(32.5/17)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{frac(\mvar{x})}
+\mathcommand
+ Returns the fractional part of \mvar{x}.
+ %
+\begin{codeexample}[]
+\pgfmathparse{frac(32.5/17)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{real(\mvar{x})}
+\mathcommand
+ Ensures \mvar{x} contains a decimal point.
+ %
+\begin{codeexample}[]
+\pgfmathparse{real(4)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+
+\subsubsection{Integer arithmetics functions}
+\label{pgfmath-functions-integerarithmetics}
+
+\begin{math-function}{gcd(\mvar{x},\mvar{y})}
+\mathcommand
+ Computes the greatest common divider of \mvar{x} and \mvar{y}.
+ %
+\begin{codeexample}[]
+\pgfmathparse{gcd(42,56)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{isodd(\mvar{x})}
+\mathcommand
+ Returns |1| if the integer part of \mvar{x} is odd. Otherwise, returns |0|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{isodd(2)} \pgfmathresult,
+\pgfmathparse{isodd(3)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{iseven(\mvar{x})}
+\mathcommand
+ Returns |1| if the integer part of \mvar{x} is even. Otherwise, returns |0|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{iseven(2)} \pgfmathresult,
+\pgfmathparse{iseven(3)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{isprime(\mvar{x})}
+\mathcommand
+ Returns |1| if the integer part of \mvar{x} is prime. Otherwise, returns |0|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{isprime(1)} \pgfmathresult,
+\pgfmathparse{isprime(2)} \pgfmathresult,
+\pgfmathparse{isprime(31)} \pgfmathresult,
+\pgfmathparse{isprime(64)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+
+\subsubsection{Trigonometric functions}
+\label{pgfmath-functions-trigonometric}
+
+\begin{math-function}{pi}
+\mathcommand
+ Returns the value $\pi=3.141592654$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{pi} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{pi r} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{rad(\mvar{x})}
+\mathcommand
+ Convert \mvar{x} to radians. \mvar{x} is assumed to be in degrees.
+ %
+\begin{codeexample}[]
+\pgfmathparse{rad(90)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{deg(\mvar{x})}
+\mathcommand
+ Convert \mvar{x} to degrees. \mvar{x} is assumed to be in radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{deg(3*pi/2)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{sin(\mvar{x})}
+\mathcommand
+ %
+ Sine of \mvar{x}. By employing the |r| operator, \mvar{x} can be in
+ radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{sin(60)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{sin(pi/3 r)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{cos(\mvar{x})}
+\mathcommand
+ Cosine of \mvar{x}. By employing the |r| operator, \mvar{x} can be in
+ radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{cos(60)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{cos(pi/3 r)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{tan(\mvar{x})}
+\mathcommand
+ Tangent of \mvar{x}. By employing the |r| operator, \mvar{x} can be in
+ radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{tan(45)} \pgfmathresult
+\end{codeexample}
+
+\begin{codeexample}[]
+\pgfmathparse{tan(2*pi/8 r)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{sec(\mvar{x})}
+\mathcommand
+ Secant of \mvar{x}. By employing the |r| operator, \mvar{x} can be in
+ radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{sec(45)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{cosec(\mvar{x})}
+\mathcommand
+ Cosecant of \mvar{x}. By employing the |r| operator, \mvar{x} can be in
+ radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{cosec(30)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{cot(\mvar{x})}
+\mathcommand
+ Cotangent of \mvar{x}. By employing the |r| operator, \mvar{x} can be in
+ radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{cot(15)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{asin(\mvar{x})}
+\mathcommand
+ Arcsine of \mvar{x}. The result is in degrees and in the range $\pm90^\circ$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{asin(0.7071)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{acos(\mvar{x})}
+\mathcommand
+ Arccosine of \mvar{x} in degrees. The result is in the range $[0^\circ,180^\circ]$.
+ %
+\begin{codeexample}[]
+\pgfmathparse{acos(0.5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{atan(\mvar{x})}
+\mathcommand
+ Arctangent of $x$ in degrees.
+ %
+\begin{codeexample}[]
+\pgfmathparse{atan(1)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{atan2(\mvar{y},\mvar{x})}
+\mathcommand[atantwo(\mvar{y},\mvar{x})]
+ Arctangent of $y\div x$ in degrees. This also takes into account the
+ quadrants.
+ %
+\begin{codeexample}[]
+\pgfmathparse{atan2(-4,3)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{key}{/pgf/trig format=\mchoice{deg,rad} (initially deg)}
+ Allows to define whether trigonometric math functions (i.e.\ all in this
+ subsection) operate with degrees or with radians.
+ %
+\begin{codeexample}[]
+\pgfmathparse{cos(45)} \pgfmathresult
+\end{codeexample}
+\begin{codeexample}[]
+\pgfkeys{/pgf/trig format=rad}
+\pgfmathparse{cos(pi/2)} \pgfmathresult
+\end{codeexample}
+
+ The initial configuration |trig format=deg| is the base of \pgfname: almost
+ all of it is based on degrees.
+
+ Specifying |trig format=rad| is most useful for data visualization where
+ the angles are typically given in radians. However, it is applied to all
+ trigonometric functions for which the option applies, including any drawing
+ instructions which operate on angles.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[-stealth]
+ (0:1) -- (45:1) -- (90:1) -- (135:1) -- (180:1);
+
+ \draw[-stealth,trig format=rad,red]
+ (pi:1) -- (5/4*pi:1) -- (6/4*pi:1) -- (7/4*pi:1) -- (2*pi:1);
+\end{tikzpicture}
+\end{codeexample}
+
+ \paragraph{Warning:}
+ At the time of this writing, this feature is ``experimental''. Please
+ handle it with care: there may be path instructions or libraries in
+ \pgfname\ which rely on |trig format=deg|. The intended usage of
+ |trig format=rad| is for local scopes -- and as option for data
+ visualization.
+\end{key}
+
+
+\subsubsection{Comparison and logical functions}
+\label{pgfmath-functions-comparison}
+
+\begin{math-function}{equal(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if $\mvar{x}=\mvar{y}$ and |0| otherwise.
+ %
+\begin{codeexample}[]
+\pgfmathparse{equal(20,20)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{greater(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if $\mvar{x}>\mvar{y}$ and |0| otherwise.
+ %
+\begin{codeexample}[]
+\pgfmathparse{greater(20,25)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{less(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if $\mvar{x}<\mvar{y}$ and |0| otherwise.
+ %
+\begin{codeexample}[]
+\pgfmathparse{greater(20,25)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{notequal(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |0| if $\mvar{x}=\mvar{y}$ and |1| otherwise.
+ %
+\begin{codeexample}[]
+\pgfmathparse{notequal(20,25)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{notgreater(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if $\mvar{x}\leq\mvar{y}$ and |0| otherwise.
+ %
+\begin{codeexample}[]
+\pgfmathparse{notgreater(20,25)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{notless(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if $\mvar{x}\geq\mvar{y}$ and |0| otherwise.
+ %
+\begin{codeexample}[]
+\pgfmathparse{notless(20,25)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{and(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if \mvar{x} and \mvar{y} both evaluate to non-zero values.
+ Otherwise |0| is returned.
+ %
+\begin{codeexample}[]
+\pgfmathparse{and(5>4,6>7)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{or(\mvar{x},\mvar{y})}
+\mathcommand
+ This returns |1| if either \mvar{x} or \mvar{y} evaluate to non-zero
+ values. Otherwise |0| is returned.
+ %
+\begin{codeexample}[]
+\pgfmathparse{or(5>4,6>7)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{not(\mvar{x})}
+\mathcommand
+ This returns |1| if $\mvar{x}=0$, otherwise |0|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{not(true)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{ifthenelse(\mvar{x},\mvar{y},\mvar{z})}
+\mathcommand
+ This returns \mvar{y} if \mvar{x} evaluates to some non-zero value,
+ otherwise \mvar{z} is returned.
+ %
+\begin{codeexample}[]
+\pgfmathparse{ifthenelse(5==4,"yes","no")} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{true}
+\mathcommand
+ This evaluates to |1|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{true ? "yes" : "no"} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{false}
+\mathcommand
+ This evaluates to |0|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{false ? "yes" : "no"} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+
+\subsubsection{Pseudo-random functions}
+\label{pgfmath-functions-random}
+
+\begin{math-function}{rnd}
+\mathcommand
+ Generates a pseudo-random number between $0$ and $1$ with a uniform
+ distribution.
+ %
+\begin{codeexample}[]
+\foreach \x in {1,...,10}{\pgfmathparse{rnd}\pgfmathresult, }
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{rand}
+\mathcommand
+ Generates a pseudo-random number between $-1$ and $1$ with a uniform
+ distribution.
+ %
+\begin{codeexample}[]
+\foreach \x in {1,...,10}{\pgfmathparse{rand}\pgfmathresult, }
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{random(\opt{\mvar{x},\mvar{y}})}
+\mathcommand
+ This function takes zero, one or two arguments. If there are zero
+ arguments, a uniform random number between $0$ and $1$ is generated. If
+ there is one argument \mvar{x}, a random integer between $1$ and \mvar{x}
+ is generated. Finally, if there are two arguments, a random integer between
+ \mvar{x} and \mvar{y} is generated. If there are no arguments, the
+ \pgfname{} command should be called as follows: |\pgfmathrandom{}|.
+ %
+\begin{codeexample}[]
+\foreach \x in {1,...,10}{\pgfmathparse{random()}\pgfmathresult, }
+\end{codeexample}
+
+\begin{codeexample}[]
+\foreach \x in {1,...,10}{\pgfmathparse{random(100)}\pgfmathresult, }
+\end{codeexample}
+
+\begin{codeexample}[]
+\foreach \x in {1,...,10}{\pgfmathparse{random(232,762)}\pgfmathresult, }
+\end{codeexample}
+ %
+\end{math-function}
+
+
+\subsubsection{Base conversion functions}
+\label{pgfmath-functions-base}
+
+\begin{math-function}{hex(\mvar{x})}
+\mathcommand
+ Convert \mvar{x}{} (assumed to be an integer in base 10) to a hexadecimal
+ representation, using lower case alphabetic digits. No further calculation
+ will be possible with the result.
+ %
+\begin{codeexample}[]
+\pgfmathparse{hex(65535)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{Hex(\mvar{x})}
+\mathcommand
+ Convert \mvar{x}{} (assumed to be an integer in base 10) to a hexadecimal
+ representation, using upper case alphabetic digits. No further calculation
+ will be possible with the result.
+ %
+\begin{codeexample}[]
+\pgfmathparse{Hex(65535)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{oct(\mvar{x})}
+\mathcommand
+ Convert \mvar{x}{} (assumed to be an integer in base 10) to an octal
+ representation. No further calculation should be attempted with the result,
+ as the parser can only process numbers converted to base 10.
+ %
+\begin{codeexample}[]
+\pgfmathparse{oct(63)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{bin(\mvar{x})}
+\mathcommand
+ Convert \mvar{x}{} (assumed to be an integer in base 10) to a binary
+ representation. No further calculation should be attempted with the result,
+ as the parser can only process numbers converted to base 10.
+ %
+\begin{codeexample}[]
+\pgfmathparse{bin(185)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+
+\subsubsection{Miscellaneous functions}
+\label{pgfmath-functions-misc}
+
+\begin{math-function}{min(\mvar{x$_1$},\mvar{x$_2$},\ldots,\mvar{x$_n$})}
+\mathcommand[min({\mvar{x$_1$},\mvar{x$_2$},\ldots},{\ldots,\mvar{x$_{n-1}$},\mvar{x$_n$}})]
+ Return the minimum value from \mvar{x$_1$}\ldots\mvar{x$_n$}. For
+ historical reasons, the command |\pgfmathmin| takes two arguments, but each
+ of these can contain an arbitrary number of comma separated values.
+ %
+\begin{codeexample}[]
+\pgfmathparse{min(3,4,-2,250,-8,100)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{max(\mvar{x$_1$},\mvar{x$_2$},\ldots,\mvar{x$_n$})}
+\mathcommand[max({\mvar{x$_1$},\mvar{x$_2$},\ldots},{\ldots,\mvar{x$_{n-1}$},\mvar{x$_n$}})]
+ Return the maximum value from \mvar{x$_1$}\ldots\mvar{x$_n$}. Again, for
+ historical reasons, the command |\pgfmathmax| takes two arguments, but each
+ of these can contain an arbitrary number of comma separated values.
+ %
+\begin{codeexample}[]
+\pgfmathparse{max(3,4,-2,250,-8,100)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{veclen(\mvar{x},\mvar{y})}
+\mathcommand
+ Calculates $\sqrt{\left(\textrm{\mvar{x}}^2+\textrm{\mvar{y}}^2\right)}$.
+ This uses a polynomial approximation, based on ideas of Rouben Rostamian
+ %
+\begin{codeexample}[]
+\pgfmathparse{veclen(12,5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{array(\mvar{x},\mvar{y})}
+\mathcommand
+ This accesses the array \mvar{x} at the index \mvar{y}. The array must
+ begin and end with braces (e.g., |{1,2,3,4}|) and array indexing starts at
+ |0|.
+ %
+\begin{codeexample}[]
+\pgfmathparse{array({9,13,17,21},2)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+The following hyperbolic functions were adapted from code suggested by Martin
+Heller:
+
+\begin{math-function}{sinh(\mvar{x})}
+\mathcommand
+ The hyperbolic sine of \mvar{x}
+ %
+\begin{codeexample}[]
+\pgfmathparse{sinh(0.5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{cosh(\mvar{x})}
+\mathcommand
+ The hyperbolic cosine of \mvar{x}
+ %
+\begin{codeexample}[]
+\pgfmathparse{cosh(0.5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{tanh(\mvar{x})}
+\mathcommand
+ The hyperbolic tangent of \mvar{x}
+ %
+
+\begin{codeexample}[]
+\pgfmathparse{tanh(0.5)} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{width("\mvar{x}")}
+\mathcommand
+ Return the width of a \TeX{} (horizontal) box containing \mvar{x}. The
+ quote characters are necessary to prevent \mvar{x}{} from being parsed. It
+ is important to remember that any expression is expanded with |\edef|
+ before being parsed, so any macros (e.g., font commands like |\tt| or
+ |\Huge|) will need to be ``protected'' (e.g., |\noexpand\Huge| is usually
+ sufficient).
+ %
+\begin{codeexample}[]
+\pgfmathparse{width("Some Lovely Text")} \pgfmathresult
+\end{codeexample}
+
+ Note that results of this method are provided in points.
+\end{math-function}
+
+\begin{math-function}{height("\mvar{x}")}
+\mathcommand
+ Return the height of a box containing \mvar{x}.
+ %
+\begin{codeexample}[]
+\pgfmathparse{height("Some Lovely Text")} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
+
+\begin{math-function}{depth("\mvar{x}")}
+\mathcommand
+ Returns the depth of a box containing \mvar{x}.
+ %
+\begin{codeexample}[]
+\pgfmathparse{depth("Some Lovely Text")} \pgfmathresult
+\end{codeexample}
+ %
+\end{math-function}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-module-parser.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-module-parser.tex
new file mode 100644
index 0000000000..1dfec36c23
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-module-parser.tex
@@ -0,0 +1,280 @@
+% Copyright 2008 by Till Tantau
+% Copyright 2019 by Jonathan P. Spratte
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Parser Module}%
+\label{section-module-parser}%
+
+\begin{pgfmodule}{parser}%
+ This module defines some commands for creating a simple letter-by-letter
+ parser.
+\end{pgfmodule}%
+
+This module provides commands for defining a parser that scans some given text
+letter-by-letter. For each letter, some code is executed and, possibly a
+state-switch occurs. The code for each letter might take mandatory or optional
+arguments. The parsing process ends when a final state has been reached, and
+optionally some code is executed afterwards.
+
+\begin{command}{\pgfparserparse\marg{parser name}\meta{text}}%
+ This command is used to parse the \meta{text} using the (previously defined)
+ parser named \meta{parser name}.
+
+ The \meta{text} is not contained in curly braces, rather it is all the text
+ that follows. The end of the text is determined implicitly, namely when the
+ final state of the parser has been reached. If you defined a final action for
+ the parser using |\pgfparserdeffinal| it is executed now.
+
+ The parser works as follows: At any moment, it is in a certain
+ \emph{state}, initially this state is called |initial|. Then, the first
+ letter of the \meta{text} is examined (using the |\futurlet| command). For
+ each possible state and each possible letter, some action code is stored in
+ the parser in a table. This code is then executed. This code may, but need
+ not, trigger a \emph{state switch}, causing a new state to be set. The
+ parser then moves on to the next character of the text and repeats the
+ whole procedure, unless it is in the state |final|, which causes the
+ parsing process to stop immediately.
+
+ In the following example, the parser counts the number of |a|'s in the
+ \text{text}, ignoring any |b|'s. The \meta{text} ends with the first~|c|.
+ %
+\begin{codeexample}[]
+\newcount\mycount
+\pgfparserdef{myparser}{initial}{the letter a}%
+{\advance\mycount by 1\relax}%
+\pgfparserdef{myparser}{initial}{the letter b}%
+{} % do nothing
+\pgfparserdef{myparser}{initial}{the letter c}%
+{\pgfparserswitch{final}}% done!
+
+\pgfparserparse{myparser}aabaabababbbbbabaabcccc
+There are \the\mycount\ a's.
+\end{codeexample}%
+ %
+\end{command}%
+
+\begin{command}%
+ {%
+ \pgfparserdef\marg{parser name}\marg{state}\meta{symbol meaning}%
+ \oarg{arguments}\marg{action}%
+ }%
+ This command should be used repeatedly to define a parser named
+ \meta{parser name}. With a call to this command you specify that the
+ \meta{parser name} should do the following: When it is in state \meta{state}%
+ and reads the letter \meta{symbol meaning}, perform the code stored in
+ \meta{action}.
+
+ The \meta{symbol meaning} must be the text that results from applying the
+ \TeX\ command |\meaning| to the given character. For instance, |\meaning a|
+ yields |the letter a|, while |\meaning 1| yields |the character 1|. A space
+ yields |blank space|. Alternatively you can give the symbol you want without
+ surrounding it in braces. So both
+ |\pgfparserdef{myparser}{initial}{the letter a}{foo}|
+ and
+ |\pgfparserdef{myparser}{initial}a{foo}|
+ define an \meta{action} for |the letter a|.
+
+ The \meta{action} might require arguments which you can specify in the
+ optional \meta{arguments} string. The argument string can contain up to nine
+ argument specifications of the following types:
+
+ \begingroup
+ \def\argdesc#1#2%
+ {%
+ \par
+ \begingroup
+ \setbox0\hbox{\texttt #1}\makebox[1.5em][l]{\usebox0}%
+ \ifdim\wd0>1.5em\\\null\hspace{1.5em}\fi
+ \parbox[t]{\dimexpr\linewidth-1.5em\relax}{#2}%
+ \endgroup
+ }%
+ \argdesc{m}%
+ {a normal mandatory argument}%
+ \argdesc{r\meta{delim}}%
+ {a mandatory argument which is read up to the \meta{delim}}%
+ \argdesc{o}%
+ {an optional argument in |[]| defaulting to a special mark}%
+ \argdesc{O\marg{default}}%
+ {like |o| but defaulting to \meta{default}}%
+ \argdesc{d\meta{delim1}\meta{delim2}}%
+ {%
+ an optional argument in \meta{delim1} and \meta{delim2} defaulting to a
+ special mark%
+ }%
+ \argdesc{D\meta{delim1}\meta{delim2}\marg{default}}%
+ {like |d| but defaulting to \meta{default}}%
+ \argdesc{t\meta{token}}%
+ {%
+ tests whether the next letter is \meta{token}, if so gobbles it and
+ the argument is set to a special mark.%
+ }%
+ \endgroup
+
+ So if you want to define an \meta{action} that takes two mandatory arguments
+ you use |[mm]|, if it should take an optional star, one optional argument in
+ brackets that returns a marker if it's not used, one mandatory and finally an
+ optional argument in parentheses that defaults to |something| you use
+ |[t*omD(){something}]| as the argument string. If the argument should be
+ anything up to a semicolon, you use |[r;]|. Spaces before argument
+ specifications in the string are ignored. So |[r m]| will be one argument and
+ read anything up to an |m|. Also spaces before any argument in the parsed
+ letters are ignored, so if |a| was setup to take an optional argument the
+ argument would be detected in |a []|. Like with normal \LaTeXe\ optional
+ arguments you have to protect nested brackets: |[a[bc]d]| would be read as
+ |a[bc| with a trailing |d]|, \emph{not} as |a[bc]d|. You'd have to use
+ |[{a[bc]d}]| to get it correct.
+
+ Inside the \meta{action} you can perform almost any kind of code. This code
+ will not be surrounded by a scope, so its effect persists after the parsing
+ is done. However, each time after the \meta{action} is executed, control
+ goes back to the parser. You should not launch a parser inside the
+ \meta{action} code, unless you put it in a scope.
+
+ When you set the \meta{state} to |all|, the state \meta{action} is performed
+ in all states as a fallback, whenever \meta{symbol meaning} is encountered.
+ This means that when you do not specify anything explicitly for a state and a
+ letter, but you do specify something for |all| and this letter, then the
+ specified \meta{action} will be used.
+
+ When the parser encounters a letter for which nothing is specified in the
+ current state (neither directly nor indirectly via |all|), an error occurs.
+ Additionally you can specify an action that is executed after the error is
+ thrown using |\pgfparserdefunknown|.
+\end{command}%
+
+\begin{command}%
+ {%
+ \pgfparserlet
+ \marg{parser name 1}\marg{state 1}\meta{symbol meaning 1}%
+ \oarg{opt 1}\oarg{opt 2}\meta{symbol meaning 2}%
+ }%
+ If none of the optional arguments are given in the following \meta{parser
+ name 2} and \meta{state 2} are the same as \meta{parser name 1} and
+ \meta{state 1}. If only the first is given \meta{state 2} equals
+ \meta{opt 1}. If both are given \meta{parser name 2} equals \meta{opt 1} and
+ \meta{state 2} equals \meta{opt 2}.
+
+ Defines an action for \meta{parser name 1} in \meta{state 1} for the
+ \meta{symbol meaning 1} to do the same as the action of \meta{parser name 2}
+ in \meta{state 2} for the \meta{symbol meaning 2}. For \meta{symbol meaning 1}
+ and \meta{symbol meaning 2} the same parsing rules apply as for \meta{symbol
+ meaning} in |\pgfparserdef| so you either give the meaning in braces or just
+ the symbol.
+\end{command}%
+
+\begin{command}{\pgfparserdefunknown\marg{parser name}\marg{state}\marg{action}}%
+ With this macro you can define an \meta{action} for the \meta{parser name}
+ parser in \meta{state} if the letter which was encountered was undefined.
+\end{command}%
+
+\begin{command}{\pgfparserdeffinal\marg{parser name}\marg{action}}%
+ Every parser can call a final \meta{action} after the state was switched to
+ |final|. This \meta{action} is executed after everything else, so you can use
+ something that grabs more arguments if you want to.
+\end{command}%
+
+\begin{command}{\pgfparserswitch\marg{state}}%
+ This command can be called inside the action code of a parser to cause a
+ state switch to \meta{state}.
+\end{command}%
+
+\begin{command}{\pgfparserifmark\marg{arg}\marg{true}\marg{false}}%
+ Remember that some of the optional argument types set special marks? With
+ |\pgfparserifmark| you can test whether \meta{arg} is such a mark. So if
+ there was no optional argument for the argument types |o| and |d| the
+ \meta{true} branch will be executed, else the \meta{false} branch. For the |t|
+ type argument the \meta{true} branch is executed if the token was encountered.
+\end{command}%
+
+\begin{command}{\pgfparserreinsert}%
+ You can use this as the final macro in an action of |\pgfparserdef| or
+ |\pgfparserdefunknown|. This has the effect that the letter which was parsed
+ in this action will be parsed again after this action (and after any arguments
+ were read).
+\end{command}%
+
+\begin{command}{\pgfparserstate}%
+ Expands to the current state of the parser.
+\end{command}%
+
+\begin{command}{\pgfparsertoken}%
+ This is the macro which is let to the following token with |\futurelet|. You
+ can use it inside an action code.
+\end{command}%
+
+\begin{command}{\pgfparserletter}%
+ This macro stores the letter to which |\pgfparsertoken| was let. So if
+ you'd use |\pgfparserparse{foo}a| this macro would be defined with
+ |\def\pgfparserletter{a}|. This definition is done before any action code is
+ executed. There are two special cases: If |{| or |}| would be the next letter
+ for the parser, this macro is defined to expand to |\bgroup| or |\egroup|.
+\end{command}%
+
+\begin{command}{\pgfparserset\marg{key list}}%
+ The |pgfparser| module has a few keys you can access through this macro. It
+ is just a shortcut for |\pgfset{/pgfparser/.cd,#1}|. The available keys are
+ listed in subsection~\ref{sec:parser:keys}.
+\end{command}%
+
+\subsection{Keys of the Parser Module}\label{sec:parser:keys}%
+\begin{key}{/pgfparser/silent=\meta{boolean} (initially false)}%
+ If |true| then no error will be thrown when a letter is parsed for which no
+ action is specified, silently ignoring it. This holds true for every parser.
+\end{key}%
+
+\begin{key}{/pgfparser/status=\meta{boolean} (initially false)}%
+ If |true| every parser prints a status message for every action executed. This
+ might help in debugging and understanding what the parser does.
+\end{key}%
+
+Additionally to those keys for every \meta{parser name} for which
+|\pgfparserdef|, |\pgfparserdefunknown| or |\pgfparserlet| was run at least once
+the following will be defined:
+
+\begin{key}{/pgfparser/\meta{parser name}/silent=\meta{boolean} (initially false)}%
+ If |true| the parser \meta{parser name} will silently ignore undefined
+ letters. This is an individual equivalent of |/pgfparser/silent| for each
+ defined parser.
+\end{key}%
+
+\subsection{Examples}%
+The following example counts the different letters appearing in a more or less
+random string of letters. Every letter is counted only once, this is achieved by
+defining a new action for every encountered unknown letter that does nothing. We
+can define such rule without knowing which letter is used, because
+|\pgfparsertoken| has the same meaning as that letter.
+\begin{codeexample}[]
+\mycount=0
+% using the shortcut syntax of just placing ; after the state
+\pgfparserdef{different letters}{all};{\pgfparserswitch{final}}%
+\pgfparserdefunknown{different letters}{all}%
+ {\pgfparserdef{different letters}{all}\pgfparsertoken{}\advance\mycount1}%
+\pgfparserdeffinal{different letters}%
+ {\the\mycount\ different letters found}%
+% don't throw errors for unknown letters
+\pgfparserset{different letters/silent=true}%
+
+\pgfparserparse{different letters}udiaternxqlchudiea;
+\end{codeexample}%
+
+Next we want to try something that uses some of the different argument types
+available.
+\begin{codeexample}[]
+% using the same syntax as \pgfparserdef
+\pgfparserdef{arguments}{initial}{the letter a}[d()]
+ {\pgfparserifmark{#1}{\textcolor{red}{\textit{use}}}{\textbf{#1}} }%
+% using the shortcut syntax
+\pgfparserdef{arguments}{initial}t[m]{\texttt{#1} }%
+\pgfparserdef{arguments}{initial}c[t*O{blue}m]
+ {\pgfparserifmark{#1}{#3}{\textcolor{#2}{#3}}}%
+\pgfparserdef{arguments}{all};{\pgfparserswitch{final}}%
+
+\pgfparserparse{arguments}t{nobody}a(will)ac[green]{P}c*{arse}c{r};
+\end{codeexample}%
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-oo.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-oo.tex
new file mode 100644
index 0000000000..bd1f11d01f
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-oo.tex
@@ -0,0 +1,690 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Object-Oriented Programming}
+\label{section-oop}
+
+This section describes the |oo| module.
+
+\begin{pgfmodule}{oo}
+ This module defines a relatively small set of \TeX\ commands for defining
+ classes, methods, attributes and objects in the sense of object-oriented
+ programming.
+\end{pgfmodule}
+
+In this chapter it is assumed that you are familiar with the basics of a
+typical object-oriented programming language like Java, C++ or Eiffel.
+
+
+\subsection{Overview}
+
+\TeX\ does not support object-oriented programming, presumably because it was
+written at a time when this style of programming was not yet ``en vogue''. When
+one is used to the object-oriented style of thinking, some programming
+constructs in \TeX\ often seem overly complicated. The object-oriented
+programming module of \pgfname\ may help here. It is written completely using
+simple \TeX\ macros and is, thus, perfectly portable. This also means, however,
+that it is not particularly fast (but not too slow either), so you should use
+it only for non-time-critical things.
+
+Basically, the oo-system supports \emph{classes} (in the object-oriented sense,
+this has nothing to do with \LaTeX-classes), \emph{methods},
+\emph{constructors}, \emph{attributes}, \emph{objects}, \emph{object
+identities}, and (thanks to Sa\v o \v Zivanovi\'c) \emph{inheritance} and
+\emph{overloading.}
+
+The first step is to define a class, using the macro |\pgfooclass| (all normal
+macros in \pgfname's object-oriented system start with |\pgfoo|). This macro
+gets the name of a class and in its body a number of \emph{methods} are
+defined. These are defined using the |\method| macro (which is defined only
+inside such a class definition) and they look a bit like method definitions in,
+say, Java. Object attributes are declared using the |\attribute| command, which
+is also defined only inside a class definition.
+
+Once a class has been defined, you can create objects of this class. Objects
+are created using |\pgfoonew|. Such an object has many characteristics of
+objects in a normal object-oriented programming language: Each object has a
+\emph{unique identity}, so when you create another object, this object is
+completely distinct from all other objects. Each object also has a set of
+private attributes, which may change over time. Suppose, for instance, that we
+have a |point| class. Then creating a new object (called an instance) of this
+class would typically have an |x|-attribute and a |y|-attribute. These can be
+changed over time. Creating another instance of the |point| class creates
+another object with its own |x|- and |y|-attributes.
+
+Given an object, you can call a method for this object. Inside the method the
+attributes of the object for which the method is being called can be accessed.
+
+The life of an object always ends with the end of the \TeX\ scope in which it
+was created. However, changes to attribute values are not local to scopes, so
+when you change an attribute anywhere, this change persists till the end of the
+life of the object or until the attribute is changed again.
+
+
+\subsection{A Running Example: The Stamp Class}
+
+As a running example we will develop a |stamp| class and |stamp| objects. The
+idea is that a stamp object is able to ``stamp something'' on a picture. This
+means that a stamp object has an attribute storing the ``stamp text'' and there
+is a method that asks the object to place this text somewhere on a canvas. The
+method can be called repeatedly and there can be several different stamp
+objects, each producing a different text. Stamp objects can either be created
+dynamically when needed or a library might define many such objects in an outer
+scope.
+
+Such stamps are similar to many things present in \pgfname\ such as arrow tips,
+patterns, or shadings and, indeed, these could all have been implemented in
+this object-oriented fashion (which might have been better, but the
+object-oriented subsystem is a fairly new addition to \pgfname).
+
+
+\subsection{Classes}
+
+We start with the definition of the |stamp| class. This is done using the
+|\pgfooclass| macro:
+
+\begin{command}{\pgfooclass\opt{|(|\meta{list of superclasses}|)|}\marg{class name}\marg{body}}
+ This command defines a class named \meta{class name}. The name of the class
+ can contain spaces and most other characters, but no periods. So, valid
+ class names are |MyClass| or |my class| or |Class_C++_emulation??1|. The
+ \meta{list of superclasses} is optional just like the parenthesis around
+ it.
+
+ The \meta{body} is actually just executed, so any normal \TeX-code is
+ permissible here. However, while the \meta{body} is being executed, the
+ macros |\method| and |\attribute| are set up so that they can be used to
+ define methods and attributes for this class (the original meanings are
+ restored afterward).
+
+ The definition of a class is local to the scope where the class has been
+ defined.
+ %
+\begin{codeexample}[code only]
+\pgfooclass{stamp}{
+ % This is the class stamp
+
+ \attribute text;
+ \attribute rotation angle=20;
+
+ \method stamp(#1) { % The constructor
+ ...
+ }
+
+ \method apply(#1,#2) { % Causes the stamp to be shown at coordinate (#1,#2)
+ ...
+ }
+}
+
+% We can now create objects of type "stamp"
+\end{codeexample}
+
+ Concerning the list of base classes, the Method Resolution Order
+ (\textsc{mro}) is computed using the C3 algorithm also used in Python, v2.3
+ and higher. The linearization computed by the algorithm respects both
+ local precedence ordering and monotonicity. Resolution of both methods and
+ attributes depends on the \textsc{mro}: when a method method name is called
+ on an object of class $C$, the system invokes method method name from the
+ first class in the \textsc{mro} of $C$ which defines method method name;
+ when an object is created, each attribute |attr| is initialized to the
+ value specified in the first class in the \textsc{mro} of $C$ which
+ declares attribute |attr|.
+\end{command}
+
+The \meta{body} of a class usually just consists of calls to the macros
+|\attribute| and |\method|, which will be discussed in more detail in later
+sections.
+
+
+\subsection{Objects}
+
+Once a class has been declared, we can start creating objects for this class.
+For this the |\pgfoonew| command can be used, which has a peculiar syntax:
+
+\begin{command}{\pgfoonew\opt{\meta{object handle or attribute}|=|}|new |\meta{class name}|(|\meta{constructor arguments}|)|}
+ Causes a new object to be created. The class of the object will be
+ \meta{class name}, which must previously have been declared using
+ |\pgfooclass|. Once the object has been created, the constructor method of
+ the object will be called with the parameter list set to \meta{constructor
+ arguments}.
+
+ The resulting object is stored internally and its lifetime will end exactly
+ at the end of the current scope.
+
+ Here is an example in which three stamp objects are created.
+ %
+\begin{codeexample}[code only]
+\pgfoonew \firststamp=new stamp()
+\pgfoonew \secondstamp=new stamp()
+{
+ \pgfoonew \thirdstamp=new stamp()
+ ...
+}
+% \thirdstamp no longer exists, but \firststamp and \secondstamp do
+% even if you try to store \thirdstamp in a global variable, trying
+% to access it will result in an error.
+\end{codeexample}
+
+ The optional \meta{object handle or attribute} can either be an
+ \meta{object handle} or an \meta{attribute}. When an \meta{object handle}
+ is given, it must be a normal \TeX\ macro name that will ``point'' to the
+ object (handles are discussed in more detail in
+ Section~\ref{section-identities}). You can use this macro to call methods
+ of the object as discussed in the following section. When an
+ \meta{attribute} is given, it must be given in curly braces (the curly
+ braces are used to detect the presence of an attribute). In this case, a
+ handle to the newly created object is stored in this attribute.
+ %
+\begin{codeexample}[code only]
+\pgfooclass{foo}
+{
+ \attribute stamp obj;
+ \attribute another object;
+
+ \method foo() {
+ \pgfoonew{stamp obj}=new stamp()
+ \pgfoonew{another object}=new bar()
+ }
+ ...
+}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfoogc}
+ This command causes the ``garbage collector'' to be invoked. The job of
+ this garbage collector is to free the global \TeX-macros that are used by
+ ``dead'' objects (objects whose life-time has ended). This macro is called
+ automatically after every scope in which an object has been created, so you
+ normally do not need to call this macro yourself.
+\end{command}
+
+
+\subsection{Methods}
+
+Methods are defined inside the body of classes using the following command:
+
+\begin{command}{\method \meta{method name}|(|\meta{parameter list}|)|\marg{method body}}
+ This macro, which is only defined inside a class definition, defines a new
+ method named \meta{method name}. Just like class names, method names can
+ contain spaces and other characters, so \meta{method names} like
+ |put_stamp_here| or |put stamp here| are both legal.
+
+ Three method names are special: First, a method having either the same name
+ as the class or having the name |init| is called the \emph{constructor} of
+ the class. There are (currently) no destructors; objects simply become
+ ``undefined'' at the end of the scope in which they have been created. The
+ other two methods are called |get id| and |get handle|, which are always
+ automatically defined and which you cannot redefine. They are discussed in
+ Section~\ref{section-identities}.
+
+ Overloading of methods by differing numbers of parameters is not possible,
+ that is, it is illegal to have two methods inside a single class with the
+ same name (despite possibly different parameter lists). However, two
+ different classes may contain a method with the same name, that is, classes
+ form namespaces for methods. Also, a class can (re)implement a method from
+ a superclass.
+
+ The \meta{method name} must be followed by a \meta{parameter list} in
+ parentheses, which must be present even when the \meta{parameter list} is
+ empty. The \meta{parameter list} is actually a normal \TeX\ parameter list
+ that will be matched against the parameters inside the parentheses upon
+ method invocation and, thus, could be something like |#1#2 foo #3 bar.|,
+ but a list like |#1,#2,#3| is more customary. By setting the parameter list
+ to just |#1| and then calling, say, |\pgfkeys{#1}| at the beginning of a
+ method, you can implement Objective-C-like named parameters.
+
+ When a method is called, the \meta{body} of the method will be executed.
+ The main difference to a normal macro is that while the \meta{body} is
+ executed, a special macro called |\pgfoothis| is set up in such a way that
+ it references the object for which the method is executed.
+\end{command}
+
+In order to call a method for an object, you first need to create the object
+and you need a handle for this object. In order to invoke a method for this
+object, a special syntax is used that is similar to Java or C++ syntax:
+
+\begin{pgfmanualentry}
+ \pgfmanualentryheadline{\meta{object handle}\opt{|.|\meta{super class}}|.|\meta{method name}|(|\meta{parameters}|)|}%
+ \pgfmanualbody
+ This causes the method \meta{method name} to be called for the object
+ referenced by the \meta{object handle}. The method is the one defined in
+ the class of the object or, if it is not defined there, the method defined
+ in the superclasses of the object's class (if there are several
+ superclasses that define the same method, the method resolution order is
+ used to determine which one gets called). If the optional \meta{super
+ class} is specified, the method implementation of that class will be used
+ rather than the implementation in the object's class. The \meta{parameters}
+ are matched against the parameters of the method and, then, the method body
+ is executed. The execution of the method body is \emph{not} done inside a
+ scope, so the effects of a method body persist.
+ %
+\begin{codeexample}[code only]
+\pgfooclass{stamp}{
+ % This is the class stamp
+
+ \method stamp() { % The constructor
+ }
+
+ \method apply(#1,#2) { % Causes the stamp to be shown at coordinate (#1,#2)
+ % Draw the stamp:
+ \node [rotate=20,font=\huge] at (#1,#2) {Passed};
+ }
+}
+
+\pgfoonew \mystamp=new stamp()
+
+\begin{tikzpicture}
+ \mystamp.apply(1,2)
+ \mystamp.apply(3,4)
+\end{tikzpicture}
+\end{codeexample}
+
+ Inside a method, you can call other methods. If you have a handle for
+ another object, you can simply call it in the manner described above. In
+ order to call a method of the current object, you can use the special
+ object handle |\pgfoothis|.
+
+ \begin{command}{\pgfoothis}
+ This object handle is well-defined only when a method is being executed.
+ There, it is then set to point to the object for which the method is
+ being called, which allows you to call another method for the same
+ object.
+ %
+\begin{codeexample}[code only]
+\pgfooclass{stamp}{
+ % This is the class stamp
+
+ \method stamp() {}
+
+ \method apply(#1,#2) {
+ \pgfoothis.shift origin(#1,#2)
+
+ % Draw the stamp:
+ \node [rotate=20,font=\huge] {Passed};
+ }
+
+ % Private method:
+ \method shift origin(#1,#2) {
+ \tikzset{xshift=#1,yshift=#2}
+ }
+}
+\end{codeexample}
+ \end{command}
+\end{pgfmanualentry}
+
+\begin{command}{\pgfoosuper|(|\meta{class},\meta{object handle}|).|\meta{method name}|(|\meta{arguments}|)|}
+ This macro gives you finer control over which method gets invoked in case
+ of multiple inheritance. This macro calls \meta{method name} of the object
+ specified by \meta{object handle}, but which implementation of the method
+ is called is determined as follows: it will be the implementation in the
+ first class (in the method resolution order) after \meta{class} that
+ defines \meta{method name}.
+\end{command}
+
+
+\subsection{Attributes}
+
+Every object has a set of attributes, which may change over time. Attributes
+are declared using the |\attribute| command, which, like the |\method| command,
+is defined only inside the scope of |\pgfooclass|. Attributes can be modified
+(only) by methods. To take the |stamp| example, an attribute of a |stamp|
+object might be the text that should be stamped when the |apply| method is
+called.
+
+When an attribute is changed, this change is \emph{not} local to the current
+\TeX\ group. Changes will persist till the end of the object's life or until
+the attribute is changed once more.
+
+To declare an attribute you should use the |\attribute| command:
+%
+\begin{command}{\attribute \meta{attribute name}\opt{|=|\meta{initial value}}|;|}
+ This command can only be given inside the body of an |\pgfooclass| command.
+ It declares the attribute named \meta{attribute name}. This name, like
+ method or class names, can be quite arbitrary, but should not contain
+ periods. Valid names are |an_attribute?| or |my attribute|.
+
+ You can optionally specify an \meta{initial value} for the attribute; if
+ none is given, the empty string is used automatically. The initial value is
+ the value that the attribute will have just after the object has been
+ created and before the constructor is called.
+ %
+\begin{codeexample}[code only]
+\pgfooclass{stamp}{
+ % This is the class stamp
+
+ \attribute text;
+ \attribute rotation angle = 20;
+
+ \method stamp(#1) {
+ \pgfooset{text}{#1} % Set the text
+ }
+
+ \method apply(#1,#2) {
+ \pgfoothis.shift origin(#1,#2)
+
+ % Draw the stamp:
+ \node [rotate=\pgfoovalueof{rotation angle},font=\huge]
+ {\pgfoovalueof{text}};
+ }
+
+ \method shift origin(#1,#2) { ... }
+
+ \method set rotation (#1) {
+ \pgfooset{rotation angle}{#1}
+ }
+}
+\end{codeexample}
+ %
+\end{command}
+
+Attributes can be set and read only inside methods, it is not possible to do so
+using an object handle. Spoken in terms of traditional object-oriented
+programming, attributes are always private. You need to define getter and
+setter methods if you wish to read or modify attributes.
+
+Reading and writing attributes is not done using the ``dot-notation'' that is
+used for method calls. This is mostly due to efficiency reasons. Instead, a set
+of special macros is used, all of which can \emph{only be used inside methods}.
+
+\begin{command}{\pgfooset\marg{attribute}\marg{value}}
+ Sets the \meta{attribute} of the current object to \meta{value}.
+ %
+\begin{codeexample}[code only]
+\method set rotation (#1) {
+ \pgfooset{rotation angle}{#1}
+}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfooeset\marg{attribute}\marg{value}}
+ Performs the same action as |\pgfooset| but in an |\edef| full expansion
+ context.
+\end{command}
+
+\begin{command}{\pgfooappend\marg{attribute}\marg{value}}
+ This method adds the given \meta{value} to the \meta{attribute} at the end.
+\end{command}
+
+\begin{command}{\pgfooprefix\marg{attribute}\marg{value}}
+ This method adds the given \meta{value} to the \meta{attribute} at the
+ beginning.
+\end{command}
+
+\begin{command}{\pgfoolet\marg{attribute}\marg{macro}}
+ Sets the \meta{attribute} of the current value to the current value of
+ \meta{macro} using \TeX's |\let| command.
+ %
+\begin{codeexample}[code only]
+\method foo () {
+ \pgfoolet{my func}\myfunc
+ % Changing \myfunc now has no effect on the value of attribute my func
+}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfoovalueof\marg{attribute}}
+ Expands (eventually) to the current value of \meta{attribute} of the
+ current object.
+ %
+\begin{codeexample}[code only]
+\method apply(#1,#2) {
+ \pgfoothis.shift origin(#1,#2)
+
+ \node [rotate=\pgfoovalueof{rotation angle},font=\huge]
+ {\pgfoovalueof{text}};
+}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfooget\marg{attribute}\marg{macro}}
+ Reads the current value of \meta{attribute} and stores the result in
+ \meta{macro}.
+ %
+\begin{codeexample}[code only]
+...
+ \method get rotation (#1) {
+ \pgfooget{rotation angle}{#1}
+ }
+...
+
+\mystamp.get rotation(\therotation)
+``\therotation'' is now ``20'' (or whatever).
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Identities}
+\label{section-identities}
+
+Every object has a unique identity, which is simply an integer. It is possible
+to retrieve the object id using the |get id| method (discussed below), but
+normally you will not need to do so because the id itself cannot be used to
+access an object. Rather, you access objects via their methods and these, in
+turn, can only be called via object handles.
+
+Object handles can be created in four ways:
+%
+\begin{enumerate}
+ \item Calling |\pgfoonew|\meta{object handle}|=...| will cause \meta{object
+ handle} to be a handle to the newly created object.
+ \item Using |\let| to create an alias of an existing object handle: If
+ |\mystamp| is a handle, saying |\let\myotherstamp=\mystamp| creates a
+ second handle to the same object.
+ \item |\pgfooobj|\marg{id} can be used as an object handle to the object
+ with the given \meta{id}.
+ \item Using the |get handle| method to create a handle to a given object.
+\end{enumerate}
+
+Let us have a look at the last two methods.
+
+\begin{command}{\pgfooobj\marg{id}}
+ Provided that \meta{id} is the id of an existing object (an object whose
+ life-time has not expired), calling this command yields a handle to this
+ object. The handle can then be used to call methods:
+ %
+\begin{codeexample}[code only]
+% Create a new object:
+\pgfoonew \mystamp=new stamp()
+
+% Get the object's id and store it in \myid:
+\mystamp.get id(\myid)
+
+% The following two calls have the same effect:
+\mystamp.apply(1,1)
+\pgfooobj{\myid}.apply(1,1)
+\end{codeexample}
+ %
+\end{command}
+
+The |get id| method can be used to retrieve the id of an object. This method is
+predefined for every class and you should not try to define a method of this
+name yourself.
+
+\begin{predefinedmethod}{get id(\meta{macro})}
+ Calling \meta{obj}|.get id(|\meta{macro}|)| stores the id \meta{obj} in
+ \meta{macro}. This is mainly useful when you wish to store an object for a
+ longer time and you cannot guarantee that any handle that you happen to
+ have for this object will be available later on.
+
+ The only way to use the retrieved id later on is to call |\pgfooobj|.
+
+ Different object that are alive (that are still within the scope in which
+ they were created) will always have different ids, so you can use the id to
+ test for equality of objects. However, after an object has been destroyed
+ because its scope has ended, the same id may be used again for newly
+ created objects.
+
+ Here is a typical application where you need to call this method: You wish
+ to collect a list of objects for which you wish to call a specific method
+ from time to time. For the collection process you wish to offer a macro
+ called |\addtoobjectlist|, which takes an object handle as parameter. It is
+ quite easy to store this handle somewhere, but a handle is, well, just a
+ handle. Typically, shortly after the call to |\addtoobjectlist| the handle
+ will no longer be valid or even exist, even though the object still exists.
+ In this case, you wish to store the object id somewhere instead of the
+ handle. Thus, for the object passed to |\addtoobjectlist| you call the
+ |get id| method and store the resulting id, rather than the handle.
+\end{predefinedmethod}
+
+There is a second predefined method, called |get handle|, which is also used to
+create object handles.
+
+\begin{predefinedmethod}{get handle(\marg{macro name})}
+ Calling this method for an object will cause \meta{macro name} to become a
+ handle to the given object. For any object handle |\obj| -- other than
+ |\pgfoothis| -- the following two have the same effect:
+ %
+ \begin{enumerate}
+ \item |\let|\meta{macro name}|=\obj|
+ \item |\obj.get handle(|\meta{macro name}|)|
+ \end{enumerate}
+
+ The first method is simpler and faster. However, for |\pgfoothis| there is
+ a difference: The call |\pgfoothis.get handle(|\meta{macro name}|)| will
+ cause \meta{macro name} to be an object handle to the current object and
+ will persist to be so even after the method is done. By comparison,
+ |\let|\meta{macro name}|=\pgfoothis| causes |\obj| to be the same as the
+ very special macro |\pgfoothis|, so |\obj| will always refer to the current
+ object, which may change over time.
+\end{predefinedmethod}
+
+
+\subsection{The Object Class}
+\label{section-object}
+
+The object-oriented module predefines a basic class |object| that can be used
+as a base class in different context.
+
+\begin{ooclass}{object}
+ This class current only implements one method:
+
+ \begin{method}{copy(\meta{handle})}
+ Creates a new object and initializes the values of its (declared)
+ attributes to the values of the original. The method takes one
+ argument: a control sequence which receives the handle of the copy.
+ \end{method}
+\end{ooclass}
+
+
+\subsection{The Signal Class}
+\label{section-signals}
+
+In addition to the basic mechanism for defining and using classes and object,
+the class |signal| is predefined. It implements a so-called signal--slot
+mechanism.
+
+\begin{ooclass}{signal}
+ This class is used to implement a simple signal--slot mechanism. The idea
+ is the following: From time to time special things happen about which a
+ number of objects need to be informed. Different things can happen and
+ different object will be interested in these things. A |signal| object can
+ be used to signal that such special things of a certain kind have happened.
+ For example, one signal object might be used to signal the event that ``a
+ page has been shipped out''. Another signal might be used to signal that
+ ``a figure is about to be typeset'', and so on.
+
+ Objects can ``tune in'' to signals. They do so by \emph{connecting} one of
+ their methods (then called a \emph{slot}) to the signal. Then, whenever the
+ signal is \emph{emitted}, the method of the connected object(s) get called.
+ Different objects can connect different slots to the same signal as long as
+ the argument lists will fit. For example, the object that is used to signal
+ the ``end of page has been reached'' might emit signals that have, say, the
+ box number in which the finished page can be found as a parameter
+ (actually, the finished page is always in box 255). Then one object could
+ connect a method |handle page(#1)| to this signal, another might connect
+ the method |emergency action(#1)| to this signal, and so on.
+
+ Currently, it is not possible to ``unregister'' or ``detach'' a slot from a
+ signal, that is, once an object has been connect to a signal, it will
+ continue to receive emissions of this signal till the end of the life-time
+ of the signal. This is even true when the object no longer exists (but the
+ signal does), so care must be taken that signal objects are always created
+ after the objects that are listening to them.
+
+ \begin{method}{signal()}
+ The constructor does nothing.
+ \end{method}
+
+ \begin{method}{connect(\meta{object handle},\meta{method name})}
+ This method gets an \meta{object handle} as parameter and a
+ \meta{method name} of this object. It will queue the object-method pair
+ in an internal list and each time the signal emits something, this
+ object's method is called.
+
+ Be careful not to pass |\pgfoothis| as \meta{object handle}. This would
+ cause the signal object to connect to itself. Rather, if you wish to
+ connect a signal to a method of the current object you first need to
+ create an alias using the |get handle| method:
+ %
+\begin{codeexample}[code only]
+\pgfooclass{some class}{
+ \method some class() {
+ \pgfoothis.get handle(\me)
+ \somesignal.connect(\me,foo)
+ \anothersignal.connect(\me,bar)
+ }
+ \method foo () {}
+ \method bar (#1,#2) {}
+}
+\pgfoonew \objA=new some class()
+\pgfoonew \objB=new some class()
+\end{codeexample}
+ \end{method}
+
+ \begin{method}{emit(\meta{arguments})}
+ This method emits a signal to all connected slots. This means that for
+ all objects that have previously been connected via a call of
+ |connect|, the method (slot) that was specified during the call of
+ |connect| is invoked with given \meta{arguments}.
+ %
+\begin{codeexample}[code only]
+\anothersignal.emit(1,2)
+% will call \objA.bar(1,2) and \objB.bar(1,2)
+\end{codeexample}
+ \end{method}
+\end{ooclass}
+
+
+\subsection{Implementation Notes}
+
+For the curious, here are some notes on how the oo-system is implemented:
+%
+\begin{itemize}
+ \item There is an object id counter that gets incremented each time an
+ object is created. However, this counter is local to the current scope,
+ which means that it is reset at the end of each scope, corresponding to
+ the fact that at the end of a scope all objects created in this scope
+ become invalid. Newly created objects will then have the same id as
+ ``deleted'' objects.
+ \item Attributes are stored globally. For each attribute of each object
+ there is a macro whose name is composed of the object's id and the
+ attribute name. Changes to object attributes are always global.
+ \item A call to the garbage collector causes a loop to be executed that
+ tries to find objects whose object number is larger than the current
+ maximum alive objects. The global attributes of these objects are then
+ freed (set to |\relax|) by calling a special internal method of these
+ (dead) objects.
+
+ The garbage collector is automatically called after each group in
+ which an object was created using |\aftergroup|.
+ \item When a method is called, before the method call some code is executed
+ that sets a global counter storing the current object id to the object
+ id of the object being called. After the method call some code is
+ inserted that restores the global counter to its original value. This
+ is done without scopes, so some tricky |\expandafter| magic is needed.
+ Note that, because of this process, you cannot use commands like
+ |\pgfutil@ifnextchar| at the end of a method.
+ \item An object handle contains just the code to set up and restore the
+ current object number to the number of the object being called.
+\end{itemize}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pages.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pages.tex
new file mode 100644
index 0000000000..1975199a80
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pages.tex
@@ -0,0 +1,636 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Page Management}
+
+This section describes the |pgfpages| package. Although this package is not
+concerned with creating pictures, its implementation relies so heavily on
+\pgfname\ that it is documented here. Currently, |pgfpages| only works with
+\LaTeX, but if you are adventurous, feel free to hack the code so that it also
+works with plain \TeX.
+
+The aim of |pgfpages| is to provide a flexible way of putting multiple pages on
+a single page \emph{inside \TeX}. Thus, |pgfpages| is quite different from
+useful tools like |psnup| or |pdfnup| insofar as it creates its output in a
+single pass. Furthermore, it works uniformly with both |latex| and |pdflatex|,
+making it easy to put multiple pages on a single page without any fuss.
+
+A word of warning: \emph{using |pgfpages| will destroy hyperlinks}. Actually,
+the hyperlinks are not destroyed, only they will appear at totally wrong
+positions on the final output. This is due to a fundamental flaw in the \pdf\
+specification: In \pdf\ the bounding rectangle of a hyperlink is given in
+``absolute page coordinates'' and translations or rotations do not affect them.
+Thus, the transformations applied by |pgfpages| to put the pages where you want
+them are (cannot, even) be applied to the coordinates of hyperlinks. It is
+unlikely that this will change in the foreseeable future.
+
+
+\subsection{Basic Usage}
+
+The internals of |pgfpages| are complex since the package can do all sorts of
+interesting tricks. For this reason, so-called \emph{layouts} are predefined
+that set up all option in appropriate ways.
+
+You use a layout as follows:
+%
+\begin{codeexample}[code only]
+\documentclass{article}
+
+\usepackage{pgfpages}
+\pgfpagesuselayout{2 on 1}[a4paper,landscape,border shrink=5mm]
+
+\begin{document}
+This text is shown on the left.
+\clearpage
+This text is shown on the right.
+\end{document}
+\end{codeexample}
+
+The layout |2 on 1| puts two pages on a single page. The option |a4paper| tells
+|pgfpages| that the \emph{resulting} page (called the \emph{physical} page in
+the following) should be |a4paper| and it should be landscape (which is quite
+logical since putting two portrait pages next to each other gives a landscape
+page). Normally, the \emph{logical} pages, that is, the pages that \TeX\
+``thinks'' that it is typesetting, will have the same sizes, but this need not
+be the case. |pgfpages| will automatically scale down the logical pages such
+that two logical pages fit next to each other inside a DIN A4 page.
+
+The |border shrink| tells |pgfpages| that it should add an additional 5mm to
+the shrinking such that a 5mm-wide border is shown around the resulting logical
+pages.
+
+As a second example, let us put two pages produced by the \textsc{beamer} class
+on a single page:
+%
+\begin{codeexample}[code only]
+\documentclass{beamer}
+
+\usepackage{pgfpages}
+\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]
+
+\begin{document}
+\begin{frame}
+ This text is shown at the top.
+\end{frame}
+\begin{frame}
+ This text is shown at the bottom.
+\end{frame}
+\end{document}
+\end{codeexample}
+
+Note that we do not use the |landscape| option since \textsc{beamer}'s logical
+pages are already in landscape mode and putting two landscape pages on top of
+each other results in a portrait page. However, if you had used the |4 on 1|
+layout, you would have had to add |landscape| once more, using the |6 on 1| or
+|8 on 1| you must not, using |16 on 1| you need it yet again. And, no, there is
+no |32 on 1| layout.
+
+Another word of caution: \emph{using |pgfpages| will produce wrong page numbers
+in the |.aux| file}. The reason is that \TeX\ instantiates the page numbers
+when writing an |.aux| file only when the physical page is shipped out.
+Fortunately, this problem is easy to fix: First, typeset our file normally
+without using the |\pgfpagesuselayout| command (just put the comment marker |%|
+before it) Then, rerun \TeX\ with the |\pgfpagesuselayout| command included and
+add the command |\nofiles|. This command ensures that the |.aux| file is not
+modified, which is exactly what you want. So, to typeset the above example, you
+should actually first \TeX\ the following file:
+%
+\begin{codeexample}[code only]
+\documentclass{article}
+
+\usepackage{pgfpages}
+%%\pgfpagesuselayout{2 on 1}[a4paper,landscape,border shrink=5mm]
+%%\nofiles
+
+\begin{document}
+This text is shown on the left.
+\clearpage
+This text is shown on the right.
+\end{document}
+\end{codeexample}
+%
+and then typeset
+%
+\begin{codeexample}[code only]
+\documentclass{article}
+
+\usepackage{pgfpages}
+\pgfpagesuselayout{2 on 1}[a4paper,landscape,border shrink=5mm]
+\nofiles
+
+\begin{document}
+This text is shown on the left.
+\clearpage
+This text is shown on the right.
+\end{document}
+\end{codeexample}
+
+The final basic example is the |resize to| layout (it works a bit like a
+hypothetical |1 on 1| layout). This layout resizes the logical page such that
+is fits the specified physical size. Since this does not change the page
+numbering, you need not worry about the |.aux| files with this layout. For
+example, adding the following lines will ensure that the physical output will
+fit on DIN A4 paper:
+%
+\begin{codeexample}[code only]
+\usepackage{pgfpages}
+\pgfpagesuselayout{resize to}[a4paper]
+\end{codeexample}
+
+This can be very useful when you have to handle lots of papers that are typeset
+for, say, letter paper and you have an A4 printer or the other way round. For
+example, the following article will be fit for printing on letter paper:
+%
+\begin{codeexample}[code only]
+\documentclass[a4paper]{article}
+%% a4 is currently the logical size and also the physical size
+
+\usepackage{pgfpages}
+\pgfpagesuselayout{resize to}[letterpaper]
+%% a4 is still the logical size, but letter is the physical one
+
+\begin{document}
+ \title{My Great Article}
+...
+\end{document}
+\end{codeexample}
+
+
+\subsection{The Predefined Layouts}
+
+This section explains the predefined layouts in more detail. You select a
+layout using the following command:
+%
+\begin{command}{\pgfpagesuselayout\marg{layout}\oarg{options}}
+ Installs the specified \meta{layout} with the given \meta{options}. The
+ predefined layouts and their permissible options are explained below.
+
+ If this function is called multiple times, only the last call ``wins''. You
+ can thereby overwrite any previous settings. In particular, layouts
+ \emph{do not} accumulate.
+
+ \example |\pgfpagesuselayout{resize to}[a4paper]|
+\end{command}
+
+\begin{pgflayout}{resize to}
+ This layout is used to resize every logical page to a specified physical
+ size. To determine the target size, the following options may be given:
+ %
+ \begin{itemize}
+ \item \declare{|physical paper height=|\meta{size}} sets the height of
+ the physical page size to \meta{size}.
+ \item \declare{|physical paper width=|\meta{size}} sets the width of
+ the physical Pappe size to \meta{size}.
+ \item \declare{|a0paper|} sets the physical page size to DIN A0 paper.
+ \item \declare{|a1paper|} sets the physical page size to DIN A1 paper.
+ \item \declare{|a2paper|} sets the physical page size to DIN A2 paper.
+ \item \declare{|a3paper|} sets the physical page size to DIN A3 paper.
+ \item \declare{|a4paper|} sets the physical page size to DIN A4 paper.
+ \item \declare{|a5paper|} sets the physical page size to DIN A5 paper.
+ \item \declare{|a6paper|} sets the physical page size to DIN A6 paper.
+ \item \declare{|letterpaper|} sets the physical page size to the
+ American letter paper size.
+ \item \declare{|legalpaper|} sets the physical page size to the
+ American legal paper size.
+ \item \declare{|executivepaper|} sets the physical page size to the
+ American executive paper size.
+ \item \declare{|landscape|} swaps the height and the width of the
+ physical paper.
+ \item \declare{|border shrink=|\meta{size}} additionally reduces the
+ size of the logical page on the physical page by \meta{size}.
+ \end{itemize}
+\end{pgflayout}
+
+\begin{pgflayout}{2 on 1}
+ Puts two logical pages alongside each other on each physical page if the
+ logical height is larger than the logical width (logical pages are in
+ portrait mode). Otherwise, two logical pages are put on top of each other
+ (logical pages are in landscape mode). When using this layout, it is
+ advisable to use the |\nofiles| command, but this is not done
+ automatically.
+
+ The same \meta{options} as for the |resize to| layout can be used, plus the
+ following option:
+ %
+ \begin{itemize}
+ \item \declare{|odd numbered pages right|} places the first page on the
+ right.
+ \end{itemize}
+\end{pgflayout}
+
+\begin{pgflayout}{4 on 1}
+ Puts four logical pages on a single physical page. The same \meta{options}
+ as for the |resize to| layout can be used.
+\end{pgflayout}
+
+\begin{pgflayout}{6 on 1}
+ Puts six logical pages on a single physical page.
+\end{pgflayout}
+
+\begin{pgflayout}{8 on 1}
+ Puts eight logical pages on a single physical page. As for |2 on 1| and
+ |4 on 1|, the orientation depends on whether the logical pages are in
+ landscape mode or in portrait mode.
+\end{pgflayout}
+
+\begin{pgflayout}{16 on 1}
+ This is for the \textsc{ceo}.
+\end{pgflayout}
+
+\begin{pgflayout}{rounded corners}
+\label{layout-rounded-corners}
+ This layout adds ``rounded corners'' to every page, which, supposedly,
+ looks nicer during presentations with projectors (personally, I doubt
+ this). This is done by (possibly) resizing the page to the physical page
+ size. Then four black rectangles are drawn in each corner. Next, a clipping
+ region is set up that contains all of the logical page except for little
+ rounded corners. Finally, the logical page is drawn and clipped against the
+ clipping region.
+
+ Note that every logical page should fill its background for this to work.
+
+ In addition to the \meta{options} that can be given to |resize to|, the
+ following options may be given.
+ %
+ \begin{itemize}
+ \item \declare{|corner width=|\meta{size}} specifies the size of the
+ corner.
+ \end{itemize}
+ %
+\begin{codeexample}[code only]
+\documentclass{beamer}
+\usepackage{pgfpages}
+\pgfpagesuselayout{rounded corners}[corner width=5pt]
+\begin{document}
+...
+\end{document}
+\end{codeexample}
+ %
+\end{pgflayout}
+
+\begin{pgflayout}{two screens with lagging second}
+ This layout puts two logical pages alongside each other. The second page
+ always shows what the main page showed on the previous physical page. Thus,
+ the second page ``lags behind'' the main page. This can be useful when you
+ have two projectors attached to your computer and can show different parts
+ of a physical page on different projectors.
+
+ The following \meta{options} may be given:
+ %
+ \begin{itemize}
+ \item \declare{|second right|} puts the second page right of the main
+ page. This will make the physical pages twice as wide as the
+ logical pages, but it will retain the height.
+ \item \declare{|second left|} puts the second page left, otherwise it
+ behaves the same as |second right|.
+ \item \declare{|second bottom|} puts the second page below the main
+ page. This make the physical pages twice as high as the logical
+ ones.
+ \item \declare{|second top|} works like |second bottom|.
+ \end{itemize}
+\end{pgflayout}
+
+\begin{pgflayout}{two screens with optional second}
+ This layout works similarly to |two screens with lagging second|. The
+ difference is that the contents of the second screen only changes when one
+ of the commands |\pgfshipoutlogicalpage{2}|\marg{box} or
+ |\pgfcurrentpagewillbelogicalpage{2}| is called. The first puts the given
+ \meta{box} on the second page. The second specifies that the current page
+ should be put there, once it is finished.
+
+ The same options as for |two screens with lagging second| may be given.
+\end{pgflayout}
+
+You can define your own predefined layouts using the following command:
+
+\begin{command}{\pgfpagesdeclarelayout\marg{layout}\marg{before actions}\marg{after actions}}
+ This command predefines a \meta{layout} that can later be installed using
+ the |\pgfpagesuselayout| command.
+
+ When |\pgfpagesuselayout|\marg{layout}\oarg{options} is called, the
+ following happens: First, the \meta{before actions} are executed. They can
+ be used, for example, to set up default values for keys. Next,
+ |\setkeys{pgfpagesuselayoutoption}|\marg{options} is executed. Finally, the
+ \meta{after actions} are executed.
+
+ Here is an example:
+ %
+\begin{codeexample}[code only]
+\pgfpagesdeclarelayout{resize to}
+{
+ \def\pgfpageoptionborder{0pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=1,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ resized width=\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ border shrink=\pgfpageoptionborder,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Defining a Layout}
+
+If none of the predefined layouts meets your problem or if you wish to modify
+them, you can create layouts from scratch. This section explains how this is
+done.
+
+Basically, |pgfpages| hooks into \TeX's |\shipout| function. This function is
+called whenever \TeX\ has completed typesetting a page and wishes to send this
+page to the |.dvi| or |.pdf| file. The |pgfpages| package redefines this
+command. Instead of sending the page to the output file, |pgfpages| stores it
+in an internal box and then acts as if the page had been output. When \TeX\
+tries to output the next page using |\shipout|, this call is once more
+intercepted and the page is stored in another box. These boxes are called
+\emph{logical pages}.
+
+At some point, enough logical pages have been accumulated such that a
+\emph{physical page} can be output. When this happens, |pgfpages| possibly
+scales, rotates, and translates the logical pages (and possibly even does
+further modifications) and then puts them at certain positions of the
+\emph{physical} page. Once this page is fully assembled, the ``real'' or
+``original'' |\shipout| is called to send the physical page to the output file.
+
+In reality, things are slightly more complicated. First, once a physical page
+has been shipped out, the logical pages are usually voided, but this need not
+be the case. Instead, it is possible that certain logical pages just retain
+their contents after the physical page has been shipped out and these pages
+need not be filled once more before a physical shipout can occur. However, the
+contents of these logical pages can still be changed using special commands. It
+is also possible that after a shipout certain logical pages are filled with the
+contents of \emph{other} logical pages.
+
+A \emph{layout} defines for each logical page where it will go on the physical
+page and which further modifications should be done. The following two commands
+are used to define the layout:
+
+\begin{command}{\pgfpagesphysicalpageoptions\marg{options}}
+ This command sets the characteristics of the ``physical'' page. For
+ example, it is used to specify how many logical pages there are and how
+ many logical pages must be accumulated before a physical page is shipped
+ out. How each individual logical page is typeset is specified using the
+ command |\pgfpageslogicalpageoptions|, described later.
+
+ \example A layout for putting two portrait pages on a single landscape
+ page:
+ %
+\begin{codeexample}[code only]
+\pgfpagesphysicalpageoptions
+{%
+ logical pages=2,%
+ physical height=\paperwidth,%
+ physical width=\paperheight,%
+}
+
+\pgfpageslogicalpageoptions{1}
+{%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
+}%
+\pgfpageslogicalpageoptions{2}
+{%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}%
+}%
+\end{codeexample}
+
+ The following \meta{options} may be set:
+ \begin{itemize}
+ \item \declare{|logical pages=|\meta{logical pages}} specified how many
+ logical pages there are, in total. These are numbered 1 to
+ \meta{logical pages}.
+ \item \declare{|first logical shipout=|\meta{first}}. See the next
+ option. By default, \meta{first} is 1.
+ \item \declare{|last logical shipout=|\meta{last}}. Together with the
+ previous option, these two options define an interval of pages
+ inside the range 1 to \meta{logical pages}. Only this range is used
+ to store the pages that are shipped out by \TeX. This means that
+ after a physical shipout has just occurred (or at the beginning),
+ the first time \TeX\ wishes to perform a shipout, the page to be
+ shipped out is stored in logical page \meta{first}. The next time
+ \TeX\ performs a shipout, the page is stored in logical page
+ $\meta{first} +1$ and so on, until the logical page \meta{last} is
+ also filled. Once this happens, a physical shipout occurs and the
+ process starts once more.
+
+ Note that logical pages that lie outside the interval between
+ \meta{first} and \meta{last} are filled only indirectly or when
+ special commands are used.
+
+ By default, \meta{last} equals \meta{logical pages}.
+ \item \declare{|current logical shipout=|\meta{current}} changes an
+ internal counter such that \TeX's next logical shipout will be
+ stored in logical page \meta{current}.
+
+ This option can be used to ``warp'' the logical page filling
+ mechanism to a certain page. You can both skip logical pages and
+ overwrite already filled logical pages. After the logical page
+ \meta{current} has been filled, the internal counter is incremented
+ normally as if the logical page \meta{current} had been ``reached''
+ normally. If you specify a \meta{current} larger than \meta{last},
+ a physical shipout will occur after the logical page \meta{current}
+ has been filled.
+ \item \declare{|physical height=|\meta{height}} specifies the height of
+ the physical pages. This height is typically different from the
+ normal |\paperheight|, which is used by \TeX\ for its typesetting
+ and page breaking purposes.
+ \item \declare{|physical width=|\meta{width}} specifies the physical
+ width.
+ \end{itemize}
+\end{command}
+
+
+\begin{command}{\pgfpageslogicalpageoptions\marg{logical page number}\marg{options}}
+ This command is used to specify where the logical page number \meta{logical
+ page number} will be placed on the physical page. In addition, this command
+ can be used to install additional ``code'' to be executed when this page is
+ put on the physical page.
+
+ The number \meta{logical page number} should be between 1 and \meta{logical
+ pages}, which has previously been installed using the
+ |\pgfpagesphysicalpageoptions| command.
+
+ The following \meta{options} may be given:
+ %
+ \begin{itemize}
+ \item \declare{|center=|\meta{pgf point}} specifies the center of the
+ logical page inside the physical page as a \pgfname-point. The
+ origin of the coordinate system of the physical page is at the
+ \emph{lower} left corner.
+ %
+\begin{codeexample}[code only]
+\pgfpageslogicalpageoptions{1}
+{% center logical page on middle of left side
+ center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+}
+\end{codeexample}
+ %
+ \item \declare{|resized width=|\meta{size}} specifies the width that
+ the logical page should have \emph{at most} on the physical page.
+ To achieve this width, the pages is scaled down appropriately
+ \emph{or more}. The ``or more'' part can happen if the
+ |resize height| option is also used. In this case, the scaling is
+ chosen such that both the specified height and width are met. The
+ aspect ratio of a logical page is not modified.
+ \item \declare{|resized height=|\meta{height}} specifies the maximum
+ height of the logical page.
+ \item \declare{|original width=|\meta{width}} specifies the width the
+ \TeX\ ``thinks'' that the logical page has. This width is
+ |\paperwidth| at the point of invocation, by default. Note that
+ setting this width to something different from |\paperwidth| does
+ \emph{not} change the |\pagewidth| during \TeX's typesetting. You
+ have to do that yourself.
+
+ You need this option only for special logical pages that have a
+ height or width different from the normal one and for which you
+ will (later on) set these sizes yourself.
+ \item \declare{|original height=|\meta{height}} works like
+ |original width|.
+ \item \declare{|scale=|\meta{factor}} scales the page by at least the
+ given \meta{factor}. A \meta{factor} of |0.5| will half the size of
+ the page, a factor or |2| will double the size. ``At least'' means
+ that if options like |resize height| are given and if the scaling
+ required to meet that option is less than \meta{factor}, that other
+ scaling is used instead.
+ \item \declare{|xscale=|\meta{factor}} scales the logical page along
+ the $x$-axis by the given \meta{factor}. This scaling is done
+ independently of any other scaling. Mostly, this option is useful
+ for a factor of |-1|, which flips the page along the $y$-axis. The
+ aspect ratio is not kept.
+ \item \declare{|yscale=|\meta{factor}} works like |xscale|, only for
+ the $y$-axis.
+ \item \declare{|rotation=|\meta{degree}} rotates the page by
+ \meta{degree} around its center. Use a degree of |90| or |-90| to
+ go from portrait to landscape and back. The rotation need not be a
+ multiple of |90|.
+ \item \declare{|copy from=|\meta{logical page number}}. Normally, after
+ a physical shipout has occurred, all logical pages are voided in a
+ loop. However, if this option is given, the current logical page is
+ filled with the contents of the old logical page number
+ \meta{logical page number}.
+
+ \example Have logical page 2 retain its contents:
+ %
+\begin{codeexample}[code only]
+\pgfpageslogicalpageoptions{2}{copy from=2}
+\end{codeexample}
+
+ \example Let logical page 2 show what logical page 1 showed on the
+ just-shipped-out physical page:
+ %
+\begin{codeexample}[code only]
+\pgfpageslogicalpageoptions{2}{copy from=1}
+\end{codeexample}
+ %
+ \item \declare{|border shrink|=\meta{size}} specifies an additional
+ reduction of the size to which the page is page is scaled.
+ \item \declare{|border code|=\meta{code}}. When this option is given,
+ the \meta{code} is executed before the page box is inserted with a
+ path preinstalled that is a rectangle around the current logical
+ page. Thus, setting \meta{code} to |\pgfstroke| draws a rectangle
+ around the logical page. Setting \meta{code} to
+ |\pgfsetlinewidth{3pt}\pgfstroke| results in a thick (ugly) frame.
+ Adding dashes and filling can result in arbitrarily funky and
+ distracting borders.
+
+ You can also call |\pgfdiscardpath| and add your own path
+ construction code (for example to paint a rectangle with rounded
+ corners). The coordinate system is set up in such a way that a
+ rectangle starting at the origin and having the height and width of
+ \TeX-box 0 will result in a rectangle filling exactly the logical
+ page currently being put on the physical page. The logical page is
+ inserted \emph{after} these commands have been executed.
+
+ \example Add a rectangle around the page:
+ %
+\begin{codeexample}[code only]
+\pgfpageslogicalpageoptions{1}{border code=\pgfstroke}
+\end{codeexample}
+ %
+ \item \declare{|corner width|=\meta{size}} adds black ``rounded
+ corners'' to the page. See the description of the predefined layout
+ |rounded corners| on page~\pageref{layout-rounded-corners}.
+ \end{itemize}
+\end{command}
+
+
+\subsection{Creating Logical Pages}
+
+Logical pages are created whenever \TeX\ thinks that a page is full and
+performs a |\shipout| command. This will cause |pgfpages| to store the box that
+was supposed to be shipped out internally until enough logical pages have been
+collected such that a physical shipout can occur.
+
+Normally, whenever a logical shipout occurs, that current page is stored in
+logical page number \meta{current logical page}. This counter is then
+incremented, until it is larger than \meta{last logical shipout}. You can,
+however, directly change the value of \meta{current logical page} by calling
+|\pgfpagesphysicalpageoptions|.
+
+Another way to set the contents of a logical page is to use the following
+command:
+
+\begin{command}{\pgfpagesshipoutlogicalpage\marg{number}\meta{box}}
+ This command sets to logical page \meta{number} to \meta{box}. The
+ \meta{box} should be the code of a \TeX\ box command. This command does not
+ influence the counter \meta{current logical page} and does not cause a
+ physical shipout.
+ %
+\begin{codeexample}[code only]
+\pgfpagesshipoutlogicalpage{0}\vbox{Hi!}
+\end{codeexample}
+
+ This command can be used to set the contents of logical pages that are
+ normally not filled.
+\end{command}
+
+The final way of setting a logical page is using the following command:
+
+\begin{command}{\pgfpagescurrentpagewillbelogicalpage\marg{number}}
+ When the current \TeX\ page has been typeset, it will be become the given
+ logical page \meta{number}. This command ``interrupts'' the normal order of
+ logical pages, that is, it behaves like the previous command and does not
+ update the \meta{current logical page} counter.
+ %
+\begin{codeexample}[code only]
+\pgfpagesuselayout{two screens with optional second}
+...
+Text for main page.
+\clearpage
+
+\pgfpagescurrentpagewillbelogicalpage{2}
+Text that goes to second page
+\clearpage
+
+Text for main page.
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfcalendar.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfcalendar.tex
new file mode 100644
index 0000000000..c35a3b9a5e
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfcalendar.tex
@@ -0,0 +1,488 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Date and Calendar Utility Macros}
+\label{section-calendar}
+
+This section describes the package |pgfcalendar|.
+
+\begin{package}{pgfcalendar}
+ This package can be used independently of \pgfname. It has two purposes:
+ %
+ \begin{enumerate}
+ \item It provides functions for working with dates. Most noticeably, it
+ can convert a date in ISO-standard format (like 1975-12-26) to a
+ so-called Julian day number, which is defined in Wikipedia as
+ follows: ``The Julian day or Julian day number is the (integer)
+ number of days that have elapsed since the initial epoch at noon
+ Universal Time (UT) Monday, January 1, 4713 BC in the proleptic
+ Julian calendar''. The package also provides a function for
+ converting a Julian day number to an ISO-format date.
+
+ Julian day numbers make it very easy to work with days. For
+ example, the date ten days in the future of 2008-02-20 can be
+ computed by converting this date to a Julian day number, adding 10,
+ and then converting it back. Also, the day of week of a given date
+ can be computed by taking the Julian day number modulo~7.
+ \item It provides a macro for typesetting a calendar. This macro is
+ highly configurable and flexible (for example, it can produce both
+ plain text calendars and also complicated \tikzname-based
+ calendars), but most users will not use the macro directly. It is
+ the job of a frontend to provide useful configurations for
+ typesetting calendars based on this command.
+ \end{enumerate}
+\end{package}
+
+
+\subsection{Handling Dates}
+
+\subsubsection{Conversions Between Date Types}
+
+\begin{command}{\pgfcalendardatetojulian\marg{date}\marg{counter}}
+ This macro converts a date in a format to be described in a moment to the
+ Julian day number in the Gregorian calendar. The \meta{date} should expand
+ to a string of the following form:
+ %
+ \begin{enumerate}
+ \label{calendar-date-format}
+ \item It should start with a number representing the year. Use |\year|
+ for the current year, that is, the year the file is being typeset.
+ \item The year must be followed by a hyphen.
+ \item Next should come a number representing the month. Use |\month|
+ for the current month. You can, but need not, use leading zeros.
+ For example, |02| represents February, just like |2|.
+ \item The month must also be followed by a hyphen.
+ \item Next you must either provide a day of month (again, a number and,
+ again, |\day| yields the current day of month) or the keyword
+ |last|. This keyword refers to the last day of the month, which is
+ automatically computed (and which is a bit tricky to compute,
+ especially for February).
+ \item Optionally, you can next provide a plus sign followed by positive
+ or negative number. This number of days will be added to the
+ computed date.
+ \end{enumerate}
+
+ Here are some examples:
+ %
+ \begin{itemize}
+ \item |2006-01-01| refers to the first day of 2006.
+ \item |2006-02-last| refers to February 28, 2006.
+ \item |\year-\month-\day| refers to today.
+ \item |2006-01-01+2| refers to January 3, 2006.
+ \item |\year-\month-\day+1| refers to tomorrow.
+ \item |\year-\month-\day+-1| refers to yesterday.
+ \end{itemize}
+
+ The conversion method is taken from the English Wikipedia entry on Julian
+ days.
+
+ \newcount\mycount
+ \example |\pgfcalendardatetojulian{2007-01-14}{\mycount}| sets
+ |\mycount| to
+ \pgfcalendardatetojulian{2007-01-14}{\mycount}\the\mycount.
+\end{command}
+
+\begin{command}{\pgfcalendarjuliantodate\marg{Julian day}\marg{year macro}\marg{month macro}\marg{day macro}}
+ This command converts a Julian day number to an ISO-date. The \meta{Julian
+ day} must be a number or \TeX\ counter, the \meta{year macro}, \meta{month
+ macro} and \meta{day macro} must be \TeX\ macro names. They will be set to
+ numbers representing the year, month, and day of the given Julian day in
+ the Gregorian calendar.
+
+ The \meta{year macro} will be assigned the year without leading zeros. Note
+ that this macro will produce year 0 (as opposed to other calendars, where
+ year 0 does not exist). However, if you really need calendars for before
+ the year 1, it is expected that you know what you are doing anyway.
+
+ The \meta{month macro} gets assigned a two-digit number representing the
+ month (with a leading zero, if necessary). Thus, the macro is set to |01|
+ for January.
+
+ The \meta{day macro} gets assigned a two-digit number representing the day
+ of the month (again, possibly with a leading zero).
+
+ To convert a Julian day number to an ISO-date you use code like the
+ following:
+ %
+\begin{verbatim}
+\pgfcalendarjuliantodate{2454115}{\myyear}{\mymonth}{\myday}
+\edef\isodate{\myyear-\mymonth-\myday}
+\end{verbatim}
+ %
+ The above code sets |\isodate| to
+ \pgfcalendarjuliantodate{2454115}{\myyear}{\mymonth}{\myday}%
+ \edef\isodate{\myyear-\mymonth-\myday}\texttt{\isodate}.
+\end{command}
+
+\begin{command}{\pgfcalendarjuliantoweekday\marg{Julian day}\marg{week day counter}}
+ This command converts a Julian day to a week day by computing the day
+ modulo 7. The \meta{week day counter} must be a \TeX\ counter. It will be
+ set to 0 for a Monday, to 1 for a Tuesday, and so on.
+
+ \example |\pgfcalendarjuliantoweekday{2454115}{\mycount}| sets
+ |\mycount| to
+ \pgfcalendarjuliantoweekday{2454115}{\mycount}\the\mycount\ (it was a Sunday).
+\end{command}
+
+\begin{command}{\pgfcalendareastersunday\marg{year}\marg{counter}}
+ This command computes the date of Easter Sunday as a Julian date and stores
+ it in \meta{counter}.
+
+ \example |\pgfcalendareastersunday{2019}{\mycount}| sets
+ |\mycount| to
+ \pgfcalendareastersunday{2019}{\mycount}\the\mycount, which corresponds to
+ \pgfcalendarjuliantodate{\mycount}{\myyear}{\mymonth}{\myday}%
+ \edef\isodate{\myyear-\mymonth-\myday}\texttt{\isodate}.
+\end{command}
+
+\subsubsection{Checking Dates}
+
+\begin{command}{\pgfcalendarifdate\marg{date}\marg{tests}\marg{code}\marg{else code}}
+\label{pgfcalendarifdate}
+ This command is used to execute code based on properties of \meta{date}.
+ The \meta{date} must be a date in ISO-format. For this date, the
+ \meta{tests} are checked (to be detailed later) and if one of the tests
+ succeeds, the \meta{code} is executed. If none of the tests succeeds, the
+ \meta{else code} is executed.
+
+ \example |\pgfcalendarifdate{2007-02-07}{Wednesday}{Is a Wednesday}{Is not a Wednesday}|
+ yields \texttt{\pgfcalendarifdate{2007-02-07}{Wednesday}{Is a Wednesday}{Is
+ not a Wednesday}}.
+
+ The \meta{tests} is a comma-separated list of key--value pairs. The
+ following are defined by default:
+ %
+ \begin{itemize}
+ \itemcalendaroption{all} This test is passed by all dates.
+ \itemcalendaroption{Monday} This test is passed by all dates that are
+ Mondays.
+ \itemcalendaroption{Tuesday} as above.
+ \itemcalendaroption{Wednesday} as above.
+ \itemcalendaroption{Thursday} as above.
+ \itemcalendaroption{Friday} as above.
+ \itemcalendaroption{Saturday} as above.
+ \itemcalendaroption{Sunday} as above.
+ \itemcalendaroption{workday} Passed by Mondays, Tuesdays, Wednesdays,
+ Thursdays, and Fridays. \itemcalendaroption{weekend} Passed by
+ Saturdays and Sundays.
+ \itemcalendaroption{equals}|=|\meta{reference} The \meta{reference}
+ can be in one of two forms: Either, it is a full ISO format date
+ like |2007-01-01| or the year may be missing as in |12-31|. In the
+ first case, the test is passed if \meta{date} is the same as
+ \meta{reference}. In the second case, the test is passed if the
+ month and day part of \meta{date} is the same as \meta{reference}.
+
+ For example, the test |equals=2007-01-10| will only be passed by
+ this particular date. The test |equals=05-01| will be passed by
+ every first of May on any year.
+ \itemcalendaroption{at least}|=|\meta{reference} This test works
+ similarly to the |equals| test, only it is checked whether
+ \meta{date} is equal to \meta{reference} or to any later date.
+ Again, the \meta{reference} can be a full date like |2007-01-01| or
+ a short version like |07-01|. For example, |at least=07-01| is true
+ for every day in the second half of any year.
+ \itemcalendaroption{at most}|=|\meta{reference} as above.
+ \itemcalendaroption{between}|=|\meta{start reference}| and |\meta{end
+ reference} This test checks whether the current date lies between
+ the two given reference dates. Both full and short version may be
+ given.
+
+ For example |between=2007-01-01 and 2007-02-28| is true for the
+ days in January and February of 2007.
+
+ For another example, |between=05-01 and 05-07| is true for the days
+ of the first week of May of any year.
+ \itemcalendaroption{day of month}|=|\meta{number} Passed by the day of
+ month of the \meta{date} that is \meta{number}. For example, the
+ test |day of month=1| is passed by every first of every month.
+ \itemcalendaroption{end of month}\opt{|=|\meta{number}} Passed by the
+ day of month of the \meta{date} that is \meta{number} from the end
+ of the month. For example, the test |end of month=1| is passed by
+ the last day of every month, the test |end of month=2| is passed by
+ the second last day of every month. If \meta{number} is omitted, it
+ is assumed to be |1|.
+ \itemcalendaroption{Easter}\opt{|=|\meta{number}} This test checks
+ whether the given date is Easter Sunday. The optional number can
+ be used for offsets from Easter Sunday, e.g.\ |Easter=-3| for
+ Maundy Thursday, |Easter=-2| for Good Friday, |Easter=1| for Easter
+ Monday. Since the dates of other Christian holidays are determined
+ by the date of Easter, these can be accessed as well, e.g.\
+ |Easter=39| for Feast of the Ascension, |Easter=49| for Pentecost,
+ and |Easter=50| for Whit Monday.
+ \end{itemize}
+
+ In addition to the above checks, you can also define new checks. To do so,
+ you must add a new key to the path |/pgf/calendar/| using the |\pgfkeys|
+ command. The job of the code of this new key is to possibly set the \TeX-if
+ |\ifpgfcalendarmatches| to true (if it is already true, no action should be
+ taken) to indicate that the \meta{date} passes the test setup by this new
+ key.
+
+ In order to perform the test, the key code needs to know the date that
+ should be checked. The date is available through a macro, but a whole bunch
+ of additional information about this date is also available through the
+ following macros:
+ %
+ \begin{itemize}
+ \item |\pgfcalendarifdatejulian| is the Julian day number of the
+ \meta{date} to be checked.
+ \item |\pgfcalendarifdateweekday| is the weekday of the \meta{date} to
+ be checked.
+ \item |\pgfcalendarifdateyear| is the year of the \meta{date} to be
+ checked.
+ \item |\pgfcalendarifdatemonth| is the month of the \meta{date} to be
+ checked.
+ \item |\pgfcalendarifdateday| is the day of month of the \meta{date} to
+ be checked.
+ \end{itemize}
+
+ For example, let us define a new key that checks whether the \meta{date} is
+ a Workers day (May 1st). This can be done as follows:
+ %
+\begin{verbatim}
+\pgfkeys{/pgf/calendar/workers day/.code=%
+{
+ \ifnum\pgfcalendarifdatemonth=5\relax
+ \ifnum\pgfcalendarifdateday=1\relax
+ \pgfcalendarmatchestrue
+ \fi
+ \fi
+}}
+\end{verbatim}
+ %
+\end{command}
+
+
+\subsubsection{Typesetting Dates}
+
+\begin{command}{\pgfcalendarweekdayname\marg{week day number}}
+ This command expands to a textual representation of the day of week, given
+ by the \meta{week day number}. Thus, |\pgfcalendarweekdayname{0}| expands
+ to |Monday| if the current language is English and to |Montag| if the
+ current language is German, and so on. See
+ Section~\ref{section-calendar-locale} for more details on translations.
+
+ \example |\pgfcalendarweekdayname{2}| yields
+ \texttt{\pgfcalendarweekdayname{2}}.
+\end{command}
+
+\begin{command}{\pgfcalendarweekdayshortname\marg{week day number}}
+ This command works similarly to the previous command, only an abbreviated
+ version of the week day is produced.
+
+ \example |\pgfcalendarweekdayshortname{2}| yields
+ \texttt{\pgfcalendarweekdayshortname{2}}.
+\end{command}
+
+\begin{command}{\pgfcalendarmonthname\marg{month number}}
+ This command expands to a textual representation of the month, which is
+ given by the \meta{month number}.
+
+ \example |\pgfcalendarmonthname{12}| yields
+ \texttt{\pgfcalendarmonthname{12}}.
+\end{command}
+
+\begin{command}{\pgfcalendarmonthshortname\marg{month number}}
+ As above, only an abbreviated version is produced.
+
+ \example |\pgfcalendarmonthshortname{12}| yields
+ \texttt{\pgfcalendarmonthshortname{12}}.
+\end{command}
+
+
+\subsubsection{Localization}
+\label{section-calendar-locale}
+
+All textual representations of week days or months (like ``Monday'' or
+``February'') are wrapped with |\translate| commands from the |translator|
+package (it this package is not loaded, no translation takes place).
+Furthermore, the |pgfcalendar| package will try to load the
+|translator-months-dictionary|, if the |translator| package is loaded.
+
+The net effect of all this is that all dates will be translated to the current
+language setup in the |translator| package. See the documentation of this
+package for more details.
+
+
+\subsection{Typesetting Calendars}
+
+\begin{command}{\pgfcalendar\marg{prefix}\marg{start date}\marg{end date}\marg{rendering code}}
+ This command can be used to typeset a calendar. It is a very general
+ command, the actual work has to be done by giving clever implementations of
+ \meta{rendering code}. Note that this macro need \emph{not} be called
+ inside a |{pgfpicture}| environment (even though it typically will be) and
+ you can use it to typeset calendars in normal \TeX\ or using packages other
+ than \pgfname.
+
+
+ \medskip
+ \textbf{Basic typesetting process.}
+ A calendar is typeset as follows: The \meta{start date} and \meta{end date}
+ specify a range of dates. For each date in this range the \meta{rendering
+ code} is executed with certain macros setup to yield information about the
+ \emph{current date} (the current date in the enumeration of dates of the
+ range). Typically, the \meta{rendering code} places nodes inside a picture,
+ but it can do other things as well. Note that it is also the job of the
+ \meta{rendering code} to position the calendar correctly.
+
+ The different calls of the \meta{rending code} are not surrounded by \TeX\
+ groups (though you can do so yourself, of course). This means that settings
+ can accumulate between different calls, which is often desirable and
+ useful.
+
+
+ \medskip
+ \textbf{Information about the current date.}
+ Inside the \meta{rendering code}, different macros can be access:
+ %
+ \begin{itemize}
+ \item |\pgfcalendarprefix| The \meta{prefix} parameter. This prefix is
+ recommended for nodes inside the calendar, but you have to use it
+ yourself explicitly.
+ \item |\pgfcalendarbeginiso| The \meta{start date} of range being
+ typeset in ISO format (like 2006-01-10).
+ \item |\pgfcalendarbeginjulian| Julian day number of \meta{start date}.
+ \item |\pgfcalendarendiso| The \meta{end date} of range being typeset
+ in ISO format.
+ \item |\pgfcalendarendjulian| Julian day number of \meta{end date}.
+ \item |\pgfcalendarcurrentjulian| This \TeX\ count holds the Julian day
+ number of the day currently being rendered.
+ \item |\pgfcalendarcurrentweekday| The weekday (a number with zero
+ representing Monday) of the current date.
+ \item |\pgfcalendarcurrentyear| The year of the current date.
+ \item |\pgfcalendarcurrentmonth| The month of the current date (always
+ two digits with a leading zero, if necessary).
+ \item |\pgfcalendarcurrentday| The day of month of the current date
+ (always two digits).
+ \end{itemize}
+
+
+ \medskip
+ {\bfseries The |\ifdate| command.}
+ Inside the |\pgfcalendar| the macro |\ifdate| is available locally:
+ %
+ \begin{command}{\ifdate\marg{tests}\marg{code}\marg{else code}}
+ \label{ifdate}%
+ This command has the same effect as calling |\pgfcalendarifdate|
+ for the current date.
+ \end{command}
+
+
+ \medskip
+ \textbf{Examples.}
+ In a first example, let us create a very simple calendar: It just lists the
+ dates in a certain range.
+ %
+\begin{codeexample}[vbox,ignorespaces]
+\pgfcalendar{cal}{2007-01-20}{2007-02-10}{\pgfcalendarcurrentday\ }
+\end{codeexample}
+ %
+ Let us now make this a little more interesting: Let us add a line break
+ after each Sunday.
+ %
+\begin{codeexample}[vbox,ignorespaces]
+\pgfcalendar{cal}{2007-01-20}{2007-02-10}
+{
+ \pgfcalendarcurrentday\
+ \ifdate{Sunday}{\par}{}
+}
+\end{codeexample}
+ %
+ We now want to have all Mondays to be aligned on a column. For this,
+ different approaches work. Here is one based positioning each day
+ horizontally using a skip.
+ %
+\begin{codeexample}[vbox,ignorespaces]
+\pgfcalendar{cal}{2007-01-20}{2007-02-10}
+{%
+ \leavevmode%
+ \hbox to0pt{\hskip\pgfcalendarcurrentweekday cm\pgfcalendarcurrentday\hss}%
+ \ifdate{Sunday}{\par}{}%
+}
+\end{codeexample}
+ %
+ Let us now typeset two complete months.
+ %
+\begin{codeexample}[vbox,ignorespaces]
+\pgfcalendar{cal}{2007-01-01}{2007-02-28}{%
+ \ifdate{day of month=1}{
+ \par\bigskip\hbox to7.5cm{\itshape\hss\pgfcalendarshorthand mt\hss}\par
+ }{}%
+ \leavevmode%
+ {%
+ \ifdate{weekend}{\color{black!50}}{\color{black}}%
+ \hbox to0pt{%
+ \hskip\pgfcalendarcurrentweekday cm%
+ \hbox to1cm{\hss\pgfcalendarshorthand d-}\hss%
+ }%
+ }%
+ \ifdate{Sunday}{\par}{}%
+}
+\end{codeexample}
+ %
+ For our final example, we use a |{tikzpicture}|.
+ %
+\begin{codeexample}[vbox,ignorespaces]
+\begin{tikzpicture}
+ \pgfcalendar{cal}{2007-01-20}{2007-02-10}{%
+ \ifdate{workday}
+ {\tikzset{filling/.style={fill=blue!20}}}
+ {\tikzset{filling/.style={fill=red!20}}}
+ \node (\pgfcalendarsuggestedname) at (\pgfcalendarcurrentweekday,0)
+ [anchor=base,circle,filling] {\pgfcalendarcurrentday};
+ \ifdate{Sunday}{\pgftransformyshift{-3em}}{}%
+ }
+ \draw (cal-2007-01-21) -- (cal-2007-02-03);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfcalendarshorthand\marg{kind}\marg{representation}}
+\label{pgfcalendarshorthand}
+ This command can be used inside a |\pgfcalendar|, where it will expand to a
+ representation of the current day, month, year or day of week, depending on
+ whether \meta{kind} is |d|, |m|, |y| or |w|. The \meta{representation} can
+ be one of the following: |-|, |=|, |0|, |.|, and |t|. They have the
+ following meanings:
+ %
+ \begin{itemize}
+ \item The minus sign selects the shortest numerical representation
+ possible (no leading zeros).
+ \item The equal sign also selects the shortest numerical
+ representation, but a space is added to single digit days and
+ months (thereby ensuring that they have the same length as other
+ days).
+ \item The zero digit selects a two-digit numerical representation for
+ days and months. For years it is allowed, but has no effect.
+ \item The letter |t| selects a textual representation.
+ \item The dot selects an abbreviated textual representation.
+ \end{itemize}
+ %
+ Normally, you should say |\let\%=\pgfcalendarshorthand| locally, so that
+ you can write |\%wt| instead of the much more cumbersome
+ |\pgfcalendarshorthand{w}{t}|.
+ %
+\begin{codeexample}[leave comments]
+\let\%=\pgfcalendarshorthand
+\pgfcalendar{cal}{2007-01-20}{2007-01-20}
+{ ISO form: \%y0-\%m0-\%d0, long form: \%wt, \%mt \%d-, \%y0}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfcalendarsuggestedname}
+ This macro expands to a suggested name for nodes representing days in a
+ calendar. If the \meta{prefix} is empty, it expands to the empty string,
+ otherwise it expands to the \meta{prefix} of the calendar, followed by a
+ hyphen, followed by the ISO format version of the date. Thus, when the date
+ |2007-01-01| is typeset in a calendar for the prefix |mycal|, the macro
+ expands to |mycal-2007-01-01|.
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgffor.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgffor.tex
new file mode 100644
index 0000000000..8ae0628b36
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgffor.tex
@@ -0,0 +1,397 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Repeating Things: The Foreach Statement}
+\label{section-foreach}
+
+This section describes the package |pgffor|, which is loaded automatically by
+\tikzname, but not by \pgfname:
+
+\begin{package}{pgffor}
+ This package can be used independently of \pgfname, but works particularly
+ well together with \pgfname\ and \tikzname. It defines two new commands:
+ |\foreach| and |\breakforeach|.
+\end{package}
+
+\begin{command}{\foreach| |\meta{variables}| |\opt{{\ttfamily[}\meta{options}{\ttfamily]}}| in |\meta{list} \meta{commands}}
+ The syntax of this command is a bit complicated, so let us go through it
+ step-by-step.
+
+ In the easiest case, \meta{variables} is a single \TeX-command like |\x| or
+ |\point|. (If you want to have some fun, you can also use active
+ characters. If you do not know what active characters are, you are
+ blessed.)
+
+ Still in the easiest case, \meta{options} will be omitted. The keys for
+ customizing this command will be discussed below.
+
+ Again, in the easiest case, \meta{list} is either a comma-separated list of
+ values surrounded by curly braces or it is the name of a macro that contain
+ such a list of values. Anything can be used as a value, but numbers are
+ most likely.
+
+ Finally, in the easiest case, \meta{commands} is some \TeX-text in curly
+ braces.
+
+ With all these assumptions, the |\foreach| statement will execute the
+ \meta{commands} repeatedly, once for every element of the \meta{list}. Each
+ time the \meta{commands} are executed, the \meta{variable} will be set to
+ the current value of the list item.
+ %
+\begin{codeexample}[]
+\foreach \x in {1,2,3,0} {[\x]}
+\end{codeexample}
+
+\begin{codeexample}[]
+\def\mylist{1,2,3,0}
+\foreach \x in \mylist {[\x]}
+\end{codeexample}
+
+ Note that in each execution of \meta{commands} the \meta{commands} are put
+ in a \TeX\ group. This means that \emph{local changes to counters inside
+ \meta{commands} do not persist till the next iteration}. For instance, if
+ you add 1 to a counter inside \meta{commands} locally, then in the next
+ iteration the counter will have the same value it had at the beginning of
+ the first iteration. You have to add |\global| if you wish changes to
+ persist from iteration to iteration.
+
+
+ \medskip
+ \textbf{Syntax for the commands.}
+ Let us move on to a more complicated setting. The first complication occurs
+ when the \meta{commands} are not some text in curly braces. If the
+ |\foreach| statement does not encounter an opening brace, it will instead
+ scan everything up to the next semicolon and use this as \meta{commands}.
+ This is most useful in situations like the following:
+ %
+\begin{codeexample}[]
+\tikz
+ \foreach \x in {0,1,2,3}
+ \draw (\x,0) circle (0.2cm);
+\end{codeexample}
+
+ However, the ``reading till the next semicolon'' is not the whole truth.
+ There is another rule: If a |\foreach| statement is directly followed by
+ another |\foreach| statement, this second foreach statement is collected as
+ \meta{commands}. This allows you to write the following:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \x in {0,1,2,3}
+ \foreach \y in {0,1,2,3}
+ {
+ \draw (\x,\y) circle (0.2cm);
+ \fill (\x,\y) circle (0.1cm);
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+ \medskip
+ \textbf{The dots notation.}
+ The second complication concerns the \meta{list}. If this \meta{list}
+ contains the list item ``|...|'', this list item is replaced by the
+ ``missing values''. More precisely, the following happens:
+
+ Normally, when a list item |...| is encountered, there should already have
+ been \emph{two} list items before it, which where numbers. Examples of
+ \emph{numbers} are |1|, |-10|, or |-0.24|. Let us call these numbers $x$
+ and $y$ and let $d := y-x$ be their difference. Next, there should also be
+ one number following the three dots, let us call this number~$z$.
+
+ In this situation, the part of the list reading ``$x$|,|$y$|,...,|$z$'' is
+ replaced by ``$x$, $x+d$, $x+2d$, $x+3d$, \dots, $x+md$'', where the last
+ dots are semantic dots, not syntactic dots. The value $m$ is the largest
+ number such that $x + md \le z$ if $d$ is positive or such that $x+md \ge
+ z$ if $d$ is negative.
+
+ Perhaps it is best to explain this by some examples: The following
+ \meta{list} have the same effects:
+
+ |\foreach \x in {1,2,...,6} {\x, }| yields \foreach \x in {1,2,...,6} {\x, }
+
+ |\foreach \x in {1,2,3,...,6} {\x, }| yields \foreach \x in {1,2,3,...,6} {\x, }
+
+ |\foreach \x in {1,3,...,11} {\x, }| yields \foreach \x in {1,3,...,11} {\x, }
+
+ |\foreach \x in {1,3,...,10} {\x, }| yields \foreach \x in {1,3,...,10} {\x, }
+
+ |\foreach \x in {0,0.1,...,0.5} {\x, }| yields \foreach \x in {0,0.1,...,0.5} {\x, }
+
+ |\foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, }| yields \foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, }
+
+ As can be seen, for fractional steps that are not multiples of $2^{-n}$ for
+ some small $n$, rounding errors can occur pretty easily. Thus, in the
+ second last case, |0.5| should probably be replaced by |0.501| for
+ robustness.
+
+ There is another special case for the |...| statement: If the |...| is used
+ right after the first item in the list, that is, if there is an $x$, but no
+ $y$, the difference $d$ obviously cannot be computed and is set to $1$ if
+ the number $z$ following the dots is larger than $x$ and is set to $-1$ if
+ $z$ is smaller:
+
+ |\foreach \x in {1,...,6} {\x, }| yields \foreach \x in {1,...,6} {\x, }
+
+ |\foreach \x in {9,...,3.5} {\x, }| yields \foreach \x in {9,...,3.5} {\x, }
+
+ There is a yet another special case for the |...| statement, in that it can
+ indicate an alphabetic character sequence:
+
+ |\foreach \x in {a,...,m} {\x, }| yields \foreach \x in {a,...,m} {\x, }
+
+ |\foreach \x in {Z,X,...,M} {\x, }| yields \foreach \x in {Z,X,...,M} {\x, }
+
+ A final special case for the |...| statement is contextual replacement. If
+ the |...| is used in some context, for example, |sin(...)|, this context
+ will be interpreted correctly, provided that the list items prior to the
+ |...| statement have \emph{exactly} the same pattern, except that, instead
+ of dots, they have a number or a character:
+
+ |\foreach \x in {2^1,2^...,2^7} {$\x$, }| yields \foreach \x in {2^1,2^...,2^7} {$\x$, }
+
+ |\foreach \x in {0\pi,0.5\pi,...\pi,3\pi} {$\x$, }| yields \foreach \x in {0\pi,0.5\pi,...\pi,3\pi} {$\x$, }
+
+ |\foreach \x in {A_1,..._1,H_1} {$\x$, }| yields \foreach \x in {A_1,..._1,H_1} {$\x$, }
+
+
+ \textbf{Special handling of pairs.}
+ Different list items are separated by commas. However, this causes a
+ problem when the list items contain commas themselves as pairs like |(0,1)|
+ do. In this case, you should put the items containing commas in braces as
+ in |{(0,1)}|. However, since pairs are such a natural and useful case, they
+ get a special treatment by the |\foreach| statement. When a list item
+ starts with a |(| everything up to the next |)| is made part of the item.
+ Thus, we can write things like the following:
+ %
+\begin{codeexample}[]
+\tikz
+ \foreach \position in {(0,0), (1,1), (2,0), (3,1)}
+ \draw \position rectangle +(.25,.5);
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Using the foreach-statement inside paths.}
+ \tikzname\ allows you to use |foreach| and |\foreach| (both have the same
+ effect) inside a path construction. In such a case, the \meta{commands}
+ must be path construction commands. Here are two examples:
+ %
+\begin{codeexample}[]
+\tikz
+ \draw (0,0)
+ foreach \x in {1,...,3}
+ { -- (\x,1) -- (\x,0) }
+ ;
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \draw foreach \p in {1,...,3} {(\p,1)--(\p,3) (1,\p)--(3,\p)};
+\end{codeexample}
+
+ Note that the |node| and |pic| path commands also support the |foreach|
+ statement in special ways.
+
+
+ \medskip
+ \textbf{Multiple variables.}
+ You will often wish to iterate over two variables at the same time. Since
+ you can nest |\foreach| loops, this is normally straight-forward. However,
+ you sometimes wish variables to iterate ``simultaneously''. For example, we
+ might be given a list of edges that connect two coordinates and might wish
+ to iterate over these edges. While doing so, we would like the source and
+ target of the edges to be set to two different variables.
+
+ To achieve this, you can use the following syntax: The \meta{variables} may
+ not only be a single \TeX-variable. Instead, it can also be a list of
+ variables separated by slashes (|/|). In this case the list items can also
+ be lists of values separated by slashes.
+
+ Assuming that the \meta{variables} and the list items are lists of values,
+ each time the \meta{commands} are executed, each of the variables in
+ \meta{variables} is set to one part of the list making up the current list
+ item. Here is an example to clarify this:
+
+ \example |\foreach \x / \y in {1/2,a/b} {``\x\ and \y''}| yields
+ \foreach \x / \y in {1/2,a/b} {``\x\ and \y''}.
+
+ If some entry in the \meta{list} does not have ``enough'' slashes, the last
+ entry will be repeated. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \x/\xtext in {0,...,3,2.72 / e}
+ \draw (\x,0) node{$\xtext$};
+\end{tikzpicture}
+\end{codeexample}
+
+ Here are more useful examples:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ % Define some coordinates:
+ \path[nodes={circle,fill=yellow!80!black,draw}]
+ (0,0) node(a) {a}
+ (2,0.55) node(b) {b}
+ (1,1.5) node(c) {c}
+ (2,1.75) node(d) {d};
+
+ % Draw some connections:
+ \foreach \source/\target in {a/b, b/c, c/a, c/d}
+ \draw (\source) .. controls +(.75cm,0pt) and +(-.75cm,0pt)..(\target);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ % Let's draw circles at interesting points:
+ \foreach \x / \y / \diameter in {0 / 0 / 2mm, 1 / 1 / 3mm, 2 / 0 / 1mm}
+ \draw (\x,\y) circle (\diameter);
+
+ % Same effect
+ \foreach \center/\diameter in {{(0,0)/2mm}, {(1,1)/3mm}, {(2,0)/1mm}}
+ \draw[yshift=2.5cm] \center circle (\diameter);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[line cap=round,line width=3pt]
+ \filldraw [fill=yellow!80!black] (0,0) circle (2cm);
+
+ \foreach \angle / \label in
+ {0/3, 30/2, 60/1, 90/12, 120/11, 150/10, 180/9,
+ 210/8, 240/7, 270/6, 300/5, 330/4}
+ {
+ \draw[line width=1pt] (\angle:1.8cm) -- (\angle:2cm);
+ \draw (\angle:1.4cm) node{\textsf{\label}};
+ }
+
+ \foreach \angle in {0,90,180,270}
+ \draw[line width=2pt] (\angle:1.6cm) -- (\angle:2cm);
+
+ \draw (0,0) -- (120:0.8cm); % hour
+ \draw (0,0) -- (90:1cm); % minute
+\end{tikzpicture}%
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz[shading=ball]
+ \foreach \x / \cola in {0/red,1/green,2/blue,3/yellow}
+ \foreach \y / \colb in {0/red,1/green,2/blue,3/yellow}
+ \shade[ball color=\cola!50!\colb] (\x,\y) circle (0.4cm);
+\end{codeexample}
+
+
+ \medskip
+ \textbf{Options to customize the foreach-statement.}
+
+ The keys described below can be used in the \meta{options} argument to the
+ |\foreach| command. They all have the path |/pgf/foreach/|, however, the
+ path is set automatically when \meta{options} are parsed, so it does not
+ have to be explicitly stated.
+
+ \begin{key}{/pgf/foreach/var=\meta{variable}}
+ This key provides an alternative way to specify variables:
+ |\foreach [var=\x,var=\y]| is the same as |\foreach \x/\y|. If used,
+ this key should be used before the other keys.
+ \end{key}
+
+ \begin{key}{/pgf/foreach/evaluate=\meta{variable}| |\opt{|as |\meta{macro}| using |\meta{formula}}}
+ By default, list items are not evaluated: |1+2|, yields |1+2|, not |3|.
+ This key allows a variable to be evaluated using the mathematical
+ engine. The variable must have been specified either using the |var|
+ key or in the \meta{variables} argument of the |foreach| command. By
+ default, the result of the evaluation will be stored in
+ \meta{variable}. However, the optional |as |\meta{macro} statement can
+ be used to store the result in \meta{macro}.
+ %
+\begin{codeexample}[]
+\foreach \x [evaluate=\x] in {2^0,2^...,2^8}{$\x$, }
+\end{codeexample}
+
+\begin{codeexample}[]
+\foreach \x [evaluate=\x as \xeval] in {2^0,2^...,2^8}{$\x=\xeval$, }
+\end{codeexample}
+
+ The optional |using |\meta{formula} statement means an evaluation does
+ not have to be explicitly stated for each item in \meta{list}. The
+ \meta{formula} should contain at least one reference to
+ \meta{variable}.
+ %
+\begin{codeexample}[]
+\tikz\foreach \x [evaluate=\x as \shade using \x*10] in {0,1,...,10}
+ \node [fill=red!\shade!yellow, minimum size=0.65cm] at (\x,0) {\x};
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/foreach/remember=\meta{variable}| as |\meta{macro}| |\opt{|(initially |\meta{value}|)|}}
+ This key allows the item value stored in \meta{variable} to be
+ remembered during the next iteration, stored in \meta{macro}. If a
+ variable is evaluated, the result of this evaluation is remembered. By
+ default the value of \meta{variable} is zero for the first iteration,
+ however, the optional |(initially |\meta{value}|)| statement, allows
+ the \meta{macro} to be initially defined as \meta{value}.
+ %
+\begin{codeexample}[]
+\foreach \x [remember=\x as \lastx (initially A)] in {B,...,H}{$\overrightarrow{\lastx\x}$, }
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/foreach/count=\meta{macro}| |\opt{|from |\meta{value}}}
+ This key allows \meta{macro} to hold the position in the list of the
+ current item. The optional |from |\meta{value} statement allows the
+ counting to begin from \meta{value}.
+ %
+\begin{codeexample}[]
+\tikz[x=0.75cm,y=0.75cm]
+ \foreach \x [count=\xi] in {a,...,e}
+ \foreach \y [count=\yi] in {\x,...,e}
+ \node [draw, top color=white, bottom color=blue!50, minimum size=0.666cm]
+ at (\xi,-\yi) {$\mathstrut\x\y$};
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{key}{/pgf/foreach/parse=\marg{boolean} (default false)}
+ If this key is set to true the upper bound in the loop will be
+ fed into |\pgfmathparse|. This allows to use complex expressions as
+ the upper bound. However, the expression must be safe for evaluation
+ in |\pgfmathparse|. It is known that internal \TeX\ registers can
+ cause trouble.
+ %
+\begin{codeexample}[]
+\foreach \x [parse=true] in {1,...,1.0e+1 - 1}{ \x }
+\end{codeexample}
+ %
+ \end{key}
+\end{command}
+
+\begin{command}{\breakforeach}
+ If this command is given inside a |\foreach| command, no further executions
+ of the \meta{commands} will occur. However, the current execution of the
+ \meta{commands} is continued normally, so it is probably best to use this
+ command only at the end of a |\foreach| command.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \x in {1,...,4}
+ \foreach \y in {1,...,4}
+ {
+ \fill[red!50] (\x,\y) ellipse (3pt and 6pt);
+
+ \ifnum \x<\y
+ \breakforeach
+ \fi
+ }
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeys.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeys.tex
new file mode 100644
index 0000000000..392e229814
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeys.tex
@@ -0,0 +1,1692 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Key Management}
+\label{section-keys}
+
+This section describes the package |pgfkeys|. It is loaded automatically by
+both \pgfname\ and \tikzname.
+
+\begin{package}{pgfkeys}
+ This package can be used independently of \pgfname. Note that no
+ other package of \pgfname\ needs to be loaded (so neither the
+ emulation layer nor the system layer is needed). The Con\TeX t
+ abbreviation is |pgfkey| \todosp{pgfkey --> pgfkeys?} if |pgfmod| is not loaded.
+\end{package}
+
+
+\subsection{Introduction}
+
+\subsubsection{Comparison to Other Packages}
+
+The |pgfkeys| package defines a key--value management system that is in some
+sense similar to the more light-weight |keyval| system and the improved
+|xkeyval| system. However, |pgfkeys| uses a slightly different philosophy than
+these systems and it will coexist peacefully with both of them.
+
+The main differences between |pgfkeys| and |xkeyval| are the following:
+%
+\begin{itemize}
+ \item |pgfkeys| organizes keys in a tree, while |keyval| and |xkeyval|
+ use families. In |pgfkeys| the families correspond to the root
+ entries of the key tree.
+ \item |pgfkeys| has no save-stack impact (you will have to read the \TeX
+ Book very carefully to appreciate this).
+ \item |pgfkeys| is slightly slower than |keyval|, but not much.
+ \item |pgfkeys| supports styles. This means that keys can just stand for
+ other keys (which can stand for other keys in turn or which can also
+ just execute some code). \tikzname\ uses this mechanism heavily.
+ \item |pgfkeys| supports multi-argument key code. This can, however, be
+ emulated in |keyval|.
+ \item |pgfkeys| supports handlers. These are call-backs that are called
+ when a key is not known. They are very flexible, in fact even
+ defining keys in different ways is handled by, well, handlers.
+\end{itemize}
+
+
+\subsubsection{Quick Guide to Using the Key Mechanism}
+
+The following quick guide to \pgfname's key mechanism only treats the most
+commonly used features. For an in-depth discussion of what is going on, please
+consult the remainder of this section.
+
+Keys are organized in a large tree that is reminiscent of the Unix file tree. A
+typical key might be, say, |/tikz/coordinate system/x| or just |/x|. Again as
+in Unix, when you specify keys you can provide the complete path of the key,
+but you usually just provide the name of the key (corresponding to the file
+name without any path) and the path is added automatically.
+
+Typically (but not necessarily) some code is associated with a key. To execute
+this code, you use the |\pgfkeys| command. This command takes a list of
+so-called key--value pairs. Each pair is of the form \meta{key}|=|\meta{value}.
+For each pair the |\pgfkeys| command will execute the code stored for the
+\meta{key} with its parameter set to \meta{value}.
+
+Here is a typical example of how the |\pgfkeys| command is used:
+%
+\begin{codeexample}[code only]
+\pgfkeys{/my key=hallo,/your keys/main key=something\strange,
+ key name without path=something else}
+\end{codeexample}
+
+Now, to set the code that is stored in a key you do not need to learn a new
+command. Rather, the |\pgfkeys| command can also be used to set the code of a
+key. This is done using so-called \emph{handlers}. They look like keys whose
+names look like ``hidden files in Unix'' since they start with a dot. The
+handler for setting the code of a key is appropriately called |/.code| and it
+is used as follows:
+%
+\begin{codeexample}[]
+\pgfkeys{/my key/.code=The value is '#1'.}
+\pgfkeys{/my key=hi!}
+\end{codeexample}
+%
+As you can see, in the first line we defined the code for the key |/my key|. In
+the second line we executed this code with the parameter set to |hi!|.
+
+There are numerous handlers for defining a key. For instance, we can also
+define a key whose value actually consists of more than one parameter.
+%
+\begin{codeexample}[]
+\pgfkeys{/my key/.code 2 args=The values are '#1' and '#2'.}
+\pgfkeys{/my key={a1}{a2}}
+\end{codeexample}
+
+We often want to have keys where the code is called with some default value if
+the user does not provide a value. Not surprisingly, this is also done using a
+handler, this time called |/.default|.
+%
+\begin{codeexample}[]
+\pgfkeys{/my key/.code=(#1)}
+\pgfkeys{/my key/.default=hello}
+\pgfkeys{/my key=hallo,/my key}
+\end{codeexample}
+
+The other way round, it is also possible to specify that a value \emph{must} be
+specified, using a handler called |/.value required|. Finally, you can also
+require that no value \emph{may} be specified using |/.value forbidden|.
+
+All keys for a package like, say, \tikzname\ start with the path |/tikz|. We
+obviously do not like to write this path down every time we use a key (so we do
+not have to write things like |\draw[/tikz/line width=1cm]|). What we need is
+to somehow ``change the default path to a specific location''. This is done
+using the handler |/.cd| (for ``change directory''). Once this handler has been
+used on a key, all subsequent keys {\itshape in the current call of |\pgfkeys|
+only} are automatically prefixed with this path, if necessary.
+
+Here is an example:
+%
+\begin{codeexample}[code only]
+\pgfkeys{/tikz/.cd,line width=1cm,line cap=round}
+\end{codeexample}
+%
+This makes it easy to define commands like |\tikzset|, which could be defined
+as follows (the actual definition is a bit faster, but the effect is the same):
+%
+\begin{codeexample}[code only]
+\def\tikzset#1{\pgfkeys{/tikz/.cd,#1}}
+\end{codeexample}
+
+When a key is handled, instead of executing some code, the key can also cause
+further keys to be executed. Such keys will be called \emph{styles}. A style
+is, in essence, just a key list that should be executed whenever the style is
+executed. Here is an example:
+%
+\begin{codeexample}[]
+\pgfkeys{/a/.code=(a:#1)}
+\pgfkeys{/b/.code=(b:#1)}
+\pgfkeys{/my style/.style={/a=foo,/b=bar,/a=#1}}
+\pgfkeys{/my style=wow}
+\end{codeexample}
+%
+As the above example shows, styles can also be parameterized, just like the
+normal code keys.
+
+As a typical use of styles, suppose we wish to set up the key |/tikz| so that
+it will change the default path to |/tikz|. This can be achieved as follows:
+%
+\begin{codeexample}[code only]
+\pgfkeys{/tikz/.style=/tikz/.cd}
+\pgfkeys{tikz,line width=1cm,draw=red}
+\end{codeexample}
+
+Note that when |\pgfkeys| is executed, the default path is set to~|/|. This
+means that the first |tikz| will be completed to |/tikz|. Then |/tikz| is a
+style and, thus, replaced by |/tikz/.cd|, which changes the default path to
+|/tikz|. Thus, the |line width| is correctly prefixed with |/tikz|.
+
+
+\subsection{The Key Tree}
+
+The |pgfkeys| package organizes keys in a so-called \emph{key tree}. This tree
+will be familiar to anyone who has used a Unix operating system: A key is
+addressed by a path, which consists of different parts separated by slashes. A
+typical key might be |/tikz/line width| or just |/tikz| or something more
+complicated like |/tikz/cs/x/.store in|.
+
+Let us fix some further terminology: Given a key like |/a/b/c|, we call the
+part leading up the last slash (|/a/b|) the \emph{path} of the key. We call
+everything after the last slash (|c|) the \emph{name} of the key (in a file
+system this would be the file name).
+
+We do not always wish to specify keys completely. Instead, we usually specify
+only part of a key (typically only the name) and the \emph{default path} is
+then added to the key at the front. So, when the default path is |/tikz| and
+you refer to the (partial) key |line width|, the actual key that is used is
+|/tikz/line width|. There is a simple rule for deciding whether a key is a
+partial key or a full key: If it starts with a slash, then it is a full key and
+it is not modified; if it does not start with a slash, then the default path is
+automatically prefixed.
+
+Note that the default path is not the same as a search path. In particular, the
+default path is just a single path. When a partial key is given, only this
+single default path is prefixed; |pgfkeys| does not try to look up the key in
+different parts of a search path. It is, however, possible to emulate search
+paths, but a much more complicated mechanism must be used.
+
+When you set keys (to be explained in a moment), you can freely mix partial and
+full keys and you can change the default path. This makes it possible to
+temporarily use keys from another part of the key tree (this turns out to be a
+very useful feature).
+
+Each key (may) store some \emph{tokens} and there exist commands, described
+below, for setting, getting, and changing the tokens stored in a key. However,
+you will only very seldom use these commands directly. Rather, the standard way
+of using keys is the |\pgfkeys| command or some command that uses it internally
+like, say, |\tikzset|. So, you may wish to skip the following commands and
+continue with the next subsection.
+
+\begin{command}{\pgfkeyssetvalue\marg{full key}\marg{token text}}
+ Stores the \meta{token text} in the \meta{full key}. The \meta{full key}
+ may not be a partial key, so no default-path-adding is done. The
+ \meta{token text} can be arbitrary tokens and may even contain things like
+ |#| or unbalanced \TeX-ifs.
+ %
+\begin{codeexample}[]
+\pgfkeyssetvalue{/my family/my key}{Hello, world!}
+\pgfkeysvalueof{/my family/my key}
+\end{codeexample}
+
+ The setting of a key is always local to the current \TeX\ group.
+\end{command}
+
+\begin{command}{\pgfkeyslet\marg{full key}\marg{macro}}
+ Performs a |\let| statement so the \meta{full key} points to the contents
+ of \meta{macro}.
+ %
+\begin{codeexample}[]
+\def\helloworld{Hello, world!}
+\pgfkeyslet{/my family/my key}{\helloworld}
+\pgfkeysvalueof{/my family/my key}
+\end{codeexample}
+ %
+ You should never let a key be equal to |\relax|. Such a key may or may not
+ be indistinguishable from an undefined key.
+\end{command}
+
+\begin{command}{\pgfkeysgetvalue\marg{full key}\marg{macro}}
+ Retrieves the tokens stored in the \meta{full key} and lets \meta{macro} be
+ equal to these tokens. If the key has not been set, the \meta{macro} will
+ be equal to |\relax|.
+ %
+\begin{codeexample}[]
+\pgfkeyssetvalue{/my family/my key}{Hello, world!}
+\pgfkeysgetvalue{/my family/my key}{\helloworld}
+\helloworld
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfkeysvalueof\marg{full key}}
+ Inserts the value stored in \meta{full key} at the current position into
+ the text.
+ %
+\begin{codeexample}[]
+\pgfkeyssetvalue{/my family/my key}{Hello, world!}
+\pgfkeysvalueof{/my family/my key}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfkeysifdefined\marg{full key}\marg{if}\marg{else}}
+ Checks whether this key was previously set using either |\pgfkeyssetvalue|
+ or |\pgfkeyslet|. If so, the code in \meta{if} is executed, otherwise the
+ code in \meta{else}.
+
+ This command will use e\TeX's |\ifcsname| command, if available, for
+ efficiency. This means, however, that it may behave differently for \TeX\
+ and for e\TeX\ when you set keys to |\relax|. For this reason you should
+ not do so.
+ %
+\begin{codeexample}[]
+\pgfkeyssetvalue{/my family/my key}{Hello, world!}
+\pgfkeysifdefined{/my family/my key}{yes}{no}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Setting Keys}
+
+Settings keys is done using a powerful command called |\pgfkeys|. This command
+takes a list of so-called \emph{key--value pairs}. These are pairs of the form
+\meta{key}|=|\meta{value}. The principle idea is the following: For each pair
+in the list, some \emph{action} is taken. This action can be one of the
+following:
+%
+\begin{enumerate}
+ \item A command is executed whose argument(s) are \meta{value}. This
+ command is stored in a special subkey of \meta{key}.
+ \item The \meta{value} is stored in the \meta{key} itself.
+ \item If the key's name (the part after the last slash) is a known
+ \emph{handler}, then this handler will take care of the key.
+ \item If the key is totally unknown, one of several possible \emph{unknown
+ key handlers} is called.
+\end{enumerate}
+
+Additionally, if the \meta{value} is missing, a default value may or may not be
+substituted. Before we plunge into all the details, let us have a quick look at
+the command itself.
+
+\begin{command}{\pgfkeys\marg{key list}}
+ The \meta{key list} should be a list of key--value pairs, separated by
+ commas. A key--value pair can have the following two forms:
+ \meta{key}|=|\meta{value} or just \meta{key}. Any spaces around the
+ \meta{key} or around the \meta{value} are removed. It is permissible to
+ surround both the \meta{key} or the \meta{value} in curly braces, which are
+ also removed. Especially putting the \meta{value} in curly braces needs to
+ be done quite often, namely whenever the \meta{value} contains an
+ equal-sign or a comma.
+
+ The key--value pairs in the list are handled in the order they appear. How
+ this handling is done, exactly, is described in the rest of this section.
+
+ If a \meta{key} is a partial key, the current value of the default path is
+ prefixed to the \meta{key} and this ``upgraded'' key is then used. The
+ default path is just the root path |/| when the first key is handled, but
+ it may change later on. At the end of the command, the default path is
+ reset to the value it had before this command was executed.
+
+ Calls of this command may be nested. Thus, it is permissible to call
+ |\pgfkeys| inside the code that is executed for a key. Since the default
+ path is restored after a call of |\pgfkeys|, the default path will not
+ change when you call |\pgfkeys| while executing code for a key (which is
+ exactly what you want).
+\end{command}
+
+\begin{command}{\pgfqkeys\marg{default path}\marg{key list}}
+ This command has the same effect as |\pgfkeys{|\meta{default
+ path}|/.cd,|\meta{key list}|}|, it is only marginally quicker. This command
+ should not be used in user code, but rather in commands like |\tikzset| or
+ |\pgfset| that get called very often.
+\end{command}
+
+\begin{command}{\pgfkeysalso\marg{key list}}
+ This command has exactly the same effect as |\pgfkeys|, only the default
+ path is not modified before or after the keys are being set. This command
+ is mainly intended to be called by the code that is being processed for a
+ key.
+\end{command}
+
+\begin{command}{\pgfqkeysalso\marg{default path}\marg{key list}}
+ This command has the same effect as |\pgfkeysalso{|\meta{default
+ path}|/.cd,|\meta{key list}|}|, it is only quicker. Changing the default
+ path inside a |\pgfkeyalso| is dangerous, so use with care. A rather safe
+ place to call this command is at the beginning of a \TeX\ group.
+\end{command}
+
+
+\subsubsection{First Char Syntax Detection}
+\label{sec:pgf:first:char:syntax}
+
+Usually, keys are of the form \meta{key}|=|\meta{value} and how such keys are
+handled is discussed in the rest of this section. However, it is also possible
+to setup a different syntax for certain parts of the input to |\pgfkeys|. Since
+this is a rather advanced option, most readers may wish to skip the following
+discussion upon first reading; it is discussed here because this special syntax
+detection is the very first thing that is done when a key is processed, before
+any of the following operations are performed.
+
+The |\pgfkeys| command and its variants decompose their input into a list of
+\meta{string}s that are separated by commas. By default, each such
+\meta{string} must either have the form \meta{key}|=|\meta{value} or of the
+form \meta{key} with the value-part missing. However, you might wish to
+interpret some of these strings differently. For instance, when a \meta{string}
+has the form |"|\meta{text}|"|, you might wish the \meta{string} to be
+interpreted as if one had written |label text={|\meta{text}|}|. Then, people
+could write
+%
+\begin{codeexample}[code only]
+\myset{red, "main valve", thick}
+\end{codeexample}
+%
+instead of the more cumbersome
+%
+\begin{codeexample}[code only]
+\myset{red, label text=main valve, thick}
+\end{codeexample}
+%
+An example where such a syntax reinterpretation is done is the |quotes|
+library, which allows you to write things like
+%
+\begin{codeexample}[]
+\tikz \graph { a ->["1" red] b ->["0"] c };
+\end{codeexample}
+%
+\noindent instead of the somewhat longer
+%
+\begin{codeexample}[]
+\tikz \graph { a ->[edge node={node[red,auto]{1}}] b ->[edge label=0] c };
+\end{codeexample}
+
+In order to detect whether a \meta{string} has a special syntax, you can
+request that the \emph{first character} of \meta{string} is analysed by the key
+parser. If this first character matches a character that has been flagged as a
+special character, the \meta{string} is not interpreted as a usual key--value
+pair. Instead, \meta{string} is passed as a parameter to a special macro that
+should take care of the \meta{string}. After this macro has finished, the
+parsing continues with the \meta{next string} in the list.
+
+In order to setup a special syntax handling for \meta{strings} that begin with
+a certain character, two things need to be done:
+%
+\begin{enumerate}
+ \item First, the whole first char syntax detection must be ``switched on'',
+ since, by default, it is turned off for efficiency reasons (the
+ overhead is rather small, however). This is done by setting the
+ following key:
+ %
+ \begin{key}{/handlers/first char syntax=\opt{\meta{true or false}} (default true, initially false)}
+ \end{key}
+ \item Second, in order to handle strings starting with a certain
+ \meta{character} in a special way, you need to store a macro in the
+ following key:
+ %
+ \begin{key}{/handlers/first char syntax/\meta{meaning of character}}
+ The \meta{meaning of character} should be the text that \TeX's
+ command |\meaning| returns for a macro that has been |\let| to the
+ \meta{character}. For instance, when strings starting with |"|
+ should be treated in a special way, the \meta{meaning of character}
+ would be the string |the character "| since this is what \TeX\
+ writes when you say
+ %
+\begin{codeexample}[]
+\let\mycharacter="
+\meaning\mycharacter
+\end{codeexample}
+ %
+ Now, the key |/handlers/first char syntax/|\meta{meaning of
+ character} should be setup (using |\pgfkeyssetvalue| or using the
+ |.initial| handler) to store a \meta{macro name}.
+
+ If this is the case and if \meta{string} starts with the
+ \meta{character} (blanks at the beginning of \meta{string} are
+ deleted prior to this test), then \meta{macro name} is called with
+ \meta{string} as its argument.
+ \end{key}
+\end{enumerate}
+
+Let us now have a look at an example. We install two handlers, one for strings
+starting with |"| and one for strings starting with |<|.
+%
+\begin{codeexample}[]
+\pgfkeys{
+ /handlers/first char syntax=true,
+ /handlers/first char syntax/the character "/.initial=\myquotemacro,
+ /handlers/first char syntax/the character </.initial=\mypointedmacro,
+}
+
+\def\myquotemacro#1{Quoted: #1. }
+\def\mypointedmacro#1{Pointed: #1. }
+
+\ttfamily \pgfkeys{"foo", <bar>}
+\end{codeexample}
+
+Naturally, in the above examples, the two handling macros did not do something
+particularly exciting. In the next example, we setup a more elaborate macro
+that mimics a small part the behaviour of the |quotes| library, only for single
+quotes:
+%
+\begin{codeexample}[]
+\pgfkeys{
+ /handlers/first char syntax=true,
+ /handlers/first char syntax/the character '/.initial=\mysinglequotemacro
+}
+
+\def\mysinglequotemacro#1{\pgfkeysalso{label={#1}}}
+
+\tikz \node [circle, 'foo', draw] {bar};
+\end{codeexample}
+
+Note that in the above example, the macro |\mysinglequotemacro| gets passed the
+complete string, including the single quotes. It is the job of the macro to get
+rid of them, if this is necessary.
+
+The first char syntax detection allows you to perform rather powerful
+transformations on the syntax of keys -- provided you can ``pin down'' the
+syntax on the first character. In the following example, you can write
+expressions in parentheses in front of a key--value pair and the pair will only
+be executed when the expression evaluates to true:
+%
+\begin{codeexample}[]
+\pgfkeys{
+ /handlers/first char syntax=true,
+ /handlers/first char syntax/the character (/.initial=\myparamacro
+}
+
+\def\myparamacro#1{\myparaparser#1\someendtext}
+\def\myparaparser(#1)#2\someendtext{
+ \pgfmathparse{#1}
+ \ifx\pgfmathresult\onetext
+ \pgfkeysalso{#2}
+ \fi
+}
+\def\onetext{1}
+
+\foreach \i in {1,...,4}
+ \tikz \node [draw, thick, rectangle, (pi>\i) circle, (pi>\i*2) draw=red] {x};
+\end{codeexample}
+
+
+\subsubsection{Default Arguments}
+
+The arguments of the |\pgfkeys| command can either be of the form
+\meta{key}|=|\meta{value} or of the form \meta{key} with the value-part
+missing. In the second case, the |\pgfkeys| will try to provide a \emph{default
+value} for the \meta{value}. If such a default value is defined, it will be
+used as if you had written \meta{key}|=|\meta{default value}.
+
+In the following, the details of how default values are determined is
+described; however, you should normally use the handlers |/.default| and
+|/.value required| as described in Section~\ref{section-default-handlers} and
+you may wish to skip the following details.
+
+When |\pgfkeys| encounters a \meta{key} without an equal-sign, the following
+happens:
+%
+\begin{enumerate}
+ \item The input is replaced by \meta{key}|=\pgfkeysnovalue|. In particular,
+ the commands |\pgfkeys{my key}| and
+ % FIXME: there is a bug in the pretty printer ... fix it and get rid of '||' here:
+ |\pgfkeys{my key=||\pgfkeysnovalue}| have exactly the same effect and
+ you can ``simulate'' a missing value by providing the value
+ |\pgfkeysnovalue|, which is sometimes useful.
+ \item If the \meta{value} is |\pgfkeysnovalue|, then it is checked whether
+ the subkey \meta{key}|/.@def| exists. For instance, if you write
+ |\pgfkeys{/my key}|, then it is checked whether the key |/my key/.@def|
+ exists.
+ \item If the key \meta{key}|/.@def| exists, then the tokens stored in this
+ key are used as \meta{value}.
+ \item If the key does not exist, then |\pgfkeysnovalue| is used as the
+ \meta{value}.
+ \item At the end, if the \meta{value} is now equal to
+ |\pgfkeysvaluerequired|, then the code (or something fairly equivalent)
+ |\pgfkeys{/errors/value required=|\meta{key}|{}}| is executed. Thus, by
+ changing this key you can change the error message that is printed or
+ you can handle the missing value in some other way.
+\end{enumerate}
+
+
+\subsubsection{Keys That Execute Commands}
+\label{section-key-code}
+
+After the transformation process described in the previous subsection, we
+arrive at a key of the form \meta{key}=\meta{value}, where \meta{key} is a full
+key. Different things can now happen, but always the macro |\pgfkeyscurrentkey|
+will have been set up to expand to the text of the \meta{key} that is currently
+being processed.
+
+The first things that is tested is whether the key \meta{key}|/.@cmd| exists.
+If this is the case, then it is assumed that this key stores the code of a
+macro and this macro is executed. The argument of this macro is \meta{value}
+directly followed by |\pgfeov|, which stands for ``end of value''. The
+\meta{value} is not surrounded by braces. After this code has been executed,
+|\pgfkeys| continues with the next key in the \meta{key list}.
+
+It may seem quite peculiar that the macro stored in the key \meta{key}|/.@cmd|
+is not simply executed with the argument |{|\meta{value}|}|. However, the
+approach taken in the |pgfkeys| packages allows for more flexibility. For
+instance, assume that you have a key that expects a \meta{value} of the form
+``\meta{text}|+|\meta{more text}'' and wishes to store \meta{text} and
+\meta{more text} in two different macros. This can be achieved as follows:
+%
+\begin{codeexample}[]
+\def\mystore#1+#2\pgfeov{\def\a{#1}\def\b{#2}}
+\pgfkeyslet{/my key/.@cmd}{\mystore}
+\pgfkeys{/my key=hello+world}
+
+|\a| is \a, |\b| is \b.
+\end{codeexample}
+
+Naturally, defining the code to be stored in a key in the above manner is too
+awkward. The following commands simplify things a bit, but the usual manner of
+setting up code for a key is to use one of the handlers described in
+Section~\ref{section-code-handlers}.
+
+\begin{command}{\pgfkeysdef\marg{key}\marg{code}}
+ This command temporarily defines a \TeX-macro with the argument list
+ |#1\pgfeov| and then lets \meta{key}|/.@cmd| be equal to this macro. The
+ net effect of all this is that you have then set up code for the key
+ \meta{key} so that when you write |\pgfkeys{|\meta{key}|=|\meta{value}|}|,
+ then the \meta{code} is executed with all occurrences of |#1| in
+ \meta{code} being replaced by \meta{value}. (This behaviour is quite
+ similar to the |\define@key| command of |keyval| and |xkeyval|).
+ %
+\begin{codeexample}[]
+\pgfkeysdef{/my key}{#1, #1.}
+\pgfkeys{/my key=hello}
+\end{codeexample}
+\end{command}
+
+\begin{command}{\pgfkeysedef\marg{key}\marg{code}}
+ This command works like |\pgfkeysdef|, but it uses |\edef| rather than
+ |\def| when defining the key macro. If you do not know the difference
+ between the two, then you will not need this command; and if you know the
+ difference, then you will know when you need this command.
+\end{command}
+
+\begin{command}{\pgfkeysdefnargs\marg{key}\marg{argument count}\marg{code}}
+ This command works like |\pgfkeysdef|, but it allows you to provide an
+ arbitrary \meta{argument count} between $0$ and $9$ (inclusive).
+ %
+\begin{codeexample}[]
+\pgfkeysdefnargs{/my key}{2}{\def\a{#1}\def\b{#2}}
+\pgfkeys{/my key=
+ {hello}
+ {world}}
+
+|\a| is `\a', |\b| is `\b'.
+\end{codeexample}
+ %
+ The resulting key will expect exactly \marg{argument count} arguments.
+\end{command}
+%
+\begin{command}{\pgfkeysedefnargs\marg{key}\marg{argument count}\marg{code}}
+ The |\edef| version of |\pgfkeysdefnargs|.
+\end{command}
+
+\begin{command}{\pgfkeysdefargs\marg{key}\marg{argument pattern}\marg{code}}
+ This command works like |\pgfkeysdefnargs|, but it allows you to provide an
+ arbitrary \meta{argument pattern} rather than just a number of arguments.
+ %
+\begin{codeexample}[]
+\pgfkeysdefargs{/my key}{#1+#2}{\def\a{#1}\def\b{#2}}
+\pgfkeys{/my key=hello+world}
+
+|\a| is \a, |\b| is \b.
+\end{codeexample}
+ %
+ Note that |\pgfkeysdefnargs| is \emph{better} when it comes to simple
+ argument \emph{counts}\footnote{When the resulting keys are used, the
+ \texttt{defnargs} variant allows spaces between arguments whereas the
+ \texttt{defargs} variant does not; it considers the spaces as part of the
+ argument.}.
+\end{command}
+
+\begin{command}{\pgfkeysedefargs\marg{key}\marg{argument pattern}\marg{code}}
+ The |\edef| version of |\pgfkeysdefargs|.
+\end{command}
+
+
+\subsubsection{Keys That Store Values}
+
+Let us continue with what happens when |\pgfkeys| processes the current key and
+the subkey \meta{key}|/.@cmd| is not defined. Then it is checked whether the
+\meta{key} itself exists (has been previously assigned a value using, for
+instance, |\pgfkeyssetvalue|). In this case, the tokens stored in \meta{key}
+are replaced by \meta{value} and |\pgfkeys| proceeds with the next key in the
+\meta{key list}.
+
+
+\subsubsection{Keys That Are Handled}
+\label{section-key-handlers}
+
+If neither the \meta{key} itself nor the subkey \meta{key}|/.@cmd| are defined,
+then the \meta{key} cannot be processed ``all by itself''. Rather, a
+\meta{handler} is needed for this key. Most of the power of |pgfkeys| comes
+from the proper use of such handlers.
+
+Recall that the \meta{key} is always a full key (if it was not originally, it
+has already been upgraded at this point to a full key). It decomposed into two
+parts:
+
+\begin{enumerate}
+ \item The \meta{path} of \meta{key} (everything before the last slash) is
+ stored in the macro |\pgfkeyscurrentpath|.
+ \item The \meta{name} of \meta{key} (everything after the last slash) is
+ stored in the macro |\pgfkeyscurrentname|.
+
+ It is recommended (but not necessary) that the name of a handler starts
+ with a dot (but not with |.@|), so that they are easy to detect for the
+ reader.
+\end{enumerate}
+
+(For efficiency reasons, these two macros are only set up at this point; so
+when code is executed for a key in the ``usual'' manner then these macros are
+not set up.)
+
+The |\pgfkeys| command now checks whether the key
+|/handlers/|\meta{name}|/.@cmd| exists. If so, it should store a command and
+this command is executed exactly in the same manner as described in
+Section~\ref{section-key-code}. Thus, this code gets the \meta{value} that was
+originally intended for \meta{key} as its argument, followed by |\pgfeov|. It
+is the job of the handlers to do something useful with the \meta{value}.
+
+For an example, let us write a handler that will output the value stored in a
+key to the log file. We call this handler |/.print to log|. The idea is that
+when someone tries to use the key |/my key/.print to log|, then this key will
+not be defined and the handler gets executed. The handler will then have access
+to the path-part of the key, which is |/my key|, via the macro
+|\pgfkeyscurrentpath|. It can then lookup which value is stored in this key and
+print it.
+%
+\begin{codeexample}[code only]
+\pgfkeysdef{/handlers/.print to log}
+{%
+ \pgfkeysgetvalue{\pgfkeyscurrentpath}{\temp}
+ \writetolog{\temp}
+}
+\pgfkeyssetvalue{/my key}{Hi!}
+...
+\pgfkeys{/my key/.print to log}
+\end{codeexample}
+%
+The above code will print |Hi!| in the log, provided the macro |\writetolog| is
+set up appropriately.
+
+For a more interesting handler, let us program a handler that will set up a key
+so that when the key is used, some code is executed. This code is given as
+\meta{value}. All the handler must do is to call |\pgfkeysdef| for the path of
+the key (which misses the handler's name) and assign the parameter value to it.
+%
+\begin{codeexample}[]
+\pgfkeysdef{/handlers/.my code}{\pgfkeysdef{\pgfkeyscurrentpath}{#1}}
+\pgfkeys{/my key/.my code=(#1)}
+\pgfkeys{/my key=hallo}
+\end{codeexample}
+
+There are some parameters for handled keys which prove to be useful in some
+(possibly rare) special cases:
+%
+\begin{key}{/handler config=\mchoice{all,only existing,full or existing} (initially all)}
+ Changes the initial configuration how key handlers will be used.
+
+ This configuration is for advanced users and rarely necessary.
+ %
+ \begin{description}
+ \item[\texttt{all}] The preconfigured setting |all| works as described
+ above and imposes no restriction on the key setting process.
+ \item[\texttt{only existing}] The value |only existing| modifies the
+ algorithm for handled keys as follows: a handler \meta{key
+ name}|/.|\meta{handler} will be executed only if \meta{key name} is
+ either a key which stores its value directly or a command key for
+ which |/.@cmd| exists. If \meta{key name} does \emph{not} exist
+ already, the complete string \meta{key name}|/.|\meta{handler} is
+ considered to be an unknown key and the procedure described in the
+ next section applies (for the path of \meta{key name}).
+ %
+\begin{codeexample}[]
+% Define a test key and error handlers:
+\pgfkeys{/the/key/.code={Initial definition. }}
+\pgfkeys{/handlers/.unknown/.code={Unknown key `\pgfkeyscurrentkey'. }}
+
+% calling the test key yields 'Initial definition. ':
+\pgfkeys{/the/key}
+
+% Change configuration:
+\pgfkeys{/handler config=only existing}
+
+% allowed: key *re*-definition:
+\pgfkeys{/the/key/.code={Re-Definition. }}
+% calling the key yields 'Re-Definition. ':
+\pgfkeys{/the/key}
+
+% not allowed: definition of new keys:
+% this checks for '/the/other key/.unknown'
+% and '/handlers/.unknown'
+% and yields finally
+% 'Unknown key `/the/other key/.code`'
+\pgfkeys{/the/other key/.code={New definition. }}
+\end{codeexample}
+ %
+ It is necessary to exclude some key handlers from this procedure.
+ Altogether, the detailed procedure is as follows:
+ %
+ \begin{enumerate}
+ \item If a handled key like |/a path/a key/.a handler=value| is
+ encountered, it is checked whether the handler should be
+ invoked. This is the case if
+ %
+ \begin{itemize}
+ \item An exception from |only existing| for this key
+ exists (see below),
+ \item The key |/a path/a key| exists already -- either
+ directly as storage key or with the |.@cmd| suffix.
+ \end{itemize}
+ %
+ \item If the check passes, everything works as before.
+ \item If the check fails, the complete key will be considered
+ to be unknown. In that case, the handling of unknown keys
+ as described in the next section applies. There, the
+ current key path will be set to |/a path| and the current
+ key's name to |key/.a handler|.
+ \end{enumerate}
+
+ A consequence of this configuration is to provide more meaningful
+ processing of handled keys if a search path for keys is in effect,
+ see section~\ref{sec:pgf:unknown:keys} for an example.
+ \item[\texttt{full or existing}] Finally, the choice |full or existing|
+ is a variant of |only existing|: it works in the same way for keys
+ which do not have a full key path. For example, the style
+
+ |\pgfkeys{/my path/.cd,key/.style={|$\dotsc$|}}|
+
+ can only be redefined: it doesn't have a full path, so the
+ |only existing| mechanism applies. But the style
+
+ |\pgfkeys{/my path/key/.style={|$\dotsc$|}}|
+
+ will still work. This allows users to override the |only existing|
+ feature if they know what they're doing (and provide full key
+ paths).
+ \end{description}
+\end{key}
+
+\begin{key}{/handler config/only existing/add exception=\marg{key handler name}}
+ Allows to add exceptions to the |/handler config=only existing| feature.
+ Initially exceptions for the key handlers |/.cd|, |/.try|, |/.retry|,
+ |/.lastretry| and |/.unknown| are defined. The value \marg{key handler
+ name} should be the name of a key handler.
+\end{key}
+
+
+\subsubsection{Keys That Are Unknown}
+\label{sec:pgf:unknown:keys}
+
+For some keys, neither the key, nor its |.@cmd| subkey nor a handler is
+defined. In this case, it is checked whether the key \meta{current
+path}|/.unknown/.@cmd| exists. Thus, when you try to use the key
+|/tikz/strange|, then it is checked whether |/tikz/.unknown/.@cmd| exists. If
+this key exists (which it does), it is executed. This code can then try to make
+sense of the key. For instance, the handler for \tikzname\ will try to
+interpret the key's name as a color or as an arrow specification or as a
+\pgfname\ option.
+
+You can set up unknown key handlers for your own keys by simply setting the
+code of the key \meta{my path prefix}|/.unknown|. This also allows you to set
+up ``search paths''. The idea is that you would like keys to be searched not
+only in a single default path, but in several. Suppose, for instance, that you
+would like keys to be searched for in |/a|, |/b|, and |/b/c|. We set up a key
+|/my search path| for this:
+%
+\begin{codeexample}[code only]
+\pgfkeys{/my search path/.unknown/.code=
+ {%
+ \let\searchname=\pgfkeyscurrentname%
+ \pgfkeysalso{%
+ /a/\searchname/.try=#1,
+ /b/\searchname/.retry=#1,
+ /b/c/\searchname/.retry=#1%
+ }%
+ }%
+}
+\pgfkeys{/my search path/.cd,foo,bar}
+\end{codeexample}
+%
+In the above code, |foo| and |bar| will be searched for in the three
+directories |/a|, |/b|, and |/b/c|. Before you start implementing search paths
+using this pattern, consider the |/.search also| handler discussed below.
+
+If the key \meta{current path}|/.unknown/.@cmd| does not exist, the handler
+|/handlers/.unknown| is invoked instead, which is always defined and which
+prints an error message by default.
+
+
+\subsubsection{Search Paths And Handled Keys}
+
+There is one special case which occurs in the search path example above. What
+happens if we want to change a style? For example,
+%
+\begin{codeexample}[code only]
+\pgfkeys{/my search path/.cd,custom/.style={variables}}
+\end{codeexample}
+%
+\noindent could mean a style in |/my search path/|, |/a/|, |/b/| or even
+|/b/c/|!
+
+Due to the rules for handled keys, the answer is
+|/my search path/custom/.style={variables}|. It may be useful to modify this
+default behavior. One useful thing would be to search for \emph{existing}
+styles named |custom| and redefine them. For example, if a style |/b/custom|
+exists, the assignment |custom/.style={variables}| should probably redefine
+|/b/custom| instead of |/my search path/custom|. This can be done using
+|handler config|:
+%
+\begin{codeexample}[]
+\pgfkeys{/my search path/.unknown/.code=
+ {%
+ \let\searchname=\pgfkeyscurrentname%
+ \pgfkeysalso{%
+ /a/\searchname/.try=#1,
+ /b/\searchname/.retry=#1,
+ /b/c/\searchname/.retry=#1%
+ }%
+ }%
+}
+
+% Let's define /b/custom here:
+\pgfkeys{/b/custom/.code={This is `\pgfkeyscurrentkey'. }}
+
+% Reconfigure treatment of key handlers:
+\pgfkeys{/handler config=only existing}
+
+% The search path procedure will find /b/custom
+% -> leads to This is `/b/custom'
+\pgfkeys{/my search path/.cd,custom}
+
+% Due to the reconfiguration, this will find /b/custom instead of
+% defining /my search path/custom:
+\pgfkeys{/my search path/.cd,custom/.append code={Modified. }}
+
+% So using the search path, we again find /b/custom which
+% leads to This is `/b/custom' Modified
+\pgfkeys{/my search path/.cd,custom}
+\end{codeexample}
+
+A slightly different approach to search paths can be realized using the
+|/.search also| key handler, see below.
+
+
+\subsection{Key Handlers}
+
+We now describe which key handlers are defined by default. You can also define
+new ones as described in Section~\ref{section-key-handlers}.
+
+
+\subsubsection{Handlers for Path Management}
+
+\begin{handler}{{.cd}}
+ This handler causes the default path to be set to \meta{key}. Note that the
+ default path is reset at the beginning of each call to |\pgfkeys| to be
+ equal to~|/|.
+
+ \example |\pgfkeys{/tikz/.cd,...}|
+\end{handler}
+
+\begin{handler}{{.is family}}
+\label{section-is family-handler}
+ This handler sets up things such that when \meta{key} is executed, then the
+ current path is set to \meta{key}. A typical use is the following:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/tikz/.is family}
+\pgfkeys{tikz,line width=1cm}
+\end{codeexample}
+ %
+ The effect of this handler is the same as if you had written
+ \meta{key}|/.style=|\meta{key}|/.cd|, only the code produced by the
+ |/.is family| handler is quicker.
+\end{handler}
+
+
+\subsubsection{Setting Defaults}
+\label{section-default-handlers}
+
+\begin{handler}{{.default}|=|\meta{value}}
+ Sets the default value of \meta{key} to \meta{value}. This means that
+ whenever no value is provided in a call to |\pgfkeys|, then this
+ \meta{value} will be used instead.
+
+ \example |\pgfkeys{/width/.default=1cm}|
+\end{handler}
+
+\begin{handler}{{.value required}}
+ This handler causes the error message key |/erros/value required| to be
+ issued whenever the \meta{key} is used without a value.
+
+ \example |\pgfkeys{/width/.value required}|
+\end{handler}
+
+\begin{handler}{{.value forbidden}}
+ This handler causes the error message key |/erros/value forbidden| to be
+ issued whenever the \meta{key} is used with a value.
+
+ This handler works be adding code to the code of the key. This means that
+ you have to define the key first before you can use this handler.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/my key/.code=I do not want an argument!}
+\pgfkeys{/my key/.value forbidden}
+
+\pgfkeys{/my key} % Ok
+\pgfkeys{/my key=foo} % Error
+\end{codeexample}
+ %
+\end{handler}
+
+
+\subsubsection{Defining Key Codes}
+\label{section-code-handlers}
+
+A number of handlers exist for defining the code of keys.
+
+\begin{handler}{{.code}|=|\meta{code}}
+ This handler executes |\pgfkeysdef| with the parameters \meta{key} and
+ \meta{code}. This means that, afterwards, whenever the \meta{key} is used,
+ the \meta{code} gets executed. More precisely, when
+ \meta{key}|=|\meta{value} is encountered in a key list, \meta{code} is
+ executed with any occurrence of |#1| replaced by \meta{value}. As always,
+ if no \meta{value} is given, the default value is used, if defined, or the
+ special value |\pgfkeysnovalue|.
+
+ It is permissible that \meta{code} calls the command |\pgfkeys|. It is also
+ permissible the \meta{code} calls the command |\pgfkeysalso|, which is
+ useful for styles, see below.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/par indent/.code={\parindent=#1},/par indent/.default=2em}
+\pgfkeys{/par indent=1cm}
+...
+\pgfkeys{/par indent}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.ecode}|=|\meta{code}}
+ This handler works like |/.code|, only the command |\pgfkeysedef| is used.
+\end{handler}
+
+\begin{handler}{{.code 2 args}|=|\meta{code}}
+ This handler works like |/.code|, only two arguments rather than one are
+ expected when the \meta{code} is executed. This means that when
+ \meta{key}|=|\meta{value} is encountered in a key list, the \meta{value}
+ should consist of two arguments. For instance, \meta{value} could be
+ |{first}{second}|. Then \meta{code} is executed with any occurrence of |#1|
+ replaced |first| and any occurrence of |#2| replaced by |second|.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/page size/.code 2 args={\paperheight=#2\paperwidth=#1}}
+\pgfkeys{/page size={30cm}{20cm}}
+\end{codeexample}
+ %
+ The second argument is optional: if it is not provided, it will be the
+ empty string.
+
+ Because of the special way the \meta{value} is parsed, if you set
+ \meta{value} to, for instance, |first| (without any braces), then |#1| will
+ be set to |f| and |#2| will be set to |irst|.
+\end{handler}
+
+\begin{handler}{{.ecode 2 args}|=|\meta{code}}
+ This handler works like |/.code 2 args|, only an |\edef| is used rather
+ than a |\def| to define the macro.
+\end{handler}
+
+\begin{handler}{{.code n args}|=|\marg{argument count}\marg{code}}
+ This handler also works like |/.code|, but you can now specify a number of
+ arguments between $0$ and $9$ (inclusive).
+ %
+\begin{codeexample}[]
+\pgfkeys{/a key/.code n args={2}{First=`#1', Second=`#2'}}
+\pgfkeys{/a key={A}{B}}
+\end{codeexample}
+ %
+ In contrast to |/.code 2 args|, there must be exactly \meta{argument count}
+ arguments, not more and not less and these arguments should be properly
+ delimited.
+\end{handler}
+
+\begin{handler}{{.ecode n args}|=|\marg{argument count}\marg{code}}
+ This handler works like |/.code n args|, only an |\edef| is used rather
+ than a |\def| to define the macro.
+\end{handler}
+
+\begin{handler}{{.code args}|=|\marg{argument pattern}\marg{code}}
+ This handler is the most flexible way to define a |/.code| key: you can now
+ specify an arbitrary \meta{argument pattern}. Such a pattern is a usual
+ \TeX\ macro pattern. For instance, suppose \meta{argument pattern} is
+ |(#1/#2)| and \meta{key}|=|\meta{value} is encountered in a key list with
+ \meta{value} being |(first/second)|. Then \meta{code} is executed with any
+ occurrence of |#1| replaced |first| and any occurrence of |#2| replaced by
+ |second|. So, the actual \meta{value} is matched against the \meta{argument
+ pattern} in the standard \TeX\ way.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/page size/.code args={#1 and #2}{\paperheight=#2\paperwidth=#1}}
+\pgfkeys{/page size=30cm and 20cm}
+\end{codeexample}
+
+ Note that |/.code n args| should be preferred in case you need just a
+ number of arguments (when the resulting keys are used, |/.code n args|
+ gobbles spaces between the arguments whereas |/.code args| considers spaces
+ to be part of the argument).
+\end{handler}
+
+\begin{handler}{{.ecode args}|=|\marg{argument pattern}\marg{code}}
+ This handler works like |/.code args|, only an |\edef| is used rather than
+ a |\def| to define the macro.
+\end{handler}
+
+There are also handlers for modifying existing keys.
+
+\begin{handler}{{.add code}|=|\marg{prefix code}\marg{append code}}
+ This handler adds code to an existing key. The \meta{prefix code} is added
+ to the code stored in \meta{key}|/.@cmd| at the beginning, the \meta{append
+ code} is added to this code at the end. Either can be empty. The argument
+ list of \meta{code} cannot be changed using this handler. Note that both
+ \meta{prefix code} and \meta{append code} may contain parameters like |#2|.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/par indent/.code={\parindent=#1}}
+\newdimen\myparindent
+\pgfkeys{/par indent/.add code={}{\myparindent=#1}}
+...
+\pgfkeys{/par indent=1cm} % This will set both \parindent and
+ % \myparindent to 1cm
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.prefix code}|=|\meta{prefix code}}
+ This handler is a shortcut for \meta{key}|/.add code={|\meta{prefix
+ code}|}{}|. That is, this handler adds the \meta{prefix code} at the
+ beginning of the code stored in \meta{key}|/.@cmd|.
+\end{handler}
+
+\begin{handler}{{.append code}|=|\meta{append code}}
+ This handler is a shortcut for \meta{key}|/.add code={}{|\meta{append
+ code}|}{}|.
+\end{handler}
+
+
+\subsubsection{Defining Styles}
+
+The following handlers allow you to define \emph{styles}. A style is a key list
+that is processed whenever the style is given as a key in a key list. Thus, a
+style ``stands for'' a certain key value list. Styles can be parameterized just
+like normal code.
+
+\begin{handler}{{.style}|=|\meta{key list}}
+ This handler sets things up so that whenever \meta{key}|=|\meta{value} is
+ encountered in a key list, then the \meta{key list}, with every occurrence
+ of |#1| replaced by \meta{value}, is processed instead. As always, if no
+ \meta{value} is given, the default value is used, if defined, or the
+ special value |\pgfkeysnovalue|.
+
+ You can achieve the same effect by writing
+ \meta{key}|/.code=\pgfkeysalso{|\meta{key list}|}|. This means, in
+ particular, that the code of a key could also first execute some normal
+ code and only then process some further keys.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/par indent/.code={\parindent=#1}}
+\pgfkeys{/no indent/.style={/par indent=0pt}}
+\pgfkeys{/normal indent/.style={/par indent=2em}}
+\pgfkeys{/no indent}
+...
+\pgfkeys{/normal indent}
+\end{codeexample}
+ %
+ The following example shows a parameterized style ``in action''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[outline/.style={draw=#1,fill=#1!20}]
+ \node [outline=red] {red box};
+ \node [outline=blue] at (0,-1) {blue box};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.estyle}|=|\meta{key list}}
+ This handler works like |/.style|, only the \meta{code} is set using
+ |\edef| rather than |\def|. Thus, all macros in the \meta{code} are
+ expanded prior to saving the style.
+\end{handler}
+
+For styles the corresponding handlers as for normal code exist:
+
+\begin{handler}{{.style 2 args}|=|\meta{key list}}
+ This handler works like |/.code 2 args|, only for styles. Thus, the
+ \meta{key list} may contain occurrences of both |#1| and |#2| and when the
+ style is used, two parameters must be given as \meta{value}.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/paper height/.code={\paperheight=#1},/paper width/.code={\paperwidth=#1}}
+\pgfkeys{/page size/.style 2 args={/paper height=#1,/paper width=#2}}
+\pgfkeys{/page size={30cm}{20cm}}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.estyle 2 args}|=|\meta{key list}}
+ This handler works like |/.style 2 args|, only an |\edef| is used rather
+ than a |\def| to define the macro.
+\end{handler}
+
+\begin{handler}{{.style args}|=|\marg{argument pattern}\marg{key list}}
+ This handler works like |/.code args|, only for styles.
+\end{handler}
+
+\begin{handler}{{.estyle args}|=|\marg{argument pattern}\marg{code}}
+ This handler works like |/.ecode args|, only for styles.
+\end{handler}
+
+\begin{handler}{{.style n args}|=|\marg{argument count}\meta{key list}}
+ This handler works like |/.code n args|, only for styles. Here, \meta{key
+ list} may depend on all \meta{argument count} parameters.
+\end{handler}
+
+\begin{handler}{{.add style}|=|\marg{prefix key list}\marg{append key list}}
+ This handler works like |/.add code|, only for styles. However, it is
+ permissible to add styles to keys that have previously been set using
+ |/.code|. (It is also permissible to add normal \meta{code} to a key that
+ has previously been set using |/.style|). When you add a style to a key
+ that was previously set using |/.code|, the following happens: When
+ \meta{key} is processed, the \meta{prefix key list} will be processed
+ first, then the \meta{code} that was previously stored in
+ \meta{key}|/.@cmd|, and then the keys in \meta{append key list} are
+ processed.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/par indent/.code={\parindent=#1}}
+\pgfkeys{/par indent/.add style={}{/my key=#1}}
+...
+\pgfkeys{/par indent=1cm} % This will set \parindent and
+ % then execute /my key=#1
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.prefix style}|=|\meta{prefix key list}}
+ Works like |/.add style|, but only for the prefix key list.
+\end{handler}
+
+\begin{handler}{{.append style}|=|\meta{append key list}}
+ Works like |/.add style|, but only for the append key list.
+\end{handler}
+
+
+\subsubsection{Defining Value-, Macro-, If- and Choice-Keys}
+
+For some keys, the code that should be executed for them is rather
+``specialized''. For instance, it happens often that the code for a key just
+sets a certain \TeX-if to true or false. For these cases, predefined handlers
+make it easier to install the necessary code.
+
+However, we start with some handlers that are used to manage the value that is
+directly stored in a key.
+
+\begin{handler}{{.initial}|=|\meta{value}}
+ This handler sets the value of \meta{key} to \meta{value}. Note that no
+ subkeys are involved. After this handler has been used, by the rules
+ governing keys, you can subsequently change the value of the \meta{key} by
+ just writing \meta{key}|=|\meta{value}. Thus, this handler is used to set
+ the initial value of key.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/my key/.initial=red}
+% "/my key" now stores the value "red"
+\pgfkeys{/my key=blue}
+% "/my key" now stores the value "blue"
+\end{codeexample}
+
+ Note that with this configuration, writing |\pgfkeys{/my key}| will not
+ have the effect you might expect (namely that |blue| is inserted into the
+ main text). Rather, |/my key| will be promoted to |/my key=\pgfkeysnovalue|
+ and, thus, |\pgfkeysnovalue| will be stored in |/my key|.
+
+ To retrieve the value stored in a key, the handler |/.get| is used.
+\end{handler}
+
+\begin{handler}{{.get}|=|\meta{macro}}
+ Executes a |\let| command so that \meta{macro} contains the contents stored
+ in \meta{key}.
+ %
+\begin{codeexample}[]
+\pgfkeys{/my key/.initial=red}
+\pgfkeys{/my key=blue}
+\pgfkeys{/my key/.get=\mymacro}
+\mymacro
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.add}|=|\marg{prefix value}\marg{append value}}
+ Adds the \meta{prefix value} and the beginning and the \meta{append value}
+ at the end of the value stored in \meta{key}.
+\end{handler}
+
+\begin{handler}{{.prefix}|=|\marg{prefix value}}
+ Adds the \meta{prefix value} and the beginning of the value stored in
+ \meta{key}.
+\end{handler}
+
+\begin{handler}{{.append}|=|\marg{append value}}
+ Adds the \meta{append value} at the end of the value stored in \meta{key}.
+\end{handler}
+
+\begin{handler}{{.link}|=|\meta{another key}}
+ Stores the value |\pgfkeysvalueof{|\meta{another key}|}| in the \meta{key}.
+ The idea is that when you expand the \meta{key}, the value of \meta{another
+ key} is expanded instead. This corresponds loosely to the notion of soft
+ links in Unix, hence the name.
+\end{handler}
+
+The next handler is useful for the common situation where
+\meta{key}|=|\meta{value} should cause the \meta{value} to be stored in some
+macro. Note that, typically, you could just as well store the value in the key
+itself.
+
+\begin{handler}{{.store in}|=|\meta{macro}}
+ This handler has the following effect: When you write
+ \meta{key}|=|\meta{value}, the code |\def|\meta{macro}|{|\meta{value}|}| is
+ executed. Thus, the given value is ``stored'' in the \meta{macro}.
+ %
+\begin{codeexample}[]
+\pgfkeys{/text/.store in=\mytext}
+\def\a{world}
+\pgfkeys{/text=Hello \a!}
+\def\a{Gruffalo}
+\mytext
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.estore in}|=|\meta{macro}}
+ This handler is similar to |/.store in|, only the code
+ |\edef|\meta{macro}|{|\meta{value}|}| is used. Thus, the macro-expanded
+ version of \meta{value} is stored in the \meta{macro}.
+ %
+\begin{codeexample}[]
+\pgfkeys{/text/.estore in=\mytext}
+\def\a{world}
+\pgfkeys{/text=Hello \a!}
+\def\a{Gruffalo}
+\mytext
+\end{codeexample}
+ %
+\end{handler}
+
+In another common situation a key is used to set a \TeX-if to true or false.
+
+\begin{handler}{{.is if}|=|\meta{\TeX-if name}}
+ This handler has the following effect: When you write
+ \meta{key}|=|\meta{value}, it is first checked that \meta{value} is |true|
+ or |false| (the default is |true| if no \meta{value} is given). If this is
+ not the case, the error key |/errors/boolean expected| is executed.
+ Otherwise, the code |\|\meta{\TeX-if name}\meta{value} is executed, which
+ sets the \TeX-if accordingly.
+ %
+\begin{codeexample}[]
+\newif\iftheworldisflat
+\pgfkeys{/flat world/.is if=theworldisflat}
+\pgfkeys{/flat world=false}
+\iftheworldisflat
+ Flat
+\else
+ Round?
+\fi
+\end{codeexample}
+ %
+\end{handler}
+
+The next handler deals with the problem when a \meta{key}|=|\meta{value} makes
+sense only for a small set of possible \meta{value}s. For instance, the line
+cap can only be |rounded| or |rect| or |butt|, but nothing else. For this
+situation the following handler is useful.
+
+\begin{handler}{{.is choice}}
+ This handler sets things up so that writing \meta{key}|=|\meta{value} will
+ cause the subkey \meta{key}|/|\meta{value} to be executed. So, each of the
+ different possible choices should be given by a subkey of \meta{key}.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/line cap/.is choice}
+\pgfkeys{/line cap/round/.style={\pgfsetbuttcap}}
+\pgfkeys{/line cap/butt/.style={\pgfsetroundcap}}
+\pgfkeys{/line cap/rect/.style={\pgfsetrectcap}}
+\pgfkeys{/line cap/rectangle/.style={/line cap=rect}}
+...
+\draw [/line cap=butt] ...
+\end{codeexample}
+ %
+ If the subkey \meta{key}|/|\meta{value} does not exist, the error key
+ |/errors/unknown choice value| is executed.
+\end{handler}
+
+
+\subsubsection{Expanded and Multiple Values}
+
+When you write \meta{key}|=|\meta{value}, you usually wish to use the
+\meta{value} ``as is''. Indeed, great care is taken to ensure that you can even
+use things like |#1| or unbalanced \TeX-ifs inside \meta{value}. However,
+sometimes you want the \meta{value} to be expanded before it is used. For
+instance, \meta{value} might be a macro name like |\mymacro| and you do not
+want |\mymacro| to be used as the macro, but rather the \emph{contents} of
+|\mymacro|. Thus, instead of using \meta{value}, you wish to use whatever
+\meta{value} expands to. Instead of using some fancy |\expandafter| hackery,
+you can use the following handlers:
+
+\begin{handler}{{.expand once}|=|\meta{value}}
+ This handler expands \meta{value} once (more precisely, it executes an
+ |\expandafter| command on the first token of \meta{value}) and then process
+ the resulting \meta{result} as if you had written
+ \meta{key}|=|\meta{result}. Note that if \meta{key} contains a handler
+ itself, this handler will be called normally.
+ %
+\begin{codeexample}[]
+\def\a{bottom}
+\def\b{\a}
+\def\c{\b}
+
+\pgfkeys{/key1/.initial=\c}
+\pgfkeys{/key2/.initial/.expand once=\c}
+\pgfkeys{/key3/.initial/.expand twice=\c}
+\pgfkeys{/key4/.initial/.expanded=\c}
+
+\def\a{{\ttfamily\string\a}}
+\def\b{{\ttfamily\string\b}}
+\def\c{{\ttfamily\string\c}}
+
+\begin{tabular}{ll}
+Key 1:& \pgfkeys{/key1} \\
+Key 2:& \pgfkeys{/key2} \\
+Key 3:& \pgfkeys{/key3} \\
+Key 4:& \pgfkeys{/key4}
+\end{tabular}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.expand twice}|=|\meta{value}}
+ This handler works like saying
+ \meta{key}|/.expand once/.expand once=|\meta{value}.
+\end{handler}
+
+\begin{handler}{{.expanded}|=|\meta{value}}
+ This handler will completely expand \meta{value} (using |\edef|) before
+ processing \meta{key}|=|\meta{result}.
+\end{handler}
+
+\begin{handler}{{.list}|=|\meta{comma-separated list of values}}
+ This handler causes the key to be used repeatedly, namely once for every
+ element of the list of values. Note that the list of values should
+ typically be surrounded by braces since, otherwise, \TeX\ will not be able
+ to tell whether a comma starts a new key or a new value.
+
+ The \meta{list of values} is processed using the |\foreach| statement, so
+ you can use the |...| notation.
+ %
+\begin{codeexample}[]
+\pgfkeys{/foo/.code=(#1)}
+\pgfkeys{/foo/.list={a,b,0,1,...,5}}
+\end{codeexample}
+ %
+\end{handler}
+
+
+\subsubsection{Handlers for Forwarding}
+
+\begin{handler}{{.forward to}|=|\meta{another key}}
+ This handler causes the \meta{key} to ``forward'' its argument to
+ \meta{another key}. When the \meta{key} is used, its normal code will be
+ executed first. Then, the value is (additionally) passed to \meta{another
+ key}. If the \meta{key} has not yet been defined prior to the use of
+ |.forward to|, it will be defined then (and do nothing by itself, expect
+ for forwarding it to \meta{key name}). The \meta{another key} must be a
+ fully qualified key name.
+ %
+\begin{codeexample}[]
+\pgfkeys{
+ /a/.code=(a:#1),
+ /b/.code=(b:#1),
+ /b/.forward to=/a,
+ /c/.forward to=/a
+}
+\pgfkeys{/b=1} \pgfkeys{/c=2}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.search also}=\marg{path list}}
+ A style which installs a |/.unknown| handler into \meta{key}. This
+ |/.unknown| handler will then search for unknown keys in every path
+ provided in \marg{path list}.
+ %
+\begin{codeexample}[]
+% define a key:
+\pgfkeys{/secondary path/option/.code={Invoking /secondary path/option with `#1'}}
+
+% set up a search path:
+\pgfkeys{/main path/.search also={/secondary path}}
+
+% try searching for `option=value' in '/main path':
+% -> this finds `/secondary path/option'!
+\pgfkeys{/main path/.cd,option=value}
+\end{codeexample}
+
+ The |/.search also| handler follows the strategy
+ %
+ \begin{enumerate}
+ \item If a user provides a fully qualified key which could not be
+ found, for example the full string |/main path/option|, it assume
+ that the user knew what she is doing -- and does \emph{not}
+ continue searching for |an option| in \marg{path list}.
+ \item If a user provides only the key's name, for example |option| and
+ |option| cannot be found in the current default path (which is
+ |/main path| in our example above), the current default path is set
+ to the next element in \marg{path list} (which is |/secondary path|
+ here) and |\pgfkeys| will be restarted.
+
+ This will be iterated until either a match has been found or all
+ elements in \marg{path list} have been tested. \item If all
+ elements in \marg{path list} have been checked and the key is still
+ unknown, the fall-back handler |/handlers/.unknown| will be
+ invoked.
+ \end{enumerate}
+ %
+\begin{codeexample}[]
+% define a key:
+\pgfkeys{/secondary path/option/.code={Invoking /secondary path/option with `#1'}}
+
+% set up a search path:
+\pgfkeys{/main path/.search also={/secondary path}}
+
+% try searching for `option=value' in '/main path':
+% -> this finds `/secondary path/option'!
+\pgfkeys{/main path/.cd,option=value}
+
+% negative example:
+% try searching for fully qualified key /main path/option.
+% This won't be handled by .search also.
+\pgfkeys{/handlers/.unknown/.code={Found unknown option \pgfkeyscurrentkeyRAW={#1}!}}%
+\pgfkeys{/main path/.cd,/main path/option=value}
+\end{codeexample}
+
+ Please note that the strategy of |/.search also| is different from the
+ first example provided in section~\ref{sec:pgf:unknown:keys} ``Unknown
+ Keys'' because |/.search also| only applies to keys that are not fully
+ qualified.
+
+ For those who are familiar with |\pgfkeys|, the actual implementation of
+ |/.search also| might be interesting:
+ %
+ \begin{enumerate}
+ \item |\pgfkeys{/path/.search also={/tikz}}| is equivalent to
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/path/.unknown/.code={%
+ \ifpgfkeysaddeddefaultpath
+ % only process keys for which no full path has been
+ % provided:
+ \pgfkeyssuccessfalse
+ \let\pgfkeys@searchalso@name =\pgfkeyscurrentkeyRAW
+ \ifpgfkeyssuccess
+ \else
+ % search with /tikz as default path:
+ \pgfqkeys{/tikz}{\pgfkeys@searchalso@name={#1}}%
+ \fi
+ \else
+ \def\pgfutilnext{\pgfkeysvalueof {/handlers/.unknown/.@cmd}#1\pgfeov}%
+ \pgfutilnext
+ \fi
+ }
+}
+\end{codeexample}
+ %
+ \item |\pgfkeys{/path/.search also={/tikz,/pgf}}| is equivalent to
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/path/.unknown/.code={%
+ \ifpgfkeysaddeddefaultpath
+ \pgfkeyssuccessfalse
+ \let\pgfkeys@searchalso@name=\pgfkeyscurrentkeyRAW
+ \ifpgfkeyssuccess
+ \else
+ % step 1: search in /tikz with .try:
+ \pgfqkeys{/tikz}{\pgfkeys@searchalso@name/.try={#1}}%
+ \fi
+ \ifpgfkeyssuccess
+ \else
+ % step 2: search in /pgf (without .try!):
+ \pgfqkeys{/pgf}{\pgfkeys@searchalso@name={#1}}%
+ \fi
+ \else
+ \def\pgfutilnext{\pgfkeysvalueof {/handlers/.unknown/.@cmd}#1\pgfeov}%
+ \pgfutilnext
+ \fi
+ }
+}
+\end{codeexample}
+ \end{enumerate}
+
+ To also enable searching for styles (or other handled keys), consider
+ changing the configuration for handled keys to
+ |/hander config=full or existing| when you use |/.search also|, that is,
+ use
+ %
+\begin{codeexample}[code only]
+\pgfkeys{
+ /main path/.search also={/secondary path},
+ /handler config=full or existing}
+\end{codeexample}
+ %
+\end{handler}
+
+
+\subsubsection{Handlers for Testing Keys}
+
+\begin{handler}{{.try}|=|\meta{value}}
+ This handler causes the same things to be done as if
+ \meta{key}|=|\meta{value} had been written instead. However, if neither
+ \meta{key}|/.@cmd| nor the key itself is defined, no handlers will be
+ called. Instead, the execution of the key just stops. Thus, this handler
+ will ``try'' to use the key, but no further action is taken when the key is
+ not defined.
+
+ The \TeX-if |\||ifpgfkeyssuccess| will be set according to whether the
+ \meta{key} was successfully executed or not.
+ %
+\begin{codeexample}[]
+\pgfkeys{/a/.code=(a:#1)}
+\pgfkeys{/b/.code=(b:#1)}
+\pgfkeys{/x/.try=hmm,/a/.try=hallo,/b/.try=welt}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.retry}|=|\meta{value}}
+ This handler works just like |/.try|, only it will not do anything if
+ |\||ifpgfkeyssuccess| is false. Thus, this handler will only retry to set a
+ key if ``the last attempt failed''.
+ %
+\begin{codeexample}[]
+\pgfkeys{/a/.code=(a:#1)}
+\pgfkeys{/b/.code=(b:#1)}
+\pgfkeys{/x/.try=hmm,/a/.retry=hallo,/b/.retry=welt}
+\end{codeexample}
+ %
+\end{handler}
+
+\begin{handler}{{.lastretry}|=|\meta{value}}
+ This handler works like |/.retry|, only it will invoke the usual handlers
+ for unknowns keys if |\||ifpgfkeyssuccess| is false. Thus, this handler
+ will only try to set a key if ``the last attempt failed''. Furthermore,
+ this here is the last such attempt.
+\end{handler}
+
+
+\subsubsection{Handlers for Key Inspection}
+
+\begin{handler}{{.show value}}
+ This handler executes a |\show| command on the value stored in \meta{key}.
+ This is useful mostly for debugging.
+
+ \example |\pgfkeys{/my/obscure key/.show value}|
+\end{handler}
+
+\begin{handler}{{.show code}}
+ This handler executes a |\show| command on the code stored in
+ \meta{key}|/.@cmd|. This is useful mostly for debugging.
+
+ \example |\pgfkeys{/my/obscure key/.show code}|
+\end{handler}
+
+The following key is not a handler, but it also commonly used for inspecting
+things:
+%
+\begin{key}{/utils/exec=\meta{code}}
+ This key will simply execute the given \meta{code}.
+
+ % FIXME: there is a bug in the pretty printer ... fix it!
+ \example \verb|\pgfkeys{some key=some value,/utils/exec=\show\hallo,obscure key=obscure}|
+\end{key}
+
+
+\subsection{Error Keys}
+
+In certain situations errors can occur, like using an undefined key. In these
+situations error keys are executed. They should store a macro that gets two
+arguments: The first is the offending key (possibly only after macro
+expansion), the second is the value that was passed as a parameter (also
+possibly only after macro expansion).
+
+Currently, error keys are simply executed. In the future it might be a good
+idea to have different subkeys that are executed depending on the language
+currently set so that users get a localized error message.
+
+\begin{key}{/errors/value required=\marg{offending key}\marg{value}}
+ This key is executed whenever an \meta{offending key} is used without a
+ value when a value is actually required.
+\end{key}
+
+\begin{key}{/errors/value forbidden=\marg{offending key}\marg{value}}
+ This key is executed whenever a key is used with a value when a value is
+ actually forbidden.
+\end{key}
+
+\begin{key}{/errors/boolean expected=\marg{offending key}\marg{value}}
+ This key is executed whenever a key set up using |/.is if| gets called with
+ a \meta{value} other than |true| or |false|.
+\end{key}
+
+\begin{key}{/errors/unknown choice value=\marg{offending key}\marg{value}}
+ This key is executed whenever a choice is used as a \meta{value} for a key
+ set up using the |/.is choice| handler that is not defined.
+\end{key}
+
+\begin{key}{/errors/unknown key=\marg{offending key}\marg{value}}
+ This key is executed whenever a key is unknown and no specific |/.unknown|
+ handler is found.
+\end{key}
+
+
+\input{pgfmanual-en-pgfkeysfiltered.tex}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeysfiltered.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeysfiltered.tex
new file mode 100644
index 0000000000..d93c8b8c0e
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfkeysfiltered.tex
@@ -0,0 +1,576 @@
+
+\subsection{Key Filtering}
+\begingroup
+
+{\small \emph{An extension by Christian Feuersänger}}
+\vspace{0.4cm}%
+
+\noindent Normally, a call to |\pgfkeys| sets all keys provided in its argument
+list. This is usually what users expect it to do. However, implementations of
+different packages or \pgfname-libraries may need more control over the key
+setting procedure: library~A may want to set its options directly and
+communicate all remaining ones to library~B.
+
+This section describes key filtering methods of \pgfname, including options for
+family groupings. If you merely want to use \pgfname\ (or its libraries), you
+can skip this section. It is addressed to package (or library) authors.
+
+
+\subsubsection{Starting With An Example}
+\label{section-key-filter-example}
+
+Users of |xkeyval| are familiar with the concept of key families: keys belong
+to groups and those keys can be `filtered' out of other options. \pgfname\
+supports family groupings and more abstract key selection mechanism with
+|\pgfkeysfiltered|, a variant of |\pgfkeys|. Suppose we have the example key
+grouping
+
+\pgfkeys{
+ /my group/A1/.code=(A1:#1),
+ /my group/A2/.code=(A2:#1),
+ /my group/A3/.code=(A3:#1),
+ /my group/B/.code=(B:#1),
+ /my group/C/.code=(B:#1),
+ /my group/A/.is family,
+ /my group/A1/.belongs to family=/my group/A,
+ /my group/A2/.belongs to family=/my group/A,
+ /my group/A3/.belongs to family=/my group/A,
+ /pgf/key filters/active families/.install key filter,
+ /my group/A/.activate family,
+}%
+\begin{codeexample}[code only]
+\pgfkeys{
+ /my group/A1/.code=(A1:#1),
+ /my group/A2/.code=(A2:#1),
+ /my group/A3/.code=(A3:#1),
+ /my group/B/.code=(B:#1),
+ /my group/C/.code=(B:#1),
+}
+\end{codeexample}
+
+\noindent and we want to set options |A1|, |A2| and |A3| only. A call to
+|\pgfkeys| yields
+%
+\begin{codeexample}[]
+\pgfkeys{/my group/A1=a1, /my group/A2=a2, /my group/B=b, /my group/C=c}
+\end{codeexample}
+%
+\noindent because all those command option are processed consecutively.
+
+Now, let's define a family named |A| which contains |A1|, |A2| and |A3| and set
+only family members of |A|. We prepare our key settings with
+%
+\begin{codeexample}[code only]
+\pgfkeys{
+ /my group/A/.is family,
+ /my group/A1/.belongs to family=/my group/A,
+ /my group/A2/.belongs to family=/my group/A,
+ /my group/A3/.belongs to family=/my group/A,
+}
+\end{codeexample}
+%
+\noindent and
+%
+\begin{codeexample}[code only]
+\pgfkeys{/pgf/key filters/active families/.install key filter}
+\end{codeexample}
+%
+\noindent After this preparation, we can use |\pgfkeysfiltered| with
+%
+\begin{codeexample}[]
+\pgfkeys{/my group/A/.activate family}
+\pgfkeysfiltered{/my group/A1=a1, /my group/A2=a2,
+ /my group/B=b, /my group/C=c}
+\end{codeexample}
+%
+\noindent or
+%
+\begin{codeexample}[]
+\pgfkeys{/my group/A/.activate family}
+\pgfkeysfiltered{/my group/A1=a1, /my group/A2=a2,
+ /my group/B=b, /my group/C=c, /tikz/color=blue, /my group/A3=a3}
+\end{codeexample}
+%
+\noindent to set only keys which belong to an `active' family -- in our case,
+only family~|A| was active, so the remaining options have not been processed.
+The family processing is quite fast and allows an arbitrary number of active
+key families.
+
+Unprocessed options can be collected into a macro (similar to |xkeyval|'s
+|\xkv@rm|), discarded or handled manually. The details of key selection and
+family declaration are described in the following sections.
+
+
+\subsubsection{Setting Filters}
+
+The command |\pgfkeysfiltered| is the main tool to process only selected
+options. It works as follows.
+%
+\begin{command}{\pgfkeysfiltered\marg{key--value-list}}
+ Processes all options in exactly the same way as
+ |\pgfkeys|\marg{key--value-list}, but a key filter is considered as soon as
+ key identification is complete.
+
+ The key filter tells |\pgfkeysfiltered| whether it should continue to apply
+ the current option (return value is `true') or whether something different
+ shall be done (filter returns `false').
+
+ There is exactly one key filter in effect, and it is installed by the
+ |.install key filter| handler or by |\pgfkeysinstallkeyfilter|.
+
+ If the key filter returns `false', a unique key filter handler gets
+ control. This handler is installed by the |.install key filter handler|
+ method and has access to the key's full name, value and (possibly) path.
+
+ Key filtering applies to any (possibly nested) call to |\pgfkeys|,
+ |\pgfkeysalso|, |\pgfqkeys| and |\pgfqkeysalso| during the evaluation of
+ \marg{key--value-list}. It does \emph{not} apply to routines like
+ |\pgfkeyssetvalue| or |\pgfkeysgetvalue|. Furthermore, keys belonging to
+ |/errors| are always processed. Key filtering routines can't be nested: you
+ can't combine different key filters automatically.
+\end{command}
+
+\begin{command}{\pgfqkeysfiltered\marg{default-path}\marg{key--value-list}}
+ A variant of |\pgfkeysfiltered| which uses the `quick' search path setting.
+ It is the |\pgfqkeys| variant of |\pgfkeysfiltered|, see the documentation
+ for |\pgfqkeys| for more details.
+\end{command}
+
+\begin{command}{\pgfkeysalsofrom\marg{macro}}
+ A variant of |\pgfkeysalso| which loads its key list from \marg{macro}.
+
+ It is useful in conjunction with the
+ |/pgf/key filter handlers/append filtered to=|\meta{macro} handler.
+
+ The following example uses the same settings as in the intro
+ section~\ref{section-key-filter-example}.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/key filter handlers/append filtered to/.install key filter handler=\remainingoptions}
+\def\remainingoptions{}
+\pgfkeysfiltered{/my group/A1=a1, /my group/A2=a2,
+ /my group/B=b, /my group/C=c, /tikz/color=blue, /my group/A3=a3}
+
+Remaining: `\remainingoptions'.
+\pgfkeysalsofrom{\remainingoptions}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfkeysalsofiltered\marg{key--value-list}}
+ This command works as |\pgfkeysfiltered|, but it does not change the
+ current default path. See the documentation of |\pgfkeysalso| for more
+ details.
+\end{command}
+
+\begin{command}{\pgfkeysalsofilteredfrom\marg{macro}}
+ A variant of |\pgfkeysalsofiltered| which loads its key list from
+ \marg{macro}.
+\end{command}
+
+\begin{handler}{{.install key filter}|=|\meta{optional arguments}}
+ This handler installs a key filter. A key filter is a command key which
+ sets the \TeX-boolean |\ifpgfkeysfiltercontinue|, that means a key with
+ existing `|/.@cmd|' suffix. A simple example is a key filter which returns
+ always true:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/foo/bar/true key filter/.code={\pgfkeysfiltercontinuetrue}}
+\pgfkeys{/foo/bar/true key filter/.install key filter}
+\end{codeexample}
+ %
+ If key filters require arguments, they are installed by
+ |.install key filter| as well. An example is the |/pgf/key filters/equals|
+ handler:
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/key filters/equals/.install key filter={/my group/A1}}
+\pgfkeysfiltered{/my group/A1=a1, /my group/A2=a2,
+/my group/B=b, /my group/C=c, /tikz/color=blue, /my group/A3=a3}
+\end{codeexample}
+ %
+ If a key filter requires more than one argument, you need to provide the
+ complete argument list in braces like |{{first}{second}}|.
+
+ You can also use |\pgfkeysinstallkeyfilter|\meta{full key}\meta{optional
+ arguments}, it has the same effect.
+
+ See section~\ref{section-key-writing-filters} for how to write key filters.
+\end{handler}
+
+\begin{handler}{{.install key filter handler}|=|\meta{optional arguments}}
+ This handler installs the routine which will be invoked for every
+ \emph{unprocessed} option, that means any option for which the key filter
+ returned `false'.
+
+ The |.install key filter handler| is used in the same way as
+ |.install key filter|. There exists a macro version,
+ |\pgfkeysinstallkeyfilterhandler|\meta{full key}\meta{optional arguments},
+ which has the same effect.
+
+ See section~\ref{section-key-writing-filters} for how to write key filter
+ handlers.
+\end{handler}
+
+
+\subsubsection{Handlers For Unprocessed Keys}
+
+Each option for which key filters decided to skip them is handed over to a `key
+filter handler'. There are several predefined key filter handlers.
+
+\begin{key}{/pgf/key filter handlers/append filtered to=\marg{macro}}
+ Install this filter handler to append any unprocessed options to macro
+ \marg{macro}.
+ %
+\begin{codeexample}[]
+\pgfkeys{/pgf/key filter handlers/append filtered to/.install key filter handler=\remainingoptions}
+\def\remainingoptions{}
+\pgfkeysfiltered{/my group/A1=a1, /my group/A2=a2,
+ /my group/B=b, /my group/C=c, /tikz/color=blue}
+
+Remaining options: `\remainingoptions'.
+\end{codeexample}
+ %
+ This example uses the same keys as defined in the intro
+ section~\ref{section-key-filter-example}.
+\end{key}
+
+\begin{key}{/pgf/key filter handlers/ignore}
+ Install this filter handler if you simply want to ignore any unprocessed
+ option. This is the default.
+\end{key}
+
+\begin{key}{/pgf/key filter handlers/log}
+ This key filter handler writes messages for any unprocessed option to your
+ logfile (and terminal).
+\end{key}
+
+
+\subsubsection{Family Support}
+
+\pgfname{} supports a family concept: every option can be associated with (at
+most) one family. Families form loose key groups which are independent of the
+key hierarchy. For example, |/my tree/key1| can belong to family |/tikz|.
+
+It is possible to `activate' or `deactivate' single families. Furthermore, it
+is possible to set only keys which belong to active families using appropriate
+key filter handlers.
+
+The family support is fast: if there are $N$ options in a key--value-list and
+there are $K$ active families, the runtime for |\pgfkeysfiltered| is $O(N+K)$
+(activate every family $O(K)$, check every option $O(N)$, deactivate every
+family $O(K)$).
+
+\begin{handler}{{.is family}}
+ Defines a new family. This option has already been described in
+ section~\ref{section-is family-handler} on page~\pageref{section-is
+ family-handler}.
+\end{handler}
+
+\begin{handler}{{.activate family}}
+ Activates a family. The family needs to be defined, otherwise
+ |/errors/family unknown| will be raised.
+
+ Activation means a \TeX-boolean will be set to |true|, indicating that a
+ family should be processed.
+
+ You can also use |\pgfkeysactivatefamily|\meta{full path} to get the same
+ effect. Furthermore, you can use |\pgfkeysactivatefamilies|\meta{list of
+ families}\meta{macro name for de-activation} to activate a list of families
+ (see section~\ref{section-key-filter-api}).
+\end{handler}
+
+\begin{handler}{{.deactivate family}}
+ Deactivates a family. The family needs to be defined, otherwise
+ |/errors/family unknown| will be raised.
+
+ You can also use |\pgfkeysdeactivatefamily|\meta{full path} to get the same
+ effect.
+\end{handler}
+
+\begin{handler}{{.belongs to family}|=|\marg{family name}}
+ Associates the current option with \marg{family name}, which is expected to
+ be a full path of a family.
+ %
+\begin{codeexample}[code only]
+\pgfkeys{/foo/bar/.is family}
+\pgfkeys{
+ /foo/a/.belongs to family=/foo/bar,
+ /foo/b/.belongs to family=/foo/bar
+}
+\end{codeexample}
+ %
+ Each option can have up to one family, |.belongs to family| overwrites any
+ old setting.
+\end{handler}
+
+\begin{key}{/pgf/key filters/active families}
+ Install this key filter if |\pgfkeysfiltered| should only process activated
+ families. If a key does not belong to any family, it is not processed. If a
+ key is completely unknown within the default path, the normal `unknown'
+ handlers of |\pgfkeys| are invoked.
+\end{key}
+
+\begin{key}{/pgf/key filters/active families or no family=\marg{key filter 1}\marg{key filter 2}}
+ This key filter configures |\pgfkeysfiltered| to work as follows.
+ %
+ \begin{enumerate}
+ \item If the current key belongs to a family, set
+ |\ifpgfkeysfiltercontinue| to true if and only if its family is
+ active.
+ \item If the current key does \emph{not} belong to a family, assign
+ |\ifpgfkeysfiltercontinue| as result of \marg{key filter 1}.
+ \item If the current key is unknown within the default path, assign
+ |\ifpgfkeysfiltercontinue| as result of \marg{key filter 2}.
+ \end{enumerate}
+ %
+ The arguments \marg{key filter 1} and \marg{key filter 2} are other key
+ filters (possibly with options) and allow fine-grained control over the
+ filtering process.
+ %
+\begin{codeexample}[code only]
+ \pgfkeysinstallkeyfilter
+ {/pgf/key filters/active families or no family}
+ {{/pgf/key filters/is descendant of=/tikz}% for keys without family
+ {/pgf/key filters/false}% for unknown keys
+ }%
+\end{codeexample}
+ %
+ This key filter will return true for any option with active family. If an
+ option has no family, the return value is true if and only if it belongs to
+ |/tikz|. If the option is unknown, the return value is |false| and unknown
+ handlers won't be called.
+\end{key}
+
+\begin{key}{/pgf/key filters/active families or no family DEBUG=\marg{key filter 1}\marg{key filter 2}}
+ A variant of |active families or no family| which protocols each action on
+ your terminal (log-file).
+\end{key}
+
+\begin{key}{/pgf/key filters/active families and known}
+ A fast alias for
+
+ |/pgf/key filters/active families or no family=|\par
+ \noindent\hskip10pt|{/pgf/keys filters/false}|\par
+ \noindent\hskip10pt|{/pgf/keys filters/false}|.
+\end{key}
+%
+\begin{key}{/pgf/key filters/active families or descendants of=\marg{path prefix}}
+ A fast alias for
+
+ |/pgf/key filters/active families or no family=|\par
+ \noindent\hskip10pt|{/pgf/keys filters/is descendant of=|\marg{path prefix}|}|\par
+ \noindent\hskip10pt|{/pgf/keys filters/false}|.
+\end{key}
+
+\begin{command}{\pgfkeysactivatefamiliesandfilteroptions\marg{family list}\marg{key--value-list}}
+ A simple shortcut macro which activates any family in the comma separated
+ \marg{family list}, invokes |\pgfkeysfiltered|\meta{key--value-list} and
+ deactivates the families afterwards.
+
+ Please note that you will need to install a family key filter, otherwise
+ family activation has no effect.
+\end{command}
+%
+\begin{command}{\pgfqkeysactivatefamiliesandfilteroptions\marg{family list}\marg{default path}\marg{key--value-list}}
+ The `quick' default path variant of |\pgfkeysactivatefamiliesandfilteroptions|.
+\end{command}
+
+\begin{command}{\pgfkeysactivatesinglefamilyandfilteroptions\marg{family name}\marg{key--value-list}}
+ A shortcut macro which activates a single family and invokes |\pgfkeysfiltered|.
+
+ Please note that you will need to install a family key filter, otherwise
+ family activation has no effect.
+\end{command}
+%
+\begin{command}{\pgfqkeysactivatesinglefamilyandfilteroptions\marg{family name}\marg{default path}\marg{key--value-list}}%
+ The `quick' default path variant of |\pgfkeysactivatesinglefamilyandfilteroptions|.
+\end{command}
+
+
+\subsubsection{Other Key Filters}
+
+There are some more key filters which have nothing to do with family handling.
+%
+\begin{key}{/pgf/key filters/is descendant of=\marg{path}}
+ Install this key filter to process only options belonging to the key tree
+ \meta{path}. It returns true for every key whose key path is equal to
+ \meta{path}. It also returns true for any unknown key, that means unknown
+ keys are processed using the standard unknown handlers of \pgfname.
+ %
+\begin{codeexample}[]
+\pgfkeys{
+/group 1/A/.code={(A:#1)},
+/group 1/foo/bar/B/.code={(B:#1)},
+/group 2/C/.code={(C:#1)},
+/pgf/key filters/is descendant of/.install key filter=/group 1}
+\pgfkeysfiltered{/group 1/A=a,/group 1/foo/bar/B=b,/group 2/C=c}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/key filters/equals=\marg{full key}}
+ Install this key filter to process only the fully qualified option
+ \marg{full key}. The filter returns true for any unknown key or if the key
+ equals \marg{full key}.
+ %
+\begin{codeexample}[]
+\pgfkeys{
+/group 1/A/.code={(A:#1)},
+/group 1/B/.code={(B:#1)},
+/pgf/key filters/equals/.install key filter=/group 1/A}
+\pgfqkeysfiltered{/group 1}{A=a,B=b}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/key filters/not=\marg{key filter}}
+ This key filter logically inverts the result of \marg{key filter}.
+ %
+\begin{codeexample}[]
+\pgfkeys{
+/group 1/A/.code={(A:#1)},
+/group 1/foo/bar/B/.code={(B:#1)},
+/group 2/C/.code={(C:#1)},
+/pgf/key filters/not/.install key filter=
+ {/pgf/key filters/is descendant of=/group 1}}
+\pgfkeysfiltered{/group 1/A=a,/group 1/foo/bar/B=b,/group 2/C=c}
+\end{codeexample}
+ %
+ Please note that unknown keys will be handed to the usual unknown handlers.
+\end{key}
+
+\begin{key}{/pgf/key filters/and=\marg{key filter 1}\marg{key filter 2}}
+ This key filter returns true if and only if both, \marg{key filter 1} and
+ \marg{key filter 2} return true.
+\end{key}
+
+\begin{key}{/pgf/key filters/or=\marg{key filter 1}\marg{key filter 2}}
+ This key filter returns true if one of \marg{key filter 1} and \marg{key
+ filter 2} returns true.
+\end{key}
+
+\begin{key}{/pgf/key filters/true}
+ This key filter returns always true.
+\end{key}
+
+\begin{key}{/pgf/key filters/false}
+ This key filter returns always false (including unknown keys).
+\end{key}
+
+\begin{key}{/pgf/key filters/defined}
+ This key filter returns false if the current key is unknown, which avoids
+ calling the unknown handlers.
+\end{key}
+
+
+\subsubsection{Programmer Interface}
+\label{section-key-filter-api}
+
+\begin{plainenvironment}{{pgfkeysinterruptkeyfilter}}
+ Temporarily disables key filtering inside the environment. If key filtering
+ is not active, this has no effect at all.
+
+ Please note that no \TeX-group is introduced.
+\end{plainenvironment}
+
+\begin{command}{\pgfkeyssavekeyfilterstateto\marg{macro}}
+ Creates \marg{macro} which contains commands to re-activate the current key
+ filter and key filter handler. It can be used to temporarily switch the key
+ filter.
+\end{command}
+
+\begin{command}{\pgfkeysinstallkeyfilter\marg{full key}\marg{optional arguments}}
+ The command
+ |\pgfkeysinstallkeyfilter{|\meta{full key}|}{|\meta{optional arguments}|}|
+ has the same effect as
+ |\pgfkeys{|\meta{full key}|/.install key filter={|\meta{optional arguments}|}}|.
+\end{command}
+
+\begin{command}{\pgfkeysinstallkeyfilterhandler\marg{full key}\marg{optional arguments}}
+ The command
+ |\pgfkeysinstallkeyfilterhandler{|\meta{full key}|}{|\meta{optional arguments}|}|
+ has the same effect as
+ |\pgfkeys{|\meta{full key}|/.install key filter handler={|\meta{optional arguments}|}}|.
+\end{command}
+
+\begin{command}{\pgfkeysactivatefamily\marg{family name}}
+ Equivalent to |\pgfkeys{|\meta{family name}|/.activate family}|.
+\end{command}
+
+\begin{command}{\pgfkeysdeactivatefamily\marg{family name}}
+ Equivalent to |\pgfkeys{|\meta{family name}|/.deactivate family}|.
+\end{command}
+
+\begin{command}{\pgfkeysactivatefamilies\marg{family list}\marg{deactivate macro name}}
+ Activates each family in \meta{family list} and creates a macro
+ \meta{deactivate macro name} which deactivates each family in \meta{family
+ list}.
+ %
+\begin{codeexample}[code only]
+\pgfkeysactivatefamilies{/family 1,/family 2,/family 3}{\deactivatename}
+\pgfkeysfiltered{foo,bar}
+\deactivatename
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfkeysiffamilydefined\marg{family}\marg{true case}\marg{false case}}%
+ Checks whether the full key \meta{family} is a family and executes either
+ \meta{true case} or \meta{false case}.
+\end{command}
+
+\begin{command}{\pgfkeysisfamilyactive\marg{family}}
+ Sets the \TeX-boolean |\ifpgfkeysfiltercontinue| to whether \meta{family}
+ is active or not.
+\end{command}
+
+\begin{command}{\pgfkeysgetfamily\marg{key}\marg{resultmacro}}
+ Returns the family associated to a full key \meta{key} into macro
+ \meta{resultmacro}.
+\end{command}
+
+\begin{command}{\pgfkeyssetfamily\marg{key}\marg{family}}
+ The command |\pgfkeyssetfamily|\marg{full key}\marg{family} has the same
+ effect as |\pgfkeys{|\meta{full key}|/.belongs to family=|\marg{family}|}|.
+\end{command}
+
+
+\subsubsection{Defining Own Filters Or Filter Handlers}
+\label{section-key-writing-filters}
+
+During |\pgfkeysfiltered|, the key filter code will be invoked. At this time,
+the full key path including key name is available as |\pgfkeyscurrentkey|, the
+key name before default paths have been considered as |\pgfkeyscurrentkeyRAW|
+and the values as |\pgfkeyscurrentvalue|.
+
+Furthermore, the macro |\pgfkeyscasenumber| contains the current key's type as
+an integer:
+%
+\begin{itemize}
+ \item[\meta{1}] The key is a command key (i.e. |.../.@cmd| exists).
+ \item[\meta{2}] The key contains its value directly.
+ \item[\meta{3}] The key is handled (for example it is |.code| or |.cd|).
+
+ In this case, the macros |\pgfkeyscurrentname| and
+ |\pgfkeyscurrentpath| are set to the handlers name and path,
+ respectively. Invoke |\pgfkeyssplitpath{}| to extract these values for
+ non-handled keys.
+ \item[\meta{0}] The key is unknown.
+\end{itemize}
+%
+Any key filter or key filter handler can access these variables. Key filters
+are expected to set the \TeX-boolean |\ifpgfkeysfiltercontinue| to whether the
+current key shall be processed or not.
+
+\begin{command}{\pgfkeysevalkeyfilterwith\marg{full key}=\marg{filter arguments}}
+ Evaluates a fully qualified key filter \meta{full key} with argument(s)
+ \meta{filter arguments}.
+ %
+\begin{codeexample}[code only]
+\pgfkeysevalkeyfilterwith{/pgf/key filters/equals=/tikz}
+\end{codeexample}
+ %
+\end{command}
+
+\endgroup
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-animations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-animations.tex
new file mode 100644
index 0000000000..7ac5b4f795
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-animations.tex
@@ -0,0 +1,1510 @@
+% Copyright 2016 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Animation System Layer}
+\label{section-pgfsys-anim}
+
+\makeatletter
+
+\def\animationexample#1#2#3{%
+ \tikz[fill=blue!25, draw=blue, ultra thick] {
+ \pgfidrefnextuse{\objid}{#1}
+ \pgfsysanimkeywhom{\objid}{#2}
+ \pgfidrefnextuse{\nodeid}{node}
+ \pgfsysanimkeyevent{\nodeid}{}{click}{}{begin}
+ #3
+ \node [font=\footnotesize, circle, fill, draw, align=center]
+ (node) {Click \\ here};
+ }%
+}
+
+In conjunction with the right output format (namely \textsc{svg}), you can
+specify that certain parts of you graphics can be animated. For this, there are
+a number of commands that cover, currently, what \textsc{svg 1.1} can do
+regarding animations. For a detailed introduction to animations, please see
+Section~\ref{section-base-animations}; the current section assumes that you are
+familiar with the concepts explained there.
+
+The animation system consists of two layer itself: Commands starting with
+|\pgfsys@anim...| and commands starting with |\pgfsysanim|. These work as
+follows:
+%
+\begin{enumerate}
+ \item The commands starting with |\pgfsys@anim...| insert the actual
+ animation commands into the output stream. A driver must implement
+ these commands.
+ \item The command starting with |\pgfsysanim...| provide an. These
+ commands, which are the ones that should be called by higher layers,
+ implement the snapshot mechanism: When the command
+ |\pgfsysanimsnapshot| is used, the |\pgfsysanim...| commands do
+ \emph{not} call the |\pgfsys@anim...| commands but, instead, insert
+ non-animation commands to show the values of the attributes at the
+ snapshot's time. To use this abstraction layer, you have to load the
+ file |pgfsysanimations.code.tex|, which is not loaded by default (but
+ is loaded by the \pgfname\ module |animations|).
+\end{enumerate}
+
+The bottom line is that if you wish to implement a new driver, you need to
+implement the |\pgfsys@anim...| commands, if you use the animation layer, you
+call the |\pgfsysanim...| commands.
+
+
+\subsection{Animations and Snapshots}
+
+To add an animation to a graphic, use the following command (as described
+above, the first command is the one you actually call, the second is the one a
+driver implements):
+
+\begin{command}{\pgfsysanimate\marg{attribute}}
+\end{command}
+
+\begin{command}{\pgfsys@animate\marg{attribute}}
+ The system layer animation subsystem follows the following philosophy: An
+ animation always concerns an \emph{attribute} of a \emph{graphic object}. A
+ \emph{timeline} specifies how the attribute changes its value over time.
+ Finally, a set of \emph{keys} configures the animation as a whole like
+ whether the timeline repeats or a event that triggers the start of the
+ animation. The four parts of an animation, namely the \emph{attribute}, the
+ \emph{graphic object}, the \emph{timeline}, and the \emph{keys}, are
+ specified in different ways:
+ %
+ \begin{enumerate}
+ \item You choose the \emph{attribute} using the system layer command
+ |\pgfsysanimate|.
+ \item The \emph{graphic object} whose attribute is to be animated is
+ \emph{always} specified by naming the ID of the graphic object
+ \emph{before} this object is created, see
+ Section~\ref{section-sys-id}. (However, in the context of
+ \tikzname, it suffices that the animation is given in the object's
+ options since these are executed before the actual object is
+ created).
+ \item The \emph{timeline} is specified using the commands
+ |\pgfsysanimkeytime|, which specifies a time in seconds, and
+ |\pgfsys@animation@val...|, which specify a value at this
+ particular time. The timeline specifies for a sequence of times the
+ values the attribute will have at these times. In between these
+ \emph{key times,} the value is interpolated.
+ \item The \emph{animation keys} are specified by commands starting
+ |\pgfsys@animation@...| and have the following effect: They set
+ some property (like, say, whether the animation repeats or whether
+ its effect is additive) to a given value \emph{for the current
+ \TeX\ scope,} but do not create any animations. Rather, when
+ |\pgfsysanimate| is called, a snapshot of the current values of all
+ animation keys is taken and added to this animation of the
+ attribute.
+
+ When you set an animation key to a value, this will replace the
+ value previously stored for the key (all keys are empty by default
+ at the beginning).
+
+ Note that animation keys are local to \TeX\ scopes, not graphics
+ scopes; indeed, they have little to do with the settings of the
+ graphics scope other than the fact that a graphic scope is also a
+ \TeX\ scope and thereby influence the values of these keys.
+ \end{enumerate}
+
+ A typical example of how all of this works is the following:
+ %
+\begin{codeexample}[code only]
+\pgfsysanimkeyrepeatindefinite % Both of the following animations
+ % repeat indefinitely
+{
+ \pgfsysanimkeywhom{\someid}{}% The id of a later object
+ \pgfsysanimkeyevent{}{}{click}{0}{begin}% Begin on a click ...
+ \pgfsysanimkeytime{5}{1}{1}{0}{0} % Timeline starts after 5s
+ \pgfsysanimvalscalar{0} % With a value of 0
+ \pgfsysanimkeytime{8}{1}{1}{0}{0} % Timeline ends after 8s
+ \pgfsysanimvalscalar{0.9} % With a value of 0.9
+ \pgfsysanimate{fillopacity}% ... and the attribute is the fill opacity
+}
+{
+ \pgfsysanimkeywhom{\someid}{}% The id of a later object
+ \pgfsysanimkeyoffset{0}{begin}% Begin right away ...
+ \pgfsysanimkeytime{1}{1}{1}{0}{0} % Timeline starts after 1s
+ \pgfsysanimvalcurrent % With the current value
+ \pgfsysanimkeytime{5}{1}{1}{0}{0} % Timeline ends after 5s
+ \pgfsysanimvaldimension{5pt} % With a value of 5pt
+ \pgfsysanimate{linewidth}% ... and the attribute is the line width
+}
+\end{codeexample}
+ %
+ As a real-life example, consider the following definitions, which will be
+ used in many examples in the rest of this section: Both take three
+ parameters: The \pgfname/\tikzname\ name of a to-be animated object, a type
+ (relevant for objects that have subtypes or parts), and some code for
+ triggering the actual animation. The animation will always start when the
+ button is clicked. The second macro sets up things in such a way that the
+ animation will last two seconds, while the first leaves the timing open.
+ %
+\begin{codeexample}[code only]
+\def\animationexample#1#2#3{
+ \tikz[fill=blue!25, draw=blue, ultra thick] {
+ \pgfidrefnextuse{\objid}{#1}
+ \pgfsysanimkeywhom{\objid}{#2}
+ \pgfidrefnextuse{\nodeid}{node}
+ \pgfsysanimkeyevent{\nodeid}{}{click}{}{begin}
+ #3
+ \node [font=\scriptsize, circle, fill, draw, align=center]
+ (node) {Click \\ here};
+ }
+}
+\end{codeexample}
+ %
+ Now the example, where the circle will disappear, when clicked:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimate{opacity}
+}
+\end{codeexample}
+ %
+\end{command}
+
+The ``opposite'' of |\pgfsysanimate| is the following command:
+
+\begin{command}{\pgfsysanimsnapshot\marg{time}}
+ Use this command in a scope prior to calling any other commands documented
+ in this section concerning the configuration of animations. In this case,
+ all uses of |\pgfsysanimate| inside the \TeX\ scope no longer insert an
+ animation into the output file. Instead, a ``snapshot'' is inserted of what
+ the animation ``would like at time \meta{time}''. For instance, if an
+ animation inserts a movement of an object by 4cm over a time of 2s and you
+ take a snapshot with $\meta{time} = 2\mathrm s$, you get a picture in which
+ the object is moved by 1cm.
+
+ A lot of care has been taken to make the output produced by the snapshot be
+ as close as possible as what the animation really would look like at time
+ \meta{time}, but note the following restrictions:
+ %
+ \begin{enumerate}
+ \item Interactive events of all kinds (like |click| or |mouseover|)
+ make little sense for snapshots, which are created once and for all
+ during the typesetting of the document. For this reason, all events
+ are ignored for snapshots (even sync bases, and |begin| and |end|
+ events, which might make some sense also in a snapshot setting).
+
+ However, there is one command which helps you with ``simulating''
+ the effect of events:
+ %
+ \begin{command}{\pgfsysanimkeysnapshotstart\marg{time offset}}
+ This command specifies that for the current animation the
+ ``moment |0s|'' of the timeline is at \meta{time offset}. Thus,
+ it works like |\pgfsysanimkeyoffset|, only the offset is now
+ solely for the snapshot timeline. It has no effect on the
+ actual animation.
+ \end{command}
+ %
+ \item The command |\pgfsysanimvalcurrent| cannot be used with snapshots
+ since \pgfname\ has no chance of computing the correct current
+ value. You always have to specify the start value explicitly.
+ \item The computation of time splines (entry and exit splines) and the
+ accumulation of values after a large number of repeats may not be
+ numerically stable.
+ \end{enumerate}
+ %
+\begin{codeexample}[width=5cm]
+\foreach \t in {0.5,1,1.5,2} {
+ \pgfsysanimsnapshot{\t}
+ \tikz {
+ \pgfidrefnextuse{\objid}{node}
+ \pgfsysanimkeywhom{\objid}{}
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimate{opacity}
+ \node (node) [draw = blue, very thick, fill=blue!20, circle] {Hi};
+ }
+}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimsnapshotafter\marg{time}}
+ Works like the previous command, only the ``moment'' that \meta{time}
+ refers to is conceptually $\meta{time} + \epsilon$: When timeline specifies
+ several values for \meta{time}, this command will select the last value at
+ \meta{time}, while |\pgfsnapshot| will select the first value at
+ \meta{time}. Similarly, when a timeline ends at \meta{time}, |\pgfsnapshot|
+ will select the last value of the timeline while |\pgfsnapshotafter| will
+ not apply the animation any more.
+\end{command}
+
+
+\subsection{Commands for Animating an Attribute: Color, Opacity, Visibility, Staging}
+
+The commands from this and the next sections specify that some attribute should
+be animated. We start with rather basic animation attributes for color,
+visibility, and opacity.
+
+\begin{sysanimateattribute}{opacity}
+ Adds an animation of the opacity to the graphic object specified using
+ |\pgfsysanimkeywhom|. If the driver supports this, this is a bit different
+ from animating the fill and stroke opacities individually: Paths are
+ treated as transparency groups for this key. Typically, ``this is what you
+ want''.
+
+ Specify values with |\pgfsysanimvalscalar|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimate{opacity}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{fillopacity}
+ Adds an animation of only the opacity of fill operations.
+
+ Specify values with |\pgfsysanimvalscalar|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimate{fillopacity}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{strokeopacity}
+ Adds an animation of only the opacity of draw (stroke) operations.
+
+ Specify values with |\pgfsysanimvalscalar|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimate{strokeopacity}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{visibility}
+ Adds an animation of the ``visibility''.
+
+ Specify values with |\pgfsysanimvaltext|. However, only two values are
+ allowed: |visible| and |hidden|.
+ %
+\begin{codeexample}[animation list={-1,0,1,2,3}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltext{hidden}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltext{hidden}
+ \pgfsysanimate{visibility}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{strokecolor}
+ Adds an animation of the stroke color.
+
+ Specify values with |\pgfsysanimvalcolorrgb| and friends.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalcolorrgb{0}{0}{0}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalcolorrgb{1}{0}{0}
+ \pgfsysanimate{strokecolor}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{fillcolor}
+ Adds an animation of the fill color.
+
+ Specify values with |\pgfsysanimvalcolorrgb| and friends.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalcolorrgb{0}{0}{0}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalcolorrgb{1}{0}{0}
+ \pgfsysanimate{fillcolor}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+
+\subsection{Commands for Animating an Attribute: Paths and Their Rendering}
+
+The following attributes influence paths and how they are rendered.
+
+\begin{sysanimateattribute}{path}
+ Adds an animation of the path itself. That means that the path will morph
+ its form from one path to another. When morphing a path, all ``values'',
+ which are the paths, must consist of the \emph{exact same} path
+ construction commands; they may only differ with respect to the numbers
+ used in these descriptions.
+
+ Specify values with |\pgfsysanimvalpath|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(0.9,-0.1)rectangle(2.1,1.1)}]
+\animationexample{my path}{path}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalpath{\pgfsys@moveto{1cm}{0cm}%
+ \pgfsys@lineto{1cm}{1cm}%
+ \pgfsys@lineto{2cm}{0cm}}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalpath{\pgfsys@moveto{1cm}{1cm}%
+ \pgfsys@lineto{2cm}{1cm}%
+ \pgfsys@lineto{1cm}{0cm}}
+ \pgfsysanimate{path}
+ \filldraw [ultra thick,draw=blue,fill=blue!20, name=my path]
+ (1,0) -- (1,1) -- (2,0); }
+\end{codeexample}
+
+ You can attach arrow tips to paths that are animated and these arrow tips
+ will correctly ``rotate and move along'' with the path's end points
+ \emph{if} you take the following points into considerations:
+ %
+ \begin{itemize}
+ \item Arrow tips that ``rotate and move along'' with a path must be
+ specified using a special animation command, see below. The normal
+ arrow tips added to a path would \emph{not} be animated
+ automatically and, indeed, if you add arrow tips to a path using
+ |\pgfsetarrows| and then animate the path, you will get an error
+ message.
+ \item Internally, the arrow tips that ``rotate and move along'' are
+ drawn using so-called \emph{markers.} These are little graphic
+ objects that can be added to the start and end of paths and that
+ are automatically rotated and move along with the path.
+
+ In principle, the rendering rules used by \textsc{svg} for markers
+ are the same as for normal arrow tips: The markers are rotated and
+ moved so that the point along a tangent of the path at the start or
+ end of the path. However, when it comes to special cases such as a
+ path with multiple segments, a path with degenerate segments, a
+ closed path, and so on, the rules used by for instance \textsc{svg}
+ may differ from the placement that \pgfname\ will compute.
+
+ Thus, it is best to add arrow tips only to ``normal'' paths
+ consisting of a single open path segment whose ends can be
+ shortened a bit without causing degeneration.
+ \item When an arrow tip is added to a path, the path must typically be
+ shortened a bit so that the \emph{tip} of the arrow ends where the
+ path would usually end. This shortening is not done by the system
+ layer for to-be-animated paths; you must compute and then animate
+ these shortened paths yourself. (However, the basic layer animation
+ module will do this for you, so you only have to worry about this
+ when you use the system layer directly.)
+ \end{itemize}
+
+ Let us now have a look at how we add arrow tip markers:
+ %
+ \begin{command}{\pgfsysanimkeytipmarkers\marg{start marker}\marg{end marker}}
+ \end{command}
+ %
+ \begin{command}{\pgfsys@animation@tip@markers\marg{start marker}\marg{end marker}}
+ This command specifies that during a path animation the two markers
+ provided as parameters should be added (and rotated and moved along
+ with the path) at the start and end. The \meta{start marker} must
+ either be empty (in which case no marker is added at the start) or it
+ must be a macro storing a value returned by the command
+ |\pgfsys@marker@declare|. In this case, the marker declared symbol will
+ be added to the start during the animation. The same situation applies
+ to the end of the path.
+
+ As pointed out earlier, only arrow tips / markers added to paths using
+ this command will be animated along with the path. In particular, you
+ should \emph{not} add arrow tips to to-be-animated paths using
+ |\pgfsetarrow|. However, when you use a base value
+ (|\pgfsys@animation@base|) to set a path, the arrow tips will also be
+ added to this base path.
+
+ To sum up, the ``correct'' way of adding arrow tips to a path that is
+ animated is to proceed as follows:
+ %
+ \begin{enumerate}
+ \item You specify arrow tips for a path using this command.
+ \item You specify times and values of the to-be-animated path,
+ shortened as necessary to accommodate the length of the arrow
+ tips.
+ \item You specify the first (or, possibly, some other) value in the
+ time--value sequence as a base value.
+ \item You create a path animation that applies to a future path.
+ \item You create this future path as an empty path without arrow
+ tips and draw it. Because of the setting of the base value,
+ instead of the empty path the base path will be used as the
+ ``real'' path and the animation's arrow tips will be added as
+ arrow tips.
+ \end{enumerate}
+
+ When you have more than one animation for a given path, these different
+ animations may use different arrow tips / markers. This allows you to
+ animate (change) which arrow tip is used on a path over time.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(0.7,-0.3)rectangle(2.3,1.3)}]
+% Declare a marker:
+\pgfsys@marker@declare\mymarker{%
+ \pgfscope%
+ \pgfsetcolor{red!75}%
+ \pgfpathmoveto{\pgfpoint{0pt}{5pt}}\pgfpathlineto{\pgfpoint{8pt}{0pt}}%
+ \pgfpathlineto{\pgfpoint{0pt}{0pt}}\pgfpathclose%
+ \pgfusepathqfill%
+ \endpgfscope%
+ \pgfpathmoveto{\pgfpoint{0pt}{5pt}}\pgfpathlineto{\pgfpoint{8pt}{0pt}}%
+ \pgfpathlineto{\pgfpoint{0pt}{-5pt}}\pgfpathclose%
+ \pgfusepathqstroke%
+}%
+\animationexample{my path}{path}{
+ \pgfsysanimkeytipmarkers{\mymarker}{\mymarker}
+ \pgfsysanimkeybase
+ \pgfsysanimvalpath{\pgfsys@moveto{1cm}{0cm}%
+ \pgfsys@lineto{1cm}{1cm}%
+ \pgfsys@lineto{2cm}{0cm}}
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalpath{\pgfsys@moveto{1cm}{0cm}%
+ \pgfsys@lineto{1cm}{1cm}%
+ \pgfsys@lineto{2cm}{0cm}}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalpath{\pgfsys@moveto{1cm}{1cm}%
+ \pgfsys@lineto{2cm}{1cm}%
+ \pgfsys@lineto{1cm}{0cm}}
+ \pgfsysanimate{path}
+ \filldraw [ultra thick,draw=blue,fill=blue!20, name=my path];
+ \path (1,0) (2,1);}
+\end{codeexample}
+ \end{command}
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{linewidth}
+ Adds an animation of the line width.
+
+ Specify values with |\pgfsysanimvaldimension|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaldimension{1pt}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaldimension{10pt}
+ \pgfsysanimate{linewidth}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{dash}
+ Adds an animation of the dash phase and pattern (like |\pgfsys@setdash|).
+
+ Specify values with |\pgfsysanimvaldash|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaldash{1pt,10pt}{0pt}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaldash{10pt,3pt}{0pt}
+ \pgfsysanimate{dash}
+}
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaldash{1cm,1pt}{0pt}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaldash{1cm,1pt}{1cm}
+ \pgfsysanimate{dash}
+}
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaldash{3pt,1pt}{0pt}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaldash{1pt,3pt}{10pt}
+ \pgfsysanimate{dash}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+
+\subsection{Commands for Animating an Attribute: Transformations and Views}
+
+The commands in this section allow you to animate the canvas transformation
+matrix of a scope. However, there is one command that needs to be explained
+first.
+
+\begin{command}{\pgfsysanimkeycanvastransform\marg{pre}\marg{post}}
+\end{command}
+%
+\begin{command}{\pgfsys@animation@canvas@transform\marg{pre}\marg{post}}
+ In order to animate the canvas, you specify that, for instance, the canvas
+ should be shifted over, say, one second by 2cm from left to right. In order
+ to specify this, you specify that an additional shift should be added to
+ the canvas transformation matrix that starts out as $(0,0)$ and ends at
+ $(2\,\mathrm{cm},0)$. However, it is not immediately clear what ``to the
+ right'' or $(2\,\mathrm{cm},0)$ actually means: ``Right'' relative to the
+ paper? ``Right'' relative to the coordinate system at the point when the
+ animation is created? ``Right'' relative to the object's local coordinate
+ system?
+
+ Using this command you can specify the coordinate system relative to which
+ all canvas animations are specified. In detail, when you add an animation
+ $a$ of the canvas of an object foo, the following happens:
+ %
+ \begin{enumerate}
+ \item We start with the canvas transformation matrix that is installed
+ when the object starts. More precisely, this is the canvas
+ transformation matrix that is in force when the command
+ |\pgfsys@begin@idscope| is called for the object. The canvas
+ transformation matrix that is in force when the animation is
+ created (which is typically ``way before'' the object is created
+ and may even be in a totally different graphics scope) is
+ irrelevant for the animation.
+ \item Now, when the object is created, the code \meta{pre} is executed.
+ It should call |\pgfsys@transformcm| at most once. This canvas
+ transformation is added to the object's canvas transformation.
+ \item Now, the animation $a$ of the canvas is relative to the resulting
+ canvas transformation. That means, when the animation shifts the
+ object ``to the right'' the animation will actually be along the
+ current direction of ``right'' in the canvas transformation
+ resulting from the two transformations above.
+ \item Finally, at the point of creation of the to-be-animation object
+ the code \meta{post} is executed. Again, the code should call
+ |\pgfsys@transformcm| at most once. The resulting transformation is
+ also added to the object's canvas transformation, but does
+ \emph{not} influence the animation.
+ \end{enumerate}
+
+ The net effect of the above is that, normally, you use the \meta{pre} code
+ to setup a transformation matrix relative to which you wish to perform your
+ animation and, normally, you use \meta{post} to undo this transformation
+ (using the inverted matrix) to ensure that when no animation is in force,
+ the object is placed at the same position as if no animation were used.
+
+ Let us now have a look at some examples. We use the following macro, which
+ takes a pre and a post code and animates a red ball over 1cm to the right
+ in two seconds and rotates the blue ball over 90$^\circ$ around the origin.
+ The ball is placed at $(1,0)$.
+ %
+\begin{codeexample}[code only]
+\def\animationcanvasexample#1#2{%
+ \animationexample{ball}{}{%
+ \pgfsysanimkeycanvastransform{#1}{#2}%
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{1cm}{0cm}%
+ \pgfsysanimate{translate}
+ \fill [ball color=red,name=ball] (1,0) circle [radius=3mm]; }
+ \animationexample{ball}{}{%
+ \pgfsysanimkeycanvastransform{#1}{#2}%
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{90}%
+ \pgfsysanimate{rotate}
+ \fill [ball color=blue,name=ball] (1,0) circle [radius=3mm]; } }
+\end{codeexample}
+ %
+\def\animationcanvasexample#1#2{%
+ \animationexample{ball}{}{%
+ \pgfsysanimkeycanvastransform{#1}{#2}%
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{1cm}{0cm}%
+ \pgfsysanimate{translate}
+ \fill [ball color=red,name=ball] (1,0) circle [radius=3mm]; }
+ \animationexample{ball}{}{%
+ \pgfsysanimkeycanvastransform{#1}{#2}%
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{90}%
+ \pgfsysanimate{rotate}
+ \fill [ball color=blue,name=ball] (1,0) circle [radius=3mm]; } }
+
+\begin{codeexample}[width=9.9cm,animation list={0.5,1,1.5,2}]
+\animationcanvasexample
+{}
+{}
+\end{codeexample}
+ %
+\begin{codeexample}[width=9.9cm,animation list={0.5,1,1.5,2}]
+\animationcanvasexample
+{\pgfsys@transformshift{10mm}{0mm}}
+{\pgfsys@transformshift{-10mm}{0mm}}
+\end{codeexample}
+ %
+\begin{codeexample}[width=9.9cm,animation list={0.5,1,1.5,2}]
+\animationcanvasexample
+{\pgfsys@transformcm{0.5}{0.5}{-0.5}{0.5}
+ {0pt}{0pt}}
+{}
+\end{codeexample}
+ %
+\begin{codeexample}[width=9.9cm,animation list={0.5,1,1.5,2}]
+\animationcanvasexample
+{\pgfsys@transformcm{0.5}{0.5}{-0.5}{0.5}
+ {0pt}{0pt}}
+{\pgfsys@transformcm{1}{-1}{1}{1}
+ {0pt}{0pt}}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{sysanimateattribute}{translate}
+ Adds an (additional) translate animation. Effectively, this causes the
+ group to be shifted to different positions.
+
+ Specify values with |\pgfsysanimvaltranslate|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{5mm}{-1cm}
+ \pgfsysanimate{translate}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{scale}
+ Adds an animation of the scaling relative to the origin. This causes a
+ scaling of the canvas, including fonts and line widths.
+
+ Specify values with |\pgfsysanimvalscale|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscale{1}{1}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscale{0.5}{2}
+ \pgfsysanimate{scale}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{rotate}
+ Adds a rotation animation around the origin.
+
+ Specify values with |\pgfsysanimvalscalar|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{90}
+ \pgfsysanimate{rotate}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{skewx}
+ Adds an animation of a skewing of the canvas along the $x$-axis. Unlike the
+ |slant| options of \tikzname, the skew is given in degrees.
+
+ Specify values with |\pgfsysanimvalscalar|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{45}
+ \pgfsysanimate{skewx}
+}
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{skewy}
+ Adds an animation of a skewing of the canvas along the $y$-axis.
+
+ Specify values with |\pgfsysanimvalscalar|.
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{motion}
+ Works a bit like |\pgfsysanimvaltranslate|: It also adds an animated shift
+ transformation of the canvas. However, instead of specifying some shift
+ coordinates as values, you now specify a whole path (which may include
+ curves). The effect is that an animated translate transformation for the
+ different points on this path gets installed. Furthermore, if you use
+ |\pgfsysanimkeyrotatealong|, an additional adaptive rotation transformation
+ will be added so that the animated graphic scope ``points along'' the path.
+
+ You specify the path along which you wish to move objects along using
+ |\pgfsysanimkeymovealong|. You use the timeline to specify how far the
+ object gets moved along this path using scalar values where |0| is the
+ beginning of the path and |1| is the end. Thus, setting the timeline to the
+ scalar value of |0| at time $t_0$ and to |1| at time $t_1$ will cause the
+ object o move along the complete path between times $t_0$ and $t_1$.
+
+ Specify values with |\pgfsysanimvalscalar|.
+
+ \begin{command}{\pgfsysanimkeymovealong\marg{path}}
+ \end{command}
+ %
+ \begin{command}{\pgfsys@animation@movealong\marg{path}}
+ Defines the \meta{path} along which the motion will occur. It will
+ simply be executed and must call |\pgfsys@lineto| and similar
+ path-construction commands, but should not call other commands.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},render instead={
+\animationexample{node}{}{
+ \pgfsysanimkeymovealong{
+ \pgfsyssoftpath@movetotoken{0pt}{0pt}
+ \pgfsyssoftpath@linetotoken{0pt}{-5mm}
+ \pgfsyssoftpath@curvetosupportatoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetosupportbtoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetotoken{-5mm}{-1cm} }
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimate{motion}
+}
+ }]
+\animationexample{node}{}{
+ \pgfsysanimkeymovealong{
+ \pgfsyssoftpath@movetotoken{0pt}{0pt}
+ \pgfsyssoftpath@linetotoken{0pt}{-5mm}
+ \pgfsyssoftpath@curvetosupportatoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetosupportbtoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetotoken{-5mm}{-1cm} }
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimate{motion}
+}
+\end{codeexample}
+ \end{command}
+
+ \begin{command}{\pgfsysanimkeynorotatealong}
+ \end{command}
+ %
+ \begin{command}{\pgfsys@animation@norotatealong}
+ Indicates that no additional rotation should be added during the
+ movement. This is the default.
+ \end{command}
+
+ \begin{command}{\pgfsysanimkeyrotatealong}
+ \end{command}
+ %
+ \begin{command}{\pgfsys@animation@rotatealong}
+ Indicates that the to-be-animated group should be rotated automatically
+ so that it points along the path as time progresses. This option is
+ only applicable to motion animations.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},render instead={
+\animationexample{node}{}{
+ \pgfsysanimkeyrotatealong
+ \pgfsysanimkeymovealong{
+ \pgfsyssoftpath@movetotoken{0pt}{0pt}
+ \pgfsyssoftpath@linetotoken{0pt}{-5mm}
+ \pgfsyssoftpath@curvetosupportatoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetosupportbtoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetotoken{-5mm}{-1cm} }
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimate{motion}
+}}]
+\animationexample{node}{}{
+ \pgfsysanimkeyrotatealong
+ \pgfsysanimkeymovealong{%
+ \pgfsyssoftpath@movetotoken{0pt}{0pt}%
+ \pgfsyssoftpath@linetotoken{0pt}{-5mm}%
+ \pgfsyssoftpath@curvetosupportatoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetosupportbtoken{0pt}{-1cm}%
+ \pgfsyssoftpath@curvetotoken{-5mm}{-1cm}}
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{0}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalscalar{1}
+ \pgfsysanimate{motion}
+}
+\end{codeexample}
+ \end{command}
+\end{sysanimateattribute}
+
+\begin{sysanimateattribute}{viewbox}
+ Adds an animation of the view box. The graphic scope to which this
+ animation is added must have been created using |\pgfsys@viewboxmeet| or
+ |\pgfsys@viewboxslice|; adding it to other scopes has no effect. Note that
+ this command does \emph{not} change or animate the scope's transformation
+ matrix -- it only animates the ``what we see through the view box''.
+
+ Specify values with |\pgfsysanimvalviewbox|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},width=5cm,animation
+ bb={(0.9,-2.1) rectangle (3.1,2.1)}]
+\animationexample{my view}{view}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvalviewbox{-10mm}{-20mm}{10mm}{20mm}%
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvalviewbox{15mm}{-15mm}{27mm}{8mm}%
+ \pgfsysanimate{viewbox}
+ \scoped [xshift=2cm] {
+ \draw [red] (-1,-2) rectangle (1,2) node [font=\scriptsize,
+ below left, align=right] {original\\ view\\ box};
+ \scoped [meet={(-1,-2) (1,2)}, name=my view] {
+ \draw (-5mm,-15mm) rectangle (7mm,8mm)
+ node [font=\scriptsize, align=right, below left]
+ {target\\ view\\ box}; ;
+ \filldraw (0,0) circle [radius=3mm];
+} } }
+\end{codeexample}
+ %
+\end{sysanimateattribute}
+
+
+\subsection{Commands for Specifying the Target Object}
+
+\begin{command}{\pgfsysanimkeywhom\marg{id}\marg{type}}
+\end{command}
+%
+\begin{command}{\pgfsys@animation@whom\marg{id}\marg{type}}
+ Sets the target of the animation. The \marg{id} must previously have been
+ created using |\pgfsys@new@id|, \marg{type} must be a type (the empty type
+ is also allowed). See Section~\ref{section-sys-id} for details on ids and
+ types.
+\end{command}
+
+
+\subsection{Commands for Specifying Timelines: Specifying Times}
+
+Animations are specified using \emph{timelines}, which are functions mapping
+times to values for these times. The functions are cubic splines, which are
+specified using time--value pairs plus control points.
+
+In order to specify a time--value pair, you first use the command
+|\pgfsysanimkeytime| to specify a time. Next, you use |\pgfsysanimval...| to
+specify a value, which adds the time--value pair to the timeline. Note that the
+times must be given in non-decreasing order. Between time--value pairs, the
+values are interpolated using a spline.
+
+The first and last times of the timeline are a bit special: The timeline starts
+on the first time and the duration of the timeline is the difference between
+the first and last time. ``Starting'' on the start time actually means that any
+beginnings (see the commands for specifying beginnings and endings) get as
+offset the start time; similarly end times are offset by this value.
+
+\begin{command}{\pgfsysanimkeytime\marg{time}\marg{entry spline
+ control x}\marg{entry spline control y}\marg{exit spline
+ control x}\marg{exit spline control y}%
+}
+\end{command}
+\begin{command}{\pgfsys@animation@time\marg{time}\marg{entry spline
+ control x}\marg{entry spline control y}\marg{exit spline
+ control x}\marg{exit spline control y}%
+}
+ The \meta{time} is a number representing seconds (so |0.5| means 500\,ms).
+
+ The spline between a time--value pair and the next is specified using the
+ four parameters following the time. The first two of these specify the
+ second control point of the interval preceding the time--value pair (called
+ the ``entry'' control point), the last two parameters specify the first
+ control point of the interval following the pair (called the ``exit''
+ control point). Consider for instance, the following calls:
+ %
+\begin{codeexample}[code only]
+\pgfsysanimkeytime{10}{0.1}{0.2}{0.3}{0.4}
+\pgfsysanimvalscalar{100}
+\pgfsysanimkeytime{15}{0.5}{0.6}{0.7}{0.8}
+\pgfsysanimvalscalar{200}
+\end{codeexample}
+ %
+ This will create (at least) the time interval $[10\,\mathrm s,15\,\mathrm
+ s]$ and the control points for this interval will be $(0.3,0.4)$ and
+ $(0.5,0.6)$.
+
+ Control points are specified in a different ``coordinate'' system from the
+ time--value pairs themselves: While the time--value pairs are specified
+ using a number representing seconds and a value using some special
+ commands, the control points are specified as numbers between $0$ and $1$,
+ each time representing a fraction of the time interval or the value
+ interval. In the example, the time interval is $[10\,\mathrm s,15\,\mathrm
+ s]$ and the value interval is $[100,200]$. This means that a control point
+ of $(0.3,0.4)$ actually refers to the time--value $(11.5\,\mathrm s,140)$.
+ The ``time--value curve'' in the interval thus ``\texttt{(10s,100) ..
+ controls (11.5s,140) and (12.5s,160) .. (15s,200)}''.
+
+ Note that by setting the control points always to $(1,1)$ and $(0,0)$ you
+ get a linear interpolation between time--value pairs.
+
+ Two special cases are the following: When the two last parameters, the exit
+ spline, take the special values |stay| and |0|, the attribute's value
+ ``stays'' until the next value for the next time (it then ``jumps'' to the
+ next value then). This corresponds, roughly, to an ``infinite'' \meta{exit
+ spline control x}. Similarly, when the entry spline parameters take the
+ special values |jump| and |1|, the value immediately jumps from the
+ previous value to the next value when the previous value was specified.
+\end{command}
+
+\begin{command}{\pgfsysanimkeybase}
+\end{command}
+%
+\begin{command}{\pgfsys@animation@base}
+ This command can be used in any place where |\pgfsys@animation@time| is
+ usually used. The effect is that the next value does not become part of the
+ timeline, but will become the value used for the attribute when no
+ animation is active. (Normally, when the animation is not active, no value
+ is set at all and the value is inherited from the surrounding scope.)
+\end{command}
+
+It may happen that there is more than one timeline active that is ``trying to
+modify'' a given attribute. In this case, the following rules are used to
+determine, which timeline ``wins'':
+%
+\begin{enumerate}
+ \item If no animation is active at the current time (all animation either
+ have not yet started or they have already ended), then the base value
+ given in the animation encountered last in the code is used. (If there
+ are no base values, the attribute is taken from the surrounding scope.)
+ \item If there are several active animations, the one that has started last
+ is used and the its value is used.
+ \item If there are several active animations that have started at the same
+ time, the one that comes last in the code is used.
+\end{enumerate}
+
+Note that these rules do not apply to transformations of the canvas since these
+are always additive (or, phrased differently, they are always all active and
+the effects accumulate).
+
+
+\subsection{Commands for Specifying Timelines: Specifying Values}
+
+The following commands are used to specify the values of a timeline. Each use
+of one of the following commands adds one time--value pair to the timeline.
+Which of the commands must be used depends on the type of the to-be-animated
+attribute (see the |\pgfsysanimate| command instances, which list the command
+that must be used).
+
+\begin{command}{\pgfsysanimvalcurrent}
+\end{command}
+\begin{command}{\pgfsys@animation@val@current}
+ Creates a time--value pairs where the value is the current value that the
+ attribute has. This command can only be used in conjunction with ``real''
+ animations, when you use it with a snapshot an error is raised.
+\end{command}
+
+\begin{command}{\pgfsysanimvaltext\marg{text}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@text\marg{text}}
+ Creates a time--value pairs where the value is some text. Which texts are
+ permissible depends on the to-be-animated attribute.
+\end{command}
+
+\begin{command}{\pgfsysanimvalscalar\marg{number}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@scalar\marg{number}}
+ Creates a time--value pairs where the value is a number like |0.5| or
+ |-2.25|.
+\end{command}
+
+\begin{command}{\pgfsysanimvaldimension\marg{dimension}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@dimension\marg{dimension}}
+ Creates a time--value pairs where the value is a \TeX\ dimension like
+ |0.5pt| or |-2in|.
+\end{command}
+
+\begin{command}{\pgfsysanimvalcolorrgb\marg{red}\marg{green}\marg{blue}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@color@rgb\marg{red}\marg{green}\marg{blue}}
+ Creates a time--value pairs where the value is color specified by three
+ fractional values between 0 and 1 for the red, the green, and the blue
+ part.
+\end{command}
+
+\begin{command}{\pgfsysanimvalcolorcmyk\marg{cyan}\marg{magenta}\marg{yellow}\marg{black}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@color@cmyk\marg{cyan}\marg{magenta}\marg{yellow}\marg{black}}
+ Creates a time--value pairs where the value is color specified by four
+ fractional values between 0 and 1 for the cyan, magenta, yellow, and black
+ part.
+\end{command}
+
+\begin{command}{\pgfsysanimvalcolorcmy\marg{cyan}\marg{magenta}\marg{yellow}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@color@cmy\marg{cyan}\marg{magenta}\marg{yellow}}
+ Like the |\pgfsysanimvalcolorcmyk| only without the black part.
+\end{command}
+
+\begin{command}{\pgfsysanimvalcolorgray\marg{gray value}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@color@gray\marg{gray value}}
+ Creates a time--value pairs where the value is gray value (a
+ fraction between 0 and 1).
+\end{command}
+
+\begin{command}{\pgfsysanimvalpath\marg{low-level path construction commands}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@path\marg{low-level path construction command}}
+ Creates a time--value pairs where the value is path. The \meta{low-level
+ commands} must consist of a sequence of path construction commands like
+ |\pgfsys@lineto| or |\pgfsyssoftpath@linetotoken| (more precisely, the
+ commands must form a list of \TeX\ tokens and dimensions surrounded by
+ braces). For each call of this command, the sequence of tokens and numbers
+ must be the some. During the animation, only and exactly the numbers will
+ be interpolated.
+\end{command}
+
+\begin{command}{\pgfsysanimvaltranslate\marg{x dimension}\marg{y dimension}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@translate\marg{x dimension}\marg{y dimension}}
+ Creates a time--value pairs where the value is a coordinate. The dimensions
+ must be \TeX\ dimensions.
+\end{command}
+
+\begin{command}{\pgfsysanimvalscale\marg{x scale}\marg{y scale}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@scale\marg{x scale}\marg{y scale}}
+ Creates a time--value pairs where the value is pair of scalar values.
+\end{command}
+
+\begin{command}{\pgfsysanimvalviewbox\marg{$x_1$}\marg{$y_1$}\marg{$x_2$}\marg{$y_2$}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@viewbox\marg{$x_1$}\marg{$y_1$}\marg{$x_2$}\marg{$y_2$}}
+ Creates a time--value pairs where the value is view box. The lower left
+ corner is given by $(x_1,y_1)$, consisting of two \TeX\ dimensions, and the
+ upper right corner is $(x_2,y_2)$.
+\end{command}
+
+\begin{command}{\pgfsysanimvaldash\marg{pattern}\marg{phase}}
+\end{command}
+\begin{command}{\pgfsys@animation@val@dash\marg{pattern}\marg{phase}}
+ Creates a time--value pairs where the value is dash pattern and phase with
+ the same syntax as |\pgfsys@setdash|.
+\end{command}
+
+
+\subsection{Commands for Specifying Timing: Repeats}
+
+\begin{command}{\pgfsysanimkeyrepeat{number of times}}
+\end{command}
+\begin{command}{\pgfsys@animation@repeat\marg{number of times}}
+ Specifies that the animation should repeat the specified \meta{number of
+ times}, which may be a fractional number.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyrepeat{2.5}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyrepeatindefinite}
+\end{command}
+\begin{command}{\pgfsys@animation@repeat@indefinite}
+ Specifies that the animation should repeat indefinitely.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyrepeatindefinite
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyrepeatdur\meta{seconds}}
+\end{command}
+\begin{command}{\pgfsys@animation@repeat@dur\meta{seconds}}
+ Specifies that the animation should repeat until \meta{seconds} have
+ elapsed.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyrepeatdur{5}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Commands for Specifying Timing: Beginning and Ending}
+
+Normally, animations start when a graphic is displayed. Using the following
+commands, you can change this behavior: For instance, you can specify that the
+animation should start when, say, some button has been pressed or a key has
+been hit. Similarly, you can also use the commands to specify that the
+animation should stop early, for instance when a button is pressed.
+
+Note that all of the commands for specifying a nonstandard begin (or end) of an
+animation's timeline refer to when the time $0\,\mathrm s$ of the timeline
+should actually be. If the first time--value point for a timeline is at, say,
+2\,s and you specify that the begin of the animation is one second after the
+click of a button, the attribute will attain the value specified by the
+time--value point three seconds after the button has been pressed.
+
+All of the following commands take either the text |begin| or |end| as their
+last argument.
+
+You can call the commands several times. This will result in several different
+possible beginnings (or endings).
+
+\begin{command}{\pgfsysanimkeyoffset\marg{time offset}\marg{begin or end}}
+\end{command}
+\begin{command}{\pgfsys@animation@offset\marg{time offset}\marg{begin or end}}
+ Specifies that (in addition to any other beginnings or endings) the
+ animation's timeline should begin (or end) \meta{time offset} many seconds
+ after the graphic is shown. For instance, in the next example the animation
+ will start automatically after 5\,s \emph{or} when then button is pressed.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm,render
+ instead={
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyoffset{5}{begin}
+ \pgfsysanimkeysnapshotstart{5}
+ \pgfsysanimate{translate} }
+ }]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyoffset{5}{begin}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeysyncbegin\marg{sync base id}\marg{type}\marg{time offset}\marg{begin or end}}
+\end{command}
+\begin{command}{\pgfsys@animation@syncbegin\marg{sync base id}\marg{type}\marg{time offset}\marg{begin or end}}
+ Specifies that the animation should begin \meta{time offset} many seconds
+ after the \meta{sync base id} with the given \meta{type} has begun. Here,
+ the \meta{sync base id} must have been obtained using |\pgfsys@new@id|.
+
+ The idea behind a sync base is that you setup an animation and name it,
+ other animations can start alongside this animation. An animation whose
+ sole purpose is to orchestrate other animations in this way is called a
+ \emph{sync base}.
+\end{command}
+
+\begin{command}{\pgfsysanimkeysyncend\marg{sync base id}\marg{type}\marg{time offset}\marg{begin or end}}
+\end{command}
+\begin{command}{\pgfsys@animation@syncend\marg{sync base id}\marg{type}\marg{time offset}\marg{begin or end}}
+ Works like |\pgfsysanimkeysyncbegin| only the animation begin (or ends)
+ when the sync base ends.
+\end{command}
+
+\begin{command}{\pgfsysanimkeyevent\marg{id}\marg{type}\marg{event name}\marg{time offset}\marg{begin or end}}
+\end{command}
+\begin{command}{\pgfsys@animation@event\marg{id}\marg{type}\marg{event name}\marg{time offset}\marg{begin or end}}
+ Specifies that the animation should begin (or end) \meta{time offset} many
+ seconds after a certain \emph{event} has occurred. Which events are
+ possible depends on the specific output language, here are the events
+ currently supported in \textsc{svg}:
+ %
+ \begin{itemize}
+ \item |click| occurs when the object with the given \meta{id} and
+ \meta{type} has been clicked.
+ \item |focusin| and |focusout| occur when the focus enters or leaves
+ the object.
+ \item |mouseup|, |mousedown|, |mouseover|, |mousemove|, and |mouseout|
+ occur when the mouse is pressed up or down on the object, moved
+ onto the object, moved over the object, or moved off the object.
+ \end{itemize}
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyevent{\nodeid}{}{mouseup}{}{begin}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyevent{\nodeid}{}{mousedown}{}{begin}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyevent{\nodeid}{}{mouseover}{}{begin}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyevent{\nodeid}{}{mousemove}{}{begin}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyevent{\nodeid}{}{mouseout}{}{begin}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyrepeatevent\marg{id}\marg{type}\marg{repeat count}\marg{time offset}\marg{begin or end}}
+\end{command}
+\begin{command}{\pgfsys@animation@repeat@event\marg{id}\marg{type}\marg{repeat count}\marg{time offset}\marg{begin or end}}
+ The animation begins (or end) with a certain offset when another animation
+ has reached a certain repeat count.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-5mm}
+ \pgfsysanimkeyrepeatdur{5}
+ \pgfsys@new@id{\animationid}
+ \pgfsys@use@id{\animationid}
+ \pgfsysanimate{translate}
+ \global\let\animationid\animationid }
+\tikz {
+ \pgfidrefnextuse{\objid}{other}
+ \pgfsysanimkeyrepeatevent{\animationid}{}{2}{0}{begin}
+ \pgfsysanimkeysnapshotstart{4}
+ \pgfsysanimkeywhom{\objid}{}
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-5mm}
+ \pgfsysanimate{translate}
+ \node [fill=red, text=white, circle] (other) {Other}; }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyaccesskey\marg{character}\marg{time offset}\marg{begin or end}}
+\end{command}
+\begin{command}{\pgfsys@animation@accesskey\marg{character}\marg{time offset}\marg{begin or end}}
+ Begin or end the animation when a certain key is pressed. Note that this
+ event may not be supported by some browsers for security reasons (prevent
+ key loggers).
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyaccesskey{s}{}{begin}
+ \pgfsysanimate{translate}
+}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Commands for Specifying Timing: Restart Behaviour}
+
+\begin{command}{\pgfsysanimkeyrestartalways}
+\end{command}
+\begin{command}{\pgfsys@animation@restart@always}
+ Defines that the animation can be restarted at any time. This is the
+ default.
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyrestartalways
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyrestartnever}
+\end{command}
+\begin{command}{\pgfsys@animation@restart@never}
+ Defines that the animation cannot be restarted once it has run.
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyrestartnever
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyrestartwhennotactive}
+\end{command}
+\begin{command}{\pgfsys@animation@restart@whennotactive}
+ Defines that the animation cannot be restarted while it is running.
+ %
+\begin{codeexample}[width=2cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyrestartwhennotactive
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyfreezeatend}
+\end{command}
+\begin{command}{\pgfsys@animation@freezeatend}
+ When an animation ends, the question is whether the ``effect'' of the
+ animation (like changing a color or translating the coordinate system)
+ should disappear or ``remain in force''. Using this key, you specify that
+ at the end of the animation the last value of the attributes stays in
+ effect.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyfreezeatend
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeyremoveatend}
+\end{command}
+\begin{command}{\pgfsys@animation@removeatend{}}
+ The opposite of |\pgfsysanimkeyfreezeatend|. This is the default.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-1cm}
+ \pgfsysanimkeyremoveatend
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Commands for Specifying Accumulation}
+
+Animations specify how an attribute of an object changes over time. When more
+than one animation changes the same value at the same time, the last value
+given for the attribute ``wins'', except for animations of the canvas, which
+always accumulate. Additionally, when a repeat is specified for an attribute,
+during each repeat the values can add up:
+
+\begin{command}{\pgfsysanimkeyaccumulate{}}
+\end{command}
+\begin{command}{\pgfsys@animation@accumulate{}}
+ Specifies that each repeat of an animation works as if the last values
+ attained during previous repeats are added to the current value.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-5mm}
+ \pgfsysanimkeyaccumulate
+ \pgfsysanimkeyrepeatdur{5}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsysanimkeynoaccumulate{}}
+\end{command}
+\begin{command}{\pgfsys@animation@noaccumulate{}}
+ Specifies that each repeat resets the to-be-animated value. This is the
+ default.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5,6,7,8},width=6cm]
+\animationexample{node}{}{
+ \pgfsysanimkeytime{0}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{0cm}
+ \pgfsysanimkeytime{2}{1}{1}{0}{0}
+ \pgfsysanimvaltranslate{0cm}{-5mm}
+ \pgfsysanimkeynoaccumulate
+ \pgfsysanimkeyrepeatdur{5}
+ \pgfsysanimate{translate} }
+\end{codeexample}
+ %
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-commands.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-commands.tex
new file mode 100644
index 0000000000..47b876cd1b
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-commands.tex
@@ -0,0 +1,1380 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Commands of the System Layer}
+
+\makeatletter
+
+\subsection{Beginning and Ending a Stream of System Commands}
+
+A ``user'' of the \pgfname\ system layer (like the basic layer or a frontend)
+will interface with the system layer by calling a stream of commands starting
+with |\pgfsys@|. From the system layer's point of view, these commands form a
+long stream. Between calls to the system layer, control goes back to the user.
+
+The driver files implement system layer commands by inserting |\special|
+commands that implement the desired operation. For example, |\pgfsys@stroke|
+will be mapped to |\special{pdf: S}| by the driver file for |pdftex|.
+
+For many drivers, when such a stream of specials starts, it is necessary to
+install an appropriate transformation and perhaps perform some more
+bureaucratic tasks. For this reason, every stream will start with a
+|\pgfsys@beginpicture| and will end with a corresponding ending command.
+
+\begin{command}{\pgfsys@beginpicture}
+ Called at the beginning of a |{pgfpicture}|. This command should ``set up
+ things''.
+
+ Most drivers will need to implement this command.
+\end{command}
+
+\begin{command}{\pgfsys@endpicture}
+ Called at the end of a |{pgfpicture}|.
+
+ Most drivers will need to implement this command.
+\end{command}
+
+\begin{command}{\pgfsys@typesetpicturebox\marg{box}}
+ Called \emph{after} a |{pgfpicture}| has been typeset. The picture will
+ have been put in box \meta{box}. This command should insert the box into
+ the normal text. The box \meta{box} will still be a ``raw'' box that
+ contains only the |\special|'s that make up the description of the picture.
+ The job of this command is to resize and shift \meta{box} according to the
+ baseline shift and the size of the box.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+\begin{command}{\pgfsys@beginpurepicture}
+ This version of the |\pgfsys@beginpicture| picture command can be used for
+ pictures that are guaranteed not to contain any escaped boxes (see below).
+ In this case, a driver might provide a more compact version of the command.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+\begin{command}{\pgfsys@endpurepicture}
+ Called at the end of a ``pure'' |{pgfpicture}|.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+Inside a stream it is sometimes necessary to ``escape'' back into normal
+typesetting mode; for example to insert some normal text, but with all of the
+current transformations and clippings being in force. For this escaping, the
+following command is used:
+
+\begin{command}{\pgfsys@hbox\marg{box number}}
+ Called to insert a (horizontal) TeX box inside a |{pgfpicture}|.
+
+ Most drivers will need to (re-)implement this command.
+\end{command}
+
+\begin{command}{\pgfsys@hboxsynced\marg{box number}}
+ Called to insert a (horizontal) TeX box inside a |{pgfpicture}|, but with
+ the current coordinate transformation matrix synced with the canvas
+ transformation matrix.
+
+ This command should do the same as if you used |\pgflowlevelsynccm|
+ followed by |\pgfsys@hbox|. However, the default implementation of this
+ command will use a ``TeX-translation'' for the translation part of the
+ transformation matrix. This will ensure that hyperlinks ``survive'' at
+ least translations. On the other hand, a driver may choose to revert to a
+ simpler implementation. This is done, for example, for the \textsc{svg}
+ implementation, where a \TeX-translation makes no sense.
+\end{command}
+
+\begin{command}{\pgfsys@pictureboxsynced\marg{box number}}
+ Basically, this should do the same as doing a (scoped) low level sync
+ followed by inserting the box \meta{box number} directly into the output
+ stream. However, the default implementation uses |\pgfsys@hboxsynced| in
+ conjunction with |\pgfsys@beginpicture| to ensure that, if possible,
+ hyperlinks survive in \textsc{pdf}s. Drivers that are sensitive to
+ picture-in-picture scopes should replace this implementation by
+ %
+\begin{codeexample}[code only]
+\pgfsys@beginscope\pgflowlevelsynccm\box#1\pgfsys@endscope
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Scoping System Commands}
+
+The scoping commands are used to keep changes of the graphics state local.
+
+\begin{command}{\pgfsys@beginscope}
+ Saves the current graphic state on a graphic state stack. All changes to
+ the graphic state parameters mentioned for |\pgfsys@stroke| and
+ |\pgfsys@fill| will be local to the current graphic state and the old
+ values will be restored after |\pgfsys@endscope| is used.
+
+ \emph{Warning:} \pdf\ and PostScript differ with respect to the question of
+ whether the current path is part of the graphic state or not. For this
+ reason, you should never use this command unless the path is currently
+ empty. For example, it might be a good idea to use |\pgfsys@discardpath|
+ prior to calling this command.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@endscope}
+ Restores the last saved graphic state.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+
+\subsection{Path Construction System Commands}
+
+\begin{command}{\pgfsys@moveto\marg{x}\marg{y}}
+ This command is used to start a path at a specific point $(x,y)$ or to move
+ the current point of the current path to $(x,y)$ without drawing anything
+ upon stroking (the current path is ``interrupted'').
+
+ Both \meta{x} and \meta{y} are given as \TeX\ dimensions. It is the
+ driver's job to transform these to the coordinate system of the backend.
+ Typically, this means converting the \TeX\ dimension into a dimensionless
+ multiple of $\frac{1}{72}\mathrm{in}$. The function |\pgf@sys@bp| helps
+ with this conversion.
+
+ \example Draw a line from $(10\mathrm{pt},10\mathrm{pt})$ to the origin of
+ the picture.
+ %
+\begin{codeexample}[code only]
+\pgfsys@moveto{10pt}{10pt}
+\pgfsys@lineto{0pt}{0pt}
+\pgfsys@stroke
+\end{codeexample}
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@lineto\marg{x}\marg{y}}
+ Continue the current path to $(x,y)$ with a straight line.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@curveto\marg{$x_1$}\marg{$y_1$}\marg{$x_2$}\marg{$y_2$}\marg{$x_3$}\marg{$y_3$}}
+ Continue the current path to $(x_3,y_3)$ with a Bézier curve that has the
+ two control points $(x_1,y_1)$ and $(x_2,y_2)$.
+
+ \example Draw a good approximation of a quarter circle:
+ %
+\begin{codeexample}[code only]
+\pgfsys@moveto{10pt}{0pt}
+\pgfsys@curveto{10pt}{5.55pt}{5.55pt}{10pt}{0pt}{10pt}
+\pgfsys@stroke
+\end{codeexample}
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@rect\marg{x}\marg{y}\marg{width}\marg{height}}
+ Append a rectangle to the current path whose lower left corner is at
+ $(x,y)$ and whose width and height in big points are given by \meta{width}
+ and \meta{height}.
+
+ This command can be ``mapped back'' to |\pgfsys@moveto| and
+ |\pgfsys@lineto| commands, but it is included since \pdf\ has a special,
+ quick version of this command.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@closepath}
+ Close the current path. This results in joining the current point of the
+ path with the point specified by the last |\pgfsys@moveto| operation.
+ Typically, this is preferable over using |\pgfsys@lineto| to the last point
+ specified by a |\pgfsys@moveto|, since the line starting at this point and
+ the line ending at this point will be smoothly joined by
+ |\pgfsys@closepath|.
+
+ \example Consider
+ %
+\begin{codeexample}[code only]
+\pgfsys@moveto{0pt}{0pt}
+\pgfsys@lineto{10bp}{10bp}
+\pgfsys@lineto{0bp}{10bp}
+\pgfsys@closepath
+\pgfsys@stroke
+\end{codeexample}
+ %
+ and
+ %
+\begin{codeexample}[code only]
+\pgfsys@moveto{0bp}{0bp}
+\pgfsys@lineto{10bp}{10bp}
+\pgfsys@lineto{0bp}{10bp}
+\pgfsys@lineto{0bp}{0bp}
+\pgfsys@stroke
+\end{codeexample}
+
+ The difference between the above will be that in the second triangle the
+ corner at the origin will be wrong; it will just be the overlay of two
+ lines going in different directions, not a sharp pointed corner.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+
+\subsection{Canvas Transformation System Commands}
+
+\begin{command}{\pgfsys@transformcm\marg{a}\marg{b}\marg{c}\marg{d}\marg{e}\marg{f}}
+ Perform a concatenation of the canvas transformation matrix with the matrix
+ given by the values \meta{a} to \meta{f}, see the \pdf\ or PostScript
+ manual for details. The values \meta{a} to \meta{d} are dimensionless
+ factors, \meta{e} and \meta{f} are \TeX\ dimensions
+
+ \example |\pgfsys@transformcm{1}{0}{0}{1}{1cm}{1cm}|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@transformshift\marg{x displacement}\marg{y displacement}}
+ This command will change the origin of the canvas to $(x,y)$.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@transformxyscale\marg{x scale}\marg{y scale}}
+ This command will scale the canvas (and everything that is drawn) by a
+ factor of \meta{x scale} in the $x$-direction and \meta{y scale} in the
+ $y$-direction. Note that this applies to everything, including lines. So a
+ scaled line will have a different width and may even have a different width
+ when going along the $x$-axis and when going along the $y$-axis, if the
+ scaling is different in these directions. Usually, you do not want this.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@viewboxmeet\marg{$x_1$}\marg{$y_1$}\marg{$x_2$}\marg{$y_2$}%
+ \marg{$x'_1$}\marg{$y'_1$}\marg{$x'_2$}\marg{$y'_2$}%
+}
+ Starts a ``view box'' scope, which must be ended using |\pgfsys@endviewbox|
+ later on (with matching scopes).
+
+ The effect of this command is as follows: Consider the rectangles $R$ with
+ lower left corner $(x_1,y_1)$ and upper right corner $(x_2,y_2)$ and $R'$
+ with corners $(x'_1,y'_1)$ and $(x'_2,y'_2)$. The command will install a
+ canvas translation and uniform scaling such that $R'$ then has the same
+ center as~$R$ and additionally, has maximum size such that it still fits
+ inside~$R$. (Think of this as ``viewing'' $R'$ through $R$ such that the
+ aspect ratio is kept.)
+
+ This command has a default implementation. Its main purpose is to allow
+ animations of the view box; for static drawings it is better to compute the
+ necessary transformations directly.
+\end{command}
+
+\begin{command}{\pgfsys@viewboxslice\marg{$x_1$}\marg{$y_1$}\marg{$x_2$}\marg{$y_2$}%
+ \marg{$x'_1$}\marg{$y'_1$}\marg{$x'_2$}\marg{$y'_2$}%
+}
+ Works like the previous command, but now $R'$ has minimal size such that it
+ encompasses all of $R$.
+\end{command}
+
+\begin{command}{\pgfsys@endviewbox}
+ Ends a viewbox previously started using |\pgfsys@viewboxmeet| or the
+ |...slice| variant.
+\end{command}
+
+
+\subsection{Stroking, Filling, and Clipping System Commands}
+
+\begin{command}{\pgfsys@stroke}
+ Stroke the current path (as if it were drawn with a pen). A number of
+ graphic state parameters influence this, which can be set using appropriate
+ system commands described later.
+ %
+ \begin{description}
+ \item[Line width] The ``thickness'' of the line. A width of 0 is the
+ thinnest width renderable on the device. On a high-resolution
+ printer this may become invisible and should be avoided. A good
+ choice is 0.4pt, which is the default.
+ \item[Stroke color] This special color is used for stroking. If it is
+ not set, the current color is used.
+ \item[Cap] The cap describes how the endings of lines are drawn. A
+ round cap adds a little half circle to these endings. A butt cap
+ ends the lines exactly at the end (or start) point without anything
+ added. A rectangular cap ends the lines like the butt cap, but the
+ lines protrude over the endpoint by the line thickness. (See also
+ the \pdf\ manual.) If the path has been closed, no cap is drawn.
+ \item[Join] This describes how a bend (a join) in a path is rendered. A
+ round join draws bends using small arcs. A bevel join just draws
+ the two lines and then fills the join minimally so that it becomes
+ convex. A miter join extends the lines so that they form a single
+ sharp corner, but only up to a certain miter limit. (See the \pdf\
+ manual once more.)
+ \item[Dash] The line may be dashed according to a dashing pattern.
+ \item[Clipping area] If a clipping area is established, only those
+ parts of the path that are inside the clipping area will be drawn.
+ \end{description}
+
+ In addition to stroking a path, the path may also be used for clipping
+ after it has been stroked. This will happen if the |\pgfsys@clipnext| is
+ used prior to this command, see there for details.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@closestroke}
+ This command should have the same effect as first closing the path and then
+ stroking it.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+
+\begin{command}{\pgfsys@fill}
+ This command fills the area surrounded by the current path. If the path has
+ not yet been closed, it is closed prior to filling. The path itself is not
+ stroked. For self-intersecting paths or paths consisting of multiple parts,
+ the nonzero winding number rule is used to determine whether a point is
+ inside or outside the path, except if |\ifpgfsys@eorule| holds -- in which
+ case the even-odd rule should be used. (See the \pdf\ or PostScript manual
+ for details.)
+
+ The following graphic state parameters influence the filling:
+ %
+ \begin{description}
+ \item[Interior rule] If |\ifpgfsys@eorule| is set, the even-odd rule is
+ used, otherwise the non-zero winding number rule.
+ \item[Fill color] If the fill color is not especially set, the current
+ color is used.
+ \item[Clipping area] If a clipping area is established, only those
+ parts of the filling area that are inside the clipping area will be
+ drawn.
+ \end{description}
+
+ In addition to filling the path, the path will also be used for clipping if
+ |\pgfsys@clipnext| is used prior to this command.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@fillstroke}
+ First, the path is filled, then the path is stroked. If the fill and stroke
+ colors are the same (or if they are not specified and the current color is
+ used), this yields almost the same as a |\pgfsys@fill|. However, due to the
+ line thickness of the stroked path, the fill-stroked area will be slightly
+ larger.
+
+ In addition to stroking and filling the path, the path will also be used
+ for clipping if |\pgfsys@clipnext| is used prior to this command.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@discardpath}
+ Normally, this command should ``throw away'' the current path. However,
+ after |\pgfsys@clipnext| has been called, the current path should
+ subsequently be used for clipping. See |\pgfsys@clipnext| for details.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@clipnext}
+ This command should be issued after a path has been constructed, but before
+ it has been stroked and/or filled or discarded. When the command is used,
+ the next stroking/filling/discarding command will first be executed
+ normally. Then, afterwards, the just-used path will be used for subsequent
+ clipping. If there has already been a clipping region, this region is
+ intersected with the new clipping path (the clipping cannot get bigger).
+ The nonzero winding number rule is used to determine whether a point is
+ inside or outside the clipping area or the even-odd rule, depending on
+ whether |\ifpgfsys@eorule| holds.
+\end{command}
+
+
+\subsection{Graphic State Option System Commands}
+
+\begin{command}{\pgfsys@setlinewidth\marg{width}}
+ Sets the width of lines, when stroked, to \meta{width}, which must be a
+ \TeX\ dimension.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@buttcap}
+ Sets the cap to a butt cap. See |\pgfsys@stroke|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@roundcap}
+ Sets the cap to a round cap. See |\pgfsys@stroke|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@rectcap}
+ Sets the cap to a rectangular cap. See |\pgfsys@stroke|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@miterjoin}
+ Sets the join to a miter join. See |\pgfsys@stroke|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@setmiterlimit\marg{factor}}
+ Sets the miter limit of lines to \meta{factor}. See the \pdf\ or PostScript
+ for details on what the miter limit is.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@roundjoin}
+ Sets the join to a round join. See |\pgfsys@stroke|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@beveljoin}
+ Sets the join to a bevel join. See |\pgfsys@stroke|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@setdash\marg{pattern}\marg{phase}}
+ Sets the dashing patter. \meta{pattern} should be a list of \TeX\
+ dimensions separated by commas. \meta{phase} should be a single dimension.
+
+ \example |\pgfsys@setdash{3pt,3pt}{0pt}|
+
+ The list of values in \meta{pattern} is used to determine the lengths of
+ the ``on'' and ``off'' phases of the dashing. For example, if
+ \meta{pattern} is |3bp,4bp|, then the dashing pattern is ``3bp on followed
+ by 4bp off, followed by 3bp on, followed by 4bp off, and so on''. A pattern
+ of |.5pt,4pt,3pt,1.5pt| means ``.5pt on, 4pt off, 3pt on, 1.5pt off, .5pt
+ on, \dots'' If the number of entries is odd, the last one is used twice, so
+ |3pt| means ``3pt on, 3pt off, 3pt on, 3pt off, \dots'' An empty list means
+ ``always on''.
+
+ The second argument determines the ``phase'' of the pattern. For example,
+ for a pattern of |3bp,4bp| and a phase of |1bp|, the pattern would start:
+ ``2bp on, 4bp off, 3bp on, 4bp off, 3bp on, 4bp off, \dots''
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+{\let\ifpgfsys@eorule=\relax
+\begin{command}{\ifpgfsys@eorule}
+ Determines whether the even odd rule is used for filling and clipping or
+ not.
+\end{command}
+}
+
+
+\subsection{Color System Commands}
+
+The \pgfname\ system layer provides a number of system commands for setting
+colors. These command coexist with commands from the |color| and |xcolor|
+package, which perform similar functions. However, the |color| package does not
+support having two different colors for stroking and filling, which is a useful
+feature that is supported by \pgfname. For this reason, the \pgfname\ system
+layer offers commands for setting these colors separately. Also, plain \TeX\
+profits from the fact that \pgfname\ can set colors.
+
+For \pdf, implementing these color commands is easy since \pdf\ supports
+different stroking and filling colors directly. For PostScript, a more
+complicated approach is needed in which the colors need to be stored in special
+PostScript variables that are set whenever a stroking or a filling operation is
+done.
+
+\begin{command}{\pgfsys@color@rgb\marg{red}\marg{green}\marg{blue}}
+ Sets the color used for stroking and filling operations to the given
+ red/green/blue tuple (numbers between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@rgb@stroke\marg{red}\marg{green}\marg{blue}}
+ Sets the color used for stroking operations to the given red/green/blue
+ tuple (numbers between 0 and 1).
+
+ \example Make stroked text dark red: |\pgfsys@color@rgb@stroke{0.5}{0}{0}|
+
+ The special stroking color is only used if the stroking color has been set
+ since the last |\color| or |\pgfsys@color@...| command. Thus, each |\color|
+ command will reset both the stroking and filling colors by calling
+ |\pgfsys@color@reset|.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@rgb@fill\marg{red}\marg{green}\marg{blue}}
+ Sets the color used for filling operations to the given red/green/blue
+ tuple (numbers between 0 and 1). This color may be different from the
+ stroking color.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@cmyk\marg{cyan}\marg{magenta}\marg{yellow}\marg{black}}
+ Sets the color used for stroking and filling operations to the given cmyk
+ tuple (numbers between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@cmyk@stroke\marg{cyan}\marg{magenta}\marg{yellow}\marg{black}}
+ Sets the color used for stroking operations to the given cmyk tuple
+ (numbers between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@cmyk@fill\marg{cyan}\marg{magenta}\marg{yellow}\marg{black}}
+ Sets the color used for filling operations to the given cmyk tuple (numbers
+ between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@cmy\marg{cyan}\marg{magenta}\marg{yellow}}
+ Sets the color used for stroking and filling operations to the given cmy
+ tuple (numbers between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@cmy@stroke\marg{cyan}\marg{magenta}\marg{yellow}}
+ Sets the color used for stroking operations to the given cmy tuple (numbers
+ between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@cmy@fill\marg{cyan}\marg{magenta}\marg{yellow}}
+ Sets the color used for filling operations to the given cmy tuple (numbers
+ between 0 and 1).
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@gray\marg{black}}
+ Sets the color used for stroking and filling operations to the given black
+ value, where 0 means black and 1 means white.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@gray@stroke\marg{black}}
+ Sets the color used for stroking operations to the given black value, where
+ 0 means black and 1 means white.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@gray@fill\marg{black}}
+ Sets the color used for filling operations to the given black value, where
+ 0 means black and 1 means white.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@color@reset}
+ This command will be called when the |\color| command is used. It should
+ purge any internal settings of stroking and filling color. After this call,
+ till the next use of a command like |\pgfsys@color@rgb@fill|, the current
+ color installed by the |\color| command should be used.
+
+ If the \TeX-if |\pgfsys@color@reset@inorder| is set to true, this command
+ may ``assume'' that any call to a color command that sets the fill or
+ stroke color came ``before'' the call to this command and may try to
+ optimize the output accordingly.
+
+ An example of an incorrect ``out of order'' call would be using
+ |\pgfsys@color@reset| at the beginning of a box that is constructed using
+ |\setbox|. Then, when the box is constructed, no special fill or stroke
+ color might be in force. However, when the box is later on inserted at some
+ point, a special fill color might already have been set. In this case, this
+ command is not guaranteed to reset the color correctly.
+\end{command}
+
+\begin{command}{\pgfsys@color@reset@inordertrue}
+ Sets the optimized ``in order'' version of the color resetting. This is the
+ default.
+\end{command}
+
+\begin{command}{\pgfsys@color@reset@inorderfalse}
+ Switches off the optimized color resetting.
+\end{command}
+
+\begin{command}{\pgfsys@color@unstacked\marg{\LaTeX\ color}}
+ This slightly obscure command causes the color stack to be tricked. When
+ called, this command should set the current color to \meta{\LaTeX\ color}
+ without causing any change in the color stack.
+
+ \example |\pgfsys@color@unstacked{red}|
+\end{command}
+
+
+\subsection{Pattern System Commands}
+
+\begin{command}{\pgfsys@declarepattern
+ \marg{name}\marg{$x_1$}\marg{$y_1$}\marg{$x_2$}\marg{$y_2$}%
+ \marg{$x$ step}\marg{$y$ step}%
+ \marg{$a$}\marg{$b$}\marg{$c$}\marg{$d$}\allowbreak\marg{$e$}\marg{$f$}%
+ \marg{code}\marg{flag}%
+}
+ This command declares a new colored or uncolored pattern, depending on
+ whether \meta{flag} is |0|, which means uncolored, or |1|, which means
+ colored. Uncolored patterns have no inherent color, the color is provided
+ when they are set. Colored patters have an inherent color.
+
+ The \meta{name} is a name for later use when the pattern is to be shown.
+ The pairs $(x_1,y_1)$ and $(x_2,y_2)$ must describe a bounding box of the
+ pattern \meta{code}.
+
+ The tiling step of the pattern is given by \meta{$x$ step} and \meta{$y$
+ step}.
+
+ The parameters \meta{$a$} to \meta{$f$} are entries of the transformation
+ matrix that is applied to the pattern, see |\pgfsys@patternmatrix| for more
+ information.
+
+ \example
+ %
+\begin{codeexample}[code only]
+\pgfsys@declarepattern
+ {hori}{-.5pt}{0pt}{.5pt}{3pt}{3pt}{3pt}%
+ {1.0}{0.0}{0.0}{1.0}{0.0pt}{0.0pt}%
+ {\pgfsys@moveto{0pt}{0pt}\pgfsys@lineto{0pt}{3pt}\pgfsys@stroke}
+ {0}
+\end{codeexample}
+ %
+\end{command}
+
+
+\begin{command}{\pgfsys@patternmatrix}
+ For convenience \pgfname\ defines the transformation matrix that is applied
+ to all patterns defined with |\pgfdeclarepatternformonly| and
+ |\pgfdeclarepatterninherentlycolored| in a macro. This can be used as an
+ extension point for ad-hoc transformation of existing patterns. The
+ default definition is the
+ identity matrix:
+ %
+\begin{codeexample}[code only]
+\def\pgfsys@patternmatrix{{1.0}{0.0}{0.0}{1.0}{0.0pt}{0.0pt}}
+\end{codeexample}
+ %
+ The entries of the enclosed array
+ |{|\meta{$a$}|}{|\meta{$b$}|}{|\meta{$c$}|}{|\meta{$d$}|}{|\meta{$e$}|}{|\meta{$f$}|}|
+ are entries in the transformation matrix, identified as in the following
+ transformation prescription:
+ \begin{equation*}
+ \begin{pmatrix}
+ x' \\
+ y' \\
+ 1 \\
+ \end{pmatrix}
+ =
+ \begin{pmatrix}
+ a & c & e \\
+ b & d & f \\
+ 0 & 0 & 1 \\
+ \end{pmatrix}
+ \begin{pmatrix}
+ x \\
+ y \\
+ 1 \\
+ \end{pmatrix} .
+ \end{equation*}
+ Carrying out the matrix multiplication results in the following system of
+ equations
+ \begin{align*}
+ x' &= a x + c y + e , \\
+ y' &= b x + d y + f .
+ \end{align*}
+ Evidently, the parameters \marg{$a$} to \marg{$d$} have to be dimensionless
+ because they are scaling factors, but the parameters \marg{$e$} and
+ \marg{$f$} are offsets, therefore they have to carry a unit.
+\end{command}
+
+\begin{command}{\pgfsys@setpatternuncolored\marg{name}\marg{red}\marg{green}\marg{blue}}
+ Sets the fill color to the pattern named \meta{name}. This pattern must
+ previously have been declared with \meta{flag} set to |0|. The color of the
+ pattern is given in the parameters \meta{red}, \meta{green}, and
+ \meta{blue} in the usual way.
+
+ The fill color ``pattern'' will persist till the next color command that
+ modifies the fill color.
+\end{command}
+
+\begin{command}{\pgfsys@setpatterncolored\marg{name}}
+ Sets the fill color to the pattern named \meta{name}. This pattern must
+ have been declared with the |1| flag.
+\end{command}
+
+
+\subsection{Image System Commands}
+
+The system layer provides some commands for image inclusion.
+
+\begin{command}{\pgfsys@imagesuffixlist}
+ This macro should expand to a list of suffixes, separated by `:', that will
+ be tried when searching for an image.
+
+ \example |\def\pgfsys@imagesuffixlist{eps:epsi:ps}|
+\end{command}
+
+\begin{command}{\pgfsys@defineimage}
+ Called, when an image should be defined.
+
+ This command does not take any parameters. Instead, certain macros will be
+ preinstalled with appropriate values when this command is invoked. These
+ are:
+ %
+ \begin{itemize}
+ \item\declare{|\pgf@filename|} File name of the image to be defined.
+ \item\declare{|\pgf@imagewidth|} Will be set to the desired (scaled)
+ width of the image.
+ \item\declare{|\pgf@imageheight|} Will be set to the desired (scaled)
+ height of the image.
+
+ If this macro and also the height macro are empty, the image should
+ have its ``natural'' size.
+
+ If only one of them is specified, the undefined value the image is
+ scaled so that the aspect ratio is kept.
+
+ If both are set, the image is scaled in both directions
+ independently, possibly changing the aspect ratio.
+ \end{itemize}
+
+ The following macros presumable mostly make sense for drivers that
+ can handle \pdf:
+ %
+ \begin{itemize}
+ \item \declare{|\pgf@imagepage|} The desired page number to be
+ extracted from a multi-page ``image''.
+ \item\declare{|\pgf@imagemask|} If set, it will be set to
+ |/SMask x 0 R| where |x| is the \pdf\ object number of a soft mask
+ to be applied to the image.
+ \item\declare{|\pgf@imageinterpolate|} If set, it will be set to
+ |/Interpolate true| or |/Interpolate false|, indicating whether the
+ image should be interpolated in \pdf.
+ \end{itemize}
+
+ The command should now set up the macro |\pgf@image| such that calling this
+ macro will result in typesetting the image. Thus, |\pgf@image| is the
+ ``return value'' of the command.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+
+\subsection{Shading System Commands}
+
+\begin{command}{\pgfsys@horishading\marg{name}\marg{height}\marg{specification}}
+ Declares a horizontal shading for later use. The effect of this command
+ should be the definition of a macro called |\@pgfshading|\meta{name}|!| (or
+ |\csname @pdfshading|\meta{name}|!\endcsname|, to be precise). When
+ invoked, this new macro should insert a shading at the current position.
+
+ \meta{name} is the name of the shading, which is also used in the output
+ macro name. \meta{height} is the height of the shading and must be given as
+ a TeX dimension like |2cm| or |10pt|. \meta{specification} is a shading
+ color specification as specified in Section~\ref{section-shadings}. The
+ shading specification implicitly fixes the width of the shading.
+
+ When |\@pgfshading|\meta{name}|!| is invoked, it should insert a box of
+ height \meta{height} and the width implicit in the shading declaration.
+\end{command}
+
+\begin{command}{\pgfsys@vertshading\marg{name}\marg{width}\marg{specification}}
+ Like the horizontal version, only for vertical shadings. This time, the
+ height of the shading is implicit in \meta{specification} and the width is
+ given as \meta{width}.
+\end{command}
+
+\begin{command}{\pgfsys@radialshading\marg{name}\marg{starting point}\marg{specification}}
+ Declares a radial shading. Like the previous macros, this command should
+ set up the macro |\@pgfshading|\meta{name}|!|, which upon invocation should
+ insert a radial shading whose size is implicit in \meta{specification}.
+
+ The parameter \meta{starting point} is a \pgfname\ point specifying the
+ inner starting point of the shading.
+\end{command}
+
+\begin{command}{\pgfsys@functionalshading\marg{name}\marg{lower left corner}\meta{upper right corner}\marg{type 4 function}}
+ Declares a shading using a PostScript-like function that provides a color
+ for each point. Like the previous macros, this command should set up the
+ macro |\@pgfshading|\meta{name}|!| so that it will produce a box containing
+ the desired shading.
+
+ Parameter \meta{name} is the name of the shading. Parameter \meta{type 4
+ function} is a Postscript-like function (type 4 function of the PDF
+ specification) as described in Section~3.9.4 of the PDF specification
+ version 1.7. Parameters \meta{lower left corner} and \meta{upper right
+ corner} are \pgfname\ points that specifies the lower left and upper right
+ corners of the shading, respectively.
+
+ When \meta{type 4 function} is evaluated, the coordinate of the current
+ point will be on the (virtual) PostScript stack in bp units. After the
+ function has been evaluated, the stack should consist of three numbers (not
+ integers! -- the Apple PDF renderer is broken in this regard, so add cvrs
+ at the end if needed) that represent the red, green, and blue components of
+ the color.
+
+ A buggy function will result is \emph{totally unpredictable chaos} during
+ rendering.
+\end{command}
+
+
+\subsection{Transparency System Commands}
+
+\begin{command}{\pgfsys@opacity\marg{value}}
+ Sets the opacity of all operations, treating stroking and filling as a
+ transparency group. Some drivers support this operations, others do not and
+ set the fill and stroke individually. This difference can only be seen when
+ a path is stroked and filled at the same time: When the drawing and fill
+ opacities are set individually, the effect of filling and drawing a path at
+ the same time is the same as first filling the path and then drawing it. On
+ the other, if the opacity is set using this command, the effect should
+ rather be that same as first filling and then drawing the path without any
+ opacity in an off-screen area and then copying the result to the target
+ area with a homogeneous opacity of \meta{value}.
+
+ Since \textsc{pdf} does not support this form of opacity, this command is
+ only present on the system layer and not supported in the basic layer.
+\end{command}
+
+\begin{command}{\pgfsys@stroke@opacity\marg{value}}
+ Sets the opacity of stroking operations.
+\end{command}
+
+\begin{command}{\pgfsys@fill@opacity\marg{value}}
+ Sets the opacity of filling operations.
+\end{command}
+
+\begin{command}{\pgfsys@blend@mode\marg{value}}
+ Sets the blend mode, see Section~7.2.4 of the \textsc{pdf} Specification,
+ Version~1.7.
+\end{command}
+
+\begin{command}{\pgfsys@transparencygroupfrombox\marg{box}}
+ This takes a \TeX\ box and converts it into a transparency group. This
+ means that any transparency settings apply to the box as a whole. For
+ instance, if a box contains two overlapping black circles and you draw the
+ box and, thus, the two circles normally with 50\% transparency, then the
+ overlap will be darker than the rest. By comparison, if the circles are
+ part of a transparency group, the overlap will get the same color as the
+ rest.
+\end{command}
+
+A transparency group can be \emph{isolated} and/or a \emph{knockout} group (see
+Sections~7.3.4 and 7.3.5 of the \textsc{pdf} Specification Version~1.7). Which
+of these is the case is dictated by the current settings of the following two
+ifs, which must be set before the above command is called:
+
+{\let\ifpgfsys@transparency@group@isolated=\relax
+\begin{command}{\ifpgfsys@transparency@group@isolated}
+ Determines whether a transparency group should be isolated.
+\end{command}
+}
+
+{\let\ifpgfsys@transparency@group@knockout=\relax
+\begin{command}{\ifpgfsys@transparency@group@knockout}
+ Determines whether a transparency group is a knockout group or not.
+\end{command}
+}
+
+\begin{command}{\pgfsys@fadingfrombox\marg{name}\marg{box}}
+ Declares the fading \meta{name}. The \meta{box} is a \TeX-box. Its
+ content's luminosity determines the opacity of the resulting fading. This
+ means that the lighter a pixel inside the box, the more opaque the fading
+ will be at this position.
+\end{command}
+
+\begin{command}{\pgfsys@usefading\meta{name}\marg{a}\marg{b}\marg{c}\marg{d}\marg{e}\marg{f}}
+ Installs a previously declared fading \meta{name} in the current graphics
+ state. Afterwards, all drawings will be masked by the fading. The fading
+ should be centered on the origin and have its original size, except that
+ the parameters \meta{a} to \meta{f} specify a transformation matrix that
+ should be applied additionally to the fading before it is installed. The
+ transformation should not apply to the following graphics, however.
+\end{command}
+
+\begin{command}{\pgfsys@definemask}
+ This command declares a fading (known as a soft mask in this context) based
+ on an image and for usage with images. It works similar to
+ |\pgfsys@defineimage|: Certain macros are set when the command is called.
+ The result should be to set the macro |\pgf@mask| to a pdf object count
+ that can subsequently be used as a transparency mask. The following macros
+ will be set when this command is invoked:
+ %
+ \begin{itemize}
+ \item \declare{|\pgf@filename|}
+ File name of the mask to be defined.
+ \item \declare{|\pgf@maskmatte|}
+ The so-called matte of the mask (see the \pdf\ documentation for
+ details). The matte is a color specification consisting of 1, 3 or
+ 4 numbers between 0 and 1. The number of numbers depends on the
+ number of color channels in the image (not in the mask!). It will
+ be assumed that the image has been preblended with this color.
+ \end{itemize}
+\end{command}
+
+
+\subsection{Animation Commands}
+
+The animation system layer command (|\pgfsys@anim...|) are described in a
+separate section, Section~\ref{section-pgfsys-anim}.
+
+
+\subsection{Object Identification System Commands}
+\label{section-sys-id}
+
+The system layer provides commands for adding identification labels (ids) to
+different objects in a graphic. These can be used for hyperlinking, which is
+needed for instance in conjunction with animations.
+
+The following ``objects'' can get an id assigned to them:
+%
+\begin{enumerate}
+ \item Graphic scopes (namely when |\pgfsys@begin@idscope| is called),
+ \item view boxes (namely when |\pgfsys@viewboxmeet| or
+ |\pgfsys@viewboxslice| are called),
+ \item paths (namely when |\pgfsys@fill|, |\pgfsys@stroke|, and so on are
+ called),
+ \item text boxes (namely when |\pgfsys@hbox| or |\pgfsys@hboxsynced| is
+ called), and
+ \item animations (namely when |\pgfsys@animate| is called).
+\end{enumerate}
+
+Creating and using ids is a two-step process. First, you create the id using
+|\pgfsys@new@id|, which stores a fresh id in a macro. You can now pass this id
+around and clone it. Then, at some point, you wish one of the above objects to
+actually get this id. For this, you use |\pgfsys@use@id| just \emph{before} the
+object since this command always influences the \emph{next} object.
+
+The basic id management gets more powerful when you use \emph{id types}. The
+idea is as follows: In reality, the objects from above do not get assigned only
+an id, but rather a combination of an id and a type -- and you can set the type
+independently of the id. This is used, for instance, to allow easy access to
+the different parts of a node in animations: Each node has a single id, but
+consists of several graphic objects (normally, at least a background path and a
+text). Each of these uses the same underlying id of the node, but the path has
+the type |path| (actually |background.path|) while the text has the type
+|text|. The advantage is that for each node only one id must be stored instead
+of a great number of the many different possible parts of a node.
+
+\begin{command}{\pgfsys@new@id\marg{macro}}
+ Creates a new id for later use and stores it in \meta{macro}. It is an
+ internal text created by the driver and may not be changed or modified.
+\end{command}
+
+\begin{command}{\pgfsys@use@id\marg{id}}
+ ``Uses'' an id previously created using |\pgfsys@new@id|. This causes the
+ \emph{next} graphic object to get the \meta{id} (not the current one). Once
+ used, the id-type-pair becomes \emph{invalid} and will not be attached to
+ any other graphics objects. It is, however, not an error to try this. If
+ \meta{id} is empty, no id-type-pair is attached to the next object.
+\end{command}
+
+\begin{command}{\pgfsys@use@type\marg{type}}
+ Changes the type used with the next graphic object. As mentioned earlier,
+ the id assigned to the next object is actually a pair consisting of the
+ currently used id and the currently used type.
+\end{command}
+
+\begin{command}{\pgfsys@append@type\marg{text}}
+ Appends the \meta{text} to the current type.
+\end{command}
+
+\begin{command}{\pgfsys@push@type}
+ Pushes the current type on a global ``stack of types'' without opening a
+ \TeX\ scope. The is useful when you temporarily wish to change the type
+ (for instance, by appending something to it), but you cannot create a new
+ scope.
+\end{command}
+
+\begin{command}{\pgfsys@pop@type}
+ Restores the most recently pushed type.
+\end{command}
+
+\begin{command}{\pgfsys@begin@idscope}
+ Starts a (graphics) scope whose sole purpose is to assign it an
+ id-type-pair so that it can be referenced later. Note that this command
+ does not always produce a graphics scope: If not id is currently in use or
+ if the id-type-pair has already been used, a graphic scope may or may not
+ be created as defined by the driver (but always a \TeX\ scope). This allows
+ drivers to minimize the number of graphic scopes created.
+
+ When an id scope is created, any code that has been ``attached'' to it
+ using |\pgfsys@attach@to@id| gets executed, see that command.
+
+ Note that |\pgfsys@beginscope| does not use the current id-type-pair. You
+ need to call this command to attach an id to a group.
+\end{command}
+
+\begin{command}{\pgfsys@end@idscope}
+ Ends the graphics id scope started by |\pgfsys@end@idscope|. It must nest
+ correctly with other graphic scopes and \TeX\ scopes.
+\end{command}
+
+\begin{command}{\pgfsys@attach@to@id\marg{id}\marg{type}\marg{begin code}\marg{end code}\marg{setup code}}
+ Attaches codes to the \meta{id}-\meta{type}-pair, where \meta{id} must have
+ been created using |\pgfsys@new@id|. The effect is that just before the id
+ scope for this pair is created, the \meta{setup code} is executed, then the
+ scope is started, then the \meta{begin code} is executed at the beginning,
+ and, finally, \meta{end code} gets executed just before the scope ends.
+ Multiple calls of this macro accumulated.
+\end{command}
+
+
+\subsection{Resource Description Framework Annotations (RDFa)}
+\label{section-sys-rdf}
+
+With certain output formats (in particular, with \textsc{svg}) you can insert
+annotations into the output file following the standard set by the
+\emph{resource description framework} (\textsc{rdf}), please consult the
+literature on \textsc{rdf} for an introduction to resource descriptions and
+ontologies.
+
+The support for \textsc{rdf} annotations works as follows in \pgfname: You use
+the following commands before you create an id scope (using
+|\pgfsys@begin@idscope|). Then the attributes set by the commands will be added
+as an annotation to that object. Here is an example:
+%
+\begin{codeexample}[code only]
+\pgfsys@rdf@resource{/fruits/apple}
+\pgfsys@begin@idscope
+ ...
+\pgfsys@end@idscope
+\end{codeexample}
+
+If \textsc{svg} output is produced, this results in the following code in the
+\textsc{svg} file:
+%
+\begin{codeexample}[code only]
+<g resource="/fruits/apple">
+ ...
+</g>
+\end{codeexample}
+
+Note that a call to |\pgfsys@begin@idscope| adds all the set attributes, but
+then clears the settings (globally). Thus, you should set all attributes more
+or less right before the id scope is created. For most of these command, if you
+call them multiple times before starting the id scope, the ``last call wins'',
+that is, later values overwrite earlier ones. In contrast, for the commands
+|\pgfsys@rdf@property|, |\pgfsys@rdf@rel|, |\pgfsys@rdf@rev|, as well as
+|\pgfsys@rdf@typeof|, the calls accumulate, that is, the texts passed in each
+call will all be added to the output, properly separated to form a list of
+values. Consider for instance:
+%
+\begin{codeexample}[code only]
+\pgfsys@rdf@resource{/fruits/apple}
+\pgfsys@rdf@resource{/fruits/watermelon}
+\pgfsys@rdf@property{http://foo.com/props/juicy}
+\pgfsys@rdf@property{http://foo.com/props/green}
+\pgfsys@begin@idscope
+ ...
+\pgfsys@end@idscope
+\end{codeexample}
+
+In the resulting id scope, we will have:
+%
+\begin{codeexample}[code only]
+<g resource="/fruits/watermelon"
+ property="http://foo.com/props/juicy http://foo.com/props/green">
+ ...
+</g>
+\end{codeexample}
+
+\begin{command}{\pgfsys@rdf@about\marg{text}}
+ Adds the \textsc{rdf} attribute |about="|\meta{text}|"| to the next id
+ scope (please see the \textsc{rdf}a specification for details on the
+ semantics of |about| in the context of the resource description framework).
+\end{command}
+
+The following commands work the same way as the above command, except that the
+set attribute is different. Please see the \textsc{rdf}a specification for
+details on these attributes. Note that the |\pgfsys@rdf@inlist| command is the
+only one that takes no argument.
+
+\begin{command}{\pgfsys@rdf@content\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@datatype\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@href\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@inlist}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@prefix\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@property\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@rel\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@resource\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@rev\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@src\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@typeof\marg{text}}
+\end{command}
+
+\begin{command}{\pgfsys@rdf@vocab\marg{text}}
+\end{command}
+
+
+\subsection{Reusable Objects System Commands}
+
+\begin{command}{\pgfsys@invoke\marg{literals}}
+ This command gets protocolled literals and should insert them into the
+ |.pdf| or |.dvi| file using an appropriate |\special|.
+\end{command}
+
+\begin{command}{\pgfsys@defobject\marg{name}\marg{lower left}\marg{upper right}\marg{code}}
+ Declares an object for later use. The idea is that the object can be
+ precached in some way and then be rendered more quickly when used several
+ times. For example, an arrow head might be defined and prerendered in this
+ way.
+
+ The parameter \meta{name} is the name for later use. \meta{lower left} and
+ \meta{upper right} are \pgfname\ points specifying a bounding box for the
+ object. \meta{code} is the code for the object. The code should not be too
+ fancy.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+\begin{command}{\pgfsys@useobject\marg{name}\marg{extra code}}
+ Renders a previously declared object. The first parameter is the name of
+ the object. The second parameter is extra code that should be executed
+ right \emph{before} the object is rendered. Typically, this will be some
+ transformation code.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+\begin{command}{\pgfsys@marker@declare\marg{macro}\marg{code}}
+ Declares a \emph{marker} symbol for later use. The command is very similar
+ to |\pgfsys@defobject|, but the use case is slightly different: The graphic
+ object defined using the \meta{code} is stored in such a way that it can be
+ used as an \emph{arrow tip marker symbol} in animations. The \meta{macro}
+ is set to an identifier by which the marker can be referenced later on.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+\begin{command}{\pgfsys@marker@use\marg{macro}}
+ Adds the marker object referenced by the \meta{macro} to the current
+ output.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+\end{command}
+
+
+\subsection{Invisibility System Commands}
+
+All drawing or stroking or text rendering between calls of the following
+commands should be suppressed. A similar effect can be achieved by clipping
+against an empty region, but the following commands do not open a graphics
+scope and can be opened and closed ``orthogonally'' to other scopes.
+
+\begin{command}{\pgfsys@begininvisible}
+ Between this command and the closing |\pgfsys@endinvisible| all output
+ should be suppressed. Nothing should be drawn at all, which includes all
+ paths, images and shadings. However, no groups (neither \TeX\ groups nor
+ graphic state groups) should be opened by this command.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+\begin{command}{\pgfsys@endinvisible}
+ Ends the invisibility section, unless invisibility blocks have been nested.
+ In this case, only the ``last'' one restores visibility.
+
+ This command has a default implementation and need not be implemented by a
+ driver file.
+
+ This command is protocolled, see Section~\ref{section-protocols}.
+\end{command}
+
+
+\subsection{Page Size Commands}
+
+The following commands can be used to set the page size of a document in a
+``portable'' way. Note, however, that many packages also (try to) set the page
+size.
+
+These commands are typically not given inside a |{pgfpicture}|, but on the
+outer level of compilation.
+
+\begin{command}{\pgfsys@papersize\marg{width}\marg{height}}
+ Inserts the necessary |\special|s for the current driver into the output
+ stream to ``locally'' change the page size. Whether such a ``local'' change
+ is possible depends strongly on the driver. For instance, |dvips| will
+ honor the first call to this command that is part of the shipped-out
+ document and will ignore all other uses. In contrast, |pdftex| will use the
+ current value of the paper size for each page and, additionally, setting
+ the papersize is local to the current \TeX\ group.
+\end{command}
+
+\begin{command}{\pgfsys@global@papersize\marg{width}\marg{height}}
+ Like the previous command, only for drivers where setting the paper size
+ parameters is a \TeX-group-local operation, |\global| is prefixed to the
+ setting of the page sizes.
+\end{command}
+
+\begin{command}{\pgfsys@thepageheight}
+ This macro expands to the current page's height, provided \LaTeX\ is used,
+ otherwise a best guess is returned (currently just |\the\vsize|).
+\end{command}
+
+\begin{command}{\pgfsys@thepagewidth}
+ As above.
+\end{command}
+
+
+\subsection{Position Tracking Commands}
+
+The following commands are used to determine the position of text on a page.
+This is a rather complicated process in general since at the moment when the
+text is read by \TeX, the final position cannot be determined, yet. For
+example, the text might be put in a box which is later put in the headline or
+perhaps in the footline or perhaps even on a different page.
+
+For these reasons, position tracking is typically a two-stage process. In a
+first stage you indicate that a certain position is of interest by
+\emph{marking} it. This will (depending on the details of the backend driver)
+cause page coordinates or this position to be written to an |.aux| file when
+the page is shipped. Possibly, the position might also be determined at an even
+later stage. Then, on a second run of \TeX, the position is read from the
+|.aux| file and can be used.
+
+\begin{command}{\pgfsys@markposition\marg{name}}
+ Marks a position on the page. This command should be given while normal
+ typesetting is done such as in
+ %
+\begin{codeexample}[code only]
+The value of $x$ is \pgfsys@markposition{here}important.
+\end{codeexample}
+ %
+ It causes the position |here| to be saved when the page is shipped out.
+\end{command}
+
+\begin{command}{\pgfsys@getposition\marg{name}\marg{macro}}
+ This command retrieves a position that has been marked on an earlier run of
+ \TeX\ on the current file. The \meta{macro} must be a macro name such as
+ |\mymacro|. It will be redefined such that it is
+ %
+ \begin{itemize}
+ \item either just |\relax| or
+ \item a |\pgfpoint...| command.
+ \end{itemize}
+ %
+ The first case will happen when the position has not been marked at all or
+ when the file is typeset for the first time, when the coordinates are not
+ yet available.
+
+ In the second case, executing \meta{macro} yields the position on the page
+ that is to be interpreted as follows: A coordinate like
+ |\pgfpoint{2cm}{3cm}| means ``2cm to the right and 3cm up from the origin
+ of the page''. The position of the origin of the page is not guaranteed to
+ be at the lower left corner, it is only guaranteed that all pictures on a
+ page use the same origin.
+
+ To determine the lower left corner of a page, you can call
+ |\pgfsys@getposition| with \meta{name} set to the special name
+ |pgfpageorigin|. By shifting all positions by the amount returned by this
+ call you can position things absolutely on a page.
+
+ \example Referencing a point of the page:
+ %
+\begin{codeexample}[code only]
+The value of $x$ is \pgfsys@markposition{here}important.
+
+Lots of text.
+
+\hbox{\pgfsys@markposition{myorigin}%
+\begin{pgfpicture}
+ % Switch of size protocol
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfusepath{use as bounding box}
+
+ \pgfsys@getposition{here}{\hereposition}
+ \pgfsys@getposition{myorigin}{\thispictureposition}
+
+ \pgftransformshift{\pgfpointscale{-1}{\thispictureposition}}
+ \pgftransformshift{\hereposition}
+
+ \pgfpathcircle{\pgfpointorigin}{1cm}
+ \pgfusepath{draw}
+\end{pgfpicture}}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Internal Conversion Commands}
+
+The system commands take \TeX\ dimensions as input, but the dimensions that
+have to be inserted into \pdf\ and PostScript files need to be dimensionless
+values that are interpreted as multiples of $\frac{1}{72}\mathrm{in}$. For
+example, the \TeX\ dimension $2bp$ should be inserted as |2| into a \pdf\ file
+and the \TeX\ dimension $10\mathrm{pt}$ as |9.9626401|. To make this conversion
+easier, the following command may be useful:
+
+\begin{command}{\pgf@sys@bp\marg{dimension}}
+ Inserts how many multiples of $\frac{1}{72}\mathrm{in}$ the
+ \meta{dimension} is into the current protocol stream (buffered).
+
+ \example |\pgf@sys@bp{\pgf@x}| or |\pgf@sys@bp{1cm}|.
+\end{command}
+
+Note that this command is \emph{not} a system command that can/needs to be
+overwritten by a driver.
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-overview.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-overview.tex
new file mode 100644
index 0000000000..ac6c3f1dca
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-overview.tex
@@ -0,0 +1,79 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Design of the System Layer}
+
+\makeatletter
+
+\subsection{Driver Files}
+\label{section-pgfsys}
+
+The \pgfname\ system layer mainly consists of a large number of commands
+starting with |\pgfsys@|. These commands will be called \emph{system commands}
+in the following. The higher layers ``interface'' with the system layer by
+calling these commands. The higher layers should never use |\special| commands
+directly or even check whether |\pdfoutput| is defined. Instead, all drawing
+requests should be ``channeled'' through the system commands.
+
+The system layer is loaded and set up by the following package:
+
+\begin{package}{pgfsys}
+ This file provides ``default implementations'' of all system commands, but
+ most simply produce a warning that they are not implemented. The actual
+ implementations of the system commands for a particular driver like, say,
+ |pdftex| reside in files called |pgfsys-xxxx.sty|, where |xxxx| is the
+ driver name. These will be called \emph{driver files} in the following.
+
+ When |pgfsys.sty| is loaded, it will try to determine which driver is used
+ by loading |pgf.cfg|. This file should set up the macro |\pgfsysdriver|
+ appropriately. The |pgfsys.sty| will input the appropriate
+ |pgfsys-|\meta{drivername}|.sty|.
+\end{package}
+
+\begin{command}{\pgfsysdriver}
+ This macro should expand to the name of the driver to be used by |pgfsys|.
+ The default from |pgf.cfg| is |pgfsys-\Gin@driver|. This is very likely to
+ be correct if you are using \LaTeX. For plain \TeX, the macro will be set
+ to |pgfsys-pdftex.def| if |pdftex| is used and to |pgfsys-dvips.def|
+ otherwise.
+\end{command}
+
+\begin{filedescription}{pgf.cfg}
+ This file should set up the command |\pgfsysdriver| correctly. If
+ |\pgfsysdriver| is already set to some value, the driver normally should
+ not change it. Otherwise, it should make a ``good guess'' at which driver
+ will be appropriate.
+\end{filedescription}
+
+The currently supported backend drivers are discussed in
+Section~\ref{section-drivers}.
+
+
+\subsection{Common Definition Files}
+
+Some drivers share many |\pgfsys@| commands. For the reason, files defining
+these ``common'' commands are available. These files are \emph{not} usable
+alone.
+
+\begin{filedescription}{pgfsys-common-postscript}
+ This file defines some |\pgfsys@| commands so that they produce appropriate
+ PostScript code.
+\end{filedescription}
+
+\begin{filedescription}{pgfsys-common-pdf}
+ This file defines some |\pgfsys@| commands so that they produce appropriate
+ \textsc{pdf} code.
+\end{filedescription}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-paths.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-paths.tex
new file mode 100644
index 0000000000..e432823121
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-paths.tex
@@ -0,0 +1,217 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{The Soft Path Subsystem}
+\label{section-soft-paths}
+
+\makeatletter
+
+This section describes a set of commands for creating \emph{soft paths} as
+opposed to the commands of the previous section, which created \emph{hard
+paths}. A soft path is a path that can still be ``changed'' or ``molded''. Once
+you (or the \pgfname\ system) is satisfied with a soft path, it is turned into
+a hard path, which can be inserted into the resulting |.pdf| or |.ps| file.
+
+Note that the commands described in this section are ``high-level'' in the
+sense that they are not implemented in driver files, but rather directly by the
+\pgfname-system layer. For this reason, the commands for creating soft paths do
+not start with |\pgfsys@|, but rather with |\pgfsyssoftpath@|. On the other
+hand, as a user you will never use these commands directly, they are described
+as part of the low-level interface.
+
+
+\subsection{Path Creation Process}
+
+When the user writes a command like |\draw (0bp,0bp) -- (10bp,0bp);| quite a
+lot happens behind the scenes:
+%
+\begin{enumerate}
+ \item The frontend command is translated by \tikzname\ into commands of the
+ basic layer. In essence, the command is translated to something like
+ %
+\begin{codeexample}[code only]
+\pgfpathmoveto{\pgfpoint{0bp}{0bp}}
+\pgfpathlineto{\pgfpoint{10bp}{0bp}}
+\pgfusepath{stroke}
+\end{codeexample}
+ %
+ \item The |\pgfpathxxxx| commands do \emph{not} directly call ``hard''
+ commands like |\pgfsys@xxxx|. Instead, the command |\pgfpathmoveto|
+ invokes a special command called |\pgfsyssoftpath@moveto| and
+ |\pgfpathlineto| invokes |\pgfsyssoftpath@lineto|.
+
+ The |\pgfsyssoftpath@xxxx| commands, which are described below,
+ construct a soft path. Each time such a command is used, special tokens
+ are added to the end of an internal macro that stores the soft path
+ currently being constructed.
+ \item When the |\pgfusepath| is encountered, the soft path stored in the
+ internal macro is ``invoked''. Only now does a special macro iterate
+ over the soft path. For each line-to or move-to operation on this path
+ it calls an appropriate |\pgfsys@moveto| or |\pgfsys@lineto| in order
+ to, finally, create the desired hard path, namely, the string of
+ literals in the |.pdf| or |.ps| file.
+ \item After the path has been invoked, |\pgfsys@stroke| is called to insert
+ the literal for stroking the path.
+\end{enumerate}
+
+Why such a complicated process? Why not have |\pgfpathlineto| directly call
+|\pgfsys@lineto| and be done with it? There are two reasons:
+%
+\begin{enumerate}
+ \item The \pdf\ specification requires that a path is not interrupted by
+ any non-path-construction commands. Thus, the following code will
+ result in a corrupted |.pdf|:
+ %
+\begin{codeexample}[code only]
+\pgfsys@moveto{0}{0}
+\pgfsys@setlinewidth{1}
+\pgfsys@lineto{10}{0}
+\pgfsys@stroke
+\end{codeexample}
+ %
+ Such corrupt code is \emph{tolerated} by most viewers, but not always.
+ It is much better to create only (reasonably) legal code.
+ \item A soft path can still be changed, while a hard path is fixed. For
+ example, one can still change the starting and end points of a soft
+ path or do optimizations on it. Such transformations are not possible
+ on hard paths.
+\end{enumerate}
+
+
+\subsection{Starting and Ending a Soft Path}
+
+No special action must be taken in order to start the creation of a soft path.
+Rather, each time a command like |\pgfsyssoftpath@lineto| is called, a special
+token is added to the (global) current soft path being constructed.
+
+However, you can access and change the current soft path. In this way, it is
+possible to store a soft path, to manipulate it, or to invoke it.
+
+\begin{command}{\pgfsyssoftpath@getcurrentpath\marg{macro name}}
+ This command will store the current soft path in \meta{macro name}.
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@setcurrentpath\marg{macro name}}
+ This command will set the current soft path to be the path stored in
+ \meta{macro name}. This macro should store a path that has previously been
+ extracted using the |\pgfsyssoftpath@getcurrentpath| command and has
+ possibly been modified subsequently.
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@invokecurrentpath}
+ This command will turn the current soft path in a ``hard'' path. To do so,
+ it iterates over the soft path and calls an appropriate |\pgfsys@xxxx|
+ command for each element of the path. Note that the current soft path is
+ \emph{not changed} by this command. Thus, in order to start a new soft path
+ after the old one has been invoked and is no longer needed, you need to set
+ the current soft path to be empty. This may seem strange, but it is often
+ useful to immediately use the last soft path again.
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@flushcurrentpath}
+ This command will invoke the current soft path and then set it to be empty.
+\end{command}
+
+
+\subsection{Soft Path Creation Commands}
+
+\begin{command}{\pgfsyssoftpath@moveto\marg{x}\marg{y}}
+ This command appends a ``move-to'' segment to the current soft path. The
+ coordinates \meta{x} and \meta{y} are given as normal \TeX\ dimensions.
+
+ \example One way to draw a line:
+ %
+\begin{codeexample}[code only]
+\pgfsyssoftpath@moveto{0pt}{0pt}
+\pgfsyssoftpath@lineto{10pt}{10pt}
+\pgfsyssoftpath@flushcurrentpath
+\pgfsys@stroke
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@lineto\marg{x}\marg{y}}
+ Appends a ``line-to'' segment to the current soft path.
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@curveto\marg{a}\marg{b}\marg{c}\marg{d}\marg{x}\marg{y}}
+ Appends a ``curve-to'' segment to the current soft path with controls
+ $(a,b)$ and $(c,d)$.
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@rect\marg{lower left x}\marg{lower left y}\marg{width}\marg{height}}
+ Appends a rectangle segment to the current soft path.
+\end{command}
+
+\begin{command}{\pgfsyssoftpath@closepath}
+ Appends a ``close-path'' segment to the current soft path.
+\end{command}
+
+
+\subsection{The Soft Path Data Structure}
+
+A soft path is stored in a standardized way, which makes it possible to modify
+it before it becomes ``hard''. Basically, a soft path is a long sequence of
+triples. Each triple starts with a \emph{token} that identifies what is going
+on. This token is followed by two dimensions in braces. For example, the
+following is a soft path that means ``the path starts at $(0\mathrm{bp},
+0\mathrm{bp})$ and then continues in a straight line to $(10\mathrm{bp},
+0\mathrm{bp})$''.
+%
+\begin{codeexample}[code only]
+\pgfsyssoftpath@movetotoken{0bp}{0bp}\pgfsyssoftpath@linetotoken{10bp}{0bp}
+\end{codeexample}
+
+A curve-to is hard to express in this way since we need six numbers to express
+it, not two. For this reasons, a curve-to is expressed using three triples as
+follows: The command
+%
+\begin{codeexample}[code only]
+\pgfsyssoftpath@curveto{1bp}{2bp}{3bp}{4bp}{5bp}{6bp}
+\end{codeexample}
+%
+\noindent results in the following three triples:
+%
+\begin{codeexample}[code only]
+\pgfsyssoftpath@curvetosupportatoken{1bp}{2bp}
+\pgfsyssoftpath@curvetosupportbtoken{3bp}{4bp}
+\pgfsyssoftpath@curvetotoken{5bp}{6bp}
+\end{codeexample}
+
+These three triples must always ``remain together''. Thus, a lonely
+|supportbtoken| is forbidden.
+
+In details, the following tokens exist:
+%
+\begin{itemize}
+ \item \declare{|\pgfsyssoftpath@movetotoken|} indicates a move-to
+ operation. The two following numbers indicate the position to which the
+ current point should be moved.
+ \item \declare{|\pgfsyssoftpath@linetotoken|} indicates a line-to
+ operation.
+ \item \declare{|\pgfsyssoftpath@curvetosupportatoken|} indicates the first
+ control point of a curve-to operation. The triple must be followed by a
+ |\pgfsyssoftpath@curvetosupportbtoken|.
+ \item \declare{|\pgfsyssoftpath@curvetosupportbtoken|} indicates the second
+ control point of a curve-to operation. The triple must be followed by a
+ |\pgfsyssoftpath@curvetotoken|.
+ \item \declare{|\pgfsyssoftpath@curvetotoken|} indicates the target of a
+ curve-to operation.
+ \item \declare{|\pgfsyssoftpath@rectcornertoken|} indicates the corner of a
+ rectangle on the soft path. The triple must be followed by a
+ |\pgfsyssoftpath@rectsizetoken|.
+ \item \declare{|\pgfsyssoftpath@rectsizetoken|} indicates the size of a
+ rectangle on the soft path.
+ \item \declare{|\pgfsyssoftpath@closepath|} indicates that the subpath
+ begun with the last move-to operation should be closed. The parameter
+ numbers are currently not important, but if set to anything different
+ from |{0pt}{0pt}|, they should be set to the coordinate of the original
+ move-to operation to which the path ``returns'' now.
+\end{itemize}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-protocol.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-protocol.tex
new file mode 100644
index 0000000000..4d3615e79d
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-pgfsys-protocol.tex
@@ -0,0 +1,89 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{The Protocol Subsystem}
+\label{section-protocols}
+
+\makeatletter
+
+This section describes commands for \emph{protocolling} literal text created by
+\pgfname. The idea is that some literal text, like the string of commands used
+to draw an arrow head, will be used over and over again in a picture. It is
+then much more efficient to compute the necessary literal text just once and to
+quickly insert it ``in a single sweep''.
+
+When protocolling is ``switched on'', there is a ``current protocol'' to which
+literal text gets appended. Once all commands that needed to be protocolled
+have been issued, the protocol can be obtained and stored using
+|\pgfsysprotocol@getcurrentprotocol|. At any point, the current protocol can be
+changed using a corresponding setting command. Finally,
+|\pgfsysprotocol@invokecurrentprotocol| is used to insert the protocolled
+commands into the |.pdf| or |.dvi| file.
+
+Only those |\pgfsys@| commands can be protocolled that use the command
+|\pgfsysprotocol@literal| internally. For example, the definition of
+|\pgfsys@moveto| in |pgfsys-common-pdf.def| is
+%
+\begin{codeexample}[code only]
+\def\pgfsys@moveto#1#2{\pgfsysprotocol@literal{#1 #2 m}}
+\end{codeexample}
+%
+All ``normal'' system-level commands can be protocolled. However, commands for
+creating or invoking shadings, images, or whole pictures require special
+|\special|'s and cannot be protocolled.
+
+\begin{command}{\pgfsysprotocol@literalbuffered\marg{literal text}}
+ Adds the \meta{literal text} to the current protocol, after it has been
+ ``|\edef|ed''. This command will always be protocolled.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@literal\marg{literal text}}
+ First calls |\pgfsysprotocol@literalbuffered| on \meta{literal text}. Then,
+ if protocolling is currently switched off, the \meta{literal text} is
+ passed on to |\pgfsys@invoke|.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@bufferedtrue}
+ Turns on protocolling. All subsequent calls of |\pgfsysprotocol@literal|
+ will append their argument to the current protocol.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@bufferedfalse}
+ Turns off protocolling. Subsequent calls of |\pgfsysprotocol@literal|
+ directly insert their argument into the current |.pdf| or |.ps|.
+
+ Note that if the current protocol is not empty when protocolling is
+ switched off, the next call to |\pgfsysprotocol@literal| will first flush
+ the current protocol, that is, insert it into the file.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@getcurrentprotocol\marg{macro name}}
+ Stores the current protocol in \meta{macro name} for later use.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@setcurrentprotocol\marg{macro name}}
+ Sets the current protocol to \meta{macro name}.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@invokecurrentprotocol}
+ Inserts the text stored in the current protocol into the |.pdf| or |.dvi|
+ file. This does \emph{not} change the current protocol.
+\end{command}
+
+\begin{command}{\pgfsysprotocol@flushcurrentprotocol}
+ First inserts the current protocol, then sets the current protocol to the
+ empty string.
+\end{command}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-actions.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-actions.tex
new file mode 100644
index 0000000000..03c619eb97
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-actions.tex
@@ -0,0 +1,1440 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Actions on Paths}
+
+\subsection{Overview}
+
+Once a path has been constructed, different things can be done with it. It can
+be drawn (or stroked) with a ``pen'', it can be filled with a color or shading,
+it can be used for clipping subsequent drawing, it can be used to specify the
+extend of the picture -- or any combination of these actions at the same time.
+
+To decide what is to be done with a path, two methods can be used. First, you
+can use a special-purpose command like |\draw| to indicate that the path should
+be drawn. However, commands like |\draw| and |\fill| are just abbreviations for
+special cases of the more general method: Here, the |\path| command is used to
+specify the path. Then, options encountered on the path indicate what should be
+done with the path.
+
+For example, |\path (0,0) circle (1cm);| means: ``This is a path consisting of
+a circle around the origin. Do not do anything with it (throw it away).''
+However, if the option |draw| is encountered anywhere on the path, the circle
+will be drawn. ``Anywhere'' is any point on the path where an option can be
+given, which is everywhere where a path command like |circle (1cm)| or
+|rectangle (1,1)| or even just |(0,0)| would also be allowed. Thus, the
+following commands all draw the same circle:
+%
+\begin{codeexample}[code only]
+\path [draw] (0,0) circle (1cm);
+\path (0,0) [draw] circle (1cm);
+\path (0,0) circle (1cm) [draw];
+\end{codeexample}
+%
+Finally, |\draw (0,0) circle (1cm);| also draws a path, because |\draw| is an
+abbreviation for |\path [draw]| and thus the command expands to the first line
+of the above example.
+
+Similarly, |\fill| is an abbreviation for |\path[fill]| and |\filldraw| is an
+abbreviation for the command |\path[fill,draw]|. Since options accumulate, the
+following commands all have the same effect:
+%
+\begin{codeexample}[code only]
+\path [draw,fill] (0,0) circle (1cm);
+\path [draw] [fill] (0,0) circle (1cm);
+\path [fill] (0,0) circle (1cm) [draw];
+\draw [fill] (0,0) circle (1cm);
+\fill (0,0) [draw] circle (1cm);
+\filldraw (0,0) circle (1cm);
+\end{codeexample}
+
+In the following subsection the different actions that can be performed on a
+path are explained. The following commands are abbreviations for certain sets
+of actions, but for many useful combinations there are no abbreviations:
+
+\begin{command}{\draw}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[draw]|.
+\end{command}
+
+\begin{command}{\fill}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[fill]|.
+\end{command}
+
+\begin{command}{\filldraw}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[fill,draw]|.
+\end{command}
+
+\begin{command}{\pattern}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[pattern]|.
+\end{command}
+
+\begin{command}{\shade}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[shade]|.
+\end{command}
+
+\begin{command}{\shadedraw}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[shade,draw]|.
+\end{command}
+
+\begin{command}{\clip}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[clip]|.
+\end{command}
+
+\begin{command}{\useasboundingbox}
+ Inside |{tikzpicture}| this is an abbreviation for |\path[use as bounding box]|.
+\end{command}
+
+
+\subsection{Specifying a Color}
+
+The most unspecific option for setting colors is the following:
+%
+\begin{key}{/tikz/color=\meta{color name}}
+ \indexoption{color option}%
+ This option sets the color that is used for fill, drawing, and text inside
+ the current scope. Any special settings for filling colors or drawing
+ colors are immediately ``overruled'' by this option.
+
+ The \meta{color name} is the name of a previously defined color. For
+ \LaTeX\ users, this is just a normal ``\LaTeX-color'' and the |xcolor|
+ extensions are allowed. Here is an example:
+ %
+\begin{codeexample}[]
+\tikz \fill[color=red!20] (0,0) circle (1ex);
+\end{codeexample}
+
+ It is possible to ``leave out'' the |color=| part and you can also write:
+ %
+\begin{codeexample}[]
+\tikz \fill[red!20] (0,0) circle (1ex);
+\end{codeexample}
+ %
+ What happens is that every option that \tikzname\ does not know, like
+ |red!20|, gets a ``second chance'' as a color name.
+
+ For plain \TeX\ users, it is not so easy to specify colors since plain
+ \TeX\ has no ``standardized'' color naming mechanism. Because of this,
+ \pgfname\ emulates the |xcolor| package, though the emulation is
+ \emph{extremely basic} (more precisely, what I could hack together in two
+ hours or so). The emulation allows you to do the following:
+ %
+ \begin{itemize}
+ \item Specify a new color using |\definecolor|. Only the two color
+ models |gray| and |rgb| are supported\footnote{Con\TeX t users
+ should be aware that \texttt{\textbackslash definecolor} has a
+ different meaning in Con\TeX t. There is a low-level equivalent
+ named \texttt{\textbackslash pgfutil@definecolor} which can be
+ used instead.}.
+ %
+ \example |\definecolor{orange}{rgb}{1,0.5,0}|
+ \item Use |\colorlet| to define a new color based on an old one.
+ Here, the |!| mechanism is supported, though only ``once'' (use
+ multiple |\colorlet| for more fancy colors).
+ %
+ \example |\colorlet{lightgray}{black!25}|
+ \item Use |\color|\marg{color name} to set the color in the current
+ \TeX\ group. |\aftergroup|-hackery is used to restore the color
+ after the group.
+ \end{itemize}
+\end{key}
+
+As pointed out above, the |color=| option applies to ``everything'' (except to
+shadings), which is not always what you want. Because of this, there are
+several more specialized color options. For example, the |draw=| option sets
+the color used for drawing, but does not modify the color used for filling.
+These color options are documented where the path action they influence is
+described.
+
+
+\subsection{Drawing a Path}
+
+You can draw a path using the following option:
+%
+\begin{key}{/tikz/draw=\meta{color} (default \normalfont is scope's color setting)}
+ Causes the path to be drawn. ``Drawing'' (also known as ``stroking'') can
+ be thought of as picking up a pen and moving it along the path, thereby
+ leaving ``ink'' on the canvas.
+
+ There are numerous parameters that influence how a line is drawn, like the
+ thickness or the dash pattern. These options are explained below.
+
+ If the optional \meta{color} argument is given, drawing is done using the
+ given \meta{color}. This color can be different from the current filling
+ color, which allows you to draw and fill a path with different colors. If
+ no \meta{color} argument is given, the last usage of the |color=| option is
+ used.
+
+ If the special color name |none| is given, this option causes drawing to be
+ ``switched off''. This is useful if a style has previously switched on
+ drawing and you locally wish to undo this effect.
+
+ Although this option is normally used on paths to indicate that the path
+ should be drawn, it also makes sense to use the option with a |{scope}| or
+ |{tikzpicture}| environment. However, this will \emph{not} cause all paths
+ to be drawn. Instead, this just sets the \meta{color} to be used for
+ drawing paths inside the environment.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path[draw=red] (0,0) -- (1,1) -- (2,1) circle (10pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+The following subsections list the different options that influence how a path
+is drawn. All of these options only have an effect if the |draw| option is
+given (directly or indirectly).
+
+
+\subsubsection{Graphic Parameters: Line Width, Line Cap, and Line Join}
+\label{section-cap-joins}
+
+\begin{key}{/tikz/line width=\meta{dimension} (initially 0.4pt)}
+ Specifies the line width. Note the space.
+ %
+\begin{codeexample}[]
+ \tikz \draw[line width=5pt] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{key}
+
+There are a number of predefined styles that provide more ``natural'' ways of
+setting the line width. You can also redefine these styles.
+
+\begin{stylekey}{/tikz/ultra thin}
+ Sets the line width to 0.1pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[ultra thin] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/very thin}
+ Sets the line width to 0.2pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[very thin] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/thin}
+ Sets the line width to 0.4pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[thin] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/semithick}
+ Sets the line width to 0.6pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[semithick] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/thick}
+ Sets the line width to 0.8pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[thick] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/very thick}
+ Sets the line width to 1.2pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[very thick] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/ultra thick}
+ Sets the line width to 1.6pt.
+ %
+\begin{codeexample}[]
+ \tikz \draw[ultra thick] (0,0) -- (1cm,1.5ex);
+\end{codeexample}
+ %
+\end{stylekey}
+
+ \label{section-line-cap}
+\begin{key}{/tikz/line cap=\meta{type} (initially butt)}
+ Specifies how lines ``end''. Permissible \meta{type} are |round|, |rect|,
+ and |butt|. They have the following effects:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \begin{scope}[line width=10pt]
+ \draw[line cap=round] (0,1 ) -- +(1,0);
+ \draw[line cap=butt] (0,.5) -- +(1,0);
+ \draw[line cap=rect] (0,0 ) -- +(1,0);
+ \end{scope}
+ \draw[white,line width=1pt]
+ (0,0 ) -- +(1,0) (0,.5) -- +(1,0) (0,1 ) -- +(1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/line join=\meta{type} (initially miter)}
+ Specifies how lines ``join''. Permissible \meta{type} are |round|, |bevel|,
+ and |miter|. They have the following effects:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=10pt]
+ \draw[line join=round] (0,0) -- ++(.5,1) -- ++(.5,-1);
+ \draw[line join=bevel] (1.25,0) -- ++(.5,1) -- ++(.5,-1);
+ \draw[line join=miter] (2.5,0) -- ++(.5,1) -- ++(.5,-1);
+ \useasboundingbox (0,1.5); % enlarge bounding box
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/miter limit=\meta{factor} (initially 10)}
+ When you use the miter join and there is a very sharp corner (a small
+ angle), the miter join may protrude very far over the actual joining
+ point. In this case, if it were to protrude by more than \meta{factor}
+ times the line width, the miter join is replaced by a bevel join.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=5pt]
+ \draw (0,0) -- ++(5,.5) -- ++(-5,.5);
+ \draw[miter limit=25] (6,0) -- ++(5,.5) -- ++(-5,.5);
+ \useasboundingbox (14,0); % make bounding box bigger
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsubsection{Graphic Parameters: Dash Pattern}
+
+\begin{key}{/tikz/dash pattern=\meta{dash pattern}}
+ Sets the dashing pattern. The syntax is the same as in \textsc{metafont}.
+ For example following pattern |on 2pt off 3pt on 4pt off 4pt| means ``draw
+ 2pt, then leave out 3pt, then draw 4pt once more, then leave out 4pt again,
+ repeat''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[dash pattern=on 2pt off 3pt on 4pt off 4pt]
+ \draw (0pt,0pt) -- (3.5cm,0pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/dash phase=\meta{dash phase} (initially 0pt)}
+ Shifts the start of the dash pattern by \meta{phase}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[dash pattern=on 20pt off 10pt]
+ \draw[dash phase=0pt] (0pt,3pt) -- (3.5cm,3pt);
+ \draw[dash phase=10pt] (0pt,0pt) -- (3.5cm,0pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/dash=\meta{dash pattern}|phase|\meta{dash phase}}
+ Sets the dashing pattern and phase at the same time.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [dash=on 20pt off 10pt phase 0pt] (0pt,3pt) -- (3.5cm,3pt);
+ \draw [dash=on 20pt off 10pt phase 10pt] (0pt,0pt) -- (3.5cm,0pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/dash expand off}
+ Makes the |off| part of a dash pattern expandable such that it can stretch.
+ This only works when there is a single |on| and a single |off| field and
+ requires the |decorations| library. Right now this option has to be
+ specified on the path where it is supposed to take effect after the |dash
+ pattern| option because the dash pattern has to be known at the point where
+ it is applied.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[|-|, dash pattern=on 4pt off 2pt]
+ \draw [dash expand off] (0pt,30pt) -- (26pt,30pt);
+ \draw [dash expand off] (0pt,20pt) -- (24pt,20pt);
+ \draw [dash expand off] (0pt,10pt) -- (22pt,10pt);
+ \draw [dash expand off] (0pt, 0pt) -- (20pt, 0pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+As for the line thickness, some predefined styles allow you to set the dashing
+conveniently.
+
+\begin{stylekey}{/tikz/solid}
+ Shorthand for setting a solid line as ``dash pattern''. This is the default.
+ %
+\begin{codeexample}[]
+\tikz \draw[solid] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/dotted}
+ Shorthand for setting a dotted dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[dotted] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/densely dotted}
+ Shorthand for setting a densely dotted dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[densely dotted] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/loosely dotted}
+ Shorthand for setting a loosely dotted dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[loosely dotted] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/dashed}
+ Shorthand for setting a dashed dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[dashed] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/densely dashed}
+ Shorthand for setting a densely dashed dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[densely dashed] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/loosely dashed}
+ Shorthand for setting a loosely dashed dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[loosely dashed] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/dash dot}
+ Shorthand for setting a dashed and dotted dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[dash dot] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/densely dash dot}
+ Shorthand for setting a densely dashed and dotted dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[densely dash dot] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/loosely dash dot}
+ Shorthand for setting a loosely dashed and dotted dash pattern.
+ %
+\begin{codeexample}[]
+\tikz \draw[loosely dash dot] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/dash dot dot}
+ Shorthand for setting a dashed and dotted dash pattern with more dots.
+ %
+\begin{codeexample}[]
+\tikz \draw[dash dot dot] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/densely dash dot dot}
+ Shorthand for setting a densely dashed and dotted dash pattern with more dots.
+ %
+\begin{codeexample}[]
+\tikz \draw[densely dash dot dot] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/loosely dash dot dot}
+ Shorthand for setting a loosely dashed and dotted dash pattern with more dots.
+ %
+\begin{codeexample}[]
+\tikz \draw[loosely dash dot dot] (0pt,0pt) -- (50pt,0pt);
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsubsection{Graphic Parameters: Draw Opacity}
+
+When a line is drawn, it will normally ``obscure'' everything behind it as if
+you had used perfectly opaque ink. It is also possible to ask \tikzname\ to use
+an ink that is a little bit (or a big bit) transparent using the |draw opacity|
+option. This is explained in Section~\ref{section-tikz-transparency} on
+transparency in more detail.
+
+
+\subsubsection{Graphic Parameters: Double Lines and Bordered Lines}
+
+\begin{key}{/tikz/double=\meta{core color} (default white)}
+ This option causes ``two'' lines to be drawn instead of a single one.
+ However, this is not what really happens. In reality, the path is drawn
+ twice. First, with the normal drawing color, secondly with the \meta{core
+ color}, which is normally |white|. Upon the second drawing, the line width
+ is reduced. The net effect is that it appears as if two lines had been
+ drawn and this works well even with complicated, curved paths:
+ %
+\begin{codeexample}[]
+\tikz \draw[double]
+ plot[smooth cycle] coordinates{(0,0) (1,1) (1,0) (0,1)};
+\end{codeexample}
+
+ You can also use the doubling option to create an effect in which a line
+ seems to have a certain ``border'':
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- (1,1);
+ \draw[draw=white,double=red,very thick] (0,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/double distance=\meta{dimension} (initially 0.6pt)}
+ Sets the distance the ``two'' lines are spaced apart. In reality, this is
+ the thickness of the line that is used to draw the path for the second
+ time. The thickness of the \emph{first} time the path is drawn is twice the
+ normal line width plus the given \meta{dimension}. As a side-effect, this
+ option ``selects'' the |double| option.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[very thick,double] (0,0) arc (180:90:1cm);
+ \draw[very thick,double distance=2pt] (1,0) arc (180:90:1cm);
+ \draw[thin,double distance=2pt] (2,0) arc (180:90:1cm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/double distance between line centers=\meta{dimension}}
+ This option works like |double distance|, only the distance is not the
+ distance between (inner) borders of the two main lines, but between their
+ centers. Thus, the thickness the \emph{first} time the path is drawn is the
+ normal line width plus the given \meta{dimension}, while the line width of
+ the \emph{second} line that is drawn is \meta{dimension} minus the normal
+ line width. As a side-effect, this option ``selects'' the |double| option.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[double distance between line centers=3pt]
+ \foreach \lw in {0.5,1,1.5,2,2.5}
+ \draw[line width=\lw pt,double] (\lw,0) -- ++(4mm,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[double distance=3pt]
+ \foreach \lw in {0.5,1,1.5,2,2.5}
+ \draw[line width=\lw pt,double] (\lw,0) -- ++(4mm,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{stylekey}{/tikz/double equal sign distance}
+ This style selects a double line distance such that it corresponds to the
+ distance of the two lines in an equal sign.
+ %
+\begin{codeexample}[]
+\Huge $=\implies$\tikz[baseline,double equal sign distance]
+ \draw[double,thick,-implies](0,0.55ex) --++(3ex,0);
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\normalsize $=\implies$\tikz[baseline,double equal sign distance]
+ \draw[double,-implies](0,0.6ex) --++(3ex,0);
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tiny $=\implies$\tikz[baseline,double equal sign distance]
+ \draw[double,very thin,-implies](0,0.5ex) -- ++(3ex,0);
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Adding Arrow Tips to a Path}
+\label{section-arrow-tip-action}
+
+In different situations, \tikzname\ will add arrow tips to the end of a path.
+For this to happen, a number of different things need to be specified:
+%
+\begin{enumerate}
+ \item You must have used the |arrows| key, explained in detail in
+ Section~\ref{section-tikz-arrows}, to setup which kinds of arrow tips
+ you would like.
+ \item The path may not be closed (like a circle or a rectangle) and, if
+ it consists of several subpath, further restrictions apply as
+ explained in Section~\ref{section-tikz-arrows}.
+ \item The |tips| key must be set to an appropriate value, see
+ Section~\ref{section-tikz-arrows} once more.
+\end{enumerate}
+
+For the current section on paths, it is only important that when you add the
+|tips| option to a path that is not drawn, arrow tips will still be added at
+the beginning and at the end of the current path. This is true even when
+``only'' arrow tips get drawn for a path without drawing the path itself. Here
+is an example:
+%
+\begin{codeexample}[width=2cm]
+\tikz \path[tips, -{Latex[open,length=10pt,bend]}] (0,0) to[bend left] (1,0);
+\end{codeexample}
+%
+\begin{codeexample}[width=2cm]
+\tikz \draw[tips, -{Latex[open,length=10pt,bend]}] (0,0) to[bend left] (1,0);
+\end{codeexample}
+
+
+\subsection{Filling a Path}
+\label{section-rules}
+
+To fill a path, use the following option:
+%
+\begin{key}{/tikz/fill=\meta{color} (default \normalfont is scope's color setting)}
+ This option causes the path to be filled. All unclosed parts of the path
+ are first closed, if necessary. Then, the area enclosed by the path is
+ filled with the current filling color, which is either the last color set
+ using the general |color=| option or the optional color \meta{color}. For
+ self-intersection paths and for paths consisting of several closed areas,
+ the ``enclosed area'' is somewhat complicated to define and two different
+ definitions exist, namely the nonzero winding number rule and the even odd
+ rule, see the explanation of these options, below.
+
+ Just as for the |draw| option, setting \meta{color} to |none| disables
+ filling locally.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \fill (0,0) -- (1,1) -- (2,1);
+ \fill (4,0) circle (.5cm) (4.5,0) circle (.5cm);
+ \fill[even odd rule] (6,0) circle (.5cm) (6.5,0) circle (.5cm);
+ \fill (8,0) -- (9,1) -- (10,0) circle (.5cm);
+\end{tikzpicture}
+\end{codeexample}
+
+ If the |fill| option is used together with the |draw| option (either
+ because both are given as options or because a |\filldraw| command is
+ used), the path is filled \emph{first}, then the path is drawn
+ \emph{second}. This is especially useful if different colors are selected
+ for drawing and for filling. Even if the same color is used, there is a
+ difference between this command and a plain |fill|: A ``filldrawn'' area
+ will be slightly larger than a filled area because of the thickness of the
+ ``pen''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[fill=yellow!80!black,line width=5pt]
+ \filldraw (0,0) -- (1,1) -- (2,1);
+ \filldraw (4,0) circle (.5cm) (4.5,0) circle (.5cm);
+ \filldraw[even odd rule] (6,0) circle (.5cm) (6.5,0) circle (.5cm);
+ \filldraw (8,0) -- (9,1) -- (10,0) circle (.5cm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Graphic Parameters: Fill Pattern}
+\label{section-fill-pattern}
+
+Instead of filling a path with a single solid color, it is also possible to
+fill it with a \emph{tiling pattern}. Imagine a small tile that contains a
+simple picture like a star. Then these tiles are (conceptually) repeated
+infinitely in all directions, but clipped against the path.
+
+Tiling patterns come in two variants: \emph{inherently colored patterns} and
+\emph{form-only patterns}. An inherently colored pattern is, say, a red star
+with a black border and will always look like this. A form-only pattern may
+have a different color each time it is used, only the form of the pattern will
+stay the same. As such, form-only patterns do not have any colors of their own,
+but when it is used the current \emph{pattern color} is used as its color.
+
+Patterns are not overly flexible. In particular, it is not possible to change
+the size or orientation of a pattern without declaring a new pattern. For
+complicated cases, it may be easier to use two nested |\foreach| statements to
+simulate a pattern, but patterns are rendered \emph{much} more quickly than
+simulated ones.
+
+\begin{key}{/tikz/pattern=\meta{name} (default \normalfont is scope's pattern)}
+ This option causes the path to be filled with a pattern. If the \meta{name}
+ is given, this pattern is used, otherwise the pattern set in the enclosing
+ scope is used. As for the |draw| and |fill| options, setting \meta{name} to
+ |none| disables filling locally.
+
+ The pattern works like a fill color. In particular, setting a new fill
+ color will fill the path with a solid color once more.
+
+ Strangely, no \meta{name}s are permissible by default. You need to load for
+ instance the |patterns| library, see
+ Section~\ref{section-library-patterns}, to install predefined patterns.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[pattern=dots] (0,0) circle (1cm);
+ \draw[pattern=fivepointed stars] (0,0) rectangle (3,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/pattern color=\meta{color}}
+ This option is used to set the color to be used for form-only patterns.
+ This option has no effect on inherently colored patterns.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[pattern color=red,pattern=fivepointed stars] (0,0) circle (1cm);
+ \draw[pattern color=blue,pattern=fivepointed stars] (0,0) rectangle (3,1);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \def\mypath{(0,0) -- +(0,1) arc (180:0:1.5cm) -- +(0,-1)}
+ \fill [red] \mypath;
+ \pattern[pattern color=white,pattern=bricks] \mypath;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Graphic Parameters: Interior Rules}
+
+The following two options can be used to decide how interior points should be
+determined:
+%
+\begin{key}{/tikz/nonzero rule}
+ If this rule is used (which is the default), the following method is used
+ to determine whether a given point is ``inside'' the path: From the point,
+ shoot a ray in some direction towards infinity (the direction is chosen
+ such that no strange borderline cases occur). Then the ray may hit the
+ path. Whenever it hits the path, we increase or decrease a counter, which
+ is initially zero. If the ray hits the path as the path goes ``from left to
+ right'' (relative to the ray), the counter is increased, otherwise it is
+ decreased. Then, at the end, we check whether the counter is nonzero (hence
+ the name). If so, the point is deemed to lie ``inside'', otherwise it is
+ ``outside''. Sounds complicated? It is.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \filldraw[fill=yellow!80!black]
+ % Clockwise rectangle
+ (0,0) -- (0,1) -- (1,1) -- (1,0) -- cycle
+ % Counter-clockwise rectangle
+ (0.25,0.25) -- (0.75,0.25) -- (0.75,0.75) -- (0.25,0.75) -- cycle;
+
+ \draw[->] (0,1) -- (.4,1);
+ \draw[->] (0.75,0.75) -- (0.3,.75);
+
+ \draw[->] (0.5,0.5) -- +(0,1) node[above] {crossings: $-1+1 = 0$};
+
+ \begin{scope}[yshift=-3cm]
+ \filldraw[fill=yellow!80!black]
+ % Clockwise rectangle
+ (0,0) -- (0,1) -- (1,1) -- (1,0) -- cycle
+ % Clockwise rectangle
+ (0.25,0.25) -- (0.25,0.75) -- (0.75,0.75) -- (0.75,0.25) -- cycle;
+
+ \draw[->] (0,1) -- (.4,1);
+ \draw[->] (0.25,0.75) -- (0.4,.75);
+
+ \draw[->] (0.5,0.5) -- +(0,1) node[above] {crossings: $1+1 = 2$};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/even odd rule}
+ This option causes a different method to be used for determining the inside
+ and outside of paths. While it is less flexible, it turns out to be more
+ intuitive.
+
+ With this method, we also shoot rays from the point for which we wish to
+ determine whether it is inside or outside the filling area. However, this
+ time we only count how often we ``hit'' the path and declare the point to
+ be ``inside'' if the number of hits is odd.
+
+ Using the even-odd rule, it is easy to ``drill holes'' into a path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \filldraw[fill=yellow!80!black,even odd rule]
+ (0,0) rectangle (1,1) (0.5,0.5) circle (0.4cm);
+ \draw[->] (0.5,0.5) -- +(0,1) [above] node{crossings: $1+1 = 2$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Graphic Parameters: Fill Opacity}
+\label{section-fill-opacity}
+
+Analogously to the |draw opacity|, you can also set the fill opacity. Please
+see Section~\ref{section-tikz-transparency} for more details.
+
+
+\subsection{Generalized Filling: Using Arbitrary Pictures to Fill a Path}
+
+Sometimes you wish to ``fill'' a path with something even more complicated than
+a pattern, let alone a single color. For instance, you might wish to use an
+image to fill the path or some other, complicated drawing. In principle, this
+effect can be achieved by first using the path for clipping and then,
+subsequently, drawing the desired image or picture. However, there is an option
+that makes this process much easier:
+
+\begin{key}{/tikz/path picture=\meta{code}}
+ When this option is given on a path and when the \meta{code} is not empty,
+ the following happens: After all other ``filling'' operations are done with
+ the path, which are caused by the options |fill|, |pattern| and |shade|, a
+ local scope is opened and the path is temporarily installed as a clipping
+ path. Then, the \meta{code} is executed, which can now draw something.
+ Then, the local scope ends and, possibly, the path is stroked, provided the
+ |draw| option has been given.
+
+ As with other keys like |fill| or |draw| this option needs to be given on a
+ path, setting the |path picture| outside a path has no effect (the path
+ picture is cleared at the beginning of each path).
+
+ The \meta{code} can be any normal \tikzname\ code like |\draw ...| or
+ |\node ...|. As always, when you include an external graphic, you need to
+ put it inside a |\node|.
+
+ Note that no special actions are taken to transform the origin in any way.
+ This means that the coordinate |(0,0)| is still where is was when the path
+ was being constructed and not -- as one might expect -- at the lower left
+ corner of the path. However, you can use the following special node to
+ access the size of the path:
+ %
+ \begin{predefinednode}{path picture bounding box}
+ This node is of shape |rectangle|. Its size and position are those of
+ |current path bounding box| just before the \meta{code} of the path
+ picture started to be executed. The \meta{code} can construct its own
+ paths, so accessing the |current path bounding box| inside the
+ \meta{code} yields the bounding box of any path that is currently being
+ constructed inside the \meta{code}.
+ \end{predefinednode}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \filldraw [fill=blue!10,draw=blue,thick] (1.5,1) circle (1)
+ [path picture={
+ \node at (path picture bounding box.center) {
+ This is a long text.
+ };}
+ ];
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[cross/.style={path picture={
+ \draw[black]
+ (path picture bounding box.south east) --
+ (path picture bounding box.north west)
+ (path picture bounding box.south west) --
+ (path picture bounding box.north east);
+ }}]
+ \draw [help lines] (0,0) grid (3,2);
+ \filldraw [cross,fill=blue!10,draw=blue,thick] (1,1) circle (1);
+ \path [cross,top color=red,draw=red,thick] (2,0) -- (3,2) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+ \begin{tikzpicture}[path image/.style={
+ path picture={
+ \node at (path picture bounding box.center) {
+ \includegraphics[height=3cm]{#1}
+ };}}]
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw [path image=brave-gnu-world-logo,draw=blue,thick]
+ (0,1) circle (1);
+ \draw [path image=brave-gnu-world-logo,draw=red,very thick,->]
+ (1,0) parabola[parabola height=2cm] (3,0);
+
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Shading a Path}
+
+You can shade a path using the |shade| option. A shading is like a filling,
+only the shading changes its color smoothly from one color to another.
+
+\begin{key}{/tikz/shade}
+ Causes the path to be shaded using the currently selected shading (more on
+ this later). If this option is used together with the |draw| option, then
+ the path is first shaded, then drawn.
+
+ It is not an error to use this option together with the |fill| option, but
+ it makes no sense.
+ %
+\begin{codeexample}[]
+\tikz \shade (0,0) circle (1ex);
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \shadedraw (0,0) circle (1ex);
+\end{codeexample}
+ %
+\end{key}
+
+For some shadings it is not really clear how they can ``fill'' the path. For
+example, the |ball| shading normally looks like this:
+\tikz \shade[shading=ball] (0,0) circle (0.75ex);. How is this supposed to
+shade a rectangle? Or a triangle?
+
+To solve this problem, the predefined shadings like |ball| or |axis| fill a
+large rectangle completely in a sensible way. Then, when the shading is used to
+``shade'' a path, what actually happens is that the path is temporarily used
+for clipping and then the rectangular shading is drawn, scaled and shifted such
+that all parts of the path are filled.
+
+The default shading is a smooth transition from gray to white and from top to
+bottom. However, other shadings are also possible, for example a shading that
+will sweep a color from the center to the corners outward. To choose the
+shading, you can use the |shading=| option, which will also automatically
+invoke the |shade| option. Note that this does \emph{not} change the shading
+color, only the way the colors sweep. For changing the colors, other options
+are needed, which are explained below.
+
+\begin{key}{/tikz/shading=\meta{name}}
+ This selects a shading named \meta{name}. The following shadings are
+ predefined: |axis|, |radial|, and |ball|.
+ %
+\begin{codeexample}[]
+\tikz \shadedraw [shading=axis] (0,0) rectangle (1,1);
+\tikz \shadedraw [shading=radial] (0,0) rectangle (1,1);
+\tikz \shadedraw [shading=ball] (0,0) circle (.5cm);
+\end{codeexample}
+
+ The shadings as well as additional shadings are described in more detail in
+ Section~\ref{section-library-shadings}.
+
+ To change the color of a shading, special options are needed like
+ |left color|, which sets the color of an axis shading from left to right.
+ These options implicitly also select the correct shading type, see the
+ following example
+ %
+\begin{codeexample}[]
+\tikz \shadedraw [left color=red,right color=blue]
+ (0,0) rectangle (1,1);
+\end{codeexample}
+
+ For a complete list of the possible options see
+ Section~\ref{section-library-shadings} once more.
+
+ \begin{key}{/tikz/shading angle=\meta{degrees} (initially 0)}
+ This option rotates the shading (not the path!) by the given angle. For
+ example, we can turn a top-to-bottom axis shading into a left-to-right
+ shading by rotating it by $90^\circ$.
+ %
+\begin{codeexample}[]
+\tikz \shadedraw [shading=axis,shading angle=90] (0,0) rectangle (1,1);
+\end{codeexample}
+ \end{key}
+\end{key}
+
+You can also define new shading types yourself. However, for this, you need to
+use the basic layer directly, which is, well, more basic and harder to use.
+Details on how to create a shading appropriate for filling paths are given in
+Section~\ref{section-shading-a-path}.
+
+
+\subsection{Establishing a Bounding Box}
+
+\pgfname\ is reasonably good at keeping track of the size of your picture and
+reserving just the right amount of space for it in the main document. However,
+in some cases you may want to say things like ``do not count this for the
+picture size'' or ``the picture is actually a little large''. For this you can
+use the option |use as bounding box| or the command |\useasboundingbox|, which
+is just a shorthand for |\path[use as bounding box]|.
+
+\begin{key}{/tikz/use as bounding box}
+ Normally, when this option is given on a path, the bounding box of the
+ present path is used to determine the size of the picture and the size of
+ all \emph{subsequent} paths are ignored. However, if there were previous
+ path operations that have already established a larger bounding box, it
+ will not be made smaller by this operation (consider the
+ |\pgfresetboundingbox| command to reset the previous bounding box).
+
+ In a sense, |use as bounding box| has the same effect as clipping all
+ subsequent drawing against the current path -- without actually doing the
+ clipping, only making \pgfname\ treat everything as if it were clipped.
+
+ The first application of this option is to have a |{tikzpicture}| overlap
+ with the main text:
+ %
+\begin{codeexample}[]
+Left of picture\begin{tikzpicture}
+ \draw[use as bounding box] (2,0) rectangle (3,1);
+ \draw (1,0) -- (4,.75);
+\end{tikzpicture}right of picture.
+\end{codeexample}
+
+ In a second application this option can be used to get better control over
+ the white space around the picture:
+ %
+\begin{codeexample}[]
+Left of picture
+\begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (3,1);
+ \fill (.75,.25) circle (.5cm);
+\end{tikzpicture}
+right of picture.
+\end{codeexample}
+
+ Note: If this option is used on a path inside a \TeX\ group (scope), the
+ effect ``lasts'' only until the end of the scope. Again, this behavior is
+ the same as for clipping.
+
+ Consider using |\useasboundingbox| together with |\pgfresetboundingbox| in
+ order to replace the bounding box with a new one.
+\end{key}
+
+There is a node that allows you to get the size of the current bounding box.
+The |current bounding box| node has the |rectangle| shape and its size is
+always the size of the current bounding box.
+
+Similarly, the |current path bounding box| node has the |rectangle| shape and
+the size of the bounding box of the current path.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[red] (0,0) circle (2pt);
+ \draw[red] (2,1) circle (3pt);
+
+ \draw (current bounding box.south west) rectangle
+ (current bounding box.north east);
+
+ \draw[red] (3,-1) circle (4pt);
+
+ \draw[thick] (current bounding box.south west) rectangle
+ (current bounding box.north east);
+\end{tikzpicture}
+\end{codeexample}
+
+Occasionally, you may want to align multiple |tikzpicture| environments
+horizontally and/or vertically at some prescribed position. The vertical
+alignment can be realized by means of the |baseline| option since \TeX\
+supports the concept of box depth natively. For horizontal alignment, things
+are slightly more involved. The following approach is realized by means of
+negative |\hspace|s before and/or after the picture, thereby removing parts of
+the picture. However, the actual amount of negative horizontal space is
+provided by means of image coordinates using the |trim left| and |trim right|
+keys:
+
+\begin{key}{/tikz/trim left=\meta{dimension or coordinate or \texttt{default}} (default 0pt)}
+ The |trim left| key tells \pgfname\space to discard everything which is
+ left of the provided \meta{dimension or coordinate}. Here, \meta{dimension}
+ is a single $x$ coordinate of the picture and \meta{coordinate} is a point
+ with $x$ and $y$ coordinates (but only its $x$ coordinate will be used).
+ The effect is the same as if you issue |\hspace{-s}| where |s| is the
+ difference of the picture's bounding box lower left $x$ coordinate and the
+ $x$ coordinate specified as \meta{dimension or coordinate}:
+ %
+\begin{codeexample}[]
+Text before image.%
+ \begin{tikzpicture}[trim left]
+ \draw (-1,-1) grid (3,2);
+ \fill (0,0) circle (5pt);
+ \end{tikzpicture}%
+Text after image.
+\end{codeexample}
+ %
+ Since |trim left| uses the default |trim left=0pt|, everything left of
+ $x=0$ is removed from the bounding box.
+
+ The following example has once the relative long label $-1$ and once the
+ shorter label $1$. Horizontal alignment is established with |trim left|:
+ %
+\begin{codeexample}[pre={\vbox\bgroup\hsize=5cm},post=\egroup,width=8cm]
+\begin{tikzpicture}
+ \draw (0,1) -- (0,0) -- (1,1) -- cycle;
+ \fill (0,0) circle (2pt);
+ \node[left] at (0,0) {$-1$};
+\end{tikzpicture}
+\par
+\begin{tikzpicture}
+ \draw (0,1) -- (0,0) -- (1,1) -- cycle;
+ \fill (0,0) circle (2pt);
+ \node[left] at (0,0) {$1$};
+\end{tikzpicture}
+\par
+\begin{tikzpicture}[trim left]
+ \draw (0,1) -- (0,0) -- (1,1) -- cycle;
+ \fill (0,0) circle (2pt);
+ \node[left] at (0,0) {$-1$};
+\end{tikzpicture}
+\par
+\begin{tikzpicture}[trim left]
+ \draw (0,1) -- (0,0) -- (1,1) -- cycle;
+ \fill (0,0) circle (2pt);
+ \node[left] at (0,0) {$1$};
+\end{tikzpicture}
+\end{codeexample}
+
+ Use |trim left=default| to reset the value.
+\end{key}
+
+\begin{key}{/tikz/trim right=\meta{dimension or coordinate or \texttt{default}}}
+ This key is similar to |trim left|: it discards everything which is right
+ of the provided \meta{dimension or coordinate}. As for |trim left|,
+ \meta{dimension} denotes a single $x$ coordinate of the picture and
+ \meta{coordinate} a coordinate with $x$ and $y$ value (although only its
+ $x$ component will be used).
+
+ We use the same example from above and add |trim right|:
+ %
+\begin{codeexample}[]
+Text before image.%
+ \begin{tikzpicture}[trim left, trim right=2cm, baseline]
+ \draw (-1,-1) grid (3,2);
+ \fill (0,0) circle (5pt);
+ \end{tikzpicture}%
+Text after image.
+\end{codeexample}
+ %
+ In addition to |trim left=0pt|, we also discard everything which is right
+ of $x$|=2cm|. Furthermore, the |baseline| key supports vertical alignment
+ as well (using the $y$|=0cm| baseline).
+
+ Use |trim right=default| to reset the value.
+\end{key}
+
+Note that |baseline|, |trim left| and |trim right| are currently the
+\emph{only} supported way of truncated bounding boxes which are compatible with
+image externalization (see the |external| library for details).
+
+\begin{key}{/pgf/trim lowlevel=\mchoice{true,false} (initially false)}
+ This affects only the basic level image externalization: the initial
+ configuration |trim lowlevel=false| stores the normal image, without
+ trimming, and the trimming into a separate file. This allows reduced
+ bounding boxes without clipping the rest away. The |trim lowlevel=true|
+ information causes the image externalization to store the trimmed image,
+ possibly resulting in clipping.
+\end{key}
+
+
+\subsection{Clipping and Fading (Soft Clipping)}
+
+\emph{Clipping path} means that all painting on the page is restricted to a
+certain area. This area need not be rectangular, rather an arbitrary path can
+be used to specify this area. The |clip| option, explained below, is used to
+specify the region that is to be used for clipping.
+
+A \emph{fading} (a term that I propose, fadings are commonly known as soft
+masks, transparency masks, opacity masks or soft clips) is similar to clipping,
+but a fading allows parts of the picture to be only ``half clipped''. This
+means that a fading can specify that newly painted pixels should be partly
+transparent. The specification and handling of fadings is a bit complex and it
+is detailed in Section~\ref{section-tikz-transparency}, which is devoted to
+transparency in general.
+
+\begin{key}{/tikz/clip}
+ This option causes all subsequent drawings to be clipped against the
+ current path and the size of subsequent paths will not be important for the
+ picture size. If you clip against a self-intersecting path, the even-odd
+ rule or the nonzero winding number rule is used to determine whether a
+ point is inside or outside the clipping region.
+
+ The clipping path is a graphic state parameter, so it will be reset at the
+ end of the current scope. Multiple clippings accumulate, that is, clipping
+ is always done against the intersection of all clipping areas that have
+ been specified inside the current scopes. The only way of enlarging the
+ clipping area is to end a |{scope}|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[clip] (0,0) circle (1cm);
+ \fill[red] (1,0) circle (1cm);
+\end{tikzpicture}
+\end{codeexample}
+
+ It is usually a \emph{very} good idea to apply the |clip| option only to
+ the first path command in a scope.
+
+ If you ``only wish to clip'' and do not wish to draw anything, you can use
+ the |\clip| command, which is a shorthand for |\path[clip]|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \clip (0,0) circle (1cm);
+ \fill[red] (1,0) circle (1cm);
+\end{tikzpicture}
+\end{codeexample}
+
+ To keep clipping local, use |{scope}| environments as in the following
+ example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- ( 0:1cm);
+ \draw (0,0) -- (10:1cm);
+ \draw (0,0) -- (20:1cm);
+ \draw (0,0) -- (30:1cm);
+ \begin{scope}[fill=red]
+ \fill[clip] (0.2,0.2) rectangle (0.5,0.5);
+
+ \draw (0,0) -- (40:1cm);
+ \draw (0,0) -- (50:1cm);
+ \draw (0,0) -- (60:1cm);
+ \end{scope}
+ \draw (0,0) -- (70:1cm);
+ \draw (0,0) -- (80:1cm);
+ \draw (0,0) -- (90:1cm);
+\end{tikzpicture}
+\end{codeexample}
+
+ There is a slightly annoying catch: You cannot specify certain graphic
+ options for the command used for clipping. For example, in the above code
+ we could not have moved the |fill=red| to the |\fill| command. The reasons
+ for this have to do with the internals of the \pdf\ specification. You do
+ not want to know the details. It is best simply not to specify any options
+ for these commands.
+\end{key}
+
+
+\subsection{Doing Multiple Actions on a Path}
+
+If more than one of the basic actions like drawing, clipping and filling are
+requested, they are automatically applied in a sensible order: First, a path is
+filled, then drawn, and then clipped (although it took Apple two mayor
+revisions of their operating system to get this right\dots). Sometimes,
+however, you need finer control over what is done with a path. For instance,
+you might wish to first fill a path with a color, then repaint the path with a
+pattern and then repaint it with yet another pattern. In such cases you can use
+the following two options:
+
+\begin{key}{/tikz/preaction=\meta{options}}
+ This option can be given to a |\path| command (or to derived commands like
+ |\draw| which internally call |\path|). Similarly to options like |draw|,
+ this option only has an effect when given to a |\path| or as part of the
+ options of a |node|; as an option to a |{scope}| it has no effect.
+
+ When this option is used on a |\path|, the effect is the following: When
+ the path has been completely constructed and is about to be used, a scope
+ is created. Inside this scope, the path is used but not with the original
+ path options, but with \meta{options} instead. Then, the path is used in
+ the usual manner. In other words, the path is used twice: Once with
+ \meta{options} in force and then again with the normal path options in
+ force.
+
+ Here is an example in which the path consists of a rectangle. The main
+ action is to draw this path in red (which is why we see a red rectangle).
+ However, the preaction is to draw the path in blue, which is why we see a
+ blue rectangle behind the red rectangle.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \draw
+ [preaction={draw,line width=4mm,blue}]
+ [line width=2mm,red] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that when the preactions are preformed, then the path is already
+ ``finished''. In particular, applying a coordinate transformation to the
+ path has no effect. By comparison, applying a canvas transformation does
+ have an effect. Let us use this to add a ``shadow'' to a path. For this, we
+ use the preaction to fill the path in gray, shifted a bit to the right and
+ down:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw
+ [preaction={fill=black,opacity=.5,
+ transform canvas={xshift=1mm,yshift=-1mm}}]
+ [fill=red] (0,0) rectangle (1,2)
+ (1,2) circle (5mm);
+\end{tikzpicture}
+\end{codeexample}
+
+ Naturally, you would normally create a style |shadow| that contains the
+ above code. The shadow library, see Section~\ref{section-libs-shadows},
+ contains predefined shadows of this kind.
+
+ It is possible to use the |preaction| option multiple times. In this case,
+ for each use of the |preaction| option, the path is used again (thus, the
+ \meta{options} do not accumulate in a single usage of the path). The path
+ is used in the order of |preaction| options given.
+
+ In the following example, we use one |preaction| to add a shadow and
+ another to provide a shading, while the main action is to use a pattern.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw [pattern=fivepointed stars]
+ [preaction={fill=black,opacity=.5,
+ transform canvas={xshift=1mm,yshift=-1mm}}]
+ [preaction={top color=blue,bottom color=white}]
+ (0,0) rectangle (1,2)
+ (1,2) circle (5mm);
+\end{tikzpicture}
+\end{codeexample}
+
+ A complicated application is shown in the following example, where the path
+ is used several times with different fadings and shadings to create a
+ special visual effect:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [
+ % Define an interesting style
+ button/.style={
+ % First preaction: Fuzzy shadow
+ preaction={fill=black,path fading=circle with fuzzy edge 20 percent,
+ opacity=.5,transform canvas={xshift=1mm,yshift=-1mm}},
+ % Second preaction: Background pattern
+ preaction={pattern=#1,
+ path fading=circle with fuzzy edge 15 percent},
+ % Third preaction: Make background shiny
+ preaction={top color=white,
+ bottom color=black!50,
+ shading angle=45,
+ path fading=circle with fuzzy edge 15 percent,
+ opacity=0.2},
+ % Fourth preaction: Make edge especially shiny
+ preaction={path fading=fuzzy ring 15 percent,
+ top color=black!5,
+ bottom color=black!80,
+ shading angle=45},
+ inner sep=2ex
+ },
+ button/.default=horizontal lines light blue,
+ circle
+ ]
+
+ \draw [help lines] (0,0) grid (4,3);
+
+ \node [button] at (2.2,1) {\Huge Big};
+ \node [button=crosshatch dots light steel blue,
+ text=white] at (1,1.5) {Small};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/postaction=\meta{options}}
+ The postactions work in the same way as the preactions, only they are
+ applied \emph{after} the main action has been taken. Like preactions,
+ multiple |postaction| options may be given to a |\path| command, in which
+ case the path is reused several times, each time with a different set of
+ options in force.
+
+ If both pre- and postactions are specified, then the preactions are taken
+ first, then the main action, and then the post actions.
+
+ In the first example, we use a postaction to draw the path, after it has
+ already been drawn:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \draw
+ [postaction={draw,line width=2mm,blue}]
+ [line width=4mm,red,fill=white] (0,0) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ In another example, we use a postaction to ``colorize'' a path:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw
+ [postaction={path fading=south,fill=white}]
+ [postaction={path fading=south,fading angle=45,fill=blue,opacity=.5}]
+ [left color=black,right color=red,draw=white,line width=2mm]
+ (0,0) rectangle (1,2)
+ (1,2) circle (5mm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Decorating and Morphing a Path}
+
+Before a path is used, it is possible to first ``decorate'' and/or ``morph''
+it. Morphing means that the path is replaced by another path that is slightly
+varied. Such morphings are a special case of the more general ``decorations''
+described in detail in Section~\ref{section-tikz-decorations}. For instance, in
+the following example the path is drawn twice: Once normally and then in a
+morphed (=decorated) manner.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) rectangle (3,2);
+ \draw [red, decorate, decoration=zigzag]
+ (0,0) rectangle (3,2);
+\end{tikzpicture}
+\end{codeexample}
+
+Naturally, we could have combined this into a single command using pre- or
+postaction. It is also possible to deform shapes:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circular drop shadow={shadow scale=1.05},minimum size=3.13cm,
+ decorate, decoration=zigzag,
+ fill=blue!20,draw,thick,circle] {Hello!};
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-animations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-animations.tex
new file mode 100644
index 0000000000..6a7f606f43
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-animations.tex
@@ -0,0 +1,2602 @@
+% Copyright 2015 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Animations}
+\label{section-tikz-animations}
+
+\begin{tikzlibrary}{animations}
+ This library must be loaded in order to use animations with \tikzname.
+\end{tikzlibrary}
+
+
+\subsection{Introduction}
+
+An \emph{animation} changes the appearance of some part of a graphic over time.
+The archetypical animation is, of course, a \emph{movement} of some part of a
+picture, but a change of, say, the opacity of a path is also an animation.
+\tikzname\ allows you to specify such animations using special keys and
+notations.
+%
+\begin{codeexample}[width=8cm,animation list={0.7,1.4,2.1,2.8},animation scale=.25]
+\begin{tikzpicture}[
+ animate/orbit/.style 2 args = {
+ myself:shift = {
+ along = {
+ (0,0) circle [radius=#1]
+ } sloped in #2s/10,
+ repeats }} ]
+
+ \node :color = {0s = "orange",
+ 2s = "red",
+ 4s = "orange",
+ repeats}
+ {Sun};
+
+ \begin{scope}[animate={orbit={2.5cm}{365}}]
+ \node {Earth};
+ \node [animate={orbit={1cm}{28}}] {Moon};
+ \end{scope}
+
+ \useasboundingbox (-3.8,-3.8) (3.8,3.8);
+\end{tikzpicture}
+\end{codeexample}
+
+Adding an animation to a \tikzname\ picture is done as follows:
+%
+\begin{enumerate}
+ \item \emph{Before} or \emph{in the options of} the to-be-animated object
+ you specify the object together with an \emph{attribute} that you wish
+ to animate. Attributes are things like the fill color or the line width
+ or the position of the object.
+ \item You specify \emph{when} this attribute should have \emph{which}
+ values using a so-called \emph{timeline}. This is just a curve that
+ specifies for each point in time which value the attribute should have.
+ \item You can additionally use further options to configure the animation,
+ for instance you can specify that the animation should repeat or that
+ it should only start when a certain object is clicked.
+\end{enumerate}
+
+As a simple example, let us move a circle within thirty seconds by three
+centimeters to the left:
+%
+\begin{codeexample}[width=2cm]
+\tikz \draw :xshift = {0s = "0cm", 30s = "-3cm", repeats} (0,0) circle (5mm);
+\end{codeexample}
+
+As can be seen, a special syntax is used in several places: Entries with a
+colon such as |:xshift| specify an attribute, values are specified in quotation
+marks. This syntax will be explained in more detail later on.
+
+
+\subsubsection{Animations Change Attributes}
+
+Before we plunge into the details of how animations are specified, it is
+important to understand what \tikzname\ actually does when creating an
+animation: It does \emph{not} (as all other animation packages do) precompute a
+sequence of pictures that are later somehow displayed in rapid succession.
+Neither does it insert an external video into the document. Rather, a
+\tikzname\ animation is just an ``annotation'' in the output that a certain
+attribute of a certain object should change over time in some specific way when
+the object is displayed. It is the job of the document viewer application to
+actually compute and display the animation. The big advantage of this approach
+is that animations neither increase the output file sizes noticeably nor do
+they really slow down \TeX: The hard and complicated calculations are done by
+the viewer application. The disadvantage is, of course, that a document viewer
+application must understand the annotations and actually compute and display
+the animations. The \textsc{svg} format is a format for which this is possible,
+the popular \textsc{pdf} format is not. For the \textsc{svg} format, there are
+actually different possible ways of ``formulating'' the animations (using
+\textsc{smil} or \textsc{css} or JavaScript) and they have different advantages
+and disadvantages.
+
+To make a long story short: \tikzname\ animations currently work only with
+\textsc{svg} output (and use the \textsc{smil} ``flavor'' of describing
+animations). In future, it may well happen that other ``flavor'' of describing
+animations will be added, but it is very unlikely that \textsc{pdf} will ever
+support animations in a useful way.
+
+It is, however, possible to create ``snapshots'' of an animation and insert
+these into \textsc{pdf} files (or any other kind of file including \textsc{svg}
+files), see Section~\ref{section-anim-snap} for details. Snapshots are also
+useful for creating ``printed versions'' of animations and all of the small
+sequences of pictures in the manual that are used for showing what an animation
+key does have been creating using snapshots.
+
+
+\subsubsection{Limitations of the Animation System}
+
+There are a certain limitations of the animation system that you should keep in
+mind when considering how and when to use it:
+%
+\begin{enumerate}
+ \item As pointed out earlier, animations require a specific output format
+ (currently only \textsc{svg} is supported).
+ \item It is extremely difficult to animate ``lines between moving nodes''
+ correctly. Consider code like |\draw(a)--(b);| where |a| and |b| are
+ nodes. Now, when you animate the position of~|(a)|, the line connecting
+ |(a)| and |(b)| will, unfortunately, not ``move along'' automatically
+ (but it is easy to move the whole group of |(a)|, |(b)|, and the
+ connecting line as whole). You must ``cheat'' and introduce some
+ ``virtual'' nodes, which leads to rather complex and bloated code.
+ \item Animations are taken into consideration for bounding box computations,
+ but only for shifts, not for rotations, scaling, or skewing and also
+ possibly not when multiple shifts are active at the same time for the
+ same object.
+\end{enumerate}
+
+
+\subsubsection{Concepts: (Graphic) Objects}
+
+During an animation an attribute of a certain ``object'' changes over time. The
+term ``object'' is deliberately a bit vague since there are numerous different
+``things'' whose attributes can change. In detail, the following objects have
+attributes that can be animated:
+%
+\begin{enumerate}
+ \item Nodes, which are created by the |\node| command (and, also,
+ internally by commands such as |\graph|). For nodes, different parts of
+ the node can be animated separately; for instance, you can animate the
+ color of the background path, but also the color of the text, and also
+ the color of the foreground path (though most nodes do not have a
+ foreground path) and also the color of different text parts (though
+ only few nodes have multiple text parts).
+ \item Graphic scopes, which are created by numerous command, including the
+ |{scope}| environment, the |\scopes| command, but also |\tikz| itself
+ creates a graphic scope and so does each node and even each path.
+ \item View boxes, which can only be created using the |view| library.
+ \item Paths, which you create using the |\path| command or commands like
+ |\draw| that call |\path| internally. However, the (usually background)
+ path of a node can also be animated. Note that ``animating the path''
+ really means that the path itself should change over time; in essence,
+ you can ``warp'' a path over time.
+\end{enumerate}
+
+In all of these cases, you must either specify the animation inside the
+object's options using |animate| or use the |name| key to name the object and,
+then, refer to it in an |animate|. For nodes you can, of course, use the
+|(|\meta{node name}|)| syntax to name the node. Recall that you must
+\emph{always} specify the animation \emph{before} the object is created; it is
+not possible to animate an already created object.
+
+There is a special syntax for choosing the object of an animation, see
+Section~\ref{section-anim-syntax-obj}, but you can also use the |object| key to
+choose them directly, see Section~\ref{section-anim-def-obj}.
+
+
+\subsubsection{Concepts: Attributes}
+
+In addition to the to-be-animated object, you must also choose an
+\emph{attribute} that you wish to animate. Attributes are things like the color
+of an object, the position, but also things like the line width. The syntax for
+choosing attributes and the list of attributes will be explained in detail
+later on.
+
+Most attributes correspond directly to attributes that are directly supported
+by the backend driver (\textsc{svg}), but this is not always the case. For
+instance, for a node, \tikzname\ differentiates between the fill color, the
+draw (stroke) color, and the text color, while \textsc{svg} treats the text
+color are a special case of the fill color. \tikzname\ will do some internal
+mappings to ensure that you can animate the ``\tikzname\ attributes'' even when
+they are not directly supported.
+
+The same syntax that is used for specifying object is also used to specify
+attributes, see Section~\ref{section-anim-syntax-obj}, but you could also set
+them directly using the |attribute| key see
+Section~\ref{section-anim-def-attr}.
+
+
+\subsubsection{Concepts: Timelines}
+
+Once an object and an attribute have been chosen, a \emph{timeline} needs to be
+established. This is, essentially, a curve that specifies for each ``moment in
+time'' which value the attribute should have.
+
+A timeline has a \emph{start} and an \emph{end}, but the start need not be the
+``moment zero'' (we will come to that) and may even be negative, while the end
+may be at infinity. You specify the timeline by specifying for certain points
+in time what the value is at that moment; for all other moments the value is
+then interpolated. For instance, if you specify that the attribute |:xshift|
+(the ``horizontal position'' of the object) is 0\,mm at time 5\,s and 10\,mm at
+time 10\,s, then at 7.5\,s it will be 5\,mm and at 9\,s it will be 8\,mm
+(assuming a linear interpolation). The resulting optical effect will be that
+the object \emph{smoothly moves} by one centimeter to the right over a period
+of five seconds, starting five seconds after ``moment zero''.
+
+Now, what is the ``moment zero'', the ``beginning of an animation''? If nothing
+else is specified, an animation starts immediately when the graphic is shown
+and this is the moment zero relative to which the timeline is measured.
+However, it is also possible to change this. In particular, you can specify
+that the moment zero is when a particular \emph{event} occurs such as the user
+clicking on another object or another animation ending or starting.
+
+The interpolation of values is not always a straightforward affair. Firstly,
+for certain kinds of values is not clear how an interpolation should be
+computed. How does one interpolate between two paths? Between the colors red
+and green? Between the values |"true"| and |"false"|? In these cases, one must
+define carefully what the interpolation should be. Secondly, you may wish to
+use a non-linear interpolation, which is useful for ``easing'' motions: The
+visual effect of the movement specified above is that the object sits still
+from moment $0$ for five seconds, then there is an ``infinite acceleration''
+causing the object to suddenly move at the speed of 2\,mm per second, then
+there is no acceleration at all for five seconds, causing the object to move
+for one centimeter, followed by an ``infinite negative acceleration'' that
+makes the object come to a full stop. As a viewer you experience these infinite
+accelerations as ``unrealistic'', spoiling the effect of watching a (virtual)
+physical process. Non-linear interpolations allow you to avoid this effect.
+
+Just as for specifying objects and attributes, there is also a special syntax
+for specifying times and values.
+
+
+\subsection{Creating an Animation}
+
+\subsubsection{The Animate Key}
+
+In order to animate a picture, you create timelines for all objects and
+attributes that change during the animation. The key |animate| is used for
+creating these timelines.
+
+\begin{key}{/tikz/animate=\meta{animation specification}}
+ You must place all specifications of animations inside uses of |animate|.
+ You can, and usually should, place the specification of all timelines of a
+ single picture inside a single use of this key since it will reset the time
+ and the fork time (explained in Section~\ref{section-anim-def-times}). You
+ can, however, use this key several times, in principle. Note that if you
+ animate the same attribute of the same object in two different uses of
+ |animate|, two separate timelines will result (and complicated rules are
+ used to determine which one ``wins'' in case they specify conflicting
+ values for the attribute at different times).
+
+ The key can be used at all places where a \tikzname\ key is used; typically
+ you will use it with a |{scope}| environment, inside the options of a node,
+ or directly with the |\tikz| command:
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2}]
+\tikz \node [fill, text = white, animate = {
+ myself:fill = {0s = "red", 2s = "blue", begin on = click }}] {Click me};
+\end{codeexample}
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2}]
+\tikz [animate = {a node:fill = {0s = "red", 2s = "blue",
+ begin on = click}}]
+ \node (a node) [fill, text = white] {Click me};
+\end{codeexample}
+
+ The details of what, exactly, happens in the \meta{animation specification}
+ will be described in the rest of this section. However, basically, an
+ \meta{animation specification} is just a sequence of normal \tikzname\
+ key--value pairs that get executed with the path prefix |/tikz/animate| and
+ with some special syntax handlers installed. In particular, you can define
+ styles for this key path and use them. For instance, we can define a
+ |shake| animation like this:
+ %
+\begin{codeexample}[width=4cm]
+\tikzset{
+ animate/shake/.style = {myself:xshift = { begin on=click,
+ 0s = "0mm", 50ms = "#1", 150ms = "-#1", 250ms = "#1", 300ms = "0mm" }}}
+\tikz \node [fill = blue!20, draw=blue, very thick, circle,
+ animate = {shake = 1mm}] {Shake};
+\tikz \node [fill = blue!20, draw=blue, very thick, circle,
+ animate = {shake = 2mm}] {SHAKE};
+\end{codeexample}
+
+ Note that, as stressed earlier, you can only use the |animate| key to
+ specify animations for objects that do not yet exist. The node and object
+ names mentioned in a specification always refer to ``upcoming'' objects;
+ already existing objects of the same name are not influenced.
+
+ You can use the |name| key inside |animate| to ``name'' the animation. Once
+ named, you can later reference the animation in other animations; for
+ instance, you can say that another animation should start when the present
+ animation has ended.
+\end{key}
+
+
+\subsubsection{Timeline Entries}
+
+The ``job'' of the options passed to the |animate| key is to specify the
+timelines of the animation of (a part of) a picture. For each object and each
+attribute there may or may not be a timeline and, if present, the timeline
+consist of sequences of pairs of times and values. Thus, the most basic entity
+of an animation specification is a tuple consisting of five parts, which are
+selected by five different keys:
+%
+\begin{itemize}
+ \item |object| for selecting the object,
+ \item |attribute| for selecting the attribute,
+ \item |id| for selecting the timeline id (explained in
+ Section~\ref{section-anim-def-id}),
+ \item |time| for selecting a time, and
+ \item |value| for selecting a value.
+\end{itemize}
+%
+When all of these parts have been set up (using the above keys, which will be
+explained in more detail in a moment), you can use the following key to create
+an entry:
+
+\begin{key}{/tikz/animate/entry}
+ Each time this key is used in the options of |animate|, \tikzname\ checks
+ whether the five keys |object|, |attribute|, |id|, |time|, and |value| are
+ set. If one of them is not set, nothing happens. (The |id| key is set to
+ the value |default| by default, all other keys must be set explicitly.)
+
+ If all of these keys are set, a \emph{time--value} pair is created and
+ added to the timeline of attribute of the object. Additionally, all options
+ starting with |/tikz/animate/options/|, which also influence the timeline
+ like |begin on|, are also added to the timeline of the object--attribute
+ pair.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = {
+ object = node, attribute = fill, time = 0s, value = red, entry,
+ object = node, attribute = fill, time = 2s, value = blue, entry,
+ object = node, attribute = fill, begin on = click, entry}]
+ \node (node) [fill, text=white] { Click me };
+\end{codeexample}
+ %
+ In the above example, it would not have been necessary the specify the
+ object and the attribute in each line, they retain their values unless they
+ are overwritten. Thus, we could also have written:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = {
+ object = node, attribute = fill, time = 0s, value = red, entry,
+ time = 2s, value = blue, entry,
+ begin on = click, entry}]
+ \node (node) [fill, text=white] { Click me };
+\end{codeexample}
+ %
+ Note, however, that in both examples we actually add the time--value pair
+ $(2\mathrm{s}, \mathrm{blue})$ twice since the |time| and |value| keys also
+ retain their settings and, thus, for the third |entry| they have the same
+ values as before and a new pair is added. While this superfluous pair is
+ not a problem in the example (it has no visual effect), we will see later
+ on how such pairs can be avoided by using the |scope| key.
+
+ A sequence of calls of |entry| can freely switch between objects and
+ attributes (that is, between timelines), but the times for any given
+ timeline must be given in non-decreasing order:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = {
+ object = node, attribute = fill, time = 0s, value = red, entry,
+ object = node2, attribute = draw, entry,
+ object = node, attribute = fill, time = 2s, value = blue, entry,
+ object = node2, attribute = draw, entry,
+ object = node, attribute = fill, begin on = click, entry,
+ object = node2, attribute = draw, begin on = click, entry}] {
+ \node (node) [fill, text=white] { Node 1 };
+ \node (node2) [draw, ultra thick] at (0,-1) { Node 2 };
+}
+\end{codeexample}
+ %
+ In the above example, we could not have exchanged the first two lines of
+ the |animate| options with the third and fourth line since the values for
+ time |0s| must come before the values for time |2s|.
+\end{key}
+
+In the following, we have a closer look at the five keys the influence the
+|entry| key and then have a look at ways of grouping keys more easily.
+
+
+\subsubsection{Specifying Objects}
+\label{section-anim-def-obj}
+
+You use the |object| key to select the object(s) to which the next use of
+|entry| applies. There is also a special syntax for this, which is explained in
+Section~\ref{section-anim-syntax-obj}.
+
+\begin{key}{/tikz/animate/object=\meta{list of objects}}
+ The \meta{list of objects} is a comma-separated list of strings of the form
+ \meta{object}\opt{|.|\meta{type}}. All of the objects in the list are
+ selected as to-be-animate object for the next use of the |entry| key. The
+ objects referred to by \meta{object} will be the \emph{next} objects with
+ the |name| key set to \meta{object}. You can apply the |name| key to nodes
+ (where you can also use the special parentheses-syntax and put the name in
+ parentheses, it has the same effect), but also to scopes and paths. (The
+ |name path| key is not the same as |name|; it is an older key from the
+ intersections package and not related.)
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = { object = b, :fill = {0s = "red", 2s = "blue",
+ begin on = click }}] {
+ \node (a) [fill, text = white, minimum width=1.5cm] at (0,1cm) {a};
+ \node (b) [fill, text = white, minimum width=1.5cm] at (0,5mm) {b};
+ \node (c) [fill, text = white, minimum width=1.5cm] at (0,0mm) {c}; }
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = { object = b, :fill = {0s = "red", 2s = "blue",
+ begin on = click },
+ object = c, :fill = {0s = "green", 2s = "blue",
+ begin on = click } }] {
+ \scoped [name = a, yshift=1cm] \fill (0,0) rectangle (1.5cm,2mm);
+ \scoped [name = b, yshift=5mm] \fill (0,0) rectangle (1.5cm,2mm);
+ \scoped [name = c, yshift=0mm] \fill (0,0) rectangle (1.5cm,2mm); }
+\end{codeexample}
+
+ If the \meta{object} name is never used later in the file, no animation is
+ created.
+
+ The \meta{object} may also be the special text |myself|. In this case, the
+ referenced object is the scope or object to which the |animate| key is
+ given. If an object is named |myself| (as in |\node (myself) ...|), you
+ cannot reference this node using the |object| key, |myself| \emph{always}
+ refers to the object where the |animate| key is given (of course, you can
+ animate the node named |myself| by placing the |animate| key inside the
+ options of this node; you only cannot ``remotely'' add an animation to it).
+
+ The \meta{object} may be followed by a dot and a \emph{type}. This is need
+ in rare cases where you want to animate only a special ``part'' of an
+ object that is not accessible in other ways. Normally, \tikzname\ takes
+ care of choosing these types automatically, you only need to set these ``if
+ you know what you are doing''.
+\end{key}
+
+
+\subsubsection{Specifying Attributes}
+\label{section-anim-def-attr}
+
+\begin{key}{/tikz/animate/attribute=\meta{list of attributes}}
+ The list of attributes must be a comma-separated list of attribute names.
+ The timelines specified later will apply to all of these attributes (and to
+ all objects previously selected using |object|). Possible attributes
+ include colors, positions, line width, but even the paths themselves. The
+ exact list of possible attributes is documented in
+ Section~\ref{section-anim-attrs}.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = {attribute = fill, n: = { 0s = "red", 2s = "blue",
+ begin on = click } }]
+ \node (n) [fill, text = white] {The node};
+\end{codeexample}
+\end{key}
+
+
+\subsubsection{Specifying IDs}
+\label{section-anim-def-id}
+
+\begin{key}{/tikz/animate/id=\meta{id} (initially default)}
+ Timelines are use to defined how the values of an attribute of an object
+ change over time. In many cases, you will have at most one timeline for
+ each object--attribute pair, but, sometimes, you may wish to have more than
+ one timeline for the same object and the same attribute. For instance, you
+ might have a timeline that specifies a changing |shift| of a node in some
+ direction and, at the same time, another timeline that specifies an
+ additional |shift| in some other direction(s). The problem is that there is
+ only one |shift| attribute and it would be difficult to compute the joint
+ effect of the two timelines.
+
+ For this purpose, timelines are actually identified not only by the
+ object--attribute pair but, in reality, by the triple consisting of the
+ object, the attribute, and the value of this key. We can now specify two
+ separate timelines:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = {
+ id = 1, n:shift = { 0s = "{(0,0)}", 2s = "{(0,5mm)}", begin on = click },
+ id = 2, n:shift = { 0s = "{(0,0)}", 2s = "{(5mm,0)}", begin on = click }
+}]
+ \node (n) [fill = blue!20, draw=blue, very thick] {The node};
+\end{codeexample}
+
+ The default value of |id| is |default|.
+\end{key}
+
+Because of the possibility of creating multiple timelines for the same
+attribute, it may happen that there is more than one timeline active that is
+``trying to modify'' a given attribute. In this case, the following rules are
+used to determine, which timeline ``wins'':
+%
+\begin{enumerate}
+ \item If no animation is active at the current time (all animation either
+ have not yet started or they have already ended), then the |base| value
+ given in the animation encountered last in the code is used. (If there
+ are no base values, the attribute is taken from the surrounding scope
+ and the animations have ``no effect''.)
+ \item If there are several active animations, the one that has started last
+ is used and its value is used.
+ \item If there are several active animations that have started at the same
+ time, the one that comes last in the code is used.
+\end{enumerate}
+
+Note that these rules do not apply to transformations of the canvas since these
+are always additive (or, phrased differently, they are always all active and
+the effects accumulate).
+
+
+\subsubsection{Specifying Times}
+\label{section-anim-def-times}
+
+\begin{key}{/tikz/animate/time=\meta{time}\opt{|later|}}
+ Sets the time for the next time--value pair in a call of |entry| to
+ \meta{time} plus the current fork time. The text |later| is optional. Both
+ ``fork times'' and the optional |later| will be explained in a moment.
+
+ \medskip\textbf{Time Parsing.}
+ The \meta{time} is parsed using the command |\pgfparsetime|, which is
+ essentially the same as the usual math parser of \tikzname, and the result
+ is interpreted as a time in seconds. Thus, a \meta{time} of |2+3| means ``5
+ seconds'' and a \meta{time} of |2*(2.1)| means ``4.2 seconds''. (You could
+ even specify silly times like |1in|, which results in the time ``72.27
+ seconds''. Please do not do that.) The ``essentially'' refers to the fact
+ that some extras are installed when the time parser is running:
+ %
+ \begin{itemize}
+ \item The postfix operator |s| is added, which has no effect. Thus,
+ when you write |5s| you get the same results as |5|, which is
+ exactly 5 seconds as desired.
+ \item The postfix operator |ms| is added, which divides a number by
+ 1000, so |2ms| equals 0.002s.
+ \item The postfix operator |min| is added, which multiplies a number by
+ 60.
+ \item The postfix operator |h| is added, which multiplies a number by
+ 3600.
+ \item The infix operator |:| is redefined, so that it multiplies its
+ first argument by 60 and adds the second. This implies that |1:20|
+ equals 80s and |01:00:00| equals 3600s.
+ \item The parsing of octal numbers is switched off to allow things like
+ |01:08| for 68s.
+ \end{itemize}
+
+ Note that you cannot use the colon syntax for times in things like
+ |01:20 = "0"| would (falsely) be interpreted as: ``For the object named |01|
+ and its attribute named |20|, do something.'' You can, however, use |01:20|
+ in arguments to the |time| key, meaning that you would have to write
+ instead: |time = 1:20, "0"|, possibly surround by a |scope|.
+
+ \medskip\textbf{Relative Times.}
+ You can suffix a |time| key with ``|later|''. In this case, the \meta{time}
+ is interpreted as an offset to the time in the previous use of the time
+ key:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :fill = { begin on = click,
+ 0s = "white",
+ 500ms later = "red",
+ 500ms later = "green", % same as 1s = "-5mm"
+ 500ms later = "blue"} % same as 1.5s = "-2.5mm"
+ [fill=blue!20, draw=blue, very thick, circle] {Click me};
+\end{codeexample}
+
+ In reality, the offset is not taken to just any previous use of the |time|
+ key, but to the most recent use of this key or of the |resume| key in the
+ current local \TeX\ scope. Here is an example:
+ %
+\begin{codeexample}[code only]
+time = 2s,
+time = 1s later, % same as time = 3s
+time = 500ms later, % same as time = 3.5s
+time = 4s,
+time = 1s later, % same as time = 5s
+scope = { % opens a local scope
+ time = 1s later, % same as time = 6s
+ time = 10s
+ time = 1s later % same as time = 11s
+}, % closes the scope, most recent time is 5s once more
+time = 2s later % same as time = 7s
+\end{codeexample}
+
+ \medskip\textbf{Fork Times.}
+ The time meant by the value \meta{time} passed to the |time| key is not
+ used directly. Rather, \tikzname\ adds the current \emph{fork time} to it,
+ which is |0s| by default. You can change the fork time using the following
+ key:
+ %
+ \begin{key}{/tikz/animate/fork=\meta{t} (default 0s later)}
+ Sets the fork time for the local scope to \meta{t} and sets the current
+ time to |0s|. In this scope, when you use ``absolute'' times like |0s|
+ or |2s|, you actually refer to later times that have started as
+ \meta{t}.
+
+ One application of forks is in the definition of keys that add a
+ certain part to a longer animation. Consider for instance the
+ definition of a |hilight| key:
+ %
+\begin{codeexample}[animation list={1.05,1.1,1.15,1.2,2.05,2.1,2.15,2.2}]
+\tikz [animate/highlight/.style = {
+ scope = { fork = #1,
+ :fill = { 0s = "black", 0.1s = "white", 0.2s = "black"} }
+ }]
+ \node [animate = { myself: = {
+ :fill = { 0s = "black", begin on = click },
+ highlight = 1s, highlight = 2s } },
+ fill = blue, text=white, very thick, circle] { Click me };
+\end{codeexample}
+ %
+ In the above example, we could also have written |0.1s later| instead
+ of |0.2s| and, indeed, the whole style could have been defined using
+ only times with |later|, eliminating the need for the |fork| key.
+ However, using forks you can specify absolute times for things
+ happening in a conceptual ``subprocess'' and also relative times. The
+ name |fork| for the key is also borrowed from operating system theory,
+ where a ``fork'' is the spawning of an independent process.
+ \end{key}
+
+ \medskip\textbf{Remembering and Resuming Times.}
+ When you have a complicated animation with a long timeline, you will
+ sometimes wish to start some animation when some other animation has
+ reached a certain moment; but this moment is only reached through heavy use
+ of |later| times and/or forks. In such situations, the following keys are
+ useful:
+ %
+ \begin{key}{/tikz/animate/remember=\meta{macroname}}
+ This key stores the current time (the time of the last use of the
+ |time| key) globally in the macro \meta{macroname}. This time will
+ include the offset of the fork time:
+ %
+\begin{codeexample}[code only]
+time = 2s,
+fork = 2s later, % fork time is now 4s
+time = 1s, % local time is 1s, absolute time is 5s (1s + fork time)
+time = 1s later, % local time is 2s, absolute time is 6s (2s + fork time)
+remember = \mytime % \mytime is now 6s
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/animate/resume=\meta{absolute time}}
+ The \meta{absolute time} is evaluated using |\pgfparsetime| and, then,
+ the current time is set to the resulting time minus the fork time. When
+ the \meta{absolute time} is a macro previously set using |remember|,
+ the net effect of this is that we return to the exact ``moment'' in the
+ global time line when |remember| was used.
+ %
+\begin{codeexample}[code only]
+fork = 4s,
+time = 1s,
+remember = \mytime % \mytime is now 5s
+fork = 2s, % fork time is now 2s, local time is 0s
+resume = \mytime % fork time is still 2s, local time is 3s
+\end{codeexample}
+ %
+ Using resume you can easily implement a ``join'' operation for forked
+ times. You simply remember the times at the ends of the forks and then
+ resume the maximum time of these remembered times:
+ %
+\begin{codeexample}[code only]
+scope = {
+ fork,
+ time = 1s later,
+ ...
+ remember = \forka
+},
+scope = {
+ fork,
+ time = 5s later,
+ ...
+ remember = \forkb
+},
+scope = {
+ fork,
+ time = 2s later,
+ ...
+ remember = \forkc
+},
+resume = {max(\forka,\forkb,\forkc)} % "join" the three forks
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsubsection{Values}
+\label{section-anim-def-values}
+
+\begin{key}{/tikz/animate/value=\meta{value}}
+ This key sets the value of the next time--value pair created by |entry| to
+ \meta{value}. The syntax of the \meta{value} is not fixed, it depends on
+ the type of the attribute. For instance, for an attribute like |opacity|
+ the \meta{value} must be an expression that can be evaluated to a number
+ between 0 and 1; for the attribute |color| the \meta{value} must, instead,
+ be a color; and so on. Take care that when a value contains a comma, you
+ must surround it by braces as in |"{(1,1)}"|.
+
+ The allowed texts for the \meta{value} is always the same as the one you
+ would pass to the \tikzname\ option of the same name. For instance, since
+ the \tikzname\ option |shift| expects a coordinate, you use coordinates as
+ \meta{value} with the usual \tikzname\ syntax (including all sorts of
+ extensions, the animation system calls the standard \tikzname\ parsing
+ routines). The same is true of dimensions, scalar values, colors, and so
+ on.
+
+ In addition to the values normally use for setting the attribute, you can
+ also (sometimes) use the special text |current value| as \meta{value}. This
+ means that the value of the point in the timeline should be whatever the
+ value the attribute has at the beginning of the timeline. For instance,
+ when you write
+ %
+\begin{codeexample}[code only]
+animate = { obj:color = { 0s = "current value", 2s = "white" } }
+\end{codeexample}
+ %
+ the color of |obj| will change from whatever color it currently has to
+ white in two seconds. This is especially useful when several animations are
+ triggered by user events and the current color of |obj| cannot be
+ determined beforehand.
+
+ There are several limitations on the use of the text |current value|, which
+ had to be imposed partly because of the limited support of this feature in
+ \textsc{svg}:
+ %
+ \begin{itemize}
+ \item You can use |current value| only with the first time in a
+ timeline.
+ \item You can only have two times in a timeline that starts with
+ |current value|.
+ \item You cannot use |current value| for timelines of which you wish to
+ take a snapshot.
+ \end{itemize}
+\end{key}
+
+
+\subsubsection{Scopes}
+\label{section-anim-scopes}
+
+When you specify multiple timelines at the same time, it is often useful and
+sometimes even necessary to have keys be set only locally. The following key
+makes this easy:
+
+\begin{key}{/tikz/animate/scope=\meta{options}}
+ Executed the \meta{options} inside a \TeX\ scope. In particular, all
+ settings made inside the scope have no effect after the end of the |scope|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node [animate = { myself: = { begin on = click,
+ scope = { attribute = fill, repeats = 3, 0s = "red", 2s = "red!50" },
+ scope = { attribute = draw, 0s = "red", 2s = "red!50" }
+ }},
+ fill=blue!20, draw=blue, very thick, circle] {Click me};
+\end{codeexample}
+
+ Without the use of the |scope| key, the |repeats| key would also affect the
+ draw attribute.
+\end{key}
+
+While the |scope| key is useful for structuring timeline code, it also keeps
+the current time local to the scope, that is, if you use something like
+|1s later| after the scope, this will refer to one second after the last use of
+|time| \emph{before} the scope. The times set inside the |scope| do not matter.
+While this is desirable effect for forks, you may also sometimes wish to
+synchronize the local time after the scope with the last time reached in the
+scope. The following key makes this easy:
+
+\begin{key}{/tikz/animate/sync=\meta{options}}
+ A shorthand for |scope={| \meta{options} |, remember=\temp},resume=\temp|
+ where |\temp| is actually an internal name. The effect is that after a
+ |sync| the local time just continues as if the scope where not present --
+ but regarding everything else the effects are local to the |sync| scope.
+\end{key}
+
+
+\subsection{Syntactic Simplifications}
+\label{section-anim-syntax-animate}
+
+In the previous subsection we saw how timelines can be created by specifying
+the individual entries of the timelines sequentially. However, most of the time
+you will wish to use a simpler syntax that makes it easier to specify
+animations. This syntax is only available inside the |animate| key (it is
+switched on at the beginning) and consists of three ``parts'': The colon
+syntax, the time syntax, and the quote syntax.
+
+
+\subsubsection{The Colon Syntax I: Specifying Objects and Attributes}
+\label{section-anim-syntax-obj}
+
+Inside the \meta{animation specification} passed to the |animate| key, you can
+specify an object and an attribute of this object using the following syntax,
+whose use is detected by the presence of a colon inside a key:
+%
+\begin{quote}
+ \normalfont
+ \opt{\meta{object name(s)}}|:|\opt{\meta{attribute(s)}}
+ |={|\meta{options}|}|
+
+ or
+
+ \opt{\meta{object
+ name(s)}}|:|\opt{\meta{attribute(s)}}|_|\opt{\meta{id}}
+ |={|\meta{options}|}|
+\end{quote}
+%
+In the place to the left of an equal sign, where you would normally use a key,
+you can instead place an object name and an attribute separated by a colon.
+Additionally, the attribute may be followed by an underscore and an \meta{id},
+which identifies the timeline (see Section~\ref{section-anim-def-id}).
+
+Each of these values may be missing, in which case it is not changed from its
+previous value.
+
+The effect of the above code is the same as:
+%
+\begin{quote}
+ \normalfont
+ |sync = { object = |\meta{objects}|, attribute = |\meta{attribute}|, id = |\meta{id}|, |\meta{options}|, entry }|
+\end{quote}
+%
+although when the object, the attribute, or the id is left empty in the colon
+syntax, the corresponding setting will be missing in the above call of |sync|.
+Note that because of the |sync| the last time used inside the \meta{options}
+will be available afterwards as the last time. Also note that an |entry| is
+added at the end, so any settings of keys like |begin| or |repeats| inside the
+\meta{options} will get added to the timeline.
+
+Let us now have a look at some examples. First, we set the \meta{object name}
+to |mynode| and |othernode| and the \meta{attribute} to |opacity| and to
+|color|:
+%
+\begin{codeexample}[code only]
+animate = {
+ mynode:opacity = { 0s = "1", 5s = "0" },
+ mynode:color = { 0s = "red", 5s = "blue" },
+ othernode:opacity = { 0s = "1", 5s = "0" },
+}
+\end{codeexample}
+
+Next, we do the same, but ``in two steps'': First, we set the object to
+|my node|, but leave the attribute open and, then, set the attribute, but leave
+the object:
+%
+\begin{codeexample}[code only]
+animate = {
+ mynode: = {
+ :opacity = { 0s = "1", 5s = "0" },
+ :color = { 0s = "red", 5s = "blue" }
+ },
+ othernode:opacity = { 0s = "1", 5s = "0" },
+}
+\end{codeexample}
+%
+Note how both in |mynode:| and in |:opacity| and |:color| you must provide the
+colon. Its presence signals that an object--attribute pair is being specified;
+only now either the object or the attribute is missing.
+
+We can also do it the other way round:
+%
+\begin{codeexample}[code only]
+animate = {
+ :opacity = {
+ mynode: = { 0s = "1", 5s = "0" },
+ othernode: = { 0s = "1", 5s = "0" }
+ },
+ mynode:color = { 0s = "red", 5s = "blue" }
+}
+\end{codeexample}
+%
+Finally, if several objects should get the exact same values, we can also group
+them:
+%
+\begin{codeexample}[code only]
+animate = {
+ {mynode,othernode}:opacity = { 0s = "1", 5s = "0" },
+ mynode:color = { 0s = "red", 5s = "blue" }
+}
+\end{codeexample}
+
+As mentioned earlier, all references to objects will be interpreted to future
+objects, never to objects already created. Furthermore, also as mentioned
+earlier, \tikzname\ allows you to specify |myself| as \meta{object}, which is
+interpreted as the scope or node where the |animate| is given (you cannot
+animate a node or scope named |myself|, this special name always refers to the
+current node). In order to have all attributes refer to the current object, you
+write:
+%
+\begin{codeexample}[code only]
+\begin{scope} [animate = {
+ myself: = { % Animate the attribute of the scope
+ :opacity = { ... },
+ :xshift = { ... }
+ }
+ }]
+ ...
+\end{scope}
+\end{codeexample}
+
+The list of permissible attributes is given in
+Section~\ref{section-anim-attrs}.
+
+
+\subsubsection{The Colon Syntax II: Animating Myself}
+
+A frequent use of the |animate| key is for animating attributes of the current
+object |myself|. In these cases, it is a bit length to write
+%
+\begin{codeexample}[code only]
+[animate = { myself: = { :some attribute = {...} } } ]
+\end{codeexample}
+%
+\noindent in the options of a node or a scope. For this reason, \tikzname\
+allows you to use a special syntax with nodes and scopes:
+%
+\begin{enumerate}
+ \item In a \meta{node specification}, which is everything following a
+ |node| command up to the content of the node (which is surrounded by
+ curly braces), you can write
+ %
+ \begin{quote}
+ |:some attribute = {|\meta{options}|}|
+ \end{quote}
+ %
+ and this will have the same effect as if you had written
+ %
+ \begin{quote}
+ |[animate = { myself: = { :some attribute = {|\meta{options}|}}}]|
+ \end{quote}
+ %
+ Note that you can use this syntax repeatedly, but each use creates a
+ new use of the |animate| key, resulting in a new timeline. In order to
+ create complex timelines for several objects, use the |animate| key.
+ \item For the commands |\tikz|, |\scoped| and the environments
+ |{tikzpicture}| and |{scope}|, when they are followed immediately by
+ %
+ \begin{quote}
+ |:some attribute = {|\meta{options}|}|
+ \end{quote}
+ %
+ then
+ %
+ \begin{quote}
+ |animate = { myself: = { :some attribute = {|\meta{options}|}}}|
+ \end{quote}
+ %
+ is added to the options of the command or scope. Again, you can use the
+ syntax repeatedly. Note that when an opening square bracket is
+ encountered, this special parsing stops.
+\end{enumerate}
+
+Let us have a look at some examples. First, we use the syntax to set the fill
+opacity of a node:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node
+ :fill opacity = { 0s="1", 2s="0", begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Here!};
+\end{codeexample}
+%
+Next, we additionally rotate the node:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node
+ :fill opacity = { 0s="1", 2s="0", begin on=click }
+ :rotate = { 0s="0", 2s="90", begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Here!};
+\end{codeexample}
+%
+Note that there is no comma between consecutive uses of the colon syntax in
+this case. We could have exchanged the order of the options and the uses of the
+colon syntax:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node
+ :fill opacity = { 0s="1", 2s="0", begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle]
+ :rotate = { 0s="0", 2s="90", begin on=click } {Here!};
+\end{codeexample}
+
+We can also use the special syntax with the |\tikz| command itself:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz :fill opacity = { 0s="1", 2s="0", begin on=click }
+ :rotate = { 0s="0", 2s="90", begin on=click }
+ [ultra thick]
+ \node [fill = blue!20, draw = blue, circle] {Here!};
+\end{codeexample}
+
+Note that we could \emph{not} have moved the |[ultra thick]| options before
+|:rotate| since the options in square brackets end the special parsing.
+
+
+\subsubsection{The Time Syntax: Specifying Times}
+
+For each object--attribute pair you must specify the \emph{timeline} of the
+attribute. This is a curve that specifies for each ``moment in time'' which
+value the attribute should have. In the simplest case, you specify such a
+time--value pair as follows:
+%
+\begin{quote}
+ \normalfont
+ \meta{time} |="|\meta{value}|"|
+\end{quote}
+
+When you specify time--value pairs, you must specify the times in chronological
+order (so earlier times come first), but you may specify the same time several
+times (this is useful in situations where you have a ``jump'' from one value to
+another at a certain moment in time: you first specify the value ``from which
+the attribute jumps'' and then you specify the value ``to which the attribute
+jumps'' for the same moment).
+
+The above syntax is just a special case of a more general situation. Let us
+start with the times. The general syntax for specifying times is as follows:
+%
+\begin{quote}
+ \normalfont
+ \meta{time} \opt{|=| \meta{options}}
+\end{quote}
+
+Here, \meta{time} is a text that ``looks like a time'', which means that:
+%
+\begin{enumerate}
+ \item It is not a key and does not contain a colon and does not start with
+ a quotation mark.
+ \item It starts with a digit, a plus or minus sing, a dot, or a
+ parenthesis.
+\end{enumerate}
+
+If these two things are the case, the above code is transformed to the
+following call:
+%
+\begin{quote}
+ \normalfont
+ |sync = {time = |\meta{time}|, |\meta{options}|, entry}|
+\end{quote}
+
+
+\subsubsection{The Quote Syntax: Specifying Values}
+
+We saw already in several examples that values are put in quotation marks
+(similar to the way this is done in \textsc{xml}). This quote syntax is as
+follows:
+%
+\begin{quote}
+ \normalfont
+ |"|\meta{value}|"| \opt{|base|} \opt{|=| \meta{options}}
+\end{quote}
+
+This syntax is triggered whenever a key starts with a quotation mark%
+\footnote{Of catcode 12 for those knowledgeable of such things.} (and note that
+when the \meta{value} contains a comma, you have to surround it by curly braces
+\emph{inside} the quotation marks as in |"{(1,1)}"|). Then, the following code
+is executed:
+%
+\begin{quote}
+ \normalfont
+ |sync = {value = |\meta{value}|, |\meta{options}|, entry}|
+\end{quote}
+
+This means that when you write |1s = "red"|, what actually happens is that
+\tikzname\ executes the following:
+%
+\begin{codeexample}[code only]
+sync = { time = 1s, sync = { value = red, entry }, entry }
+\end{codeexample}
+%
+Note that the second entry has no effect since no value is specified and the
+|entry| key only ``takes action'' when both a time and a value have been
+specified. Thus, only the innermost |entry| does, indeed, create a time--value
+pair as desired.
+
+In addition to the above, if you have added |base| after the closing quote, the
+following gets executed before the above |sync|:
+%
+\begin{quote}
+ \normalfont
+ |base = {value = |\meta{value}|}|
+\end{quote}
+
+This makes it easy to specify base values for timelines.
+
+Interestingly, instead of |1s="red"| you can also write |"red"=1s|. Let us now
+have a look at situations where this can be useful.
+
+
+\subsubsection{Timesheets}
+
+Using the |sync| key or using the three different syntactic constructs
+introduced earlier (the color syntax, the time syntax, the value syntax), you
+can organize the specification of an animation in different ways. Basically,
+the two most useful ways are the following:
+%
+\begin{enumerate}
+ \item You first select an object and an attribute for which you wish to
+ establish a timeline and then provide the time--value pairs in a
+ sequence:
+ %
+\begin{codeexample}[code only]
+animate = {
+ obj:color = {
+ 0s = "red",
+ 2s = "blue",
+ 1s later = "green",
+ 1s later = "green!50!black",
+ 10s = "black"
+ }
+}
+\end{codeexample}
+ %
+ When you specify timelines for several attributes of the same object,
+ you can group these together:
+ %
+\begin{codeexample}[code only]
+animate = {
+ obj: = {
+ :color = { 0s = "red", 2s = "green" },
+ :opacity = { 0s = "1", 2s = "0" }
+ }
+}
+\end{codeexample}
+ %
+ In this way of specifying animations the ``object comes first''.
+ \item Alternatively, you can also group the animation by time and, for each
+ ``moment'' (known as \emph{keyframes}) you specify which values the
+ attributes of the object(s) have:
+ %
+\begin{codeexample}[code only]
+animate = {
+ 0s = {
+ obj:color = "red",
+ obj:opacity = "1"
+ },
+ 2s = {
+ obj:color = "green",
+ obj:opacity = "0"
+ }
+}
+\end{codeexample}
+ %
+ Naturally, in this case it would have been better to ``move the object
+ outside'':
+ %
+\begin{codeexample}[code only]
+animate = {
+ obj: = {
+ 0s = {
+ :color = "red",
+ :opacity = "1"
+ },
+ 2s = {
+ :color = "green",
+ :opacity = "0"
+ }
+ }
+}
+\end{codeexample}
+ %
+ When there are several objects involved, we can mix all of these
+ approaches:
+ %
+\begin{codeexample}[code only]
+animate = {
+ 0s = {
+ obj: = {
+ :color = "red",
+ :opacity = "1"
+ },
+ main node: = {
+ :color = "black"
+ }
+ },
+ 2s = {
+ obj: = {
+ :color = "green",
+ :opacity = "0"
+ },
+ main node: = {
+ :color = "white"
+ }
+ }
+}
+\end{codeexample}
+ %
+\end{enumerate}
+
+
+\subsection{The Attributes That Can Be Animated}
+\label{section-anim-attrs}
+
+The following \meta{attributes} are permissible (actually, the attribute names
+do not include a colon, but since they will almost always be used with the
+colon syntax, it makes it easier to identify them):
+%
+\begin{itemize}
+ \itemsep0pt
+ \item |:dash phase|
+ \item |:dash pattern|
+ \item |:dash|
+ \item |:draw opacity|
+ \item |:draw|
+ \item |:fill opacity|
+ \item |:fill|
+ \item |:line width|
+ \item |:opacity|
+ \item |:position|
+ \item |:path|
+ \item |:rotate|
+ \item |:scale|
+ \item |:stage|
+ \item |:text opacity|
+ \item |:text|
+ \item |:translate|
+ \item |:view|
+ \item |:visible|
+ \item |:xscale|
+ \item |:xshift|
+ \item |:xskew|
+ \item |:xslant|
+ \item |:yscale|
+ \item |:yshift|
+ \item |:yskew|
+ \item |:yslant|
+\end{itemize}
+
+These attributes are detailed in the following sections, but here is a quick
+overview of those that do not have a \tikzname\ key of the same name (and which
+thus do not just animate the attribute set using this key):
+%
+\begin{itemize}
+ \item |:shift| allows you to add an animated shifting of the canvas, just
+ like \tikzname's |shift| key. However, in conjunction with the |along|
+ key, you can also specify the shifting along a path rather than via a
+ timeline of coordinates.
+ \item |:position| works similar to |:shift|, only the coordinates are not
+ relative movements (no ``shifts''), but refer to ``absolute positions''
+ in the picture.
+ \item |:path| allows you to animate a path (it will morph). The ``values''
+ are now paths themselves.
+ \item |:view| allows you to animate the view box of a view.
+ \item |:visible| decides whether an object is visible at all.
+ \item |:stage| is identical to |:visible|, but when the object is not
+ animated, it will be hidden by default.
+\end{itemize}
+
+
+\subsubsection{Animating Color, Opacity, and Visibility}
+\label{section-animation-painting}
+
+You can animate the color of the target object of an animation using the
+attributes |fill|, |draw|, and |text|. When the target of a color animation is
+a scope, you animate the color ``used in this scope'' for filling or stroking.
+However, when an object inside the scope has its color set explicitly, this
+color overrules the color of the scope.
+
+\begin{tikzanimateattribute}{fill, draw}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz :fill = {0s = "red", 2s = "blue", begin on = click}
+ [text = white, fill = orange ] {
+ \node [fill] at (0mm,0) {A};
+ \node [fill] at (5mm,0) {B};
+ \node [fill = green!50!black ] at (1cm,0) {C};
+}
+\end{codeexample}
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{text}
+ The |text| attribute only applies to nodes and you need to directly animate
+ the |text| attribute of each node individually.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [my anim/.style={ animate = {
+ myself:text = {0s = "red", 2s = "blue", begin on = click}}},
+ text = white, fill = orange ] {
+ \node [fill, my anim] at (0,0) {A};
+ \node [fill, my anim] at (1,0) {B};
+}
+\end{codeexample}
+ %
+ Unlike the |fill| and |draw| colors, you cannot animate the |text| color
+ for scopes:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz [animate = {myself:text = {0s = "red", 2s = "blue",
+ begin on = click}},
+ text = white, fill = orange ] {
+ \node [fill] at (0,0) {A};
+ \node [fill] at (1,0) {B};
+}
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{color}
+ The |color| attribute is not really an attribute. Rather, it is a shorthand
+ for |{draw,fill,text}|. This means that |color| does not start a separate
+ timeline, but continues the |draw| timeline, the |fill| timeline, and the
+ |text| timeline.
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{opacity, fill opacity, stroke opacity}
+ Similarly to the color, you can also set the opacity used for filling and
+ for drawing using the attributes |fill opacity| and |draw opacity|, which
+ are exactly the same as the usual \tikzname\ keys of the same names.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :fill opacity = { 0s="1", 2s="0", begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ Unlike colors, where there is no joint attribute for filling and stroking,
+ there is a single |opacity| attribute in addition to the above two
+ attributes. If supported by the driver, it treats the graphic object to
+ which it is applied as a transparency group. In essence, ``this attribute
+ does what you want'' at least in most situations.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :opacity = { 0s="1", 2s="0", begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{visible, stage}
+ The difference between the |visible| attribute and an opacity of |0| is
+ that an invisible object cannot be clicked and does not need to be
+ rendered. The (only) two possible values for this attribute are |false| and
+ |true|.
+ %
+\begin{codeexample}[animation list={1,2,3,4}]
+\tikz :visible = {begin on=click, 0s="false", 2s="false"}
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+\end{codeexample}
+
+ This |stage| attribute is the same as the |visible| attribute, only
+ |base="false"| is set by default. This means that the object is \emph{only}
+ visible when you explicitly during the time the entries are set to |true|.
+ The idea behind the name ``stage'' is that the object is normally ``off
+ stage'' and when you explicitly set the ``stage attribute'' to |true| the
+ object ``enters'' the stage and ``leaves'' once more when it is no longer
+ ``on stage''.
+ %
+\begin{codeexample}[animation list={-1,0,1,2,3},animation bb={(1.3,-0.7) rectangle (2.7,0.7)}]
+\tikz [animate = {example:stage = {
+ begin on = {click, of next=node},
+ 0s="true", 2s="true" }}] {
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \node at (2,0) (example) [fill = blue!20, circle] {Effect};
+}
+\end{codeexample}
+\end{tikzanimateattribute}
+
+
+\subsubsection{Animating Paths and their Rendering}
+\label{section-animation-paths}
+
+The attributes of the appearance of a path that you can animate include the
+line width and the dash pattern, the path itself, as well as the arrow tips
+attached to the paths. Animating the line width and the dash pattern is easy
+since the animation attributes simply have that same names as the properties
+that they animate and the syntax for setting is also the same:
+
+\begin{tikzanimateattribute}{line width}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :line width = { 0s="1pt", 2s="5mm", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ Note that you must specify number (or expressions that evaluate to numbers)
+ as values, you cannot say |thin| or |thick| (these are styles, internally,
+ and you also cannot say |line width=thick|).
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{dash, dash phase, dash phase}
+ The values for an animation of the dashing are specifications (see the
+ |dash| key for details) consisting of a sequence of |on| and |off| numbers.
+ In each value of the animation the length of these sequences \emph{must} be
+ identical. The interpolation of the values is done for each position of the
+ sequences individually, and also on the phase.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :dash = { 0s="on 10pt off 1pt phase 0pt",
+ 2s="on 1pt off 10pt phase 0pt", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :dash = { 0s="on 1cm off 1pt phase 0pt",
+ 2s="on 1cm off 1pt phase 1cm", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+
+ This |dash pattern| key allows you to animate the dash phase only. However,
+ due to the way dashing is handled by certain drivers, the dash pattern is
+ also set, namely to the current dash pattern that is in force when the
+ animation is created.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :dash phase = { 0s="0pt", 2s="1cm", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle, dashed] {Click me!};
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+The above attributes ``only'' influence how the path is rendered. You can,
+however, also animate the path itself:
+
+\begin{tikzanimateattribute}{path}
+ When you animate a path, the values are, of course, paths themselves:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :path = {
+ 0s = "{(0,-1) .. controls (0,0) and (0,0) .. (0,1) -- (1,1)}",
+ 2s = "{(0,-1) .. controls (-1,0) and (-1,0) .. (-1,1) -- (.5,-1)}",
+ begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ There a number of things to keep in mind when you animate a path:
+ %
+ \begin{itemize}
+ \item The path ``values'' are parsed and executed in an especially
+ protected scope to ensure that they have only little side effects,
+ but you should not do ``fancy things'' on these paths.
+ \item As for the dash pattern, you must ensure that all paths in the
+ timeline have the same structure (same sequence of path
+ construction commands); only the coordinates may differ. In
+ particular, you cannot say that the path at |1s| is a rectangle
+ using |rectangle| and at |2s| is a circle using |circle|. Instead,
+ you would have to ensure that at both times the path consists of
+ appropriate Bézier curves (which is cumbersome as the following
+ example shows, where we used the fact that a circle consists of
+ four Bézier curves):
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :path = {
+ 0s = "{(0,0) circle [radius=1cm]}",
+ 2s = "{(0,0)
+ (1,0) .. controls +(0,0) and +(0,0) .. (0,1)
+ .. controls +(0,0) and +(0,0) .. (-1,0)
+ .. controls +(0,0) and +(0,0) .. (0,-1)
+ .. controls +(0,0) and +(0,0) .. (1,0)
+ -- cycle (0,0)}",
+ begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ \item You must specify arrow tips for an animated path in a special
+ way, namely using the |arrows| key for \emph{animations}, not the
+ normal |arrows| key (see below).
+ \end{itemize}
+\end{tikzanimateattribute}
+
+\begin{key}{/tikz/animate/arrows=\meta{arrow spec}}
+ This key only has an effect on |:path| animations. It causes the arrow tips
+ specified in \meta{arrow spec} to be added to the path during the animation
+ (the syntax is the same as for the normal |arrows| key). If you have
+ several different animations for a paths, these may contain different arrow
+ tips, but each animation must stick to one kind of arrow tips.
+
+ What happens internally when this key is used is the following: The
+ specified arrow tips are rendered internally as so-called \emph{markers,}
+ which are small graphics that can be placed at the beginning and ends of
+ paths and which ``rotate along'' as a path changes. Note that these markers
+ are used \emph{only} in the context of animated paths, the arrow tips of
+ normal, ``static'' paths are drawn without the use of markers. Normally,
+ there is no visual difference between an arrow tip drawn using markers or
+ those drawn for static paths, but in rare cases there may be differences.
+ You should only add arrows to open path consisting of a single segment with
+ sufficiently long first and last segments (so that \tikzname\ can shorten
+ these segments correctly when necessary).
+
+ As pointed out earlier, the only way to add arrow tips to a path that is
+ animated is using this key, you can \emph{not} say something like
+ %
+\begin{codeexample}[code only]
+\draw :path = { 1s = "{(0,0) -- (1,0)}", 2s = "{(0,1) -- (1,0)}" }
+ [->] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ This will raise an error since you try to animate a path (|:path = ...|)
+ that has normal arrow tips attached (|[->]|).
+
+ Instead, you must specify the arrow tips inside the animation command:
+ %
+\begin{codeexample}[code only]
+\draw :path = { 1s = "{(0,0) -- (1,0)}", 2s = "{(0,1) -- (1,0)}", arrows = -> }
+ (0,0) -- (1,0);
+\end{codeexample}
+
+ However, the above code now has a big shortcoming: While the animation is
+ \emph{not} running, \emph{no} arrow tip is shown (the |arrows| key only
+ applies to the animation.
+
+ The trick is to use the |base| key. It allows you to install a path as the
+ ``base'' path that is used when no animation is running and the arrows
+ specified for the animation will also be used for the base. All told, the
+ ``correct'' way to specify the animation is the following (note that no
+ static path is specified, any specified path would be overruled by the
+ |base| path anyway):
+ %
+\begin{codeexample}[code only]
+\draw :path = { 1s = "{(0,0) -- (1,0)}" base, 2s = "{(0,1) -- (1,0)}", arrows = -> };
+\end{codeexample}
+
+ Here is an example:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(-0.1,-0.1) rectangle (1.1,1.1)}]
+\tikz [very thick] {
+ \node (node) at (-2,0)
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+ \draw :path = {
+ 0s = "{(0,0) to[out=90, in=180] (.5,1) to[out=0, in=90] (.5,.5)}" base,
+ 2s = "{(1,0) to[out=180, in=180] (.25,.5) to[out=0, in=180] (1,.5)}",
+ arrows = <.<->, begin on = {click, of=node} }; }
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/animate/shorten < = \meta{dimension}}
+\end{key}
+
+\begin{key}{/tikz/animate/shorten > = \meta{dimension}}
+ For animated paths, just as the key |arrows| has to be passed to the
+ animation (to |:path|) instead of to the static path, the keys |shorten >|
+ and |shorten <| also have to be passed to the |:path| key.
+\end{key}
+
+
+\subsubsection{Animating Transformations: Relative Transformations}
+
+In order to animate the canvas transformation matrix, you do not animate an
+attribute called ``|:transform|''. Rather, there are several attributes that
+all manipulate the canvas transformation matrix in different ways. These keys,
+taken in appropriate combination, allow you to achieve any particular canvas
+transformation matrix. All keys that animate the transformation matrix always
+accumulate.
+
+Let us start with the ``standard'' attributes that are also available as keys
+in \tikzname:
+
+\begin{tikzanimateattribute}{scale, xscale, yscale}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :scale = { 0s="1", 2s="0.2", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{rotate}
+ The |rotate| key adds an animation of the rotation:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :rotate = { 0s="45", 2s="90", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ Note that there is no |rotate around| attribute, but you can use the
+ |origin| key to change the origin of the rotation.
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{xskew, yskew, xslant, yslant}
+ The keys add an animation of the skew (given in degrees) or slant (given as
+ in the |xslant| and |yslant| key):
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :xskew = { 0s="0", 2s="45", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :xslant = { 0s="-1", 2s="1", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{xshift, yshift}
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :shift = { 0s="{(0,0)}", 2s="{(5mm,-5mm)}",
+ begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :xshift = { 0s="0pt", 2s="5mm", begin on=click}
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+\begin{tikzanimateattribute}{shift}
+ This |:shift| attribute can be animated in two ways. First, you can simply
+ specify a sequence of coordinates in the same way as you would use the
+ |shift| key in \tikzname:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz \node :shift = { 0s = "{(0,0)}", 2s = "{(5mm,-5mm)}",
+ begin on = click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+
+ However, you can also specify the sequence of positions along which the
+ shift should occur in a different way, namely by \emph{specifying a path
+ along which the object should be moved.} This is often not only more
+ natural to do, but also allows you to specify movements along curves.
+
+ \begin{key}{/tikz/animate/options/along=\marg{path}\meta{|sloped| or
+ |upright|}\opt{| in|\meta{time}}%
+ }
+ Use this key with a |:shift| (or a |:position|) to make \tikzname\
+ shift the object by the coordinates along the \meta{path}. When this
+ key is used, the values may no longer be coordinates, but must be
+ fractions of the distance along the path. A value of |"0"| refers to
+ the beginning of the path and |"1"| refers to the end:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,1.2);
+ \draw (1,.5) circle [radius=1mm];
+ \node :shift = {
+ along = {(0,0) circle[radius=5mm]} upright,
+ 0s="0", 2s=".25", begin on=click }
+ at (1,.5) [fill = blue, opacity=.5, circle] {Click};
+}
+\end{codeexample}
+ \end{key}
+
+ Following the \meta{path}, which must be put in braces, you must either
+ specify |upright| or |sloped|. In the first case, the to-be-animated object
+ is moved along the path normally (and stays ``upright''), whereas when you
+ use |sloped|, the object will be continuously rotated so that it always
+ points along the path.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,1.2);
+ \draw (1,.5) circle [radius=1mm];
+ \node :shift = {
+ along = {(0,0) circle[radius=5mm]} sloped,
+ 0s="0", 2s=".25", begin on=click }
+ at (1,.5) [fill = blue, opacity=.5, circle] {Click};
+}
+\end{codeexample}
+
+ In most motion animations that use |along|, you will set the value for |0s|
+ to |"0"| and the value for some specific \meta{time} to |"1"|. Because of
+ this, you can add |in| \meta{time} after the path, to achieve exactly this
+ effect.
+\end{tikzanimateattribute}
+
+For the above attributes, it is not immediately clear which coordinate system
+should be used for the animation. That is, when you move an object 1cm ``to the
+right'', where is ``the right''? By default, movements and transformations like
+|:shift| or |:scale| are relative to the \emph{animation coordinate system,}
+which defaults to the local coordinate system of the to-be-animated object.
+Consider the following example:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,2.2);
+ \node :rotate = { 0s="0", 2s="45", begin on=click}
+ at (1,1) [fill = blue!20, draw = blue, ultra thick] {Click me};
+}
+\end{codeexample}
+%
+Note how the node rotates around its center even though this center is at
+position |(1,1)| in the picture's coordinate system. This is because |at (1,1)|
+actually only does a shift of the coordinate system and the node is then drawn
+at the origin of this shifted coordinate system. Since this shifted coordinate
+system becomes the animation coordinate system, the rotation ``around the
+origin'' is actually a rotation around the origin of the animation coordinate
+system, which is at |(1,1)| in the picture's coordinate system.
+
+Let us, by comparison, do a rotation of a scope surrounding the node where the
+origin is not (yet) shifted:
+%
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,2.2);
+ \scoped :rotate = { 0s="0", 2s="45", begin on={click, of next=n} }
+ \node (n) at (1,1) [fill = blue!20, draw = blue, ultra thick] {Click me};
+}
+\end{codeexample}
+%
+Now the rotation is really around the origin of the picture.
+
+Most of the time the animation coordinate system will be setup in the way ``you
+expect'', but you can modify it using the following keys:
+
+\begin{key}{/tikz/animate/options/origin=\meta{coordinate}}
+ Shifts the animation coordinate system by \meta{coordinate}. This has the
+ effect that the ``origin'' for scalings and rotations gets shifted by this
+ amount. In the following example, the point around which the rotation is
+ done is the right border at |(2,1)| since the origin of the animation is at
+ |(1,1)| relative to the picture's origin and the |origin| key shifts it one
+ centimeter to the right.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,2.2);
+ \node :rotate = { 0s="0", 2s="45", begin on=click,
+ origin = {(1,0)}}
+ at (1,1) [fill = blue!20, draw = blue, ultra thick] {Click me};
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/animate/options/transform=\meta{transformation keys}}
+ While the |origin| key does only a shift, the |transform| key allows you to
+ add an arbitrary transformation to the animation coordinate system using
+ keys like |shift|, |rotate| or even |reset cm| and |cm|. In particular,
+ |origin=|\meta{c} has the same effect as |transform| |=|
+ |{shift=|\meta{c}|}|. Note that the transformation only influences the
+ animation, not the object itself.
+
+ As an example, when you say |transform={scale=2}|, an |:xshift| with a
+ value of |"1cm"| will actually shift the object by 2cm. Similarly, after
+ you say |transform={rotate=90,scale=2}|, the same |:xshift| of |"1cm"| will
+ actually shift the object by 2cm upwards.
+
+ Note that, internally, \tikzname\ has to invert the transformation matrix
+ resulting from the \meta{transformation keys} (plus the original animation
+ transformation matrix), which can by numerically instable when you use
+ ill-conditioned transformations.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,2.2);
+ \node :xshift = { 0s="0cm", 2s="5mm", begin on=click,
+ transform = {rotate=-90} }
+ at (1,1) [fill = blue!20, draw = blue, ultra thick] {Click me};
+}
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,2.2);
+ \node :xshift = { 0s="0cm", 2s="5mm", begin on=click,
+ transform = {rotate=-45, scale=2} }
+ at (1,1) [fill = blue!20, draw = blue, ultra thick] {Click me};
+}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Animating Transformations: Positioning}
+
+The attributes for specifying transformations and, in particular, the |:shift|
+attribute are always expressed in the local animation coordinate system. This
+makes it easy to ``shift around a node a little bit'', but makes it hard to
+move a node ``from one position to another'' since coordinates need to be
+expressed relative to the node's coordinate system, which leads to all sorts of
+problems: Suppose you wish to have a node move from $(1,1)$ to $(2,1)$ and then
+to $(2,0)$. Now, if the node has already been placed at $(1,1)$ in the usual
+manner using |at|, then from the ``node's point of view'' you need to move the
+node to $(0,0)$, $(1,0)$, and $(1,-1)$. To make matters worse, when you use
+named coordinates as in
+%
+\begin{codeexample}[code only]
+\coordinate(A) at (1,1);
+\coordinate(B) at (2,1);
+\coordinate(C) at (2,0);
+\end{codeexample}
+%
+and then say that the movement should be from |(A)| to |(B)| to |(C)|, what
+should you expect? On the one hand, |(A)| and |(1,1)| should normally be
+interchangeable; on the other hand, |(A)| is a specific point in the plane, no
+matter from which coordinate system we look at it. It turns out that \tikzname\
+will stick to the second interpretation and actually turn |(A)| into |(0,0)|
+when it is parsed in the local coordinate system of a node starting at |(A)| --
+while |(1,1)| will stay the same.
+
+Because of all these confusing effects, there is another attribute |:position|,
+which is similar to a |:shift|, but the coordinates are not interpreted in the
+local coordinate system of the node, but in the coordinate system that is in
+force when the |animate| key is used. For a node, this is \emph{prior} to the
+setup of the node's coordinate system and, thus, usually the picture's
+coordinate system.
+
+\begin{tikzanimateattribute}{position}
+ Compare the two animations, one with |:position|, one with |:shift|.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,1.2);
+ \draw (1,.5) circle [radius=1mm] (1.5,0) circle [radius=1mm];
+ \node :position = { 0s="{(1,.5)}", 2s="{(1.5,0)}", begin on=click }
+ at (1,.5) [fill = blue, opacity=.5, circle] {Click};
+}
+\end{codeexample}
+ %
+ Compare this to a shift:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,1.2);
+ \draw (1,.5) circle [radius=1mm] (1.5,0) circle [radius=1mm];
+ \node :shift = { 0s="{(1,.5)}", 2s="{(1.5,0)}", begin on=click }
+ at (1,.5) [fill = blue, opacity=.5, circle] {Click};
+}
+\end{codeexample}
+ %
+ You can use the |along| key with |:position| in the same way as with
+ |:shift|, which is especially useful for specifying that a node ``travels''
+ between positions of the canvas:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \draw [help lines] (-0.2,-0.2) grid (2.2,1.2);
+ \draw (1,1) circle [radius=1mm] (1.5,0) circle [radius=1mm];
+ \node :position = {
+ along = {(1,1) to[bend left] (1.5,0)} sloped in 2s,
+ begin on = click }
+ at (1,1) [fill = blue, opacity=.5, circle] {Click};
+}
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+
+\subsubsection{Animating Transformations: Views}
+\label{section-animation-views}
+
+The final method of changing the transformation matrix is to animate a
+\emph{view}.
+
+\begin{tikzanimateattribute}{view}
+ A view is a canvas transformation that shifts and scales the canvas in such
+ a way that a certain rectangle ``matches'' another rectangle: The idea is
+ that you ``look through'' a ``window'' (the view) and ``see'' a certain
+ area of the canvas. View animation do not allow you to do anything that
+ cannot also be done using the |shift| and |scale| keys in combination, but
+ it often much more natural to animate which area of a graphic you wish to
+ see than to compute and animate a scaling and shift explicitly.
+
+ In order to use a view, you first need to create a view, which is done
+ using the |meet| or |slice| keys from the |views| library, see
+ Section~\ref{section-library-views}. You can then animate the view using
+ the |view| attribute. The values passed to the |entry| key follow the same
+ syntax as the views in the view library (though you only animate the
+ to-be-viewed rectangle).
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},animation bb={(1.1,-0.9) rectangle (2.9,0.9)}]
+\tikz [very thick] {
+ \node (node) [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+
+ \draw [green!50!black] (1.2,-0.8) rectangle (2.7,0.8);
+ \begin{scope}[view = {(0,0) (2,2) at (1.2,-0.8) (2.7,0.8)},
+ animate = {myself:view = {
+ begin on = {click, of=node},
+ 0s = "{(0,0) (2,2)}",
+ 2s = "{(1,1) (1.5,1.5)}" }}]
+ \draw [red] (10mm,10mm) rectangle (15mm,15mm);
+ \node at (10mm,10mm) [circle, fill=red, text=white, font=\tiny] {red};
+ \end{scope}
+}
+\end{codeexample}
+ %
+\end{tikzanimateattribute}
+
+
+\subsection{Controlling the Timeline}
+\label{section-anim-timeline}
+
+We can already specify timelines by giving a sequence of times in
+non-decreasing order along with corresponding values. In this section we have a
+look at further options that allow us to extend or control the timeline.
+
+
+\subsubsection{Before and After the Timeline: Value Filling}
+
+When you specify the timeline, you specify it for a certain interval
+$[t_1,t_2]$. By default, outside this interval the animation has no effect on
+the to-be-animated attribute. The following keys allows you to change this:
+
+\begin{key}{/tikz/animate/base=\meta{options}}
+ A ``base'' value is a value that is used for the attribute whenever the
+ timeline is \emph{not} active:
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2,2.5}]
+\tikz \node [fill = green, text = white] :fill =
+ { 1s = "red", 2s = "blue", base = "orange", begin on = click }
+ {Click me};
+\end{codeexample}
+
+ Syntactically, the |base| key works much like special time syntax: It sets
+ up a local |sync| scope and executes the \meta{options} in it and creates
+ an |entry|. However, instead of setting the |time| attribute to a time, it
+ sets it to a special value that tells \tikzname\ that when the entry is
+ created, the current \meta{value} should be used as the |base| value.
+
+ This means that you can write |base = "orange"| as in the above example to
+ set the base. However, you can also use the |base| key in other ways; most
+ noticeably, you can use it \emph{after} some value:
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2,2.5}]
+\tikz \node [fill = green, text = white] :fill =
+ { 1s = {"red" = base}, 2s = "blue", begin on = click }
+ {Click me};
+\end{codeexample}
+
+ Instead of using |base| as a key, you can also add |base| directly after
+ the quotes of a value. This is particularly useful for setting up a base
+ value that is also used in a timeline:
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2,2.5}]
+\tikz \node [fill = green, text = white] :fill =
+ { 1s = "red" base, 2s = "blue", begin on = click }
+ {Click me};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/animate/options/forever}
+ This key causes the timeline to continue ``forever'' after the last time
+ with the last value. You can also think of this as having the animation
+ ``freeze'' at the end.
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2,2.5}]
+\tikz \node :fill = { 1s="red", 2s="blue", forever, begin on=click}
+ [fill = green!50!black, text = white] {Click me};
+\end{codeexample}
+ %
+\begin{codeexample}[animation list = {0.5,1,1.5,2,2.5}]
+\tikz \node [fill = green!50!black, text = white]
+ :fill = { 1s = "red", 2s = "blue", begin on = click }
+ {Click me};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/animate/options/freeze}
+ An alias for |forever|.
+\end{key}
+
+
+\subsubsection{Beginning and Ending Timelines}
+\label{section-anim-begin-end}
+
+The \meta{time} used with the first use of the |entry| key in a timeline is the
+start time and the \meta{time} in the last |entry| key is the stop time.
+However, this leaves open then question of when the whole timeline is to be
+started: The moment the document is opened? When the page is displayed? When
+the user scrolls to the to-be-animated object? When some other object is
+clicked? The key |begin|, and also the key |end|, allow you to specify answers
+to these questions.
+
+\begin{key}{/tikz/animate/options/begin=\meta{time}}
+ This key specifies when the ``moment |0s|'' should be relative to the
+ moment when the current graphic is first displayed. You can use this key
+ multiple times, in this case the timeline is restarted for each of the
+ times specified (if it is already running, it will be reset). If no |begin|
+ key is given at all, the effect is the same as if |begin=0s| had been
+ specified.
+
+ It is permissible to set \meta{time} to a negative value.
+
+ Note that this key has no effect for snapshots.
+\end{key}
+
+\begin{key}{/tikz/animate/options/end=\meta{time}}
+ This key will truncate the timeline so that it ends \meta{time} after the
+ display of the graphic, provided the timeline begins before the specified
+ end time. For instance, if you specify a timeline starting at 2\,s and
+ ending at 5\,s and you set |begin| to 1\,s and |end| to 4\,s, the timeline
+ will run, relative to the moment when the graphic is displayed from 3\,s to
+ 4\,s.
+ %
+\begin{codeexample}[]
+\tikz \node [fill = green!50!black, text = white]
+ :rotate = { 1s = "0", 5s = "90", begin = 2s, end = 4s }
+ {Click me};
+\end{codeexample}
+ %
+\end{key}
+
+Instead of specifying the beginning of the timeline relative to the moment to
+to-be-animated graphic is displayed, you can also set the ``moment |0s|'' to
+the moment a specific \emph{event} happens using the following key:
+
+\begin{key}{/tikz/animate/options/begin on=\meta{options}}
+ The \meta{options} will be executed with the path |/pgf/animation/events|
+ and will cause a new beginning to be added to the list of possible
+ beginnings for the timeline (so the uses of this key accumulate). Each
+ ``beginning'' is just another possible ``moment |0s|'' for the timeline.
+ For instance, when the \meta{options} are set to |click|, then each time
+ the graph is clicked a moment |0s| starts for the timeline.
+
+ Most events are ``caused'' or ``happen to'' some object. For instance, the
+ |click| event happens when you click on a certain object. In order to
+ specify this object, use the following two keys inside the \meta{options}:
+ |of| and |of next|. If neither of these keys are given, the to-be-animated
+ object is used.
+
+ \begin{key}{/pgf/animation/events/of=\meta{id}\opt{|.|\meta{type}}}
+ This specifies a graphic object id in the same way as the |whom| key,
+ also with an optional \meta{type}. This is the object that ``causes''
+ the event to happen.
+
+ Unlike the |whom| key, which always refers to a not-yet-existing
+ object, this key always refers to an already existing object, namely to
+ the most recent use of the \meta{id}. In the following example, the
+ referenced object is the node with the label |2| since it is the most
+ recently referenced node with \meta{id} |X|.
+ %
+\begin{codeexample}[width=3cm]
+\tikz [very thick] {
+ \node (X) at (1,1.2) [fill = blue!20, draw = blue, circle] {1};
+ \node (X) at (1,0.4) [fill = orange!20, draw = orange, circle] {2};
+ \node (node) :rotate = {0s="0", 2s="90", begin on = {click, of = X}}
+ [fill = red!20, draw = red, rectangle] {Anim};
+ \node (X) at (1,-0.4) [fill = blue!20, draw = blue, circle] {3};
+ \node (X) at (1,-1.2) [fill = blue!20, draw = blue, circle] {4}; }
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/animation/events/of next=\meta{id}\opt{|.|\meta{type}}}
+ This key works like the |of| key, only it refers to a future (actually,
+ the next) object with the given \meta{id}, not to a previous one. This,
+ in the next example, the referenced node is the one with label |3|.
+ %
+\begin{codeexample}[width=3cm]
+\tikz [very thick] {
+ \node (X) at (1,1.2) [fill = blue!20, draw = blue, circle] {1};
+ \node (X) at (1,0.4) [fill = blue!20, draw = blue, circle] {2};
+ \node (node) :rotate = {
+ 0s="0", 2s="90", begin on = {click, of next = X}}
+ [fill = red!20, draw = red, rectangle] {Anim};
+ \node (X) at (1,-0.4) [fill = orange!20, draw = orange, circle] {3};
+ \node (X) at (1,-1.2) [fill = blue!20, draw = blue, circle] {4}; }
+\end{codeexample}
+ \end{key}
+
+ The following key allows you to specify the event that should cause the
+ animation to start:
+ %
+ \begin{key}{/pgf/animation/events/event=\meta{event name}}
+ Specifies the name of the event whose occurrence should start the
+ timeline. Which events are supported depends on the device on which the
+ animation is displayed, the output format (\textsc{svg} or some other
+ format), and the setup of scripts, but here is a list of events
+ supported by ``plain \textsc{svg}'': |click|, |focusin|, |focusout|,
+ |mousedown|, |mouseup|, |mouseover|, |mousemove|, |mouseout|, |begin|,
+ |end|. However, the following keys make using these events simpler:
+ %
+ \begin{key}{/pgf/animate/events/click}
+ This is a shorthand for |event=click|. This event gets triggered
+ when the user clicks on the triggering object with a mouse (or
+ something equivalent).
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90", begin on = {click}}
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/mouse down}
+ Shorthand for |event=mousedown|. The event gets triggered when the
+ user presses a mouse button down on the object.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90", begin on = {mouse down}}
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/mouse up}
+ Shorthand for |event=mouseup| and gets triggered, of course, when a
+ pressed button is released on the object.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90", begin on = {mouse up} }
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/mouse over}
+ Shorthand for |event=mouseover|. The event gets triggered the
+ moment the mouse cursor moves over the object.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90", begin on = {mouse over} }
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/mouse move}
+ Shorthand for |event=mousemove|. The event gets triggered lots of
+ times, namely each time the mouse moves while being ``over'' the
+ object.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90", begin on = {mouse move} }
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/mouse out}
+ Shorthand for |event=mouseout|. The opposite of |mouse over|:
+ triggered when the mouse leaves the object.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90", begin on = {mouse out} }
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/begin}
+ Shorthand for |event=begin|. The ``begin'' refers to the beginning
+ of another animation, namely the one referenced by |of| or
+ |of whom|. This means that the current animation will begin when
+ some other animation begins.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node [animate = {
+ myself:rotate = { 0s="0", 2s="90", begin on = {begin, of next=anim}},
+ myself:xshift = { 0s="0mm", 2s="5mm", begin on = {click}, name=anim}
+ },
+ fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/end}
+ Shorthand for |event=end|. Again, the ``end'' refers to the end of
+ another animation, namely the one referenced by |of| or |of whom|.
+ This means that the current animation will \emph{begin} when some
+ other animation \emph{ends}.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node [animate = {
+ myself:rotate = { 0s="0", 2s="90", begin on = {end, of next=anim}},
+ myself:xshift = { 0s="0mm", 2s="5mm", begin on = {click}, name=anim }
+ },
+ fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/focus in}
+ This is a shorthand for |event=focusin|. This event gets triggered
+ when the graphic object gets the focus (this usually makes sense
+ only for text input fields).
+ \end{key}
+ %
+ \begin{key}{/pgf/animation/events/focus out}
+ This is a shorthand for |event=focusout|.
+ \end{key}
+ \end{key}
+
+ In addition to the events specified using the generic |event| key, there
+ are two further events that take a parameter:
+ %
+ \begin{key}{/pgf/animation/events/repeat=\meta{number}}
+ The event is triggered when a repeating animation has been repeated
+ \meta{number} times.
+ %
+\begin{codeexample}[
+ animation list={
+ 0.333/\frac{1}{3},0.666/\frac{2}{3},1,
+ 1.333/1\frac{1}{3},1.666/1\frac{2}{3},2,
+ 2.333/2\frac{1}{3},2.666/2\frac{2}{3},3,
+ 3.333/2\frac{1}{3},3.666/2\frac{2}{3},4}]
+\tikz
+ \node [animate = { myself: = {
+ :rotate = { 0s="0", 2s="90", begin on = {repeat = 2, of next = anim },
+ begin snapshot = 2 },
+ :xshift = { 0s="0mm", 2s="5mm", begin on=click, name=anim, repeats=4 }}},
+ fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/pgf/animation/events/key=\meta{key}}
+ The event is triggered when the keyboard key \meta{key} has been
+ pressed. For security reasons, a viewer may suppress this.
+ \end{key}
+
+ Having specified the event, you can also specify a delay relative to this
+ event:
+
+ \begin{key}{/pgf/animation/events/delay=\meta{time}}
+ Specifies that the timeline should not start with the event, but,
+ rather, be delayed by \meta{time}.
+ \end{key}
+\end{key}
+
+When you use |begin on| to start an animation when a certain event is
+triggered, it is not clear what should happen when the event is triggered
+\emph{again}. Should this be ignored completely? Should it only be ignored
+while the animation is running? The following key allows you to specify when
+should happen:
+
+\begin{key}{/tikz/animate/options/restart=\meta{choice} (default true)}
+ You can set \meta{choice} to one of the following:
+ %
+ \begin{itemize}
+ \item |true| means that the animation will restart each time the event
+ is triggered. If the animation is already running, it will be reset
+ to its beginning.
+ \item |false| means that once the animation has started once, it will
+ never be restarted.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90",
+ restart = false, begin on = {click}}
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ %
+ \item |never| means the same as |false|.
+ \item |when not active| means that the animation will restart when the
+ event is triggered, but \emph{not} while the animation is running.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \node :rotate = { 0s="0", 2s="90",
+ restart = when not active, begin on = {click}}
+ [fill = blue!20, draw = blue, circle, ultra thick] {Here!};
+\end{codeexample}
+ \end{itemize}
+\end{key}
+
+Just like |begin on| specifies when a timeline begins relative to some event,
+the |end on| allows you to stop is early when some event happens:
+
+\begin{key}{/tikz/animate/options/end on=\meta{options}}
+ Works exactly like |begin on|, one possible end of the timeline is
+ specified using the \meta{options}.
+\end{key}
+
+
+\subsubsection{Repeating Timelines and Accumulation}
+
+\begin{key}{/tikz/animate/options/repeats=\meta{specification}}
+ Use this key to specify that the timeline animation should repeat at the
+ end. The \meta{specification} must consist of two parts, each of which may
+ be empty. The first part is one of the following:
+ %
+ \begin{itemize}
+ \item Empty, in which case the timeline repeats forever.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz \node :rotate = { 0s = "0", 2s = "90",
+ repeats, begin on = click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ \item A \meta{number} (like |2| or |3.25|), in which case the timeline
+ repeats \meta{number} times.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz \node :rotate = { 0s = "0", 2s = "90",
+ repeats = 1.75, begin on = click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+ \item The text ``|for| \meta{time}'' (like |for 2s| or |for 300ms|), in
+ which case the timeline repeats however often necessary so that it
+ stops exactly after \meta{time}.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz \node :rotate = { 0s = "0", 2s = "90",
+ repeats = for 3.5s, begin on = click }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ \end{itemize}
+ %
+ The second part of the specification must be one of the following:
+ %
+ \begin{itemize}
+ \item Empty, in which case each time the timeline is restarted, the
+ attribute's value undergoes the same series of values it did
+ previously.
+ \item The text |accumulating|. This has the effect that each time the
+ timeline is restarted, the last values specified by the timeline is
+ \emph{added} to the value from the previous iteration(s). A typical
+ example is an animation that shifts a scope by, say, 1\,cm over a
+ time of 1\,s. Now, if you repeat this five times, normally the
+ scope will shift 1\,cm for 1\,s then ``jump back'', shift again,
+ jump back, and so on for five times. In contrast, when the repeats
+ are accumulating, the scope will move by 5\,cm over 5\,s in total.
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz \node :rotate = { 0s = "0", 2s = "90", begin on = click,
+ repeats = accumulating }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ %
+\begin{codeexample}[animation list={1,2,3,4,5}]
+\tikz \node :rotate = { 0s = "0", 2s = "90", begin on = click,
+ repeats = for 4s accumulating }
+ [fill = blue!20, draw = blue, ultra thick, circle] {Click me!};
+\end{codeexample}
+ \end{itemize}
+\end{key}
+
+\begin{key}{/tikz/animate/options/repeat=\meta{specification}}
+ An alias for |repeats|.
+\end{key}
+
+
+\subsubsection{Smoothing and Jumping Timelines}
+\label{section-anim-smooth}
+
+Your specification of the timeline will consist of a sequence of times along
+with values that the attribute should have at these ``key times''. Between
+these key times, the attribute's value needs to be interpolated.
+
+Suppose that an animation is supposed to interpolate a attribute's value
+between the two values |50| and |100| over a time of 10\,s. The simplest way of
+doing so is to do a linear interpolation, where the value as, say, 1\,s is 55,
+at 2\,s it is 60, and so on. Unfortunately, the linear interpolation does not
+``look'' nice in many cases since the acceleration of a linear interpolation is
+zero during the animation, but infinite at the beginning and at the end; which
+looks ``jerky''.
+
+To avoid this, you can specify that the time--attribute curve should not be a
+straight line, but rather a curve. You specify this curve using a spline. The
+most logical ``coordinate rectangle'' used for this spline in our example would
+be |(0s,50)| and |(10s,100)| and we would like to specify something like
+%
+\begin{codeexample}[code only]
+ (0s,50) .. controls (5s,50) and (9s,100) .. (10s,100)
+\end{codeexample}
+%
+This would result in a time--attribute curve where the attribute at |50|
+changes slowly at 0\,s and also arrives slowly at |100| at 10\,s, but speeds up
+between these values.
+
+We call the first control point |(5s,50)| the ``exit control'' and call
+|(9s,100)| the ``entry control'': The first control dictates how quickly or
+slowly a time point is left, the second dictates how quickly or slowly we enter
+the next one.
+
+The control points are, however, not specified in the coordinate system
+indicated above. Rather, the rectangle |(0s,50)| to |(10s, 100)| gets
+normalized to |(0,0)| to |(1,1)|. The control point |(5s,50)| would thus become
+|(0.5,0)| and |(9s,100)| becomes |(0.9,1)|.
+
+\begin{key}{/tikz/animate/options/exit control=\marg{time fraction}\marg{value fraction}}
+ Specifies an exit control using two values as above. The spline from above
+ would be specified as follows:
+ %
+\begin{codeexample}[code only]
+exit control={0.5}{0},
+entry control={0.9}{1},
+0s = "50",
+10s = "100"
+\end{codeexample}
+
+ Note that the curve specified using exit and entry controls must be
+ ``well-behaved'' in the sense that exactly one value must be specified for
+ each point in time in the time interval.
+
+ In the next three example, we first specify a ``smooth'' exit from the
+ start position, then a smooth arrival at the end position, and, finally
+ both.
+ %
+\begin{codeexample}[animation list={0.333/\frac{1}{3},0.666/\frac{2}{3},1,1.333/1\frac{1}{3},1.666/1\frac{2}{3}}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \node :yshift = { begin on = click,
+ 0s = { exit control = {1}{0}, "0cm" },
+ 1s = "-5mm",
+ 2s = "-10mm" }
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+
+\begin{codeexample}[animation list={0.333/\frac{1}{3},0.666/\frac{2}{3},1,1.333/1\frac{1}{3},1.666/1\frac{2}{3}}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \node :yshift = { begin on = click,
+ 0s = "0cm",
+ 1s = "-5mm",
+ 2s = { entry control = {0}{1}, "-10mm" } }
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+
+\begin{codeexample}[animation list={0.333/\frac{1}{3},0.666/\frac{2}{3},1,1.333/1\frac{1}{3},1.666/1\frac{2}{3}}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \node :yshift = { begin on = click,
+ 0s = { exit control = {1}{0}, "0cm" },
+ 1s = "-5mm",
+ 2s = { entry control = {0}{1}, "-10mm" } }
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/animate/options/entry control=\marg{time fraction}\marg{value fraction}}
+ Works like |exit control|.
+\end{key}
+
+\begin{key}{/tikz/animate/options/ease in=\marg{fraction} (default 0.5)}
+ A shorthand for |entry control={1-|\meta{fraction}|}{1}|.
+\end{key}
+
+\begin{key}{/tikz/animate/options/ease out=\marg{fraction} (default 0.5)}
+ A shorthand for |exit control={|\meta{fraction}|}{1}|.
+\end{key}
+
+\begin{key}{/tikz/animate/options/ease=\marg{fraction} (default 0.5)}
+ A shorthand for |ease in=|\meta{fraction}|, ease out=|\meta{fraction}.
+
+ Note that since for the first time the entry control is ignored and,
+ similarly, for the last time the exit control is ignored, using the |ease|
+ key with an animation having only two times is particularly easy, since we
+ only need to set |ease| once:
+ %
+\begin{codeexample}[animation list={0.333/\frac{1}{3},0.666/\frac{2}{3},1,1.333/1\frac{1}{3},1.666/1\frac{2}{3}}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \node :yshift = { begin on = click, ease, 0s = "0cm", 2s = "-10mm" }
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{key}
+
+The opposite of having a smooth curve between two values, is to have a ``jump''
+from one value to the next. There are two keys for this:
+
+\begin{key}{/tikz/animate/options/stay}
+ Specifies that inside the time interval the value ``stays put'' at the
+ first value till the end of the interval, where it will jump to the second
+ value. This is similar to an exit control where the curve is ``infinitely
+ flat''.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2,2.5}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \node :yshift = { begin on = click,
+ 0s = "0cm",
+ 1s = {stay, "-5mm"},
+ 2s = "-10mm" }
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/animate/options/jump}
+ Works like the |stay| key, but will cause the value to ``jump to'' the new
+ value right at the beginning of the time interval. It is similar to an
+ entry control specifying a ``flat'' curve.
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2,2.5}]
+\tikz {
+ \foreach \i in {0,0.1,...,1} \draw (-0.9,.9-\i) -- ++(1.8,0);
+ \node :yshift = { begin on = click,
+ 0s = "0cm",
+ 1s = {jump, "-5mm"},
+ 2s = "-10mm" }
+ [fill = blue!20, draw = blue, very thick, circle] {Click me!};
+}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Snapshots}
+\label{section-anim-snap}
+
+Snapshots are a way of taking a ``photographic snapshot'' of an animation at a
+certain time and then insert these into \textsc{pdf} files (or, for that
+matter, Postscript files or files in any other format, including \textsc{svg}):
+You specify a time like |2s| and then \tikzname\ will compute what the
+animation ``would look like after 2s'' and insert the necessary graphics
+command for rendering the graphic objects in the correct way. Since this
+computation is done by \tikzname\ and since only ``normal'' graphics command
+are inserted into the output, snapshots work with all output formats.
+
+Apart from providing a fallback for \textsc{pdf}, snapshots are very useful by
+themselves: They make it easy to ``show'' how an animation unfolds on paper.
+For this, you simply typeset the same picture with the same animation several
+times (using a simple |\foreach| loop), but each time you set a different
+snapshot time. This will result in a sequence of pictures that depict the
+animation at different points in time and which can then be inserted alongside
+each other into the printed document. This approach has been used with the
+examples of animations in this manual.
+%
+\begin{codeexample}[]
+\foreach \t in {0.5, 1, 1.5, 2}
+ \tikz [make snapshot of = \t]
+ \fill :fill = {0s="black", 2s="red"} (0,0) circle [radius = 5mm];
+\end{codeexample}
+
+Creating snapshots is done using the following key:
+
+\begin{key}{/tikz/make snapshot of=\meta{time}}
+ When this key is used in a \TeX\ scope, animation commands given in the
+ scope do not add animation code to the output. Instead, \tikzname\ computes
+ the values the attributes of the animation would have at the specified
+ \meta{time} and inserts the necessary system layer command to set the
+ attribute to the computed values (some care has been taken to make this
+ computation match the computations done by viewer applications as best as
+ possible).
+ %
+\begin{codeexample}[]
+\tikz [make snapshot of = 1s] {
+ \fill :fill = { 0s = "black", 2s = "white" } (0,0) rectangle ++(1,1);
+ \fill :fill = { 1s = "black", 3s = "white" } (2,0) rectangle ++(1,1);
+}
+\end{codeexample}
+
+ The moment \meta{time} is best thought of as \meta{time} seconds after the
+ ``moment zero'' where all timelines start by default. Now, ``real''
+ animation may start at different time through user interaction, which
+ clearly makes no sense for snapshots. Nevertheless, you will sometimes wish
+ to have more control over when a timeline starts for the purposes of taking
+ snapshots. You can use the following key for this:
+
+ \begin{key}{/tikz/animate/options/begin snapshot=\meta{start time}}
+ Use this key on a timeline to specify that, only for purposes of taking
+ snapshots, the timeline starts at \meta{start time} rather than at
+ ``moment zero''. (Think of this as saying that the animation starts
+ when a virtual user clicks on the animation and this click occurs
+ \meta{start time} seconds after the general ``moment zero'', causing
+ the animation to ``lag behind'' by this amount of time.)
+ Computationally, for the timeline the \meta{start time} is subtracted
+ from the snapshot's \meta{time} when the value needs to be determined:
+ %
+\begin{codeexample}[]
+\tikz [make snapshot of = 1s] {
+ \fill :fill = { 0s = "black", 2s = "white",
+ begin snapshot = 1s } (0,0) rectangle ++(1,1);
+ \fill :fill = { 1s = "black", 3s = "white" } (2,0) rectangle ++(1,1);
+}
+\end{codeexample}
+ \end{key}
+
+ The computations of the values the animation ``would have'' are done
+ entirely by \tikzname, which has the big advantage is that no support from
+ the viewer application or the output format is needed -- snapshots work
+ with all output formats, not just with \textsc{svg}. However, computations
+ done by \tikzname\ are not always very precise and can be slow because of
+ \TeX's limitations. In addition, there are some further limitations when it
+ comes to \tikzname's computation of snapshot values:
+ %
+ \begin{itemize}
+ \item As mentioned above, except for |begin snapshot|, other commands
+ for specifying the beginning or end of a timeline based on user
+ interaction make no sense for timelines: The keys |begin|,
+ |begin on|, |end|, and |end on| are silently ignored.
+ \item The value |current value| for a value is forbidden since this
+ value is almost impossible to compute by \tikzname.
+ \item Accumulating repeats of a motion are (currently) not supported,
+ but should not rely on this.
+ \end{itemize}
+
+ When \meta{time} is empty, ``snapshot taking'' is switched off and
+ animation commands are inserted once more.
+\end{key}
+
+\begin{key}{/tikz/make snapshot after=\meta{time}}
+ Works exactly like |make snapshot of|, only the \meta{time} is interpreted
+ as $\meta{time} + \epsilon$. This only makes a difference at the end of a
+ timeline and when there are two or more values specified for the same time:
+ When there are several values specified for time~$t$, a normal snapshot for
+ time~$t$ uses the first value given for the attribute. In contrast, this
+ command would use the last one given. Similarly, when an animation timeline
+ ends at time $t$, a normal snapshot of time $t$ would use the last value of
+ the timeline, while this key would not apply the animation at all (it has
+ already ended at time $t + \epsilon$).
+ %
+\begin{codeexample}[]
+\tikz [make snapshot of = 2s]
+ \fill :fill = { 0s = "green", 2s = "red" } (0,0) rectangle ++(1,1);
+\tikz [make snapshot after = 2s]
+ \fill :fill = { 0s = "green", 2s = "red" } (0,0) rectangle ++(1,1);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/make snapshot if necessary=\meta{time} (default 0s)}
+ This key makes a snapshot of \meta{time} only when the output format does
+ not provide support for animations; if the output format supports
+ animations (like \textsc{svg}), then the command has no effect and
+ animations are created normally.
+
+ This manual is typeset with the following being set once are for all in
+ preamble:
+ %
+\begin{codeexample}[code only]
+\tikzset{make snapshot if necessary}
+\end{codeexample}
+
+ Because of this setting, in the \textsc{pdf} version of this document, all
+ animations are shown at the value they would have at moment~$0s$. In
+ contrast, in the \textsc{svg} version, the animations are created normally.
+
+ In both versions, the smaller pictures showing how the animation proceeds
+ over time are created using |make snapshot of| for the indicated times.
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-arrows.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-arrows.tex
new file mode 100644
index 0000000000..70aaf271ca
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-arrows.tex
@@ -0,0 +1,2543 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\section{Arrows}
+\label{section-tikz-arrows}
+
+\subsection{Overview}
+
+\tikzname\ allows you to add (multiple) arrow tips to the end of lines as in
+\tikz [baseline] \draw [->>] (0,.5ex) -- (3ex,.5ex); or in \tikz [baseline]
+\draw [-{Latex[]}] (0,.5ex) -- (3ex,.5ex);. It is possible to change which
+arrow tips are used ``on-the-fly'', you can have several arrow tips in a row,
+and you can change the appearance of each of them individually using a special
+syntax. The following example is a perhaps slightly ``excessive'' demonstration
+of what you can do (you need to load the |arrows.meta| library for it to work):
+%
+\begin{codeexample}[]
+\tikz {
+ \node [circle,draw] (A) {A};
+ \node [circle,draw] (B) [right=of A] {B};
+
+ \draw [draw = blue, thick,
+ arrows={
+ Computer Modern Rightarrow [sep]
+ - Latex[blue!50,length=8pt,bend,line width=0pt]
+ Stealth[length=8pt,open,bend,sep]}]
+ (A) edge [bend left=45] (B)
+ (B) edge [in=-110, out=-70,looseness=8] (B);
+}
+\end{codeexample}
+
+There are a number of predefined generic arrow tip kinds whose appearance you
+can modify in many ways using various options. It is also possible to define
+completely new arrow tip kinds, see Section~\ref{section-arrows}, but doing
+this is somewhat harder than configuring an existing kind (it is like the
+difference between using a font at different sizes or faces like italics,
+compared to designing a new font yourself).
+
+In the present section, we go over the various ways in which you can configure
+which particular arrow tips are \emph{used}. The glorious details of how new
+arrow tips can be defined are explained in Section~\ref{section-arrows}.
+
+At the end of the present section, Section~\ref{section-arrows-meta}, you will
+find a description of the different predefined arrow tips from the
+|arrows.meta| library.
+
+\emph{Remark:} Almost all of the features described in the following were
+introduced in version 3.0 of \tikzname. For compatibility reasons, the old
+arrow tips are still available. To differentiate between the old and new arrow
+tips, the following rule is used: The new, more powerful arrow tips start with
+an uppercase letter as in |Latex|, compared to the old arrow tip |latex|.
+
+\emph{Remark:} The libraries |arrows| and |arrows.spaced| are deprecated. Use
+|arrows.meta| instead/additionally, which allows you to do all that the old
+libraries offered, plus much more. However, the old libraries still work and
+you can even mix old and new arrow tips (only, the old arrow tips cannot be
+configured in the ways described in the rest of this section; saying |scale=2|
+for a |latex| arrow has no effect for instance, while for |Latex| arrows it
+doubles their size as one would expect.)
+
+
+\subsection{Where and When Arrow Tips Are Placed}
+\label{section-arrow-tips-where}
+
+In order to add arrow tips to the lines you draw, the following conditions must
+be met:
+%
+\begin{enumerate}
+ \item You have specified that arrow tips should be added to lines, using
+ the |arrows| key or its short form.
+ \item You set the |tips| key to some value that causes tips to be drawn
+ (to be explained later).
+ \item You do not use the |clip| key (directly or indirectly) with the
+ current path.
+ \item The path actually has two ``end points'' (it is not ``closed'').
+\end{enumerate}
+
+Let us start with an introduction to the basics of the |arrows| key:
+
+\begin{key}{/tikz/arrows=\meta{start arrow specification}|-|\meta{end arrow specification}}
+ This option sets the arrow tip(s) to be used at the start and end of lines.
+ An empty value as in |->| for the start indicates that no arrow tip should
+ be drawn at the start.%
+ \indexoption{arrows}
+
+ \emph{Note: Since the arrow option is so often used, you can leave out the
+ text |arrows=|.} What happens is that every (otherwise unknown) option that
+ contains a |-| is interpreted as an arrow specification.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[->] (0,0) -- (1,0);
+ \draw[>-Stealth] (0,0.3) -- (1,0.3);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the above example, the first start specification is empty and the second
+ is |>|. The end specifications are |>| for the first line and |Stealth| for
+ the second line. Note that it makes a difference whether |>| is used in a
+ start specification or in an end specification: In an end specification it
+ creates, as one would expect, a pointed tip at the end of the line. In the
+ start specification, however, it creates a ``reversed'' version if this
+ arrow -- which happens to be what one would expect here.
+
+ The above specifications are very simple and only select a single arrow tip
+ without any special configuration options, resulting in the ``natural''
+ versions of these arrow tips. It is also possible to ``configure'' arrow
+ tips in many different ways, as explained in detail in
+ Section~\ref{section-arrow-config} below by adding options in square
+ brackets following the arrow tip kind:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[-{Stealth[red]}] (0,0) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that in the example I had to surround the end specification by braces.
+ This is necessary so that \tikzname\ does not mistake the closing square
+ bracket of the |Stealth| arrow tip's options for the end of the options of
+ the |\draw| command. In general, you often need to add braces when
+ specifying arrow tips except for simple case like |->| or |<<->|, which are
+ pretty frequent, though. When in doubt, say
+ |arrows={|\meta{start spec}|-|\meta{end spec}|}|, that will always work.
+
+ It is also possible to specify multiple (different) arrow tips in a row
+ inside a specification, see Section~\ref{section-arrow-spec} below for
+ details.
+\end{key}
+
+As was pointed out earlier, to add arrow tips to a path, the path must have
+``end points'' and not be ``closed'' -- otherwise adding arrow tips makes
+little sense, after all. However, a path can actually consist of several
+subpath, which may be open or not and may even consist of only a single point
+(a single move-to). In this case, it is not immediately obvious, where arrow
+heads should be placed. The actual rules that \tikzname\ uses are governed by
+the setting of the key |tips|:
+
+\begin{key}{/pgf/tips=\meta{value} (default true, initially on draw)}
+ \keyalias{tikz}
+ This key governs in what situations arrow tips are added to a path. The
+ following \meta{values} are permissible:
+ %
+ \begin{itemize}
+ \item |true| (the value used when no \meta{value} is specified)
+ \item |proper|
+ \item |on draw| (the initial value, if the key has not yet been used
+ at all)
+ \item |on proper draw|
+ \item |never| or |false| (same effect)
+ \end{itemize}
+
+ Firstly, there are a whole bunch of situations where the setting of
+ these (or other) options causes no arrow tips to be shown:
+ %
+ \begin{itemize}
+ \item If no arrow tips have been specified (for instance, by having
+ said |arrows=-|), no arrow tips are drawn.
+ \item If the |clip| option is set, no arrow tips are drawn.
+ \item If |tips| has been set to |never| or |false|, no arrow tips are
+ drawn.
+ \item If |tips| has been set to |on draw| or |on proper draw|, but
+ the |draw| option is not set, no arrow tips are drawn.
+ \item If the path is empty (as in |\path ;|), no arrow tips are
+ drawn.
+ \item If at least one of the subpaths of a path is closed (|cycle| is
+ used somewhere or something like |circle| or |rectangle|), arrow
+ tips are never drawn anywhere -- even if there are open subpaths.
+ \end{itemize}
+
+ Now, if we pass all of the above tests, we must have a closer look at the
+ path. All its subpaths must now be open and there must be at least one
+ subpath. We consider the last one. Arrow tips will only be added to this
+ last subpath.
+
+ \begin{enumerate}
+ \item If this last subpath not degenerate (all coordinates on the
+ subpath are the same as in a single ``move-to'' |\path (0,0);| or
+ in a ``move-to'' followed by a ``line-to'' to the same position
+ as in |\path (1,2) -- (1,2)|), arrow tips are added to this last
+ subpath now.
+ \item If the last subpath is degenerate, we add arrow tips pointing
+ upward at the single coordinate mentioned in the path, but only
+ for |tips| begin set to |true| or to |on draw| -- and not for
+ |proper| nor for |on proper draw|. In other words, ``proper''
+ suppresses arrow tips on degenerate paths.
+ \end{enumerate}
+
+\begin{codeexample}[]
+% No path, no arrow tips:
+\tikz [<->] \draw;
+\end{codeexample}
+\begin{codeexample}[]
+% Degenerate path, draw arrow tips (but no path, it is degenerate...)
+\tikz [<->] \draw (0,0);
+\end{codeexample}
+\begin{codeexample}[]
+% Degenerate path, tips=proper suppresses arrows
+\tikz [<->] \draw [tips=proper] (0,0);
+\end{codeexample}
+\begin{codeexample}[]
+% Normal case:
+\tikz [<->] \draw (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+% Two subpaths, only second gets tips
+\tikz [<->] \draw (0,0) -- (1,0) (2,0) -- (3,0);
+\end{codeexample}
+\begin{codeexample}[]
+% Two subpaths, second degenerate, but still gets tips
+\tikz [<->] \draw (0,0) -- (1,0) (2,0);
+\end{codeexample}
+\begin{codeexample}[]
+% Two subpaths, second degenerate, proper suppresses them
+\tikz [<->] \draw [tips=on proper draw] (0,0) -- (1,0) (2,0);
+\end{codeexample}
+\begin{codeexample}[]
+% Two subpaths, but one is closed: No tips, even though last subpath is open
+\tikz [<->] \draw (0,0) circle[radius=2pt] (2,0) -- (3,0);
+\end{codeexample}
+\end{key}
+
+One common pitfall when arrow tips are added to a path should be addressed
+right here at the beginning: When \tikzname\ positions an arrow tip at the
+start, for all its computations it only takes into account the first segment of
+the subpath to which the arrow tip is added. This ``first segment'' is the
+first line-to or curve-to operation (or arc or parabola or a similar operation)
+of the path; but note that decorations like |snake| will add many small line
+segments to paths. The important point is that if this first segment is very
+small, namely smaller that the arrow tip itself, strange things may result. As
+will be explained in Section~\ref{section-arrow-flex}, \tikzname\ will modify
+the path by shortening the first segment and shortening a segment below its
+length may result in strange effects. Similarly, for tips at the end of a
+subpath, only the last segment is considered.
+
+The bottom line is that wherever an arrow tip is added to a path, the line
+segment where it is added should be ``long enough''.
+
+
+\subsection{Arrow Keys: Configuring the Appearance of a Single Arrow Tip}
+\label{section-arrow-config}
+
+For standard arrow tip kinds, like |Stealth| or |Latex| or |Bar|, you can
+easily change their size, aspect ratio, color, and other parameters. This is
+similar to selecting a font face from a font family: \emph{``This text''} is
+not just typeset in the font ``Computer Modern'', but rather in ``Computer
+Modern, italic face, 11pt size, medium weight, black color, no underline,
+\dots'' Similarly, an arrow tip is not just a ``Stealth'' arrow tip, but rather
+a ``Stealth arrow tip at its natural size, flexing, but not bending along the
+path, miter line caps, draw and fill colors identical to the path draw color,
+\dots''
+
+Just as most programs make it easy to ``configure'' which font should be used
+at a certain point in a text, \tikzname\ tries to make it easy to specify which
+configuration of an arrow tip should be used. You use \emph{arrow keys}, where
+a certain parameter like the |length| of an arrow is set to a given value using
+the standard key--value syntax. You can provide several arrow keys following an
+arrow tip kind in an arrow tip specification as in
+|Stealth[length=4pt,width=2pt]|.
+
+While selecting a font may be easy, \emph{designing} a new font is a highly
+creative and difficult process and more often than not, not all faces of a font
+are available on any given system. The difficulties involved in designing a new
+arrow tip are somewhat similar to designing a new letter for a font and, thus,
+it may also happen that not all configuration options are actually implemented
+for a given arrow tip. Naturally, for the standard arrow tips, all
+configuration options are available -- but for special-purpose arrow tips it
+may well happen that an arrow tip kind simply ``ignores'' some of the
+configurations given by you.
+
+Some of the keys explained in the following are defined in the library
+|arrows.meta|, others are always available. This has to do with the question of
+whether the arrow key needs to be supported directly in the \pgfname\ core or
+not. In general, the following explanations assume that |arrows.meta| has been
+loaded.
+
+
+\subsubsection{Size}
+
+The most important configuration parameter of an arrow tip is
+undoubtedly its size. The following two keys are the main keys that
+are important in this context:
+
+\begin{key}{/pgf/arrow keys/length=\meta{dimension}| |\opt{\meta{line width factor}}%
+ | |\opt{\meta{outer factor}}}
+ \label{length-arrow-key}%
+ This parameter is usually the most important parameter that governs the
+ size of an arrow tip: The \meta{dimension} that you provide dictates the
+ distance from the ``very tip'' of the arrow to its ``back end'' along the
+ line:
+ %
+\begin{codeexample}[]
+\tikz{
+ \draw [-{Stealth[length=5mm]}] (0,0) -- (2,0);
+ \draw [|<->|] (1.5,.4) -- node[above=1mm] {5mm} (2,.4);
+}
+\end{codeexample}
+\begin{codeexample}[]
+\tikz{
+ \draw [-{Latex[length=5mm]}] (0,0) -- (2,0);
+ \draw [|<->|] (1.5,.4) -- node[above=1mm] {5mm} (2,.4);
+}
+\end{codeexample}
+\begin{codeexample}[]
+\tikz{
+ \draw [-{Classical TikZ Rightarrow[length=5mm]}] (0,0) -- (2,0);
+ \draw [|<->|] (1.5,.6) -- node[above=1mm] {5mm} (2,.6);
+}
+\end{codeexample}
+
+ \medskip
+ \noindent \textbf{The Line Width Factors.}
+ Following the \meta{dimension}, you may put a space followed by a
+ \meta{line width factor}, which must be a plain number (no |pt| or |cm|
+ following). When you provide such a number, the size of the arrow tip is
+ not just \meta{dimension}, but rather $\meta{dimension} + \meta{line width
+ factor}\cdot w$ where $w$ is the width of the to-be-drawn path. This makes
+ it easy to vary the size of an arrow tip in accordance with the line width
+ -- usually a very good idea since thicker lines will need thicker arrow
+ tips.
+
+ As an example, when you write |length=0pt 5|, the length of the arrow will
+ be exactly five times the current line width. As another example, the
+ default length of a |Latex| arrow is |length=3pt 4.5 0.8|. Let us ignore
+ the 0.8 for a moment; the |4pt 4.5| then means that for the standard line
+ width of |0.4pt|, the length of a |Latex| arrow will be exactly 4.8pt (3pt
+ plus 4.5 times |0.4pt|).
+
+ Following the line width factor, you can additionally provide an
+ \meta{outer factor}, again preceded by a space (the |0.8| in the above
+ example). This factor is taken into consideration only when the |double|
+ option is used, that is, when a so-called ``inner line width''. For a
+ double line, we can identify three different ``line widths'', namely the
+ inner line width $w_i$, the line width $w_o$ of the two outer lines, and
+ the ``total line width'' $w_t = w_i + 2w_o$. In the below examples, we have
+ $w_i = 3\mathrm{pt}$, $w_o=1\mathrm{pt}$, and $w_t = 5\mathrm{pt}$. It is
+ not immediately clear which of these line widths should be considered as
+ $w$ in the above formula $\meta{dimension} + \meta{line width factor}\cdot
+ w$ for the computation of the length. One can argue both for $w_t$ and also
+ for $w_o$. Because of this, you use the \meta{outer factor} to decide on
+ one of them or even mix them: \tikzname\ sets $w = \meta{outer factor} w_o
+ + (1-\meta{outer factor})w_t$. Thus, when the outer factor is $0$, as in
+ the first of the following examples and as is the default when it is not
+ specified, the computed $w$ will be the total line width $w_t =
+ 5\mathrm{pt}$. Since $w=5\mathrm{pt}$, we get a total length of $15pt$ in
+ the first example (because of the factor |3|). In contrast, in the last
+ example, the outer factor is 1 and, thus, $w = w_o = \mathrm{1pt}$ and the
+ resulting length is 3pt. Finally, for the middle case, the ``middle''
+ between 5pt and 1pt is 3pt, so the length is 9pt.
+ %
+\begin{codeexample}[]
+\tikz \draw [line width=1pt, double distance=3pt,
+ arrows = {-Latex[length=0pt 3 0]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [line width=1pt, double distance=3pt,
+ arrows = {-Latex[length=0pt 3 .5]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [line width=1pt, double distance=3pt,
+ arrows = {-Latex[length=0pt 3 1]} ] (0,0) -- (1,0);
+\end{codeexample}
+
+ \medskip
+ \noindent \textbf{The Exact Length.}
+ For an arrow tip kind that is just an outline that is filled with a color,
+ the specified length should \emph{exactly} equal the distance from the tip
+ to the back end. However, when the arrow tip is drawn by stroking a line,
+ it is no longer obvious whether the |length| should refer to the extend of
+ the stroked lines' path or of the resulting pixels (which will be wider
+ because of the thickness of the stroking pen). The rules are as follows:
+ %
+ \begin{enumerate}
+ \item If the arrow tip consists of a closed path (like |Stealth| or
+ |Latex|), imagine the arrow tip drawn from left to right using a
+ miter line cap. Then the |length| should be the horizontal
+ distance from the first drawn ``pixel'' to the last drawn
+ ``pixel''. Thus, the thickness of the stroked line and also the
+ miter ends should be taken into account:
+ %
+\begin{codeexample}[]
+\tikz{
+ \draw [line width=1mm, -{Stealth[length=10mm, open]}]
+ (0,0) -- (2,0);
+ \draw [|<->|] (2,.6) -- node[above=1mm] {10mm} ++(-10mm,0);
+}
+\end{codeexample}
+ %
+ \item If, in the above case, the arrow is drawn using a round line
+ join (see Section~\ref{section-arrow-key-caps} for details on how
+ to select this), the size of the arrow should still be the same
+ as in the first case (that is, as if a miter join were used).
+ This creates some ``visual consistency'' if the two modes are
+ mixed or if you later one change the mode.
+ %
+\begin{codeexample}[]
+\tikz{
+ \draw [line width=1mm, -{Stealth[length=10mm, open, round]}]
+ (0,0) -- (2,0);
+ \draw [|<->|] (2,.6) -- node[above=1mm] {10mm} ++(-10mm,0);
+}
+\end{codeexample}
+ %
+ As the above example shows, however, a rounded arrow will still
+ exactly ``tip'' the point where the line should end (the point
+ |(2,0)| in the above case). It is only the scaling of the arrow
+ that is not affected.
+ \end{enumerate}
+\end{key}
+
+\begin{key}{/pgf/arrow keys/width=\meta{dimension}| |\opt{\meta{line width factor}}%
+ | |\opt{\meta{outer factor}}}
+ This key works line the |length| key, only it specifies the ``width'' of
+ the arrow tip; so if width and length are identical, the arrow will just
+ touch the borders of a square. (An exception to this rule are ``halved''
+ arrow tips, see Section~\ref{section-arrow-key-harpoon}.) The meaning of
+ the two optional factor numbers following the \meta{dimension} is the same
+ as for the |length| key.
+ %
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Latex[width=10pt, length=10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Latex[width=0pt 10, length=10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+\end{key}
+
+\begin{key}{/pgf/arrow keys/width'=\meta{dimension}| |\opt{\meta{length
+ factor}| |\opt{\meta{line width factor}}}}
+ The key (note the prime) has a similar effect as the |width| key. The
+ difference is that the second, still optional parameter \meta{length
+ factor} specifies the width of the key not as a multiple of the line width,
+ but as a multiple of the arrow length.
+
+ The idea is that if you write, say, |width'=0pt 0.5|, the width of the
+ arrow will be half its length. Indeed, for standard arrow tips like
+ |Stealth| the default width is specified in this way so that if you change
+ the length of an arrow tip, you also change the width in such a way that
+ the aspect ratio of the arrow tip is kept. The other way round, if you
+ modify the factor in |width'| without changing the length, you change the
+ aspect ratio of the arrow tip.
+
+ Note that later changes of the length are taken into account for the
+ computation. For instance, if you write
+ %
+\begin{codeexample}[code only]
+length = 10pt, width'=5pt 2, length=7pt
+\end{codeexample}
+ %
+ the resulting width will be $19\mathrm{pt} = 5\mathrm{pt} + 2\cdot
+ 7\mathrm{pt}$.
+ %
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Latex[width'=0pt .5, length=10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Latex[width'=0pt .5, length=15pt]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ The third, also optional, parameter allows you to add a multiple of the
+ line width to the value computed in terms of the length.
+\end{key}
+
+
+\begin{key}{/pgf/arrow keys/inset=\meta{dimension}| |\opt{\meta{line width factor}}%
+ | |\opt{\meta{outer factor}}}
+ The key is relevant only for some arrow tips such as the |Stealth| arrow
+ tip. It specifies a distance by which something inside the arrow tip is set
+ inwards; for the |Stealth| arrow tip it is the distance by which the back
+ angle is moved inwards.
+
+ The computation of the distance works in the same way as for |length| and
+ |width|: To the \meta{dimension} we add \meta{line width factor} times that
+ line width, where the line width is computed based on the \meta{outer
+ factor} as described for the |length| key.
+ %
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Stealth[length=10pt, inset=5pt]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Stealth[length=10pt, inset=2pt]}] (0,0) -- (1,0);
+\end{codeexample}
+
+ For most arrows for which there is no ``natural inset'' like, say, |Latex|,
+ this key has no effect.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/inset'=\meta{dimension}| |\opt{\meta{length factor}}| |\opt{\meta{line width factor}}}
+ This key works like |inset|, only like |width'| the second parameter is a
+ factor of the arrow length rather than of the line width. For instance, the
+ |Stealth| arrow sets |inset'| to |0pt 0.325| to ensure that the inset is
+ always at $13/40$th of the arrow length if nothing else is specified.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/angle=\meta{angle}|:|\meta{dimension}%
+ | |\opt{\meta{line width factor}}%
+ | |\opt{\meta{outer factor}}}
+ This key sets the |length| and the |width| of an arrow tip at the same
+ time. The length will be the cosine of \meta{angle}, while the width will
+ be twice the sine of half the \meta{angle} (this slightly awkward rule
+ ensures that a |Stealth| arrow will have an opening angle of \meta{angle}
+ at its tip if this option is used). As for the |length| key, if the
+ optional factors are given, they add a certain multiple of the line width
+ to the \meta{dimension} before the sine and cosines are computed.
+ %
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Stealth[inset=0pt, angle=90:10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Stealth[inset=0pt, angle=30:10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/arrow keys/angle'=\meta{angle}}
+ Sets the width of the arrow to twice the tangent of $\meta{angle}/2$ times
+ the arrow length. This results in an arrow tip with an opening angle of
+ \meta{angle} at its tip and with the specified |length| unchanged.
+ %
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Stealth[inset=0pt, length=10pt, angle'=90]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [arrows = {-Stealth[inset=0pt, length=10pt, angle'=30]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Scaling}
+
+In the previous section we saw that there are many options for getting ``fine
+control'' overt the length and width of arrow tips. However, in some cases, you
+do not really care whether the arrow tip is 4pt long or 4.2pt long, you ``just
+want it to be a little bit larger than usual''. In such cases, the following
+keys are useful:
+
+\begin{key}{/pgf/arrows keys/scale=\meta{factor} (initially 1)}
+ After all the other options listed in the previous (and also the following
+ sections) have been processed, \tikzname\ applies a \emph{scaling} to the
+ computed length, inset, and width of the arrow tip (and, possibly, to other
+ size parameters defined by special-purpose arrow tip kinds). Everything is
+ simply scaled by the given \meta{factor}.
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [arrows = {-Stealth[]}] (0,1) -- (1,1);
+ \draw [arrows = {-Stealth[scale=1.5]}] (0,0.5) -- (1,0.5);
+ \draw [arrows = {-Stealth[scale=2]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+ Note that scaling has \emph{no} effect on the line width (as usual) and
+ also not on the arrow padding (the |sep|).
+\end{key}
+
+You can get even more fine-grained control over scaling using the following
+keys (the |scale| key is just a shorthand for setting both of the following
+keys simultaneously):
+
+\begin{key}{/pgf/arrows keys/scale length=\meta{factor} (initially 1)}
+ This factor works like |scale|, only it is applied only to dimensions
+ ``along the axis of the arrow'', that is, to the length and to the inset,
+ but not to the width.
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [arrows = {-Stealth[]}] (0,1) -- (1,1);
+ \draw [arrows = {-Stealth[scale length=1.5]}] (0,0.5) -- (1,0.5);
+ \draw [arrows = {-Stealth[scale length=2]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/arrows keys/scale width=\meta{factor} (initially 1)}
+ Like |scale length|, but for dimensions related to the width.
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [arrows = {-Stealth[]}] (0,1) -- (1,1);
+ \draw [arrows = {-Stealth[scale width=1.5]}] (0,0.5) -- (1,0.5);
+ \draw [arrows = {-Stealth[scale width=2]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Arc Angles}
+
+A few arrow tips consist mainly of arcs, whose length can be specified. For
+these arrow tips, you use the following key:
+
+\begin{key}{/pgf/arrow keys/arc=\meta{degrees} (initially 180)}
+ Sets the angle of arcs in arrows to \meta{degrees}. Note that this key is
+ quite different from the |angle| key, which is ``just a fancy way of
+ setting the length and width''. In contrast, the |arc| key is used to set
+ the degrees of arcs that are part of an arrow tip:
+ %
+\begin{codeexample}[]
+\tikz [ultra thick] {
+ \draw [arrows = {-Hooks[]}] (0,1) -- (1,1);
+ \draw [arrows = {-Hooks[arc=90]}] (0,0.5) -- (1,0.5);
+ \draw [arrows = {-Hooks[arc=270]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Slanting}
+
+You can ``slant'' arrow tips using the following key:
+
+\begin{key}{/pgf/arrow keys/slant=\meta{factor} (initially 0)}
+ Slanting is used to create an ``italics'' effect for arrow tips: All arrow
+ tips get ``slanted'' a little bit relative to the axis of the arrow:
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [arrows = {->[]}] (0,1) -- (1,1);
+ \draw [arrows = {->[slant=.5]}] (0,0.5) -- (1,0.5);
+ \draw [arrows = {->[slant=1]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+ There is one thing to note about slanting: Slanting is done using a
+ so-called ``canvas transformation'' and has no effect on positioning of
+ the arrow tip. In particular, if an arrow tip gets slanted so strongly that
+ it starts to protrude over the arrow tip end, this does not change the
+ positioning of the arrow tip.
+
+ Here is another example where slanting is used to match italic text:
+ %
+\begin{codeexample}[]
+\tikz [>={[slant=.3] To[] To[]}]
+ \graph [math nodes] { A -> B <-> C };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Reversing, Halving, Swapping}
+\label{section-arrow-key-harpoon}
+
+\begin{key}{/pgf/arrow keys/reversed}
+ Adding this key to an arrow tip will ``reverse its direction'' so that is
+ points in the opposite direction (but is still at that end of the line
+ where the non-reversed arrow tip would have been drawn; so only the tip is
+ reversed). For most arrow tips, this just results in an internal flip of a
+ coordinate system, but some arrow tips actually use a slightly different
+ version of the tip for reversed arrow tips (namely when the joining of the
+ tip with the line would look strange). All of this happens automatically,
+ so you do not need to worry about this.
+
+ If you apply this key twice, the effect cancels, which is useful for the
+ definition of shorthands (which will be discussed later).
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[reversed]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[reversed, reversed]}] (0,0) -- (1,0);
+\end{codeexample}
+\end{key}
+
+\begin{key}{/pgf/arrow keys/harpoon}
+ The key requests that only the ``left half'' of the arrow tip should drawn:
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[harpoon]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {->[harpoon]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ Unlike the |reversed| key, which all arrows tip kinds support at least in a
+ basic way, designers of arrow tips really need to take this key into
+ account in their arrow tip code and often a lot of special attention needs
+ to do be paid to this key in the implementation. For this reason, only some
+ arrow tips will support it.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/swap}
+ This key flips that arrow tip along the axis of the line. It makes sense
+ only for asymmetric arrow tips like the harpoons created using the
+ |harpoon| option.
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[harpoon]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[harpoon,swap]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ Swapping is always possible, no special code is needed on behalf of an
+ arrow tip implementer.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/left}
+ A shorthand for |harpoon|.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/right}
+ A shorthand for |harpoon, swap|.
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[left]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [arrows = {-Stealth[right]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Coloring}
+
+Arrow tips are drawn using the same basic mechanisms as normal paths, so arrow
+tips can be stroked (drawn) and/or filled. However, we usually want the color
+of arrow tips to be identical to the color used to draw the path, even if a
+different color is used for filling the path. On the other hand, we may also
+sometimes wish to use a special color for the arrow tips that is different from
+both the line and fill colors of the main path.
+
+The following options allow you to configure how arrow tips are colored:
+
+\begin{key}{/pgf/arrow keys/color=\meta{color or empty} (initially \normalfont empty)}
+ Normally, an arrow tip gets the same color as the path to which it is
+ attached. More precisely, it will get the current ``draw color'', also
+ known as ``stroke color'', which you can set using |draw=|\meta{some
+ color}. By adding the option |color=| to an arrow tip (note that an
+ ``empty'' color is specified in this way), you ask that the arrow tip gets
+ this default draw color of the path. Since this is the default behaviour,
+ you usually do not need to specify anything:
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [red, arrows = {-Stealth}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [blue, arrows = {-Stealth}] (0,0) -- (1,0);
+\end{codeexample}
+
+ Now, when you provide a \meta{color} with this option, you request that the
+ arrow tip should get this color \emph{instead} of the color of the main
+ path:
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [red, arrows = {-Stealth[color=blue]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [red, arrows = {-Stealth[color=black]}] (0,0) -- (1,0);
+\end{codeexample}
+
+ Similar to the |color| option used in normal \tikzname\ options, you may
+ omit the |color=| part of the option. Whenever an \meta{arrow key} is
+ encountered that \tikzname\ does not recognize, it will test whether the
+ key is the name of a color and, if so, execute |color=|\meta{arrow key}.
+ So, the first of the above examples can be rewritten as follows:
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [red, arrows = {-Stealth[blue]}] (0,0) -- (1,0);
+\end{codeexample}
+
+ The \meta{color} will apply both to any drawing and filling operations used
+ to construct the path. For instance, even though the |Stealth| arrow tips
+ looks like a filled quadrilateral, it is actually constructed by drawing a
+ quadrilateral and then filling it in the same color as the drawing (see the
+ |fill| option below to see the difference).
+
+ When |color| is set to an empty text, the drawing color is always used to
+ fill the arrow tips, even if a different color is specified for filling the
+ path:
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [draw=red, fill=red!50, arrows = {-Stealth[length=10pt]}]
+ (0,0) -- (1,1) -- (2,0);
+\end{codeexample}
+ %
+ As you can see in the above example, the filled area is not quite what you
+ might have expected. The reason is that the path was actually internally
+ shortened a bit so that the end of the ``fat line'' as inside the arrow tip
+ and we get a ``clear'' arrow tip.
+
+ In general, it is a good idea not to add arrow tips to paths that are
+ filled.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/fill=\meta{color or |none|}}
+ Use this key to explicitly set the color used for filling the arrow tips.
+ This color can be different from the color used to draw (stroke) the arrow
+ tip:
+ %
+\begin{codeexample}[width=3cm]
+\tikz {
+ \draw [help lines] (0,-.5) grid [step=1mm] (1,.5);
+ \draw [thick, red, arrows = {-Stealth[fill=white,length=15pt]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+ You can also specify the special ``color'' |none|. In this case, the arrow
+ tip is not filled at all (not even with white):
+ %
+\begin{codeexample}[width=3cm]
+\tikz {
+ \draw [help lines] (0,-.5) grid [step=1mm] (1,.5);
+ \draw [thick, red, arrows = {-Stealth[fill=none,length=15pt]}] (0,0) -- (1,0);
+}
+\end{codeexample}
+ %
+ Note that such ``open'' arrow tips are a bit difficult to draw in some
+ case: The problem is that the line must be shortened by just the right
+ amount so that it ends exactly on the back end of the arrow tip. In some
+ cases, especially when double lines are used, this will not be possible.
+
+ \begin{key}{/pgf/arrow keys/open}
+ A shorthand for |fill=none|.
+ \end{key}
+
+ When you use both the |color| and |fill| option, the |color| option must
+ come first since it will reset the filling to the color specified for
+ drawing.
+ %
+\begin{codeexample}[width=3cm]
+\tikz {
+ \draw [help lines] (0,-.5) grid [step=1mm] (1,.5);
+ \draw [thick, red, arrows = {-Stealth[color=blue, fill=white, length=15pt]}]
+ (0,0) -- (1,0);
+}
+\end{codeexample}
+
+ Note that by setting |fill| to the special color |pgffillcolor|, you can
+ cause the arrow tips to be filled using the color used to fill the main
+ path. (This special color is always available and always set to the current
+ filling color of the graphic state.):
+ %
+\begin{codeexample}[width=3cm]
+\tikz [ultra thick] \draw [draw=red, fill=red!50,
+ arrows = {-Stealth[length=15pt, fill=pgffillcolor]}]
+ (0,0) -- (1,1) -- (2,0);
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Line Styling}
+\label{section-arrow-key-caps}
+
+Arrow tips are created by drawing and possibly filling a path that makes up the
+arrow tip. When \tikzname\ draws a path, there are different ways in which such
+a path can be drawn (such as dashing). Three particularly important parameters
+are the line join, the line cap, see Section~\ref{section-line-cap} for an
+introduction, and the line width (thickness).
+
+\tikzname\ resets the line cap and line join each time it draws an arrow tip
+since you usually do not want their settings to ``spill over'' to the way the
+arrow tips are drawn. You can, however, change there values explicitly for an
+arrow tip:
+
+\begin{key}{/pgf/arrow keys/line cap=\meta{|round| or |butt|}}
+ Sets the line cap of all lines that are drawn in the arrow to a round cap
+ or a butt cap. (Unlike for normal lines, the |rect| cap is not allowed.)
+ Naturally, this key has no effect for arrows whose paths are closed.
+
+ Each arrow tip has a default value for the line cap, which can be overruled
+ using this option.
+
+ Changing the cap should have no effect on the size of the arrow. However,
+ it will have an effect on where the exact ``tip'' of the arrow is since
+ this will always be exactly at the end of the arrow:
+ %
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Computer Modern Rightarrow[line cap=butt]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Computer Modern Rightarrow[line cap=round]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Bracket[reversed,line cap=butt]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Bracket[reversed,line cap=round]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/arrow keys/line join=\meta{|round| or |miter|}}
+ Sets the line join to round or miter (|bevel| is not allowed). This time,
+ the key only has an effect on paths that have ``corners'' in them. The same
+ rules as for |line cap| apply: the size is not affects, but the tip end is:
+ %
+ \begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Computer Modern Rightarrow[line join=miter]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Computer Modern Rightarrow[line join=round]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Bracket[reversed,line join=miter]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Bracket[reversed,line join=round]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+The following keys set both of the above:
+
+\begin{key}{/pgf/arrow keys/round}
+ A shorthand for |line cap=round, line join=round|, resulting in ``rounded''
+ arrow heads.
+ %
+ \begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Computer Modern Rightarrow[round]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Bracket[reversed,round]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/arrow keys/sharp}
+ A shorthand for |line cap=butt, line join=miter|, resulting in ``sharp'' or
+ ``pointed'' arrow heads.
+ \begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Computer Modern Rightarrow[sharp]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=3cm]
+\tikz [line width=2mm]
+ \draw [arrows = {-Bracket[reversed,sharp]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+You can also set the width of lines used inside arrow tips:
+
+\begin{key}{/pgf/arrow keys/line width=\meta{dimension}| |\opt{\meta{line width factor}}%
+ | |\opt{\meta{outer factor}}}
+ This key sets the line width inside an arrow tip for drawing (out)lines of
+ the arrow tip. When you set this width to |0pt|, which makes sense only for
+ closed tips, the arrow tip is only filled. This can result in better
+ rendering of some small arrow tips and in case of bend arrow tips (because
+ the line joins will also be bend and not ``mitered''.)
+
+ The meaning of the factors is as usual the same as for |length| or |width|.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \draw [arrows = {-Latex[line width=0.1pt, fill=white, length=10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[width=2cm]
+\tikz \draw [arrows = {-Latex[line width=1pt, fill=white, length=10pt]}] (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/arrow keys/line width'=\meta{dimension}| |\opt{\meta{length factor}}}
+ Works like |line width| only the factor is with respect to the |length|.
+\end{key}
+
+
+\subsubsection{Bending and Flexing}
+\label{section-arrow-flex}
+
+Up to now, we have only added arrow tip to the end of straight lines, which is
+in some sense ``easy''. Things get far more difficult, if the line to which we
+wish to end an arrow tip is curved. In the following, we have a look at the
+different actions that can be taken and how they can be configured.
+
+To get a feeling for the difficulties involved, consider the following
+situation: We have a ``gray wall'' at the $x$-coordinate of and a red line that
+ends in its middle.
+%
+\begin{codeexample}[]
+\def\wall{ \fill [fill=black!50] (1,-.5) rectangle (2,.5);
+ \pattern [pattern=bricks] (1,-.5) rectangle (2,.5);
+ \draw [line width=1pt] (1cm+.5pt,-.5) -- ++(0,1); }
+\begin{tikzpicture}
+ \wall
+ % The "line"
+ \draw [red,line width=1mm] (-1,0) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+Now we wish to add a blue open arrow tip the red line like, say,
+|Stealth[length=1cm,open,blue]|:
+%
+\def\wall{ \fill [fill=black!50] (1,-.5) rectangle (2,.5);
+ \pattern [pattern=bricks] (1,-.5) rectangle (2,.5);
+ \draw [line width=1pt] (1cm+.5pt,-.5) -- ++(0,1); }
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red,line width=1mm,-{Stealth[length=1cm,open,blue]}]
+ (-1,0) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+There are several noteworthy things about the blue arrow tip:
+%
+\begin{enumerate}
+ \item Notice that the red line no longer goes all the way to the wall.
+ Indeed, the red line ends more or less exactly where it meets the
+ blue line, leaving the arrow tip empty. Now, recall that the red line
+ was supposed to be the path |(-2,0)--(1,0)|; however, this path has
+ obviously become much shorter (by 6.25mm to be precise). This effect
+ is called \emph{path shortening} in \tikzname.
+ \item The very tip of the arrow just ``touches'' the wall, even we zoom
+ out a lot. This point, where the original path ended and where the
+ arrow tip should now lie, is called the \emph{tip end} in \tikzname.
+ \item Finally, the point where the red line touches the blue line is the
+ point where the original path ``visually ends''. Notice that this is
+ not the same as the point that lies at a distance of the arrow's
+ |length| from the wall -- rather it lies at a distance of |length|
+ minus the |inset|. Let us call this point the \emph{visual
+ end} of the arrow.
+\end{enumerate}
+
+As pointed out earlier, for straight lines, shortening the path and rotating
+and shifting the arrow tip so that it ends precisely at the tip end and the
+visual end lies on a line from the tip end to the start of the line is
+relatively easy.
+
+For curved lines, things are much more difficult and \tikzname\ copes with the
+difficulties in different ways, depending on which options you add to arrows.
+Here is now a curved red line to which we wish to add our arrow tip (the
+original straight red line is shown in light red):
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm] (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+The first way of dealing with curved lines is dubbed the ``quick and dirty''
+way (although the option for selecting this option is politely just called
+``|quick|'' \dots):
+
+\begin{key}{/pgf/arrow keys/quick}
+ Recall that curves in \tikzname\ are actually Bézier curves, which means
+ that they start and end at certain points and we specify two vectors, one
+ for the start and one for the end, that provide tangents to the curve at
+ these points. In particular, for the end of the curve, there is a point
+ called the \emph{second support point} of the curve such that a tangent to
+ the curve at the end goes through this point. In our above example, the
+ second support point is at the middle of the light red line and, indeed, a
+ tangent to the red line at the point touching the wall is perfectly
+ horizontal.
+
+ In order to add our arrow tip to the curved path, our first objective is to
+ ``shorten'' the path by 6.25mm. Unfortunately, this is now much more
+ difficult than for a straight path. When the |quick| option is added to an
+ arrow tip (it is also the default if no special libraries are loaded), we
+ cheat somewhat: Instead of really moving along 6.25mm along the path, we
+ simply shift the end of the curve by 6.25mm \emph{along the tangent} (which
+ is easy to compute). We also have to shift the second support point by the
+ same amount to ensure that the line still has the same tangent at the end.
+ This will result in the following:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=1cm,open,blue,quick]}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ They main problem with the above picture is that the red line is no longer
+ equal to the original red line (notice much sharper curvature near its
+ end). In our example this is not such a bad thing, but it certainly ``not a
+ nice thing'' that adding arrow tips to a curve changes the overall shape of
+ the curves. This is especially bothersome if there are several similar
+ curves that have different arrow heads. In this case, the similar curves
+ now suddenly look different.
+
+ Another big problem with the above approach is that it works only well if
+ there is only a single arrow tip. When there are multiple ones, simply
+ shifting them along the tangent as the |quick| option does produces
+ less-than-satisfactory results:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{[quick,sep]>>>}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Note that the third arrow tip does not really lie on the curve any more.
+\end{key}
+
+Because of the shortcomings of the |quick| key, more powerful mechanisms for
+shortening lines and rotating arrows tips have been implemented. To use them,
+you need to load the following library:
+
+\begin{tikzlibrary}{bending}
+ Load this library to use the |flex|, |flex'|, or |bending| arrow keys. When
+ this library is loaded, |flex| becomes the default mode that is used with
+ all paths, unless |quick| is explicitly selected for the arrow tip.
+\end{tikzlibrary}
+
+\begin{key}{/pgf/arrow keys/flex=\opt{\meta{factor}} (default 1)}
+ When the |bending| library is loaded, this key is applied to all arrow tips
+ by default. It has the following effect:
+ %
+ \begin{enumerate}
+ \item Instead of simply shifting the visual end of the arrow along
+ the tangent of the curve's end, we really move it along the curve
+ by the necessary distance. This operation is more expensive than
+ the |quick| operation -- but not \emph{that} expensive, only
+ expensive enough so that it is not selected by default for all
+ arrow tips. Indeed, some compromises are made in the
+ implementation where accuracy was traded for speed, so the
+ distance by which the line end is shifted is not necessarily
+ \emph{exactly} 6.25mm; only something reasonably close.
+ \item The supports of the line are updated accordingly so that the
+ shortened line will still follow \emph{exactly} the original
+ line. This means that the curve deformation effect caused by the
+ |quick| command does not happen here.
+ \item Next, the arrow tip is rotated and shifted as follows: First,
+ we shift it so that its tip is exactly at the tip end, where the
+ original line ended. Then, the arrow is rotated so the \emph{the
+ visual end lies on the line}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=1cm,open,blue,flex]}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{enumerate}
+
+ As can be seen in the example, the |flex| option gives a result that is
+ visually pleasing and does not deform the path.
+
+ There is, however, one possible problem with the |flex| option: The arrow
+ tip no longer points along the tangent of the end of the path. This may or
+ may not be a problem, put especially for larger arrow tips readers will use
+ the orientation of the arrow head to gauge the direction of the tangent of
+ the line. If this tangent is important (for example, if it should be
+ horizontal), then it may be necessary to enforce that the arrow tip
+ ``really points in the direction of the tangent''.
+
+ To achieve this, the |flex| option takes an optional \meta{factor}
+ parameter, which defaults to |1|. This factor specifies how much the arrow
+ tip should be rotated: If set to |0|, the arrow points exactly along a
+ tangent to curve at its tip. If set to |1|, the arrow point exactly along a
+ line from the visual end point on the curve to the tip. For values in the
+ middle, we interpolate the rotation between these two extremes; so
+ |flex=.5| will rotate the arrow's visual end ``halfway away from the
+ tangent towards the actual position on the line''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=1cm,open,blue,flex=0]}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=1cm,open,blue,flex=.5]}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Note how in the above examples the red line is visible inside the open
+ arrow tip. Open arrow tips do not go well with a flex value other than~|1|.
+ Here is a more realistic use of the |flex=0| key:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=1cm,flex=0]}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ If there are several arrow tips on a path, the |flex| option positions them
+ independently, so that each of them lies optimally on the path:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{[flex,sep]>>>}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/arrow keys/flex'=\opt{\meta{factor}} (default 1)}
+ The |flex'| key is almost identical to the |flex| key. The only difference
+ is that a factor of |1| corresponds to rotating the arrow tip so that the
+ instead of the visual end, the ``ultimate back end'' of the arrow tip lies
+ on the red path. In the example instead of having the arrow tip at a
+ distance of |6.25mm| from the tip lie on the path, we have the point at a
+ distance of |1cm| from the tip lie on the path:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=1cm,open,blue,flex']}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Otherwise, the factor works as for |flex| and, indeed |flex=0| and
+ |flex'=0| have the same effect.
+
+ The main use of this option is not so much with an arrow tip like |Stealth|
+ but rather with tips like the standard |>| in the context of a strongly
+ curved line:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Computer Modern Rightarrow[flex]}]
+ (0,-.5) .. controls (1,-.5) and (0.5,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ In the example, the |flex| option does not really flex the arrow since for
+ a tip like the Computer Modern arrow, the visual end is the same as the
+ arrow tip -- after all, the red line does, indeed, end almost exactly where
+ it used to end.
+
+ Nevertheless, you may feel that the arrow tip looks ``wrong'' in the sense
+ that it should be rotated. This is exactly what the |flex'| option does
+ since it allows us to align the ``back end'' of the tip with the red line:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Computer Modern Rightarrow[flex'=.75]}]
+ (0,-.5) .. controls (1,-.5) and (0.5,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ In the example, I used |flex'=.75| so as not to overpronounce the effect.
+ Usually, you will have to fiddle with it sometime to get the ``perfectly
+ aligned arrow tip'', but a value of |.75| is usually a good start.
+\end{key}
+
+\begin{key}{/pgf/arrow keys/bend}
+ \emph{Bending} an arrow tip is a radical solution to the problem of
+ positioning arrow tips on a curved line: The arrow tip is no longer
+ ``rigid'' but the drawing itself will now bend along the curve. This has
+ the advantage that all the problems of flexing with wrong tangents and
+ overflexing disappear. The downsides are longer computation times (bending
+ an arrow is \emph{much} more expensive that flexing it, let alone than
+ quick mode) and also the fact that excessive bending can lead to ugly arrow
+ tips. On the other hand, for most arrow tips their bend version are
+ visually quite pleasing and create a sophisticated look:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[length=20pt,bend]}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{[bend,sep]>>>}]
+ (-1,-.5) .. controls (0,-.5) and (0,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \wall
+ \draw [red!25,line width=1mm] (-1,0) -- (1,0);
+ \draw [red,line width=1mm,-{Stealth[bend,round,length=20pt]}]
+ (0,-.5) .. controls (1,-.5) and (0.25,0) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Arrow Tip Specifications}
+\label{section-arrow-spec}
+
+\subsubsection{Syntax}
+
+When you select the arrow tips for the start and the end of a path, you can
+specify a whole sequence of arrow tips, each having its own local options. At
+the beginning of this section, it was pointed out that the syntax for selecting
+the start and end arrow tips is the following:
+%
+\begin{quote}
+ \meta{start specification}|-|\meta{end specification}
+\end{quote}
+
+We now have a closer look at what these specifications may look like. The
+general syntax of the \meta{start specification} is as follows:
+%
+\begin{quote}
+ \opt{|[|\meta{options for all tips}|]|} \meta{first arrow tip spec}
+ \meta{second arrow tip spec} \meta{third arrow tip spec} \dots
+\end{quote}
+%
+As can be seen, an arrow tip specification may start with some options in
+brackets. If this is the case, the \meta{options for all tips} will, indeed, be
+applied to all arrow tips that follow. (We will see, in a moment, that there
+are even more places where options may be specified and a list of the ordering
+in which the options are applied will be given later.)
+
+The main part of a specification is taken up by a sequence of individual arrow
+tip specifications. Such a specification can be of three kinds:
+%
+\begin{enumerate}
+ \item It can be of the form \meta{arrow tip kind
+ name}|[|\meta{options}|]|.
+ \item It can be of the form \meta{shorthand}|[|\meta{options}|]|.
+ \item It can be of the form \meta{single char
+ shorthand}\opt{|[|\meta{options}|]|}. Note that only for this form
+ the brackets are optional.
+\end{enumerate}
+
+The easiest kind is the first one: This adds an arrow tip of the kind
+\meta{arrow tip kind name} to the sequence of arrow tips with the
+\meta{options} applied to it at the start (for the \meta{start specification})
+or at the end (for the \meta{end specification}). Note that for the \meta{start
+specification} the first arrow tip specified in this way will be at the very
+start of the curve, while for the \meta{end specification} the ordering is
+reversed: The last arrow tip specified will be at the very end of the curve.
+This implies that a specification like
+%
+\begin{quote}
+ |Stealth[] Latex[] - Latex[] Stealth[]|
+\end{quote}
+%
+will give perfectly symmetric arrow tips on a line (as one would expect).
+
+It is important that even if there are no \meta{options} for an arrow tip, the
+square brackets still need to be written to indicate the end of the arrow tip's
+name. Indeed, the opening brackets are used to divide the arrow tip
+specification into names.
+
+Instead of a \meta{arrow tip kind name}, you may also provide the name of a
+so-called \emph{shorthand}. Shorthands look like normal arrow tip kind names
+and, indeed, you will often be using shorthands without noticing that you do.
+The idea is that instead of, say, |Computer Modern Rightarrow| you might wish
+to just write |Rightarrow| or perhaps just |To| or even just |>|. For this, you
+can create a shorthand that tells \tikzname\ that whenever this shorthand is
+used, another arrow tip kind is meant. (Actually, shorthands are somewhat more
+powerful, we have a detailed look at them in
+Section~\ref{section-arrow-tip-macro}.) For shorthands, the same rules apply as
+for normal arrow tip kinds: You \emph{need} to provide brackets so that
+\tikzname\ can find the end of the name inside a longer specification.
+
+The third kind of arrow tip specifications consist of just a single letter like
+|>| or |)| or |*| or even |o| or |x| (but you may not use |[|, |]|, or |-|
+since they will confuse the parser). These single letter arrow specifications
+will invariably be shorthands that select some ``real'' arrow tip instead. An
+important feature of single letter arrow tips is that they do \emph{not} need
+to be followed by options (but they may).
+
+Now, since we can use any letter for single letter shorthands, how can
+\tikzname\ tell whether by |foo[]| we mean an arrow tip kind |foo| without any
+options or whether we mean an arrow tip called |f|, followed by two arrow tips
+called |o|? Or perhaps an arrow tip called |f| followed by an arrow tip called
+|oo|? To solve this problem, the following rule is used to determine which of
+the three possible specifications listed above applies: First, we check whether
+everything from the current position up to the next opening bracket (or up to
+the end) is the name of an arrow tip or of a shorthand. In our case, |foo|
+would first be tested under this rule. Only if |foo| is neither the name of an
+arrow tip kind nor of a shorthand does \tikzname\ consider the first letter of
+the specification, |f| in our case. If this is not the name of a shorthand, an
+error is raised. Otherwise the arrow tip corresponding to |f| is added to the
+list of arrow tips and the process restarts with the rest. Thus, we would next
+text whether |oo| is the name of an arrow tip or shorthand and, if not, whether
+|o| is such a name.
+
+All of the above rules mean that you can rather easily specify arrow tip
+sequences if they either mostly consist of single letter names or of longer
+names. Here are some examples:
+%
+\begin{itemize}
+ \item |->>>| is interpreted as three times the |>| shorthand since |>>>| is
+ not the name of any arrow tip kind (and neither is |>>|).
+ \item |->[]>>| has the same effect as the above.
+ \item |-[]>>>| also has the same effect.
+ \item |->[]>[]>[]| so does this.
+ \item |->Stealth| yields an arrow tip |>| followed by a |Stealth| arrow
+ at the end.
+ \item |-Stealth>| is illegal since there is no arrow tip |Stealth>| and
+ since |S| is also not the name of any arrow tip.
+ \item |-Stealth[] >| is legal and does what was presumably meant in the
+ previous item.
+ \item |< Stealth-| is legal and is the counterpart to |-Stealth[] >|.
+ \item |-Stealth[length=5pt] Stealth[length=6pt]| selects two stealth
+ arrow tips, but at slightly different sizes for the end of lines.
+\end{itemize}
+
+An interesting question concerns how flexing and bending interact with multiple
+arrow tips: After all, flexing and quick mode use different ways of shortening
+the path so we cannot really mix them. The following rule is used: We check,
+independently for the start and the end specifications, whether at least one
+arrow tip in them uses one of the options |flex|, |flex'|, or |bend|. If so,
+all |quick| settings in the other arrow tips are ignored and treated as if
+|flex| had been selected for them, too.
+
+
+\subsubsection{Specifying Paddings}
+
+When you provide several arrow tips in a row, all of them are added to the
+start or end of the line:
+%
+\begin{codeexample}[]
+\tikz \draw [<<<->>>>] (0,0) -- (2,0);
+\end{codeexample}
+%
+The question now is what will be the distance between them? For this, the
+following arrow key is important:
+
+\begin{key}{/pgf/arrow keys/sep=\meta{dimension}| |\opt{\meta{line
+ width factor}}| |\opt{\meta{outer factor}} (default 0.88pt .3 1)%
+}
+ When a sequence of arrow tips is specified in an arrow tip specification
+ for the end of the line, the arrow tips are normally arranged in such a way
+ that the tip of each arrow ends exactly at the ``back end'' of the next
+ arrow tip (for start specifications, the ordering is inverted, of course).
+ Now, when the |sep| option is set, instead of exactly touching the back end
+ of the next arrow, the specified \meta{dimension} is added as additional
+ space (the distance may also be negative, resulting in an overlap of the
+ arrow tips). The optional factors have the same meaning as for the |length|
+ key, see that key for details.
+
+ Let us now have a look at some examples. First, we use two arrow tips with
+ different separations between them:
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [-{>[sep=1pt]>[sep= 2pt]>}] (0,1.0) -- (1,1.0);
+ \draw [-{>[sep=1pt]>[sep=-2pt]>}] (0,0.5) -- (1,0.5);
+ \draw [-{> >[sep] >}] (0,0.0) -- (1,0.0);
+}
+\end{codeexample}
+
+ You can also specify a |sep| for the last arrow tip in the sequence (for
+ end specifications, otherwise for the first arrow tip). In this case, this
+ first arrow tip will not exactly ``touch'' the point where the path ends,
+ but will rather leave the specified amount of space. This is usually quite
+ desirable.
+ %
+\begin{codeexample}[]
+\tikz {
+ \node [draw] (A) {A};
+ \node [draw] (B) [right=of A] {B};
+
+ \draw [-{>>[sep=2pt]}] (A) to [bend left=45] (B);
+ \draw [- >> ] (A) to [bend right=45] (B);
+}
+\end{codeexample}
+ %
+ Indeed, adding a |sep| to an arrow tip is \emph{very} desirable, so you
+ will usually write something like |>={To[sep]}| somewhere near the start of
+ your files.
+
+ One arrow tip kind can be quite useful in this context: The arrow tip kind
+ |_|. It draws nothing and has zero length, \emph{but} it has |sep| set as a
+ default option. Since it is a single letter shorthand, you can write short
+ and clean ``code'' in this way:
+ %
+\begin{codeexample}[]
+\tikz \draw [->_>] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [->__>] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ However, using the |sep| option will be faster than using the |_| arrow tip
+ and it also allows you to specify the desired length directly.
+\end{key}
+
+
+\subsubsection{Specifying the Line End}
+
+In the previous examples of sequences of arrow tips, the line of the path
+always ended at the last of the arrow tips (for end specifications) or at the
+first of the arrow tips (for start specifications). Often, this is what you may
+want, but not always. Fortunately, it is quite easy to specify the desired end
+of the line: The special single char shorthand |.| is reserved to indicate that
+last arrow that is still part of the line; in other words, the line will stop
+at the last arrow before |.| is encountered (for end specifications) are at the
+first arrow following |.| (for start specifications).
+%
+\begin{codeexample}[]
+\tikz [very thick] \draw [<<<->>>] (0,0) -- (2,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz [very thick] \draw [<.<<->.>>] (0,0) -- (2,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz [very thick] \draw [<<.<-.>>>] (0,0) -- (2,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz [very thick] \draw [<<.<->.>>] (0,0) to [bend left] (2,0);
+\end{codeexample}
+
+It is permissible that there are several dots in a specification, in this case
+the first one ``wins'' (for end specifications, otherwise the last one).
+
+Note that |.| is parsed as any other shorthand. In particular, if you wish to
+add a dot after a normal arrow tip kind name, you need to add brackets:
+%
+\begin{codeexample}[]
+\tikz [very thick] \draw [-{Stealth[] . Stealth[] Stealth[]}] (0,0) -- (2,0);
+\end{codeexample}
+%
+Adding options to |.| is permissible, but they have no effect. In particular,
+|sep| has no effect since a dot is not an arrow.
+
+
+\subsubsection{Defining Shorthands}
+\label{section-arrow-tip-macro}
+
+It is often desirable to create ``shorthands'' for the names of arrow tips that
+you are going to use very often. Indeed, in most documents you will only need a
+single arrow tip kind and it would be useful that you could refer to it just as
+|>| in your arrow tip specifications. As another example, you might constantly
+wish to switch between a filled and a non-filled circle as arrow tips and would
+like to use |*| and |o| are shorthands for these case. Finally, you might just
+like to shorten a long name like |Computer Modern Rightarrow| down to just, say
+|To| or something similar.
+
+All of these case can be addressed by defining appropriate shorthands. This is
+done using the following handler:
+
+\begin{handler}{{.tip}{=\meta{end specification}}}
+ Defined the \meta{key} as a name that can be used inside arrow tip
+ specifications. If the \meta{key} has a path before it, this path is
+ ignored (so there is only one ``namespace'' for arrow tips). Whenever it is
+ used, it will be replaced by the \meta{end specification}. Note that you
+ must \emph{always} provide (only) an end specification; when the \meta{key}
+ is used inside a start specification, the ordering and the meaning of the
+ keys inside the \meta{end specification} are translated automatically.
+ \todosp{remaining instance of bug \#473}
+ %
+\begin{codeexample}[]
+\tikz [foo /.tip = {Stealth[sep]. >>}]
+ \draw [-foo] (0,0) -- (2,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz [foo /.tip = {Stealth[sep] Latex[sep]},
+ bar /.tip = {Stealth[length=10pt,open]}]
+ \draw [-{foo[red] . bar}] (0,0) -- (2,0);
+\end{codeexample}
+
+ In the last of the examples, we used |foo[red]| to make the arrows red. Any
+ options given to a shorthand upon use will be passed on to the actual
+ arrows tip for which the shorthand stands. Thus, we could also have written
+ |Stealth[sep,red]| |Latex[sep,red]| instead of |foo[red]|. In other words,
+ the ``replacement'' of a shorthand by its ``meaning'' is a semantic
+ replacement rather than a syntactic replacement. In particular, the
+ \meta{end specification} will be parsed immediately when the shorthand is
+ being defined. However, this applies only to the options inside the
+ specification, whose values are evaluated immediately. In contrast, which
+ actual arrow tip kind is meant by a given shorthand used inside the
+ \meta{end specification} is resolved only up each use of the shorthand.
+ This means that when you write
+ %
+ \begin{quote}
+ |dup /.tip = >>|
+ \end{quote}
+ %
+ and then later write
+ %
+ \begin{quote}
+ |> /.tip = whatever|
+ \end{quote}
+ %
+ then |dup| will have the effect as if you had written
+ |whatever[]whatever[]|. You will find that this behaviour is what one would
+ expect.
+
+ There is one problem we have not yet addressed: The asymmetry of single
+ letter arrow tips like |>| or |)|. When someone writes
+ %
+\begin{codeexample}[]
+\tikz \draw [<->] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ we rightfully expect one arrow tip pointing left at the left end and an
+ arrow tip pointing right at the right end. However, compare
+ %
+\begin{codeexample}[]
+\tikz \draw [>->] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw [Stealth-Stealth] (0,0) -- (1,0);
+\end{codeexample}
+ %
+ In both cases, we have \emph{identical} text in the start and end
+ specifications, but in the first case we rightfully expect the left arrow
+ to be flipped.
+
+ The solution to this problem is that it is possible to define two names for
+ the same arrow tip, namely one that is used inside start specifications and
+ one for end specifications. Now, we can decree that the ``name of |>|''
+ inside start specifications is simply |<| and the above problems disappear.
+
+ To specify different names for a shorthand in start and end specifications,
+ use the following syntax: Instead of \meta{key}, you use \meta{name in
+ start specifications}|-|\meta{name in end specifications}. Thus, to set the
+ |>| key correctly, you actually need to write
+ %
+\begin{codeexample}[]
+\tikz [<-> /.tip = Stealth] \draw [<->>] (0,0) -- (1,0);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz [<-> /.tip = Latex] \draw [>-<] (0,0) -- (1,0);
+\end{codeexample}
+
+ Note that the above also works even though we have not set |<| as an arrow
+ tip name for end specifications! The reason this works is that the
+ \tikzname\ (more precisely, \pgfname) actually uses the following
+ definition internally:
+ %
+ \begin{quote}
+ |>-< /.tip = >[reversed]|
+ \end{quote}
+ %
+ Translation: ``When |<| is used in an end specification, please replace it
+ by |>|, but reversed. Also, when |>| is used in a start specification, we
+ also mean this inverted |>|.''
+
+ By default, |>| is a shorthand for |To| and |To| is a shorthand for |to|
+ (an arrow from the old libraries) when |arrows.meta| is not loaded library.
+ When |arrow.meta| is loaded, |To| is redefined to mean the same as
+ |Computer Modern Rightarrow|.
+\end{handler}
+
+\begin{key}{/tikz/>=\meta{end arrow specification}}
+ This is a short way of saying |<->/.tip=|\meta{end arrow specification}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=2,ultra thick]
+ \begin{scope}[>=Latex]
+ \draw[>->] (0pt,3ex) -- (1cm,3ex);
+ \draw[|<->>|] (0pt,2ex) -- (1cm,2ex);
+ \end{scope}
+ \begin{scope}[>=Stealth]
+ \draw[>->] (0pt,1ex) -- (1cm,1ex);
+ \draw[|<<.<->|] (0pt,0ex) -- (1cm,0ex);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Scoping of Arrow Keys}
+\label{section-arrow-scopes}
+
+There are numerous places where you can specify keys for an arrow tip. There
+is, however, one final place that we have not yet mentioned:
+
+\begin{key}{/tikz/arrows=|[|\meta{arrow keys}|]|}
+ The |arrows| key, which is normally used to set the arrow tips for the
+ current scope, can also be used to set some arrow keys for the current
+ scope. When the argument to |arrows| starts with an opening bracket and
+ only otherwise contains one further closing bracket at the very end, this
+ semantic of the |arrow| key is assumed.
+
+ The \meta{arrow keys} will be set for the rest of current scope. This is
+ useful for generally setting some design parameters or for generally
+ switching on, say, bending as in:
+ %
+\begin{codeexample}[code only]
+\tikz [arrows={[bend]}] ... % Bend all arrows
+\end{codeexample}
+ %
+\end{key}
+
+We can now summarize which arrow keys are applied in what order when an arrow
+tip is used:
+%
+\begin{enumerate}
+ \item First, the so-called \emph{defaults} are applied, which are values
+ for the different parameters of a key. They are fixed in the
+ definition of the key and cannot be changed. Since they are executed
+ first, they are only the ultimate fallback.
+ \item The \meta{keys} from the use of |arrows=[|\meta{keys}|]| in all
+ enclosing scopes.
+ \item Recursively, the \meta{keys} provided with the arrow tip inside
+ shorthands.
+ \item The keys provided at the beginning of an arrow tip specification in
+ brackets.
+ \item The keys provided directly next to the arrow tip inside the
+ specification.
+\end{enumerate}
+
+
+\subsection{Reference: Arrow Tips}
+\label{section-arrows-meta}
+
+\begin{pgflibrary}{arrows.meta}
+ This library defines a large number of standard ``meta'' arrow tips.
+ ``Meta'' means that you can configure these arrow tips in many different
+ ways like changing their size or their line caps and joins and many other
+ details.
+
+ The only reason this library is not loaded by default is for compatibility
+ with older versions of \tikzname. You can, however, safely load and use
+ this library alongside the older libraries |arrows| and |arrows.spaced|.
+\end{pgflibrary}
+
+The different arrow tip kinds defined in the |arrows.meta| library can be
+classified in different groups:
+%
+\begin{itemize}
+ \item \emph{Barbed} arrow tips consist mainly of lines that ``point
+ backward'' from the tip of the arrow and which are not filled. For
+ them, filling has no effect. A typical example is \tikz [baseline]
+ \draw (0,.5ex) -- (1.5em,.5ex) [-Straight Barb];. Here is the list of
+ defined arrow tips:
+ %
+ \begin{arrowexamples}
+ \arrowexample Arc Barb[]
+ \arrowexample Bar[]
+ \arrowexample Bracket[]
+ \arrowexample Hooks[]
+ \arrowexample Parenthesis[]
+ \arrowexample Straight Barb[]
+ \arrowexample Tee Barb[]
+ \end{arrowexamples}
+
+ All of these arrow tips can be configured and resized in many different
+ ways as described in the following. Above, they are shown at their
+ ``natural'' sizes, which are chosen in such a way that for a line width
+ of 0.4pt their width matches the height of a letter ``x'' in Computer
+ Modern at 11pt (with some ``overshooting'' to create visual
+ consistency).
+ \item \emph{Mathematical} arrow tips are actually a subclass of the
+ barbed arrow tips, but we list them separately. They contain arrow
+ tips that look exactly like the tips of arrows used in mathematical
+ fonts such as the |\to|-symbol $\to$ from standard \TeX.
+ %
+ \begin{arrowexamples}
+ \arrowexample Classical TikZ Rightarrow[]
+ \arrowexample Computer Modern Rightarrow[]
+ \arrowexampledouble Implies[]
+ \arrowexample To[]
+ \end{arrowexamples}
+ %
+ The |To| arrow tip is a shorthand for |Computer Modern Rightarrow| when
+ |arrows.meta| is loaded.
+ \item \emph{Geometric} arrow tips consist of a filled shape like a kite
+ or a circle or a ``stealth-fighter-like'' shape. A typical example is
+ \tikz [baseline] \draw (0,.5ex) -- (1.5em,.5ex) [-Stealth];. These
+ arrow tips can also be used in an ``open'' variant as in \tikz
+ [baseline] \draw (0,.5ex) -- (1.5em,.5ex) [-{Stealth[open]}];.
+ %
+ \begin{arrowexamples}
+ \arrowexample Circle[]
+ \arrowexample Diamond[]
+ \arrowexample Ellipse[]
+ \arrowexample Kite[]
+ \arrowexample Latex[]
+ \arrowexample Latex[round]
+ \arrowexample Rectangle[]
+ \arrowexample Square[]
+ \arrowexample Stealth[]
+ \arrowexample Stealth[round]
+ \arrowexample Triangle[]
+ \arrowexample Turned Square[]
+ \end{arrowexamples}
+
+ Here are the ``open'' variants:
+ %
+ \begin{arrowexamples}
+ \arrowexample Circle[open]
+ \arrowexample Diamond[open]
+ \arrowexample Ellipse[open]
+ \arrowexample Kite[open]
+ \arrowexample Latex[open]
+ \arrowexample Latex[round,open]
+ \arrowexample Rectangle[open]
+ \arrowexample Square[open]
+ \arrowexample Stealth[open]
+ \arrowexample Stealth[round,open]
+ \arrowexample Triangle[open]
+ \arrowexample Turned Square[open]
+ \end{arrowexamples}
+
+ Note that ``open'' arrow tips are not the same as ``filled with
+ white'', which is also available (just say |fill=white|). The
+ difference is that the background will ``shine through'' an open
+ arrow, while a filled arrow always obscures the background:
+ %
+\begin{codeexample}[]
+\tikz {
+ \shade [left color=white, right color=red!50] (0,0) rectangle (4,1);
+
+ \draw [ultra thick,-{Triangle[open]}] (0,2/3) -- ++ (3,0);
+ \draw [ultra thick,-{Triangle[fill=white]}] (0,1/3) -- ++ (3,0);
+}
+\end{codeexample}
+
+ \item \emph{Cap} arrow tips are used to add a ``cap'' to the end of a
+ line. The graphic languages underlying \tikzname\ (\textsc{pdf},
+ \textsc{postscript} or \textsc{svg}) all support three basic types of
+ line caps on a very low level: round, rectangular, and ``butt''.
+ Using cap arrow tips, you can add new caps to lines and use different
+ caps for the end and the start. An example is the line \tikz
+ [baseline] \draw [line width=1ex, {Round Cap[reversed]}-{Triangle
+ Cap[] . Fast Triangle[] Fast Triangle[]}] (0,0.5ex) -- (2em,0.5ex);.
+ %
+ \begin{arrowcapexamples}
+ \arrowcapexample Butt Cap[]
+ \arrowcapexample Fast Round[]
+ \arrowcapexample Fast Triangle[]
+ \arrowcapexample Round Cap[]
+ \arrowcapexample Triangle Cap[]
+ \end{arrowcapexamples}
+ \item \emph{Special} arrow tips are used for some specific purpose and do
+ not fit into the above categories.
+ %
+ \begin{arrowexamples}
+ \arrowexample Rays[]
+ \arrowexample Rays[n=8]
+ \end{arrowexamples}
+\end{itemize}
+
+
+\subsubsection{Barbed Arrow Tips}
+
+\begin{arrowtip}{Arc Barb}{
+ This arrow tip attaches an arc to the end of the line whose angle is given
+ by the |arc| option. The |length| and |width| parameters refer to the size
+ of the arrow tip for |arc| set to 180 degrees, which is why in the example
+ for |arc=210| the actual length is larger than the specified |length|. The
+ line width is taken into account for the computation of the length and
+ width. Use the |round| option to add round caps to the end of the arcs.
+}%
+{length=1.5cm,arc=210}%
+{length=1.5cm,width=3cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[arc=120]
+ \arrowexample[arc=270]
+ \arrowexample[length=2pt]
+ \arrowexample[length=2pt,width=5pt]
+ \arrowexample[line width=2pt]
+ \arrowexample[reversed]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtipsimple}{Bar}
+ A simple bar. This is a simple instance of |Tee Barb| for length zero.
+\end{arrowtipsimple}
+
+\begin{arrowtip}{Bracket}{
+ This is an instance of the |Tee Barb| arrow tip that results in something
+ resembling a bracket. Just like the |Parenthesis| arrow tip, a |Bracket| is
+ not modelled from a text square bracket, but rather its size has been
+ chosen so that it fits with the other arrow tips.
+}%
+{}%
+{}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[reversed]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtip}{Hooks}{
+ This arrow tip attaches two ``hooks'' to the end of the line. The |length|
+ and |width| parameters refer to the size of the arrow tip if both arcs are
+ 180 degrees; in the example the arc is 210 degrees and, thus, the arrow is
+ actually longer that the |length| dictates. The line width is taken into
+ account for the computation of the length and width. The |arc| option is
+ used to specify the angle of the arcs. Use the |round| option to add round
+ caps to the end of the arcs.
+}%
+{length=1cm,width=3.5cm,arc=210}%
+{length=1cm,width=3.5cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[arc=120]
+ \arrowexample[arc=270]
+ \arrowexample[length=2pt]
+ \arrowexample[length=2pt,width=5pt]
+ \arrowexample[line width=2pt]
+ \arrowexample[reversed]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtip}{Parenthesis}{
+ This arrow tip is an instantiation of the |Arc Barb| so that it resembles a
+ parenthesis. However, the idea is not to recreate a ``real'' parenthesis as
+ it is used in text, but rather a ``bow'' at a size that harmonizes with the
+ other arrow tips at their default sizes.
+}%
+{}%
+{}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[reversed]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtip}{Straight Barb}{
+ This is the ``archetypal'' arrow head, consisting of just two straight
+ lines. The |length| and |width| parameters refer to the horizontal and
+ vertical distances between the points on the path making up the arrow tip.
+ As can be seen, the line width of the arrow tip's path is not taken into
+ account. The |angle| option is particularly useful to set the opening angle
+ at the tip of the arrow head. The |round| option gives a ``softer'' or
+ ``rounder'' version of the arrow tip.
+}%
+{length=2cm,width=3cm}%
+{length=2cm/-4mm,width=3cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+% \arrowexampledouble[]
+ \arrowexampledup[]
+ \arrowexampledupdot[]
+ \arrowexample[length=5pt]
+ \arrowexample[length=5pt,width=5pt]
+ \arrowexample[line width=2pt]
+ \arrowexample[reversed]
+ \arrowexample[angle=60:2pt 3]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtip}{Tee Barb}{
+ This arrow tip attaches a little ``T'' on both sides of the tip. The arrow
+ |inset| dictates the distance from the back end to the middle of the stem
+ of the T. When the inset is equal to the length, the arrow tip is drawn as
+ a single line, not as three lines (this is important for the ``round''
+ version since, then, the corners get rounded).
+}%
+{length=1.5cm,width=3cm,inset=1cm}%
+{length=1.5cm,width=3cm,inset=1cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[inset=0pt]
+ \arrowexample[inset'=0pt 1]
+ \arrowexample[line width=2pt]
+ \arrowexample[round]
+ \arrowexample[round,inset'=0pt 1]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+
+\subsubsection{Mathematical Barbed Arrow Tips}
+
+\begin{arrowtip}{Classical TikZ Rightarrow}{
+ This arrow tip is the ``old'' or ``classical'' arrow tip that used to be
+ the standard in \tikzname\ in earlier versions. It was modelled on an old
+ version of the tip of \texttt{\string\rightarrow} ($\rightarrow$) of the
+ Computer Modern fonts. However, this ``old version'' was really old, Donald
+ Knuth (the designer of both \TeX\ and of the Computer Modern fonts)
+ replaced the arrow tip of the mathematical fonts in~1992.
+}%
+{length=1cm,width=2cm}%
+{length=1cm,width=2cm}
+
+ The main problem with this arrow tip is that it is ``too small'' at its
+ natural size. I recommend using the new \texttt{Computer Modern Rightarrow}
+ arrow tip instead, which matches the current $\to$. This new version is
+ also the default used as |>| and as |To|, now.
+ %
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[length=3pt]
+ \arrowexample[sharp]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtip}{Computer Modern Rightarrow}{
+ For a line width of 0.4pt (the default), this arrow tip looks very much
+ like \texttt{\string\rightarrow} ($\to$) of the Computer Modern math fonts.
+ However, it is not a ``perfect'' match: the line caps and joins of the
+ ``real'' $\to$ are rounded differently from this arrow tip; but it takes a
+ keen eye to notice the difference. When the |arrow.meta| library is loaded,
+ this arrow tip becomes the default of |To| and, thus, is used whenever |>|
+ is used (unless, of course, you redefined |>|).
+}%
+{length=1cm,width=2cm}%
+{length=1cm,width=2cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[length=3pt]
+ \arrowexample[sharp]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[harpoon,reversed]
+ \arrowexample[red]
+ \end{arrowexamples}
+ %
+ The following options have no effect: |open|, |fill|.
+
+ On |double| lines, the arrow tip will not look correct.
+\end{arrowtip}
+
+\begin{arrowtipsimple}{Implies}
+ This arrow tip makes only sense in conjunction with the |double| option.
+ The idea is that you attach it to a double line to get something that looks
+ like \TeX's \texttt{\string\implies} arrow ($\implies$). A typical use of
+ this arrow tip is
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise=3, math nodes,
+ edges = {double equal sign distance, -Implies}] {
+ "\alpha", "\beta", "\gamma";
+ "\alpha" -> "\beta" -> "\gamma" -> "\alpha"
+};
+\end{codeexample}
+ %
+ \begin{arrowexamples}
+ \arrowexampledouble[]
+ \arrowexampledouble[red]
+ \end{arrowexamples}
+\end{arrowtipsimple}
+
+\begin{arrowtipsimple}{To}
+ This is a shorthand for |Computer Modern Rightarrow| when the |arrow.meta|
+ library is loaded. Otherwise, it is a shorthand for the classical
+ \tikzname\ rightarrow.
+\end{arrowtipsimple}
+
+
+\subsubsection{Geometric Arrow Tips}
+
+\begin{arrowtip}{Circle}{
+ Although this tip is called ``circle'', you can also use it to draw
+ ellipses if you set the length and width to different values. Neither
+ |round| nor |reversed| has any effect on this arrow tip.
+}%
+{length=2cm,width=2cm}%
+{length=2cm,width=2cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=3pt]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtip}
+
+\begin{arrowtipsimple}{Diamond}
+ This is an instance of |Kite| where the length is larger than the width.
+ %
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[]
+ \arrowexampledupdot[]
+ \arrowexample[open]
+ \arrowexample[length=10pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \arrowexample[fill=red!50]
+ \end{arrowexamples}
+\end{arrowtipsimple}
+
+\begin{arrowtipsimple}{Ellipse}
+ This is a shorthand for a ``circle'' that is twice as wide as high.
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=10pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \arrowexample[fill=red!50]
+ \end{arrowexamples}
+\end{arrowtipsimple}
+
+\begin{arrowtip}{Kite}{
+ This arrow tip consists of four lines that form a ``kite''. The |inset|
+ prescribed how far the width-axis of the kite is removed from the back end.
+ Note that the inset cannot be negative, use a |Stealth| arrow tip for this.
+}%
+{length=3cm,width=2cm,inset=1cm}%
+{length=3cm,width=2cm,inset=1cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=6pt,width=4pt]
+ \arrowexample[length=6pt,width=4pt,inset=1.5pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtip}
+
+\begin{arrowtip}{Latex}{
+ This arrow tip is the same as the arrow tip used in \LaTeX's standard
+ pictures (via the \texttt{\string\vec} command), if you set the length to
+ 4pt. The default size for this arrow tip was set slightly larger so that it
+ fits better with the other geometric arrow tips.
+}%
+{length=3cm,width=2cm}%
+{length=3cm,width=2cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=4pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtip}
+
+\begin{arrowtipsimple}{LaTeX}
+ Another spelling for the |Latex| arrow tip.
+\end{arrowtipsimple}
+
+\begin{arrowtip}{Rectangle}{
+ A rectangular arrow tip. By default, it is twice as long as high.
+}%
+{length=3cm,width=2cm}%
+{length=3cm,width=2cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=4pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtip}
+
+\begin{arrowtipsimple}{Square}
+ An instance of the |Rectangle| whose width is identical to the length.
+ %
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=4pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtipsimple}
+
+\begin{arrowtip}{Stealth}{
+ This arrow tip is similar to a |Kite|, only the |inset| now counts
+ ``inwards''. Because of that sharp angles, for this arrow tip is makes
+ quite a difference, visually, if use the |round| option. Also, using the
+ |harpoon| option (or |left| or |right|) will \emph{lengthen} the arrow tip
+ because of the even sharper corner at the tip.
+}%
+{length=3cm,width=2cm,inset=1cm}%
+{length=3cm,width=2cm,inset=1cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=6pt,width=4pt]
+ \arrowexample[length=6pt,width=4pt,inset=1.5pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtip}
+
+\begin{arrowtipsimple}{Triangle}
+ An instance of a |Kite| with zero inset.
+ %
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=4pt]
+ \arrowexample[angle=45:1pt 3]
+ \arrowexample[angle=60:1pt 3]
+ \arrowexample[angle=90:1pt 3]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtipsimple}
+
+\begin{arrowtipsimple}{Turned Square}
+ An instance of a |Kite| with identical width and height and mid-inset.
+ %
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[open]
+ \arrowexample[length=4pt]
+ \arrowexample[round]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtipsimple}
+
+
+\subsubsection{Caps}
+
+Recall that a \emph{cap} is a way of ending a line. The graphic languages
+underlying \tikzname\ (\textsc{pdf}, \textsc{postscript} or \textsc{svg}) all
+support three basic types of line caps on a very low level: round, rectangular,
+and ``butt''. Using cap arrow tips, you can add new caps to lines and use
+different caps for the end and the start.
+
+\begin{arrowtipsimple}{Butt Cap}
+ This arrow tip ends the line ``in the normal way'' with a straight end.
+ This arrow tip is only need to ``cover up'' the actual line cap, if this
+ happens to differ from the normal cap. In the following example, the line
+ cap is ``round'', but, nevertheless, the right end is a ``butt'' cap:
+ %
+\begin{codeexample}[]
+\tikz \draw [line width=1ex, line cap=round, -Butt Cap] (0,0) -- (1,0);
+\end{codeexample}
+ %
+\end{arrowtipsimple}
+
+\begin{arrowcap}{Fast Round}{
+ This arrow tip is not really a cap, you use it in conjunction with
+ (typically) the |Round Cap|. The idea is that you end your line using the
+ round cap and then add several \texttt{Fast Round}s. As for |Round Cap|,
+ the |length| parameter dictates the length is the length of the ``main
+ part'', the inset sets the length of a line that comes before this tip.
+}%
+{length=5mm,inset=1cm}%
+{length=5mm,inset=-1cm}%
+{-15mm}
+
+\begin{codeexample}[]
+\tikz \draw [line width=1ex,
+ -{Round Cap []. Fast Round[] Fast Round[]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+ %
+ Note that in conjunction with the |bend| option, this works even quite well
+ for curves:
+ %
+\begin{codeexample}[]
+\tikz [f/.tip = Fast Round] % shorthand
+ \draw [line width=1ex, -{[bend] Round Cap[] . f f f}]
+ (0,0) to [bend left] (1,0);
+\end{codeexample}
+
+ \begin{arrowcapexamples}
+ \arrowcapexample[]
+ \arrowcapexample[reversed]
+ \arrowcapexample[cap angle=60]
+ \arrowcapexample[cap angle=60,inset=5pt]
+ \arrowcapexample[length=.5ex]
+ \arrowcapexample[slant=.3]
+ \end{arrowcapexamples}
+\end{arrowcap}
+
+\begin{arrowcap}{Fast Triangle}{
+ This arrow tip works like |Fast Round|, only for triangular caps.
+}%
+{length=5mm,inset=1cm}%
+{length=5mm,inset=-1cm}%
+{-15mm}
+
+\begin{codeexample}[]
+\tikz \draw [line width=1ex,
+ -{Triangle Cap []. Fast Triangle[] Fast Triangle[]}]
+ (0,0) -- (1,0);
+\end{codeexample}
+ %
+ Again, this tip works well for curves:
+ %
+\begin{codeexample}[]
+\tikz [f/.tip = Fast Triangle] % shorthand
+ \draw [line width=1ex, -{[bend] Triangle Cap[] . f f f}]
+ (0,0) to [bend left] (1,0);
+\end{codeexample}
+
+ \begin{arrowcapexamples}
+ \arrowcapexample[]
+ \arrowcapexample[reversed]
+ \arrowcapexample[cap angle=60]
+ \arrowcapexample[cap angle=60,inset=5pt]
+ \arrowcapexample[length=.5ex]
+ \arrowcapexample[slant=.3]
+ \end{arrowcapexamples}
+\end{arrowcap}
+
+
+\begin{arrowcap}{Round Cap}{
+ This arrow tip ends the line using a half circle or, if the length has been
+ modified, a half-ellipse.
+ }%
+{length=5mm}%
+{length=5mm}%
+{-5mm}
+
+ \begin{arrowcapexamples}
+ \arrowcapexample[]
+ \arrowcapexample[reversed]
+ \arrowcapexample[length=.5ex]
+ \arrowcapexample[slant=.3]
+ \end{arrowcapexamples}
+\end{arrowcap}
+
+\begin{arrowcap}{Triangle Cap}{
+ This arrow tip ends the line using a triangle whose length is given by the
+ |length| option.
+}%
+{length=5mm}%
+{length=5mm}%
+{-5mm}
+
+ You can get any angle you want at the tip by specifying a length that is an
+ appropriate multiple of the line width. The following options does this
+ computation for you:
+ %
+ \begin{key}{/pgf/arrow keys/cap angle=\meta{angle}}
+ Sets |length| to an appropriate multiple of the line width so that the
+ angle of a |Triangle Cap| is exactly \meta{angle} at the tip.
+ \end{key}
+
+ \begin{arrowcapexamples}
+ \arrowcapexample[]
+ \arrowcapexample[reversed]
+ \arrowcapexample[cap angle=60]
+ \arrowcapexample[cap angle=60,reversed]
+ \arrowcapexample[length=.5ex]
+ \arrowcapexample[slant=.3]
+ \end{arrowcapexamples}
+\end{arrowcap}
+
+
+\subsubsection{Special Arrow Tips}
+
+\begin{arrowtip}{Rays}{
+ This arrow tip attaches a ``bundle of rays'' to the tip. The number of
+ evenly spaced rays is given by the |n| arrow key (see below). When the
+ number is even, the rays will lie to the left and to the right of the
+ direction of the arrow; when the number is odd, the rays are rotated in
+ such a way that one of them points perpendicular to the direction of the
+ arrow (this is to ensure that no ray points in the direction of the line,
+ which would look strange). The |length| and |width| describe the length and
+ width of an ellipse into which the rays fit.
+}%
+{length=3cm,width=3cm,n=6}%
+{length=3cm,width=3cm}
+
+ \begin{arrowexamples}
+ \arrowexample[]
+ \arrowexampledup[sep]
+ \arrowexampledupdot[sep]
+ \arrowexample[width'=0pt 2]
+ \arrowexample[round]
+ \arrowexample[n=2]
+ \arrowexample[n=3]
+ \arrowexample[n=4]
+ \arrowexample[n=5]
+ \arrowexample[n=6]
+ \arrowexample[n=7]
+ \arrowexample[n=8]
+ \arrowexample[n=9]
+ \arrowexample[slant=.3]
+ \arrowexample[left]
+ \arrowexample[right]
+ \arrowexample[left,n=5]
+ \arrowexample[right,n=5]
+ \arrowexample[red]
+ \end{arrowexamples}
+\end{arrowtip}
+
+\begin{key}{/pgf/arrow keys/n=\meta{number} (initially 4)}
+ Sets the number of rays in a |Rays| arrow tip.
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-coordinates.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-coordinates.tex
new file mode 100644
index 0000000000..c3921486e6
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-coordinates.tex
@@ -0,0 +1,1330 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Specifying Coordinates}
+
+\subsection{Overview}
+
+A \emph{coordinate} is a position on the canvas on which your picture is drawn.
+\tikzname\ uses a special syntax for specifying coordinates. Coordinates are
+always put in round brackets. The general syntax is
+\declare{|(|\opt{|[|\meta{options}|]|}\meta{coordinate specification}|)|}.
+
+The \meta{coordinate specification} specifies coordinates using one of many
+different possible \emph{coordinate systems}. Examples are the Cartesian
+coordinate system or polar coordinates or spherical coordinates. No matter
+which coordinate system is used, in the end, a specific point on the canvas is
+represented by the coordinate.
+
+There are two ways of specifying which coordinate system should be used:
+%
+\begin{description}
+ \item[Explicitly] You can specify the coordinate system explicitly. To do
+ so, you give the name of the coordinate system at the beginning,
+ followed by |cs:|, which stands for ``coordinate system'', followed by
+ a specification of the coordinate using the key--value syntax. Thus,
+ the general syntax for \meta{coordinate specification} in the explicit
+ case is |(|\meta{coordinate system}| cs:|\meta{list of key--value pairs
+ specific to the coordinate system}|)|.
+ \item[Implicitly] The explicit specification is often too verbose when
+ numerous coordinates should be given. Because of this, for the
+ coordinate systems that you are likely to use often a special syntax
+ is provided. \tikzname\ will notice when you use a coordinate
+ specified in a special syntax and will choose the correct coordinate
+ system automatically.
+\end{description}
+
+Here is an example in which explicit the coordinate systems are specified
+explicitly:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (canvas cs:x=0cm,y=2mm)
+ -- (canvas polar cs:radius=2cm,angle=30);
+\end{tikzpicture}
+\end{codeexample}
+%
+In the next example, the coordinate systems are implicit:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0cm,2mm) -- (30:2cm);
+\end{tikzpicture}
+\end{codeexample}
+
+It is possible to give options that apply only to a single coordinate, although
+this makes sense for transformation options only. To give transformation
+options for a single coordinate, give these options at the beginning in
+brackets:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1);
+ \draw[red] (0,0) -- ([xshift=3pt] 1,1);
+ \draw (1,0) -- +(30:2cm);
+ \draw[red] (1,0) -- +([shift=(135:5pt)] 30:2cm);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Coordinate Systems}
+
+\subsubsection{Canvas, XYZ, and Polar Coordinate Systems}
+
+Let us start with the basic coordinate systems.
+
+\begin{coordinatesystem}{canvas}
+ The simplest way of specifying a coordinate is to use the |canvas|
+ coordinate system. You provide a dimension $d_x$ using the |x=| option and
+ another dimension $d_y$ using the |y=| option. The position on the canvas
+ is located at the position that is $d_x$ to the right and $d_y$ above the
+ origin.
+
+ \begin{key}{/tikz/cs/x=\meta{dimension} (initially 0pt)}
+ Distance by which the coordinate is to the right of the origin. You can
+ also write things like |1cm+2pt| since the mathematical engine is used
+ to evaluate the \meta{dimension}.
+ \end{key}
+
+ \begin{key}{/tikz/cs/y=\meta{dimension} (initially 0pt)}
+ Distance by which the coordinate is above the origin.
+ \end{key}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \fill (canvas cs:x=1cm,y=1.5cm) circle (2pt);
+ \fill (canvas cs:x=2cm,y=-5mm+2pt) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+ To specify a coordinate in the coordinate system implicitly, you use two
+ dimensions that are separated by a comma as in |(0cm,3pt)| or
+ |(2cm,\textheight)|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \fill (1cm,1.5cm) circle (2pt);
+ \fill (2cm,-5mm+2pt) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+\begin{coordinatesystem}{xyz}
+ The |xyz| coordinate system allows you to specify a point as a multiple of
+ three vectors called the $x$-, $y$-, and $z$-vectors. By default, the
+ $x$-vector points 1cm to the right, the $y$-vector points 1cm upwards, but
+ this can be changed arbitrarily as explained in Section~\ref{section-xyz}.
+ The default $z$-vector points to
+ $\bigl(-3.85\textrm{mm},-3.85\textrm{mm}\bigr)$.
+
+ To specify the factors by which the vectors should be multiplied before
+ being added, you use the following three options:
+ %
+ \begin{key}{/tikz/cs/x=\meta{factor} (initially 0)}
+ Factor by which the $x$-vector is multiplied.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/y=\meta{factor} (initially 0)}
+ Works like |x|.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/z=\meta{factor} (initially 0)}
+ Works like |x|.
+ \end{key}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[->]
+ \draw (0,0) -- (xyz cs:x=1);
+ \draw (0,0) -- (xyz cs:y=1);
+ \draw (0,0) -- (xyz cs:z=1);
+\end{tikzpicture}
+\end{codeexample}
+
+ This coordinate system can also be selected implicitly. To do so, you just
+ provide two or three comma-separated factors (not dimensions).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[->]
+ \draw (0,0) -- (1,0);
+ \draw (0,0) -- (0,1,0);
+ \draw (0,0) -- (0,0,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+\emph{Note:} It is possible to use coordinates like |(1,2cm)|, which are
+neither |canvas| coordinates nor |xyz| coordinates. The rule is the following:
+If a coordinate is of the implicit form |(|\meta{x}|,|\meta{y}|)|, then
+\meta{x} and \meta{y} are checked, independently, whether they have a dimension
+or whether they are dimensionless. If both have a dimension, the |canvas|
+coordinate system is used. If both lack a dimension, the |xyz| coordinate
+system is used. If \meta{x} has a dimension and \meta{y} has not, then the sum
+of two coordinate |(|\meta{x}|,0pt)| and |(0,|\meta{y}|)| is used. If \meta{y}
+has a dimension and \meta{x} has not, then the sum of two coordinate
+|(|\meta{x}|,0)| and |(0pt,|\meta{y}|)| is used.
+
+\emph{Note furthermore:} An expression like |(2+3cm,0)| does \emph{not} mean
+the same as |(2cm+3cm,0)|. Instead, if \meta{x} or \meta{y} internally uses a
+mixture of dimensions and dimensionless values, then all dimensionless values
+are ``upgraded'' to dimensions by interpreting them as |pt|. So, |2+3cm| is the
+same dimension as |2pt+3cm|.
+
+\begin{coordinatesystem}{canvas polar}
+ The |canvas polar| coordinate system allows you to specify polar
+ coordinates. You provide an angle using the |angle=| option and a radius
+ using the |radius=| option. This yields the point on the canvas that is at
+ the given radius distance from the origin at the given degree. An angle of
+ zero degrees to the right, a degree of 90 upward.
+ %
+ \begin{key}{/tikz/cs/angle=\meta{degrees}}
+ The angle of the coordinate. The angle must always be given in degrees
+ and should be between $-360$ and $720$.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/radius=\meta{dimension}}
+ The distance from the origin.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/x radius=\meta{dimension}}
+ A polar coordinate is, after all, just a point on a circle of the given
+ \meta{radius}. When you provide an $x$-radius and also a $y$-radius,
+ you specify an ellipse instead of a circle. The |radius| option has the
+ same effect as specifying identical |x radius| and |y radius| options.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/y radius=\meta{dimension}}
+ Works like |x radius|.
+ \end{key}
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (canvas polar cs:angle=30,radius=1cm);
+\end{codeexample}
+
+ The implicit form for canvas polar coordinates is the following: you
+ specify the angle and the distance, separated by a colon as in |(30:1cm)|.
+ %
+\begin{codeexample}[]
+\tikz \draw (0cm,0cm) -- (30:1cm) -- (60:1cm) -- (90:1cm)
+ -- (120:1cm) -- (150:1cm) -- (180:1cm);
+\end{codeexample}
+
+ Two different radii are specified by writing |(30:1cm and 2cm)|.
+
+ For the implicit form, instead of an angle given as a number you can also
+ use certain words. For example, |up| is the same as |90|, so that you can
+ write |\tikz \draw (0,0) -- (2ex,0pt) -- +(up:1ex);| and get
+ \tikz \draw (0,0) -- (2ex,0pt) -- +(up:1ex);. Apart from |up| you can use
+ |down|, |left|, |right|, |north|, |south|, |west|, |east|, |north east|,
+ |north west|, |south east|, |south west|, all of which have their natural
+ meaning.
+\end{coordinatesystem}
+
+\begin{coordinatesystem}{xyz polar}
+ This coordinate system work similarly to the |canvas polar| system.
+ However, the radius and the angle are interpreted in the $xy$-coordinate
+ system, not in the canvas system. More detailed, consider the circle or
+ ellipse whose half axes are given by the current $x$-vector and the current
+ $y$-vector. Then, consider the point that lies at a given angle on this
+ ellipse, where an angle of zero is the same as the $x$-vector and an angle
+ of 90 is the $y$-vector. Finally, multiply the resulting vector by the
+ given radius factor. Voil\`a.
+ %
+ \begin{key}{/tikz/cs/angle=\meta{degrees}}
+ The angle of the coordinate interpreted in the ellipse whose axes are
+ the $x$-vector and the $y$-vector.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/radius=\meta{factor}}
+ A factor by which the $x$-vector and $y$-vector are multiplied prior to
+ forming the ellipse.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/x radius=\meta{dimension}}
+ A specific factor by which only the $x$-vector is multiplied.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/y radius=\meta{dimension}}
+ Works like |x radius|.
+ \end{key}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[x=1.5cm,y=1cm]
+ \draw[help lines] (0cm,0cm) grid (3cm,2cm);
+
+ \draw (0,0) -- (xyz polar cs:angle=0,radius=1);
+ \draw (0,0) -- (xyz polar cs:angle=30,radius=1);
+ \draw (0,0) -- (xyz polar cs:angle=60,radius=1);
+ \draw (0,0) -- (xyz polar cs:angle=90,radius=1);
+
+ \draw (xyz polar cs:angle=0,radius=2)
+ -- (xyz polar cs:angle=30,radius=2)
+ -- (xyz polar cs:angle=60,radius=2)
+ -- (xyz polar cs:angle=90,radius=2);
+ \end{tikzpicture}
+\end{codeexample}
+
+ The implicit version of this option is the same as the implicit version of
+ |canvas polar|, only you do not provide a unit.
+
+\begin{codeexample}[]
+\tikz[x={(0cm,1cm)},y={(-1cm,0cm)}]
+ \draw (0,0) -- (30:1) -- (60:1) -- (90:1)
+ -- (120:1) -- (150:1) -- (180:1);
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+\begin{coordinatesystem}{xy polar}
+ This is just an alias for |xyz polar|, which some people might prefer as
+ there is no z-coordinate involved in the |xyz polar| coordinates.
+\end{coordinatesystem}
+
+
+\subsubsection{Barycentric Systems}
+\label{section-barycentric-coordinates}
+
+In the barycentric coordinate system a point is expressed as the linear
+combination of multiple vectors. The idea is that you specify vectors $v_1$,
+$v_2$, \dots, $v_n$ and numbers $\alpha_1$, $\alpha_2$, \dots, $\alpha_n$. Then
+the barycentric coordinate specified by these vectors and numbers is
+%
+\begin{align*}
+ \frac{\alpha_1 v_1 + \alpha_2 v_2 + \cdots + \alpha_n v_n}{\alpha_1
+ + \alpha_2 + \cdots + \alpha_n}
+\end{align*}
+
+The |barycentric cs| allows you to specify such coordinates easily.
+
+\begin{coordinatesystem}{barycentric}
+ For this coordinate system, the \meta{coordinate specification} should be a
+ comma-separated list of expressions of the form \meta{node
+ name}|=|\meta{number}. Note that (currently) the list should not contain
+ any spaces before or after the \meta{node name} (unlike normal key--value
+ pairs).
+
+ The specified coordinate is now computed as follows: Each pair provides one
+ vector and a number. The vector is the |center| anchor of the \meta{node
+ name}. The number is the \meta{number}. Note that (currently) you cannot
+ specify a different anchor, so that in order to use, say, the |north|
+ anchor of a node you first have to create a new coordinate at this north
+ anchor. (Using for instance \texttt{\string\coordinate (mynorth) at
+ (mynode.north);}.)
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate (content) at (90:3cm);
+ \coordinate (structure) at (210:3cm);
+ \coordinate (form) at (-30:3cm);
+
+ \node [above] at (content) {content oriented};
+ \node [below left] at (structure) {structure oriented};
+ \node [below right] at (form) {form oriented};
+
+ \draw [thick,gray] (content.south) -- (structure.north east) -- (form.north west) -- cycle;
+
+ \small
+ \node at (barycentric cs:content=0.5,structure=0.1 ,form=1) {PostScript};
+ \node at (barycentric cs:content=1 ,structure=0 ,form=0.4) {DVI};
+ \node at (barycentric cs:content=0.5,structure=0.5 ,form=1) {PDF};
+ \node at (barycentric cs:content=0 ,structure=0.25,form=1) {CSS};
+ \node at (barycentric cs:content=0.5,structure=1 ,form=0) {XML};
+ \node at (barycentric cs:content=0.5,structure=1 ,form=0.4) {HTML};
+ \node at (barycentric cs:content=1 ,structure=0.2 ,form=0.8) {\TeX};
+ \node at (barycentric cs:content=1 ,structure=0.6 ,form=0.8) {\LaTeX};
+ \node at (barycentric cs:content=0.8,structure=0.8 ,form=1) {Word};
+ \node at (barycentric cs:content=1 ,structure=0.05,form=0.05) {ASCII};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+
+\subsubsection{Node Coordinate System}
+\label{section-node-coordinates}
+
+In \pgfname\ and in \tikzname\ it is quite easy to define a node that you wish
+to reference at a later point. Once you have defined a node, there are
+different ways of referencing points of the node. To do so, you use the
+following coordinate system:
+
+\begin{coordinatesystem}{node}
+ This coordinate system is used to reference a specific point inside or on
+ the border of a previously defined node. It can be used in different ways,
+ so let us go over them one by one.
+
+ You can use three options to specify which coordinate you mean:
+ %
+ \begin{key}{/tikz/cs/name=\meta{node name}}
+ Specifies the node that you wish to use to specify a coordinate. The
+ \meta{node name} is the name that was previously used to name the node
+ using the |name=|\meta{node name} option or the special node name
+ syntax.
+ \end{key}
+ %
+ \begin{key}{/tikz/anchor=\meta{anchor}}
+ Specifies an anchor of the node. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node (shape) at (0,2) [draw] {|class Shape|};
+ \node (rect) at (-2,0) [draw] {|class Rectangle|};
+ \node (circle) at (2,0) [draw] {|class Circle|};
+ \node (ellipse) at (6,0) [draw] {|class Ellipse|};
+
+ \draw (node cs:name=circle,anchor=north) |- (0,1);
+ \draw (node cs:name=ellipse,anchor=north) |- (0,1);
+ \draw [arrows = -{Triangle[open, angle=60:3mm]}]
+ (node cs:name=rect,anchor=north)
+ |- (0,1) -| (node cs:name=shape,anchor=south);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/angle=\meta{degrees}}
+ It is also possible to provide an angle \emph{instead} of an anchor.
+ This coordinate refers to a point of the node's border where a ray shot
+ from the center in the given angle hits the border. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node (start) [draw,shape=ellipse] {start};
+ \foreach \angle in {-90, -80, ..., 90}
+ \draw (node cs:name=start,angle=\angle)
+ .. controls +(\angle:1cm) and +(-1,0) .. (2.5,0);
+ \end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ It is possible to provide \emph{neither} the |anchor=| option nor the
+ |angle=| option. In this case, \tikzname\ will calculate an appropriate
+ border position for you. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path (0,0) node(a) [ellipse,rotate=10,draw] {An ellipse}
+ (3,-1) node(b) [circle,draw] {A circle};
+ \draw[thick] (node cs:name=a) -- (node cs:name=b);
+\end{tikzpicture}
+\end{codeexample}
+
+ \tikzname\ will be reasonably clever at determining the border points that
+ you ``mean'', but, naturally, this may fail in some situations. If
+ \tikzname\ fails to determine an appropriate border point, the center will
+ be used instead.
+
+ Automatic computation of anchors works only with the line-to operations
+ |--|, the vertical/horizontal versions \verb!|-! and \verb!-|!, and with
+ the curve-to operation |..|. For other path commands, such as |parabola| or
+ |plot|, the center will be used. If this is not desired, you should give a
+ named anchor or an angle anchor.
+
+ Note that if you use an automatic coordinate for both the start and the end
+ of a line-to, as in |--(node cs:name=b)--|, then \emph{two} border
+ coordinates are computed with a move-to between them. This is usually
+ exactly what you want.
+
+ If you use relative coordinates together with automatic anchor coordinates,
+ the relative coordinates are computed relative to the node's center, not
+ relative to the border point. Here is an example:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) node(x) [draw] {Text}
+ rectangle (1,1)
+ (node cs:name=x) -- +(1,1);
+\end{codeexample}
+
+ Similarly, in the following examples both control points are $(1,1)$:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) node(x) [draw] {X}
+ (2,0) node(y) {Y}
+ (node cs:name=x) .. controls +(1,1) and +(-1,1) ..
+ (node cs:name=y);
+\end{codeexample}
+
+ The implicit way of specifying the node coordinate system is to simply use
+ the name of the node in parentheses as in |(a)| or to specify a name
+ together with an anchor or an angle separated by a dot as in |(a.north)| or
+ |(a.10)|.
+
+ Here is a more complete example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[fill=blue!20]
+ \draw[help lines] (-1,-2) grid (6,3);
+ \path (0,0) node(a) [ellipse,rotate=10,draw,fill] {An ellipse}
+ (3,-1) node(b) [circle,draw,fill] {A circle}
+ (2,2) node(c) [rectangle,rotate=20,draw,fill] {A rectangle}
+ (5,2) node(d) [rectangle,rotate=-30,draw,fill] {Another rectangle};
+ \draw[thick] (a.south) -- (b) -- (c) -- (d);
+ \draw[thick,red,->] (a) |- +(1,3) -| (c) |- (b);
+ \draw[thick,blue,<->] (b) .. controls +(right:2cm) and +(down:1cm) .. (d);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+% -----------------------------------------------------------------------------
+% Deprecated:
+% -----------------------------------------------------------------------------
+%
+% \subsubsection{Intersection Coordinate Systems}
+%
+% Often you wish to specify a point that is on the
+% intersection of two lines or shapes. For this, the following
+% coordinate system is useful:
+%
+% \begin{coordinatesystem}{intersection}
+% First, you must specify two objects that should be
+% intersected. These ``objects'' can either be lines or the shapes of
+% nodes. There are two option to specify the first object:
+% \begin{key}{/tikz/cs/first line={\ttfamily\char`\{}|(|\meta{first
+% coordinate}|)--(|\meta{second coordinate}|)|{\ttfamily\char`\}}}
+% Specifies that the first object is a line that goes from
+% \meta{first coordinate} to meta{second coordinate}.
+% \end{key}
+% Note that you have to write |--| between the coordinate, but this
+% does not mean that anything is added to the path. This is simply a
+% special syntax.
+% \begin{key}{/tikz/cs/first node=\meta{node}}
+% Specifies that the first object is a previously defined node named
+% \meta{node}.
+% \end{key}
+%
+% To specify the second object, you use one of the following keys:
+% \begin{key}{/tikz/cs/second line={\ttfamily\char`\{}|(|\meta{first
+% coordinate}|)--(|\meta{second coordinate}|)|{\ttfamily\char`\}}}
+% As above.
+% \end{key}
+% \begin{key}{/tikz/cs/second node=\meta{node}}
+% Specifies that the second object is a previously defined node
+% named \meta{node}.
+% \end{key}
+%
+% Since it is possible that two objects have multiple intersections,
+% you may need to specify which solution you want:
+% \begin{key}{/tikz/cs/solution=\meta{number} (initially 1)}
+% Specifies which solution should be used. Numbering starts with 1.
+% \end{key}
+% The coordinate specified in this way is the \meta{number}th
+% intersection of the two objects. If the objects do not intersect,
+% an error may occur.
+%
+% \begin{codeexample}[]
+% \begin{tikzpicture}
+% \draw[help lines] (0,0) grid (3,2);
+% \draw (0,0) coordinate (A) -- (3,2) coordinate (B)
+% (1,2) -- (3,0);
+%
+% \fill[red] (intersection cs:
+% first line={(A)--(B)},
+% second line={(1,2)--(3,0)}) circle (2pt);
+% \end{tikzpicture}
+% \end{codeexample}
+%
+% The implicit way of specifying this coordinate system is to write
+% \declare{|(intersection |\opt{\meta{number}}| of |\meta{first
+% object}%
+% | and |\meta{second object}|)|}. Here, \meta{first object} either
+% has the form \meta{$p_1$}|--|\meta{$p_2$} or it is just a node
+% name. Likewise for \meta{second object}. Note that there are \emph{no}
+% parentheses around the $p_i$. Thus, you would write
+% |(intersection of A--B and 1,2--3,0)| for the intersection of the
+% line through the coordinates |A| and |B| and the line through the
+% points $(1,2)$ and $(3,0)$. You would write
+% |(intersection 2 of c_1 and c_2)| for the second
+% intersection of the node named |c_1| and the node named
+% |c_2|.
+%
+% \tikzname\ needs an explicit algorithm for computing the
+% intersection of two shapes and such an algorithm is available only
+% for few shapes. Currently, the following intersection will be
+% computed correctly:
+% \begin{itemize}
+% \item a line and a line
+% \item a |circle| node and a line (in any order)
+% \item a |circle| and a |circle|
+% \end{itemize}
+% \begin{codeexample}[]
+% \begin{tikzpicture}[scale=.25]
+% \coordinate [label=-135:$a$] (a) at ($ (0,0) + (rand,rand) $);
+% \coordinate [label=45:$b$] (b) at ($ (3,2) + (rand,rand) $);
+%
+% \coordinate [label=-135:$u$] (u) at (-1,1);
+% \coordinate [label=45:$v$] (v) at (6,0);
+%
+% \draw (a) -- (b)
+% (u) -- (v);
+%
+% \node (c1) at (a) [draw,circle through=(b)] {};
+% \node (c2) at (b) [draw,circle through=(a)] {};
+%
+% \coordinate [label=135:$c$] (c) at (intersection 2 of c1 and c2);
+% \coordinate [label=-45:$d$] (d) at (intersection of u--v and c2);
+% \coordinate [label=135:$e$] (e) at (intersection of u--v and a--b);
+%
+% \foreach \p in {a,b,c,d,e,u,v}
+% \fill [opacity=.5] (\p) circle (8pt);
+% \end{tikzpicture}
+% \end{codeexample}
+% \end{coordinatesystem}
+% -----------------------------------------------------------------------------
+
+
+\subsubsection{Tangent Coordinate Systems}
+
+\begin{coordinatesystem}{tangent}
+ This coordinate system, which is available only when the \tikzname\ library
+ |calc| is loaded, allows you to compute the point that lies tangent to a
+ shape. In detail, consider a \meta{node} and a \meta{point}. Now, draw a
+ straight line from the \meta{point} so that it ``touches'' the \meta{node}
+ (more formally, so that it is \emph{tangent} to this \meta{node}). The
+ point where the line touches the shape is the point referred to by the
+ |tangent| coordinate system.
+
+ The following options may be given:
+ %
+ \begin{key}{/tikz/cs/node=\meta{node}}
+ This key specifies the node on whose border the tangent should lie.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/point=\meta{point}}
+ This key specifies the point through which the tangent should go.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/solution=\meta{number}}
+ Specifies which solution should be used if there are more than one.
+ \end{key}
+
+ A special algorithm is needed in order to compute the tangent for a given
+ shape. Currently, tangents can be computed for nodes whose shape is one of
+ the following:
+ %
+ \begin{itemize}
+ \item |coordinate|
+ \item |circle|
+ \end{itemize}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+
+ \coordinate (a) at (3,2);
+
+ \node [circle,draw] (c) at (1,1) [minimum size=40pt] {$c$};
+
+ \draw[red] (a) -- (tangent cs:node=c,point={(a)},solution=1) --
+ (c.center) -- (tangent cs:node=c,point={(a)},solution=2) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+ There is no implicit syntax for this coordinate system.
+\end{coordinatesystem}
+
+
+\subsubsection{Defining New Coordinate Systems}
+
+While the set of coordinate systems that \tikzname\ can parse via their special
+syntax is fixed, it is possible and quite easy to define new explicitly named
+coordinate systems. For this, the following commands are used:
+
+\begin{command}{\tikzdeclarecoordinatesystem\marg{name}\marg{code}}
+ This command declares a new coordinate system named \meta{name} that can
+ later on be used by writing |(|\meta{name}| cs:|\meta{arguments}|)|. When
+ \tikzname\ encounters a coordinate specified in this way, the
+ \meta{arguments} are passed to \meta{code} as argument |#1|.
+
+ It is now the job of \meta{code} to make sense of the \meta{arguments}. At
+ the end of \meta{code}, the two \TeX\ dimensions |\pgf@x| and |\pgf@y|
+ should be have the $x$- and $y$-canvas coordinate of the coordinate.
+
+ It is not necessary, but customary, to parse \meta{arguments} using the
+ key--value syntax. However, you can also parse it in any way you like.
+
+ In the following example, a coordinate system |cylindrical| is defined.
+ %
+\begin{codeexample}[]
+\makeatletter
+\define@key{cylindricalkeys}{angle}{\def\myangle{#1}}
+\define@key{cylindricalkeys}{radius}{\def\myradius{#1}}
+\define@key{cylindricalkeys}{z}{\def\myz{#1}}
+\tikzdeclarecoordinatesystem{cylindrical}%
+{%
+ \setkeys{cylindricalkeys}{#1}%
+ \pgfpointadd{\pgfpointxyz{0}{0}{\myz}}{\pgfpointpolarxy{\myangle}{\myradius}}
+}
+\begin{tikzpicture}[z=0.2pt]
+ \draw [->] (0,0,0) -- (0,0,350);
+ \foreach \num in {0,10,...,350}
+ \fill (cylindrical cs:angle=\num,radius=1,z=\num) circle (1pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\tikzaliascoordinatesystem\marg{new name}\marg{old name}}
+ Creates an alias of \meta{old name}.
+\end{command}
+
+
+\subsection{Coordinates at Intersections}
+\label{section-intersection-coordinates}
+
+You will wish to compute the intersection of two paths. For the special and
+frequent case of two perpendicular lines, a special coordinate system called
+|perpendicular| is available. For more general cases, the |intersection|
+library can be used.
+
+
+\subsubsection{Intersections of Perpendicular Lines}
+
+A frequent special case of path intersections is the intersection of a vertical
+line going through a point $p$ and a horizontal line going through some other
+point $q$. For this situation there is a useful coordinate system.
+
+\begin{coordinatesystem}{perpendicular}
+ You can specify the two lines using the following keys:
+
+ \begin{key}{/tikz/cs/horizontal line through={\ttfamily\char`\{}|(|\meta{coordinate}|)|{\ttfamily\char`\}}}
+ Specifies that one line is a horizontal line that goes through the
+ given coordinate.
+ \end{key}
+ %
+ \begin{key}{/tikz/cs/vertical line through={\ttfamily\char`\{}|(|\meta{coordinate}|)|{\ttfamily\char`\}}}
+ Specifies that the other line is vertical and goes through the given
+ coordinate.
+ \end{key}
+
+ However, in almost all cases you should, instead, use the implicit syntax.
+ Here, you write \declare{|(|\meta{p}\verb! |- !\meta{q}|)|} or
+ \declare{|(|\meta{q}\verb! -| !\meta{p}|)|}.
+
+ For example, \verb!(2,1 |- 3,4)! and \verb!(3,4 -| 2,1)! both yield the
+ same as \verb!(2,4)! (provided the $xy$-co\-or\-di\-nate system has not
+ been modified).
+
+ The most useful application of the syntax is to draw a line up to some
+ point on a vertical or horizontal line. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path (30:1cm) node(p1) {$p_1$} (75:1cm) node(p2) {$p_2$};
+
+ \draw (-0.2,0) -- (1.2,0) node(xline)[right] {$q_1$};
+ \draw (2,-0.2) -- (2,1.2) node(yline)[above] {$q_2$};
+
+ \draw[->] (p1) -- (p1 |- xline);
+ \draw[->] (p2) -- (p2 |- xline);
+ \draw[->] (p1) -- (p1 -| yline);
+ \draw[->] (p2) -- (p2 -| yline);
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that in \declare{|(|\meta{c}\verb! |- !\meta{d}|)|} the coordinates
+ \meta{c} and \meta{d} are \emph{not} surrounded by parentheses. If they
+ need to be complicated expressions (like a computation using the
+ |$|-syntax), you must surround them with braces; parentheses will then be %$
+ added around them.
+
+ As an example, let us specify a point that lies horizontally at the middle
+ of the line from $A$ to~$B$ and vertically at the middle of the line from
+ $C$ to~$D$:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node (A) at (0,1) {A};
+ \node (B) at (1,1.5) {B};
+ \node (C) at (2,0) {C};
+ \node (D) at (2.5,-2) {D};
+
+ \draw (A) -- (B) node [midway] {x};
+ \draw (C) -- (D) node [midway] {x};
+
+ \node at ({$(A)!.5!(B)$} -| {$(C)!.5!(D)$}) {X};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{coordinatesystem}
+
+
+\subsubsection{Intersections of Arbitrary Paths}
+
+\begin{tikzlibrary}{intersections}
+ This library enables the calculation of intersections of two arbitrary
+ paths. However, due to the low accuracy of \TeX, the paths should not be
+ ``too complicated''. In particular, you should not try to intersect paths
+ consisting of lots of very small segments such as plots or decorated paths.
+\end{tikzlibrary}
+
+To find the intersections of two paths in \tikzname, they must be ``named''. A
+``named path'' is, quite simply, a path that has been named using the following
+key (note that this is a \emph{different} key from the |name| key, which only
+attaches a hyperlink target to a path, but does not store the path in a way the
+is useful for the intersection computation):
+
+\begin{keylist}{%
+ /tikz/name path=\meta{name},
+ /tikz/name path global=\meta{name}%
+}
+ The effect of this key is that, after the path has been constructed, just
+ before it is used, it is associated with \meta{name}. For |name path|, this
+ association survives beyond the final semi-colon of the path but not the
+ end of the surrounding scope. For |name path global|, the association will
+ survive beyond any scope as well. Handle with care.
+
+ Any paths created by nodes on the (main) path are ignored, unless this key
+ is explicitly used. If the same \meta{name} is used for the main path and
+ the node path(s), then the paths will be added together and then associated
+ with \meta{name}.
+\end{keylist}
+
+To find the intersection of named paths, the following key is used:
+
+\begin{key}{/tikz/name intersections=\marg{options}}
+ This key changes the key path to |/tikz/intersection| and processes
+ \meta{options}. These options determine, among other things, which paths to
+ use for the intersection. Having processed the options, any intersections
+ are then found. A coordinate is created at each intersection, which by
+ default, will be named |intersection-1|, |intersection-2|, and so on.
+ Optionally, the prefix |intersection| can be changed, and the total number
+ of intersections stored in a \TeX-macro.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={opacity=1, black, above left}]
+ \draw [help lines] grid (3,2);
+ \draw [name path=ellipse] (2,0.5) ellipse (0.75cm and 1cm);
+ \draw [name path=rectangle, rotate=10] (0.5,0.5) rectangle +(2,1);
+ \fill [red, opacity=0.5, name intersections={of=ellipse and rectangle}]
+ (intersection-1) circle (2pt) node {1}
+ (intersection-2) circle (2pt) node {2};
+\end{tikzpicture}
+\end{codeexample}
+
+ The following keys can be used in \meta{options}:
+
+ \begin{key}{/tikz/intersection/of=\meta{name path 1}| and |\meta{name path 2}}
+ This key is used to specify the names of the paths to use for the
+ intersection.
+ \end{key}
+
+ \begin{key}{/tikz/intersection/name=\meta{prefix} (initially intersection)}
+ This key specifies the prefix name for the coordinate nodes placed at
+ each intersection.
+ \end{key}
+
+ \begin{key}{/tikz/intersection/total=\meta{macro}}
+ This key means that the total number of intersections found will be
+ stored in \meta{macro}.
+ \end{key}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \clip (-2,-2) rectangle (2,2);
+ \draw [name path=curve 1] (-2,-1) .. controls (8,-1) and (-8,1) .. (2,1);
+ \draw [name path=curve 2] (-1,-2) .. controls (-1,8) and (1,-8) .. (1,2);
+
+ \fill [name intersections={of=curve 1 and curve 2, name=i, total=\t}]
+ [red, opacity=0.5, every node/.style={above left, black, opacity=1}]
+ \foreach \s in {1,...,\t}{(i-\s) circle (2pt) node {\footnotesize\s}};
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/intersection/by=\meta{comma-separated list}}
+ This key allows you to specify a list of names for the intersection
+ coordinates. The intersection coordinates will still be named
+ \meta{prefix}|-|\meta{number}, but additionally the first coordinate
+ will also be named by the first element of the \meta{comma-separated
+ list}. What happens is that the \meta{comma-separated list} is passed
+ to the |\foreach| statement and for \meta{list member} a coordinate is
+ created at the already-named intersection.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \clip (-2,-2) rectangle (2,2);
+ \draw [name path=curve 1] (-2,-1) .. controls (8,-1) and (-8,1) .. (2,1);
+ \draw [name path=curve 2] (-1,-2) .. controls (-1,8) and (1,-8) .. (1,2);
+
+ \fill [name intersections={of=curve 1 and curve 2, by={a,b}}]
+ (a) circle (2pt)
+ (b) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+ You can also use the |...| notation of the |\foreach| statement inside
+ the \meta{comma-separated list}.
+
+ In case an element of the \meta{comma-separated list} starts with
+ options in square brackets, these options are used when the coordinate
+ is created. A coordinate name can still, but need not, follow the
+ options. This makes it easy to add labels to intersections:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \clip (-2,-2) rectangle (2,2);
+ \draw [name path=curve 1] (-2,-1) .. controls (8,-1) and (-8,1) .. (2,1);
+ \draw [name path=curve 2] (-1,-2) .. controls (-1,8) and (1,-8) .. (1,2);
+
+ \fill [name intersections={
+ of=curve 1 and curve 2,
+ by={[label=center:a],[label=center:...],[label=center:i]}}];
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/intersection/sort by=\meta{path name}}
+ By default, the intersections are simply returned in the order that the
+ intersection algorithm finds them. Unfortunately, this is not
+ necessarily a ``helpful'' ordering. This key can be used to sort the
+ intersections along the path specified by \meta{path name}, which
+ should be one of the paths mentioned in the |/tikz/intersection/of|
+ key.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+\clip (-0.5,-0.75) rectangle (3.25,2.25);
+\foreach \pathname/\shift in {line/0cm, curve/2cm}{
+ \tikzset{xshift=\shift}
+ \draw [->, name path=curve] (1,1.5) .. controls (-1,1) and (2,0.5) .. (0,0);
+ \draw [->, name path=line] (0,-.5) -- (1,2) ;
+ \fill [name intersections={of=line and curve,sort by=\pathname, name=i}]
+ [red, opacity=0.5, every node/.style={left=.25cm, black, opacity=1}]
+ \foreach \s in {1,2,3}{(i-\s) circle (2pt) node {\footnotesize\s}};
+}
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsection{Relative and Incremental Coordinates}
+
+\subsubsection{Specifying Relative Coordinates}
+
+You can prefix coordinates by |++| to make them ``relative''. A coordinate such
+as |++(1cm,0pt)| means ``1cm to the right of the previous position, making this
+the new current position''. Relative coordinates are often useful in ``local''
+contexts:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
+ \draw (2,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
+ \draw (1.5,1.5) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+Instead of |++| you can also use a single |+|. This also specifies a relative
+coordinate, but it does not ``update'' the current point for subsequent usages
+of relative coordinates. Thus, you can use this notation to specify numerous
+points, all relative to the same ``initial'' point:
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
+ \draw (2,0) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
+ \draw (1.5,1.5) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+There is a special situation, where relative coordinates are interpreted
+differently. If you use a relative coordinate as a control point of a Bézier
+curve, the following rule applies: First, a relative first control point is
+taken relative to the beginning of the curve. Second, a relative second control
+point is taken relative to the end of the curve. Third, a relative end point of
+a curve is taken relative to the start of the curve.
+
+This special behavior makes it easy to specify that a curve should ``leave or
+arrive from a certain direction'' at the start or end. In the following
+example, the curve ``leaves'' at $30^\circ$ and ``arrives'' at $60^\circ$:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (1,0) .. controls +(30:1cm) and +(60:1cm) .. (3,-1);
+ \draw[gray,->] (1,0) -- +(30:1cm);
+ \draw[gray,<-] (3,-1) -- +(60:1cm);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Rotational Relative Coordinates}
+
+You may sometimes wish to specify points relative not only to the previous
+point, but additionally relative to the tangent entering the previous point.
+For this, the following key is useful:
+
+\begin{key}{/tikz/turn}
+ This key can be given as an option to a \meta{coordinate} as in the
+ following example:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (1,1) -- ([turn]-45:1cm) -- ([turn]-30:1cm);
+\end{codeexample}
+ %
+ The effect of this key is to locally shift the coordinate system so that
+ the last point reached is at the origin and the coordinate system is
+ ``turned'' so that the $x$-axis points in the direction of a tangent
+ entering the last point. This means, in effect, that when you use polar
+ coordinates of the form \meta{relative angle}|:|\meta{distance} together
+ with the |turn| option, you specify a point that lies at \meta{distance}
+ from the last point in the direction of the last tangent entering the last
+ point, but with a rotation of \meta{relative angle}.
+
+ This key also works with curves \dots
+ %
+\begin{codeexample}[]
+\tikz [delta angle=30, radius=1cm]
+ \draw (0,0) arc [start angle=0] -- ([turn]0:1cm)
+ arc [start angle=30] -- ([turn]0:1cm)
+ arc [start angle=60] -- ([turn]30:1cm);
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw (0,0) to [bend left] (2,1) -- ([turn]0:1cm);
+\end{codeexample}
+ %
+ \dots and with plots \dots
+ %
+\begin{codeexample}[]
+\tikz \draw plot coordinates {(0,0) (1,1) (2,0) (3,0) } -- ([turn]30:1cm);
+\end{codeexample}
+
+ Although the above examples use polar coordinates with |turn|, you can also
+ use any normal coordinate. For instance, |([turn]1,1)| will append a line
+ of length $\sqrt 2$ that is turns by $45^\circ$ relative to the tangent to
+ the last point.
+ %
+\begin{codeexample}[]
+\tikz \draw (0.5,0.5) -| (2,1) -- ([turn]1,1)
+ .. controls ([turn]0:1cm) .. ([turn]-90:1cm);
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Relative Coordinates and Scopes}
+\label{section-scopes-relative}
+
+An interesting question is, how do relative coordinates behave in the presence
+of scopes? That is, suppose we use curly braces in a path to make part of it
+``local'', how does that affect the current position? On the one hand, the
+current position certainly changes since the scope only affects options, not
+the path itself. On the other hand, it may be useful to ``temporarily escape''
+from the updating of the current point.
+
+Since both interpretations of how the current point and scopes should
+``interact'' are useful, there is a (local!) option that allows you to decide
+which you need.
+
+\begin{key}{/tikz/current point is local=\opt{\meta{boolean}} (initially false)}
+ Normally, the scope path operation has no effect on the current point. That
+ is, curly braces on a path have no effect on the current position:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0);
+ \draw[red] (2,0) -- ++(1,0) { -- ++(0,1) } -- ++(-1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ If you set this key to |true|, this behaviour changes. In this case, at the
+ end of a group created on a path, the last current position reverts to
+ whatever value it had at the beginning of the scope. More precisely, when
+ \tikzname\ encounters |}| on a path, it checks whether at this particular
+ moment the key is set to |true|. If so, the current position reverts to the
+ value it had when the matching |{| was read.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0);
+ \draw[red] (2,0) -- ++(1,0)
+ { [current point is local] -- ++(0,1) } -- ++(-1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ In the above example, we could also have given the option outside the
+ scope, for instance as a parameter to the whole scope.
+\end{key}
+
+
+\subsection{Coordinate Calculations}
+\label{tikz-lib-calc}
+
+\begin{tikzlibrary}{calc}
+ You need to load this library in order to use the coordinate calculation
+ functions described in the present section.
+\end{tikzlibrary}
+
+It is possible to do some basic calculations that involve coordinates. In
+essence, you can add and subtract coordinates, scale them, compute midpoints,
+and do projections. For instance, |($(a) + 1/3*(1cm,0)$)| is the coordinate
+that is $1/3 \text{cm}$ to the right of the point |a|:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \node (a) at (1,1) {A};
+ \fill [red] ($(a) + 1/3*(1cm,0)$) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The General Syntax}
+
+The general syntax is the following:
+%
+\begin{quote}
+ \declare{|(|\opt{|[|\meta{options}|]|}|$|\meta{coordinate computation}|$)|}.
+\end{quote}
+
+As you can see, the syntax uses the \TeX\ math symbol |$| to %$
+indicate that a ``mathematical computation'' is involved. However, the |$| %$
+has no other effect, in particular, no mathematical text is typeset.
+
+The \meta{coordinate computation} has the following structure:
+%
+\begin{enumerate}
+ \item It starts with
+ %
+ \begin{quote}
+ \opt{\meta{factor}|*|}\meta{coordinate}\opt{\meta{modifiers}}
+ \end{quote}
+ \item This is optionally followed by |+| or |-| and then another
+ %
+ \begin{quote}
+ \opt{\meta{factor}|*|}\meta{coordinate}\opt{\meta{modifiers}}
+ \end{quote}
+ \item This is once more followed by |+| or |-| and another of the above
+ modified coordinate; and so on.
+\end{enumerate}
+
+In the following, the syntax of factors and of the different modifiers
+is explained in detail.
+
+
+\subsubsection{The Syntax of Factors}
+
+The \meta{factor}s are optional and detected by checking whether the
+\meta{coordinate computation} starts with a |(|. Also, after each $\pm$ a
+\meta{factor} is present if, and only if, the |+| or |-| sign is not directly
+followed by~|(|.
+
+If a \meta{factor} is present, it is evaluated using the |\pgfmathparse| macro.
+This means that you can use pretty complicated computations inside a factor. A
+\meta{factor} may even contain opening parentheses, which creates a
+complication: How does \tikzname\ know where a \meta{factor} ends and where a
+coordinate starts? For instance, if the beginning of a \meta{coordinate
+computation} is |2*(3+4|\dots, it is not clear whether |3+4| is part of a
+\meta{coordinate} or part of a \meta{factor}. Because of this, the following
+rule is used: Once it has been determined, that a \meta{factor} is present, in
+principle, the \meta{factor} contains everything up to the next occurrence of
+|*(|. Note that there is no space between the asterisk and the parenthesis.
+
+It is permissible to put the \meta{factor} in curly braces. This can be used
+whenever it is unclear where the \meta{factor} would end.
+
+Here are some examples of coordinate specifications that consist of exactly one
+\meta{factor} and one \meta{coordinate}:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \fill [red] ($2*(1,1)$) circle (2pt);
+ \fill [green] (${1+1}*(1,.5)$) circle (2pt);
+ \fill [blue] ($cos(0)*sin(90)*(1,1)$) circle (2pt);
+ \fill [black] (${3*(4-3)}*(1,0.5)$) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Syntax of Partway Modifiers}
+
+A \meta{coordinate} can be followed by different \meta{modifiers}. The first
+kind of modifier is the \emph{partway modifier}. The syntax (which is loosely
+inspired by Uwe Kern's |xcolor| package) is the following:
+%
+\begin{quote}
+ \meta{coordinate}\declare{|!|\meta{number}|!|\opt{\meta{angle}|:|}\meta{second coordinate}}
+\end{quote}
+%
+One could write for instance
+%
+\begin{codeexample}[code only]
+(1,2)!.75!(3,4)
+\end{codeexample}
+%
+The meaning of this is: ``Use the coordinate that is three quarters on the way
+from |(1,2)| to |(3,4)|.'' In general, \meta{coordinate
+x}|!|\meta{number}|!|\meta{coordinate y} yields the coordinate $(1 -
+\meta{number})\meta{coordinate x} + \meta{number} \meta{coordinate y}$. Note
+that this is a bit different from the way the \meta{number} is interpreted in
+the |xcolor| package: First, you use a factor between $0$ and $1$, not a
+percentage, and, second, as the \meta{number} approaches $1$, we approach the
+second coordinate, not the first. It is permissible to use a \meta{number} that
+is smaller than $0$ or larger than $1$. The \meta{number} is evaluated using
+the |\pgfmathparse| command and, thus, it can involve complicated computations.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw (1,0) -- (3,2);
+
+ \foreach \i in {0,0.2,0.5,0.9,1}
+ \node at ($(1,0)!\i!(3,2)$) {\i};
+\end{tikzpicture}
+\end{codeexample}
+
+The \meta{second coordinate} may be prefixed by an \meta{angle}, separated with
+a colon, as in |(1,1)!.5!60:(2,2)|. The general meaning of
+\meta{a}|!|\meta{factor}|!|\meta{angle}|:|\meta{b} is: ``First, consider the
+line from \meta{a} to \meta{b}. Then rotate this line by \meta{angle}
+\emph{around the point \meta{a}}. Then the two endpoints of this line will be
+\meta{a} and some point \meta{c}. Use this point \meta{c} for the subsequent
+computation, namely the partway computation.''
+
+Here are two examples:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,3);
+
+ \coordinate (a) at (1,0);
+ \coordinate (b) at (3,2);
+
+ \draw[->] (a) -- (b);
+
+ \coordinate (c) at ($ (a)!1! 10:(b) $);
+
+ \draw[->,red] (a) -- (c);
+
+ \fill ($ (a)!.5! 10:(b) $) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (4,4);
+
+ \foreach \i in {0,0.1,...,2}
+ \fill ($(2,2) !\i! \i*180:(3,2)$) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+You can repeatedly apply modifiers. That is, after any modifier you can add
+another (possibly different) modifier.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw (0,0) -- (3,2);
+ \draw[red] ($(0,0)!.3!(3,2)$) -- (3,0);
+ \fill[red] ($(0,0)!.3!(3,2)!.7!(3,0)$) circle (2pt);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Syntax of Distance Modifiers}
+
+A \emph{distance modifier} has nearly the same syntax as a partway modifier,
+only you use a \meta{dimension} (something like |1cm|) instead of a
+\meta{factor} (something like |0.5|):
+%
+\begin{quote}
+ \meta{coordinate}\declare{|!|\meta{dimension}|!|\opt{\meta{angle}|:|}\meta{second coordinate}}
+\end{quote}
+
+When you write \meta{a}|!|\meta{dimension}|!|\meta{b}, this means the
+following: Use the point that is distanced \meta{dimension} from \meta{a} on
+the straight line from \meta{a} to \meta{b}. Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw (1,0) -- (3,2);
+
+ \foreach \i in {0cm,1cm,15mm}
+ \node at ($(1,0)!\i!(3,2)$) {\i};
+\end{tikzpicture}
+\end{codeexample}
+
+As before, if you use a \meta{angle}, the \meta{second coordinate} is rotated
+by this much around the \meta{coordinate} before it is used.
+
+The combination of an \meta{angle} of |90| degrees with a distance can be used
+to ``offset'' a point relative to a line. Suppose, for instance, that you have
+computed a point |(c)| that lies somewhere on a line from |(a)| to~|(b)| and
+you now wish to offset this point by |1cm| so that the distance from this
+offset point to the line is |1cm|. This can be achieved as follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \coordinate (a) at (1,0);
+ \coordinate (b) at (3,1);
+
+ \draw (a) -- (b);
+
+ \coordinate (c) at ($ (a)!.25!(b) $);
+ \coordinate (d) at ($ (c)!1cm!90:(b) $);
+
+ \draw [<->] (c) -- (d) node [sloped,midway,above] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Syntax of Projection Modifiers}
+
+The projection modifier is also similar to the above modifiers: It also gives a
+point on a line from the \meta{coordinate} to the \meta{second coordinate}.
+However, the \meta{number} or \meta{dimension} is replaced by a
+\meta{projection coordinate}:
+%
+\begin{quote}
+ \meta{coordinate}\declare{|!|\meta{projection coordinate}|!|\opt{\meta{angle}|:|}\meta{second coordinate}}
+\end{quote}
+
+Here is an example:
+%
+\begin{codeexample}[code only]
+(1,2)!(0,5)!(3,4)
+\end{codeexample}
+
+The effect is the following: We project the \meta{projection coordinate}
+orthogonally onto the line from \meta{coordinate} to \meta{second coordinate}.
+This makes it easy to compute projected points:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \coordinate (a) at (0,1);
+ \coordinate (b) at (3,2);
+ \coordinate (c) at (2.5,0);
+
+ \draw (a) -- (b) -- (c) -- cycle;
+
+ \draw[red] (a) -- ($(b)!(a)!(c)$);
+ \draw[orange] (b) -- ($(a)!(b)!(c)$);
+ \draw[blue] (c) -- ($(a)!(c)!(b)$);
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-decorations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-decorations.tex
new file mode 100644
index 0000000000..009660a911
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-decorations.tex
@@ -0,0 +1,535 @@
+% Copyright 2008 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Decorated Paths}
+\label{section-tikz-decorations}
+
+\subsection{Overview}
+
+Decorations are a general concept to make (sub)paths ``more interesting''.
+Before we have a look at the details, let us have a look at some examples:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[thick]
+ \draw (0,3) -- (3,3);
+ \draw[decorate,decoration=zigzag] (0,2.5) -- (3,2.5);
+ \draw[decorate,decoration=brace] (0,2) -- (3,2);
+ \draw[decorate,decoration=triangles] (0,1.5) -- (3,1.5);
+ \draw[decorate,decoration={coil,segment length=4pt}] (0,1) -- (3,1);
+ \draw[decorate,decoration={coil,aspect=0}] (0,.5) -- (3,.5);
+ \draw[decorate,decoration={expanding waves,angle=7}] (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [fill=red!20,draw,decorate,decoration={bumps,mirror},
+ minimum height=1cm]
+ {Bumpy};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \filldraw[fill=blue!20] (0,3)
+ decorate [decoration=saw] { -- (3,3) }
+ decorate [decoration={coil,aspect=0}] { -- (2,1) }
+ decorate [decoration=bumps] { -| (0,3) };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [fill=yellow!50,draw,thick, minimum height=2cm, minimum width=3cm,
+ decorate, decoration={random steps,segment length=3pt,amplitude=1pt}]
+ {Saved from trash};
+\end{tikzpicture}
+\end{codeexample}
+
+The general idea of decorations is the following: First, you construct a path
+using the usual path construction commands. The resulting path is, in essence,
+a series of straight and curved lines. Instead of directly using this path for
+filling or drawing, you can then specify that it should form the basis for a
+decoration. In this case, depending on which decoration you use, a new path is
+constructed ``along'' the path you specified. For instance, with the |zigzag|
+decoration, the new path is a zigzagging line that goes along the old path.
+
+Let us have a look at an example: In the first picture, we see a path that
+consists of a line, an arc, and a line. In the second picture, this path has
+been used as the basis of a decoration.
+%
+\begin{codeexample}[]
+\tikz \fill
+ [fill=blue!20,draw=blue,thick] (0,0) -- (2,1) arc (90:-90:.5) -- cycle;
+\end{codeexample}
+%
+\begin{codeexample}[]
+\tikz \fill [decorate,decoration={zigzag}]
+ [fill=blue!20,draw=blue,thick] (0,0) -- (2,1) arc (90:-90:.5) -- cycle;
+\end{codeexample}
+
+It is also possible to decorate only a subpath (the exact syntax will be
+explained later in this section).
+%
+\begin{codeexample}[]
+\tikz \fill [decoration={zigzag}]
+ [fill=blue!20,draw=blue,thick] (0,0) -- (2,1)
+ decorate { arc (90:-90:.5) } -- cycle;
+\end{codeexample}
+
+The |zigzag| decoration will be called a \emph{path morphing} decoration
+because it morphs a path into a different, but topologically equivalent path.
+Not all decorations are path morphing; rather there are three kinds of
+decorations.
+
+\begin{enumerate}
+ \item The just-mentioned \emph{path morphing} decorations morph the path in
+ the sense that what used to be a straight line might afterwards be a
+ squiggly line or might have bumps. However, a line is still and a line
+ and path deforming decorations do not change the number of subpaths.
+
+ Examples of such decorations are the |snake| or the |zigzag|
+ decoration. Many such decorations are defined in the library
+ |decorations.pathmorphing|.
+
+ \item \emph{Path replacing} decorations completely replace the path by a
+ different path that is only ``loosely based'' on the original path. For
+ instance, the |crosses| decoration replaces a path by a path consisting
+ of a sequence of crosses. Note how in the following example filling the
+ path has no effect since the path consist only of (numerous)
+ unconnected straight line subpaths:
+ %
+\begin{codeexample}[]
+\tikz \fill [decorate,decoration={crosses}]
+ [fill=blue!20,draw=blue,thick] (0,0) -- (2,1) arc (90:-90:.5) -- cycle;
+\end{codeexample}
+
+ Examples of path replacing decorations are |crosses| or |ticks| or
+ |shape backgrounds|. Such decorations are defined in the library
+ |decorations.pathreplacing|, but also in |decorations.shapes|.
+ \item \emph{Path removing} decorations completely remove the
+ to-be-decorated path. Thus, they have no effect on the main path that
+ is being constructed. Instead, they typically have numerous \emph{side
+ effects}. For instance, they might ``write some text'' along the
+ (removed) path or they might place nodes along this path. Note that for
+ such decorations the path usage command for the main path have no
+ influence on how the decoration looks like.
+ %
+\begin{codeexample}[]
+\tikz \fill [decorate,decoration={text along path,
+ text=This is a text along a path. Note how the path is lost.}]
+ [fill=blue!20,draw=blue,thick] (0,0) -- (2,1) arc (90:-90:.5) -- cycle;
+\end{codeexample}
+ %
+\end{enumerate}
+
+Decorations are defined in different decoration libraries, see
+Section~\ref{section-library-decorations} for details. It is also possible to
+define your own decorations, see Section~\ref{section-base-decorations}, but
+you need to use the \pgfname\ basic layer and a bit of theory is involved.
+
+Decorations can be used to decorate already decorated paths. In the following
+three graphics, we start with a simple path, then decorate it once, and then
+decorate the decorated path once more.
+%
+\begin{codeexample}[]
+\tikz \fill [fill=blue!20,draw=blue,thick]
+ (0,0) rectangle (3,2);
+\end{codeexample}
+%
+\begin{codeexample}[]
+\tikz \fill [fill=blue!20,draw=blue,thick]
+ decorate[decoration={zigzag,segment length=10mm,amplitude=2.5mm}]
+ { (0,0) rectangle (3,2) };
+\end{codeexample}
+%
+\begin{codeexample}[]
+\tikz \fill [fill=blue!20,draw=blue,thick]
+ decorate[decoration={crosses,segment length=2mm}] {
+ decorate[decoration={zigzag,segment length=10mm,amplitude=2.5mm}] {
+ (0,0) rectangle (3,2)
+ }
+ };
+\end{codeexample}
+
+One final word of warning: Decorations can be pretty slow to typeset and they
+can be inaccurate. The reason is that \pgfname\ has to a \emph{lot} of rather
+difficult computations in the background and \TeX\ is not very good at doing
+math. Decorations are fastest when applied to straight line segments, but even
+then they are much slower than other alternatives. For instance, the |ticks|
+decoration can be simulated by clever use of a dashing pattern and the dashing
+pattern will literally be thousands of times faster to typeset. However, for
+most decorations there are no real alternatives.
+
+\begin{tikzlibrary}{decorations}
+ In order to use decorations, you first have to load a decoration library.
+ This |decoration| library defines the basic options described in the
+ following, but it does not define any new decorations. This is done by
+ libraries like |decorations.text|. Since these more specialized libraries
+ include the |decoration| library automatically, you usually do not have to
+ bother about it.
+\end{tikzlibrary}
+
+
+\subsection{Decorating a Subpath Using the Decorate Path Command}
+
+The most general way to decorate a (sub)path is the following path command.
+
+\begin{pathoperation}{decorate}{\opt{\oarg{options}}\marg{subpath}}
+ This path operation causes the \meta{subpath} to be decorated using the
+ current decoration. Depending on the decoration, this may or may not extend
+ the current path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw decorate [decoration={name=zigzag}]
+ { (0,0) .. controls (0,2) and (3,0) .. (3,2) |- (0,0) };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The path can include straight lines, curves, rectangles, arcs, circles,
+ ellipses, and even already decorated paths (that is, you can nest
+ applications of the |decorate| path command, see below).
+
+ Due to the limits on the precision in \TeX, some inaccuracies in
+ positioning when crossing input segment boundaries may occasionally be
+ found.
+
+ You can use nodes normally inside the \meta{subpath}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw decorate [decoration={name=zigzag}]
+ { (0,0) -- (2,2) node (hi) [left,draw=red] {Hi!} arc(90:0:1)};
+
+ \draw [blue] decorate [decoration={crosses}] {(3,0) -- (hi)};
+\end{tikzpicture}
+\end{codeexample}
+
+ The following key is used to select the decoration and also to select
+ further ``rendering options'' for the decoration.
+
+ \begin{key}{/pgf/decoration=\meta{decoration options}}
+ \keyalias{tikz}
+ This option is used to specify which decoration is used and how it will
+ look like. Note that this key will \emph{not} cause any decorations to
+ be applied, immediately. It takes the |decorate| path command or the
+ |decorate| option to actually decorate a path. The |decoration| option
+ is only used to specify which decoration should be used, in principle.
+ You can also use this option at the beginning of a picture or a scope
+ to specify the decoration to be used with each invocation of the
+ |decorate| path command. Naturally, any local options of the |decorate|
+ path command override these ``global'' options.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=zigzag]
+ \draw decorate {(0,0) -- (3,2)};
+ \draw [red] decorate [decoration=crosses] {(0,2) -- (3,0)};
+\end{tikzpicture}
+\end{codeexample}
+
+ The \meta{decoration options} are special options (which have the path
+ prefix |/pgf/decoration/|) that determine the properties of the
+ decoration. Which options are appropriate for a decoration strongly
+ depend on the decoration, you will have to look up the appropriate
+ options in the documentation of the decoration, see
+ Section~\ref{section-library-decorations}.
+
+ There is one option (available only in \tikzname) that is special:
+ %
+ \begin{key}{/pgf/decoration/name=\meta{name} (initially none)}
+ Use this key to set which decoration is to be used. The \meta{name}
+ can both be a decoration or a meta-decoration (you need to worry
+ about the difference only if you wish to define your own
+ decorations).
+
+ If you set \meta{name} to |none|, no decorations are added.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw decorate [decoration={name=zigzag}]
+ { (0,0) .. controls (0,2) and (3,0) .. (3,2) };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Since this option is used so often, you can also leave out the
+ |name=| part. Thus, the above example can be rewritten more
+ succinctly:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] grid (3,2);
+ \draw decorate [decoration=zigzag]
+ { (0,0) .. controls (0,2) and (3,0) .. (3,2) };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ In general, when \meta{decoration options} are parsed, for each
+ unknown key it is checked whether that key happens to be a
+ (meta-)decoration and, if so, the |name| option is executed for
+ this key.
+ \end{key}
+
+ Further options allow you to adjust the position of decorations
+ relative to the to-be-decorated path. See
+ Section~\ref{section-decorations-adjust} below for details.
+ \end{key}
+
+ Recall that some decorations actually completely remove the to-be-decorated
+ path. In such cases, the construction of the main path is resumed after the
+ |decorate| path command ends.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration={text along path,text=
+ around and around and around and around we go}]
+
+ \draw (0,0) -- (1,1) decorate { -- (2,1) } -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ It is permissible to nest |decorate| commands. In this case, the path
+ resulting from the first decoration process is used as the to-be-decorated
+ path for the second decoration process. This is especially useful for
+ drawing fractals. The |Koch snowflake| decoration replaces a straight line
+ like \tikz\draw (0,0) -- (1,0); by
+ \tikz[decoration=Koch snowflake] \draw decorate{(0,0) -- (1,0)};.
+ Repeatedly applying this transformation to a triangle yields a fractal that
+ looks a bit like a snowflake, hence the name.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=Koch snowflake,draw=blue,fill=blue!20,thick]
+ \filldraw (0,0) -- ++(60:1) -- ++(-60:1) -- cycle ;
+ \filldraw decorate{ (0,-1) -- ++(60:1) -- ++(-60:1) -- cycle };
+ \filldraw decorate{ decorate{ (0,-2.5) -- ++(60:1) -- ++(-60:1) -- cycle }};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+
+\subsection{Decorating a Complete Path}
+
+You may sometimes wish to decorate a path over whose construction you have no
+control. For instance, the path of the background of a node is created without
+having a chance to issue a |decorate| path command. In such cases you can use
+the following option, which allows you to decorate a path ``after the fact''.
+
+\begin{key}{/tikz/decorate=\opt{\meta{boolean}} (default true)}
+ When this key is set, the whole path is decorated after it has been
+ finished. The decoration used for decorating the path is set via the
+ |decoration| way, in exactly the same way as for the |decorate| path
+ command. Indeed, the following two commands have the same effect:
+ %
+ \begin{enumerate}
+ \item |\path decorate[|\meta{options}|] {|\meta{path}|};|
+ \item |\path [decorate,|\meta{options}|] |\meta{path}|;|
+ \end{enumerate}
+ %
+ The main use or the |decorate| option is the you can also use it with the
+ nodes. It then causes the background path of the node to be decorated. Note
+ that you can decorate a background path only once in this manner. That is,
+ in contrast to the |decorate| path command you cannot apply this option
+ twice (this would just set it to |true|, once more).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=zigzag]
+ \draw [help lines] (0,0) grid (3,5);
+
+ \draw [fill=blue!20,decorate] (1.5,4) circle (1cm);
+
+ \node at (1.5,2.5) [fill=red!20,decorate,ellipse] {Ellipse};
+
+ \node at (1.5,1) [inner sep=6mm,fill=red!20,decorate,ellipse,decoration=
+ {text along path,text={This is getting silly}}] {Ellipse};
+\end{tikzpicture}
+\end{codeexample}
+
+ In the last example, the |text along path| decoration removes the path. In
+ such cases it is useful to use a pre- or postaction to cause the decoration
+ to be applied only before or after the main path has been used.
+ Incidentally, this is another application of the |decorate| option that you
+ cannot achieve with the decorate path command.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[decoration=zigzag]
+ \node at (1.5,1) [inner sep=6mm,fill=red!20,ellipse,
+ postaction={decorate,decoration=
+ {text along path,text={This is getting silly}}}] {Ellipse};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Here is more useful example, where a postaction is used to add the path
+ after the main path has been drawn.
+ %
+% \catcode`\|12 % !?
+\begin{codeexample}[]
+\begin{tikzpicture}
+\draw [help lines] grid (3,2);
+\fill [draw=red,fill=red!20,
+ postaction={decorate,decoration={raise=2pt,text along path,
+ text=around and around and around and around we go}}]
+ (0,1) arc (180:-180:1.5cm and 1cm);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Adjusting Decorations}
+\label{section-decorations-adjust}
+
+\subsubsection{Positioning Decorations Relative to the To-Be-Decorate Path}
+
+The following option, which are only available with \tikzname, allow you to
+modify the positioning of decorations relative to the to-be-decorated path.
+
+\begin{key}{/pgf/decoration/raise=\meta{dimension} (initially 0pt)}
+ The segments of the decoration are raised by \meta{dimension} relative to
+ the to-be-decorated path. More precisely, the segments of the path are
+ offset by this much ``to the left'' of the path as we travel along the
+ path. This raising is done after and in addition to any transformations set
+ using the |transform| option (see below).
+
+ A negative \meta{dimension} will offset the decoration ``to the right'' of
+ the to-be-decorated path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw (0,0) -- (1,1) arc (90:0:2 and 1);
+ \draw decorate [decoration=crosses]
+ { (0,0) -- (1,1) arc (90:0:2 and 1) };
+ \draw[red] decorate [decoration={crosses,raise=5pt}]
+ { (0,0) -- (1,1) arc (90:0:2 and 1) };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/decoration/mirror=\opt{\meta{boolean}}}
+ Causes the segments of the decoration to be mirrored along the
+ to-be-decorated path. This is done after and in addition to any
+ transformations set using the |transform| and/or |raise| options.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node (a) {A};
+ \node (b) at (2,1) {B};
+ \draw (a) -- (b);
+ \draw[decorate,decoration=brace] (a) -- (b);
+ \draw[decorate,decoration={brace,mirror},red] (a) -- (b);
+ \draw[decorate,decoration={brace,mirror,raise=5pt},blue] (a) -- (b);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/decoration/transform=\meta{transformations}}
+ This key allows you to specify general \meta{transformations} to be applied
+ to the segments of a decoration. These transformations are applied before
+ and independently of |raise| and |mirror| transformations. The
+ \meta{transformations} should be normal \tikzname\ transformations like
+ |shift| or |rotate|.
+
+ In the following example the |shift only| transformation is used to make
+ sure that the crosses are \emph{not} sloped along the path.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw (0,0) -- (1,1) arc (90:0:2 and 1);
+ \draw[red,very thick] decorate [decoration={
+ crosses,transform={shift only},shape size=1.5mm}]
+ { (0,0) -- (1,1) arc (90:0:2 and 1) };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Starting and Ending Decorations Early or Late}
+
+You sometimes may wish to ``end'' a decoration a bit early on the path. For
+instance, you might wish a |snake| decoration to stop 5mm before the end of the
+path and to continue in a straight line. There are different ways of achieving
+this effect, but the easiest may be the |pre| and |post| options, which only
+have an effect in \tikzname. Note, however, that they can only be used with
+decorations, not with meta-decorations.
+
+\begin{key}{/pgf/decoration/pre=\meta{decoration} (initially lineto)}
+ This key sets a decoration that should be used before the main decoration
+ starts. The \meta{decoration} will be used for a length of |pre length|,
+ which |0pt| by default. Thus, for the |pre| option to have any effect, you
+ also need to set the |pre length| option.
+ %
+ % TODO: Nesting tikzpictures is NOT supported
+\begin{codeexample}[]
+\tikz [decoration={zigzag,pre=lineto,pre length=1cm}]
+ \draw [decorate] (0,0) -- (2,1) arc (90:0:1);
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz [decoration={zigzag,pre=moveto,pre length=1cm}]
+ \draw [decorate] (0,0) -- (2,1) arc (90:0:1);
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz [decoration={zigzag,pre=crosses,pre length=1cm}]
+ \draw [decorate] (0,0) -- (2,1) arc (90:0:1);
+\end{codeexample}
+
+ Note that the default |pre| option is |lineto|, not |curveto|. This means
+ that the default |pre| decoration will not follow curves (for efficiency
+ reasons). Change the |pre| key to |curveto| if you have a curved path.
+ %
+\begin{codeexample}[]
+\tikz [decoration={zigzag,pre length=3cm}]
+ \draw [decorate] (0,0) -- (2,1) arc (90:0:1);
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz [decoration={zigzag,pre=curveto,pre length=3cm}]
+ \draw [decorate] (0,0) -- (2,1) arc (90:0:1);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/decoration/pre length=\meta{dimension} (initially 0pt)}
+ This key sets the distance along which the pre-decoration should be used.
+ If you do not need/wish a pre-decoration, set this key to |0pt| (exactly
+ this string, not just to something that evaluates to the same things such
+ as |0cm|).
+\end{key}
+
+\begin{key}{/pgf/decorations/post=\meta{decoration} (initially lineto)}
+ Works like |pre|, only for the end of the decoration.
+\end{key}
+
+\begin{key}{/pgf/decorations/post length=\meta{dimension} (initially 0pt)}
+ Works like |pre length|, only for the end of the decoration.
+\end{key}
+
+Here is a typical example that shows how these keys can be used:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [decoration=snake,
+ line around/.style={decoration={pre length=#1,post length=#1}}]
+
+ \draw[->,decorate] (0,0) -- ++(3,0);
+ \draw[->,decorate,line around=5pt] (0,-5mm) -- ++(3,0);
+ \draw[->,decorate,line around=1cm] (0,-1cm) -- ++(3,0);
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-design.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-design.tex
new file mode 100644
index 0000000000..607a55fb43
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-design.tex
@@ -0,0 +1,274 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Design Principles}
+
+This section describes the design principles behind the \tikzname\ frontend,
+where \tikzname\ means ``\tikzname\ ist \emph{kein} Zeichenprogramm''. To use
+\tikzname, as a \LaTeX\ user say |\usepackage{tikz}| somewhere in the preamble,
+as a plain \TeX\ user say |\input tikz.tex|. \tikzname's job is to make your
+life easier by providing an easy-to-learn and easy-to-use syntax for describing
+graphics.
+
+The commands and syntax of \tikzname\ were influenced by several sources. The
+basic command names and the notion of path operations is taken from
+\textsc{metafont}, the option mechanism comes from \textsc{pstricks}, the
+notion of styles is reminiscent of \textsc{svg}, the graph syntax is taken from
+\textsc{graphviz}. To make it all work together, some compromises were
+necessary. I also added some ideas of my own, like coordinate transformations.
+
+The following basic design principles underlie \tikzname:
+%
+\begin{enumerate}
+ \item Special syntax for specifying points.
+ \item Special syntax for path specifications.
+ \item Actions on paths.
+ \item Key--value syntax for graphic parameters.
+ \item Special syntax for nodes.
+ \item Special syntax for trees.
+ \item Special syntax for graphs.
+ \item Grouping of graphic parameters.
+ \item Coordinate transformation system.
+\end{enumerate}
+
+
+\subsection{Special Syntax For Specifying Points}
+
+\tikzname\ provides a special syntax for specifying points and coordinates. In
+the simplest case, you provide two \TeX\ dimensions, separated by commas, in
+round brackets as in |(1cm,2pt)|.
+
+You can also specify a point in polar coordinates by using a colon instead of a
+comma as in |(30:1cm)|, which means ``1cm in a 30 degrees direction''.
+
+If you do not provide a unit, as in |(2,1)|, you specify a point in \pgfname's
+$xy$-coordinate system. By default, the unit $x$-vector goes 1cm to the right
+and the unit $y$-vector goes 1cm upward.
+
+By specifying three numbers as in |(1,1,1)| you specify a point in \pgfname's
+$xyz$-coordinate system.
+
+It is also possible to use an anchor of a previously defined shape as in
+|(first node.south)|.
+
+You can add two plus signs before a coordinate as in |++(1cm,0pt)|. This means
+``1cm to the right of the last point used''. This allows you to easily specify
+relative movements. For example, |(1,0) ++(1,0) ++(0,1)| specifies the three
+coordinates |(1,0)|, then |(2,0)|, and |(2,1)|.
+
+Finally, instead of two plus signs, you can also add a single one. This also
+specifies a point in a relative manner, but it does not ``change'' the current
+point used in subsequent relative commands. For example, |(1,0) +(1,0) +(0,1)|
+specifies the three coordinates |(1,0)|, then |(2,0)|, and |(1,1)|.
+
+
+\subsection{Special Syntax For Path Specifications}
+
+When creating a picture using \tikzname, your main job is the specification of
+\emph{paths}. A path is a series of straight or curved lines, which need not be
+connected. \tikzname\ makes it easy to specify paths, partly using the syntax
+of \textsc{metapost}. For example, to specify a triangular path you use
+%
+\begin{codeexample}[code only]
+(5pt,0pt) -- (0pt,0pt) -- (0pt,5pt) -- cycle
+\end{codeexample}
+%
+and you get \tikz \draw (5pt,0pt) -- (0pt,0pt) -- (0pt,5pt) -- cycle; when you
+draw this path.
+
+
+\subsection{Actions on Paths}
+
+A path is just a series of straight and curved lines, but it is not yet
+specified what should happen with it. One can \emph{draw} a path, \emph{fill} a
+path, \emph{shade} it, \emph{clip} it, or do any combination of these. Drawing
+(also known as \emph{stroking}) can be thought of as taking a pen of a certain
+thickness and moving it along the path, thereby drawing on the canvas. Filling
+means that the interior of the path is filled with a uniform color. Obviously,
+filling makes sense only for \emph{closed} paths and a path is automatically
+closed prior to filling, if necessary.
+
+Given a path as in |\path (0,0) rectangle (2ex,1ex);|, you can draw it by
+adding the |draw| option as in |\path[draw] (0,0) rectangle (2ex,1ex);|, which
+yields \tikz \path[draw] (0,0) rectangle (2ex,1ex);. The |\draw| command is
+just an abbreviation for |\path[draw]|. To fill a path, use the |fill| option
+or the |\fill| command, which is an abbreviation for |\path[fill]|. The
+|\filldraw| command is an abbreviation for |\path[fill,draw]|. Shading is
+caused by the |shade| option (there are |\shade| and |\shadedraw|
+abbreviations) and clipping by the |clip| option. There is also a |\clip|
+command, which does the same as |\path[clip]|, but not commands like
+|\drawclip|. Use, say, |\draw[clip]| or |\path[draw,clip]| instead.
+
+All of these commands can only be used inside |{tikzpicture}| environments.
+
+\tikzname\ allows you to use different colors for filling and stroking.
+
+
+\subsection{Key--Value Syntax for Graphic Parameters}
+
+Whenever \tikzname\ draws or fills a path, a large number of graphic parameters
+influences the rendering. Examples include the colors used, the dashing
+pattern, the clipping area, the line width, and many others. In \tikzname, all
+these options are specified as lists of so called key--value pairs, as in
+|color=red|, that are passed as optional parameters to the path drawing and
+filling commands. This usage is similar to \textsc{pstricks}. For example, the
+following will draw a thick, red triangle;
+%
+\begin{codeexample}[]
+\tikz \draw[line width=2pt,color=red] (1,0) -- (0,0) -- (0,1) -- cycle;
+\end{codeexample}
+
+
+\subsection{Special Syntax for Specifying Nodes}
+
+\tikzname\ introduces a special syntax for adding text or, more generally,
+nodes to a graphic. When you specify a path, add nodes as in the following
+example:
+%
+\begin{codeexample}[]
+\tikz \draw (1,1) node {text} -- (2,2);
+\end{codeexample}
+%
+Nodes are inserted at the current position of the path, but either \emph{after}
+(the default) or \emph{before} the complete path is rendered. When special
+options are given, as in |\draw (1,1) node[circle,draw] {text};|, the text is
+not just put at the current position. Rather, it is surrounded by a circle and
+this circle is ``drawn''.
+
+You can add a name to a node for later reference either by using the option
+|name=|\meta{node name} or by stating the node name in parentheses outside the
+text as in |node[circle](name){text}|.
+
+Predefined shapes include |rectangle|, |circle|, and |ellipse|, but it is
+possible (though a bit challenging) to define new shapes.
+
+
+\subsection{Special Syntax for Specifying Trees}
+
+The ``node syntax'' can also be used to draw tress: A |node| can be followed by
+any number of children, each introduced by the keyword |child|. The children
+are nodes themselves, each of which may have children in turn.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+Since trees are made up from nodes, it is possible to use options to modify the
+way trees are drawn. Here are two examples of the above tree, redrawn with
+different options:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [edge from parent fork down, sibling distance=15mm, level distance=15mm,
+ every node/.style={fill=red!30,rounded corners},
+ edge from parent/.style={red,-o,thick,draw}]
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [parent anchor=east,child anchor=west,grow=east,
+ sibling distance=15mm, level distance=15mm,
+ every node/.style={ball color=red,circle,text=white},
+ edge from parent/.style={draw,dashed,thick,red}]
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Special Syntax for Graphs}
+
+The |\node| command gives you fine control over where nodes should be placed,
+what text they should use, and what they should look like. However, when you
+draw a graph, you typically need to create numerous fairly similar nodes that
+only differ with respect to the name they show. In these cases, the |graph|
+syntax can be used, which is another syntax layer build ``on top'' of the node
+syntax.
+%
+\begin{codeexample}[]
+\tikz \graph [grow down, branch right] {
+ root -> { left, right -> {child, child} }
+};
+\end{codeexample}
+%
+The syntax of the |graph| command extends the so-called \textsc{dot}-notation
+used in the popular \textsc{graphviz} program.
+
+Depending on the version of \TeX\ you use (it must allow you to call Lua code,
+which is the case for Lua\TeX), you can also ask \tikzname\ to do automatically
+compute good positions for the nodes of a graph using one of several integrated
+\emph{graph drawing algorithms}.
+
+
+\subsection{Grouping of Graphic Parameters}
+
+Graphic parameters should often apply to several path drawing or filling
+commands. For example, we may wish to draw numerous lines all with the same
+line width of 1pt. For this, we put these commands in a |{scope}| environment
+that takes the desired graphic options as an optional parameter. Naturally, the
+specified graphic parameters apply only to the drawing and filling commands
+inside the environment. Furthermore, nested |{scope}| environments or
+individual drawing commands can override the graphic parameters of outer
+|{scope}| environments. In the following example, three red lines, two green
+lines, and one blue line are drawn:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \begin{scope}[color=red]
+ \draw (0mm,10mm) -- (10mm,10mm);
+ \draw (0mm, 8mm) -- (10mm, 8mm);
+ \draw (0mm, 6mm) -- (10mm, 6mm);
+ \end{scope}
+ \begin{scope}[color=green]
+ \draw (0mm, 4mm) -- (10mm, 4mm);
+ \draw (0mm, 2mm) -- (10mm, 2mm);
+ \draw[color=blue] (0mm, 0mm) -- (10mm, 0mm);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+The |{tikzpicture}| environment itself also behaves like a |{scope}|
+environment, that is, you can specify graphic parameters using an optional
+argument. These optional apply to all commands in the picture.
+
+
+\subsection{Coordinate Transformation System}
+
+\tikzname\ supports both \pgfname's \emph{coordinate} transformation system to
+perform transformations as well as \emph{canvas} transformations, a more
+low-level transformation system. (For details on the difference between
+coordinate transformations and canvas transformations see
+Section~\ref{section-design-transformations}.)
+
+The syntax is set up in such a way that it is harder to use canvas
+transformations than coordinate transformations. There are two reasons for
+this: First, the canvas transformation must be used with great care and often
+results in ``bad'' graphics with changing line width and text in wrong sizes.
+Second, \pgfname\ loses track of where nodes and shapes are positioned when
+canvas transformations are used. So, in almost all circumstances, you should
+use coordinate transformations rather than canvas transformations.
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-graphs.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-graphs.tex
new file mode 100644
index 0000000000..7e4560d0da
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-graphs.tex
@@ -0,0 +1,3695 @@
+% Copyright 2010 by Till Tantau
+% Copyright 2011 by Jannis Pohlmann
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Specifying Graphs}
+\label{section-library-graphs}
+
+\subsection{Overview}
+
+\tikzname\ offers a powerful path command for specifying how the nodes in a
+graph are connected by edges and arcs: The |graph| path command, which becomes
+available when you load the |graphs| library.
+
+\begin{tikzlibrary}{graphs}
+ The package must be loaded to use the |graph| path command.
+\end{tikzlibrary}
+
+In this section, by \emph{graph} we refer to a set of nodes together with some
+edges (sometimes also called arcs, in case they are directed) such as the
+following:
+%
+\begin{codeexample}[]
+\tikz \graph { a -> {b, c} -> d };
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \graph {
+ subgraph I_nm [V={a, b, c}, W={1,...,4}];
+
+ a -> { 1, 2, 3 };
+ b -> { 1, 4 };
+ c -> { 2 [>green!75!black], 3, 4 [>red]}
+};
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz
+ \graph [nodes={draw, circle}, clockwise, radius=.5cm, empty nodes, n=5] {
+ subgraph I_n [name=inner] --[complete bipartite]
+ subgraph I_n [name=outer]
+ };
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz
+ \graph [nodes={draw, circle}, clockwise, radius=.75cm, empty nodes, n=8] {
+ subgraph C_n [name=inner] <->[shorten <=1pt, shorten >=1pt]
+ subgraph C_n [name=outer]
+ };
+\end{codeexample}
+
+\begin{codeexample}[width=6.6cm]
+\tikz [>={To[sep]}, rotate=90, xscale=-1,
+ mark/.style={fill=black!50}, mark/.default=]
+ \graph [trie, simple,
+ nodes={circle,draw},
+ edges={nodes={
+ inner sep=1pt, anchor=mid,
+ fill=graphicbackground}}, % yellowish background
+ put node text on incoming edges]
+ {
+ root[mark] -> {
+ a -> n -> {
+ g [mark],
+ f -> a -> n -> g [mark]
+ },
+ f -> a -> n -> g [mark],
+ g[mark],
+ n -> {
+ g[mark],
+ f -> a -> n -> g[mark]
+ }
+ },
+ { [edges=red] % highlight one path
+ root -> f -> a -> n
+ }
+ };
+\end{codeexample}
+
+The nodes of a graph are normal \tikzname\ nodes, the edges are normal lines
+drawn between nodes. There is nothing in the |graph| library that you cannot do
+using the normal |\node| and the |edge| commands. Rather, its purpose is to
+offer a concise and powerful way of \emph{specifying} which nodes are present
+and how they are connected. The |graph| library only offers simple methods for
+specifying \emph{where} the nodes should be shown, its main strength is in
+specifying which nodes and edges are present in principle. The problem of
+finding ``good positions on the canvas'' for the nodes of a graph is left to
+\emph{graph drawing algorithms}, which are covered in Part~\ref{part-gd} of
+this manual and which are not part of the |graphs| library; indeed, these
+algorithms can be used also with graphs specified using |node| and |edge|
+commands.
+%
+\ifluatex
+As an example, consider the above drawing of a trie, which is drawn without
+using the graph drawing libraries. Its layout can be somewhat improved by
+loading the |layered| graph drawing library, saying |\tikz[layered layout,...|,
+and then using Lua\TeX, resulting in the following drawing of the same graph:
+\medskip
+
+\tikz [layered layout, >={To[sep]}, rotate=90, xscale=-1,
+ mark/.style={fill=black!50}, mark/.default=]
+ \graph [trie, simple, sibling distance=8mm,
+ nodes={circle,draw},
+ edges={nodes={
+ inner sep=1pt, anchor=mid, fill=white}},
+ put node text on incoming edges]
+ {
+ root[mark] -> {
+ a -> n -> {
+ g [mark],
+ f -> a -> n -> g [mark]
+ },
+ f -> a -> n -> g [mark],
+ g[mark],
+ n -> {
+ g[mark],
+ f -> a -> n -> g[mark]
+ }
+ },
+ { [edges=red] % highlight one path
+ root -> f -> a -> n
+ }
+ };
+\medskip
+\fi
+
+The |graph| library uses a syntax that is quite different from the normal
+\tikzname\ syntax for specifying nodes. The reason for this is that for many
+medium-sized graphs it can become quite cumbersome to specify all the nodes
+using |\node| repeatedly and then using a great number of |edge| command;
+possibly with complicated |\foreach| statements. Instead, the syntax of the
+|graph| library is loosely inspired by the \textsc{dot} format, which is quite
+useful for specifying medium-sized graphs, with some extensions on top.
+
+
+\subsection{Concepts}
+
+The present section aims at giving a quick overview of the main concepts behind
+the |graph| command. The exact syntax is explained in more detail in later
+sections.
+
+
+\subsubsection{Concept: Node Chains}
+
+The basic way of specifying a graph is to write down a \emph{node chain} as in
+the following example:
+%
+\begin{codeexample}[]
+\tikz [every node/.style = draw]
+ \graph { foo -> bar -> blub };
+\end{codeexample}
+
+As can be seen, the text |foo -> bar -> my node| creates three nodes, one with
+the text |foo|, one with |bar| and one with the text |blub|. These nodes are
+connected by arrows, which are caused by the |->| between the node texts. Such
+a sequence of node texts and arrows between them is called a \emph{chain} in
+the following.
+
+Inside a graph there can be more than one chain:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> b -> c;
+ d -> e -> f;
+ g -> f;
+};
+\end{codeexample}
+
+Multiple chains are separated by a semicolon or a comma (both have exactly the
+same effect). As the example shows, when a node text is seen for the second
+time, instead of creating a new node, a connection is created to the already
+existing node.
+
+When a node like |f| is created, both the node name and the node text are
+identical by default. This is not always desirable and can be changed by using
+the |as| key or by providing another text after a slash:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ x1/$x_1$ -> x2 [as=$x_2$, red] -> x34/{$x_3,x_4$};
+ x1 -> [bend left] x34;
+};
+\end{codeexample}
+
+When you wish to use a node name that contains special symbols like commas or
+dashes, you must surround the node name by quotes. This allows you to use quite
+arbitrary text as a ``node name'':
+%
+\begin{codeexample}[]
+\tikz \graph {
+ "$x_1$" -> "$x_2$"[red] -> "$x_3,x_4$";
+ "$x_1$" ->[bend left] "$x_3,x_4$";
+};
+\end{codeexample}
+
+
+\subsubsection{Concept: Chain Groups}
+
+Multiple chains that are separated by a semicolon or a comma and that are
+surrounded by curly braces form what will be called a \emph{chain group} or
+just a \emph{group}. A group in itself has no special effect. However, things
+get interesting when you write down a node or even a whole group and connect it
+to another group. In this case, the ``exit points'' of the first node or group
+get connected to the ``entry points'' of the second node or group:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> {
+ b -> c,
+ d -> e
+ } -> f
+};
+\end{codeexample}
+
+Chain groups make it easy to create tree structures:
+%
+\begin{codeexample}[width=10cm]
+\tikz
+ \graph [grow down,
+ branch right=2.5cm] {
+ root -> {
+ child 1,
+ child 2 -> {
+ grand child 1,
+ grand child 2
+ },
+ child 3 -> {
+ grand child 3
+ }
+ }
+};
+\end{codeexample}
+
+As can be seen, the placement is not particularly nice by default, use the
+algorithms from the graph drawing libraries to get a better layout. For
+instance, adding |tree layout| to the above code results in the following
+somewhat more pleasing rendering:
+%
+\ifluatex
+\medskip
+
+\tikz \graph [grow down, branch right=2.5cm, tree layout] {
+ root -> {
+ child 1,
+ child 2 -> {
+ grand child 1,
+ grand child 2
+ },
+ child 3 -> {
+ grand child 3
+ }
+ }
+};
+\else
+ (You need to use Lua\TeX\ to typeset this graphic.)
+\fi
+
+
+\subsubsection{Concept: Edge Labels and Styles}
+
+When connectors like |->| or |--| are used to connect nodes or whole chain
+groups, one or more edges will typically be created. These edges can be styles
+easily by providing options in square brackets directly after these connectors:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a ->[red] b --[thick] {c, d};
+};
+\end{codeexample}
+
+Using the quotes syntax, see Section~\ref{section-label-quotes}, you can even
+add labels to the edges easily by putting the labels in quotes:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a ->[red, "foo"] b --[thick, "bar"] {c, d};
+};
+\end{codeexample}
+
+For the first edge, the effect is as desired, however between |b| and the group
+|{c,d}| two edges are inserted and the options |thick| and the label option
+|"bar"| is applied to both of them. While this is the correct and consistent
+behaviour, we typically might wish to specify different labels for the edge
+going from |b| to |c| and the edge going from |b| to |d|. To achieve this
+effect, we can no longer specify the label as part of the options of |--|.
+Rather, we must pass the desired label to the nodes |c| and |d|, but we must
+somehow also indicate that these options actually ``belong'' to the edge
+``leading to'' to nodes. This is achieved by preceding the options with a
+greater-than sign:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> b -- {c [> "foo"], d [> "bar"']};
+};
+\end{codeexample}
+
+Symmetrically, preceding the options by |<| causes the options and labels to
+apply to the ``outgoing'' edges of the node:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a [< red] -> b -- {c [> blue], d [> "bar"']};
+};
+\end{codeexample}
+
+This syntax allows you to easily create trees with special edge labels as in
+the following example of a treap:
+%
+\begin{codeexample}[]
+\tikz
+ \graph [edge quotes={fill=white,inner sep=1pt},
+ grow down, branch right, nodes={circle,draw}] {
+ "" -> h [>"9"] -> {
+ c [>"4"] -> {
+ a [>"2"],
+ e [>"0"]
+ },
+ j [>"7"]
+ }
+ };
+\end{codeexample}
+
+
+\subsubsection{Concept: Node Sets}
+
+When you write down some node text inside a |graph| command, a new node is
+created by default unless this node has already been created inside the same
+|graph| command. In particular, if a node has already been declared outside of
+the current |graph| command, a new node of the same name gets created.
+
+This is not always the desired behaviour. Often, you may wish to make nodes
+part of a graph than have already been defined prior to the use of the |graph|
+command. For this, simply surround a node name by parentheses. This will cause
+a reference to be created to an already existing node:
+%
+\begin{codeexample}[]
+\tikz {
+ \node (a) at (0,0) {A};
+ \node (b) at (1,0) {B};
+ \node (c) at (2,0) {C};
+
+ \graph { (a) -> (b) -> (c) };
+}
+\end{codeexample}
+
+You can even go a step further: A whole collection of nodes can all be flagged
+to belong to a \emph{node set} by adding the option |set=|\meta{node set name}.
+Then, inside a |graph| command, you can collectively refer to these nodes by
+surrounding the node set name in parentheses:
+%
+\begin{codeexample}[]
+\tikz [new set=my nodes] {
+ \node [set=my nodes, circle, draw] at (1,1) {A};
+ \node [set=my nodes, rectangle, draw] at (1.5,0) {B};
+ \node [set=my nodes, diamond, draw] at (1,-1) {C};
+ \node (d) [star, draw] at (3,0) {D};
+
+ \graph { X -> (my nodes) -> (d) };
+}
+\end{codeexample}
+
+
+\subsubsection{Concept: Graph Macros}
+
+Often, a graph will consist -- at least in parts -- of standard parts. For
+instance, a graph might contain a cycle of certain size or a path or a clique.
+To facilitate specifying such graphs, you can define a \emph{graph macro}. Once
+a graph macro has been defined, you can use the name of the graph to make a
+copy of the graph part of the graph currently being specified:
+%
+\begin{codeexample}[]
+\tikz \graph { subgraph K_n [n=6, clockwise] };
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \graph { subgraph C_n [n=5, clockwise] -> mid };
+\end{codeexample}
+
+The library |graphs.standard| defines a number of such graphs, including the
+complete clique $K_n$ on $n$ nodes, the complete bipartite graph $K_{n,m}$ with
+shores sized $n$ and $m$, the cycle $C_n$ on $n$ nodes, the path $P_n$ on $n$
+nodes, and the independent set $I_n$ on $n$ nodes.
+
+
+\subsubsection{Concept: Graph Expressions and Color Classes}
+
+When a graph is being constructed using the |graph| command, it is constructed
+recursively by uniting smaller graphs to larger graphs. During this recursive
+union process the nodes of the graph get implicitly \emph{colored}
+(conceptually) and you can also explicitly assign colors to individual nodes
+and even change the colors as the graph is being specified. All nodes having
+the same color form what is called a \emph{color class}.
+
+The power of color class is that special \emph{connector operators} allow you
+to add edges between nodes having certain colors. For instance, saying
+|clique=red| at the beginning of a group will cause all nodes that have been
+flagged as being (conceptually) ``red'' to be connected as a clique. Similarly,
+saying |complete bipartite={red}{green}| will cause edges to be added between
+all red and all green nodes. More advanced connectors, like the |butterfly|
+connector, allow you to add edges between color classes in a fancy manner.
+%
+\begin{codeexample}[]
+\tikz [x=8mm, y=6mm, circle]
+ \graph [nodes={fill=blue!70}, empty nodes, n=8] {
+ subgraph I_n [name=A] --[butterfly={level=4}]
+ subgraph I_n [name=B] --[butterfly={level=2}]
+ subgraph I_n [name=C] --[butterfly]
+ subgraph I_n [name=D] --
+ subgraph I_n [name=E]
+ };
+\end{codeexample}
+
+
+\subsection{Syntax of the Graph Path Command}
+
+\subsubsection{The Graph Command}
+
+In order to construct a graph, you should use the |graph| path command, which
+can be used anywhere on a path at any place where you could also use a command
+like, say, |plot| or |--|.
+
+\begin{command}{\graph}
+ Inside a |{tikzpicture}| this is an abbreviation for |\path graph|.
+\end{command}
+
+\begin{pathoperation}{graph}{\opt{\oarg{options}}\meta{group specification}}
+ When this command is encountered on a path, the construction of the current
+ path is suspended (similarly to an |edge| command or a |node| command). In
+ a local scope, the \meta{options} are first executed with the key path
+ |/tikz/graphs| using the following command:
+ %
+ \begin{command}{\tikzgraphsset\marg{options}}
+ Executes the \meta{options} with the path prefix |/tikz/graphs|.
+ \end{command}
+ %
+ Apart from the keys explained in the following, further permissible keys
+ will be listed during the course of the rest of this section.
+
+ \begin{stylekey}{/tikz/graphs/every graph}
+ This style is executed at the beginning of every |graph| path command
+ prior to the \meta{options}.
+ \end{stylekey}
+
+ Once the scope has been set up and once the \meta{options} have been
+ executed, a parser starts to parse the \meta{group specification}. The
+ exact syntax of such a group specification in explained in detail in
+ Section~\ref{section-library-graphs-group-spec}. Basically, a group
+ specification is a list of chain specifications, separated by commas or
+ semicolons.
+
+ Depending on the content of the \meta{group specification}, two things will
+ happen:
+ %
+ \begin{enumerate}
+ \item A number of new nodes may be created. These will be inserted into
+ the picture in the same order as if they had been created using
+ multiple |node| path commands at the place where the |graph| path
+ command was used. In other words, all nodes created in a |graph|
+ path command will be painted on top of any nodes created earlier in
+ the path and behind any nodes created later in the path. Like
+ normal nodes, the newly created nodes always lie on top of the path
+ that is currently being created (which is often empty, for instance
+ when the |\graph| command is used).
+ \item Edges between the nodes may be added. They are added in the same
+ order as if the |edge| command had been used at the position where
+ the |graph| command is being used.
+ \end{enumerate}
+
+ Let us now have a look at some common keys that may be used inside the
+ \meta{options}:
+ %
+ \begin{key}{/tikz/graphs/nodes=\meta{options}}
+ This option causes the \meta{options} to be applied to each newly
+ created node inside the \meta{group specification}.
+ %
+\begin{codeexample}[]
+\tikz \graph [nodes=red] { a -> b -> c };
+\end{codeexample}
+ %
+ Multiple uses of this key accumulate.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/edges=\meta{options}}
+ This option causes the \meta{options} to be applied to each newly
+ created edge inside the \meta{group specification}.
+ %
+\begin{codeexample}[]
+\tikz \graph [edges={red,thick}] { a -> b -> c };
+\end{codeexample}
+ %
+ Again, multiple uses of this key accumulate.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/edge=\meta{options}}
+ This is an alias for |edges|.
+ \end{key}
+
+ \begin{key}{/tikz/graphs/edge node=\meta{node specification}}
+ This key specifies that the \meta{node specification} should be added
+ to each newly created edge as an implicitly placed node.
+ %
+\begin{codeexample}[]
+\tikz \graph [edge node={node [red, near end] {X}}] { a -> b -> c };
+\end{codeexample}
+ %
+ Again, multiple uses of this key accumulate.
+ %
+\begin{codeexample}[]
+\tikz \graph [edge node={node [near end] {X}},
+ edge node={node [near start] {Y}}] { a -> b -> c };
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/graphs/edge label=\meta{text}}
+ This key is an abbreviation for |edge node=node[auto]{|\meta{text}|}|.
+ The net effect is that the |text| is placed next to the newly created
+ edges.
+ %
+\begin{codeexample}[]
+\tikz \graph [edge label=x] { a -> b -> {c,d} };
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/graphs/edge label'=\meta{text}}
+ This key is an abbreviation for |edge node=node[auto,swap]{|\meta{text}|}|.
+ %
+\begin{codeexample}[]
+\tikz \graph [edge label=out, edge label'=in]
+ { subgraph C_n [clockwise, n=5] };
+\end{codeexample}
+ \end{key}
+\end{pathoperation}
+
+
+\subsubsection{Syntax of Group Specifications}
+\label{section-library-graphs-group-spec}
+
+A \meta{group specification} inside a |graph| path command has the following
+syntax:
+%
+\begin{quote}
+ |{|\opt{\oarg{options}}\meta{list of chain specifications}|}|
+\end{quote}
+%
+The \meta{chain specifications} must contain chain specifications, whose syntax
+is detailed in the next section, separated by either commas or semicolons; you
+can freely mix them. It is permissible to use empty lines (which are mapped to
+|\par| commands internally) to structure the chains visually, they are simply
+ignored by the parser.
+
+In the following example, the group specification consists of three chain
+specifications, namely of |a -> b|, then |c| alone, and finally |d -> e -> f|:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> b,
+ c;
+
+ d -> e -> f
+};
+\end{codeexample}
+%
+The above has the same effect as the more compact group specification
+|{a->b,c,d->e->f}|.
+
+Commas are used to detect where chain specifications end. However, you will
+often wish to use a comma also inside the options of a single node like in the
+following example:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a [red, draw] -> b [blue, draw],
+ c [brown, draw, circle]
+};
+\end{codeexample}
+
+Note that the above example works as expected: The first comma inside the
+option list of |a| is \emph{not} interpreted as the end of the chain
+specification ``|a [red|''. Rather, commas inside square brackets are
+``protected'' against being interpreted as separators of group specifications.
+
+The \meta{options} that can be given at the beginning of a group specification
+are local to the group. They are executed with the path prefix |/tikz/graphs|.
+Note that for the outermost group specification of a graph it makes no
+difference whether the options are passed to the |graph| command or whether
+they are given at the beginning of this group. However, for groups nested
+inside other groups, it does make a difference:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> { [nodes=red] % the option is local to these nodes:
+ b, c
+ } ->
+ d
+};
+\end{codeexample}
+
+\medskip
+\textbf{Using foreach.}
+There is special support for the |\foreach| statement inside groups: You may
+use the statement inside a group specification at any place where a \meta{chain
+specification} would normally go. In this case, the |\foreach| statement is
+executed and for each iteration the content of the statement's body is treated
+and parsed as a new chain specification.
+%
+\begin{codeexample}[]
+\tikz \graph [math nodes, branch down=5mm] {
+ a -> {
+ \foreach \i in {1,2,3} {
+ a_\i -> { x_\i, y_\i }
+ },
+ b
+ }
+};
+\end{codeexample}
+
+\medskip
+\textbf{Using macros.}
+In some cases you may wish to use macros and \TeX\ code to compute which nodes
+and edges are present in a group. You cannot use macros in the normal way
+inside a graph specification since the parser does not expand macros as it
+scans for the start and end of groups and node names. Rather, only after
+commas, semicolons, and hyphens have already been detected and only after all
+other parsing decisions have been made will macros be expanded. At this point,
+when a macro expands to, say |a,b|, this will not result in two nodes to be
+created since the parsing is already done. For these reasons, a special key is
+needed to make it possible to ``compute'' which nodes should be present in a
+group.
+
+\begin{key}{/tikz/graph/parse=\meta{text}}
+ This key can only be used inside the \meta{options} of a \meta{group
+ specification}. Its effect is that the \meta{text} is inserted at the
+ beginning of the current group as if you had entered it there. Naturally,
+ it makes little sense to just write down some static \meta{text} since you
+ could just as well directly place it at the beginning of the group. The
+ real power of this command stems from the fact that the keys mechanism
+ allows you to say, for instance, |parse/.expand once| to insert the text
+ stored in some macro into the group.
+ %
+\begin{codeexample}[]
+\def\mychain{ a -> b -> c; }
+\tikz \graph { [parse/.expand once=\mychain] d -> e };
+\end{codeexample}
+ %
+ In the following, more fancy example we use a loop to create a chain of
+ dynamic length.
+ %
+\begin{codeexample}[]
+\def\mychain#1{
+ \def\mytext{1}
+ \foreach \i in {2,...,#1} {
+ \xdef\mytext{\mytext -> \i}
+ }
+}
+\tikzgraphsset{my chain/.style={
+ /utils/exec=\mychain{#1},
+ parse/.expand once=\mytext}
+}
+\tikz \graph { [my chain=4] };
+\end{codeexample}
+ %
+ Multiple uses of this key accumulate, that is, all the \text{text}s given
+ in the different uses is inserted in the order it is given.
+\end{key}
+
+
+\subsubsection{Syntax of Chain Specifications}
+
+A \meta{chain specification} has the following syntax: It consists of a
+sequence of \meta{node specifications}, where subsequent node specifications
+are separated by \meta{edge specifications}. Node specifications, which
+typically consist of some text, are discussed in the next section in more
+detail. They normally represent a single node that is either newly created or
+exists already, but they may also specify a whole set of nodes.
+
+An \meta{edge specification} specifies \emph{which} of the node(s) to the left
+of the edge specification should be connected to which node(s) to the right of
+it and it also specifies in which direction the connections go. In the
+following, we only discuss how the direction is chosen, the powerful mechanism
+behind choosing which nodes should be connect is detailed in
+Section~\ref{section-library-graphs-color-classes}.
+
+The syntax of an edge specification is always one of the following five
+possibilities:
+%
+\begin{quote}
+ |->| \opt{\oarg{options}}\\
+ |--| \opt{\oarg{options}}\\
+ |<-| \opt{\oarg{options}}\\
+ |<->| \opt{\oarg{options}}\\
+ |-!-| \opt{\oarg{options}}
+\end{quote}
+
+The first four correspond to a directed edge, an undirected edge, a
+``backward'' directed edge, and a bidirected edge, respectively. The fifth edge
+specification means that there should be no edge (this specification can be
+used together with the |simple| option to remove edges that have previously
+been added, see Section~\ref{section-library-graphs-simple}).
+
+Suppose the nodes \meta{left nodes} are to the left of the \meta{edge
+specification} and \meta{right nodes} are to the right and suppose we have
+written |->| between them. Then the following happens:
+%
+\begin{enumerate}
+ \item The \meta{options} are executed (inside a local scope) with the path
+ |/tikz/graphs|. These options may setup the connector algorithm (see
+ below) and may also use keys like |edge| or |edge label| to specify how
+ the edge should look like. As a convenience, whenever an unknown key is
+ encountered for the path |/tikz/graphs|, the key is passed to the
+ |edge| key. This means that you can directly use options like |thick|
+ or |red| inside the \meta{options} and they will apply to the edge as
+ expected.
+ \item The chosen connector algorithm, see
+ Section~\ref{section-library-graphs-color-classes}, is used to compute
+ from which of the \meta{left nodes} an edge should lead to which of the
+ \meta{right nodes}. Suppose that $(l_1,r_1)$, \dots, $(l_n,r_n)$ is the
+ list of node pairs that result (so there should be an edge between
+ $l_1$ and $r_1$ and another edge between $l_2$ and $r_2$ and so on).
+ \item For each pair $(l_i,r_i)$ an edge is created. This is done by calling
+ the following key (for the edge specification |->|, other keys are
+ executed for the other kinds of specifications):
+ %
+ \begin{key}{/tikz/graphs/new ->=\marg{left node}\marg{right node}\marg{edge options}\marg{edge nodes}}
+ This key will be called for a |->| edge specification with the
+ following four parameters:
+ %
+ \begin{enumerate}
+ \item \meta{left node} is the name of the ``left'' node, that
+ is, the name of $l_i$.
+ \item \meta{right node} is the name of the right node.
+ \item \meta{edge options} are the accumulated options from all
+ calls of |/tikz/graph/edges| in groups that surround the
+ edge specification.
+ \item \meta{edge nodes} is text like |node {A} node {B}| that
+ specifies some nodes that should be put as labels on the
+ edge using \tikzname's implicit positioning mechanism.
+ \end{enumerate}
+ %
+ By default, the key executes the following code:
+ %
+ \begin{quote}
+ |\path [->,every new ->]|\\
+ \hbox{}\quad|(|\meta{left node}|\tikzgraphleftanchor) edge [|%
+ \meta{edge options}|]| \meta{edge nodes}||\\
+ \hbox{}\quad|(|\meta{right node}|\tikzgraphrightanchor);|
+ \end{quote}
+ %
+ You are welcome to change the code underlying the key.
+ %
+ \begin{stylekey}{/tikz/every new ->}
+ This key gets executed by default for a |new ->|.
+ \end{stylekey}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/left anchor=\meta{anchor}}
+ This anchor is used for the node that is to the left of an edge
+ specification. Setting this anchor to the empty string means that
+ no special anchor is used (which is the default). The \meta{anchor}
+ is stored in the macro |\tikzgraphleftanchor| with a leading dot.
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ {a,b,c} -> [complete bipartite] {e,f,g}
+};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [left anchor=east, right anchor=west] {
+ {a,b,c} -- [complete bipartite] {e,f,g}
+};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/right anchor=\meta{anchor}}
+ Works like |left anchor|, only for |\tikzgraphrightanchor|.
+ \end{key}
+ %
+ For the other three kinds of edge specifications, the following keys
+ will be called:
+ %
+ \begin{key}{/tikz/graphs/new --=\marg{left node}\marg{right node}\marg{edge options}\marg{edge nodes}}
+ This key is called for |--| with the same parameters as above. The
+ only difference in the definition is that in the |\path| command
+ the |->| gets replaced by |-|.
+ %
+ \begin{stylekey}{/tikz/every new --}
+ \end{stylekey}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/new <->=\marg{left node}\marg{right node}\marg{edge options}\marg{edge nodes}}
+ Called for |<->| with the same parameters as above. The |->| is
+ replaced by |<-|
+ %
+ \begin{stylekey}{/tikz/every new <->}
+ \end{stylekey}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/new <-=\marg{left node}\marg{right node}\marg{edge options}\marg{edge nodes}}
+ Called for |<-| with the same parameters as above.%
+ \footnote{%
+ You might wonder why this key is needed: It seems more logical
+ at first sight to just call |new edge directed| with swapped
+ first parameters. However, a positioning algorithm might wish
+ to take the fact into account that an edge is ``backward''
+ rather than ``forward'' in order to improve the layout. Also,
+ different arrow heads might be used.
+ }
+ %
+ \begin{stylekey}{/tikz/every new <-}
+ \end{stylekey}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/new -\protect\exclamationmarktext-=\marg{left node}\marg{right node}\marg{edge options}\marg{edge nodes}}
+ Called for |-!-| with the same parameters as above. Does nothing by
+ default.
+ \end{key}
+\end{enumerate}
+
+Here is an example that shows the default rendering of the different edge
+specifications:
+%
+\begin{codeexample}[]
+\tikz \graph [branch down=5mm] {
+ a -> b;
+ c -- d;
+ e <- f;
+ g <-> h;
+ i -!- j;
+};
+\end{codeexample}
+
+
+\subsubsection{Syntax of Node Specifications}
+\label{section-library-graphs-node-spec}
+
+Node specifications are the basic building blocks of a graph specification.
+There are three different possible kinds of node specifications, each of which
+has a different syntax:
+%
+\begin{description}
+ \item[Direct Node Specification]
+ \ \\
+ \opt{|"|}\meta{node name}\opt{|"|}\opt{|/|\opt{|"|}\meta{text}\opt{|"|}} \opt{\oarg{options}}\\
+ (note that the quotation marks are optional and only needed when the
+ \meta{node name} contains special symbols)
+ \item[Reference Node Specification]
+ \ \\
+ |(|\meta{node name or node set name}|)|
+ \item[Group Node Specification]
+ \ \\
+ \meta{group specification}
+\end{description}
+
+The rule for determining which of the possible kinds is meant is as follows: If
+the node specification starts with an opening parenthesis, a reference node
+specification is meant; if it starts with an opening curly brace, a group
+specification is meant; and in all other cases a direct node specification is
+meant.
+
+\medskip
+\textbf{Direct Node Specifications.} If after reading the first symbol of a
+node specification is has been detected to be \emph{direct}, \tikzname\ will
+collect all text up to the next edge specification and store it as the
+\meta{node name}; however, square brackets are used to indicate options and a
+slash ends the \meta{node name} and start a special \meta{text} that is used as
+a rendering text instead of the original \meta{node name}.
+
+Due to the way the parsing works and due to the restrictions on node names,
+most special characters are forbidding inside the \meta{node name}, including
+commas, semicolons, hyphens, braces, dots, parentheses, slashes, dashes, and
+more (but spaces, single underscores, and the hat character \emph{are}
+allowed). To use special characters in the name of a node, you can optionally
+surround the \meta{node name} and/or the \meta{text} by quotation marks. In
+this case, you can use all of the special symbols once more. The details of
+what happens, exactly, when the \meta{node name} is surrounded by quotation
+marks is explained later; surrounding the \meta{text} by quotation marks has
+essentially the same effect as surrounding it by curly braces.
+
+Once the node name has been determined, it is checked whether the same node
+name was already used inside the current graph. If this is the case, then we
+say that the already existing node is \emph{referenced}; otherwise we say that
+the node is \emph{fresh}.
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> b; % both are fresh
+ c -> a; % only c is fresh, a is referenced
+};
+\end{codeexample}
+
+This behaviour of deciding whether a node is fresh or referenced can, however,
+be modified by using the following keys:
+%
+\begin{key}{/tikz/graphs/use existing nodes=\opt{\meta{true or false}} (default true)}
+ When this key is set to |true|, all nodes will be considered to the
+ referenced, no node will be fresh. This option is useful if you have
+ already created all the nodes of a graph prior to using the |graph| command
+ and you now only wish to connect the nodes. It also implies that an error
+ is raised if you reference a node which has not been defined previously.
+\end{key}
+
+\begin{key}{/tikz/graphs/fresh nodes=\opt{\meta{true or false}} (default true)}
+ When this key is set to |true|, all nodes will be considered to be fresh.
+ This option is useful when you create for instance a tree with many
+ identical nodes.
+
+ When a node name is encountered that was already used previously, a new
+ name is chosen is follows: An apostrophe (|'|) is appended repeatedly until
+ a node name is found that has not yet been used:
+ %
+\begin{codeexample}[]
+\tikz \graph [branch down=5mm] {
+ { [fresh nodes]
+ a -> {
+ b -> {c, c},
+ b -> {c, c},
+ b -> {c, c},
+ }
+ },
+ b' -- b''
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/number nodes=\opt{\meta{start number}} (default 1)}
+ When this key is used in a scope, each encountered node name will get
+ appended a new number, starting with \meta{start}. Typically, this ensures
+ that all node names are different. Between the original node name and the
+ appended number, the setting of the following will be inserted:
+ %
+ \begin{key}{/tikz/graphs/number nodes sep=\meta{text} (initially \normalfont space)}
+ \end{key}
+ %
+\begin{codeexample}[]
+\tikz \graph [branch down=5mm] {
+ { [number nodes]
+ a -> {
+ b -> {c, c},
+ b -> {c, c},
+ b -> {c, c},
+ }
+ },
+ b 2 -- b 5
+};
+\end{codeexample}
+ %
+\end{key}
+
+When a fresh node has been detected, a new node is created in the inside a
+protecting scope. For this, the current placement strategy is asked to compute
+a default position for the node, see
+Section~\ref{section-library-graphs-placement} for details. Then, the command
+%
+\begin{quote}
+ |\node (|\meta{full node name}|) [|\meta{node options}|] {|\meta{text}|};|
+\end{quote}
+%
+is called. The different parameters are as follows:
+%
+\begin{itemize}
+ \item The \meta{full node name} is normally the \meta{node name} that has
+ been determined as described before. However, there are two exceptions:
+
+ First, if the \meta{node name} is empty (which happens when there is no
+ \meta{node name} before the slash), then a fresh internal node name is
+ created and used as \meta{full node name}. This name is guaranteed to
+ be different from all node names used in this or any other graph. Thus,
+ a direct node starting with a slash represents an anonymous fresh node.
+
+ Second, you can use the following key to prefix the \meta{node name}
+ inside the \meta{full node name}:
+
+ \begin{key}{/tikz/graphs/name=\meta{text}}
+ This key prepends the \meta{text}, followed by a separating symbol
+ (a space by default), to all \meta{node name}s inside a \meta{full
+ node name}. Repeated calls of this key accumulate, leading to
+ ever-longer ``name paths'':
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \graph {
+ { [name=first] 1, 2, 3} --
+ { [name=second] 1, 2, 3}
+ };
+ \draw [red] (second 1) circle [radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Note that, indeed, in the above example six nodes are created even
+ though the first and second set of nodes have the same \meta{node
+ name}. The reason is that the full names of the six nodes are all
+ different. Also note that only the \meta{node name} is used as the
+ node text, not the full name. This can be changed as described
+ later on.
+
+ This key can be used repeatedly, leading to ever longer node names.
+ \end{key}
+
+ \begin{key}{/tikz/graphs/name separator=\meta{symbols} (initially \string\space)}
+ Changes the symbol that is used to separate the \meta{text} from
+ the \meta{node name}. The default is |\space|, resulting in a
+ space.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \graph [name separator=] { % no separator
+ { [name=first] 1, 2, 3} --
+ { [name=second] 1, 2, 3}
+ };
+ \draw [red] (second1) circle [radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \graph [name separator=-] {
+ { [name=first] 1, 2, 3} --
+ { [name=second] 1, 2, 3}
+ };
+ \draw [red] (second-1) circle [radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ \item The \meta{node options} are
+ %
+ \begin{enumerate}
+ \item The options that have accumulated in calls to |nodes| from
+ the surrounding scopes.
+ \item The local \meta{options}.
+ \end{enumerate}
+ %
+ The options are executed with the path prefix |/tikz/graphs|, but any
+ unknown key is executed with the prefix |/tikz|. This means, in
+ essence, that some esoteric keys are more difficult to use inside the
+ options and that any key with the prefix |/tikz/graphs| will take
+ precedence over a key with the prefix |/tikz|.
+ \item The \meta{text} that is passed to the |\node| command is computed as
+ follows: First, you can use the following key to directly set the
+ \meta{text}:
+ %
+ \begin{key}{/tikz/graphs/as=\meta{text}}
+ The \meta{text} is used as the text of the node. This allows you to
+ provide a text for the node that differs arbitrarily from the name
+ of the node.
+ %
+\begin{codeexample}[]
+\tikz \graph { a [as=$x$] -- b [as=$y_5$] -> c [red, as={a--b}] };
+\end{codeexample}
+ %
+ This key always takes precedence over all of the mechanisms
+ described below.
+ \end{key}
+ %
+ In case the |as| key is not used, a default text is chosen as follows:
+ First, when a direct node specification contains a slash (or, for
+ historical reasons, a double underscore), the text to the right of the
+ slash (or double underscore) is stored in the macro
+ |\tikzgraphnodetext|; if there is no slash, the \meta{node name} is
+ stored in |\tikzgraphnodetext|, instead. Then, the current value of the
+ following key is used as \meta{text}:
+ %
+ \begin{key}{/tikz/graphs/typeset=\meta{code}}
+ The macro or code stored in this key is used as the \meta{text} if
+ the node. Inside the \meta{code}, the following macros are
+ available:
+ %
+ \begin{command}{\tikzgraphnodetext}
+ This macro expands to the \meta{text} to the right of the
+ double underscore or slash in a direct node specification or,
+ if there is no slash, to the \meta{node name}.
+ \end{command}
+ %
+ \begin{command}{\tikzgraphnodename}
+ This macro expands to the name of the current node without the
+ path.
+ \end{command}
+ %
+ \begin{command}{\tikzgraphnodepath}
+ This macro expands to the current path of the node. These paths
+ result from the use of the |name| key as described above.
+ \end{command}
+ %
+ \begin{command}{\tikzgraphnodefullname}
+ This macro contains the concatenation of the above two.
+ \end{command}
+ \end{key}
+ %
+ By default, the typesetter is just set to |\tikzgraphnodetext|, which
+ means that the default text of a node is its name. However, it may be
+ useful to change this: For instance, you might wish that the text of
+ all graph nodes is, say, surrounded by parentheses:
+ %
+\begin{codeexample}[]
+\tikz \graph [typeset=(\tikzgraphnodetext)]
+ { a -> b -> c };
+\end{codeexample}
+ %
+ A more advanced macro might take apart the node text and render it
+ differently:
+ %
+\begin{codeexample}[]
+\def\mytypesetter{\expandafter\myparser\tikzgraphnodetext\relax}
+\def\myparser#1 #2 #3\relax{%
+ $#1_{#2,\dots,#3}$
+}
+\tikz \graph [typeset=\mytypesetter, grow down]
+ { a 1 n -> b 2 m -> c 4 nm };
+\end{codeexample}
+ %
+ The following styles install useful predefined typesetting macros:
+ %
+ \begin{key}{/tikz/graphs/empty nodes}
+ Just sets |typeset| to nothing, which causes all nodes to have an
+ empty text (unless, of course, the |as| option is used):
+ %
+\begin{codeexample}[]
+\tikz \graph [empty nodes, nodes={circle, draw}] { a -> {b, c} };
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/math nodes}
+ Sets |typeset| to |$\tikzgraphnodetext$|, which causes all nodes
+ names to be typeset in math mode:
+ %
+\begin{codeexample}[]
+\tikz \graph [math nodes, nodes={circle, draw}] { a_1 -> {b^2, c_3^n} };
+\end{codeexample}
+ \end{key}
+\end{itemize}
+
+If a node is referenced instead of fresh, then this node becomes the node that
+will be connected by the preceding or following edge specification to other
+nodes. The \meta{options} are executed even for a referenced node, but they
+cannot be used to change the appearance of the node (because the node exists
+already). Rather, the \meta{options} can only be used to change the logical
+coloring of the node, see Section~\ref{section-library-graphs-color-classes}
+for details.
+
+\medskip
+\textbf{Quoted Node Names.} When the \meta{node name} and/or the \meta{text} of
+a node is surrounded by quotation marks, you can use all sorts of special
+symbols as part of the text that are normally forbidden:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \graph [grow right=2cm] {
+ "Hi, World!" -> "It's \emph{important}!"[red,rotate=-45];
+ "name"/actual text -> "It's \emph{important}!";
+ };
+ \draw (name) circle [radius=3pt];
+\end{tikzpicture}
+\end{codeexample}
+
+In detail, for the following happens when quotation marks are encountered at
+the beginning of a node name or its text:
+%
+\begin{itemize}
+ \item Everything following the quotation mark up to the next single
+ quotation mark is collected into a macro \meta{collected}. All sorts of
+ special characters, including commas, square brackets, dashes, and even
+ backslashes are allowed here. Basically, the only restriction is that
+ braces must be balanced.
+ \item A double quotation mark (|""|) does not count as the ``next single
+ quotation mark''. Rather, it is replaced by a single quotation mark.
+ For instance, |"He said, ""Hello world."""| would be stored inside
+ \meta{collected} as |He said, "Hello world."| However, this rule
+ applies only on the outer-most level of braces. Thus, in
+ %
+\begin{codeexample}[code only]
+"He {said, ""Hello world.""}"
+\end{codeexample}
+ %
+ we would get |He {said, ""Hello world.""}| as \meta{collected}.
+ \item ``The next single quotation mark'' refers to the next quotation mark
+ on the current level of braces, so in |"hello {"} world"|, the next
+ quotation mark would be the one following |world|.
+\end{itemize}
+
+Now, once the \meta{collected} text has been gather, it is used as follows:
+When used as \meta{text} (what is actually displayed), it is just used ``as
+is''. When it is used as \meta{node name}, however, the following happens:
+Every ``special character'' in \meta{collected} is replaced by its Unicode
+name, surrounded by |@|-signs. For instance, if \meta{collected} is
+|Hello, world!|, the \meta{node name} is the somewhat longer text
+|Hello@COMMA@ world@EXCLAMATION MARK@|. Admittedly, referencing such a node
+from outside the graph is cumbersome, but when you use exactly the same
+\meta{collected} text once more, the same \meta{node name} will result. The
+following characters are considered ``special'':
+%
+\begin{quote}
+ \texttt{\char`\|}|$&^~_[](){}/.-,+*'`!":;<=>?@#%\{}|%$
+\end{quote}
+%
+These are exactly the Unicode character with a decimal code number between 33
+and 126 that are neither digits nor letters.
+
+\medskip
+\textbf{Reference Node Specifications.} A reference node specification is a
+node specification that starts with an opening parenthesis. In this case,
+parentheses must surround a \meta{name} as in |(foo)|, where |foo| is the
+\meta{name}. The following will now happen:
+%
+\begin{enumerate}
+ \item It is tested whether \meta{name} is the name of a currently active
+ \emph{node set}. This case will be discussed in a moment.
+ \item Otherwise, the \meta{name} is interpreted and treated as a referenced
+ node, but independently of whether the node has already been fresh in
+ the current graph or not. In other words, the node must have been
+ defined either already inside the graph (in which case the parenthesis
+ are more or less superfluous) or it must have been defined outside the
+ current picture.
+
+ The way the referenced node is handled is the same way as for a direct
+ node that is a referenced node.
+
+ If the node does not already exist, an error message is printed.
+\end{enumerate}
+
+Let us now have a look at node sets. Inside a |{tikzpicture}| you can locally
+define a \emph{node set} by using the following key:
+%
+\begin{key}{/tikz/new set=\meta{set name}}
+ This will setup a node set named \meta{set name} within the current scope.
+ Inside the scope, you can add nodes to the node set using the |set| key. If
+ a node set of the same name already exists in the current scope, it will be
+ reset and made empty for the current scope.
+
+ Note that this command has the path |/tikz| and is normally used
+ \emph{outside} the |graph| command.
+\end{key}
+%
+\begin{key}{/tikz/set=\meta{set name}}
+ This key can be used as an option with a |node| command. The \meta{set
+ name} must be the name of a node set that has previously been created
+ inside some enclosing scope via the |new set| key. The effect is that the
+ current node is added to the node set.
+\end{key}
+
+When you use a |graph| command inside a scope where some node set called
+\meta{set name} is defined, then inside this |graph| command you use
+|(|\meta{set name}|)| to reference \emph{all} of the nodes in the node set. The
+effect is the same as if instead of the reference to the set name you had
+created a group specification containing a list of references to all the nodes
+that are part of the node set.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[new set=red, new set=green, shorten >=2pt]
+ \foreach \i in {1,2,3} {
+ \node [draw, red!80, set=red] (r\i) at (\i,1) {$r_\i$};
+ \node [draw, green!50!black, set=green] (g\i) at (\i,2) {$g_\i$};
+ }
+ \graph {
+ root [xshift=2cm] ->
+ (red) -> [complete bipartite, right anchor=south]
+ (green)
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+There is an interesting caveat with referencing node sets: Suppose that at the
+beginning of a graph you just say |(foo);| where |foo| is a set name. Unless
+you have specified special options, this will cause the following to happen: A
+group is created whose members are all the nodes of the node set |foo|. These
+nodes become referenced nodes, but otherwise nothing happens since, by default,
+the nodes of a group are not connected automatically. However, the referenced
+nodes have now been referenced inside the graph, you can thus subsequently
+access them as if they had been defined inside the graph. Here is an example
+showing how you can create nodes outside a |graph| command and then connect
+them inside as if they had been declared inside:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[new set=import nodes]
+ \begin{scope}[nodes={set=import nodes}] % make all nodes part of this set
+ \node [red] (a) at (0,1) {$a$};
+ \node [red] (b) at (1,1) {$b$};
+ \node [red] (d) at (2,1) {$d$};
+ \end{scope}
+
+ \graph {
+ (import nodes); % "import" the nodes
+
+ a -> b -> c -> d -> e; % only c and e are new
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\medskip
+\textbf{Group Node Specifications.} At a place where a node specification
+should go, you can also instead provide a group specification. Since nodes
+specifications are part of chain specifications, which in turn are part of
+group specifications, this is a recursive definition.
+%
+\begin{codeexample}[]
+\tikz \graph { a -> {b,c,d} -> {e -> {f,g}, h} };
+\end{codeexample}
+
+As can be seen in the above example, when two groups of nodes are connected via
+an edge specification, it is not immediately obvious which connecting edges are
+added. This is detailed in Section~\ref{section-library-graphs-color-classes}.
+
+
+\subsubsection{Specifying Tries}
+
+In computer science, a \emph{trie} is a special kind of tree, where for each
+node and each symbol of an alphabet, there is at most one child of the node
+labeled with this symbol.
+
+The |trie| key is useful for drawing tries, but it can also be used in other
+situations. What it does, essentially, is to prepend the node names of all
+nodes \emph{before} the current node of the current chain to the node's name.
+This will often make it easier or more natural to specify graphs in which
+several nodes have the same label.
+
+\begin{key}{/tikz/graphs/trie=\opt{\meta{true or false}} (default true, initially false)}
+ If this key is set to |true|, after a node has been created on a chain, the
+ |name| key is executed with the node's \meta{node name}. Thus, all nodes
+ later on this chain have the ``path'' of nodes leading to this node as
+ their name. This means, in particular, that
+ %
+ \begin{enumerate}
+ \item two nodes of the same name but in different parts of a chain will
+ be different,
+ \item while if another chain starts with the same nodes, no new nodes
+ get created.
+ \end{enumerate}
+ %
+ In total, this is exactly the behaviour you would expect of a trie:
+ %
+\begin{codeexample}[]
+\tikz \graph [trie] {
+ a -> {
+ a,
+ c -> {a, b},
+ b
+ }
+};
+\end{codeexample}
+ %
+ You can even ``reiterate'' over a path in conjunction with the |simple|
+ option. However, in this case, the default placement strategies will not
+ work and you will need options like |layered layout| from the graph drawing
+ libraries, which need Lua\TeX.
+ %
+\ifluatex
+\begin{codeexample}[]
+\tikz \graph [trie, simple, layered layout] {
+ a -> b -> a,
+ a -> b -> c,
+ a -> {d,a}
+};
+\end{codeexample}
+ %
+ In the following example, we setup the |typeset| key so that it shows the
+ complete names of the nodes:
+ %
+\begin{codeexample}[]
+\tikz \graph [trie, simple, layered layout,
+ typeset=\tikzgraphnodefullname] {
+ a -> b -> a,
+ a -> b -> c,
+ a -> {d,a}
+};
+\end{codeexample}
+\fi
+ %
+ You can also use the |trie| key locally and later reference nodes using
+ their full name:
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { [trie, simple]
+ a -> {
+ b,
+ c -> a
+ }
+ },
+ a b ->[red] a c a
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Quick Graphs}
+\label{section-library-graphs-quick}
+
+The graph syntax is powerful, but this power comes at a price: parsing the
+graph syntax, which is done by \TeX, can take some time. Normally, the parsing
+is fast enough that you will not notice it, but it can be bothersome when you
+have graphs with hundreds of nodes as happens frequently when nodes are
+generated algorithmically by some other program. Fortunately, when another
+program generated a graph specification, we typically do not need the full
+power of the graph syntax. Rather, a small subset of the graph syntax would
+suffice that allows to specify nodes and edges. For these reasons, the is a
+special ``quick'' version of the graph syntax.
+
+Note, however, that using this syntax will usually at most halve the time
+needed to parse a graph. Thus, it really mostly makes sense in conjunction with
+large, algorithmically generated graphs.
+
+\begin{key}{/tikz/graphs/quick}
+ When you provide this key with a graph, the syntax of graph specifications
+ gets restricted. You are no longer allowed to use certain features of the
+ graph syntax; but all features that are still allowed are also allowed in
+ the same way when you do not provide the |quick| option. Thus, leaving out
+ the |quick| option will never hurt.
+
+ Since the syntax is so severely restricted, it is easier to explain which
+ aspects of the graph syntax \emph{will} still work:
+ %
+ \begin{enumerate}
+ \item A quick graph consists of a sequence of either nodes, edges
+ sequences, or groups. These are separated by commas or semicolons.
+ \item Every node is of the form
+ %
+ \begin{quote}
+ |"|\meta{node name}|"|\opt{|/"|\meta{node text}|"[|\meta{options}|]|}
+ \end{quote}
+
+ The quotation marks are mandatory. The part |/"|\meta{node text}|"|
+ may be missing, in which case the node name is used as the node
+ text. The \meta{options} may also be missing. The \meta{node name}
+ may not contain any ``funny'' characters (unlike in the normal
+ graph command).
+ \item Every chain is of the form
+ %
+ \begin{quote}
+ \meta{node spec} \meta{connector} \meta{node spec}
+ \meta{connector} \dots \meta{connector} \meta{node spec}|;|
+ \end{quote}
+
+ Here, the \meta{node spec} are node specifications as described
+ above, the \meta{connector} is one of the four connectors |->|,
+ |<-|, |--|, and |<->| (the connector |-!-| is not allowed since the
+ |simple| option is also not allowed). Each connector may be
+ followed by options in square brackets. The semicolon may be
+ replaced by a comma.
+ \item Every group is of the form
+ %
+ \begin{quote}
+ |{ [|\meta{options}|]| \meta{chains and groups} |};|
+ \end{quote}
+ %
+ The \meta{options} are compulsory. The semicolon can, again, be
+ replaced by a comma.
+ \item The |number nodes| option will work as expected.
+ \end{enumerate}
+
+ Here is a typical way this syntax might be used:
+ %
+\begin{codeexample}[]
+\tikz \graph [quick] { "a" --["foo"] "b"[x=1] };
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \graph [quick] {
+ "a"/"$a$" -- "b"[x=1] --[red] "c"[x=2];
+ { [nodes=blue] "a" -- "d"[y=1]; };
+};
+\end{codeexample}
+
+ Let us now have a look at the most important things that will \emph{not}
+ work when the |quick| option is used:
+
+ \begin{itemize}
+ \item Connecting a node and a group as in |a->{b,c}|.
+ \item Node names without quotation marks as in |a--b|.
+ \item Everything described in subsequent subsections, which includes
+ subgraphs (graph macros), graph sets, graph color classes,
+ anonymous nodes, the |fresh nodes| option, sublayouts, simple
+ graphs, edge annotations.
+ \item Placement strategies -- you either have to define all node
+ positions explicitly using |at=| or |x=| and |y=| or you must use a
+ graph drawing algorithm like |layered layout|.
+ \end{itemize}
+\end{key}
+
+
+\subsection{Simple Versus Multi-Graphs}
+\label{section-library-graphs-simple}
+
+The |graph| library allows you to construct both simple graphs and
+multi-graphs. In a simple graph there can be at most one edge between any two
+vertices, while in a multi-graph there can be multiple edges (hence the name).
+The two keys |multi| and |simple| allow you to switch (even locally inside on
+of the graph's scopes) between which kind of graph is being constructed. By
+default, the |graph| command produces a multi-graph since these are faster to
+construct.
+
+\begin{key}{/tikz/graphs/multi}
+ When this edge is set for a whole graph (which is the default) or just for
+ a group (which is useful if the whole graph is simple in general, but a
+ part is a multi-graph), then when you specify an edge between two nodes
+ several times, several such edges get created:
+ %
+\begin{codeexample}[]
+\tikz \graph [multi] { % "multi" is not really necessary here
+ a ->[bend left, red] b;
+ a ->[bend right, blue] b;
+};
+\end{codeexample}
+ %
+ In case |multi| is used for a scope inside a larger scope where the
+ |simple| option is specified, then inside the local |multi| scope edges are
+ immediately created and they are completely ignored when it comes to
+ deciding which kind of edges should be present in the surrounding simple
+ graph. From the surrounding scope's point of view it is as if the local
+ |multi| graph contained no edges at all.
+
+ This means, in particular, that you can use the |multi| option with a
+ single edge to ``enforce'' this edge to be present in a simple graph.
+\end{key}
+
+\begin{key}{/tikz/graphs/simple}
+ In contrast a multi-graph, in a simple graph, at most one edge gets created
+ for every pair of vertices:
+ %
+\begin{codeexample}[]
+\tikz \graph [simple]{
+ a ->[bend left, red] b;
+ a ->[bend right, blue] b;
+};
+\end{codeexample}
+ %
+ As can be seen, the second edge ``wins'' over the first edge. The general
+ rule is as follows: In a simple graph, whenever an edge between two
+ vertices is specified multiple times, only the very last specification and
+ its options will actually be executed.
+
+ The real power of the |simple| option lies in the fact that you can first
+ create a complicated graph and then later redirect and otherwise modify
+ edges easily:
+ %
+\begin{codeexample}[]
+\tikz \graph [simple, grow right=2cm] {
+ {a,b,c,d} ->[complete bipartite] {e,f,g,h};
+
+ { [edges={red,thick}] a -> e -> d -> g -> a };
+};
+\end{codeexample}
+
+ One particularly interesting kind of edge specification for a simple graph
+ is |-!-|. Recall that this is used to indicate that ``no edge'' should be
+ added between certain nodes. In a multi-graph, this key usually has no
+ effect (unless the key |new -!-| has been redefined) and is pretty
+ superfluous. In a simple graph, however, it counts as an edge kind and you
+ can thus use it to remove an edge that been added previously:
+ %
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ subgraph K_n [n=8, clockwise];
+ % Get rid of the following edges:
+ 1 -!- 2;
+ 3 -!- 4;
+ 6 -!- 8;
+ % And make one edge red:
+ 1 --[red] 3;
+};
+\end{codeexample}
+
+ Creating a graph such as the above in other fashions is pretty awkward.
+
+ For every unordered pair $\{u,v\}$ of vertices at most one edge will be
+ created in a simple graph. In particular, when you say |a -> b| and later
+ also |a <- b|, then only the edge |a <- b| will be created. Similarly, when
+ you say |a -> b| and later |b -> a|, then only the edge |b -> a| will be
+ created.
+
+ The power of the |simple| command comes at a certain cost: As the graph is
+ being constructed, a (sparse) array is created that keeps track for each
+ edge of the last edge being specified. Then, at the end of the scope
+ containing the |simple| command, for every pair of vertices the edge is
+ created. This is implemented by two nested loops iterating over all
+ possible pairs of vertices -- which may take quite a while in a graph of,
+ say, 1000 vertices. Internally, the |simple| command is implemented as an
+ operator that adds the edges when it is called, but this should be
+ unimportant in normal situations.
+\end{key}
+
+
+\subsection{Graph Edges: Labeling and Styling}
+
+When the |graph| library creates an edge between two nodes in a graph, the
+appearance (called ``styling'' in \tikzname) can be specified in different
+ways. Sometimes you will simply wish to say ``the edges between these two
+groups of node should be red'', but sometimes you may wish to say ``this
+particular edge going into this node should be red''. In the following,
+different ways of specifying such styling requirements are discussed. Note that
+adding labels to edges is, from \tikzname's point of view, almost the same as
+styling edges, since they are also specified using options.
+
+
+\subsubsection{Options For All Edges Between Two Groups}
+
+When you write |... ->[options] ...| somewhere inside your graph specification,
+this typically cause one or more edges to be created between the nodes in the
+chain group before the |->| and the nodes in the chain group following it. The
+|options| are applied to all of them. In particular, if you use the |quotes|
+library and you write some text in quotes inside the |options|, this text will
+be added as a label to each edge:
+%
+\begin{codeexample}[]
+\tikz
+ \graph [edge quotes=near start] {
+ { a, b } -> [red, "x", complete bipartite] { c, d };
+ };
+\end{codeexample}
+
+As documented in the |quotes| library in more detail, you can easily modify the
+appearance of edge labels created using the quotes syntax by adding options
+after the closing quotes:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a ->["x"] b ->["y"'] c ->["z" red] d;
+};
+\end{codeexample}
+
+The following options make it easy to setup the styling of nodes created in
+this way:
+%
+\begin{key}{/tikz/graphs/edge quotes=\opt{\meta{options}}}
+ A shorthand for setting the style |every edge quotes| to \meta{options}.
+\begin{codeexample}[]
+ \tikz \graph [edge quotes={blue,auto}] {
+ a ->["x"] b ->["y"'] c ->["b" red] d;
+};
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/edge quotes center}
+ A shorthand for |edge quotes| to |anchor=center|.
+ %
+\begin{codeexample}[]
+\tikz \graph [edge quotes center] {
+ a ->["x"] b ->["y"] c ->["z" red] d;
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/edge quotes mid}
+ A shorthand for |edge quotes| to |anchor=mid|.
+ %
+\begin{codeexample}[]
+\tikz \graph [edge quotes mid] {
+ a ->["x"] b ->["y"] c ->["z" red] d;
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Changing Options For Certain Edges}
+
+Consider the following tree-like graph:
+%
+\begin{codeexample}[]
+\tikz \graph { a -> {b,c} };
+\end{codeexample}
+
+Suppose we wish to specify that the edge from |a| to |b| should be red, while
+the edge from |a| to |c| should be blue. The difficulty lies in the fact that
+\emph{both} edges are created by the single |->| operator and we can only add
+one of these option |red| or |blue| to the operator.
+
+There are several ways to solve this problem. First, we can simply split up the
+specification and specify the two edges separately:
+%
+\begin{codeexample}[]
+\tikz \graph {
+ a -> [red] b;
+ a -> [blue] c;
+};
+\end{codeexample}
+%
+While this works quite well, we can no longer use the nice chain group syntax
+of the |graphs| library. For the rather simple graph |a->{b,c}| this is not a
+big problem, but if you specify a tree with, say, 30 nodes it is really
+worthwhile being able to specify the tree ``in its natural form in the \TeX\
+code'' rather than having to list all of the edges explicitly. Also, as can be
+seen in the above example, the node placement is changed, which is not always
+desirable.
+
+One can sidestep this problem using the |simple| option: This option allows you
+to first specify a graph and then, later on, replace edges by other edges and,
+thereby, provide new options:
+%
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ a -> {b,c};
+ a -> [red] b;
+ a -> [blue] c;
+};
+\end{codeexample}
+
+The first line is the original specification of the tree, while the following
+two lines replace some edges of the tree (in this case, all of them) by edges
+with special options. While this method is slower and in the above example
+creates even longer code, it is very useful if you wish to, say, highlight a
+path in a larger tree: First specify the tree normally and, then, ``respecify''
+the path or paths with some other edge options in force. In the following
+example, we use this to highlight a whole subtree of a larger tree:
+ %
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ % The larger tree, no special options in force
+ a -> {
+ b -> {c,d},
+ e -> {f,g},
+ h
+ },
+ { [edges=red] % Now highlight a part of the tree
+ a -> e -> {f,g}
+ }
+};
+\end{codeexample}
+
+
+\subsubsection{Options For Incoming and Outgoing Edges}
+
+When you use the syntax |... ->[options] ...| to specify options, you specify
+options for the ``connections between two sets of nodes''. In many cases,
+however, it will be more natural to specify options ``for the edges lead to or
+coming from a certain node'' and you will want to specify these options ``at
+the node''. Returning to the example of the graph |a->{b,c}| where we want a
+red edge between |a| and |b| and a blue edge between |a| and |c|, this could
+also be phrased as follows: ``Make the edge leading to |b| red and make the
+edge leading to |c| blue''.
+
+For this situation, the |graph| library offers a number of special keys, which
+are documented in the following. However, most of the time you will not use
+these keys directly, but, rather, use a special syntax explained in
+Section~\ref{section-syntax-outgoing-incoming}.
+
+\begin{key}{/tikz/graphs/target edge style=\meta{options}}
+ This key can (only) be used with a \emph{node} inside a graph
+ specification. When used, the \meta{options} will be added to every edge
+ that is created by a connector like |->| in which the node is a
+ \emph{target}. Consider the following example:
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { a, b } ->
+ { c [target edge style=red], d } ->
+ { e, f }
+};
+\end{codeexample}
+ %
+ In the example, only when the edge from |a| to |c| is created, |c| is the
+ ``target'' of the edge. Thus, only this edge becomes red.
+
+ When an edge already has options set directly, the \meta{options} are
+ executed after these direct options, thus, they ``overrule'' them:
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { a, b } -> [blue, thick]
+ { c [target edge style=red], d } ->
+ { e, f }
+};
+\end{codeexample}
+
+ The \meta{options} set in this way will stay attached to the node, so also
+ for edges created later on that lead to the node will have these options
+ set:
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { a, b } ->
+ { c [target edge style=red], d } ->
+ { e, f },
+ b -> c
+};
+\end{codeexample}
+
+ Multiple uses of this key accumulate. However, you may sometimes also wish
+ to ``clear'' these options for a key since at some later point you no
+ longer wish the \meta{options} to be added when some further edges are
+ added. This can be achieved using the following key:
+ %
+ \begin{key}{/tikz/graphs/target edge clear}
+ Clears all \meta{options} for edges with the node as a target and
+ also edge labels (see below) for this node.
+ \end{key}
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { a, b } ->
+ { c [target edge style=red], d },
+ b -> c[target edge clear]
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/target edge node=\meta{node specification}}
+ This key works like |target edge style|, only the \meta{node specification}
+ will not be added as options to any newly created edges with the current
+ node as their target, but rather it will be added as a node specification.
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { a, b } ->
+ { c [target edge node=node{X}], d } ->
+ { e, f }
+};
+\end{codeexample}
+ %
+ As for |target edge style| multiple uses of this key accumulate and the key
+ |target edge clear| will (also) clear all target edge nodes that have been
+ set for a node earlier on.
+\end{key}
+
+\begin{key}{/tikz/graphs/source edge style=\meta{options}}
+ Works exactly like |target edge style|, only now the \meta{options} are
+ only added when the node is a source of a newly created edge:
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ { a, b } ->
+ { c [source edge style=red], d } ->
+ { e, f }
+};
+\end{codeexample}
+ %
+ If both for the source and also for the target of an edge \meta{options}
+ have been specified, the options are applied in the following order:
+ %
+ \begin{enumerate}
+ \item First come the options from the edge itself.
+ \item Then come the options contributed by the source node using this
+ key.
+ \item Then come the options contributed by the target node using
+ |target node style|.
+ \end{enumerate}
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ a [source edge style=red] ->[green]
+ b [target edge style=blue] % blue wins
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/source edge node=\meta{node specification}}
+ Works like |source edge style| and |target edge node|.
+\end{key}
+
+\begin{key}{/tikz/graphs/source edge clear=\meta{node specification}}
+ Works like |target edge clear|.
+\end{key}
+
+
+\subsubsection{Special Syntax for Options For Incoming and Outgoing Edges}
+\label{section-syntax-outgoing-incoming}
+
+The keys |target node style| and its friends are powerful, but a bit cumbersome
+to write down. For this reason, the |graphs| library introduces a special
+syntax that is based on what I call the ``first-char syntax'' of keys. Inside
+the options of a node inside a graph, the following special rules apply:
+%
+\begin{enumerate}
+ \item Whenever an option starts with |>|, the rest of the options are
+ passed to |target edge style|. For instance, when you write |a[>red]|,
+ then this has the same effect as if you had written
+ %
+\begin{codeexample}[code only]
+a[target edge style={red}]
+\end{codeexample}
+ %
+ \item Whenever an options starts with |<|, the rest of the options are
+ passed to |source edge style|.
+ \item In both of the above case, in case the options following the |>| or
+ |<| sign start with a quote, the created edge label is passed to
+ |source edge node| or |target edge node|, respectively.
+
+ This is exactly what you want to happen.
+\end{enumerate}
+%
+Additionally, the following styles provide shorthands for ``clearing'' the
+target and source options:
+%
+\begin{key}{/tikz/graphs/clear >}
+ A more easy-to-remember shorthand for |target edge clear|.
+\end{key}
+%
+\begin{key}{/tikz/graphs/clear <}
+ A more easy-to-remember shorthand for |source edge clear|.
+\end{key}
+
+These mechanisms make it especially easy to create trees in which the edges are
+labeled in some special way:
+%
+\begin{codeexample}[]
+\tikz
+ \graph [edge quotes={fill=white,inner sep=1pt},
+ grow down, branch right] {
+ / -> h [>"9"] -> {
+ c [>"4" text=red,] -> {
+ a [>"2", >thick],
+ e [>"0"]
+ },
+ j [>"7"]
+ }
+ };
+\end{codeexample}
+
+
+\subsubsection{Placing Node Texts on Incoming Edges}
+
+Normally, the text of a node is shown (only) inside the node. In some case, for
+instance when drawing certain kind of trees, the nodes themselves should not
+get any text, but rather the edge leading to the node should be labeled as in
+the following example:
+%
+\begin{codeexample}[]
+\tikz \graph [empty nodes]
+{
+ root -> {
+ a [>"a"],
+ b [>"b"] -> {
+ c [>"c"],
+ d [>"d"]
+ }
+ }
+};
+\end{codeexample}
+%
+As the example shows, it is a bit cumbersome that we have to label the nodes
+and then specify the same text once more using the incoming edge syntax.
+
+For these cases, it would be better if the text of the node where not used with
+the node but, rather, be passed directly to the incoming or the outgoing edge.
+The following styles do exactly this:
+
+\begin{key}{/tikz/graphs/put node text on incoming edges=\opt{\meta{options}}}
+ When this key is used with a node or a group, the following happens:
+ %
+ \begin{enumerate}
+ \item The command
+ |target edge node={node[|\meta{options}|]{\tikzgraphnodetext}}| is
+ executed. This means that all incoming edges of the node get a
+ label with the text that would usually be displayed in the node.
+ You can use keys like |math nodes| normally.
+ \item The command |as={}| is executed. This means that the node itself
+ will display nothing.
+ \end{enumerate}
+ %
+ Here is an example that show how this command is used.
+ %
+\begin{codeexample}[]
+\tikz \graph [put node text on incoming edges,
+ math nodes, nodes={circle,draw}]
+ { a -> b -> {c, d} };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/put node text on outgoing edges=\opt{\meta{options}}}
+ Works like the previous key, only with |target| replaced by |source|.
+\end{key}
+
+
+\subsection{Graph Operators, Color Classes, and Graph Expressions}
+\label{section-library-graphs-color-classes}
+
+\tikzname's |graph| command employs a powerful mechanism for adding edges
+between nodes and sets of nodes. To a graph theorist, this mechanism may be
+known as a \emph{graph expression}: A graph is specified by starting with small
+graphs and then applying \emph{operators} to them that form larger graphs and
+that connect and recolor colored subsets of the graph's node in different ways.
+
+
+\subsubsection{Color Classes}
+\label{section-library-graph-coloring}
+
+\tikzname\ keeps track of a \emph{(multi)coloring} of the graph as it is being
+constructed. This does not mean that the actual color of the nodes on the page
+will be different, rather, in the following we refer to ``logical'' colors in
+the way graph theoreticians do. These ``logical'' colors are only important
+while the graph is being constructed and they are ``thrown away'' at the end of
+the construction. The actual (``physical'') colors of the nodes are set
+independently of these logical colors.
+
+As a graph is being constructed, each node can be part of one or more
+overlapping \emph{color classes}. So, unlike what is sometimes called a
+\emph{legal coloring}, the logical colorings that \tikzname\ keeps track of may
+assign multiple colors to the same node and two nodes connected by an edge may
+well have the same color.
+
+Color classes must be declared prior to use. This is done using the following
+key:
+%
+\begin{key}{/tikz/graphs/color class=\meta{color class name}}
+ This sets up a new color class called \meta{color class name}. Nodes and
+ whole groups of nodes can now be colored with \meta{color class name}. This
+ is done using the following keys, which become
+ available inside the current scope:
+ %
+ \begin{key}{/tikz/graphs/\meta{color class name}}
+ This key internally uses the |operator| command to setup an operator
+ that will cause all nodes of the current group to get the ``logical
+ color'' \meta{color class name}. Nodes retain this color in all
+ encompassing scopes, unless it is explicitly changed (see below) or
+ unset (again, see below).
+ %
+\begin{codeexample}[]
+\tikz \graph [color class=red] {
+ [cycle=red] % causes all "logically" red nodes to be connected in
+ % a cycle
+ a,
+ b [red],
+ { [red] c ->[bend right] d },
+ e
+};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [color class=red, color class=green,
+ math nodes, clockwise, n=5] {
+ [complete bipartite={red}{green}]
+ { [red] r_1, r_2 },
+ { [green] g_1, g_2, g_3 }
+};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/not \meta{color class name}}
+ Sets up an operator for the current scope so that all nodes in it loose
+ the color \meta{color class name}. You can also use |!|\meta{color
+ class name} as an alias for this key.
+ %
+\begin{codeexample}[]
+\tikz \graph [color class=red, color class=green,
+ math nodes, clockwise, n=5] {
+ [complete bipartite={red}{green}]
+ { [red] r_1, r_2 },
+ { [green] g_1, g_2, g_3 },
+ g_2 [not green]
+};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/recolor \meta{color class name} by=\meta{new color}}
+ Causes all keys having color \meta{color class name} to get \meta{new
+ color} instead. They loose having color \meta{color class name}, but
+ other colors are not affected.
+ %
+\begin{codeexample}[]
+\tikz \graph [color class=red, color class=green,
+ math nodes, clockwise, n=5] {
+ [complete bipartite={red}{green}]
+ { [red] r_1, r_2 },
+ { [green] g_1, g_2, g_3 },
+ g_2 [recolor green by=red]
+};
+\end{codeexample}
+ \end{key}
+\end{key}
+
+The following color classes are available by default:
+%
+\begin{itemize}
+ \item Color class |all|. Every node is part of this class by default. This
+ is useful to access all nodes of a (sub)graph, since you can simply
+ access all nodes of this color class.
+ \item Color classes |source| and |target|. These classes are used to
+ identify nodes that lead ``into'' a group of nodes and nodes from which
+ paths should ``leave'' the group. Details on how these colors are
+ assigned are explained in Section~\ref{section-library-graphs-join}. By
+ saying |not source| or |not target| with a node, you can influence how
+ it is connected:
+ %
+\begin{codeexample}[]
+\tikz \graph { a -> { b, c, d } -> e };
+ \end{codeexample}
+ \begin{codeexample}[]
+\tikz \graph { a -> { b[not source], c, d[not target] } -> e };
+ \end{codeexample}
+ %
+ \item Color classes |source'| and |target'|. These are temporary colors
+ that are also explained in Section~\ref{section-library-graphs-join}.
+\end{itemize}
+
+
+\subsubsection{Graph Operators on Groups of Nodes}
+
+Recall that the |graph| command constructs graphs recursively from nested
+\meta{group specifications}. Each such \meta{group specification} describes a
+subset of the nodes of the final graph. A \emph{graph operator} is an algorithm
+that gets the nodes of a group as input and (typically) adds edges between
+these nodes in some sensible way. For instance, the |clique| operator will
+simply add edges between all nodes of the group.
+
+\begin{key}{/tikz/graphs/operator=\meta{code}}
+ This key has an effect in three places:
+ %
+ \begin{enumerate}
+ \item It can be used in the \meta{options} of a \meta{direct node
+ specification}.
+ \item It can be used in the \meta{options} of a \meta{group
+ specification}.
+ \item It can be used in the \meta{options} of an \meta{edge
+ specification}.
+ \end{enumerate}
+ %
+ The first case is a special case of the second, since it is treated like a
+ group specification containing a single node. The last case is more
+ complicated and discussed in the next section. So, let us focus on the
+ second case.
+
+ Even though the \meta{options} of a group are given at the beginning of the
+ \meta{group specification}, the \meta{code} is only executed when the group
+ has been parsed completely and all its nodes have been identified. If you
+ use the |operator| multiple times in the \meta{options}, the effect
+ accumulates, that is, all code passed to the different calls of |operator|
+ gets executed in the order it is encountered.
+
+ The \meta{code} can do ``whatever it wants'', but it will typically add
+ edges between certain nodes. You can configure what kind of edges
+ (directed, undirected, etc.) are created by using the following keys:
+ %
+ \begin{key}{/tikz/graphs/default edge kind=\meta{value} (initially -\/-)}
+ This key stores one of the five edge kinds |--|, |<-|, |->|, |<->|, and
+ |-!-|. When an operator wishes to create a new edge, it should
+ typically set
+ %
+\begin{codeexample}[code only]
+\tikzgraphsset{new \pfkeysvalueof{/tikz/graphs/default edge kind}=...}
+\end{codeexample}
+ %
+ While this key can be set explicitly, it may be more convenient to use
+ the abbreviating keys listed below. Also, this key is automatically set
+ to the current value of \meta{edge specification} when a joining
+ operator is called, see the discussion of joining operators in
+ Section~\ref{section-library-graphs-join}.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/--}
+ Sets the |default edge kind| to |--|.
+ %
+\begin{codeexample}[]
+\tikz \graph { subgraph K_n [--, n=5, clockwise, radius=6mm] };
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/->}
+ Sets the |default edge kind| to |->|.
+ %
+\begin{codeexample}[]
+\tikz \graph { subgraph K_n [->, n=5, clockwise, radius=6mm] };
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/<-}
+ Sets the |default edge kind| to |<-|.
+ %
+\begin{codeexample}[]
+\tikz \graph { subgraph K_n [<-, n=5, clockwise, radius=6mm] };
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/<->}
+ Sets the |default edge kind| to |<->|.
+ %
+\begin{codeexample}[]
+\tikz \graph { subgraph K_n [<->, n=5, clockwise, radius=6mm] };
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/-\protect\exclamationmarktext-}
+ Sets the |default edge kind| to |-!-|.
+ \end{key}
+
+ When the \meta{code} of an operator is executed, the following commands can
+ be used to find the nodes that should be connected:
+ %
+ \begin{command}{\tikzgraphforeachcolorednode\marg{color name}\marg{macro}}
+ When this command is called inside \meta{code}, the following will
+ happen: \tikzname\ will iterate over all nodes inside the
+ just-specified group that have the color \meta{color name}. The order
+ in which they are iterated over is the order in which they appear
+ inside the group specification (if a node is encountered several times
+ inside the specification, only the first occurrence counts). Then, for
+ each node the \meta{macro} is executed with the node's name as the only
+ argument.
+
+ In the following example we use an operator to connect every node
+ colored |all| inside the subgroup to he node |root|.
+ %
+\begin{codeexample}[]
+\def\myconnect#1{\tikzset{graphs/new ->={root}{#1}{}{}}}
+
+\begin{tikzpicture}
+ \node (root) at (-1,-1) {root};
+
+ \graph {
+ x,
+ {
+ [operator=\tikzgraphforeachcolorednode{all}{\myconnect}]
+ a, b, c
+ }
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{command}
+
+ \begin{command}{\tikzgraphpreparecolor\marg{color name}\marg{counter}\marg{prefix}}
+ This command is used to ``prepare'' the nodes of a certain color for
+ random access. The effect is the following: It is counted how many
+ nodes there are having color \meta{color name} in the current group and
+ the result is stored in \meta{counter}. Next, macros named
+ \meta{prefix}|1|, \meta{prefix}|2|, and so on are defined, that store
+ the names of the first, second, third, and so on node having the color
+ \meta{color name}.
+
+ The net effect is that after you have prepared a color, you can quickly
+ iterate over them. This is especially useful when you iterate over
+ several color at the same time.
+
+ As an example, let us create an operator then adds a zig-zag path
+ between two color classes:
+ %
+\begin{codeexample}[]
+\newcount\leftshorecount \newcount\rightshorecount
+\newcount\mycount \newcount\myothercount
+\def\zigzag{
+ \tikzgraphpreparecolor{left shore}\leftshorecount{left shore prefix}
+ \tikzgraphpreparecolor{right shore}\rightshorecount{right shore prefix}
+ \mycount=0\relax
+ \loop
+ \advance\mycount by 1\relax%
+ % Add the "forward" edge
+ \tikzgraphsset{new ->=
+ {\csname left shore prefix\the\mycount\endcsname}
+ {\csname right shore prefix\the\mycount\endcsname}{}{}}
+ \myothercount=\mycount\relax%
+ \advance\myothercount by1\relax%
+ \tikzgraphsset{new <-=
+ {\csname left shore prefix\the\myothercount\endcsname}
+ {\csname right shore prefix\the\mycount\endcsname}{}{}}
+ \ifnum\myothercount<\leftshorecount\relax
+ \repeat
+}
+\begin{tikzpicture}
+ \graph [color class=left shore, color class=right shore]
+ { [operator=\zigzag]
+ { [left shore, Cartesian placement] a, b, c },
+ { [right shore, Cartesian placement, nodes={xshift=1cm}] d, e, f }
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Naturally, in order to turn the above code into a usable operator, some
+ more code would be needed (like default values and taking care of
+ shores of different sizes).
+ \end{command}
+\end{key}
+
+There are a number of predefined operators, like |clique| or |cycle|, see the
+reference Section~\ref{section-library-graphs-reference} for a complete list.
+
+
+\subsubsection{Graph Operators for Joining Groups}
+\label{section-library-graphs-join}
+
+When you join two nodes |foo| and |bar| by the edge specification |->|, it is
+fairly obvious, what should happen: An edge from |(foo)| to |(bar)| should be
+created. However, suppose we use an edge specification between two node sets
+like |{a,b,c}| and |{d,e,f}|. In this case, it is not so clear which edges
+should be created. One might argue that all possible edges from any node in the
+first set to any node in the second set should be added. On the other hand, one
+might also argue that only a matching between these two sets should be created.
+Things get even more muddy when a longer chain of node sets are joined.
+
+Instead of fixing how edges are created between two node sets, \tikzname\ takes
+a somewhat more general, but also more complicated approach, which can be
+broken into two parts. In the following, assume that the following chain
+specification is given:
+%
+\begin{quote}
+ \meta{spec$_1$} \meta{edge specification} \meta{spec$_2$}
+\end{quote}
+%
+An example might be |{a,b,c} -> {d, e->f}|.
+
+\medskip
+\textbf{The source and target vertices.} Let us start with the question of
+which vertices of the first node set should be connected to vertices in the
+second node set.
+
+There are two predefined special color classes that are used for this: |source|
+and |target|. For every group specification, some vertices are colored as
+|source| vertices and some vertices are |target| vertices (a node can both be a
+target and a source). Initially, every vertex is both a source and a target,
+but that can change as we will see in a moment.
+
+The intuition behind source and target vertices is that, in some sense, edges
+``from the outside'' lead into the group via the source vertices and lead out
+of the group via the target vertices. To be more precise, the following
+happens:
+%
+\begin{enumerate}
+ \item The target vertices of the first group are connected to the source
+ vertices of the second group.
+ \item In the group resulting from the union of the nodes from
+ \meta{spec$_1$} and \meta{spec$_2$}, the source vertices are only those
+ from the first group, and the target vertices are only those from the
+ second group.
+\end{enumerate}
+
+Let us go over the effect of these rules for the example
+|{a,b,c} -> {d, e->f}|. First, each individual node is initially both a
+|source| and a |target| vertex. Then, in |{a,b,c}| all nodes are still both
+source and target vertices since just grouping vertices does not change their
+colors. Now, in |e->f| something interesting happens for the first time: the
+target vertices of the ``group'' |e| (which is just the node |e|) are connected
+to the source vertices of the ``group'' |f|. This means, that an edge is added
+from |e| to |f|. Then, in the resulting group |e->f| the only source vertex is
+|e| and the only target vertex is |f|. This implies that in the group
+|{d,e->f}| the sources are |d| and |e| and the targets are |d| and~|f|.
+
+Now, in |{a,b,c} -> {d,e->f}| the targets of |{a,b,c}| (which are all three of
+them) are connected to the sources of |{d,e->f}| (which are just |d| and~|e|).
+Finally, in the whole graph only |a|, |b|, and |c| are sources while only |d|
+and |f| are targets.
+%
+\begin{codeexample}[]
+\def\hilightsource#1{\fill [green, opacity=.25] (#1) circle [radius=2mm]; }
+\def\hilighttarget#1{\fill [red, opacity=.25] (#1) circle [radius=2mm]; }
+\tikz \graph
+ [operator=\tikzgraphforeachcolorednode{source}{\hilightsource},
+ operator=\tikzgraphforeachcolorednode{target}{\hilighttarget}]
+ { {a,b,c} -> {d, e->f} };
+\end{codeexample}
+
+The next objective is to make more precise what it means that ``the targets of
+the first graph'' and the ``sources of the second graph'' should be connected.
+We know already of a general way of connecting nodes of a graph: operators!
+Thus, we use an operator for this job. For instance, the |complete bipartite|
+operator adds an edge from every node having a certain color to every node have
+a certain other color. This is exactly what we need here: The first color is
+``the color |target| restricted to the nodes of the first graph'' and the
+second color is ``the color |source| restricted to the nodes of the second
+graph''.
+
+However, we cannot really specify that only nodes from a certain subgraph are
+meant -- the |operator| machinery only operates on all nodes of the current
+graph. For this reason, what really happens is the following: When the |graph|
+command encounters \meta{spec$_1$} \meta{edge specification} \meta{spec$_2$},
+it first computes and colors the nodes of the first and the second
+specification independently. Then, the |target| nodes of the first graph are
+recolored to |target'| and the |source| nodes of the second graph are recolored
+to |source'|. Then, the two graphs are united into one graph and a
+\emph{joining operator} is executed, which should add edges between |target'|
+and |source'|. Once this is done, the colors |target'| and |source'| get
+erased. Note that in the resulting graph only the |source| nodes from the first
+graph are still |source| nodes and likewise for the |target| nodes of the
+second graph.
+
+\medskip
+\textbf{The joining operators.} The job of a joining operator is to add edges
+between nodes colored |target'| and |source'|. The following rule is used to
+determine which operator should be chosen for performing this job:
+%
+\begin{enumerate}
+ \item If the \meta{edge specification} explicitly sets the |operator| key
+ to something non-empty (and also not to |\relax|), then the \meta{code}
+ of this |operator| call is used.
+ \item Otherwise, the current value of the following key is used:
+ %
+ \begin{key}{/tikz/graphs/default edge operator=\meta{key} (initially matching and star)}
+ This key stores the name of a \meta{key} that is executed for every
+ \meta{edge specification} whose \meta{options} do not contain the
+ |operator| key.
+ %
+\begin{codeexample}[]
+\tikz \graph [default edge operator=matching] {
+ {a, b} ->[matching and star]
+ {c, d, e} --[complete bipartite]
+ {f, g, h} --
+ {i, j, k}
+};
+\end{codeexample}
+ \end{key}
+\end{enumerate}
+
+A typical joining operator is |complete bipartite|. It takes the names of two
+color classes as input and adds edges from all vertices of the first class to
+all vertices of the second class. Now, the trick is that the default value for
+the |complete bipartite| key is |{target'}{source'}|. Thus, if you just write
+|->[complete bipartite]|, the same happens as if you had written
+%
+\begin{quote}
+ |->[complete bipartite={target'}{source'}]|
+\end{quote}
+%
+This is exactly what we want to happen. The same default values are also set
+for other joining operators like |matching| or |butterfly|.
+
+Even though an operator like |complete bipartite| is typically used together
+with an edge specification, it can also be used as a normal operator together
+with a group specification. In this case, however, the color classes must be
+named explicitly:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \graph [color class=red, color class=green, math nodes]
+ { [complete bipartite={red}{green}]
+ { [red, Cartesian placement] r_1, r_2, r_3 },
+ { [green, Cartesian placement, nodes={xshift=1cm}] g_1, g_2, g_3 }
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+A list of predefined joining operators can be found in the reference
+Section~\ref{section-library-graphs-reference}.
+
+The fact that joining operators can also be used as normal operators leads to a
+subtle problem: A normal operator will typically use the current value of
+|default edge kind| to decide which kind of edges should be put between the
+identified vertices, while a joining operator should, naturally, use the kind
+of edge specified by the \meta{edge specification}. This problem is solved as
+follows: Like a normal operator, a joining operator should also use the current
+value of |default edge kind| for the edges it produces. The trick is that this
+will automatically be set to the current \meta{edge specification} when the
+operator explicitly in the \meta{options} of the edge specification or
+implicitly in the |default edge operator|.
+
+
+\subsection{Graph Macros}
+\label{section-library-graphs-macros}
+
+A \emph{graph macro} is a small graph that is inserted at some point into the
+graph that is currently being constructed. There is special support for such
+graph macros in \tikzname. You might wonder why this is necessary -- can't one
+use \TeX's normal macro mechanism? The answer is ``no'': one cannot insert new
+nodes into a graph using normal macros because the chains, groups, and nodes
+are determined prior to macro expansion. Thus, any macro encountered where some
+node text should go will only be expanded when this node is being named and
+typeset.
+
+A graph macro is declared using the following key:
+
+\begin{key}{/tikz/graphs/declare=\marg{graph name}\marg{specification}}
+ This key declares that \meta{graph name} can subsequently be used as a
+ replacement for a \meta{node name}. Whenever the \meta{graph name} is used
+ in the following, a graph group will be inserted instead whose content is
+ exactly \meta{specification}. In case \meta{graph name} is used together
+ with some \meta{options}, they are executed prior to inserting the
+ \meta{specification}.
+ %
+\begin{codeexample}[]
+\tikz \graph [branch down=4mm, declare={claw}{1 -- {2,3,4}}] {
+ a;
+ claw;
+ b;
+};
+\end{codeexample}
+ %
+ In the next example, we use a key to configure a subgraph:
+ %
+\begin{codeexample}[]
+\tikz \graph [ n/.code=\def\n{#1}, branch down=4mm,
+ declare={star}{root -- { \foreach \i in {1,...,\n} {\i} }}]
+{ star [n=5]; };
+\end{codeexample}
+ %
+ Actually, the |n| key is already defined internally for a similar purpose.
+
+ As a last example, let us define a somewhat more complicated graph macro.
+ %
+\begin{codeexample}[]
+\newcount\mycount
+\tikzgraphsset{
+ levels/.store in=\tikzgraphlevel,
+ levels=1,
+ declare={bintree}{%
+ [/utils/exec={%
+ \ifnum\tikzgraphlevel=1\relax%
+ \def\childtrees{ / }%
+ \else%
+ \mycount=\tikzgraphlevel%
+ \advance\mycount by-1\relax%
+ \edef\childtrees{
+ / -> {
+ bintree[levels=\the\mycount],
+ bintree[levels=\the\mycount]
+ }}
+ \fi%
+ },
+ parse/.expand once=\childtrees
+ ]
+ % Everything is inside the \childtrees...
+ }
+}
+\tikz \graph [grow down=5mm, branch right=5mm] { bintree [levels=5] };
+\end{codeexample}
+ %
+\end{key}
+
+Note that when you use a graph macro several time inside the same graph, you
+will typically have to use the |name| option so that different copies of the
+subgraph are created:
+%
+\begin{codeexample}[]
+\tikz \graph [branch down=4mm, declare={claw}{1 -- {2,3,4}}] {
+ claw [name=left],
+ claw [name=right]
+};
+\end{codeexample}
+
+You will find a list of useful graph macros in the reference section,
+Section~\ref{section-library-graphs-reference-macros}.
+
+
+\subsection{Online Placement Strategies}
+\label{section-library-graphs-placement}
+
+The main job of the |graph| library is to make it easy to specify which nodes
+are present in a graph and how they are connected. In contrast, it is
+\emph{not} the primary job of the library to compute good positions for nodes
+in a graph -- use for instance a |\matrix|, specify good positions ``by hand''
+or use the graph drawing facilities. Nevertheless, some basic support for
+automatic node placement is provided for simple cases. The graph library will
+provide you with information about the position of nodes inside their groups
+and chains.
+
+As a graph is being constructed, a \emph{placement strategy} is used to
+determine a (reasonably good) position for the nodes as they are created. These
+placement strategies get some information about what \tikzname\ has already
+seen concerning the already constructed nodes, but it gets no information
+concerning the upcoming nodes. Because of this lack of information concerning
+the future, the strategies need to be what is called an \emph{online strategy}
+in computer science. (The opposite are \emph{offline strategies}, which get
+information about the whole graph and all the sizes of the nodes in it. The
+graph drawing libraries employ such offline strategies.)
+
+Strategies are selected using keys like |no placement| or
+|Cartesian placement|. It is permissible to use different strategies inside
+different parts of a graph, even though the different strategies do not always
+work together in perfect harmony.
+
+
+\subsubsection{Manual Placement}
+\label{section-graphs-xy}
+
+\begin{key}{/tikz/graphs/no placement}
+ This strategy simply ``switches off'' the whole placement mechanism,
+ causing all nodes to be placed at the origin by default. You need to use
+ this strategy if you position nodes ``by hand''. For this, you can use the
+ |at| key, the |shift| keys:
+ %
+\begin{codeexample}[]
+\tikz \graph [no placement]
+{
+ a[at={(0:0)}] -> b[at={(1,0)}] -> c[yshift=1cm];
+};
+\end{codeexample}
+ %
+ Since the syntax and the many braces and parentheses are a bit cumbersome,
+ the following two keys might also be useful:
+ %
+ \begin{key}{/tikz/graphs/x=\meta{x dimension}}
+ When you use this key, it will have the same effect as if you had
+ written |at={(|\meta{x dimension}|,|\meta{y dimension}|)}|, where
+ \meta{y dimension} is a value set using the |y| key:
+ %
+\begin{codeexample}[]
+\tikz \graph [no placement]
+{
+ a[x=0,y=0] -> b[x=1,y=0] -> c[x=0,y=1];
+};
+\end{codeexample}
+ %
+ Note that you can specify an |x| or a |y| key for a whole scope and
+ then vary only the other key:
+ %
+\begin{codeexample}[]
+\tikz \graph [no placement]
+{
+ a ->
+ { [x=1] % group option
+ b [y=0] -> c[y=1]
+ };
+};
+\end{codeexample}
+ %
+ Note that these keys have the path |/tikz/graphs/|, so they will be
+ available inside |graph|s and will not clash with the usual |x| and |y|
+ keys of \tikzname, which are used to specify the basic lengths of
+ vectors.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/y=\meta{y dimension}}
+ See above.
+ \end{key}
+\end{key}
+
+
+\subsubsection{Placement on a Grid}
+
+\begin{key}{/tikz/graphs/Cartesian placement}
+ This strategy is the default strategy. It works, roughly, as follows: For
+ each new node on a chain, advance a ``logical width'' counter and for each
+ new node in a group, advance a ``logical depth'' counter. When a chain
+ contains a whole group, then the ``logical width'' taken up by the group is
+ the maximum over the logical widths taken up by the chains inside the
+ group; and symmetrically the logical depth of a chain is the maximum of the
+ depths of the groups inside it.
+
+ This slightly confusing explanation is perhaps best exemplified. In the
+ below example, the two numbers indicate the two logical width and depth of
+ each node as computed by the |graph| library. Just ignore the arcane code
+ that is used to print these numbers.
+ %
+\begin{codeexample}[]
+\tikz
+ \graph [nodes={align=center, inner sep=1pt}, grow right=7mm,
+ typeset={\tikzgraphnodetext\\[-4pt]
+ \tiny\mywidth\\[-6pt]\tiny\mydepth},
+ placement/compute position/.append code=
+ \pgfkeysgetvalue{/tikz/graphs/placement/width}{\mywidth}
+ \pgfkeysgetvalue{/tikz/graphs/placement/depth}{\mydepth}]
+{
+ a,
+ b,
+ c -> d -> {
+ e -> f -> g,
+ h -> i
+ } -> j,
+ k -> l
+};
+\end{codeexample}
+ %
+ You will find a detailed description of how these logical units are
+ computed, exactly, in Section~\ref{section-library-graphs-new-online}.
+
+ Now, even though we talk about ``widths'' and ``depths'' and even though by
+ default a graph ``grows'' to the right and down, this is by no means fixed.
+ Instead, you can use the following keys to change how widths and heights
+ are interpreted:
+ %
+ \begin{key}{/tikz/graphs/chain shift=\meta{coordinate} (initially {(1,0)})}
+ Under the regime of the |Cartesian placement| strategy, each node is
+ shifted by the current logical width times this \meta{coordinate}.
+ %
+\begin{codeexample}[]
+\tikz \graph [chain shift=(45:1)] {
+ a -> b -> c;
+ d -> e;
+ f -> g -> h;
+};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/group shift=\meta{coordinate} (initially {(0,-1)})}
+ Like for |chain shift|, each node is shifted by the current logical
+ depth times this \meta{coordinate}.
+ %
+\begin{codeexample}[]
+\tikz \graph [chain shift=(45:7mm), group shift=(-45:7mm)] {
+ a -> b -> c;
+ d -> e;
+ f -> g -> h;
+};
+\end{codeexample}
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/graphs/grow up=\meta{distance} (default 1)}
+ Sets the |chain shift| to |(|\meta{distance}|,0)|, so that chains ``grow
+ upward''. The distance by which the center of each new element is removed
+ from the center of the previous one is \meta{distance}.
+ %
+\begin{codeexample}[]
+\tikz \graph [grow up=7mm] { a -> b -> c};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/grow down=\meta{distance} (default 1)}
+ Like |grow up|.
+ %
+\begin{codeexample}[]
+\tikz \graph [grow down=7mm] { a -> b -> c};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/grow left=\meta{distance} (default 1)}
+ Like |grow up|.
+ %
+\begin{codeexample}[]
+\tikz \graph [grow left=7mm] { a -> b -> c};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/grow right=\meta{distance} (default 1)}
+ Like |grow up|.
+ %
+\begin{codeexample}[]
+\tikz \graph [grow right=7mm] { a -> b -> c};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/branch up=\meta{distance} (default 1)}
+ Sets the |group shift| so that groups ``branch upward''. The distance by
+ which the center of each new element is removed from the center of the
+ previous one is \meta{distance}.
+ %
+\begin{codeexample}[]
+\tikz \graph [branch up=7mm] { a -> b -> {c, d, e} };
+\end{codeexample}
+ %
+ Note that when you draw a tree, the |branch ...| keys specify how siblings
+ (or adjacent branches) are arranged, while the |grow ...| keys specify in
+ which direction the branches ``grow''.
+\end{key}
+
+\begin{key}{/tikz/graphs/branch down=\meta{distance} (default 1)}
+%
+\begin{codeexample}[]
+\tikz \graph [branch down=7mm] { a -> b -> {c, d, e}};
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/branch left=\meta{distance} (default 1)}
+%
+\begin{codeexample}[]
+\tikz \graph [branch left=7mm, grow down=7mm] { a -> b -> {c, d, e}};
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/branch right=\meta{distance} (default 1)}
+%
+\begin{codeexample}[]
+\tikz \graph [branch right=7mm, grow down=7mm] { a -> b -> {c, d, e}};
+\end{codeexample}
+%
+\end{key}
+
+The following keys place nodes in a $N\times M$ grid.
+%
+\begin{key}{/tikz/graphs/grid placement}
+ This key works similar to |Cartesian placement|. As for that placement
+ strategy, a node has logical width and depth 1. However, the computed total
+ width and depth are mapped to a $N\times M$ grid. The values of $N$ and $M$
+ depend on the size of the graph and the value of |wrap after|. The number
+ of columns $M$ is either set to |wrap after| explicitly or computed
+ automatically as $\sqrt{\texttt{\string|V\string|}}$. $N$ is the number of
+ rows needed to lay out the graph in a grid with $M$ columns.
+ %
+\begin{codeexample}[]
+% An example with 6 nodes, 3 columns and therefor 2 rows
+\tikz \graph [grid placement] { subgraph I_n[n=6, wrap after=3] };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+% An example with 9 nodes with columns and rows computed automatically
+\tikz \graph [grid placement] { subgraph Grid_n [n=9] };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+% Directions can be changed
+\tikz \graph [grid placement, branch up, grow left] { subgraph Grid_n [n=9] };
+\end{codeexample}
+ %
+ In case a user-defined graph instead of a pre-defined |subgraph| is to be
+ laid out using |grid placement|, |n| has to be specified explicitly:
+ %
+\begin{codeexample}[]
+\tikz \graph [grid placement] {
+ [n=6, wrap after=3]
+ a -- b -- c -- d -- e -- f
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Placement Taking Node Sizes Into Account}
+
+Options like |grow up| or |branch right| do not take the sizes of the
+to-be-positioned nodes into account -- all nodes are placed quite ``dumbly'' at
+grid positions. It turns out that the |Cartesian placement| can also be used to
+place notes in such a way that their height and/or width is taken into account.
+Note, however, that while the following options may yield an adequate placement
+in many situations, when you need advanced alignments you should use a |matrix|
+or advanced offline strategies to place the nodes.
+
+\begin{key}{/tikz/graphs/grow right sep=\meta{distance} (default 1em)}
+ This key has several effects, but let us start with the bottom line: Nodes
+ along a chain are placed in such a way that the left end of a new node is
+ \meta{distance} from the right end of the previous node:
+ %
+\begin{codeexample}[]
+\tikz \graph [grow right sep, left anchor=east, right anchor=west] {
+ start -- {
+ long text -- {short, very long text} -- more text,
+ long -- longer -- longest
+ } -- end
+};
+\end{codeexample}
+ %
+ What happens internally is the following: First, the |anchor| of the nodes
+ is set to |west| (or |north west| or |south west|, see below). Second, the
+ logical width of a node is no longer |1|, but set to the actual width of
+ the node (which we define as the horizontal difference between the |west|
+ anchor and the |east| anchor) in points. Third, the |chain shift| is set to
+ |(1pt,0pt)|.
+\end{key}
+
+\begin{key}{/tikz/graphs/grow left sep=\meta{distance} (default 1em)}
+%
+\begin{codeexample}[]
+\tikz \graph [grow left sep] { long -- longer -- longest };
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/grow up sep=\meta{distance} (default 1em)}
+\begin{codeexample}[]
+\tikz \graph [grow up sep] {
+ a / $a=x$ --
+ b / {$b=\displaystyle \int_0^1 x dx$} --
+ c [draw, circle, inner sep=7mm]
+};
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/grow down sep=\meta{distance} (default 1em)}
+ As above.
+\end{key}
+
+\begin{key}{/tikz/graphs/branch right sep=\meta{distance} (default 1em)}
+ This key works like |grow right sep|, only it affects groups rather than
+ chains.
+ %
+\begin{codeexample}[]
+\tikz \graph [grow down, branch right sep] {
+ start -- {
+ an even longer text -- {short, very long text} -- more text,
+ long -- longer -- longest,
+ some text -- a -- b
+ } -- end
+};
+\end{codeexample}
+ %
+ When both this key and, say, |grow down sep| are set, instead of the |west|
+ anchor, the |north west| anchor will be selected automatically.
+\end{key}
+
+\begin{key}{/tikz/graphs/branch left sep=\meta{distance} (default 1em)}
+%
+\begin{codeexample}[]
+\tikz \graph [grow down sep, branch left sep] {
+ start -- {
+ an even longer text -- {short, very long text} -- more text,
+ long -- longer,
+ some text -- a -- b
+ } -- end
+};
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/branch up sep=\meta{distance} (default 1em)}
+%
+\begin{codeexample}[]
+\tikz \graph [branch up sep] { a, b, c[draw, circle, inner sep=7mm] };
+\end{codeexample}
+%
+\end{key}
+
+\begin{key}{/tikz/graphs/branch down sep=\meta{distance} (default 1em)}
+\end{key}
+
+
+\subsubsection{Placement On a Circle}
+
+The following keys place nodes on circles. Note that, typically, you do not use
+|circular placement| directly, but rather use one of the two keys |clockwise|
+or |counterclockwise|.
+
+\begin{key}{/tikz/graphs/circular placement}
+ This key works quite similar to |Cartesian placement|. As for that
+ placement strategy, a node has logical width and depth |1|. However, the
+ computed total width and depth are mapped to polar coordinates rather than
+ Cartesian coordinates.
+
+ \begin{key}{/tikz/graphs/chain polar shift=|(|\meta{angle}|:|\meta{radius}|)| (initially {(0:1)})}
+ Under the regime of the |circular placement| strategy, each node on a
+ chain is shifted by
+ |(|\meta{logical width}\meta{angle}|:|\meta{logical width}\meta{angle}|)|.
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement] {
+ a -> b -> c;
+ d -> e;
+ f -> g -> h;
+};
+\end{codeexample}
+ %
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/group polar shift=|(|\meta{angle}|:|\meta{radius}|)| (initially {(45:0)})}
+ Like for |group shift|, each node on a chain is shifted by
+ |(|\meta{logical depth}\meta{angle}|:|\meta{logical depth}\meta{angle}|)|.
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement, group polar shift=(30:0)] {
+ a -> b -> c;
+ d -> e;
+ f -> g -> h;
+};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement,
+ chain polar shift=(30:0),
+ group polar shift=(0:1cm)] {
+ a -- b -- c;
+ d -- e;
+ f -- g -- h;
+};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/radius=\meta{dimension} (initially 1cm)}
+ This is an initial value that is added to the total computed radius
+ when the polar shift of a node has been calculated. Essentially, this
+ key allows you to set the \meta{radius} of the innermost circle.
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement, radius=5mm] { a, b, c, d };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement, radius=1cm] { a, b, c, d };
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/phase=\meta{angle} (initially 90)}
+ This is an initial value that is added to the total computed angle when
+ the polar shift of a node has been calculated.
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement] { a, b, c, d };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [circular placement, phase=0] { a, b, c, d };
+\end{codeexample}
+ \end{key}
+\end{key}
+
+\label{key-graphs-clockwise}%
+\begin{key}{/tikz/graphs/clockwise=\meta{number} (default \string\tikzgraphVnum)}
+ This key sets the |group shift| so that if there are exactly \meta{number}
+ many nodes in a group, they will form a complete circle. If you do not
+ provide a \meta{number}, the current value of |\tikzgraphVnum| is used,
+ which is exactly what you want when you use predefined graph macros like
+ |subgraph K_n|.
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise=4] { a, b, c, d };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise] { subgraph K_n [n=5] };
+\end{codeexample}
+ %
+\end{key}
+
+\label{key-graphs-counterclockwise}%
+\begin{key}{/tikz/graphs/counterclockwise=\meta{number} (default \string\tikzgraphVnum)}
+ Works like |clockwise|, only the direction is inverted.
+\end{key}
+
+
+\subsubsection{Levels and Level Styles}
+
+As a graph is being parsed, the |graph| command keeps track of a parameter
+called the \emph{level} of a node. Provided that the graph is actually
+constructed in a tree-like manner, the level is exactly equal to the level of
+the node inside this tree.
+
+\begin{key}{/tikz/graphs/placement/level}
+ This key stores a number that is increased for each element on a chain, but
+ gets reset at the end of a group:
+ %
+\begin{codeexample}[]
+\tikz \graph [ branch down=5mm, typeset=
+ \tikzgraphnodetext:\pgfkeysvalueof{/tikz/graphs/placement/level}]
+{
+ a -> {
+ b,
+ c -> {
+ d,
+ e -> {f,g},
+ h
+ },
+ j
+ }
+};
+\end{codeexample}
+ %
+ Unlike the parameters |depth| and |width| described in the next section,
+ the key |level| is always available.
+\end{key}
+
+In addition to keeping track of the value of the |level| key, the |graph|
+command also executes the following keys whenever it creates a node:
+
+\begin{stylekey}{/tikz/graph/level=\meta{level}}
+ This key gets executed for each newly created node with \meta{level} set to
+ the current level of the node. You can use this key to, say, reconfigure
+ the node distance or the node color.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/graph/level \meta{level}}
+ This key also gets executed for each newly created node with \meta{level}
+ set to the current level of the node.
+ %
+\begin{codeexample}[]
+\tikz \graph [
+ branch down=5mm,
+ level 1/.style={nodes=red},
+ level 2/.style={nodes=green!50!black},
+ level 3/.style={nodes=blue}]
+{
+ a -> {
+ b,
+ c -> {
+ d,
+ e -> {f,g},
+ h
+ },
+ j
+ }
+};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [
+ branch down=5mm,
+ level 1/.style={grow right=2cm},
+ level 2/.style={grow right=1cm},
+ level 3/.style={grow right=5mm}]
+{
+ a -> {
+ b,
+ c -> {
+ d,
+ e -> {f,g},
+ h
+ },
+ j
+ }
+};
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsubsection{Defining New Online Placement Strategies}
+\label{section-library-graphs-new-online}
+
+In the following the details of how to define a new placement strategy are
+explained. Most readers may wish to skip this section.
+
+As a graph specification is being parsed, the |graph| library will keep track
+of different numbers that identify the positions of the nodes. Let us start
+with what happens on a chain. First, the following counter is increased for
+each element of the chain:
+%
+\begin{key}{/tikz/graphs/placement/element count}
+ This key stores a number that tells us the position of the node on the
+ current chain. However, you only have access to this value inside the code
+ passed to the macro |compute position|, explained later on.
+ %
+\begin{codeexample}[]
+\tikz \graph [
+ grow right sep, typeset=\tikzgraphnodetext:\mynum,
+ placement/compute position/.append code=
+ \pgfkeysgetvalue{/tikz/graphs/placement/element count}{\mynum}]
+{
+ a -> b -> c,
+ d -> {e, f->h} -> j
+};
+\end{codeexample}
+ %
+ As can be seen, each group resets the element counter.
+\end{key}
+
+The second value that is computed is more complicated to explain, but it also
+gives more interesting information:
+%
+\begin{key}{/tikz/graphs/placement/width}
+ This key stores the ``logical width'' of the nodes parsed up to now in the
+ current group or chain (more precisely, parsed since the last call of
+ |place| in an enclosing group). This is not necessarily the ``total
+ physical width'' of the nodes, but rather a number representing how ``big''
+ the elements prior to the current element were. This \emph{may} be their
+ width, but it may also be their height or even their number (which,
+ incidentally, is the default). You can use the |width| to perform shifts or
+ rotations of to-be-created nodes (to be explained later).
+
+ The logical width is defined recursively as follows. First, the width of a
+ single node is computed by calling the following key:
+ %
+ \begin{key}{/tikz/graphs/placement/logical node width=\meta{full node name}}
+ This key is called to compute a physical or logical width of the node
+ \meta{full node name}. You can change the code of this key. The code
+ should return the computed value in the macro |\pgfmathresult|. By
+ default, this key returns |1|.
+ \end{key}
+ %
+ The width of a chain is the sum of the widths of its elements. The width of
+ a group is the maximum of the widths of its elements.
+
+ To get a feeling what the above rules imply in practice, let us first have
+ a look at an example where each node has logical width and height |1|
+ (which is the default). The arcane options at the beginning of the code
+ just setup things so that the computed width and depth of each node is
+ displayed at the bottom of each node.
+ %
+\begin{codeexample}[]
+\tikz
+ \graph [nodes={align=center, inner sep=1pt}, grow right=7mm,
+ typeset={\tikzgraphnodetext\\[-4pt]
+ \tiny\mywidth\\[-6pt]\tiny\mydepth},
+ placement/compute position/.append code=
+ \pgfkeysgetvalue{/tikz/graphs/placement/width}{\mywidth}
+ \pgfkeysgetvalue{/tikz/graphs/placement/depth}{\mydepth}]
+{
+ a,
+ b,
+ c -> d -> {
+ e -> f -> g,
+ h -> i
+ } -> j,
+ k -> l
+};
+\end{codeexample}
+ %
+ In the next example the ``logical'' width and depth actually match the
+ ``physical'' width and height. This is caused by the |grow right sep|
+ option, which internally sets the |logical node width| key so that it
+ returns the width of its parameter in points.
+ %
+\begin{codeexample}[]
+\tikz
+ \graph [grow right sep, branch down sep, nodes={align=left, inner sep=1pt},
+ typeset={\tikzgraphnodetext\\[-4pt] \tiny Width: \mywidth\\[-6pt] \tiny Depth: \mydepth},
+ placement/compute position/.append code=
+ \pgfkeysgetvalue{/tikz/graphs/placement/width}{\mywidth}
+ \pgfkeysgetvalue{/tikz/graphs/placement/depth}{\mydepth}]
+{
+ a,
+ b,
+ c -> d -> {
+ e -> f -> g,
+ h -> i
+ } -> j,
+ k -> l
+};
+\end{codeexample}
+ %
+\end{key}
+
+Symmetrically to chains, as a group is being constructed, counters are
+available for the number of chains encountered so far in the current group and
+for the logical depth of the current group:
+%
+\begin{key}{/tikz/graphs/placement/element count}
+ This key stores a number that tells us the sequence number of the
+ chain in the current group.
+ %
+\begin{codeexample}[]
+\tikz \graph [
+ grow right sep, branch down=5mm, typeset=\tikzgraphnodetext:\mynum,
+ placement/compute position/.append code=
+ \pgfkeysgetvalue{/tikz/graphs/placement/chain count}{\mynum}]
+{
+ a -> b -> {c,d,e},
+ f,
+ g -> h
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/placement/depth}
+ Similarly to the |width| key, this key stores the ``logical depth'' of the
+ nodes parsed up to now in the current group or chain and, also similarly,
+ this key may or may not be related to the actual depth/height of the
+ current node. As for the |width|, the exact definition is as follows: For a
+ single node, the depth is computed by the following key:
+ %
+ \begin{key}{/tikz/graphs/placement/logical node depth=\meta{full node name}}
+ The code behind this key should return the ``logical height'' of the
+ node \meta{full node name} in the macro |\pgfmathresult|.
+ \end{key}
+ %
+ Second, the depth of a group is the sum of the depths of its elements.
+ Third, the depth of a chain is the maximum of the depth of its elements.
+\end{key}
+
+The |width|, |depth|, |element count|, and |chain count| keys get updated
+automatically, but do not have an effect by themselves. This is to the
+following two keys:
+
+\begin{key}{/tikz/graphs/placement/compute position=\meta{code}}
+ The \meta{code} is called by the |graph| command just prior to creating a
+ new node (the exact moment when this key is called is detailed in the
+ description of the |place| key). When the \meta{code} is called, all of the
+ keys described above will hold numbers computed in the way described above.
+
+ The job of the \meta{code} is to setup node options appropriately so that
+ the to-be-created node will be placed correctly. Thus, the \meta{code}
+ should typically set the key |nodes={shift=|\meta{coordinate}|}| where
+ \meta{coordinate} is the computed position for the node. The \meta{code}
+ could also set other options like, say, the color of a node depending on
+ its depth.
+
+ The following example appends some code to the standard code of
+ |compute position| so that ``deeper'' nodes of a tree are lighter.
+ (Naturally, the same effect could be achieved much more easily using the
+ |level| key.)
+ %
+\begin{codeexample}[]
+\newcount\mycount
+\def\lightendeepernodes{
+ \pgfmathsetcount{\mycount}{
+ 100-20*\pgfkeysvalueof{/tikz/graphs/placement/width}
+ }
+ \edef\mydepth{\the\mycount}
+ \tikzset{nodes={fill=red!\mydepth,circle,text=white}}
+}
+\tikz
+ \graph [placement/compute position/.append code=\lightendeepernodes]
+ {
+ a -> {
+ b -> c -> d,
+ e -> {
+ f,
+ g
+ },
+ h
+ }
+ };
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/placement/place}
+ Executing this key has two effects: First, the key |compute position| is
+ called to compute a good position for future nodes (usually, these ``future
+ nodes'' are just a single node that is created immediately). Second, all of
+ the above counters like |depth| or |width| are reset (but not |level|).
+
+ There are two places where this key is sensibly called: First, just prior
+ to creating a node, which happens automatically. Second, when you change
+ the online strategy. In this case, the computed width and depth values from
+ one strategy typically make no sense in the other strategy, which is why
+ the new strategy should proceed ``from a fresh start''. In this case, the
+ implicit call of |compute position| ensures that the new strategy gets the
+ last place the old strategy would have used as its starting point, while
+ the computation of its positions is now relative to this new starting
+ point.
+
+ For these reasons, when an online strategy like |Cartesian placement| is
+ called, this key gets called implicitly. You will rarely need to call this
+ key directly, except when you define a new online strategy.
+\end{key}
+
+
+\subsection{Reference: Predefined Elements}
+\label{section-library-graphs-reference}
+
+\subsubsection{Graph Macros}
+\label{section-library-graphs-reference-macros}
+
+\begin{tikzlibrary}{graphs.standard}
+ This library defines a number of graph macros that are often used in the
+ literature. When new graphs are added to this collection, they will follow
+ the definitions in the Mathematica program, see
+ \url{mathworld.wolfram.com/topics/SimpleGraphs.html}.
+\end{tikzlibrary}
+
+\begin{graph}{subgraph I\_n}
+ This graph consists just of $n$ unconnected vertices. The following key is
+ used to specify the set of these vertices:
+ %
+ \begin{key}{/tikz/graphs/V=\marg{list of vertices}}
+ Sets a list of vertex names for use with graphs like |subgraph I_n| and
+ also other graphs. This list is available in the macro |\tikzgraphV|.
+ The number of elements of this list is available in |\tikzgraphVnum|.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/n=\meta{number}}
+ This is an abbreviation for
+ |V={1,...,|\meta{number}|}, name shore V/.style={name=V}|.
+ \end{key}
+ %
+\begin{codeexample}[]
+\tikz \graph [branch right, nodes={draw, circle}]
+ { subgraph I_n [V={a,b,c}] };
+\end{codeexample}
+ %
+ This graph is not particularly exciting by itself. However, it is often
+ used to introduce nodes into a graph that are then connected as in the
+ following example:
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise, clique] { subgraph I_n [n=4] };
+\end{codeexample}
+ %
+\end{graph}
+
+\begin{graph}{subgraph I\_nm}
+ This graph consists of two sets of once $n$ unconnected vertices and then
+ $m$ unconnected vertices. The first set consists of the vertices set by the
+ key |V|, the other set consists of the vertices set by the key |W|.
+ %
+\begin{codeexample}[]
+\tikz \graph { subgraph I_nm [V={1,2,3}, W={a,b,c}] };
+\end{codeexample}
+ %
+ In order to set the graph path name of the two sets, the following keys get
+ executed:
+ %
+ \begin{stylekey}{/tikz/graphs/name shore V (initially \normalfont empty)}
+ Set this style to, say, |name=my V set| in order to set a name for the
+ |V| set.
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/graphs/name shore W (initially \normalfont empty)}
+ Same as for |name shore V|.
+ \end{stylekey}
+ %
+ \begin{key}{/tikz/graphs/W=\marg{list of vertices}}
+ Sets the list of vertices for the |W| set. The elements and their
+ number are available in the macros |\tikzgraphW| and |\tikzgraphWnum|,
+ respectively.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/m=\meta{number}}
+ This is an abbreviation for
+ |W={1,...,|\meta{number}|}, name shore W/.style={name=W}|.
+ \end{key}
+ %
+ The main purpose of this subgraph is to setup the nodes in a bipartite
+ graph:
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ subgraph I_nm [n=3, m=4];
+
+ V 1 -- { W 2, W 3 };
+ V 2 -- { W 1, W 3 };
+ V 3 -- { W 1, W 4 };
+};
+\end{codeexample}
+ %
+\end{graph}
+
+\begin{graph}{subgraph K\_n}
+ This graph is the complete clique on the vertices from the |V| key.
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise] { subgraph K_n [n=7] };
+\end{codeexample}
+ %
+\end{graph}
+
+\begin{graph}{subgraph K\_nm}
+ This graph is the complete bipartite graph with the two shores |V| and |W|
+ as in |subgraph I_nm|.
+ %
+\begin{codeexample}[]
+\tikz \graph [branch right, grow down]
+ { subgraph K_nm [V={6,...,9}, W={b,...,e}] };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [simple, branch right, grow down]
+{
+ subgraph K_nm [V={1,2,3}, W={a,b,c,d}, ->];
+ subgraph K_nm [V={2,3}, W={b,c}, <-];
+};
+\end{codeexample}
+ %
+\end{graph}
+
+\begin{graph}{subgraph P\_n}
+ This graph is the path on the vertices in |V|.
+ %
+\begin{codeexample}[]
+\tikz \graph [branch right] { subgraph P_n [n=3] };
+\end{codeexample}
+ %
+\end{graph}
+
+\begin{graph}{subgraph C\_n}
+ This graph is the cycle on the vertices in |V|.
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise] { subgraph C_n [n=7, ->] };
+\end{codeexample}
+ %
+\end{graph}
+
+\begin{graph}{subgraph Grid\_n}
+ This graph is a grid of the vertices in |V|.
+ %
+ \begin{key}{/tikz/graphs/wrap after=\meta{number}}
+ Defines the number of nodes placed in a single row of the grid. This
+ value implicitly defines the number of grid columns as well. In the
+ following example a |grid placement| is used to visualize the edges
+ created between the nodes of a |Grid_n| |subgraph| using different
+ values for |wrap after|.
+ %
+\begin{codeexample}[]
+\tikz \graph [grid placement] { subgraph Grid_n [n=3,wrap after=1] };
+\tikz \graph [grid placement] { subgraph Grid_n [n=3,wrap after=3] };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [grid placement] { subgraph Grid_n [n=4,wrap after=2] };
+\tikz \graph [grid placement] { subgraph Grid_n [n=4] };
+\end{codeexample}
+ \end{key}
+\end{graph}
+
+% TODO: Implement the Grid_nm subgraph described here:
+%
+%\begin{graph}{subgraph Grid\_nm}
+% This graph is a grid built from the cartesian product of the two node
+% sets |V| and |W| which are either defined using the keys
+% |/tikz/graphs/V| and |/tikz/graphs/W| or |/tikz/graphs/n| and
+% |/tikz/graphs/m| or a mixture of both.
+%
+% The resulting |Grid_nm| subgraph has $n$ ``rows'' and $m$ ``columns'' and
+% the nodes are named |V i W j| with $1\le i\le n$ and $1\le j\le n$.
+% The names of the two shores |V| and |W| can be changed as described in
+% the documentation of the keys |/tikz/graphs/name shore V| and
+% |/tikz/graphs/name shore W|.
+% \begin{codeexample}[]
+%\tikz \graph [grid placement] { subgraph Grid_nm [V={1,2,3}, W={4, 5, 6}] };
+% \end{codeexample}
+%\end{graph}
+
+
+\subsubsection{Group Operators}
+
+The following keys use the |operator| key to setup operators that connect the
+vertices of the current group having a certain color in a specific way.
+
+\begin{key}{/tikz/graphs/clique=\meta{color} (default all)}
+ Adds an edge between all vertices of the current group having the (logical)
+ color \meta{color}. Since, by default, this color is set to |all|, which is
+ a color that all nodes get by default, when you do not specify anything,
+ all nodes will be connected.
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise, n=5] {
+ a,
+ b,
+ {
+ [clique]
+ c, d, e
+ }
+};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [color class=red, clockwise, n=5] {
+ [clique=red, ->]
+ a, b[red], c[red], d, e[red]
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/induced independent set=\meta{color} (default all)}
+ This key is the ``opposite'' of a |clique|: It removes all edges in the
+ current group having belonging to color class \meta{color}. More precisely,
+ an edge of kind |-!-| is added for each pair of vertices. This means that
+ edge only get removed if you specify the |simple| option.
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ subgraph K_n [<->, n=7, clockwise]; % create lots of edges
+
+ { [induced independent set] 1, 3, 4, 5, 6 }
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/cycle=\meta{color} (default all)}
+ Connects the nodes colored \meta{color} is a cyclic fashion. The ordering
+ is the ordering in which they appear in the whole graph specification.
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise, n=6, phase=60] {
+ { [cycle, ->] a, b, c },
+ { [cycle, <-] d, e, f }
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/induced cycle=\meta{color} (default all)}
+ While the |cycle| command will only add edges, this key will also remove
+ all other edges between the nodes of the cycle, provided we are
+ constructing a |simple| graph.
+ %
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ subgraph K_n [n=7, clockwise]; % create lots of edges
+
+ { [induced cycle, ->, edge=red] 2, 3, 4, 6, 7 },
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/path=\meta{color} (default all)}
+ Works like |cycle|, only there is no edge from the last to the first
+ vertex.
+ %
+\begin{codeexample}[]
+\tikz \graph [clockwise, n=6] {
+ { [path, ->] a, b, c },
+ { [path, <-] d, e, f }
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/induced path=\meta{color} (default all)}
+ Works like |induced cycle|, only there is no edge from the last to the
+ first vertex.
+ %
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ subgraph K_n [n=7, clockwise]; % create lots of edges
+
+ { [induced path, ->, edges=red] 2, 3, 4, 6, 7 },
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Joining Operators}
+
+The following keys are typically used as options of an \meta{edge
+specification}, but can also be called in a group specification (however, then,
+the colors need to be set explicitly).
+
+\begin{key}{/tikz/graphs/complete bipartite=\meta{from color}\meta{to color} (default \char`\{source'\char`\}\char`\{target'\char`\})}
+ Adds all possible edges from every node having color \meta{from color} to
+ every node having color \meta{to color}:
+ %
+\begin{codeexample}[]
+\tikz \graph { {a, b} ->[complete bipartite]
+ {c, d, e} --[complete bipartite]
+ {g, h, i, j} --[complete bipartite]
+ k };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [color class=red, color class=green, clockwise, n=6] {
+ [complete bipartite={red}{green}, ->]
+ a [red], b[red], c[red], d[green], e[green], f[green]
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/induced complete bipartite}
+ Works like the |complete bipartite| operator, but in a |simple| graph any
+ edges between the vertices in either shore are removed (more precisely,
+ they get replaced by |-!-| edges).
+ %
+\begin{codeexample}[]
+\tikz \graph [simple] {
+ subgraph K_n [n=5, clockwise]; % Lots of edges
+
+ {2, 3} ->[induced complete bipartite] {4, 5}
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/matching=\meta{from color}\meta{to color} (default \char`\{source'\char`\}\char`\{target'\char`\})}
+ This joining operator forms a maximum \emph{matching} between the nodes of
+ the two sets of nodes having colors \meta{from color} and \meta{to color},
+ respectively. The first node of the from set is connected to the first node
+ of to set, the second node of the from set is connected to the second node
+ of the to set, and so on. If the sets have the same size, what results is
+ what graph theoreticians call a \emph{perfect matching}, otherwise only a
+ maximum, but not perfect matching results.
+ %
+\begin{codeexample}[]
+\tikz \graph {
+ {a, b, c} ->[matching]
+ {d, e, f} --[matching]
+ {g, h} --[matching]
+ {i, j, k}
+};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/graphs/matching and star=\meta{from color}\meta{to color} (default \char`\{source'\char`\}\char`\{target'\char`\})}
+ The |matching and star| connector works like the |matching| connector, only
+ it behaves differently when the two to-be-connected sets have different
+ size. In this case, all the surplus nodes get connected to the last node of
+ the other set, resulting in what is known as a \emph{star} in graph theory.
+ This simple rule allows for some powerful effects (since this connector is
+ the one initially set, there is no need to add it here):
+ %
+\begin{codeexample}[]
+\tikz \graph { a -> {b, c} -> {d, e} -- f};
+\end{codeexample}
+ %
+ The |matching and star| connector also makes it easy to create trees and
+ series-parallel graphs.
+\end{key}
+
+\begin{key}{/tikz/graphs/butterfly=\opt{\meta{options}}}
+ The |butterfly| connector is used to create the kind of connections present
+ between layers of a so-called \emph{butterfly network}. As for other
+ connectors, two sets of nodes are connected, which are the nodes having
+ color |target'| and |source'| by default. In a \emph{level $l$} connection,
+ the first $l$ nodes of the first set are connected to the second $l$ nodes
+ of the second set, while the second $l$ nodes of the first set get
+ connected to the first $l$ nodes of the second set. Then, for next $2l$
+ nodes of both sets a similar kind of connection is installed. Additionally,
+ each node gets connected to the corresponding node in the other set with
+ the same index (as in a |matching|):
+ %
+\begin{codeexample}[]
+\tikz \graph [left anchor=east, right anchor=west,
+ branch down=4mm, grow right=15mm] {
+ subgraph I_n [n=12, name=A] --[butterfly={level=3}]
+ subgraph I_n [n=12, name=B] --[butterfly={level=2}]
+ subgraph I_n [n=12, name=C]
+};
+\end{codeexample}
+ %
+ Unlike most joining operators, the colors of the nodes in the first and the
+ second set are not passed as parameters to the |butterfly| key. Rather,
+ they can be set using the \meta{options}, which are executed with the path
+ prefix |/tikz/graphs/butterfly|.
+ %
+ \begin{key}{/tikz/graphs/butterfly/level=\meta{level} (initially 1)}
+ Sets the level $l$ for the connections.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/butterfly/from=\meta{color} (initially target')}
+ Sets the color class of the from nodes.
+ \end{key}
+ %
+ \begin{key}{/tikz/graphs/butterfly/to=\meta{color} (initially source')}
+ Sets the color class of the to nodes.
+ \end{key}
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-matrices.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-matrices.tex
new file mode 100644
index 0000000000..e8c5a77dc9
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-matrices.tex
@@ -0,0 +1,739 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Matrices and Alignment}
+\label{section-matrices}
+
+\subsection{Overview}
+
+When creating pictures, one often faces the problem of correctly aligning parts
+of the picture. For example, you might wish that the |baseline|s of certain
+nodes should be on the same line and some further nodes should be below these
+nodes with, say, their centers on a vertical lines. There are different ways of
+solving such problems. For example, by making clever use of anchors, nearly all
+such alignment problems can be solved. However, this often leads to complicated
+code. An often simpler way is to use \emph{matrices}, the use of which is
+explained in the current section.
+
+A \tikzname\ matrix is similar to \LaTeX's |{tabular}| or |{array}|
+environment, only instead of text each cell contains a little picture or a
+node. The sizes of the cells are automatically adjusted such that they are
+large enough to contain all the cell contents.
+
+Matrices are a powerful tool and they need to be handled with some care. For
+impatient readers who skip the rest of this section: you \emph{must} end
+\emph{every} row with |\\|. In particular, the last row \emph{must} be ended
+with |\\|.
+
+Many of the ideas implemented in \tikzname's matrix support are due to Mark
+Wibrow -- many thanks to Mark at this point!
+
+
+\subsection{Matrices are Nodes}
+
+Matrices are special in many ways, but for most purposes matrices are treated
+like nodes. This means, that you use the |node| path command to create a matrix
+and you only use a special option, namely the |matrix| option, to signal that
+the node will contain a matrix. Instead of the usual \TeX-box that makes up the
+|text| part of the node's shape, the matrix is used. Thus, in particular, a
+matrix can have a shape, this shape can be drawn or filled, it can be used in a
+tree, and so on. Also, you can refer to the different anchors of a matrix.
+
+\begin{key}{/tikz/matrix=\meta{true or false} (default true)}
+ This option can be passed to a |node| path command. It signals that the
+ node will contain a matrix.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (4,2);
+ \node [matrix,fill=red!20,draw=blue,very thick] (my matrix) at (2,1)
+ {
+ \draw (0,0) circle (4mm); & \node[rotate=10] {Hello}; \\
+ \draw (0.2,0) circle (2mm); & \fill[red] (0,0) circle (3mm); \\
+ };
+
+ \draw [very thick,->] (0,0) |- (my matrix.west);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The exact syntax of the matrix is explained in the course of this section.
+ %
+ \begin{stylekey}{/tikz/every matrix (initially \normalfont empty)}
+ This style is used in every matrix.
+ \end{stylekey}
+\end{key}
+
+Even more so than nodes, matrices will often be the only object on a path.
+Because of this, there is a special abbreviation for creating matrices:
+
+\begin{command}{\matrix}
+ Inside |{tikzpicture}| this is an abbreviation for |\path node[matrix]|.
+\end{command}
+
+Even though matrices are nodes, some options do not have the same effect as for
+normal nodes:
+%
+\begin{enumerate}
+ \item Rotations and scaling have no effect on a matrix as a whole (however,
+ you can still transform the contents of the cells normally). Before the
+ matrix is typeset, the rotational and scaling part of the
+ transformation matrix is reset.
+ \item For multi-part shapes you can only set the |text| part of the node.
+ \item All options starting with |text| such as |text width| have no effect.
+\end{enumerate}
+
+
+\subsection{Cell Pictures}
+\label{section-tikz-cell-pictures}
+
+A matrix consists of rows of \emph{cells}. Each row (including the last one!)
+is ended by the command |\\|. The character |&| is used to separate cells.
+Inside each cell, you must place commands for drawing a picture, called the
+\emph{cell picture} in the following. (However, cell pictures are not enclosed
+in a complete |{pgfpicture}| environment, they are a bit more light-weight. The
+main difference is that cell pictures cannot have layers.) It is not necessary
+to specify beforehand how many rows or columns there are going to be and if a
+row contains less cell pictures than another line, empty cells are
+automatically added as needed.
+
+
+\subsubsection{Alignment of Cell Pictures}
+
+For each cell picture a bounding box is computed. These bounding boxes and the
+origins of the cell pictures determine how the cells are aligned. Let us start
+with the rows: Consider the cell pictures on the first row. Each has a bounding
+box and somewhere inside this bounding box the origin of the cell picture can
+be found (the origin might even lie outside the bounding box, but let us ignore
+this problem for the moment). The cell pictures are then shifted around such
+that all origins lie on the same horizontal line. This may make it necessary to
+shift some cell pictures upwards and others downwards, but it can be done and
+this yields the vertical alignment of the cell pictures this row. The top of
+the row is then given by the top of the ``highest'' cell picture in the row,
+the bottom of the row is given by the bottom of the lowest cell picture. (To be
+more precise, the height of the row is the maximum $y$-value of any of the
+bounding boxes and the depth of the row is the negated minimum $y$-value of the
+bounding boxes).
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every node/.style={draw=black,anchor=base,font=\huge}]
+
+ \matrix [draw=red]
+ {
+ \node {a}; \fill[blue] (0,0) circle (2pt); &
+ \node {X}; \fill[blue] (0,0) circle (2pt); &
+ \node {g}; \fill[blue] (0,0) circle (2pt); \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Each row is aligned in this fashion: For each row the cell pictures
+are vertically aligned such that the origins lie on the same
+line. Then the second row is placed below the first row such that the
+bottom of the first row touches the top of the second row (unless a
+|row sep| is used to add a bit of space). Then the bottom of the
+second row touches the top of the third row, and so on. Typically,
+each row will have an individual height and depth.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every node/.style={draw=black,anchor=base}]
+
+ \matrix [draw=red]
+ {
+ \node {a}; & \node {X}; & \node {g}; \\
+ \node {a}; & \node {X}; & \node {g}; \\
+ };
+
+ \matrix [row sep=3mm,draw=red] at (0,-2)
+ {
+ \node {a}; & \node {X}; & \node {g}; \\
+ \node {a}; & \node {X}; & \node {g}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Let us now have a look at the columns. The rules for how the pictures on any
+given column are aligned are very similar to the row alignment: Consider all
+cell pictures in the first column. Each is shifted horizontally such that the
+origins lie on the same vertical line. Then, the left end of the column is at
+the left end of the bounding box that protrudes furthest to the left. The right
+end of the column is at the right end of the bounding box that protrudes
+furthest to the right. This fixes the horizontal alignment of the cell pictures
+in the first column and the same happens the cell pictures in the other
+columns. Then, the right end of the first column touches the left end of the
+second column (unless |column sep| is used). The right end of the second column
+touches the left end of the third column, and so on. (Internally, two columns
+are actually used to achieve the desired horizontal alignment, but that is only
+an implementation detail.)
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw}]
+ \matrix [draw=red]
+ {
+ \node[left] {Hallo}; \fill[blue] (0,0) circle (2pt); \\
+ \node {X}; \fill[blue] (0,0) circle (2pt); \\
+ \node[right] {g}; \fill[blue] (0,0) circle (2pt); \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw}]
+ \matrix [draw=red,column sep=1cm]
+ {
+ \node {8}; & \node{1}; & \node {6}; \\
+ \node {3}; & \node{5}; & \node {7}; \\
+ \node {4}; & \node{9}; & \node {2}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Setting and Adjusting Column and Row Spacing}
+
+There are different ways of setting and adjusting the spacing between columns
+and rows. First, you can use the options |column sep| and |row sep| to set a
+default spacing for all rows and all columns. Second, you can add options to
+the |&| character and the |\\| command to adjust the spacing between two
+specific columns or rows. Additionally, you can specify whether the space
+between two columns or rows should be considered between the origins of cells
+in the column or row or between their borders.
+
+\begin{key}{/tikz/column sep=\meta{spacing list}}
+ This option sets a default space that is added between every two columns.
+ This space can be positive or negative and is zero by default. The
+ \meta{spacing list} normally contains a single dimension like |2pt|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,column sep=1cm,nodes=draw]
+ {
+ \node(a) {123}; & \node (b) {1}; & \node {1}; \\
+ \node {12}; & \node {12}; & \node {1}; \\
+ \node(c) {1}; & \node (d) {123}; & \node {1}; \\
+ };
+ \draw [red,thick] (a.east) -- (a.east |- c)
+ (d.west) -- (d.west |- b);
+ \draw [<->,red,thick] (a.east) -- (d.west |- b)
+ node [above,midway] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ More generally, the \meta{spacing list} may contain a whole list of
+ numbers, separated by commas, and occurrences of the two key words
+ |between origins| and |between borders|. The effect of specifying such a
+ list is the following: First, all numbers occurring in the list are simply
+ added to compute the final spacing. Second, concerning the two keywords,
+ the last occurrence of one of the keywords is important. If the last
+ occurrence is |between borders| or if neither occurs, then the space is
+ inserted between the two columns normally. However, if the last occurs is
+ |between origins|, then the following happens: The distance between the
+ columns is adjusted such that the difference between the origins of all the
+ cells in the first column (remember that they all lie on straight line) and
+ the origins of all the cells in the second column is exactly the given
+ distance.
+
+ \emph{The }|between origins|\emph{ option can only be used for columns
+ mentioned in the first row, that is, you cannot specify this option for
+ columns introduced only in later rows.}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,column sep={1cm,between origins},nodes=draw]
+ {
+ \node(a) {123}; & \node (b) {1}; & \node {1}; \\
+ \node {12}; & \node {12}; & \node {1}; \\
+ \node {1}; & \node {123}; & \node {1}; \\
+ };
+ \draw [<->,red,thick] (a.center) -- (b.center) node [above,midway] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/row sep=\meta{spacing list}}
+ This option works like |column sep|, only for rows. Here, too, you can
+ specify whether the space is added between the lower end of the first row
+ and the upper end of the second row, or whether the space is computed
+ between the origins of the two rows.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,row sep=1cm,nodes=draw]
+ {
+ \node (a) {123}; & \node {1}; & \node {1}; \\
+ \node (b) {12}; & \node {12}; & \node {1}; \\
+ \node {1}; & \node {123}; & \node {1}; \\
+ };
+ \draw [<->,red,thick] (a.south) -- (b.north) node [right,midway] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,row sep={1cm,between origins},nodes=draw]
+ {
+ \node (a) {123}; & \node {1}; & \node {1}; \\
+ \node (b) {12}; & \node {12}; & \node {1}; \\
+ \node {1}; & \node {123}; & \node {1}; \\
+ };
+ \draw [<->,red,thick] (a.center) -- (b.center) node [right,midway] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+The row-end command |\\| allows you to provide an optional argument, which must
+be a dimension. This dimension will be added to the list in |row sep|. This
+means that, firstly, any numbers you list in this argument will be added as an
+extra row separation between the line being ended and the next line and,
+secondly, you can use the keywords |between origins| and |between borders| to
+locally overrule the standard setting for this line pair.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [row sep=1mm]
+ {
+ \draw (0,0) circle (2mm); & \draw (0,0) circle (2mm); \\
+ \draw (0,0) circle (2mm); & \draw (0,0) circle (2mm); \\[-1mm]
+ \draw (0,0) coordinate (a) circle (2mm); &
+ \draw (0,0) circle (2mm); \\[1cm,between origins]
+ \draw (0,0) coordinate (b) circle (2mm); &
+ \draw (0,0) circle (2mm); \\
+ };
+ \draw [<->,red,thick] (a.center) -- (b.center) node [right,midway] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+
+The cell separation character |&| also takes an optional argument, which must
+also be a spacing list. This spacing list is added to the |column sep| having a
+similar effect as the option for the |\\| command for rows.
+
+This optional spacing list can only be given the first time a new column is
+started (usually in the first row), subsequent usages of this option in later
+rows have no effect.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,nodes=draw,column sep=1mm]
+ {
+ \node {8}; &[2mm] \node{1}; &[-1mm] \node {6}; \\
+ \node {3}; & \node{5}; & \node {7}; \\
+ \node {4}; & \node{9}; & \node {2}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,nodes=draw,column sep=1mm]
+ {
+ \node {8}; &[2mm] \node(a){1}; &[1cm,between origins] \node(b){6}; \\
+ \node {3}; & \node {5}; & \node {7}; \\
+ \node {4}; & \node {9}; & \node {2}; \\
+ };
+ \draw [<->,red,thick] (a.center) -- (b.center) node [above,midway] {11mm};
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [draw,nodes=draw,column sep={1cm,between origins}]
+ {
+ \node (a) {8}; & \node (b) {1}; &[between borders] \node (c) {6}; \\
+ \node {3}; & \node {5}; & \node {7}; \\
+ \node {4}; & \node {9}; & \node {2}; \\
+ };
+ \draw [<->,red,thick] (a.center) -- (b.center) node [above,midway] {10mm};
+ \draw [<->,red,thick] (b.east) -- (c.west) node [above,midway] {10mm};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Cell Styles and Options}
+
+The following styles and options are useful for changing the appearance of all
+cell pictures:
+
+\begin{stylekey}{/tikz/every cell=\marg{row}\marg{column} (initially \normalfont empty)}
+ This style is installed at the beginning of each cell picture with the two
+ parameters being the current \meta{row} and \meta{column} of the cell. Note
+ that setting this style to |draw| will \emph{not} cause all nodes to be
+ drawn since the |draw| option has to be passed to each node individually.
+
+ Inside this style (and inside all cells), the current \meta{row} and
+ \meta{column} number are also accessible via the counters
+ |\pgfmatrixcurrentrow| and |\pgfmatrixcurrentcolumn|.
+\end{stylekey}
+
+\begin{key}{/tikz/cells=\meta{options}}
+ This key adds the \meta{options} to the style |every cell|. It is mainly
+ just a shorthand for the code |every cell/.append style=|\meta{options}.
+\end{key}
+
+\begin{key}{/tikz/nodes=\meta{options}}
+ This key adds the \meta{options} to the style |every node|. It is mainly
+ just a shorthand for the code |every node/.append style=|\meta{options}.
+
+ The main use of this option is the install some options for the nodes
+ \emph{inside} the matrix that should not apply to the matrix \emph{itself}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [nodes={fill=blue!20,minimum size=5mm}]
+ {
+ \node {8}; & \node{1}; & \node {6}; \\
+ \node {3}; & \node{5}; & \node {7}; \\
+ \node {4}; & \node{9}; & \node {2}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+The next set of styles can be used to change the appearance of certain rows,
+columns, or cells. If more than one of these styles is defined, they are
+executed in the below order (the |every cell| style is executed before all of
+the below).
+ %
+\begin{stylekey}{/tikz/column \meta{number}}
+ This style is used for every cell in column \meta{number}.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every odd column}
+ This style is used for every cell in an odd column.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every even column}
+ This style is used for every cell in an even column.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/row \meta{number}}
+ This style is used for every cell in row \meta{number}.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every odd row}
+ This style is used for every cell in an odd row.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every even row}
+ This style is used for every cell in an even row.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/row \meta{row number} column \meta{column number}}
+ This style is used for the cell in row \meta{row number} and column
+ \meta{column number}.
+\end{stylekey}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [row 1/.style={red},
+ column 2/.style={green!50!black},
+ row 3 column 3/.style={blue}]
+
+ \matrix
+ {
+ \node {8}; & \node{1}; & \node {6}; \\
+ \node {3}; & \node{5}; & \node {7}; \\
+ \node {4}; & \node{9}; & \node {2}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+You can use the |column |\meta{number} option to change the alignment for
+different columns.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [column 1/.style={anchor=base west},
+ column 2/.style={anchor=base east},
+ column 3/.style={anchor=base}]
+ \matrix
+ {
+ \node {123}; & \node{456}; & \node {789}; \\
+ \node {12}; & \node{45}; & \node {78}; \\
+ \node {1}; & \node{4}; & \node {7}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+In many matrices all cell pictures have nearly the same code. For example,
+cells typically start with |\node{| and end |};|. The following options allow
+you to execute such code in all cells:
+
+\begin{key}{/tikz/execute at begin cell=\meta{code}}
+ The code will be executed at the beginning of each nonempty cell.
+\end{key}
+%
+\begin{key}{/tikz/execute at end cell=\meta{code}}
+ The code will be executed at the end of each nonempty cell.
+\end{key}
+%
+\begin{key}{/tikz/execute at empty cell=\meta{code}}
+ The code will be executed inside each empty cell.
+\end{key}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [matrix of nodes/.style={
+ execute at begin cell=\node\bgroup,
+ execute at end cell=\egroup;%
+ }]
+ \matrix [matrix of nodes]
+ {
+ 8 & 1 & 6 \\
+ 3 & 5 & 7 \\
+ 4 & 9 & 2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [matrix of nodes/.style={
+ execute at begin cell=\node\bgroup,
+ execute at end cell=\egroup;,%
+ execute at empty cell=\node{--};%
+ }]
+ \matrix [matrix of nodes]
+ {
+ 8 & 1 & \\
+ 3 & & 7 \\
+ & & 2 \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+The |matrix| library defines a number of styles that make use of the above
+options.
+
+
+\subsection{Anchoring a Matrix}
+
+Since matrices are nodes, they can be anchored in the usual fashion using the
+|anchor| option. However, there are two ways to influence this placement
+further. First, the following option is often useful:
+
+\begin{key}{/tikz/matrix anchor=\meta{anchor}}
+ This option has the same effect as |anchor|, but the option applies only to
+ the matrix itself, not to the cells inside. If you just say |anchor=north|
+ as an option to the matrix node, all nodes inside matrix will also have
+ this anchor, unless it is explicitly set differently for each node. By
+ comparison, |matrix anchor| sets the anchor for the matrix, but for the
+ nodes inside the value of |anchor| remain unchanged.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix anchor=west] at (0,0)
+ {
+ \node {123}; \\ % still center anchor
+ \node {12}; \\
+ \node {1}; \\
+ };
+ \matrix [anchor=west] at (0,-2)
+ {
+ \node {123}; \\ % inherited west anchor
+ \node {12}; \\
+ \node {1}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+The second way to anchor a matrix is to use \emph{an anchor of a node inside
+the matrix}. For this, the |anchor| option has a special effect when given as
+an argument to a matrix:
+
+\begin{key}{/tikz/anchor=\meta{anchor or node.anchor}}
+ Normally, the argument of this option refers to anchor of the matrix node,
+ which is the node that includes all of the stuff of the matrix. However,
+ you can also provide an argument of the form \meta{node}|.|\meta{anchor}
+ where \meta{node} must be node defined inside the matrix and \meta{anchor}
+ is an anchor of this node. In this case, the whole matrix is shifted around
+ in such a way that this particular anchor of this particular node lies at
+ the |at| position of the matrix. The same is true for |matrix anchor|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \matrix[matrix anchor=inner node.south,anchor=base,row sep=3mm] at (1,1)
+ {
+ \node {a}; & \node {b}; & \node {c}; & \node {d}; \\
+ \node {a}; & \node(inner node) {b}; & \node {c}; & \node {d}; \\
+ \node {a}; & \node {b}; & \node {c}; & \node {d}; \\
+ };
+ \draw (inner node.south) circle (1pt);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Considerations Concerning Active Characters}
+
+Even though \tikzname\ seems to use |&| to separate cells, \pgfname\ actually
+uses a different command to separate cells, namely the command
+|\pgfmatrixnextcell| and using a normal |&| character will normally fail. What
+happens is that, \tikzname\ makes |&| an active character and then defines this
+character to be equal to |\pgfmatrixnextcell|. In most situations this will
+work nicely, but sometimes |&| cannot be made active; for instance because the
+matrix is used in an argument of some macro or the matrix contains nodes that
+contain normal |{tabular}| environments. In this case you can use the following
+option to avoid having to type |\pgfmatrixnextcell| each time:
+
+\begin{key}{/tikz/ampersand replacement=\meta{macro name or empty}}
+ If a macro name is provided, this macro will be defined to be equal to
+ |\pgfmatrixnextcell| inside matrices and |&| will not be made active. For
+ instance, you could say |ampersand replacement=\&| and then use |\&| to
+ separate columns as in the following example:
+ %
+\begin{codeexample}[]
+\tikz
+ \matrix [ampersand replacement=\&]
+ {
+ \draw (0,0) circle (4mm); \& \node[rotate=10] {Hello}; \\
+ \draw (0.2,0) circle (2mm); \& \fill[red] (0,0) circle (3mm); \\
+ };
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Examples}
+
+The following examples are adapted from code by Mark Wibrow. The first two
+redraw pictures from Timothy van Zandt's PStricks documentation:
+%
+{\catcode`\|=12
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [matrix of math nodes,row sep=1cm]
+ {
+ |(U)| U &[2mm] &[8mm] \\
+ & |(XZY)| X \times_Z Y & |(X)| X \\
+ & |(Y)| Y & |(Z)| Z \\
+ };
+ \begin{scope}[every node/.style={midway,auto,font=\scriptsize}]
+ \draw [double, dashed] (U) -- node {$x$} (X);
+ \draw (X) -- node {$p$} (X -| XZY.east)
+ (X) -- node {$f$} (Z)
+ -- node {$g$} (Y)
+ -- node {$q$} (XZY)
+ -- node {$y$} (U);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth,->,shorten >=2pt,looseness=.5,auto]
+ \matrix [matrix of math nodes,
+ column sep={2cm,between origins},
+ row sep={3cm,between origins},
+ nodes={circle, draw, minimum size=7.5mm}]
+ {
+ & |(A)| A & \\
+ |(B)| B & |(E)| E & |(C)| C \\
+ & |(D)| D \\
+ };
+ \begin{scope}[every node/.style={font=\small\itshape}]
+ \draw (A) to [bend left] node [midway] {g} (B);
+ \draw (B) to [bend left] node [midway] {f} (A);
+ \draw (D) -- node [midway] {c} (B);
+ \draw (E) -- node [midway] {b} (B);
+ \draw (E) -- node [near end] {a} (C);
+ \draw [-,line width=8pt,draw=graphicbackground]
+ (D) to [bend right, looseness=1] (A);
+ \draw (D) to [bend right, looseness=1]
+ node [near start] {b} node [near end] {e} (A);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix (network)
+ [matrix of nodes,%
+ nodes in empty cells,
+ nodes={outer sep=0pt,circle,minimum size=4pt,draw},
+ column sep={1cm,between origins},
+ row sep={1cm,between origins}]
+ {
+ & & & \\
+ & & & \\
+ |[draw=none]| & |[xshift=1mm]| & |[xshift=-1mm]| \\
+ };
+ \foreach \a in {1,...,4}{
+ \draw (network-3-2) -- (network-2-\a);
+ \draw (network-3-3) -- (network-2-\a);
+ \draw [-stealth] ([yshift=5mm]network-1-\a.north) -- (network-1-\a);
+ \foreach \b in {1,...,4}
+ \draw (network-1-\a) -- (network-2-\b);
+ }
+ \draw [stealth-] ([yshift=-5mm]network-3-2.south) -- (network-3-2);
+ \draw [stealth-] ([yshift=-5mm]network-3-3.south) -- (network-3-3);
+\end{tikzpicture}
+\end{codeexample}
+
+The following example is adapted from code written by Kjell Magne Fauske, which
+is based on the following paper: K.~Bossley, M.~Brown, and C.~Harris,
+Neurofuzzy identification of an autonomous underwater vehicle,
+\emph{International Journal of Systems Science}, 1999, 30, 901--913.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [auto,
+ decision/.style={diamond, draw=blue, thick, fill=blue!20,
+ text width=4.5em,align=flush center,
+ inner sep=1pt},
+ block/.style ={rectangle, draw=blue, thick, fill=blue!20,
+ text width=5em,align=center, rounded corners,
+ minimum height=4em},
+ line/.style ={draw, thick, -latex',shorten >=2pt},
+ cloud/.style ={draw=red, thick, ellipse,fill=red!20,
+ minimum height=2em}]
+
+ \matrix [column sep=5mm,row sep=7mm]
+ {
+ % row 1
+ \node [cloud] (expert) {expert}; &
+ \node [block] (init) {initialize model}; &
+ \node [cloud] (system) {system}; \\
+ % row 2
+ & \node [block] (identify) {identify candidate model}; & \\
+ % row 3
+ \node [block] (update) {update model}; &
+ \node [block] (evaluate) {evaluate candidate models}; & \\
+ % row 4
+ & \node [decision] (decide) {is best candidate}; & \\
+ % row 5
+ & \node [block] (stop) {stop}; & \\
+ };
+ \begin{scope}[every path/.style=line]
+ \path (init) -- (identify);
+ \path (identify) -- (evaluate);
+ \path (evaluate) -- (decide);
+ \path (update) |- (identify);
+ \path (decide) -| node [near start] {yes} (update);
+ \path (decide) -- node [midway] {no} (stop);
+ \path [dashed] (expert) -- (init);
+ \path [dashed] (system) -- (init);
+ \path [dashed] (system) |- (evaluate);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-paths.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-paths.tex
new file mode 100644
index 0000000000..ac0d0080b6
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-paths.tex
@@ -0,0 +1,1419 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Syntax for Path Specifications}
+\label{section-paths}
+
+A \emph{path} is a series of straight and curved line segments. It is specified
+following a |\path| command and the specification must follow a special syntax,
+which is described in the subsections of the present section.
+
+\begin{command}{\path\meta{specification}|;|}
+ This command is available only inside a |{tikzpicture}| environment.
+
+ The \meta{specification} is a long stream of \emph{path operations}. Most
+ of these path operations tell \tikzname\ how the path is built. For
+ example, when you write |--(0,0)|, you use a \emph{line-to operation} and
+ it means ``continue the path from wherever you are to the origin''.
+
+ At any point where \tikzname\ expects a path operation, you can also give
+ some graphic options, which is a list of options in brackets, such as
+ |[rounded corners]|. These options can have different effects:
+ %
+ \begin{enumerate}
+ \item Some options take ``immediate'' effect and apply to all
+ subsequent path operations on the path. For example, the
+ |rounded corners| option will round all following corners, but not
+ the corners ``before'' and if the |sharp corners| is given later on
+ the path (in a new set of brackets), the rounding effect will end.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (1,1)
+ [rounded corners] -- (2,0) -- (3,1)
+ [sharp corners] -- (3,0) -- (2,1);
+\end{codeexample}
+ %
+ Another example are the transformation options, which also apply
+ only to subsequent coordinates.
+ \item The options that have immediate effect can be ``scoped'' by
+ putting part of a path in curly braces. For example, the above
+ example could also be written as follows:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (1,1)
+ {[rounded corners] -- (2,0) -- (3,1)}
+ -- (3,0) -- (2,1);
+\end{codeexample}
+ %
+ \item Some options only apply to the path as a whole. For example,
+ the |color=| option for determining the color used for, say,
+ drawing the path always applies to all parts of the path. If
+ several different colors are given for different parts of the
+ path, only the last one (on the outermost scope) ``wins'':
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (1,1)
+ [color=red] -- (2,0) -- (3,1)
+ [color=blue] -- (3,0) -- (2,1);
+\end{codeexample}
+
+ Most options are of this type. In the above example, we would
+ have had to ``split up'' the path into several |\path| commands:
+ %
+\begin{codeexample}[]
+\tikz{\draw (0,0) -- (1,1);
+ \draw [color=red] (2,0) -- (3,1);
+ \draw [color=blue] (3,0) -- (2,1);}
+\end{codeexample}
+ \end{enumerate}
+
+ By default, the |\path| command does ``nothing'' with the path, it just
+ ``throws it away''. Thus, if you write |\path(0,0)--(1,1);|, nothing is
+ drawn in your picture. The only effect is that the area occupied by the
+ picture is (possibly) enlarged so that the path fits inside the area. To
+ actually ``do'' something with the path, an option like |draw| or |fill|
+ must be given somewhere on the path. Commands like |\draw| do this
+ implicitly.
+
+ Finally, it is also possible to give \emph{node specifications} on a path.
+ Such specifications can come at different locations, but they are always
+ allowed when a normal path operation could follow. A node specification
+ starts with |node|. Basically, the effect is to typeset the node's text as
+ normal \TeX\ text and to place it at the ``current location'' on the path.
+ The details are explained in Section~\ref{section-nodes}.
+
+ Note, however, that the nodes are \emph{not} part of the path in any way.
+ Rather, after everything has been done with the path what is specified by
+ the path options (like filling and drawing the path due to a |fill| and a
+ |draw| option somewhere in the \meta{specification}), the nodes are added
+ in a post-processing step.
+
+ \begin{key}{/tikz/name=\meta{path name}}
+ Assigns a name to the path for reference (specifically, for reference
+ in animations; for reference in intersections, use the |name path|
+ command, which has a different purpose, see the |intersections| library
+ for details). Since the name is a ``high-level'' name (drivers never
+ know of it), you can use spaces, number, letters, or whatever you like
+ when naming a path, but the name may \emph{not} contain any punctuation
+ like a dot, a comma, or a colon.
+ \end{key}
+
+ The following style influences scopes:
+ %
+ \begin{stylekey}{/tikz/every path (initially \normalfont empty)}
+ This style is installed at the beginning of every path. This can be
+ useful for (temporarily) adding, say, the |draw| option to everything
+ in a scope.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [fill=yellow!80!black, % only sets the color
+ every path/.style={draw}] % all paths are drawn
+ \fill (0,0) rectangle +(1,1);
+ \shade (2,0) rectangle +(1,1);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{command}
+
+\begin{key}{/tikz/insert path=\meta{path}}
+ This key can be used inside an option to add something to the current path.
+ This is mostly useful for defining styles that create graphic contents.
+ This option should be used with care, for instance it should not be used as
+ an argument of, say, a |node|. In the following example, we use a style to
+ add little circles to a path.
+ %
+\begin{codeexample}[]
+\tikz [c/.style={insert path={circle[radius=2pt]}}]
+ \draw (0,0) -- (1,1) [c] -- (3,2) [c];
+\end{codeexample}
+ %
+ The effect is the same as of
+ |(0,0) -- (1,1) circle[radius=2pt] -- (3,2) circle[radius=2pt]|.
+\end{key}
+
+The following options are for experts only:
+
+\begin{key}{/tikz/append after command=\meta{path}}
+ Some of the path commands described in the following sections take optional
+ arguments. For these commands, when you use this key inside these options,
+ the \meta{path} will be inserted \emph{after} the path command is done. For
+ instance, when you give this command in the option list of a node, the
+ \meta{path} will be added after the node. This is used by, for instance,
+ the |label| option to allow you to specify a label in the option list of a
+ node, but have this |label| cause a node to be added after another node.
+ %
+\begin{codeexample}[]
+\tikz \draw node [append after command={(foo)--(1,1)},draw] (foo){foo};
+\end{codeexample}
+ %
+ If this key is called multiple times, the effects accumulate, that is, all
+ of the paths are added in the order to keys were found.
+\end{key}
+
+\begin{key}{/tikz/prefix after command=\meta{path}}
+ Works like |append after command|, only the accumulation order is inverse:
+ The \meta{path} is added before any earlier paths added using either
+ |append after command| or |prefix after command|.
+\end{key}
+
+
+\subsection{The Move-To Operation}
+
+The perhaps simplest operation is the move-to operation, which is specified by
+just giving a coordinate where a path operation is expected.
+
+\begin{pathoperation}[noindex]{}{\meta{coordinate}}
+ \index{empty@\protect\meta{empty} path operation}%
+ \index{Path operations!empty@\protect\texttt{\meta{empty}}}%
+ The move-to operation normally starts a path at a certain point. This does
+ not cause a line segment to be created, but it specifies the starting point
+ of the next segment. If a path is already under construction, that is, if
+ several segments have already been created, a move-to operation will start
+ a new part of the path that is not connected to any of the previous
+ segments.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) --(2,0) (0,1) --(2,1);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the specification |(0,0) --(2,0) (0,1) --(2,1)| two move-to operations
+ are specified: |(0,0)| and |(0,1)|. The other two operations, namely
+ |--(2,0)| and |--(2,1)| are line-to operations, described next.
+\end{pathoperation}
+
+There is special coordinate called |current subpath start| that is always at
+the position of the last move-to operation on the current path.
+%
+\begin{codeexample}[]
+\tikz [line width=2mm]
+ \draw (0,0) -- (1,0) -- (1,1)
+ -- (0,1) -- (current subpath start);
+\end{codeexample}
+
+Note how in the above example the path is not closed (as |--cycle| would do).
+Rather, the line just starts and ends at the origin without being a closed
+path.
+
+
+\subsection{The Line-To Operation}
+
+\subsubsection{Straight Lines}
+
+\begin{pathoperation}{--}{\meta{coordinate or cycle}}
+ The line-to operation extends the current path from the current point in a
+ straight line to the given \meta{coordinate} (the ``or cycle'' part is
+ explained in a moment). The ``current point'' is the endpoint of the
+ previous drawing operation or the point specified by a prior move-to
+ operation.
+
+ When a line-to operation is used and some path segment has just been
+ constructed, for example by another line-to operation, the two line
+ segments become joined. This means that if they are drawn, the point where
+ they meet is ``joined'' smoothly. To appreciate the difference, consider
+ the following two examples: In the left example, the path consists of two
+ path segments that are not joined, but they happen to share a point, while
+ in the right example a smooth join is shown.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=10pt]
+ \draw (0,0) --(1,1) (1,1) --(2,0);
+ \draw (3,0) -- (4,1) -- (5,0);
+ \useasboundingbox (0,1.5); % make bounding box higher
+\end{tikzpicture}
+\end{codeexample}
+
+ Instead of a coordinate following the two minus signs, you can also use the
+ text |cycle|. This causes the straight line from the current point to go to
+ the last point specified by a move-to operation. Note that this need not be
+ the beginning of the path. Furthermore, a smooth join is created between
+ the first segment created after the last move-to operation and the straight
+ line appended by the cycle operation.
+
+ Consider the following example. In the left example, two triangles are
+ created using three straight lines, but they are not joined at the ends. In
+ the second example cycle operations are used.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=10pt]
+ \draw (0,0) -- (1,1) -- (1,0) -- (0,0) (2,0) -- (3,1) -- (3,0) -- (2,0);
+ \draw (5,0) -- (6,1) -- (6,0) -- cycle (7,0) -- (8,1) -- (8,0) -- cycle;
+ \useasboundingbox (0,1.5); % make bounding box higher
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+Writing |cycle| instead of a coordinate at the end of a path operation is
+possible with all path operations that end with a coordinate (such as |--| or
+|..| or |sin| or |grid|, but not |graph| or |plot|). In all cases, the effect
+is that the coordinate of the last moveto is used as the coordinate expected by
+the path operation and that a smooth join is added. (What actually happens that
+the text |cycle| used with any path operation other than |--| gets replaced by
+|(current subpath start)--cycle|.)
+
+
+\subsubsection{Horizontal and Vertical Lines}
+
+Sometimes you want to connect two points via straight lines that are only
+horizontal and vertical. For this, you can use two path construction
+operations.
+
+{\catcode`\|=12
+\begin{pathoperation}[noindex]{-|}{\meta{coordinate or cycle}}
+ \index{--1@\protect\texttt{-\protect\pgfmanualbar} path operation}%
+ \index{Path operations!--1@\protect\texttt{-\protect\pgfmanualbar}}%
+ \pgfmanualpdflabel[\catcode`\|=12 ]{-|}{}%
+ This operation means ``first horizontal, then vertical''.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) node(a) [draw] {A} (1,1) node(b) [draw] {B};
+ \draw (a.north) |- (b.west);
+ \draw[color=red] (a.east) -| (2,1.5) -| (b.north);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Instead of a coordinate you can also write \verb!cycle! to close the path:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[ultra thick]
+ \draw (0,0) -- (1,1) -| cycle;
+\end{tikzpicture}
+\end{codeexample}
+\end{pathoperation}
+
+\begin{pathoperation}[noindex]{|-}{\meta{coordinate or cycle}}
+ \index{--2@\protect\texttt{\protect\pgfmanualbar-} path operation}%
+ \index{Path operations!--2@\protect\texttt{\protect\pgfmanualbar-}}%
+ \pgfmanualpdflabel[\catcode`\|=12 ]{|-}{}%
+ This operations means ``first vertical, then horizontal''.
+\end{pathoperation}
+}
+
+
+\subsection{The Curve-To Operation}
+
+The curve-to operation allows you to extend a path using a Bézier curve.
+
+\begin{pathoperation}{..}{\declare{|controls|}\meta{c}\opt{|and|\meta{d}}\declare{|..|\meta{y or cycle}}}
+ This operation extends the current path from the current point, let us call
+ it $x$, via a curve to a point~$y$ (if, instead of a coordinate you say
+ |cycle| at the end, $y$ will be the coordinate of the last move-to
+ operation). The curve is a cubic Bézier curve. For such a curve, apart
+ from $y$, you also specify two control points $c$ and $d$. The idea is that
+ the curve starts at $x$, ``heading'' in the direction of~$c$.
+ Mathematically spoken, the tangent of the curve at $x$ goes through $c$.
+ Similarly, the curve ends at $y$, ``coming from'' the other control
+ point,~$d$. The larger the distance between $x$ and~$c$ and between $d$
+ and~$y$, the larger the curve will be.
+
+ If the ``|and|\meta{d}'' part is not given, $d$ is assumed to be equal to
+ $c$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[line width=10pt] (0,0) .. controls (1,1) .. (4,0)
+ .. controls (5,0) and (5,1) .. (4,1);
+ \draw[color=gray] (0,0) -- (1,1) -- (4,0) -- (5,0) -- (5,1) -- (4,1);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[line width=10pt] (0,0) -- (2,0) .. controls (1,1) .. cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+ As with the line-to operation, it makes a difference whether two curves are
+ joined because they resulted from consecutive curve-to or line-to
+ operations, or whether they just happen to have a common (end) point:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=10pt]
+ \draw (0,0) -- (1,1) (1,1) .. controls (1,0) and (2,0) .. (2,0);
+ \draw [yshift=-1.5cm]
+ (0,0) -- (1,1) .. controls (1,0) and (2,0) .. (2,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+
+\subsection{The Rectangle Operation}
+
+A rectangle can obviously be created using four straight lines and a cycle
+operation. However, since rectangles are needed so often, a special syntax is
+available for them.
+
+\begin{pathoperation}{rectangle}{\meta{corner or cycle}}
+ When this operation is used, one corner will be the current point, another
+ corner is given by \meta{corner}, which becomes the new current point.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) rectangle (1,1);
+ \draw (.5,1) rectangle (2,0.5) (3,0) rectangle (3.5,1.5) -- (2,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ Just for consistency, you can also use |cycle| instead of a coordinate, but
+ it is a bit unclear what use this might have.
+\end{pathoperation}
+
+
+\subsection{Rounding Corners}
+
+All of the path construction operations mentioned up to now are influenced by
+the following option:
+
+\begin{key}{/tikz/rounded corners=\meta{inset} (default 4pt)}
+ When this option is in force, all corners (places where a line is continued
+ either via line-to or a curve-to operation) are replaced by little arcs so
+ that the corner becomes smooth.
+ %
+\begin{codeexample}[]
+\tikz \draw [rounded corners] (0,0) -- (1,1)
+ -- (2,0) .. controls (3,1) .. (4,0);
+\end{codeexample}
+
+ The \meta{inset} describes how big the corner is. Note that the
+ \meta{inset} is \emph{not} scaled along if you use a scaling option like
+ |scale=2|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[color=gray,very thin] (10pt,15pt) circle[radius=10pt];
+ \draw[rounded corners=10pt] (0,0) -- (0pt,25pt) -- (40pt,25pt);
+\end{tikzpicture}
+\end{codeexample}
+
+ You can switch the rounded corners on and off ``in the middle of path'' and
+ different corners in the same path can have different corner radii:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) [rounded corners=10pt] -- (1,1) -- (2,1)
+ [sharp corners] -- (2,0)
+ [rounded corners=5pt] -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+ Here is a rectangle with rounded corners:
+ %
+\begin{codeexample}[]
+\tikz \draw[rounded corners=1ex] (0,0) rectangle (20pt,2ex);
+\end{codeexample}
+
+ You should be aware, that there are several pitfalls when using this
+ option. First, the rounded corner will only be an arc (part of a circle) if
+ the angle is $90^\circ$. In other cases, the rounded corner will still be
+ round, but ``not as nice''.
+
+ Second, if there are very short line segments in a path, the ``rounding''
+ may cause inadvertent effects. In such case it may be necessary to
+ temporarily switch off the rounding using |sharp corners|.
+\end{key}
+
+\begin{key}{/tikz/sharp corners}
+ This options switches off any rounding on subsequent corners of the path.
+\end{key}
+
+
+\subsection{The Circle and Ellipse Operations}
+
+Circles and ellipses are common path elements for which there is a special path
+operation.
+
+\begin{pathoperation}{circle}{\opt{|[|\meta{options}|]|}}
+ This command adds a circle to the current path where the center of the
+ circle is the current point by default, but you can use the |at| option to
+ change this. The new current point of the path will be (typically just
+ remain) the center of the circle.
+
+ The radius of the circle is specified using the following options:
+ %
+ \begin{key}{/tikz/x radius=\meta{value}}
+ Sets the horizontal radius of the circle (which, when this value is
+ different form the vertical radius, is actually an ellipse). The
+ \meta{value} may either be a dimension or a dimensionless number. In
+ the latter case, the number is interpreted in the $xy$-coordinate
+ system (if the $x$-unit is set to, say, |2cm|, then |x radius=3| will
+ have the same effect as |x radius=6cm|).
+ \end{key}
+ %
+ \begin{key}{/tikz/y radius=\meta{value}}
+ Works like the |x radius|.
+ \end{key}
+ %
+ \begin{key}{/tikz/radius=\meta{value}}
+ Sets the |x radius| and |y radius| simultaneously.
+ \end{key}
+ %
+ \begin{key}{/tikz/at=\meta{coordinate}}
+ If this option is explicitly set inside the \meta{options} (or
+ indirectly via the |every circle| style), the \meta{coordinate} is used
+ as the center of the circle instead of the current point. Setting |at|
+ to some value in an enclosing scope has no effect.
+ \end{key}
+ The \meta{options} may also contain additional options like, say, a
+ |rotate| or |scale|, that will only have an effect on the circle.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (1,0) circle [radius=1.5];
+ \fill (1,0) circle [x radius=1cm, y radius=5mm, rotate=30];
+\end{tikzpicture}
+\end{codeexample}
+
+ It is possible to set the |radius| also in some enclosing scope, in this
+ case the options can be left out (but see the note below on what may
+ follow):
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[radius=2pt]
+ \draw (0,0) circle -- (1,1) circle -- ++(0,1) circle;
+\end{tikzpicture}
+\end{codeexample}
+
+ The following style is used with every circle:
+ %
+ \begin{stylekey}{/tikz/every circle}
+ You can use this key to set up, say, a default radius for every circle.
+ The key will also be used with the |ellipse| operation.
+ \end{stylekey}
+
+ In case you feel that the names |radius| and |x radius| are too long for
+ your taste, you can easily created shorter aliases:
+ %
+\begin{codeexample}[code only]
+\tikzset{r/.style={radius=#1},rx/.style={x radius=#1},ry/.style={y radius=#1}}
+\end{codeexample}
+ %
+ You can then say |circle [r=1cm]| or |circle [rx=1,ry=1.5]|. The reason
+ \tikzname\ uses the longer names by default is that it encourages people to
+ write more readable code.
+
+ \emph{Note:} There also exists an older syntax for circles, where the
+ radius of the circle is given in parentheses right after the |circle|
+ command as in |circle (1pt)|. Although this syntax is a bit more succinct,
+ it is harder to understand for readers of the code and the use of
+ parentheses for something other than a coordinate is ill-chosen.
+
+ \tikzname\ will use the following rule to determine whether the old or the
+ normal syntax is used: If |circle| is directly followed by something that
+ (expands to) an opening parenthesis, then the old syntax is used and inside
+ these following parentheses there must be a single number or dimension
+ representing a radius. In all other cases the new syntax is used.
+\end{pathoperation}
+
+\begin{pathoperation}{ellipse}{|[|\meta{options}|]|}
+ This command has exactly the same effect as |circle|. The older syntax for
+ this command is |ellipse (|\meta{x radius} |and| \meta{y radius}|)|. As for
+ the |circle| command, this syntax is not as good as the standard syntax.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \draw (1,1) ellipse [x radius=1cm,y radius=.5cm];
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+
+\subsection{The Arc Operation}
+
+The \emph{arc operation} allows you to add an arc to the current path.
+%
+\begin{pathoperation}{arc}{\oarg{options}}
+ The |arc| operation adds a part of an ellipse to the current path. The
+ radii of the ellipse are given by the values of |x radius| and |y radius|,
+ which should be set in the \meta{options}. The arc will start at the
+ current point and will end at the end of the arc. The arc will start and
+ end at angles computed from the three keys |start angle|, |end angle|, and
+ |delta angle|. Normally, the first two keys specify the start and end
+ angle. However, in case one of them is empty, it is computed from the other
+ key plus or minus the |delta angle|. In detail, if |end angle| is empty, it
+ is set to the start angle plus the delta angle. If the start angle is
+ missing, it is set to the end angle minus the delta angle. If all three
+ keys are set, the delta angle is ignored.
+ %
+ \begin{key}{/tikz/start angle=\meta{degrees}}
+ Sets the start angle.
+ \end{key}
+ %
+ \begin{key}{/tikz/end angle=\meta{degrees}}
+ Sets the end angle.
+ \end{key}
+ %
+ \begin{key}{/tikz/delta angle=\meta{degrees}}
+ Sets the delta angle.
+ \end{key}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[radius=1cm]
+ \draw (0,0) arc[start angle=180, end angle=90]
+ -- (2,.5) arc[start angle=90, delta angle=-90];
+ \draw (4,0) -- +(30:1cm)
+ arc [start angle=30, delta angle=30] -- cycle;
+ \draw (8,0) arc [start angle=0, end angle=270,
+ x radius=1cm, y radius=5mm] -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[radius=1cm,delta angle=30]
+ \draw (-1,0) -- +(3.5,0);
+ \draw (1,0) ++(210:2cm) -- +(30:4cm);
+ \draw (1,0) +(0:1cm) arc [start angle=0];
+ \draw (1,0) +(180:1cm) arc [start angle=180];
+ \path (1,0) ++(15:.75cm) node{$\alpha$};
+ \path (1,0) ++(15:-.75cm) node{$\beta$};
+\end{tikzpicture}
+\end{codeexample}
+
+ There also exists a shorter syntax for the arc operation, namely |arc|
+ begin directly followed by
+ |(|\meta{start angle}|:|\meta{end angle}|:|\meta{radius}). However, this
+ syntax is harder to read, so the normal syntax should be preferred in
+ general.
+\end{pathoperation}
+
+
+\subsection{The Grid Operation}
+
+You can add a grid to the current path using the |grid| path operation.
+
+\begin{pathoperation}{grid}{\opt{\oarg{options}}\meta{corner or cycle}}
+ This operations adds a grid filling a rectangle whose two corners are given
+ by \meta{corner} and by the previous coordinate. (Instead of a coordinate
+ you can also say |cycle| to use the position of the last move-to as the
+ corner coordinate, but it not very natural to do so.) corner Thus, the
+ typical way in which a grid is drawn is |\draw (1,1) grid (3,3);|, which
+ yields a grid filling the rectangle whose corners are at $(1,1)$ and
+ $(3,3)$. All coordinate transformations apply to the grid.
+ %
+\begin{codeexample}[]
+\tikz[rotate=30] \draw[step=1mm] (0,0) grid (2,2);
+\end{codeexample}
+
+ The \meta{options}, which are local to the |grid| operation, can be used to
+ influence the appearance of the grid. The stepping of the grid is governed
+ by the following options:
+ %
+ \begin{key}{/tikz/step=\meta{number or dimension or coordinate} (initially 1cm)}
+ Sets the stepping in both the $x$ and $y$-direction. If a dimension is
+ provided, this is used directly. If a number is provided, this number
+ is interpreted in the $xy$-coordinate system. For example, if you
+ provide the number |2|, then the $x$-step is twice the $x$-vector and
+ the $y$-step is twice the $y$-vector set by the |x=| and |y=| options.
+ Finally, if you provide a coordinate, then the $x$-part of this
+ coordinate will be used as the $x$-step and the $y$-part will be used
+ as the $y$-coordinate.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[x=.5cm]
+ \draw[thick] (0,0) grid [step=1] (3,2);
+ \draw[red] (0,0) grid [step=.75cm] (3,2);
+\end{tikzpicture}
+\begin{tikzpicture}
+ \draw (0,0) circle [radius=1];
+ \draw[blue] (0,0) grid [step=(45:1)] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ A complication arises when the $x$- and/or $y$-vector do not point
+ along the axes. Because of this, the actual rule for computing the
+ $x$-step and the $y$-step is the following: As the $x$- and $y$-steps
+ we use the $x$- and $y$-components or the following two vectors: The
+ first vector is either $(\meta{x-grid-step-number},0)$ or
+ $(\meta{x-grid-step-dimension},0\mathrm{pt})$, the second vector is
+ $(0,\meta{y-grid-step-number})$ or
+ $(0\mathrm{pt},\meta{y-grid-step-dimension})$.
+
+ If the $x$-step or $y$-step is $0$ or negative the corresponding lines
+ are not drawn.
+ \end{key}
+
+ \begin{key}{/tikz/xstep=\meta{dimension or number} (initially 1cm)}
+ Sets the stepping in the $x$-direction.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) grid [xstep=.5,ystep=.75] (3,2);
+ \draw[ultra thick] (0,0) grid [ystep=0] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/ystep=\meta{dimension or number} (initially 1cm)}
+ Sets the stepping in the $y$-direction.
+ \end{key}
+
+ It is important to note that the grid is always ``phased'' such that it
+ contains the point $(0,0)$ if that point happens to be inside the
+ rectangle. Thus, the grid does \emph{not} always have an intersection at
+ the corner points; this occurs only if the corner points are multiples of
+ the stepping. Note that due to rounding errors, the ``last'' lines of a
+ grid may be omitted. In this case, you have to add an epsilon to the corner
+ points.
+
+ The following style is useful for drawing grids:
+ %
+ \begin{stylekey}{/tikz/help lines (initially {line width=0.2pt,gray})}
+ This style makes lines ``subdued'' by using thin gray lines for them.
+ However, this style is not installed automatically and you have to say
+ for example:
+ %
+\begin{codeexample}[]
+\tikz \draw[help lines] (0,0) grid (3,3);
+\end{codeexample}
+ \end{stylekey}
+\end{pathoperation}
+
+
+\subsection{The Parabola Operation}
+
+The |parabola| path operation continues the current path with a parabola. A
+parabola is a (shifted and scaled) curve defined by the equation $f(x) = x^2$
+and looks like this: \tikz \draw (-1ex,1.5ex) parabola[parabola height=-1.5ex]
++(2ex,0ex);.
+
+\begin{pathoperation}{parabola}{\opt{\oarg{options}|bend|\meta{bend
+ coordinate}}\meta{coordinate or cycle}}
+ This operation adds a parabola through the current point and the given
+ \meta{coordinate} or, if |cycle| is used instead of coordinate at the end,
+ the \meta{coordinate} is set to the position of the last move-to and the
+ path gets closed after the parabola. If the |bend| is given, it specifies
+ where the bend should go; the \meta{options} can also be used to specify
+ where the bend is. By default, the bend is at the old current point.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) rectangle (1,1.5)
+ (0,0) parabola (1,1.5);
+ \draw[xshift=1.5cm] (0,0) rectangle (1,1.5)
+ (0,0) parabola[bend at end] (1,1.5);
+ \draw[xshift=3cm] (0,0) rectangle (1,1.5)
+ (0,0) parabola bend (.75,1.75) (1,1.5);
+
+ \draw[yshift=-2cm] (1,1.5) --
+ (0,0) parabola cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+ The following options influence parabolas:
+ %
+ \begin{key}{/tikz/bend=\meta{coordinate}}
+ Has the same effect as saying |bend|\meta{coordinate} outside the
+ \meta{options}. The option specifies that the bend of the parabola
+ should be at the given \meta{coordinate}. You have to take care
+ yourself that the bend position is a ``valid'' position; which means
+ that if there is no parabola of the form $f(x) = a x^2 + b x + c$ that
+ goes through the old current point, the given bend, and the new current
+ point, the result will not be a parabola.
+
+ There is one special property of the \meta{coordinate}: When a relative
+ coordinate is given like |+(0,0)|, the position relative to this
+ coordinate is ``flexible''. More precisely, this position lies
+ somewhere on a line from the old current point to the new current
+ point. The exact position depends on the next option.
+ \end{key}
+
+ \begin{key}{/tikz/bend pos=\meta{fraction}}
+ Specifies where the ``previous'' point is relative to which the bend is
+ calculated. The previous point will be at the \meta{fraction}th part of
+ the line from the old current point to the new current point.
+
+ The idea is the following: If you say |bend pos=0| and |bend +(0,0)|,
+ the bend will be at the old current point. If you say |bend pos=1| and
+ |bend +(0,0)|, the bend will be at the new current point. If you say
+ |bend pos=0.5| and |bend +(0,2cm)| the bend will be 2cm above the
+ middle of the line between the start and end point. This is most useful
+ in situations such as the following:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (-1,0) parabola[bend pos=0.5] bend +(0,2) +(3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the above example, the |bend +(0,2)| essentially means ``a parabola
+ that is 2cm high'' and |+(3,0)| means ``and 3cm wide''. Since this
+ situation arises often, there is a special shortcut option:
+ %
+ \begin{key}{/tikz/parabola height=\meta{dimension}}
+ This option has the same effect as
+ |[bend pos=0.5,bend={+(0pt,|\meta{dimension}|)}]|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (-1,0) parabola[parabola height=2cm] +(3,0);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ \end{key}
+
+ The following styles are useful shortcuts:
+ %
+ \begin{stylekey}{/tikz/bend at start}
+ This places the bend at the start of a parabola. It is a shortcut for
+ the following options: |bend pos=0,bend={+(0,0)}|.
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/bend at end}
+ This places the bend at the end of a parabola.
+ \end{stylekey}
+\end{pathoperation}
+
+
+\subsection{The Sine and Cosine Operation}
+
+The |sin| and |cos| operations are similar to the |parabola| operation. They,
+too, can be used to draw (parts of) a sine or cosine curve.
+
+\begin{pathoperation}{sin}{\meta{coordinate or cycle}}
+ The effect of |sin| is to draw a scaled and shifted version of a sine curve
+ in the interval $[0,\pi/2]$. The scaling and shifting is done in such a way
+ that the start of the sine curve in the interval is at the old current
+ point and that the end of the curve in the interval is at
+ \meta{coordinate}. Here is an example that should clarify this:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) rectangle (1,1) (0,0) sin (1,1)
+ (2,0) rectangle +(1.57,1) (2,0) sin +(1.57,1);
+\end{codeexample}
+ %
+\end{pathoperation}
+
+\begin{pathoperation}{cos}{\meta{coordinate or cycle}}
+ This operation works similarly, only a cosine in the interval $[0,\pi/2]$
+ is drawn. By correctly alternating |sin| and |cos| operations, you can
+ create a complete sine or cosine curve:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[xscale=1.57]
+ \draw (0,0) sin (1,1) cos (2,0) sin (3,-1) cos (4,0) sin (5,1);
+ \draw[color=red] (0,1.5) cos (1,0) sin (2,-1.5) cos (3,0) sin (4,1.5) cos (5,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+Note that there is no way to (conveniently) draw an interval on a sine or
+cosine curve whose end points are not multiples of $\pi/2$.
+
+
+\subsection{The SVG Operation}
+
+The |svg| operation can be used to extend the current path by a path given in
+the \textsc{svg} path data syntax. This syntax is described in detail in
+Section 8.3 of the \textsc{svg 1.1} specification, please consult this
+specification for details.
+
+\begin{pathoperation}{svg}{\opt{\oarg{options}}\marg{path data}}
+ This operation adds the path specified in the \meta{path data} in
+ \textsc{svg 1.1 path data} syntax to the current path. Unlike the
+ \textsc{svg}-specification, it \emph{is} permissible that the path data
+ does not start with a move-to command (|m| or |M|), in which case the last
+ point of the current path is used as start point. The optional
+ \meta{options} apply locally to this path operation, typically you will use
+ them to set up, say, some transformations.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \filldraw [fill=red!20] (0,1) svg[scale=2] {h 10 v 10 h -10}
+ node [above left] {upper left} -- cycle;
+
+ \draw svg {M 0 0 L 20 20 h 10 a 10 10 0 0 0 -20 0};
+\end{tikzpicture}
+\end{codeexample}
+
+ An \textsc{svg} coordinate like |10 20| is always interpreted as
+ |(10pt,20pt)|, so the basic unit is always points (|pt|). The
+ $xy$-coordinate system is not used. However, you can use scaling to
+ (locally) change the basic unit. For instance, |svg[scale=1cm]| (yes, this
+ works, although some rather evil magic is involved) will cause 1cm to be
+ the basic unit.
+
+ Instead of curly braces, you can also use quotation marks to indicate the
+ start and end of the \textsc{svg} path.
+
+ \emph{Warning:} The arc operations (|a| and |A|) are numerically instable.
+ This means that they will be quite imprecise, except when the angle is a
+ multiple of $90^\circ$ (as is, fortunately, most often the case).
+\end{pathoperation}
+
+
+\subsection{The Plot Operation}
+
+The |plot| operation can be used to append a line or curve to the path that
+goes through a large number of coordinates. These coordinates are either given
+in a simple list of coordinates, read from some file, or they are computed on
+the fly.
+
+Since the syntax and the behaviour of this command are a bit complex, they are
+described in the separated Section~\ref{section-tikz-plots}.
+
+
+\subsection{The To Path Operation}
+
+The |to| operation is used to add a user-defined path from the previous
+coordinate to the following coordinate. When you write |(a) to (b)|, a straight
+line is added from |a| to |b|, exactly as if you had written |(a) -- (b)|.
+However, if you write |(a) to [out=135,in=45] (b)| a curve is added to the
+path, which leaves at an angle of 135$^\circ$ at |a| and arrives at an angle of
+45$^\circ$ at |b|. This is because the options |in| and |out| trigger a special
+path to be used instead of the straight line.
+
+\begin{pathoperation}{to}{\opt{|[|\meta{options}|]|}
+ \opt{\meta{nodes}} \meta{coordinate or cycle}}
+ This path operation inserts the path currently set via the |to path| option
+ at the current position. The \meta{options} can be used to modify (perhaps
+ implicitly) the |to path| and to set up how the path will be rendered.
+
+ Before the |to path| is inserted, a number of macros are set up that can
+ ``help'' the |to path|. These are |\tikztostart|, |\tikztotarget|, and
+ |\tikztonodes|; they are explained in the following.
+
+ \medskip
+ \textbf{Start and Target Coordinates.}\ \
+ The |to| operation is always followed by a \meta{coordinate}, called the
+ target coordinate, or the text |cycle|, in which case the last move-to is
+ used as a coordinate and the path gets closed. The macro |\tikztotarget| is
+ set to this coordinate (without its parentheses). There is also a
+ \emph{start coordinate}, which is the coordinate preceding the |to|
+ operation. This coordinate can be accessed via the macro |\tikztostart|. In
+ the following example, for the first |to|, the macro |\tikztostart| is
+ |0pt,0pt| and the |\tikztotarget| is |0,2|. For the second |to|, the macro
+ |\tikztostart| is |10pt,10pt| and |\tikztotarget| is |a|. For the third,
+ they are set to |a| and |current subpath start|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \node (a) at (2,2) {a};
+
+ \draw (0,0) to (0,2);
+ \draw[red] (10pt,10pt) to (a);
+ \draw[blue] (3,0) -- (3,2) -- (a) to cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+ \medskip
+ \textbf{Nodes on to--paths.}\ \
+ It is possible to add nodes to the paths constructed by a |to| operation.
+ To do so, you specify the nodes between the |to| keyword and the coordinate
+ (if there are options to the |to| operation, these come first). The effect
+ of |(a) to node {x} (b)| (typically) is the same as if you had written
+ |(a) -- node {x} (b)|, namely that the node is placed on the to. This can
+ be used to add labels to tos:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) to node [sloped,above] {x} (3,2);
+
+ \draw (0,0) to[out=90,in=180] node [sloped,above] {x} (3,2);
+\end{tikzpicture}
+\end{codeexample}
+
+ Instead of writing the node between the |to| keyword and the target
+ coordinate, you may also use the following keys to create such nodes:
+ %
+ \begin{key}{/tikz/edge node=\meta{node specification}}
+ This key can be used inside the \meta{options} of a |to| path command.
+ It will add the \meta{node specification} to the list of nodes to be
+ placed on the connecting line, just as if you had written the
+ \meta{node specification} directly after the |to| keyword:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) to [edge node={node [sloped,above] {x}}] (3,2);
+
+ \draw (0,0) to [out=90,in=180,
+ edge node={node [sloped,above] {x}}] (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ This key is mostly useful to create labels automatically using other
+ keys.
+ \end{key}
+ %
+ \begin{key}{/tikz/edge label=\meta{text}}
+ A shorthand for |edge node={node[auto]{|\meta{text}|}}|.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) to [edge label=x] (3,2);
+\end{codeexample}
+ \end{key}
+ %
+ \begin{key}{/tikz/edge label'=\meta{text}}
+ A shorthand for |edge node={node[auto,swap]{|\meta{text}|}}|.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) to [edge label=x, edge label'=y] (3,2);
+\end{codeexample}
+ \end{key}
+
+ When the |quotes| library is loaded, additional ways of specifying nodes on
+ to--paths become available, see Section~\ref{section-edge-quotes}.
+
+ \medskip
+ \textbf{Styles for to-paths.}\ \
+ In addition to the \meta{options} given after the |to| operation, the
+ following style is also set at the beginning of the to path:
+ %
+ \begin{stylekey}{/tikz/every to (initially \normalfont empty)}
+ This style is installed at the beginning of every to.
+ %
+\begin{codeexample}[]
+\tikz[every to/.style={bend left}]
+ \draw (0,0) to (3,2);
+\end{codeexample}
+ %
+ Note that, as explained below, every to path is implicitly surrounded
+ by curly braces. This means that options like |draw| given in an
+ |every to| do not actually influence the path. You can fix this by
+ using the |append after command| option:
+ %
+\begin{codeexample}[]
+\tikz[every to/.style={append after command={[draw,dashed]}}]
+ \draw (0,0) to (3,2);
+\end{codeexample}
+ \end{stylekey}
+
+ \medskip
+ \textbf{Options.}\ \
+ The \meta{options} given with the |to| allow you to influence the
+ appearance of the |to path|. Mostly, these options are used to change the
+ |to path|. This can be used to change the path from a straight line to,
+ say, a curve.
+
+ The path used is set using the following option:
+ %
+ \begin{key}{/tikz/to path=\meta{path}}
+ Whenever a |to| operation is used, the \meta{path} is inserted. More
+ precisely, the following path is added:
+ %
+ \begin{quote}
+ |{[every to,|\meta{options}|] |\meta{path} |}|
+ \end{quote}
+
+ The \meta{options} are the options given to the |to| operation, the
+ \meta{path} is the path set by this option |to path|.
+
+ Inside the \meta{path}, different macros are used to reference the
+ from- and to-coordinates. In detail, these are:
+ %
+ \begin{itemize}
+ \item \declareandlabel{\tikztostart} will expand to the
+ from-coordinate (without the parentheses).
+ \item \declareandlabel{\tikztotarget} will expand to the
+ to-coordinate.
+ \item \declareandlabel{\tikztonodes} will expand to the nodes
+ between the |to| operation and the coordinate. Furthermore,
+ these nodes will have the |pos| option set implicitly.
+ \end{itemize}
+
+ Let us have a look at a simple example. The standard straight line for
+ a |to| is achieved by the following \meta{path}:
+ %
+ \begin{quote}
+ |-- (\tikztotarget) \tikztonodes|
+ \end{quote}
+
+ Indeed, this is the default setting for the path. When we write
+ |(a) to (b)|, the \meta{path} will expand to |(a) -- (b)|, when we
+ write
+ %
+ \begin{quote}
+ |(a) to[red] node {x} (b)|
+ \end{quote}
+ %
+ the \meta{path} will expand to
+ %
+ \begin{quote}
+ |(a) -- (b) node[red] {x}|
+ \end{quote}
+
+ It is not possible to specify the path
+ %
+ \begin{quote}
+ |-- \tikztonodes (\tikztotarget)|
+ \end{quote}
+ %
+ since \tikzname\ does not allow one to have a macro after |--| that
+ expands to a node.
+
+ Now let us have a look at how we can modify the \meta{path} sensibly.
+ The simplest way is to use a curve.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[to path={
+ .. controls +(1,0) and +(1,0) .. (\tikztotarget) \tikztonodes}]
+
+ \node (a) at (0,0) {a};
+ \node (b) at (2,1) {b};
+ \node (c) at (1,2) {c};
+
+ \draw (a) to node {x} (b)
+ (a) to (c);
+\end{tikzpicture}
+\end{codeexample}
+
+ Here is another example:
+ %
+\begin{codeexample}[]
+\tikzset{
+ my loop/.style={to path={
+ .. controls +(80:1) and +(100:1) .. (\tikztotarget) \tikztonodes}},
+ my state/.style={circle,draw}}
+
+\begin{tikzpicture}[shorten >=2pt]
+ \node [my state] (a) at (210:1) {$q_a$};
+ \node [my state] (b) at (330:1) {$q_b$};
+
+ \draw[->] (a) to node[below] {1} (b)
+ to [my loop] node[above right] {0} (b);
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/execute at begin to=\meta{code}}
+ The \meta{code} is executed prior to the |to|. This can be used to
+ draw one or more additional paths or to do additional computations.
+ \end{key}
+
+ \begin{key}{/tikz/execute at end to=\meta{code}}
+ Works like the previous option, only this code is executed after
+ the to path has been added.
+ % FIXME : provide examples...
+ \end{key}
+
+ \begin{stylekey}{/tikz/every to (initially \normalfont empty)}
+ This style is installed at the beginning of every to.
+ \end{stylekey}
+ \end{key}
+\end{pathoperation}
+
+There are a number of predefined |to path|s, see Section~\ref{library-to-paths}
+for a reference.
+
+
+\subsection{The Foreach Operation}
+
+\begin{pathoperation}{foreach}{\meta{variables}\opt{\oarg{options}} |in|
+ \marg{path commands}}
+ The |foreach| operation can be used to repeatedly insert the \meta{path
+ commands} into the current path. Naturally, the \meta{path commands} should
+ internally reference some of the \meta{variables} so that you do not insert
+ exactly the same path repeatedly, but rather variations. For historical
+ reasons, you can also write |\foreach| instead of |foreach|.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) foreach \x in {1,...,3} { -- (\x,1) -- (\x,0) };
+\end{codeexample}
+ %
+ See Section~\ref{section-foreach} for more details on the for-each-command.
+\end{pathoperation}
+
+
+\subsection{The Let Operation}
+
+The \emph{let operation} is the first of a number of path operations that do
+not actually extend that path, but have different, mostly local, effects.
+
+\begin{pathoperation}{let}{\meta{assignment}
+ \opt{|,|\meta{assignment}}%
+ \opt{|,|\meta{assignment}\dots}\declare{| in |}}
+ When this path operation is encountered, the \meta{assignment}s are
+ evaluated, one by one. This will store coordinate and number in
+ special \emph{registers} (which are local to \tikzname, they have
+ nothing to do with \TeX\ registers). Subsequently, one can access the
+ contents of these registers using the macros |\p|, |\x|, |\y|, and
+ |\n|.
+
+ The first kind of permissible \meta{assignment}s have the following form:
+ %
+ \begin{quote}
+ |\n|\meta{number register}|={|\meta{formula}|}|
+ \end{quote}
+ %
+ When an assignment has this form, the \meta{formula} is evaluated using the
+ |\pgfmathparse| operation. The result is stored in the \meta{number
+ register}. If the \meta{formula} involves a dimension anywhere (as in
+ |2*3cm/2|), then the \meta{number register} stores the resulting dimension
+ with a trailing |pt|. A \meta{number register} can be named arbitrarily
+ and is a normal \TeX\ parameter to the |\n| macro. Possible names are
+ |{left corner}|, but also just a single digit like~|5|.
+
+ Let us call the path that follows a let operation its \emph{body}. Inside
+ the body, the |\n| macro can be used to access the register.
+ %
+ \begin{command}{\n\marg{number register}}
+ When this macro is used on the left-hand side of an |=|-sign in a let
+ operation, it has no effect and is just there for readability. When the
+ macro is used on the right-hand side of an |=|-sign or in the body of
+ the let operation, then it expands to the value stored in the
+ \meta{number register}. This will either be a dimensionless number like
+ |2.0| or a dimension like |5.6pt|.
+
+ For instance, if we say |let \n1={1pt+2pt}, \n2={1+2} in ...|, then
+ inside the |...| part the macro |\n1| will expand to |3pt| and |\n2|
+ expands to |3|.
+ \end{command}
+
+ The second kind of \meta{assignments} have the following form:
+ %
+ \begin{quote}
+ |\p|\meta{point register}|={|\meta{formula}|}|
+ \end{quote}
+ %
+ Point position registers store a single point, consisting of an $x$-part
+ and a $y$-part measured in \TeX\ points (|pt|). In particular, point
+ registers do not store nodes or node names. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw let \p{foo} = (1,1), \p2 = (2,0) in
+ (0,0) -- (\p2) -- (\p{foo});
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{command}{\p\marg{point register}}
+ When this macro is used on the left-hand side of an |=|-sign in a let
+ operation, it has no effect and is just there for readability. When the
+ macro is used on the right-hand side of an |=|-sign or in the body of
+ the let operation, then it expands to the $x$-part (measured in \TeX\
+ points) of the coordinate stored in the \meta{register}, followed, by a
+ comma, followed by the $y$-part.
+
+ For instance, if we say |let \p1=(1pt,1pt+2pt) in ...|, then inside the
+ |...| part the macro |\p1| will expand to exactly the seven characters
+ ``1pt,3pt''. This means that you when you write |(\p1)|, this expands
+ to |(1pt,3pt)|, which is presumably exactly what you intended.
+ \end{command}
+ %
+ \begin{command}{\x\marg{point register}}
+ This macro expands just to the $x$-part of the point register. If we
+ say as above, as we did above, |let \p1=(1pt,1pt+2pt) in ...|, then
+ inside the |...| part the macro |\x1| expands to |1pt|.
+ \end{command}
+ %
+ \begin{command}{\y\marg{point register}}
+ Works like |\x|, only for the $y$-part.
+ \end{command}
+ %
+ Note that the above macros are available only inside a let operation.
+
+ Here is an example where let clauses are used to assemble a coordinate from
+ the $x$-coordinate of a first point and the $y$-coordinate of a second
+ point. Naturally, using the \verb!|-! notation, this could be written much
+ more compactly.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \draw (1,0) coordinate (first point)
+ -- (3,2) coordinate (second point);
+
+ \fill[red] let \p1 = (first point),
+ \p2 = (second point) in
+ (\x1,\y2) circle [radius=2pt];
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that the effect of a let operation is local to the body of the let
+ operation. If you wish to access a computed coordinate outside the body,
+ you must use a |coordinate| path operation:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \path % let's define some points:
+ let
+ \p1 = (1,0),
+ \p2 = (3,2),
+ \p{center} = ($ (\p1) !.5! (\p2) $) % center
+ in
+ coordinate (p1) at (\p1)
+ coordinate (p2) at (\p2)
+ coordinate (center) at (\p{center});
+
+ \draw (p1) -- (p2);
+ \fill[red] (center) circle [radius=2pt];
+\end{tikzpicture}
+\end{codeexample}
+
+ For a more useful application of the let operation, let us draw a circle
+ that touches a given line:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,3);
+
+ \coordinate (a) at (rnd,rnd);
+ \coordinate (b) at (3-rnd,3-rnd);
+ \draw (a) -- (b);
+
+ \node (c) at (1,2) {x};
+
+ \draw let \p1 = ($ (a)!(c)!(b) - (c) $),
+ \n1 = {veclen(\x1,\y1)}
+ in circle [at=(c), radius=\n1];
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+
+\subsection{The Scoping Operation}
+
+When \tikzname\ encounters and opening or a closing brace (|{| or~|}|) at some
+point where a path operation should come, it will open or close a scope. All
+options that can be applied ``locally'' will be scoped inside the scope. For
+example, if you apply a transformation like |[xshift=1cm]| inside the scoped
+area, the shifting only applies to the scope. On the other hand, an option like
+|color=red| does not have any effect inside a scope since it can only be
+applied to the path as a whole.
+
+Concerning the effect of scopes on relative coordinates, please see
+Section~\ref{section-scopes-relative}.
+
+
+\subsection{The Node and Edge Operations}
+
+The |node| operation adds a so-called node to a path. This operation is special
+in the following sense: It does not change the current path in any way. In
+other words, this operation is not really a path operation, but has an effect
+that is ``external'' to the path. The |edge| operation has similar effect in
+that it adds something \emph{after} the main path has been drawn. However, it
+works like the |to| operation, that is, it adds a |to| path to the picture
+after the main path has been drawn.
+
+Since these operations are quite complex, they are described in the separate
+Section~\ref{section-nodes}.
+
+
+\subsection{The Graph Operation}
+
+The |graph| operation can be used to specify easily how a large number of nodes
+are connected. This operation is documented in a separate section, see
+Section~\ref{section-library-graphs}.
+
+
+\subsection{The Pic Operation}
+
+The |pic| operation is used to insert a ``short picture'' (hence the ``short''
+name) at the current position of the path. This operation is somewhat similar
+to the |node| operation and discussed in detail in Section~\ref{section-pics}.
+
+
+\subsection{The Attribute Animation Operation}
+
+\begin{pathoperation}{:}{\meta{animation attribute}|=|\marg{options}}
+ This path operation has the same effect as if you had said:
+ %
+ \begin{quote}
+ |[animate = { myself:|\meta{animate attribute}|=|\marg{options}|} ]|
+ \end{quote}
+ %
+ This causes an animation of \meta{animate attribute} to be added to the
+ current path, see Section~\ref{section-tikz-animations} for details.
+ %
+\begin{codeexample}[width=2cm]
+\tikz \draw :xshift = {0s = "0cm", 30s = "-3cm", repeats} (0,0) circle (5mm);
+\end{codeexample}
+ %
+\end{pathoperation}
+
+
+\subsection{The PGF-Extra Operation}
+
+In some cases you may need to ``do some calculations or some other stuff''
+while a path is constructed. For this, you would like to suspend the
+construction of the path and suspend \tikzname's parsing of the path, you would
+then like to have some \TeX\ code executed, and would then like to resume the
+parsing of the path. This effect can be achieved using the following path
+operation |\pgfextra|. Note that this operation should only be used by real
+experts and should only be used deep inside clever macros, not on normal paths.
+
+\begin{command}{\pgfextra\marg{code}}
+ This command may only be used inside a \tikzname\ path. There it is used
+ like a normal path operation. The construction of the path is temporarily
+ suspended and the \meta{code} is executed. Then, the path construction is
+ resumed.
+ %
+\begin{codeexample}[]
+\newdimen\mydim
+\begin{tikzpicture}
+ \mydim=1cm
+ \draw (0pt,\mydim) \pgfextra{\mydim=2cm} -- (0pt,\mydim);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+\begin{command}{\pgfextra \meta{code} \texttt{\char`\\endpgfextra}}
+ This is an alternative syntax for the |\pgfextra| command. If the code
+ following |\pgfextra| does not start with a brace, the \meta{code} is
+ executed until |\endpgfextra| is encountered. What actually happens is that
+ when |\pgfextra| is not followed by a brace, this completely shuts down the
+ \tikzname\ parser and |\endpgfextra| is a normal macro that restarts the
+ parser.
+ %
+\begin{codeexample}[]
+\newdimen\mydim
+\begin{tikzpicture}
+ \mydim=1cm
+ \draw (0pt,\mydim)
+ \pgfextra \mydim=2cm \endpgfextra -- (0pt,\mydim);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsection{Interacting with the Soft Path subsystem}
+
+During construction \tikzname\ stores the path internally as a \emph{soft
+path}. Sometimes it is desirable to save a path during the stage of
+construction, restore it elsewhere and continue using it. There are two keys
+to facilitate this operation, which are explained below. To learn more about
+the soft path subsystem, refer to section~\ref{section-soft-paths}.
+
+\begin{key}{/tikz/save path=\meta{macro}}
+ Save the current soft path into \meta{macro}.
+\end{key}
+
+\begin{key}{/tikz/use path=\meta{macro}}
+ Set the current path to the soft path stored in \meta{macro}.
+\end{key}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path[save path=\pathA,name path=A] (0,1) to [bend left] (1,0);
+ \path[save path=\pathB,name path=B]
+ (0,0) .. controls (.33,.1) and (.66,.9) .. (1,1);
+
+ \fill[name intersections={of=A and B}] (intersection-1) circle (1pt);
+
+ \draw[blue][use path=\pathA];
+ \draw[red] [use path=\pathB];
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-pics.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-pics.tex
new file mode 100644
index 0000000000..c18b7a6176
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-pics.tex
@@ -0,0 +1,567 @@
+% Copyright 2013 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Pics: Small Pictures on Paths}
+\label{section-pics}
+
+\subsection{Overview}
+
+A ``pic'' is a ``short picture'' (hence the short name\dots) that can be
+inserted anywhere in \tikzname\ picture where you could also insert a node.
+Similarly to nodes, pics have a ``shape'' (called \emph{type} to avoid
+confusion) that someone has defined. Each time a pic of a specified type is
+used, the type's code is executed, resulting in some drawings to be added to
+the current picture. The syntax for adding nodes and adding pics to a picture
+are also very similar. The core difference is that pics are typically more
+complex than nodes and may consist of a whole bunch of nodes themselves
+together with complex paths joining them.
+
+As a very simple example, suppose we want to define a pic type |seagull| that
+just draw ``two bumps''. The code for this definition is quite easy:
+%
+\begin{codeexample}[code only]
+\tikzset{
+ seagull/.pic={
+ % Code for a "seagull". Do you see it?...
+ \draw (-3mm,0) to [bend left] (0,0) to [bend left] (3mm,0);
+ }
+}
+\end{codeexample}
+
+The first line just tells \TeX\ that you set some \tikzname\ options for the
+current scope (which is the whole document); you could put |seagull/.pic=...|
+anywhere else where \tikzname\ options are allowed (which is just about
+anywhere). We have now defined a |seagull| pic type and can use it as follows:
+%
+\tikzset{
+ seagull/.pic={
+ % Code for a "seagull". Do you see it?...
+ \draw (-3mm,0) to [bend left] (0,0) to [bend left] (3mm,0);
+ }
+}
+\begin{codeexample}[]
+\tikz \fill [fill=blue!20]
+ (1,1)
+ -- (2,2) pic {seagull}
+ -- (3,2) pic {seagull}
+ -- (3,1) pic [rotate=30] {seagull}
+ -- (2,1) pic [red] {seagull};
+\end{codeexample}
+
+As can be see, defining new types of pics is much easier than defining new
+shapes for nodes; but see Section~\ref{section-new-pic-types} for the fine
+details.
+
+Since defining new pics types is easier than defining new node shapes and since
+using pics is as easy as using nodes, why should you use nodes at all? There
+are chiefly two reasons:
+%
+\begin{enumerate}
+ \item Unlike nodes, pics cannot be referenced later on. You \emph{can}
+ reference nodes that are inside a pic, but not ``the pic itself''. In
+ particular, you cannot draw lines between pics the way you can draw
+ them between nodes. In general, whenever it makes sense that some
+ drawing could conceivably be connected to other node-like-things, then
+ a node is better than a pic.
+ \item If pics are used to emulate the full power of a node (which is
+ possible, in principle), they will be slower to construct and take up
+ more memory than a node achieving the same effect.
+\end{enumerate}
+
+Despite these drawbacks, pics are an excellent choice for creating highly
+configurable reusable pieces of drawings that can be inserted into larger
+contexts.
+
+
+\subsection{The Pic Syntax}
+
+\begin{command}{\pic}
+ Inside |{tikzpicture}| this is an abbreviation for |\path pic|.
+\end{command}
+
+The syntax for adding a pic to a picture is very similar to the syntax used for
+nodes (indeed, internally the same parser code is used). The main difference is
+that instead of a node contents you provide the picture's type between the
+braces:
+
+\begin{pathoperation}{pic}{
+ \opt{\meta{foreach statements}}
+ \opt{|[|\meta{options}|]|}
+ \opt{|(|\meta{prefix}|)|}
+ \opt{|at(|\meta{coordinate}|)|}
+ \opt{|:|\meta{animation attribute}|=|\marg{options}}
+ \opt{\marg{pic type}}%
+}
+ Adds a pic to the current \tikzname\ picture of the specified \meta{pic
+ type}. The effect is, basically, that some code associated with the
+ \meta{pic type} is executed (how this works, exactly, is explained later).
+ This code can consist of arbitrary \tikzname\ code. As for nodes, the
+ current path will not be modified by this path command, all drawings
+ produced by the code are ``external'' to the path the same way neither a
+ node nor its border are part of the path on which they are specified.
+
+ Just like the |node| command, this path operation is somewhat complex and
+ we go over it step by step.
+
+ \medskip
+ \textbf{Order of the parts of the specification.}
+ Just like for nodes, everything between ``|pic|'' and the opening brace of
+ the \meta{pic type} is optional and can be given in any order. If there are
+ \meta{foreach statements}, they must come first, directly following
+ ``|pic|''. As for nodes, the ``end'' of the pic specification is normally
+ detected by the presence of the opening brace. You can, however, use the
+ |pic type| option to specify the pic type as an option.
+
+ \begin{key}{/tikz/pic type=\meta{pic type}}
+ This key sets the pic type of the current~|pic|. When this option is
+ used inside an option block of a |pic|, the parsing of the |pic| ends
+ immediately and no pic type in braces is expected. (In other words,
+ this option behaves exactly like the |node contents| option and,
+ indeed, the two are interchangeable.)
+ %
+\begin{codeexample}[]
+\tikz {
+ \path (0,0) pic [pic type = seagull]
+ (1,0) pic {seagull};
+}
+\end{codeexample}
+ \end{key}
+
+ \medskip
+ \textbf{The location of a pic.}
+ Just like nodes, pics are placed at the last position mentioned on the path
+ or, when |at| is used, at a specified position. ``Placing'' a pic somewhere
+ actually means that the coordinate system is translated (shifted) to this
+ last position. This means that inside of the pic type's code any mentioning
+ of the origin refers to the last position used on the path or to the
+ specified |at|.
+ %
+\begin{codeexample}[]
+\tikz { % different ways of placing pics
+ \draw [help lines] (0,0) grid (3,2);
+ \pic at (1,0) {seagull};
+ \path (2,1) pic {seagull};
+ \pic [at={(3,2)}] {seagull};
+}
+\end{codeexample}
+
+ As for nodes, except for the described shifting, the coordinate system of a
+ pic is reset prior to executing the pic type's code. This can be changed
+ using the |transform shape| option, which has the same effect as for nodes:
+ The ``outer'' transformation gets applied to the node:
+ %
+\begin{codeexample}[]
+\tikz [scale=2] {
+ \pic at (0,0) {seagull};
+ \pic at (1,0) [transform shape] {seagull};
+}
+\end{codeexample}
+
+ When the \meta{options} contain transformation commands like |scale| or
+ |rotate|, these transformations always apply to the pic:
+ %
+\begin{codeexample}[]
+\tikz [rotate=30] {
+ \pic at (0,0) {seagull};
+ \pic at (1,0) [rotate=90] {seagull};
+}
+\end{codeexample}
+
+ Just like nodes, pics can also be positioned implicitly and, somewhat
+ unsurprisingly, the same rules concerning positioning and sloping apply:
+ %
+\begin{codeexample}[]
+\tikz \draw
+ (0,0) to [bend left]
+ pic [near start] {seagull}
+ pic {seagull}
+ pic [sloped, near end] {seagull} (4,0);
+\end{codeexample}
+
+ \medskip
+ \textbf{The options of a node.}
+ As always, any given \meta{options} apply only to the pic and have no
+ effect outside. As for nodes, most ``outside'' options also apply to the
+ pics, but not the ``action'' options like |draw| or |fill|. These must be
+ given in the \meta{options} of the pic.
+
+ \medskip
+ \textbf{The code of a pic.}
+ As stated earlier, the main job of a pic is to execute some code in a scope
+ that is shifted according to the last point on the path or to the |at|
+ position specified in the pic. It was also claimed that this code is
+ specified by the \meta{pic type}. However, this specification is somewhat
+ indirect. What really happens is the following: When a |pic| is
+ encountered, the current path is suspended and a new internal scope is
+ started. The \meta{options} are executed and also the \meta{pic type} (as
+ explained in a moment). After all this is done, the code stored in the
+ following key gets executed:
+
+ \begin{key}{/tikz/pics/code=\meta{code}}
+ This key stores the \meta{code} that should be drawn in the current
+ pic. Normally, setting this key is done by the \meta{pic type}, but you
+ can also set it in the \meta{options} and leave the \meta{pic type}
+ empty:
+ %
+\begin{codeexample}[]
+\tikz \pic [pics/code={\draw (-3mm,0) to[bend left] (0,0)
+ to[bend left] (3mm,0);}]
+ {}; % no pic type specified
+\end{codeexample}
+ \end{key}
+
+ Now, how does the \meta{pic type} set |pics/code|? It turns out that the
+ \meta{pic type} is actually just a list of keys that are executed with the
+ prefix |/tikz/pics/|. In the above examples, this ``list of keys'' just
+ consisted of the single key ``|seagull|'' that did not take any arguments,
+ but, in principle, you could provide any arbitrary text understood by
+ |\pgfkeys| here. This means that when we write |pic{seagull}|, \tikzname\
+ will execute the key |/tikz/pics/seagull|. It turns out, see
+ Section~\ref{section-new-pic-types}, that this key is just a style set to
+ |code={\draw(-3mm,0)...;}|. Thus, |pic{seagull}| will cause the |pics/code|
+ key to be set to the text needed to draw the
+ seagull.
+
+ Indeed, you can also use the \meta{pic type} simply to set the |code| of
+ the pic. This is useful for cases when you have some code that you ``just
+ want to execute, but do not want to define a new pic type''. Here is a
+ typical example where we use pics to add some markings to a path:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) .. controls(1,0) and (2,1) .. (3,1)
+ foreach \t in {0, 0.1, ..., 1} {
+ pic [pos=\t] {code={\draw circle [radius=2pt];}}
+ };
+\end{codeexample}
+
+ In our seagull example, we always explicitly used |\draw| to draw the
+ seagull. This implies that when a user writes something
+ |pic[fill]{seagull}| in the hope of having a ``filled'' seagull, nothing
+ special will happen: The |\draw| inside the pic explicitly states that the
+ path should be drawn, not filled, and the fact that in the surrounding
+ scope the |fill| option is set has no effect. The following key can be used
+ to change this:
+ %
+ \begin{key}{/tikz/pic actions}
+ This key is a style that can be used (only) inside the code of a pic.
+ There, it will set the ``action'' keys set inside the \meta{options} of
+ the pic (``actions'' are drawing, filling, shading, and clipping or any
+ combination thereof).
+
+ To see how this key works, let us define the following pic:
+ %
+\begin{codeexample}[code only]
+\tikzset{
+ my pic/.pic = {
+ \path [pic actions] (0,0) circle[radius=3mm];
+ \draw (-3mm,-3mm) rectangle (3mm,3mm);
+ }
+}
+\end{codeexample}
+ %
+ In the code, whether or not the circle gets drawn/filled/shaded
+ depends on which options where given to the |pic| command when it
+ is used. In contrast, the rectangle will always (just) be drawn.
+ %
+\tikzset{
+ my pic/.pic = {
+ \path [pic actions] (0,0) circle[radius=3mm];
+ \draw (-3mm,-3mm) rectangle (3mm,3mm);
+ }
+}
+\begin{codeexample}[width=6cm]
+\tikz \pic {my pic}; \space
+\tikz \pic [red] {my pic}; \space
+\tikz \pic [draw] {my pic}; \space
+\tikz \pic [draw=red] {my pic}; \space
+\tikz \pic [draw, shading=ball] {my pic}; \space
+\tikz \pic [fill=red!50] {my pic};
+\end{codeexample}
+ \end{key}
+
+ \medskip
+ \textbf{Code executed behind or in front of the path.}
+ As for nodes, a pic can be ``behind'' the current path or ``in front of
+ it'' and, just as for nodes, the two options |behind path| and
+ |in front of path| are used to specify which is meant. In detail, if |node|
+ and |pic| are both used repeatedly on a path, in the resulting picture we
+ first see all nodes and pics with the |behind path| option set in the order
+ they appear on the path (nodes and pics are interchangeable in this
+ regard), then comes the path, and then come all nodes and pics that are in
+ front of the path in the order they appeared.
+ %
+\begin{codeexample}[]
+\tikz \fill [fill=blue!20]
+ (1,1)
+ -- (2,2) pic [behind path] {seagull}
+ -- (3,2) pic {seagull}
+ -- (3,1) pic [rotate=30] {seagull}
+ -- (2,1) pic [red, behind path] {seagull};
+\end{codeexample}
+ %
+ In contrast to nodes, a pic need not only be completely behind the path or
+ in front of the path as specified by the user. Instead, a pic type may also
+ specify that a certain part of the drawing should always be behind the path
+ and it may specify that a certain other part should always be before the
+ path. For this, the values of the following keys are relevant:
+
+ \begin{key}{/tikz/pics/foreground code=\meta{code}}
+ This key stores \meta{code} that will always be drawn in front of the
+ current path, even when |behind path| is used. If |behind path| is not
+ used and |code| is (also) set, the code of |code| is drawn first,
+ following by the foreground \meta{code}.
+ \end{key}
+
+ \begin{key}{/tikz/pics/background code=\meta{code}}
+ Like |foreground code|, only that the \meta{code} is always put behind
+ the path, except when the |behind path| option is applied to the pic,
+ then the background code is drawn in front of the ``behind path'' code.
+ \end{key}
+
+ \medskip
+ \textbf{The foreach statement for pics.}
+ As for nodes, a pic specification may start with |foreach|. The effect and
+ semantics are the same as for nodes.
+ %
+\begin{codeexample}[]
+\tikz \pic foreach \x in {1,2,3} at (\x,0) {seagull};
+\end{codeexample}
+
+ \medskip
+ \textbf{Styles for pics.}
+ The following styles influence how nodes are rendered:
+ %
+ \begin{stylekey}{/tikz/every pic (initially \normalfont empty)}
+ This style is installed at the beginning of every pic.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw}]
+ \draw (0,0) node {A} -- (1,1) node {B};
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+
+ \medskip
+ \textbf{Name scopes.}
+ You can specify a \meta{name} for a pic using the key |name=|\meta{name} or
+ by giving the name in parenthesis inside the pic's specification. The
+ effect of this is, for once, quite different from what happens for nodes:
+ All that happens is that |name prefix| is set to \meta{name} at the
+ beginning of the pic.
+
+ The |name prefix| key was already introduced in the description of the
+ |node| command: It allows you to set some text that is prefixed to all
+ nodes in a scope. For pics this makes particular sense: All nodes defined
+ by a pic's code can be referenced from outside the pic with the prefix
+ provided.
+
+ To see how this works, let us add some nodes to the code of the seagull:
+ %
+\begin{codeexample}[code only]
+\tikzset{
+ seagull/.pic={
+ % Code for a "seagull". Do you see it?...
+ \coordinate (-left wing) at (-3mm,0);
+ \coordinate (-head) at (0,0);
+ \coordinate (-right wing) at (3mm,0);
+
+ \draw (-left wing) to [bend left] (0,0) (-head) to [bend left] (-right wing);
+ }
+}
+\end{codeexample}
+ %
+\tikzset{
+ seagull/.pic={
+ % Code for a "seagull". Do you see it?...
+ \coordinate (-left wing) at (-3mm,0);
+ \coordinate (-head) at (0,0);
+ \coordinate (-right wing) at (3mm,0);
+
+ \draw (-left wing) to [bend left] (0,0) (-head) to [bend left] (-right wing);
+ }
+}
+
+ Now, we can use it as follows:
+ %
+\begin{codeexample}[code only]
+\tikz {
+ \pic (Emma) {seagull};
+ \pic (Alexandra) at (0,1) {seagull};
+
+ \draw (Emma-left wing) -- (Alexandra-right wing);
+}
+\end{codeexample}
+
+ Sometimes, you may also wish your pic to access nodes outside the pic
+ (typically, because they are given as parameters). In this case, the name
+ prefix gets in the way since the nodes outside the picture do not have this
+ prefix. The trick is to locally reset the name prefix to the value it had
+ outside the picture, which is achieved using the following style:
+
+ \begin{key}{/tikz/name prefix ..}
+ This key is available only inside the code of a pic. There, it
+ (locally) changes the name prefix to the value it had outside the pic.
+ This allows you to access nodes outside the current pic.
+ \end{key}
+
+ \medskip
+ \textbf{Animations for pics.}
+ Just as for nodes, you can use the attribute--colon syntax to add an
+ animation to a pic:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz {
+ \pic :rotate={0s="0", 20s="90"} {seagull};
+ \pic at (1.5,1.5) {seagull};
+}
+\end{codeexample}
+ %
+ Naturally, you can also use animations in the code of a picture:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2},width=3cm]
+\begin{tikzpicture} [flapping seagull/.pic={
+ \draw (0,0) :path={
+ 0s= {"{(180:3mm) to [bend left] (0,0) to [bend left] (0:3mm)}"=base},
+ 1s= "{(160:3mm) to [bend left] (0,0) to [bend left] (20:3mm)}",
+ 2s= "{(180:3mm) to [bend left] (0,0) to [bend left] (0:3mm)}",
+ repeats };
+ }]
+ \pic :rotate={0s="0", 20s="90"} {flapping seagull};
+ \pic at (1.5,1.5) {flapping seagull};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+There are two general purpose keys that pics may find useful:
+
+\begin{key}{/tikz/pic text=\meta{text}}
+ This macro stores the \meta{text} in the macro |\tikzpictext|, which is
+ |\let| to |\relax| by default. Setting the |pic text| to some value is the
+ ``preferred'' way of communicating a (single) piece of text that should
+ become part of a pic (typically of a node). In particular, the |quotes|
+ library maps quoted parameters to this key.
+\end{key}
+
+\begin{key}{/tikz/pic text options=\meta{options}}
+ This macro stores the \meta{options} in the macro |\tikzpictextoptions|,
+ which is |\let| to the empty string by default. The |quotes| library maps
+ options for quoted parameters to this key.
+\end{key}
+
+
+\subsubsection{The Quotes Syntax}
+\label{section-pic-quotes}
+
+When you load the |quotes| library, you can use the ``quotes syntax'' inside
+the options of a pic. Recall that for nodes this syntax is used to add a label
+to a node. For pics, the quotes syntax is used to set the |pic text| key.
+Whether or not the pic type's code takes this key into consideration is,
+however, up to the key.
+
+In detail, when the |quotes| library is loaded, each time a key--value pair in
+a list of options passed to an |pic| starts with |"|, the key--value pair must
+actually be a string of the following form:
+%
+\begin{quote}
+ |"|\meta{text}|"|\opt{|'|}\opt{\meta{options}}
+\end{quote}
+%
+This string is transformed into the following:
+%
+\begin{quote}
+ |every pic quotes/.try,pic text=|\meta{text}|, pic text options={|\meta{options}|}|
+\end{quote}
+
+As example of a pic type that takes these values into account is the |angle|
+pic type:
+%
+\begin{codeexample}[]
+\tikz \draw (3,0) coordinate (A)
+ -- (0,1) coordinate (B)
+ -- (1,2) coordinate (C)
+ pic [draw, "$\alpha$"] {angle};
+\end{codeexample}
+
+As described in Section~\ref{section-label-quotes}, the apostrophe becomes part
+of the \meta{options}, when present. As can be seen above, the following style
+is executed:
+%
+\begin{stylekey}{/tikz/every pic quotes (initially \normalfont empty)}
+\end{stylekey}
+
+
+\subsection{Defining New Pic Types}
+\label{section-new-pic-types}
+
+As explained in the description of the |pic| command, in order to define a new
+pic type you need to
+%
+\begin{enumerate}
+ \item define a key with the path prefix |/tikz/pics| that
+ \item sets the key |/tikz/pics/code| to the code of the pic.
+\end{enumerate}
+
+It turns out that this is easy enough to achieve using styles:
+
+\begin{codeexample}[code only]
+\tikzset{
+ pics/seagull/.style ={
+ % Ok, this is the key that should, when
+ % executed, set the code key:
+ code = { %
+ \draw (...) ... ;
+ }
+ }
+}
+\end{codeexample}
+
+Even though the above pattern is easy enough, there is a special so-called key
+handler that allows us to write even simpler code, namely:
+%
+\begin{codeexample}[code only]
+\tikzset{
+ seagull/.pic = {
+ \draw (...) ... ;
+ }
+}
+\end{codeexample}
+
+\begin{handler}{{.pic}|=|\meta{some code}}
+ This handler can only be used with a key with the prefix |/tikz/|, so just
+ should normally use it only as an option to a \tikzname\ command or to the
+ |\tikzset| command. It takes the \meta{key}'s path and, inside that path,
+ it replaces |/tikz/| by |/tikz/pics/| (so, basically, it adds the
+ ``missing'' |pics| part of the path). Then, it sets up things so that the
+ resulting name to key is a style that executes |code=some code|.
+\end{handler}
+
+In almost all cases, the |.pic| key handler will suffice to setup keys.
+However, there are cases where you really need to use the first version using
+|.style| and |code=|:
+%
+\begin{itemize}
+ \item Whenever your pic type needs to set the foreground or the background
+ code.
+ \item In case of complicated arguments given to the keys.
+\end{itemize}
+
+As an example, let us define a simple pic that draws a filled circle behind the
+path. Furthermore, we make the circle's radius a parameter of the pic:
+%
+\begin{codeexample}[]
+\tikzset{
+ pics/my circle/.style = {
+ background code = { \fill circle [radius=#1]; }
+ }
+}
+\tikz [fill=blue!30]
+ \draw (0,0) pic {my circle=2mm} -- (1,1) pic {my circle=5mm};
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-plots.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-plots.tex
new file mode 100644
index 0000000000..3859a65f5c
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-plots.tex
@@ -0,0 +1,776 @@
+% Copyright 2007 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Plots of Functions}
+\label{section-tikz-plots}
+
+A warning before we get started: \emph{If you are looking for an easy way to
+create a normal plot of a function with scientific axes, ignore this section
+and instead look at the |pgfplots| package or at the |datavisualization|
+command from Part~\ref{part-dv}.}
+
+
+\subsection{Overview}
+\label{section-why-pgname-for-plots}
+
+\tikzname\ can be used to create plots of functions, a job that is normally
+handled by powerful programs like \textsc{gnuplot} or \textsc{mathematica}.
+These programs can produce two different kinds of output: First, they can
+output a complete plot picture in a certain format (like \pdf) that includes
+all low-level commands necessary for drawing the complete plot (including axes
+and labels). Second, they can usually also produce ``just plain data'' in the
+form of a long list of coordinates. Most of the powerful programs consider it a
+to be ``a bit boring'' to just output tabled data and very much prefer to
+produce fancy pictures. Nevertheless, when coaxed, they can also provide the
+plain data.
+
+The advantage of creating plots directly using \tikzname\ is
+\emph{consistency:} Plots created using \tikzname\ will automatically have the
+same styling and fonts as those used in the rest of a document -- something
+that is hard to do right when an external program gets involved. Other problems
+people encounter with external programs include: Formulas will look different,
+if they can be rendered at all; line widths will usually be too thick or too
+thin; scaling effects upon inclusion can create a mismatch between sizes in the
+plot and sizes in the text; the automatic grid generated by most programs is
+mostly distracting; the automatic ticks generated by most programs are cryptic
+numerics (try adding a tick reading ``$\pi$'' at the right point); most
+programs make it very easy to create ``chart junk'' in a most convenient
+fashion; arrows and plot marks will almost never match the arrows used in the
+rest of the document. This list is not exhaustive, unfortunately.
+
+There are basically three ways of creating plots using \tikzname:
+%
+\begin{enumerate}
+ \item Use the |plot| path operation. How this works is explained in the
+ present section. This is the most ``basic'' of the three options and
+ forces you to do a lot of things ``by hand'' like adding axes or ticks.
+ \item Use the |datavisualization| path command, which is documented in
+ Part~\ref{part-dv}. This command is much more powerful than the |plot|
+ path operation and produces complete plots including axes and ticks.
+ The downside is that you cannot use it to ``just'' quickly plot a
+ simple curve (or, more precisely, it is hard to use it in this way).
+ \item Use the |pgfplots| package, which is basically an alternative to the
+ |datavisualization| command. While the underlying philosophy of this
+ package is not as ``ambitious'' as that of the command
+ |datavisualization|, it is somewhat more mature, has a simpler design,
+ and wider support base.
+\end{enumerate}
+
+
+\subsection{The Plot Path Operation}
+
+The |plot| path operation can be used to append a line or curve to the path
+that goes through a large number of coordinates. These coordinates are either
+given in a simple list of coordinates, read from some file, or they are
+computed on the fly.
+
+The syntax of the |plot| comes in different versions.
+
+\begin{pathoperation}{--plot}{\meta{further arguments}}
+ This operation plots the curve through the coordinates specified in the
+ \meta{further arguments}. The current (sub)path is simply continued, that
+ is, a line-to operation to the first point of the curve is implicitly
+ added. The details of the \meta{further arguments} will be explained in a
+ moment.
+\end{pathoperation}
+
+\begin{pathoperation}{plot}{\meta{further arguments}}
+ This operation plots the curve through the coordinates specified in the
+ \meta{further arguments} by first ``moving'' to the first coordinate of the
+ curve.
+\end{pathoperation}
+
+The \meta{further arguments} are used in different ways to specifying the
+coordinates of the points to be plotted:
+%
+\begin{enumerate}
+ \item \opt{|--|}|plot|\oarg{local
+ options}\declare{|coordinates{|\meta{coordinate 1}\meta{coordinate
+ 2}\dots\meta{coordinate $n$}|}|}
+ \item \opt{|--|}|plot|\oarg{local
+ options}\declare{|file{|\meta{filename}|}|}
+ \item \opt{|--|}|plot|\oarg{local options}\declare{\meta{coordinate
+ expression}}
+ \item \opt{|--|}|plot|\oarg{local options}\declare{|function{|\meta{gnuplot
+ formula}|}|}
+\end{enumerate}
+
+These different ways are explained in the following.
+
+
+\subsection{Plotting Points Given Inline}
+
+Points can be given directly in the \TeX-file as in the following example:
+%
+\begin{codeexample}[]
+\tikz \draw plot coordinates {(0,0) (1,1) (2,0) (3,1) (2,1) (10:2cm)};
+\end{codeexample}
+
+Here is an example showing the difference between |plot| and |--plot|:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- (1,1) plot coordinates {(2,0) (4,0)};
+ \draw[color=red,xshift=5cm]
+ (0,0) -- (1,1) -- plot coordinates {(2,0) (4,0)};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Plotting Points Read From an External File}
+
+The second way of specifying points is to put them in an external file named
+\meta{filename}. Currently, the only file format that \tikzname\ allows is the
+following: Each line of the \meta{filename} should contain one line starting
+with two numbers, separated by a space. A line may also be empty or, if it
+starts with |#| or |%| it is considered empty. For such lines, a ``new data
+set'' is started, typically resulting in a new subpath being started in the
+plot (see Section~\ref{section-plot-jumps} on how to change this behaviour, if
+necessary). For lines containing two numbers, they must be separated by a
+space. They may be following by arbitrary text, which is ignored, \emph{except}
+if it is |o| or |u|. In the first case, the point is considered to be an
+\emph{outlier} and normally also results in a new subpath being started. In the
+second case, the point is considered to be \emph{undefined}, which also results
+in a new subpath being started. Again, see Section~\ref{section-plot-jumps} on
+how to change this, if necessary. (This is exactly the format that
+\textsc{gnuplot} produces when you say |set terminal table|.)
+%
+\begin{codeexample}[]
+\tikz \draw plot[mark=x,smooth] file {plots/pgfmanual-sine.table};
+\end{codeexample}
+
+The file |plots/pgfmanual-sine.table| reads:
+%
+\begin{codeexample}[code only]
+#Curve 0, 20 points
+#x y type
+0.00000 0.00000 i
+0.52632 0.50235 i
+1.05263 0.86873 i
+1.57895 0.99997 i
+...
+9.47368 -0.04889 i
+10.00000 -0.54402 i
+\end{codeexample}
+%
+It was produced from the following source, using |gnuplot|:
+%
+\begin{codeexample}[code only]
+set table "../plots/pgfmanual-sine.table"
+set format "%.5f"
+set samples 20
+plot [x=0:10] sin(x)
+\end{codeexample}
+
+The \meta{local options} of the |plot| operation are local to each plot and do
+not affect other plots ``on the same path''. For example, |plot[yshift=1cm]|
+will locally shift the plot 1cm upward. Remember, however, that most options
+can only be applied to paths as a whole. For example, |plot[red]| does not have
+the effect of making the plot red. After all, you are trying to ``locally''
+make part of the path red, which is not possible.
+
+
+\subsection{Plotting a Function}
+\label{section-tikz-plot}
+
+When you plot a function, the coordinates of the plot data can be computed by
+evaluating a mathematical expression. Since \pgfname\ comes with a mathematical
+engine, you can specify this expression and then have \tikzname\ produce the
+desired coordinates for you, automatically.
+
+Since this case is quite common when plotting a function, the syntax is easy:
+Following the |plot| command and its local options, you directly provide a
+\meta{coordinate expression}. It looks like a normal coordinate, but inside you
+may use a special macro, which is |\x| by default, but this can be changed
+using the |variable| option. The \meta{coordinate expression} is then evaluated
+for different values for |\x| and the resulting coordinates are plotted.
+
+Note that you will often have to put the $x$- or $y$-coordinate inside braces,
+namely whenever you use an expression involving a parenthesis.
+
+The following options influence how the \meta{coordinate expression} is
+evaluated:
+%
+\begin{key}{/tikz/variable=\meta{macro} (initially x)}
+ Sets the macro whose value is set to the different values when
+ \meta{coordinate expression} is evaluated.
+\end{key}
+
+\begin{key}{/tikz/samples=\meta{number} (initially 25)}
+ Sets the number of samples used in the plot.
+\end{key}
+
+\begin{key}{/tikz/domain=\meta{start}|:|\meta{end} (initially -5:5)}
+ Sets the domain from which the samples are taken.
+\end{key}
+
+\begin{key}{/tikz/samples at=\meta{sample list}}
+ This option specifies a list of positions for which the variable should be
+ evaluated. For instance, you can say |samples at={1,2,8,9,10}| to have the
+ variable evaluated exactly for values $1$, $2$, $8$, $9$, and $10$. You can
+ use the |\foreach| syntax, so you can use |...| inside the \meta{sample
+ list}.
+
+ When this option is used, the |samples| and |domain| option are overruled.
+ The other way round, setting either |samples| or |domain| will overrule
+ this option.
+\end{key}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[domain=0:4]
+ \draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,3.9);
+
+ \draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$};
+ \draw[->] (0,-1.2) -- (0,4.2) node[above] {$f(x)$};
+
+ \draw[color=red] plot (\x,\x) node[right] {$f(x) =x$};
+ % \x r means to convert '\x' from degrees to _r_adians:
+ \draw[color=blue] plot (\x,{sin(\x r)}) node[right] {$f(x) = \sin x$};
+ \draw[color=orange] plot (\x,{0.05*exp(\x)}) node[right] {$f(x) = \frac{1}{20} \mathrm e^x$};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \draw[scale=0.5,domain=-3.141:3.141,smooth,variable=\t]
+ plot ({\t*sin(\t r)},{\t*cos(\t r)});
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \draw[domain=0:360,smooth,variable=\t]
+ plot ({sin(\t)},\t/360,{cos(\t)});
+\end{codeexample}
+
+
+\subsection{Plotting a Function Using Gnuplot}
+\label{section-tikz-gnuplot}
+
+Often, you will want to plot points that are given via a function like $f(x) =
+x \sin x$. Unfortunately, \TeX\ does not really have enough computational power
+to generate the points of such a function efficiently (it is a text processing
+program, after all). However, if you allow it, \TeX\ can try to call external
+programs that can easily produce the necessary points. Currently, \tikzname\
+knows how to call \textsc{gnuplot}.
+
+When \tikzname\ encounters your operation
+|plot[id=|\meta{id}|] function{x*sin(x)}| for the first time, it will create a
+file called \meta{prefix}\meta{id}|.gnuplot|, where \meta{prefix} is
+|\jobname.| by default, that is, the name of your main |.tex| file. If no
+\meta{id} is given, it will be empty, which is alright, but it is better when
+each plot has a unique \meta{id} for reasons explained in a moment. Next,
+\tikzname\ writes some initialization code into this file followed by
+|plot x*sin(x)|. The initialization code sets up things such that the |plot|
+operation will write the coordinates into another file called
+\meta{prefix}\meta{id}|.table|. Finally, this table file is read as if you had
+said |plot file{|\meta{prefix}\meta{id}|.table}|.
+
+For the plotting mechanism to work, two conditions must be met:
+%
+\begin{enumerate}
+ \item You must have allowed \TeX\ to call external programs. This is often
+ switched off by default since this is a security risk (you might,
+ without knowing, run a \TeX\ file that calls all sorts of ``bad''
+ commands). To enable this ``calling external programs'' a command line
+ option must be given to the \TeX\ program. Usually, it is called
+ something like |shell-escape| or |enable-write18|. For example, for my
+ |pdflatex| the option |--shell-escape| can be given.
+ \item You must have installed the |gnuplot| program and \TeX\ must find it
+ when compiling your file.
+\end{enumerate}
+
+Unfortunately, these conditions will not always be met. Especially if you pass
+some source to a coauthor and the coauthor does not have \textsc{gnuplot}
+installed, he or she will have trouble compiling your files.
+
+For this reason, \tikzname\ behaves differently when you compile your graphic
+for the second time: If upon reaching |plot[id=|\meta{id}|] function{...}| the
+file \meta{prefix}\meta{id}|.table| already exists \emph{and} if the
+\meta{prefix}\meta{id}|.gnuplot| file contains what \tikzname\ thinks that it
+``should'' contain, the |.table| file is immediately read without trying to
+call a |gnuplot| program. This approach has the following advantages:
+%
+\begin{enumerate}
+ \item If you pass a bundle of your |.tex| file and all |.gnuplot| and
+ |.table| files to someone else, that person can \TeX\ the |.tex| file
+ without having to have |gnuplot| installed.
+ \item If the |\write18| feature is switched off for security reasons (a
+ good idea), then, upon the first compilation of the |.tex| file, the
+ |.gnuplot| will still be generated, but not the |.table| file. You can
+ then simply call |gnuplot| ``by hand'' for each |.gnuplot| file, which
+ will produce all necessary |.table| files.
+ \item If you change the function that you wish to plot or its domain,
+ \tikzname\ will automatically try to regenerate the |.table| file.
+ \item If, out of laziness, you do not provide an |id|, the same |.gnuplot|
+ will be used for different plots, but this is not a problem since the
+ |.table| will automatically be regenerated for each plot on-the-fly.
+ \emph{Note: If you intend to share your files with someone else, always
+ use an id, so that the file can by typeset without having
+ \textsc{gnuplot} installed.} Also, having unique ids for each plot will
+ improve compilation speed since no external programs need to be called,
+ unless it is really necessary.
+\end{enumerate}
+
+When you use |plot function{|\meta{gnuplot formula}|}|, the \meta{gnuplot
+formula} must be given in the |gnuplot| syntax, whose details are beyond the
+scope of this manual. Here is the ultra-condensed essence: Use |x| as the
+variable and use the C-syntax for normal plots, use |t| as the variable for
+parametric plots. Here are some examples:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[domain=0:4]
+ \draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,3.9);
+
+ \draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$};
+ \draw[->] (0,-1.2) -- (0,4.2) node[above] {$f(x)$};
+
+ \draw[color=red] plot[id=x] function{x} node[right] {$f(x) =x$};
+ \draw[color=blue] plot[id=sin] function{sin(x)} node[right] {$f(x) = \sin x$};
+ \draw[color=orange] plot[id=exp] function{0.05*exp(x)} node[right] {$f(x) = \frac{1}{20} \mathrm e^x$};
+\end{tikzpicture}
+\end{codeexample}
+
+The plot is influenced by the following options: First, the options |samples|
+and |domain| explained earlier. Second, there are some more specialized
+options.
+
+\begin{key}{/tikz/parametric=\meta{boolean} (default true)}
+ Sets whether the plot is a parametric plot. If true, then |t| must be used
+ instead of |x| as the parameter and two comma-separated functions must be
+ given in the \meta{gnuplot formula}. An example is the following:
+ %
+\begin{codeexample}[]
+\tikz \draw[scale=0.5,domain=-3.141:3.141,smooth]
+ plot[parametric,id=parametric-example] function{t*sin(t),t*cos(t)};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/range=\meta{start}|:|\meta{end}}
+ This key sets the range of the plot. If set, all points whose
+ $y$-coordinates lie outside this range will be considered to be outliers
+ and will cause jumps in the plot, by default:
+ %
+\begin{codeexample}[]
+\tikz \draw[scale=0.5,domain=-3.141:3.141, samples=100, smooth, range=-3:3]
+ plot[id=tan-example] function{tan(x)};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/yrange=\meta{start}|:|\meta{end}}
+ Same as |range|.
+\end{key}
+
+\begin{key}{/tikz/xrange=\meta{start}|:|\meta{end}}
+ Set the $x$-range. This makes sense only for parametric plots.
+ %
+\begin{codeexample}[]
+\tikz \draw[scale=0.5,domain=-3.141:3.141,smooth,xrange=0:1]
+ plot[parametric,id=parametric-example-cut] function{t*sin(t),t*cos(t)};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/id=\meta{id}}
+ Sets the identifier of the current plot. This should be a unique identifier
+ for each plot (though things will also work if it is not, but not as well,
+ see the explanations above). The \meta{id} will be part of a filename, so
+ it should not contain anything fancy like |*| or |$|.%$
+\end{key}
+
+\begin{key}{/tikz/prefix=\meta{prefix}}
+ The \meta{prefix} is put before each plot file name. The default is
+ |\jobname.|, but if you have many plots, it might be better to use, say
+ |plots/| and have all plots placed in a directory. You have to create the
+ directory yourself.
+\end{key}
+
+\begin{key}{/tikz/raw gnuplot}
+ This key causes the \meta{gnuplot formula} to be passed on to
+ \textsc{gnuplot} without setting up the samples or the |plot| operation.
+ Thus, you could write
+ %
+\begin{codeexample}[code only]
+plot[raw gnuplot,id=raw-example] function{set samples 25; plot sin(x)}
+\end{codeexample}
+ %
+ This can be useful for complicated things that need to be passed to
+ \textsc{gnuplot}. However, for really complicated situations you should
+ create a special external generating \textsc{gnuplot} file and use the
+ |file|-syntax to include the table ``by hand''.
+\end{key}
+
+The following styles influence the plot:
+%
+\begin{stylekey}{/tikz/every plot (initially \normalfont empty)}
+ This style is installed in each plot, that is, as if you always said
+ %
+\begin{codeexample}[code only]
+ plot[every plot,...]
+\end{codeexample}
+ %
+ This is most useful for globally setting a prefix for all plots by saying:
+ %
+\begin{codeexample}[code only]
+\tikzset{every plot/.style={prefix=plots/}}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Placing Marks on the Plot}
+
+As we saw already, it is possible to add \emph{marks} to a plot using the
+|mark| option. When this option is used, a copy of the plot mark is placed on
+each point of the plot. Note that the marks are placed \emph{after} the whole
+path has been drawn/filled/shaded. In this respect, they are handled like text
+nodes.
+
+In detail, the following options govern how marks are drawn:
+%
+\begin{key}{/tikz/mark=\meta{mark mnemonic}}
+ Sets the mark to a mnemonic that has previously been defined using the
+ |\pgfdeclareplotmark|. By default, |*|, |+|, and |x| are available, which
+ draw a filled circle, a plus, and a cross as marks. Many more marks become
+ available when the library |plotmarks| is loaded.
+ Section~\ref{section-plot-marks} lists the available plot marks.
+
+ One plot mark is special: the |ball| plot mark is available only in
+ \tikzname. The |ball color| option determines the balls's color. Do not use
+ this option with a large number of marks since it will take very long to
+ render in PostScript.
+
+ \begin{tabular}{lc}
+ Option & Effect \\
+ \hline
+ \vrule height14pt width0pt \plotmarkentrytikz{ball}
+ \end{tabular}
+\end{key}
+
+\begin{key}{/tikz/mark repeat=\meta{r}}
+ This option tells \tikzname\ that only every $r$th mark should be drawn.
+ %
+\begin{codeexample}[]
+\tikz \draw plot[mark=x,mark repeat=3,smooth] file {plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/mark phase=\meta{p}}
+ This option tells \tikzname\ that the first mark to be draw should be the
+ $p$th, followed by the $(p+r)$th, then the $(p+2r)$th, and so on.
+ %
+\begin{codeexample}[]
+\tikz \draw plot[mark=x,mark repeat=3,mark phase=6,smooth] file {plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/mark indices=\meta{list}}
+ This option allows you to specify explicitly the indices at which a mark
+ should be placed. Counting starts with 1. You can use the |\foreach|
+ syntax, that is, |...| can be used.
+ %
+\begin{codeexample}[]
+\tikz \draw plot[mark=x,mark indices={1,4,...,10,11,12,...,16,20},smooth]
+ file {plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/mark size=\meta{dimension}}
+ Sets the size of the plot marks. For circular plot marks, \meta{dimension}
+ is the radius, for other plot marks \meta{dimension} should be about half
+ the width and height.
+
+ This option is not really necessary, since you achieve the same effect by
+ specifying |scale=|\meta{factor} as a local option, where \meta{factor} is
+ the quotient of the desired size and the default size. However, using
+ |mark size| is a bit faster and more natural.
+\end{key}
+
+\begin{stylekey}{/tikz/every mark}
+ This style is installed before drawing plot marks. For example, you can
+ scale (or otherwise transform) the plot mark or set its color.
+\end{stylekey}
+
+\begin{key}{/tikz/mark options=\meta{options}}
+ Redefines |every mark| such that it sets \marg{options}.
+ %
+\begin{codeexample}[]
+\tikz \fill[fill=blue!20]
+ plot[mark=triangle*,mark options={color=blue,rotate=180}]
+ file{plots/pgfmanual-sine.table} |- (0,0);
+\end{codeexample}
+ %
+\end{key}
+
+\begin{stylekey}{/tikz/no marks}
+ Disables markers (the same as |mark=none|).
+\end{stylekey}
+%
+\begin{stylekey}{/tikz/no markers}
+ Disables markers (the same as |mark=none|).
+\end{stylekey}
+
+
+\subsection{Smooth Plots, Sharp Plots, Jump Plots, Comb Plots and Bar Plots}
+
+There are different things the |plot| operation can do with the points it reads
+from a file or from the inlined list of points. By default, it will connect
+these points by straight lines. However, you can also use options to change the
+behavior of |plot|.
+
+\begin{key}{/tikz/sharp plot}
+ This is the default and causes the points to be connected by straight
+ lines. This option is included only so that you can ``switch back'' if you
+ ``globally'' install, say, |smooth|.
+\end{key}
+
+\begin{key}{/tikz/smooth}
+ This option causes the points on the path to be connected using a smooth
+ curve:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[smooth] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+
+ Note that the smoothing algorithm is not very intelligent. You will get the
+ best results if the bending angles are small, that is, less than about
+ $30^\circ$ and, even more importantly, if the distances between points are
+ about the same all over the plotting path.
+\end{key}
+
+\begin{key}{/tikz/tension=\meta{value}}
+ This option influences how ``tight'' the smoothing is. A lower value will
+ result in sharper corners, a higher value in more ``round'' curves. A value
+ of $1$ results in a circle if four points at quarter-positions on a circle
+ are given. The default is $0.55$. The ``correct'' value depends on the
+ details of plot.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[smooth cycle]
+ \draw plot[tension=0.2]
+ coordinates{(0,0) (1,1) (2,0) (1,-1)};
+ \draw[yshift=-2.25cm] plot[tension=0.5]
+ coordinates{(0,0) (1,1) (2,0) (1,-1)};
+ \draw[yshift=-4.5cm] plot[tension=1]
+ coordinates{(0,0) (1,1) (2,0) (1,-1)};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/smooth cycle}
+ This option causes the points on the path to be connected using a closed
+ smooth curve.
+ %
+\begin{codeexample}[]
+\tikz[scale=0.5]
+ \draw plot[smooth cycle] coordinates{(0,0) (1,0) (2,1) (1,2)}
+ plot coordinates{(0,0) (1,0) (2,1) (1,2)} -- cycle;
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/const plot}
+ This option causes the points on the path to be connected using piecewise
+ constant series of lines:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[const plot] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/const plot mark left}
+ Just an alias for |/tikz/const plot|.
+ %
+\begin{codeexample}[]
+\tikz\draw plot[const plot mark left,mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/const plot mark right}
+ A variant of |/tikz/const plot| which places its mark on the right ends:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[const plot mark right,mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/const plot mark mid}
+ A variant of |/tikz/const plot| which places its mark in the middle of the
+ horizontal lines:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[const plot mark mid,mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+ More precisely, it generates vertical lines in the middle between each pair
+ of consecutive points. If the mesh width is constant, this leads to
+ symmetrically placed marks (``middle'').
+\end{key}
+
+\begin{key}{/tikz/jump mark left}
+ This option causes the points on the path to be drawn using piecewise
+ constant, non-connected series of lines. If there are any marks, they will
+ be placed on left open ends:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[jump mark left, mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/jump mark right}
+ This option causes the points on the path to be drawn using piecewise
+ constant, non-connected series of lines. If there are any marks, they will
+ be placed on right open ends:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[jump mark right, mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/jump mark mid}
+ This option causes the points on the path to be drawn using piecewise
+ constant, non-connected series of lines. If there are any marks, they will
+ be placed in the middle of the horizontal line segments:
+ %
+\begin{codeexample}[]
+\tikz\draw plot[jump mark mid, mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+
+ In case of non-constant mesh widths, the same remarks as for
+ |const plot mark mid| apply.
+\end{key}
+
+\begin{key}{/tikz/ycomb}
+ This option causes the |plot| operation to interpret the plotting points
+ differently. Instead of connecting them, for each point of the plot a
+ straight line is added to the path from the $x$-axis to the point,
+ resulting in a sort of ``comb'' or ``bar diagram''.
+ %
+\begin{codeexample}[]
+\tikz\draw[ultra thick] plot[ycomb,thin,mark=*] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[ycomb]
+ \draw[color=red,line width=6pt]
+ plot coordinates{(0,1) (.5,1.2) (1,.6) (1.5,.7) (2,.9)};
+ \draw[color=red!50,line width=4pt,xshift=3pt]
+ plot coordinates{(0,1.2) (.5,1.3) (1,.5) (1.5,.2) (2,.5)};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/xcomb}
+ This option works like |ycomb| except that the bars are horizontal.
+ %
+\begin{codeexample}[]
+\tikz \draw plot[xcomb,mark=x] coordinates{(1,0) (0.8,0.2) (0.6,0.4) (0.2,1)};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/polar comb}
+ This option causes a line from the origin to the point to be added to the
+ path for each plot point.
+ %
+\begin{codeexample}[]
+\tikz \draw plot[polar comb,
+ mark=pentagon*,mark options={fill=white,draw=red},mark size=4pt]
+ coordinates {(0:1cm) (30:1.5cm) (160:.5cm) (250:2cm) (-60:.8cm)};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/ybar}
+ This option produces fillable bar plots. It is thus very similar to
+ |ycomb|, but it employs rectangular shapes instead of line-to operations.
+ It thus allows to use any fill or pattern style.
+ %
+\begin{codeexample}[]
+\tikz\draw[draw=blue,fill=blue!60!black] plot[ybar] file{plots/pgfmanual-sine.table};
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[ybar]
+ \draw[color=red,fill=red!80,bar width=6pt]
+ plot coordinates{(0,1) (.5,1.2) (1,.6) (1.5,.7) (2,.9)};
+ \draw[color=red!50,fill=red!20,bar width=4pt,bar shift=3pt]
+ plot coordinates{(0,1.2) (.5,1.3) (1,.5) (1.5,.2) (2,.5)};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ The use of |bar width| and |bar shift| is explained in the plot handler
+ library documentation, section~\ref{section-plotlib-bar-handlers}. Please
+ refer to page~\pageref{key-bar-width}.
+\end{key}
+
+\begin{key}{/tikz/xbar}
+ This option works like |ybar| except that the bars are horizontal.
+ %
+\begin{codeexample}[]
+\tikz \draw[pattern=north west lines] plot[xbar]
+ coordinates{(1,0) (0.4,1) (1.7,2) (1.6,3)};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/ybar interval}
+ As |/tikz/ybar|, this options produces vertical bars. However, bars are
+ centered at coordinate \emph{intervals} instead of interval edges, and the
+ bar's width is also determined relatively to the interval's length:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[ybar interval,x=10pt]
+ \draw[color=red,fill=red!80]
+ plot coordinates{(0,2) (2,1.2) (3,.3) (5,1.7) (8,.9) (9,.9)};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Since there are $N$ intervals $[x_i,x_{i+1}]$ for given $N+1$ coordinates,
+ you will always have one coordinate more than bars. The last $y$ value will
+ be ignored.
+
+ You can configure relative shifts and relative bar widths, which is
+ explained in the plot handler library documentation,
+ section~\ref{section-plotlib-bar-handlers}. Please refer to
+ page~\pageref{key-bar-interval-width}.
+\end{key}
+
+\begin{key}{/tikz/xbar interval}
+ Works like |ybar interval|, but for horizontal bar plots.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[xbar interval,x=0.5cm,y=0.5cm]
+ \draw[color=red,fill=red!80]
+ plot coordinates {(3,0) (2,1) (4,1.5) (1,4) (2,6) (2,7)};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/only marks}
+ This option causes only marks to be shown; no path segments are added to
+ the actual path. This can be useful for quickly adding some marks to a
+ path.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) sin (1,1) cos (2,0)
+ plot[only marks,mark=x] coordinates{(0,0) (1,1) (2,0) (3,-1)};
+\end{codeexample}
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-scopes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-scopes.tex
new file mode 100644
index 0000000000..61f0aafb81
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-scopes.tex
@@ -0,0 +1,582 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section[Hierarchical Structures: Package, Environments, Scopes, and Styles]
+ {Hierarchical Structures:\\
+ Package, Environments, Scopes, and Styles}
+
+The present section explains how your files should be structured when you use
+\tikzname. On the top level, you need to include the |tikz| package. In the
+main text, each graphic needs to be put in a |{tikzpicture}| environment.
+Inside these environments, you can use |{scope}| environments to create
+internal groups. Inside the scopes you use |\path| commands to actually draw
+something. On all levels (except for the package level), graphic options can be
+given that apply to everything within the environment.
+
+
+\subsection{Loading the Package and the Libraries}
+
+\begin{package}{tikz}
+ This package does not have any options.
+
+ This will automatically load the \pgfname\ and the |pgffor| package.
+
+ \pgfname\ needs to know what \TeX\ driver you are intending to use. In most
+ cases \pgfname\ is clever enough to determine the correct driver for you;
+ this is true in particular if you use \LaTeX. One situation where \pgfname\
+ cannot know the driver ``by itself'' is when you use plain \TeX\ or Con\TeX
+ t together with |dvipdfm|. In this case, you have to write
+ |\def\pgfsysdriver{pgfsys-dvipdfm.def}| \emph{before} you input |tikz.tex|.
+\end{package}
+
+\begin{command}{\usetikzlibrary\marg{list of libraries}}
+ Once \tikzname\ has been loaded, you can use this command to load further
+ libraries. The list of libraries should contain the names of libraries
+ separated by commas. Instead of curly braces, you can also use square
+ brackets, which is something Con\TeX t users will like. If you try to load
+ a library a second time, nothing will happen.
+
+ \example |\usetikzlibrary{arrows.meta}|
+
+ The above command will load a whole bunch of extra arrow tip definitions.
+
+ What this command does is to load the file
+ |tikzlibrary|\meta{library}|.code.tex| for each \meta{library} in the
+ \meta{list of libraries}. If this file does not exist, the file
+ |pgflibrary|\meta{library}|.code.tex| is loaded instead. If this file also
+ does not exist, an error message is printed. Thus, to write your own
+ library file, all you need to do is to place a file of the appropriate name
+ somewhere where \TeX\ can find it. \LaTeX, plain \TeX, and Con\TeX t users
+ can then use your library.
+\end{command}
+
+
+\subsection{Creating a Picture}
+
+\subsubsection{Creating a Picture Using an Environment}
+
+The ``outermost'' scope of \tikzname\ is the |{tikzpicture}| environment. You
+may give drawing commands only inside this environment, giving them outside (as
+is possible in many other packages) will result in chaos.
+
+In \tikzname, the way graphics are rendered is strongly influenced by graphic
+options. For example, there is an option for setting the color used for
+drawing, another for setting the color used for filling, and also more obscure
+ones like the option for setting the prefix used in the filenames of temporary
+files written while plotting functions using an external program. The graphic
+options are specified in \emph{key lists}, see
+Section~\ref{section-graphic-options} below for details. All graphic options
+are local to the |{tikzpicture}| to which they apply.
+
+\begin{environment}{{tikzpicture}\opt{\meta{animations spec}}\opt{\oarg{options}}}
+ All \tikzname\ commands should be given inside this environment, except for
+ the |\tikzset| command. You cannot use graphics commands like the low-level
+ command |\pgfpathmoveto| outside this environment and doing so will result
+ in chaos. For \tikzname, commands like |\path| are only defined inside this
+ environment, so there is little chance that you will do something wrong
+ here.
+
+ When this environment is encountered, the \meta{options} are parsed, see
+ Section~\ref{section-graphic-options}. All options given here will apply to
+ the whole picture. Before the options you can specify animation commands,
+ provided that the |animations| library is loaded, see
+ Section~\ref{section-tikz-animations} for details.
+
+ Next, the contents of the environment is processed and the graphic commands
+ therein are put into a box. Non-graphic text is suppressed as well as
+ possible, but non-\pgfname\ commands inside a |{tikzpicture}| environment
+ should not produce any ``output'' since this may totally scramble the
+ positioning system of the backend drivers. The suppressing of normal text,
+ by the way, is done by temporarily switching the font to |\nullfont|. You
+ can, however, ``escape back'' to normal \TeX\ typesetting. This happens,
+ for example, when you specify a node.
+
+ At the end of the environment, \pgfname\ tries to make a good guess at the
+ size of a bounding box of the graphic and then resizes the picture box such
+ that the box has this size. To ``make its guess'', every time \pgfname\
+ encounters a coordinate, it updates the bounding box's size such that it
+ encompasses all these coordinates. This will usually give a good
+ approximation of the bounding box, but will not always be accurate. First,
+ the line thickness of diagonal lines is not taken into account correctly.
+ Second, control points of a curve often lie far ``outside'' the curve and
+ make the bounding box too large. In this case, you should use the |[use as
+ bounding box]| option.
+
+ The following key influences the baseline of the resulting picture:
+ %
+ \begin{key}{/tikz/baseline=\meta{dimension or coordinate or \texttt{default}} (default 0pt)}
+ Normally, the lower end of the picture is put on the baseline of the
+ surrounding text. For example, when you give the code
+ |\tikz\draw(0,0)circle(.5ex);|, \pgfname\ will find out that the lower
+ end of the picture is at $-.5\mathrm{ex} - 0.2\mathrm{pt}$ (the 0.2pt
+ are half the line width, which is 0.4pt) and that the upper end is at
+ $.5\mathrm{ex}+.5\mathrm{pt}$. Then, the lower end will be put on the
+ baseline, resulting in the following: \tikz\draw(0,0)circle(.5ex);.
+
+ Using this option, you can specify that the picture should be raised or
+ lowered such that the height \meta{dimension} is on the baseline. For
+ example, |\tikz[baseline=0pt]\draw(0,0)circle(.5ex);| yields
+ \tikz[baseline=0pt]\draw(0,0)circle(.5ex); since, now, the baseline is
+ on the height of the $x$-axis.
+
+ This options is often useful for ``inlined'' graphics as in
+ %
+\begin{codeexample}[]
+$A \mathbin{\tikz[baseline] \draw[->>] (0pt,.5ex) -- (3ex,.5ex);} B$
+\end{codeexample}
+
+ Instead of a \meta{dimension} you can also provide a coordinate in
+ parentheses. Then the effect is to put the baseline on the
+ $y$-coordinate that the given \meta{coordinate} has \emph{at the end of
+ the picture}. This means that, at the end of the picture, the
+ \meta{coordinate} is evaluated and then the baseline is set to the
+ $y$-coordinate of the resulting point. This makes it easy to reference
+ the $y$-coordinate of, say, the baseline of nodes.
+ %
+\begin{codeexample}[]
+Hello
+\tikz[baseline=(X.base)]
+ \node [cross out,draw] (X) {world.};
+\end{codeexample}
+
+\begin{codeexample}[]
+Top align:
+\tikz[baseline=(current bounding box.north)]
+ \draw (0,0) rectangle (1cm,1ex);
+\end{codeexample}
+
+ Use |baseline=default| to reset the |baseline| option to its initial
+ configuration.
+ \end{key}
+
+ \begin{key}{/tikz/execute at begin picture=\meta{code}}
+ This option causes \meta{code} to be executed at the beginning of the
+ picture. This option must be given in the argument of the
+ |{tikzpicture}| environment itself since this option will not have an
+ effect otherwise. After all, the picture has already ``started'' later
+ on. The effect of multiply setting this option accumulates.
+
+ This option is mainly used in styles like the |every picture| style to
+ execute certain code at the start of a picture.
+ \end{key}
+
+ \begin{key}{/tikz/execute at end picture=\meta{code}}
+ This option installs \meta{code} that will be executed at the end of
+ the picture. Using this option multiple times will cause the code to
+ accumulate. This option must also be given in the optional argument of
+ the |{tikzpicture}| environment.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[execute at end picture=%
+ {
+ \begin{pgfonlayer}{background}
+ \path[fill=yellow,rounded corners]
+ (current bounding box.south west) rectangle
+ (current bounding box.north east);
+ \end{pgfonlayer}
+ }]
+ \node at (0,0) {X};
+ \node at (2,1) {Y};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ All options ``end'' at the end of the picture. To set an option
+ ``globally'' change the following style:
+ %
+ \begin{stylekey}{/tikz/every picture (initially \normalfont empty)}
+ This style is installed at the beginning of each picture.
+ %
+\begin{codeexample}[code only]
+\tikzset{every picture/.style=semithick}
+\end{codeexample}
+ \end{stylekey}
+
+ Note that you should not use |\tikzset| to set options directly. For
+ instance, if you want to use a line width of |1pt| by default, do not try
+ to say |\tikzset{line width=1pt}| at the beginning of your document. This
+ will not work since the line width is changed in many places. Instead, say
+ %
+\begin{codeexample}[code only]
+\tikzset{every picture/.style={line width=1pt}}
+\end{codeexample}
+ %
+ This will have the desired effect.
+\end{environment}
+
+In other \TeX\ formats, you should use the following commands instead:
+
+\begin{plainenvironment}{{tikzpicture}\opt{\oarg{options}}}
+ This is the plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{tikzpicture}\opt{\oarg{options}}}
+ This is the Con\TeX t version of the environment.
+\end{contextenvironment}
+
+
+\subsubsection{Creating a Picture Using a Command}
+
+The following command is an alternative to |{tikzpicture}| that is particular
+useful for graphics consisting of a single or few commands.
+
+\begin{command}{\tikz\opt{\meta{animations spec}}\opt{\oarg{options}}\marg{path commands}}
+ This command places the \meta{path commands} inside a |{tikzpicture}|
+ environment. The \meta{path commands} may contain paragraphs and fragile
+ material (like verbatim text).
+
+ If there is only one path command, it need not be surrounded by curly
+ braces, if there are several, you need to add them (this is similar to the
+ |\foreach| statement and also to the rules in programming languages like
+ Java or C concerning the placement of curly braces).
+
+ \example |\tikz{\draw (0,0) rectangle (2ex,1ex);}| yields
+ \tikz{\draw (0,0) rectangle (2ex,1ex);}
+
+ \example |\tikz \draw (0,0) rectangle (2ex,1ex);| yields
+ \tikz \draw (0,0) rectangle (2ex,1ex);
+\end{command}
+
+
+\subsubsection{Handling Catcodes and the Babel Package}
+
+Inside a \tikzname\ picture, most symbols need to have the category code 12
+(normal text) in order to ensure that the parser works properly. This is
+typically not the case when packages like |babel| are used, which change
+catcodes aggressively.
+
+To solve this problem, \tikzname\ provides a small library also called |babel|
+(which can, however, also be used together with any other package that globally
+changes category codes). What it does is to reset the category codes at the
+beginning of every |{tikzpicture}| and to restore them at the beginning of
+every node. In almost all cases, this is exactly what you would expect and
+need, so I recommend to always load this library by saying
+|\usetikzlibrary{babel}|. For details on what, exactly, happens with the
+category codes, see Section~\ref{section-library-babel}.
+
+
+\subsubsection{Adding a Background}
+
+By default, pictures do not have any background, that is, they are
+``transparent'' on all parts on which you do not draw anything. You may instead
+wish to have a colored background behind your picture or a black frame around
+it or lines above and below it or some other kind of decoration.
+
+Since backgrounds are often not needed at all, the definition of styles for
+adding backgrounds has been put in the library package |backgrounds|. This
+package is documented in Section~\ref{section-tikz-backgrounds}.
+
+
+\subsection{Using Scopes to Structure a Picture}
+
+Inside a |{tikzpicture}| environment you can create scopes using the |{scope}|
+environment. This environment is available only inside the |{tikzpicture}|
+environment, so once more, there is little chance of doing anything wrong.
+
+
+\subsubsection{The Scope Environment}
+
+\begin{environment}{{scope}\opt{\meta{animations spec}}\opt{\oarg{options}}}
+ All \meta{options} are local to the \meta{environment contents}.
+ Furthermore, the clipping path is also local to the environment, that is,
+ any clipping done inside the environment ``ends'' at its end.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[ultra thick]
+ \begin{scope}[red]
+ \draw (0mm,10mm) -- (10mm,10mm);
+ \draw (0mm,8mm) -- (10mm,8mm);
+ \end{scope}
+ \draw (0mm,6mm) -- (10mm,6mm);
+ \begin{scope}[green]
+ \draw (0mm,4mm) -- (10mm,4mm);
+ \draw (0mm,2mm) -- (10mm,2mm);
+ \draw[blue] (0mm,0mm) -- (10mm,0mm);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/name=\meta{scope name}}
+ Assigns a name to a scope reference in animations. The name is a
+ ``high-level'' name that drivers do not see, so you can use spaces,
+ number, letters, in a name, but you should \emph{not} use any
+ punctuation like a dot, a comma, or a colon.
+ \end{key}
+
+ The following style influences scopes:
+ %
+ \begin{stylekey}{/tikz/every scope (initially \normalfont empty)}
+ This style is installed at the beginning of every scope.
+ \end{stylekey}
+
+ The following options are useful for scopes:
+ %
+ \begin{key}{/tikz/execute at begin scope=\meta{code}}
+ This option install some code that will be executed at the beginning of
+ the scope. This option must be given in the argument of the |{scope}|
+ environment.
+
+ The effect applies only to the current scope, not to subscopes.
+ \end{key}
+
+ \begin{key}{/tikz/execute at end scope=\meta{code}}
+ This option installs some code that will be executed at the end of the
+ current scope. Using this option multiple times will cause the code to
+ accumulate. This option must also be given in the optional argument of
+ the |{scope}| environment.
+
+ Again, the effect applies only to the current scope, not to subscopes.
+ \end{key}
+\end{environment}
+
+\begin{plainenvironment}{{scope}\opt{\meta{animations spec}}\opt{\oarg{options}}}
+ Plain \TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{scope}\opt{\meta{animations spec}}\opt{\oarg{options}}}
+ Con\TeX t version of the environment.
+\end{contextenvironment}
+
+
+\subsubsection{Shorthand for Scope Environments}
+
+There is a small library that makes using scopes a bit easier:
+%
+\begin{tikzlibrary}{scopes}
+ This library defines a shorthand for starting and ending |{scope}|
+ environments.
+\end{tikzlibrary}
+
+When this library is loaded, the following happens: At certain places inside a
+\tikzname\ picture, it is allowed to start a scope just using a single brace,
+provided the single brace is followed by options in square brackets:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ { [ultra thick]
+ { [red]
+ \draw (0mm,10mm) -- (10mm,10mm);
+ \draw (0mm,8mm) -- (10mm,8mm);
+ }
+ \draw (0mm,6mm) -- (10mm,6mm);
+ }
+ { [green]
+ \draw (0mm,4mm) -- (10mm,4mm);
+ \draw (0mm,2mm) -- (10mm,2mm);
+ \draw[blue] (0mm,0mm) -- (10mm,0mm);
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+In the above example, |{ [thick]| actually causes a |\begin{scope}[thick]| to
+be inserted, and the corresponding closing |}| causes an |\end{scope}| to be
+inserted.
+
+The ``certain places'' where an opening brace has this special meaning are the
+following: First, right after the semicolon that ends a path. Second, right
+after the end of a scope. Third, right at the beginning of a scope, which
+includes the beginning of a picture. Also note that some square bracket must
+follow, otherwise the brace is treated as a normal \TeX\ scope.
+
+
+\subsubsection{Single Command Scopes}
+
+In some situations it is useful to create a scope for a single command. For
+instance, when you wish to use algorithm graph drawing in order to layout a
+tree, the path of the tree needs to be surrounded by a scope whose only purpose
+is to take a key that selects a layout for the scope. Similarly, in order to
+put something on a background layer, a scope needs to be created. In such
+cases, where it will cumbersome to create a |\begin{scope}| and |\end{scope}|
+pair just for a single command, the |\scoped| command may be useful:
+
+\begin{command}{\scoped\opt{\meta{animations spec}}\opt{\oarg{options}}\meta{path command}}
+ This command works like |\tikz|, only you can use it inside a
+ |{tikzpicture}|. It will take the following \meta{path command} and
+ put it inside a |{scope}| with the \meta{options} set. The
+ \meta{path command} may either be a single command ended by a
+ semicolon or it may contain multiple commands, but then they must be
+ surrounded by curly braces.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [fill=white] at (1,1) {Hello world};
+ \scoped [on background layer]
+ \draw (0,0) grid (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Using Scopes Inside Paths}
+
+The |\path| command, which is described in much more detail in later sections,
+also takes graphic options. These options are local to the path. Furthermore,
+it is possible to create local scopes within a path simply by using curly
+braces as in
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (1,1)
+ {[rounded corners] -- (2,0) -- (3,1)}
+ -- (3,0) -- (2,1);
+\end{codeexample}
+
+Note that many options apply only to the path as a whole and cannot be scoped
+in this way. For example, it is not possible to scope the |color| of the path.
+See the explanations in the section on paths for more details.
+
+Finally, certain elements that you specify in the argument to the |\path|
+command also take local options. For example, a node specification takes
+options. In this case, the options apply only to the node, not to the
+surrounding path.
+
+
+\subsection{Using Graphic Options}
+\label{section-graphic-options}
+
+\subsubsection{How Graphic Options Are Processed}
+
+Many commands and environments of \tikzname\ accept \emph{options}. These
+options are so-called \emph{key lists}. To process the options, the following
+command is used, which you can also call yourself. Note that it is usually
+better not to call this command directly, since this will ensure that the
+effect of options are local to a well-defined scope.
+
+\begin{command}{\tikzset\marg{options}}
+ This command will process the \meta{options} using the |\pgfkeys| command,
+ documented in detail in Section~\ref{section-keys}, with the default path
+ set to |/tikz|. Under normal circumstances, the \meta{options} will be
+ lists of comma-separated pairs of the form \meta{key}|=|\meta{value}, but
+ more fancy things can happen when you use the power of the |pgfkeys|
+ mechanism, see Section~\ref{section-keys} once more.
+
+ When a pair \meta{key}|=|\meta{value} is processed, the following happens:
+ %
+ \begin{enumerate}
+ \item If the \meta{key} is a full key (starts with a slash) it is
+ handled directly as described in Section~\ref{section-keys}.
+ \item Otherwise (which is usually the case), it is checked whether
+ |/tikz/|\meta{key} is a key and, if so, it is executed.
+ \item Otherwise, it is checked whether |/pgf/|\meta{key} is a key
+ and, if so, it is executed.
+ \item Otherwise, it is checked whether \meta{key} is a color and, if
+ so, |color=|\meta{key} is executed.
+ \item Otherwise, it is checked whether \meta{key} contains a dash
+ and, if so, |arrows=|\meta{key} is executed.
+ \item Otherwise, it is checked whether \meta{key} is the name of a
+ shape and, if so, |shape=|\meta{key} is executed.
+ \item Otherwise, an error message is printed.
+ \end{enumerate}
+
+ Note that by the above description, all keys starting with |/tikz| and also
+ all keys starting with |/pgf| can be used as \meta{key}s in an
+ \meta{options} list.
+\end{command}
+
+
+\subsubsection{Using Styles to Manage How Pictures Look}
+
+There is a way of organizing sets of graphic options ``orthogonally'' to the
+normal scoping mechanism. For example, you might wish all your ``help lines''
+to be drawn in a certain way like, say, gray and thin (do \emph{not} dash them,
+that distracts). For this, you can use \emph{styles}.
+
+A style is a key that, when used, causes a set of graphic options to be
+processed. Once a style has been defined, it can be used like any other key.
+For example, the predefined |help lines| style, which you should use for lines
+in the background like grid lines or construction lines.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) grid +(2,2);
+ \draw[help lines] (2,0) grid +(2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+Defining styles is also done using options. Suppose we wish to define a style
+called |my style| and when this style is used, we want the draw color to be set
+to |red| and the fill color be set to |red!20|. To achieve this, we use the
+following option:
+%
+\begin{codeexample}[code only]
+my style/.style={draw=red,fill=red!20}
+\end{codeexample}
+
+The meaning of the curious |/.style| is the following: ``The key |my style|
+should not be used here but, rather, be defined. So, set up things such that
+using the key |my style| will, in the following, have the same effect as if we
+had written |draw=red,fill=red!20| instead.''
+
+Returning to the help lines example, suppose we prefer blue help lines. This
+could be achieved as follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[help lines/.style={blue!50,very thin}]
+ \draw (0,0) grid +(2,2);
+ \draw[help lines] (2,0) grid +(2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+Naturally, one of the main ideas behind styles is that they can be used in
+different pictures. In this case, we have to use the |\tikzset| command
+somewhere at the beginning.
+%
+\begin{codeexample}[]
+\tikzset{help lines/.style={blue!50,very thin}}
+% ...
+\begin{tikzpicture}
+ \draw (0,0) grid +(2,2);
+ \draw[help lines] (2,0) grid +(2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+Since styles are just special cases of |pgfkeys|'s general style facility, you
+can actually do quite a bit more. Let us start with adding options to an
+already existing style. This is done using |/.append style| instead of
+|/.style|:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[help lines/.append style=blue!50]
+ \draw (0,0) grid +(2,2);
+ \draw[help lines] (2,0) grid +(2,2);
+\end{tikzpicture}
+\end{codeexample}
+%
+In the above example, the option |blue!50| is appended to the style
+|help lines|, which now has the same effect as |black!50,very thin,blue!50|.
+Note that two colors are set, so the last one will ``win''. There also exists a
+handler called |/.prefix style| that adds something at the beginning of the
+style.
+
+Just as normal keys, styles can be parameterized. This means that you write
+\meta{style}|=|\meta{value} when you use the style instead of just
+\meta{style}. In this case, all occurrences of |#1| in \meta{style} are
+replaced by \meta{value}. Here is an example that shows how this can be used.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50}]
+ \node [outline=red] at (0,1) {red};
+ \node [outline=blue] at (0,0) {blue};
+\end{tikzpicture}
+\end{codeexample}
+
+For parameterized styles you can also set a \emph{default} value using the
+|/.default| handler:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50},
+ outline/.default=black]
+ \node [outline] at (0,1) {default};
+ \node [outline=blue] at (0,0) {blue};
+\end{tikzpicture}
+\end{codeexample}
+
+For more details on using and setting styles, see also
+Section~\ref{section-keys}.
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-shapes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-shapes.tex
new file mode 100644
index 0000000000..01af022c29
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-shapes.tex
@@ -0,0 +1,3051 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Nodes and Edges}
+\label{section-nodes}
+
+\subsection{Overview}
+
+In the present section, the usage of \emph{nodes} in \tikzname\ is explained. A
+node is typically a rectangle or circle or another simple shape with some text
+on it.
+
+Nodes are added to paths using the special path operation |node|. Nodes
+\emph{are not part of the path itself}. Rather, they are added to the picture
+just before or after the path has been drawn.
+
+In Section~\ref{section-nodes-basic} the basic syntax of the node operation is
+explained, followed in Section~\ref{section-nodes-multi} by the syntax for
+multi-part nodes, which are nodes that contain several different text parts.
+After this, the different options for the text in nodes are explained. In
+Section~\ref{section-nodes-anchors} the concept of \emph{anchors} is introduced
+along with their usage. In Section~\ref{section-nodes-transformations} the
+different ways transformations affect nodes are studied.
+Sections~\ref{section-nodes-placing-1} and~\ref{section-nodes-placing-2} are
+about placing nodes on or next to straight lines and curves.
+Section~\ref{section-nodes-connecting} explains how a node can be used as a
+``pseudo-coordinate''. Section~\ref{section-nodes-edges} introduces the |edge|
+operation, which works similar to the |to| operation and also similar to the
+|node| operation.
+
+
+\subsection{Nodes and Their Shapes}
+\label{section-nodes-basic}
+
+In the simplest case, a node is just some text that is placed at some
+coordinate. However, a node can also have a border drawn around it or have a
+more complex background and foreground. Indeed, some nodes do not have a text
+at all, but consist solely of the background. You can name nodes so that you
+can reference their coordinates later in the same picture or, if certain
+precautions are taken as explained in Section~\ref{section-cross-picture-tikz},
+also in different pictures.
+
+There are no special \TeX\ commands for adding a node to a picture; rather,
+there is path operation called |node| for this. Nodes are created whenever
+\tikzname\ encounters |node| or |coordinate| at a point on a path where it
+would expect a normal path operation (like |-- (1,1)| or |rectangle (1,1)|). It
+is also possible to give node specifications \emph{inside} certain path
+operations as explained later.
+
+The node operation is typically followed by some options, which apply only to
+the node. Then, you can optionally \emph{name} the node by providing a name in
+parentheses. Lastly, for the |node| operation you must provide some label text
+for the node in curly braces, while for the |coordinate| operation you may not.
+The node is placed at the current position of the path either \emph{after the
+path has been drawn} or (more seldomly and only if you add the |behind path|
+option) \emph{just before the path is drawn.} Thus, all nodes are drawn ``on
+top'' or ``behind'' the path and are retained until the path is complete. If
+there are several nodes on a path, perhaps some behind and some on top of the
+path, first come the nodes behind the path in the order they were encountered,
+then comes that path, and then come the remaining node, again in the order they
+are encountered.
+%
+\begin{codeexample}[]
+\tikz \fill [fill=yellow!80!black]
+ (0,0) node {first node}
+ -- (1,1) node[behind path] {second node}
+ -- (2,0) node {third node};
+\end{codeexample}
+
+
+\subsubsection{Syntax of the Node Command}
+
+The syntax for specifying nodes is the following:
+%
+\begin{pathoperation}{node}{
+ \opt{\meta{foreach statements}}
+ \opt{|[|\meta{options}|]|}
+ \opt{|(|\meta{name}|)|}
+ \opt{|at(|\meta{coordinate}|)|}
+ \opt{|:|\meta{animation attribute}|=|\marg{options}}
+ \opt{\marg{node contents}}%
+}
+ Since this path operation is one of the most involved around, let us go
+ over it step by step.
+
+ \medskip
+ \textbf{Order of the parts of the specification.}
+ Everything between ``|node|'' and the opening brace of a node is optional.
+ If there are \meta{foreach statements}, they must come first, directly
+ following ``|node|''. Other than that, the ordering of all the other
+ elements of a node specification (the \meta{options}, the \meta{name},
+ \meta{coordinate}, and \meta{animation attribute}) is arbitrary, indeed,
+ there can be multiple occurrences of any of these elements (although for
+ the name and the coordinate this makes no sense).
+
+ \medskip
+ \textbf{The text of a node.}
+ At the end of a node, you must (normally) provide some \meta{node contents}
+ in curly braces; indeed, the ``end'' of the node specification is detected
+ by the opening curly brace. For normal nodes it is possible to use
+ ``fragile'' stuff inside the \meta{node contents} like the |\verb| command
+ (for the technically savvy: code inside the \meta{node contents} is allowed
+ to change catcodes; however, this rule does not apply to ``nodes on a
+ path'' to be discussed later).
+
+ Instead of giving \meta{node contents} at the end of the node in curly
+ braces, you can also use the following key:
+ %
+ \begin{key}{/tikz/node contents=\meta{node contents}}
+ \label{option-node-contents}%
+ This key sets the contents of the node to the given text as if you had
+ given it at the end in curly braces. When the option is used inside the
+ options of a node, the parsing of the node stops immediately after the
+ end of the option block. In particular, the option block cannot be
+ followed by further option blocks or curly braces (or, rather, these do
+ not count as part of the node specification.) Also note that the
+ \meta{node contents} may not contain fragile stuff since the catcodes
+ get fixed upon reading the options. Here is an example:
+ %
+\begin{codeexample}[]
+\tikz {
+ \path (0,0) node [red] {A}
+ (1,0) node [blue] {B}
+ (2,0) node [green, node contents=C]
+ (3,0) node [node contents=D] ;
+}
+\end{codeexample}
+ %
+\end{key}
+
+ \medskip
+ \textbf{Specifying the location of the node.}
+ Nodes are placed at the last position mentioned on the path. The effect of
+ adding ``|at|'' to a node specification is that the coordinate given after
+ |at| is used instead. The |at| syntax is not available when a node is given
+ inside a path operation (it would not make any sense there).
+
+ \begin{key}{/tikz/at=\meta{coordinate}}
+ This is another way of specifying the |at| coordinate. Note that,
+ typically, you will have to enclose the \meta{coordinate} in curly
+ braces so that a comma inside the \meta{coordinate} does not confuse
+ \TeX.
+ \end{key}
+
+ Another aspect of the ``location'' of a node is whether it appears \emph{in
+ front of} or \emph{behind} the current path. You can change which of these
+ two possibilities happens on a node-by-node basis using the following keys:
+ %
+ \begin{key}{/tikz/behind path}
+ When this key is set, either as a local option for the node or some
+ surrounding scope, the node will be drawn behind the current path. For
+ this, \tikzname\ collects all nodes defined on the current path with
+ this option set and then inserts all of them, in the order they appear,
+ just before it draws the path. Thus, several nodes with this option set
+ may obscure one another, but never the path itself. ``Just before it
+ draws the path'' actually means that the nodes are inserted into the
+ page output just before any pre-actions are applied to the path (see
+ below for what pre-actions are).
+ %
+\begin{codeexample}[]
+\tikz \fill [fill=blue!50, draw=blue, very thick]
+ (0,0) node [behind path, fill=red!50] {first node}
+ -- (1.5,0) node [behind path, fill=green!50] {second node}
+ -- (1.5,1) node [behind path, fill=brown!50] {third node}
+ -- (0,1) node [ fill=blue!30] {fourth node};
+\end{codeexample}
+
+ Note that |behind path| only applies to the current path; not to the
+ current scope or picture. To put a node ``behind everything'' you need
+ to use layers and options like |on background layer|, see the
+ background library in Section~\ref{section-tikz-backgrounds}.
+ \end{key}
+
+ \begin{key}{/tikz/in front of path}
+ This is the opposite of |behind path|: It causes nodes to be drawn on
+ top of the path. Since this is the default behaviour, you usually do
+ not need this option; it is only needed when an enclosing scope has
+ used |behind path| and you now wish to ``switch back'' to the normal
+ behaviour.
+ \end{key}
+
+ \medskip
+ \textbf{The name of a node.}
+ The |(|\meta{name}|)| is a name for later reference and it is optional. You
+ may also add the option |name=|\meta{name} to the \meta{option} list; it
+ has the same effect.
+
+ \begin{key}{/tikz/name=\meta{node name}}
+ Assigns a name to the node for later reference. Since this is a
+ ``high-level'' name (drivers never know of it), you can use spaces,
+ number, letters, or whatever you like when naming a node. Thus, you can
+ name a node just |1| or perhaps |start of chart| or even |y_1|. Your
+ node name should \emph{not} contain any punctuation like a dot, a
+ comma, or a colon since these are used to detect what kind of
+ coordinate you mean when you reference a node.
+ \end{key}
+
+ \begin{key}{/tikz/alias=\meta{another node name}}
+ This option allows you to provide another name for the node. Giving
+ this option multiple times will allow you to access the node via
+ several aliases. Using the |node also| syntax, you can also assign an
+ alias name to a node at a later point, see
+ Section~\ref{section-node-also}.
+ \end{key}
+
+ \medskip
+ \textbf{The options of a node.}
+ The \meta{options} is an optional list of options that \emph{apply only to
+ the node} and have no effect outside. The other way round, most ``outside''
+ options also apply to the node, but not all. For example, the ``outside''
+ rotation does not apply to nodes (unless some special options are used,
+ sigh). Also, the outside path action, like |draw| or |fill|, never applies
+ to the node and must be given in the node (unless some special other
+ options are used, deep sigh).
+
+ \medskip
+ \textbf{The shape of a node.}
+ As mentioned before, we can add a border and even a background to a node:
+ %
+\begin{codeexample}[]
+\tikz \fill[fill=yellow!80!black]
+ (0,0) node {first node}
+ -- (1,1) node[draw, behind path] {second node}
+ -- (0,2) node[fill=red!20,draw,double,rounded corners] {third node};
+\end{codeexample}
+
+ The ``border'' is actually just a special case of a much more general
+ mechanism. Each node has a certain \emph{shape} which, by default, is a
+ rectangle. However, we can also ask \tikzname\ to use a circle shape
+ instead or an ellipse shape (you have to include one of the
+ |shapes.geometric| library for the latter shape):
+ %
+\begin{codeexample}[]
+\tikz \fill[fill=yellow!80!black]
+ (0,0) node {first node}
+ -- (1,1) node[ellipse,draw, behind path] {second node}
+ -- (0,2) node[circle,fill=red!20] {third node};
+\end{codeexample}
+
+ There are many more shapes available such as, say, a shape for a resistor
+ or a large arrow, see the |shapes| library in
+ Section~\ref{section-libs-shapes} for details.
+
+ To select the shape of a node, the following option is used:
+ %
+ \begin{key}{/tikz/shape=\meta{shape name} (initially rectangle)}
+ Select the shape either of the current node or, when this option is not
+ given inside a node but somewhere outside, the shape of all nodes in
+ the current scope.%
+ \indexoption{\meta{shape name}}
+
+ Since this option is used often, you can leave out the |shape=|. When
+ \tikzname\ encounters an option like |circle| that it does not know, it
+ will, after everything else has failed, check whether this option is
+ the name of some shape. If so, that shape is selected as if you had
+ said |shape=|\meta{shape name}.
+
+ By default, the following shapes are available: |rectangle|, |circle|,
+ |coordinate|. Details of these shapes, like their anchors and size
+ options, are discussed in Section~\ref{section-the-shapes}.
+ \end{key}
+
+ \medskip
+ \textbf{Animating a node.}
+ When you say |:|\meta{animation attribute}|={|\meta{options}|}|, an
+ \emph{animation} of the specified attribute is added to the node.
+ Animations are discussed in detail in
+ Section~\ref{section-tikz-animations}. Here is a typical example of how
+ this syntax can be used:
+ %
+\begin{codeexample}[animation list={0.5,1,1.5,2}]
+\tikz
+ \node :fill opacity = { 0s="1", 2s="0", begin on=click }
+ :rotate = { 0s="0", 2s="90", begin on=click }
+ [fill = blue!20, draw = blue, ultra thick, circle]
+ {Click me!};
+\end{codeexample}
+
+ \medskip
+ \textbf{The foreach statement for nodes.}
+ At the beginning of a node specification (and only there) you can provide
+ multiple \meta{foreach statements}, each of which has the form |foreach|
+ \meta{var} |in| |{|\meta{list}|}| (note that there is no slash before
+ |foreach|). When they are given, instead of a single node, multiple nodes
+ will be created: The \meta{var} will iterate over all values of \meta{list}
+ and for each of them, a new node is created. These nodes are all created
+ using all the text following the \meta{foreach statements}, but in each
+ copy the \meta{var} will have the current value of the current element in
+ the \meta{list}.
+
+ As an example, the following two codes have the same effect:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) node foreach \x in {1,2,3} at (\x,0) {\x};
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \draw (0,0) node at (1,0) {1} node at (2,0) {2} node at (3,0) {3};
+\end{codeexample}
+%
+ When you provide several |foreach| statements, they work like ``nested
+ loops'':
+ %
+\begin{codeexample}[]
+\tikz \node foreach \x in {1,...,4} foreach \y in {1,2,3}
+ [draw] at (\x,\y) {\x,\y};
+\end{codeexample}
+ %
+ As the example shows, a \meta{list} can contain ellipses (three dots) to
+ indicated that a larger number of numbers is meant. Indeed, you can use the
+ full power of the |\foreach| command here, including multiple parameters
+ and options, see Section~\ref{section-foreach}.
+
+ \medskip
+ \textbf{Styles for nodes.}
+ The following styles influence how nodes are rendered:
+ %
+ \begin{stylekey}{/tikz/every node (initially \normalfont empty)}
+ This style is installed at the beginning of every node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw}]
+ \draw (0,0) node {A} -- (1,1) node {B};
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+ %
+ \begin{stylekey}{/tikz/every \meta{shape} node (initially \normalfont empty)}
+ These styles are installed at the beginning of a node of a given
+ \meta{shape}. For example, |every rectangle node| is used for rectangle
+ nodes, and so on.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [every rectangle node/.style={draw},
+ every circle node/.style={draw,double}]
+ \draw (0,0) node[rectangle] {A} -- (1,1) node[circle] {B};
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{key}{/tikz/execute at begin node=\meta{code}}
+ This option causes \meta{code} to be executed at the beginning of a
+ node. Using this option multiple times will cause the code to
+ accumulate.
+ \end{key}
+
+ \begin{key}{/tikz/execute at end node=\meta{code}}
+ This option installs \meta{code} that will be executed at the end of
+ the node. Using this option multiple times will cause the code to
+ accumulate.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [execute at begin node={A},
+ execute at end node={D}]
+ \node[execute at begin node={B}] {C};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \end{key}
+
+ \medskip
+ \textbf{Name scopes.}
+ It turns out that the name of a node can further be influenced using two
+ keys:
+ %
+ \begin{key}{/tikz/name prefix=\meta{text} (initially \normalfont empty)}
+ The value of this key is prefixed to every node inside the current
+ scope. This includes both the naming of the node (via the |name| key or
+ via the implicit |(|\meta{name}|)| syntax) as well as any referencing
+ of the node. Outside the scope, the nodes can (and need to) be
+ referenced using ``full name'' consisting of the prefix and the node
+ name.
+
+ The net effect of this is that you can set the name prefix at the
+ beginning of a scope to some value and then use short and simple names
+ for the nodes inside the scope. Later, outside the scope, you can
+ reference the nodes via their full name:
+ %
+\begin{codeexample}[]
+\tikz {
+ \begin{scope}[name prefix = top-]
+ \node (A) at (0,1) {A};
+ \node (B) at (1,1) {B};
+ \draw (A) -- (B);
+ \end{scope}
+ \begin{scope}[name prefix = bottom-]
+ \node (A) at (0,0) {A};
+ \node (B) at (1,0) {B};
+ \draw (A) -- (B);
+ \end{scope}
+
+ \draw [red] (top-A) -- (bottom-B);
+}
+\end{codeexample}
+ %
+ As can be seen, name prefixing makes it easy to write reusable code.
+ \end{key}
+ %
+ \begin{key}{/tikz/name suffix=\meta{text} (initially \normalfont empty)}
+ Works as |name prefix|, only the \meta{text} is appended to every node
+ name in the current scope.
+ \end{key}
+\end{pathoperation}
+
+There is a special syntax for specifying ``light-weight'' nodes:
+
+\begin{pathoperation}{coordinate}{\opt{|[|\meta{options}|]|}|(|\meta{name}|)|\opt{|at(|\meta{coordinate}|)|}}
+ This has the same effect as
+
+ |\node[shape=coordinate]|\verb|[|\meta{options}|](|\meta{name}|)at(|\meta{coordinate}|){}|,
+
+ where the |at| part may be omitted.
+\end{pathoperation}
+
+Since nodes are often the only path operation on paths, there are two special
+commands for creating paths containing only a node:
+
+\begin{command}{\node}
+ Inside |{tikzpicture}| this is an abbreviation for |\path node|.
+\end{command}
+
+\begin{command}{\coordinate}
+ Inside |{tikzpicture}| this is an abbreviation for |\path coordinate|.
+\end{command}
+
+
+\subsubsection{Predefined Shapes}
+\label{section-nodes-predefined}
+\label{section-the-shapes}
+
+\pgfname\ \todosp{why two labels for the same point? The first doesn't seem to
+be used anywhere} and \tikzname\ define three shapes, by default:
+%
+\begin{itemize}
+ \item |rectangle|,
+ \item |circle|, and
+ \item |coordinate|.
+\end{itemize}
+%
+By loading library packages, you can define more shapes like ellipses or
+diamonds; see Section~\ref{section-libs-shapes} for the complete list of
+shapes.
+
+\label{section-tikz-coordinate-shape}%
+The |coordinate| shape is handled in a special way by \tikzname. When a node
+|x| whose shape is |coordinate| is used as a coordinate |(x)|, this has the
+same effect as if you had said |(x.center)|. None of the special ``line
+shortening rules'' apply in this case. This can be useful since, normally, the
+line shortening causes paths to be segmented and they cannot be used for
+filling. Here is an example that demonstrates the difference:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw}]
+ \path[yshift=1.5cm,shape=rectangle]
+ (0,0) node(a1){} (1,0) node(a2){}
+ (1,1) node(a3){} (0,1) node(a4){};
+ \filldraw[fill=yellow!80!black] (a1) -- (a2) -- (a3) -- (a4);
+
+ \path[shape=coordinate]
+ (0,0) coordinate(b1) (1,0) coordinate(b2)
+ (1,1) coordinate(b3) (0,1) coordinate(b4);
+ \filldraw[fill=yellow!80!black] (b1) -- (b2) -- (b3) -- (b4);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Common Options: Separations, Margins, Padding and
+ Border Rotation}
+\label{section-shape-seps}
+\label{section-shape-common-options}
+
+The \todosp{why two labels for the same point?} exact behaviour of shapes
+differs, shapes defined for more special purposes (like a, say, transistor
+shape) will have even more custom behaviors. However, there are some options
+that apply to most shapes:
+
+\begin{key}{/pgf/inner sep=\meta{dimension} (initially .3333em)}
+ \keyalias{tikz}
+ An additional (invisible) separation space of \meta{dimension} will be
+ added inside the shape, between the text and the shape's background path.
+ The effect is as if you had added appropriate horizontal and vertical skips
+ at the beginning and end of the text to make it a bit ``larger''.
+
+ For those familiar with \textsc{css}, this is the same as \emph{padding}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) node[inner sep=0pt,draw] {tight}
+ (0cm,2em) node[inner sep=5pt,draw] {loose}
+ (0cm,4em) node[fill=yellow!80!black] {default};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/inner xsep=\meta{dimension} (initially .3333em)}
+ \keyalias{tikz}
+ Specifies the inner separation in the $x$-direction, only.
+\end{key}
+
+\begin{key}{/pgf/inner ysep=\meta{dimension} (initially .3333em)}
+ \keyalias{tikz}
+ Specifies the inner separation in the $y$-direction, only.
+\end{key}
+
+\begin{key}{/pgf/outer sep=\meta{dimension or ``auto''}}
+ \keyalias{tikz}
+ This option adds an additional (invisible) separation space of
+ \meta{dimension} outside the background path. The main effect of this
+ option is that all anchors will move a little ``to the outside''.
+
+ For those familiar with \textsc{css}, this is same as \emph{margin}.
+
+ The default for this option is half the line width. When the default is
+ used and when the background path is draw, the anchors will lie exactly on
+ the ``outside border'' of the path (not on the path itself).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[line width=5pt]
+ (0,0) node[fill=yellow!80!black] (f) {filled}
+ (2,0) node[draw] (d) {drawn}
+ (1,-2) node[draw,scale=2] (s) {scaled};
+
+ \draw[->] (1,-1) -- (f);
+ \draw[->] (1,-1) -- (d);
+ \draw[->] (1,-1) -- (s);
+\end{tikzpicture}
+\end{codeexample}
+
+ As the above example demonstrates, the standard settings for the outer sep
+ are not always ``correct''. First, when a shape is filled, but not drawn,
+ the outer sep should actually be |0|. Second, when a node is scaled, for
+ instance by a factor of 5, the outer separation also gets scaled by a
+ factor of 5, while the line width stays at its original width; again
+ causing problems.
+
+ In such cases, you can say |outer sep=auto| to make \tikzname\ \emph{try}
+ to compensate for the effects described above. This is done by, firstly,
+ setting the outer sep to |0| when no drawing is done and, secondly, setting
+ the outer separations to half the line width (as before) times two
+ adjustment factors, one for the horizontal separations and one for the
+ vertical separations (see Section~\ref{section-adjustment-transformations}
+ for details on these factors). Note, however, that these factors can
+ compensate only for transformations that are either scalings plus rotations
+ or scalings with different magnitudes in the horizontal and the vertical
+ direction. If you apply slanting, the factors will only approximate the
+ correct values.
+
+ In general, it is a good idea to say |outer sep=auto| at some early stage.
+ It is not the default mainly for compatibility with earlier versions.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[outer sep=auto]
+ \draw[line width=5pt]
+ (0,0) node[fill=yellow!80!black] (f) {filled}
+ (2,0) node[draw] (d) {drawn}
+ (1,-2) node[draw,scale=2] (s) {scaled};
+
+ \draw[->] (1,-1) -- (f);
+ \draw[->] (1,-1) -- (d);
+ \draw[->] (1,-1) -- (s);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/outer xsep=\meta{dimension} (initially .5\string\pgflinewidth)}
+ \keyalias{tikz}
+ Specifies the outer separation in the $x$-direction, only. This value will
+ be overwritten when |outer sep| is set, either to the value given there or
+ a computed value in case of |auto|.
+\end{key}
+
+\begin{key}{/pgf/outer ysep=\meta{dimension} (initially .5\string\pgflinewidth)}
+ \keyalias{tikz}
+ Specifies the outer separation in the $y$-direction, only.
+\end{key}
+
+\begin{key}{/pgf/minimum height=\meta{dimension} (initially 1pt)}
+ \keyalias{tikz}
+ This option ensures that the height of the shape (including the inner, but
+ ignoring the outer separation) will be at least \meta{dimension}. Thus, if
+ the text plus the inner separation is not at least as large as
+ \meta{dimension}, the shape will be enlarged appropriately. However, if the
+ text is already larger than \meta{dimension}, the shape will not be shrunk.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) node[minimum height=1cm,draw] {1cm}
+ (2,0) node[minimum height=0cm,draw] {0cm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/minimum width=\meta{dimension} (initially 1pt)}
+ \keyalias{tikz}
+ Same as |minimum height|, only for the width.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) node[minimum height=2cm,minimum width=3cm,draw] {$3 \times 2$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/minimum size=\meta{dimension}}
+ \keyalias{tikz}
+ Sets both the minimum height and width at the same time.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) node[minimum size=2cm,draw] {square};
+ \draw (0,-2) node[minimum size=2cm,draw,circle] {circle};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/pgf/shape aspect=\meta{aspect ratio}}
+ \keyalias{tikz}
+ Sets a desired aspect ratio for the shape. For the |diamond| shape, this
+ option sets the ratio between width and height of the shape.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) node[shape aspect=1,diamond,draw] {aspect 1};
+ \draw (0,-2) node[shape aspect=2,diamond,draw] {aspect 2};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+ \label{section-rotating-shape-borders}
+
+Some shapes (but not all), support a special kind of rotation. This rotation
+affects only the border of a shape and is independent of the node contents, but
+\emph{in addition} to any other transformations.
+%
+\begin{codeexample}[]
+\tikzset{every node/.style={dart, shape border uses incircle,
+ inner sep=1pt, draw}}
+\tikz \node foreach \a/\b/\c in {A/0/0, B/45/0, C/0/45, D/45/45}
+ [shape border rotate=\b, rotate=\c] at (\b/36,-\c/36) {\a};
+\end{codeexample}
+
+There are two types of rotation: restricted and unrestricted. Which type of
+rotation is applied is determined by on how the shape border is constructed. If
+the shape border is constructed using an incircle, that is, a circle that
+tightly fits the node contents (including the |inner sep|), then the rotation
+can be unrestricted. If, however, the border is constructed using the natural
+dimensions of the node contents, the rotation is restricted to integer
+multiples of 90 degrees.
+
+Why should there be two kinds of rotation and border construction? Borders
+constructed using the natural dimensions of the node contents provide a much
+tighter fit to the node contents, but to maintain this tight fit, the border
+rotation must be restricted to integer multiples of 90 degrees. By using an
+incircle, unrestricted rotation is possible, but the border will not make a
+very tight fit to the node contents.
+%
+\begin{codeexample}[]
+\tikzset{every node/.style={isosceles triangle, draw}}
+\begin{tikzpicture}
+ \node {abc};
+ \node [shape border uses incircle] at (2,0) {abc};
+\end{tikzpicture}
+\end{codeexample}
+
+There are \pgfname{} keys that determine how a shape border is constructed, and
+to specify its rotation. It should be noted that not all shapes support these
+keys, so reference should be made to the documentation for individual shapes.
+
+\begin{key}{/pgf/shape border uses incircle=\opt{\meta{boolean}} (default true)}
+ \keyalias{tikz}
+ Determines if the border of a shape is constructed using the incircle. If
+ no value is given \meta{boolean} will take the default value |true|.
+\end{key}
+
+\begin{key}{/pgf/shape border rotate=\meta{angle} (initially 0)}
+ \keyalias{tikz}
+ Rotates the border of a shape independently of the node contents, but in
+ addition to any other transformations. If the shape border is not
+ constructed using the incircle, the rotation will be rounded to the nearest
+ integer multiple of 90 degrees when the shape is drawn.
+\end{key}
+
+Note that if the border of the shape is rotated, the compass point anchors, and
+`text box' anchors (including |mid east|, |base west|, and so on), \emph{do not
+rotate}, but the other anchors do:
+%
+\begin{codeexample}[]
+\tikzset{every node/.style={shape=trapezium, draw, shape border uses incircle}}
+\begin{tikzpicture}
+ \node at (0,0) (A) {A};
+ \node [shape border rotate=30] at (1.5,0) (B) {B};
+ \foreach \s/\t in
+ {left side/base east, bottom side/north, bottom left corner/base}{
+ \fill[red] (A.\s) circle(1.5pt) (B.\s) circle(1.5pt);
+ \fill[blue] (A.\t) circle(1.5pt) (B.\t) circle(1.5pt);
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+Finally, a somewhat unfortunate side-effect of rotating shape borders is that
+the supporting shapes do not distinguish between |outer xsep| and |outer ysep|,
+and typically, the larger of the two values will be used.
+
+
+\subsection{Multi-Part Nodes}
+\label{section-nodes-multi}
+
+Most nodes just have a single simple text label. However, nodes of a more
+complicated shape might be made up from several \emph{node parts}. For example,
+in automata theory a so-called Moore state has a state name, drawn in the upper
+part of the state circle, and an output text, drawn in the lower part of the
+state circle. These two parts are quite independent. Similarly, a \textsc{uml}
+class shape would have a name part, a method part, and an attributes part.
+Different molecule shapes might use parts for the different atoms to be drawn
+at the different positions, and so on.
+
+Both \pgfname\ and \tikzname\ support such multipart nodes. On the lower level,
+\pgfname\ provides a system for specifying that a shape consists of several
+parts. On the \tikzname\ level, you specify the different node parts by using
+the following command:
+
+\begin{command}{\nodepart\opt{|[|\meta{options}|]|}\marg{part name}}
+ This command can only be used inside the \meta{text} argument of a |node|
+ path operation. It works a little bit like a |\part| command in \LaTeX. It
+ will stop the typesetting of whatever node part was typeset until now and
+ then start putting all following text into the node part named \meta{part
+ name} -- until another |\partname| is encountered or until the node
+ \meta{text} ends. The \meta{options} will be local to this part.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circle split,draw,double,fill=red!20]
+ {
+ % No \nodepart has been used, yet. So, the following is put in the
+ % ``text'' node part by default.
+ $q_1$
+ \nodepart{lower} % Ok, end ``text'' part, start ``output'' part
+ $00$
+ }; % output part ended.
+\end{tikzpicture}
+\end{codeexample}
+
+ You will have to lookup which parts are defined by a shape.
+
+ The following styles influences node parts:
+ %
+ \begin{stylekey}{/tikz/every \meta{part name} node part (initially \normalfont empty)}
+ This style is installed at the beginning of every node part named
+ \meta{part name}.
+ %
+\begin{codeexample}[]
+\tikz [every lower node part/.style={red}]
+ \node [circle split,draw] {$q_1$ \nodepart{lower} $00$};
+\end{codeexample}
+ \end{stylekey}
+\end{command}
+
+
+\subsection{The Node Text}
+\label{section-nodes-options}
+
+\subsubsection{Text Parameters: Color and Opacity}
+
+The simplest option for the text in nodes is its color. Normally, this color is
+just the last color installed using |color=|, possibly inherited from another
+scope. However, it is possible to specifically set the color used for text
+using the following option:
+
+\begin{key}{/tikz/text=\meta{color}}
+ Sets the color to be used for text labels. A |color=| option will
+ immediately override this option.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[red] (0,0) -- +(1,1) node[above] {red};
+ \draw[text=red] (1,0) -- +(1,1) node[above] {red};
+ \draw (2,0) -- +(1,1) node[above,red] {red};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+Just like the color itself, you may also wish to set the opacity of the text
+only. For this, use the |text opacity| option, which is detailed in
+Section~\ref{section-tikz-transparency}.
+
+
+\subsubsection{Text Parameters: Font}
+
+Next, you may wish to adjust the font used for the text. Naturally, you can
+just use a font command like |\small| or |\rm| at the beginning of a node.
+However, the following two options make it easier to set the font used in nodes
+on a general basis. Let us start with:
+
+\begin{key}{/tikz/node font=\meta{font commands}}
+ This option sets the font used for all text used in a node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[node font=\itshape] (1,0) -- +(1,1) node[above] {italic};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ Since the \meta{font commands} are executed at a very early stage in the
+ construction of the node, the font selected using this command will also
+ dictate the values of dimensions defined in terms of |em| or |ex|. For
+ instance, when the |minimum height| of a node is |3em|, the actual height
+ will be (at least) three times the line distance selected by the \meta{font
+ commands}:
+\begin{codeexample}[]
+\tikz \node [node font=\tiny, minimum height=3em, draw] {tiny};
+\tikz \node [node font=\small, minimum height=3em, draw] {small};
+\end{codeexample}
+ %
+\end{key}
+
+The other font command is:
+%
+\begin{key}{/tikz/font=\meta{font commands}}
+ Sets the font used for the text inside nodes. However, this font will
+ \emph{not} (yet) be installed when any of the dimensions of the node are
+ being computed, so dimensions like |1em| will be with respect to the font
+ used outside the node (usually the font that was in force when the picture
+ started).
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [font=\itshape] {italic};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \node [font=\tiny, minimum height=3em, draw] {tiny};
+\tikz \node [font=\small, minimum height=3em, draw] {small};
+\end{codeexample}
+
+ A useful example of how the |font| option can be used is the following:
+ %
+\begin{codeexample}[]
+\tikz [every text node part/.style={font=\itshape},
+ every lower node part/.style={font=\footnotesize}]
+ \node [circle split,draw] {state \nodepart{lower} output};
+\end{codeexample}
+
+ As can be seen, the font can be changed for each node part. This does
+ \emph{not} work with the |node font| command since, as the name suggests,
+ this command can only be used to select the ``overall'' font for the node
+ and this is done very early.
+\end{key}
+
+
+\subsubsection{Text Parameters: Alignment and Width for Multi-Line Text}
+
+Normally, when a node is typeset, all the text you give in the braces is put in
+one long line (in an |\hbox|, to be precise) and the node will become as wide
+as necessary.
+
+From time to time you may wish to create nodes that contain multiple lines of
+text. There are three different ways of achieving this:
+%
+\begin{enumerate}
+ \item Inside the node, you can put some standard environment that produces
+ multi-line, aligned text. For instance, you can use a |{tabular}|
+ inside a node:
+ %
+\begin{codeexample}[width=5cm]
+\tikz \node [draw] {
+ \begin{tabular}{cc}
+ upper left & upper right\\
+ lower left & lower right
+ \end{tabular}
+};
+\end{codeexample}
+ %
+ This approach offers the most flexibility in the sense that it allows
+ you to use all of the alignment commands offered by your format of
+ choice.
+ \item You use |\\| inside your node to mark the end of lines and then
+ request \tikzname\ to arrange these lines in some manner. This will
+ only be done, however, if the |align| option has been given.
+ %
+\begin{codeexample}[]
+\tikz[align=left] \node[draw] {This is a\\demonstration.};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz[align=center] \node[draw] {This is a\\demonstration.};
+\end{codeexample}
+ %
+ The |\\| command takes an optional extra space as an argument in square
+ brackets.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,align=right]
+ {This is a\\[-2pt] demonstration text for\\[1ex] alignments.};
+\end{codeexample}
+ %
+ \item You can request that \tikzname\ does an automatic line-breaking for
+ you inside the node by specifying a fixed |text width| for the node. In
+ this case, you can still use |\\| to enforce a line-break. Note that
+ when you specify a text width, the node will have this width,
+ independently of whether the text actually ``reaches the end'' of the
+ node.
+\end{enumerate}
+
+Let us now first have a look at the |text width| command.
+ %
+\begin{key}{/tikz/text width=\meta{dimension}}
+ This option will put the text of a node in a box of the given width
+ (something akin to a |{minipage}| of this width, only portable across
+ formats). If the node text is not as wide as \meta{dimension}, it will
+ nevertheless be put in a box of this width. If it is larger, line breaking
+ will be done.
+
+ By default, when this option is given, a ragged right border will be used
+ (|align=left|). This is sensible since, typically, these boxes are narrow
+ and justifying the text looks ugly. You can, however, change the alignment
+ using |align| or directly using commands line |\centering|.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) node[fill=yellow!80!black,text width=3cm]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+ %
+ Setting \meta{dimension} to an empty string causes the automatic line
+ breaking to be disabled.
+\end{key}
+
+\begin{key}{/tikz/align=\meta{alignment option}}
+ This key is used to set up an alignment for multi-line text inside a node.
+ If |text width| is set to some width (let us call this \emph{alignment with
+ line breaking}), the |align| key will setup the |\leftskip| and the
+ |\rightskip| in such a way that the text is broken and aligned according to
+ \meta{alignment option}. If |text width| is not set (that is, set to the
+ empty string; let us call this \emph{alignment without line breaking}),
+ then a different mechanism is used internally, namely the key
+ |node halign header|, is set to an appropriate value. While this key, which
+ is documented below, is not to be used by beginners, the net effect is
+ simple: When |text width| is not set, you can use |\\| to break lines and
+ align them according to \meta{alignment option} and the resulting node's
+ width will be minimal to encompass the resulting lines.
+
+ In detail, you can set \meta{alignment option} to one of the following values:
+ %
+ \begin{description}
+ \item[|align=|\declare{|left|}] For alignment without line breaking,
+ the different lines are simply aligned such that their left borders
+ are below one another.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,align=left]
+ {This is a\\ demonstration text for\\ alignments.};
+\end{codeexample}
+ %
+ For alignment with line breaking, the same will happen; only the
+ lines will now, additionally, be broken automatically:
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=left]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+ %
+ \item[|align=|\declare{\texttt{flush left}}] For alignment without line
+ breaking this option has exactly the same effect as |left|.
+ However, for alignment with line breaking, there is a difference:
+ While |left| uses the original plain \TeX\ definition of a ragged
+ right border, in which \TeX\ will try to balance the right border
+ as well as possible, |flush left| causes the right border to be
+ ragged in the \LaTeX-style, in which no balancing occurs. This
+ looks ugly, but it may be useful for very narrow boxes and when you
+ wish to avoid hyphenations.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=flush left]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+ %
+ \item[|align=|\declare{|right|}] Works like |left|, only for right
+ alignment.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,align=right]
+ {This is a\\ demonstration text for\\ alignments.};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=right]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+ %
+ \item[|align=|\declare{\texttt{flush right}}] Works like |flush left|,
+ only for right alignment.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=flush right]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+ %
+ \item[|align=|\declare{|center|}] Works like |left| or |right|, only
+ for centered alignment.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,align=center]
+ {This is a\\ demonstration text for\\ alignments.};
+\end{codeexample}
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=center]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+
+ There is one annoying problem with the |center| alignment (but not
+ with |flush center| and the other options): If you specify a large
+ line width and the node text fits on a single line and is, in fact,
+ much shorter than the specified |text width|, an underfull
+ horizontal box will result. Unfortunately, this cannot be avoided,
+ due to the way \TeX\ works (more precisely, I have thought long and
+ hard about this and have not been able to figure out a sensible way
+ to avoid this). For this reason, \tikzname\ switches off horizontal
+ badness warnings inside boxes with |align=center|. Since this will
+ also suppress some ``wanted'' warnings, there is also an option for
+ switching the warnings on once more:
+ %
+ \begin{key}{/tikz/badness warnings for centered text=\meta{true or false} (initially false)}
+ If set to true, normal badness warnings will be issued for
+ centered boxes. Note that you may get annoying warnings for
+ perfectly normal boxes, namely whenever the box is very large
+ and the contents is not long enough to fill the box
+ sufficiently.
+ \end{key}
+ \item[|align=|\declare{\texttt{flush center}}] Works like |flush left|
+ or |flush right|, only for center alignment. Because of all the
+ trouble that results from the |center| option in conjunction with
+ narrow lines, I suggest picking this option rather than |center|
+ \emph{unless} you have longer text, in which case |center| will
+ give the typographically better results.
+ %
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=flush center]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+ %
+ \item[|align=|\declare{|justify|}] For alignment without line breaking,
+ this has the same effect as |left|. For alignment with line
+ breaking, this causes the text to be ``justified''. Use this only
+ with rather broad nodes.
+{%
+\hbadness=10000
+\begin{codeexample}[]
+\tikz \node[fill=yellow!80!black,text width=3cm,align=justify]
+ {This is a demonstration text for showing how line breaking works.};
+\end{codeexample}
+}
+ In the above example, \TeX\ complains (rightfully) about three very
+ badly typeset lines. (For this manual I asked \TeX\ to stop
+ complaining by using |\hbadness=10000|, but this is a foul deed,
+ indeed.)
+ \item[|align=|\declare{|none|}] Disables all alignments and |\\| will
+ not be redefined.
+ \end{description}
+\end{key}
+
+\begin{key}{/tikz/node halign header=\meta{macro storing a header} (initially \normalfont empty)}
+ This is the key that is used by |align| internally for alignment without
+ line breaking. Read the following only if you are familiar with the
+ |\halign| command.
+
+ This key only has an effect if |text width| is empty, otherwise it is
+ ignored. Furthermore, if \meta{macro storing a header} is empty, then this
+ key also has no effect. So, suppose |text width| is empty, but
+ \meta{header} is not. In this case the following happens:
+
+ When the node text is parsed, the command |\\| is redefined internally.
+ This redefinition is done in such a way that the text from the start of the
+ node to the first occurrence of |\\| is put in an |\hbox|. Then the text
+ following |\\| up to the next |\\| is put in another |\hbox|. This goes on
+ until the text between the last |\\| and the closing |}| is also put in an
+ |\hbox|.
+
+ The \meta{macro storing a header} should be a macro that contains some text
+ suitable for use as a header for the |\halign| command. For instance, you
+ might define
+ %
+\begin{codeexample}[code only]
+\def\myheader{\hfil\hfil##\hfil\cr}
+\tikz [node halign header=\myheader] ...
+\end{codeexample}
+ %
+ You cannot just say |node halign header=\hfil\hfil#\hfil\cr| because this
+ confuses \TeX\ inside matrices, so this detour via a macro is needed.
+
+ Next, conceptually, all these boxes are recursively put inside an |\halign|
+ command. Assuming that \meta{first} is the first of the above boxes, the
+ command |\halign{|\meta{header} |\box|\meta{first} |\cr}| is used to create
+ a new box, which we will call the \meta{previous box}. Then, the following
+ box is created, where \meta{second} is the second input box:
+ |\halign{|\meta{header} |\box|\meta{previous box} |\cr|
+ |\box|\meta{second}|\cr}|. Let us call the resulting box the \meta{previous
+ box} once more. Then the next box that is created is
+ |\halign{|\meta{header} |\box|\meta{previous box} |\cr|
+ |\box|\meta{third}|\cr}|.
+
+ All of this means that if \meta{header} is an |\halign| header like
+ |\hfil#\hfil\cr|, then all boxes will be centered relative to one another.
+ Similarly, a \meta{header} of |\hfil#\cr| causes the text to be flushed
+ right.
+
+ Note that this mechanism is not flexible enough to all multiple columns
+ inside \meta{header}. You will have to use a |tabular| or a |matrix| in
+ such cases.
+
+ One further note: Since the text of each line is placed in a box, settings
+ will be local to each ``line''. This is very similar to the way a cell in a
+ |tabular| or a |matrix| behaves.
+\end{key}
+
+
+\subsubsection{Text Parameters: Height and Depth of Text}
+
+In addition to changing the width of nodes, you can also change the height of
+nodes. This can be done in two ways: First, you can use the option
+|minimum height|, which ensures that the height of the whole node is at least
+the given height (this option is described in more detail later). Second, you
+can use the option |text height|, which sets the height of the text itself,
+more precisely, of the \TeX\ text box of the text. Note that the |text height|
+typically is not the height of the shape's box: In addition to the
+|text height|, an internal |inner sep| is added as extra space and the text
+depth is also taken into account.
+
+I recommend using |minimum size| instead of |text height| except for special
+situations.
+
+\begin{key}{/tikz/text height=\meta{dimension}}
+ Sets the height of the text boxes in shapes. Thus, when you write something
+ like |node {text}|, the |text| is first typeset, resulting in some box of a
+ certain height. This height is then replaced by the height |text height|.
+ The resulting box is then used to determine the size of the shape, which
+ will typically be larger. When you write |text height=| without specifying
+ anything, the ``natural'' size of the text box remains unchanged.
+ %
+\begin{codeexample}[]
+\tikz \node[draw] {y};
+\tikz \node[draw,text height=10pt] {y};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/text depth=\meta{dimension}}
+ This option works like |text height|, only for the depth of the text box.
+ This option is mostly useful when you need to ensure a uniform depth of
+ text boxes that need to be aligned.
+\end{key}
+
+
+\subsection{Positioning Nodes}
+\label{section-nodes-anchors}
+
+When you place a node at some coordinate, the node is centered on this
+coordinate by default. This is often undesirable and it would be better to have
+the node to the right or above the actual coordinate.
+
+
+\subsubsection{Positioning Nodes Using Anchors}
+
+\pgfname\ uses a so-called anchoring mechanism to give you a very fine control
+over the placement. The idea is simple: Imagine a node of rectangular shape of
+a certain size. \pgfname\ defines numerous anchor positions in the shape. For
+example to upper right corner is called, well, not ``upper right anchor'', but
+the |north east| anchor of the shape. The center of the shape has an anchor
+called |center| on top of it, and so on. Here are some examples (a complete
+list is given in Section~\ref{section-the-shapes}).
+
+\medskip\noindent
+\begin{tikzpicture}
+ \path node[minimum height=2cm,minimum width=5cm,fill=blue!25](x) {Big node};
+ \fill (x.north) circle (2pt) node[above] {|north|}
+ (x.north east) circle (2pt) node[above] {|north east|}
+ (x.north west) circle (2pt) node[above] {|north west|}
+ (x.west) circle (2pt) node[left] {|west|}
+ (x.east) circle (2pt) node[right] {|east|}
+ (x.base) circle (2pt) node[below] {|base|};
+\end{tikzpicture}
+
+Now, when you place a node at a certain coordinate, you can ask \tikzname\ to
+place the node shifted around in such a way that a certain anchor is at the
+coordinate. In the following example, we ask \tikzname\ to shift the first node
+such that its |north east| anchor is at coordinate |(0,0)| and that the |west|
+anchor of the second node is at coordinate |(1,1)|.
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) node[anchor=north east] {first node}
+ rectangle (1,1) node[anchor=west] {second node};
+\end{codeexample}
+
+Since the default anchor is |center|, the default behaviour is to shift the
+node in such a way that it is centered on the current position.
+
+\begin{key}{/tikz/anchor=\meta{anchor name}}
+ Causes the node to be shifted such that its anchor \meta{anchor name} lies
+ on the current coordinate.
+
+ The only anchor that is present in all shapes is |center|. However, most
+ shapes will at least define anchors in all ``compass directions''.
+ Furthermore, the standard shapes also define a |base| anchor, as well as
+ |base west| and |base east|, for placing things on the baseline of the
+ text.
+
+ The standard shapes also define a |mid| anchor (and |mid west| and
+ |mid east|). This anchor is half the height of the character ``x'' above
+ the base line. This anchor is useful for vertically centering multiple
+ nodes that have different heights and depth. Here is an example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3,transform shape]
+ % First, center alignment -> wobbles
+ \draw[anchor=center] (0,1) node{x} -- (0.5,1) node{y} -- (1,1) node{t};
+ % Second, base alignment -> no wobble, but too high
+ \draw[anchor=base] (0,.5) node{x} -- (0.5,.5) node{y} -- (1,.5) node{t};
+ % Third, mid alignment
+ \draw[anchor=mid] (0,0) node{x} -- (0.5,0) node{y} -- (1,0) node{t};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Basic Placement Options}
+
+Unfortunately, while perfectly logical, it is often rather counter-intuitive
+that in order to place a node \emph{above} a given point, you need to specify
+the |south| anchor. For this reason, there are some useful options that allow
+you to select the standard anchors more intuitively:
+
+\begin{key}{/tikz/above=\meta{offset} (default 0pt)}
+ Does the same as |anchor=south|. If the \meta{offset} is specified, the
+ node is additionally shifted upwards by the given \meta{offset}.
+ %
+\begin{codeexample}[]
+\tikz \fill (0,0) circle (2pt) node[above] {above};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \fill (0,0) circle (2pt) node[above=2pt] {above};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/below=\meta{offset} (default 0pt)}
+ Similar to |above|.
+\end{key}
+
+\begin{key}{/tikz/left=\meta{offset} (default 0pt)}
+ Similar to |above|.
+\end{key}
+
+\begin{key}{/tikz/right=\meta{offset} (default 0pt)}
+ Similar to |above|.
+\end{key}
+
+\begin{key}{/tikz/above left}
+ Does the same as |anchor=south east|. Note that giving both |above| and
+ |left| options does not have the same effect as |above left|, rather only
+ the last |left| ``wins''. Actually, this option also takes an \meta{offset}
+ parameter, but using this parameter without using the |positioning| library
+ is deprecated. (The |positioning| library changes the meaning of this
+ parameter to something more sensible.)
+ %
+\begin{codeexample}[]
+\tikz \fill (0,0) circle (2pt) node[above left] {above left};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/above right}
+ Similar to |above left|.
+ %
+\begin{codeexample}[]
+\tikz \fill (0,0) circle (2pt) node[above right] {above right};
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/below left}
+ Similar to |above left|.
+\end{key}
+
+\begin{key}{/tikz/below right}
+ Similar to |above left|.
+\end{key}
+
+\begin{key}{/tikz/centered}
+ A shorthand for |anchor=center|.
+\end{key}
+
+% A second set of options behaves similarly, namely the |above of|,
+% |below of|, and so on options. They cause the same anchors to be set
+% as the options without |of|, however, their parameter is different:
+% You must provide the name of another node. The current node will then
+% be placed, say, above this specified node at a distance given by the
+% option |node distance|.
+% \begin{key}{/tikz/above of=\meta{node}}
+% This option causes the node to be placed at the distance
+% |node distance| above of \meta{node}. The anchor is |center|.
+% \begin{codeexample}[]
+% \begin{tikzpicture}[node distance=1cm]
+% \draw[help lines] (0,0) grid (3,2);
+% \node (a) {a};
+% \node (b) [above of=a] {b};
+% \node (c) [above of=b] {c};
+% \node (d) [right of=c] {d};
+% \node (e) [below right of=d] {e};
+% \end{tikzpicture}
+% \end{codeexample}
+% \end{key}
+%
+% \begin{key}{/tikz/above left of=\meta{node}}
+% Works like |above of|, only the node is now put above and left. The
+% |node distance| is the Euclidean distance between the two nodes, not
+% the $L_1$-distance.
+% \end{key}
+%
+% \begin{key}{/tikz/above right of=\meta{node}}
+% Works similarly.
+% \end{key}
+% \begin{key}{/tikz/left of=\meta{node}}
+% Works similarly.
+% \end{key}
+% \begin{key}{/tikz/right of=\meta{node}}
+% Works similarly.
+% \end{key}
+% \begin{key}{/tikz/below of=\meta{node}}
+% Works similarly.
+% \end{key}
+% \begin{key}{/tikz/below left of=\meta{node}}
+% Works similarly.
+% \end{key}
+% \begin{key}{/tikz/below right of=\meta{node}}
+% Works similarly.
+% \end{key}
+% \begin{key}{/tikz/node distance=\meta{dimension}}
+% Sets the distance between nodes that are placed using the
+% |... of| options. Note that this distance is the distance between
+% the centers of the nodes, not the distance between their borders.
+% \end{key}
+
+
+\subsubsection{Advanced Placement Options}
+
+While the standard placement options suffice for simple cases, the
+|positioning| library offers more convenient placement options.
+
+\begin{tikzlibrary}{positioning}
+ The library defines additional options for placing nodes conveniently. It
+ also redefines the standard options like |above| so that they give you
+ better control of node placement.
+\end{tikzlibrary}
+
+When this library is loaded, the options like |above| or |above left| behave
+differently.
+
+\begin{key}{/tikz/above=\opt{\meta{specification}} (default 0pt)}
+ With the |positioning| library loaded, the |above| option does not take a
+ simple \meta{dimension} as its parameter. Rather, it can (also) take a more
+ elaborate \meta{specification} as parameter. This \meta{specification} has
+ the following general form: It starts with an optional \meta{shifting part}
+ and is followed by an optional \meta{of-part}. Let us start with the
+ \meta{shifting part}, which can have three forms:
+ %
+ \begin{enumerate}
+ \item It can simply be a \declare{\meta{dimension}} (or a mathematical
+ expression that evaluates to a dimension) like |2cm| or
+ |3cm/2+4cm|. In this case, the following happens: the node's anchor
+ is set to |south| and the node is vertically shifted upwards by
+ \meta{dimension}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,2);
+ \node at (1,1) [above=2pt+3pt,draw] {above};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ This use of the |above| option is the same as if the |positioning|
+ library were not loaded.
+ \item It can be a \declare{\meta{number}} (that is, any mathematical
+ expression that does not include a unit like |pt| or |cm|).
+ Examples are |2| or |3+sin(60)|. In this case, the anchor is also
+ set to |south| and the node is vertically shifted by the vertical
+ component of the coordinate |(0,|\meta{number}|)|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,2);
+ \node at (1,1) [above=.2,draw] {above};
+ % south border of the node is now 2mm above (1,1)
+\end{tikzpicture}
+\end{codeexample}
+ %
+ \item It can be of the form
+ \declare{\meta{number or dimension 1}| and |\meta{number or dimension 2}}.
+ This specification does not make particular sense for the |above|
+ option, it is much more useful for options like |above left|. The
+ reason it is allowed for the |above| option is that it is sometimes
+ automatically used, as explained later.
+
+ The effect of this option is the following. First, the point
+ |(|\meta{number or dimension 2}|,|\meta{number or dimension 1}|)|
+ is computed (note the inverted order), using the normal rules for
+ evaluating such a coordinate, yielding some position. Then, the
+ node is shifted by the vertical component of this point. The anchor
+ is set to |south|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (2,2);
+ \node at (1,1) [above=.2 and 3mm,draw] {above};
+ % south border of the node is also 2mm above (1,1)
+\end{tikzpicture}
+\end{codeexample}
+ \end{enumerate}
+ %
+ The \meta{shifting part} can optionally be followed by a \meta{of-part},
+ which has one of the following forms:
+ %
+ \begin{enumerate}
+ \item The \meta{of-part} can be
+ \declareandlabel{of}| |\meta{coordinate}, where \meta{coordinate} is
+ \emph{not} in parentheses and it is \emph{not} just a node name. An
+ example would be |of somenode.north| or |of 2,3|. In this case, the
+ following happens: First, the node's |at| parameter is set to the
+ \meta{coordinate}. Second, the node is shifted according to the
+ \meta{shift-part}. Third, the anchor is set to |south|.
+
+ Here is a basic example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \draw[help lines] (0,0) grid (2,2);
+ \node (somenode) at (1,1) {some node};
+
+ \node [above=5mm of somenode.north east] {\tiny 5mm of somenode.north east};
+ \node [above=1cm of somenode.north] {\tiny 1cm of somenode.north};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ As can be seen the |above=5mm of somenode.north east| option does,
+ indeed, place the node 5mm above the north east anchor of
+ |somenode|. The same effect could have been achieved writing
+ |above=5mm| followed by |at=(somenode.north east)|.
+
+ If the \meta{shifting-part} is missing, the shift is not zero, but
+ rather the value of the |node distance| key is used, see below.
+ \item The \meta{of-part} can be |of |\meta{node name}. An example would
+ be |of somenode|. In this case, the following usually happens:
+ %
+ \begin{itemize}
+ \item The anchor is set to |south|.
+ \item The node is shifted according to the \meta{shifting part}
+ or, if it is missing, according to the value of
+ |node distance|.
+ \item The node's |at| parameter is set to \meta{node
+ name}|.north|.
+ \end{itemize}
+ %
+ The net effect of all this is that the new node will be placed in
+ such a way that the distance between its south border and \meta{node
+ name}'s north border is exactly the given distance.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \draw[help lines] (0,0) grid (2,2);
+ \node (some node) at (1,1) {some node};
+
+ \node (other node) [above=1cm of some node] {\tiny above=1cm of some node};
+
+ \draw [<->] (some node.north) -- (other node.south)
+ node [midway,right,draw=none] {1cm};
+\end{tikzpicture}
+\end{codeexample}
+ %
+ It is possible to change the behaviour of this \meta{specification}
+ rather drastically, using the following key:
+ %
+ \begin{key}{/tikz/on grid=\meta{boolean} (initially false)}
+ When this key is set to |true|, an \meta{of-part} of the
+ current form behaves differently: The anchors set for the
+ current node as well as the anchor used for the other
+ \meta{node name} are set to |center|.
+
+ This has the following effect: When you say
+ |above=1cm of somenode| with |on grid| set to true, the new
+ node will be placed in such a way that its center is 1cm above
+ the center of |somenode|. Repeatedly placing nodes in this way
+ will result in nodes that are centered on ``grid coordinate'',
+ hence the name of the option.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw]
+ \draw[help lines] (0,0) grid (2,3);
+
+ % Not gridded
+ \node (a1) at (0,0) {not gridded};
+ \node (b1) [above=1cm of a1] {fooy};
+ \node (c1) [above=1cm of b1] {a};
+
+ % gridded
+ \node (a2) at (2,0) {gridded};
+ \node (b2) [on grid,above=1cm of a2] {fooy};
+ \node (c2) [on grid,above=1cm of b2] {a};
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+ \end{enumerate}
+
+ \begin{key}{/tikz/node distance=\meta{shifting part} (initially 1cm and 1cm)}
+ The value of this key is used as \meta{shifting part} is used if and
+ only if a \meta{of-part} is present, but no \meta{shifting part}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style=draw,node distance=5mm]
+ \draw[help lines] (0,0) grid (2,3);
+
+ % Not gridded
+ \node (a1) at (0,0) {not gridded};
+ \node (b1) [above=of a1] {fooy};
+ \node (c1) [above=of b1] {a};
+
+ % gridded
+ \begin{scope}[on grid]
+ \node (a2) at (2,0) {gridded};
+ \node (b2) [above=of a2] {fooy};
+ \node (c2) [above=of b2] {a};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+\end{key}
+
+\begin{key}{/tikz/below=\opt{\meta{specification}}}
+ This key is redefined in the same manner as |above|.
+\end{key}
+
+\begin{key}{/tikz/left=\opt{\meta{specification}}}
+ This key is redefined in the same manner as |above|, only all vertical
+ shifts are replaced by horizontal shifts.
+\end{key}
+
+\begin{key}{/tikz/right=\opt{\meta{specification}}}
+ This key is redefined in the same manner as |left|.
+\end{key}
+
+\begin{key}{/tikz/above left=\opt{\meta{specification}}}
+ This key is also redefined in a manner similar to the above, but behaviour
+ of the \meta{shifting part} is more complicated:
+ %
+ \begin{enumerate}
+ \item When the \meta{shifting part} is of the form
+ \meta{number or dimension}| and |\meta{number or dimension}, it has
+ (essentially) the effect of shifting the node vertically upwards by
+ the first \meta{number or dimension} and to the left by the second.
+ To be more precise, the coordinate |(|\meta{second number or
+ dimension}|,|\meta{first number or dimension}|)| is computed and
+ then the node is shifted vertically by the $y$-part of the
+ resulting coordinate and horizontally be the negated $x$-part of
+ the result. (This is exactly what you expect, except possibly when
+ you have used the |x| and |y| options to modify the |xy|-coordinate
+ system so that the unit vectors no longer point in the expected
+ directions.)
+ \item When the \meta{shifting part} is of the form \meta{number or
+ dimension}, the node is shifted by this \meta{number or dimension}
+ in the direction of $135^\circ$. This means that there is a
+ difference between a \meta{shifting part} of |1cm| and of
+ |1cm and 1cm|: In the second case, the node is shifted by 1cm
+ upward and 1cm to the left; in the first case it is shifted by
+ $\frac{1}{2}\sqrt{2}$cm upward and by the same amount to the left.
+ A more mathematical way of phrasing this is the following: A plain
+ \meta{dimension} is measured in the $l_2$-norm, while a
+ \meta{dimension}| and |\meta{dimension} is measured in the
+ $l_1$-norm.
+ \end{enumerate}
+ %
+ The following example should help to illustrate the difference:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw,circle}]
+ \draw[help lines] (0,0) grid (2,5);
+ \begin{scope}[node distance=5mm and 5mm]
+ \node (b) at (1,4) {b};
+ \node [left=of b] {1}; \node [right=of b] {2};
+ \node [above=of b] {3}; \node [below=of b] {4};
+ \node [above left=of b] {5}; \node [above right=of b] {6};
+ \node [below left=of b] {7}; \node [below right=of b] {8};
+ \end{scope}
+ \begin{scope}[node distance=5mm]
+ \node (a) at (1,1) {a};
+ \node [left=of a] {1}; \node [right=of a] {2};
+ \node [above=of a] {3}; \node [below=of a] {4};
+ \node [above left=of a] {5}; \node [above right=of a] {6};
+ \node [below left=of a] {7}; \node [below right=of a] {8};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw,rectangle}]
+ \draw[help lines] (0,0) grid (2,5);
+ \begin{scope}[node distance=5mm and 5mm]
+ \node (b) at (1,4) {b};
+ \node [left=of b] {1}; \node [right=of b] {2};
+ \node [above=of b] {3}; \node [below=of b] {4};
+ \node [above left=of b] {5}; \node [above right=of b] {6};
+ \node [below left=of b] {7}; \node [below right=of b] {8};
+ \end{scope}
+ \begin{scope}[node distance=5mm]
+ \node (a) at (1,1) {a};
+ \node [left=of a] {1}; \node [right=of a] {2};
+ \node [above=of a] {3}; \node [below=of a] {4};
+ \node [above left=of a] {5}; \node [above right=of a] {6};
+ \node [below left=of a] {7}; \node [below right=of a] {8};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw,rectangle},on grid]
+ \draw[help lines] (0,0) grid (4,4);
+ \begin{scope}[node distance=1]
+ \node (a) at (2,3) {a};
+ \node [left=of a] {1}; \node [right=of a] {2};
+ \node [above=of a] {3}; \node [below=of a] {4};
+ \node [above left=of a] {5}; \node [above right=of a] {6};
+ \node [below left=of a] {7}; \node [below right=of a] {8};
+ \end{scope}
+ \begin{scope}[node distance=1 and 1]
+ \node (b) at (2,0) {b};
+ \node [left=of b] {1}; \node [right=of b] {2};
+ \node [above=of b] {3}; \node [below=of b] {4};
+ \node [above left=of b] {5}; \node [above right=of b] {6};
+ \node [below left=of b] {7}; \node [below right=of b] {8};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/below left=\opt{\meta{specification}}}
+ Works similar to |above left|.
+\end{key}
+
+\begin{key}{/tikz/above right=\opt{\meta{specification}}}
+ Works similar to |above left|.
+\end{key}
+
+\begin{key}{/tikz/below right=\opt{\meta{specification}}}
+ Works similar to |above left|.
+\end{key}
+
+The |positioning| package also introduces the following new placement keys:
+%
+\begin{key}{/tikz/base left=\opt{\meta{specification}}}
+ This key works like the |left| key, only instead of the |east| anchor, the
+ |base east| anchor is used and, when the second form of an \meta{of-part}
+ is used, the corresponding |base west| anchor.
+
+ This key is useful for chaining together nodes so that their base lines are
+ aligned.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=1ex]
+ \draw[help lines] (0,0) grid (3,1);
+ \huge
+ \node (X) at (0,1) {X};
+ \node (a) [right=of X] {a};
+ \node (y) [right=of a] {y};
+
+ \node (X) at (0,0) {X};
+ \node (a) [base right=of X] {a};
+ \node (y) [base right=of a] {y};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/base right=\opt{\meta{specification}}}
+ Works like |base left|.
+\end{key}
+\begin{key}{/tikz/mid left=\opt{\meta{specification}}}
+ Works like |base left|, but with |mid east| and |mid west| anchors instead
+ of |base east| and |base west|.
+\end{key}
+
+\begin{key}{/tikz/mid right=\opt{\meta{specification}}}
+ Works like |mid left|.
+\end{key}
+
+
+\subsubsection{Advanced Arrangements of Nodes}
+
+The simple |above| and |right| options may not always suffice for arranging a
+large number of nodes. For such situations \tikzname\ offers libraries that
+make positioning easier: The |graphdrawing| library and the |matrix| library.
+These libraries for positioning nodes are described in two separate
+Sections~\ref{section-matrices} and~\ref{section-intro-gd}.
+
+
+\subsection{Fitting Nodes to a Set of Coordinates}
+\label{section-nodes-fitting}
+
+It is sometimes desirable that the size and position of a node is not given
+using anchors and size parameters, rather one would sometimes have a box be
+placed and be sized such that it ``is just large enough to contain this, that,
+and that point''. This situation typically arises when a picture has been drawn
+and, afterwards, parts of the picture are supposed to be encircled or
+highlighted.
+
+In this situation the |fit| option from the |fit| library is useful, see
+Section~\ref{section-library-fit} for the details. The idea is that you may
+give the |fit| option to a node. The |fit| option expects a list of coordinates
+(one after the other without commas) as its parameter. The effect will be that
+the node's text area has exactly the necessary size so that it contains all the
+given coordinates. Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=8mm]
+ \node (root) {root}
+ child { node (a) {a} }
+ child { node (b) {b}
+ child { node (d) {d} }
+ child { node (e) {e} } }
+ child { node (c) {c} };
+
+ \node[draw=red,inner sep=0pt,thick,ellipse,fit=(root) (b) (d) (e)] {};
+ \node[draw=blue,inner sep=0pt,thick,ellipse,fit=(b) (c) (e)] {};
+\end{tikzpicture}
+\end{codeexample}
+
+If you want to fill the fitted node you will usually have to place it on a
+background layer.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=8mm]
+ \node (root) {root}
+ child { node (a) {a} }
+ child { node (b) {b}
+ child { node (d) {d} }
+ child { node (e) {e} } }
+ child { node (c) {c} };
+
+ \begin{scope}[on background layer]
+ \node[fill=red!20,inner sep=0pt,ellipse,fit=(root) (b) (d) (e)] {};
+ \node[fill=blue!20,inner sep=0pt,ellipse,fit=(b) (c) (e)] {};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Transformations}
+\label{section-nodes-transformations}
+
+It is possible to transform nodes, but, by default, transformations do not
+apply to nodes. The reason is that you usually do \emph{not} want your text to
+be scaled or rotated even if the main graphic is transformed. Scaling text is
+evil, rotating slightly less so.
+
+However, sometimes you \emph{do} wish to transform a node, for example, it
+certainly sometimes makes sense to rotate a node by 90 degrees. There are two
+ways to achieve this:
+%
+\begin{enumerate}
+ \item You can use the following option:
+ %
+ \begin{key}{/tikz/transform shape}
+ Causes the current ``external'' transformation matrix to be applied
+ to the shape. For example, if you said |\tikz[scale=3]| and then
+ say |node[transform shape] {X}|, you will get a ``huge'' X in your
+ graphic.
+ \end{key}
+ \item You can give transformation options \emph{inside} the option list of
+ the node. \emph{These} transformations always apply to the node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={draw}]
+ \draw[help lines](0,0) grid (3,2);
+ \draw (1,0) node{A}
+ (2,0) node[rotate=90,scale=1.5] {B};
+ \draw[rotate=30] (1,0) node{A}
+ (2,0) node[rotate=90,scale=1.5] {B};
+ \draw[rotate=60] (1,0) node[transform shape] {A}
+ (2,0) node[transform shape,rotate=90,scale=1.5] {B};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{enumerate}
+
+Even though \tikzname\ currently does not allow you to configure so-called
+\emph{nonlinear transformations,} see
+Section~\ref{section-nonlinear-transformations}, there is an option that
+influences how nodes are transformed when nonlinear transformations are in
+force:
+%
+\begin{key}{/tikz/transform shape nonlinear=\opt{\meta{true or false}} (initially false)}
+ When set to true, \tikzname\ will try to apply any current nonlinear
+ transformation also to nodes. Typically, for the text in nodes this is not
+ possible in general, in such cases a linear approximation of the nonlinear
+ transformation is used. For more details, see
+ Section~\ref{section-nonlinear-transformations}.
+ %
+\makeatletter
+\begin{codeexample}[]
+\begin{tikzpicture}
+ % Install a nonlinear transformation:
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{10mm}{20mm}}
+ {\pgfpoint{10mm}{10mm}}
+ {\pgfpoint{20mm}{10mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierorthogonal\pgf@x\pgf@y}%
+
+ % Draw something:
+ \draw [help lines] (0,-30pt) grid [step=10pt] (80pt,30pt);
+
+ \foreach \x in {0,20,...,80}
+ \node [fill=red!20] at (\x pt, -20pt) {\x};
+
+ \foreach \x in {0,20,...,80}
+ \node [fill=blue!20, transform shape nonlinear] at (\x pt, 20pt) {\x};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Placing Nodes on a Line or Curve Explicitly}
+\label{section-nodes-placing-1}
+
+Until now, we always placed node on a coordinate that is mentioned in the path.
+Often, however, we wish to place nodes on ``the middle'' of a line and we do
+not wish to compute these coordinates ``by hand''. To facilitate such
+placements, \tikzname\ allows you to specify that a certain node should be
+somewhere ``on'' a line. There are two ways of specifying this: Either
+explicitly by using the |pos| option or implicitly by placing the node
+``inside'' a path operation. These two ways are described in the following.
+
+ \label{section-pos-option}
+
+\begin{key}{/tikz/pos=\meta{fraction}}
+ When this option is given, the node is not anchored on the last coordinate.
+ Rather, it is anchored on some point on the line from the previous
+ coordinate to the current point. The \meta{fraction} dictates how ``far''
+ on the line the point should be. A \meta{fraction} of 0 is the previous
+ coordinate, 1 is the current one, everything else is in between. In
+ particular, 0.5 is the middle.
+
+ Now, what is ``the previous line''? This depends on the previous path
+ construction operation.
+
+ In the simplest case, the previous path operation was a ``line-to''
+ operation, that is, a |--|\meta{coordinate} operation:
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (3,1)
+ node[pos=0]{0} node[pos=0.5]{1/2} node[pos=0.9]{9/10};
+\end{codeexample}
+
+ For the |arc| operation, the position is simply the corresponding position
+ on the arc:
+ %
+\begin{codeexample}[]
+\tikz {
+ \draw [help lines] (0,0) grid (3,2);
+ \draw (2,0) arc [x radius=1, y radius=2, start angle=0, end angle=180]
+ node foreach \t in {0,0.125,...,1} [pos=\t,auto] {\t};
+}
+\end{codeexample}
+
+ The next case is the curve-to operation (the |..| operation). In this case,
+ the ``middle'' of the curve, that is, the position |0.5| is not necessarily
+ the point at the exact half distance on the line. Rather, it is some point
+ at ``time'' 0.5 of a point traveling from the start of the curve, where it
+ is at time 0, to the end of the curve, which it reaches at time 0.5. The
+ ``speed'' of the point depends on the length of the support vectors (the
+ vectors that connect the start and end points to the control points). The
+ exact math is a bit complicated (depending on your point of view, of
+ course); you may wish to consult a good book on computer graphics and
+ Bézier curves if you are intrigued.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) .. controls +(right:3.5cm) and +(right:3.5cm) .. (0,3)
+ node foreach \p in {0,0.125,...,1} [pos=\p]{\p};
+\end{codeexample}
+
+ Another interesting case are the horizontal/vertical line-to operations
+ \verb!|-! and \verb!-|!. For them, the position (or time) |0.5| is exactly
+ the corner point.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) |- (3,1)
+ node[pos=0]{0} node[pos=0.5]{1/2} node[pos=0.9]{9/10};
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \draw (0,0) -| (3,1)
+ node[pos=0]{0} node[pos=0.5]{1/2} node[pos=0.9]{9/10};
+\end{codeexample}
+
+ For all other path construction operations, \emph{the position placement
+ does not work}, currently.
+\end{key}
+
+\begin{key}{/tikz/auto=\opt{\meta{direction}} (default \normalfont is scope's setting)}
+ This option causes an anchor positions to be calculated automatically
+ according to the following rule. Consider a line between to points. If the
+ \meta{direction} is |left|, then the anchor is chosen such that the node is
+ to the left of this line. If the \meta{direction} is |right|, then the node
+ is to the right of this line. Leaving out \meta{direction} causes automatic
+ placement to be enabled with the last value of |left| or |right| used. A
+ \meta{direction} of |false| disables automatic placement. This happens also
+ whenever an anchor is given explicitly by the |anchor| option or by one of
+ the |above|, |below|, etc.\ options.
+
+ This option only has an effect for nodes that are placed on lines or
+ curves.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [scale=.8,auto=left,every node/.style={circle,fill=blue!20}]
+ \node (a) at (-1,-2) {a};
+ \node (b) at ( 1,-2) {b};
+ \node (c) at ( 2,-1) {c};
+ \node (d) at ( 2, 1) {d};
+ \node (e) at ( 1, 2) {e};
+ \node (f) at (-1, 2) {f};
+ \node (g) at (-2, 1) {g};
+ \node (h) at (-2,-1) {h};
+
+ \foreach \from/\to in {a/b,b/c,c/d,d/e,e/f,f/g,g/h,h/a}
+ \draw [->] (\from) -- (\to)
+ node[midway,fill=red!20] {\from--\to};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/swap}
+ This option exchanges the roles of |left| and |right| in automatic
+ placement. That is, if |left| is the current |auto| placement, |right| is
+ set instead and the other way round.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[auto]
+ \draw[help lines,use as bounding box] (0,-.5) grid (4,5);
+
+ \draw (0.5,0) .. controls (9,6) and (-5,6) .. (3.5,0)
+ node foreach \pos in {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1}
+ [pos=\pos,swap,fill=red!20] {\pos}
+ node foreach \pos in {0.025,0.2,0.4,0.6,0.8,0.975}
+ [pos=\pos,fill=blue!20] {\pos};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[shorten >=1pt,node distance=2cm,auto]
+ \draw[help lines] (0,0) grid (3,2);
+
+ \node[state] (q_0) {$q_0$};
+ \node[state] (q_1) [above right of=q_0] {$q_1$};
+ \node[state] (q_2) [below right of=q_0] {$q_2$};
+ \node[state] (q_3) [below right of=q_1] {$q_3$};
+
+ \path[->] (q_0) edge node {0} (q_1)
+ edge node [swap] {1} (q_2)
+ (q_1) edge node {1} (q_3)
+ edge [loop above] node {0} ()
+ (q_2) edge node [swap] {0} (q_3)
+ edge [loop below] node {1} ();
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/'}
+ This is a very short alias for |swap|.
+\end{key}
+
+\begin{key}{/tikz/sloped}
+ This option causes the node to be rotated such that a horizontal line
+ becomes a tangent to the curve. The rotation is normally done in such a way
+ that text is never ``upside down''. To get upside-down text, use can use
+ |[rotate=180]| or |[allow upside down]|, see below.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) .. controls +(up:2cm) and +(left:2cm) .. (1,3)
+ node foreach \p in {0,0.25,...,1} [sloped,above,pos=\p]{\p};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[->]
+ \draw (0,0) -- (2,0.5) node[midway,sloped,above] {$x$};
+ \draw (2,-.5) -- (0,0) node[midway,sloped,below] {$y$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\begin{key}{/tikz/allow upside down=\meta{boolean} (default true, initially false)}
+ If set to |true|, \tikzname\ will not ``righten'' upside down text.
+ %
+\begin{codeexample}[]
+\tikz [allow upside down]
+ \draw (0,0) .. controls +(up:2cm) and +(left:2cm) .. (1,3)
+ node foreach \p in {0,0.25,...,1} [sloped,above,pos=\p]{\p};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[->,allow upside down]
+ \draw (0,0) -- (2,0.5) node[midway,sloped,above] {$x$};
+ \draw (2,-.5) -- (0,0) node[midway,sloped,below] {$y$};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+There exist styles for specifying positions a bit less ``technically'':
+
+\begin{stylekey}{/tikz/midway}
+ This has the same effect as |pos=0.5|.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) .. controls +(up:2cm) and +(left:3cm) .. (1,5)
+ node[at end] {\texttt{at end}}
+ node[very near end] {\texttt{very near end}}
+ node[near end] {\texttt{near end}}
+ node[midway] {\texttt{midway}}
+ node[near start] {\texttt{near start}}
+ node[very near start] {\texttt{very near start}}
+ node[at start] {\texttt{at start}};
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/near start}
+ Set to |pos=0.25|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/near end}
+ Set to |pos=0.75|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/very near start}
+ Set to |pos=0.125|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/very near end}
+ Set to |pos=0.875|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/at start}
+ Set to |pos=0|.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/at end}
+ Set to |pos=1|.
+\end{stylekey}
+
+
+\subsection{Placing Nodes on a Line or Curve Implicitly}
+\label{section-nodes-placing-2}
+
+When you wish to place a node on the line |(0,0) -- (1,1)|, it is natural to
+specify the node not following the |(1,1)|, but ``somewhere in the middle''.
+This is, indeed, possible and you can write |(0,0) -- node{a} (1,1)| to place a
+node midway between |(0,0)| and |(1,1)|.
+
+What happens is the following: The syntax of the line-to path operation is
+actually |--| \opt{|node|\meta{node specification}}\meta{coordinate}. (It is
+even possible to give multiple nodes in this way.) When the optional |node| is
+encountered, that is, when the |--| is directly followed by |node|, then the
+specification(s) are read and ``stored away''. Then, after the
+\meta{coordinate} has finally been reached, they are inserted again, but with
+the |pos| option set.
+
+There are two things to note about this: When a node specification is
+``stored'', its catcodes become fixed. This means that you cannot use overly
+complicated verbatim text in them. If you really need, say, a verbatim text,
+you will have to put it in a normal node following the coordinate and add the
+|pos| option.
+
+Second, which |pos| is chosen for the node? The position is inherited from the
+surrounding scope. However, this holds only for nodes specified in this
+implicit way. Thus, if you add the option |[near end]| to a scope, this does
+not mean that \emph{all} nodes given in this scope will be put on near the end
+of lines. Only the nodes for which an implicit |pos| is added will be placed
+near the end. Typically, this is what you want. Here are some examples that
+should make this clearer:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[near end]
+ \draw (0cm,4em) -- (3cm,4em) node{A};
+ \draw (0cm,3em) -- node{B} (3cm,3em);
+ \draw (0cm,2em) -- node[midway] {C} (3cm,2em);
+ \draw (0cm,1em) -- (3cm,1em) node[midway] {D} ;
+\end{tikzpicture}
+\end{codeexample}
+
+Like the line-to operation, the curve-to operation |..| also allows you to
+specify nodes ``inside'' the operation. After both the first |..| and also
+after the second |..| you can place node specifications. Like for the |--|
+operation, these will be collected and then reinserted after the operation with
+the |pos| option set.
+
+
+\subsection{The Label and Pin Options}
+
+\subsubsection{Overview}
+
+In addition to the |node| path operation, the two options |label| and |pin| can
+be used to ``add a node next to another node''. As an example, suppose we want
+to draw a graph in which the nodes are small circles:
+%
+\begin{codeexample}[]
+\tikz [circle] {
+ \node [draw] (s) {};
+ \node [draw] (a) [right=of s] {} edge (s);
+ \node [draw] (b) [right=of a] {} edge (a);
+ \node [draw] (t) [right=of b] {} edge (b);
+}
+\end{codeexample}
+
+Now, in the above example, suppose we wish to indicate that the first node is
+the start node and the last node is the target node. We could write
+|\node (s) {$s$};|, but this would enlarge the first node. Rather, we want the
+``$s$'' to be placed next to the node. For this, we need to create
+\emph{another} node, but next to the existing node. The |label| and |pin|
+option allow us to do exactly this without having to use the cumbersome |node|
+syntax:
+%
+\begin{codeexample}[]
+\tikz [circle] {
+ \node [draw] (s) [label=$s$] {};
+ \node [draw] (a) [right=of s] {} edge (s);
+ \node [draw] (b) [right=of a] {} edge (a);
+ \node [draw] (t) [right=of b, label=$t$] {} edge (b);
+}
+\end{codeexample}
+
+
+\subsubsection{The Label Option}
+
+\begin{key}{/tikz/label=\opt{|[|\meta{options}|]|\meta{angle}|:|}\meta{text}}
+ \label{label-option}%
+ When this option is given to a |node| operation, it causes \emph{another}
+ node to be added to the path after the current node has been finished. This
+ extra node will have the text \meta{text}. It is placed, in principle, in
+ the direction \meta{angle} relative to the main node, but the exact rules
+ are a bit complex. Suppose the |node| currently under construction is
+ called |main node| and let us call the label node |label node|. Then the
+ following happens:
+ %
+ \begin{enumerate}
+ \item The \meta{angle} is used to determine a position on the border of
+ the |main node|. If the \meta{angle} is missing, the value of the
+ following key is used instead:
+ %
+ \begin{key}{/tikz/label position=\meta{angle} (initially above)}
+ Sets the default position for labels.
+ \end{key}
+ %
+ The \meta{angle} determines the position on the border of the shape
+ in two different ways. Normally, the border position is given by
+ |main node.|\meta{angle}. This means that the \meta{angle} can
+ either be a number like |0| or |-340|, but it can also be an anchor
+ like |north|. Additionally, the special angles |above|, |below|,
+ |left|, |right|, |above left|, and so on are automatically replaced
+ by the corresponding angles |90|, |270|, |180|, |0|, |135|, and so
+ on.
+
+ A special case arises when the following key is set:
+ %
+ \begin{key}{/tikz/absolute=\meta{true or false} (default true)}
+ When this key is set, the \meta{angle} is interpreted
+ differently: We still use a point on the border of the
+ |main node|, but the angle is measured ``absolutely'', that is,
+ an angle of |0| refers to the point on the border that lies on
+ a straight line from the |main node|'s center to the right
+ (relative to the paper, not relative to the local coordinate
+ system of either the node or the scope).
+
+ The difference can be seen in the following example:
+ %
+\begin{codeexample}[]
+\tikz [rotate=-80,every label/.style={draw,red}]
+ \node [transform shape,rectangle,draw,label=right:label] {main node};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz [rotate=-80,every label/.style={draw,red},absolute]
+ \node [transform shape,rectangle,draw,label=right:label] {main node};
+\end{codeexample}
+ \end{key}
+ \item Then, an anchor point for the |label node| is computed. It is
+ determined in such a way that the |label node| will ``face away''
+ from the border of the |main node|. The anchor that is chosen
+ depends on the position of the border point that is chosen and its
+ position relative to the center of the |main node| and on whether
+ the |transform shape| option is set. In detail, when the computed
+ border point is at $0^\circ$, the anchor |west| will be used.
+ Similarly, when the border point is at $90^\circ$, the anchor
+ |south| will be used, and so on for $180^\circ$ and $270^\circ$.
+
+ For angles between these ``major'' angles, like $30^\circ$ or
+ $110^\circ$, combined anchors, like |south west| for $30^\circ$ or
+ |south east| for $110^\circ$, are used. However, for angles close
+ to the major angles, (differing by up to $2^\circ$ from the major
+ angle), the anchor for the major angle is used. Thus, a label at a
+ border point for $2^\circ$ will have the anchor |west|, while a
+ label for $3^\circ$ will have the anchor |south west|, resulting in
+ a ``jump'' of the anchor. You can set the anchor ``by hand'' using
+ the |anchor| key or indirect keys like |left|.
+ %
+\begin{codeexample}[]
+\tikz
+ \node [circle, draw,
+ label=default,
+ label=60:$60^\circ$,
+ label=below:$-90^\circ$,
+ label=3:$3^\circ$,
+ label=2:$2^\circ$,
+ label={[below]180:$180^\circ$},
+ label={[centered]135:$135^\circ$}] {my circle};
+\end{codeexample}
+ \item One \meta{angle} is special: If you set the \meta{angle} to
+ |center|, then the label will be placed on the center of the main
+ node. This is mainly useful for adding a label text to an existing
+ node, especially if it has been rotated.
+ %
+\begin{codeexample}[]
+\tikz \node [transform shape,rotate=90,
+ rectangle,draw,label={[red]center:R}] {main node};
+\end{codeexample}
+ \end{enumerate}
+
+ You can pass \meta{options} to the node |label node|. For this, you provide
+ the options in square brackets before the \meta{angle}. If you do so, you
+ need to add braces around the whole argument of the |label| option and this
+ is also the case if you have brackets or commas or semicolons or anything
+ special in the \meta{text}.
+ %
+\begin{codeexample}[]
+\tikz \node [circle,draw,label={[red]above:X}] {my circle};
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [circle,draw,label={[name=label node]above left:$a,b$}] {};
+ \draw (label node) -- +(1,1);
+\end{tikzpicture}
+\end{codeexample}
+
+ If you provide multiple |label| options, then multiple extra label nodes
+ are added in the order they are given.
+
+ The following styles influence how labels are drawn:
+ %
+ \begin{key}{/tikz/label distance=\meta{distance} (initially 0pt)}
+ The \meta{distance} is additionally inserted between the main node and
+ the label node.
+ %
+\begin{codeexample}[]
+\tikz[label distance=5mm]
+ \node [circle,draw,label=right:X,
+ label=above right:Y,
+ label=above:Z] {my circle};
+\end{codeexample}
+ \end{key}
+ %
+ \begin{stylekey}{/tikz/every label (initially \normalfont empty)}
+ This style is used in every node created by the |label| option. The
+ default is |draw=none,fill=none|.
+ \end{stylekey}
+\end{key}
+
+See Section~\ref{section-label-quotes} for an easier syntax for specifying
+nodes.
+
+
+\subsubsection{The Pin Option}
+
+\begin{key}{/tikz/pin=\opt{|[|\meta{options}|]|}\meta{angle}|:|\meta{text}}
+ This option is quite similar to the |label| option, but there is one
+ difference: In addition to adding an extra node to the picture, it also
+ adds an edge from this node to the main node. This causes the node to look
+ like a pin that has been added to the main node:
+ %
+\begin{codeexample}[]
+\tikz \node [circle,fill=blue!50,minimum size=1cm,pin=60:$q_0$] {};
+\end{codeexample}
+
+ The meaning of the \meta{options} and the \meta{angle} and the \meta{text}
+ is exactly the same as for the |node| option. Only, the options and styles
+ the influence the way pins look are different:
+ %
+ \begin{key}{/tikz/pin distance=\meta{distance} (initially 3ex)}
+ This \meta{distance} is used instead of the |label distance| for the
+ distance between the main node and the label node.
+ %
+\begin{codeexample}[]
+\tikz[pin distance=1cm]
+ \node [circle,draw,pin=right:X,
+ pin=above right:Y,
+ pin=above:Z] {my circle};
+\end{codeexample}
+ %
+ \end{key}
+
+ \begin{stylekey}{/tikz/every pin (initially {draw=none,fill=none})}
+ This style is used in every node created by the |pin| option.
+ \end{stylekey}
+
+ \begin{key}{/tikz/pin position=\meta{angle} (initially above)}
+ The default pin position. Works like |label position|.
+ \end{key}
+
+ \begin{stylekey}{/tikz/every pin edge (initially help lines)}
+ This style is used in every edge created by the |pin| options.
+ %
+\begin{codeexample}[]
+\tikz [pin distance=15mm,
+ every pin edge/.style={<-,shorten <=1pt,decorate,
+ decoration={snake,pre length=4pt}}]
+ \node [circle,draw,pin=right:X,
+ pin=above right:Y,
+ pin=above:Z] {my circle};
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{key}{/tikz/pin edge=\meta{options} (initially \normalfont empty)}
+ This option can be used to set the options that are to be used in the
+ edge created by the |pin| option.
+ %
+\begin{codeexample}[]
+\tikz[pin distance=10mm]
+ \node [circle,draw,pin={[pin edge={blue,thick}]right:X},
+ pin=above:Z] {my circle};
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz [every pin edge/.style={},
+ initial/.style={pin={[pin distance=5mm,
+ pin edge={<-,shorten <=1pt}]left:start}}]
+ \node [circle,draw,initial] {my circle};
+\end{codeexample}
+ \end{key}
+\end{key}
+
+
+\subsubsection{The Quotes Syntax}
+\label{section-label-quotes}
+
+The |label| and |pin| options provide a syntax for creating nodes next to
+existing nodes, but this syntax is often a bit too verbose. By including the
+following library, you get access to an even more concise syntax:
+
+\begin{tikzlibrary}{quotes}
+ Enables the quotes syntax for labels, pins, edge nodes, and pic texts.
+\end{tikzlibrary}
+
+Let us start with the basics of what this library does: Once loaded, inside the
+options of a |node| command, instead of the usual \meta{key}|=|\meta{value}
+pairs, you may also provide strings of the following form (the actual syntax
+slightly more general, see the detailed descriptions later on):
+%
+\begin{quote}
+ |"|\meta{text}|"|\opt{\meta{options}}
+\end{quote}
+%
+The \meta{options} must be surrounded in curly braces when they contain a
+comma, otherwise the curly braces are optional. The \meta{options} may be
+preceded by an optional space.
+
+When a \meta{string} of the above form is encountered inside the options of a
+|node|, then it is internally transformed to
+%
+% (the double vertical bar after = is needed to avoid the two opening brackets
+% being typeset in italics)
+\begin{quote}
+ |label=||{[|\meta{options}|]|\meta{text}|}|
+\end{quote}
+
+Let us have a look at an example:
+%
+\begin{codeexample}[]
+\tikz \node ["my label" red, draw] {my node};
+\end{codeexample}
+%
+The above has the same effect as the following:
+%
+\begin{codeexample}[]
+\tikz \node [label={[red]my label}, draw] {my node};
+\end{codeexample}
+
+Here are further examples, one where no \meta{options} are added to the
+|label|, one where a position is specified, and examples with more complicated
+options in curly braces:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix [row sep=5mm] {
+ \node [draw, "label"] {A}; \\
+ \node [draw, "label" left] {B}; \\
+ \node [draw, "label" centered] {C}; \\
+ \node [draw, "label" color=red] {D}; \\
+ \node [draw, "label" {red,draw,thick}] {E}; \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Let us now have a more detailed look at what which commands this library
+provides:
+
+\begin{key}{/tikz/quotes mean label}
+ When this option is used (which is the default when this library is
+ loaded), then, as described above, inside the options of a node a special
+ syntax check is done.
+
+ \medskip
+ \noindent\textbf{The syntax.}
+ For each string in the list of options it is tested whether it starts with
+ a quotation mark (note that this will never happen for normal keys since
+ the normal keys of \tikzname\ do not start with quotation marks). When this
+ happens, the \meta{string} should not be a key--value pair, but, rather,
+ must have the form:
+ %
+ \begin{quote}
+ |"|\meta{text}|"|\opt{|'|}\opt{\meta{options}}
+ \end{quote}
+
+ (We will discuss the optional apostrophe in a moment. It is not really
+ important for the current option, but only for edge labels, which are
+ discussed later).
+
+ \medskip
+ \noindent\textbf{Transformation to a label option.}
+ When a \meta{string} has the above form, it is treated (almost) as if you
+ had written
+ %
+ \begin{quote}
+ |label={[|\meta{options}|]|\meta{text}|}|
+ \end{quote}
+ %
+ instead. The ``almost'' refers to the following additional feature: In
+ reality, before the \meta{options} are executed inside the |label| command,
+ the direction keys |above|, |left|, |below right| and so on are redefined
+ so that |above| is a shorthand for |label position=90| and similarly for
+ the other keys. The net effect is that in order to specify the position of
+ the \meta{text} relative to the main node you can just put something like
+ |left| or |above right| inside the \meta{options}:
+ %
+\begin{codeexample}[]
+\tikz
+ \node ["$90^\circ$" above, "$180^\circ$" left, circle, draw] {circle};
+\end{codeexample}
+
+ Alternatively, you can also use \meta{direction}|:|\meta{actual text} as
+ your \meta{text}. This works since the |label| command allows you to
+ specify a direction at the beginning when it is separated by a colon:
+ %
+\begin{codeexample}[]
+\tikz
+ \node ["90:$90^\circ$", "left:$180^\circ$", circle, draw] {circle};
+\end{codeexample}
+ %
+ Arguably, placing |above| or |left| behind the \meta{text} seems more
+ natural than having it inside the \meta{text}.
+
+ In addition to the above, before the \meta{options} are executed, the
+ following style is also executed:
+ %
+ \begin{stylekey}{/tikz/every label quotes}
+\begin{codeexample}[]
+\tikz [every label quotes/.style=red]
+ \node ["90:$90^\circ$", "left:$180^\circ$", circle, draw] {circle};
+\end{codeexample}
+ \end{stylekey}
+
+ \medskip
+ \noindent\textbf{Handling commas and colons inside the text.}
+ The \meta{text} may not contain a comma, unless it is inside curly braces.
+ The reason is that the key handler separates the total options of a |node|
+ along the commas it finds. So, in order to have text containing a comma,
+ just add curly braces around either the comma or just around the whole
+ \meta{text}:
+ %
+\begin{codeexample}[]
+\tikz \node ["{yes, we can}", draw] {foo};
+\end{codeexample}
+ %
+ The same is true for a colon, only in this case you may need to surround
+ specifically the colon by curly braces to stop the |label| option from
+ interpreting everything before the colon as a direction:
+ %
+\begin{codeexample}[]
+\tikz \node ["yes{:} we can", draw] {foo};
+\end{codeexample}
+
+ \medskip
+ \noindent\textbf{The optional apostrophe.}
+ Following the closing quotation marks in a \meta{string} there may (but
+ need not) be a single quotation mark (an apostrophe), possibly surrounded
+ by whitespaces. If it is present, it is simply added to the \meta{options}
+ as another option (and, indeed, a single apostrophe is a legal option in
+ \tikzname, it is a shorthand for |swap|):
+
+ \begin{tabular}{ll}
+ String & has the same effect as \\\hline
+ |"foo"'| & |"foo" {'}| \\
+ |"foo"' red| & |"foo" {',red}| \\
+ |"foo"'{red}| & |"foo" {',red}| \\
+ |"foo"{',red}| & |"foo" {',red}| \\
+ |"foo"{red,'}| & |"foo" {red,'}| \\
+ |"foo"{'red}| & |"foo" {'red}| (illegal; there is no key |'red|)\\
+ |"foo" red'| & |"foo" {red'}| (illegal; there is no key |red'|)\\
+ \end{tabular}
+\end{key}
+
+\begin{key}{/tikz/quotes mean pin}
+ This option has exactly the same effect as |quotes mean label|, only
+ instead of transforming quoted text to the |label| option, they get
+ transformed to the |pin| option:
+ %
+\begin{codeexample}[]
+\tikz [quotes mean pin]
+ \node ["$90^\circ$" above, "$180^\circ$" left, circle, draw] {circle};
+\end{codeexample}
+ %
+ Instead of |every label quotes|, the following style is executed
+ with each such pin:
+ %
+ \begin{stylekey}{/tikz/every pin quotes}
+ \end{stylekey}
+\end{key}
+
+If instead of |label|s or |pin|s you would like quoted strings to be
+interpreted in a different manner, you can also define your own handlers:
+
+\begin{key}{/tikz/node quotes mean=\meta{replacement}}
+ This key allows you to define your own handler for quotes options. Inside
+ the options of a |node|, whenever a key--value pair with the syntax
+ %
+ \begin{quote}
+ |"|\meta{text}|"|\opt{|'|}\opt{\meta{options}}
+ \end{quote}
+ %
+ is encountered, the following happens: The above string gets replaced by
+ \meta{replacement} where inside the \meta{replacement} the parameter |#1|
+ is \meta{text} and |#2| is \meta{options}. If the apostrophe is present
+ (see also the discussion of |quotes mean label|), the \meta{options} start
+ with |',|.
+
+ The \meta{replacement} is then parsed normally as options (using
+ |\pgfkeys|).
+
+ Here is an example, where the quotes are used to define labels that are
+ automatically named according to the |text|:
+ %
+\begin{codeexample}[]
+\tikzset{node quotes mean={label={[#2,name={#1}]#1}}}
+
+\tikz {
+ \node ["1", "2" label position=left, circle, draw] {circle};
+ \draw (1) -- (2);
+}
+\end{codeexample}
+ %
+\end{key}
+
+Some further options provided by the |quotes| library concern labels next to
+edges rather than nodes and they are described in
+Section~\ref{section-edge-quotes}.
+
+
+\subsection{Connecting Nodes: Using Nodes as Coordinates}
+\label{section-nodes-connecting}
+
+Once you have defined a node and given it a name, you can use this name to
+reference it. This can be done in two ways, see also
+Section~\ref{section-node-coordinates}. Suppose you have said
+|\path(0,0) node(x) {Hello World!};| in order to define a node named |x|.
+%
+\begin{enumerate}
+ \item Once the node |x| has been defined, you can use |(x.|\meta{anchor}|)|
+ wherever you would normally use a normal coordinate. This will yield
+ the position at which the given \meta{anchor} is in the picture. Note
+ that transformations do not apply to this coordinate, that is,
+ |(x.north)| will be the northern anchor of |x| even if you have said
+ |scale=3| or |xshift=4cm|. This is usually what you would expect.
+ \item You can also just use |(x)| as a coordinate. In most cases, this
+ gives the same coordinate as |(x.center)|. Indeed, if the |shape| of
+ |x| is |coordinate|, then |(x)| and |(x.center)| have exactly the same
+ effect.
+
+ However, for most other shapes, some path construction operations like
+ |--| try to be ``clever'' when they are asked to draw a line from such
+ a coordinate or to such a coordinate. When you say |(x)--(1,1)|, the
+ |--| path operation will not draw a line from the center of |x|, but
+ \emph{from the border} of |x| in the direction going towards |(1,1)|.
+ Likewise, |(1,1)--(x)| will also have the line end on the border in the
+ direction coming from |(1,1)|.
+
+ In addition to |--|, the curve-to path operation |..| and the path
+ operations \verb!-|! and \verb!|-! will also handle nodes without
+ anchors correctly. Here is an example, see also
+ Section~\ref{section-node-coordinates}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path (0,0) node (x) {Hello World!}
+ (3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};
+
+ \draw[->,blue] (x) -- (y);
+ \draw[->,red] (x) -| node[near start,below] {label} (y);
+ \draw[->,orange] (x) .. controls +(up:1cm) and +(left:1cm) .. node[above,sloped] {label} (y);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{enumerate}
+
+
+\subsection{Connecting Nodes: Using the Edge Operation}
+\label{section-nodes-edges}
+
+\subsubsection{Basic Syntax of the Edge Operation}
+
+The |edge| operation works like a |to| operation that is added after the main
+path has been drawn, much like a node is added after the main path has been
+drawn. This allows each |edge| to have a different appearance. As the |node|
+operation, an |edge| temporarily suspends the construction of the current path
+and a new path $p$ is constructed. This new path $p$ will be drawn after the
+main path has been drawn. Note that $p$ can be totally different from the main
+path with respect to its options. Also note that if there are several |edge|
+and/or |node| operations in the main path, each creates its own path(s) and
+they are drawn in the order that they are encountered on the main path.
+
+\begin{pathoperation}{edge}{\opt{|[|\meta{options}|]|} \opt{\meta{nodes}} |(|\meta{coordinate}|)|}
+ The effect of the |edge| operation is that after the main path the
+ following path is added to the picture:
+ %
+ \begin{quote}
+ |\path[every edge,|\meta{options}|] (\tikztostart) |\meta{path}|;|
+ \end{quote}
+ %
+ Here, \meta{path} is the |to path|. Note that, unlike the path added by the
+ |to| operation, the |(\tikztostart)| is added before the \meta{path} (which
+ is unnecessary for the |to| operation, since this coordinate is already
+ part of the main path).
+
+ The |\tikztostart| is the last coordinate on the path just before the
+ |edge| operation, just as for the |node| or |to| operations. However, there
+ is one exception to this rule: If the |edge| operation is directly preceded
+ by a |node| operation, then this just-declared node is the start coordinate
+ (and not, as would normally be the case, the coordinate where this
+ just-declared node is placed -- a small, but subtle difference). In this
+ regard, |edge| differs from both |node| and |to|.
+
+ If there are several |edge| operations in a row, the start coordinate is
+ the same for all of them as their target coordinates are not, after all,
+ part of the main path. The start coordinate is, thus, the coordinate
+ preceding the first |edge| operation. This is similar to nodes insofar as
+ the |edge| operation does not modify the current path at all. In
+ particular, it does not change the last coordinate visited, see the
+ following example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node (a) at (0:1) {$a$};
+ \node (b) at (90:1) {$b$} edge [->] (a);
+ \node (c) at (180:1) {$c$} edge [->] (a)
+ edge [<-] (b);
+ \node (d) at (270:1) {$d$} edge [->] (a)
+ edge [dotted] (b)
+ edge [<-] (c);
+\end{tikzpicture}
+\end{codeexample}
+
+ A different way of specifying the above graph using the |edge| operation is
+ the following:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node foreach \name/\angle in {a/0,b/90,c/180,d/270}
+ (\name) at (\angle:1) {$\name$};
+
+ \path[->] (b) edge (a)
+ edge (c)
+ edge [-,dotted] (d)
+ (c) edge (a)
+ edge (d)
+ (d) edge (a);
+\end{tikzpicture}
+\end{codeexample}
+
+ As can be seen, the path of the |edge| operation inherits the options from
+ the main path, but you can locally overrule them.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node foreach \name/\angle in {a/0,b/90,c/180,d/270}
+ (\name) at (\angle:1.5) {$\name$};
+
+ \path[->] (b) edge node[above right] {$5$} (a)
+ edge (c)
+ edge [-,dotted] node[below,sloped] {missing} (d)
+ (c) edge (a)
+ edge (d)
+ (d) edge [red] node[above,sloped] {very}
+ node[below,sloped] {bad} (a);
+\end{tikzpicture}
+\end{codeexample}
+
+ Instead of |every to|, the style |every edge| is installed at the beginning
+ of the main path.
+ %
+ \begin{stylekey}{/tikz/every edge (initially draw)}
+ Executed for each |edge|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every edge/.style={draw,dashed}]
+ \path (0,0) edge (3,2);
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+\end{pathoperation}
+
+
+\subsubsection{Nodes on Edges: Quotes Syntax}
+\label{section-edge-quotes}
+
+The standard way of specifying nodes that are placed ``on'' an edge (or on a
+to-path; all of the following is also true for to--paths) is to put node
+specifications after the |edge| keyword, but before the target coordinate.
+Another way is to use the |edge node| option and its friends. Yet another way
+is to use the quotes syntax.
+
+The syntax is essentially the same as for labels added to nodes as described in
+Section~\ref{section-label-quotes} and you also need to load the |quotes|
+library.
+
+In detail, when the |quotes| library is loaded, each time a key--value pair in
+a list of options passed to an |edge| or a |to| path command starts with |"|,
+the key--value pair must actually be a string of the following form:
+%
+\begin{quote}
+ |"|\meta{text}|"|\opt{|'|}\opt{\meta{options}}
+\end{quote}
+%
+This string is transformed into the following:
+%
+\begin{quote}
+ |edge node=node [every edge quotes,|\meta{options}|]{|\meta{text}|}|
+\end{quote}
+%
+As described in Section~\ref{section-label-quotes}, the apostrophe becomes part
+of the \meta{options}, when present.
+
+The following style is important for the placement of the labels:
+
+\begin{stylekey}{/tikz/every edge quotes (initially auto)}
+ This style is |auto| by default, which causes labels specified using the
+ quotes-syntax to be placed next to the edges. Unless the setting of |auto|
+ has been changed, they will be placed to the left.
+ %
+\begin{codeexample}[]
+\tikz \draw (0,0) edge ["left", ->] (2,0);
+\end{codeexample}
+
+ In order to place all labels to the right by default, change this style to
+ |auto=right|:
+ %
+\begin{codeexample}[]
+\tikz [every edge quotes/.style={auto=right}]
+ \draw (0,0) edge ["right", ->] (2,0);
+\end{codeexample}
+
+ To place all nodes ``on'' the edge, just make this style empty (and,
+ possibly, make your labels opaque):
+ %
+\begin{codeexample}[]
+\tikz [every edge quotes/.style={fill=white,font=\footnotesize}]
+ \draw (0,0) edge ["mid", ->] (2,1);
+\end{codeexample}
+ %
+\end{stylekey}
+
+You may often wish to place some edge nodes to the right of edges and some to
+the left. For this, the special treatment of the apostrophe is particularly
+convenient: Recall that in \tikzname\ there is an option just called |'|, which
+is a shorthand for |swap|. Now, following the closing quotation mark come the
+options of an edge node. Thus, if the closing quotation mark is followed by an
+apostrophe, the |swap| option will be added to the edge label, causing it is be
+placed on the other side. Because of the special treatment, you can even add
+another option like |near end| after the apostrophe without having to add curly
+braces and commas:
+%
+\begin{codeexample}[]
+\tikz
+ \draw (0,0) edge ["left", "right"',
+ "start" near start,
+ "end"' near end] (4,0);
+\end{codeexample}
+
+In order to modify the distance between the edge labels and the edge, you
+should consider introducing some styles:
+%
+\begin{codeexample}[]
+\tikz [tight/.style={inner sep=1pt}, loose/.style={inner sep=.7em}]
+ \draw (0,0) edge ["left" tight,
+ "right"' loose,
+ "start" near start] (4,0);
+\end{codeexample}
+
+
+\subsection{Referencing Nodes Outside the Current Picture}
+\label{section-cross-picture-tikz}
+
+\subsubsection{Referencing a Node in a Different Picture}
+
+It is possible (but not quite trivial) to reference nodes in pictures other
+than the current one. This means that you can create a picture and a node
+therein and, later, you can draw a line from some other position to this node.
+
+To reference nodes in different pictures, proceed as follows:
+%
+\begin{enumerate}
+ \item You need to add the |remember picture| option to all pictures that
+ contain nodes that you wish to reference and also to all pictures from
+ which you wish to reference a node in another picture.
+ \item You need to add the |overlay| option to paths or to whole pictures
+ that contain references to nodes in different pictures. (This option
+ switches the computation of the bounding box off.)
+ \item You need to use a driver that supports picture remembering and you
+ need to run \TeX\ twice.
+\end{enumerate}
+%
+(For more details on what is going on behind the scenes, see
+Section~\ref{section-cross-pictures-pgf}.)
+
+Let us have a look at the effect of these options.
+%
+\begin{key}{/tikz/remember picture=\meta{boolean} (initially false)}
+ This option tells \tikzname\ that it should attempt to remember the
+ position of the current picture on the page. This attempt may fail
+ depending on which backend driver is used. Also, even if remembering works,
+ the position may only be available on a second run of \TeX.
+
+ Provided that remembering works, you may consider saying
+ %
+\begin{codeexample}[code only]
+\tikzset{every picture/.append style={remember picture}}
+\end{codeexample}
+ %
+ to make \tikzname\ remember all pictures. This will add one line in the
+ |.aux| file for each picture in your document -- which typically is not
+ very much. Then, you do not have to worry about remembered pictures at all.
+\end{key}
+
+\begin{key}{/tikz/overlay=\meta{boolean} (default true)}
+ This option is mainly intended for use when nodes in other pictures are
+ referenced, but you can also use it in other situations. The effect of this
+ option is that everything within the current scope is not taken into
+ consideration when the bounding box of the current picture is computed.
+
+ You need to specify this option on all paths (or at least on all parts of
+ paths) that contain a reference to a node in another picture. The reason is
+ that, otherwise, \tikzname\ will attempt to make the current picture large
+ enough to encompass \emph{the node in the other picture}. However, on a
+ second run of \TeX\ this will create an even bigger picture, leading to
+ larger and larger pictures. Unless you know what you are doing, I suggest
+ specifying the |overlay| option with all pictures that contain references
+ to other pictures.
+\end{key}
+
+Let us now have a look at a few examples. These examples work only if this
+document is processed with a driver that supports picture remembering.
+\medskip
+
+\noindent%
+\begin{minipage}{\textwidth}
+Inside the current text we place two pictures, containing nodes named |n1| and
+|n2|, using
+%
+\begin{codeexample}[code only]
+\tikz[remember picture] \node[circle,fill=red!50] (n1) {};
+\end{codeexample}
+%
+which yields \tikz[remember picture] \node[circle,fill=red!50] (n1) {};, and
+%
+\begin{codeexample}[code only]
+\tikz[remember picture] \node[fill=blue!50] (n2) {};
+\end{codeexample}
+%
+yielding the node \tikz[remember picture] \node[fill=blue!50] (n2) {};. To
+connect these nodes, we create another picture using the |overlay| option and
+also the |remember picture| option.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture,overlay]
+ \draw[->,very thick] (n1) -- (n2);
+\end{tikzpicture}
+\end{codeexample}
+%
+Note that the last picture is seemingly empty. What happens is that it has zero
+size and contains an arrow that lies well outside its bounds. As a last
+example, we connect a node in another picture to the first two nodes. Here, we
+provide the |overlay| option only with the line that we do not wish to count as
+part of the picture.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture]
+ \node (c) [circle,draw] {Big circle};
+
+ \draw [overlay,->,very thick,red,opacity=.5]
+ (c) to[bend left] (n1) (n1) -| (n2);
+\end{tikzpicture}
+\end{codeexample}
+\end{minipage}
+
+
+\subsubsection{Referencing the Current Page Node -- Absolute Positioning}
+
+There is a special node called |current page| that can be used to access the
+current page. It is a node of shape rectangle whose |south west| anchor is the
+lower left corner of the page and whose |north east| anchor is the upper right
+corner of the page. While this node is handled in a special way internally, you
+can reference it as if it were defined in some remembered picture other than
+the current one. Thus, by giving the |remember picture| and the |overlay|
+options to a picture, you can position nodes \emph{absolutely} on a page.
+
+The first example places some text in the lower left corner of the current
+page:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture,overlay]
+ \node [xshift=1cm,yshift=1cm] at (current page.south west)
+ [text width=7cm,fill=red!20,rounded corners,above right]
+ {
+ This is an absolutely positioned text in the
+ lower left corner. No shipout-hackery is used.
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+The next example adds a circle in the middle of the page.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture,overlay]
+ \draw [line width=1mm,opacity=.25]
+ (current page.center) circle (3cm);
+\end{tikzpicture}
+\end{codeexample}
+
+The final example overlays some text over the page (depending on where this
+example is found on the page, the text may also be behind the page).
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[remember picture,overlay]
+ \node [rotate=60,scale=10,text opacity=0.2]
+ at (current page.center) {Example};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Late Code and Late Options}
+\label{section-node-also}
+
+All options given to a node only locally affect this one node. While this is a
+blessing in most cases, you may sometimes want to cause options to have effects
+``later'' on. The other way round, you may sometimes note ``only later'' that
+some options should be added to the options of a node. For this, the following
+version of the |node| path command can be used:
+
+\begin{pathoperation}{node also}{\opt{|[|\meta{late options}|]|}|(|\meta{name}|)|}
+ Note that the \meta{name} is compulsory and that \emph{no} text may be
+ given. Also, the ordering of options and node label must be as above.
+
+ The effect of the above is the following effect: The node \meta{name} must
+ already be existing. Now, the \meta{late options} are executed in a local
+ scope. Most of these options will have no effect since you \emph{cannot
+ change the appearance of the node,} that is, you cannot change a red node
+ into a green node using these ``late'' options. However, giving the
+ |append after command| and |prefix after command| options inside the
+ \meta{late options} (directly or indirectly) does have the desired effect:
+ The given path gets executed with the |\tikzlastnode| set to the determined
+ node.
+
+ The net effect of all this is that you can provide, say, the |label| option
+ inside the \meta{options} to a add a label to a node that has already been
+ constructed.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [draw,circle] (a) {Hello};
+ \node also [label=above:world] (a);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{pathoperation}
+
+As explained in Section~\ref{section-paths}, you can use the options
+|append after command| and |prefix after command| to add a path after a node.
+The following macro may be useful there:
+%
+\begin{command}{\tikzlastnode}
+ Expands to the last node on the path.
+\end{command}
+
+Instead of the |node also| syntax, you can also the following option:
+
+\begin{key}{/tikz/late options=\meta{options}}
+ This option can be given on a path (but not as an argument to a |node| path
+ command) and has the same effect as the |node also| path command. Inside
+ the \meta{options}, you should use the |name| option to specify the node
+ for which you wish to add late options:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node [draw,circle] (a) {Hello};
+ \path [late options={name=a, label=above:world}];
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transformations.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transformations.tex
new file mode 100644
index 0000000000..fcd5ef673c
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transformations.tex
@@ -0,0 +1,499 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Transformations}
+
+\pgfname\ has a powerful transformation mechanism that is similar to the
+transformation capabilities of \textsc{metafont}. The present section explains
+how you can access it in \tikzname.
+
+
+\subsection{The Different Coordinate Systems}
+
+It is a long process from a coordinate like, say, $(1,2)$ or
+$(1\mathrm{cm},5\mathrm{pt})$, to the position a point is finally placed on the
+display or paper. In order to find out where the point should go, it is
+constantly ``transformed'', which means that it is mostly shifted around and
+possibly rotated, slanted, scaled, and otherwise mutilated.
+
+In detail, (at least) the following transformations are applied to a coordinate
+like $(1,2)$ before a point on the screen is chosen:
+%
+\begin{enumerate}
+ \item \pgfname\ interprets a coordinate like $(1,2)$ in its
+ $xy$-coordinate system as ``add the current $x$-vector once and the
+ current $y$-vector twice to obtain the new point''.
+ \item \pgfname\ applies its coordinate transformation matrix to the
+ resulting coordinate. This yields the final position of the point
+ inside the picture.
+ \item The backend driver (like |dvips| or |pdftex|) adds transformation
+ commands such that the coordinate is shifted to the correct position in
+ \TeX's page coordinate system.
+ \item \textsc{pdf} (or PostScript) apply the canvas transformation matrix
+ to the point, which can once more change the position on the page.
+ \item The viewer application or the printer applies the device
+ transformation matrix to transform the coordinate to its final pixel
+ coordinate on the screen or paper.
+\end{enumerate}
+
+In reality, the process is even more involved, but the above should give the
+idea: A point is constantly transformed by changes of the coordinate system.
+
+In \tikzname, you only have access to the first two coordinate systems: The
+$xy$-coordinate system and the coordinate transformation matrix (these will be
+explained later). \pgfname\ also allows you to change the canvas transformation
+matrix, but you have to use commands of the core layer directly to do so and
+you ``better know what you are doing'' when you do this. The moment you start
+modifying the canvas matrix, \pgfname\ immediately loses track of all
+coordinates and shapes, anchors, and bounding box computations will no longer
+work.
+
+
+\subsection{The XY- and XYZ-Coordinate Systems}
+\label{section-xyz}
+
+The first and easiest coordinate systems are \pgfname's $xy$- and
+$xyz$-coordinate systems. The idea is very simple: Whenever you specify a
+coordinate like |(2,3)| this means $2v_x + 3v_y$, where $v_x$ is the current
+\emph{$x$-vector} and $v_y$ is the current \emph{$y$-vector}. Similarly, the
+coordinate |(1,2,3)| means $v_x + 2v_y + 3v_z$.
+
+Unlike other packages, \pgfname\ does not insist that $v_x$ actually has a
+$y$-component of $0$, that is, that it is a horizontal vector. Instead, the
+$x$-vector can point anywhere you want. Naturally, \emph{normally} you will
+want the $x$-vector to point horizontally.
+
+One undesirable effect of this flexibility is that it is not possible to
+provide mixed coordinates as in $(1,2\mathrm{pt})$. Life is hard.
+
+To change the $x$-, $y$-, and $z$-vectors, you can use the following options:
+
+\begin{key}{/tikz/x=\meta{value} (initially 1cm)}
+ If \meta{value} is a dimension, the $x$-vector of \pgfname's
+ $xyz$-coordinate system is set up to point \meta{value} to the right, that
+ is, to $(\meta{value},0pt)$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- +(1,0);
+ \draw[x=2cm,color=red] (0,0.1) -- +(1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \draw[x=1.5cm] (0,0) grid (2,2);
+\end{codeexample}
+
+ The last example shows that the size of steppings in grids, just like all
+ other dimensions, are not affected by the $x$-vector. After all, the
+ $x$-vector is only used to determine the coordinate of the upper right
+ corner of the grid.
+
+ If \meta{value} is a coordinate, the $x$-vector of \pgfname's
+ $xyz$-coordinate system to the specified coordinate. If \meta{value}
+ contains a comma, it must be put in braces.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) -- (1,0);
+ \draw[x={(2cm,0.5cm)},color=red] (0,0) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+ You can use this, for example, to exchange the meaning of the $x$- and
+ $y$-coordinate.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[smooth]
+ \draw plot coordinates{(1,0) (2,0.5) (3,0) (3,1)};
+ \draw[x={(0cm,1cm)},y={(1cm,0cm)},color=red]
+ plot coordinates{(1,0) (2,0.5) (3,0) (3,1)};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/y=\meta{value} (initially 1cm)}
+ Works like the |x=| option, only if \meta{value} is a dimension, the
+ resulting vector points to $(0,\meta{value})$.
+\end{key}
+
+\begin{key}{/tikz/z=\meta{value} (initially \normalfont$-3.85$mm)}
+ Works like the |y=| option, but now a dimension is the point
+ $(\meta{value},\meta{value})$.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[z=-1cm,->,thick]
+ \draw[color=red] (0,0,0) -- (1,0,0);
+ \draw[color=blue] (0,0,0) -- (0,1,0);
+ \draw[color=orange] (0,0,0) -- (0,0,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Coordinate Transformations}
+
+\pgfname\ and \tikzname\ allow you to specify \emph{coordinate
+transformations}. Whenever you specify a coordinate as in |(1,0)| or
+|(1cm,1pt)| or |(30:2cm)|, this coordinate is first ``reduced'' to a position
+of the form ``$x$ points to the right and $y$ points upwards''. For example,
+|(1in,5pt)| is reduced to ``$72\frac{72}{100}$ points to the right and 5 points
+upwards'' and |(90:100pt)| means ``0pt to the right and 100 points upwards''.
+
+The next step is to apply the current \emph{coordinate transformation matrix}
+to the coordinate. For example, the coordinate transformation matrix might
+currently be set such that it adds a certain constant to the $x$ value. Also,
+it might be set up such that it, say, exchanges the $x$ and $y$ value. In
+general, any ``standard'' transformation like translation, rotation, slanting,
+or scaling or any combination thereof is possible. (Internally, \pgfname\ keeps
+track of a coordinate transformation matrix very much like the concatenation
+matrix used by \textsc{pdf} or PostScript.)
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) rectangle (1,0.5);
+ \begin{scope}[xshift=1cm]
+ \draw [red] (0,0) rectangle (1,0.5);
+ \draw[yshift=1cm] [blue] (0,0) rectangle (1,0.5);
+ \draw[rotate=30] [orange] (0,0) rectangle (1,0.5);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+The most important aspect of the coordinate transformation matrix is \emph{that
+it applies to coordinates only!} In particular, the coordinate transformation
+has no effect on things like the line width or the dash pattern or the shading
+angle. In certain cases, it is not immediately clear whether the coordinate
+transformation matrix \emph{should} apply to a certain dimension. For example,
+should the coordinate transformation matrix apply to grids? (It does.) And what
+about the size of arced corners? (It does not.) The general rule is: ``If there
+is no `coordinate' involved, even `indirectly', the matrix is not applied.''.
+However, sometimes, you simply have to try or look it up in the documentation
+whether the matrix will be applied.
+
+Setting the matrix cannot be done directly. Rather, all you can do is to
+``add'' another transformation to the current matrix. However, all
+transformations are local to the current \TeX-group. All transformations are
+added using graphic options, which are described below.
+
+Transformations apply immediately when they are encountered ``in the middle of
+a path'' and they apply only to the coordinates on the path following the
+transformation option.
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) rectangle (1,0.5) [xshift=2cm] (0,0) rectangle (1,0.5);
+\end{codeexample}
+
+A final word of warning: You should refrain from using ``aggressive''
+transformations like a scaling of a factor of 10\,000. The reason is that all
+transformations are done using \TeX, which has a fairly low accuracy.
+Furthermore, in certain situations it is necessary that \tikzname\
+\emph{inverts} the current transformation matrix and this will fail if the
+transformation matrix is badly conditioned or even singular (if you do not know
+what singular matrices are, you are blessed).
+
+\begin{key}{/tikz/shift={\ttfamily\char`\{}\meta{coordinate}{\ttfamily\char`\}}}
+ Adds the \meta{coordinate} to all coordinates.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[shift={(1,1)},blue] (0,0) -- (1,1) -- (1,0);
+ \draw[shift={(30:1cm)},red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/shift only}
+ This option does not take any parameter. Its effect is to cancel all
+ current transformations except for the shifting. This means that the origin
+ will remain where it is, but any rotation around the origin or scaling
+ relative to the origin or skewing will no longer have an effect.
+
+ This option is useful in situations where a complicated transformation is
+ used to ``get to a position'', but you then wish to draw something
+ ``normal'' at this position.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[rotate=30,xshift=2cm,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[rotate=30,xshift=2cm,shift only,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/xshift=\meta{dimension}}
+ Adds \meta{dimension} to the $x$ value of all coordinates.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[xshift=2cm,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[xshift=-10pt,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/yshift=\meta{dimension}}
+ Adds \meta{dimension} to the $y$ value of all coordinates.
+\end{key}
+
+\begin{key}{/tikz/scale=\meta{factor}}
+ Multiplies all coordinates by the given \meta{factor}. The \meta{factor}
+ should not be excessively large in absolute terms or very close to zero.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[scale=2,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[scale=-1,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/scale around={\ttfamily\char`\{}\meta{factor}|:|\meta{coordinate}{\ttfamily\char`\}}}
+ Scales the coordinate system by \meta{factor}, with the ``origin of
+ scaling'' centered on \meta{coordinate} rather than the origin.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[scale=2,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[scale around={2:(1,1)},red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/xscale=\meta{factor}}
+ Multiplies only the $x$-value of all coordinates by the given
+ \meta{factor}.
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[xscale=2,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[xscale=-1,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/yscale=\meta{factor}}
+ Multiplies only the $y$-value of all coordinates by \meta{factor}.
+\end{key}
+
+\begin{key}{/tikz/xslant=\meta{factor}}
+ Slants the coordinate horizontally by the given \meta{factor}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[xslant=2,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[xslant=-1,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/yslant=\meta{factor}}
+ Slants the coordinate vertically by the given \meta{factor}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[yslant=2,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[yslant=-1,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rotate=\meta{degree}}
+ Rotates the coordinate system by \meta{degree}:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[rotate=40,blue] (0,0) -- (1,1) -- (1,0);
+ \draw[rotate=-20,red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rotate around={\ttfamily\char`\{}\meta{degree}|:|\meta{coordinate}{\ttfamily\char`\}}}
+ Rotates the coordinate system by \meta{degree} around the point
+ \meta{coordinate}.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[rotate around={40:(1,1)},blue] (0,0) -- (1,1) -- (1,0);
+ \draw[rotate around={-20:(1,1)},red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rotate around x=\meta{angle}}
+ This key sets the $x$, $y$ and $z$ vectors of the \pgfname\
+ $xyz$-coordinate system so that they are rotated by \meta{angle} around the
+ axis corresponding to the $x$-vector. The rotation is applied so that when
+ looking towards the origin along this axis, positive angles result in an
+ anticlockwise rotation.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth]
+ \draw [->] (0,0,0) -- (2,0,0) node [at end, right] {$x$};
+ \draw [->] (0,0,0) -- (0,2,0) node [at end, left] {$y$};
+ \draw [->] (0,0,0) -- (0,0,2) node [at end, left] {$z$};
+
+ \draw [red, rotate around x=0] (0,0,0) -- (1,1,0) -- (1,0,0);
+ \draw [green, rotate around x=45] (0,0,0) -- (1,1,0) -- (1,0,0);
+ \draw [blue, rotate around x=90] (0,0,0) -- (1,1,0) -- (1,0,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rotate around y=\meta{angle}}
+ This key sets the $x$, $y$ and $z$ vectors of the \pgfname\
+ $xyz$-coordinate system so that they are rotated by \meta{angle} around
+ the axis corresponding to the $y$-vector. The rotation is applied so that
+ when looking towards the origin along this axis, positive angles result in
+ an anticlockwise rotation.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth]
+ \draw [->] (0,0,0) -- (2,0,0) node [at end, right] {$x$};
+ \draw [->] (0,0,0) -- (0,2,0) node [at end, left] {$y$};
+ \draw [->] (0,0,0) -- (0,0,2) node [at end, left] {$z$};
+
+ \draw [red, rotate around y=0] (0,0,0) -- (1,1,0) -- (1,0,0);
+ \draw [green, rotate around y=-45] (0,0,0) -- (1,1,0) -- (1,0,0);
+ \draw [blue, rotate around y=-90] (0,0,0) -- (1,1,0) -- (1,0,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/rotate around z=\meta{angle}}
+ This key sets the $x$, $y$ and $z$ vectors of the \pgfname\
+ $xyz$-coordinate system so that they are rotated by \meta{angle} around the
+ axis corresponding to the $z$-vector. The rotation is applied so that when
+ looking towards the origin along this axis, positive angles result in an
+ anticlockwise rotation.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[>=stealth]
+ \draw [->] (0,0,0) -- (2,0,0) node [at end, right] {$x$};
+ \draw [->] (0,0,0) -- (0,2,0) node [at end, left] {$y$};
+ \draw [->] (0,0,0) -- (0,0,2) node [at end, left] {$z$};
+
+ \draw [red, rotate around z=0] (0,0) -- (1,1) -- (1,0);
+ \draw [green, rotate around z=45] (0,0) -- (1,1) -- (1,0);
+ \draw [blue, rotate around z=90] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/cm={\ttfamily\char`\{}\meta{$a$}|,|\meta{$b$}|,|\meta{$c$}|,|\meta{$d$}|,|\meta{coordinate}{\ttfamily\char`\}}}
+ applies the following transformation to all coordinates: Let $(x,y)$ be the
+ coordinate to be transformed and let \meta{coordinate} specify the point
+ $(t_x,t_y)$. Then the new coordinate is given by
+ $\left(\begin{smallmatrix} a & c \\ b & d\end{smallmatrix}\right)
+ \left(\begin{smallmatrix} x \\ y \end{smallmatrix}\right) +
+ \left(\begin{smallmatrix} t_x \\ t_y \end{smallmatrix}\right)$.
+ Usually, you do not use this option directly.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[cm={1,1,0,1,(0,0)},blue] (0,0) -- (1,1) -- (1,0);
+ \draw[cm={0,1,1,0,(1cm,1cm)},red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/reset cm}
+ Completely resets the coordinate transformation matrix to the identity
+ matrix. This will destroy not only the transformations applied in the
+ current scope, but also all transformations inherited from surrounding
+ scopes. Do not use this option, unless you really, really know what you are
+ doing.
+\end{key}
+
+
+\subsection{Canvas Transformations}
+
+A \emph{canvas transformation}, see
+Section~\ref{section-design-transformations} for details, is best thought of as
+a transformation in which the drawing canvas is stretched or rotated. Imaging
+writing something on a balloon (the canvas) and then blowing air into the
+balloon: Not only does the text become larger, the thin lines also become
+larger. In particular, if you scale the canvas by a factor of two, all lines
+are twice as thick.
+
+Canvas transformations should be used with great care. In most circumstances
+you do \emph{not} want line widths to change in a picture as this creates
+visual inconsistency.
+
+Just as important, when you use canvas transformations \emph{\pgfname\ loses
+track of positions of nodes and of picture sizes} since it does not take the
+effect of canvas transformations into account when it computes coordinates of
+nodes (do not, however, rely on this; it may change in the future).
+
+Finally, note that a canvas transformation always applies to a path as a whole,
+it is not possible (as for coordinate transformations) to use different
+transformations in different parts of a path.
+
+In short, you should not use canvas transformations unless you really know what
+you are doing.
+
+\begin{key}{/tikz/transform canvas=\meta{options}}
+ The \meta{options} should contain coordinate transformations options like
+ |scale| or |xshift|. Multiple options can be given, their effects
+ accumulate in the usual manner. The effect of these \meta{options}
+ (immediately) changes the current canvas transformation matrix. The
+ coordinate transformation matrix is not changed. Tracking of the picture
+ size is (locally) switched off and the node coordinate will no longer be
+ correct.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \draw (0,0) -- (1,1) -- (1,0);
+ \draw[transform canvas={scale=2},blue] (0,0) -- (1,1) -- (1,0);
+ \draw[transform canvas={rotate=180},red] (0,0) -- (1,1) -- (1,0);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transparency.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transparency.tex
new file mode 100644
index 0000000000..b93d2f2003
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-transparency.tex
@@ -0,0 +1,882 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Transparency}
+\label{section-tikz-transparency}
+
+\subsection{Overview}
+
+Normally, when you paint something using any of \tikzname's commands (this
+includes stroking, filling, shading, patterns, and images), the newly painted
+objects totally obscure whatever was painted earlier in the same area.
+
+You can change this behaviour by using something that can be thought of as
+``(semi)transparent colors''. Such colors do not completely obscure the
+background, rather they blend the background with the new color. At first
+sight, using such semitransparent colors might seem quite straightforward, but
+the math going on in the background is quite involved and the correct handling
+of transparency fills some 64 pages in the PDF specification.
+
+In the present section, we start with the different ways of specifying ``how
+transparent'' newly drawn objects should be. The simplest way is to just
+specify a percentage like ``60\% transparent''. A much more general way is to
+use something that I call a \emph{fading}, also known as a soft mask or a mask.
+
+At the end of the section we address the problem of creating so-called
+\emph{transparency groups}. This problem arises when you paint over a position
+several times with a semitransparent color. Sometimes you want the effect to
+accumulate, sometimes you do not.
+
+\emph{Note:} Transparency is best supported by the pdf\TeX\ driver. The
+\textsc{svg} driver also has some support. For PostScript output, opacity is
+rendered correctly only with the most recent versions of Ghostscript. Printers
+and other programs will typically ignore the opacity setting.
+
+
+\subsection{Specifying a Uniform Opacity}
+
+Specifying a stroke and/or fill opacity is quite easy using the following
+options.
+
+\begin{key}{/tikz/draw opacity=\meta{value}}
+ This option sets ``how transparent'' lines should be. A value of |1| means
+ ``fully opaque'' or ``not transparent at all'', a value of |0| means
+ ``fully transparent'' or ``invisible''. A value of |0.5| yields lines that
+ are semitransparent.
+
+ Note that when you use PostScript as your output format, this option works
+ only with recent versions of Ghostscript.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=1ex]
+ \draw (0,0) -- (3,1);
+ \filldraw [fill=yellow!80!black,draw opacity=0.5] (1,0) rectangle (2,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+Note that the |draw opacity| options only sets the opacity of drawn lines. The
+opacity of fillings is set using the option |fill opacity| (documented in
+Section~\ref{section-fill-opacity}. The option |opacity| sets both at the same
+time.
+
+\begin{key}{/tikz/opacity=\meta{value}}
+ Sets both the drawing and filling opacity to \meta{value}.
+
+ The following predefined styles make it easier to use this option:
+ %
+ \begin{stylekey}{/tikz/transparent}
+ Makes everything totally transparent and, hence, invisible.
+ %
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[transparent,red] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/ultra nearly transparent}
+ Makes everything, well, ultra nearly transparent.
+ %
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[ultra nearly transparent] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/very nearly transparent}
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[very nearly transparent] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/nearly transparent}
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[nearly transparent] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/semitransparent}
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[semitransparent] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/nearly opaque}
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[nearly opaque] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/very nearly opaque}
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[very nearly opaque] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/ultra nearly opaque}
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[ultra nearly opaque] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+
+ \begin{stylekey}{/tikz/opaque}
+ This yields completely opaque drawings, which is the default.
+ %
+\begin{codeexample}[]
+\tikz{\fill[red] (0,0) rectangle (1,0.5);
+ \fill[opaque] (0.5,0) rectangle (1.5,0.25); }
+\end{codeexample}
+ \end{stylekey}
+\end{key}
+
+\begin{key}{/tikz/fill opacity=\meta{value}}
+ This option sets the opacity of fillings. In addition to filling
+ operations, this opacity also applies to text and images.
+
+ Note, again, that when you use PostScript as your output format, this
+ option works only with recent versions of Ghostscript.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[thick,fill opacity=0.5]
+ \filldraw[fill=red] (0:1cm) circle (12mm);
+ \filldraw[fill=green] (120:1cm) circle (12mm);
+ \filldraw[fill=blue] (-120:1cm) circle (12mm);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \fill[red] (0,0) rectangle (3,2);
+
+ \node at (0,0) {\huge A};
+ \node[fill opacity=0.5] at (3,2) {\huge B};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/text opacity=\meta{value}}
+ Sets the opacity of text labels, overriding the |fill opacity| setting.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[every node/.style={fill,draw}]
+ \draw[line width=2mm,blue!50,line cap=round] (0,0) grid (3,2);
+
+ \node[opacity=0.5] at (1.5,2) {Upper node};
+ \node[draw opacity=0.8,fill opacity=0.2,text opacity=1]
+ at (1.5,0) {Lower node};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+Note the following effect: If you set up a certain opacity for stroking or
+filling and you stroke or fill the same area twice, the effect accumulates:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[fill opacity=0.5]
+ \fill[red] (0,0) circle (1);
+ \fill[red] (1,0) circle (1);
+\end{tikzpicture}
+\end{codeexample}
+
+Often, this is exactly what you intend, but not always. You can use
+transparency groups, see the end of this section, to change this.
+
+
+\subsection{Blend Modes}
+\label{section-blend-modes}
+
+A \emph{blend mode} specifies how colors mix when you paint on a canvas.
+Normally, if you paint a red box on a green circle, the red color will
+completely replace the green circle. However, in some situations you might also
+wish the red color to somehow ``mix'' or ``blend'' with the green circle. We
+already saw that, using transparency, we can draw something without completely
+obscuring the background. \emph{Blending} is a similar operation, only here we
+mix colors in more complicated ways.
+
+\emph{Note:} Blending is a rather ``advanced'' feature of \textsc{pdf}. Most
+renderers, let alone printers, will have trouble rendering blending correctly.
+
+\begin{key}{/tikz/blend mode=\meta{mode}}
+ Sets the current blend mode to \meta{mode}. Here \meta{mode} must be one of
+ the modes listed below. More details on these modes can also be found in
+ Section~7.2.4 of the \textsc{pdf} Specification, version~1.7.
+
+ In the following example, the blend mode is only used and set inside a
+ transparency group (see also Section~\ref{section-transparency-groups}).
+ This is because most renderers (viewing programs) have trouble rendering
+ blending correctly otherwise. For instance, at the time of writing, the
+ versions of Adobe's Reader and Apple's Preview render the following drawing
+ very differently, if the transparency group is not used in the following
+ example.
+ %
+\begin{codeexample}[]
+\tikz {
+ \begin{scope}[transparency group]
+ \begin{scope}[blend mode=screen]
+ \fill[red!90!black] ( 90:.6) circle (1);
+ \fill[green!80!black] (210:.6) circle (1);
+ \fill[blue!90!black] (330:.6) circle (1);
+ \end{scope}
+ \end{scope}
+}
+\end{codeexample}
+
+ Because of the trouble with rendering blending correctly outside
+ transparency groups, there is a special key that establishes a transparency
+ group and sets a blend mode simultaneously:
+
+ \begin{key}{/tikz/blend group=\meta{mode}}
+ This key can only be used with a scope (like |transparency group|). It
+ will cause the current scope to become a transparency group and, inside
+ this group, the blend mode will be set to \meta{mode}.
+ %
+\begin{codeexample}[]
+\tikz [blend group=screen] {
+ \fill[red!90!black] ( 90:.6) circle (1);
+ \fill[green!80!black] (210:.6) circle (1);
+ \fill[blue!90!black] (330:.6) circle (1);
+}
+\end{codeexample}
+ \end{key}
+
+ Here is an overview of the effects of the different available blend modes.
+ In the examples, we always have three circles drawn on top of each other
+ (as in the example code earlier): We start with a triple of pure red,
+ green, and blue. Below it, we have a triple of light versions of these
+ three colors (|red!50|, |green!50|, and |blue!50|). Next comes the triple
+ yellow, cyan, and magenta; again with a triple of light versions below it.
+ The large example consists of three balls (produced using |ball color|)
+ having the colors red, green, and blue, are drawn on top of each other just
+ like the circles.
+
+ \definecolor{rg}{rgb}{1,1,0}
+ \definecolor{gb}{rgb}{0,1,1}
+ \definecolor{br}{rgb}{1,0,1}
+
+ \def\makeline#1#2#3{\leavevmode
+ \hbox to 40mm{#1\hss}\ \hbox to
+ 20.5mm{#2\hss}\ \begin{minipage}[t]{88.5mm}\raggedright#3\end{minipage}\par
+ \textcolor{black!25}{\hrule height1pt}
+ }
+
+ \def\showmode#1#2{
+ \makeline{
+ \tikz [blend mode=#1,baseline=-.5ex] {
+ \fill[red] ( 90:.5em) circle (.75em);
+ \fill[green] (210:.5em) circle (.75em);
+ \fill[blue] (330:.5em) circle (.75em);
+ \scoped[yshift=-2.5em]{
+ \fill[red!50] ( 90:.5em) circle (.75em);
+ \fill[green!50] (210:.5em) circle (.75em);
+ \fill[blue!50] (330:.5em) circle (.75em);
+ }
+ }
+ \tikz [blend mode=#1,baseline=-.5ex] {
+ \fill[rg] ( 90:.5em) circle (.75em);
+ \fill[gb] (210:.5em) circle (.75em);
+ \fill[br] (330:.5em) circle (.75em);
+ \scoped[yshift=-2.5em]{
+ \fill[rg!50] ( 90:.5em) circle (.75em);
+ \fill[gb!50] (210:.5em) circle (.75em);
+ \fill[br!50] (330:.5em) circle (.75em);
+ }
+ }
+ \tikz [blend mode=#1,baseline=-.5ex+1.25em] {
+ \shade[ball color=red] ( 90:1em) circle (1.5em);
+ \shade[ball color=green] (210:1em) circle (1.5em);
+ \shade[ball color=blue] (330:1em) circle (1.5em);
+ }}{\verb|#1|}{#2}%
+ % this argument was changed from {|#1|}
+ % --> see <https://sourceforge.net/p/pgf/bugs/486/>
+ }
+
+ \medskip
+ \makeline{\emph{Example}}{\emph{Mode}}{\emph{Explanations quoted from
+ Table~7.2 of the \textsc{pdf} Specification, Version~1.7}}
+ \showmode{normal}{When painting a pixel with a some color (called the
+ ``source color''), the background color (called the ``backdrop'') is
+ completely ignored.}
+ \showmode{multiply}{Multiplies the backdrop and source color values. The
+ result color is always at least as dark as either of the two
+ constituent colors. Multiplying any color with black produces black;
+ multiplying with white leaves the original color unchanged. Painting
+ successive overlapping objects with a color other than black or white
+ produces progressively darker colors.}
+ \showmode{screen}{Multiplies the complements of the backdrop and source
+ color values, then complements the result. The result color is always
+ at least as light as either of the two constituent colors. Screening
+ any color with white produces white; screening with black leaves the
+ original color unchanged. The effect is similar to projecting multiple
+ photographic slides simultaneously onto a single screen.}
+ \showmode{overlay}{Multiplies or screens the colors, depending on the
+ backdrop color value. Source colors overlay the backdrop while
+ preserving its highlights and shadows. The backdrop color is not
+ replaced but is mixed with the source color to reflect the lightness or
+ darkness of the backdrop.}
+ \showmode{darken}{Selects the darker of the backdrop and source colors. The
+ backdrop is replaced with the source where the source is darker;
+ otherwise, it is left unchanged.}
+ \showmode{lighten}{Selects the lighter of the backdrop and source colors.
+ The backdrop is replaced with the source where the source is lighter;
+ otherwise, it is left unchanged.}
+ \showmode{color dodge}{Brightens the backdrop color to reflect the source
+ color. Painting with black produces no changes.}
+ \showmode{color burn}{Darkens the backdrop color to reflect the source
+ color. Painting with white produces no change.}
+ \showmode{hard light}{Multiplies or screens the colors, depending on the
+ source color value. The effect is similar to shining a harsh spotlight
+ on the backdrop.}
+ \showmode{soft light}{Darkens or lightens the colors, depending on the
+ source color value. The effect is similar to shining a diffused
+ spotlight on the backdrop.}
+ \showmode{difference}{Subtracts the darker of the two constituent colors
+ from the lighter color. Painting with white inverts the backdrop color;
+ painting with black produces no change.}
+ \showmode{exclusion}{Produces an effect similar to that of the Difference
+ mode but lower in contrast. Painting with white inverts the backdrop
+ color; painting with black produces no change.}
+ \showmode{hue}{Creates a color with the hue of the source color and the
+ saturation and luminosity of the backdrop color.}
+ \showmode{saturation}{Creates a color with the saturation of the source
+ color and the hue and luminosity of the backdrop color. Painting with
+ this mode in an area of the backdrop that is a pure gray (no
+ saturation) produces no change.}
+ \showmode{color}{Creates a color with the hue and saturation of the source
+ color and the luminosity of the backdrop color. This preserves the gray
+ levels of the backdrop and is useful for coloring monochrome images or
+ tinting color images.}
+ \showmode{luminosity}{Creates a color with the luminosity of the source
+ color and the hue and saturation of the backdrop color. This produces
+ an inverse effect to that of the Color mode.}
+\end{key}
+
+
+\subsection{Fadings}
+
+For complicated graphics, uniform transparency settings are not always
+sufficient. Suppose, for instance, that while you paint a picture, you want the
+transparency to vary smoothly from completely opaque to completely transparent.
+This is a ``shading-like'' transparency. For such a form of transparency I will
+use the term \emph{fading} (as a noun). They are also known as \emph{soft
+masks}, \emph{opacity masks}, \emph{masks}, or \emph{soft clips}.
+
+
+\subsubsection{Creating Fadings}
+
+How do we specify a fading? This is a bit of an art since the underlying
+mechanism is quite powerful, but a bit difficult to use.
+
+Let us start with a bit of terminology. A \emph{fading} specifies for each
+point of an area the transparency of that point. This transparency can by any
+number between 0 and 1. A \emph{fading picture} is a normal graphic that, in a
+way to be described in a moment, determines the transparency of points inside
+the fading. Each fading has an underlying fading picture.
+
+The fading picture is a normal graphic drawn using any of the normal graphic
+drawing commands. A fading and its fading picture are related as follows: Given
+any point of the fading, the transparency of this point is determined by the
+luminosity of the fading picture at the same position. The luminosity of a
+point determines ``how bright'' the point is. The brighter the point in the
+fading picture, the more opaque is the point in the fading. In particular, a
+white point of the fading picture is completely opaque in the fading and a
+black point of the fading picture is completely transparent in the fading. (The
+background of the fading picture is always transparent in the fading as if the
+background were black.)
+
+It is rather counter-intuitive that a \emph{white} pixel of the fading picture
+will be \emph{opaque} in the fading and a \emph{black} pixel will be
+\emph{transparent}. For this reason, \tikzname\ defines a color called
+|transparent| that is the same as |black|. The nice thing about this definition
+is that the color |transparent!|\meta{percentage} in the fading picture yields
+a pixel that is \meta{percentage} percent transparent in the fading.
+
+Turning a fading picture into a normal picture is achieved using the following
+commands, which are \emph{only defined in the library}, namely the library
+|fadings|. So, to use them, you have to say |\usetikzlibrary{fadings}| first.
+
+\begin{environment}{{tikzfadingfrompicture}\oarg{options}}
+ This command works like a |{tikzpicture}|, only the picture is not shown,
+ but instead a fading is defined based on this picture. To set the name of
+ the picture, use the |name| option (which is normally used to set the name
+ of a node).
+ %
+ \begin{key}{/tikz/name=\marg{name}}
+ Use this option with the |{tikzfadingfrompicture}| environment to set
+ the name of the fading. You \emph{must} provide this option.
+ \end{key}
+
+ The following shading is 2cm by 2cm and gets more and more transparent from
+ left to right, but is 50\% transparent for a large circle in the middle.
+ %
+{\tikzexternaldisable
+\begin{codeexample}[]
+\begin{tikzfadingfrompicture}[name=fade right]
+ \shade[left color=transparent!0,
+ right color=transparent!100] (0,0) rectangle (2,2);
+ \fill[transparent!50] (1,1) circle (0.7);
+\end{tikzfadingfrompicture}
+
+% Now we use the fading in another picture:
+\begin{tikzpicture}
+ % Background
+ \fill [black!20] (-1.2,-1.2) rectangle (1.2,1.2);
+ \pattern [pattern=checkerboard,pattern color=black!30]
+ (-1.2,-1.2) rectangle (1.2,1.2);
+
+ \fill [path fading=fade right,red] (-1,-1) rectangle (1,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+ In the next example we create a fading picture that contains some text.
+ When the fading is used, we only see the shading ``through it''.
+ %
+\begin{codeexample}[]
+\begin{tikzfadingfrompicture}[name=tikz]
+ \node [text=transparent!20]
+ {\fontencoding{T1}\fontfamily{ptm}\fontsize{45}{45}\bfseries\selectfont Ti\emph{k}Z};
+\end{tikzfadingfrompicture}
+
+% Now we use the fading in another picture:
+\begin{tikzpicture}
+ \fill [black!20] (-2,-1) rectangle (2,1);
+ \pattern [pattern=checkerboard,pattern color=black!30]
+ (-2,-1) rectangle (2,1);
+
+ \shade[path fading=tikz,fit fading=false,
+ left color=blue,right color=black]
+ (-2,-1) rectangle (2,1);
+\end{tikzpicture}
+\end{codeexample}
+}%
+
+ The same effect can also be achieved using knockout groups, see
+ Section~\ref{section-transparency-groups}.
+\end{environment}
+
+\begin{plainenvironment}{{tikzfadingfrompicture}\oarg{options}}
+ The plain\TeX\ version of the environment.
+\end{plainenvironment}
+
+\begin{contextenvironment}{{tikzfadingfrompicture}\oarg{options}}
+ The Con\TeX t version of the environment.
+\end{contextenvironment}
+
+\begin{command}{\tikzfading\oarg{options}}
+ This command is used to define a fading similarly to the way a shading is
+ defined. In the \meta{options} you should
+ %
+ \begin{enumerate}
+ \item use the |name=|\meta{name} option to set a name for the fading,
+ \item use the |shading| option to set the name of the shading that you
+ wish to use,
+ \item extra options for setting the colors of the shading (typically
+ you will set them to the color |transparent!|\meta{percentage}).
+ \end{enumerate}
+ %
+ Then, a new fading named \meta{name} will be created based on the shading.
+ %
+\begin{codeexample}[]
+\tikzfading[name=fade right,
+ left color=transparent!0,
+ right color=transparent!100]
+
+% Now we use the fading in another picture:
+\begin{tikzpicture}
+ % Background
+ \fill [black!20] (-1.2,-1.2) rectangle (1.2,1.2);
+ \path [pattern=checkerboard,pattern color=black!30]
+ (-1.2,-1.2) rectangle (1.2,1.2);
+
+ \fill [red,path fading=fade right] (-1,-1) rectangle (1,1);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikzfading[name=fade out,
+ inner color=transparent!0,
+ outer color=transparent!100]
+
+% Now we use the fading in another picture:
+\begin{tikzpicture}
+ % Background
+ \fill [black!20] (-1.2,-1.2) rectangle (1.2,1.2);
+ \path [pattern=checkerboard,pattern color=black!30]
+ (-1.2,-1.2) rectangle (1.2,1.2);
+
+ \fill [blue,path fading=fade out] (-1,-1) rectangle (1,1);
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{command}
+
+
+\subsubsection{Fading a Path}
+
+A fading specifies for each pixel of a certain area how transparent this pixel
+will be. The following options are used to install such a fading for the
+current scope or path.
+
+\pgfdeclarefading{fade down}{%
+ \tikzset{top color=pgftransparent!0,bottom color=pgftransparent!100}
+ \pgfuseshading{axis}
+}
+\pgfdeclarefading{fade inside}{%
+ \tikzset{inner color=pgftransparent!90,outer color=pgftransparent!30}
+ \pgfuseshading{radial}
+}
+
+\begin{key}{/tikz/path fading=\meta{name} (default \normalfont scope's setting)}
+ This option tells \tikzname\ that the current path should be faded with the
+ fading \meta{name}. If no \meta{name} is given, the \meta{name} set for the
+ whole scope is used. Similarly to options like |draw| or |fill|, this
+ option is reset for each path, so you have to add it to each path that
+ should be faded. You can also specify |none| as \meta{name}, in which case
+ fading for the path will be switched off in case it has been switched on by
+ previous options or styles.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[path fading=south]
+ % Checker board
+ \fill [black!20] (0,0) rectangle (4,3);
+ \pattern [pattern=checkerboard,pattern color=black!30]
+ (0,0) rectangle (4,3);
+
+ \fill [color=blue] (0.5,1.5) rectangle +(1,1);
+ \fill [color=blue,path fading=north] (2.5,1.5) rectangle +(1,1);
+
+ \fill [color=red,path fading] (1,0.75) ellipse (.75 and .5);
+ \fill [color=red] (3,0.75) ellipse (.75 and .5);
+\end{tikzpicture}
+\end{codeexample}
+
+ \begin{key}{/tikz/fit fading=\meta{boolean} (default true, initially true)}
+ When set to |true|, the fading is shifted and resized (in exactly the
+ same way as a shading) so that it covers the current path. When set to
+ |false|, the fading is only shifted so that it is centered on the
+ path's center, but it is not resized. This can be useful for
+ special-purpose fadings, for instance when you use a fading to ``punch
+ out'' something.
+ \end{key}
+
+ \begin{key}{/tikz/fading transform=\meta{transformation options}}
+ The \meta{transformation options} are applied to the fading before it
+ is used. For instance, if \meta{transformation options} is set to
+ |rotate=90|, the fading is rotated by 90 degrees.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[path fading=fade down]
+ % Checker board
+ \fill [black!20] (0,0) rectangle (4,1.5);
+ \path [pattern=checkerboard,pattern color=black!30] (0,0) rectangle (4,1.5);
+
+ \fill [red,path fading,fading transform={rotate=90}]
+ (1,0.75) ellipse (.75 and .5);
+ \fill [red,path fading,fading transform={rotate=30}]
+ (3,0.75) ellipse (.75 and .5);
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/fading angle=\meta{degree}}
+ A shortcut for |fading transform={rotate=|\meta{degree}|}|.
+ \end{key}
+
+ Note that you can ``fade just about anything''. In particular, you can fade
+ a shading.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ % Checker board
+ \fill [black!20] (0,0) rectangle (4,4);
+ \path [pattern=checkerboard,pattern color=black!30] (0,0) rectangle (4,4);
+
+ \shade [ball color=blue,path fading=south] (2,2) circle (1.8);
+\end{tikzpicture}
+\end{codeexample}
+
+ The |fade inside| of the following example is more transparent in the
+ middle than on the outside.
+ %
+\begin{codeexample}[]
+\tikzfading[name=fade inside,
+ inner color=transparent!80,
+ outer color=transparent!30]
+\begin{tikzpicture}
+ % Checker board
+ \fill [black!20] (0,0) rectangle (4,4);
+ \path [pattern=checkerboard,pattern color=black!30] (0,0) rectangle (4,4);
+
+ \shade [ball color=red] (3,3) circle (0.8);
+ \shade [ball color=white,path fading=fade inside] (2,2) circle (1.8);
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that adding the |path fading| option to a node fades the (background)
+ path, not the text itself. To fade the text, you need to use a scope fading
+ (see below).
+\end{key}
+
+Note that using fadings in conjunction with patterns can create visually rather
+pleasing effects:
+%
+\begin{codeexample}[]
+\tikzfading[name=middle,
+ top color=transparent!50,
+ bottom color=transparent!50,
+ middle color=transparent!20]
+\begin{tikzpicture}
+ \node [circle,circular drop shadow,
+ pattern=horizontal lines dark blue,
+ path fading=south,
+ minimum size=3.6cm] {};
+ \pattern [path fading=north,
+ pattern=horizontal lines dark gray]
+ (0,0) circle (1.8cm);
+ \pattern [path fading=middle,
+ pattern=crosshatch dots light steel blue]
+ (0,0) circle (1.8cm);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Fading a Scope}
+
+In addition to fading individual paths, you may also wish to ``fade a scope'',
+that is, you may wish to install a fading that is used globally to specify the
+transparency for all objects drawn inside a scope. This effect can also be
+thought of as a ``soft clip'' and it works in a similar way: You add the
+|scope fading| option to a path in a scope -- typically the first one -- and
+then all subsequent drawings in the scope are faded. You will use a
+|transparency group| in conjunction, see the end of this section.
+
+\begin{key}{/tikz/scope fading=\meta{fading}}
+ In principle, this key works in exactly the same way as the |path fading|
+ key. The only difference is, that the effect of the fading will persist
+ after the current path till the end of the scope. Thus, the \meta{fading}
+ is applied to all subsequent drawings in the current scope, not just to the
+ current path. In this regard, the option works very much like the |clip|
+ option. (Note, however, that, unlike the |clip| option, fadings to not
+ accumulate unless a transparency group is used.)
+
+ The keys |fit fading| and |fading transform| have the same effect as for
+ |path fading|. Also that, just as for |path fading|, providing the
+ |scope fading| option with a |{scope}| only sets the name of the fading to
+ be used. You have to explicitly provide the |scope fading| with a path to
+ actually install a fading.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \fill [black!20] (-2,-2) rectangle (2,2);
+ \pattern [pattern=checkerboard,pattern color=black!30]
+ (-2,-2) rectangle (2,2);
+
+ % The bounding box of the shading:
+ \draw [red] (-50bp,-50bp) rectangle (50bp,50bp);
+
+ \path [scope fading=south,fit fading=false] (0,0);
+ % fading is centered at its natural size
+
+ \fill[red] ( 90:1) circle (1);
+ \fill[green] (210:1) circle (1);
+ \fill[blue] (330:1) circle (1);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the following example we resize the fading to the size of the whole
+ picture:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \fill [black!20] (-2,-2) rectangle (2,2);
+ \pattern [pattern=checkerboard,pattern color=black!30]
+ (-2,-2) rectangle (2,2);
+
+ \path [scope fading=south] (-2,-2) rectangle (2,2);
+
+ \fill[red] ( 90:1) circle (1);
+ \fill[green] (210:1) circle (1);
+ \fill[blue] (330:1) circle (1);
+\end{tikzpicture}
+\end{codeexample}
+
+ Scope fadings are also needed if you wish to fade a node.
+ %
+\begin{codeexample}[]
+\tikz \node [scope fading=south,fading angle=45,text width=3.5cm]
+{
+ This is some text that will fade out as we go right
+ and down. It is pretty hard to achieve this effect in
+ other ways.
+};
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsection{Transparency Groups}
+\label{section-transparency-groups}
+
+Consider the following cross and sign. They ``look wrong'' because we can see
+how they were constructed, while this is not really part of the desired effect.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[opacity=.5]
+ \draw [line width=5mm] (0,0) -- (2,2);
+ \draw [line width=5mm] (2,0) -- (0,2);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node at (0,0) [forbidden sign,line width=2ex,draw=red,fill=white] {Smoking};
+
+ \node [opacity=.5]
+ at (2,0) [forbidden sign,line width=2ex,draw=red,fill=white] {Smoking};
+\end{tikzpicture}
+\end{codeexample}
+
+Transparency groups are used to render them correctly:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[opacity=.5]
+ \begin{scope}[transparency group]
+ \draw [line width=5mm] (0,0) -- (2,2);
+ \draw [line width=5mm] (2,0) -- (0,2);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node at (0,0) [forbidden sign,line width=2ex,draw=red,fill=white] {Smoking};
+
+ \begin{scope}[opacity=.5,transparency group]
+ \node at (2,0) [forbidden sign,line width=2ex,draw=red,fill=white]
+ {Smoking};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{key}{/tikz/transparency group=\oarg{options}}
+ This option can be given to a |scope|. It will have the following effect:
+ The scope's contents is stroked\,/\penalty0\,filled ``ignoring any outside
+ transparency''. This means, all previous transparency settings are ignored
+ (you can still set transparency inside the group, but never mind). For
+ instance, in the forbidden sign example, the whole sign is first painted
+ (conceptually) like the image on the left hand side. Note that some pixels
+ of the sign are painted multiple times (up to three times), but only the
+ last color ``wins''.
+
+ Then, when the scope is finished, it is painted as a whole. The \emph{fill}
+ transparency settings are now applied to the resulting picture. For
+ instance, the pixel that has been painted three times is just red at the
+ end, so this red color will be blended with whatever is ``behind'' the
+ group on the page.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pattern[pattern=checkerboard,pattern color=black!15](-1,-1) rectangle (3,1);
+ \node at (0,0) [forbidden sign,line width=2ex,draw=red,fill=white] {Smoking};
+
+ \begin{scope}[transparency group,opacity=.5]
+ \node at (2,0) [forbidden sign,line width=2ex,draw=red,fill=white]
+ {Smoking};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+ Note that in the example, the |opacity=.5| is not active inside the
+ transparency group: The group is only established at beginning of the scope
+ and all options given to the |{scope}| environment are set before the group
+ is established. To change the opacity \emph{inside} the group, you need to
+ open another scope inside it or use the |opacity| key with a command inside
+ the group:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \pattern[pattern=checkerboard,pattern color=black!15](-1,-1) rectangle (3,1);
+ \node at (0,0) [forbidden sign,line width=2ex,draw=red,fill=white] {Smoking};
+
+ \begin{scope}[transparency group,opacity=.5]
+ \node (s) at (2,0) [forbidden sign,line width=2ex,draw=red,fill=white]
+ {Smoking};
+
+ \draw [opacity=.5, line width=2ex, blue] (1.2,0) -- (2.8,0);
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+ The \meta{options} are a list of comma-separated options:
+ %
+ \begin{itemize}
+ \item \declare{|knockout|} When this option is given inside the
+ \meta{options}, the group becomes a so-called \emph{knockout}
+ group. This means, essentially, that inside the group everything is
+ painted as if the ``opacity'' of a line or area were just another
+ color channel. In particular, if you paint a pixel with opacity $0$
+ inside a knockout group, this pixel becomes perfectly transparent
+ immediately. In contrast, painting a pixel with something of
+ opacity $0$ normally has no effect.
+
+ Not all renderers, let alone printers, will support this. At the
+ time of writing, Apple's Preview will not show the following
+ correctly (you should see the text \tikzname\ in the middle):
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \shade [left color=red,right color=blue] (-2,-1) rectangle (2,1);
+ \begin{scope}[transparency group=knockout]
+ \fill [white] (-1.9,-.9) rectangle (1.9,.9);
+ \node [opacity=0,font=\fontencoding{T1}\fontfamily{ptm}\fontsize{45}{45}\bfseries]
+ {Ti\emph{k}Z};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ %
+ In the example, we first draw a large shading and then, inside the
+ transparency group ``overwrite'' most of this shading by a big
+ white rectangle. The interesting part is the text of the node,
+ which has opacity |0|. Normally, this would mean that nothing is
+ shown. However, in a knockout group, we ``paint'' the text with an
+ ``opacity zero'' color. The effect is that part of the totally
+ opaque white rectangle gets overwritten by a perfectly transparent
+ area (namely exactly the area taken up by the pixels of the text).
+ When this whole knockout group is then placed on top of the
+ shading, the shading will ``shine through'' at the knocked-out
+ pixels.
+
+ \item \declare{|isolated|}|=false| A group can be isolated or not. By
+ default, they are isolated, since this is typically what you want.
+ For details on what isolated groups are, exactly, see Section~7.3.4
+ of the \textsc{pdf} Specification, version~1.7.
+ \end{itemize}
+
+ Note that when a transparency group is created, \tikzname\ must correctly
+ determine the size of the material inside the group. Usually, this is no
+ problem, but when you use things like |overlay| or |transform canvas|,
+ trouble may result. In this case, please consult
+ Section~\ref{section-transparency} on how to sidestep this problem in such
+ cases.
+\end{key}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-trees.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-trees.tex
new file mode 100644
index 0000000000..91d2030c38
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tikz-trees.tex
@@ -0,0 +1,868 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Making Trees Grow}
+\label{section-trees}
+
+\subsection{Introduction to the Child Operation}
+
+\emph{Trees} are a common way of visualizing hierarchical structures. A simple
+tree looks like this:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Admittedly, in reality trees are more likely to grow \emph{upward} and not
+downward as above. You can tell whether the author of a paper is a
+mathematician or a computer scientist by looking at the direction their trees
+grow. A computer scientist's trees will grow downward while a mathematician's
+tree will grow upward. Naturally, the \emph{correct} way is the mathematician's
+way, which can be specified as follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root} [grow'=up]
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+In \tikzname, there are two ways of specifying trees: Using either the |graph|
+path operation, which is covered in Section~\ref{section-library-graphs}, or
+using the |child| path operation, which is covered in the present section. Both
+methods have their advantages.
+
+In \tikzname, trees are specified by adding \emph{children} to a node on a path
+using the |child| operation:
+
+\begin{pathoperation}{child}{\opt{\oarg{options}}%
+ \opt{|foreach|\meta{variables}|in|\marg{values}}\opt{\marg{child path}}}
+ This operation should directly follow a completed |node| operation or
+ another |child| operation, although it is permissible that the first
+ |child| operation is preceded by options (we will come to that).
+
+ When a |node| operation like |node {X}| is followed by |child|, \tikzname\
+ starts counting the number of child nodes that follow the original
+ |node {X}|. For this, it scans the input and stores away each |child| and
+ its arguments until it reaches a path operation that is not a |child|. Note
+ that this will fix the character codes of all text inside the child
+ arguments, which means, in essence, that you cannot use verbatim text
+ inside the nodes inside a |child|. Sorry.
+
+ Once the children have been collected and counted, \tikzname\ starts
+ generating the child nodes. For each child of a parent node \tikzname\
+ computes an appropriate position where the child is placed. For each child,
+ the coordinate system is transformed so that the origin is at this
+ position. Then the \meta{child path} is drawn. Typically, the child path
+ just consists of a |node| specification, which results in a node being
+ drawn at the child's position. Finally, an edge is drawn from the first
+ node in the \meta{child path} to the parent node.
+
+ The optional |foreach| part (note that there is no backslash before
+ |foreach|) allows you to specify multiple children in a single |child|
+ command. The idea is the following: A |\foreach| statement is (internally)
+ used to iterate over the list of \meta{values}. For each value in this
+ list, a new |child| is added to the node. The syntax for \meta{variables}
+ and for \meta{values} is the same as for the |\foreach| statement, see
+ Section~\ref{section-foreach}. For example, when you say
+ %
+\begin{codeexample}[code only]
+node {root} child [red] foreach \name in {1,2} {node {\name}}
+\end{codeexample}
+ %
+ the effect will be the same as if you had said
+ %
+\begin{codeexample}[code only]
+node {root} child[red] {node {1}} child[red] {node {2}}
+\end{codeexample}
+ %
+ When you write
+ %
+\begin{codeexample}[code only]
+node {root} child[\pos] foreach \name/\pos in {1/left,2/right} {node[\pos] {\name}}
+\end{codeexample}
+ %
+ the effect will be the same as for
+ %
+\begin{codeexample}[code only]
+node {root} child[left] {node[left] {1}} child[right] {node[right] {2}}
+\end{codeexample}
+
+ You can nest things as in the following example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [level distance=4mm,level/.style={sibling distance=8mm/#1}]
+ \coordinate
+ child foreach \x in {0,1}
+ {child foreach \y in {0,1}
+ {child foreach \z in {0,1}}};
+\end{tikzpicture}
+\end{codeexample}
+
+ The details and options for this operation are described in the rest of
+ this present section.
+\end{pathoperation}
+
+
+\subsection{Child Paths and Child Nodes}
+
+For each |child| of a root node, its \meta{child path} is inserted at a
+specific location in the picture (the placement rules are discussed in
+Section~\ref{section-tree-placement}). The first node in the \meta{child path},
+if it exists, is special and called the \emph{child node}. If there is no first
+node in the \meta{child path}, that is, if the \meta{child path} is missing
+(including the curly braces) or if it does not start with |node| or with
+|coordinate|, then an empty child node of shape |coordinate| is automatically
+added.
+
+Consider the example |\node {x} child {node {y}} child;|. For the first child,
+the \meta{child path} has the child node |node {y}|. For the second child, no
+child node is specified and, thus, it is just |coordinate|.
+
+As for any normal node, you can give the child node a name, shift it around, or
+use options to influence how it is rendered.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[sibling distance=15mm]
+ \node[rectangle,draw] {root}
+ child {node[circle,draw,yshift=-5mm] (left node) {left}}
+ child {node[ellipse,draw] (right node) {right}};
+ \draw[dashed,->] (left node) -- (right node);
+\end{tikzpicture}
+\end{codeexample}
+
+In many cases, the \meta{child path} will just consist of a specification of a
+child node and, possibly, children of this child node. However, the node
+specification may be followed by arbitrary other material that will be added to
+the picture, transformed to the child's coordinate system. For your
+convenience, a move-to |(0,0)| operation is inserted automatically at the
+beginning of the path. Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ child {[fill] circle (2pt)}
+ child {[fill] circle (2pt)};
+\end{tikzpicture}
+\end{codeexample}
+
+At the end of the \meta{child path} you may add a special path operation called
+|edge from parent|. If this operation is not given by yourself somewhere on the
+path, it will be automatically added at the end. This option causes a
+connecting edge from the parent node to the child node to be added to the path.
+By giving options to this operation you can influence how the edge is rendered.
+Also, nodes following the |edge from parent| operation will be placed on this
+edge, see Section~\ref{section-edge-from-parent} for details.
+
+To sum up:
+%
+\begin{enumerate}
+ \item The child path starts with a node specification. If it is not there,
+ it is added automatically.
+ \item The child path ends with a |edge from parent| operation, possibly
+ followed by nodes to be put on this edge. If the operation is not given
+ at the end, it is added automatically.
+\end{enumerate}
+
+
+\subsection{Naming Child Nodes}
+
+Child nodes can be named like any other node using either the |name| option or
+the special syntax in which the name of the node is placed in round parentheses
+between the |node| operation and the node's text.
+
+If you do not assign a name to a child node, \tikzname\ will automatically
+assign a name as follows: Assume that the name of the parent node is, say,
+|parent|. (If you did not assign a name to the parent, \tikzname\ will do so
+itself, but that name will not be user-accessible.) The first child of |parent|
+will be named |parent-1|, the second child is named |parent-2|, and so on.
+
+This naming convention works recursively. If the second child |parent-2| has
+children, then the first of these children will be called |parent-2-1| and the
+second |parent-2-2| and so on.
+
+If you assign a name to a child node yourself, no name is generated
+automatically (the node does not have two names). However, ``counting
+continues'', which means that the third child of |parent| is called |parent-3|
+independently of whether you have assigned names to the first and/or second
+child of |parent|.
+
+Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[sibling distance=15mm]
+ \node (root) {root}
+ child
+ child {
+ child {coordinate (special)}
+ child
+ };
+ \node at (root-1) {root-1};
+ \node at (root-2) {root-2};
+ \node at (special) {special};
+ \node at (root-2-2) {root-2-2};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Specifying Options for Trees and Children}
+\label{section-tree-options}
+
+Each |child| may have its own \meta{options}, which apply to ``the whole
+child'', including all of its grandchildren. Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [thick,level 1/.style={sibling distance=15mm},
+ level 2/.style={sibling distance=10mm}]
+ \coordinate
+ child[red] {child child}
+ child[green] {child child[blue]};
+\end{tikzpicture}
+\end{codeexample}
+
+The options of the root node have no effect on the children since the options
+of a node are always ``local'' to that node. Because of this, the edges in the
+following tree are black, not red.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[thick]
+ \node [red] {root}
+ child
+ child;
+\end{tikzpicture}
+\end{codeexample}
+%
+This raises the problem of how to set options for \emph{all} children.
+Naturally, you could always set options for the whole path as in
+|\path [red] node {root} child child;| but this is bothersome in some
+situations. Instead, it is easier to give the options \emph{before the first
+child} as follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[thick]
+ \node [red] {root}
+ [green] % option applies to all children
+ child
+ child;
+\end{tikzpicture}
+\end{codeexample}
+
+Here is the set of rules:
+%
+\begin{enumerate}
+ \item Options for the whole tree are given before the root node.
+ \item Options for the root node are given directly to the |node| operation
+ of the root.
+ \item Options for all children can be given between the root node and the
+ first child.
+ \item Options applying to a specific child path are given as options to the
+ |child| operation.
+ \item Options applying to the node of a child, but not to the whole child
+ path, are given as options to the |node| command inside the \meta{child
+ path}.
+\end{enumerate}
+%
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ \scoped
+ [...] % Options apply to the whole tree
+ \node[...] {root} % Options apply to the root node only
+ [...] % Options apply to all children
+ child[...] % Options apply to this child and all its children
+ {
+ node[...] {} % Options apply to the child node only
+ ...
+ }
+ child[...] % Options apply to this child and all its children
+ ;
+\end{tikzpicture}
+\end{codeexample}
+
+There are additional styles that influence how children are rendered:
+%
+\begin{stylekey}{/tikz/every child (initially \normalfont empty)}
+ This style is used at the beginning of each child, as if you had given the
+ style's contents as options to the |child| operation.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/every child node (initially \normalfont empty)}
+ This style is used at the beginning of each child node in addition to the
+ |every node| style.
+\end{stylekey}
+
+\begin{stylekey}{/tikz/level=\meta{number} (initially \normalfont empty)}
+ This style is executed at the beginning of each set of children, where
+ \meta{number} is the current level in the current tree. For example, when
+ you say |\node {x} child child;|, then |level=1| is used before the first
+ |child|. The style or code of this key will be passed \meta{number} as its
+ first parameter. If this first |child| has children itself, then |level=2|
+ would be used for them.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[level/.style={sibling distance=20mm/#1}]
+ \node {root}
+ child { child child }
+ child { child child child };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+\begin{stylekey}{/tikz/level \meta{number} (initially \normalfont empty)}
+ This style is used in addition to the |level| style. So, when you say
+ |\node {x} child child;|, then the following key list is executed:
+ |level=1,level 1|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [level 1/.style={sibling distance=20mm},
+ level 2/.style={sibling distance=5mm}]
+ \node {root}
+ child { child child }
+ child { child child child };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{stylekey}
+
+
+\subsection{Placing Child Nodes}
+\label{section-tree-placement}
+
+\subsubsection{Basic Idea}
+
+Perhaps the most difficult part in drawing a tree is the correct layout of the
+children. Typically, the children have different sizes and it is not easy to
+arrange them in such a manner that not too much space is wasted, the children
+do not overlap, and they are either evenly spaced or their centers are evenly
+distributed. Calculating good positions is especially difficult since a good
+position for the first child may depend on the size of the last child.
+
+In basic \tikzname, when you do not make use of the graph drawing facilities
+explained in Part~\ref{part-gd}, a comparatively simple approach is taken to
+placing the children. In order to compute a child's position, all that is taken
+into account is the number of the current child in the list of children and the
+number of children in this list. Thus, if a node has five children, then there
+is a fixed position for the first child, a position for the second child, and
+so on. These positions \emph{do not depend on the size of the children} and,
+hence, children can easily overlap. However, since you can use options to shift
+individual children a bit, this is not as great a problem as it may seem.
+
+Although the placement of the children only depends on their number in the list
+of children and the total number of children, everything else about the
+placement is highly configurable. You can change the distance between children
+(appropriately called the |sibling distance|) and the distance between levels
+of the tree. These distances may change from level to level. The direction in
+which the tree grows can be changed globally and for parts of the tree. You can
+even specify your own ``growth function'' to arrange children on a circle or
+along special lines or curves.
+
+
+\subsubsection{Default Growth Function}
+
+The default growth function works as follows: Assume that we are given a node
+and five children. These children will be placed on a line with their centers
+(or, more generally, with their anchors) spaced apart by the current
+|sibling distance|. The line is orthogonal to the current \emph{direction of
+growth}, which is set with the |grow| and |grow'| option (the latter option
+reverses the ordering of the children). The distance from the line to the
+parent node is given by the |level distance|.
+%
+{\catcode`\|=12
+\begin{codeexample}[]
+\begin{tikzpicture}[sibling distance=15mm, level distance=15mm]
+ \path [help lines]
+ node (root) {root}
+ [grow=-10]
+ child {node {1}}
+ child {node {2}}
+ child {node {3}}
+ child {node {4}};
+
+ \draw[|<->|,thick] (root-1.center)
+ -- node[above,sloped] {sibling distance} (root-2.center);
+
+ \draw[|<->|,thick] (root.center)
+ -- node[above,sloped] {level distance} +(-10:\tikzleveldistance);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+\begin{key}{/tikz/level distance=\meta{distance} (initially 15mm)}
+ This key determines the distance between different levels of the tree, more
+ precisely, between the parent and the line on which its children are
+ arranged. When given to a single child, this will set the distance for this
+ child only.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ [level distance=20mm]
+ child
+ child {
+ [level distance=5mm]
+ child
+ child
+ child
+ }
+ child[level distance=10mm];
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [level 1/.style={level distance=10mm},
+ level 2/.style={level distance=5mm}]
+ \node {root}
+ child
+ child {
+ child
+ child[level distance=10mm]
+ child
+ }
+ child;
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/sibling distance=\meta{distance} (initially 15mm)}
+ This key specifies the distance between the anchors of the children of a
+ parent node.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [level distance=4mm,
+ level 1/.style={sibling distance=8mm},
+ level 2/.style={sibling distance=4mm},
+ level 3/.style={sibling distance=2mm}]
+ \coordinate
+ child {
+ child {child child}
+ child {child child}
+ }
+ child {
+ child {child child}
+ child {child child}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [level distance=10mm,
+ every node/.style={fill=red!60,circle,inner sep=1pt},
+ level 1/.style={sibling distance=20mm,nodes={fill=red!45}},
+ level 2/.style={sibling distance=10mm,nodes={fill=red!30}},
+ level 3/.style={sibling distance=5mm,nodes={fill=red!25}}]
+ \node {31}
+ child {node {30}
+ child {node {20}
+ child {node {5}}
+ child {node {4}}
+ }
+ child {node {10}
+ child {node {9}}
+ child {node {1}}
+ }
+ }
+ child {node {20}
+ child {node {19}
+ child {node {1}}
+ child[missing]
+ }
+ child {node {18}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/grow=\meta{direction}}
+ This key is used to define the \meta{direction} in which the tree will
+ grow. The \meta{direction} can either be an angle in degrees or one of the
+ following special text strings: |down|, |up|, |left|, |right|, |north|,
+ |south|, |east|, |west|, |north east|, |north west|, |south east|, and
+ |south west|. All of these have ``their obvious meaning'', so, say,
+ |south west| is the same as the angle $-135^\circ$.
+
+ As a side effect, this option installs the default growth function.
+
+ In addition to setting the direction, this option also has a seemingly
+ strange effect: It sets the sibling distance for the current level to
+ |0pt|, but leaves the sibling distance for later levels unchanged.
+
+ This somewhat strange behaviour has a highly desirable effect: If you give
+ this option before the list of children of a node starts, the ``current
+ level'' is still the parent level. Each child will be on a later level and,
+ hence, the sibling distance will be as specified originally. This will
+ cause the children to be neatly aligned in a line orthogonal to the given
+ \meta{direction}. However, if you give this option locally to a single
+ child, then ``current level'' will be the same as the child's level. The
+ zero sibling distance will then cause the child to be placed exactly at a
+ point at distance |level distance| in the direction \meta{direction}.
+ However, the children of the child will be placed ``normally'' on a line
+ orthogonal to the \meta{direction}.
+
+ These placement effects are best demonstrated by some examples:
+ %
+\begin{codeexample}[]
+\tikz \node {root} [grow=right] child child;
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \node {root} [grow=south west] child child;
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=10mm,sibling distance=5mm]
+ \node {root}
+ [grow=down]
+ child
+ child
+ child[grow=right] {
+ child child child
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=2em]
+ \node {C}
+ child[grow=up] {node {H}}
+ child[grow=left] {node {H}}
+ child[grow=down] {node {H}}
+ child[grow=right] {node {C}
+ child[grow=up] {node {H}}
+ child[grow=right] {node {H}}
+ child[grow=down] {node {H}}
+ edge from parent[double]
+ coordinate (wrong)
+ };
+ \draw[<-,red] ([yshift=-2mm]wrong) -- +(0,-1)
+ node[below]{This is wrong!};
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[rectangle,draw] (a) at (0,0) {start node};
+ \node[rectangle,draw] (b) at (2,1) {end};
+
+ \draw (a) -- (b)
+ node[coordinate,midway] {}
+ child[grow=100,<-] {node[above] {the middle is here}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/grow'=\meta{direction}}
+ This key has the same effect as |grow|, only the children are arranged in
+ the opposite order.
+\end{key}
+
+
+\subsubsection{Missing Children}
+
+Sometimes one or more of the children of a node are ``missing''. Such a missing
+child will count as a child with respect to the total number of children and
+also with respect to the current child count, but it will not be rendered.
+
+\begin{key}{/tikz/missing=\meta{true or false} (default true)}
+ If this option is given to a child, the current child counter is increased,
+ but the child is otherwise ignored. In particular, the normal contents of
+ the child is completely ignored.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=10mm,sibling distance=5mm]
+ \node {root} [grow=down]
+ child { node {1} }
+ child { node {2} }
+ child { node {3} }
+ child[missing] { node {4} }
+ child { node {5} }
+ child { node {6} };
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+
+\subsubsection{Custom Growth Functions}
+
+\begin{key}{/tikz/growth parent anchor=\meta{anchor} (initially center)}
+ This key allows you to specify which anchor of the parent node is to be
+ used for computing the children's position. For example, when there is only
+ one child and the |level distance| is |2cm|, then the child node will be
+ placed two centimeters below the \meta{anchor} of the parent node. ``Being
+ placed'' means that the child node's anchor (which is the anchor specified
+ using the |anchor=| option in the |node| command of the child) is two
+ centimeters below the parent node's \meta{anchor}.
+
+ In the following example, the two red lines both have length |1cm|.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=1cm]
+ \node [rectangle,draw] (a) at (0,0) {root}
+ [growth parent anchor=south] child;
+
+ \node [rectangle,draw] (b) at (2,0) {root}
+ [growth parent anchor=north east] child;
+
+ \draw [red,thick,dashed] (a.south) -- (a-1);
+ \draw [red,thick,dashed] (b.north east) -- (b-1);
+\end{tikzpicture}
+\end{codeexample}
+
+ In the next example, the top and bottom nodes are aligned at the top and
+ the bottom, respectively.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [level distance=2cm,growth parent anchor=north,
+ every node/.style={anchor=north,rectangle,draw}
+ every child node/.style={anchor=south}]
+
+ \node at (0,0) {root} child {node {small}};
+
+ \node at (2,0) {big root} child {node {\large big}};
+\end{tikzpicture}
+\end{codeexample}
+ %
+\end{key}
+
+\begin{key}{/tikz/growth function=\meta{macro name} (initially \normalfont an internal function)}
+ This rather low-level option allows you to set a new growth function. The
+ \meta{macro name} must be the name of a macro without parameters. This
+ macro will be called for each child of a node. The initial function is an
+ internal function that corresponds to downward growth.
+
+ The effect of executing the macro should be the following: It should
+ transform the coordinate system in such a way that the origin becomes the
+ place where the current child should be anchored. When the macro is called,
+ the current coordinate system will be set up such that the anchor of the
+ parent node is in the origin. Thus, in each call, the \meta{macro name}
+ must essentially do a shift to the child's origin. When the macro is
+ called, the \TeX\ counter |\tikznumberofchildren| will be set to the total
+ number of children of the parent node and the counter
+ |\tikznumberofcurrentchild| will be set to the number of the current child.
+
+ The macro may, in addition to shifting the coordinate system, also
+ transform the coordinate system further. For example, it could be rotated
+ or scaled.
+
+ Additional growth functions are defined in the library, see
+ Section~\ref{section-tree-library}.
+\end{key}
+
+
+\subsection{Edges From the Parent Node}
+\label{section-edge-from-parent}
+
+Every child node is connected to its parent node via a special kind of edge
+called the |edge from parent|. This edge is added to the \meta{child path} when
+the following path operation is encountered:
+
+\begin{pathoperation}{edge from parent}{\opt{\oarg{options}}}
+ This path operation can only be used inside \meta{child paths} and should
+ be given at the end, possibly followed by \meta{node specifications} like
+ |node {a}|. If a \meta{child path} does not contain this operation, it will
+ be added at the end of the \meta{child path} automatically.
+
+ By default, this operation does the following:
+ %
+ \begin{enumerate}
+ \item The following style is executed:
+ %
+ \begin{stylekey}{/tikz/edge from parent (initially draw)}
+ This style is inserted right before the |edge from parent path|
+ and before the \meta{options} are inserted.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [edge from parent/.style={draw,red,thick}]
+ \node {root}
+ child {node {left} edge from parent[dashed]}
+ child {node {right}
+ child {node {child}}
+ child {node {child} edge from parent[draw=none]}
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{stylekey}
+ \item Next, the \meta{options} are executed.
+ \item Next, the text stored in the following key is inserted:
+ %
+ \begin{key}{/tikz/edge from parent path=\meta{path} (initially \normalfont code shown below)}
+ This option allows you to set the |edge from parent path| to a
+ new path. Initially, this path is the following:
+ %
+\begin{codeexample}[code only]
+(\tikzparentnode\tikzparentanchor) -- (\tikzchildnode\tikzchildanchor)
+\end{codeexample}
+ %
+ The |\tikzparentnode| is a macro that will expand to the name
+ of the parent node. This works even when you have not assigned
+ a name to the parent node, in this case an internal name is
+ automatically generated. The |\tikzchildnode| is a macro that
+ expands to the name of the child node. The two |...anchor|
+ macros are empty by default. So, what is essentially inserted
+ is just the path segment
+ |(\tikzparentnode) -- (\tikzchildnode)|; which is exactly an
+ edge from the parent to the child.
+
+ You can modify this edge from parent path to achieve all sorts
+ of effects. For example, we could replace the straight line by
+ a curve as follows:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}[level distance=15mm, sibling distance=15mm,
+ edge from parent path=
+ {(\tikzparentnode.south) .. controls +(0,-1) and +(0,1)
+ .. (\tikzchildnode.north)}]
+ \node {root}
+ child {node {left}}
+ child {node {right}
+ child {node {child}}
+ child {node {child}}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ Further useful |edge from parent path|s are defined in the tree
+ library, see Section~\ref{section-tree-library}.
+
+ The nodes in a \meta{node specification} following the
+ |edge from parent| path command get executed as if the |pos|
+ option had been added to all these nodes, see also
+ Section~\ref{section-pos-option}.
+
+ As an example, consider the following code:
+ %
+\begin{codeexample}[code only]
+\node (root) {} child {node (child) {} edge to parent node {label}};
+\end{codeexample}
+ %
+ The |edge to parent| operation and the following |node|
+ operation will, together, have the same effect as if we had
+ said:
+ %
+\begin{codeexample}[code only]
+(root) -- (child) node [pos=0.5] {label}
+\end{codeexample}
+
+ Here is a more complicated example:
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ child {
+ node {left}
+ edge from parent
+ node[left] {a}
+ node[right] {b}
+ }
+ child {
+ node {right}
+ child {
+ node {child}
+ edge from parent
+ node[left] {c}
+ }
+ child {node {child}}
+ edge from parent
+ node[near end] {x}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+ As said before, the anchors in the default
+ |edge from parent path| are empty. However, you can set them
+ using the following keys:
+ %
+ \begin{key}{/tikz/child anchor=\meta{anchor} (initially border)}
+ Specifies the anchor where the edge from parent meets the
+ child node by setting the macro |\tikzchildanchor| to
+ |.|\meta{anchor}.
+
+ If you specify |border| as the \meta{anchor}, then the
+ macro |\tikzchildanchor| is set to the empty string. The
+ effect of this is that the edge from the parent will meet
+ the child on the border at an automatically calculated
+ position.
+ %
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node {root}
+ [child anchor=north]
+ child {node {left} edge from parent[dashed]}
+ child {node {right}
+ child {node {child}}
+ child {node {child} edge from parent[draw=none]}
+ };
+\end{tikzpicture}
+\end{codeexample}
+ \end{key}
+
+ \begin{key}{/tikz/parent anchor=\meta{anchor} (initially border)}
+ This option works the same way as the |child anchor|, only
+ for the parent.
+ \end{key}
+ \end{key}
+ \end{enumerate}
+
+ All of the above describes the standard functioning of the
+ |edge from parent| command. You may, however, sometimes need even more
+ fine-grained control (the graph drawing engine needs it, for instance). In
+ such cases the following key gives you complete control:
+ %
+ \begin{key}{/tikz/edge from parent macro=\meta{macro}}
+ The \meta{macro} gets expanded each time the |edge from parent| path
+ operation is used. This \meta{macro} must take two parameters and must
+ expand to some text that is subsequently parsed by the parser. The
+ first parameter will be the set of \meta{options} that where passed to
+ the |edge from parent| command, the second parameter will be the
+ \meta{node specifications} that following the command.
+
+ The standard behaviour of drawing a straight line from the parent node
+ to the child node could be achieved by setting the \meta{macro} to the
+ following:
+ %
+\begin{codeexample}[code only]
+\def\mymacro#1#2{
+ [style=edge from parent, #1]
+ (\tikzparentnode\tikzparentanchor) -- #2 (\tikzchildnode\tikzchildanchor)
+}
+\end{codeexample}
+ %
+ Note that |#2| is placed between |--| and the node to ensure that nodes
+ are put ``on top'' of the line.
+ \end{key}
+\end{pathoperation}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "pgfmanual-pdftex-version"
+%%% End:
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-Euclid.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-Euclid.tex
new file mode 100644
index 0000000000..ace6c5d882
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-Euclid.tex
@@ -0,0 +1,686 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tutorial: Euclid's Amber Version of the \emph{Elements}}
+
+In this third tutorial we have a look at how \tikzname\ can be used to draw
+geometric constructions.
+
+Euclid is currently quite busy writing his new book series, whose working title
+is ``Elements'' (Euclid is not quite sure whether this title will convey the
+message of the series to future generations correctly, but he intends to change
+the title before it goes to the publisher). Up to know, he wrote down his text
+and graphics on papyrus, but his publisher suddenly insists that he must submit
+in electronic form. Euclid tries to argue with the publisher that electronics
+will only be discovered thousands of years later, but the publisher informs him
+that the use of papyrus is no longer cutting edge technology and Euclid will
+just have to keep up with modern tools.
+
+Slightly disgruntled, Euclid starts converting his papyrus entitled ``Book I,
+Proposition I'' to an amber version.
+
+
+\subsection{Book I, Proposition I}
+
+The drawing on his papyrus looks like this:\footnote{The text is taken from the
+wonderful interactive version of Euclid's Elements by David E. Joyce, to be
+found on his website at Clark University.}
+
+\bigskip
+\noindent
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \def\A{\textcolor{input}{$A$}}
+ \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{output}{$C$}}
+ \def\D{$D$}
+ \def\E{$E$}
+
+ \colorlet{input}{blue!80!black}
+ \colorlet{output}{red!70!black}
+ \colorlet{triangle}{orange}
+
+ \coordinate [label=left:\A]
+ (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B]
+ (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
+
+ \draw [input] (A) -- (B);
+
+ \node [name path=D,help lines,draw,label=left:\D] (D) at (A) [circle through=(B)] {};
+ \node [name path=E,help lines,draw,label=right:\E] (E) at (B) [circle through=(A)] {};
+
+ \path [name intersections={of=D and E,by={[label=above:\C]C}}];
+
+ \draw [output] (A) -- (C);
+ \draw [output] (B) -- (C);
+
+ \foreach \point in {A,B,C}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ \begin{pgfonlayer}{background}
+ \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
+ \end{pgfonlayer}
+
+ \node [below right,text width=10cm,align=justify] at (4,3)
+ {
+ \small
+ \textbf{Proposition I}\par
+ \emph{To construct an \textcolor{triangle}{equilateral triangle}
+ on a given \textcolor{input}{finite straight line}.}
+ \par
+ \vskip1em
+ Let \A\B\ be the given \textcolor{input}{finite straight line}. It
+ is required to construct an \textcolor{triangle}{equilateral
+ triangle} on the \textcolor{input}{straight line}~\A\B.
+
+ Describe the circle \B\C\D\ with center~\A\ and radius \A\B. Again
+ describe the circle \A\C\E\ with center~\B\ and radius \B\A. Join the
+ \textcolor{output}{straight lines} \C\A\ and \C\B\ from the
+ point~\C\ at which the circles cut one another to the points~\A\ and~\B.
+
+ Now, since the point~\A\ is the center of the circle \C\D\B,
+ therefore \A\C\ equals \A\B. Again, since the point \B\ is the
+ center of the circle \C\A\E, therefore \B\C\ equals \B\A. But
+ \A\C\ was proved equal to \A\B, therefore each of the straight
+ lines \A\C\ and \B\C\ equals \A\B. And
+ things which equal the same thing also equal one another,
+ therefore \A\C\ also equals \B\C. Therefore the three straight
+ lines \A\C, \A\B, and \B\C\ equal one another.
+ Therefore the \textcolor{triangle}{triangle} \A\B\C\ is
+ equilateral, and it has been constructed on the given finite
+ \textcolor{input}{straight line}~\A\B.
+ };
+\end{tikzpicture}
+\bigskip
+
+Let us have a look at how Euclid can turn this into \tikzname\ code.
+
+
+\subsubsection{Setting up the Environment}
+
+As in the previous tutorials, Euclid needs to load \tikzname, together with
+some libraries. These libraries are |calc|, |intersections|, |through|, and
+|backgrounds|. Depending on which format he uses, Euclid would use one of the
+following in the preamble:
+%
+\begin{codeexample}[code only]
+% For LaTeX:
+\usepackage{tikz}
+\usetikzlibrary{calc,intersections,through,backgrounds}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+% For plain TeX:
+\input tikz.tex
+\usetikzlibrary{calc,intersections,through,backgrounds}
+\end{codeexample}
+
+\begin{codeexample}[code only]
+% For ConTeXt:
+\usemodule[tikz]
+\usetikzlibrary[calc,intersections,through,backgrounds]
+\end{codeexample}
+
+
+\subsubsection{The Line \emph{AB}}
+
+The first part of the picture that Euclid wishes to draw is the line $AB$. That
+is easy enough, something like |\draw (0,0) -- (2,1);| might do. However,
+Euclid does not wish to reference the two points $A$ and $B$ as $(0,0)$ and
+$(2,1)$ subsequently. Rather, he wishes to just write |A| and |B|. Indeed, the
+whole point of his book is that the points $A$ and $B$ can be arbitrary and all
+other points (like $C$) are constructed in terms of their positions. It would
+not do if Euclid were to write down the coordinates of $C$ explicitly.
+
+So, Euclid starts with defining two coordinates using the |\coordinate|
+command:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate (A) at (0,0);
+ \coordinate (B) at (1.25,0.25);
+
+ \draw[blue] (A) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+That was easy enough. What is missing at this point are the labels for the
+coordinates. Euclid does not want them \emph{on} the points, but next to them.
+He decides to use the |label| option:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:\textcolor{blue}{$A$}] (A) at (0,0);
+ \coordinate [label=right:\textcolor{blue}{$B$}] (B) at (1.25,0.25);
+
+ \draw[blue] (A) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+At this point, Euclid decides that it would be even nicer if the points $A$ and
+$B$ were in some sense ``random''. Then, neither Euclid nor the reader can make
+the mistake of taking ``anything for granted'' concerning these position of
+these points. Euclid is pleased to learn that there is a |rand| function in
+\tikzname\ that does exactly what he needs: It produces a number between $-1$
+and $1$. Since \tikzname\ can do a bit of math, Euclid can change the
+coordinates of the points as follows:
+%
+\begin{codeexample}[code only]
+\coordinate [...] (A) at (0+0.1*rand,0+0.1*rand);
+\coordinate [...] (B) at (1.25+0.1*rand,0.25+0.1*rand);
+\end{codeexample}
+
+This works fine. However, Euclid is not quite satisfied since he would prefer
+that the ``main coordinates'' $(0,0)$ and $(1.25,0.25)$ are ``kept separate''
+from the perturbation $0.1(\mathit{rand},\mathit{rand})$. This means, he would
+like to specify that coordinate $A$ as ``the point that is at $(0,0)$ plus one
+tenth of the vector $(\mathit{rand},\mathit{rand})$''.
+
+It turns out that the |calc| library allows him to do exactly this kind of
+computation. When this library is loaded, you can use special coordinates that
+start with |($| and end with |$)| rather than just |(| and~|)|. Inside these
+special coordinates you can give a linear combination of coordinates. (Note
+that the dollar signs are only intended to signal that a ``computation'' is
+going on; no mathematical typesetting is done.)
+
+The new code for the coordinates is the following:
+%
+\begin{codeexample}[code only]
+\coordinate [...] (A) at ($ (0,0) + .1*(rand,rand) $);
+\coordinate [...] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
+\end{codeexample}
+
+Note that if a coordinate in such a computation has a factor (like |.1|), you
+must place a |*| directly before the opening parenthesis of the coordinate. You
+can nest such computations.
+
+
+\subsubsection{The Circle Around \emph{A}}
+
+The first tricky construction is the circle around~$A$. We will see later how
+to do this in a very simple manner, but first let us do it the ``hard'' way.
+
+The idea is the following: We draw a circle around the point $A$ whose radius
+is given by the length of the line $AB$. The difficulty lies in computing the
+length of this line.
+
+Two ideas ``nearly'' solve this problem: First, we can write |($ (A) - (B) $)|
+for the vector that is the difference between $A$ and~$B$. All we need is the
+length of this vector. Second, given two numbers $x$ and $y$, one can write
+|veclen(|$x$|,|$y$|)| inside a mathematical expression. This gives the value
+$\sqrt{x^2+y^2}$, which is exactly the desired length.
+
+The only remaining problem is to access the $x$- and $y$-coordinate of the
+vector~$AB$. For this, we need a new concept: the \emph{let operation}. A let
+operation can be given anywhere on a path where a normal path operation like a
+line-to or a move-to is expected. The effect of a let operation is to evaluate
+some coordinates and to assign the results to special macros. These macros make
+it easy to access the $x$- and $y$-coordinates of the coordinates.
+
+Euclid would write the following:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \draw (A) let
+ \p1 = ($ (B) - (A) $)
+ in
+ circle ({veclen(\x1,\y1)});
+\end{tikzpicture}
+\end{codeexample}
+
+Each assignment in a let operation starts with |\p|, usually followed by a
+\meta{digit}. Then comes an equal sign and a coordinate. The coordinate is
+evaluated and the result is stored internally. From then on you can use the
+following expressions:
+%
+\begin{enumerate}
+ \item |\x|\meta{digit} yields the $x$-coordinate of the resulting point.
+ \item |\y|\meta{digit} yields the $y$-coordinate of the resulting point.
+ \item |\p|\meta{digit} yields the same as
+ |\x|\meta{digit}|,\y|\meta{digit}.
+\end{enumerate}
+%
+You can have multiple assignments in a let operation, just separate them with
+commas. In later assignments you can already use the results of earlier
+assignments.
+
+Note that |\p1| is not a coordinate in the usual sense. Rather, it just expands
+to a string like |10pt,20pt|. So, you cannot write, for instance,
+|(\p1.center)| since this would just expand to |(10pt,20pt.center)|, which
+makes no sense.
+
+Next, we want to draw both circles at the same time. Each time the radius is
+|veclen(\x1,\y1)|. It seems natural to compute this radius only once. For this,
+we can also use a let operation: Instead of writing |\p1 = ...|, we write
+|\n2 = ...|. Here, ``n'' stands for ``number'' (while ``p'' stands for
+``point''). The assignment of a number should be followed by a number in curly
+braces.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \draw let \p1 = ($ (B) - (A) $),
+ \n2 = {veclen(\x1,\y1)}
+ in
+ (A) circle (\n2)
+ (B) circle (\n2);
+\end{tikzpicture}
+\end{codeexample}
+%
+In the above example, you may wonder, what |\n1| would yield? The answer is
+that it would be undefined -- the |\p|, |\x|, and |\y| macros refer to the same
+logical point, while the |\n| macro has ``its own namespace''. We could even
+have replaced |\n2| in the example by |\n1| and it would still work. Indeed,
+the digits following these macros are just normal \TeX\ parameters. We could
+also use a longer name, but then we have to use curly braces:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \draw let \p1 = ($ (B) - (A) $),
+ \n{radius} = {veclen(\x1,\y1)}
+ in
+ (A) circle (\n{radius})
+ (B) circle (\n{radius});
+\end{tikzpicture}
+\end{codeexample}
+
+At the beginning of this section it was promised that there is an easier way to
+create the desired circle. The trick is to use the |through| library. As the
+name suggests, it contains code for creating shapes that go through a given
+point.
+
+The option that we are looking for is |circle through|. This option is given to
+a \emph{node} and has the following effects: First, it causes the node's inner
+and outer separations to be set to zero. Then it sets the shape of the node to
+|circle|. Finally, it sets the radius of the node such that it goes through the
+parameter given to |circle through|. This radius is computed in essentially the
+same way as above.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \node [draw,circle through=(B),label=left:$D$] at (A) {};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Intersection of the Circles}
+
+Euclid can now draw the line and the circles. The final problem is to compute
+the intersection of the two circles. This computation is a bit involved if you
+want to do it ``by hand''. Fortunately, the intersection library allows us to
+compute the intersection of arbitrary paths.
+
+The idea is simple: First, you ``name'' two paths using the |name path| option.
+Then, at some later point, you can use the option |name intersections|, which
+creates coordinates called |intersection-1|, |intersection-2|, and so on at all
+intersections of the paths. Euclid assigns the names |D| and |E| to the paths
+of the two circles (which happen to be the same names as the nodes themselves,
+but nodes and their paths live in different ``namespaces'').
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+
+ \node (D) [name path=D,draw,circle through=(B),label=left:$D$] at (A) {};
+ \node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};
+
+ % Name the coordinates, but do not draw anything:
+ \path [name intersections={of=D and E}];
+
+ \coordinate [label=above:$C$] (C) at (intersection-1);
+
+ \draw [red] (A) -- (C);
+ \draw [red] (B) -- (C);
+\end{tikzpicture}
+\end{codeexample}
+
+It turns out that this can be further shortened: The |name intersections| takes
+an optional argument |by|, which lets you specify names for the coordinates and
+options for them. This creates more compact code. Although Euclid does not need
+it for the current picture, it is just a small step to computing the bisection
+of the line $AB$:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw [name path=A--B] (A) -- (B);
+
+ \node (D) [name path=D,draw,circle through=(B),label=left:$D$] at (A) {};
+ \node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};
+
+ \path [name intersections={of=D and E, by={[label=above:$C$]C, [label=below:$C'$]C'}}];
+
+ \draw [name path=C--C',red] (C) -- (C');
+
+ \path [name intersections={of=A--B and C--C',by=F}];
+ \node [fill=red,inner sep=1pt,label=-45:$F$] at (F) {};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{The Complete Code}
+
+Back to Euclid's code. He introduces a few macros to make life simpler, like a
+|\A| macro for typesetting a blue $A$. He also uses the |background| layer for
+drawing the triangle behind everything at the end.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \def\A{\textcolor{input}{$A$}} \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{output}{$C$}} \def\D{$D$}
+ \def\E{$E$}
+
+ \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black}
+ \colorlet{triangle}{orange}
+
+ \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
+
+ \draw [input] (A) -- (B);
+
+ \node [name path=D,help lines,draw,label=left:\D] (D) at (A) [circle through=(B)] {};
+ \node [name path=E,help lines,draw,label=right:\E] (E) at (B) [circle through=(A)] {};
+
+ \path [name intersections={of=D and E,by={[label=above:\C]C}}];
+
+ \draw [output] (A) -- (C) -- (B);
+
+ \foreach \point in {A,B,C}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ \begin{pgfonlayer}{background}
+ \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
+ \end{pgfonlayer}
+
+ \node [below right, text width=10cm,align=justify] at (4,3) {
+ \small\textbf{Proposition I}\par
+ \emph{To construct an \textcolor{triangle}{equilateral triangle}
+ on a given \textcolor{input}{finite straight line}.}
+ \par\vskip1em
+ Let \A\B\ be the given \textcolor{input}{finite straight line}. \dots
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Book I, Proposition II}
+
+The second proposition in the Elements is the following:
+
+\bigskip\noindent
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \def\A{\textcolor{orange}{$A$}} \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{input}{$C$}} \def\D{$D$}
+ \def\E{$E$} \def\F{$F$}
+ \def\G{$G$} \def\H{$H$}
+ \def\K{$K$} \def\L{\textcolor{output}{$L$}}
+
+ \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black}
+
+ \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B] (B) at ($ (1,0.2) + .1*(rand,rand) $);
+ \coordinate [label=above:\C] (C) at ($ (1,2) + .1*(rand,rand) $);
+
+ \draw [input] (B) -- (C);
+ \draw [help lines] (A) -- (B);
+
+ \coordinate [label=above:\D] (D) at ($ (A)!.5!(B) ! {sin(60)*2} ! 90:(B) $);
+
+ \draw [help lines] (D) -- ($ (D)!3.75!(A) $) coordinate [label=-135:\E] (E);
+ \draw [help lines] (D) -- ($ (D)!3.75!(B) $) coordinate [label=-45:\F] (F);
+
+ \node (H) at (B) [name path=H,help lines,circle through=(C),draw,label=135:\H] {};
+ \path [name path=B--F] (B) -- (F);
+ \path [name intersections={of=H and B--F}]
+ coordinate [label=right:\G] (G) at (intersection-1);
+
+ \node (K) at (D) [name path=K,help lines,circle through=(G),draw,label=135:\K] {};
+
+ \path [name path=A to E line] (A) -- (E);
+ \path [name intersections={of=K and A to E line}]
+ coordinate [label=below:\L] (L) at (intersection-1);
+
+ \draw [output] (A) -- (L);
+
+ \foreach \point in {A,B,C,D,G,L}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ \node [below right, text width=9cm,align=justify] at (4,4) {
+ \small\textbf{Proposition II}\par
+ \emph{To place a \textcolor{output}{straight line} equal to a
+ given \textcolor{input}{straight line} with
+ one end at a \textcolor{orange}{given point}.}
+ \par\vskip1em
+ Let \A\ be the given point, and \B\C\ the given
+ \textcolor{input}{straight line}.
+ It is required to place a \textcolor{output}{straight line} equal
+ to the given \textcolor{input}{straight line} \B\C\ with one end
+ at the point~\A.
+
+ Join the straight line \A\B\ from the point \A\ to the point \B, and
+ construct the equilateral triangle \D\A\B\ on it.
+
+ Produce the straight lines \A\E\ and \B\F\ in a straight line with
+ \D\A\ and \D\B. Describe the circle \C\G\H\ with center \B\ and
+ radius \B\C, and again, describe the circle \G\K\L\ with center
+ \D\ and radius \D\G.
+
+ Since the point \B\ is the center of the circle \C\G\H, therefore
+ \B\C\ equals \B\G. Again, since the point \D\ is the center of the
+ circle \G\K\L, therefore \D\L\ equals \D\G. And in these \D\A\
+ equals \D\B, therefore the remainder \A\L\ equals the remainder
+ \B\G. But \B\C\ was also proved equal to \B\G, therefore each of
+ the straight lines \A\L\ and \B\C\ equals \B\G. And things which
+ equal the same thing also equal one another, therefore \A\L\ also
+ equals \B\C.
+
+ Therefore the \textcolor{output}{straight line} \A\L\ equal to the
+ given \textcolor{input}{straight line} \B\C\ has been placed with
+ one end at the \textcolor{orange}{given point}~\A.
+ };
+\end{tikzpicture}
+
+
+\subsubsection{Using Partway Calculations for the Construction of \emph{D}}
+
+Euclid's construction starts with ``referencing'' Proposition~I for the
+construction of the point~$D$. Now, while we could simply repeat the
+construction, it seems a bit bothersome that one has to draw all these circles
+and do all these complicated constructions.
+
+For this reason, \tikzname\ supports some simplifications. First, there is a
+simple syntax for computing a point that is ``partway'' on a line from $p$
+to~$q$: You place these two points in a coordinate calculation -- remember,
+they start with |($| and end with |$)| -- and then combine them using
+|!|\meta{part}|!|. A \meta{part} of |0| refers to the \emph{first} coordinate,
+a \meta{part} of |1| refers to the second coordinate, and a value in between
+refers to a point on the line from $p$ to~$q$. Thus, the syntax is similar to
+the |xcolor| syntax for mixing colors.
+
+Here is the computation of the point in the middle of the line $AB$:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+ \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {};
+\end{tikzpicture}
+\end{codeexample}
+
+The computation of the point $D$ in Euclid's second proposition is a bit more
+complicated. It can be expressed as follows: Consider the line from $X$ to $B$.
+Suppose we rotate this line around $X$ for 90$^\circ$ and then stretch it by a
+factor of $\sin(60^\circ) \cdot 2$. This yields the desired point~$D$. We can
+do the stretching using the partway modifier above, for the rotation we need a
+new modifier: the rotation modifier. The idea is that the second coordinate in
+a partway computation can be prefixed by an angle. Then the partway point is
+computed normally (as if no angle were given), but the resulting point is
+rotated by this angle around the first point.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+ \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {};
+ \node [fill=red,inner sep=1pt,label=above:$D$] (D) at
+ ($ (X) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (A) -- (D) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+Finally, it is not necessary to explicitly name the point $X$. Rather, again
+like in the |xcolor| package, it is possible to chain partway modifiers:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (1.25,0.25);
+ \draw (A) -- (B);
+ \node [fill=red,inner sep=1pt,label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (A) -- (D) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Intersecting a Line and a Circle}
+
+The next step in the construction is to draw a circle around $B$ through $C$,
+which is easy enough to do using the |circle through| option. Extending the
+lines $DA$ and $DB$ can be done using partway calculations, but this time with
+a part value outside the range $[0,1]$:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (0.75,0.25);
+ \coordinate [label=above:$C$] (C) at (1,1.5);
+ \draw (A) -- (B) -- (C);
+ \coordinate [label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {};
+ \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);
+ \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);
+\end{tikzpicture}
+\end{codeexample}
+
+We now face the problem of finding the point $G$, which is the intersection of
+the line $BF$ and the circle $H$. One way is to use yet another variant of the
+partway computation: Normally, a partway computation has the form
+\meta{p}|!|\meta{factor}|!|\meta{q}, resulting in the point
+$(1-\meta{factor})\meta{p} + \meta{factor}\meta{q}$. Alternatively, instead of
+\meta{factor} you can also use a \meta{dimension} between the points. In this
+case, you get the point that is \meta{dimension} away from \meta{p} on the
+straight line to \meta{q}.
+
+We know that the point $G$ is on the way from $B$ to $F$. The distance is given
+by the radius of the circle~$H$. Here is the code for computing $H$:
+%
+{\tikzexternaldisable
+\begin{codeexample}[pre={
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (0.75,0.25);
+ \coordinate [label=above:$C$] (C) at (1,1.5);
+ \draw (A) -- (B) -- (C);
+ \coordinate [label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);
+ \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);
+},post={\end{tikzpicture}}]
+ \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {};
+ \path let \p1 = ($ (B) - (C) $) in
+ coordinate [label=left:$G$] (G) at ($ (B) ! veclen(\x1,\y1) ! (F) $);
+ \fill[red,opacity=.5] (G) circle (2pt);
+\end{codeexample}
+
+However, there is a simpler way: We can simply name the path of the circle and
+of the line in question and then use |name intersections| to compute the
+intersections.
+%
+\begin{codeexample}[pre={
+\begin{tikzpicture}
+ \coordinate [label=left:$A$] (A) at (0,0);
+ \coordinate [label=right:$B$] (B) at (0.75,0.25);
+ \coordinate [label=above:$C$] (C) at (1,1.5);
+ \draw (A) -- (B) -- (C);
+ \coordinate [label=above:$D$] (D) at
+ ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};
+ \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);
+ \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);
+},post={\end{tikzpicture}}]
+ \node (H) [name path=H,label=135:$H$,draw,circle through=(C)] at (B) {};
+ \path [name path=B--F] (B) -- (F);
+ \path [name intersections={of=H and B--F,by={[label=left:$G$]G}}];
+ \fill[red,opacity=.5] (G) circle (2pt);
+\end{codeexample}
+}%
+
+
+\subsubsection{The Complete Code}
+
+\begin{codeexample}[]
+\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
+ \def\A{\textcolor{orange}{$A$}} \def\B{\textcolor{input}{$B$}}
+ \def\C{\textcolor{input}{$C$}} \def\D{$D$}
+ \def\E{$E$} \def\F{$F$}
+ \def\G{$G$} \def\H{$H$}
+ \def\K{$K$} \def\L{\textcolor{output}{$L$}}
+
+ \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black}
+
+ \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $);
+ \coordinate [label=right:\B] (B) at ($ (1,0.2) + .1*(rand,rand) $);
+ \coordinate [label=above:\C] (C) at ($ (1,2) + .1*(rand,rand) $);
+
+ \draw [input] (B) -- (C);
+ \draw [help lines] (A) -- (B);
+
+ \coordinate [label=above:\D] (D) at ($ (A)!.5!(B) ! {sin(60)*2} ! 90:(B) $);
+
+ \draw [help lines] (D) -- ($ (D)!3.75!(A) $) coordinate [label=-135:\E] (E);
+ \draw [help lines] (D) -- ($ (D)!3.75!(B) $) coordinate [label=-45:\F] (F);
+
+ \node (H) at (B) [name path=H,help lines,circle through=(C),draw,label=135:\H] {};
+ \path [name path=B--F] (B) -- (F);
+ \path [name intersections={of=H and B--F,by={[label=right:\G]G}}];
+
+ \node (K) at (D) [name path=K,help lines,circle through=(G),draw,label=135:\K] {};
+ \path [name path=A--E] (A) -- (E);
+ \path [name intersections={of=K and A--E,by={[label=below:\L]L}}];
+
+ \draw [output] (A) -- (L);
+
+ \foreach \point in {A,B,C,D,G,L}
+ \fill [black,opacity=.5] (\point) circle (2pt);
+
+ % \node ...
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-chains.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-chains.tex
new file mode 100644
index 0000000000..023efec085
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-chains.tex
@@ -0,0 +1,1021 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tutorial: Diagrams as Simple Graphs}
+
+In this tutorial we have a look at how graphs and matrices can be used to
+typeset a diagram.
+
+Ilka, who just got tenure for her professorship on Old and Lovable Programming
+Languages, has recently dug up a technical report entitled \emph{The
+Programming Language Pascal} in the dusty cellar of the library of her
+university. Having been created in the good old times using pens and rules, it
+looks like this%
+\footnote{The shown diagram was not scanned, but rather typeset using
+\tikzname. The jittering lines were created using the |random steps|
+decoration.}:
+%
+\begin{codeexample}[setup code, hidden]
+\tikzset{
+ nonterminal/.style={
+ % The shape:
+ rectangle,
+ % The size:
+ minimum size=6mm,
+ % The border:
+ very thick,
+ draw=red!50!black!50, % 50% red and 50% black,
+ % and that mixed with 50% white
+ % The filling:
+ top color=white, % a shading that is white at the top...
+ bottom color=red!50!black!20, % and something else at the bottom
+ % Font
+ font=\itshape
+ },
+ terminal/.style={
+ % The shape:
+ rounded rectangle,
+ minimum size=6mm,
+ % The rest
+ very thick,draw=black!50,
+ top color=white,bottom color=black!20,
+ font=\ttfamily},
+ skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}
+}
+\end{codeexample}
+
+{
+ \tikzset{terminal/.append style={text height=1.5ex,text depth=.25ex}}
+ \tikzset{nonterminal/.append style={text height=1.5ex,text depth=.25ex}}
+\medskip
+\noindent\begin{tikzpicture}[
+ >=latex,thick,
+ /pgf/every decoration/.style={/tikz/sharp corners},
+ fuzzy/.style={decorate,decoration={random steps,segment length=0.5mm,amplitude=0.15pt}},
+ minimum size=6mm,line join=round,line cap=round,
+ terminal/.style={rectangle,draw,fill=white,fuzzy,rounded corners=3mm},
+ nonterminal/.style={rectangle,draw,fill=white,fuzzy},
+ node distance=4mm]
+
+ \ttfamily
+ \begin{scope}[start chain,
+ every node/.style={on chain},
+ terminal/.append style={join=by {->,shorten >=-1pt,fuzzy,decoration={post length=4pt}}},
+ nonterminal/.append style={join=by {->,shorten >=-1pt,fuzzy,decoration={post length=4pt}}},
+ support/.style={coordinate,join=by fuzzy}]
+ \node [support] (start) {};
+ \node [nonterminal] {unsigned integer};
+ \node [support] (after ui) {};
+ \node [terminal] {.};
+ \node [support] (after dot) {};
+ \node [terminal] {digit};
+ \node [support] (after digit) {};
+ \node [support] (skip) {};
+ \node [support] (before E) {};
+ \node [terminal] {E};
+ \node [support] (after E) {};
+ \node [support,xshift=5mm] (between) {};
+ \node [support,xshift=5mm] (before last) {};
+ \node [nonterminal] {unsigned integer};
+ \node [support] (after last) {};
+ \node [coordinate,join=by ->] (end) {};
+ \end{scope}
+ \node (plus) [terminal,above=of between] {+};
+ \node (minus) [terminal,below=of between] {-};
+
+ \begin{scope}[->,decoration={post length=4pt},rounded corners=2mm,every path/.style=fuzzy]
+ \draw (after ui) -- +(0,.7) -| (skip);
+ \draw (after digit) -- +(0,-.7) -| (after dot);
+ \draw (before E) -- +(0,-1.2) -| (after last);
+ \draw (after E) |- (plus);
+ \draw (plus) -| (before last);
+ \draw (after E) |- (minus);
+ \draw (minus) -| (before last);
+ \end{scope}
+\end{tikzpicture}
+\medskip
+
+For her next lecture, Ilka decides to redo this diagram, but this time perhaps
+a bit cleaner and perhaps also bit ``cooler''.
+
+\medskip
+\noindent\begin{tikzpicture}[point/.style={coordinate},>=stealth',thick,draw=black!50,
+ tip/.style={->,shorten >=1pt},every join/.style={rounded corners},
+ hv path/.style={to path={-| (\tikztotarget)}},
+ vh path/.style={to path={|- (\tikztotarget)}}]
+ \matrix[column sep=4mm] {
+ % First row:
+ & & & & & & & & & & & \node (plus) [terminal] {+};\\
+ % Second row:
+ \node (p1) [point] {}; & \node (ui1) [nonterminal] {unsigned integer}; &
+ \node (p2) [point] {}; & \node (dot) [terminal] {.}; &
+ \node (p3) [point] {}; & \node (digit) [terminal] {digit}; &
+ \node (p4) [point] {}; & \node (p5) [point] {}; &
+ \node (p6) [point] {}; & \node (e) [terminal] {E}; &
+ \node (p7) [point] {}; & &
+ \node (p8) [point] {}; & \node (ui2) [nonterminal] {unsigned integer}; &
+ \node (p9) [point] {}; & \node (p10) [point] {};\\
+ % Third row:
+ & & & & & & & & & & & \node (minus)[terminal] {-};\\
+ };
+
+ { [start chain]
+ \chainin (p1);
+ \chainin (ui1) [join=by tip];
+ \chainin (p2) [join];
+ \chainin (dot) [join=by tip];
+ \chainin (p3) [join];
+ \chainin (digit) [join=by tip];
+ \chainin (p4) [join];
+ { [start branch=digit loop]
+ \chainin (p3) [join=by {skip loop=-6mm,tip}];
+ }
+ \chainin (p5) [join,join=with p2 by {skip loop=6mm,tip}];
+ \chainin (p6) [join];
+ \chainin (e) [join=by tip];
+ \chainin (p7) [join];
+ { [start branch=plus]
+ \chainin (plus) [join=by {vh path,tip}];
+ \chainin (p8) [join=by {hv path,tip}];
+ }
+ { [start branch=minus]
+ \chainin (minus) [join=by {vh path,tip}];
+ \chainin (p8) [join=by {hv path,tip}];
+ }
+ \chainin (p8) [join];
+ \chainin (ui2) [join=by tip];
+ \chainin (p9) [join,join=with p6 by {skip loop=-11mm,tip}];
+ \chainin (p10) [join=by tip];
+ }
+\end{tikzpicture}
+}\medskip
+
+Having read the previous tutorials, Ilka knows already how to set up the
+environment for her diagram, namely using a |tikzpicture| environment. She
+wonders which libraries she will need. She decides that she will postpone the
+decision and add the necessary libraries as needed as she constructs the
+picture.
+
+
+\subsection{Styling the Nodes}
+
+The bulk of this tutorial will be about arranging the nodes and connecting them
+using chains, but let us start with setting up styles for the nodes.
+
+There are two kinds of nodes in the diagram, namely what theoreticians like to
+call \emph{terminals} and \emph{nonterminals}. For the terminals, Ilka decides
+to use a black color, which visually shows that ``nothing needs to be done
+about them''. The nonterminals, which still need to be ``processed'' further,
+get a bit of red mixed in.
+
+Ilka starts with the simpler nonterminals, as there are no rounded corners
+involved. Naturally, she sets up a style:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ nonterminal/.style={
+ % The shape:
+ rectangle,
+ % The size:
+ minimum size=6mm,
+ % The border:
+ very thick,
+ draw=red!50!black!50, % 50% red and 50% black,
+ % and that mixed with 50% white
+ % The filling:
+ top color=white, % a shading that is white at the top...
+ bottom color=red!50!black!20, % and something else at the bottom
+ % Font
+ font=\itshape
+ }]
+ \node [nonterminal] {unsigned integer};
+\end{tikzpicture}
+\end{codeexample}
+%
+Ilka is pretty proud of the use of the |minimum size| option: As the name
+suggests, this option ensures that the node is at least 6mm by 6mm, but it will
+expand in size as necessary to accommodate longer text. By giving this option
+to all nodes, they will all have the same height of 6mm.
+
+Styling the terminals is a bit more difficult because of the round corners.
+Ilka has several options how she can achieve them. One way is to use the
+|rounded corners| option. It gets a dimension as parameter and causes all
+corners to be replaced by little arcs with the given dimension as radius. By
+setting the radius to 3mm, she will get exactly what she needs: circles, when
+the shapes are, indeed, exactly 6mm by 6mm and otherwise half circles on the
+sides:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm,
+ terminal/.style={
+ % The shape:
+ rectangle,minimum size=6mm,rounded corners=3mm,
+ % The rest
+ very thick,draw=black!50,
+ top color=white,bottom color=black!20,
+ font=\ttfamily}]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+\end{tikzpicture}
+\end{codeexample}
+
+Another possibility is to use a shape that is specially made for typesetting
+rectangles with arcs on the sides (she has to use the |shapes.misc| library to
+use it). This shape gives Ilka much more control over the appearance. For
+instance, she could have an arc only on the left side, but she will not need
+this.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm,
+ terminal/.style={
+ % The shape:
+ rounded rectangle,
+ minimum size=6mm,
+ % The rest
+ very thick,draw=black!50,
+ top color=white,bottom color=black!20,
+ font=\ttfamily}]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+\end{tikzpicture}
+\end{codeexample}
+%
+At this point, she notices a problem. The baseline of the text in the nodes is
+not aligned:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+
+ \draw [help lines] let \p1 = (dot.base),
+ \p2 = (digit.base),
+ \p3 = (E.base)
+ in (-.5,\y1) -- (3.5,\y1)
+ (-.5,\y2) -- (3.5,\y2)
+ (-.5,\y3) -- (3.5,\y3);
+\end{tikzpicture}
+\end{codeexample}
+%
+\noindent (Ilka has moved the style definition to the preamble by saying
+|\tikzset{terminal/.style=...}|, so that she can use it in all pictures.)
+
+For the |digit| and the |E| the difference in the baselines is almost
+imperceptible, but for the dot the problem is quite severe: It looks more like
+a multiplication dot than a period.
+
+Ilka toys with the idea of using the |base right=of...| option rather than
+|right=of...| to align the nodes in such a way that the baselines are all on
+the same line (the |base right| option places a node right of something so that
+the baseline is right of the baseline of the other object). However, this does
+not have the desired effect:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,base right=of dot] {digit};
+ \node (E) [terminal,base right=of digit] {E};
+\end{tikzpicture}
+\end{codeexample}
+%
+The nodes suddenly ``dance around''! There is no hope of changing the position
+of text inside a node using anchors. Instead, Ilka must use a trick: The
+problem of mismatching baselines is caused by the fact that |.| and |digit| and
+|E| all have different heights and depth. If they all had the same, they would
+all be positioned vertically in the same manner. So, all Ilka needs to do is to
+use the |text height| and |text depth| options to explicitly specify a height
+and depth for the nodes.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm,
+ text height=1.5ex,text depth=.25ex]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Aligning the Nodes Using Positioning Options}
+
+Ilka now has the ``styling'' of the nodes ready. The next problem is to place
+them in the right places. There are several ways to do this. The most
+straightforward is to simply explicitly place the nodes at certain coordinates
+``calculated by hand''. For very simple graphics this is perfectly alright, but
+it has several disadvantages:
+%
+\begin{enumerate}
+ \item For more difficult graphics, the calculation may become
+ complicated.
+ \item Changing the text of the nodes may make it necessary to recalculate
+ the coordinates.
+ \item The source code of the graphic is not very clear since the
+ relationships between the positions of the nodes are not made
+ explicit.
+\end{enumerate}
+
+For these reasons, Ilka decides to try out different ways of arranging the
+nodes on the page.
+
+The first method is the use of \emph{positioning options}. To use them, you
+need to load the |positioning| library. This gives you access to advanced
+implementations of options like |above| or |left|, since you can now say
+|above=of some node| in order to place a node above of |some node|, with the
+borders separated by |node distance|.
+
+Ilka can use this to draw the place the nodes in a long row:
+%
+\begin{codeexample}[setup code,hidden]
+\tikzset{terminal/.append style={text height=1.5ex,text depth=.25ex}}
+\tikzset{nonterminal/.append style={text height=1.5ex,text
+ depth=.25ex}}
+\end{codeexample}
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm and 5mm]
+ \node (ui1) [nonterminal] {unsigned integer};
+ \node (dot) [terminal,right=of ui1] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+ \node (plus) [terminal,above right=of E] {+};
+ \node (minus) [terminal,below right=of E] {-};
+ \node (ui2) [nonterminal,below right=of plus] {unsigned integer};
+\end{tikzpicture}
+\end{codeexample}
+
+For the plus and minus nodes, Ilka is a bit startled by their placements.
+Shouldn't they be more to the right? The reason they are placed in that manner
+is the following: The |north east| anchor of the |E| node lies at the ``upper
+start of the right arc'', which, a bit unfortunately in this case, happens to
+be the top of the node. Likewise, the |south west| anchor of the |+| node is
+actually at its bottom and, indeed, the horizontal and vertical distances
+between the top of the |E| node and the bottom of the |+| node are both 5mm.
+
+There are several ways of fixing this problem. The easiest way is to simply add
+a little bit of horizontal shift by hand:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm and 5mm]
+ \node (E) [terminal] {E};
+ \node (plus) [terminal,above right=of E,xshift=5mm] {+};
+ \node (minus) [terminal,below right=of E,xshift=5mm] {-};
+ \node (ui2) [nonterminal,below right=of plus,xshift=5mm] {unsigned integer};
+\end{tikzpicture}
+\end{codeexample}
+
+A second way is to revert back to the idea of using a normal rectangle for the
+terminals, but with rounded corners. Since corner rounding does not affect
+anchors, she gets the following result:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm and 5mm,terminal/.append style={rectangle,rounded corners=3mm}]
+ \node (E) [terminal] {E};
+ \node (plus) [terminal,above right=of E] {+};
+ \node (minus) [terminal,below right=of E] {-};
+ \node (ui2) [nonterminal,below right=of plus] {unsigned integer};
+\end{tikzpicture}
+\end{codeexample}
+%
+A third way is to use matrices, which we will do later.
+
+Now that the nodes have been placed, Ilka needs to add connections. Here, some
+connections are more difficult than others. Consider for instance the
+``repeat'' line around the |digit|. One way of describing this line is to say
+``it starts a little to the right of |digit| than goes down and then goes to
+the left and finally ends at a point a little to the left of |digit|''. Ilka
+can put this into code as follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm and 5mm]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+
+ \path (dot) edge[->] (digit) % simple edges
+ (digit) edge[->] (E);
+
+ \draw [->]
+ % start right of digit.east, that is, at the point that is the
+ % linear combination of digit.east and the vector (2mm,0pt). We
+ % use the ($ ... $) notation for computing linear combinations
+ ($ (digit.east) + (2mm,0) $)
+ % Now go down
+ -- ++(0,-.5)
+ % And back to the left of digit.west
+ -| ($ (digit.west) - (2mm,0) $);
+\end{tikzpicture}
+\end{codeexample}
+
+Since Ilka needs this ``go up/down then horizontally and then up/down to a
+target'' several times, it seems sensible to define a special \emph{to-path}
+for this. Whenever the |edge| command is used, it simply adds the current value
+of |to path| to the path. So, Ilka can set up a style that contains the correct
+path:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm and 5mm,
+ skip loop/.style={to path={-- ++(0,-.5) -| (\tikztotarget)}}]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+
+ \path (dot) edge[->] (digit) % simple edges
+ (digit) edge[->] (E)
+ ($ (digit.east) + (2mm,0) $)
+ edge[->,skip loop] ($ (digit.west) - (2mm,0) $);
+\end{tikzpicture}
+\end{codeexample}
+
+Ilka can even go a step further and make her |skip look| style parameterized.
+For this, the skip loop's vertical offset is passed as parameter |#1|. Also, in
+the following code Ilka specifies the start and targets differently, namely as
+the positions that are ``in the middle between the nodes''.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[node distance=5mm and 5mm,
+ skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}]
+ \node (dot) [terminal] {.};
+ \node (digit) [terminal,right=of dot] {digit};
+ \node (E) [terminal,right=of digit] {E};
+
+ \path (dot) edge[->] (digit) % simple edges
+ (digit) edge[->] (E)
+ ($ (digit.east)!.5!(E.west) $)
+ edge[->,skip loop=-5mm] ($ (digit.west)!.5!(dot.east) $);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Aligning the Nodes Using Matrices}
+
+Ilka is still bothered a bit by the placement of the plus and minus nodes.
+Somehow, having to add an explicit |xshift| seems too much like cheating.
+
+A perhaps better way of positioning the nodes is to use a \emph{matrix}. In
+\tikzname\ matrices can be used to align quite arbitrary graphical objects in
+rows and columns. The syntax is very similar to the use of arrays and tables in
+\TeX\ (indeed, internally \TeX\ tables are used, but a lot of stuff is going on
+additionally).
+
+In Ilka's graphic, there will be three rows: One row containing only the plus
+node, one row containing the main nodes and one row containing only the minus
+node.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \matrix[row sep=1mm,column sep=5mm] {
+ % First row:
+ & & & & \node [terminal] {+}; & \\
+ % Second row:
+ \node [nonterminal] {unsigned integer}; &
+ \node [terminal] {.}; &
+ \node [terminal] {digit}; &
+ \node [terminal] {E}; &
+ &
+ \node [nonterminal] {unsigned integer}; \\
+ % Third row:
+ & & & & \node [terminal] {-}; & \\
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+That was easy! By toying around with the row and columns separations, Ilka can
+achieve all sorts of pleasing arrangements of the nodes.
+
+Ilka now faces the same connecting problem as before. This time, she has an
+idea: She adds small nodes (they will be turned into coordinates later on and
+be invisible) at all the places where she would like connections to start and
+end.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[point/.style={circle,inner sep=0pt,minimum size=2pt,fill=red},
+ skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}]
+ \matrix[row sep=1mm,column sep=2mm] {
+ % First row:
+ & & & & & & & & & & & \node (plus) [terminal] {+};\\
+ % Second row:
+ \node (p1) [point] {}; & \node (ui1) [nonterminal] {unsigned integer}; &
+ \node (p2) [point] {}; & \node (dot) [terminal] {.}; &
+ \node (p3) [point] {}; & \node (digit) [terminal] {digit}; &
+ \node (p4) [point] {}; & \node (p5) [point] {}; &
+ \node (p6) [point] {}; & \node (e) [terminal] {E}; &
+ \node (p7) [point] {}; & &
+ \node (p8) [point] {}; & \node (ui2) [nonterminal] {unsigned integer}; &
+ \node (p9) [point] {}; & \node (p10) [point] {};\\
+ % Third row:
+ & & & & & & & & & & & \node (minus)[terminal] {-};\\
+ };
+
+ \path (p4) edge [->,skip loop=-5mm] (p3)
+ (p2) edge [->,skip loop=5mm] (p6);
+\end{tikzpicture}
+\end{codeexample}
+%
+Now, it's only a small step to add all the missing edges.
+
+
+\subsection{The Diagram as a Graph}
+
+Matrices allow Ilka to align the nodes nicely, but the connections are not
+quite perfect. The problem is that the code does not really reflect the paths
+that underlie the diagram. For this, it seems natural enough to Ilka to use the
+|graph| library since, after all, connecting nodes by edges is exactly what
+happens in a graph. The |graph| library can both be used to connect nodes that
+have already been created, but it can also be used to create nodes ``on the
+fly'' and these processes can also be mixed.
+
+
+\subsubsection{Connecting Already Positioned Nodes}
+
+Ilka has already a fine method for positioning her nodes (using a |matrix|), so
+all that she needs is an easy way of specifying the edges. For this, she uses
+the |\graph| command (which is actually just a shorthand for |\path graph|). It
+allows her to write down edges between them in a simple way (the macro
+|\matrixcontent| contains exactly the matrix content from the previous example;
+no need to repeat it here):
+%
+\def\matrixcontent{
+ % First row:
+ \& \& \& \& \& \& \& \& \& \& \& \node (plus) [terminal] {+};\\
+ % Second row:
+ \node (p1) [point] {}; \& \node (ui1) [nonterminal] {unsigned integer}; \&
+ \node (p2) [point] {}; \& \node (dot) [terminal] {.}; \&
+ \node (p3) [point] {}; \& \node (digit) [terminal] {digit}; \&
+ \node (p4) [point] {}; \& \node (p5) [point] {}; \&
+ \node (p6) [point] {}; \& \node (e) [terminal] {E}; \&
+ \node (p7) [point] {}; \& \&
+ \node (p8) [point] {}; \& \node (ui2) [nonterminal] {unsigned integer}; \&
+ \node (p9) [point] {}; \& \node (p10) [point] {};\\
+ % Third row:
+ \& \& \& \& \& \& \& \& \& \& \& \node (minus)[terminal] {-};\\
+}
+\begin{codeexample}[pre={\tikzset{ampersand replacement=\&,point/.style={coordinate}}}]
+\begin{tikzpicture}[skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}},
+ hv path/.style={to path={-| (\tikztotarget)}},
+ vh path/.style={to path={|- (\tikztotarget)}}]
+ \matrix[row sep=1mm,column sep=2mm] { \matrixcontent };
+
+ \graph {
+ (p1) -> (ui1) -- (p2) -> (dot) -- (p3) -> (digit) -- (p4)
+ -- (p5) -- (p6) -> (e) -- (p7) -- (p8) -> (ui2) -- (p9) -> (p10);
+ (p4) ->[skip loop=-5mm] (p3);
+ (p2) ->[skip loop=5mm] (p5);
+ (p6) ->[skip loop=-11mm] (p9);
+ (p7) ->[vh path] (plus) -> [hv path] (p8);
+ (p7) ->[vh path] (minus) -> [hv path] (p8);
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+This is already pretty near to the desired result, just a few ``finishing
+touches'' are needed to style the edges more nicely.
+
+However, Ilka does not have the feeling that the |graph| command is all that
+hot in the example. It certainly does cut down on the number of characters she
+has to write, but the overall graph structure is not that much clear -- it is
+still mainly a list of paths through the graph. It would be nice to specify
+that, say, there the path from |(p7)| sort of splits to |(plus)| and |(minus)|
+and then merges once more at |(p8)|. Also, all these parentheses are bit hard
+to type.
+
+It turns out that edges from a node to a whole group of nodes are quite easy to
+specify, as shown in the next example. Additionally, by using the
+|use existing nodes| option, Ilka can also leave out all the parentheses
+(again, some options have been moved outside to keep the examples shorter):
+%
+\begin{codeexample}[pre={\tikzset{ampersand replacement=\&,point/.style={coordinate},
+ skip loop/.style={to path={-- ++(0,##1) -| (\tikztotarget)}},
+ hv path/.style={to path={-| (\tikztotarget)}},
+ vh path/.style={to path={|- (\tikztotarget)}}}}]
+\begin{tikzpicture}[,>=stealth',thick,black!50,text=black,
+ every new ->/.style={shorten >=1pt},
+ graphs/every graph/.style={edges=rounded corners}]
+ \matrix[column sep=4mm] { \matrixcontent };
+
+ \graph [use existing nodes] {
+ p1 -> ui1 -- p2 -> dot -- p3 -> digit -- p4 -- p5 -- p6 -> e -- p7 -- p8 -> ui2 -- p9 -> p10;
+ p4 ->[skip loop=-5mm] p3;
+ p2 ->[skip loop=5mm] p5;
+ p6 ->[skip loop=-11mm] p9;
+ p7 ->[vh path] { plus, minus } -> [hv path] p8;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Creating Nodes Using the Graph Command}
+
+Ilka has heard that the |graph| command is also supposed to make it easy to
+create nodes, not only to connect them. This is, indeed, correct: When the
+|use existing nodes| option is not used and when a node name is not surrounded
+by parentheses, then \tikzname\ will actually create a node whose name and text
+is the node name:
+%
+\begin{codeexample}[]
+\tikz \graph [grow right=2cm] { unsigned integer -> d -> digit -> E };
+\end{codeexample}
+%
+Not quite perfect, but we are getting somewhere. First, let us change the
+positioning algorithm by saying |grow right sep|, which causes new nodes to be
+placed to the right of the previous nodes with a certain fixed separation
+(|1em| by default). Second, we add some options to make the node ``look nice''.
+Third, note the funny |d| node above: Ilka tried writing just |.| there first,
+but got some error messages. The reason is that a node cannot be called |.| in
+\tikzname, so she had to choose a different name -- which is not good, since
+she wants a dot to be shown! The trick is to put the dot in quotation marks,
+this allows you to use ``quite arbitrary text'' as a node name:
+
+\begin{codeexample}[]
+\tikz \graph [grow right sep] {
+ unsigned integer[nonterminal] -> "."[terminal] -> digit[terminal] -> E[terminal]
+};
+\end{codeexample}
+%
+Now comes the fork to the plus and minus signs. Here, Ilka can use the grouping
+mechanism of the |graph| command to create a split:
+%
+\begin{codeexample}[]
+\tikz \graph [grow right sep] {
+ unsigned integer [nonterminal] ->
+ "." [terminal] ->
+ digit [terminal] ->
+ E [terminal] ->
+ {
+ "+" [terminal],
+ "" [coordinate],
+ "-" [terminal]
+ } ->
+ ui2/unsigned integer [nonterminal]
+};
+\end{codeexample}
+%
+Let us see, what is happening here. We want two |unsigned integer| nodes, but
+if we just were to use this text twice, then \tikzname\ would have noticed that
+the same name was used already in the current graph and, being smart (actually
+too smart in this case), would have created an edge back to the already-created
+node. Thus, a fresh name is needed here. However, Ilka also cannot just write
+|unsigned integer2|, because she wants the original text to be shown, after
+all! The trick is to use a slash inside the node name: In order to ``render''
+the node, the text following the slash is used instead of the node name, which
+is the text before the slash. Alternatively, the |as| option can be used, which
+also allows you to specify how a node should be rendered.
+
+It turns out that Ilka does not need to invent a name like |ui2| for a node
+that she will not reference again anyway. In this case, she can just leave out
+the name (write nothing before |/|), which always stands for a ``fresh,
+anonymous'' node name.
+
+Next, Ilka needs to add some coordinates in between of some nodes where the
+back-loops should got and she needs to shift the nodes a bit:
+%
+\begin{codeexample}[pre={\tikzset{
+ skip loop/.style={to path={-- ++(0,##1) -| (\tikztotarget)}},
+ hv path/.style={to path={-| (\tikztotarget)}},
+ vh path/.style={to path={|- (\tikztotarget)}}}}]
+\begin{tikzpicture}[>=stealth', thick, black!50, text=black,
+ every new ->/.style={shorten >=1pt},
+ graphs/every graph/.style={edges=rounded corners}]
+ \graph [grow right sep, branch down=7mm] {
+ / [coordinate] ->
+ unsigned integer [nonterminal] --
+ p1 [coordinate] ->
+ "." [terminal] --
+ p2 [coordinate] ->
+ digit [terminal] --
+ p3 [coordinate] --
+ p4 [coordinate] --
+ p5 [coordinate] ->
+ E [terminal] --
+ q1 [coordinate] ->[vh path]
+ { [nodes={yshift=7mm}]
+ "+" [terminal],
+ q2/ [coordinate],
+ "-" [terminal]
+ } -> [hv path]
+ q3 [coordinate] --
+ /unsigned integer [nonterminal] --
+ p6 [coordinate] ->
+ / [coordinate];
+
+ p1 ->[skip loop=5mm] p4;
+ p3 ->[skip loop=-5mm] p2;
+ p5 ->[skip loop=-11mm] p6;
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+All that remains to be done is to somehow get rid of the strange curves between
+the |E| and the unsigned integer. They are caused by \tikzname's attempt at
+creating an edge that first goes vertical and then horizontal but is actually
+just horizontal. Additionally, the edge should not really be pointed; but it
+seems difficult to get rid of this since the \emph{other} edges from |q1|,
+namely to |plus| and |minus| should be pointed.
+
+It turns out that there is a nice way of solving this problem: You can specify
+that a graph is |simple|. This means that there can be at most one edge between
+any two nodes. Now, if you specify an edge twice, the options of the second
+specification ``win''. Thus, by adding two more lines that ``correct'' these
+edges, we get the final diagram with its complete code:
+%
+\begin{codeexample}[]
+\tikz [>=stealth', black!50, text=black, thick,
+ every new ->/.style = {shorten >=1pt},
+ graphs/every graph/.style = {edges=rounded corners},
+ skip loop/.style = {to path={-- ++(0,#1) -| (\tikztotarget)}},
+ hv path/.style = {to path={-| (\tikztotarget)}},
+ vh path/.style = {to path={|- (\tikztotarget)}},
+ nonterminal/.style = {
+ rectangle, minimum size=6mm, very thick, draw=red!50!black!50, top color=white,
+ bottom color=red!50!black!20, font=\itshape, text height=1.5ex,text depth=.25ex},
+ terminal/.style = {
+ rounded rectangle, minimum size=6mm, very thick, draw=black!50, top color=white,
+ bottom color=black!20, font=\ttfamily, text height=1.5ex, text depth=.25ex},
+ shape = coordinate
+ ]
+ \graph [grow right sep, branch down=7mm, simple] {
+ / -> unsigned integer[nonterminal] -- p1 -> "." [terminal] -- p2 -> digit[terminal] --
+ p3 -- p4 -- p5 -> E[terminal] -- q1 ->[vh path]
+ {[nodes={yshift=7mm}]
+ "+"[terminal], q2, "-"[terminal]
+ } -> [hv path]
+ q3 -- /unsigned integer [nonterminal] -- p6 -> /;
+
+ p1 ->[skip loop=5mm] p4;
+ p3 ->[skip loop=-5mm] p2;
+ p5 ->[skip loop=-11mm] p6;
+
+ q1 -- q2 -- q3; % make these edges plain
+ };
+\end{codeexample}
+
+
+%% TODOsp: a commented subsection
+% \subsection{Using Chains}
+%
+% Matrices allow Ilka to align the nodes nicely, but the connections are
+% not quite perfect. The problem is that the code does not really
+% reflect the paths that underlie the diagram.
+%
+%
+% For this reason, Ilka decides to try out \emph{chains} by including
+% the |chain| library. Basically, a chain is just a sequence of
+% (usually) connected nodes. The nodes can already have been constructed
+% or they can be constructed as the chain is constructed (or these
+% processes can be mixed).
+%
+% \subsubsection{Creating a Simple Chain}
+%
+%
+% Ilka starts with creating a chain from scratch. For this, she starts a
+% chain using the |start chain| option in a scope. Then, inside the
+% scope, she uses the |on chain| option on nodes to add them to the
+% chain.
+% \begin{codeexample}[]
+% \begin{tikzpicture}[start chain,node distance=5mm]
+% \node [on chain,nonterminal] {unsigned integer};
+% \node [on chain,terminal] {.};
+% \node [on chain,terminal] {digit};
+% \node [on chain,terminal] {E};
+% \node [on chain,nonterminal] {unsigned integer};
+% \end{tikzpicture}
+% \end{codeexample}
+% (Ilka will add the plus and minus nodes later.)
+%
+% As can be seen, the nodes of a chain are placed in a row. This can be
+% changed, for instance by saying |start chain=going below| we get a
+% chain where each node is below the previous one.
+%
+% The next step is to \emph{join} the nodes of the chain. For this, we
+% add the |join| option to each node. This joins the node with the
+% previous node (for the first node nothing happens).
+% \begin{codeexample}[]
+% \begin{tikzpicture}[start chain,node distance=5mm]
+% \node [on chain,join,nonterminal] {unsigned integer};
+% \node [on chain,join,terminal] {.};
+% \node [on chain,join,terminal] {digit};
+% \node [on chain,join,terminal] {E};
+% \node [on chain,join,nonterminal] {unsigned integer};
+% \end{tikzpicture}
+% \end{codeexample}
+% In order to get a arrow tip, we redefine the |every join| style. Also,
+% we move the |join| and |on chain| options to the |every node|
+% style so that we do not have to repeat them so often.
+% \begin{codeexample}[]
+% \begin{tikzpicture}[start chain,node distance=5mm, every node/.style={on chain,join}, every join/.style={->}]
+% \node [nonterminal] {unsigned integer};
+% \node [terminal] {.};
+% \node [terminal] {digit};
+% \node [terminal] {E};
+% \node [nonterminal] {unsigned integer};
+% \end{tikzpicture}
+% \end{codeexample}
+%
+%
+% \subsubsection{Branching and Joining a Chain}
+%
+% It is now time to add the plus and minus signs. They obviously
+% \emph{branch off} the main chain. For this reason, we start a branch
+% for them using the |start branch| option.
+% \begin{codeexample}[]
+% \begin{tikzpicture}[start chain,node distance=5mm, every node/.style={on chain,join}, every join/.style={->}]
+% \node [nonterminal] {unsigned integer};
+% \node [terminal] {.};
+% \node [terminal] {digit};
+% \node [terminal] {E};
+% \begin{scope}[start branch=plus]
+% \node (plus) [terminal,on chain=going above right] {+};
+% \end{scope}
+% \begin{scope}[start branch=minus]
+% \node (minus) [terminal,on chain=going below right] {-};
+% \end{scope}
+% \node [nonterminal,join=with plus,join=with minus] {unsigned integer};
+% \end{tikzpicture}
+% \end{codeexample}
+%
+% Let us see, what is going on here. First, the |start branch| begins a
+% branch, starting with the node last created on the current chain,
+% which is the |E| node in our case. This is implicitly also the first
+% node on this branch. A branch is nothing different from a chain, which
+% is why the plus node is put on this branch using the |on chain|
+% option. However, this time we specify the placement of the node
+% explicitly using |going |\meta{direction}. This causes the plus sign
+% to be placed above and right of the |E| node. It is automatically
+% joined to its predecessor on the branch by the implicit |join|
+% option.
+%
+% When the first branch ends, only the plus node has been added and the
+% current chain is the original chain once more and we are back to the
+% |E| node. Now we start a new branch for the minus node. After this
+% branch, the current chain ends at |E| node once more.
+%
+% Finally, the rightmost unsigned integer is added to the (main) chain,
+% which is why it is joined correctly with the |E| node. The two
+% additional |join| options get a special |with| parameter. This allows
+% you to join a node with a node other than the predecessor on the
+% chain. The |with| should be followed by the name of a node.
+%
+% Since Ilka will need scopes more often in the following, she includes
+% the |scopes| library. This allows her to replace |\begin{scope}|
+% simply by an opening brace and |\end{scope}| by the corresponding
+% closing brace. Also, in the following example we reference
+% the nodes |plus| and |minus| using
+% their automatic name: The $i$th node on a chain is called
+% |chain-|\meta{i}. For a branch \meta{branch}, the $i$th node is called
+% |chain/|\meta{branch}|-|\meta{i}. The \meta{i} can be replaced by
+% |begin| and |end| to reference the first and (currently) last node on
+% the chain.
+%
+% \begin{codeexample}[]
+% \begin{tikzpicture}[start chain,node distance=5mm, every on chain/.style={join}, every join/.style={->}]
+% \node [on chain,nonterminal] {unsigned integer};
+% \node [on chain,terminal] {.};
+% \node [on chain,terminal] {digit};
+% \node [on chain,terminal] {E};
+% { [start branch=plus]
+% \node (plus) [terminal,on chain=going above right] {+};
+% }
+% { [start branch=minus]
+% \node (minus) [terminal,on chain=going below right] {-};
+% }
+% \node [nonterminal,on chain,join=with chain/plus-end,join=with chain/minus-end] {unsigned integer};
+% \end{tikzpicture}
+% \end{codeexample}
+%
+%
+% The next step is to add intermediate coordinate nodes in the same
+% manner as Ilka did for the matrix. For them, we change the |join|
+% style slightly, namely for these nodes we do not want an arrow
+% tip. This can be achieved either by (locally) changing the
+% |every join| style or, which is what is done in the below example, by
+% giving the desired style using |join=by ...|, where |...| is the style
+% to be used for the join.
+%
+% \begin{codeexample}[]
+% \begin{tikzpicture}[start chain,node distance=5mm and 2mm,
+% every node/.style={on chain},
+% nonterminal/.append style={join=by ->},
+% terminal/.append style={join=by ->},
+% point/.style={join=by -,circle,fill=red,minimum size=2pt,inner sep=0pt}]
+% \node [point] {}; \node [nonterminal] {unsigned integer};
+% \node [point] {}; \node [terminal] {.};
+% \node [point] {}; \node [terminal] {digit};
+% \node [point] {}; \node [point] {};
+% \node [point] {}; \node [terminal] {E};
+% \node [point] {};
+% { [node distance=5mm and 1cm] % local change in horizontal distance
+% { [start branch=plus]
+% \node (plus) [terminal,on chain=going above right] {+};
+% }
+% { [start branch=minus]
+% \node (minus) [terminal,on chain=going below right] {-};
+% }
+% \node [point,below right=of plus,join=with chain/plus-end by ->,join=with chain/minus-end by ->] {};
+% }
+% \node [nonterminal] {unsigned integer};
+% \node [point] {};
+% \end{tikzpicture}
+% \end{codeexample}
+%
+%
+% \subsubsection{Chaining Together Already Positioned Nodes}
+%
+% The final step is to add the missing arrows. We can also use branches
+% for them (even though we do not have to, but it is good practice and
+% they exhibit the structure of the diagram in the code).
+%
+% Let us start with the repeat loop around the |digit|. This can be
+% thought of as a branch that starts at the point after the digit and
+% that ends at the point before the digit. However, we have already
+% constructed the point before the digit! In such cases, it is possible
+% to ``chain in'' an already positioned node, using the |\chainin|
+% command. This command must be followed by a coordinate that contains a
+% node name and optionally some options. The effect is that the named
+% node is made part of the current chain.
+%
+% \begin{codeexample}[pre={\tikzset{node distance=5mm and 2mm,
+% every node/.style={on chain},
+% terminal/.append style={join=by ->},
+% point/.style={join=by -,circle,fill=red,minimum size=2pt,inner sep=0pt}}}]
+% \begin{tikzpicture}[start chain] % plus some styles that are not shown
+% \node [point] {};
+% \node (before digit) [point] {};
+% \node [terminal] {digit};
+% \node [point] {};
+% { [start branch=digit loop]
+% \chainin (before digit) [join=by {->,skip loop=-5mm}];
+% }
+% \node [point] {};
+% \end{tikzpicture}
+% \end{codeexample}
+%
+%
+% \subsubsection{Combined Use of Matrices and Chains}
+%
+% Ilka's final idea is to combine matrices and chains in the following
+% manner: She will use a matrix to position the nodes. However, to show
+% the logical ``flow structure'' inside the diagram, she will create
+% chains and branches that show what is going on.
+%
+% Ilka starts with the matrix we had earlier, only with slightly adapted
+% styles. Then she writes down the main chain and its branches:
+%
+% \begin{codeexample}[]
+% \begin{tikzpicture}[point/.style={coordinate},>=stealth',thick,draw=black!50,
+% tip/.style={->,shorten >=1pt},every join/.style={rounded corners},
+% hv path/.style={to path={-| (\tikztotarget)}},
+% vh path/.style={to path={|- (\tikztotarget)}}]
+% \matrix[column sep=4mm] {
+% % First row:
+% & & & & & & & & & & & \node (plus) [terminal] {+};\\
+% % Second row:
+% \node (p1) [point] {}; & \node (ui1) [nonterminal] {unsigned integer}; &
+% \node (p2) [point] {}; & \node (dot) [terminal] {.}; &
+% \node (p3) [point] {}; & \node (digit) [terminal] {digit}; &
+% \node (p4) [point] {}; & \node (p5) [point] {}; &
+% \node (p6) [point] {}; & \node (e) [terminal] {E}; &
+% \node (p7) [point] {}; & &
+% \node (p8) [point] {}; & \node (ui2) [nonterminal] {unsigned integer}; &
+% \node (p9) [point] {}; & \node (p10) [point] {};\\
+% % Third row:
+% & & & & & & & & & & & \node (minus)[terminal] {-};\\
+% };
+%
+% { [start chain]
+% \chainin (p1);
+% \chainin (ui1) [join=by tip];
+% \chainin (p2) [join];
+% \chainin (dot) [join=by tip];
+% \chainin (p3) [join];
+% \chainin (digit) [join=by tip];
+% \chainin (p4) [join];
+% { [start branch=digit loop]
+% \chainin (p3) [join=by {skip loop=-6mm,tip}];
+% }
+% \chainin (p5) [join,join=with p2 by {skip loop=6mm,tip}];
+% \chainin (p6) [join];
+% \chainin (e) [join=by tip];
+% \chainin (p7) [join];
+% { [start branch=plus]
+% \chainin (plus) [join=by {vh path,tip}];
+% \chainin (p8) [join=by {hv path,tip}];
+% }
+% { [start branch=minus]
+% \chainin (minus) [join=by {vh path,tip}];
+% \chainin (p8) [join=by {hv path,tip}];
+% }
+% \chainin (p8) [join];
+% \chainin (ui2) [join=by tip];
+% \chainin (p9) [join,join=with p6 by {skip loop=-11mm,tip}];
+% \chainin (p10) [join=by tip];
+% }
+% \end{tikzpicture}
+% \end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-map.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-map.tex
new file mode 100644
index 0000000000..e3af1d3b5f
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-map.tex
@@ -0,0 +1,1270 @@
+% Copyright 2008 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tutorial: A Lecture Map for Johannes}
+
+In this tutorial we explore the tree and mind map mechanisms of \tikzname.
+
+Johannes is quite excited: For the first time he will be teaching a course all
+by himself during the upcoming semester! Unfortunately, the course is not on
+his favorite subject, which is of course Theoretical Immunology, but on
+Complexity Theory, but as a young academic Johannes is not likely to complain
+too loudly. In order to help the students get a general overview of what is
+going to happen during the course as a whole, he intends to draw some kind of
+tree or graph containing the basic concepts. He got this idea from his old
+professor who seems to be using these ``lecture maps'' with some success.
+Independently of the success of these maps, Johannes thinks they look quite
+neat.
+
+
+\subsection{Problem Statement}
+
+Johannes wishes to create a lecture map with the following features:
+%
+\begin{enumerate}
+ \item It should contain a tree or graph depicting the main concepts.
+ \item It should somehow visualize the different lectures that will be
+ taught. Note that the lectures are not necessarily the same as the
+ concepts since the graph may contain more concepts than will be
+ addressed in lectures and some concepts may be addressed during more
+ than one lecture.
+ \item The map should also contain a calendar showing when the individual
+ lectures will be given.
+ \item The aesthetical reasons, the whole map should have a visually nice
+ and information-rich background.
+\end{enumerate}
+
+As always, Johannes will have to include the right libraries and set up the
+environment. Johannes is going to use the |mindmap| library and since he wishes
+to show a calendar, he will also need the |calendar| library. In order to put
+something on a background layer, it seems like a good idea to also include the
+|backgrounds| library.
+
+
+\subsection{Introduction to Trees}
+
+The first choice Johannes must make is whether he will organize the concepts as
+a tree, with root concepts and concept branches and leaf concepts, or as a
+general graph. The tree implicitly organizes the concepts, while a graph is
+more flexible. Johannes decides to compromise: Basically, the concepts will be
+organized as a tree. However, he will selectively add connections between
+concepts that are related, but which appear on different levels or branches of
+the tree.
+
+Johannes starts with a tree-like list of concepts that he feels are important
+in Computational Complexity:
+%
+\begin{itemize}
+ \item Computational Problems
+ \begin{itemize}\itemsep=0pt\parskip=0pt
+ \item Problem Measures
+ \item Problem Aspects
+ \item Problem Domains
+ \item Key Problems
+ \end{itemize}
+ \item Computational Models
+ \begin{itemize}\itemsep=0pt\parskip=0pt
+ \item Turing Machines
+ \item Random-Access Machines
+ \item Circuits
+ \item Binary Decision Diagrams
+ \item Oracle Machines
+ \item Programming in Logic
+ \end{itemize}
+ \item Measuring Complexity
+ \begin{itemize}\itemsep=0pt\parskip=0pt
+ \item Complexity Measures
+ \item Classifying Complexity
+ \item Comparing Complexity
+ \item Describing Complexity
+ \end{itemize}
+ \item Solving Problems
+ \begin{itemize}\itemsep=0pt\parskip=0pt
+ \item Exact Algorithms
+ \item Randomization
+ \item Fixed-Parameter Algorithms
+ \item Parallel Computation
+ \item Partial Solutions
+ \item Approximation
+ \end{itemize}
+\end{itemize}
+
+Johannes will surely need to modify this list later on, but it looks good as a
+first approximation. He will also need to add a number of subtopics (like
+\emph{lots} of complexity classes under the topic ``classifying complexity''),
+but he will do this as he constructs the map.
+
+Turning the list of topics into a \tikzname-tree is easy, in principle. The
+basic idea is that a node can have \emph{children}, which in turn can have
+children of their own, and so on. To add a child to a node, Johannes can simply
+write |child {|\meta{node}|}| right after a node. The \meta{node} should, in
+turn, be the code for creating a node. To add another node, Johannes can use
+|child| once more, and so on. Johannes is eager to try out this construct and
+writes down the following:
+%
+\begin{codeexample}[]
+\tikz
+ \node {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ child { node {Problem Domains} }
+ child { node {Key Problems} }
+ }
+ child { node {Computational Models}
+ child { node {Turing Machines} }
+ child { node {Random-Access Machines} }
+ child { node {Circuits} }
+ child { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} }
+ child { node {Programming in Logic} }
+ }
+ child { node {Measuring Complexity}
+ child { node {Complexity Measures} }
+ child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} }
+ child { node {Describing Complexity} }
+ }
+ child { node {Solving Problems}
+ child { node {Exact Algorithms} }
+ child { node {Randomization} }
+ child { node {Fixed-Parameter Algorithms} }
+ child { node {Parallel Computation} }
+ child { node {Partial Solutions} }
+ child { node {Approximation} }
+ };
+\end{codeexample}
+
+Well, that did not quite work out as expected (although, what, exactly, did one
+expect?). There are two problems:
+%
+\begin{enumerate}
+ \item The overlap of the nodes is due to the fact that \tikzname\ is not
+ particularly smart when it comes to placing child nodes. Even though
+ it is possible to configure \tikzname\ to use rather clever placement
+ methods, \tikzname\ has no way of taking the actual size of the child
+ nodes into account. This may seem strange but the reason is that the
+ child nodes are rendered and placed one at a time, so the size of the
+ last node is not known when the first node is being processed. In
+ essence, you have to specify appropriate level and sibling node
+ spacings ``by hand''.
+ \item The standard computer-science-top-down rendering of a tree is
+ rather ill-suited to visualizing the concepts. It would be better to
+ either rotate the map by ninety degrees or, even better, to use some
+ sort of circular arrangement.
+\end{enumerate}
+
+Johannes redraws the tree, but this time with some more appropriate options
+set, which he found more or less by trial-and-error:
+%
+\begin{codeexample}[render instead={
+\tikz [font=\footnotesize,
+ grow=right, level 1/.style={sibling distance=6em},
+ level 2/.style={sibling distance=1em}, level distance=5cm]
+ \node {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} } child { node {Problem Aspects} }
+ child { node {Problem Domains} } child { node {Key Problems} }
+ }
+ child { node {Computational Models}
+ child { node {Turing Machines} } child { node {Random-Access Machines} }
+ child { node {Circuits} } child { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} } child { node {Programming in Logic} }
+ }
+ child { node {Measuring Complexity}
+ child { node {Complexity Measures} } child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} } child { node {Describing Complexity} }
+ }
+ child { node {Solving Problems}
+ child { node {Exact Algorithms} } child { node {Randomization} }
+ child { node {Fixed-Parameter Algorithms} } child { node {Parallel Computation} }
+ child { node {Partial Solutions} } child { node {Approximation} }
+ };
+ }]
+\tikz [font=\footnotesize,
+ grow=right, level 1/.style={sibling distance=6em},
+ level 2/.style={sibling distance=1em}, level distance=5cm]
+ \node {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ ... % as before
+\end{codeexample}
+
+Still not quite what Johannes had in mind, but he is getting somewhere.
+
+For configuring the tree, two parameters are of particular importance: The
+|level distance| tells \tikzname\ the distance between (the centers of) the
+nodes on adjacent levels or layers of a tree. The |sibling distance| is, as the
+name suggests, the distance between (the centers of) siblings of the tree.
+
+You can globally set these parameters for a tree by simply setting them
+somewhere before the tree starts, but you will typically wish them to be
+different for different levels of the tree. In this case, you should set styles
+like |level 1| or |level 2|. For the first level of the tree, the |level 1|
+style is used, for the second level the |level 2| style, and so on. You can
+also set the sibling and level distances only for certain nodes by passing
+these options to the |child| command as options. (Note that the options of a
+|node| command are local to the node and have no effect on the children. Also
+note that it is possible to specify options that do have an effect on the
+children. Finally note that specifying options for children ``at the right
+place'' is an arcane art and you should peruse
+Section~\ref{section-tree-options} on a rainy Sunday afternoon, if you are
+really interested.)
+
+The |grow| key is used to configure the direction in which a tree grows. You
+can change growth direction ``in the middle of a tree'' simply by changing this
+key for a single child or a whole level. By including the |trees| library you
+also get access to additional growth strategies such as a ``circular'' growth:
+%
+\begin{codeexample}[render instead={
+\tikz [text width=2.7cm, align=flush center,
+ grow cyclic,
+ level 1/.style={level distance=2.5cm,sibling angle=90},
+ level 2/.style={text width=2cm, font=\footnotesize, level distance=3cm,sibling angle=30}]
+ \node[font=\bfseries] {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} } child { node {Problem Aspects} }
+ child { node {Problem Domains} } child { node {Key Problems} }
+ }
+ child { node {Computational Models}
+ child { node {Turing Machines} } child { node {Random-Access Machines} }
+ child { node {Circuits} } child { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} } child { node {Programming in Logic} }
+ }
+ child { node {Measuring Complexity}
+ child { node {Complexity Measures} } child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} } child { node {Describing Complexity} }
+ }
+ child { node {Solving Problems}
+ child { node {Exact Algorithms} } child { node {Randomization} }
+ child { node {Fixed-Parameter Algorithms} } child { node {Parallel Computation} }
+ child { node {Partial Solutions} } child { node {Approximation} }
+ };
+ }]
+\tikz [text width=2.7cm, align=flush center,
+ grow cyclic,
+ level 1/.style={level distance=2.5cm,sibling angle=90},
+ level 2/.style={text width=2cm, font=\footnotesize, level distance=3cm,sibling angle=30}]
+ \node[font=\bfseries] {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ ... % as before
+\end{codeexample}
+
+Johannes is pleased to learn that he can access and manipulate the nodes of the
+tree like any normal node. In particular, he can name them using the |name=|
+option or the |(|\meta{name}|)| notation and he can use any available shape or
+style for the trees nodes. He can connect trees later on using the normal
+|\draw (some node) -- (another node);| syntax. In essence, the |child| command
+just computes an appropriate position for a node and adds a line from the child
+to the parent node.
+
+
+\subsection{Creating the Lecture Map}
+
+Johannes now has a first possible layout for his lecture map. The next step is
+to make it ``look nicer''. For this, the |mindmap| library is helpful since it
+makes a number of styles available that will make a tree look like a nice
+``mind map'' or ``concept map''.
+
+The first step is to include the |mindmap| library, which Johannes already did.
+Next, he must add one of the following options to a scope that will contain the
+lecture map: |mindmap| or |large mindmap| or |huge mindmap|. These options all
+have the same effect, except that for a |large mindmap| the predefined font
+size and node sizes are somewhat larger than for a standard |mindmap| and for a
+|huge mindmap| they are even larger. So, a |large mindmap| does not necessarily
+need to have a lot of concepts, but it will need a lot of paper.
+
+The second step is to add the |concept| option to every node that will, indeed,
+be a concept of the mindmap. The idea is that some nodes of a tree will be real
+concepts, while other nodes might just be ``simple children''. Typically, this
+is not the case, so you might consider saying |every node/.style=concept|.
+
+The third step is to set up the sibling \emph{angle} (rather than a sibling
+distance) to specify the angle between sibling concepts.
+%
+\begin{codeexample}[render instead={
+\tikz [mindmap, every node/.style=concept, concept color=black!20,
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90},
+ level 2/.append style={level distance=3cm,sibling angle=45}]
+ \node [root concept] {Computational Complexity} % root
+ child { node {\hbox to 2cm{Computational\hss} Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ child { node {Problem Domains} }
+ child { node {Key Problems} }
+ }
+ child { node {\hbox to 2cm{Computational\hss} Models}
+ child { node {Turing Machines} }
+ child { node {Random-Access Machines} }
+ child { node {Circuits} }
+ child { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} }
+ child { node {\hbox to1.5cm{Programming\hss} in Logic} }
+ }
+ child { node {Measuring Complexity}
+ child { node {Complexity Measures} }
+ child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} }
+ child { node {Describing Complexity} }
+ }
+ child { node {Solving Problems}
+ child { node {Exact Algorithms} }
+ child { node {\hbox to 1.5cm{Randomization\hss}} }
+ child { node {Fixed-Parameter Algorithms} }
+ child { node {Parallel Computation} }
+ child { node {Partial Solutions} }
+ child { node {\hbox to1.5cm{Approximation\hss}} }
+ };}]
+\tikz [mindmap, every node/.style=concept, concept color=black!20,
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90},
+ level 2/.append style={level distance=3cm,sibling angle=45}]
+ \node [root concept] {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ ... % as before
+\end{codeexample}
+
+When Johannes typesets the above map, \TeX\ (rightfully) starts complaining
+about several overfull boxes and, indeed, words like ``Randomization'' stretch
+out beyond the circle of the concept. This seems a bit mysterious at first
+sight: Why does \TeX\ not hyphenate the word? The reason is that \TeX\ will
+never hyphenate the first word of a paragraph because it starts looking for
+``hyphenatable'' letters only after a so-called glue. In order to have \TeX\
+hyphenate these single words, Johannes must use a bit of evil trickery: He
+inserts a |\hskip0pt| before the word. This has no effect except for inserting
+an (invisible) glue before the word and, thereby, allowing \TeX\ to hyphenate
+the first word also. Since Johannes does not want to add |\hskip0pt| inside
+each node, he uses the |execute at begin node| option to make \tikzname\ insert
+this text with every node.
+%
+\begin{codeexample}[render instead={
+\begin{tikzpicture}
+ [mindmap,
+ every node/.style={concept, execute at begin node=\hskip0pt},
+ concept color=black!20,
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90},
+ level 2/.append style={level distance=3cm,sibling angle=45}]
+ \clip (-1,2) rectangle ++ (-4,5);
+ \node [root concept] {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ child { node {Problem Domains} }
+ child { node {Key Problems} }
+ }
+ child { node {Computational Models}
+ child { node {Turing Machines} }
+ child { node {Random-Access Machines} }
+ child { node {Circuits} }
+ child { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} }
+ child { node {Programming in Logic} }
+ }
+ child { node {Measuring Complexity}
+ child { node {Complexity Measures} }
+ child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} }
+ child { node {Describing Complexity} }
+ }
+ child { node {Solving Problems}
+ child { node {Exact Algorithms} }
+ child { node {Randomization} }
+ child { node {Fixed-Parameter Algorithms} }
+ child { node {Parallel Computation} }
+ child { node {Partial Solutions} }
+ child { node {Approximation} }
+ };
+\end{tikzpicture}
+}]
+\begin{tikzpicture}
+ [mindmap,
+ every node/.style={concept, execute at begin node=\hskip0pt},
+ concept color=black!20,
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90},
+ level 2/.append style={level distance=3cm,sibling angle=45}]
+ \clip (-1,2) rectangle ++ (-4,5);
+ \node [root concept] {Computational Complexity} % root
+ child { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ ... % as before
+\end{tikzpicture}
+\end{codeexample}
+
+In the above example a clipping was used to show only part of the lecture map,
+in order to save space. The same will be done in the following examples, we
+return to the complete lecture map at the end of this tutorial.
+
+Johannes is now eager to colorize the map. The idea is to use different colors
+for different parts of the map. He can then, during his lectures, talk about
+the ``green'' or the ``red'' topics. This will make it easier for his students
+to locate the topic he is talking about on the map. Since ``computational
+problems'' somehow sounds ``problematic'', Johannes chooses red for them, while
+he picks green for the ``solving problems''. The topics ``measuring
+complexity'' and ``computational models'' get more neutral colors; Johannes
+picks orange and blue.
+
+To set the colors, Johannes must use the |concept color| option, rather than
+just, say, |node [fill=red]|. Setting just the fill color to |red| would,
+indeed, make the node red, but it would \emph{just} make the node red and not
+the bar connecting the concept to its parent and also not its children. By
+comparison, the special |concept color| option will not only set the color of
+the node and its children, but it will also (magically) create appropriate
+shadings so that the color of a parent concept smoothly changes to the color of
+a child concept.
+
+For the root concept Johannes decides to do something special: He sets the
+concept color to black, sets the line width to a large value, and sets the fill
+color to white. The effect of this is that the root concept will be encircled
+with a thick black line and the children are connected to the central concept
+via bars.
+%
+\begin{codeexample}[render instead={
+\begin{tikzpicture}
+ [mindmap,
+ every node/.style={concept, execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black,
+ fill=white, line width=1ex,
+ text=black},
+ text=white,
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90},
+ level 2/.append style={level distance=3cm,sibling angle=45}]
+ \clip (0,-1) rectangle ++(4,5);
+ \node [root concept] {Computational Complexity} % root
+ child [concept color=red] { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ child { node {Problem Domains} }
+ child { node {Key Problems} }
+ }
+ child [concept color=blue] { node {Computational Models}
+ child { node {Turing Machines} }
+ child { node {Random-Access Machines} }
+ child { node {Circuits} }
+ child { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} }
+ child { node {Programming in Logic} }
+ }
+ child [concept color=orange] { node {Measuring Complexity}
+ child { node {Complexity Measures} }
+ child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} }
+ child { node {Describing Complexity} }
+ }
+ child [concept color=green!50!black] { node {Solving Problems}
+ child { node {Exact Algorithms} }
+ child { node {Randomization} }
+ child { node {Fixed-Parameter Algorithms} }
+ child { node {Parallel Computation} }
+ child { node {Partial Solutions} }
+ child { node {Approximation} }
+ };
+ \end{tikzpicture}}]
+\begin{tikzpicture}
+ [mindmap,
+ every node/.style={concept, execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black, fill=white, line width=1ex, text=black},
+ text=white,
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90},
+ level 2/.append style={level distance=3cm,sibling angle=45}]
+ \clip (0,-1) rectangle ++(4,5);
+ \node [root concept] {Computational Complexity} % root
+ child [concept color=red] { node {Computational Problems}
+ child { node {Problem Measures} }
+ ... % as before
+ }
+ child [concept color=blue] { node {Computational Models}
+ child { node {Turing Machines} }
+ ... % as before
+ }
+ child [concept color=orange] { node {Measuring Complexity}
+ child { node {Complexity Measures} }
+ ... % as before
+ }
+ child [concept color=green!50!black] { node {Solving Problems}
+ child { node {Exact Algorithms} }
+ ... % as before
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Johannes adds three finishing touches: First, he changes the font of the main
+concepts to small caps. Second, he decides that some concepts should be
+``faded'', namely those that are important in principle and belong on the map,
+but which he will not talk about in his lecture. To achieve this, Johannes
+defines four styles, one for each of the four main branches. These styles (a)
+set up the correct concept color for the whole branch and (b) define the
+|faded| style appropriately for this branch. Third, he adds a
+|circular drop shadow|, defined in the |shadows| library, to the concepts, just
+to make things look a bit more fancy.
+%
+\begin{codeexample}[render instead={
+\begin{tikzpicture}[mindmap]
+ \begin{scope}[
+ every node/.style={concept, circular drop shadow,execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black,
+ fill=white, line width=1ex,
+ text=black, font=\large\scshape},
+ text=white,
+ computational problems/.style={concept color=red,faded/.style={concept color=red!50}},
+ computational models/.style={concept color=blue,faded/.style={concept color=blue!50}},
+ measuring complexity/.style={concept color=orange,faded/.style={concept color=orange!50}},
+ solving problems/.style={concept color=green!50!black,faded/.style={concept color=green!50!black!50}},
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90,font=\scshape},
+ level 2/.append style={level distance=3cm,sibling angle=45,font=\scriptsize}]
+ \node [root concept] {Computational Complexity} % root
+ child [computational problems] { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ child [faded] { node {Problem Domains} }
+ child { node {Key Problems} }
+ }
+ child [computational models] { node {Computational Models}
+ child { node {Turing Machines} }
+ child [faded] { node {Random-Access Machines} }
+ child { node {Circuits} }
+ child [faded] { node {Binary Decision Diagrams} }
+ child { node {Oracle Machines} }
+ child { node {Programming in Logic} }
+ }
+ child [measuring complexity] { node {Measuring Complexity}
+ child { node {Complexity Measures} }
+ child { node {Classifying Complexity} }
+ child { node {Comparing Complexity} }
+ child [faded] { node {Describing Complexity} }
+ }
+ child [solving problems] { node {Solving Problems}
+ child { node {Exact Algorithms} }
+ child { node {Randomization} }
+ child { node {Fixed-Parameter Algorithms} }
+ child { node {Parallel Computation} }
+ child { node {Partial Solutions} }
+ child { node {Approximation} }
+ };
+ \end{scope}
+\end{tikzpicture}}]
+\begin{tikzpicture}[mindmap]
+ \begin{scope}[
+ every node/.style={concept, circular drop shadow,execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black, fill=white, line width=1ex, text=black, font=\large\scshape},
+ text=white,
+ computational problems/.style={concept color=red,faded/.style={concept color=red!50}},
+ computational models/.style={concept color=blue,faded/.style={concept color=blue!50}},
+ measuring complexity/.style={concept color=orange,faded/.style={concept color=orange!50}},
+ solving problems/.style={concept color=green!50!black,faded/.style={concept color=green!50!black!50}},
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90,font=\scshape},
+ level 2/.append style={level distance=3cm,sibling angle=45,font=\scriptsize}]
+ \node [root concept] {Computational Complexity} % root
+ child [computational problems] { node {Computational Problems}
+ child { node {Problem Measures} }
+ child { node {Problem Aspects} }
+ child [faded] { node {Problem Domains} }
+ child { node {Key Problems} }
+ }
+ child [computational models] { node {Computational Models}
+ child { node {Turing Machines} }
+ child [faded] { node {Random-Access Machines} }
+ ...
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Adding the Lecture Annotations}
+
+Johannes will give about a dozen lectures during the course ``computational
+complexity''. For each lecture he has compiled a (short) list of learning
+targets that state what knowledge and qualifications his students should
+acquire during this particular lecture (note that learning targets are not the
+same as the contents of a lecture). For each lecture he intends to put a little
+rectangle on the map containing these learning targets and the name of the
+lecture, each time somewhere near the topic of the lecture. Such ``little
+rectangles'' are called ``annotations'' by the mindmap library.
+
+In order to place the annotations next to the concepts, Johannes must assign
+names to the nodes of the concepts. He could rely on \tikzname's automatic
+naming of the nodes in a tree, where the children of a node named |root| are
+named |root-1|, |root-2|, |root-3|, and so on. However, since Johannes is not
+sure about the final order of the concepts in the tree, it seems better to
+explicitly name all concepts of the tree in the following manner:
+%
+\begin{codeexample}[code only]
+\node [root concept] (Computational Complexity) {Computational Complexity}
+ child [computational problems] { node (Computational Problems) {Computational Problems}
+ child { node (Problem Measures) {Problem Measures} }
+ child { node (Problem Aspects) {Problem Aspects} }
+ child [faded] { node (Problem Domains) {Problem Domains} }
+ child { node (Key Problems) {Key Problems} }
+ }
+...
+\end{codeexample}
+
+The |annotation| style of the mind map library mainly sets up a rectangular
+shape of appropriate size. Johannes configures the style by defining
+|every annotation| appropriately.
+%
+\begin{codeexample}[render instead={
+\begin{tikzpicture}[mindmap]
+ \clip (-5.25,-3) rectangle ++ (4,5);
+ \begin{scope}[
+ every node/.style={concept, circular drop shadow,execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black,
+ fill=white, line width=1ex,
+ text=black, font=\large\scshape},
+ text=white,
+ computational problems/.style={concept color=red,faded/.style={concept color=red!50}},
+ computational models/.style={concept color=blue,faded/.style={concept color=blue!50}},
+ measuring complexity/.style={concept color=orange,faded/.style={concept color=orange!50}},
+ solving problems/.style={concept color=green!50!black,faded/.style={concept color=green!50!black!50}},
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90,font=\scshape},
+ level 2/.append style={level distance=3cm,sibling angle=45,font=\scriptsize}]
+ \node [root concept] (Computational Complexity) {Computational Complexity} % root
+ child [computational problems] { node (Computational Problems) {Computational Problems}
+ child { node (Problem Measures) {Problem Measures} }
+ child { node (Problem Aspects) {Problem Aspects} }
+ child [faded] { node (problem Domains) {Problem Domains} }
+ child { node (Key Problems) {Key Problems} }
+ }
+ child [computational models] { node (Computational Models) {Computational Models}
+ child { node (Turing Machines) {Turing Machines} }
+ child [faded] { node (Random-Access Machines) {Random-Access Machines} }
+ child { node (Circuits) {Circuits} }
+ child [faded] { node (Binary Decision Diagrams) {Binary Decision Diagrams} }
+ child { node (Oracle Machines) {Oracle Machines} }
+ child { node (Programming in Logic) {Programming in Logic} }
+ }
+ child [measuring complexity] { node (Measuring Complexity) {Measuring Complexity}
+ child { node (Complexity Measures) {Complexity Measures} }
+ child { node (Classifying Complexity) {Classifying Complexity} }
+ child { node (Comparing Complexity) {Comparing Complexity} }
+ child [faded] { node (Describing Complexity) {Describing Complexity} }
+ }
+ child [solving problems] { node (Solving Problems) {Solving Problems}
+ child { node (Exact Algorithms) {Exact Algorithms} }
+ child { node (Randomization) {Randomization} }
+ child { node (Fixed-Parameter Algorithms) {Fixed-Parameter Algorithms} }
+ child { node (Parallel Computation) {Parallel Computation} }
+ child { node (Partial Solutions) {Partial Solutions} }
+ child { node (Approximation) {Approximation} }
+ };
+ \end{scope}
+ \begin{scope}[every annotation/.style={fill=black!40}]
+ \node [annotation, above] at (Computational Problems.north) {
+ Lecture 1: Computational Problems
+ \begin{itemize}
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ \end{itemize}
+ };
+ \end{scope}
+\end{tikzpicture}}]
+\begin{tikzpicture}[mindmap]
+ \clip (-5,-5) rectangle ++ (4,5);
+ \begin{scope}[
+ every node/.style={concept, circular drop shadow, ...}] % as before
+ \node [root concept] (Computational Complexity) ... % as before
+ \end{scope}
+
+ \begin{scope}[every annotation/.style={fill=black!40}]
+ \node [annotation, above] at (Computational Problems.north) {
+ Lecture 1: Computational Problems
+ \begin{itemize}
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ \end{itemize}
+ };
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+
+Well, that does not yet look quite perfect. The spacing or the |{itemize}| is
+not really appropriate and the node is too large. Johannes can configure these
+things ``by hand'', but it seems like a good idea to define a macro that will
+take care of these things for him. The ``right'' way to do this is to define a
+|\lecture| macro that takes a list of key--value pairs as argument and produces
+the desired annotation. However, to keep things simple, Johannes' |\lecture|
+macro simply takes a fixed number of arguments having the following meaning:
+The first argument is the number of the lecture, the second is the name of the
+lecture, the third are positioning options like |above|, the fourth is the
+position where the node is placed, the fifth is the list of items to be shown,
+and the sixth is a date when the lecture will be held (this parameter is not
+yet needed, we will, however, need it later on).
+%
+\begin{codeexample}[code only]
+\def\lecture#1#2#3#4#5#6{
+ \node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm] at (#4) {
+ Lecture #1: \textcolor{orange}{\textbf{#2}}
+ \list{--}{\topsep=2pt\itemsep=0pt\parsep=0pt
+ \parskip=0pt\labelwidth=8pt\leftmargin=8pt
+ \itemindent=0pt\labelsep=2pt}
+ #5
+ \endlist
+ };
+}
+\end{codeexample}
+\def\lecture#1#2#3#4#5#6{
+ \node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm] at (#4) {
+ Lecture #1: \textcolor{orange}{\textbf{#2}}
+ \list{--}{\topsep=2pt\itemsep=0pt\parsep=0pt
+ \parskip=0pt\labelwidth=8pt\leftmargin=8pt
+ \itemindent=0pt\labelsep=2pt}
+ #5
+ \endlist
+ };
+}
+
+\begin{codeexample}[render instead={
+\begin{tikzpicture}[mindmap,every annotation/.style={fill=white}]
+ \clip (-5.25,-3) rectangle ++ (4,5);
+ \begin{scope}[
+ every node/.style={concept, circular drop shadow,execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black,
+ fill=white, line width=1ex,
+ text=black, font=\large\scshape},
+ text=white,
+ computational problems/.style={concept color=red,faded/.style={concept color=red!50}},
+ computational models/.style={concept color=blue,faded/.style={concept color=blue!50}},
+ measuring complexity/.style={concept color=orange,faded/.style={concept color=orange!50}},
+ solving problems/.style={concept color=green!50!black,faded/.style={concept color=green!50!black!50}},
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90,font=\scshape},
+ level 2/.append style={level distance=3cm,sibling angle=45,font=\scriptsize}]
+ \node [root concept] (Computational Complexity) {Computational Complexity} % root
+ child [computational problems] { node (Computational Problems) {Computational Problems}
+ child { node (Problem Measures) {Problem Measures} }
+ child { node (Problem Aspects) {Problem Aspects} }
+ child [faded] { node (problem Domains) {Problem Domains} }
+ child { node (Key Problems) {Key Problems} }
+ }
+ child [computational models] { node (Computational Models) {Computational Models}
+ child { node (Turing Machines) {Turing Machines} }
+ child [faded] { node (Random-Access Machines) {Random-Access Machines} }
+ child { node (Circuits) {Circuits} }
+ child [faded] { node (Binary Decision Diagrams) {Binary Decision Diagrams} }
+ child { node (Oracle Machines) {Oracle Machines} }
+ child { node (Programming in Logic) {Programming in Logic} }
+ }
+ child [measuring complexity] { node (Measuring Complexity) {Measuring Complexity}
+ child { node (Complexity Measures) {Complexity Measures} }
+ child { node (Classifying Complexity) {Classifying Complexity} }
+ child { node (Comparing Complexity) {Comparing Complexity} }
+ child [faded] { node (Describing Complexity) {Describing Complexity} }
+ }
+ child [solving problems] { node (Solving Problems) {Solving Problems}
+ child { node (Exact Algorithms) {Exact Algorithms} }
+ child { node (Randomization) {Randomization} }
+ child { node (Fixed-Parameter Algorithms) {Fixed-Parameter Algorithms} }
+ child { node (Parallel Computation) {Parallel Computation} }
+ child { node (Partial Solutions) {Partial Solutions} }
+ child { node (Approximation) {Approximation} }
+ };
+ \end{scope}
+ \lecture{1}{Computational Problems}{above,xshift=-3mm}{Computational Problems.north}{
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ }{2009-04-08}
+\end{tikzpicture}}]
+\begin{tikzpicture}[mindmap,every annotation/.style={fill=white}]
+ \clip (-5,-5) rectangle ++ (4,5);
+ \begin{scope}[
+ every node/.style={concept, circular drop shadow, ... % as before
+ \node [root concept] (Computational Complexity) ... % as before
+ \end{scope}
+
+ \lecture{1}{Computational Problems}{above,xshift=-3mm}
+ {Computational Problems.north}{
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ }{2009-04-08}
+\end{tikzpicture}
+\end{codeexample}
+
+In the same fashion Johannes can now add the other lecture annotations.
+Obviously, Johannes will have some trouble fitting everything on a single
+A4-sized page, but by adjusting the spacing and some experimentation he can
+quickly arrange all the annotations as needed.
+
+
+\subsection{Adding the Background}
+
+Johannes has already used colors to organize his lecture map into four regions,
+each having a different color. In order to emphasize these regions even more
+strongly, he wishes to add a background coloring to each of these regions.
+
+Adding these background colors turns out to be more tricky than Johannes would
+have thought. At first sight, what he needs is some sort of ``color wheel''
+that is blue in the lower right direction and then changes smoothly to orange
+in the upper right direction and then to green in the upper left direction and
+so on. Unfortunately, there is no easy way of creating such a color wheel
+shading (although it can be done, in principle, but only at a very high cost,
+see page~\pageref{shading-color-wheel} for an example).
+
+Johannes decides to do something a bit more basic: He creates four large
+rectangles, one for each of the four quadrants around the central concept, each
+colored with a light version of the quadrant. Then, in order to ``smooth'' the
+change between adjacent rectangles, he puts four shadings on top of them.
+
+Since these background rectangles should go ``behind'' everything else,
+Johannes puts all his background stuff on the |background| layer.
+
+In the following code, only the central concept is shown to save some space:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[
+ mindmap,
+ concept color=black,
+ root concept/.append style={
+ concept,
+ circular drop shadow,
+ fill=white, line width=1ex,
+ text=black, font=\large\scshape}
+ ]
+
+ \clip (-1.5,-5) rectangle ++(4,10);
+
+ \node [root concept] (Computational Complexity) {Computational Complexity};
+
+ \begin{pgfonlayer}{background}
+ \clip (-1.5,-5) rectangle ++(4,10);
+
+ \colorlet{upperleft}{green!50!black!25}
+ \colorlet{upperright}{orange!25}
+ \colorlet{lowerleft}{red!25}
+ \colorlet{lowerright}{blue!25}
+
+ % The large rectangles:
+ \fill [upperleft] (Computational Complexity) rectangle ++(-20,20);
+ \fill [upperright] (Computational Complexity) rectangle ++(20,20);
+ \fill [lowerleft] (Computational Complexity) rectangle ++(-20,-20);
+ \fill [lowerright] (Computational Complexity) rectangle ++(20,-20);
+
+ % The shadings:
+ \shade [left color=upperleft,right color=upperright]
+ ([xshift=-1cm]Computational Complexity) rectangle ++(2,20);
+ \shade [left color=lowerleft,right color=lowerright]
+ ([xshift=-1cm]Computational Complexity) rectangle ++(2,-20);
+ \shade [top color=upperleft,bottom color=lowerleft]
+ ([yshift=-1cm]Computational Complexity) rectangle ++(-20,2);
+ \shade [top color=upperright,bottom color=lowerright]
+ ([yshift=-1cm]Computational Complexity) rectangle ++(20,2);
+ \end{pgfonlayer}
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Adding the Calendar}
+
+Johannes intends to plan his lecture rather carefully. In particular, he
+already knows when each of his lectures will be held during the course.
+Naturally, this does not mean that Johannes will slavishly follow the plan and
+he might need longer for some subjects than he anticipated, but nevertheless he
+has a detailed plan of when which subject will be addressed.
+
+Johannes intends to share this plan with his students by adding a calendar to
+the lecture map. In addition to serving as a reference on which particular day
+a certain topic will be addressed, the calendar is also useful to show the
+overall chronological order of the course.
+
+In order to add a calendar to a \tikzname\ graphic, the |calendar| library is
+most useful. The library provides the |\calendar| command, which takes a large
+number of options and which can be configured in many ways to produce just
+about any kind of calendar imaginable. For Johannes' purposes, a simple
+|day list downward| will be a nice option since it produces a list of days that
+go ``downward''.
+%
+\begin{codeexample}[leave comments]
+\tiny
+\begin{tikzpicture}
+ \calendar [day list downward,
+ name=cal,
+ dates=2009-04-01 to 2009-04-14]
+ if (weekend)
+ [black!25];
+\end{tikzpicture}
+\end{codeexample}
+
+Using the |name| option, we gave a name to the calendar, which will allow us to
+reference the nodes that make up the individual days of the calendar later on.
+For instance, the rectangular node containing the |1| that represents April
+1st, 2009, can be referenced as |(cal-2009-04-01)|. The |dates| option is used
+to specify an interval for which the calendar should be drawn. Johannes will
+need several months in his calendar, but the above example only shows two weeks
+to save some space.
+
+Note the |if (weekend)| construct. The |\calendar| command is followed by
+options and then by |if|-statements. These |if|-statements are checked for each
+day of the calendar and when a date passes this test, the options or the code
+following the |if|-statement is executed. In the above example, we make weekend
+days (Saturdays and Sundays, to be precise) lighter than normal days. (Use your
+favorite calendar to check that, indeed, April 5th, 2009, is a Sunday.)
+
+As mentioned above, Johannes can reference the nodes that are used to typeset
+days. Recall that his |\lecture| macro already got passed a date, which we did
+not use, yet. We can now use it to place the lecture's title next to the date
+when the lecture will be held:
+%
+\begin{codeexample}[code only]
+\def\lecture#1#2#3#4#5#6{
+ % As before:
+ \node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm] at (#4) {
+ Lecture #1: \textcolor{orange}{\textbf{#2}}
+ \list{--}{\topsep=2pt\itemsep=0pt\parsep=0pt
+ \parskip=0pt\labelwidth=8pt\leftmargin=8pt
+ \itemindent=0pt\labelsep=2pt}
+ #5
+ \endlist
+ };
+ % New:
+ \node [anchor=base west] at (cal-#6.base east) {\textcolor{orange}{\textbf{#2}}};
+}
+\end{codeexample}
+\def\lecture#1#2#3#4#5#6{
+ \node [anchor=base west] at (cal-#6.base east) {\textcolor{orange}{\textbf{#2}}};
+}
+
+Johannes can now use this new |\lecture| command as follows (in the example,
+only the new part of the definition is used):
+%
+\begin{codeexample}[]
+\tiny
+\begin{tikzpicture}
+ \calendar [day list downward,
+ name=cal,
+ dates=2009-04-01 to 2009-04-14]
+ if (weekend)
+ [black!25];
+
+ % As before:
+ \lecture{1}{Computational Problems}{above,xshift=-3mm}
+ {Computational Problems.north}{
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ }{2009-04-08}
+\end{tikzpicture}
+\end{codeexample}
+
+As a final step, Johannes needs to add a few more options to the calendar
+command: He uses the |month text| option to configure how the text of a month
+is rendered (see Section~\ref{section-calender} for details) and then typesets
+the month text at a special position at the beginning of each month.
+%
+\begin{codeexample}[leave comments]
+\tiny
+\begin{tikzpicture}
+ \calendar [day list downward,
+ month text=\%mt\ \%y0,
+ month yshift=3.5em,
+ name=cal,
+ dates=2009-04-01 to 2009-05-01]
+ if (weekend)
+ [black!25]
+ if (day of month=1) {
+ \node at (0pt,1.5em) [anchor=base west] {\small\tikzmonthtext};
+ };
+
+ \lecture{1}{Computational Problems}{above,xshift=-3mm}
+ {Computational Problems.north}{
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ }{2009-04-08}
+
+ \lecture{2}{Computational Models}{above,xshift=-3mm}
+ {Computational Models.north}{
+ \item Knowledge of Turing machines
+ \item Being able to compare the computational power of different
+ models
+ }{2009-04-15}
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{The Complete Code}
+
+Putting it all together, Johannes gets the following code:
+
+First comes the definition of the |\lecture| command:
+%
+\begin{codeexample}[code only]
+\def\lecture#1#2#3#4#5#6{
+ % As before:
+ \node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm, fill=white] at (#4) {
+ Lecture #1: \textcolor{orange}{\textbf{#2}}
+ \list{--}{\topsep=2pt\itemsep=0pt\parsep=0pt
+ \parskip=0pt\labelwidth=8pt\leftmargin=8pt
+ \itemindent=0pt\labelsep=2pt}
+ #5
+ \endlist
+ };
+ % New:
+ \node [anchor=base west] at (cal-#6.base east) {\textcolor{orange}{\textbf{#2}}};
+}
+\end{codeexample}
+
+This is followed by the main mindmap setup\dots
+%
+\begin{codeexample}[code only]
+\noindent
+\begin{tikzpicture}
+ \begin{scope}[
+ mindmap,
+ every node/.style={concept, circular drop shadow,execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black,
+ fill=white, line width=1ex,
+ text=black, font=\large\scshape},
+ text=white,
+ computational problems/.style={concept color=red,faded/.style={concept color=red!50}},
+ computational models/.style={concept color=blue,faded/.style={concept color=blue!50}},
+ measuring complexity/.style={concept color=orange,faded/.style={concept color=orange!50}},
+ solving problems/.style={concept color=green!50!black,faded/.style={concept color=green!50!black!50}},
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90,font=\scshape},
+ level 2/.append style={level distance=3cm,sibling angle=45,font=\scriptsize}]
+\end{codeexample}
+\dots and contents:
+\begin{codeexample}[code only]
+ \node [root concept] (Computational Complexity) {Computational Complexity} % root
+ child [computational problems] { node [yshift=-1cm] (Computational Problems) {Computational Problems}
+ child { node (Problem Measures) {Problem Measures} }
+ child { node (Problem Aspects) {Problem Aspects} }
+ child [faded] { node (problem Domains) {Problem Domains} }
+ child { node (Key Problems) {Key Problems} }
+ }
+ child [computational models] { node [yshift=-1cm] (Computational Models) {Computational Models}
+ child { node (Turing Machines) {Turing Machines} }
+ child [faded] { node (Random-Access Machines) {Random-Access Machines} }
+ child { node (Circuits) {Circuits} }
+ child [faded] { node (Binary Decision Diagrams) {Binary Decision Diagrams} }
+ child { node (Oracle Machines) {Oracle Machines} }
+ child { node (Programming in Logic) {Programming in Logic} }
+ }
+ child [measuring complexity] { node [yshift=1cm] (Measuring Complexity) {Measuring Complexity}
+ child { node (Complexity Measures) {Complexity Measures} }
+ child { node (Classifying Complexity) {Classifying Complexity} }
+ child { node (Comparing Complexity) {Comparing Complexity} }
+ child [faded] { node (Describing Complexity) {Describing Complexity} }
+ }
+ child [solving problems] { node [yshift=1cm] (Solving Problems) {Solving Problems}
+ child { node (Exact Algorithms) {Exact Algorithms} }
+ child { node (Randomization) {Randomization} }
+ child { node (Fixed-Parameter Algorithms) {Fixed-Parameter Algorithms} }
+ child { node (Parallel Computation) {Parallel Computation} }
+ child { node (Partial Solutions) {Partial Solutions} }
+ child { node (Approximation) {Approximation} }
+ };
+ \end{scope}
+\end{codeexample}
+%
+Now comes the calendar code:
+%
+\begin{codeexample}[code only]
+ \tiny
+ \calendar [day list downward,
+ month text=\%mt\ \%y0,
+ month yshift=3.5em,
+ name=cal,
+ at={(-.5\textwidth-5mm,.5\textheight-1cm)},
+ dates=2009-04-01 to 2009-06-last]
+ if (weekend)
+ [black!25]
+ if (day of month=1) {
+ \node at (0pt,1.5em) [anchor=base west] {\small\tikzmonthtext};
+ };
+\end{codeexample}
+%
+The lecture annotations:
+%
+\begin{codeexample}[code only]
+ \lecture{1}{Computational Problems}{above,xshift=-5mm,yshift=5mm}{Computational Problems.north}{
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ }{2009-04-08}
+
+ \lecture{2}{Computational Models}{above left}
+ {Computational Models.west}{
+ \item Knowledge of Turing machines
+ \item Being able to compare the computational power of different
+ models
+ }{2009-04-15}
+\end{codeexample}
+%
+Finally, the background:
+%
+\begin{codeexample}[code only]
+ \begin{pgfonlayer}{background}
+ \clip[xshift=-1cm] (-.5\textwidth,-.5\textheight) rectangle ++(\textwidth,\textheight);
+
+ \colorlet{upperleft}{green!50!black!25}
+ \colorlet{upperright}{orange!25}
+ \colorlet{lowerleft}{red!25}
+ \colorlet{lowerright}{blue!25}
+
+ % The large rectangles:
+ \fill [upperleft] (Computational Complexity) rectangle ++(-20,20);
+ \fill [upperright] (Computational Complexity) rectangle ++(20,20);
+ \fill [lowerleft] (Computational Complexity) rectangle ++(-20,-20);
+ \fill [lowerright] (Computational Complexity) rectangle ++(20,-20);
+
+ % The shadings:
+ \shade [left color=upperleft,right color=upperright]
+ ([xshift=-1cm]Computational Complexity) rectangle ++(2,20);
+ \shade [left color=lowerleft,right color=lowerright]
+ ([xshift=-1cm]Computational Complexity) rectangle ++(2,-20);
+ \shade [top color=upperleft,bottom color=lowerleft]
+ ([yshift=-1cm]Computational Complexity) rectangle ++(-20,2);
+ \shade [top color=upperright,bottom color=lowerright]
+ ([yshift=-1cm]Computational Complexity) rectangle ++(20,2);
+ \end{pgfonlayer}
+\end{tikzpicture}
+\end{codeexample}
+
+The next page shows the resulting lecture map in all its glory (it
+would be somewhat more glorious, if there were more lecture
+annotations, but you should get the idea).
+
+\def\lecture#1#2#3#4#5#6{
+ % As before:
+ \node [annotation, #3, scale=0.65, text width=4cm, inner sep=2mm, fill=white] at (#4) {
+ Lecture #1: \textcolor{orange}{\textbf{#2}}
+ \list{--}{\topsep=2pt\itemsep=0pt\parsep=0pt
+ \parskip=0pt\labelwidth=8pt\leftmargin=8pt
+ \itemindent=0pt\labelsep=2pt}
+ #5
+ \endlist
+ };
+ % New:
+ \node [anchor=base west] at (cal-#6.base east) {\textcolor{orange}{\textbf{#2}}};
+}
+
+\noindent
+\begin{tikzpicture}
+ \begin{scope}[
+ mindmap,
+ every node/.style={concept, circular drop shadow,execute at begin node=\hskip0pt},
+ root concept/.append style={
+ concept color=black,
+ fill=white, line width=1ex,
+ text=black, font=\large\scshape},
+ text=white,
+ computational problems/.style={concept color=red,faded/.style={concept color=red!50}},
+ computational models/.style={concept color=blue,faded/.style={concept color=blue!50}},
+ measuring complexity/.style={concept color=orange,faded/.style={concept color=orange!50}},
+ solving problems/.style={concept color=green!50!black,faded/.style={concept color=green!50!black!50}},
+ grow cyclic,
+ level 1/.append style={level distance=4.5cm,sibling angle=90,font=\scshape},
+ level 2/.append style={level distance=3cm,sibling angle=45,font=\scriptsize}]
+ \node [root concept] (Computational Complexity) {Computational Complexity} % root
+ child [computational problems] { node [yshift=-1cm] (Computational Problems) {Computational Problems}
+ child { node (Problem Measures) {Problem Measures} }
+ child { node (Problem Aspects) {Problem Aspects} }
+ child [faded] { node (problem Domains) {Problem Domains} }
+ child { node (Key Problems) {Key Problems} }
+ }
+ child [computational models] { node [yshift=-1cm] (Computational Models) {Computational Models}
+ child { node (Turing Machines) {Turing Machines} }
+ child [faded] { node (Random-Access Machines) {Random-Access Machines} }
+ child { node (Circuits) {Circuits} }
+ child [faded] { node (Binary Decision Diagrams) {Binary Decision Diagrams} }
+ child { node (Oracle Machines) {Oracle Machines} }
+ child { node (Programming in Logic) {Programming in Logic} }
+ }
+ child [measuring complexity] { node [yshift=1cm] (Measuring Complexity) {Measuring Complexity}
+ child { node (Complexity Measures) {Complexity Measures} }
+ child { node (Classifying Complexity) {Classifying Complexity} }
+ child { node (Comparing Complexity) {Comparing Complexity} }
+ child [faded] { node (Describing Complexity) {Describing Complexity} }
+ }
+ child [solving problems] { node [yshift=1cm] (Solving Problems) {Solving Problems}
+ child { node (Exact Algorithms) {Exact Algorithms} }
+ child { node (Randomization) {Randomization} }
+ child { node (Fixed-Parameter Algorithms) {Fixed-Parameter Algorithms} }
+ child { node (Parallel Computation) {Parallel Computation} }
+ child { node (Partial Solutions) {Partial Solutions} }
+ child { node (Approximation) {Approximation} }
+ };
+ \end{scope}
+
+ \tiny
+ \calendar [day list downward,
+ month text=\%mt\ \%y0,
+ month yshift=3.5em,
+ name=cal,
+ at={(-.5\textwidth-5mm,.5\textheight-1cm)},
+ dates=2009-04-01 to 2009-06-last]
+ if (weekend)
+ [black!25]
+ if (day of month=1) {
+ \node at (0pt,1.5em) [anchor=base west] {\small\tikzmonthtext};
+ };
+
+ \lecture{1}{Computational Problems}{above,xshift=-5mm,yshift=5mm}{Computational Problems.north}{
+ \item Knowledge of several key problems
+ \item Knowledge of problem encodings
+ \item Being able to formalize problems
+ }{2009-04-08}
+
+ \lecture{2}{Computational Models}{above left}
+ {Computational Models.west}{
+ \item Knowledge of Turing machines
+ \item Being able to compare the computational power of different
+ models
+ }{2009-04-15}
+
+ \begin{pgfonlayer}{background}
+ \clip[xshift=-1cm] (-.5\textwidth,-.5\textheight) rectangle ++(\textwidth,\textheight);
+
+ \colorlet{upperleft}{green!50!black!25}
+ \colorlet{upperright}{orange!25}
+ \colorlet{lowerleft}{red!25}
+ \colorlet{lowerright}{blue!25}
+
+ % The large rectangles:
+ \fill [upperleft] (Computational Complexity) rectangle ++(-20,20);
+ \fill [upperright] (Computational Complexity) rectangle ++(20,20);
+ \fill [lowerleft] (Computational Complexity) rectangle ++(-20,-20);
+ \fill [lowerright] (Computational Complexity) rectangle ++(20,-20);
+
+ % The shadings:
+ \shade [left color=upperleft,right color=upperright]
+ ([xshift=-1cm]Computational Complexity) rectangle ++(2,20);
+ \shade [left color=lowerleft,right color=lowerright]
+ ([xshift=-1cm]Computational Complexity) rectangle ++(2,-20);
+ \shade [top color=upperleft,bottom color=lowerleft]
+ ([yshift=-1cm]Computational Complexity) rectangle ++(-20,2);
+ \shade [top color=upperright,bottom color=lowerright]
+ ([yshift=-1cm]Computational Complexity) rectangle ++(20,2);
+ \end{pgfonlayer}
+\end{tikzpicture}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-nodes.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-nodes.tex
new file mode 100644
index 0000000000..26f9805b6a
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial-nodes.tex
@@ -0,0 +1,1072 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tutorial: A Petri-Net for Hagen}
+
+In this second tutorial we explore the node mechanism of \tikzname\ and
+\pgfname.
+
+Hagen must give a talk tomorrow about his favorite formalism for distributed
+systems: Petri nets! Hagen used to give his talks using a blackboard and
+everyone seemed to be perfectly content with this. Unfortunately, his audience
+has been spoiled recently with fancy projector-based presentations and there
+seems to be a certain amount of peer pressure that his Petri nets should also
+be drawn using a graphic program. One of the professors at his institute
+recommends \tikzname\ for this and Hagen decides to give it a try.
+
+
+\subsection{Problem Statement}
+
+For his talk, Hagen wishes to create a graphic that demonstrates how a net with
+place capacities can be simulated by a net without capacities. The graphic
+should look like this, ideally:
+%
+\begin{quote}
+\begin{tikzpicture}
+ [node distance=1.3cm,>=stealth',bend angle=45,auto,
+ place/.style={circle,thick,draw=blue!75,fill=blue!20,minimum size=6mm},
+ red place/.style={place,draw=red!75,fill=red!20},
+ transition/.style={rectangle,thick,draw=black!75,fill=black!20,minimum size=4mm},
+ every label/.style={red},on grid]
+
+ \begin{scope}
+ % First net
+ \node [place,tokens=1] (w1) {};
+ \node [place] (c1) [below=of w1] {};
+ \node [place] (s) [below=of c1,label=above:$s\le 3$] {};
+ \node [place] (c2) [below=of s] {};
+ \node [place,tokens=1] (w2) [below=of c2] {};
+
+ \node [transition] (e1) [left=of c1] {}
+ edge [pre,bend left] (w1)
+ edge [post,bend right] (s)
+ edge [post] (c1);
+
+ \node [transition] (e2) [left=of c2] {}
+ edge [pre,bend right] (w2)
+ edge [post,bend left] (s)
+ edge [post] (c2);
+
+ \node [transition] (l1) [right=of c1] {}
+ edge [pre] (c1)
+ edge [pre,bend left] (s)
+ edge [post,bend right] node[swap] {2} (w1);
+
+ \node [transition] (l2) [right=of c2] {}
+ edge [pre] (c2)
+ edge [pre,bend right] (s)
+ edge [post,bend left] node {2} (w2);
+ \end{scope}
+
+ \begin{scope}[xshift=6cm]
+ % Second net
+ \node [place,tokens=1]
+ (w1') {};
+ \node [place] (c1') [below=of w1'] {};
+ \node [red place] (s1') [below=of c1',xshift=-5mm,label=left:$s$] {};
+ \node [red place,tokens=3]
+ (s2') [below=of c1',xshift=5mm,label=right:$\bar s$] {};
+ \node [place] (c2') [below=of s1',xshift=5mm] {};
+ \node [place,tokens=1]
+ (w2') [below=of c2'] {};
+
+ \node [transition] (e1') [left=of c1'] {}
+ edge [pre,bend left] (w1')
+ edge [post] (s1')
+ edge [pre] (s2')
+ edge [post] (c1');
+
+ \node [transition] (e2') [left=of c2'] {}
+ edge [pre,bend right] (w2')
+ edge [post] (s1')
+ edge [pre] (s2')
+ edge [post] (c2');
+
+ \node [transition] (l1') [right=of c1'] {}
+ edge [pre] (c1')
+ edge [pre] (s1')
+ edge [post] (s2')
+ edge [post,bend right] node[swap] {2} (w1');
+
+ \node [transition] (l2') [right=of c2'] {}
+ edge [pre] (c2')
+ edge [pre] (s1')
+ edge [post] (s2')
+ edge [post,bend left] node {2} (w2');
+ \end{scope}
+
+ \begin{scope}[on background layer]
+ \node (r1) [fill=black!10,rounded corners,fit=(w1)(w2)(e1)(e2)(l1)(l2)] {};
+ \node (r2) [fill=black!10,rounded corners,fit=(w1')(w2')(e1')(e2')(l1')(l2')] {};
+ \end{scope}
+
+ \draw [shorten >=1mm,-to,thick,decorate,decoration={snake,amplitude=.4mm,segment
+ length=2mm,pre=moveto,pre length=1mm,post length=2mm}]
+ (r1) -- (r2)
+ node [above=1mm,midway,text width=3cm,align=center]
+ {replacement of the \textcolor{red}{capacity} by \textcolor{red}{two places}};
+
+\end{tikzpicture}
+\end{quote}
+
+
+\subsection{Setting up the Environment}
+
+For the picture Hagen will need to load the \tikzname\ package as did Karl in
+the previous tutorial. However, Hagen will also need to load some additional
+\emph{library packages} that Karl did not need. These library packages contain
+additional definitions like extra arrow tips that are typically not needed in a
+picture and that need to be loaded explicitly.
+
+Hagen will need to load several libraries: The |arrows| library for the special
+arrow tip used in the graphic, the |decorations.pathmorphing| library for the
+``snaking line'' in the middle, the |backgrounds| library for the two
+rectangular areas that are behind the two main parts of the picture, the |fit|
+library to easily compute the sizes of these rectangles, and the |positioning|
+library for placing nodes relative to other nodes.
+
+
+\subsubsection{Setting up the Environment in \LaTeX}
+
+When using \LaTeX\ use:
+%
+\begin{codeexample}[code only]
+\documentclass{article} % say
+
+\usepackage{tikz}
+\usetikzlibrary{arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri}
+
+\begin{document}
+\begin{tikzpicture}
+ \draw (0,0) -- (1,1);
+\end{tikzpicture}
+\end{document}
+\end{codeexample}
+
+
+\subsubsection{Setting up the Environment in Plain \TeX}
+
+When using plain \TeX\ use:
+%
+\begin{codeexample}[code only]
+%% Plain TeX file
+\input tikz.tex
+\usetikzlibrary{arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri}
+\baselineskip=12pt
+\hsize=6.3truein
+\vsize=8.7truein
+\tikzpicture
+ \draw (0,0) -- (1,1);
+\endtikzpicture
+\bye
+\end{codeexample}
+
+
+\subsubsection{Setting up the Environment in Con\TeX t}
+
+When using Con\TeX t, use:
+%
+\begin{codeexample}[code only]
+%% ConTeXt file
+\usemodule[tikz]
+\usetikzlibrary[arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri]
+
+\starttext
+ \starttikzpicture
+ \draw (0,0) -- (1,1);
+ \stoptikzpicture
+\stoptext
+\end{codeexample}
+
+
+\subsection{Introduction to Nodes}
+
+In principle, we already know how to create the graphics that Hagen desires
+(except perhaps for the snaked line, we will come to that): We start with big
+light gray rectangle and then add lots of circles and small rectangle, plus
+some arrows.
+
+However, this approach has numerous disadvantages: First, it is hard to change
+anything at a later stage. For example, if we decide to add more places to the
+Petri nets (the circles are called places in Petri net theory), all of the
+coordinates change and we need to recalculate everything. Second, it is hard to
+read the code for the Petri net as it is just a long and complicated list of
+coordinates and drawing commands -- the underlying structure of the Petri net
+is lost.
+
+Fortunately, \tikzname\ offers a powerful mechanism for avoiding the above
+problems: nodes. We already came across nodes in the previous tutorial, where
+we used them to add labels to Karl's graphic. In the present tutorial we will
+see that nodes are much more powerful.
+
+A node is a small part of a picture. When a node is created, you provide a
+position where the node should be drawn and a \emph{shape}. A node of shape
+|circle| will be drawn as a circle, a node of shape |rectangle| as a rectangle,
+and so on. A node may also contain some text, which is why Karl used nodes to
+show text. Finally, a node can get a \emph{name} for later reference.
+
+In Hagen's picture we will use nodes for the places and for the transitions of
+the Petri net (the places are the circles, the transitions are the rectangles).
+Let us start with the upper half of the left Petri net. In this upper half we
+have three places and two transitions. Instead of drawing three circles and two
+rectangles, we use three nodes of shape |circle| and two nodes of shape
+|rectangle|.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path ( 0,2) node [shape=circle,draw] {}
+ ( 0,1) node [shape=circle,draw] {}
+ ( 0,0) node [shape=circle,draw] {}
+ ( 1,1) node [shape=rectangle,draw] {}
+ (-1,1) node [shape=rectangle,draw] {};
+\end{tikzpicture}
+\end{codeexample}
+
+Hagen notes that this does not quite look like the final picture, but it seems
+like a good first step.
+
+Let us have a more detailed look at the code. The whole picture consists of a
+single path. Ignoring the |node| operations, there is not much going on in this
+path: It is just a sequence of coordinates with nothing ``happening'' between
+them. Indeed, even if something were to happen like a line-to or a curve-to,
+the |\path| command would not ``do'' anything with the resulting path. So, all
+the magic must be in the |node| commands.
+
+In the previous tutorial we learned that a |node| will add a piece of text at
+the last coordinate. Thus, each of the five nodes is added at a different
+position. In the above code, this text is empty (because of the empty |{}|).
+So, why do we see anything at all? The answer is the |draw| option for the
+|node| operation: It causes the ``shape around the text'' to be drawn.
+
+So, the code |(0,2) node [shape=circle,draw] {}| means the following: ``In the
+main path, add a move-to to the coordinate |(0,2)|. Then, temporarily suspend
+the construction of the main path while the node is built. This node will be a
+|circle| around an empty text. This circle is to be |draw|n, but not filled or
+otherwise used. Once this whole node is constructed, it is saved until after
+the main path is finished. Then, it is drawn.'' The following
+|(0,1) node [shape=circle,draw] {}| then has the following effect: ``Continue
+the main path with a move-to to |(0,1)|. Then construct a node at this position
+also. This node is also shown after the main path is finished.'' And so on.
+
+
+\subsection{Placing Nodes Using the At Syntax}
+
+Hagen now understands how the |node| operation adds nodes to the path, but it
+seems a bit silly to create a path using the |\path| operation, consisting of
+numerous superfluous move-to operations, only to place nodes. He is pleased to
+learn that there are ways to add nodes in a more sensible manner.
+
+First, the |node| operation allows one to add |at (|\meta{coordinate}|)| in
+order to directly specify where the node should be placed, sidestepping the
+rule that nodes are placed on the last coordinate. Hagen can then write the
+following:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \path node at ( 0,2) [shape=circle,draw] {}
+ node at ( 0,1) [shape=circle,draw] {}
+ node at ( 0,0) [shape=circle,draw] {}
+ node at ( 1,1) [shape=rectangle,draw] {}
+ node at (-1,1) [shape=rectangle,draw] {};
+\end{tikzpicture}
+\end{codeexample}
+
+Now Hagen is still left with a single empty path, but at least the path no
+longer contains strange move-to's. It turns out that this can be improved
+further: The |\node| command is an abbreviation for |\path node|, which allows
+Hagen to write:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node at ( 0,2) [circle,draw] {};
+ \node at ( 0,1) [circle,draw] {};
+ \node at ( 0,0) [circle,draw] {};
+ \node at ( 1,1) [rectangle,draw] {};
+ \node at (-1,1) [rectangle,draw] {};
+\end{tikzpicture}
+\end{codeexample}
+
+Hagen likes this syntax much better than the previous one. Note that Hagen has
+also omitted the |shape=| since, like |color=|, \tikzname\ allows you to omit
+the |shape=| if there is no confusion.
+
+
+\subsection{Using Styles}
+
+Feeling adventurous, Hagen tries to make the nodes look nicer. In the final
+picture, the circles and rectangle should be filled with different colors,
+resulting in the following code:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[thick]
+ \node at ( 0,2) [circle,draw=blue!50,fill=blue!20] {};
+ \node at ( 0,1) [circle,draw=blue!50,fill=blue!20] {};
+ \node at ( 0,0) [circle,draw=blue!50,fill=blue!20] {};
+ \node at ( 1,1) [rectangle,draw=black!50,fill=black!20] {};
+ \node at (-1,1) [rectangle,draw=black!50,fill=black!20] {};
+\end{tikzpicture}
+\end{codeexample}
+
+While this looks nicer in the picture, the code starts to get a bit ugly.
+Ideally, we would like our code to transport the message ``there are three
+places and two transitions'' and not so much which filling colors should be
+used.
+
+To solve this problem, Hagen uses styles. He defines a style for places and
+another style for transitions:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [place/.style={circle,draw=blue!50,fill=blue!20,thick},
+ transition/.style={rectangle,draw=black!50,fill=black!20,thick}]
+ \node at ( 0,2) [place] {};
+ \node at ( 0,1) [place] {};
+ \node at ( 0,0) [place] {};
+ \node at ( 1,1) [transition] {};
+ \node at (-1,1) [transition] {};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Node Size}
+
+Before Hagen starts naming and connecting the nodes, let us first make sure
+that the nodes get their final appearance. They are still too small. Indeed,
+Hagen wonders why they have any size at all, after all, the text is empty. The
+reason is that \tikzname\ automatically adds some space around the text. The
+amount is set using the option |inner sep|. So, to increase the size of the
+nodes, Hagen could write:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [inner sep=2mm,
+ place/.style={circle,draw=blue!50,fill=blue!20,thick},
+ transition/.style={rectangle,draw=black!50,fill=black!20,thick}]
+ \node at ( 0,2) [place] {};
+ \node at ( 0,1) [place] {};
+ \node at ( 0,0) [place] {};
+ \node at ( 1,1) [transition] {};
+ \node at (-1,1) [transition] {};
+\end{tikzpicture}
+\end{codeexample}
+
+However, this is not really the best way to achieve the desired effect. It is
+much better to use the |minimum size| option instead. This option allows Hagen
+to specify a minimum size that the node should have. If the node actually needs
+to be bigger because of a longer text, it will be larger, but if the text is
+empty, then the node will have |minimum size|. This option is also useful to
+ensure that several nodes containing different amounts of text have the same
+size. The options |minimum height| and |minimum width| allow you to specify the
+minimum height and width independently.
+
+So, what Hagen needs to do is to provide |minimum size| for the nodes. To be on
+the safe side, he also sets |inner sep=0pt|. This ensures that the nodes will
+really have size |minimum size| and not, for very small minimum sizes, the
+minimal size necessary to encompass the automatically added space.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ [place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+ transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}]
+ \node at ( 0,2) [place] {};
+ \node at ( 0,1) [place] {};
+ \node at ( 0,0) [place] {};
+ \node at ( 1,1) [transition] {};
+ \node at (-1,1) [transition] {};
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Naming Nodes}
+
+Hagen's next aim is to connect the nodes using arrows. This seems like a tricky
+business since the arrows should not start in the middle of the nodes, but
+somewhere on the border and Hagen would very much like to avoid computing these
+positions by hand.
+
+Fortunately, \pgfname\ will perform all the necessary calculations for him.
+However, he first has to assign names to the nodes so that he can reference
+them later on.
+
+There are two ways to name a node. The first is to use the |name=| option. The
+second method is to write the desired name in parentheses after the |node|
+operation. Hagen thinks that this second method seems strange, but he will soon
+change his opinion.
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+% ... set up styles
+\begin{tikzpicture}
+ \node (waiting 1) at ( 0,2) [place] {};
+ \node (critical 1) at ( 0,1) [place] {};
+ \node (semaphore) at ( 0,0) [place] {};
+ \node (leave critical) at ( 1,1) [transition] {};
+ \node (enter critical) at (-1,1) [transition] {};
+\end{tikzpicture}
+\end{codeexample}
+}
+
+Hagen is pleased to note that the names help in understanding the code. Names
+for nodes can be pretty arbitrary, but they should not contain commas, periods,
+parentheses, colons, and some other special characters. However, they can
+contain underscores and hyphens.
+
+The syntax for the |node| operation is quite liberal with respect to the order
+in which node names, the |at| specifier, and the options must come. Indeed, you
+can even have multiple option blocks between the |node| and the text in curly
+braces, they accumulate. You can rearrange them arbitrarily and perhaps the
+following might be preferable:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting 1) at ( 0,2) {};
+ \node[place] (critical 1) at ( 0,1) {};
+ \node[place] (semaphore) at ( 0,0) {};
+ \node[transition] (leave critical) at ( 1,1) {};
+ \node[transition] (enter critical) at (-1,1) {};
+\end{tikzpicture}
+\end{codeexample}
+}
+
+
+\subsection{Placing Nodes Using Relative Placement}
+
+Although Hagen still wishes to connect the nodes, he first wishes to address
+another problem again: The placement of the nodes. Although he likes the |at|
+syntax, in this particular case he would prefer placing the nodes ``relative to
+each other''. So, Hagen would like to say that the |critical 1| node should be
+below the |waiting 1| node, wherever the |waiting 1| node might be. There are
+different ways of achieving this, but the nicest one in Hagen's case is the
+|below| option:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+\end{tikzpicture}
+\end{codeexample}
+}
+
+With the |positioning| library loaded, when an option like |below| is followed
+by |of|, then the position of the node is shifted in such a manner that it is
+placed at the distance |node distance| in the specified direction of the given
+direction. The |node distance| is either the distance between the centers of
+the nodes (when the |on grid| option is set to true) or the distance between
+the borders (when the |on grid| option is set to false, which is the default).
+
+Even though the above code has the same effect as the earlier code, Hagen can
+pass it to his colleagues who will be able to just read and understand it,
+perhaps without even having to see the picture.
+
+
+\subsection{Adding Labels Next to Nodes}
+
+Before we have a look at how Hagen can connect the nodes, let us add the
+capacity ``$s \le 3$'' to the bottom node. For this, two approaches are
+possible:
+%
+\begin{enumerate}
+ \item Hagen can just add a new node above the |north| anchor of the
+ |semaphore| node.
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+
+ \node [red,above] at (semaphore.north) {$s\le 3$};
+\end{tikzpicture}
+\end{codeexample}
+}
+ %
+ This is a general approach that will ``always work''.
+
+ \item Hagen can use the special |label| option. This option is given to a
+ |node| and it causes \emph{another} node to be added next to the node
+ where the option is given. Here is the idea: When we construct the
+ |semaphore| node, we wish to indicate that we want another node with
+ the capacity above it. For this, we use the option
+ |label=above:$s\le 3$|. This option is interpreted as follows: We want
+ a node above the |semaphore| node and this node should read ``$s \le
+ 3$''. Instead of |above| we could also use things like |below left|
+ before the colon or a number like |60|.
+ %
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical,
+ label=above:$s\le3$] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+\end{tikzpicture}
+\end{codeexample}
+}
+ %
+ It is also possible to give multiple |label| options, this causes
+ multiple labels to be drawn.
+ %
+\begin{codeexample}[]
+\tikz
+ \node [circle,draw,label=60:$60^\circ$,label=below:$-90^\circ$] {my circle};
+\end{codeexample}
+ %
+ Hagen is not fully satisfied with the |label| option since the label
+ is not red. To achieve this, he has two options: First, he can
+ redefine the |every label| style. Second, he can add options to the
+ label's node. These options are given following the |label=|, so he
+ would write |label=[red]above:$s\le3$|. However, this does not quite
+ work since \TeX\ thinks that the |]| closes the whole option list of
+ the |semaphore| node. So, Hagen has to add braces and writes
+ |label={[red]above:$s\le3$}|. Since this looks a bit ugly, Hagen
+ decides to redefine the |every label| style.
+ %
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}[every label/.style={red}]
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical,
+ label=above:$s\le3$] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+\end{tikzpicture}
+\end{codeexample}
+}
+\end{enumerate}
+
+
+\subsection{Connecting Nodes}
+
+It is now high time to connect the nodes. Let us start with something simple,
+namely with the straight line from |enter critical| to |critical|. We want this
+line to start at the right side of |enter critical| and to end at the left side
+of |critical|. For this, we can use the \emph{anchors} of the nodes. Every node
+defines a whole bunch of anchors that lie on its border or inside it. For
+example, the |center| anchor is at the center of the node, the |west| anchor is
+on the left of the node, and so on. To access the coordinate of a node, we use
+a coordinate that contains the node's name followed by a dot, followed by the
+anchor's name:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+ \draw [->] (critical.west) -- (enter critical.east);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+Next, let us tackle the curve from |waiting| to |enter critical|. This can be
+specified using curves and controls:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+ \draw [->] (enter critical.east) -- (critical.west);
+ \draw [->] (waiting.west) .. controls +(left:5mm) and +(up:5mm)
+ .. (enter critical.north);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+Hagen sees how he can now add all his edges, but the whole process seems a but
+awkward and not very flexible. Again, the code seems to obscure the structure
+of the graphic rather than showing it.
+
+So, let us start improving the code for the edges. First, Hagen can leave out
+the anchors:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+ \draw [->] (enter critical) -- (critical);
+ \draw [->] (waiting) .. controls +(left:8mm) and +(up:8mm)
+ .. (enter critical);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+Hagen is a bit surprised that this works. After all, how did \tikzname\ know
+that the line from |enter critical| to |critical| should actually start on the
+borders? Whenever \tikzname\ encounters a whole node name as a ``coordinate'',
+it tries to ``be smart'' about the anchor that it should choose for this node.
+Depending on what happens next, \tikzname\ will choose an anchor that lies on
+the border of the node on a line to the next coordinate or control point. The
+exact rules are a bit complex, but the chosen point will usually be correct --
+and when it is not, Hagen can still specify the desired anchor by hand.
+
+Hagen would now like to simplify the curve operation somehow. It turns out that
+this can be accomplished using a special path operation: the |to| operation.
+This operation takes many options (you can even define new ones yourself). One
+pair of options is useful for Hagen: The pair |in| and |out|. These options
+take angles at which a curve should leave or reach the start or target
+coordinates. Without these options, a straight line is drawn:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+ \draw [->] (enter critical) to (critical);
+ \draw [->] (waiting) to [out=180,in=90] (enter critical);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+There is another option for the |to| operation, that is even better suited to
+Hagen's problem: The |bend right| option. This option also takes an angle, but
+this angle only specifies the angle by which the curve is bent to the right:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {};
+ \draw [->] (enter critical) to (critical);
+ \draw [->] (waiting) to [bend right=45] (enter critical);
+ \draw [->] (enter critical) to [bend right=45] (semaphore);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+It is now time for Hagen to learn about yet another way of specifying edges:
+Using the |edge| path operation. This operation is very similar to the |to|
+operation, but there is one important difference: Like a node the edge
+generated by the |edge| operation is not part of the main path, but is added
+only later. This may not seem very important, but it has some nice
+consequences. For example, every edge can have its own arrow tips and its own
+color and so on and, still, all the edges can be given on the same path. This
+allows Hagen to write the following:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+ \node[transition] (leave critical) [right=of critical] {};
+ \node[transition] (enter critical) [left=of critical] {}
+ edge [->] (critical)
+ edge [<-,bend left=45] (waiting)
+ edge [->,bend right=45] (semaphore);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+Each |edge| caused a new path to be constructed, consisting of a |to| between
+the node |enter critical| and the node following the |edge| command.
+
+The finishing touch is to introduce two styles |pre| and |post| and to use the
+|bend angle=45| option to set the bend angle once and for all:
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm}}
+\begin{codeexample}[]
+% Styles place and transition as before
+\begin{tikzpicture}
+ [bend angle=45,
+ pre/.style={<-,shorten <=1pt,>=stealth',semithick},
+ post/.style={->,shorten >=1pt,>=stealth',semithick}]
+
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+
+ \node[transition] (leave critical) [right=of critical] {}
+ edge [pre] (critical)
+ edge [post,bend right] (waiting)
+ edge [pre, bend left] (semaphore);
+ \node[transition] (enter critical) [left=of critical] {}
+ edge [post] (critical)
+ edge [pre, bend left] (waiting)
+ edge [post,bend right] (semaphore);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+
+\subsection{Adding Labels Next to Lines}
+
+The next thing that Hagen needs to add is the ``$2$'' at the arcs. For this
+Hagen can use \tikzname's automatic node placement: By adding the option
+|auto|, \tikzname\ will position nodes on curves and lines in such a way that
+they are not on the curve but next to it. Adding |swap| will mirror the label
+with respect to the line. Here is a general example:
+%
+{
+\begin{codeexample}[]
+\begin{tikzpicture}[auto,bend right]
+ \node (a) at (0:1) {$0^\circ$};
+ \node (b) at (120:1) {$120^\circ$};
+ \node (c) at (240:1) {$240^\circ$};
+
+ \draw (a) to node {1} node [swap] {1'} (b)
+ (b) to node {2} node [swap] {2'} (c)
+ (c) to node {3} node [swap] {3'} (a);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+What is happening here? The nodes are given somehow inside the |to| operation!
+When this is done, the node is placed on the middle of the curve or line
+created by the |to| operation. The |auto| option then causes the node to be
+moved in such a way that it does not lie on the curve, but next to it. In the
+example we provide even two nodes on each |to| operation.
+
+For Hagen that |auto| option is not really necessary since the two ``2'' labels
+could also easily be placed ``by hand''. However, in a complicated plot with
+numerous edges automatic placement can be a blessing.
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm},
+pre/.style={<-,shorten <=1pt,>=stealth',semithick},
+post/.style={->,shorten >=1pt,>=stealth',semithick}}
+\begin{codeexample}[]
+% Styles as before
+\begin{tikzpicture}[bend angle=45]
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+
+ \node[transition] (leave critical) [right=of critical] {}
+ edge [pre] (critical)
+ edge [post,bend right] node[auto,swap] {2} (waiting)
+ edge [pre, bend left] (semaphore);
+ \node[transition] (enter critical) [left=of critical] {}
+ edge [post] (critical)
+ edge [pre, bend left] (waiting)
+ edge [post,bend right] (semaphore);
+\end{tikzpicture}
+\end{codeexample}
+}
+
+
+\subsection{Adding the Snaked Line and Multi-Line Text}
+
+With the node mechanism Hagen can now easily create the two Petri nets. What he
+is unsure of is how he can create the snaked line between the nets.
+
+For this he can use a \emph{decoration}. To draw the snaked line, Hagen only
+needs to set the two options |decoration=snake| and |decorate| on the path.
+This causes all lines of the path to be replaced by snakes. It is also possible
+to use snakes only in certain parts of a path, but Hagen will not need this.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [->,decorate,decoration=snake] (0,0) -- (2,0);
+\end{tikzpicture}
+\end{codeexample}
+
+Well, that does not look quite right, yet. The problem is that the snake
+happens to end exactly at the position where the arrow begins. Fortunately,
+there is an option that helps here. Also, the snake should be a bit smaller,
+which can be influenced by even more options.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [->,decorate,
+ decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}]
+ (0,0) -- (3,0);
+\end{tikzpicture}
+\end{codeexample}
+
+Now Hagen needs to add the text above the snake. This text is a bit challenging
+since it is a multi-line text. Hagen has two options for this: First, he can
+specify an |align=center| and then use the |\\| command to enforce the line
+breaks at the desired positions.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [->,decorate,
+ decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}]
+ (0,0) -- (3,0)
+ node [above,align=center,midway]
+ {
+ replacement of\\
+ the \textcolor{red}{capacity}\\
+ by \textcolor{red}{two places}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+Instead of specifying the line breaks ``by hand'', Hagen can also specify a
+width for the text and let \TeX\ perform the line breaking for him:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [->,decorate,
+ decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}]
+ (0,0) -- (3,0)
+ node [above,text width=3cm,align=center,midway]
+ {
+ replacement of the \textcolor{red}{capacity} by
+ \textcolor{red}{two places}
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Using Layers: The Background Rectangles}
+
+Hagen still needs to add the background rectangles. These are a bit tricky:
+Hagen would like to draw the rectangles \emph{after} the Petri nets are
+finished. The reason is that only then can he conveniently refer to the
+coordinates that make up the corners of the rectangle. If Hagen draws the
+rectangle first, then he needs to know the exact size of the Petri net -- which
+he does not.
+
+The solution is to use \emph{layers}. When the background library is loaded,
+Hagen can put parts of his picture inside a scope with the
+|on background layer| option. Then this part of the picture becomes part of the
+layer that is given as an argument to this environment. When the
+|{tikzpicture}| environment ends, the layers are put on top of each other,
+starting with the background layer. This causes everything drawn on the
+background layer to be behind the main text.
+
+The next tricky question is, how big should the rectangle be? Naturally, Hagen
+can compute the size ``by hand'' or using some clever observations concerning
+the $x$- and $y$-coordinates of the nodes, but it would be nicer to just have
+\tikzname\ compute a rectangle into which all the nodes ``fit''. For this, the
+|fit| library can be used. It defines the |fit| options, which, when given to a
+node, causes the node to be resized and shifted such that it exactly covers all
+the nodes and coordinates given as parameters to the |fit| option.
+%
+{
+\tikzset{place/.style={circle,draw=blue!50,fill=blue!20,thick,
+ inner sep=0pt,minimum size=6mm},
+transition/.style={rectangle,draw=black!50,fill=black!20,thick,
+ inner sep=0pt,minimum size=4mm},
+pre/.style={<-,shorten <=1pt,>=stealth',semithick},
+post/.style={->,shorten >=1pt,>=stealth',semithick}}
+\begin{codeexample}[]
+% Styles as before
+\begin{tikzpicture}[bend angle=45]
+ \node[place] (waiting) {};
+ \node[place] (critical) [below=of waiting] {};
+ \node[place] (semaphore) [below=of critical] {};
+
+ \node[transition] (leave critical) [right=of critical] {}
+ edge [pre] (critical)
+ edge [post,bend right] node[auto,swap] {2} (waiting)
+ edge [pre, bend left] (semaphore);
+ \node[transition] (enter critical) [left=of critical] {}
+ edge [post] (critical)
+ edge [pre, bend left] (waiting)
+ edge [post,bend right] (semaphore);
+
+ \begin{scope}[on background layer]
+ \node [fill=black!30,fit=(waiting) (critical) (semaphore)
+ (leave critical) (enter critical)] {};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+}
+
+
+\subsection{The Complete Code}
+
+Hagen has now finally put everything together. Only then does he learn that
+there is already a library for drawing Petri nets! It turns out that this
+library mainly provides the same definitions as Hagen did. For example, it
+defines a |place| style in a similar way as Hagen did. Adjusting the code so
+that it uses the library shortens Hagen code a bit, as shown in the following.
+
+First, Hagen needs less style definitions, but he still needs to specify the
+colors of places and transitions.
+%
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ [node distance=1.3cm,on grid,>=stealth',bend angle=45,auto,
+ every place/.style= {minimum size=6mm,thick,draw=blue!75,fill=blue!20},
+ every transition/.style={thick,draw=black!75,fill=black!20},
+ red place/.style= {place,draw=red!75,fill=red!20},
+ every label/.style= {red}]
+\end{codeexample}
+
+Now comes the code for the nets:
+%
+{
+\tikzset{
+ every place/.style={minimum size=6mm,thick,draw=blue!75,fill=blue!20},
+ every transition/.style={thick,draw=black!75,fill=black!20},
+ red place/.style={place,draw=red!75,fill=red!20},
+ every label/.style={red},
+ every picture/.style={on grid,node distance=1.3cm,>=stealth',bend angle=45,auto}}
+\tikzexternaldisable
+\begin{codeexample}[pre=\begin{tikzpicture},post=\end{tikzpicture}]
+ \node [place,tokens=1] (w1) {};
+ \node [place] (c1) [below=of w1] {};
+ \node [place] (s) [below=of c1,label=above:$s\le 3$] {};
+ \node [place] (c2) [below=of s] {};
+ \node [place,tokens=1] (w2) [below=of c2] {};
+
+ \node [transition] (e1) [left=of c1] {}
+ edge [pre,bend left] (w1)
+ edge [post,bend right] (s)
+ edge [post] (c1);
+ \node [transition] (e2) [left=of c2] {}
+ edge [pre,bend right] (w2)
+ edge [post,bend left] (s)
+ edge [post] (c2);
+ \node [transition] (l1) [right=of c1] {}
+ edge [pre] (c1)
+ edge [pre,bend left] (s)
+ edge [post,bend right] node[swap] {2} (w1);
+ \node [transition] (l2) [right=of c2] {}
+ edge [pre] (c2)
+ edge [pre,bend right] (s)
+ edge [post,bend left] node {2} (w2);
+\end{codeexample}
+}
+
+{
+\tikzset{
+every place/.style={minimum size=6mm,thick,draw=blue!75,fill=blue!20},
+every transition/.style={thick,draw=black!75,fill=black!20},
+red place/.style= {place,draw=red!75,fill=red!20},
+every label/.style={red},
+every picture/.style={on grid,node distance=1.3cm,>=stealth',bend angle=45,auto}}
+\tikzexternaldisable
+\begin{codeexample}[pre=\begin{tikzpicture},post=\end{tikzpicture}]
+ \begin{scope}[xshift=6cm]
+ \node [place,tokens=1] (w1') {};
+ \node [place] (c1') [below=of w1'] {};
+ \node [red place] (s1') [below=of c1',xshift=-5mm]
+ [label=left:$s$] {};
+ \node [red place,tokens=3] (s2') [below=of c1',xshift=5mm]
+ [label=right:$\bar s$] {};
+ \node [place] (c2') [below=of s1',xshift=5mm] {};
+ \node [place,tokens=1] (w2') [below=of c2'] {};
+
+ \node [transition] (e1') [left=of c1'] {}
+ edge [pre,bend left] (w1')
+ edge [post] (s1')
+ edge [pre] (s2')
+ edge [post] (c1');
+ \node [transition] (e2') [left=of c2'] {}
+ edge [pre,bend right] (w2')
+ edge [post] (s1')
+ edge [pre] (s2')
+ edge [post] (c2');
+ \node [transition] (l1') [right=of c1'] {}
+ edge [pre] (c1')
+ edge [pre] (s1')
+ edge [post] (s2')
+ edge [post,bend right] node[swap] {2} (w1');
+ \node [transition] (l2') [right=of c2'] {}
+ edge [pre] (c2')
+ edge [pre] (s1')
+ edge [post] (s2')
+ edge [post,bend left] node {2} (w2');
+ \end{scope}
+\end{codeexample}
+}
+
+The code for the background and the snake is the following:
+%
+\begin{codeexample}[code only]
+ \begin{scope}[on background layer]
+ \node (r1) [fill=black!10,rounded corners,fit=(w1)(w2)(e1)(e2)(l1)(l2)] {};
+ \node (r2) [fill=black!10,rounded corners,fit=(w1')(w2')(e1')(e2')(l1')(l2')] {};
+ \end{scope}
+
+ \draw [shorten >=1mm,-to,thick,decorate,
+ decoration={snake,amplitude=.4mm,segment length=2mm,
+ pre=moveto,pre length=1mm,post length=2mm}]
+ (r1) -- (r2) node [above=1mm,midway,text width=3cm,align=center]
+ {replacement of the \textcolor{red}{capacity} by \textcolor{red}{two places}};
+\end{tikzpicture}
+\end{codeexample}
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex
new file mode 100644
index 0000000000..614177a7fa
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-tutorial.tex
@@ -0,0 +1,1394 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Tutorial: A Picture for Karl's Students}
+
+This tutorial is intended for new users of \tikzname. It does not give an
+exhaustive account of all the features of \tikzname, just of those that you are
+likely to use right away.
+
+Karl is a math and chemistry high-school teacher. He used to create the
+graphics in his worksheets and exams using \LaTeX's |{picture}| environment.
+While the results were acceptable, creating the graphics often turned out to be
+a lengthy process. Also, there tended to be problems with lines having slightly
+wrong angles and circles also seemed to be hard to get right. Naturally, his
+students could not care less whether the lines had the exact right angles and
+they find Karl's exams too difficult no matter how nicely they were drawn. But
+Karl was never entirely satisfied with the result.
+
+Karl's son, who was even less satisfied with the results (he did not have to
+take the exams, after all), told Karl that he might wish to try out a new
+package for creating graphics. A bit confusingly, this package seems to have
+two names: First, Karl had to download and install a package called \pgfname.
+Then it turns out that inside this package there is another package called
+\tikzname, which is supposed to stand for ``\tikzname\ ist \emph{kein}
+Zeichenprogramm''. Karl finds this all a bit strange and \tikzname\ seems to
+indicate that the package does not do what he needs. However, having used
+\textsc{gnu} software for quite some time and ``\textsc{gnu} not being Unix'',
+there seems to be hope yet. His son assures him that \tikzname's name is
+intended to warn people that \tikzname\ is not a program that you can use to
+draw graphics with your mouse or tablet. Rather, it is more like a ``graphics
+language''.
+
+
+\subsection{Problem Statement}
+
+Karl wants to put a graphic on the next worksheet for his students. He is
+currently teaching his students about sine and cosine. What he would like to
+have is something that looks like this (ideally):
+%
+\noindent
+\begin{tikzpicture}
+ [scale=3,line cap=round,
+ % Styles
+ axes/.style=,
+ important line/.style={very thick},
+ information text/.style={rounded corners,fill=red!10,inner sep=1ex}]
+
+ % Local definitions
+ \def\costhirty{0.8660256}
+
+ % Colors
+ \colorlet{anglecolor}{green!50!black}
+ \colorlet{sincolor}{red}
+ \colorlet{tancolor}{orange!80!black}
+ \colorlet{coscolor}{blue}
+
+ % The graphic
+ \draw[help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4);
+
+ \draw (0,0) circle [radius=1cm];
+
+ \begin{scope}[axes]
+ \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$};
+ \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$};
+
+ \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1}
+ \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white] {$\xtext$};
+
+ \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1}
+ \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white] {$\ytext$};
+ \end{scope}
+
+ \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt) arc(0:30:3mm);
+ \draw (15:2mm) node[anglecolor] {$\alpha$};
+
+ \draw[important line,sincolor]
+ (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} +(0,-.5);
+
+ \draw[important line,coscolor]
+ (0,0) -- node[below=2pt,fill=white] {$\cos \alpha$} (\costhirty,0);
+
+ \draw[important line,tancolor] (1,0) --
+ node [right=1pt,fill=white]
+ {
+ $\displaystyle \tan \alpha \color{black}=
+ \frac{{\color{sincolor}\sin \alpha}}{\color{coscolor}\cos \alpha}$
+ } (intersection of 0,0--30:1cm and 1,0--1,1) coordinate (t);
+
+ \draw (0,0) -- (t);
+
+ \draw[xshift=1.85cm] node [right,text width=6cm,information text]
+ {
+ The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the
+ example ($\pi/6$ in radians). The {\color{sincolor}sine of
+ $\alpha$}, which is the height of the red line, is
+ \[
+ {\color{sincolor} \sin \alpha} = 1/2.
+ \]
+ By the Theorem of Pythagoras we have ${\color{coscolor}\cos^2 \alpha} +
+ {\color{sincolor}\sin^2\alpha} =1$. Thus the length of the blue
+ line, which is the {\color{coscolor}cosine of $\alpha$}, must be
+ \[
+ {\color{coscolor}\cos\alpha} = \sqrt{1 - 1/4} = \textstyle
+ \frac{1}{2} \sqrt 3.
+ \]%
+ This shows that {\color{tancolor}$\tan \alpha$}, which is the
+ height of the orange line, is
+ \[
+ {\color{tancolor}\tan\alpha} = \frac{{\color{sincolor}\sin
+ \alpha}}{\color{coscolor}\cos \alpha} = 1/\sqrt 3.
+ \]%
+ };
+\end{tikzpicture}
+
+
+\subsection{Setting up the Environment}
+
+In \tikzname, to draw a picture, at the start of the picture you need to tell
+\TeX\ or \LaTeX\ that you want to start a picture. In \LaTeX\ this is done
+using the environment |{tikzpicture}|, in plain \TeX\ you just use
+|\tikzpicture| to start the picture and |\endtikzpicture| to end it.
+
+
+\subsubsection{Setting up the Environment in \LaTeX}
+
+Karl, being a \LaTeX\ user, thus sets up his file as follows:
+%
+\begin{codeexample}[code only]
+\documentclass{article} % say
+\usepackage{tikz}
+\begin{document}
+We are working on
+\begin{tikzpicture}
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+\end{tikzpicture}.
+\end{document}
+\end{codeexample}
+
+When executed, that is, run via |pdflatex| or via |latex| followed by |dvips|,
+the resulting will contain something that looks like this:
+%
+\begin{codeexample}[width=7cm]
+We are working on
+\begin{tikzpicture}
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+\end{tikzpicture}.
+\end{codeexample}
+
+Admittedly, not quite the whole picture, yet, but we do have the axes
+established. Well, not quite, but we have the lines that make up the axes
+drawn. Karl suddenly has a sinking feeling that the picture is still some way
+off.
+
+Let's have a more detailed look at the code. First, the package |tikz| is
+loaded. This package is a so-called ``frontend'' to the basic \pgfname\ system.
+The basic layer, which is also described in this manual, is somewhat more,
+well, basic and thus harder to use. The frontend makes things easier by
+providing a simpler syntax.
+
+Inside the environment there are two |\draw| commands. They mean: ``The path,
+which is specified following the command up to the semicolon, should be
+drawn.'' The first path is specified as |(-1.5,0) -- (0,1.5)|, which means ``a
+straight line from the point at position $(-1.5,0)$ to the point at position
+$(0,1.5)$''. Here, the positions are specified within a special coordinate
+system in which, initially, one unit is 1cm.
+
+Karl is quite pleased to note that the environment automatically reserves
+enough space to encompass the picture.
+
+
+\subsubsection{Setting up the Environment in Plain \TeX}
+
+Karl's wife Gerda, who also happens to be a math teacher, is not a \LaTeX\
+user, but uses plain \TeX\ since she prefers to do things ``the old way''. She
+can also use \tikzname. Instead of |\usepackage{tikz}| she has to write
+|\input tikz.tex| and instead of |\begin{tikzpicture}| she writes
+|\tikzpicture| and instead of |\end{tikzpicture}| she writes |\endtikzpicture|.
+
+Thus, she would use:
+%
+\begin{codeexample}[code only]
+%% Plain TeX file
+\input tikz.tex
+\baselineskip=12pt
+\hsize=6.3truein
+\vsize=8.7truein
+We are working on
+\tikzpicture
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+\endtikzpicture.
+\bye
+\end{codeexample}
+
+Gerda can typeset this file using either |pdftex| or |tex| together with
+|dvips|. \tikzname\ will automatically discern which driver she is using. If
+she wishes to use |dvipdfm| together with |tex|, she either needs to modify the
+file |pgf.cfg| or can write |\def\pgfsysdriver{pgfsys-dvipdfm.def}| somewhere
+\emph{before} she inputs |tikz.tex| or |pgf.tex|.
+
+
+\subsubsection{Setting up the Environment in Con\TeX t}
+
+Karl's uncle Hans uses Con\TeX t. Like Gerda, Hans can also use \tikzname.
+Instead of |\usepackage{tikz}| he says |\usemodule[tikz]|. Instead of
+|\begin{tikzpicture}| he writes |\starttikzpicture| and instead of
+|\end{tikzpicture}| he writes |\stoptikzpicture|.
+
+His version of the example looks like this:
+%
+\begin{codeexample}[code only]
+%% ConTeXt file
+\usemodule[tikz]
+
+\starttext
+ We are working on
+ \starttikzpicture
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \stoptikzpicture.
+\stoptext
+\end{codeexample}
+
+Hans will now typeset this file in the usual way using |texexec| or |context|.
+
+
+\subsection{Straight Path Construction}
+
+The basic building block of all pictures in \tikzname\ is the path. A
+\emph{path} is a series of straight lines and curves that are connected (that
+is not the whole picture, but let us ignore the complications for the moment).
+You start a path by specifying the coordinates of the start position as a point
+in round brackets, as in |(0,0)|. This is followed by a series of ``path
+extension operations''. The simplest is |--|, which we used already. It must be
+followed by another coordinate and it extends the path in a straight line to
+this new position. For example, if we were to turn the two paths of the axes
+into one path, the following would result:
+%
+\begin{codeexample}[]
+\tikz \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);
+\end{codeexample}
+
+Karl is a bit confused by the fact that there is no |{tikzpicture}|
+environment, here. Instead, the little command |\tikz| is used. This command
+either takes one argument (starting with an opening brace as in
+|\tikz{\draw (0,0) -- (1.5,0)}|, which yields \tikz{\draw (0,0) --(1.5,0);}) or
+collects everything up to the next semicolon and puts it inside a
+|{tikzpicture}| environment. As a rule of thumb, all \tikzname\ graphic drawing
+commands must occur as an argument of |\tikz| or inside a |{tikzpicture}|
+environment. Fortunately, the command |\draw| will only be defined inside this
+environment, so there is little chance that you will accidentally do something
+wrong here.
+
+
+\subsection{Curved Path Construction}
+
+The next thing Karl wants to do is to draw the circle. For this, straight lines
+obviously will not do. Instead, we need some way to draw curves. For this,
+\tikzname\ provides a special syntax. One or two ``control points'' are needed.
+The math behind them is not quite trivial, but here is the basic idea: Suppose
+you are at point $x$ and the first control point is $y$. Then the curve will
+start ``going in the direction of~$y$ at~$x$'', that is, the tangent of the
+curve at $x$ will point toward~$y$. Next, suppose the curve should end at $z$
+and the second support point is $w$. Then the curve will, indeed, end at $z$
+and the tangent of the curve at point $z$ will go through $w$.
+
+Here is an example (the control points have been added for clarity):
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \filldraw [gray] (0,0) circle [radius=2pt]
+ (1,1) circle [radius=2pt]
+ (2,1) circle [radius=2pt]
+ (2,0) circle [radius=2pt];
+ \draw (0,0) .. controls (1,1) and (2,1) .. (2,0);
+\end{tikzpicture}
+\end{codeexample}
+
+The general syntax for extending a path in a ``curved'' way is |.. controls|
+\meta{first control point} |and| \meta{second control point} |..|
+\meta{end point}. You can leave out the |and| \meta{second control point},
+which causes the first one to be used twice.
+
+So, Karl can now add the first half circle to the picture:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (-1,0) .. controls (-1,0.555) and (-0.555,1) .. (0,1)
+ .. controls (0.555,1) and (1,0.555) .. (1,0);
+\end{tikzpicture}
+\end{codeexample}
+
+Karl is happy with the result, but finds specifying circles in this way to be
+extremely awkward. Fortunately, there is a much simpler way.
+
+
+\subsection{Circle Path Construction}
+
+In order to draw a circle, the path construction operation |circle| can be
+used. This operation is followed by a radius in brackets as in the following
+example: (Note that the previous position is used as the \emph{center} of the
+circle.)
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) circle [radius=10pt];
+\end{codeexample}
+
+You can also append an ellipse to the path using the |ellipse| operation.
+Instead of a single radius you can specify two of them:
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) ellipse [x radius=20pt, y radius=10pt];
+\end{codeexample}
+
+To draw an ellipse whose axes are not horizontal and vertical, but point in an
+arbitrary direction (a ``turned ellipse'' like \tikz \draw[rotate=30] (0,0)
+ellipse [x radius=6pt, y radius=3pt];) you can use transformations, which are
+explained later. The code for the little ellipse is
+|\tikz \draw[rotate=30] (0,0) ellipse [x radius=6pt, y radius=3pt];|, by the
+way.
+
+So, returning to Karl's problem, he can write
+|\draw (0,0) circle [radius=1cm];| to draw the circle:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+\end{tikzpicture}
+\end{codeexample}
+
+At this point, Karl is a bit alarmed that the circle is so small when he wants
+the final picture to be much bigger. He is pleased to learn that \tikzname\ has
+powerful transformation options and scaling everything by a factor of three is
+very easy. But let us leave the size as it is for the moment to save some
+space.
+
+
+\subsection{Rectangle Path Construction}
+
+The next things we would like to have is the grid in the background. There are
+several ways to produce it. For example, one might draw lots of rectangles.
+Since rectangles are so common, there is a special syntax for them: To add a
+rectangle to the current path, use the |rectangle| path construction operation.
+This operation should be followed by another coordinate and will append a
+rectangle to the path such that the previous coordinate and the next
+coordinates are corners of the rectangle. So, let us add two rectangles to the
+picture:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \draw (0,0) rectangle (0.5,0.5);
+ \draw (-0.5,-0.5) rectangle (-1,-1);
+\end{tikzpicture}
+\end{codeexample}
+
+While this may be nice in other situations, this is not really leading anywhere
+with Karl's problem: First, we would need an awful lot of these rectangles and
+then there is the border that is not ``closed''.
+
+So, Karl is about to resort to simply drawing four vertical and four horizontal
+lines using the nice |\draw| command, when he learns that there is a |grid|
+path construction operation.
+
+
+\subsection{Grid Path Construction}
+
+The |grid| path operation adds a grid to the current path. It will add lines
+making up a grid that fills the rectangle whose one corner is the current point
+and whose other corner is the point following the |grid| operation. For
+example, the code |\tikz \draw[step=2pt] (0,0) grid (10pt,10pt);| produces
+\tikz \draw[step=2pt] (0,0) grid (10pt,10pt);. Note how the optional argument
+for |\draw| can be used to specify a grid width (there are also |xstep| and
+|ystep| to define the steppings independently). As Karl will learn soon, there
+are \emph{lots} of things that can be influenced using such options.
+
+For Karl, the following code could be used:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \draw[step=.5cm] (-1.4,-1.4) grid (1.4,1.4);
+\end{tikzpicture}
+\end{codeexample}
+
+Having another look at the desired picture, Karl notices that it would be nice
+for the grid to be more subdued. (His son told him that grids tend to be
+distracting if they are not subdued.) To subdue the grid, Karl adds two more
+options to the |\draw| command that draws the grid. First, he uses the color
+|gray| for the grid lines. Second, he reduces the line width to |very thin|.
+Finally, he swaps the ordering of the commands so that the grid is drawn first
+and everything else on top.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Adding a Touch of Style}
+
+Instead of the options |gray,very thin| Karl could also have said |help lines|.
+\emph{Styles} are predefined sets of options that can be used to organize how a
+graphic is drawn. By saying |help lines| you say ``use the style that I (or
+someone else) has set for drawing help lines''. If Karl decides, at some later
+point, that grids should be drawn, say, using the color |blue!50| instead of
+|gray|, he could provide the following option somewhere:
+%
+\begin{codeexample}[code only]
+help lines/.style={color=blue!50,very thin}
+\end{codeexample}
+%
+The effect of this ``style setter'' is that in the current scope or environment
+the |help lines| option has the same effect as |color=blue!50,very thin|.
+
+Using styles makes your graphics code more flexible. You can change the way
+things look easily in a consistent manner. Normally, styles are defined at the
+beginning of a picture. However, you may sometimes wish to define a style
+globally, so that all pictures of your document can use this style. Then you
+can easily change the way all graphics look by changing this one style. In this
+situation you can use the |\tikzset| command at the beginning of the document
+as in
+%
+\begin{codeexample}[code only]
+\tikzset{help lines/.style=very thin}
+\end{codeexample}
+
+To build a hierarchy of styles you can have one style use another. So in order
+to define a style |Karl's grid| that is based on the |grid| style Karl could
+say
+%
+\begin{codeexample}[code only]
+\tikzset{Karl's grid/.style={help lines,color=blue!50}}
+...
+\draw[Karl's grid] (0,0) grid (5,5);
+\end{codeexample}
+
+Styles are made even more powerful by parametrization. This means that, like
+other options, styles can also be used with a parameter. For instance, Karl
+could parameterize his grid so that, by default, it is blue, but he could also
+use another color.
+%
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ [Karl's grid/.style ={help lines,color=#1!50},
+ Karl's grid/.default=blue]
+
+ \draw[Karl's grid] (0,0) grid (1.5,2);
+ \draw[Karl's grid=red] (2,0) grid (3.5,2);
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Drawing Options}
+
+Karl wonders what other options there are that influence how a path is drawn.
+He saw already that the |color=|\meta{color} option can be used to set the
+line's color. The option |draw=|\meta{color} does nearly the same, only it sets
+the color for the lines only and a different color can be used for filling
+(Karl will need this when he fills the arc for the angle).
+
+He saw that the style |very thin| yields very thin lines. Karl is not really
+surprised by this and neither is he surprised to learn that |thin| yields thin
+lines, |thick| yields thick lines, |very thick| yields very thick lines,
+|ultra thick| yields really, really thick lines and |ultra thin| yields lines
+that are so thin that low-resolution printers and displays will have trouble
+showing them. He wonders what gives lines of ``normal'' thickness. It turns out
+that |thin| is the correct choice, since it gives the same thickness as \TeX's
+|\hrule| command. Nevertheless, Karl would like to know whether there is
+anything ``in the middle'' between |thin| and |thick|. There is: |semithick|.
+
+Another useful thing one can do with lines is to dash or dot them. For this,
+the two styles |dashed| and |dotted| can be used, yielding \tikz[baseline]
+\draw[dashed] (0,.5ex) -- ++(2em,0pt); and \tikz[baseline] \draw[dotted]
+(0,.5ex) -- ++(2em,0pt);. Both options also exist in a loose and a dense
+version, called |loosely dashed|, |densely dashed|, |loosely dotted|, and
+|densely dotted|. If he really, really needs to, Karl can also define much
+more complex dashing patterns with the |dash pattern| option, but his son
+insists that dashing is to be used with utmost care and mostly distracts.
+Karl's son claims that complicated dashing patterns are evil. Karl's students
+do not care about dashing patterns.
+
+
+\subsection{Arc Path Construction}
+
+Our next obstacle is to draw the arc for the angle. For this, the |arc| path
+construction operation is useful, which draws part of a circle or ellipse. This
+|arc| operation is followed by options in brackets that specify the arc. An
+example would be \texttt{arc[start angle=10, end angle=80, radius=10pt]}, which
+means exactly what it says. Karl obviously needs an arc from $0^\circ$ to
+$30^\circ$. The radius should be something relatively small, perhaps around one
+third of the circle's radius. When one uses the arc path construction
+operation, the specified arc will be added with its starting point at the
+current position. So, we first have to ``get there''.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+
+Karl thinks this is really a bit small and he cannot continue unless he learns
+how to do scaling. For this, he can add the |[scale=3]| option. He could add
+this option to each |\draw| command, but that would be awkward. Instead, he
+adds it to the whole environment, which causes this option to apply to
+everything within.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+
+As for circles, you can specify ``two'' radii in order to get an elliptical
+arc.
+%
+\begin{codeexample}[]
+ \tikz \draw (0,0)
+ arc [start angle=0, end angle=315,
+ x radius=1.75cm, y radius=1cm];
+\end{codeexample}
+
+
+\subsection{Clipping a Path}
+
+In order to save space in this manual, it would be nice to clip Karl's graphics
+a bit so that we can focus on the ``interesting'' parts. Clipping is pretty
+easy in \tikzname. You can use the |\clip| command to clip all subsequent
+drawing. It works like |\draw|, only it does not draw anything, but uses the
+given path to clip everything subsequently.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,0.75);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+
+You can also do both at the same time: Draw \emph{and} clip a path. For this,
+use the |\draw| command and add the |clip| option. (This is not the whole
+picture: You can also use the |\clip| command and add the |draw| option. Well,
+that is also not the whole picture: In reality, |\draw| is just a shorthand for
+|\path[draw]| and |\clip| is a shorthand for |\path[clip]| and you could also
+say |\path[draw,clip]|.) Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip[draw] (0.5,0.5) circle (.6cm);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm];
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Parabola and Sine Path Construction}
+
+Although Karl does not need them for his picture, he is pleased to learn that
+there are |parabola| and |sin| and |cos| path operations for adding parabolas
+and sine and cosine curves to the current path. For the |parabola| operation,
+the current point will lie on the parabola as well as the point given after the
+parabola operation. Consider the following example:
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) rectangle (1,1) (0,0) parabola (1,1);
+\end{codeexample}
+
+It is also possible to place the bend somewhere else:
+%
+\begin{codeexample}[]
+\tikz \draw[x=1pt,y=1pt] (0,0) parabola bend (4,16) (6,12);
+\end{codeexample}
+
+The operations |sin| and |cos| add a sine or cosine curve in the interval
+$[0,\pi/2]$ such that the previous current point is at the start of the curve
+and the curve ends at the given end point. Here are two examples:
+\begin{codeexample}[]
+A sine \tikz \draw[x=1ex,y=1ex] (0,0) sin (1.57,1); curve.
+\end{codeexample}
+
+\begin{codeexample}[]
+\tikz \draw[x=1.57ex,y=1ex] (0,0) sin (1,1) cos (2,0) sin (3,-1) cos (4,0)
+ (0,1) cos (1,0) sin (2,-1) cos (3,0) sin (4,1);
+\end{codeexample}
+
+
+\subsection{Filling and Drawing}
+
+Returning to the picture, Karl now wants the angle to be ``filled'' with a very
+light green. For this he uses |\fill| instead of |\draw|. Here is what Karl
+does:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,0.75);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \fill[green!20!white] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- (0,0);
+\end{tikzpicture}
+\end{codeexample}
+
+The color |green!20!white| means 20\% green and 80\% white mixed together. Such
+color expression are possible since \tikzname\ uses Uwe Kern's |xcolor|
+package, see the documentation of that package for details on color
+expressions.
+
+What would have happened, if Karl had not ``closed'' the path using |--(0,0)|
+at the end? In this case, the path is closed automatically, so this could have
+been omitted. Indeed, it would even have been better to write the following,
+instead:
+%
+\begin{codeexample}[code only]
+ \fill[green!20!white] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+\end{codeexample}
+%
+The |--cycle| causes the current path to be closed (actually the current part
+of the current path) by smoothly joining the first and last point. To
+appreciate the difference, consider the following example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[line width=5pt]
+ \draw (0,0) -- (1,0) -- (1,1) -- (0,0);
+ \draw (2,0) -- (3,0) -- (3,1) -- cycle;
+ \useasboundingbox (0,1.5); % make bounding box higher
+\end{tikzpicture}
+\end{codeexample}
+
+You can also fill and draw a path at the same time using the |\filldraw|
+command. This will first draw the path, then fill it. This may not seem too
+useful, but you can specify different colors to be used for filling and for
+stroking. These are specified as optional arguments like this:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,0.75);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \filldraw[fill=green!20!white, draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Shading}
+
+Karl briefly considers the possibility of making the angle ``more fancy'' by
+\emph{shading} it. Instead of filling the area with a uniform color, a smooth
+transition between different colors is used. For this, |\shade| and
+|\shadedraw|, for shading and drawing at the same time, can be used:
+%
+\begin{codeexample}[]
+ \tikz \shade (0,0) rectangle (2,1) (3,0.5) circle (.5cm);
+\end{codeexample}
+%
+The default shading is a smooth transition from gray to white. To specify
+different colors, you can use options:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[rounded corners,ultra thick]
+ \shade[top color=yellow,bottom color=black] (0,0) rectangle +(2,1);
+ \shade[left color=yellow,right color=black] (3,0) rectangle +(2,1);
+ \shadedraw[inner color=yellow,outer color=black,draw=yellow] (6,0) rectangle +(2,1);
+ \shade[ball color=green] (9,.5) circle (.5cm);
+\end{tikzpicture}
+\end{codeexample}
+
+For Karl, the following might be appropriate:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,0.75);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \shadedraw[left color=gray,right color=green, draw=green!50!black]
+ (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+\end{tikzpicture}
+\end{codeexample}
+
+However, he wisely decides that shadings usually only distract without adding
+anything to the picture.
+
+
+\subsection{Specifying Coordinates}
+
+Karl now wants to add the sine and cosine lines. He knows already that he can
+use the |color=| option to set the lines' colors. So, what is the best way to
+specify the coordinates?
+
+There are different ways of specifying coordinates. The easiest way is to say
+something like |(10pt,2cm)|. This means 10pt in $x$-direction and 2cm in
+$y$-directions. Alternatively, you can also leave out the units as in |(1,2)|,
+which means ``one times the current $x$-vector plus twice the current
+$y$-vector''. These vectors default to 1cm in the $x$-direction and 1cm in the
+$y$-direction, respectively.
+
+In order to specify points in polar coordinates, use the notation |(30:1cm)|,
+which means 1cm in direction 30 degree. This is obviously quite useful to ``get
+to the point $(\cos 30^\circ,\sin 30^\circ)$ on the circle''.
+
+You can add a single |+| sign in front of a coordinate or two of them as in
+|+(0cm,1cm)| or |++(2cm,0cm)|. Such coordinates are interpreted differently:
+The first form means ``1cm upwards from the previous specified position'' and
+the second means ``2cm to the right of the previous specified position, making
+this the new specified position''. For example, we can draw the sine line as
+follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,0.75);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[red,very thick] (30:1cm) -- +(0,-0.5);
+\end{tikzpicture}
+\end{codeexample}
+
+Karl used the fact $\sin 30^\circ = 1/2$. However, he very much doubts that his
+students know this, so it would be nice to have a way of specifying ``the point
+straight down from |(30:1cm)| that lies on the $x$-axis''. This is, indeed,
+possible using a special syntax: Karl can write \verb!(30:1cm |- 0,0)!. In
+general, the meaning of |(|\meta{p}\verb! |- !\meta{q}|)| is ``the intersection
+of a vertical line through $p$ and a horizontal line through $q$''.
+
+Next, let us draw the cosine line. One way would be to say
+\verb!(30:1cm |- 0,0) -- (0,0)!. Another way is the following: we ``continue''
+from where the sine ends:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,0.75);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw (-1.5,0) -- (1.5,0);
+ \draw (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[red,very thick] (30:1cm) -- +(0,-0.5);
+ \draw[blue,very thick] (30:1cm) ++(0,-0.5) -- (0,0);
+\end{tikzpicture}
+\end{codeexample}
+
+Note that there is no |--| between |(30:1cm)| and |++(0,-0.5)|. In detail, this
+path is interpreted as follows: ``First, the |(30:1cm)| tells me to move by pen
+to $(\cos 30^\circ,1/2)$. Next, there comes another coordinate specification,
+so I move my pen there without drawing anything. This new point is half a unit
+down from the last position, thus it is at $(\cos 30^\circ,0)$. Finally, I move
+the pen to the origin, but this time drawing something (because of the |--|).''
+
+To appreciate the difference between |+| and |++| consider the following
+example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \def\rectanglepath{-- ++(1cm,0cm) -- ++(0cm,1cm) -- ++(-1cm,0cm) -- cycle}
+ \draw (0,0) \rectanglepath;
+ \draw (1.5,0) \rectanglepath;
+\end{tikzpicture}
+\end{codeexample}
+
+By comparison, when using a single |+|, the coordinates are different:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \def\rectanglepath{-- +(1cm,0cm) -- +(1cm,1cm) -- +(0cm,1cm) -- cycle}
+ \draw (0,0) \rectanglepath;
+ \draw (1.5,0) \rectanglepath;
+\end{tikzpicture}
+\end{codeexample}
+
+
+Naturally, all of this could have been written more clearly and more
+economically like this (either with a single of a double |+|):
+%
+\begin{codeexample}[]
+\tikz \draw (0,0) rectangle +(1,1) (1.5,0) rectangle +(1,1);
+\end{codeexample}
+
+
+\subsection{Intersecting Paths}
+
+Karl is left with the line for $\tan \alpha$, which seems difficult to specify
+using transformations and polar coordinates. The first -- and easiest -- thing
+he can do is so simply use the coordinate |(1,{tan(30)})| since \tikzname's
+math engine knows how to compute things like |tan(30)|. Note the added braces
+since, otherwise, \tikzname's parser would think that the first closing
+parenthesis ends the coordinate (in general, you need to add braces around
+components of coordinates when these components contain parentheses).
+
+Karl can, however, also use a more elaborate, but also more ``geometric'' way
+of computing the length of the orange line: He can specify intersections of
+paths as coordinates. The line for $\tan \alpha$ starts at $(1,0)$ and goes
+upward to a point that is at the intersection of a line going ``up'' and a line
+going from the origin through |(30:1cm)|. Such computations are made available
+by the |intersections| library.
+
+What Karl must do is to create two ``invisible'' paths that intersect at the
+position of interest. Creating paths that are not otherwise seen can be done
+using the |\path| command without any options like |draw| or |fill|. Then, Karl
+can add the |name path| option to the path for later reference. Once the paths
+have been constructed, Karl can use the |name intersections| to assign names to
+the coordinate for later reference.
+%
+\begin{codeexample}[code only]
+\path [name path=upward line] (1,0) -- (1,1);
+\path [name path=sloped line] (0,0) -- (30:1.5cm); % a bit longer, so that there is an intersection
+
+% (add `\usetikzlibrary{intersections}' after loading tikz in the preamble)
+\draw [name intersections={of=upward line and sloped line, by=x}]
+ [very thick,orange] (1,0) -- (x);
+\end{codeexample}
+
+
+\subsection{Adding Arrow Tips}
+
+Karl now wants to add the little arrow tips at the end of the axes. He has
+noticed that in many plots, even in scientific journals, these arrow tips seem
+to be missing, presumably because the generating programs cannot produce them.
+Karl thinks arrow tips belong at the end of axes. His son agrees. His students
+do not care about arrow tips.
+
+It turns out that adding arrow tips is pretty easy: Karl adds the option |->|
+to the drawing commands for the axes:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,1.51);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \draw[->] (-1.5,0) -- (1.5,0);
+ \draw[->] (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[red,very thick] (30:1cm) -- +(0,-0.5);
+ \draw[blue,very thick] (30:1cm) ++(0,-0.5) -- (0,0);
+
+ \path [name path=upward line] (1,0) -- (1,1);
+ \path [name path=sloped line] (0,0) -- (30:1.5cm);
+ \draw [name intersections={of=upward line and sloped line, by=x}]
+ [very thick,orange] (1,0) -- (x);
+\end{tikzpicture}
+\end{codeexample}
+
+If Karl had used the option |<-| instead of |->|, arrow tips would have been
+put at the beginning of the path. The option |<->| puts arrow tips at both ends
+of the path.
+
+There are certain restrictions to the kind of paths to which arrow tips can be
+added. As a rule of thumb, you can add arrow tips only to a single open
+``line''. For example, you cannot add tips to, say, a rectangle or a circle.
+However, you can add arrow tips to curved paths and to paths that have several
+segments, as in the following examples:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [<->] (0,0) arc [start angle=180, end angle=30, radius=10pt];
+ \draw [<->] (1,0) -- (1.5cm,10pt) -- (2cm,0pt) -- (2.5cm,10pt);
+\end{tikzpicture}
+\end{codeexample}
+
+Karl has a more detailed look at the arrow that \tikzname\ puts at the end. It
+looks like this when he zooms it: \tikz[baseline] \draw[->,line width=1pt]
+(0pt,.5ex) -- ++(10pt,0pt);. The shape seems vaguely familiar and, indeed, this
+is exactly the end of \TeX's standard arrow used in something like $f\colon A
+\to B$.
+
+Karl likes the arrow, especially since it is not ``as thick'' as the arrows
+offered by many other packages. However, he expects that, sometimes, he might
+need to use some other kinds of arrow. To do so, Karl can say |>=|\meta{kind of
+end arrow tip}, where \meta{kind of end arrow tip} is a special arrow tip
+specification. For example, if Karl says |>=Stealth|, then he tells \tikzname\
+that he would like ``stealth-fighter-like'' arrow tips:
+\todosp{remaining instance of bug \#473}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[>=Stealth]
+ \draw [->] (0,0) arc [start angle=180, end angle=30, radius=10pt];
+ \draw [<<-,very thick] (1,0) -- (1.5cm,10pt) -- (2cm,0pt) -- (2.5cm,10pt);
+\end{tikzpicture}
+\end{codeexample}
+
+Karl wonders whether such a military name for the arrow type is really
+necessary. He is not really mollified when his son tells him that Microsoft's
+PowerPoint uses the same name. He decides to have his students discuss this at
+some point.
+
+In addition to |Stealth| there are several other predefined kinds of arrow tips
+Karl can choose from, see Section~\ref{section-arrows}. Furthermore, he can
+define arrows types himself, if he needs new ones.
+
+
+\subsection{Scoping}
+
+Karl saw already that there are numerous graphic options that affect how paths
+are rendered. Often, he would like to apply certain options to a whole set of
+graphic commands. For example, Karl might wish to draw three paths using a
+|thick| pen, but would like everything else to be drawn ``normally''.
+
+If Karl wishes to set a certain graphic option for the whole picture, he can
+simply pass this option to the |\tikz| command or to the |{tikzpicture}|
+environment (Gerda would pass the options to |\tikzpicture| and Hans passes
+them to |\starttikzpicture|). However, if Karl wants to apply graphic options
+to a local group, he put these commands inside a |{scope}| environment (Gerda
+uses |\scope| and |\endscope|, Hans uses |\startscope| and |\stopscope|). This
+environment takes graphic options as an optional argument and these options
+apply to everything inside the scope, but not to anything outside.
+
+Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[ultra thick]
+ \draw (0,0) -- (0,1);
+ \begin{scope}[thin]
+ \draw (1,0) -- (1,1);
+ \draw (2,0) -- (2,1);
+ \end{scope}
+ \draw (3,0) -- (3,1);
+\end{tikzpicture}
+\end{codeexample}
+
+Scoping has another interesting effect: Any changes to the clipping area are
+local to the scope. Thus, if you say |\clip| somewhere inside a scope, the
+effect of the |\clip| command ends at the end of the scope. This is useful
+since there is no other way of ``enlarging'' the clipping area.
+
+Karl has also already seen that giving options to commands like |\draw| apply
+only to that command. It turns out that the situation is slightly more complex.
+First, options to a command like |\draw| are not really options to the command,
+but they are ``path options'' and can be given anywhere on the path. So,
+instead of |\draw[thin] (0,0) -- (1,0);| one can also write
+|\draw (0,0) [thin] -- (1,0);| or |\draw (0,0) -- (1,0) [thin];|; all of these
+have the same effect. This might seem strange since in the last case, it would
+appear that the |thin| should take effect only ``after'' the line from $(0,0)$
+to $(1,0)$ has been drawn. However, most graphic options only apply to the
+whole path. Indeed, if you say both |thin| and |thick| on the same path, the
+last option given will ``win''.
+
+When reading the above, Karl notices that only ``most'' graphic options apply
+to the whole path. Indeed, all transformation options do \emph{not} apply to
+the whole path, but only to ``everything following them on the path''. We will
+have a more detailed look at this in a moment. Nevertheless, all options given
+during a path construction apply only to this path.
+
+
+\subsection{Transformations}
+
+When you specify a coordinate like |(1cm,1cm)|, where is that coordinate
+placed on the page? To determine the position, \tikzname, \TeX, and
+\textsc{pdf} or PostScript all apply certain transformations to the given
+coordinate in order to determine the final position on the page.
+
+\tikzname\ provides numerous options that allow you to transform coordinates in
+\tikzname's private coordinate system. For example, the |xshift| option allows
+you to shift all subsequent points by a certain amount:
+
+\begin{codeexample}[]
+\tikz \draw (0,0) -- (0,0.5) [xshift=2pt] (0,0) -- (0,0.5);
+\end{codeexample}
+
+It is important to note that you can change transformation ``in the middle of a
+path'', a feature that is not supported by \pdf\ or PostScript. The reason is
+that \tikzname\ keeps track of its own transformation matrix.
+
+Here is a more complicated example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[even odd rule,rounded corners=2pt,x=10pt,y=10pt]
+ \filldraw[fill=yellow!80!black] (0,0) rectangle (1,1)
+ [xshift=5pt,yshift=5pt] (0,0) rectangle (1,1)
+ [rotate=30] (-1,-1) rectangle (2,2);
+\end{tikzpicture}
+\end{codeexample}
+
+The most useful transformations are |xshift| and |yshift| for shifting, |shift|
+for shifting to a given point as in |shift={(1,0)}| or |shift={+(0,0)}| (the
+braces are necessary so that \TeX\ does not mistake the comma for separating
+options), |rotate| for rotating by a certain angle (there is also a
+|rotate around| for rotating around a given point), |scale| for scaling by a
+certain factor, |xscale| and |yscale| for scaling only in the $x$- or
+$y$-direction (|xscale=-1| is a flip), and |xslant| and |yslant| for slanting.
+If these transformation and those that I have not mentioned are not sufficient,
+the |cm| option allows you to apply an arbitrary transformation matrix. Karl's
+students, by the way, do not know what a transformation matrix is.
+
+
+\subsection{Repeating Things: For-Loops}
+
+Karl's next aim is to add little ticks on the axes at positions $-1$, $-1/2$,
+$1/2$, and $1$. For this, it would be nice to use some kind of ``loop'',
+especially since he wishes to do the same thing at each of these positions.
+There are different packages for doing this. \LaTeX\ has its own internal
+command for this, |pstricks| comes along with the powerful |\multido| command.
+All of these can be used together with \tikzname, so if you are familiar with
+them, feel free to use them. \tikzname\ introduces yet another command, called
+|\foreach|, which I introduced since I could never remember the syntax of the
+other packages. |\foreach| is defined in the package |pgffor| and can be used
+independently \tikzname, but \tikzname\ includes it automatically.
+
+In its basic form, the |\foreach| command is easy to use:
+%
+\begin{codeexample}[]
+\foreach \x in {1,2,3} {$x =\x$, }
+\end{codeexample}
+
+The general syntax is
+|\foreach| \meta{variable}| in {|\meta{list of values}|} |\meta{commands}.
+Inside the \meta{commands}, the \meta{variable} will be assigned to the
+different values. If the \meta{commands} do not start with a brace, everything
+up to the next semicolon is used as \meta{commands}.
+
+For Karl and the ticks on the axes, he could use the following code:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.1,-0.2) rectangle (1.1,1.51);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[->] (-1.5,0) -- (1.5,0);
+ \draw[->] (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+
+ \foreach \x in {-1cm,-0.5cm,1cm}
+ \draw (\x,-1pt) -- (\x,1pt);
+ \foreach \y in {-1cm,-0.5cm,0.5cm,1cm}
+ \draw (-1pt,\y) -- (1pt,\y);
+\end{tikzpicture}
+\end{codeexample}
+
+As a matter of fact, there are many different ways of creating the ticks. For
+example, Karl could have put the |\draw ...;| inside curly braces. He could
+also have used, say,
+%
+\begin{codeexample}[code only]
+\foreach \x in {-1,-0.5,1}
+ \draw[xshift=\x cm] (0pt,-1pt) -- (0pt,1pt);
+\end{codeexample}
+
+Karl is curious what would happen in a more complicated situation where there
+are, say, 20 ticks. It seems bothersome to explicitly mention all these numbers
+in the set for |\foreach|. Indeed, it is possible to use |...| inside the
+|\foreach| statement to iterate over a large number of values (which must,
+however, be dimensionless real numbers) as in the following example:
+%
+\begin{codeexample}[]
+\tikz \foreach \x in {1,...,10}
+ \draw (\x,0) circle (0.4cm);
+\end{codeexample}
+
+If you provide \emph{two} numbers before the |...|, the |\foreach| statement
+will use their difference for the stepping:
+%
+\begin{codeexample}[]
+\tikz \foreach \x in {-1,-0.5,...,1}
+ \draw (\x cm,-1pt) -- (\x cm,1pt);
+\end{codeexample}
+
+We can also nest loops to create interesting effects:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \foreach \x in {1,2,...,5,7,8,...,12}
+ \foreach \y in {1,...,5}
+ {
+ \draw (\x,\y) +(-.5,-.5) rectangle ++(.5,.5);
+ \draw (\x,\y) node{\x,\y};
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+The |\foreach| statement can do even trickier stuff, but the above gives the
+idea.
+
+
+\subsection{Adding Text}
+
+Karl is, by now, quite satisfied with the picture. However, the most important
+parts, namely the labels, are still missing!
+
+\tikzname\ offers an easy-to-use and powerful system for adding text and, more
+generally, complex shapes to a picture at specific positions. The basic idea is
+the following: When \tikzname\ is constructing a path and encounters the
+keyword |node| in the middle of a path, it reads a \emph{node specification}.
+The keyword |node| is typically followed by some options and then some text
+between curly braces. This text is put inside a normal \TeX\ box (if the node
+specification directly follows a coordinate, which is usually the case,
+\tikzname\ is able to perform some magic so that it is even possible to use
+verbatim text inside the boxes) and then placed at the current position, that
+is, at the last specified position (possibly shifted a bit, according to the
+given options). However, all nodes are drawn only after the path has been
+completely drawn/filled/shaded/clipped/whatever.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) rectangle (2,2);
+ \draw (0.5,0.5) node [fill=yellow!80!black]
+ {Text at \verb!node 1!}
+ -- (1.5,1.5) node {Text at \verb!node 2!};
+\end{tikzpicture}
+\end{codeexample}
+
+Obviously, Karl would not only like to place nodes \emph{on} the last specified
+position, but also to the left or the right of these positions. For this, every
+node object that you put in your picture is equipped with several
+\emph{anchors}. For example, the |north| anchor is in the middle at the upper
+end of the shape, the |south| anchor is at the bottom and the |north east|
+anchor is in the upper right corner. When you give the option |anchor=north|,
+the text will be placed such that this northern anchor will lie on the current
+position and the text is, thus, below the current position. Karl uses this to
+draw the ticks as follows:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.6,-0.2) rectangle (0.6,1.51);
+ \draw[step=.5cm,help lines] (-1.4,-1.4) grid (1.4,1.4);
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[->] (-1.5,0) -- (1.5,0); \draw[->] (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+
+ \foreach \x in {-1,-0.5,1}
+ \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north] {$\x$};
+ \foreach \y in {-1,-0.5,0.5,1}
+ \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east] {$\y$};
+\end{tikzpicture}
+\end{codeexample}
+
+This is quite nice, already. Using these anchors, Karl can now add most of the
+other text elements. However, Karl thinks that, though ``correct'', it is quite
+counter-intuitive that in order to place something \emph{below} a given point,
+he has to use the \emph{north} anchor. For this reason, there is an option
+called |below|, which does the same as |anchor=north|. Similarly, |above right|
+does the same as |anchor=south west|. In addition, |below| takes an optional
+dimension argument. If given, the shape will additionally be shifted downwards
+by the given amount. So, |below=1pt| can be used to put a text label below some
+point and, additionally shift it 1pt downwards.
+
+Karl is not quite satisfied with the ticks. He would like to have $1/2$ or
+$\frac{1}{2}$ shown instead of $0.5$, partly to show off the nice capabilities
+of \TeX\ and \tikzname, partly because for positions like $1/3$ or $\pi$ it is
+certainly very much preferable to have the ``mathematical'' tick there instead
+of just the ``numeric'' tick. His students, on the other hand, prefer $0.5$
+over $1/2$ since they are not too fond of fractions in general.
+
+Karl now faces a problem: For the |\foreach| statement, the position |\x|
+should still be given as |0.5| since \tikzname\ will not know where
+|\frac{1}{2}| is supposed to be. On the other hand, the typeset text should
+really be |\frac{1}{2}|. To solve this problem, |\foreach| offers a special
+syntax: Instead of having one variable |\x|, Karl can specify two (or even
+more) variables separated by a slash as in |\x / \xtext|. Then, the elements in
+the set over which |\foreach| iterates must also be of the form
+\meta{first}|/|\meta{second}. In each iteration, |\x| will be set to
+\meta{first} and |\xtext| will be set to \meta{second}. If no \meta{second} is
+given, the \meta{first} will be used again. So, here is the new code for the
+ticks:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-0.6,-0.2) rectangle (0.6,1.51);
+ \draw[step=.5cm,help lines] (-1.4,-1.4) grid (1.4,1.4);
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[->] (-1.5,0) -- (1.5,0); \draw[->] (0,-1.5) -- (0,1.5);
+ \draw (0,0) circle [radius=1cm];
+
+ \foreach \x/\xtext in {-1, -0.5/-\frac{1}{2}, 1}
+ \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north] {$\xtext$};
+ \foreach \y/\ytext in {-1, -0.5/-\frac{1}{2}, 0.5/\frac{1}{2}, 1}
+ \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east] {$\ytext$};
+\end{tikzpicture}
+\end{codeexample}
+
+Karl is quite pleased with the result, but his son points out that this is
+still not perfectly satisfactory: The grid and the circle interfere with the
+numbers and decrease their legibility. Karl is not very concerned by this (his
+students do not even notice), but his son insists that there is an easy
+solution: Karl can add the |[fill=white]| option to fill out the background of
+the text shape with a white color.
+
+The next thing Karl wants to do is to add the labels like $\sin \alpha$. For
+this, he would like to place a label ``in the middle of the line''. To do so,
+instead of specifying the label |node {$\sin\alpha$}| directly after one of
+the endpoints of the line (which would place the label at that endpoint), Karl
+can give the label directly after the |--|, before the coordinate. By default,
+this places the label in the middle of the line, but the |pos=| options can be
+used to modify this. Also, options like |near start| and |near end| can be used
+to modify this position:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \clip (-2,-0.2) rectangle (2,0.8);
+ \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
+ \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
+ arc [start angle=0, end angle=30, radius=3mm] -- cycle;
+ \draw[->] (-1.5,0) -- (1.5,0) coordinate (x axis);
+ \draw[->] (0,-1.5) -- (0,1.5) coordinate (y axis);
+ \draw (0,0) circle [radius=1cm];
+
+ \draw[very thick,red]
+ (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} (30:1cm |- x axis);
+ \draw[very thick,blue]
+ (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0);
+ \path [name path=upward line] (1,0) -- (1,1);
+ \path [name path=sloped line] (0,0) -- (30:1.5cm);
+ \draw [name intersections={of=upward line and sloped line, by=t}]
+ [very thick,orange] (1,0) -- node [right=1pt,fill=white]
+ {$\displaystyle \tan \alpha \color{black}=
+ \frac{{\color{red}\sin \alpha}}{\color{blue}\cos \alpha}$} (t);
+
+ \draw (0,0) -- (t);
+
+ \foreach \x/\xtext in {-1, -0.5/-\frac{1}{2}, 1}
+ \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north,fill=white] {$\xtext$};
+ \foreach \y/\ytext in {-1, -0.5/-\frac{1}{2}, 0.5/\frac{1}{2}, 1}
+ \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east,fill=white] {$\ytext$};
+\end{tikzpicture}
+\end{codeexample}
+
+You can also position labels on curves and, by adding the |sloped| option, have
+them rotated such that they match the line's slope. Here is an example:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw (0,0) .. controls (6,1) and (9,1) ..
+ node[near start,sloped,above] {near start}
+ node {midway}
+ node[very near end,sloped,below] {very near end} (12,0);
+\end{tikzpicture}
+\end{codeexample}
+
+It remains to draw the explanatory text at the right of the picture. The main
+difficulty here lies in limiting the width of the text ``label'', which is
+quite long, so that line breaking is used. Fortunately, Karl can use the option
+|text width=6cm| to get the desired effect. So, here is the full code:
+%
+\begin{codeexample}[code only]
+\begin{tikzpicture}
+ [scale=3,line cap=round,
+ % Styles
+ axes/.style=,
+ important line/.style={very thick},
+ information text/.style={rounded corners,fill=red!10,inner sep=1ex}]
+
+ % Colors
+ \colorlet{anglecolor}{green!50!black}
+ \colorlet{sincolor}{red}
+ \colorlet{tancolor}{orange!80!black}
+ \colorlet{coscolor}{blue}
+
+ % The graphic
+ \draw[help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4);
+
+ \draw (0,0) circle [radius=1cm];
+
+ \begin{scope}[axes]
+ \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$} coordinate(x axis);
+ \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$} coordinate(y axis);
+
+ \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1}
+ \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white] {$\xtext$};
+
+ \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1}
+ \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white] {$\ytext$};
+ \end{scope}
+
+ \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt)
+ arc [start angle=0, end angle=30, radius=3mm];
+ \draw (15:2mm) node[anglecolor] {$\alpha$};
+
+ \draw[important line,sincolor]
+ (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} (30:1cm |- x axis);
+
+ \draw[important line,coscolor]
+ (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0);
+
+ \path [name path=upward line] (1,0) -- (1,1);
+ \path [name path=sloped line] (0,0) -- (30:1.5cm);
+ \draw [name intersections={of=upward line and sloped line, by=t}]
+ [very thick,orange] (1,0) -- node [right=1pt,fill=white]
+ {$\displaystyle \tan \alpha \color{black}=
+ \frac{{\color{red}\sin \alpha}}{\color{blue}\cos \alpha}$} (t);
+
+ \draw (0,0) -- (t);
+
+ \draw[xshift=1.85cm]
+ node[right,text width=6cm,information text]
+ {
+ The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the
+ example ($\pi/6$ in radians). The {\color{sincolor}sine of
+ $\alpha$}, which is the height of the red line, is
+ \[
+ {\color{sincolor} \sin \alpha} = 1/2.
+ \]
+ By the Theorem of Pythagoras ...
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Pics: The Angle Revisited}
+
+Karl expects that the code of certain parts of the picture he created might be
+so useful that he might wish to reuse them in the future. A natural thing to do
+is to create \TeX\ macros that store the code he wishes to reuse. However,
+\tikzname\ offers another way that is integrated directly into its parser:
+pics!
+
+A ``pic'' is ``not quite a full picture'', hence the short name. The idea is
+that a pic is simply some code that you can add to a picture at different
+places using the |pic| command whose syntax is almost identical to the |node|
+command. The main difference is that instead of specifying some text in curly
+braces that should be shown, you specify the name of a predefined picture that
+should be shown.
+
+Defining new pics is easy enough, see Section~\ref{section-pics}, but right now
+we just want to use one such predefined pic: the |angle| pic. As the name
+suggests, it is a small drawing of an angle consisting of a little wedge and an
+arc together with some text (Karl needs to load the |angles| library and the
+|quotes| for the following examples). What makes this pic useful is the fact
+that the size of the wedge will be computed automatically.
+
+The |angle| pic draws an angle between the two lines $BA$ and $BC$, where $A$,
+$B$, and $C$ are three coordinates. In our case, $B$ is the origin, $A$ is
+somewhere on the $x$-axis and $C$ is somewhere on a line at $30^\circ$.
+%
+\begin{codeexample}[]
+\begin{tikzpicture}[scale=3]
+ \coordinate (A) at (1,0);
+ \coordinate (B) at (0,0);
+ \coordinate (C) at (30:1cm);
+
+ \draw (A) -- (B) -- (C)
+ pic [draw=green!50!black, fill=green!20, angle radius=9mm,
+ "$\alpha$"] {angle = A--B--C};
+\end{tikzpicture}
+\end{codeexample}
+
+Let us see, what is happening here. First we have specified three
+\emph{coordinates} using the |\coordinate| command. It allows us to name a
+specific coordinate in the picture. Then comes something that starts as a
+normal |\draw|, but then comes the |pic| command. This command gets lots of
+options and, in curly braces, comes the most important point: We specify that
+we want to add an |angle| pic and this angle should be between the points we
+named |A|, |B|, and |C| (we could use other names). Note that the text that we
+want to be shown in the pic is specified in quotes inside the options of the
+|pic|, not inside the curly braces.
+
+To learn more about pics, please see Section~\ref{section-pics}.
diff --git a/graphics/pgf/base/doc/text-en/pgfmanual-en-xxcolor.tex b/graphics/pgf/base/doc/text-en/pgfmanual-en-xxcolor.tex
new file mode 100644
index 0000000000..2a114913a6
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/pgfmanual-en-xxcolor.tex
@@ -0,0 +1,84 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\section{Extended Color Support}
+
+This section documents the package \texttt{xxcolor}, which is currently
+distributed as part of \pgfname. This package extends the \texttt{xcolor}
+package, written by Uwe Kern, which in turn extends the \texttt{color} package.
+I hope that the commands in \texttt{xxcolor} will some day migrate to
+\texttt{xcolor}, such that this package becomes superfluous.
+
+The main aim of the \texttt{xxcolor} package is to provide an environment
+inside which all colors are ``washed out'' or ``dimmed''. This is useful in
+numerous situations and must typically be achieved in a roundabout manner if
+such an environment is not available.
+
+\begin{environment}{{colormixin}\marg{mix-in specification}}
+ The mix-in specification is applied to all colors inside the environment.
+ At the beginning of the environment, the mix-in is applied to the current
+ color, i.\,e., the color that was in effect before the environment started.
+ A mix-in specification is a number between 0 and 100 followed by an
+ exclamation mark and a color name. When a |\color| command is encountered
+ inside a mix-in environment, the number states what percentage of the
+ desired color should be used. The rest is ``filled up'' with the color
+ given in the mix-in specification. Thus, a mix-in specification like
+ |90!blue| will mix in 10\% of blue into everything, whereas |25!white| will
+ make everything nearly white.
+ %
+\begin{codeexample}[width=4cm]
+\begin{minipage}{3.5cm}\raggedright
+\color{red}Red text,%
+\begin{colormixin}{25!white}
+ washed-out red text,
+ \color{blue} washed-out blue text,
+ \begin{colormixin}{25!black}
+ dark washed-out blue text,
+ \color{green} dark washed-out green text,%
+ \end{colormixin}
+ back to washed-out blue text,%
+\end{colormixin}
+and back to red.
+\end{minipage}%
+\end{codeexample}
+ %
+\end{environment}
+
+Note that the environment only changes colors that have been installed using
+the standard \LaTeX\ |\color| command. In particular, the colors in images are
+not changed. There is, however, some support offered by the commands
+|\pgfuseimage| and |\pgfuseshading|. If the first command is invoked inside a
+|colormixin| environment with the parameter, say, |50!black| on an image with
+the name |foo|, the command will first check whether there is also a defined
+image with the name |foo.!50!black|. If so, this image is used instead. This
+allows you to provide a different image for this case. If you nest |colormixin|
+environments, the different mix-ins are all appended. For example, inside the
+inner environment of the above example, |\pgfuseimage{foo}| would first check
+whether there exists an image named |foo.!25!white!25!black|.
+
+\begin{command}{\colorcurrentmixin}
+ Expands to the current accumulated mix-in. Each nesting of a |colormixin|
+ adds a mix-in to this list.
+ %
+\begin{codeexample}[]
+\begin{minipage}{\linewidth-6pt}\raggedright
+\begin{colormixin}{75!white}
+ \colorcurrentmixin\ should be ``!75!white''\par
+ \begin{colormixin}{75!black}
+ \colorcurrentmixin\ should be ``!75!black!75!white''\par
+ \begin{colormixin}{50!white}
+ \colorcurrentmixin\ should be ``!50!white!75!black!75!white''\par
+ \end{colormixin}
+ \end{colormixin}
+\end{colormixin}
+\end{minipage}
+\end{codeexample}
+ %
+\end{command}
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.gnuplot
new file mode 100644
index 0000000000..4c854afda9
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.gnuplot
@@ -0,0 +1,2 @@
+set terminal table; set output "plots/pgf-asymptotic-example.table"; set format "%.5f"
+set samples 200; set parametric; plot [t=0.4:1.5] (t*t*t)*sin(1/(t*t*t)),(t*t*t)*cos(1/(t*t*t))
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.table b/graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.table
new file mode 100644
index 0000000000..173ab5e9c7
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-asymptotic-example.table
@@ -0,0 +1,204 @@
+#Curve 0, 200 points
+#x y type
+0.00530 -0.06378 i
+0.04363 -0.05043 i
+0.06711 -0.01790 i
+0.06896 0.02170 i
+0.05014 0.05606 i
+0.01712 0.07631 i
+-0.02110 0.07849 i
+-0.05579 0.06337 i
+-0.08032 0.03512 i
+-0.09097 -0.00029 i
+-0.08696 -0.03664 i
+-0.06987 -0.06850 i
+-0.04284 -0.09192 i
+-0.00982 -0.10460 i
+0.02515 -0.10585 i
+0.05841 -0.09629 i
+0.08703 -0.07749 i
+0.10892 -0.05162 i
+0.12282 -0.02111 i
+0.12828 0.01163 i
+0.12547 0.04436 i
+0.11507 0.07518 i
+0.09810 0.10255 i
+0.07579 0.12534 i
+0.04948 0.14280 i
+0.02048 0.15454 i
+-0.00995 0.16043 i
+-0.04065 0.16063 i
+-0.07063 0.15545 i
+-0.09905 0.14536 i
+-0.12521 0.13092 i
+-0.14860 0.11273 i
+-0.16882 0.09143 i
+-0.18562 0.06764 i
+-0.19885 0.04197 i
+-0.20848 0.01500 i
+-0.21454 -0.01276 i
+-0.21712 -0.04083 i
+-0.21637 -0.06879 i
+-0.21247 -0.09627 i
+-0.20565 -0.12295 i
+-0.19613 -0.14858 i
+-0.18415 -0.17294 i
+-0.16996 -0.19585 i
+-0.15379 -0.21718 i
+-0.13589 -0.23682 i
+-0.11647 -0.25471 i
+-0.09576 -0.27080 i
+-0.07396 -0.28508 i
+-0.05126 -0.29753 i
+-0.02783 -0.30819 i
+-0.00384 -0.31707 i
+0.02057 -0.32421 i
+0.04526 -0.32967 i
+0.07011 -0.33350 i
+0.09502 -0.33576 i
+0.11989 -0.33651 i
+0.14463 -0.33582 i
+0.16917 -0.33376 i
+0.19345 -0.33040 i
+0.21741 -0.32580 i
+0.24100 -0.32003 i
+0.26418 -0.31315 i
+0.28691 -0.30524 i
+0.30918 -0.29634 i
+0.33096 -0.28653 i
+0.35222 -0.27585 i
+0.37297 -0.26437 i
+0.39318 -0.25213 i
+0.41285 -0.23918 i
+0.43197 -0.22557 i
+0.45056 -0.21134 i
+0.46860 -0.19654 i
+0.48611 -0.18119 i
+0.50309 -0.16535 i
+0.51954 -0.14904 i
+0.53547 -0.13229 i
+0.55090 -0.11514 i
+0.56582 -0.09761 i
+0.58026 -0.07972 i
+0.59422 -0.06150 i
+0.60772 -0.04298 i
+0.62076 -0.02416 i
+0.63336 -0.00508 i
+0.64554 0.01425 i
+0.65729 0.03382 i
+0.66864 0.05361 i
+0.67960 0.07361 i
+0.69018 0.09381 i
+0.70039 0.11420 i
+0.71024 0.13475 i
+0.71975 0.15548 i
+0.72892 0.17636 i
+0.73778 0.19739 i
+0.74632 0.21857 i
+0.75456 0.23989 i
+0.76251 0.26134 i
+0.77018 0.28291 i
+0.77759 0.30461 i
+0.78473 0.32643 i
+0.79162 0.34837 i
+0.79826 0.37042 i
+0.80468 0.39258 i
+0.81087 0.41485 i
+0.81684 0.43723 i
+0.82261 0.45972 i
+0.82817 0.48232 i
+0.83354 0.50502 i
+0.83872 0.52782 i
+0.84372 0.55073 i
+0.84855 0.57374 i
+0.85321 0.59686 i
+0.85772 0.62009 i
+0.86206 0.64342 i
+0.86626 0.66685 i
+0.87032 0.69040 i
+0.87423 0.71405 i
+0.87801 0.73781 i
+0.88167 0.76169 i
+0.88520 0.78567 i
+0.88861 0.80977 i
+0.89191 0.83398 i
+0.89510 0.85831 i
+0.89818 0.88276 i
+0.90115 0.90733 i
+0.90403 0.93202 i
+0.90682 0.95683 i
+0.90951 0.98177 i
+0.91211 1.00683 i
+0.91463 1.03202 i
+0.91707 1.05735 i
+0.91942 1.08280 i
+0.92171 1.10839 i
+0.92391 1.13411 i
+0.92605 1.15998 i
+0.92812 1.18598 i
+0.93012 1.21213 i
+0.93205 1.23842 i
+0.93393 1.26485 i
+0.93575 1.29143 i
+0.93751 1.31817 i
+0.93921 1.34505 i
+0.94086 1.37209 i
+0.94246 1.39929 i
+0.94401 1.42664 i
+0.94552 1.45415 i
+0.94697 1.48183 i
+0.94838 1.50967 i
+0.94975 1.53767 i
+0.95108 1.56584 i
+0.95236 1.59418 i
+0.95361 1.62270 i
+0.95482 1.65138 i
+0.95600 1.68025 i
+0.95713 1.70928 i
+0.95824 1.73850 i
+0.95931 1.76790 i
+0.96035 1.79748 i
+0.96136 1.82725 i
+0.96234 1.85720 i
+0.96329 1.88735 i
+0.96422 1.91768 i
+0.96511 1.94820 i
+0.96598 1.97892 i
+0.96683 2.00983 i
+0.96765 2.04094 i
+0.96845 2.07225 i
+0.96922 2.10376 i
+0.96998 2.13547 i
+0.97071 2.16739 i
+0.97142 2.19952 i
+0.97211 2.23185 i
+0.97278 2.26439 i
+0.97344 2.29714 i
+0.97407 2.33010 i
+0.97469 2.36328 i
+0.97529 2.39667 i
+0.97588 2.43028 i
+0.97644 2.46411 i
+0.97700 2.49817 i
+0.97754 2.53244 i
+0.97806 2.56694 i
+0.97857 2.60166 i
+0.97906 2.63661 i
+0.97955 2.67179 i
+0.98001 2.70720 i
+0.98047 2.74284 i
+0.98092 2.77871 i
+0.98135 2.81482 i
+0.98177 2.85117 i
+0.98218 2.88775 i
+0.98258 2.92457 i
+0.98297 2.96163 i
+0.98335 2.99894 i
+0.98372 3.03649 i
+0.98408 3.07428 i
+0.98443 3.11232 i
+0.98477 3.15061 i
+0.98511 3.18914 i
+0.98543 3.22793 i
+
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-exp.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgf-exp.gnuplot
new file mode 100644
index 0000000000..1d34e313af
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-exp.gnuplot
@@ -0,0 +1,2 @@
+set terminal table; set output "plots/pgf-exp.table"; set format "%.5f"
+set samples 25; plot [x=0:4] 0.05*exp(x)
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-exp.table b/graphics/pgf/base/doc/text-en/plots/pgf-exp.table
new file mode 100644
index 0000000000..8e72857039
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-exp.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00000 0.05000 i
+0.16667 0.05907 i
+0.33333 0.06978 i
+0.50000 0.08244 i
+0.66667 0.09739 i
+0.83333 0.11505 i
+1.00000 0.13591 i
+1.16667 0.16056 i
+1.33333 0.18968 i
+1.50000 0.22408 i
+1.66667 0.26472 i
+1.83333 0.31274 i
+2.00000 0.36945 i
+2.16667 0.43646 i
+2.33333 0.51561 i
+2.50000 0.60912 i
+2.66667 0.71960 i
+2.83333 0.85010 i
+3.00000 1.00428 i
+3.16667 1.18641 i
+3.33333 1.40158 i
+3.50000 1.65577 i
+3.66667 1.95606 i
+3.83333 2.31082 i
+4.00000 2.72991 i
+
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.gnuplot
new file mode 100644
index 0000000000..e1c3f3b52f
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.gnuplot
@@ -0,0 +1,2 @@
+set terminal table; set output "plots/pgf-parametric-example.table"; set format "%.5f"
+set samples 25; set parametric; plot [t=-3.141:3.141] t*sin(t),t*cos(t)
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.table b/graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.table
new file mode 100644
index 0000000000..de0c383ddd
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-parametric-example.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00186 3.14100 i
+0.74672 2.78074 i
+1.30987 2.26617 i
+1.66651 1.66503 i
+1.81387 1.04628 i
+1.76998 0.47361 i
+1.57050 -0.00047 i
+1.26407 -0.33904 i
+0.90663 -0.52368 i
+0.55517 -0.55534 i
+0.26171 -0.45339 i
+0.06773 -0.25283 i
+0.00000 -0.00000 i
+0.06773 0.25283 i
+0.26171 0.45339 i
+0.55517 0.55534 i
+0.90663 0.52368 i
+1.26407 0.33904 i
+1.57050 0.00047 i
+1.76998 -0.47361 i
+1.81387 -1.04628 i
+1.66651 -1.66503 i
+1.30987 -2.26617 i
+0.74672 -2.78074 i
+0.00186 -3.14100 i
+
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-sin.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgf-sin.gnuplot
new file mode 100644
index 0000000000..884d534bf4
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-sin.gnuplot
@@ -0,0 +1,2 @@
+set terminal table; set output "plots/pgf-sin.table"; set format "%.5f"
+set samples 25; plot [x=0:4] sin(x)
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-sin.table b/graphics/pgf/base/doc/text-en/plots/pgf-sin.table
new file mode 100644
index 0000000000..9ab8f2c8d5
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-sin.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00000 0.00000 i
+0.16667 0.16590 i
+0.33333 0.32719 i
+0.50000 0.47943 i
+0.66667 0.61837 i
+0.83333 0.74018 i
+1.00000 0.84147 i
+1.16667 0.91944 i
+1.33333 0.97194 i
+1.50000 0.99749 i
+1.66667 0.99541 i
+1.83333 0.96573 i
+2.00000 0.90930 i
+2.16667 0.82766 i
+2.33333 0.72309 i
+2.50000 0.59847 i
+2.66667 0.45727 i
+2.83333 0.30340 i
+3.00000 0.14112 i
+3.16667 -0.02507 i
+3.33333 -0.19057 i
+3.50000 -0.35078 i
+3.66667 -0.50128 i
+3.83333 -0.63788 i
+4.00000 -0.75680 i
+
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-tan-example.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgf-tan-example.gnuplot
new file mode 100644
index 0000000000..0b0a1ad8ff
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-tan-example.gnuplot
@@ -0,0 +1,2 @@
+set table "plots/pgf-tan-example.table"; set format "%.5f"
+set samples 100.0; plot [x=-3.141:3.141] [-3:3]tan(x)
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-tan-example.table b/graphics/pgf/base/doc/text-en/plots/pgf-tan-example.table
new file mode 100644
index 0000000000..63beeda4b7
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-tan-example.table
@@ -0,0 +1,104 @@
+
+#Curve 0 of 1, 100 points
+#x y type
+-3.14100 0.00059 i
+-3.07755 0.06413 i
+-3.01409 0.12820 i
+-2.95064 0.19331 i
+-2.88718 0.26005 i
+-2.82373 0.32902 i
+-2.76027 0.40094 i
+-2.69682 0.47663 i
+-2.63336 0.55704 i
+-2.56991 0.64335 i
+-2.50645 0.73701 i
+-2.44300 0.83989 i
+-2.37955 0.95436 i
+-2.31609 1.08360 i
+-2.25264 1.23197 i
+-2.18918 1.40553 i
+-2.12573 1.61314 i
+-2.06227 1.86816 i
+-1.99882 2.19188 i
+-1.93536 2.62036 i
+-1.87191 3.22003 o
+-1.80845 4.12820 o
+-1.74500 5.68222 o
+-1.68155 8.99247 o
+-1.61809 21.12830 o
+-1.55464 -61.87594 o
+-1.49118 -12.53398 o
+-1.42773 -6.94188 o
+-1.36427 -4.77302 o
+-1.30082 -3.61357 o
+-1.23736 -2.88713 i
+-1.17391 -2.38590 i
+-1.11045 -2.01664 i
+-1.04700 -1.73126 i
+-0.98355 -1.50245 i
+-0.92009 -1.31351 i
+-0.85664 -1.15368 i
+-0.79318 -1.01569 i
+-0.72973 -0.89443 i
+-0.66627 -0.78621 i
+-0.60282 -0.68828 i
+-0.53936 -0.59856 i
+-0.47591 -0.51542 i
+-0.41245 -0.43755 i
+-0.34900 -0.36390 i
+-0.28555 -0.29357 i
+-0.22209 -0.22582 i
+-0.15864 -0.15998 i
+-0.09518 -0.09547 i
+-0.03173 -0.03174 i
+0.03173 0.03174 i
+0.09518 0.09547 i
+0.15864 0.15998 i
+0.22209 0.22582 i
+0.28555 0.29357 i
+0.34900 0.36390 i
+0.41245 0.43755 i
+0.47591 0.51542 i
+0.53936 0.59856 i
+0.60282 0.68828 i
+0.66627 0.78621 i
+0.72973 0.89443 i
+0.79318 1.01569 i
+0.85664 1.15368 i
+0.92009 1.31351 i
+0.98355 1.50245 i
+1.04700 1.73126 i
+1.11045 2.01664 i
+1.17391 2.38590 i
+1.23736 2.88713 i
+1.30082 3.61357 o
+1.36427 4.77302 o
+1.42773 6.94188 o
+1.49118 12.53398 o
+1.55464 61.87594 o
+1.61809 -21.12830 o
+1.68155 -8.99247 o
+1.74500 -5.68222 o
+1.80845 -4.12820 o
+1.87191 -3.22003 o
+1.93536 -2.62036 i
+1.99882 -2.19188 i
+2.06227 -1.86816 i
+2.12573 -1.61314 i
+2.18918 -1.40553 i
+2.25264 -1.23197 i
+2.31609 -1.08360 i
+2.37955 -0.95436 i
+2.44300 -0.83989 i
+2.50645 -0.73701 i
+2.56991 -0.64335 i
+2.63336 -0.55704 i
+2.69682 -0.47663 i
+2.76027 -0.40094 i
+2.82373 -0.32902 i
+2.88718 -0.26005 i
+2.95064 -0.19331 i
+3.01409 -0.12820 i
+3.07755 -0.06413 i
+3.14100 -0.00059 i
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-x.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgf-x.gnuplot
new file mode 100644
index 0000000000..bb95994cd8
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-x.gnuplot
@@ -0,0 +1,2 @@
+set terminal table; set output "plots/pgf-x.table"; set format "%.5f"
+set samples 25; plot [x=0:4] x
diff --git a/graphics/pgf/base/doc/text-en/plots/pgf-x.table b/graphics/pgf/base/doc/text-en/plots/pgf-x.table
new file mode 100644
index 0000000000..329b9fa56b
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgf-x.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00000 0.00000 i
+0.16667 0.16667 i
+0.33333 0.33333 i
+0.50000 0.50000 i
+0.66667 0.66667 i
+0.83333 0.83333 i
+1.00000 1.00000 i
+1.16667 1.16667 i
+1.33333 1.33333 i
+1.50000 1.50000 i
+1.66667 1.66667 i
+1.83333 1.83333 i
+2.00000 2.00000 i
+2.16667 2.16667 i
+2.33333 2.33333 i
+2.50000 2.50000 i
+2.66667 2.66667 i
+2.83333 2.83333 i
+3.00000 3.00000 i
+3.16667 3.16667 i
+3.33333 3.33333 i
+3.50000 3.50000 i
+3.66667 3.66667 i
+3.83333 3.83333 i
+4.00000 4.00000 i
+
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.gnuplot
new file mode 100644
index 0000000000..8e3f24b917
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.gnuplot
@@ -0,0 +1,5 @@
+set terminal table
+set output "pgfmanual-sine.table"
+set format "%.5f"
+set samples 20
+plot [x=0:10] sin(x)
diff --git a/graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.table b/graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.table
new file mode 100644
index 0000000000..9d5d248a56
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgfmanual-sine.table
@@ -0,0 +1,24 @@
+#Curve 0, 20 points
+#x y type
+0.00000 0.00000 i
+0.52632 0.50235 i
+1.05263 0.86873 i
+1.57895 0.99997 i
+2.10526 0.86054 i
+2.63158 0.48819 i
+3.15789 -0.01630 i
+3.68421 -0.51638 i
+4.21053 -0.87669 i
+4.73684 -0.99970 i
+5.26316 -0.85212 i
+5.78947 -0.47390 i
+6.31579 0.03260 i
+6.84211 0.53027 i
+7.36842 0.88441 i
+7.89474 0.99917 i
+8.42105 0.84348 i
+8.94737 0.45948 i
+9.47368 -0.04889 i
+10.00000 -0.54402 i
+
+
diff --git a/graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.gnuplot b/graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.gnuplot
new file mode 100644
index 0000000000..3bd81ae92d
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.gnuplot
@@ -0,0 +1,2 @@
+set terminal table; set output "plots/pgfplotgnuplot-example.table"; set format "%.5f"
+plot [x=0:3.5] x*sin(x)
diff --git a/graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.table b/graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.table
new file mode 100644
index 0000000000..a4e517898a
--- /dev/null
+++ b/graphics/pgf/base/doc/text-en/plots/pgfplotgnuplot-example.table
@@ -0,0 +1,104 @@
+#Curve 0, 100 points
+#x y type
+0.00000 0.00000 i
+0.03535 0.00125 i
+0.07071 0.00500 i
+0.10606 0.01123 i
+0.14141 0.01993 i
+0.17677 0.03108 i
+0.21212 0.04466 i
+0.24747 0.06062 i
+0.28283 0.07893 i
+0.31818 0.09954 i
+0.35354 0.12240 i
+0.38889 0.14745 i
+0.42424 0.17463 i
+0.45960 0.20387 i
+0.49495 0.23509 i
+0.53030 0.26822 i
+0.56566 0.30318 i
+0.60101 0.33986 i
+0.63636 0.37817 i
+0.67172 0.41803 i
+0.70707 0.45932 i
+0.74242 0.50194 i
+0.77778 0.54577 i
+0.81313 0.59069 i
+0.84848 0.63660 i
+0.88384 0.68337 i
+0.91919 0.73086 i
+0.95455 0.77896 i
+0.98990 0.82753 i
+1.02525 0.87643 i
+1.06061 0.92554 i
+1.09596 0.97471 i
+1.13131 1.02381 i
+1.16667 1.07269 i
+1.20202 1.12121 i
+1.23737 1.16923 i
+1.27273 1.21661 i
+1.30808 1.26320 i
+1.34343 1.30886 i
+1.37879 1.35345 i
+1.41414 1.39682 i
+1.44949 1.43884 i
+1.48485 1.47937 i
+1.52020 1.51826 i
+1.55556 1.55537 i
+1.59091 1.59059 i
+1.62626 1.62376 i
+1.66162 1.65477 i
+1.69697 1.68348 i
+1.73232 1.70977 i
+1.76768 1.73353 i
+1.80303 1.75463 i
+1.83838 1.77296 i
+1.87374 1.78841 i
+1.90909 1.80089 i
+1.94444 1.81028 i
+1.97980 1.81650 i
+2.01515 1.81946 i
+2.05051 1.81906 i
+2.08586 1.81524 i
+2.12121 1.80792 i
+2.15657 1.79704 i
+2.19192 1.78252 i
+2.22727 1.76433 i
+2.26263 1.74240 i
+2.29798 1.71671 i
+2.33333 1.68720 i
+2.36869 1.65386 i
+2.40404 1.61667 i
+2.43939 1.57560 i
+2.47475 1.53066 i
+2.51010 1.48184 i
+2.54545 1.42915 i
+2.58081 1.37260 i
+2.61616 1.31223 i
+2.65152 1.24805 i
+2.68687 1.18011 i
+2.72222 1.10845 i
+2.75758 1.03312 i
+2.79293 0.95418 i
+2.82828 0.87170 i
+2.86364 0.78576 i
+2.89899 0.69642 i
+2.93434 0.60380 i
+2.96970 0.50797 i
+3.00505 0.40904 i
+3.04040 0.30713 i
+3.07576 0.20235 i
+3.11111 0.09482 i
+3.14646 -0.01533 i
+3.18182 -0.12796 i
+3.21717 -0.24292 i
+3.25253 -0.36007 i
+3.28788 -0.47926 i
+3.32323 -0.60032 i
+3.35859 -0.72308 i
+3.39394 -0.84739 i
+3.42929 -0.97305 i
+3.46465 -1.09990 i
+3.50000 -1.22774 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvipdfm/en/Makefile b/graphics/pgf/base/doc/version-for-dvipdfm/en/Makefile
new file mode 100644
index 0000000000..f02313d16f
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfm/en/Makefile
@@ -0,0 +1,30 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = latex
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).pdf
+
+pgfmanual.pdf: $(doc).tex revisionfile
+ (TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ dvipdfm -p a4 $(doc)
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-dvipdfm/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-dvipdfm/en/pgfmanual.tex
new file mode 100644
index 0000000000..fc202c6fef
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfm/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-dvipdfm.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-dvipdfm/pgfmanual-dvipdfm.cfg b/graphics/pgf/base/doc/version-for-dvipdfm/pgfmanual-dvipdfm.cfg
new file mode 100644
index 0000000000..8d121a062b
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfm/pgfmanual-dvipdfm.cfg
@@ -0,0 +1,18 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\usepackage[hyphens]{url}
+
+\usepackage[dvipdfm]{graphics}
+% This will tell everyone which driver we are using.
+
+\PassOptionsToPackage{dvipdfm}{hyperref}
+
+% Make sure to compile this using latex + dvipdfm.
diff --git a/graphics/pgf/base/doc/version-for-dvipdfmx/en/Makefile b/graphics/pgf/base/doc/version-for-dvipdfmx/en/Makefile
new file mode 100644
index 0000000000..2e5e701be1
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfmx/en/Makefile
@@ -0,0 +1,37 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = latex -shell-escape
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).pdf revisionfile
+
+pgfmanual.pdf: $(doc).tex revisionfile
+ mkdir -p plots
+ (TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ dvipdfmx -p a4 $(doc)
+
+test: $(doc)-test.tex revisionfile
+ mkdir -p plots
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex) || true
+ dvipdfmx -p a4 $(doc)-test
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual-test.tex b/graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual-test.tex
new file mode 100644
index 0000000000..0143e04515
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual-test.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-dvipdfmx.cfg}
+\input{../../text-en/pgfmanual-en-main-preamble.tex}
+
+\begin{document}
+
+\include{pgfmanual-en-tikz-animations}
+
+\end{document}
diff --git a/graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual.tex
new file mode 100644
index 0000000000..18c793c5ef
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfmx/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-dvipdfmx.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-dvipdfmx/pgfmanual-dvipdfmx.cfg b/graphics/pgf/base/doc/version-for-dvipdfmx/pgfmanual-dvipdfmx.cfg
new file mode 100644
index 0000000000..c45a660e05
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvipdfmx/pgfmanual-dvipdfmx.cfg
@@ -0,0 +1,21 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\usepackage[hyphens]{url}
+
+\usepackage[dvipdfmx]{graphicx}
+% This will tell everyone which driver we are using.
+
+\PassOptionsToPackage{dvipdfmx}{hyperref}
+
+% Make sure to compile this using latex + dvipdfmx.
+
+\usepackage[dvipdfmx]{xcolor}
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvips/en/Makefile b/graphics/pgf/base/doc/version-for-dvips/en/Makefile
new file mode 100644
index 0000000000..1c76dda9b8
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvips/en/Makefile
@@ -0,0 +1,38 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = latex
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).ps
+
+pgfmanual.ps: $(doc).tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ dvips -o $(doc).ps $(doc).dvi
+ gs -dNOPAUSE -sDEVICE=pdfwrite -dBATCH -dCompatibilityLevel=1.4 -sOutputFile=$(doc).pdf $(doc).ps
+
+test: $(doc)-test.tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex) || true
+ dvips -o $(doc)-test.ps $(doc)-test.dvi
+ gs -dNOPAUSE -sDEVICE=pdfwrite -dBATCH -dCompatibilityLevel=1.4 -sOutputFile=$(doc)-test.pdf $(doc)-test.ps
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
+
diff --git a/graphics/pgf/base/doc/version-for-dvips/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-dvips/en/pgfmanual.tex
new file mode 100644
index 0000000000..10e7f9c75b
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvips/en/pgfmanual.tex
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-dvips.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-dvips/pgfmanual-dvips.cfg b/graphics/pgf/base/doc/version-for-dvips/pgfmanual-dvips.cfg
new file mode 100644
index 0000000000..8511b9f1f3
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvips/pgfmanual-dvips.cfg
@@ -0,0 +1,14 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\usepackage[hyphens]{url}
+\usepackage[dvips]{graphics}
+
+% Just make sure that you compile this using elatex + dvips
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/Makefile b/graphics/pgf/base/doc/version-for-dvisvgm/en/Makefile
new file mode 100644
index 0000000000..2fb60e4240
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/Makefile
@@ -0,0 +1,52 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = lualatex --output-format=dvi
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).svg
+
+test: pgfmanual-test.svg
+
+test-no-fonts: pgfmanual-test-no-font.svg
+
+pgfmanual.dvi: $(doc).tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+
+pgfmanual.svg: $(doc).dvi
+ dvisvgm --font-format=woff --no-merge --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc)
+
+pgfmanual-no-font.svg: $(doc).dvi
+ dvisvgm --no-fonts --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc)
+
+pgfmanual-test.dvi: $(doc)-test.tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex
+
+pgfmanual-test.svg: $(doc)-test.dvi
+ dvisvgm --no-merge --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc)-test
+
+pgfmanual-test-merged.svg: $(doc)-test.dvi
+ dvisvgm --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc)-test
+
+pgfmanual-test-no-font.svg: $(doc)-test.dvi
+ dvisvgm --no-fonts --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc)-test
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.html b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.html
new file mode 100644
index 0000000000..8b35d8f265
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.html
@@ -0,0 +1,5 @@
+<html>
+<head><title>PGF and TikZ, Manual for Version 3.0.1 - CVS</title></head>
+<body><object width="100%" type="image/svg+xml"
+ data="pgfmanual-test-0001.svg"></object></body>
+</html>
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.tex b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.tex
new file mode 100644
index 0000000000..a36c232025
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual-test.tex
@@ -0,0 +1,27 @@
+% Copyright 2015 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper,dvisvgm]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-dvisvgm.cfg}
+\input{../../text-en/pgfmanual-en-main-preamble.tex}
+
+\begin{document}
+
+\label{table-of-contents}
+\tableofcontents
+
+\include{pgfmanual-en-tikz-animations}
+\include{pgfmanual-en-base-animations}
+\include{pgfmanual-en-pgfsys-animations}
+
+\end{document}
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.html b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.html
new file mode 100644
index 0000000000..6d30d893ac
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+<meta charset="UTF-8" />
+<title>PGF and TikZ, Manual for Version 3.0.1 - CVS</title>
+<body>
+ <object width="100%" type="image/svg+xml" data="pgfmanual-0001.svg">
+ </object>
+</body>
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.tex
new file mode 100644
index 0000000000..03aa953fa2
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper,dvisvgm]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-dvisvgm.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-asymptotic-example.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-asymptotic-example.table
new file mode 100644
index 0000000000..173ab5e9c7
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-asymptotic-example.table
@@ -0,0 +1,204 @@
+#Curve 0, 200 points
+#x y type
+0.00530 -0.06378 i
+0.04363 -0.05043 i
+0.06711 -0.01790 i
+0.06896 0.02170 i
+0.05014 0.05606 i
+0.01712 0.07631 i
+-0.02110 0.07849 i
+-0.05579 0.06337 i
+-0.08032 0.03512 i
+-0.09097 -0.00029 i
+-0.08696 -0.03664 i
+-0.06987 -0.06850 i
+-0.04284 -0.09192 i
+-0.00982 -0.10460 i
+0.02515 -0.10585 i
+0.05841 -0.09629 i
+0.08703 -0.07749 i
+0.10892 -0.05162 i
+0.12282 -0.02111 i
+0.12828 0.01163 i
+0.12547 0.04436 i
+0.11507 0.07518 i
+0.09810 0.10255 i
+0.07579 0.12534 i
+0.04948 0.14280 i
+0.02048 0.15454 i
+-0.00995 0.16043 i
+-0.04065 0.16063 i
+-0.07063 0.15545 i
+-0.09905 0.14536 i
+-0.12521 0.13092 i
+-0.14860 0.11273 i
+-0.16882 0.09143 i
+-0.18562 0.06764 i
+-0.19885 0.04197 i
+-0.20848 0.01500 i
+-0.21454 -0.01276 i
+-0.21712 -0.04083 i
+-0.21637 -0.06879 i
+-0.21247 -0.09627 i
+-0.20565 -0.12295 i
+-0.19613 -0.14858 i
+-0.18415 -0.17294 i
+-0.16996 -0.19585 i
+-0.15379 -0.21718 i
+-0.13589 -0.23682 i
+-0.11647 -0.25471 i
+-0.09576 -0.27080 i
+-0.07396 -0.28508 i
+-0.05126 -0.29753 i
+-0.02783 -0.30819 i
+-0.00384 -0.31707 i
+0.02057 -0.32421 i
+0.04526 -0.32967 i
+0.07011 -0.33350 i
+0.09502 -0.33576 i
+0.11989 -0.33651 i
+0.14463 -0.33582 i
+0.16917 -0.33376 i
+0.19345 -0.33040 i
+0.21741 -0.32580 i
+0.24100 -0.32003 i
+0.26418 -0.31315 i
+0.28691 -0.30524 i
+0.30918 -0.29634 i
+0.33096 -0.28653 i
+0.35222 -0.27585 i
+0.37297 -0.26437 i
+0.39318 -0.25213 i
+0.41285 -0.23918 i
+0.43197 -0.22557 i
+0.45056 -0.21134 i
+0.46860 -0.19654 i
+0.48611 -0.18119 i
+0.50309 -0.16535 i
+0.51954 -0.14904 i
+0.53547 -0.13229 i
+0.55090 -0.11514 i
+0.56582 -0.09761 i
+0.58026 -0.07972 i
+0.59422 -0.06150 i
+0.60772 -0.04298 i
+0.62076 -0.02416 i
+0.63336 -0.00508 i
+0.64554 0.01425 i
+0.65729 0.03382 i
+0.66864 0.05361 i
+0.67960 0.07361 i
+0.69018 0.09381 i
+0.70039 0.11420 i
+0.71024 0.13475 i
+0.71975 0.15548 i
+0.72892 0.17636 i
+0.73778 0.19739 i
+0.74632 0.21857 i
+0.75456 0.23989 i
+0.76251 0.26134 i
+0.77018 0.28291 i
+0.77759 0.30461 i
+0.78473 0.32643 i
+0.79162 0.34837 i
+0.79826 0.37042 i
+0.80468 0.39258 i
+0.81087 0.41485 i
+0.81684 0.43723 i
+0.82261 0.45972 i
+0.82817 0.48232 i
+0.83354 0.50502 i
+0.83872 0.52782 i
+0.84372 0.55073 i
+0.84855 0.57374 i
+0.85321 0.59686 i
+0.85772 0.62009 i
+0.86206 0.64342 i
+0.86626 0.66685 i
+0.87032 0.69040 i
+0.87423 0.71405 i
+0.87801 0.73781 i
+0.88167 0.76169 i
+0.88520 0.78567 i
+0.88861 0.80977 i
+0.89191 0.83398 i
+0.89510 0.85831 i
+0.89818 0.88276 i
+0.90115 0.90733 i
+0.90403 0.93202 i
+0.90682 0.95683 i
+0.90951 0.98177 i
+0.91211 1.00683 i
+0.91463 1.03202 i
+0.91707 1.05735 i
+0.91942 1.08280 i
+0.92171 1.10839 i
+0.92391 1.13411 i
+0.92605 1.15998 i
+0.92812 1.18598 i
+0.93012 1.21213 i
+0.93205 1.23842 i
+0.93393 1.26485 i
+0.93575 1.29143 i
+0.93751 1.31817 i
+0.93921 1.34505 i
+0.94086 1.37209 i
+0.94246 1.39929 i
+0.94401 1.42664 i
+0.94552 1.45415 i
+0.94697 1.48183 i
+0.94838 1.50967 i
+0.94975 1.53767 i
+0.95108 1.56584 i
+0.95236 1.59418 i
+0.95361 1.62270 i
+0.95482 1.65138 i
+0.95600 1.68025 i
+0.95713 1.70928 i
+0.95824 1.73850 i
+0.95931 1.76790 i
+0.96035 1.79748 i
+0.96136 1.82725 i
+0.96234 1.85720 i
+0.96329 1.88735 i
+0.96422 1.91768 i
+0.96511 1.94820 i
+0.96598 1.97892 i
+0.96683 2.00983 i
+0.96765 2.04094 i
+0.96845 2.07225 i
+0.96922 2.10376 i
+0.96998 2.13547 i
+0.97071 2.16739 i
+0.97142 2.19952 i
+0.97211 2.23185 i
+0.97278 2.26439 i
+0.97344 2.29714 i
+0.97407 2.33010 i
+0.97469 2.36328 i
+0.97529 2.39667 i
+0.97588 2.43028 i
+0.97644 2.46411 i
+0.97700 2.49817 i
+0.97754 2.53244 i
+0.97806 2.56694 i
+0.97857 2.60166 i
+0.97906 2.63661 i
+0.97955 2.67179 i
+0.98001 2.70720 i
+0.98047 2.74284 i
+0.98092 2.77871 i
+0.98135 2.81482 i
+0.98177 2.85117 i
+0.98218 2.88775 i
+0.98258 2.92457 i
+0.98297 2.96163 i
+0.98335 2.99894 i
+0.98372 3.03649 i
+0.98408 3.07428 i
+0.98443 3.11232 i
+0.98477 3.15061 i
+0.98511 3.18914 i
+0.98543 3.22793 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-exp.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-exp.table
new file mode 100644
index 0000000000..8e72857039
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-exp.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00000 0.05000 i
+0.16667 0.05907 i
+0.33333 0.06978 i
+0.50000 0.08244 i
+0.66667 0.09739 i
+0.83333 0.11505 i
+1.00000 0.13591 i
+1.16667 0.16056 i
+1.33333 0.18968 i
+1.50000 0.22408 i
+1.66667 0.26472 i
+1.83333 0.31274 i
+2.00000 0.36945 i
+2.16667 0.43646 i
+2.33333 0.51561 i
+2.50000 0.60912 i
+2.66667 0.71960 i
+2.83333 0.85010 i
+3.00000 1.00428 i
+3.16667 1.18641 i
+3.33333 1.40158 i
+3.50000 1.65577 i
+3.66667 1.95606 i
+3.83333 2.31082 i
+4.00000 2.72991 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-parametric-example.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-parametric-example.table
new file mode 100644
index 0000000000..de0c383ddd
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-parametric-example.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00186 3.14100 i
+0.74672 2.78074 i
+1.30987 2.26617 i
+1.66651 1.66503 i
+1.81387 1.04628 i
+1.76998 0.47361 i
+1.57050 -0.00047 i
+1.26407 -0.33904 i
+0.90663 -0.52368 i
+0.55517 -0.55534 i
+0.26171 -0.45339 i
+0.06773 -0.25283 i
+0.00000 -0.00000 i
+0.06773 0.25283 i
+0.26171 0.45339 i
+0.55517 0.55534 i
+0.90663 0.52368 i
+1.26407 0.33904 i
+1.57050 0.00047 i
+1.76998 -0.47361 i
+1.81387 -1.04628 i
+1.66651 -1.66503 i
+1.30987 -2.26617 i
+0.74672 -2.78074 i
+0.00186 -3.14100 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-sin.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-sin.table
new file mode 100644
index 0000000000..9ab8f2c8d5
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-sin.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00000 0.00000 i
+0.16667 0.16590 i
+0.33333 0.32719 i
+0.50000 0.47943 i
+0.66667 0.61837 i
+0.83333 0.74018 i
+1.00000 0.84147 i
+1.16667 0.91944 i
+1.33333 0.97194 i
+1.50000 0.99749 i
+1.66667 0.99541 i
+1.83333 0.96573 i
+2.00000 0.90930 i
+2.16667 0.82766 i
+2.33333 0.72309 i
+2.50000 0.59847 i
+2.66667 0.45727 i
+2.83333 0.30340 i
+3.00000 0.14112 i
+3.16667 -0.02507 i
+3.33333 -0.19057 i
+3.50000 -0.35078 i
+3.66667 -0.50128 i
+3.83333 -0.63788 i
+4.00000 -0.75680 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-tan-example.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-tan-example.table
new file mode 100644
index 0000000000..63beeda4b7
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-tan-example.table
@@ -0,0 +1,104 @@
+
+#Curve 0 of 1, 100 points
+#x y type
+-3.14100 0.00059 i
+-3.07755 0.06413 i
+-3.01409 0.12820 i
+-2.95064 0.19331 i
+-2.88718 0.26005 i
+-2.82373 0.32902 i
+-2.76027 0.40094 i
+-2.69682 0.47663 i
+-2.63336 0.55704 i
+-2.56991 0.64335 i
+-2.50645 0.73701 i
+-2.44300 0.83989 i
+-2.37955 0.95436 i
+-2.31609 1.08360 i
+-2.25264 1.23197 i
+-2.18918 1.40553 i
+-2.12573 1.61314 i
+-2.06227 1.86816 i
+-1.99882 2.19188 i
+-1.93536 2.62036 i
+-1.87191 3.22003 o
+-1.80845 4.12820 o
+-1.74500 5.68222 o
+-1.68155 8.99247 o
+-1.61809 21.12830 o
+-1.55464 -61.87594 o
+-1.49118 -12.53398 o
+-1.42773 -6.94188 o
+-1.36427 -4.77302 o
+-1.30082 -3.61357 o
+-1.23736 -2.88713 i
+-1.17391 -2.38590 i
+-1.11045 -2.01664 i
+-1.04700 -1.73126 i
+-0.98355 -1.50245 i
+-0.92009 -1.31351 i
+-0.85664 -1.15368 i
+-0.79318 -1.01569 i
+-0.72973 -0.89443 i
+-0.66627 -0.78621 i
+-0.60282 -0.68828 i
+-0.53936 -0.59856 i
+-0.47591 -0.51542 i
+-0.41245 -0.43755 i
+-0.34900 -0.36390 i
+-0.28555 -0.29357 i
+-0.22209 -0.22582 i
+-0.15864 -0.15998 i
+-0.09518 -0.09547 i
+-0.03173 -0.03174 i
+0.03173 0.03174 i
+0.09518 0.09547 i
+0.15864 0.15998 i
+0.22209 0.22582 i
+0.28555 0.29357 i
+0.34900 0.36390 i
+0.41245 0.43755 i
+0.47591 0.51542 i
+0.53936 0.59856 i
+0.60282 0.68828 i
+0.66627 0.78621 i
+0.72973 0.89443 i
+0.79318 1.01569 i
+0.85664 1.15368 i
+0.92009 1.31351 i
+0.98355 1.50245 i
+1.04700 1.73126 i
+1.11045 2.01664 i
+1.17391 2.38590 i
+1.23736 2.88713 i
+1.30082 3.61357 o
+1.36427 4.77302 o
+1.42773 6.94188 o
+1.49118 12.53398 o
+1.55464 61.87594 o
+1.61809 -21.12830 o
+1.68155 -8.99247 o
+1.74500 -5.68222 o
+1.80845 -4.12820 o
+1.87191 -3.22003 o
+1.93536 -2.62036 i
+1.99882 -2.19188 i
+2.06227 -1.86816 i
+2.12573 -1.61314 i
+2.18918 -1.40553 i
+2.25264 -1.23197 i
+2.31609 -1.08360 i
+2.37955 -0.95436 i
+2.44300 -0.83989 i
+2.50645 -0.73701 i
+2.56991 -0.64335 i
+2.63336 -0.55704 i
+2.69682 -0.47663 i
+2.76027 -0.40094 i
+2.82373 -0.32902 i
+2.88718 -0.26005 i
+2.95064 -0.19331 i
+3.01409 -0.12820 i
+3.07755 -0.06413 i
+3.14100 -0.00059 i
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-x.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-x.table
new file mode 100644
index 0000000000..329b9fa56b
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgf-x.table
@@ -0,0 +1,29 @@
+#Curve 0, 25 points
+#x y type
+0.00000 0.00000 i
+0.16667 0.16667 i
+0.33333 0.33333 i
+0.50000 0.50000 i
+0.66667 0.66667 i
+0.83333 0.83333 i
+1.00000 1.00000 i
+1.16667 1.16667 i
+1.33333 1.33333 i
+1.50000 1.50000 i
+1.66667 1.66667 i
+1.83333 1.83333 i
+2.00000 2.00000 i
+2.16667 2.16667 i
+2.33333 2.33333 i
+2.50000 2.50000 i
+2.66667 2.66667 i
+2.83333 2.83333 i
+3.00000 3.00000 i
+3.16667 3.16667 i
+3.33333 3.33333 i
+3.50000 3.50000 i
+3.66667 3.66667 i
+3.83333 3.83333 i
+4.00000 4.00000 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfmanual-sine.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfmanual-sine.table
new file mode 100644
index 0000000000..9d5d248a56
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfmanual-sine.table
@@ -0,0 +1,24 @@
+#Curve 0, 20 points
+#x y type
+0.00000 0.00000 i
+0.52632 0.50235 i
+1.05263 0.86873 i
+1.57895 0.99997 i
+2.10526 0.86054 i
+2.63158 0.48819 i
+3.15789 -0.01630 i
+3.68421 -0.51638 i
+4.21053 -0.87669 i
+4.73684 -0.99970 i
+5.26316 -0.85212 i
+5.78947 -0.47390 i
+6.31579 0.03260 i
+6.84211 0.53027 i
+7.36842 0.88441 i
+7.89474 0.99917 i
+8.42105 0.84348 i
+8.94737 0.45948 i
+9.47368 -0.04889 i
+10.00000 -0.54402 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfplotgnuplot-example.table b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfplotgnuplot-example.table
new file mode 100644
index 0000000000..a4e517898a
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/en/plots/pgfplotgnuplot-example.table
@@ -0,0 +1,104 @@
+#Curve 0, 100 points
+#x y type
+0.00000 0.00000 i
+0.03535 0.00125 i
+0.07071 0.00500 i
+0.10606 0.01123 i
+0.14141 0.01993 i
+0.17677 0.03108 i
+0.21212 0.04466 i
+0.24747 0.06062 i
+0.28283 0.07893 i
+0.31818 0.09954 i
+0.35354 0.12240 i
+0.38889 0.14745 i
+0.42424 0.17463 i
+0.45960 0.20387 i
+0.49495 0.23509 i
+0.53030 0.26822 i
+0.56566 0.30318 i
+0.60101 0.33986 i
+0.63636 0.37817 i
+0.67172 0.41803 i
+0.70707 0.45932 i
+0.74242 0.50194 i
+0.77778 0.54577 i
+0.81313 0.59069 i
+0.84848 0.63660 i
+0.88384 0.68337 i
+0.91919 0.73086 i
+0.95455 0.77896 i
+0.98990 0.82753 i
+1.02525 0.87643 i
+1.06061 0.92554 i
+1.09596 0.97471 i
+1.13131 1.02381 i
+1.16667 1.07269 i
+1.20202 1.12121 i
+1.23737 1.16923 i
+1.27273 1.21661 i
+1.30808 1.26320 i
+1.34343 1.30886 i
+1.37879 1.35345 i
+1.41414 1.39682 i
+1.44949 1.43884 i
+1.48485 1.47937 i
+1.52020 1.51826 i
+1.55556 1.55537 i
+1.59091 1.59059 i
+1.62626 1.62376 i
+1.66162 1.65477 i
+1.69697 1.68348 i
+1.73232 1.70977 i
+1.76768 1.73353 i
+1.80303 1.75463 i
+1.83838 1.77296 i
+1.87374 1.78841 i
+1.90909 1.80089 i
+1.94444 1.81028 i
+1.97980 1.81650 i
+2.01515 1.81946 i
+2.05051 1.81906 i
+2.08586 1.81524 i
+2.12121 1.80792 i
+2.15657 1.79704 i
+2.19192 1.78252 i
+2.22727 1.76433 i
+2.26263 1.74240 i
+2.29798 1.71671 i
+2.33333 1.68720 i
+2.36869 1.65386 i
+2.40404 1.61667 i
+2.43939 1.57560 i
+2.47475 1.53066 i
+2.51010 1.48184 i
+2.54545 1.42915 i
+2.58081 1.37260 i
+2.61616 1.31223 i
+2.65152 1.24805 i
+2.68687 1.18011 i
+2.72222 1.10845 i
+2.75758 1.03312 i
+2.79293 0.95418 i
+2.82828 0.87170 i
+2.86364 0.78576 i
+2.89899 0.69642 i
+2.93434 0.60380 i
+2.96970 0.50797 i
+3.00505 0.40904 i
+3.04040 0.30713 i
+3.07576 0.20235 i
+3.11111 0.09482 i
+3.14646 -0.01533 i
+3.18182 -0.12796 i
+3.21717 -0.24292 i
+3.25253 -0.36007 i
+3.28788 -0.47926 i
+3.32323 -0.60032 i
+3.35859 -0.72308 i
+3.39394 -0.84739 i
+3.42929 -0.97305 i
+3.46465 -1.09990 i
+3.50000 -1.22774 i
+
+
diff --git a/graphics/pgf/base/doc/version-for-dvisvgm/pgfmanual-dvisvgm.cfg b/graphics/pgf/base/doc/version-for-dvisvgm/pgfmanual-dvisvgm.cfg
new file mode 100644
index 0000000000..118da0bc8a
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-dvisvgm/pgfmanual-dvisvgm.cfg
@@ -0,0 +1,351 @@
+% Copyright 2016 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\def\pgfsysdriver{pgfsys-dvisvgm.def}
+
+\PassOptionsToPackage{hypertex}{hyperref}
+\makeatletter
+\g@addto@macro\selectfont{%
+ \long\edef\longf@family{\f@family}%
+ \ifx\longf@family\ttdefault
+ \ignoreligaturesinfont\font\relax
+ \fi
+}
+\makeatother
+
+\usepackage{graphicx,xcolor}
+
+\def\graphicsdvisvgmtext{dvisvgm.def}
+
+\expandafter\ifx\csname Gin@driver\endcsname\graphicsdvisvgmtext
+\else
+ \PackageError{manual}{You must use dvisvgm.def as your graphics driver}
+\fi
+
+% Make sure to compile this using lualatex.
+
+
+% Add forward button to each page:
+
+\usepackage{everyshi}
+
+\makeatletter
+\newbox\pgfmanualbuttonbox
+\newcount\pgfmanualcount
+\newdimen\mydim
+
+\EveryShipout{%%
+ \setbox255=\vbox{%
+ \pgfkeys{/pgf/fpu=false}%
+ \@tempdima=\ht255\relax%
+ \unvbox255%
+ \vskip-\@tempdima%
+ \pgfmanualaddforwardbackward%
+ \pgfmanualaddtoc%
+ }%
+}
+
+\def\pgfmanualaddforwardbackward{%
+ % Adds page forward and page backward buttons at the left and right
+ % end of each page
+ \let\protect=\relax%
+ \pgfmanualcount=\c@page%
+ \advance\pgfmanualcount by-1\relax%
+ \ifnum\pgfmanualcount>0\relax%
+ \begin{pgfpicture}{1in}{-1in}{1in}{-1in}
+ \special{dvisvgm:raw <g pointer-events="all" visibility="hidden">}
+ \pgftext[top,left]{\href{\jobname-\pgfmanualpadded{\pgfmanualcount}.svg}{{\color{white}\vrule width 2cm height \paperheight}}}
+ \special{dvisvgm:raw </g>}
+ \special{dvisvgm:raw <g pointer-events="all">}
+ \pgftext[top,left]{%
+ \href{\jobname-\pgfmanualpadded{\pgfmanualcount}.svg}
+ {\vbox to \paperheight{\hsize=2cm\vss\centerline{$\blacktriangleleft$}\vss}}}
+ \special{dvisvgm:raw </g>}
+ \end{pgfpicture}%
+ \fi%
+ \advance\pgfmanualcount by2\relax%
+ \begin{pgfpicture}{-\paperwidth+1in}{-1in}{-\paperwidth+1in}{-1in}
+ \special{dvisvgm:raw <g pointer-events="all" visibility="hidden">}
+ \pgftext[top,right]{\href{\jobname-\pgfmanualpadded{\pgfmanualcount}.svg}{\color{white}{\vrule width 2cm height \paperheight}}}
+ \special{dvisvgm:raw </g>}
+ \special{dvisvgm:raw <g pointer-events="all">}
+ \pgftext[top,right]{%
+ \href{\jobname-\pgfmanualpadded{\pgfmanualcount}.svg}%
+ {\vbox to \paperheight{\hsize=2cm\vss\centerline{$\blacktriangleright$}\vss}}}
+ \special{dvisvgm:raw </g>}
+ \end{pgfpicture}%
+}
+
+\newbox\chapterbox
+
+\newcount\pgfmanualpartcount
+\newcount\pgfmanualsectioncount
+\newcount\pgfmanualsubsectioncount
+\newcount\pgfmanualsubsubsectioncount
+
+\newcount\pgfmanualtempcount
+
+\newtoks\toctoks
+{% Read toc into \toctoks
+
+ \global\toctoks{
+ \global\pgfmanualpartcount0\relax
+ \global\pgfmanualsectioncount0\relax
+ \global\pgfmanualsubsectioncount0\relax
+ \global\pgfmanualsubsubsectioncount0\relax
+ }
+
+ \def\contentsline#1#2#3#4{%
+ \expandafter\let\expandafter\pgfmanualhandler\csname pgfmanualhandlekind#1\endcsname%
+ \ifx\pgfmanualhandler\relax%
+ \PackageError{manual}{Unknown contents level '#1'}{}%
+ \else%
+ \pgfmanualhandler{#2}{#3}{#4}%%
+ \fi%
+ \ignorespaces%
+ }
+
+ \def\pgfmanualhandlekindpart#1#2#3{%
+ \pgfmanualtempcount#2\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \edef\pgfmanualtemponepagebefore{\the\pgfmanualtempcount}%
+ \pgfmanualtempcount\pgfmanualpartcount\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \expandafter\xdef\csname pgfmanualpartendpage\the\pgfmanualpartcount\endcsname{\pgfmanualtemponepagebefore}%
+ \global\advance\pgfmanualpartcount by1\relax%
+ \expandafter\gdef\csname pgfmanualpartstartpage\the\pgfmanualpartcount\endcsname{#2}%
+ \expandafter\global\expandafter\toctoks\expandafter{\the\toctoks\pgfmanualtypesetpart{#1}{#2}}%
+ }
+ \def\pgfmanualhandlekindsection#1#2#3{%
+ \pgfmanualtempcount#2\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \edef\pgfmanualtemponepagebefore{\the\pgfmanualtempcount}%
+ \pgfmanualtempcount\pgfmanualsectioncount\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \expandafter\xdef\csname pgfmanualsectionendpage\the\pgfmanualsectioncount\endcsname{\pgfmanualtemponepagebefore}%
+ \global\advance\pgfmanualsectioncount by1\relax%
+ \expandafter\gdef\csname pgfmanualsectionstartpage\the\pgfmanualsectioncount\endcsname{#2}%
+ \expandafter\global\expandafter\toctoks\expandafter{\the\toctoks\pgfmanualtypesetsection{#1}{#2}}%
+ }
+ \def\pgfmanualhandlekindsubsection#1#2#3{%
+ \pgfmanualtempcount#2\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \edef\pgfmanualtemponepagebefore{\the\pgfmanualtempcount}%
+ \pgfmanualtempcount\pgfmanualsubsectioncount\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \expandafter\xdef\csname pgfmanualsubsectionendpage\the\pgfmanualsubsectioncount\endcsname{\pgfmanualtemponepagebefore}%
+ \global\advance\pgfmanualsubsectioncount by1\relax%
+ \expandafter\gdef\csname pgfmanualsubsectionstartpage\the\pgfmanualsubsectioncount\endcsname{#2}%
+ \expandafter\global\expandafter\toctoks\expandafter{\the\toctoks\pgfmanualtypesetsubsection{#1}{#2}}%
+ }
+ \def\pgfmanualhandlekindsubsubsection#1#2#3{%
+ \pgfmanualtempcount#2\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \edef\pgfmanualtemponepagebefore{\the\pgfmanualtempcount}%
+ \pgfmanualtempcount\pgfmanualsubsubsectioncount\relax%
+ \advance\pgfmanualtempcount by-1\relax%
+ \expandafter\xdef\csname pgfmanualsubsubsectionendpage\the\pgfmanualsubsubsectioncount\endcsname{\pgfmanualtemponepagebefore}%
+ \global\advance\pgfmanualsubsubsectioncount by1\relax%
+ \expandafter\gdef\csname pgfmanualsubsubsectionstartpage\the\pgfmanualsubsubsectioncount\endcsname{#2}%
+ \expandafter\global\expandafter\toctoks\expandafter{\the\toctoks\pgfmanualtypesetsubsubsection{#1}{#2}}%
+ }
+ \def\pgfmanualhandlekindparagraph#1#2#3{%
+ % ignore
+ }
+
+ \input{\jobname.toc}%
+}
+
+{\catcode`\#=11
+\gdef\pgfmanualhashmark{#}
+}
+
+\def\pgfmanualaddifnotempty#1#2{%
+ \ifvoid#1%
+ \else%
+ \setbox#1=\vtop{%
+ \hsize\mydim%
+ \leavevmode{\strut#2}%
+ \unvbox#1%
+ }%
+ \fi%
+}
+
+\definecolor{tocbackground}{rgb}{0.99,0.99,0.97}
+
+\def\pgfmanualpickpage#1#2#3#4#5{%
+ \c@pgf@counta#2\relax%
+ \xdef\pgfmanualtocpage{\the\c@pgf@counta}%
+}
+
+\def\pgfmanualaddtoc{%
+ \begingroup
+ \expandafter\let\expandafter\pgfmanualtemp\csname r@table-of-contents\endcsname%
+ \ifx\pgfmanualtemp\relax%
+ \def\pgfmanualtocpage{1}%
+ \else%
+ \expandafter\pgfmanualpickpage\pgfmanualtemp%
+ \fi%
+ \let\numberline\pgfmanualpagetocnumberline%
+ \mydim\paperwidth\advance\mydim by-3cm%
+ \mydim=\mydim\relax%
+ \footnotesize%
+ \setbox\chapterbox=\box\voidb@x%
+ \pgfmanualpagetoctobox{\chapterbox}{\pgfmanualpagetocline{\pgfmanualtocpage}{\Large\textbf{Contents}\vrule
+ width0pt height7mmdepth2.5mm}{0cm}{tocbackground}}%
+ \the\toctoks%
+ \begin{pgfpicture}{1in-1.5cm}{-1in}{1in-1.5cm}{-1in}
+ \pgftext[top,left]{\vbox{%
+ \nointerlineskip%
+ \parskip0pt%
+ \hsize=\mydim%
+ \leftskip0pt%
+ \rightskip0pt%
+ \parindent0pt%
+ \special{dvisvgm:raw
+ <style type="text/css">
+ \pgfmanualhashmark toc:hover \pgfmanualhashmark content { visibility: visible }
+ </style>
+ <g id="toc" opacity=".97">
+ }%
+ \special{dvisvgm:raw <g pointer-events="all" visibility="hidden">}
+ {\color{white}{\vrule width\mydim height 2cm}}\break%
+ \special{dvisvgm:raw </g> }%
+ \hbox{}\vskip-2.6cm\break\leavevmode%
+ \special{dvisvgm:raw
+ <g id="content" visibility="hidden">
+ }%
+ \box\chapterbox\break%
+ \hbox{}\vskip-2pt\break%
+ {\color{tocbackground}{\vrule width\mydim height 5mm}}\break%
+ \special{dvisvgm:raw </g> }%
+ \special{dvisvgm:raw </g> }
+ }}%
+ \end{pgfpicture}
+ \endgroup
+}
+\def\pgfmanualpadded#1{%
+ \ifnum#1<1000 0\fi%
+ \ifnum#1<100 0\fi%
+ \ifnum#1<10 0\fi%
+ \the#1%
+}
+
+\def\pgfmanualpagetocnumberline#1{}
+\def\pgfmanualpagetoctobox#1#2{%
+ \setbox#1=\vtop{%
+ \unvbox#1%
+ #2}%
+}
+\newdimen\pgfmanualtoclineskip
+\pgfmanualtoclineskip1.5pt
+\def\pgfmanualpagetocline#1#2#3#4{%
+ \pgfmanualtempcount#1%
+ \vskip-1pt%
+ \hbox{\href{\jobname-\pgfmanualpadded{\pgfmanualtempcount}.svg}{%
+ \fboxsep0pt%
+ \colorbox{#4}{\vbox{%
+ \vskip\pgfmanualtoclineskip
+ \hsize\mydim%
+ \leftskip#3%
+ \advance\leftskip by5mm%
+ \rightskip1em plus1fil%
+ \advance\rightskip by5mm%
+ \noindent\strut#2\strut}}}}%
+}
+
+
+\newif\ifpgfmanualbetweentest
+
+\def\pgfmanualifin#1#2#3#4{%
+ \pgfmanualbetweentestfalse
+ \expandafter\let\expandafter\pgfmanualstartnum\csname pgfmanual#1startpage\expandafter\the\csname pgfmanual#1count\endcsname\endcsname%
+ \ifx\pgfmanualstartnum\relax%
+ \def\pgfmanualstartnum{-1}%
+ \fi%
+ \expandafter\let\expandafter\pgfmanualendnum\csname pgfmanual#1endpage\expandafter\the\csname pgfmanual#1count\endcsname\endcsname%
+ \ifx\pgfmanualendnum\relax%
+ \def\pgfmanualendnum{1000000000}%
+ \fi%
+ \ifnum\pgfmanualstartnum>\pgfmanualendnum\relax%
+ \let\pgfmanualendnum\pgfmanualstartnum%
+ \fi%
+ \ifnum\pgfmanualstartnum>#2\relax%
+ \else%
+ \ifnum\pgfmanualendnum<#2\relax%
+ \else%
+ \pgfmanualbetweentesttrue%
+ \fi%
+ \fi%
+ \ifpgfmanualbetweentest%
+ #3%
+ \else
+ #4%
+ \fi%
+}
+
+\def\pgfmanualtypesetpart#1#2{%
+ \pgfmanualcleanuppart#1\relax%
+ \global\advance\pgfmanualpartcount by1\relax%
+ \pgfmanualifin{part}{\c@page}{\global\let\pgfmanualthispart\pgfmanualparttext}{}%
+ \pgfmanualpagetoctobox{\chapterbox}{%
+ \pgfmanualpagetocline{#2}{%
+ \pgfmanualifin{part}{\c@page}{\bfseries\pgfmanualparttext}{\pgfmanualparttext}%
+ }{1.5cm}{tocbackground}}%
+}
+\def\pgfmanualcleanuppart#1\hspace#2#3\relax{%
+ \def\pgfmanualparttext{\llap{\hbox to 1.5cm{Part #1\hss}}#3}%
+}
+
+\def\pgfmanualtypesetsection#1#2{%
+ \global\advance\pgfmanualsectioncount by1\relax%
+ \pgfmanualifin{part}{\c@page}{%
+ \pgfmanualifin{section}{\c@page}{\gdef\pgfmanualthischapter{#1}}{}%
+ \pgfmanualpagetoctobox{\chapterbox}{%
+ \def\numberline##1{\llap{##1\hskip3mm}}%
+ \pgfmanualpagetocline{#2}{%
+ \pgfmanualifin{section}{\c@page}{\bfseries\itshape#1}{\itshape#1}%
+ }{1.5cm}{tocbackground}}%
+ }{}%
+}
+\def\pgfmanualtypesetsubsection#1#2{%
+ \global\advance\pgfmanualsubsectioncount by1\relax%
+ \pgfmanualifin{part}{\c@page}{%
+ \pgfmanualifin{section}{\c@page}{%
+ \pgfmanualpagetoctobox{\chapterbox}{%
+ \pgfmanualextraskip5mm%
+ \pgfmanualpagetocline{#2}{
+ \pgfmanualifin{subsection}{\c@page}{\bfseries}{}#1%
+ }{2cm}{tocbackground}}%
+ }{}%
+ }{}%
+}
+\def\pgfmanualtypesetsubsubsection#1#2{%
+ \global\advance\pgfmanualsubsubsectioncount by1\relax%
+ \pgfmanualifin{part}{\c@page}{%
+ \pgfmanualifin{section}{\c@page}{%
+ \pgfmanualextraskip10mm%
+ \pgfmanualpagetoctobox{\chapterbox}{\pgfmanualpagetocline{#2}{%
+ \pgfmanualifin{subsubsection}{\c@page}{\bfseries}{}\itshape#1%
+ }{2.5cm}{tocbackground}}%
+ }{}%
+ }{}%
+}
+\def\pgfmanualsplitnumberline#1{%
+ \pgfmanualsplitnumberline@#1\relax%
+}
+\def\pgfmanualsplitnumberline@#1.#2\relax{%
+ \llap{#1\rlap{.#2}\hskip3mm\hskip\pgfmanualextraskip}%
+}
+\newdimen\pgfmanualextraskip
+
+\makeatother
+
+
+
diff --git a/graphics/pgf/base/doc/version-for-luatex/en/Makefile b/graphics/pgf/base/doc/version-for-luatex/en/Makefile
new file mode 100644
index 0000000000..c1b811d61e
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-luatex/en/Makefile
@@ -0,0 +1,35 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = lualatex
+TEXINPUTS := ../../text-en:../../images:$(TEXINPUTS)
+
+all: $(doc).pdf
+
+pgfmanual.pdf: $(doc).tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+
+test: $(doc)-test.tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex) || true
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+FORCE:
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-luatex/en/pgfmanual-test.tex b/graphics/pgf/base/doc/version-for-luatex/en/pgfmanual-test.tex
new file mode 100644
index 0000000000..3afefe5c9e
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-luatex/en/pgfmanual-test.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-luatex.cfg}
+\input{../../text-en/pgfmanual-en-main-preamble.tex}
+
+\begin{document}
+
+\include{pgfmanual-en-tutorial-chains}
+
+\end{document}
diff --git a/graphics/pgf/base/doc/version-for-luatex/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-luatex/en/pgfmanual.tex
new file mode 100644
index 0000000000..9c8808cab8
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-luatex/en/pgfmanual.tex
@@ -0,0 +1,29 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-luatex.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
+
+
+
+% =============================================================================
+% ToDo for Stefan Pinnow
+%
+% - search and replace for
+% - $x$-coordinate --> $x$ coordinate
+% (and similar)
+% - to-path vs. to--path
+%
+% - remove "spurious" spaces when loading libraries
+% (similar to <https://sourceforge.net/p/pgf/bugs/374/>)
diff --git a/graphics/pgf/base/doc/version-for-luatex/pgfmanual-luatex.cfg b/graphics/pgf/base/doc/version-for-luatex/pgfmanual-luatex.cfg
new file mode 100644
index 0000000000..8befeb01e5
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-luatex/pgfmanual-luatex.cfg
@@ -0,0 +1,21 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\usepackage[hyphens]{url}
+\makeatletter
+\g@addto@macro\selectfont{%
+ \long\edef\longf@family{\f@family}%
+ \ifx\longf@family\ttdefault
+ \ignoreligaturesinfont\font\relax
+ \fi
+}
+\makeatother
+
+% Just make sure to compile this using lualatex.
diff --git a/graphics/pgf/base/doc/version-for-pdftex/en/Makefile b/graphics/pgf/base/doc/version-for-pdftex/en/Makefile
new file mode 100644
index 0000000000..413c8972cc
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-pdftex/en/Makefile
@@ -0,0 +1,35 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = pdflatex
+TEXINPUTS := ../../text-en:../../images:$(TEXINPUTS)
+
+all: $(doc).pdf
+
+pgfmanual.pdf: $(doc).tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+
+test: $(doc)-test.tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc)-test.tex) || true
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+FORCE:
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-pdftex/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-pdftex/en/pgfmanual.tex
new file mode 100644
index 0000000000..e1eb4e9942
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-pdftex/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-pdftex.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-pdftex/pgfmanual-pdftex.cfg b/graphics/pgf/base/doc/version-for-pdftex/pgfmanual-pdftex.cfg
new file mode 100644
index 0000000000..39a7955e69
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-pdftex/pgfmanual-pdftex.cfg
@@ -0,0 +1,21 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\usepackage[hyphens]{url}
+\makeatletter
+\g@addto@macro\selectfont{%
+ \long\edef\longf@family{\f@family}%
+ \ifx\longf@family\ttdefault
+ \pdfnoligatures\font\relax
+ \fi
+}
+\makeatother
+
+% Just make sure to compile this using pdfelatex.
diff --git a/graphics/pgf/base/doc/version-for-tex4ht/en/Makefile b/graphics/pgf/base/doc/version-for-tex4ht/en/Makefile
new file mode 100644
index 0000000000..4652399536
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-tex4ht/en/Makefile
@@ -0,0 +1,43 @@
+doc = pgfmanual
+latex = htlatex
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).html
+
+pgfmanual.idx:
+ touch pgfmanual.idx
+
+pgfmanual.ind: pgfmanual.idx
+ makeindex $(doc).idx
+
+pgfmanual.html: $(doc).tex $(doc).ind revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.*gif \
+ pgfmanual.*html \
+ pgfmanual.*svg \
+ pgfmanual.xref \
+ pgfmanual.css \
+ pgfmanual.4ct \
+ pgfmanual.4tc \
+ pgfmanual.dvi \
+ pgfmanual.lg \
+ pgfmanual.idv \
+ pgfmanual*.aux \
+ *.png
diff --git a/graphics/pgf/base/doc/version-for-tex4ht/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-tex4ht/en/pgfmanual.tex
new file mode 100644
index 0000000000..4bc4b274f7
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-tex4ht/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-tex4ht.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-tex4ht/pgfmanual-tex4ht.cfg b/graphics/pgf/base/doc/version-for-tex4ht/pgfmanual-tex4ht.cfg
new file mode 100644
index 0000000000..99a00db7e3
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-tex4ht/pgfmanual-tex4ht.cfg
@@ -0,0 +1,130 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+% Make sure to use tex4ht (or htlatex, to be precise) to compile this.
+
+\usepackage{tex4ht}
+\def\pgfsysdriver{pgfsys-tex4ht.def}
+
+\usepackage{xkeyval}
+\usepackage{colortbl}
+
+\makeatletter
+
+\AtBeginDocument{
+\CutAt{section,part}
+\definecolor{graphicbackground}{rgb}{0.96,0.96,0.8}
+\definecolor{codebackground}{rgb}{0.8,0.8,1}
+\definecolor{declarebg}{rgb}{1,0.8,0.8}
+\definecolor{gray}{gray}{.5}
+\definecolor{darkgreen}{rgb}{0,.5,0}
+\definecolor{orange}{rgb}{1,.5,0}
+\definecolor{mintgreen}{rgb}{.5,.75,.5}
+\definecolor{input}{rgb}{0,0,0.8}
+\definecolor{output}{rgb}{0.7,0,0}
+\definecolor{triangle}{rgb}{1,0.5,0}
+\definecolor{border}{rgb}{0,0.8,0}
+
+% Patches of macros...
+\renewenvironment{pgfmanualentry}{\begin{description}}{\end{description}}
+\renewcommand\pgfmanualentryheadline[1]{\item[\colorbox{declarebg}{\normalfont{#1}}]\par}
+\renewcommand\pgfmanualbody{}
+
+\def\endofcodeexample#1{%
+ \endgroup%
+ \ifcode@execute%
+ \setbox\codeexamplebox=\hbox{%
+ {%
+ {%
+ \returntospace%
+ \commenthandler%
+ \xdef\code@temp{#1}% removes returns and comments
+ }%
+ \color{black}\ignorespaces%
+ \code@pre\expandafter\scantokens\expandafter{\code@temp\ignorespaces}\code@post\ignorespaces%
+ }%
+ }%
+ \ifdim\wd\codeexamplebox>\codeexamplewidth%
+ \box\codeexamplebox
+ \begin{tabular}{>{\columncolor{codebackground}}l}
+ \begin{minipage}{\textwidth}
+ {%
+ \let\do\@makeother
+ \dospecials
+ \frenchspacing\@vobeyspaces
+ \normalfont\ttfamily\footnotesize
+ \typesetcomment%
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode \null \@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+ \obeylines
+ \everypar \expandafter{\the\everypar \unpenalty}%
+ #1}
+ \end{minipage}
+ \end{tabular}%
+ \else
+ \begin{tabular}{>{\columncolor{graphicbackground}}l>{\columncolor{codebackground}}l}
+ \ \box\codeexamplebox\ \par &
+ \begin{minipage}[t]{\textwidth}
+ {\let\do\@makeother
+ \dospecials
+ \frenchspacing\@vobeyspaces
+ \normalfont\ttfamily\footnotesize
+ \typesetcomment%
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode \null \@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+ \obeylines
+ \everypar \expandafter{\the\everypar \unpenalty}%
+ #1}
+ \end{minipage}
+ \end{tabular}
+ \fi
+ \else%
+ \begin{tabular}{>{\columncolor{codebackground}}l}
+ \begin{minipage}[t]{\textwidth}
+ {%
+ \let\do\@makeother
+ \dospecials
+ \frenchspacing\@vobeyspaces
+ \normalfont\ttfamily\footnotesize
+ \typesetcomment%
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode \null \@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+ \obeylines
+ \everypar \expandafter{\the\everypar \unpenalty}%
+ #1}
+ \end{minipage}
+ \end{tabular}%
+ \fi%
+ \par%
+ \end{codeexample}
+}
+}
+
+
+
+\makeatother
diff --git a/graphics/pgf/base/doc/version-for-vtex/en/Makefile b/graphics/pgf/base/doc/version-for-vtex/en/Makefile
new file mode 100644
index 0000000000..77750aee20
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-vtex/en/Makefile
@@ -0,0 +1,29 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = vlatex
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).ps
+
+pgfmanual.ps: $(doc).tex revisionfile
+ TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-vtex/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-vtex/en/pgfmanual.tex
new file mode 100644
index 0000000000..a0618eb5af
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-vtex/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-vtex.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-vtex/pgfmanual-vtex.cfg b/graphics/pgf/base/doc/version-for-vtex/pgfmanual-vtex.cfg
new file mode 100644
index 0000000000..3012c71416
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-vtex/pgfmanual-vtex.cfg
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\usepackage[hyphens]{url}
+\usepackage[vtex]{graphics}
+
+\let\command=\undefined
+\let\endcommand=\undefined
+
+% Just make sure that you compile this using elatex + dvips
diff --git a/graphics/pgf/base/doc/version-for-xetex/en/Makefile b/graphics/pgf/base/doc/version-for-xetex/en/Makefile
new file mode 100644
index 0000000000..2f84eb5a51
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-xetex/en/Makefile
@@ -0,0 +1,30 @@
+rerun = "(There were undefined references|Rerun to get (cross-references|the bars) right)"
+doc = pgfmanual
+latex = xelatex --no-pdf
+TEXINPUTS := ../../text-en:$(TEXINPUTS)
+
+all: $(doc).pdf
+
+pgfmanual.pdf: $(doc).tex revisionfile
+ (TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ (egrep -q $(rerun) $(doc).log && TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex) || true
+ xdvipdfmx -p a4 $(doc)
+
+revisionfile:
+ cd ../../../../.. && ./scripts/pgf/pgfrevisionfile.sh
+
+clean:
+ rm -f \
+ plots/* \
+ pgfmanual.out \
+ pgfmanual.log \
+ pgfmanual.idx \
+ pgfmanual.ind \
+ pgfmanual.ilg \
+ pgfmanual.pdf \
+ pgfmanual.toc \
+ pgfmanual.bbl \
+ pgfmanual.blg \
+ pgfmanual.ps \
+ pgfmanual.dvi \
+ pgfmanual*.aux
diff --git a/graphics/pgf/base/doc/version-for-xetex/en/pgfmanual.tex b/graphics/pgf/base/doc/version-for-xetex/en/pgfmanual.tex
new file mode 100644
index 0000000000..647d821179
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-xetex/en/pgfmanual.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\documentclass[a4paper]{ltxdoc}
+
+% pgf version is defined in \pgfversion in file
+% generic/pgf/utilities/pgfrcs.code.tex
+
+\input{../pgfmanual-xetex.cfg}
+\input{../../text-en/pgfmanual-en-main.tex}
diff --git a/graphics/pgf/base/doc/version-for-xetex/pgfmanual-xetex.cfg b/graphics/pgf/base/doc/version-for-xetex/pgfmanual-xetex.cfg
new file mode 100644
index 0000000000..42c1be069f
--- /dev/null
+++ b/graphics/pgf/base/doc/version-for-xetex/pgfmanual-xetex.cfg
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\usepackage[hyphens]{url}
+
+\usepackage[xetex]{graphics}
+% This will tell everyone which driver we are using.
+
+\PassOptionsToPackage{xetex}{hyperref}
+
+% Make sure to compile this using xelatex + xdvipdfmx.
diff --git a/graphics/pgf/base/lua/generic/pgf/manual.lua b/graphics/pgf/base/lua/generic/pgf/manual.lua
new file mode 100644
index 0000000000..7142eea3ec
--- /dev/null
+++ b/graphics/pgf/base/lua/generic/pgf/manual.lua
@@ -0,0 +1,18 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+local manual = {}
+
+require 'pgf'.manual = manual
+
+return manual
diff --git a/graphics/pgf/base/lua/generic/pgf/manual/DocumentParser.lua b/graphics/pgf/base/lua/generic/pgf/manual/DocumentParser.lua
new file mode 100644
index 0000000000..d2f6780822
--- /dev/null
+++ b/graphics/pgf/base/lua/generic/pgf/manual/DocumentParser.lua
@@ -0,0 +1,598 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This class offers functions for converting the documentation of Lua
+-- and other code into \TeX.
+--
+-- @field renderers This array must consist of tables having two
+-- fields: |test| and |renderer|. The first must be set to a function
+-- that is called with an information table as parameter and must
+-- return |true| if the function stored in the |renderer| should be
+-- called. (Typically, the |test| will test whether the ``head line''
+-- following a documentation block has a special form.)
+
+local DocumentParser = {
+ renderers = {}
+}
+
+-- Namespace:
+require 'pgf.manual'.DocumentParser = DocumentParser
+
+-- Imports
+local keys = require 'pgf.gd.interface.InterfaceCore'.keys
+
+-- Forwards:
+
+local collect_infos, render_infos
+
+
+---
+-- Includes the documentation stored in some file in the manual.
+--
+-- @param filename The file from which the documentation is to be read
+-- @param type The type of the file.
+
+function DocumentParser.include(filename, typ)
+
+ local fullname = assert(kpse.find_file(filename:gsub("%.", "/"), typ or "lua")
+ or kpse.find_file(filename:gsub("%.", "\\"), typ or "lua"),
+ "file " .. filename .. " not found")
+
+ local file, error = io.open(fullname)
+
+ -- First, let us read the file into a table to make handling easier:
+ local lines = {}
+
+ for line in file:lines() do
+ lines [#lines + 1] = line
+ end
+
+ -- A table storing the current output. The array part contains TeX
+ -- lines, the table part contains information about special table.s
+ local output = {}
+
+ -- Now, start the main parser loop.
+ local i = 1
+ while i <= #lines do
+
+ if lines[i]:match("^%-%-%-") then
+ local infos = collect_infos (lines, i)
+
+ infos.filename = filename
+
+ render_infos(infos, output)
+
+ i = infos.last_line
+ end
+
+ i = i + 1
+ end
+
+ -- Render output:
+ for _,l in ipairs(output) do
+ if type(l) == "string" then
+ tex.print(l)
+ else
+ l()
+ end
+ end
+
+end
+
+
+
+---
+-- Add a test and a renderer to the array of renderers.
+--
+-- @param test A test function (see |DocumentParser.renderers|).
+-- @param renderer A rendering function.
+
+function DocumentParser.addRenderer (test, renderer)
+ DocumentParser.renderers [#DocumentParser.renderers + 1] =
+ { test = test, renderer = renderer }
+end
+
+
+-- Forwards:
+local print_on_output, print_on_output_escape, print_docline_on_output, open_mode, close_mode, print_lines_on_output
+
+
+
+local function strip_quotes(s)
+ if s then return string.gsub(s, '^"(.*)"$', "%1") end
+end
+
+local function split(s)
+ local t = {}
+ for line in string.gmatch(s, ".-\n") do
+ t[#t+1] = line
+ end
+ for i=#t,1,-1 do
+ if t[i]:match("^%s*$") then
+ t[i] = nil
+ else
+ return t
+ end
+ end
+ return t
+end
+
+
+local function process_string(s)
+ if s then
+ local t = split(s.."\n")
+ -- Compute min spaces
+ local min = math.huge
+ for _,l in ipairs(t) do
+ min = math.min(min, string.find(l, "%S") or math.huge)
+ end
+ if min < math.huge then
+ -- Now, trim 'em all!
+ for i=1,#t do
+ t[i] = string.sub(t[i],min,-2)
+ end
+ end
+ return t
+ end
+end
+
+
+local function process_examples(t)
+ if not t then
+ return nil
+ end
+
+ if type(t) == "string" then
+ t = {t}
+ end
+
+ local n = {}
+ for i=1,#t do
+ n[i] = process_string(strip_quotes(t[i]))
+ end
+ return n
+end
+
+
+
+-- The standard renderers:
+
+
+-- The function renderer
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return
+ infos.keywords["function"] or
+ infos.head_line:match("^%s*function%s+") or
+ infos.head_line:match("^%s*local%s+function%s+")
+ end,
+ function (infos, output)
+ -- The renderer
+
+ if infos.keywords["function"] then
+ local k = infos.keywords["function"][1]
+ infos.head_line = k:match("^%s*@(.*)")
+ end
+
+ local rest = infos.head_line:match("function%s+(.*)")
+ local tab = rest:match("([^(]*[%.%:]).*")
+ local fun = rest:match("[^(]*[%.%:](.-)%s*%(") or rest:match("(.-)%s*%(")
+ local pars = rest:match(".-%((.*)%)")
+
+ -- Render the head
+ print_on_output_escape(output, [[\begin{luacommand}]])
+ output[#output+1] = "{" .. (tab or "") .. fun .. "}"
+ print_on_output_escape(output,
+ "{", tab or "", "}",
+ "{", fun, "}",
+ "{", pars, "}")
+
+ if tab then
+ local table_name = tab:sub(1,-2)
+ local t = output[table_name] or {}
+ t[#t+1] = {
+ link = "pgf/lua/" .. tab .. fun,
+ text = "function " .. tab .. "\\declare{" .. fun .. "} (" .. pars .. ")"
+ }
+ output[table_name] = t
+ end
+
+ local mode = "text"
+ for _,l in ipairs(infos.doc_lines) do
+ if mode ~= "done" then
+ mode = print_docline_on_output(output, l, mode)
+ end
+ end
+ close_mode(output, mode)
+
+ print_on_output(output, [[\end{luacommand}]])
+
+ end
+)
+
+
+-- The table renderer
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return
+ infos.keywords["table"] or
+ infos.head_line:match("=%s*{")
+ end,
+ function (infos, output)
+ -- The renderer
+
+ if infos.keywords["table"] then
+ local k = infos.keywords["table"][1]
+ infos.head_line = k:match("^%s*@table(.*)") .. "="
+ end
+
+ local name =
+ infos.head_line:match("^%s*local%s+(.-)%s*=") or
+ infos.head_line:match("^%s*(.*)%s*=")
+
+ -- Render the head
+ print_on_output_escape(output,
+ [[\begin{luatable}]],
+ "{", name:match("(.*[%.%:]).*") or "", "}",
+ "{", name:match(".*[%.%:](*-)") or name,"}",
+ "{", infos.filename, "}")
+
+ local mode = "text"
+ for _,l in ipairs(infos.doc_lines) do
+ mode = print_docline_on_output(output, l, mode)
+ end
+ close_mode(output, mode)
+
+ output[#output+1] =
+ function ()
+ if output[name] then
+ tex.print("\\par\\emph{Alphabetical method summary:}\\par{\\small")
+ table.sort(output[name], function (a,b) return a.text < b.text end)
+ for _,l in ipairs(output[name]) do
+ tex.print("\\texttt{\\hyperlink{" .. l.link .. "}{" .. l.text:gsub("_", "\\_") .. "}}\\par")
+ end
+ tex.print("}")
+ end
+ end
+
+ print_on_output(output, [[\end{luatable}]])
+
+ end
+)
+
+
+
+-- The library renderer
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return infos.keywords["library"]
+ end,
+ function (infos, output)
+ -- The renderer
+
+ local name = infos.filename:gsub("%.library$",""):gsub("^pgf%.gd%.","")
+
+ -- Render the head
+ print_on_output_escape(output, "\\begin{lualibrary}{", name, "}")
+
+ local mode = "text"
+ for _,l in ipairs(infos.doc_lines) do
+ mode = print_docline_on_output(output, l, mode)
+ end
+ close_mode(output, mode)
+
+ print_on_output(output, "\\end{lualibrary}")
+
+ end
+)
+
+
+-- The section renderer
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return infos.keywords["section"]
+ end,
+ function (infos, output)
+ -- The renderer
+ local mode = "text"
+ for _,l in ipairs(infos.doc_lines) do
+ mode = print_docline_on_output(output, l, mode)
+ end
+ close_mode(output, mode)
+ end
+)
+
+
+-- The documentation (plain text) renderer
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return infos.keywords["documentation"]
+ end,
+ function (infos, output)
+ -- The renderer
+ local mode = "text"
+ for _,l in ipairs(infos.doc_lines) do
+ mode = print_docline_on_output(output, l, mode)
+ end
+ close_mode(output, mode)
+ end
+)
+
+
+-- The declare renderer
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return
+ infos.keywords["declare"] or
+ infos.head_line:match("declare%s*{") or
+ infos.head_line:match("^%s*key%s*")
+ end,
+ function (infos, output)
+ -- The renderer
+
+ local key_name
+
+ if infos.keywords["declare"] then
+ local k = infos.keywords["declare"][1]
+ key_name = k:match("^%s*@declare%s*(.*)")
+ elseif infos.head_line:match("^%s*key%s*") then
+ key_name = infos.head_line:match('^%s*key%s*"(.*)"') or
+ infos.head_line:match("^%s*key%s*'(.*)'")
+ else
+ local l = infos.lines [infos.last_line + 1]
+ key_name = l:match('key%s*=%s*"(.*)"') or l:match("key%s*=%s*'(.*)'")
+ end
+
+ assert (key_name, "could not determine key")
+ local key = assert (keys[key_name], "unknown key '" .. key_name .. "'")
+
+ -- Render the head
+ if key.type then
+ print_on_output_escape(output,
+ "\\begin{luadeclare}",
+ "{", key.key, "}",
+ "{\\meta{", key.type, "}}",
+ "{", key.default or "", "}",
+ "{", key.initial or "", "}")
+ else
+ print_on_output_escape(output,
+ "\\begin{luadeclarestyle}",
+ "{", key.key, "}",
+ "{}",
+ "{", key.default or "", "}",
+ "{", key.initial or "", "}")
+ end
+
+
+ local mode = "text"
+
+ print_lines_on_output(output, process_string(strip_quotes(key.summary)))
+ print_lines_on_output(output, process_string(strip_quotes(key.documentation)))
+
+ if key.examples then
+ local e = process_examples(key.examples)
+ print_on_output(output,
+ "\\par\\smallskip\\emph{Example" .. (((#e>1) and "s") or "") .. "}\\par")
+ for _,example in ipairs(e) do
+ print_on_output(output, "\\begin{codeexample}[]")
+ print_lines_on_output(output, example)
+ print_on_output(output, "\\end{codeexample}")
+ end
+ end
+
+ print_on_output(output, key.type and "\\end{luadeclare}" or "\\end{luadeclarestyle}")
+ end
+)
+
+
+
+-- The empty line
+DocumentParser.addRenderer (
+ function (infos)
+ -- The test
+ return
+ #infos.doc_lines == 1 and
+ infos.doc_lines[1]:match("^%-*%s*$")
+ end,
+ function (infos, output)
+ end
+)
+
+
+function print_lines_on_output(output, lines)
+ for _,l in ipairs(lines or {}) do
+ output[#output+1] = l
+ end
+end
+
+function print_on_output(output, ...)
+ local args = {...}
+ if #args > 0 then
+ for i = 1, #args do
+ args[i] = tostring(args[i])
+ end
+ output[#output+1] = table.concat(args)
+ end
+end
+
+function print_on_output_escape(output, ...)
+ local args = {...}
+ if #args > 0 then
+ for i = 1, #args do
+ args[i] = tostring(args[i]):gsub("_", "\\_")
+ end
+ output[#output+1] = table.concat(args)
+ end
+end
+
+
+function print_docline_on_output(output, l, mode)
+
+ if l:match("^%s*@section") then
+ print_on_output(output, "\\", l:match("%s*@section%s*(.*)"))
+ elseif l:match("^%s*@param%s+") then
+ if mode ~= "param" then
+ close_mode (output, mode)
+ mode = open_mode (output, "param")
+ end
+ print_on_output(output, "\\item[\\texttt{",
+ l:match("%s@param%s+(.-)%s"):gsub("_", "\\_"),
+ "}] ",
+ l:match("%s@param%s+.-%s+(.*)"))
+ elseif l:match("^%s*@return%s+") then
+ if mode ~= "return" then
+ close_mode (output, mode)
+ mode = open_mode (output, "returns")
+ end
+ print_on_output(output, "\\item[]", l:match("%s@return%s+(.*)"))
+ elseif l:match("^%s*@see%s+") then
+ if mode ~= "text" then
+ close_mode (output, mode)
+ mode = open_mode (output, "text")
+ end
+ print_on_output(output, "\\par\\emph{See also:} \\texttt{",
+ l:match("%s@see%s+(.*)"):gsub("_", "\\_"),
+ "}")
+ elseif l:match("^%s*@usage%s+") then
+ if mode ~= "text" then
+ close_mode (output, mode)
+ mode = open_mode (output, "text")
+ end
+ print_on_output(output, "\\par\\emph{Usage:} ",
+ l:match("%s@usage%s+(.*)"))
+ elseif l:match("^%s*@field+") then
+ close_mode (output, mode)
+ mode = open_mode (output, "field")
+ print_on_output(output, "{",
+ (l:match("%s@field%s+(.-)%s") or l:match("%s@field%s+(.*)")):gsub("_", "\\_"),
+ "}",
+ l:match("%s@field%s+.-%s+(.*)"))
+ elseif l:match("^%s*@done") or l:match("^%s*@text") then
+ close_mode(output, mode)
+ print_on_output(output, l)
+
+ mode = "text"
+ elseif l:match("^%s*@library") then
+ -- do nothing
+ elseif l:match("^%s*@function") then
+ -- do nothing
+ elseif l:match("^%s*@end") then
+ close_mode(output, mode)
+ mode = "done"
+ elseif l:match("^%s*@") then
+ error("Unknown mark " .. l)
+ else
+ print_on_output(output, l)
+ end
+
+ return mode
+end
+
+function open_mode (output, mode)
+ if mode == "param" then
+ print_on_output(output, "\\begin{luaparameters}")
+ elseif mode == "field" then
+ print_on_output(output, "\\begin{luafield}")
+ elseif mode == "returns" then
+ print_on_output(output, "\\begin{luareturns}")
+ end
+ return mode
+end
+
+function close_mode (output, mode)
+ if mode == "param" then
+ print_on_output(output, "\\end{luaparameters}")
+ elseif mode == "field" then
+ print_on_output(output, "\\end{luafield}")
+ elseif mode == "returns" then
+ print_on_output(output, "\\end{luareturns}")
+ end
+ return mode
+end
+
+
+function collect_infos (lines, i, state)
+
+ local doc_lines = {}
+
+ local keywords = {}
+
+ local function find_keywords(line)
+ local keyword = line:match("^%s*@([^%s]*)")
+ if keyword then
+ local t = keywords[keyword] or {}
+ t[#t+1] = line
+ keywords[keyword] = t
+ end
+ return line
+ end
+
+ -- Copy triple matches:
+ while lines[i] and lines[i]:match("^%-%-%-") do
+ doc_lines [#doc_lines + 1] = find_keywords(lines[i]:sub(4))
+ i = i + 1
+ end
+
+ -- Continue with double matches:
+ while lines[i] and lines[i]:match("^%-%-") do
+ doc_lines [#doc_lines + 1] = find_keywords(lines[i]:sub(3))
+ i = i + 1
+ end
+
+ local head_line = ""
+
+ if not keywords["end"] then
+ -- Skip empty lines
+ while lines[i] and lines[i]:match("^%s*$") do
+ i = i + 1
+ end
+ head_line = lines[i] or ""
+ if lines[i] and lines[i]:match("^%-%-%-") then
+ i = i - 1
+ end
+ end
+
+ return {
+ lines = lines,
+ last_line = i,
+ doc_lines = doc_lines,
+ keywords = keywords,
+ head_line = head_line
+ }
+
+end
+
+
+
+function render_infos(infos, state)
+
+ for _,renderer in ipairs(DocumentParser.renderers) do
+ if renderer.test (infos, state) then
+ renderer.renderer (infos, state)
+ return
+ end
+ end
+
+ pgf.debug(infos)
+ error("Unknown documentation type")
+end
+
+
+return DocumentParser
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf.lua b/graphics/pgf/base/lua/graphdrawing/pgf.lua
new file mode 100644
index 0000000000..b0a3247616
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf.lua
@@ -0,0 +1,72 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- The |pgf| namespace lies in the global namespace. It is the only
+-- global table defined by \pgfname. The whole graph drawing system,
+-- in turn, lies in the table |pgf.gd|.
+
+pgf = {}
+
+
+
+-- Forward
+local tostring_table
+
+---
+-- Writes debug info on the \TeX\ output, separating the parameters
+-- by spaces. The debug information will include a complete traceback
+-- of the stack, allowing you to see ``where you are'' inside the Lua
+-- program.
+--
+-- Note that this function resides directly in the |pgf| table. The
+-- reason for this is that you can ``always use it'' since |pgf| is
+-- always available in the global name space.
+--
+-- @param ... List of parameters to write to the \TeX\ output.
+
+function pgf.debug(...)
+ local stacktrace = debug.traceback("",2)
+ texio.write_nl(" ")
+ texio.write_nl("Debug called for: ")
+ -- this is to even print out nil arguments in between
+ local args = {...}
+ for i = 1, #args do
+ if i ~= 1 then texio.write(", ") end
+ texio.write(tostring_table(args[i], "", 5))
+ end
+ texio.write_nl('')
+ for w in string.gmatch(stacktrace, "/.-:.-:.-%c") do
+ texio.write('by ', string.match(w,".*/(.*)"))
+ end
+end
+
+
+-- Helper function
+
+function tostring_table(t, prefix, depth)
+ if type(t) ~= "table" or (getmetatable(t) and getmetatable(t).__tostring) or depth <= 0 then
+ return type(t) == "string" and ('"' .. t .. '"') or tostring(t)
+ else
+ local r = "{\n"
+ for k,v in pairs(t) do
+ r = r .. prefix .. " " .. tostring(k) .. "=" ..
+ (v==t and "self" or tostring_table(v, prefix .. " ", depth-1)) .. ",\n"
+ end
+ return r .. prefix .. "}"
+ end
+end
+
+
+
+
+return pgf \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd.lua
new file mode 100644
index 0000000000..20d8acafa5
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd.lua
@@ -0,0 +1,72 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+
+-- Declare the gd namespace
+
+local gd = {}
+require("pgf").gd = gd
+
+
+
+
+
+
+
+-- Deprecated:
+--
+--
+-- Helping function for creating new algorithm classes
+--
+-- This function creates a new algorithm class. This class will have a
+-- new method, that takes a graph and, optionally, a parent algorithm
+-- as inputs. They will be stored in the "graph" and "parent_algorithm"
+-- fields, respectively.
+--
+-- @param info This table is used to configure the new class. It has
+-- the following fields: First, there is the "properties" table. If
+-- this table is present, it will be used as the default table. Second,
+-- it can have a graph_parameters table. This table will be used in the
+-- constructor to preload graph parameters from the pgf layer. For
+-- this, each entry of the table should be of the form
+--
+-- key = 'string'
+--
+-- What happens is that upon the creation of a new algorithm object,
+-- for each key we lookup the graph option 'string' and
+-- store its value in the key of the new algorithm object.
+--
+-- @return A table that is a class with a new function setup.
+
+function gd.new_algorithm_class (class)
+ class.__index = class
+ class.new =
+ function (initial)
+
+ -- Create new object
+ local obj = {}
+ for k,v in pairs(initial) do
+ obj[k] = v
+ end
+ setmetatable(obj, class)
+
+ return obj
+ end
+ class.preconditions = {}
+ class.postconditions = {}
+
+ return class
+end
+
+
+return gd
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings.lua
new file mode 100644
index 0000000000..410da3af45
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.bindings = {}
+
+
+-- Done
+
+return pgf.gd.bindings \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/Binding.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/Binding.lua
new file mode 100644
index 0000000000..6ffb4168f5
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/Binding.lua
@@ -0,0 +1,265 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local Storage = require "pgf.gd.lib.Storage"
+
+
+---
+-- This class provides a (non-functional) default implementation of a
+-- binding between a display layer and the algorithm layer. Subclasses
+-- must implement most of the member functions declared in this class.
+--
+-- A instance of a subclass of this class encapsulates the complete
+-- implementation of all specific code needed for the communication
+-- between the display layer and the graph drawing engine.
+--
+-- Note that you never call the methods of a |Binding| object
+-- directly, neither from the display layer nor from the algorithm
+-- layer. Instead, you use the more powerful and more easy to use
+-- functions from |InterfaceToDisplay| and
+-- |InterfaceToAlgorithms|. They call the appropriate |Binding|
+-- methods internally.
+--
+-- Because of the above, in order to use the graph drawing system
+-- inside a new display layer, you need to subclass |Binding| and
+-- implement all the functions. Then you need to write the display
+-- layer in such a way that it calls the appropriate functions from
+-- |InterfaceToDisplay|.
+--
+-- @field storage A |Storage| storing the information passed from the
+-- display layer. The interpretation of this left to the actual
+-- binding.
+
+local Binding = {
+ storage = Storage.newTableStorage ()
+}
+Binding.__index = Binding
+
+-- Namespace
+require("pgf.gd.bindings").Binding = Binding
+
+
+
+
+
+--
+-- This method gets called whenever the graph drawing coroutine should
+-- be resumed. First, the binding layer should ask the display layer
+-- to execute the |code|, then, after this is done, the function
+-- |InterfaceToDisplay.resumeGraphDrawingCoroutine| should be called
+-- by this function.
+--
+-- @param code Some code to be executed by the display layer.
+
+function Binding:resumeGraphDrawingCoroutine(code)
+ -- Does nothing by default
+end
+
+
+---
+-- Declare a new key. This callback is called by |declare|. It is the job
+-- of the display layer to make the parameter |t.key| available to the
+-- parsing process. Furthermore, if |t.initial| is not |nil|, the
+-- display layer must convert it into a value that is stored as the
+-- initial value and call |InterfaceToDisplay.setOptionInitial|.
+--
+-- @param t See |InterfaceToAlgorithms.declare| for details.
+
+function Binding:declareCallback(t)
+ -- Does nothing by default
+end
+
+
+
+
+-- Rendering
+
+---
+-- This function and, later on, |renderStop| are called whenever the
+-- rendering of a laid-out graph starts or stops. See
+-- |InterfaceToDisplay.render| for details.
+
+function Binding:renderStart()
+ -- Does nothing by default
+end
+
+---
+-- See |renderStart|.
+
+function Binding:renderStop()
+ -- Does nothing by default
+end
+
+
+
+
+
+---
+-- This function and the corresponding |...Stop...| functions are
+-- called whenever a collection kind should be rendered. See
+-- |InterfaceToDisplay.render_collections| for details.
+--
+-- @param kind The kind (a string).
+-- @param layer The kind's layer (a number).
+
+function Binding:renderCollectionStartKind(kind, layer)
+ -- Does nothing by default
+end
+
+
+---
+-- The counterpart to |renderCollectionStartKind|.
+--
+-- @param kind The kind.
+-- @param layer The kind's layer.
+
+function Binding:renderCollectionStopKind(kind, layer)
+ -- Does nothing by default
+end
+
+
+---
+-- Renders a single collection, see |renderCollectionStartKind| for
+-- details.
+--
+-- @param collection The collection object.
+
+function Binding:renderCollection(collection)
+ -- Does nothing by default
+end
+
+
+
+---
+-- This function and the corresponding |...Stop...| functions are
+-- called whenever a vertex should be rendered. See
+-- |InterfaceToDisplay.render_vertices| for details.
+--
+
+function Binding:renderVerticesStart()
+ -- Does nothing by default
+end
+
+
+---
+-- The counterpart to |renderVerticesStop|.
+--
+
+function Binding:renderVerticesStop()
+ -- Does nothing by default
+end
+
+
+---
+-- Renders a single vertex, see |renderVertexStartKind| for
+-- details.
+--
+-- @param vertex The |Vertex| object.
+
+function Binding:renderVertex(vertex)
+ -- Does nothing by default
+end
+
+
+
+---
+-- This method is called by the interface to the display layer after
+-- the display layer has called |createVertex| to create a new
+-- vertex. After having done its internal bookkeeping, the interface
+-- calls this function to allow the binding to perform further
+-- bookkeeping on the node. Typically, this will be done using the
+-- information stored in |Binding.infos|.
+--
+-- @param v The vertex.
+
+function Binding:everyVertexCreation(v)
+ -- Does nothing by default
+end
+
+
+
+
+
+---
+-- This function and the corresponding |...Stop...| functions are
+-- called whenever an edge should be rendered. See
+-- |InterfaceToDisplay.render_edges| for details.
+--
+
+function Binding:renderEdgesStart()
+ -- Does nothing by default
+end
+
+
+---
+-- The counterpart to |renderEdgesStop|.
+--
+
+function Binding:renderEdgesStop()
+ -- Does nothing by default
+end
+
+
+---
+-- Renders a single vertex, see |renderEdgeStartKind| for
+-- details.
+--
+-- @param edge The |Edge| object.
+
+function Binding:renderEdge(edge)
+ -- Does nothing by default
+end
+
+
+---
+-- Like |everyVertexCreation|, only for edges.
+--
+-- @param e The edge.
+
+function Binding:everyEdgeCreation(e)
+ -- Does nothing by default
+end
+
+
+---
+-- Generate a new vertex. This method will be called when the
+-- \emph{algorithm} layer wishes to trigger the creation of a new
+-- vertex. This call will be made while an algorithm is running. It is
+-- now the job of the binding to cause the display layer to create the
+-- node. This is done by calling the |yield| method of the scope's
+-- coroutine.
+--
+-- @param init A table of initial values for the node. The following
+-- fields will be used:
+-- %
+-- \begin{itemize}
+-- \item |name| If present, this name will be given to the
+-- node. If not present, an internal name is generated. Note that,
+-- unless the node is a subgraph node, this name may not be the name
+-- of an already present node of the graph; in this case an error
+-- results.
+-- \item |shape| If present, a shape of the node.
+-- \item |generated_options| A table that is passed back to the
+-- display layer as a list of key--value pairs.
+-- \item |text| The text of the node, to be passed back to the
+-- higher layer. This is what should be displayed as the node's text.
+-- \end{itemize}
+
+function Binding:createVertex(init)
+ -- Does nothing by default
+end
+
+
+
+
+return Binding \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/BindingToPGF.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/BindingToPGF.lua
new file mode 100644
index 0000000000..5324a1652e
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/bindings/BindingToPGF.lua
@@ -0,0 +1,374 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+-- Imports
+local Storage = require "pgf.gd.lib.Storage"
+
+
+---
+-- This class, which is a subclass of |Binding|, binds the graph
+-- drawing system to the \pgfname\ display system by overriding (that
+-- is, implementing) the methods of the |Binding| class. As a typical
+-- example, consider the implementation of the function |renderVertex|:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--function BindingToPGF:renderVertex(v)
+-- local info = assert(self.infos[v], "thou shalt not modify the syntactic digraph")
+-- tex.print(
+-- string.format(
+-- "\\pgfgdcallbackrendernode{%s}{%fpt}{%fpt}{%fpt}{%fpt}{%fpt}{%fpt}{%s}",
+-- 'not yet positionedPGFINTERNAL' .. v.name,
+-- info.x_min,
+-- info.x_max,
+-- info.y_min,
+-- info.y_max,
+-- v.pos.x,
+-- v.pos.y,
+-- info.box_count))
+--end
+--\end{codeexample}
+--
+-- As can be seen, the main job of this function is to call a function
+-- on the \TeX\ layer that is called |\pgfgdcallbackrendernode|, which gets
+-- several parameters like the name of the to-be-rendered node or the
+-- (new) position for the node. For almost all methods of the
+-- |Binding| class there is a corresponding ``callback'' macro on the
+-- \TeX\ layer, all of which are implemented in the \pgfname\ library
+-- |graphdrawing|. For details on these callbacks,
+-- please consult the code of that file and of the class
+-- |BindingToPGF| (they are not documented here since they are local
+-- to the binding and should not be called by anyone other than the
+-- binding class).
+
+local BindingToPGF = {
+ storage = Storage.newTableStorage () -- overwrite default storage
+}
+BindingToPGF.__index = BindingToPGF
+setmetatable(BindingToPGF, require "pgf.gd.bindings.Binding") -- subclass of Binding
+
+
+-- Namespace
+require("pgf.gd.bindings").BindingToPGF = BindingToPGF
+
+-- Imports
+local lib = require "pgf.gd.lib"
+
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Path = require "pgf.gd.model.Path"
+
+-- The implementation
+
+-- Forward
+local table_in_pgf_syntax
+local animations_in_pgf_syntax
+local path_in_pgf_syntax
+local coordinate_in_pgf_syntax
+
+
+
+
+-- Scope handling
+
+function BindingToPGF:resumeGraphDrawingCoroutine(text)
+ tex.print(text)
+ tex.print("\\pgfgdresumecoroutinetrue")
+end
+
+
+-- Declarations
+
+function BindingToPGF:declareCallback(t)
+ tex.print("\\pgfgdcallbackdeclareparameter{" .. t.key .. "}{" .. (t.type or "nil") .. "}")
+end
+
+
+
+-- Rendering
+
+function BindingToPGF:renderStart()
+ tex.print("\\pgfgdcallbackbeginshipout")
+end
+
+function BindingToPGF:renderStop()
+ tex.print("\\pgfgdcallbackendshipout")
+end
+
+
+-- Rendering collections
+
+function BindingToPGF:renderCollection(collection)
+ tex.print("\\pgfgdcallbackrendercollection{".. collection.kind .. "}{"
+ .. table_in_pgf_syntax(collection.generated_options) .. "}")
+end
+
+function BindingToPGF:renderCollectionStartKind(kind, layer)
+ tex.print("\\pgfgdcallbackrendercollectionkindstart{" .. kind .. "}{" .. tostring(layer) .. "}")
+end
+
+function BindingToPGF:renderCollectionStopKind(kind, layer)
+ tex.print("\\pgfgdcallbackrendercollectionkindstop{" .. kind .. "}{" .. tostring(layer) .. "}")
+end
+
+-- Printing points
+
+local function to_pt(x)
+ return string.format("%.12fpt", x)
+end
+
+
+-- Managing vertices (pgf nodes)
+
+local boxes = {}
+local box_count = 0
+
+function BindingToPGF:everyVertexCreation(v)
+ local info = self.storage[v]
+
+ -- Save the box!
+ box_count = box_count + 1
+ boxes[box_count] = node.copy_list(tex.box[info.tex_box_number])
+
+ -- Special tex stuff, should not be considered by gd algorithm
+ info.box_count = box_count
+end
+
+function BindingToPGF:renderVertex(v)
+ local info = assert(self.storage[v], "thou shalt not modify the syntactic digraph")
+ tex.print(
+ string.format(
+ "\\pgfgdcallbackrendernode{%s}{%.12fpt}{%.12fpt}{%.12fpt}{%.12fpt}{%.12fpt}{%.12fpt}{%s}{%s}",
+ 'not yet positionedPGFINTERNAL' .. v.name,
+ info.x_min,
+ info.x_max,
+ info.y_min,
+ info.y_max,
+ v.pos.x,
+ v.pos.y,
+ info.box_count,
+ animations_in_pgf_syntax(v.animations)))
+end
+
+function BindingToPGF:retrieveBox(index, box_num)
+ tex.box[box_num] = assert(boxes[index], "no box stored at given index")
+ boxes[index] = nil -- remove from memory
+end
+
+function BindingToPGF:renderVerticesStart()
+ tex.print("\\pgfgdcallbackbeginnodeshipout")
+end
+
+function BindingToPGF:renderVerticesStop()
+ tex.print("\\pgfgdcallbackendnodeshipout")
+end
+
+
+local function rigid(x)
+ if type(x) == "function" then
+ return x()
+ else
+ return x
+ end
+end
+
+
+-- Managing edges
+
+function BindingToPGF:renderEdge(e)
+ local info = assert(self.storage[e], "thou shalt not modify the syntactic digraph")
+
+ local function get_anchor(e, anchor)
+ local a = e.options[anchor]
+ if a and a ~= "" then
+ return "." .. a
+ else
+ return ""
+ end
+ end
+
+ local callback = {
+ '\\pgfgdcallbackedge',
+ '{', e.tail.name .. get_anchor(e, "tail anchor"), '}',
+ '{', e.head.name .. get_anchor(e, "head anchor"), '}',
+ '{', e.direction, '}',
+ '{', info.pgf_options or "", '}',
+ '{', info.pgf_edge_nodes or "", '}',
+ '{', table_in_pgf_syntax(e.generated_options), '}',
+ '{'
+ }
+
+ local i = 1
+ while i <= #e.path do
+ local c = e.path[i]
+ assert (type(c) == "string", "illegal path operand")
+
+ if c == "lineto" then
+ i = i + 1
+ local d = rigid(e.path[i])
+ callback [#callback + 1] = '--(' .. to_pt(d.x) .. ',' .. to_pt(d.y) .. ')'
+ i = i + 1
+ elseif c == "moveto" then
+ i = i + 1
+ local d = rigid(e.path[i])
+ callback [#callback + 1] = '(' .. to_pt(d.x) .. ',' .. to_pt(d.y) .. ')'
+ i = i + 1
+ elseif c == "closepath" then
+ callback [#callback + 1] = '--cycle'
+ i = i + 1
+ elseif c == "curveto" then
+ local d1, d2, d3 = rigid(e.path[i+1]), rigid(e.path[i+2]), rigid(e.path[i+3])
+ i = i + 3
+ callback [#callback + 1] = '..controls(' .. to_pt(d1.x) .. ',' .. to_pt(d1.y) .. ')and('
+ .. to_pt(d2.x) .. ',' .. to_pt(d2.y) .. ')..'
+ callback [#callback + 1] = '(' .. to_pt(d3.x) .. ',' .. to_pt(d3.y) .. ')'
+ i = i + 1
+ else
+ error("illegal operation in edge path")
+ end
+ end
+
+ callback [#callback + 1] = '}'
+ callback [#callback + 1] = '{' .. animations_in_pgf_syntax(e.animations) .. '}'
+
+ -- hand TikZ code over to TeX
+ tex.print(table.concat(callback))
+end
+
+
+function BindingToPGF:renderEdgesStart()
+ tex.print("\\pgfgdcallbackbeginedgeshipout")
+end
+
+function BindingToPGF:renderEdgesStop()
+ tex.print("\\pgfgdcallbackendedgeshipout")
+end
+
+
+-- Vertex creation
+
+function BindingToPGF:createVertex(init)
+ -- Now, go back to TeX...
+ coroutine.yield(
+ table.concat({
+ "\\pgfgdcallbackcreatevertex{", init.name, "}",
+ "{", init.shape, "}",
+ "{", table_in_pgf_syntax(init.generated_options), ",", init.pgf_options or "", "}",
+ "{", (init.text or ""), "}"
+ }))
+ -- ... and come back with a new node!
+end
+
+
+
+-- Local helpers
+
+function table_in_pgf_syntax (t)
+ local prefix = "/graph drawing/"
+ local suffix = "/.try"
+ return table.concat( lib.imap( t, function(table)
+ if table.value then
+ return prefix .. table.key .. suffix .. "={" .. tostring(table.value) .. "}"
+ else
+ return prefix .. table.key .. suffix
+ end
+ end), ",")
+end
+
+
+function animations_in_pgf_syntax (a)
+ return
+ table.concat(
+ lib.imap(
+ a,
+ function(animation)
+ return "\\pgfanimateattribute{" .. animation.attribute .. "}{whom=pgf@gd," ..
+ table.concat(
+ lib.imap (
+ animation.entries,
+ function (entry)
+ return "entry={" .. entry.t .. "s}{" .. to_pgf(entry.value) .. "}"
+ end
+ ), ",") ..
+ "," ..
+ table.concat(
+ lib.imap(
+ animation.options or {},
+ function(table)
+ if table.value then
+ return table.key .. "={" .. to_pgf(table.value) .. "}"
+ else
+ return table.key
+ end
+ end), ",")
+ .. "}"
+ end)
+ )
+end
+
+
+function to_pgf(x)
+ if type (x) == "table" then
+ if getmetatable(x) == Coordinate then
+ return coordinate_in_pgf_syntax(x)
+ elseif getmetatable(x) == Path then
+ return path_in_pgf_syntax(x)
+ else
+ error("illegal table in value of a key to be passed back to pgf")
+ end
+ else
+ return tostring(x)
+ end
+end
+
+function path_in_pgf_syntax (p)
+
+ local s = {}
+
+ local i = 1
+ while i <= #p do
+ local c = p[i]
+ assert (type(c) == "string", "illegal path operand")
+
+ if c == "lineto" then
+ i = i + 1
+ local d = rigid(p[i])
+ s [#s + 1] = '\\pgfpathlineto{\\pgfqpoint{' .. to_pt(d.x) .. '}{' .. to_pt(d.y) .. '}}'
+ i = i + 1
+ elseif c == "moveto" then
+ i = i + 1
+ local d = rigid(p[i])
+ s [#s + 1] = '\\pgfpathmoveto{\\pgfqpoint{' .. to_pt(d.x) .. '}{' .. to_pt(d.y) .. '}}'
+ i = i + 1
+ elseif c == "closepath" then
+ s [#s + 1] = '\\pgfpathclose'
+ i = i + 1
+ elseif c == "curveto" then
+ local d1, d2, d3 = rigid(p[i+1]), rigid(p[i+2]), rigid(p[i+3])
+ i = i + 3
+ s [#s + 1] = '\\pgfpathcurveto{\\pgfqpoint{' .. to_pt(d1.x) .. '}{' .. to_pt(d1.y) .. '}}{\\pgfqpoint{'
+ .. to_pt(d2.x) .. '}{' .. to_pt(d2.y) .. '}}{\\pgfqpoint{'
+ .. to_pt(d3.x) .. '}{' .. to_pt(d3.y) .. '}}'
+ i = i + 1
+ else
+ error("illegal operation in edge path")
+ end
+ end
+
+ return table.concat(s)
+end
+
+function coordinate_in_pgf_syntax(c)
+ return '\\pgfqpoint{'..to_pt(c.x) .. '}{'.. to_pt(c.y) .. '}'
+end
+
+
+return BindingToPGF
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular.lua
new file mode 100644
index 0000000000..cddfd96dfd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular.lua
@@ -0,0 +1,22 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+local circular = {}
+
+-- Declare namespace
+require("pgf.gd").circular = circular
+
+
+-- Done
+
+return circular \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/Tantau2012.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/Tantau2012.lua
new file mode 100644
index 0000000000..bebb87ab3e
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/Tantau2012.lua
@@ -0,0 +1,153 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+local routing = require("pgf.gd.routing")
+
+-- The algorithm class
+local Tantau2012 = {}
+
+---
+declare {
+ key = "simple necklace layout",
+ algorithm = Tantau2012,
+
+ postconditions = {
+ upward_oriented = true
+ },
+
+ documentation_in = "pgf.gd.circular.doc"
+}
+
+
+
+-- Imports
+
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Hints = require "pgf.gd.routing.Hints"
+
+local lib = require "pgf.gd.lib"
+
+
+
+
+-- The implementation
+
+function Tantau2012:run()
+ local g = self.ugraph
+ local vertices = g.vertices
+ local n = #vertices
+
+ local sib_dists = self:computeNodeDistances ()
+ local radii = self:computeNodeRadii()
+ local diam, adjusted_radii = self:adjustNodeRadii(sib_dists, radii)
+
+ -- Compute total necessary length. For this, iterate over all
+ -- consecutive pairs and keep track of the necessary space for
+ -- this node. We imagine the nodes to be aligned from left to
+ -- right in a line.
+ local carry = 0
+ local positions = {}
+ local function wrap(i) return (i-1)%n + 1 end
+ local ideal_pos = 0
+ for i = 1,n do
+ positions[i] = ideal_pos + carry
+ ideal_pos = ideal_pos + sib_dists[i]
+ local node_sep =
+ lib.lookup_option('node post sep', vertices[i], g) +
+ lib.lookup_option('node pre sep', vertices[wrap(i+1)], g)
+ local arc = node_sep + adjusted_radii[i] + adjusted_radii[wrap(i+1)]
+ local needed = carry + arc
+ local dist = math.sin( arc/diam ) * diam
+ needed = needed + math.max ((radii[i] + radii[wrap(i+1)]+node_sep)-dist, 0)
+ carry = math.max(needed-sib_dists[i],0)
+ end
+ local length = ideal_pos + carry
+
+ local radius = length / (2 * math.pi)
+ for i,vertex in ipairs(vertices) do
+ vertex.pos.x = radius * math.cos(2 * math.pi * (positions[i] / length + 1/4))
+ vertex.pos.y = -radius * math.sin(2 * math.pi * (positions[i] / length + 1/4))
+ end
+
+ -- Add routing infos
+ local necklace = lib.icopy({g.vertices[1]}, lib.icopy(g.vertices))
+ Hints.addNecklaceCircleHint(g, necklace, nil, true)
+end
+
+
+function Tantau2012:computeNodeDistances()
+ local sib_dists = {}
+ local sum_length = 0
+ local vertices = self.digraph.vertices
+ for i=1,#vertices do
+ sib_dists[i] = lib.lookup_option('node distance', vertices[i], self.digraph)
+ sum_length = sum_length + sib_dists[i]
+ end
+
+ local missing_length = self.digraph.options['radius'] * 2 * math.pi - sum_length
+ if missing_length > 0 then
+ -- Ok, the sib_dists to not add up to the desired minimum value.
+ -- What should we do? Hmm... We increase all by the missing amount:
+ for i=1,#vertices do
+ sib_dists[i] = sib_dists[i] + missing_length/#vertices
+ end
+ end
+
+ sib_dists.total = math.max(self.digraph.options['radius'] * 2 * math.pi, sum_length)
+
+ return sib_dists
+end
+
+
+function Tantau2012:computeNodeRadii()
+ local radii = {}
+ for i,v in ipairs(self.digraph.vertices) do
+ local min_x, min_y, max_x, max_y = v:boundingBox()
+ local w, h = max_x-min_x, max_y-min_y
+ if v.shape == "circle" or v.shape == "ellipse" then
+ radii[i] = math.max(w,h)/2
+ else
+ radii[i] = math.sqrt(w*w + h*h)/2
+ end
+ end
+ return radii
+end
+
+
+function Tantau2012:adjustNodeRadii(sib_dists,radii)
+ local total = 0
+ local max_rad = 0
+ for i=1,#radii do
+ total = total + 2*radii[i]
+ + lib.lookup_option('node post sep', self.digraph.vertices[i], self.digraph)
+ + lib.lookup_option('node pre sep', self.digraph.vertices[i], self.digraph)
+ max_rad = math.max(max_rad, radii[i])
+ end
+ total = math.max(total, sib_dists.total, max_rad*math.pi)
+ local diam = total/(math.pi)
+
+ -- Now, adjust the radii:
+ local adjusted_radii = {}
+ for i=1,#radii do
+ adjusted_radii[i] = (math.pi - 2*math.acos(radii[i]/diam))*diam/2
+ end
+
+ return diam, adjusted_radii
+end
+
+
+-- done
+
+return Tantau2012
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/doc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/doc.lua
new file mode 100644
index 0000000000..0bd9090a1c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/doc.lua
@@ -0,0 +1,142 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "simple necklace layout"
+
+summary
+[[
+This simple layout arranges the nodes in a circle, which is
+especially useful for drawing, well, circles of nodes.
+]]
+
+documentation
+[[
+The name |simple necklace layout| is reminiscent of the more general
+``necklace layout'', a term coined by Speckmann and Verbeek in
+their paper
+%
+\begin{itemize}
+ \item
+ Bettina Speckmann and Kevin Verbeek,
+ \newblock Necklace Maps,
+ \newblock \emph{IEEE Transactions on Visualization and Computer
+ Graphics,} 16(6):881--889, 2010.
+\end{itemize}
+
+For a |simple necklace layout|, the centers of the nodes
+are placed on a counter-clockwise circle, starting with the first
+node at the |grow| direction (for |grow'|, the circle is
+clockwise). The order of the nodes is the order in which they appear
+in the graph, the edges are not taken into consideration, unless the
+|componentwise| option is given.
+%
+\begin{codeexample}[]
+\tikz[>=spaced stealth']
+ \graph [simple necklace layout, grow'=down, node sep=1em,
+ nodes={draw,circle}, math nodes]
+ {
+ x_1 -> x_2 -> x_3 -> x_4 ->
+ x_5 -> "\dots"[draw=none] -> "x_{n-1}" -> x_n -> x_1
+ };
+\end{codeexample}
+
+When you give the |componentwise| option, the graph will be
+decomposed into connected components, which are then laid out
+individually and packed using the usual component packing
+mechanisms:
+%
+\begin{codeexample}[]
+\tikz \graph [simple necklace layout] {
+ a -- b -- c -- d -- a,
+ 1 -- 2 -- 3 -- 1
+};
+\end{codeexample}
+%
+\begin{codeexample}[]
+\tikz \graph [simple necklace layout, componentwise] {
+ a -- b -- c -- d -- a,
+ 1 -- 2 -- 3 -- 1
+};
+\end{codeexample}
+
+The nodes are placed in such a way that
+%
+\begin{enumerate}
+ \item The (angular) distance between the centers of consecutive
+ nodes is at least |node distance|,
+ \item the distance between the borders of consecutive nodes is at
+ least |node sep|, and
+ \item the radius is at least |radius|.
+\end{enumerate}
+%
+The radius of the circle is chosen near-minimal such that the above
+properties are satisfied. To be more precise, if all nodes are
+circles, the radius is chosen optimally while for, say, rectangular
+nodes there may be too much space between the nodes in order to
+satisfy the second condition.
+]]
+
+example
+[[
+\tikz \graph [simple necklace layout,
+ node sep=0pt, node distance=0pt,
+ nodes={draw,circle}]
+{ 1 -- 2 [minimum size=30pt] -- 3 --
+ 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 };
+]]
+
+example
+[[
+\begin{tikzpicture}[radius=1.25cm]
+ \graph [simple necklace layout,
+ node sep=0pt, node distance=0pt,
+ nodes={draw,circle}]
+ { 1 -- 2 [minimum size=30pt] -- 3 --
+ 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 };
+
+ \draw [red] (0,-1.25) circle [];
+\end{tikzpicture}
+]]
+
+example
+[[
+\tikz \graph [simple necklace layout,
+ node sep=0pt, node distance=1cm,
+ nodes={draw,circle}]
+{ 1 -- 2 [minimum size=30pt] -- 3 --
+ 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 };
+]]
+
+example
+[[
+\tikz \graph [simple necklace layout,
+ node sep=2pt, node distance=0pt,
+ nodes={draw,circle}]
+{ 1 -- 2 [minimum size=30pt] -- 3 --
+ 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 };
+]]
+
+example
+[[
+\tikz \graph [simple necklace layout,
+ node sep=0pt, node distance=0pt,
+ nodes={rectangle,draw}]
+{ 1 -- 2 [minimum size=30pt] -- 3 --
+ 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 };
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/library.lua
new file mode 100644
index 0000000000..016cfe483f
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/circular/library.lua
@@ -0,0 +1,30 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+---
+-- ``Circular'' graph drawing algorithms arrange the nodes of a graph
+-- on one of more circles.
+--
+-- @library
+
+local circular -- Library name
+
+-- Load declarations from:
+
+-- Load algorithms from:
+require "pgf.gd.circular.Tantau2012"
+
+
+-- General declarations
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control.lua
new file mode 100644
index 0000000000..a3bec1fef3
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.control = {}
+
+
+-- Done
+
+return pgf.gd.control \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Anchoring.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Anchoring.lua
new file mode 100644
index 0000000000..03a05ee627
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Anchoring.lua
@@ -0,0 +1,104 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Anchoring a Graph}
+--
+-- \label{subsection-library-graphdrawing-anchoring}
+--
+-- A graph drawing algorithm must compute positions of the nodes of a
+-- graph, but the computed positions are only \emph{relative} (``this
+-- node is left of this node, but above that other node''). It is not
+-- immediately obvious where the ``the whole graph'' should be placed
+-- \emph{absolutely} once all relative positions have been computed. In
+-- case that the graph consists of several unconnected components, the
+-- situation is even more complicated.
+--
+-- The order in which the algorithm layer determines the node at which
+-- the graph should be anchored:
+-- %
+-- \begin{enumerate}
+-- \item If the |anchor node=|\meta{node name} option given to the graph
+-- as a whole, the graph is anchored at \meta{node name}, provided
+-- there is a node of this name in the graph. (If there is no node of
+-- this name or if it is misspelled, the effect is the same as if this
+-- option had not been given at all.)
+-- \item Otherwise, if there is a node where the |anchor here| option is
+-- specified, the first node with this option set is used.
+-- \item Otherwise, if there is a node where the |desired at| option is
+-- set (perhaps implicitly through keys like |x|), the first such node
+-- is used.
+-- \item Finally, in all other cases, the first node is used.
+-- \end{enumerate}
+--
+-- In the above description, the ``first'' node refers to the node first
+-- encountered in the specification of the graph.
+--
+-- Once the node has been determined, the graph is shifted so that
+-- this node lies at the position specified by |anchor at|.
+--
+-- @end
+
+
+
+local Anchoring = {}
+
+
+-- Namespace
+require("pgf.gd.control").Anchoring = Anchoring
+
+
+-- Imports
+local Coordinate = require("pgf.gd.model.Coordinate")
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+
+---
+declare {
+ key = "desired at",
+ type = "coordinate",
+ documentation_in = "pgf.gd.control.doc"
+}
+
+---
+declare {
+ key = "anchor node",
+ type = "string",
+ documentation_in = "pgf.gd.control.doc"
+}
+
+
+---
+declare {
+ key = "anchor at",
+ type = "canvas coordinate",
+ initial = "(0pt,0pt)",
+ documentation_in = "pgf.gd.control.doc"
+}
+
+
+---
+declare {
+ key = "anchor here",
+ type = "boolean",
+ documentation_in = "pgf.gd.control.doc"
+}
+
+
+
+
+
+-- Done
+
+return Anchoring \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentAlign.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentAlign.lua
new file mode 100644
index 0000000000..5e5b0635bf
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentAlign.lua
@@ -0,0 +1,533 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+---
+-- @section subsubsection {Aligning Components}
+--
+-- When components are placed next to each from left to right, it
+-- is not immediately clear how the components should be aligned
+-- vertically. What happens is that in each component a horizontal line is
+-- determined and then all components are shifted vertically so that the
+-- lines are aligned. There are different strategies for choosing these
+-- ``lines'', see the description of the options described later on.
+-- When the |component direction| option is used to change the direction
+-- in which components are placed, it certainly make no longer sense to
+-- talk about ``horizontal'' and ``vertical'' lines. Instead, what
+-- actually happens is that the alignment does not consider
+-- ``horizontal'' lines, but lines that go in the direction specified by
+-- |component direction| and aligns them by moving components along a
+-- line that is perpendicular to the line. For these reasons, let us call
+-- the line in the component direction the \emph{alignment line} and a
+-- line that is perpendicular to it the \emph{shift line}.
+--
+-- The first way of specifying through which point of a component the
+-- alignment line should get is to use the option |align here|.
+-- In many cases, however, you will not wish to specify an alignment node
+-- manually in each component. Instead, you will use the
+-- |component align| key to specify a \emph{strategy} that should be used to
+-- automatically determine such a node.
+--
+-- Using a combination of |component direction| and |component align|,
+-- numerous different packing strategies can be configured. However,
+-- since names like |counterclockwise| are a bit hard to remember and to
+-- apply in practice, a number of easier-to-remember keys are predefined
+-- that combine an alignment and a direction.
+--
+-- @end
+
+
+---
+
+declare {
+ key = "align here",
+ type = "boolean",
+
+ summary = [["
+ When this option is given to a node, this alignment line will go
+ through the origin of this node. If this option is passed to more
+ than one node of a component, the node encountered first in the
+ component is used.
+ "]],
+ examples = [["
+ \tikz \graph [binary tree layout, nodes={draw}]
+ { a, b -- c[align here], d -- e[second, align here] -- f };
+ "]]
+}
+
+---
+
+declare {
+ key = "component align",
+ type = "string",
+ initial = "first node",
+
+ summary = [["
+ Specifies a ``strategy'' for the alignment of components.
+ "]],
+ documentation = [["
+ The following values are permissible:
+ %
+ \begin{itemize}
+ \item \declare{|first node|}
+
+ In each component, the alignment line goes through the center of
+ the first node of the component encountered during specification
+ of the component.
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component align=first node]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ %
+ \item \declare{|center|}
+
+ The nodes of the component are projected onto the shift line. The
+ alignment line is now chosen so that it is exactly in the middle
+ between the maximum and minimum value that the projected nodes
+ have on the shift line.
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component align=center]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component direction=90,
+ component align=center]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ %
+ \item \declare{|counterclockwise|}
+
+ As for |center|, we project the nodes of the component onto the
+ shift line. The alignment line is now chosen so that it goes
+ through the center of the node whose center has the highest
+ projected value.
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component align=counterclockwise]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component direction=90,
+ component align=counterclockwise]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ The name |counterclockwise| is intended to indicate that the align
+ line goes through the node that comes last if we go from the
+ alignment direction in a counter-clockwise direction.
+ \item \declare{|clockwise|}
+
+ Works like |counterclockwise|, only in the other direction:
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component align=clockwise]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ %
+\begin{codeexample}[]
+\tikz \graph [binary tree layout, nodes={draw},
+ component direction=90,
+ component align=clockwise]
+ { a, b -- c, d -- e[second] -- f };
+\end{codeexample}
+ %
+ \item \declare{|counterclockwise bounding box|}
+
+ This method is quite similar to |counterclockwise|, only the
+ alignment line does not go through the center of the node with a
+ maximum projected value on the shift line, but through the maximum
+ value of the projected bounding boxes. For a left-to-right
+ packing, this means that the components are aligned so that the
+ bounding boxes of the components are aligned at the top.
+ %
+\begin{codeexample}[]
+\tikz \graph [tree layout, nodes={draw, align=center},
+ component sep=0pt,
+ component align=counterclockwise]
+ { a, "high\\node" -- b};\quad
+\tikz \graph [tree layout, nodes={draw, align=center},
+ component sep=0pt,
+ component align=counterclockwise bounding box]
+ { a, "high\\node" -- b};
+\end{codeexample}
+ %
+ \item \declare{|clockwise bounding box|}
+
+ Works like |counterclockwise bounding box|.
+ \end{itemize}
+ "]]
+}
+
+---
+
+declare {
+ key = "components go right top aligned",
+ use = {
+ { key = "component direction", value = 0},
+ { key = "component align", value = "counterclockwise"},
+ },
+
+ summary = [["
+ Shorthand for |component direction=right| and
+ |component align=counterclockwise|. This means that, as the name
+ suggest, the components will be placed left-to-right and they are
+ aligned such that their top nodes are in a line.
+ "]],
+ examples = [["
+ \tikz \graph [tree layout, nodes={draw, align=center},
+ components go right top aligned]
+ { a, "high\\node" -- b};
+ "]]
+}
+
+---
+
+declare {
+ key = "components go right absolute top aligned",
+ use = {
+ { key = "component direction", value=0},
+ { key = "component align", value = "counterclockwise bounding box"},
+ },
+
+ summary = [["
+ Like |components go right top aligned|, but with
+ |component align| set to |counterclockwise| |bounding box|.
+ This means that the components will be aligned with their bounding
+ boxed being top-aligned.
+ "]],
+ examples = [["
+ \tikz \graph [tree layout, nodes={draw, align=center},
+ components go right absolute top aligned]
+ { a, "high\\node" -- b};
+ "]]
+}
+
+---
+
+declare {
+ key = "components go right bottom aligned",
+ use = {
+ { key = "component direction", value=0},
+ { key = "component align", value = "clockwise"},
+ },
+
+ summary = "See the other |components go ...| keys."
+}
+
+---
+--
+
+declare {
+ key = "components go right absolute bottom aligned",
+ use = {
+ { key = "component direction", value=0},
+ { key = "component align", value = "clockwise bounding box"},
+ },
+
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+
+declare {
+ key = "components go right center aligned",
+ use = {
+ { key = "component direction", value=0},
+ { key = "component align", value = "center"},
+ },
+
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+
+declare {
+ key = "components go right",
+ use = {
+ { key = "component direction", value=0},
+ { key = "component align", value = "first node"},
+ },
+
+ summary = [["
+ Shorthand for |component direction=right| and
+ |component align=first node|.
+ "]]
+ }
+
+
+---
+
+declare {
+ key = "components go left top aligned",
+ use = {
+ { key = "component direction", value=180},
+ { key = "component align", value = "clockwise"},
+ },
+
+ summary = "See the other |components go ...| keys.",
+
+ examples = [["
+ \tikz \graph [tree layout, nodes={draw, align=center},
+ components go left top aligned]
+ { a, "high\\node" -- b};
+ "]]
+}
+
+---
+--
+
+declare {
+ key = "components go left absolute top aligned",
+ use = {
+ { key = "component direction", value=180},
+ { key = "component align", value = "clockwise bounding box"},
+ },
+
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go left bottom aligned",
+ use = {
+ { key = "component direction", value=180},
+ { key = "component align", value = "counterclockwise"},
+ },
+
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go left absolute bottom aligned",
+ use = {
+ { key = "component direction", value=180},
+ { key = "component align", value = "counterclockwise bounding box"},
+ },
+
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go left center aligned",
+ use = {
+ { key = "component direction", value=180},
+ { key = "component align", value = "center"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go left",
+ use = {
+ { key = "component direction", value=180},
+ { key = "component align", value = "first node"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+
+---
+
+declare {
+ key = "components go down right aligned",
+ use = {
+ { key = "component direction", value=270},
+ { key = "component align", value = "counterclockwise"},
+ },
+ summary = "See the other |components go ...| keys.",
+
+ examples = {[["
+ \tikz \graph [tree layout, nodes={draw, align=center},
+ components go down left aligned]
+ { a, hello -- {world,s} };
+ "]],[["
+ \tikz \graph [tree layout, nodes={draw, align=center},
+ components go up absolute left aligned]
+ { a, hello -- {world,s}};
+ "]]
+ }
+}
+
+---
+--
+
+declare {
+ key = "components go down absolute right aligned",
+ use = {
+ { key = "component direction", value=270},
+ { key = "component align", value = "counterclockwise bounding box"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go down left aligned",
+ use = {
+ { key = "component direction", value=270},
+ { key = "component align", value = "clockwise"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go down absolute left aligned",
+ use = {
+ { key = "component direction", value=270},
+ { key = "component align", value = "clockwise bounding box"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go down center aligned",
+ use = {
+ { key = "component direction", value=270},
+ { key = "component align", value = "center"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go down",
+ use = {
+ { key = "component direction", value=270},
+ { key = "component align", value = "first node"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+---
+--
+
+declare {
+ key = "components go up right aligned",
+ use = {
+ { key = "component direction", value=90},
+ { key = "component align", value = "clockwise"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go up absolute right aligned",
+ use = {
+ { key = "component direction", value=90},
+ { key = "component align", value = "clockwise bounding box"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go up left aligned",
+ use = {
+ { key = "component direction", value=90},
+ { key = "component align", value = "counterclockwise"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go up absolute left aligned",
+ use = {
+ { key = "component direction", value=90},
+ { key = "component align", value = "counterclockwise bounding box"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go up center aligned",
+ use = {
+ { key = "component direction", value=90},
+ { key = "component align", value = "center"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+---
+--
+
+declare {
+ key = "components go up",
+ use = {
+ { key = "component direction", value=90},
+ { key = "component align", value = "first node"},
+ },
+ summary = "See the other |components go ...| keys."
+}
+
+
+
+
+return Components \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDirection.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDirection.lua
new file mode 100644
index 0000000000..f941ff226e
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDirection.lua
@@ -0,0 +1,58 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+---
+-- @section subsubsection {Arranging Components in a Certain Direction}
+--
+-- @end
+
+---
+
+declare {
+ key = "component direction",
+ type = "direction",
+ initial = "0",
+
+ summary = [["
+ The \meta{angle} is used to determine the relative position of each
+ component relative to the previous one. The direction need not be a
+ multiple of |90|. As usual, you can use texts like |up| or
+ |right| instead of a number.
+ "]],
+ documentation = [["
+ As the examples show, the direction only has an influence on the
+ relative positions of the components, not on the direction of growth
+ inside the components. In particular, the components are not rotated
+ by this option in any way. You can use the |grow| option or |orient|
+ options to orient individual components.
+ "]],
+ examples = {[["
+ \tikz \graph [tree layout, nodes={inner sep=1pt,draw,circle},
+ component direction=left]
+ { a, b, c -- d -- e, f -- g };
+ "]],[["
+ \tikz \graph [tree layout, nodes={inner sep=1pt,draw,circle},
+ component direction=10]
+ { a, b, c -- d -- e, f -- g };
+ "]],[["
+ \tikz \graph [tree layout, nodes={inner sep=1pt,draw,circle},
+ component direction=up]
+ { a, b, c [grow=right] -- d -- e, f[grow=45] -- g };
+ "]]
+ }
+}
+
+
+return Components \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDistance.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDistance.lua
new file mode 100644
index 0000000000..7ba4d000a7
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentDistance.lua
@@ -0,0 +1,106 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+---
+-- @section subsubsection {The Distance Between Components}
+--
+-- Once the components of a graph have been oriented, sorted, aligned,
+-- and a direction has been chosen, it remains to determine the distance
+-- between adjacent components. Two methods are available for computing
+-- this distance, as specified by the following option:
+--
+-- @end
+
+
+---
+
+declare {
+ key = "component packing",
+ type = "string",
+ initial = "skyline",
+
+ documentation = [["
+ Given two components, their distance is computed as follows in
+ dependence of \meta{method}:
+ %
+ \begin{itemize}
+ \item \declare{|rectangular|}
+
+ Imagine a bounding box to be drawn around both components. They
+ are then shifted such that the padding (separating distance)
+ between the two boxes is the current value of |component sep|.
+ %
+ \begin{codeexample}[]
+ \tikz \graph [tree layout, nodes={draw}, component sep=0pt,
+ component packing=rectangular]
+ { a -- long text, longer text -- b};
+ \end{codeexample}
+ %
+ \item \declare{|skyline|}
+
+ The ``skyline method'' is used to compute the distance. It works
+ as follows: For simplicity, assume that the component direction is
+ right (other case work similarly, only everything is
+ rotated). Imaging the second component to be placed far right
+ beyond the first component. Now start moving the second component
+ back to the left until one of the nodes of the second component
+ touches a node of the first component, and stop. Again, the
+ padding |component sep| can be used to avoid the nodes actually
+ touching each other.
+ %
+ \begin{codeexample}[]
+ \tikz \graph [tree layout, nodes={draw}, component sep=0pt,
+ level distance=1.5cm,
+ component packing=skyline]
+ { a -- long text, longer text -- b};
+ \end{codeexample}
+
+ In order to avoid nodes of the second component ``passing through
+ a hole in the first component'', the actual algorithm is a bit
+ more complicated: For both components, a ``skyline'' is
+ computed. For the first component, consider an arbitrary
+ horizontal line. If there are one or more nodes on this line, the
+ rightmost point on any of the bounding boxes of these nodes will
+ be the point on the skyline of the first component for this
+ line. Similarly, for the second component, for each horizontal
+ level the skyline is given by the leftmost point on any of the
+ bounding boxes intersecting the line.
+
+ Now, the interesting case are horizontal lines that do not
+ intersect any of the nodes of the first and/or second
+ component. Such lines represent ``holes'' in the skyline. For
+ them, the following rule is used: Move the horizontal line upward
+ and downward as little as possible until a height is reached where
+ there is a skyline defined. Then the skyline position on the
+ original horizontal line is the skyline position at the reached
+ line, minus (or, for the second component, plus) the distance by
+ which the line was moved. This means that the holes are ``filled
+ up by slanted roofs''.
+ %
+ \begin{codeexample}[]
+ \begin{tikzpicture}
+ \graph [tree layout, nodes={draw}, component sep=0pt,
+ component packing=skyline]
+ { a -- long text, longer text -- b};
+ \draw[red] (long text.north east) -- ++(north west:1cm);
+ \end{tikzpicture}
+ \end{codeexample}
+
+ \end{itemize}
+ "]]
+}
+
+
+return Components \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentOrder.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentOrder.lua
new file mode 100644
index 0000000000..78537b614c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/ComponentOrder.lua
@@ -0,0 +1,105 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+
+
+---
+-- @section subsubsection {Ordering the Components}
+--
+-- The different connected components of the graph are collected in a
+-- list. The ordering of the nodes in this list can be configured using
+-- the following key.
+--
+-- @end
+
+
+---
+
+declare {
+ key = "component order",
+ type = "string",
+ initial = "by first specified node",
+
+ summary = [["
+ Selects a ``strategy'' for ordering the components. By default,
+ they are ordered in the way they appear in the input.
+ "]],
+ documentation = [["
+ The following values are permissible for \meta{strategy}
+ %
+ \begin{itemize}
+ \item \declare{|by first specified node|}
+
+ The components are ordered ``in the way they appear in the input
+ specification of the graph''. More precisely, for each component
+ consider the node that is first encountered in the description
+ of the graph. Order the components in the same way as these nodes
+ appear in the graph description.
+ \item \declare{|increasing node number|}
+
+ The components are ordered by increasing number of nodes. For
+ components with the same number of nodes, the first node in each
+ component is considered and they are ordered according to the
+ sequence in which these nodes appear in the input.
+
+ \item \declare{|decreasing node number|}
+ As above, but in decreasing order.
+ \end{itemize}
+ "]],
+ examples = {[["
+ \tikz \graph [tree layout, nodes={inner sep=1pt,draw,circle},
+ component order=by first specified node]
+ { a, b, c, f -- g, c -- d -- e };
+ "]],[["
+ \tikz \graph [tree layout, nodes={inner sep=1pt,draw,circle},
+ component order=increasing node number]
+ { a, b, c -- d -- e, f -- g };
+ "]]
+ }
+}
+
+
+---
+
+declare {
+ key = "small components first",
+ use = {
+ { key = "component order", value = "increasing node number" }
+ },
+
+ summary = [["
+ A shorthand for |component order=increasing node number|.
+ "]]
+ }
+
+---
+
+declare {
+ key = "large components first",
+ use = {
+ { key = "component order", value = "decreasing node number" },
+ },
+ summary = [["
+ A shorthand for |component order=decreasing node number|.
+ "]],
+ examples = [["
+ \tikz \graph [tree layout, nodes={inner sep=1pt,draw,circle},
+ large components first]
+ { a, b, c -- d -- e, f -- g };
+ "]]
+}
+
+
+return Components \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Components.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Components.lua
new file mode 100644
index 0000000000..c5019a56e2
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Components.lua
@@ -0,0 +1,127 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+---
+-- @section subsection {Packing of Connected Components}
+--
+-- \label{subsection-gd-component-packing}
+-- \label{section-gd-packing}
+--
+-- Graphs may be composed of subgraphs or \emph{components} that are not
+-- connected to each other. In order to draw these nicely, most graph
+-- drawing algorithms split them into separate graphs, compute
+-- their layouts with the same graph drawing algorithm independently and,
+-- in a postprocessing step, arrange them next to each other. Note,
+-- however, that some graph drawing algorithms can also arrange the nodes
+-- of the graph in a uniform way even for unconnected components (the
+-- |simple necklace layout| is a case in point); for such algorithms you can
+-- choose whether they should be applied to each component individually
+-- or not (if not, the following options do not apply). To configure
+-- which is the case, use the |componentwise| key.
+--
+-- The default method for placing the different components works as
+-- follows:
+-- %
+-- \begin{enumerate}
+-- \item For each component, a layout is determined and the component is
+-- oriented as described
+-- Section~\ref{subsection-library-graphdrawing-standard-orientation}
+-- on the orientation of graphs.
+-- \item The components are sorted as prescribed by the
+-- |component order| key.
+-- \item The first component is now placed (conceptually) at the
+-- origin. (The final position of this and all other components will be
+-- determined later, namely in the anchoring phase, but let us imagine
+-- that the first component lies at the origin at this point.)
+-- \item The second component is now positioned relative to the first
+-- component. The ``direction'' in which the next component is placed
+-- relative to the first one is determined by the |component direction|
+-- key, so components can be placed from left to right or up to down or
+-- in any other direction (even something like $30^\circ$). However,
+-- both internally and in the following description, we assume that the
+-- components are placed from left to right; other directions are
+-- achieved by doing some (clever) rotating of the arrangement achieved
+-- in this way.
+--
+-- So, we now wish to place the second component to the right of the
+-- first component. The component is first shifted vertically according
+-- to some alignment strategy. For instance, it can be shifted so that
+-- the topmost node of the first component and the topmost node of the
+-- second component have the same vertical position. Alternatively, we
+-- might require that certain ``alignment nodes'' in both components
+-- have the same vertical position. There are several other strategies,
+-- which can be configured using the |component align| key.
+--
+-- One the vertical position has been fixed, the horizontal position is
+-- computed. Here, two different strategies are available: First, image
+-- rectangular bounding boxed to be drawn around both components. Then
+-- we shift the second component such that the right border of the
+-- bounding box of the first component touches the left border of the
+-- bounding box of the second component. Instead of having the bounding
+-- boxes ``touch'', we can also have a padding of |component sep|
+-- between them. The second strategy is more involved and also known as
+-- a ``skyline'' strategy, where (roughly) the components are
+-- ``moved together as near as possible so that nodes do not touch''.
+-- \item
+-- After the second component has been placed, the third component is
+-- considered and positioned relative to the second one, and so on.
+-- \item
+-- At the end, as hinted at earlier, the whole arrangement is rotate so
+-- that instead of ``going right'' the component go in the direction of
+-- |component direction|. Note, however, that this rotation applies only
+-- to the ``shift'' of the components; the components themselves are
+-- not rotated. Fortunately, this whole rotation process happens in the
+-- background and the result is normally exactly what you would expect.
+-- \end{enumerate}
+--
+-- In the following, we go over the different keys that can be used to
+-- configure the component packing.
+--
+-- @end
+
+
+---
+
+declare {
+ key = "componentwise",
+ type = "boolean",
+
+ summary = [["
+ For algorithms that also support drawing unconnected graphs, use
+ this key to enforce that the components of the graph are,
+ nevertheless, laid out individually. For algorithms that do not
+ support laying out unconnected graphs, this option has no effect;
+ rather it works as if this option were always set.
+ "]],
+ examples = {[["
+ \tikz \graph [simple necklace layout]
+ {
+ a -- b -- c -- d -- a,
+ 1 -- 2 -- 3 -- 1
+ };
+ "]],[[",
+ \tikz \graph [simple necklace layout, componentwise]
+ {
+ a -- b -- c -- d -- a,
+ 1 -- 2 -- 3 -- 1
+ };
+ "]]
+ }
+}
+
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Distances.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Distances.lua
new file mode 100644
index 0000000000..6dc5a13018
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Distances.lua
@@ -0,0 +1,454 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local lib = require "pgf.gd.lib"
+
+---
+-- @section subsection {Padding and Node Distances}
+--
+-- \label{subsection-gd-dist-pad}
+--
+-- In many drawings, you may wish to specify how ``near'' two nodes should
+-- be placed by a graph drawing algorithm. Naturally, this depends
+-- strongly on the specifics of the algorithm, but there are a number of
+-- general keys that will be used by many algorithms.
+--
+-- There are different kinds of objects for which you can specify
+-- distances and paddings:
+-- %
+-- \begin{itemize}
+-- \item You specify the ``natural'' distance between nodes
+-- connected by an edge using |node distance|, which is also available in
+-- normal \tikzname\ albeit for a slightly different purpose. However,
+-- not every algorithm will (or can) honor the key; see the description
+-- of each algorithm what it will ``make of this option''.
+-- \item A number of graph drawing algorithms arrange nodes in layers
+-- (or levels); we refer
+-- to the nodes on the same layer as siblings (although, in a tree,
+-- siblings are only nodes with the same parent; nevertheless we use
+-- ``sibling'' loosely also for nodes that are more like ``cousins'').
+-- \item When a graph consists of several connected component, many graph
+-- drawing algorithms will layout these components individually. The
+-- different components will then be arranged next to each other, see
+-- Section~\ref{section-gd-packing} for the details, such that between
+-- the nodes of any two components a padding is available.
+-- \end{itemize}
+--
+-- @end
+
+
+
+
+---
+
+declare {
+ key = "node distance",
+ type = "length",
+ initial = "1cm",
+
+ summary = [["
+ This is minimum distance that the centers of nodes connected by an
+ edge should have. It will not always be possible to satisfy this
+ desired distance, for instance in case the nodes are too big. In
+ this case, the \meta{length} is just considered as a lower bound.
+ "]],
+ examples = [["
+ \begin{tikzpicture}
+ \graph [simple necklace layout, node distance=1cm, node sep=0pt,
+ nodes={draw,circle,as=.}]
+ {
+ 1 -- 2 [minimum size=2cm] -- 3 --
+ 4 -- 5 -- 6 -- 7 --[orient=up] 8
+ };
+ \draw [red,|-|] (1.center) -- ++(0:1cm);
+ \draw [red,|-|] (5.center) -- ++(180:1cm);
+ \end{tikzpicture}
+ "]]
+}
+
+
+---
+
+declare {
+ key = "node pre sep",
+ type = "length",
+ initial = ".333em",
+
+ summary = [["
+ This is a minimum ``padding'' or ``separation'' between the border
+ of nodes connected by an edge. Thus, if nodes are so big that nodes
+ with a distance of |node distance| would overlap (or
+ just come with \meta{dimension} distance of one another), their
+ distance is enlarged so that this distance is still satisfied.
+ The |pre| means that the padding is added to the node ``at the
+ front''. This make sense only for some algorithms, like for a
+ simple necklace layout.
+ "]],
+ examples = {[["
+ \tikz \graph [simple necklace layout, node distance=0cm, nodes={circle,draw}]
+ { 1--2--3--4--5--1 };
+ "]],[["
+ \tikz \graph [simple necklace layout, node distance=0cm, node sep=0mm,
+ nodes={circle,draw}]
+ { 1--2--3[node pre sep=5mm]--4--5[node pre sep=1mm]--1 };
+ "]]
+ }
+}
+
+---
+
+declare {
+ key = "node post sep",
+ type = "length",
+ initial = ".333em",
+
+ summary = [["
+ Works like |node pre sep|.
+ "]]
+}
+
+
+
+---
+-- @param length A length.
+
+declare {
+ key = "node sep",
+ type = "length",
+ use = {
+ { key = "node pre sep", value = function(v) return v/2 end },
+ { key = "node post sep", value = function(v) return v/2 end },
+ },
+ summary = [["
+ A shorthand for setting both |node pre sep| and |node post sep| to
+ $\meta{length}/2$.
+ "]]
+}
+
+
+---
+
+declare {
+ key = "level distance",
+ type = "length",
+ initial = "1cm",
+
+ summary = [["
+ This is minimum distance that the centers of nodes on one
+ level should have from the centers of nodes on the next level. It
+ will not always be possible to satisfy this desired distance, for
+ instance in case the nodes are too big. In this case, the
+ \meta{length} is just considered as a lower bound.
+ "]],
+ examples = [["
+ \begin{tikzpicture}[inner sep=2pt]
+ \draw [help lines] (0,0) grid (3.5,2);
+ \graph [layered layout, level distance=1cm, level sep=0]
+ { 1 [x=1,y=2] -- 2 -- 3 -- 1 };
+ \graph [layered layout, level distance=5mm, level sep=0]
+ { 1 [x=3,y=2] -- 2 -- 3 -- 1, 3 -- {4,5} -- 6 -- 3 };
+ \end{tikzpicture}
+ "]]
+}
+
+---
+declare {
+ key = "layer distance",
+ type = "length",
+ use = {
+ { key = "level distance", value = lib.id },
+ },
+ summary = "An alias for |level distance|"
+}
+
+---
+declare {
+ key = "level pre sep",
+ type = "length",
+ initial = ".333em",
+
+ summary = [["
+ This is a minimum ``padding'' or ``separation'' between the border
+ of the nodes on a level to any nodes on the previous level. Thus, if
+ nodes are so big that nodes on consecutive levels would overlap (or
+ just come with \meta{length} distance of one another), their
+ distance is enlarged so that this distance is still satisfied.
+ If a node on the previous level also has a |level post sep|, this
+ post padding and the \meta{dimension} add up. Thus, these keys
+ behave like the ``padding'' keys rather
+ than the ``margin'' key of cascading style sheets.
+ "]],
+ examples = [["
+ \begin{tikzpicture}[inner sep=2pt, level sep=0pt, sibling distance=0pt]
+ \draw [help lines] (0,0) grid (3.5,2);
+ \graph [layered layout, level distance=0cm, nodes=draw]
+ { 1 [x=1,y=2] -- {2,3[level pre sep=1mm],4[level pre sep=5mm]} -- 5 };
+ \graph [layered layout, level distance=0cm, nodes=draw]
+ { 1 [x=3,y=2] -- {2,3,4} -- 5[level pre sep=5mm] };
+ \end{tikzpicture}
+ "]]
+}
+
+---
+
+declare {
+ key = "level post sep",
+ type = "length",
+ initial = ".333em",
+
+ summary = [["
+ Works like |level pre sep|.
+ "]]
+}
+
+---
+declare {
+ key = "layer pre sep",
+ type = "length",
+ use = {
+ { key = "level pre sep", value = lib.id },
+ },
+ summary = "An alias for |level pre sep|."
+}
+
+---
+declare {
+ key = "layer post sep",
+ type = "length",
+ use = {
+ { key = "level post sep", value = lib.id },
+ },
+ summary = "An alias for |level post sep|."
+}
+
+
+
+
+---
+-- @param length A length
+
+declare {
+ key = "level sep",
+ type = "length",
+ use = {
+ { key = "level pre sep", value = function (v) return v/2 end },
+ { key = "level post sep", value = function (v) return v/2 end },
+ },
+
+ summary = [["
+ A shorthand for setting both |level pre sep| and |level post sep| to
+ $\meta{length}/2$. Note that if you set |level distance=0| and
+ |level sep=1em|, you get a layout where any two consecutive layers
+ are ``spaced apart'' by |1em|.
+ "]]
+}
+
+
+---
+declare {
+ key = "layer sep",
+ type = "number",
+ use = {
+ { key = "level sep", value = lib.id },
+ },
+ summary = "An alias for |level sep|."
+}
+
+
+---
+declare {
+ key = "sibling distance",
+ type = "length",
+ initial = "1cm",
+
+ summary = [["
+ This is minimum distance that the centers of node should have to the
+ center of the next node on the same level. As for levels, this is
+ just a lower bound.
+ For some layouts, like a simple necklace layout, the \meta{length} is
+ measured as the distance on the circle.
+ "]],
+ examples = {[["
+ \tikz \graph [tree layout, sibling distance=1cm, nodes={circle,draw}]
+ { 1--{2,3,4,5} };
+ "]],[["
+ \tikz \graph [tree layout, sibling distance=0cm, sibling sep=0pt,
+ nodes={circle,draw}]
+ { 1--{2,3,4,5} };
+ "]],[["
+ \tikz \graph [tree layout, sibling distance=0cm, sibling sep=0pt,
+ nodes={circle,draw}]
+ { 1--{2,3[sibling distance=1cm],4,5} };
+ "]]
+ }
+}
+
+
+---
+
+declare {
+ key = "sibling pre sep",
+ type = "length",
+ initial = ".333em",
+
+ summary = [["
+ Works like |level pre sep|, only for siblings.
+ "]],
+ examples = [["
+ \tikz \graph [tree layout, sibling distance=0cm, nodes={circle,draw},
+ sibling sep=0pt]
+ { 1--{2,3[sibling pre sep=1cm],4,5} };
+ "]]
+}
+
+---
+
+declare {
+ key = "sibling post sep",
+ type = "length",
+ initial = ".333em",
+
+ summary = [["
+ Works like |sibling pre sep|.
+ "]]
+ }
+
+
+
+---
+-- @param length A length
+
+declare {
+ key = "sibling sep",
+ type = "length",
+ use = {
+ { key = "sibling pre sep", value = function(v) return v/2 end },
+ { key = "sibling post sep", value = function(v) return v/2 end },
+ },
+
+ summary = [["
+ A shorthand for setting both |sibling pre sep| and |sibling post sep| to
+ $\meta{length}/2$.
+ "]]
+}
+
+
+
+
+
+
+---
+declare {
+ key = "part distance",
+ type = "length",
+ initial = "1.5cm",
+
+ summary = [["
+ This is minimum distance between the centers of ``parts'' of a
+ graph. What a ``part'' is depends on the algorithm.
+ "]]
+}
+
+
+---
+
+declare {
+ key = "part pre sep",
+ type = "length",
+ initial = "1em",
+ summary = "A pre-padding for parts."
+}
+
+---
+
+declare {
+ key = "part post sep",
+ type = "length",
+ initial = "1em",
+ summary = "A post-padding for pars."
+ }
+
+
+
+---
+-- @param length A length
+
+declare {
+ key = "part sep",
+ type = "length",
+ use = {
+ { key = "part pre sep", value = function(v) return v/2 end },
+ { key = "part post sep", value = function(v) return v/2 end },
+ },
+
+ summary = [["
+ A shorthand for setting both |part pre sep| and |part post sep| to
+ $\meta{length}/2$.
+ "]]
+}
+
+
+
+
+---
+
+declare {
+ key = "component sep",
+ type = "length",
+ initial = "1.5em",
+
+ summary = [["
+ This is padding between the bounding boxes that nodes of different
+ connected components will have when they are placed next to each
+ other.
+ "]],
+ examples = {[["
+ \tikz \graph [binary tree layout, sibling distance=4mm, level distance=8mm,
+ components go right top aligned,
+ component sep=1pt, nodes=draw]
+ {
+ 1 -> 2 -> {3->4[second]->5,6,7};
+ a -> b[second] -> c[second] -> d -> e;
+ x -> y[second] -> z -> u[second] -> v;
+ };
+ "]],[["
+ \tikz \graph [binary tree layout, sibling distance=4mm, level distance=8mm,
+ components go right top aligned,
+ component sep=1em, nodes=draw]
+ {
+ 1 -> 2 -> {3->4[second]->5,6,7};
+ a -> b[second] -> c[second] -> d -> e;
+ x -> y[second] -> z -> u[second] -> v;
+ };
+ "]]
+ }
+}
+
+
+
+---
+
+declare {
+ key = "component distance",
+ type = "length",
+ initial = "2cm",
+
+ summary = [["
+ This is the minimum distance between the centers of bounding
+ boxes of connected components when they are placed next to each
+ other. (Not used, currently.)
+ "]]
+}
+
+
+return Distances
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/FineTune.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/FineTune.lua
new file mode 100644
index 0000000000..87d67b5b56
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/FineTune.lua
@@ -0,0 +1,164 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+local Coordinate = require "pgf.gd.model.Coordinate"
+local lib = require "pgf.gd.lib"
+
+---
+-- @section subsection {Fine-Tuning Positions of Nodes}
+--
+-- @end
+
+
+
+---
+declare {
+ key = "nudge",
+ type = "canvas coordinate",
+
+ summary = [["
+ This option allows you to slightly ``nudge'' (move) nodes after
+ they have been positioned by the given offset. The idea is that
+ this nudging is done after the position of the node has been
+ computed, so nudging has no influence on the actual graph
+ drawing algorithms. This, in turn, means that you can use
+ nudging to ``correct'' or ``optimize'' the positioning of nodes
+ after the algorithm has computed something.
+ "]],
+
+ examples = [["
+ \tikz \graph [edges=rounded corners, nodes=draw,
+ layered layout, sibling distance=0] {
+ a -- {b, c, d[nudge=(up:2mm)]} -- e -- a;
+ };
+ "]]
+}
+
+
+---
+-- @param distance A distance by which the node is nudges.
+
+declare {
+ key = "nudge up",
+ type = "length",
+ use = {
+ { key = "nudge", value = function (v) return Coordinate.new(0,v) end }
+ },
+
+ summary = "A shorthand for nudging a node upwards.",
+ examples = [["
+ \tikz \graph [edges=rounded corners, nodes=draw,
+ layered layout, sibling distance=0] {
+ a -- {b, c, d[nudge up=2mm]} -- e -- a;
+ };
+ "]]
+}
+
+
+---
+-- @param distance A distance by which the node is nudges.
+
+declare {
+ key = "nudge down",
+ type = "length",
+ use = {
+ { key = "nudge", value = function (v) return Coordinate.new(0,-v) end }
+ },
+
+ summary = "Like |nudge up|, but downwards."
+}
+
+---
+-- @param distance A distance by which the node is nudges.
+
+declare {
+ key = "nudge left",
+ type = "length",
+ use = {
+ { key = "nudge", value = function (v) return Coordinate.new(-v,0) end }
+ },
+
+ summary = "Like |nudge up|, but left.",
+ examples = [["
+ \tikz \graph [edges=rounded corners, nodes=draw,
+ layered layout, sibling distance=0] {
+ a -- {b, c, d[nudge left=2mm]} -- e -- a;
+ };
+ "]]
+}
+
+---
+-- @param distance A distance by which the node is nudges.
+
+declare {
+ key = "nudge right",
+ type = "length",
+ use = {
+ { key = "nudge", value = function (v) return Coordinate.new(v,0) end }
+ },
+
+ summary = "Like |nudge left|, but right."
+}
+
+
+---
+declare {
+ key = "regardless at",
+ type = "canvas coordinate",
+
+ summary = [["
+ Using this option you can provide a position for a node to wish
+ it will be forced after the graph algorithms have run. So, the node
+ is positioned normally and the graph drawing algorithm does not know
+ about the position specified using |regardless at|. However,
+ afterwards, the node is placed there, regardless of what the
+ algorithm has computed (all other nodes are unaffected).
+ "]],
+ examples = [["
+ \tikz \graph [edges=rounded corners, nodes=draw,
+ layered layout, sibling distance=0] {
+ a -- {b,c,d[regardless at={(1,0)}]} -- e -- a;
+ };
+ "]]
+}
+
+
+
+
+---
+-- @param pos A canvas position (a coordinate).
+
+declare {
+ key = "nail at",
+ type = "canvas coordinate",
+ use = {
+ { key = "desired at", value = lib.id },
+ { key = "regardless at", value = lib.id },
+ },
+
+ summary = [["
+ This option combines |desired at| and |regardless at|. Thus, the
+ algorithm is ``told'' about the desired position. If it fails to place
+ the node at the desired position, it will be put there
+ regardless. The name of the key is intended to remind one of a node
+ being ``nailed'' to the canvas.
+ "]],
+ examples = [["
+ \tikz \graph [edges=rounded corners, nodes=draw,
+ layered layout, sibling distance=0] {
+ a -- {b,c,d[nail at={(1,0)}]} -- e[nail at={(1.5,-1)}] -- a;
+ };
+ "]]
+}
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/LayoutPipeline.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/LayoutPipeline.lua
new file mode 100644
index 0000000000..1c5e48b4c7
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/LayoutPipeline.lua
@@ -0,0 +1,1347 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- This class controls the running of graph drawing algorithms on
+-- graphs. In particular, it performs pre- and posttransformations and
+-- also invokes the collapsing of sublayouts.
+--
+-- You do not call any of the methods of this class directly, the
+-- whole class is included only for documentation purposes.
+--
+-- Before an algorithm is applied, a number of transformations will
+-- have been applied, depending on the algorithm's |preconditions|
+-- field:
+-- %
+-- \begin{itemize}
+-- \item |connected|
+--
+-- If this property is set for an algorithm (that is, in the
+-- |declare| statement for the algorithm the |predconditions| field
+-- has the entry |connected=true| set), then the graph will be
+-- decomposed into connected components. The algorithm is run on each
+-- component individually.
+-- \item |tree|
+--
+-- When set, the field |spanning_tree| of the algorithm will be set
+-- to a spanning tree of the graph. This option implies |connected|.
+-- \item |loop_free|
+--
+-- When set, all loops (arcs from a vertex to itself) will have been
+-- removed when the algorithm runs.
+--
+-- \item |at_least_two_nodes|
+--
+-- When explicitly set to |false| (this precondition is |true| by
+-- default), the algorithm will even be run if there is only a
+-- single vertex in the graph.
+-- \end{itemize}
+--
+-- Once the algorithm has run, the algorithm's |postconditions| will
+-- be processed:
+-- %
+-- \begin{itemize}
+-- \item |upward_oriented|
+--
+-- When set, the algorithm tells the layout pipeline that the graph
+-- has been laid out in a layered manner with each layer going from
+-- left to right and layers at a whole going upwards (positive
+-- $y$-coordinates). The graph will then be rotated and possibly
+-- swapped in accordance with the |grow| key set by the user.
+-- \item |fixed|
+--
+-- When set, no rotational postprocessing will be done after the
+-- algorithm has run. Usually, a graph is rotated to meet a user's
+-- |orient| settings. However, when the algorithm has already
+-- ``ideally'' rotated the graph, set this postcondition.
+-- \end{itemize}
+--
+--
+-- In addition to the above-described always-present and automatic
+-- transformations, users may also specify additional pre- and
+-- posttransformations. This happens when users install additional
+-- algorithms in appropriate phases. In detail, the following happens
+-- in order:
+-- %
+-- \begin{enumerate}
+-- \item If specified, the graph is decomposed into connected
+-- components and the following steps are applied to each component
+-- individually.
+-- \item All algorithms in the phase stack for the phase
+-- |preprocessing| are applied to the component. These algorithms are
+-- run one after the other in the order they appear in the phase stack.
+-- \item If necessary, the spanning tree is now computed and
+-- rotational information is gathered.
+-- \item The single algorithm in phase |main| is called.
+-- \item All algorithms in the phase stack for the phase
+-- |edge routing| are run.
+-- \item All algorithms in the phase stack for phase |postprocessing|
+-- are run.
+-- \item Edge syncing, orientation, and anchoring are applied.
+-- \end{enumerate}
+--
+-- If sublayouts are used, all of the above (except for anchoring)
+-- happens for each sublayout.
+
+local LayoutPipeline = {}
+
+
+-- Namespace
+require("pgf.gd.control").LayoutPipeline = LayoutPipeline
+
+
+-- Imports
+local Direct = require "pgf.gd.lib.Direct"
+local Storage = require "pgf.gd.lib.Storage"
+local Simplifiers = require "pgf.gd.lib.Simplifiers"
+local LookupTable = require "pgf.gd.lib.LookupTable"
+local Transform = require "pgf.gd.lib.Transform"
+
+local Arc = require "pgf.gd.model.Arc"
+local Vertex = require "pgf.gd.model.Vertex"
+local Digraph = require "pgf.gd.model.Digraph"
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Path = require "pgf.gd.model.Path"
+
+local Sublayouts = require "pgf.gd.control.Sublayouts"
+
+local lib = require "pgf.gd.lib"
+
+local InterfaceCore = require "pgf.gd.interface.InterfaceCore"
+
+
+
+
+-- Forward definitions
+
+local prepare_events
+
+
+
+-- The main ``graph drawing pipeline'' that handles the pre- and
+-- postprocessing for a graph. This method is called by the display
+-- interface.
+--
+-- @param scope A graph drawing scope.
+
+function LayoutPipeline.run(scope)
+
+ -- The pipeline...
+
+ -- Step 1: Preparations
+
+ -- Prepare events
+ prepare_events(scope.events)
+
+ -- Step 2: Recursively layout the graph, starting with the root layout
+ local root_layout = assert(scope.collections[InterfaceCore.sublayout_kind][1], "no layout in scope")
+
+ scope.syntactic_digraph =
+ Sublayouts.layoutRecursively (scope,
+ root_layout,
+ LayoutPipeline.runOnLayout,
+ { root_layout })
+
+ -- Step 3: Anchor the graph
+ LayoutPipeline.anchor(scope.syntactic_digraph, scope)
+
+ -- Step 4: Apply regardless transforms
+ Sublayouts.regardless(scope.syntactic_digraph)
+
+ -- Step 5: Cut edges
+ LayoutPipeline.cutEdges(scope.syntactic_digraph)
+
+end
+
+
+
+--
+-- This method is called by the sublayout rendering pipeline when the
+-- algorithm should be invoked for an individual graph. At this point,
+-- the sublayouts will already have been collapsed.
+--
+-- @param scope The graph drawing scope.
+-- @param algorithm_class The to-be-applied algorithm class.
+-- @param layout_graph A subgraph of the syntactic digraph which is
+-- restricted to the current layout and in which sublayouts have
+-- been contracted to single nodes.
+-- @param layout The layout to which the graph belongs.
+--
+function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, layout)
+
+ if #layout_graph.vertices < 1 then
+ return
+ end
+
+ -- The involved main graphs:
+ local layout_copy = Digraph.new (layout_graph) --Direct.digraphFromSyntacticDigraph(layout_graph)
+ for _,a in ipairs(layout_graph.arcs) do
+ local new_a = layout_copy:connect(a.tail,a.head)
+ new_a.syntactic_edges = a.syntactic_edges
+ end
+
+ -- Step 1: Decompose the graph into connected components, if necessary:
+ local syntactic_components
+ if algorithm_class.preconditions.tree or algorithm_class.preconditions.connected or layout_graph.options.componentwise then
+ syntactic_components = LayoutPipeline.decompose(layout_copy)
+ LayoutPipeline.sortComponents(layout_graph.options['component order'], syntactic_components)
+ else
+ -- Only one component: The graph itself...
+ syntactic_components = { layout_copy }
+ end
+
+ -- Step 2: For all components do:
+ for i,syntactic_component in ipairs(syntactic_components) do
+
+ -- Step 2.1: Reset random number generator to make sure that the
+ -- same graph is always typeset in the same way.
+ lib.randomseed(layout_graph.options['random seed'])
+
+ local digraph = Direct.digraphFromSyntacticDigraph(syntactic_component)
+
+ -- Step 2.3: If requested, remove loops
+ if algorithm_class.preconditions.loop_free then
+ for _,v in ipairs(digraph.vertices) do
+ digraph:disconnect(v,v)
+ end
+ end
+
+ -- Step 2.4: Precompute the underlying undirected graph
+ local ugraph = Direct.ugraphFromDigraph(digraph)
+
+ -- Step 2.4a: Run preprocessor
+ for _,class in ipairs(layout_graph.options.algorithm_phases["preprocessing stack"]) do
+ class.new{
+ digraph = digraph,
+ ugraph = ugraph,
+ scope = scope,
+ layout = layout,
+ layout_graph = layout_graph,
+ syntactic_component = syntactic_component,
+ }:run()
+ end
+
+ -- Step 2.5: Create an algorithm object
+ local algorithm = algorithm_class.new{
+ digraph = digraph,
+ ugraph = ugraph,
+ scope = scope,
+ layout = layout,
+ layout_graph = layout_graph,
+ syntactic_component = syntactic_component,
+ }
+
+ -- Step 2.7: Compute a spanning tree, if necessary
+ if algorithm_class.preconditions.tree then
+ local spanning_algorithm_class = syntactic_component.options.algorithm_phases["spanning tree computation"]
+ algorithm.spanning_tree =
+ spanning_algorithm_class.new{
+ ugraph = ugraph,
+ events = scope.events
+ }:run()
+ end
+
+ -- Step 2.8: Compute growth-adjusted sizes
+ algorithm.rotation_info = LayoutPipeline.prepareRotateAround(algorithm.postconditions, syntactic_component)
+ algorithm.adjusted_bb = Storage.newTableStorage()
+ LayoutPipeline.prepareBoundingBoxes(algorithm.rotation_info, algorithm.adjusted_bb, syntactic_component, syntactic_component.vertices)
+
+ -- Step 2.9: Finally, run algorithm on this component!
+ if #digraph.vertices > 1 or algorithm_class.run_also_for_single_node
+ or algorithm_class.preconditions.at_least_two_nodes == false then
+ -- Main run of the algorithm:
+ if algorithm_class.old_graph_model then
+ LayoutPipeline.runOldGraphModel(scope, digraph, algorithm_class, algorithm)
+ else
+ algorithm:run ()
+ end
+ end
+
+ -- Step 2.9a: Run edge routers
+ for _,class in ipairs(layout_graph.options.algorithm_phases["edge routing stack"]) do
+ class.new{
+ digraph = digraph,
+ ugraph = ugraph,
+ scope = scope,
+ layout = layout,
+ layout_graph = layout_graph,
+ syntactic_component = syntactic_component,
+ }:run()
+ end
+
+ -- Step 2.9b: Run postprocessor
+ for _,class in ipairs(layout_graph.options.algorithm_phases["postprocessing stack"]) do
+ class.new{
+ digraph = digraph,
+ ugraph = ugraph,
+ scope = scope,
+ layout = layout,
+ layout_graph = layout_graph,
+ syntactic_component = syntactic_component,
+ }:run()
+ end
+
+ -- Step 2.10: Sync the graphs
+ digraph:sync()
+ ugraph:sync()
+ if algorithm.spanning_tree then
+ algorithm.spanning_tree:sync()
+ end
+
+ -- Step 2.11: Orient the graph
+ LayoutPipeline.orient(algorithm.rotation_info, algorithm.postconditions, syntactic_component, scope)
+ end
+
+ -- Step 3: Packing:
+ LayoutPipeline.packComponents(layout_graph, syntactic_components)
+
+end
+
+
+
+
+
+
+---
+-- This function is called internally to perform the graph anchoring
+-- procedure described in
+-- Section~\ref{subsection-library-graphdrawing-anchoring}. These
+-- transformations are always performed.
+--
+-- @param graph A graph
+-- @param scope The scope
+
+function LayoutPipeline.anchor(graph, scope)
+
+ -- Step 1: Find anchor node:
+ local anchor_node
+
+ local anchor_node_name = graph.options['anchor node']
+ if anchor_node_name then
+ anchor_node = scope.node_names[anchor_node_name]
+ end
+
+ if not graph:contains(anchor_node) then
+ anchor_node =
+ lib.find (graph.vertices, function (v) return v.options['anchor here'] end) or
+ lib.find (graph.vertices, function (v) return v.options['desired at'] end) or
+ graph.vertices[1]
+ end
+
+ -- Sanity check
+ assert(graph:contains(anchor_node), "anchor node is not in graph!")
+
+ local desired = anchor_node.options['desired at'] or graph.options['anchor at']
+ local delta = desired - anchor_node.pos
+
+ -- Step 3: Shift nodes
+ for _,v in ipairs(graph.vertices) do
+ v.pos:shiftByCoordinate(delta)
+ end
+ for _,a in ipairs(graph.arcs) do
+ if a.path then a.path:shiftByCoordinate(delta) end
+ for _,e in ipairs(a.syntactic_edges) do
+ e.path:shiftByCoordinate(delta)
+ end
+ end
+end
+
+
+
+---
+-- This method tries to determine in which direction the graph is supposed to
+-- grow and in which direction the algorithm will grow the graph. These two
+-- pieces of information together produce a necessary rotation around some node.
+-- This rotation is returned in a table.
+--
+-- Note that this method does not actually cause a rotation to happen; this is
+-- left to other method.
+--
+-- @param postconditions The algorithm's postconditions.
+-- @param graph An undirected graph
+-- @return A table containing the computed information.
+
+function LayoutPipeline.prepareRotateAround(postconditions, graph)
+
+ -- Find the vertex from which we orient
+ local swap = true
+
+ local v,_,grow = lib.find (graph.vertices, function (v) return v.options["grow"] end)
+
+ if not v and graph.options["grow"] then
+ v,grow,swap = graph.vertices[1], graph.options["grow"], true
+ end
+
+ if not v then
+ v,_,grow = lib.find (graph.vertices, function (v) return v.options["grow'"] end)
+ swap = false
+ end
+
+ if not v and graph.options["grow'"] then
+ v,grow,swap = graph.vertices[1], graph.options["grow'"], false
+ end
+
+ if not v then
+ v, grow, swap = graph.vertices[1], -90, true
+ end
+
+ -- Now compute the rotation
+ local info = {}
+ local growth_direction = (postconditions.upward_oriented and 90) or (postconditions.upward_oriented_swapped and 90)
+
+ if postconditions.upward_oriented_swapped then
+ swap = not swap
+ end
+
+ if growth_direction == "fixed" then
+ info.angle = 0 -- no rotation
+ elseif growth_direction then
+ info.from_node = v
+ info.from_angle = growth_direction/360*2*math.pi
+ info.to_angle = grow/360*2*math.pi
+ info.swap = swap
+ info.angle = info.to_angle - info.from_angle
+ else
+ info.from_node = v
+ local other = lib.find_min(
+ graph:outgoing(v),
+ function (a)
+ if a.head ~= v and a:eventIndex() then
+ return a, a:eventIndex()
+ end
+ end)
+ info.to_node = (other and other.head) or
+ (graph.vertices[1] == v and graph.vertices[2] or graph.vertices[1])
+ info.to_angle = grow/360*2*math.pi
+ info.swap = swap
+ info.angle = info.to_angle - math.atan2(info.to_node.pos.y - v.pos.y, info.to_node.pos.x - v.pos.x)
+ end
+
+ return info
+end
+
+
+
+---
+-- Compute growth-adjusted node sizes.
+--
+-- For each node of the graph, compute bounding box of the node that
+-- results when the node is rotated so that it is in the correct
+-- orientation for what the algorithm assumes.
+--
+-- The ``bounding box'' actually consists of the fields
+-- %
+-- \begin{itemize}
+-- \item |sibling_pre|,
+-- \item |sibling_post|,
+-- \item |layer_pre|, and
+-- \item |layer_post|,
+-- \end{itemize}
+-- %
+-- which correspond to ``min x'', ``min y'', ``min y'', and ``max y''
+-- for a tree growing up.
+--
+-- The computation of the ``bounding box'' treats a centered circle in
+-- a special way, all other shapes are currently treated like a
+-- rectangle.
+--
+-- @param rotation_info The table computed by the function prepareRotateAround
+-- @param packing_storage A storage in which the computed distances are stored.
+-- @param graph An graph
+-- @param vertices An array of to-be-prepared vertices inside graph
+
+function LayoutPipeline.prepareBoundingBoxes(rotation_info, adjusted_bb, graph, vertices)
+
+ local angle = assert(rotation_info.angle, "angle field missing")
+ local swap = rotation_info.swap
+
+ for _,v in ipairs(vertices) do
+ local bb = adjusted_bb[v]
+ local a = angle
+
+ if v.shape == "circle" then
+ a = 0 -- no rotation for circles.
+ end
+
+ -- Fill the bounding box field,
+ bb.sibling_pre = math.huge
+ bb.sibling_post = -math.huge
+ bb.layer_pre = math.huge
+ bb.layer_post = -math.huge
+
+ local c = math.cos(angle)
+ local s = math.sin(angle)
+ for _,p in ipairs(v.path:coordinates()) do
+ local x = p.x*c + p.y*s
+ local y = -p.x*s + p.y*c
+
+ bb.sibling_pre = math.min (bb.sibling_pre, x)
+ bb.sibling_post = math.max (bb.sibling_post, x)
+ bb.layer_pre = math.min (bb.layer_pre, y)
+ bb.layer_post = math.max (bb.layer_post, y)
+ end
+
+ -- Flip sibling per and post if flag:
+ if swap then
+ bb.sibling_pre, bb.sibling_post = -bb.sibling_post, -bb.sibling_pre
+ end
+ end
+end
+
+
+
+
+
+--
+-- Rotate the whole graph around a point
+--
+-- Causes the graph to be rotated around \meta{around} so that what
+-- used to be the |from_angle| becomes the |to_angle|. If the flag |swap|
+-- is set, the graph is additionally swapped along the |to_angle|.
+--
+-- @param graph The to-be-rotated (undirected) graph
+-- @param around_x The $x$-coordinate of the point around which the graph should be rotated
+-- @param around_y The $y$-coordinate
+-- @param from An ``old'' angle
+-- @param to A ``new'' angle
+-- @param swap A boolean that, when true, requests that the graph is
+-- swapped (flipped) along the new angle
+
+function LayoutPipeline.rotateGraphAround(graph, around_x, around_y, from, to, swap)
+
+ -- Translate to origin
+ local t = Transform.new_shift(-around_x, -around_y)
+
+ -- Rotate to zero degrees:
+ t = Transform.concat(Transform.new_rotation(-from), t)
+
+ -- Swap
+ if swap then
+ t = Transform.concat(Transform.new_scaling(1,-1), t)
+ end
+
+ -- Rotate to from degrees:
+ t = Transform.concat(Transform.new_rotation(to), t)
+
+ -- Translate back
+ t = Transform.concat(Transform.new_shift(around_x, around_y), t)
+
+ for _,v in ipairs(graph.vertices) do
+ v.pos:apply(t)
+ end
+ for _,a in ipairs(graph.arcs) do
+ for _,p in ipairs(a:pointCloud()) do
+ p:apply(t)
+ end
+ end
+end
+
+
+
+--
+-- Orient the whole graph using two nodes
+--
+-- The whole graph is rotated so that the line from the first node to
+-- the second node has the given angle. If swap is set to true, the
+-- graph is also flipped along this line.
+--
+-- @param graph
+-- @param first_node
+-- @param seond_node
+-- @param target_angle
+-- @param swap
+
+function LayoutPipeline.orientTwoNodes(graph, first_node, second_node, target_angle, swap)
+ if first_node and second_node then
+ -- Compute angle between first_node and second_node:
+ local x = second_node.pos.x - first_node.pos.x
+ local y = second_node.pos.y - first_node.pos.y
+
+ local angle = math.atan2(y,x)
+ LayoutPipeline.rotateGraphAround(graph, first_node.pos.x,
+ first_node.pos.y, angle, target_angle, swap)
+ end
+end
+
+
+
+---
+-- Performs a post-layout orientation of the graph by performing the
+-- steps documented in Section~\ref{subsection-library-graphdrawing-standard-orientation}.
+--
+-- @param rotation_info The info record computed by the function |prepareRotateAround|.
+-- @param postconditions The algorithm's postconditions.
+-- @param graph A to-be-oriented graph.
+-- @param scope The graph drawing scope.
+
+function LayoutPipeline.orient(rotation_info, postconditions, graph, scope)
+
+ -- Sanity check
+ if #graph.vertices < 2 then return end
+
+ -- Step 1: Search for global graph orient options:
+ local function f (orient, tail, head, flag)
+ if orient and head and tail then
+ local n1 = scope.node_names[tail]
+ local n2 = scope.node_names[head]
+ if graph:contains(n1) and graph:contains(n2) then
+ LayoutPipeline.orientTwoNodes(graph, n1, n2, orient/360*2*math.pi, flag)
+ return true
+ end
+ end
+ end
+ if f(graph.options["orient"], graph.options["orient tail"],graph.options["orient head"], false) then return end
+ if f(graph.options["orient'"], graph.options["orient tail"],graph.options["orient head"], true) then return end
+ local tail, head = string.match(graph.options["horizontal"] or "", "^(.*) to (.*)$")
+ if f(0, tail, head, false) then return end
+ local tail, head = string.match(graph.options["horizontal'"] or "", "^(.*) to (.*)$")
+ if f(0, tail, head, true) then return end
+ local tail, head = string.match(graph.options["vertical"] or "", "^(.*) to (.*)$")
+ if f(-90, tail, head, false) then return end
+ local tail, head = string.match(graph.options["vertical'"] or "", "^(.*) to (.*)$")
+ if f(-90, tail, head, true) then return end
+
+ -- Step 2: Search for a node with the orient option:
+ for _, v in ipairs(graph.vertices) do
+ local function f (key, flag)
+ local orient = v.options[key]
+ local head = v.options["orient head"]
+ local tail = v.options["orient tail"]
+
+ if orient and head then
+ local n2 = scope.node_names[head]
+ if graph:contains(n2) then
+ LayoutPipeline.orientTwoNodes(graph, v, n2, orient/360*2*math.pi, flag)
+ return true
+ end
+ elseif orient and tail then
+ local n1 = scope.node_names[tail]
+ if graph:contains(n1) then
+ LayoutPipeline.orientTwoNodes(graph, n1, v, orient/360*2*math.pi, flag)
+ return true
+ end
+ end
+ end
+ if f("orient", false) then return end
+ if f("orient'", true) then return end
+ end
+
+ -- Step 3: Search for an edge with the orient option:
+ for _, a in ipairs(graph.arcs) do
+ if a:options("orient",true) then
+ return LayoutPipeline.orientTwoNodes(graph, a.tail, a.head, a:options("orient")/360*2*math.pi, false)
+ end
+ if a:options("orient'",true) then
+ return LayoutPipeline.orientTwoNodes(graph, a.tail, a.head, a:options("orient'")/360*2*math.pi, true)
+ end
+ end
+
+ -- Step 4: Search two nodes with a desired at option:
+ local first, second, third
+
+ for _, v in ipairs(graph.vertices) do
+ if v.options['desired at'] then
+ if first then
+ if second then
+ third = v
+ break
+ else
+ second = v
+ end
+ else
+ first = v
+ end
+ end
+ end
+
+ if second then
+ local a = first.options['desired at']
+ local b = second.options['desired at']
+ return LayoutPipeline.orientTwoNodes(graph, first, second, math.atan2(b.y-a.y,b.x-a.x), false)
+ end
+
+ -- Computed during preprocessing:
+ if rotation_info.from_node and postconditions.fixed ~= true then
+ local x = rotation_info.from_node.pos.x
+ local y = rotation_info.from_node.pos.y
+ local from_angle = rotation_info.from_angle or math.atan2(rotation_info.to_node.pos.y - y, rotation_info.to_node.pos.x - x)
+
+ LayoutPipeline.rotateGraphAround(graph, x, y, from_angle, rotation_info.to_angle, rotation_info.swap)
+ end
+end
+
+
+
+
+---
+-- This internal function is called to decompose a graph into its
+-- components. Whether or not this function is called depends on
+-- whether the precondition |connected| is set for the algorithm class
+-- and whether the |componentwise| key is used.
+--
+-- @param graph A to-be-decomposed graph
+--
+-- @return An array of graph objects that represent the connected components of the graph.
+
+function LayoutPipeline.decompose (digraph)
+
+ -- The list of connected components (node sets)
+ local components = {}
+
+ -- Remember, which graphs have already been visited
+ local visited = {}
+
+ for _,v in ipairs(digraph.vertices) do
+ if not visited[v] then
+ -- Start a depth-first-search of the graph, starting at node n:
+ local stack = { v }
+ local component = Digraph.new {
+ syntactic_digraph = digraph.syntactic_digraph,
+ options = digraph.options
+ }
+
+ while #stack >= 1 do
+ local tos = stack[#stack]
+ stack[#stack] = nil -- pop
+
+ if not visited[tos] then
+
+ -- Visit pos:
+ component:add { tos }
+ visited[tos] = true
+
+ -- Push all unvisited neighbors:
+ for _,a in ipairs(digraph:incoming(tos)) do
+ local neighbor = a.tail
+ if not visited[neighbor] then
+ stack[#stack+1] = neighbor -- push
+ end
+ end
+ for _,a in ipairs(digraph:outgoing(tos)) do
+ local neighbor = a.head
+ if not visited[neighbor] then
+ stack[#stack+1] = neighbor -- push
+ end
+ end
+ end
+ end
+
+ -- Ok, vertices will now contain all vertices reachable from n.
+ components[#components+1] = component
+ end
+ end
+
+ if #components < 2 then
+ return { digraph }
+ end
+
+ for _,c in ipairs(components) do
+ table.sort (c.vertices, function (u,v) return u.event.index < v.event.index end)
+ for _,v in ipairs(c.vertices) do
+ for _,a in ipairs(digraph:outgoing(v)) do
+ local new_a = c:connect(a.tail, a.head)
+ new_a.syntactic_edges = a.syntactic_edges
+ end
+ for _,a in ipairs(digraph:incoming(v)) do
+ local new_a = c:connect(a.tail, a.head)
+ new_a.syntactic_edges = a.syntactic_edges
+ end
+ end
+ end
+
+ return components
+end
+
+
+
+
+-- Handling of component order
+--
+-- LayoutPipeline are ordered according to a function that is stored in
+-- a key of the |LayoutPipeline.component_ordering_functions| table
+-- whose name is the graph option |component order|.
+--
+-- @param component_order An ordering method
+-- @param subgraphs A list of to-be-sorted subgraphs
+
+function LayoutPipeline.sortComponents(component_order, subgraphs)
+ if component_order then
+ local f = LayoutPipeline.component_ordering_functions[component_order]
+ if f then
+ table.sort (subgraphs, f)
+ end
+ end
+end
+
+
+-- Right now, we hardcode the functions here. Perhaps make this
+-- dynamic in the future. Could easily be done on the tikzlayer,
+-- actually.
+
+LayoutPipeline.component_ordering_functions = {
+ ["increasing node number"] =
+ function (g,h)
+ if #g.vertices == #h.vertices then
+ return g.vertices[1].event.index < h.vertices[1].event.index
+ else
+ return #g.vertices < #h.vertices
+ end
+ end,
+ ["decreasing node number"] =
+ function (g,h)
+ if #g.vertices == #h.vertices then
+ return g.vertices[1].event.index < h.vertices[1].event.index
+ else
+ return #g.vertices > #h.vertices
+ end
+ end,
+ ["by first specified node"] = nil,
+}
+
+
+
+
+local function compute_rotated_bb(vertices, angle, sep, bb)
+
+ local r = Transform.new_rotation(-angle)
+
+ for _,v in ipairs(vertices) do
+ -- Find the rotated bounding box field,
+ local t = Transform.concat(r,Transform.new_shift(v.pos.x, v.pos.y))
+
+ local min_x = math.huge
+ local max_x = -math.huge
+ local min_y = math.huge
+ local max_y = -math.huge
+
+ for _,e in ipairs(v.path) do
+ if type(e) == "table" then
+ local c = e:clone()
+ c:apply(t)
+
+ min_x = math.min (min_x, c.x)
+ max_x = math.max (max_x, c.x)
+ min_y = math.min (min_y, c.y)
+ max_y = math.max (max_y, c.y)
+ end
+ end
+
+ -- Enlarge by sep:
+ min_x = min_x - sep
+ max_x = max_x + sep
+ min_y = min_y - sep
+ max_y = max_y + sep
+
+ local _,_,_,_,c_x,c_y = v:boundingBox()
+ local center = Coordinate.new(c_x,c_y)
+
+ center:apply(t)
+
+ bb[v].min_x = min_x
+ bb[v].max_x = max_x
+ bb[v].min_y = min_y
+ bb[v].max_y = max_y
+ bb[v].c_y = center.y
+ end
+end
+
+
+
+---
+-- This internal function packs the components of a graph. See
+-- Section~\ref{subsection-gd-component-packing} for details.
+--
+-- @param graph The graph
+-- @param components A list of components
+
+function LayoutPipeline.packComponents(syntactic_digraph, components)
+
+ local vertices = Storage.newTableStorage()
+ local bb = Storage.newTableStorage()
+
+ -- Step 1: Preparation, rotation to target direction
+ local sep = syntactic_digraph.options['component sep']
+ local angle = syntactic_digraph.options['component direction']/180*math.pi
+
+ local mark = {}
+ for _,c in ipairs(components) do
+
+ -- Setup the lists of to-be-considered nodes
+ local vs = {}
+ for _,v in ipairs(c.vertices) do
+ vs [#vs + 1] = v
+ end
+
+ for _,a in ipairs(c.arcs) do
+ for _,p in ipairs(a:pointCloud()) do
+ vs [#vs + 1] = Vertex.new { pos = p }
+ end
+ end
+ vertices[c] = vs
+
+ compute_rotated_bb(vs, angle, sep/2, bb)
+ end
+
+ local x_shifts = { 0 }
+ local y_shifts = {}
+
+ -- Step 2: Vertical alignment
+ for i,c in ipairs(components) do
+ local max_max_y = -math.huge
+ local max_center_y = -math.huge
+ local min_min_y = math.huge
+ local min_center_y = math.huge
+
+ for _,v in ipairs(c.vertices) do
+ local info = bb[v]
+ max_max_y = math.max(info.max_y, max_max_y)
+ max_center_y = math.max(info.c_y, max_center_y)
+ min_min_y = math.min(info.min_y, min_min_y)
+ min_center_y = math.min(info.c_y, min_center_y)
+ end
+
+ -- Compute alignment line
+ local valign = syntactic_digraph.options['component align']
+ local line
+ if valign == "counterclockwise bounding box" then
+ line = max_max_y
+ elseif valign == "counterclockwise" then
+ line = max_center_y
+ elseif valign == "center" then
+ line = (max_max_y + min_min_y) / 2
+ elseif valign == "clockwise" then
+ line = min_center_y
+ elseif valign == "first node" then
+ line = bb[c.vertices[1]].c_y
+ else
+ line = min_min_y
+ end
+
+ -- Overruled?
+ for _,v in ipairs(c.vertices) do
+ if v.options['align here'] then
+ line = bb[v].c_y
+ break
+ end
+ end
+
+ -- Ok, go!
+ y_shifts[i] = -line
+
+ -- Adjust nodes:
+ for _,v in ipairs(vertices[c]) do
+ local info = bb[v]
+ info.min_y = info.min_y - line
+ info.max_y = info.max_y - line
+ info.c_y = info.c_y - line
+ end
+ end
+
+ -- Step 3: Horizontal alignment
+ local y_values = {}
+
+ for _,c in ipairs(components) do
+ for _,v in ipairs(vertices[c]) do
+ local info = bb[v]
+ y_values[#y_values+1] = info.min_y
+ y_values[#y_values+1] = info.max_y
+ y_values[#y_values+1] = info.c_y
+ end
+ end
+
+ table.sort(y_values)
+
+ local y_ranks = {}
+ local right_face = {}
+ for i=1,#y_values do
+ y_ranks[y_values[i]] = i
+ right_face[i] = -math.huge
+ end
+
+
+
+ for i=1,#components-1 do
+ -- First, update right_face:
+ local touched = {}
+
+ for _,v in ipairs(vertices[components[i]]) do
+ local info = bb[v]
+ local border = info.max_x
+
+ for i=y_ranks[info.min_y],y_ranks[info.max_y] do
+ touched[i] = true
+ right_face[i] = math.max(right_face[i], border)
+ end
+ end
+
+ -- Fill up the untouched entries:
+ local right_max = -math.huge
+ for i=1,#y_values do
+ if not touched[i] then
+ -- Search for next and previous touched
+ local interpolate = -math.huge
+ for j=i+1,#y_values do
+ if touched[j] then
+ interpolate = math.max(interpolate,right_face[j] - (y_values[j] - y_values[i]))
+ break
+ end
+ end
+ for j=i-1,1,-1 do
+ if touched[j] then
+ interpolate = math.max(interpolate,right_face[j] - (y_values[i] - y_values[j]))
+ break
+ end
+ end
+ right_face[i] = math.max(interpolate,right_face[i])
+ end
+ right_max = math.max(right_max, right_face[i])
+ end
+
+ -- Second, compute the left face
+ local touched = {}
+ local left_face = {}
+ for i=1,#y_values do
+ left_face[i] = math.huge
+ end
+ for _,v in ipairs(vertices[components[i+1]]) do
+ local info = bb[v]
+ local border = info.min_x
+
+ for i=y_ranks[info.min_y],y_ranks[info.max_y] do
+ touched[i] = true
+ left_face[i] = math.min(left_face[i], border)
+ end
+ end
+
+ -- Fill up the untouched entries:
+ local left_min = math.huge
+ for i=1,#y_values do
+ if not touched[i] then
+ -- Search for next and previous touched
+ local interpolate = math.huge
+ for j=i+1,#y_values do
+ if touched[j] then
+ interpolate = math.min(interpolate,left_face[j] + (y_values[j] - y_values[i]))
+ break
+ end
+ end
+ for j=i-1,1,-1 do
+ if touched[j] then
+ interpolate = math.min(interpolate,left_face[j] + (y_values[i] - y_values[j]))
+ break
+ end
+ end
+ left_face[i] = interpolate
+ end
+ left_min = math.min(left_min, left_face[i])
+ end
+
+ -- Now, compute the shift.
+ local shift = -math.huge
+
+ if syntactic_digraph.options['component packing'] == "rectangular" then
+ shift = right_max - left_min
+ else
+ for i=1,#y_values do
+ shift = math.max(shift, right_face[i] - left_face[i])
+ end
+ end
+
+ -- Adjust nodes:
+ x_shifts[i+1] = shift
+ for _,v in ipairs(vertices[components[i+1]]) do
+ local info = bb[v]
+ info.min_x = info.min_x + shift
+ info.max_x = info.max_x + shift
+ end
+ end
+
+ -- Now, rotate shifts
+ for i,c in ipairs(components) do
+ local x = x_shifts[i]*math.cos(angle) - y_shifts[i]*math.sin(angle)
+ local y = x_shifts[i]*math.sin(angle) + y_shifts[i]*math.cos(angle)
+
+ for _,v in ipairs(vertices[c]) do
+ v.pos.x = v.pos.x + x
+ v.pos.y = v.pos.y + y
+ end
+ end
+end
+
+
+
+
+
+
+
+--
+-- Store for each begin/end event the index of
+-- its corresponding end/begin event
+--
+-- @param events An event list
+
+prepare_events =
+ function (events)
+ local stack = {}
+
+ for i=1,#events do
+ if events[i].kind == "begin" then
+ stack[#stack + 1] = i
+ elseif events[i].kind == "end" then
+ local tos = stack[#stack]
+ stack[#stack] = nil -- pop
+
+ events[tos].end_index = i
+ events[i].begin_index = tos
+ end
+ end
+ end
+
+
+
+---
+-- Cut the edges. This function handles the ``cutting'' of edges. The
+-- idea is that every edge is a path going from the center of the from
+-- node to the center of the target node. Now, we intersect this path
+-- with the path of the start node and cut away everything before this
+-- intersection. Likewise, we intersect the path with the head node
+-- and, again, cut away everything following the intersection.
+--
+-- These cuttings are not done if appropriate options are set.
+
+function LayoutPipeline.cutEdges(graph)
+
+ for _,a in ipairs(graph.arcs) do
+ for _,e in ipairs(a.syntactic_edges) do
+ local p = e.path
+ p:makeRigid()
+ local orig = p:clone()
+
+ if e.options['tail cut'] and e.tail.options['cut policy'] == "as edge requests"
+ or e.tail.options['cut policy'] == "all" then
+
+ local vpath = e.tail.path:clone()
+ vpath:shiftByCoordinate(e.tail.pos)
+
+ local x = p:intersectionsWith (vpath)
+
+ if #x > 0 then
+ p:cutAtBeginning(x[1].index, x[1].time)
+ end
+ end
+
+ if e.options['head cut'] and e.head.options['cut policy'] == "as edge requests"
+ or e.head.options['cut policy'] == "all" then
+
+ local vpath = e.head.path:clone()
+ vpath:shiftByCoordinate(e.head.pos)
+ x = p:intersectionsWith (vpath)
+ if #x > 0 then
+ p:cutAtEnd(x[#x].index, x[#x].time)
+ else
+ -- Check whether there was an intersection with the original
+ --path:
+ local x2 = orig:intersectionsWith (vpath)
+ if #x2 > 0 then
+ -- Ok, after cutting the tail vertex, there is no longer
+ -- an intersection with the head vertex, but there used to
+ -- be one. This means that the vertices overlap and the
+ -- path should be ``inside'' them. Hmm...
+ if e.options['allow inside edges'] and #p > 1 then
+ local from = p[2]
+ local to = x2[1].point
+ p:clear()
+ p:appendMoveto(from)
+ p:appendLineto(to)
+ else
+ p:clear()
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+
+
+
+
+
+-- Deprecated stuff
+
+local Node = require "pgf.gd.deprecated.Node"
+local Graph = require "pgf.gd.deprecated.Graph"
+local Edge = require "pgf.gd.deprecated.Edge"
+local Cluster = require "pgf.gd.deprecated.Cluster"
+
+
+
+
+
+local unique_count = 0
+
+local function compatibility_digraph_to_graph(scope, g)
+ local graph = Graph.new()
+
+ -- Graph options
+ graph.options = g.options
+ graph.orig_digraph = g
+
+ -- Events
+ for i,e in ipairs(scope.events) do
+ graph.events[i] = e
+ end
+
+ -- Nodes
+ for _,v in ipairs(g.vertices) do
+ if not v.name then
+ -- compat needs unique name
+ v.name = "auto generated node nameINTERNAL" .. unique_count
+ unique_count = unique_count + 1
+ end
+ local minX, minY, maxX, maxY = v:boundingBox()
+ local node = Node.new{
+ name = v.name,
+ tex = {
+ tex_node = v.tex and v.tex.stored_tex_box_number,
+ shape = v.shape,
+ minX = minX,
+ maxX = maxX,
+ minY = minY,
+ maxY = maxY,
+ },
+ options = v.options,
+ event_index = v.event.index,
+ index = v.event.index,
+ orig_vertex = v,
+ }
+ graph:addNode(node)
+ graph.events[v.event.index or (#graph.events+1)] = { kind = 'node', parameters = node }
+ end
+
+ -- Edges
+ local mark = Storage.new()
+ for _,a in ipairs(g.arcs) do
+ local da = g.syntactic_digraph:arc(a.tail, a.head)
+ if da then
+ for _,m in ipairs(da.syntactic_edges) do
+ if not mark[m] then
+ mark[m] = true
+ local from_node = graph:findNode(da.tail.name)
+ local to_node = graph:findNode(da.head.name)
+ local edge = graph:createEdge(from_node, to_node, m.direction, nil, m.options, nil)
+ edge.event_index = m.event.index
+ edge.orig_m = m
+ graph.events[m.event.index] = { kind = 'edge', parameters = edge }
+ end
+ end
+ end
+ local da = g.syntactic_digraph:arc(a.head, a.tail)
+ if da then
+ for _,m in ipairs(da.syntactic_edges) do
+ if not mark[m] then
+ mark[m] = true
+ local from_node = graph:findNode(da.tail.name)
+ local to_node = graph:findNode(da.head.name)
+ local edge = graph:createEdge(from_node, to_node, m.direction, nil, m.options, nil)
+ edge.event_index = m.event.index
+ edge.orig_m = m
+ graph.events[m.event.index] = { kind = 'edge', parameters = edge }
+ end
+ end
+ end
+ end
+
+ table.sort(graph.edges, function(e1,e2) return e1.event_index < e2.event_index end)
+ for _,n in ipairs (graph.nodes) do
+ table.sort(n.edges, function(e1,e2) return e1.event_index < e2.event_index end)
+ end
+
+
+ -- Clusters
+ for _, c in ipairs(scope.collections['same layer'] or {}) do
+ cluster = Cluster.new("cluster" .. unique_count)
+ unique_count = unique_count+1
+ graph:addCluster(cluster)
+ for _,v in ipairs(c.vertices) do
+ if g:contains(v) then
+ cluster:addNode(graph:findNode(v.name))
+ end
+ end
+ end
+
+ return graph
+end
+
+
+local function compatibility_graph_to_digraph(graph)
+ for _,n in ipairs(graph.nodes) do
+ n.orig_vertex.pos.x = n.pos.x
+ n.orig_vertex.pos.y = n.pos.y
+ end
+ for _,e in ipairs(graph.edges) do
+ if #e.bend_points > 0 then
+ local c = {}
+ for _,x in ipairs(e.bend_points) do
+ c[#c+1] = Coordinate.new (x.x, x.y)
+ end
+ e.orig_m:setPolylinePath(c)
+ end
+ end
+end
+
+
+
+
+
+function LayoutPipeline.runOldGraphModel(scope, digraph, algorithm_class, algorithm)
+
+ local graph = compatibility_digraph_to_graph(scope, digraph)
+
+ algorithm.graph = graph
+ graph:registerAlgorithm(algorithm)
+
+ -- If requested, remove loops
+ if algorithm_class.preconditions.loop_free then
+ Simplifiers:removeLoopsOldModel(algorithm)
+ end
+
+ -- If requested, collapse multiedges
+ if algorithm_class.preconditions.simple then
+ Simplifiers:collapseMultiedgesOldModel(algorithm)
+ end
+
+ if #graph.nodes > 1 then
+ -- Main run of the algorithm:
+ algorithm:run ()
+ end
+
+ -- If requested, expand multiedges
+ if algorithm_class.preconditions.simple then
+ Simplifiers:expandMultiedgesOldModel(algorithm)
+ end
+
+ -- If requested, restore loops
+ if algorithm_class.preconditions.loop_free then
+ Simplifiers:restoreLoopsOldModel(algorithm)
+ end
+
+ compatibility_graph_to_digraph(graph)
+end
+
+
+
+
+-- Done
+
+return LayoutPipeline
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/NodeAnchors.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/NodeAnchors.lua
new file mode 100644
index 0000000000..80aa7ef420
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/NodeAnchors.lua
@@ -0,0 +1,175 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+
+---
+-- @section subsection {Anchoring Edges}
+--
+-- \label{section-gd-anchors}
+--
+-- When a graph has been laid out completely, the edges between the
+-- nodes must be drawn. Conceptually, an edge is ``between two
+-- nodes'', but when we actually draw the node, we do not really want
+-- the edge's path to start ``in the middle'' of the node; rather, we
+-- want it to start ``on the border'' and also end there.
+--
+-- Normally, computing such border positions for nodes is something we
+-- would leave to the so-called display layer (which is typically
+-- \tikzname\ and \tikzname\ is reasonably good at computing border
+-- positions). However, different display layers may behave
+-- differently here and even \tikzname\ fails when the node shapes are
+-- very involved and the paths also.
+--
+-- For these reasons, computing the anchor positions where edges start
+-- and end is done inside the graph drawing system. As a user, you
+-- specify a |tail anchor| and a |head anchor|, which are points
+-- inside the tail and head nodes, respectively. The edge path will
+-- then start and end at these points, however, they will usually be
+-- shortened so that they actually start and end on the intersection
+-- of the edge's path with the nodes' paths.
+
+
+---
+
+declare {
+ key = "tail anchor",
+ type = "string",
+ initial = "",
+
+ summary = [["
+ Specifies where in the tail vertex the edge should start.
+ "]],
+
+ documentation = [["
+ This is either a string or a number, interpreted as an angle
+ (with 90 meaning ``up''). If it is a string, when the start of
+ the edge is computed, we try to look up the anchor in the tail
+ vertex's table of anchors (some anchors get installed in this
+ table by the display system). If it is not found, we test
+ whether it is one of the special ``direction anchors'' like
+ |north| or |south east|. If so, we convert them into points on
+ the border of the node that lie in the direction of a line
+ starting at the center to a point on the bounding box of the
+ node in the designated direction. Finally, if the anchor is a
+ number, we use a point on the border of the node that is on a
+ line from the center in the specified direction.
+
+ If the anchor is set to the empty string (which is the default),
+ the anchor is interpreted as the |center| anchor inside the
+ graph drawing system. However, a display system may choose to
+ make a difference between the |center| anchor and an empty
+ anchor (\tikzname\ does: for options like |bend left| if the
+ anchor is empty, the bend line starts at the border of the node,
+ while for the anchor set explicitly to |center| it starts at the
+ center).
+
+ Note that graph drawing algorithms need not take the
+ setting of this option into consideration. However, the final
+ rendering of the edge will always take it into consideration
+ (only, the setting may not be very sensible if the algorithm
+ ignored it).
+ "]]
+}
+
+---
+
+declare {
+ key = "head anchor",
+ type = "string",
+ initial = "",
+
+ summary = "See |tail anchor|"
+}
+
+
+---
+
+declare {
+ key = "tail cut",
+ type = "boolean",
+ initial = true,
+
+ summary = [["
+ Decides whether the tail of an edge is ``cut'', meaning
+ that the edge's path will be shortened at the beginning so that
+ it starts only of the node's border rather than at the exact
+ position of the |tail anchor|, which may be inside the node.
+ "]]
+}
+
+
+---
+
+declare {
+ key = "head cut",
+ type = "boolean",
+ initial = true,
+
+ summary = "See |tail cut|."
+}
+
+
+---
+
+declare {
+ key = "cut policy",
+ type = "string",
+ initial = "as edge requests",
+
+ summary = "The policy for cutting edges entering or leaving a node.",
+
+ documentation = [["
+ This option is important for nodes only. It can have three
+ possible values:
+ %
+ \begin{itemize}
+ \item |as edge requests| Whether or not an edge entering or
+ leaving the node is cut depends on the setting of the edge's
+ |tail cut| and |head cut| options. This is the default.
+ \item |all| All edges entering or leaving the node are cut,
+ regardless of the edges' cut values.
+ \item |none| No edge entering or leaving the node is cut,
+ regardless of the edges' cut values.
+ \end{itemize}
+ "]]
+}
+
+
+---
+declare {
+ key = "allow inside edges",
+ type = "boolean",
+ initial = "true",
+
+ summary = "Decides whether an edge between overlapping nodes should be drawn.",
+
+ documentation = [["
+ If two vertices overlap, it may happen that when you draw an
+ edge between them, this edges would be completely inside the two
+ vertices. In this case, one could either not draw them or one
+ could draw a sort of ``inside edge''.
+ "]],
+
+ examples = { [["
+ \tikz \graph [no layout, nodes={draw, minimum size=20pt}] {
+ a [x=0, y=0] -- b [x=15pt, y=10pt] -- c[x=40pt]
+ };
+ "]],[["
+ \tikz \graph [no layout, nodes={draw, minimum size=20pt},
+ allow inside edges=false] {
+ a [x=0, y=0] -- b [x=15pt, y=10pt] -- c[x=40pt]
+ };
+ "]]
+ }
+} \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Orientation.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Orientation.lua
new file mode 100644
index 0000000000..1890fa4f39
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Orientation.lua
@@ -0,0 +1,303 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+---
+-- @section subsection {Orienting a Graph}
+--
+-- \label{subsection-library-graphdrawing-standard-orientation}
+--
+-- Just as a graph drawing algorithm cannot know \emph{where} a graph
+-- should be placed on a page, it is also often unclear which
+-- \emph{orientation} it should have. Some graphs, like trees, have a
+-- natural direction in which they ``grow'', but for an ``arbitrary''
+-- graph the ``natural orientation'' is, well, arbitrary.
+--
+-- There are two ways in which you can specify an orientation: First,
+-- you can specify that the line from a certain vertex to another
+-- vertex should have a certain slope. How these vertices and slopes
+-- are specified in explained momentarily. Second, you can specify a
+-- so-called ``growth direction'' for trees.
+--
+-- @end
+
+
+-- Namespace
+require("pgf.gd.control").Orientation = Orientation
+
+
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+---
+
+declare {
+ key = "orient",
+ type = "direction",
+ default = 0,
+
+ summary = [["
+ This key specifies that the straight line from the |orient tail| to
+ the |orient head| should be at an angle of \meta{direction} relative to
+ the right-going $x$-axis. Which vertices are used as tail an head
+ depends on where the |orient| option is encountered: When used with
+ an edge, the tail is the edge's tail and the head is the edge's
+ head. When used with a node, the tail or the head must be specified
+ explicitly and the node is used as the node missing in the
+ specification. When used with a graph as a whole, both the head and
+ tail nodes must be specified explicitly.
+ "]],
+ documentation = [["
+ Note that the \meta{direction} is independent of the actual to-path
+ of an edge, which might define a bend or more complicated shapes. For
+ instance, a \meta{angle} of |45| requests that the end node is ``up
+ and right'' relative to the start node.
+
+ You can also specify the standard direction texts |north| or |south east|
+ and so forth as \meta{direction} and also |up|, |down|, |left|, and
+ |right|. Also, you can specify |-| for ``right'' and \verb!|! for ``down''.
+ "]],
+ examples = {[["
+ \tikz \graph [spring layout]
+ {
+ a -- { b, c, d, e -- {f, g, h} };
+ h -- [orient=30] a;
+ };
+ "]],[["
+ \tikz \graph [spring layout]
+ {
+ a -- { b, c, d[> orient=right], e -- {f, g, h} };
+ h -- a;
+ };
+ "]]
+ }
+}
+
+
+---
+
+declare {
+ key = "orient'",
+ type = "direction",
+ default = 0,
+
+ summary = [["
+ Same as |orient|, only the rest of the graph should be
+ flipped relative to the connection line.
+ "]],
+ examples = [["
+ \tikz \graph [spring layout]
+ {
+ a -- { b, c, d[> orient'=right], e -- {f, g, h} };
+ h -- a;
+ };
+ "]]
+}
+
+---
+
+declare {
+ key = "orient tail",
+ type = "string",
+
+ summary = [["
+ Specifies the tail vertex for the orientation of a graph. See
+ |orient| for details.
+ "]],
+ examples = {[["
+ \tikz \graph [spring layout] {
+ a [orient=|, orient tail=f] -- { b, c, d, e -- {f, g, h} };
+ { h, g } -- a;
+ };
+ "]],[["
+ \tikz \graph [spring layout] {
+ a [orient=down, orient tail=h] -- { b, c, d, e -- {f, g, h} };
+ { h, g } -- a;
+ };
+ "]]
+ }
+}
+
+
+
+
+
+---
+
+declare {
+ key = "orient head",
+ type = "string",
+
+ summary = [["
+ Specifies the head vertex for the orientation of a graph. See
+ |orient| for details.
+ "]],
+ examples = {[["
+ \tikz \graph [spring layout]
+ {
+ a [orient=|, orient head=f] -- { b, c, d, e -- {f, g, h} };
+ { h, g } -- a;
+ };
+ "]],[["
+ \tikz \graph [spring layout] { a -- b -- c -- a };
+ \tikz \graph [spring layout, orient=10,
+ orient tail=a, orient head=b] { a -- b -- c -- a };
+ "]]
+ }
+}
+
+---
+
+declare {
+ key = "horizontal",
+ type = "string",
+
+ summary = [["
+ A shorthand for specifying |orient tail|, |orient head| and
+ |orient=0|. The tail will be everything before the part ``| to |''
+ and the head will be everything following it.
+ "]],
+ examples = [["
+ \tikz \graph [spring layout] { a -- b -- c -- a };
+ \tikz \graph [spring layout, horizontal=a to b] { a -- b -- c -- a };
+ "]]
+}
+
+
+
+
+---
+
+declare {
+ key = "horizontal'",
+ type = "string",
+
+ summary = [["
+ Like |horizontal|, but with a flip.
+ "]]
+}
+
+
+
+
+
+
+
+---
+
+declare {
+ key = "vertical",
+ type = "string",
+
+ summary = [["
+ A shorthand for specifying |orient tail|, |orient head| and |orient=-90|.
+ "]],
+ examples = [["
+ \tikz \graph [spring layout] { a -- b -- c -- a };
+ \tikz \graph [spring layout, vertical=a to b] { a -- b -- c -- a };
+ "]]
+}
+
+
+
+
+
+---
+
+declare {
+ key = "vertical'",
+ type = "string",
+
+ summary = [["
+ Like |vertical|, but with a flip.
+ "]]
+}
+
+
+
+---
+
+declare {
+ key = "grow",
+ type = "direction",
+
+ summary = [["
+ This key specifies in which direction the neighbors of a node
+ ``should grow''. For some graph drawing algorithms, especially for
+ those that layout trees, but also for those that produce layered
+ layouts, there is a natural direction in which the ``children'' of
+ a node should be placed. For instance, saying |grow=down| will cause
+ the children of a node in a tree to be placed in a left-to-right
+ line below the node (as always, you can replace the \meta{angle}
+ by direction texts). The children are requested to be placed in a
+ counter-clockwise fashion, the |grow'| key will place them in a
+ clockwise fashion.
+ "]],
+ documentation = [["
+ Note that when you say |grow=down|, it is not necessarily the case
+ that any particular node is actually directly below the current
+ node; the key just requests that the direction of growth is downward.
+
+ In principle, you can specify the direction of growth for each node
+ individually, but do not count on graph drawing algorithms to
+ honor these wishes.
+
+ When you give the |grow=right| key to the graph as a whole, it will
+ be applied to all nodes. This happens to be exactly what you want:
+ "]],
+ examples = {[["
+ \tikz \graph [layered layout, sibling distance=5mm]
+ {
+ a [grow=right] -- { b, c, d, e -- {f, g, h} };
+ { h, g } -- a;
+ };
+ "]],[["
+ \tikz \graph [layered layout, grow=right, sibling distance=5mm]
+ {
+ a -- { b, c, d, e -- {f, g, h} };
+ { h, g } -- a;
+ };
+ "]],[["
+ \tikz
+ \graph [layered layout, grow=-80]
+ {
+ {a,b,c} --[complete bipartite] {e,d,f}
+ --[complete bipartite] {g,h,i};
+ };
+ "]]
+ }
+}
+
+
+---
+
+declare {
+ key = "grow'",
+ type = "direction",
+
+ summary = "Same as |grow|, only with the children in clockwise order.",
+ examples = [["
+ \tikz \graph [layered layout, sibling distance=5mm]
+ {
+ a [grow'=right] -- { b, c, d, e -- {f, g, h} };
+ { h, g } -- a;
+ };
+ "]]
+}
+
+
+-- Done
+
+return Orientation \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Sublayouts.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Sublayouts.lua
new file mode 100644
index 0000000000..970483193f
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/Sublayouts.lua
@@ -0,0 +1,536 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+local function full_print(g, pref)
+ local s = ""
+
+ for _,v in ipairs(g.vertices) do
+ s = s .. tostring(v) .. "[" .. tostring(v.pos) .. "]\n "
+ end
+
+ s = s .. "\n"
+
+ for _,a in ipairs(g.arcs) do
+ for _,e in ipairs(a.syntactic_edges) do
+ s = s .. tostring(e) .. "(" .. tostring(e.path) .. ")\n"
+ end
+ end
+
+ pgf.debug((pref or "") .. s)
+end
+
+
+---
+-- The |Sublayouts| module handles graphs for which multiple layouts are defined.
+--
+-- Please see Section~\ref{section-gd-sublayouts} for an overview of
+-- sublayouts.
+--
+
+local Sublayouts = {}
+
+-- Namespace
+require("pgf.gd.control").Sublayouts = Sublayouts
+
+
+-- Includes
+
+local Digraph = require "pgf.gd.model.Digraph"
+local Vertex = require "pgf.gd.model.Vertex"
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Path = require "pgf.gd.model.Path"
+
+local lib = require "pgf.gd.lib"
+
+local InterfaceCore = require "pgf.gd.interface.InterfaceCore"
+
+local Storage = require "pgf.gd.lib.Storage"
+
+
+
+-- Storages
+
+local subs = Storage.newTableStorage()
+local already_nudged = Storage.new()
+local positions = Storage.newTableStorage()
+
+
+
+
+-- Offset a node by an offset. This will \emph{also} offset all
+-- subnodes, which arise from sublayouts.
+--
+-- @param vertex A vertex
+-- @param pos A offset
+--
+local function offset_vertex(v, delta)
+ v.pos:shiftByCoordinate(delta)
+ for _,sub in ipairs(subs[v]) do
+ offset_vertex(sub, delta)
+ end
+end
+
+
+-- Nudge positioning. You can call this function several times on the
+-- same graph; nudging will be done only once.
+--
+-- @param graph A graph
+--
+local function nudge(graph)
+ for _,v in ipairs(graph.vertices) do
+ local nudge = v.options['nudge']
+ if nudge and not already_nudged[v] then
+ offset_vertex(v, nudge)
+ already_nudged[v] = true
+ end
+ end
+end
+
+
+
+-- Create subgraph nodes
+--
+-- @param scope A scope
+-- @param syntactic_digraph The syntactic digraph.
+-- @param test Only for vertices whose subgraph collection passes this test will we create subgraph nodes
+local function create_subgraph_node(scope, syntactic_digraph, vertex)
+
+ local subgraph_collection = vertex.subgraph_collection
+ local binding = InterfaceCore.binding
+
+ local cloud = {}
+ -- Add all points of n's collection, except for v itself, to the cloud:
+ for _,v in ipairs(subgraph_collection.vertices) do
+ if vertex ~= v then
+ assert(syntactic_digraph:contains(v), "the layout must contain all nodes of the subgraph")
+ for _,p in ipairs(v.path) do
+ if type(p) == "table" then
+ cloud[#cloud+1] = p + v.pos
+ end
+ end
+ end
+ end
+ for _,e in ipairs(subgraph_collection.edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ cloud[#cloud+1] = p:clone()
+ end
+ end
+ end
+ local x_min, y_min, x_max, y_max, c_x, c_y = Coordinate.boundingBox(cloud)
+
+ -- Shift the graph so that it is centered on the origin:
+ for _,p in ipairs(cloud) do
+ p:unshift(c_x,c_y)
+ end
+
+ local o = vertex.subgraph_info.generated_options
+
+ o[#o+1] = { key = "subgraph point cloud", value = table.concat(lib.imap(cloud, tostring)) }
+ o[#o+1] = { key = "subgraph bounding box height", value = tostring(y_max-y_min) .. "pt" }
+ o[#o+1] = { key = "subgraph bounding box width", value = tostring(x_max-x_min) .. "pt" }
+
+ -- And now, the "grand call":
+ binding:createVertex(vertex.subgraph_info)
+
+ -- Shift it were it belongs
+ vertex.pos:shift(c_x,c_y)
+
+ -- Remember all the subnodes for nudging and regardless
+ -- positioning
+ local s = {}
+ for _,v in ipairs(subgraph_collection.vertices) do
+ if v ~= vertex then
+ s[#s+1] = v
+ end
+ end
+
+ subs[vertex] = s
+end
+
+
+-- Tests whether two graphs have a vertex in common
+local function intersection(g1, g2)
+ for _,v in ipairs(g1.vertices) do
+ if g2:contains(v) then
+ return v
+ end
+ end
+end
+
+-- Tests whether a graph is a set is a subset of another
+local function special_vertex_subset(vertices, graph)
+ for _,v in ipairs(vertices) do
+ if not graph:contains(v) and not (v.kind == "subgraph node") then
+ return false
+ end
+ end
+ return true
+end
+
+
+
+---
+-- The layout recursion. See \ref{section-gd-sublayouts} for details.
+--
+-- @param scope The graph drawing scope
+-- @param layout The to-be-laid-out collection
+-- @param fun The to-be-called function for laying out the graph.
+-- processed. This stack is important when a new syntactic vertex is
+-- added by the algorithm: In this case, this vertex is added to all
+-- layouts on this stack.
+--
+-- @return A laid out graph.
+
+function Sublayouts.layoutRecursively(scope, layout, fun)
+
+ -- Step 1: Iterate over all sublayouts of the current layout:
+ local resulting_graphs = {}
+ local loc = Storage.new()
+
+ -- Now, iterate over all sublayouts
+ for i,child in ipairs(layout:childrenOfKind(InterfaceCore.sublayout_kind)) do
+ resulting_graphs[i] = Sublayouts.layoutRecursively(scope, child, fun)
+ loc[resulting_graphs[i]] = child
+ end
+
+ -- Step 2: Run the merge process:
+ local merged_graphs = {}
+
+ while #resulting_graphs > 0 do
+
+ local n = #resulting_graphs
+
+ -- Setup marked array:
+ local marked = {}
+ for i=1,n do
+ marked[i] = false
+ end
+
+ -- Mark first graph and copy everything from there
+ marked[1] = true
+ local touched = Storage.new()
+ for _,v in ipairs(resulting_graphs[1].vertices) do
+ v.pos = positions[v][resulting_graphs[1]]
+ touched[v] = true
+ end
+
+ -- Repeatedly find a node that is connected to a marked node:
+ local i = 1
+ while i <= n do
+ if not marked[i] then
+ for j=1,n do
+ if marked[j] then
+ local v = intersection(resulting_graphs[i], resulting_graphs[j])
+ if v then
+ -- Aha, they intersect at vertex v
+
+ -- Mark the i-th graph:
+ marked[i] = true
+ connected_some_graph = true
+
+ -- Shift the i-th graph:
+ local x_offset = v.pos.x - positions[v][resulting_graphs[i]].x
+ local y_offset = v.pos.y - positions[v][resulting_graphs[i]].y
+
+ for _,u in ipairs(resulting_graphs[i].vertices) do
+ if not touched[u] then
+ touched[u] = true
+ u.pos = positions[u][resulting_graphs[i]]:clone()
+ u.pos:shift(x_offset, y_offset)
+
+ for _,a in ipairs(resulting_graphs[i]:outgoing(u)) do
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ p:shift(x_offset, y_offset)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ -- Restart
+ i = 0
+ break
+ end
+ end
+ end
+ end
+ i = i + 1
+ end
+
+ -- Now, we can collapse all marked graphs into one graph:
+ local merge = Digraph.new {}
+ merge.syntactic_digraph = merge
+ local remaining = {}
+
+ -- Add all vertices and edges:
+ for i=1,n do
+ if marked[i] then
+ merge:add (resulting_graphs[i].vertices)
+ for _,a in ipairs(resulting_graphs[i].arcs) do
+ local ma = merge:connect(a.tail,a.head)
+ for _,e in ipairs(a.syntactic_edges) do
+ ma.syntactic_edges[#ma.syntactic_edges+1] = e
+ end
+ end
+ else
+ remaining[#remaining + 1] = resulting_graphs[i]
+ end
+ end
+
+ -- Remember the first layout this came from:
+ loc[merge] = loc[resulting_graphs[1]]
+
+ -- Restart with rest:
+ merged_graphs[#merged_graphs+1] = merge
+
+ resulting_graphs = remaining
+ end
+
+ -- Step 3: Run the algorithm on the layout:
+
+ local class = layout.options.algorithm_phases.main
+ assert (type(class) == "table", "algorithm selection failed")
+
+ local algorithm = class
+ local uncollapsed_subgraph_nodes = lib.imap(
+ scope.collections[InterfaceCore.subgraph_node_kind] or {},
+ function (c)
+ if c.parent_layout == layout then
+ return c.subgraph_node
+ end
+ end)
+
+
+ -- Create a new syntactic digraph:
+ local syntactic_digraph = Digraph.new {
+ options = layout.options
+ }
+
+ syntactic_digraph.syntactic_digraph = syntactic_digraph
+
+ -- Copy all vertices and edges from the collection...
+ syntactic_digraph:add (layout.vertices)
+ for _,e in ipairs(layout.edges) do
+ syntactic_digraph:add {e.head, e.tail}
+ local arc = syntactic_digraph:connect(e.tail, e.head)
+ arc.syntactic_edges[#arc.syntactic_edges+1] = e
+ end
+
+ -- Find out which subgraph nodes can be created now and make them part of the merged graphs
+ for i=#uncollapsed_subgraph_nodes,1,-1 do
+ local v = uncollapsed_subgraph_nodes[i]
+ local vertices = v.subgraph_collection.vertices
+ -- Test, if all vertices of the subgraph are in one of the merged graphs.
+ for _,g in ipairs(merged_graphs) do
+ if special_vertex_subset(vertices, g) then
+ -- Ok, we can create a subgraph now
+ create_subgraph_node(scope, syntactic_digraph, v)
+ -- Make it part of the collapse!
+ g:add{v}
+ -- Do not consider again
+ uncollapsed_subgraph_nodes[i] = false
+ break
+ end
+ end
+ end
+
+ -- Collapse the nodes that are part of a merged_graph
+ local collapsed_vertices = {}
+ for _,g in ipairs(merged_graphs) do
+
+ local intersection = {}
+ for _,v in ipairs(g.vertices) do
+ if syntactic_digraph:contains(v) then
+ intersection[#intersection+1] = v
+ end
+ end
+ if #intersection > 0 then
+ -- Compute bounding box of g (this should actually be the convex
+ -- hull) Hmm...:
+ local array = {}
+ for _,v in ipairs(g.vertices) do
+ local min_x, min_y, max_x, max_y = v:boundingBox()
+ array[#array+1] = Coordinate.new(min_x + v.pos.x, min_y + v.pos.y)
+ array[#array+1] = Coordinate.new(max_x + v.pos.x, max_y + v.pos.y)
+ end
+ for _,a in ipairs(g.arcs) do
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ array[#array+1] = p
+ end
+ end
+ end
+ end
+ local x_min, y_min, x_max, y_max, c_x, c_y = Coordinate.boundingBox(array)
+
+ -- Shift the graph so that it is centered on the origin:
+ for _,v in ipairs(g.vertices) do
+ v.pos:unshift(c_x,c_y)
+ end
+ for _,a in ipairs(g.arcs) do
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ p:unshift(c_x,c_y)
+ end
+ end
+ end
+ end
+
+ x_min = x_min - c_x
+ x_max = x_max - c_x
+ y_min = y_min - c_y
+ y_max = y_max - c_y
+
+ local index = loc[g].event.index
+
+ local v = Vertex.new {
+ -- Standard stuff
+ shape = "none",
+ kind = "node",
+ path = Path.new {
+ "moveto",
+ x_min, y_min,
+ x_min, y_max,
+ x_max, y_max,
+ x_max, y_min,
+ "closepath"
+ },
+ options = {},
+ event = scope.events[index]
+ }
+
+ -- Update node_event
+ scope.events[index].parameters = v
+
+ local collapse_vertex = syntactic_digraph:collapse(
+ intersection,
+ v,
+ nil,
+ function (new_arc, arc)
+ for _,e in ipairs(arc.syntactic_edges) do
+ new_arc.syntactic_edges[#new_arc.syntactic_edges+1] = e
+ end
+ end)
+
+ syntactic_digraph:remove(intersection)
+ collapsed_vertices[#collapsed_vertices+1] = collapse_vertex
+ end
+ end
+
+ -- Sort the vertices
+ table.sort(syntactic_digraph.vertices, function(u,v) return u.event.index < v.event.index end)
+
+ -- Should we "hide" the subgraph nodes?
+ local hidden_node
+ if not algorithm.include_subgraph_nodes then
+ local subgraph_nodes = lib.imap (syntactic_digraph.vertices,
+ function (v) if v.kind == "subgraph node" then return v end end)
+
+ if #subgraph_nodes > 0 then
+ hidden_node = Vertex.new {}
+ syntactic_digraph:collapse(subgraph_nodes, hidden_node)
+ syntactic_digraph:remove (subgraph_nodes)
+ syntactic_digraph:remove {hidden_node}
+ end
+ end
+
+ -- Now, we want to call the actual algorithm. This call may modify
+ -- the layout's vertices and edges fields, namely when new vertices
+ -- and edges are created. We then need to add these to our local
+ -- syntactic digraph. So, we remember the length of these fields
+ -- prior to the call and then add everything ``behind'' these
+ -- positions later on.
+
+ -- Ok, everything setup! Run the algorithm...
+ fun(scope, algorithm, syntactic_digraph, layout)
+
+ if hidden_node then
+ syntactic_digraph:expand(hidden_node)
+ end
+
+ -- Now, we need to expand the collapsed vertices once more:
+ for i=#collapsed_vertices,1,-1 do
+ syntactic_digraph:expand(
+ collapsed_vertices[i],
+ function (c, v)
+ v.pos:shiftByCoordinate(c.pos)
+ end,
+ function (a, v)
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ p:shiftByCoordinate(v.pos)
+ end
+ end
+ end
+ end
+ )
+ for _,a in ipairs(syntactic_digraph:outgoing(collapsed_vertices[i])) do
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ p:shiftByCoordinate(a.tail.pos)
+ p:unshiftByCoordinate(e.tail.pos)
+ end
+ end
+ end
+ end
+ end
+ syntactic_digraph:remove(collapsed_vertices)
+
+ -- Step 4: Create the layout node if necessary
+ for i=#uncollapsed_subgraph_nodes,1,-1 do
+ if uncollapsed_subgraph_nodes[i] then
+ create_subgraph_node(scope, syntactic_digraph, uncollapsed_subgraph_nodes[i])
+ end
+ end
+
+ -- Now seems like a good time to nudge and do regardless positioning
+ nudge(syntactic_digraph)
+
+ -- Step 5: Cleanup
+ -- Push the computed position into the storage:
+ for _,v in ipairs(syntactic_digraph.vertices) do
+ positions[v][syntactic_digraph] = v.pos:clone()
+ end
+
+ return syntactic_digraph
+end
+
+
+
+
+
+---
+-- Regardless positioning.
+--
+-- @param graph A graph
+--
+function Sublayouts.regardless(graph)
+ for _,v in ipairs(graph.vertices) do
+ local regardless = v.options['regardless at']
+ if regardless then
+ offset_vertex(v, regardless - v.pos)
+ end
+ end
+end
+
+
+
+-- Done
+
+return Sublayouts
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/doc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/doc.lua
new file mode 100644
index 0000000000..c7adfab830
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/doc.lua
@@ -0,0 +1,231 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "desired at"
+
+summary
+[[
+When you add this key to a node in a graph, you ``desire''
+that the node should be placed at the \meta{coordinate} by the graph
+drawing algorithm.
+]]
+
+documentation
+[[
+Now, when you set this key for a single node of a graph,
+then, by shifting the graph around, this ``wish'' can obviously
+always be fulfill:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [spring layout]
+ {
+ a [desired at={(1,2)}] -- b -- c -- a;
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [spring layout]
+ {
+ a -- b[desired at={(2,1)}] -- c -- a;
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+Since the key's name is a bit long and since the many braces and
+parentheses are a bit cumbersome, there is a special support for
+this key inside a |graph|: The standard |/tikz/at| key is redefined
+inside a |graph| so that it points to |/graph drawing/desired at|
+instead. (Which is more logical anyway, since it makes no sense to
+specify an |at| position for a node whose position it to be computed
+by a graph drawing algorithm.) A nice side effect of this is that
+you can use the |x| and |y| keys (see
+Section~\ref{section-graphs-xy}) to specify desired positions:
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [spring layout]
+ {
+ a -- b[x=2,y=0] -- c -- a;
+ };
+\end{tikzpicture}
+\end{codeexample}
+%
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [layered layout]
+ {
+ a [x=1,y=2] -- { b, c } -- {e, f} -- a
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+A problem arises when two or more nodes have this key set, because
+then your ``desires'' for placement and the positions computed by
+the graph drawing algorithm may clash. Graph drawing algorithms are
+``told'' about the desired positions. Most algorithms will simply
+ignore these desired positions since they will be taken care of in
+the so-called post-anchoring phase, see below. However, for some
+algorithms it makes a lot of sense to fix the positions of some
+nodes and only compute the positions of the other nodes relative
+to these nodes. For instance, for a |spring layout| it makes perfect
+sense that some nodes are ``nailed to the canvas'' while other
+nodes can ``move freely''.
+]]
+
+example
+[[
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [spring layout]
+ {
+ a[x=1] -- { b, c, d, e -- {f,g,h} };
+ { h, g } -- a;
+ };
+\end{tikzpicture}
+]]
+
+example
+[[
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [spring layout]
+ {
+ a -- { b, c, d[x=0], e -- {f[x=2], g, h[x=1]} };
+ { h, g } -- a;
+ };
+\end{tikzpicture}
+]]
+
+example
+[[
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \graph [spring layout]
+ {
+ a -- { b, c, d[x=0], e -- {f[x=2,y=1], g, h[x=1]} };
+ { h, g } -- a;
+ };
+\end{tikzpicture}
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "anchor node"
+
+summary
+[[
+This option can be used with a graph to specify a node that
+should be used for anchoring the whole graph.
+]]
+
+documentation
+[[
+When this option is specified, after the layout has been computed, the
+whole graph will be shifted in such a way that the \meta{node name} is
+either
+%
+\begin{itemize}
+ \item at the current value of |anchor at| or
+ \item at the position that is specified in the form of a
+ |desired at| for the \meta{node name}.
+\end{itemize}
+%
+Note how in the last example |c| is placed at |(1,1)| rather than
+|b| as would happen by default.
+]]
+
+example
+[[
+\tikz \draw (0,0)
+ -- (1,0.5) graph [edges=red, layered layout, anchor node=a] { a -> {b,c} }
+ -- (1.5,0) graph [edges=blue, layered layout,
+ anchor node=y, anchor at={(2,0)}] { x -> {y,z} };
+]]
+
+example
+[[
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+
+ \graph [layered layout, anchor node=c, edges=rounded corners]
+ { a -- {b [x=1,y=1], c [x=1,y=1] } -- d -- a};
+\end{tikzpicture}
+]]
+--------------------------------------------------------------------
+
+
+
+
+--------------------------------------------------------------------
+key "anchor at"
+
+summary
+[[
+The coordinate at which the graph should be anchored when no
+explicit anchor is given for any node. The initial value is the origin.
+]]
+
+example
+[[
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (2,2);
+
+ \graph [layered layout, edges=rounded corners, anchor at={(1,2)}]
+ { a -- {b, c [anchor here] } -- d -- a};
+\end{tikzpicture}
+]]
+--------------------------------------------------------------------
+
+
+
+
+--------------------------------------------------------------------
+key "anchor here"
+
+summary
+[[
+This option can be passed to a single node (rather than the
+graph as a whole) in order to specify that this node should be used
+for the anchoring process.
+]]
+
+documentation
+[[
+In the example, |c| is placed at the origin since this is the
+default |anchor at| position.
+]]
+
+example
+[[
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (2,2);
+
+ \graph [layered layout, edges=rounded corners]
+ { a -- {b, c [anchor here] } -- d -- a};
+\end{tikzpicture}
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/library.lua
new file mode 100644
index 0000000000..df7ce68dd9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/control/library.lua
@@ -0,0 +1,196 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Load declarations from:
+
+require "pgf.gd.control.FineTune"
+require "pgf.gd.control.Anchoring"
+require "pgf.gd.control.Sublayouts"
+require "pgf.gd.control.Orientation"
+require "pgf.gd.control.Distances"
+require "pgf.gd.control.Components"
+require "pgf.gd.control.ComponentAlign"
+require "pgf.gd.control.ComponentDirection"
+require "pgf.gd.control.ComponentDistance"
+require "pgf.gd.control.ComponentOrder"
+require "pgf.gd.control.NodeAnchors"
+
+
+local InterfaceCore = require "pgf.gd.interface.InterfaceCore"
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local lib = require "pgf.gd.lib"
+
+
+
+---
+
+declare {
+ key = "nodes behind edges",
+ type = "boolean",
+
+ summary = "Specifies, that nodes should be drawn behind the edges",
+ documentation = [["
+ Once a graph drawing algorithm has determined positions for the nodes,
+ they are drawn \emph{before} the edges are drawn; after
+ all, it is hard to draw an edge between nodes when their positions
+ are not yet known. However, we typically want the nodes to be
+ rendered \emph{after} or rather \emph{on top} of the edges. For
+ this reason, the default behavior is that the nodes at their
+ final positions are collected in a box that is inserted into the
+ output stream only after the edges have been drawn -- which has
+ the effect that the nodes will be placed ``on top'' of the
+ edges.
+
+ This behavior can be changed using this option. When the key is
+ invoked, nodes are placed \emph{behind} the edges.
+ "]],
+ examples = [["
+ \tikz \graph [simple necklace layout, nodes={draw,fill=white},
+ nodes behind edges]
+ { subgraph K_n [n=7], 1 [regardless at={(0,-1)}] };
+ "]]
+}
+
+
+---
+
+declare {
+ key = "edges behind nodes",
+ use = {
+ { key = "nodes behind edges", value = "false" },
+ },
+
+ summary = [["
+ This is the default placement of edges: Behind the nodes.
+ "]],
+ examples = [["
+ \tikz \graph [simple necklace layout, nodes={draw,fill=white},
+ edges behind nodes]
+ { subgraph K_n [n=7], 1 [regardless at={(0,-1)}] };
+ "]]
+}
+
+---
+declare {
+ key = "random seed",
+ type = "number",
+ initial = "42",
+
+ summary = [["
+ To ensure that the same is always shown in the same way when the
+ same algorithm is applied, the random is seed is reset on each call
+ of the graph drawing engine. To (possibly) get different results on
+ different runs, change this value.
+ "]]
+}
+
+
+---
+declare {
+ key = "variation",
+ type = "number",
+ use = {
+ { key = "random seed", value = lib.id },
+ },
+ summary = "An alias for |random seed|."
+}
+
+
+---
+declare {
+ key = "weight",
+ type = "number",
+ initial = 1,
+
+ summary = [["
+ Sets the ``weight'' of an edge or a node. For many algorithms, this
+ number tells the algorithm how ``important'' the edge or node is.
+ For instance, in a |layered layout|, an edge with a large |weight|
+ will be as short as possible.
+ "]],
+ examples = {[["
+ \tikz \graph [layered layout] {
+ a -- {b,c,d} -- e -- a;
+ };
+ "]],[["
+ \tikz \graph [layered layout] {
+ a -- {b,c,d} -- e --[weight=3] a;
+ };
+ "]]
+ }
+}
+
+
+
+---
+declare {
+ key = "length",
+ type = "length",
+ initial = 1,
+
+ summary = [["
+ Sets the ``length'' of an edge. Algorithms may take this value
+ into account when drawing a graph.
+ "]],
+ examples = {[["
+ \tikz \graph [phylogenetic tree layout] {
+ a --[length=2] b --[length=1] {c,d};
+ a --[length=3] e
+ };
+ "]],
+ }
+}
+
+
+---
+
+declare {
+ key = "radius",
+ type = "number",
+ initial = "0",
+
+ summary = [["
+ The radius of a circular object used in graph drawing.
+ "]]
+}
+
+---
+
+declare {
+ key = "no layout",
+ algorithm = {
+ run =
+ function (self)
+ for _,v in ipairs(self.digraph.vertices) do
+ if v.options['desired at'] then
+ v.pos.x = v.options['desired at'].x
+ v.pos.y = v.options['desired at'].y
+ end
+ end
+ end },
+ summary = "This layout does nothing.",
+}
+
+
+
+-- The following collection kinds are internal
+
+declare {
+ key = InterfaceCore.sublayout_kind,
+ layer = 0
+}
+
+declare {
+ key = InterfaceCore.subgraph_node_kind,
+ layer = 0
+}
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Cluster.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Cluster.lua
new file mode 100644
index 0000000000..d7baed45da
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Cluster.lua
@@ -0,0 +1,65 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- The Cluster class defines a model of a cluster inside a graph.
+--
+--
+
+local Cluster = {}
+Cluster.__index = Cluster
+
+
+-- Namespace
+
+
+
+--- TODO Jannis: Add documentation for this class.
+--
+function Cluster.new(name)
+ local cluster = {
+ name = name,
+ nodes = {},
+ contains_node = {},
+ }
+ setmetatable(cluster, Cluster)
+ return cluster
+end
+
+
+
+function Cluster:getName()
+ return self.name
+end
+
+
+
+function Cluster:addNode(node)
+ if not self:findNode(node) then
+ self.contains_node[node] = true
+ self.nodes[#self.nodes + 1] = node
+ end
+end
+
+
+
+function Cluster:findNode(node)
+ return self.contains_node[node]
+end
+
+
+
+
+-- Done
+
+return Cluster \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Edge.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Edge.lua
new file mode 100644
index 0000000000..7355597955
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Edge.lua
@@ -0,0 +1,358 @@
+-- Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+--- The Edge class
+--
+--
+
+local Edge = {}
+Edge.__index = Edge
+
+
+-- Namespace
+
+local lib = require "pgf.gd.lib"
+
+
+-- Definitions
+
+Edge.UNDIRECTED = "--"
+Edge.LEFT = "<-"
+Edge.RIGHT = "->"
+Edge.BOTH = "<->"
+Edge.NONE = "-!-"
+
+
+--- Creates an edge between nodes of a graph.
+--
+-- @param values Values to override default edge settings.
+-- The following parameters can be set:\par
+-- |nodes|: TODO \par
+-- |edge_nodes|: TODO \par
+-- |options|: TODO \par
+-- |tikz_options|: TODO \par
+-- |direction|: TODO \par
+-- |bend_points|: TODO \par
+-- |bend_nodes|: TODO \par
+-- |reversed|: TODO \par
+--
+-- @return A newly-allocated edge.
+--
+function Edge.new(values)
+ local defaults = {
+ nodes = {},
+ edge_nodes = '',
+ options = {},
+ tikz_options = {},
+ direction = Edge.DIRECTED,
+ bend_points = {},
+ bend_nodes = {},
+ reversed = false,
+ algorithmically_generated_options = {},
+ index = nil,
+ event_index = nil,
+ }
+ setmetatable(defaults, Edge)
+ if values then
+ for k,v in pairs(values) do
+ defaults[k] = v
+ end
+ end
+ return defaults
+end
+
+
+
+--- Sets the edge option \meta{name} to \meta{value}.
+--
+-- @param name Name of the option to be changed.
+-- @param value New value for the edge option \meta{name}.
+--
+function Edge:setOption(name, value)
+ self.options[name] = value
+end
+
+
+
+--- Returns the value of the edge option \meta{name}.
+--
+-- @param name Name of the option.
+-- @param graph If this optional argument is given,
+-- in case the option is not set as a node parameter,
+-- we try to look it up as a graph parameter.
+--
+-- @return The value of the edge option \meta{name} or |nil|.
+--
+function Edge:getOption(name, graph)
+ return lib.lookup_option(name, self, graph)
+end
+
+
+
+--- Checks whether or not the edge is a loop edge.
+--
+-- An edge is a loop if it one node multiple times and no other node.
+--
+-- @return |true| if the edge is a loop, |false| otherwise.
+--
+function Edge:isLoop()
+ local nodes = self.nodes
+ for i=1,#nodes do
+ if nodes[i] ~= nodes[1] then
+ return false
+ end
+ end
+ return true
+end
+
+
+
+--- Returns whether or not the edge is a hyperedge.
+--
+-- A hyperedge is an edge with more than two adjacent nodes.
+--
+-- @return |true| if the edge is a hyperedge. |false| otherwise.
+--
+function Edge:isHyperedge()
+ return self:getDegree() > 2
+end
+
+
+
+--- Returns all nodes of the edge.
+--
+-- Instead of calling |edge:getNodes()| the nodes can alternatively be
+-- accessed directly with |edge.nodes|.
+--
+-- @return All edges of the node.
+--
+function Edge:getNodes()
+ return self.nodes
+end
+
+
+
+--- Returns whether or not a node is adjacent to the edge.
+--
+-- @param node The node to check.
+--
+-- @return |true| if the node is adjacent to the edge. |false| otherwise.
+--
+function Edge:containsNode(node)
+ return lib.find(self.nodes, function (other) return other == node end) ~= nil
+end
+
+
+
+--- If possible, adds a node to the edge.
+--
+-- @param node The node to be added to the edge.
+--
+function Edge:addNode(node)
+ table.insert(self.nodes, node)
+ node:addEdge(self)
+end
+
+
+
+--- Gets first neighbor of the node (disregarding hyperedges).
+--
+-- @param node The node which first neighbor should be returned.
+--
+-- @return The first neighbor of the node.
+--
+function Edge:getNeighbour(node)
+ if node == self.nodes[1] then
+ return self.nodes[#self.nodes]
+ else
+ return self.nodes[1]
+ end
+end
+
+
+
+--- Counts the nodes on this edge.
+--
+-- @return The number of nodes on the edge.
+--
+function Edge:getDegree()
+ return #self.nodes
+end
+
+
+
+function Edge:getHead()
+ -- by default, the head of -> edges is the last node and the head
+ -- of <- edges is the first node
+ local head_index = (self.direction == Edge.LEFT) and 1 or #self.nodes
+
+ -- if the edge should be assumed reversed, we simply switch head and
+ -- tail positions
+ if self.reversed then
+ head_index = (head_index == 1) and #self.nodes or 1
+ end
+
+ return self.nodes[head_index]
+end
+
+
+
+function Edge:getTail()
+ -- by default, the tail of -> edges is the first node and the tail
+ -- of <- edges is the last node
+ local tail_index = (self.direction == Edge.LEFT) and #self.nodes or 1
+
+ -- if the edge should be assumed reversed, we simply switch head
+ -- and tail positions
+ if self.reversed then
+ tail_index = (tail_index == 1) and #self.nodes or 1
+ end
+
+ return self.nodes[tail_index]
+end
+
+
+
+--- Checks whether a node is the head of the edge. Does not work for hyperedges.
+--
+-- This method only works for edges with two adjacent nodes.
+--
+-- Edges may be reversed internally, so their head and tail might be switched.
+-- Whether or not this internal reversal is handled by this method
+-- can be specified with the optional second \meta{ignore\_reversed} parameter
+-- which is |false| by default.
+--
+-- @param node The node to check.
+--
+-- @return True if the node is the head of the edge.
+--
+function Edge:isHead(node)
+ local result = false
+
+ -- by default, the head of -> edges is the last node and the head
+ -- of <- edges is the first node
+ local head_index = (self.direction == Edge.LEFT) and 1 or #self.nodes
+
+ -- if the edge should be assumed reversed, we simply switch head and
+ -- tail positions
+ if self.reversed then
+ head_index = (head_index == 1) and #self.nodes or 1
+ end
+
+ -- check if the head node equals the input node
+ if self.nodes[head_index].name == node.name then
+ result = true
+ end
+
+ return result
+end
+
+
+
+--- Checks whether a node is the tail of the edge. Does not work for hyperedges.
+--
+-- This method only works for edges with two adjacent nodes.
+--
+-- Edges may be reversed internally, so their head and tail might be switched.
+-- Whether or not this internal reversal is handled by this method
+-- can be specified with the optional second \meta{ignore\_reversed} parameter
+-- which is |false| by default.
+--
+-- @param node The node to check.
+-- @param ignore_reversed Optional parameter. Set this to true if reversed edges
+-- should not be considered reversed for this method call.
+--
+-- @return True if the node is the tail of the edge.
+--
+function Edge:isTail(node, ignore_reversed)
+ local result = false
+
+ -- by default, the tail of -> edges is the first node and the tail
+ -- of <- edges is the last node
+ local tail_index = (self.direction == Edge.LEFT) and #self.nodes or 1
+
+ -- if the edge should be assumed reversed, we simply switch head
+ -- and tail positions
+ if self.reversed then
+ tail_index = (tail_index == 1) and #self.nodes or 1
+ end
+
+ -- check if the tail node equals the input node
+ if self.nodes[tail_index].name == node.name then
+ result = true
+ end
+
+ return result
+end
+
+
+
+--- Copies an edge (preventing accidental use).
+--
+-- The nodes of the edge are not preserved and have to be added
+-- to the copy manually if necessary.
+--
+-- @return Shallow copy of the edge.
+--
+function Edge:copy()
+ local result = lib.copy(self, Edge.new())
+ result.nodes = {}
+ return result
+ end
+
+
+
+
+local function reverse_values(source)
+ local copy = {}
+ for i = 1,#source do
+ copy[i] = source[#source-i+1]
+ end
+ return copy
+end
+
+
+--- Returns a readable string representation of the edge.
+--
+-- @ignore This should not appear in the documentation.
+--
+-- @return String representation of the edge.
+--
+function Edge:__tostring()
+ local result = "Edge(" .. self.direction .. ", reversed = " .. tostring(self.reversed) .. ", "
+ if #self.nodes > 0 then
+ local node_strings = lib.imap(self.nodes, function (node) return node.name end)
+ result = result .. table.concat(node_strings, ', ')
+ end
+ --return result .. ")"
+
+ -- Note: the following lines generate a shorter string representation
+ -- of the edge that is more readable and can be used for debugging.
+ -- So please don't remove this:
+ --
+ local node_strings = lib.imap(self.nodes, function (node) return node.name end)
+ if self.reversed then
+ return table.concat(reverse_values(node_strings), ' ' .. self.direction .. ' ')
+ else
+ return table.concat(node_strings, ' ' .. self.direction .. ' ')
+ end
+end
+
+
+
+-- Done
+
+return Edge \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Graph.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Graph.lua
new file mode 100644
index 0000000000..161b89fd15
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Graph.lua
@@ -0,0 +1,396 @@
+-- Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+--- The Graph class
+--
+--
+
+local Graph = {}
+Graph.__index = Graph
+
+
+-- Namespace
+
+-- Imports
+local Edge = require "pgf.gd.deprecated.Edge"
+
+local lib = require "pgf.gd.lib"
+
+
+--- Creates a new graph.
+--
+-- @param values Values to override default graph settings.
+-- The following parameters can be set:\par
+-- |nodes|: The nodes of the graph.\par
+-- |edges|: The edges of the graph.\par
+-- |clusters|: The node clusters of the graph.\par
+-- |options|: A table of node options passed over from \tikzname.
+-- |events|: A sequence of events signaled during the graph specification.
+--
+-- @return A newly-allocated graph.
+--
+function Graph.new(values)
+ local defaults = {
+ nodes = {},
+ edges = {},
+ clusters = {},
+ options = {},
+ events = {},
+ }
+ setmetatable(defaults, Graph)
+ if values then
+ for k,v in pairs(values) do
+ defaults[k] = v
+ end
+ end
+ return defaults
+end
+
+
+
+--- Prepares a graph for an algorithm.
+--
+-- This method causes self, all its nodes, and all its edges to get
+-- a new empty table for the key algorithm. This allows an algorithm to
+-- store stuff with nodes and edges without them interfering with information
+-- stored by other algorithms.
+--
+-- @param An algorithm object.
+
+function Graph:registerAlgorithm(algorithm)
+ self[algorithm] = self[algorithm] or {}
+
+ -- Add an algorithm field to all nodes, all edges, and the graph:
+ for _,n in pairs(self.nodes) do
+ n[algorithm] = n[algorithm] or {}
+ end
+ for _,e in pairs(self.edges) do
+ e[algorithm] = e[algorithm] or {}
+ end
+end
+
+
+--- Sets the graph option \meta{name} to \meta{value}.
+--
+-- @param name Name of the option to be changed.
+-- @param value New value for the graph option \meta{name}.
+--
+function Graph:setOption(name, value)
+ self.options[name] = value
+end
+
+
+
+--- Returns the value of the graph option \meta{name}.
+--
+-- @param name Name of the option.
+--
+-- @return The value of the graph option \meta{name} or |nil|.
+--
+function Graph:getOption(name)
+ return self.options[name]
+end
+
+
+
+
+--- Creates a shallow copy of a graph.
+--
+-- The nodes and edges of the original graph are not preserved in the copy.
+--
+-- @return A shallow copy of the graph.
+--
+function Graph:copy ()
+ return Graph.new({options = self.options, events = self.events})
+end
+
+
+--- Adds a node to the graph.
+--
+-- @param node The node to be added.
+--
+function Graph:addNode(node)
+ -- only add the node if it's not included in the graph yet
+ if not self:findNode(node.name) then
+ -- Does the node have an index, yet?
+ if not node.index then
+ node.index = #self.nodes + 1
+ end
+
+ table.insert(self.nodes, node)
+ end
+end
+
+
+
+--- If possible, removes a node from the graph and returns it.
+--
+-- @param node The node to remove.
+--
+-- @return The removed node or |nil| if it was not found in the graph.
+--
+function Graph:removeNode(node)
+ local _, index = lib.find(self.nodes, function (other)
+ return other.name == node.name
+ end)
+ if index then
+ table.remove(self.nodes, index)
+ return node
+ else
+ return nil
+ end
+end
+
+
+
+--- If possible, looks up the node with the given name in the graph.
+--
+-- @param name Name of the node to look up.
+--
+-- @return The node with the given name or |nil| if it was not found in the graph.
+--
+function Graph:findNode(name)
+ return self:findNodeIf(function (node) return node.name == name end)
+end
+
+
+
+--- Looks up the first node for which the function \meta{test} returns |true|.
+--
+-- @param test A function that takes one parameter (a |Node|) and returns
+-- |true| or |false|.
+--
+-- @return The first node for which \meta{test} returns |true|.
+--
+function Graph:findNodeIf(test)
+ return lib.find(self.nodes, test)
+end
+
+
+
+--- Like removeNode, but also deletes all adjacent edges of the removed node.
+--
+-- This function also removes the deleted adjacent edges from all neighbors
+-- of the removed node.
+--
+-- @param node The node to be deleted together with its adjacent edges.
+--
+-- @return The removed node or |nil| if the node was not found in the graph.
+--
+function Graph:deleteNode(node)
+ local node = self:removeNode(node)
+ if node then
+ for _,edge in ipairs(node.edges) do
+ self:removeEdge(edge)
+ for _,other_node in ipairs(edge.nodes) do
+ if other_node.name ~= node.name then
+ other_node:removeEdge(edge)
+ end
+ end
+ end
+ node.edges = {}
+ end
+ return node
+end
+
+
+
+-- Checks whether the edge already exists in the graph and returns it if possible.
+--
+-- @param edge Edge to search for.
+--
+-- @return The edge if it was found in the graph, |nil| otherwise.
+--
+function Graph:findEdge(edge)
+ return lib.find(self.edges, function (other) return other == edge end)
+end
+
+
+
+--- Adds an edge to the graph.
+--
+-- @param edge The edge to be added.
+--
+function Graph:addEdge(edge)
+ if not edge.index then
+ edge.index = #self.edges + 1
+ end
+
+ table.insert(self.edges, edge)
+end
+
+
+
+--- If possible, removes an edge from the graph and returns it.
+--
+-- @param edge The edge to be removed.
+--
+-- @return The removed edge or |nil| if it was not found in the graph.
+--
+function Graph:removeEdge(edge)
+ local _, index = lib.find(self.edges, function (other) return other == edge end)
+ if index then
+ table.remove(self.edges, index)
+ return edge
+ else
+ return nil
+ end
+end
+
+
+
+--- Like removeEdge, but also removes the edge from its adjacent nodes.
+--
+-- @param edge The edge to be deleted.
+--
+-- @return The removed edge or |nil| if it was not found in the graph.
+--
+function Graph:deleteEdge(edge)
+ local edge = self:removeEdge(edge)
+ if edge then
+ for _,node in ipairs(edge.nodes) do
+ node:removeEdge(edge)
+ end
+ end
+ return edge
+end
+
+
+
+--- Removes an edge between two nodes and also removes it from these nodes.
+--
+-- @param from Start node of the edge.
+-- @param to End node of the edge.
+--
+-- @return The deleted edge.
+--
+function Graph:deleteEdgeBetweenNodes(from, to)
+ -- try to find the edge
+ local edge = lib.find(self.edges, function (edge)
+ return edge.nodes[1] == from and edge.nodes[2] == to
+ end)
+
+ -- delete and return the edge
+ if edge then
+ return self:deleteEdge(edge)
+ else
+ return nil
+ end
+end
+
+
+
+--- Creates and adds a new edge to the graph.
+--
+-- @param first_node The first node of the new edge.
+-- @param second_node The second node of the new edge.
+-- @param direction The direction of the new edge. Possible values are
+-- \begin{itemize}
+-- \item |Edge.UNDIRECTED|,
+-- \item |Edge.LEFT|,
+-- \item |Edge.RIGHT|,
+-- \item |Edge.BOTH| and
+-- \item |Edge.NONE| (for invisible edges).
+-- \end{itemize}
+-- @param edge_nodes A string of \tikzname\ edge nodes that needs to be passed
+-- back to the \TeX layer unmodified.
+-- @param options The options of the new edge.
+-- @param tikz_options A table of \tikzname\ options to be used by graph drawing
+-- algorithms to treat the edge in special ways.
+--
+-- @return The newly created edge.
+--
+function Graph:createEdge(first_node, second_node, direction, edge_nodes, options, tikz_options)
+ local edge = Edge.new{
+ direction = direction,
+ edge_nodes = edge_nodes,
+ options = options,
+ tikz_options = tikz_options
+ }
+ edge:addNode(first_node)
+ edge:addNode(second_node)
+ self:addEdge(edge)
+ return edge
+end
+
+
+
+--- Returns the cluster with the given name or |nil| if no such cluster exists.
+--
+-- @param name Name of the node cluster to look up.
+--
+-- @return The cluster with the given name or |nil| if no such cluster is defined.
+--
+function Graph:findClusterByName(name)
+ return lib.find(self.clusters, function (cluster)
+ return cluster.name == name
+ end)
+end
+
+
+
+--- Tries to add a cluster to the graph. Returns whether or not this was successful.
+--
+-- Clusters are supposed to have unique names. This function will add the given
+-- cluster only if there is no cluster with this name already. It returns |true|
+-- if the cluster was added and |false| otherwise.
+--
+-- @param cluster Cluster to add to the graph.
+--
+-- @return |true| if the cluster was added successfully, |false| otherwise.
+--
+function Graph:addCluster(cluster)
+ if not self:findClusterByName(cluster.name) then
+ table.insert(self.clusters, cluster)
+ end
+end
+
+
+
+
+
+--- Returns a string representation of this graph including all nodes and edges.
+--
+-- @ignore This should not appear in the documentation.
+--
+-- @return Graph as string.
+--
+function Graph:__tostring()
+ local tmp = Graph.__tostring
+ Graph.__tostring = nil
+ local result = "Graph<" .. tostring(self) .. ">(("
+ Graph.__tostring = tmp
+
+ local first = true
+ for _,node in ipairs(self.nodes) do
+ if first then first = false else result = result .. ", " end
+ result = result .. tostring(node)
+ end
+ result = result .. "), ("
+ first = true
+ for _,edge in ipairs(self.edges) do
+ if first then first = false else result = result .. ", " end
+ result = result .. tostring(edge)
+ end
+
+ return result .. "))"
+end
+
+
+
+-- Done
+
+return Graph
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Iterators.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Iterators.lua
new file mode 100644
index 0000000000..903291a892
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Iterators.lua
@@ -0,0 +1,91 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- The Iterators class is a singleton object.
+--
+-- It provides advanced iterators.
+
+local Iterators = {}
+
+-- Namespace
+
+local lib = require("pgf.gd.lib")
+
+
+
+--- Iterator for traversing a \meta{dag} using a topological sorting.
+--
+-- A topological sorting of a directed graph is a linear ordering of its
+-- nodes such that, for every edge |(u,v)|, |u| comes before |v|.
+--
+-- Important note: if performed on a graph with at least one cycle a
+-- topological sorting is impossible. Thus, the nodes returned from the
+-- iterator are not guaranteed to satisfy the ``|u| comes before |v|''
+-- criterion. The iterator may even terminate early or loop forever.
+--
+-- @param graph A directed acyclic graph.
+--
+-- @return An iterator for traversing \meta{graph} in a topological order.
+--
+function Iterators.topologicallySorted(dag)
+ -- track visited edges
+ local deleted_edges = {}
+
+ -- collect all sources (nodes with no incoming edges) of the dag
+ local sources = lib.imap(dag.nodes, function (node) if node:getInDegree() == 0 then return node end end)
+
+ -- return the iterator function
+ return function ()
+ while #sources > 0 do
+ -- fetch the next sink from the queue
+ local source = table.remove(sources, 1)
+
+ -- get its outgoing edges
+ local out_edges = source:getOutgoingEdges()
+
+ -- iterate over all outgoing edges we haven't visited yet
+ for _,edge in ipairs(out_edges) do
+ if not deleted_edges[edge] then
+ -- mark the edge as visited
+ deleted_edges[edge] = true
+
+ -- get the node at the other end of the edge
+ local neighbour = edge:getNeighbour(source)
+
+ -- get a list of all incoming edges of the neighbor that have
+ -- not been visited yet
+ local in_edges = lib.imap(neighbour:getIncomingEdges(),
+ function (edge) if not deleted_edges[edge] then return edge end end)
+
+ -- if there are no such edges then we have a new source
+ if #in_edges == 0 then
+ sources[#sources+1] = neighbour
+ end
+ end
+ end
+
+ -- return the current source
+ return source
+ end
+
+ -- the iterator terminates if there are no sources left
+ return nil
+ end
+end
+
+
+
+-- Done
+
+return Iterators
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Node.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Node.lua
new file mode 100644
index 0000000000..379a65fafd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Node.lua
@@ -0,0 +1,280 @@
+-- Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- The Node class
+--
+--
+
+local Node = {}
+Node.__index = Node
+
+
+-- Namespace
+
+local lib = require "pgf.gd.lib"
+
+
+-- Imports
+
+local Vector = require "pgf.gd.deprecated.Vector"
+
+
+
+--- Creates a new node.
+--
+-- @param values Values to override default node settings.
+-- The following parameters can be set:\par
+-- |name|: The name of the node. It is obligatory to define this.\par
+-- |tex|: Information about the corresponding \TeX\ node.\par
+-- |edges|: Edges adjacent to the node.\par
+-- |pos|: Initial position of the node.\par
+-- |options|: A table of node options passed over from \tikzname.
+--
+-- @return A newly allocated node.
+--
+function Node.new(values)
+ local new = {
+ class = Node,
+ name = nil,
+ tex = {
+ -- texNode = nil,
+ -- maxX = nil,
+ -- minX = nil,
+ -- maxY = nil,
+ -- minY = nil
+ },
+ edges = {},
+ -- pos = nil,
+ options = {},
+ -- growth_direction = nil,
+ -- index = nil,
+ -- event_index = nil,
+ kind = "node",
+ }
+ setmetatable(new, Node)
+ if values then
+ for k,v in pairs(values) do
+ new [k] = v
+ end
+ end
+ if not new.pos then
+ new.pos = Vector.new(2)
+ end
+ return new
+end
+
+
+
+--- Sets the node option \meta{name} to \meta{value}.
+--
+-- @param name Name of the node option to be changed.
+-- @param value New value for the node option \meta{name}.
+--
+function Node:setOption(name, value)
+ self.options[name] = value
+end
+
+
+
+--- Returns the value of the node option \meta{name}.
+--
+-- @param name Name of the node option.
+-- @param graph If this optional argument is given,
+-- in case the option is not set as a node parameter,
+-- we try to look it up as a graph parameter.
+--
+-- @return The value of the node option \meta{name} or |nil|.
+--
+function Node:getOption(name, graph)
+ return lib.lookup_option(name, self, graph)
+end
+
+
+
+--- Computes the width of the node.
+--
+-- @return Width of the node.
+--
+function Node:getTexWidth()
+ return math.abs(self.tex.maxX - self.tex.minX)
+end
+
+
+
+--- Computes the height of the node.
+--
+-- @return Height of the node.
+--
+function Node:getTexHeight()
+ return math.abs(self.tex.maxY - self.tex.minY)
+end
+
+
+
+--- Adds new edge to the node.
+--
+-- @param edge The edge to be added.
+--
+function Node:addEdge(edge)
+ table.insert(self.edges, edge)
+end
+
+
+
+--- Removes an edge from the node.
+--
+-- @param edge The edge to remove.
+--
+function Node:removeEdge(edge)
+ self.edges = lib.imap (self.edges, function(other) if other ~= edge then return other end end)
+end
+
+
+
+--- Counts the adjacent edges of the node.
+--
+-- @return The number of adjacent edges of the node.
+--
+function Node:getDegree()
+ return #self.edges
+end
+
+
+
+--- Returns all edges of the node.
+--
+-- Instead of calling |node:getEdges()| the edges can alternatively be
+-- accessed directly with |node.edges|.
+--
+-- @return All edges of the node.
+--
+function Node:getEdges()
+ return self.edges
+end
+
+
+
+--- Returns the incoming edges of the node. Undefined result for hyperedges.
+--
+-- @param ignore_reversed Optional parameter to consider reversed edges not
+-- reversed for this method call. Defaults to |false|.
+--
+-- @return Incoming edges of the node. This includes undirected edges
+-- and directed edges pointing to the node.
+--
+function Node:getIncomingEdges(ignore_reversed)
+ return lib.imap(self.edges,
+ function (edge)
+ if edge:isHead(self, ignore_reversed) then return edge end
+ end)
+end
+
+
+
+--- Returns the outgoing edges of the node. Undefined result for hyperedges.
+--
+-- @param ignore_reversed Optional parameter to consider reversed edges not
+-- reversed for this method call. Defaults to |false|.
+--
+-- @return Outgoing edges of the node. This includes undirected edges
+-- and directed edges leaving the node.
+--
+function Node:getOutgoingEdges(ignore_reversed)
+ return lib.imap(self.edges,
+ function (edge)
+ if edge:isTail(self, ignore_reversed) then return edge end
+ end)
+end
+
+
+
+--- Returns the number of incoming edges of the node.
+--
+-- @see Node:getIncomingEdges(reversed)
+--
+-- @param ignore_reversed Optional parameter to consider reversed edges not
+-- reversed for this method call. Defaults to |false|.
+--
+-- @return The number of incoming edges of the node.
+--
+function Node:getInDegree(ignore_reversed)
+ return #self:getIncomingEdges(ignore_reversed)
+end
+
+
+
+--- Returns the number of edges starting at the node.
+--
+-- @see Node:getOutgoingEdges()
+--
+-- @param ignore_reversed Optional parameter to consider reversed edges not
+-- reversed for this method call. Defaults to |false|.
+--
+-- @return The number of outgoing edges of the node.
+--
+function Node:getOutDegree(ignore_reversed)
+ return #self:getOutgoingEdges(ignore_reversed)
+end
+
+
+
+--- Creates a shallow copy of the node.
+--
+-- Most notably, the edges adjacent are not preserved in the copy.
+--
+-- @return Copy of the node.
+--
+function Node:copy()
+ local result = lib.copy(self, Node.new())
+ result.edges = {}
+ return result
+end
+
+
+
+--- Compares two nodes by their name.
+--
+-- @ignore This should not appear in the documentation.
+--
+-- @param other Another node to compare with.
+--
+-- @return |true| if both nodes have the same name. |false| otherwise.
+--
+function Node:__eq(object)
+ return self.name == object.name
+end
+
+
+
+--- Returns a formated string representation of the node.
+--
+-- @ignore This should not appear in the documentation.
+--
+-- @return String representation of the node.
+--
+function Node:__tostring()
+ local tmp = Node.__tostring
+ Node.__tostring = nil
+ local result = "Node<" .. tostring(self) .. ">(" .. self.name .. ")"
+ Node.__tostring = tmp
+ return result
+end
+
+
+
+
+-- Done
+
+return Node
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Vector.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Vector.lua
new file mode 100644
index 0000000000..8af7378154
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/deprecated/Vector.lua
@@ -0,0 +1,256 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+--- Vector class
+--
+-- This class augments a normal array so that:
+--
+-- 1) Several functions like "plus" or "normalize" become available.
+-- 2) You can access the ".x" and ".y" fields to get the fields [1] and [2].
+
+local Vector = {}
+
+
+-- Namespace:
+local lib = require "pgf.gd.lib"
+lib.Vector = Vector
+
+
+-- Class setup
+Vector.__index =
+ function (t, k)
+ if k == "x" then
+ return rawget(t,1)
+ elseif k == "y" then
+ return rawget(t,2)
+ else
+ return rawget(Vector,k)
+ end
+ end
+Vector.__newindex =
+ function (t, k, v)
+ if k == "x" then
+ rawset(t,1,v)
+ elseif k == "y" then
+ rawset(t,2,v)
+ else
+ rawset(t,k,v)
+ end
+ end
+
+
+
+--- Creates a new vector with \meta{n} values using an optional \meta{fill\_function}.
+--
+-- @param n The number of elements of the vector. (If omitted, then 2.)
+-- @param fill_function Optional function that takes a number between 1 and \meta{n}
+-- and is expected to return a value for the corresponding element
+-- of the vector. If omitted, all elements of the vector will
+-- be initialized with 0.
+--
+-- @return A newly-allocated vector with \meta{n} elements.
+--
+function Vector.new(n, fill_function)
+ -- create vector
+ local vector = { }
+ setmetatable(vector, Vector)
+
+ local n = n or 2
+
+ if type(n) == 'table' then
+ for k,v in pairs(n) do
+ vector[k] = v
+ end
+ else
+ -- fill vector elements with values
+ if not fill_function then
+ for i = 1,n do
+ rawset(vector,i,0)
+ end
+ else
+ for i = 1,n do
+ rawset(vector,i,fill_function(i))
+ end
+ end
+ end
+
+ return vector
+end
+
+
+
+--- Creates a copy of the vector that holds the same elements as the original.
+--
+-- @return A newly-allocated copy of the vector holding exactly the same elements.
+--
+function Vector:copy()
+ return Vector.new(#self, function (n) return self[n] end)
+end
+
+
+
+--- Performs a vector addition and returns the result in a new vector.
+--
+-- @param other The vector to add.
+--
+-- @return A new vector with the result of the addition.
+--
+function Vector:plus(other)
+ assert(#self == #other)
+
+ return Vector.new(#self, function (n) return self[n] + other[n] end)
+end
+
+
+
+--- Subtracts two vectors and returns the result in a new vector.
+--
+-- @param other Vector to subtract.
+--
+-- @return A new vector with the result of the subtraction.
+--
+function Vector:minus(other)
+ assert(#self == #other)
+
+ return Vector.new(#self, function (n) return self[n] - other[n] end)
+end
+
+
+
+--- Divides a vector by a scalar value and returns the result in a new vector.
+--
+-- @param scalar Scalar value to divide the vector by.
+--
+-- @return A new vector with the result of the division.
+--
+function Vector:dividedByScalar(scalar)
+ return Vector.new(#self, function (n) return self[n] / scalar end)
+end
+
+
+
+--- Multiplies a vector by a scalar value and returns the result in a new vector.
+--
+-- @param scalar Scalar value to multiply the vector with.
+--
+-- @return A new vector with the result of the multiplication.
+--
+function Vector:timesScalar(scalar)
+ return Vector.new(#self, function (n) return self[n] * scalar end)
+end
+
+
+
+--- Performs the dot product of two vectors and returns the result in a new vector.
+--
+-- @param other Vector to perform the dot product with.
+--
+-- @return A new vector with the result of the dot product.
+--
+function Vector:dotProduct(other)
+ assert(#self == #other)
+
+ local product = 0
+ for n = 1,#self do
+ product = product + self[n] * other[n]
+ end
+ return product
+end
+
+
+
+--- Computes the Euclidean norm of the vector.
+--
+-- @return The Euclidean norm of the vector.
+--
+function Vector:norm()
+ return math.sqrt(self:dotProduct(self))
+end
+
+
+
+--- Normalizes the vector and returns the result in a new vector.
+--
+-- @return Normalized version of the original vector.
+--
+function Vector:normalized()
+ local norm = self:norm()
+ if norm == 0 then
+ return Vector.new(#self)
+ else
+ return self:dividedByScalar(self:norm())
+ end
+end
+
+
+
+--- Updates the values of the vector in-place.
+--
+-- @param update_function A function that is called for each element of the
+-- vector. The elements are replaced by the values
+-- returned from this function.
+--
+function Vector:update(update_function)
+ for i=1,#self do
+ self[i] = update_function(self[i])
+ end
+end
+
+
+
+--- Limits all elements of the vector in-place.
+--
+-- @param limit_function A function that is called for each index/element
+-- pair. It is supposed to return minimum and maximum
+-- values for the element. The element is then clamped
+-- to these values.
+--
+function Vector:limit(limit_function)
+ for i=1,#self do
+ local min, max = limit_function(i, self[i])
+ self[i] = math.max(min, math.min(max, value))
+ end
+end
+
+
+--- Tests whether all elements of two vectors are the same
+--
+-- @param other The other vector
+--
+-- @return true or false
+--
+function Vector:equals(other)
+ if #self ~= #other then
+ return false
+ end
+
+ for n = 1, #self do
+ if self[n] ~= other[n] then
+ return false
+ end
+ end
+
+ return true
+end
+
+
+function Vector:__tostring()
+ return '(' .. table.concat(self, ', ') .. ')'
+end
+
+
+
+
+
+-- Done
+
+return Vector
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc.lua
new file mode 100644
index 0000000000..78b68bbcb1
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc.lua
@@ -0,0 +1,124 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- The table doc is used for documentation purposes. It is used to
+-- provide lazy documentation for keys, that is, to install
+-- documentation for keys only when this information is requested and
+-- when the documentation is kept in a separate file.
+--
+-- Using the doc facility is easy:
+-- %
+-- \begin{enumerate}
+-- \item In the |declare| statement of the key, you do not provide
+-- fields like |documentation| or |summary|. Rather, you provide the
+-- field |documentation_in|, which gets the name of a Lua file the
+-- will be read whenever one of the fields |documentation|, |summary|,
+-- or |examples| is requested for the key.
+-- \item When the key is requested, |require| will be applied to the
+-- filename given in the |documentation_in| field.
+-- \item In this file, you start with the following code:
+-- %
+--\begin{codeexample}[code only]
+--local doc = require 'pgf.gd.doc'
+--local key = doc.key
+--local documentation = doc.documentation
+--local summary = doc.summary
+--local example = doc.example
+--\end{codeexample}
+-- %
+-- This will setup nice shortcuts for the commands you are going to
+-- use in your file.
+-- \item Next, for each to-be-lazily-documented key, add a block to
+-- the file like the following:
+-- %
+--\begin{codeexample}[code only]
+-- ---
+-- key "my radius"
+-- summary "This key specifies a radius."
+-- documentation
+-- [[
+-- This key is used, whenever...
+-- ]]
+-- example "\tikz \graph [foo layout, my radius=5] { a--b };"
+-- example "\tikz \graph [foo layout, my radius=3] { c--d };"
+--\end{codeexample}
+--
+-- Note that |[[| and |]]| are used in Lua for raw multi-line strings.
+--
+-- The effect of the above code will be that for the key |my radius|
+-- the different field like |summary| or |documentation| get
+-- updated. The |key| function simple ``selects'' a key and subsequent
+-- commands like |summary| will update this key until a different key
+-- is selected through another use of |key|.
+-- \end{enumerate}
+
+local doc = {}
+
+local current_key
+
+
+-- Namespace
+require "pgf.gd".doc = doc
+
+
+-- Imports
+local keys = require "pgf.gd.interface.InterfaceCore".keys
+
+---
+-- Selects the key which will be subsequently updated by the other
+-- functions of this class.
+--
+-- @param key A key.
+
+function doc.key (key)
+ current_key = assert(keys[key], "trying to document not-yet-declared key")
+end
+
+
+---
+-- Updates (replaces) the summary field of the last key selected
+-- through the |key| command.
+--
+-- @param string A (new) summary string.
+
+function doc.summary (string)
+ current_key.summary = string
+end
+
+
+---
+-- Updates (replaces) the documentation field of the last key selected
+-- through the |key| command.
+--
+-- @param string A (new) documentation string. Typically, the |[[|
+-- syntax will be used to specify this string.
+
+function doc.documentation (string)
+ current_key.documentation = string
+end
+
+
+---
+-- Adds an example to the |examples| field of the last key selected
+-- through the |key| command.
+--
+-- @param string An additional example string.
+
+function doc.example (string)
+ local examples = rawget(current_key, "examples") or {}
+ examples[#examples + 1] = string
+ current_key.examples = examples
+end
+
+
+return doc
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased.lua
new file mode 100644
index 0000000000..552dd00dc8
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased.lua
@@ -0,0 +1,19 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Force-Based Algorithms}
+--
+--
+
+local _ \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua
new file mode 100644
index 0000000000..b7bab37819
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua
@@ -0,0 +1,129 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "FMMMLayout"
+summary "The fast multipole multilevel layout algorithm."
+
+documentation
+[[
+|FMMMLayout| implements a force-directed graph drawing
+method suited also for very large graphs. It is based on a
+combination of an efficient multilevel scheme and a strategy for
+approximating the repulsive forces in the system by rapidly
+evaluating potential fields.
+
+The implementation is based on the following publication:
+%
+\begin{itemize}
+ \item Stefan Hachul, Michael J\"unger: Drawing Large Graphs with
+ a Potential-Field-Based Multilevel Algorithm. \emph{12th
+ International Symposium on Graph Drawing 1998 (GD '04)},
+ New York, LNCS 3383, pp. 285--295, 2004.
+\end{itemize}
+]]
+
+example
+[[
+\tikz \graph [FMMMLayout] { a -- {b,c,d} -- e -- a };
+]]
+
+
+example
+[[
+\tikz [nodes={text height=.7em, text depth=.2em,
+ draw=black!20, thick, fill=white, font=\footnotesize},
+ >=spaced stealth', rounded corners, semithick]
+ \graph [FMMMLayout, node sep=1mm, variation=2] {
+ "5th Edition" -> { "6th Edition", "PWB 1.0" };
+ "6th Edition" -> { "LSX", "1 BSD", "Mini Unix", "Wollongong", "Interdata" };
+ "Interdata" ->[orient=down] "Unix/TS 3.0",
+ "Interdata" -> { "PWB 2.0", "7th Edition" };
+ "7th Edition" -> { "8th Edition", "32V", "V7M", "Ultrix-11", "Xenix", "UniPlus+" };
+ "V7M" -> "Ultrix-11";
+ "8th Edition" -> "9th Edition";
+ "1 BSD" -> "2 BSD" -> "2.8 BSD" -> { "Ultrix-11", "2.9 BSD" };
+ "32V" -> "3 BSD" -> "4 BSD" -> "4.1 BSD" -> { "4.2 BSD", "2.8 BSD", "8th Edition" };
+ "4.2 BSD" -> { "4.3 BSD", "Ultrix-32" };
+ "PWB 1.0" -> { "PWB 1.2" -> "PWB 2.0", "USG 1.0" -> { "CB Unix 1", "USG 2.0" }};
+ "CB Unix 1" -> "CB Unix 2" -> "CB Unix 3" -> { "Unix/TS++", "PDP-11 Sys V" };
+ { "USG 2.0" -> "USG 3.0", "PWB 2.0", "Unix/TS 1.0" } -> "Unix/TS 3.0";
+ { "Unix/TS++", "CB Unix 3", "Unix/TS 3.0" } ->
+ "TS 4.0" -> "System V.0" -> "System V.2" -> "System V.3";
+ };
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "FMMMLayout.randSeed"
+summary "Sets the random seed for the |FMMMLayout|."
+documentation
+[[
+By changing this number, you can vary the appearance of the generated
+graph drawing. This key is an alias for |random seed|, which in turn
+can be set by using the |variation| key.
+]]
+
+example
+[[
+\tikz \graph [FMMMLayout, variation=1] { a -- {b,c,d} -- e -- a };
+]]
+example
+[[
+\tikz \graph [FMMMLayout, variation=2] { a -- {b,c,d} -- e -- a };
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "FMMMLayout.unitEdgeLength"
+summary "The ``ideal'' padding between two nodes."
+
+documentation
+[[
+The algorithm will try to make the padding between any two vertices
+this distance. Naturally, this is not always possible, so, normally,
+distance will actually be different. This key is an alias for the more
+natural |node sep|.
+]]
+
+example
+[[
+\tikz {
+ \graph [FMMMLayout, node sep=1cm] { subgraph C_n[n=6]; };
+
+ \draw [red, ultra thick, |-|] (1.south) -- ++(down:1cm);
+}
+]]
+example
+[[
+\tikz {
+ \graph [FMMMLayout, node sep=5mm] { subgraph C_n[n=6]; };
+
+ \draw [red, ultra thick, |-|] (1.south) -- ++(down:5mm);
+}
+]]
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End: \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua
new file mode 100644
index 0000000000..453078b130
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua
@@ -0,0 +1,51 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "FastMultipoleEmbedder"
+summary "Implementation of a fast multipole embedder by Martin Gronemann."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "FastMultipoleEmbedder.numIterations"
+summary "sets the maximum number of iterations"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "FastMultipoleEmbedder.multipolePrec"
+summary "sets the number of coefficients for the expansions. default = 4"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "FastMultipoleEmbedder.defaultEdgeLength"
+summary ""
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "FastMultipoleEmbedder.defaultNodeSize"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/GEMLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/GEMLayout.lua
new file mode 100644
index 0000000000..d0b94c2bb7
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/GEMLayout.lua
@@ -0,0 +1,103 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout"
+summary "The energy-based GEM layout algorithm."
+
+documentation [[
+ The implementation used in |GEMLayout| is based on the following publication:
+ %
+ \begin{itemize}
+ \item Arne Frick, Andreas Ludwig, Heiko Mehldau: \emph{A Fast Adaptive Layout
+ Algorithm for Undirected Graphs.} Proc. Graph Drawing 1994,
+ LNCS 894, pp. 388-403, 1995.
+ \end{itemize}
+]]
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.numberOfRounds"
+summary "Sets the maximal number of round per node."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.minimalTemperature"
+summary "Sets the minimal temperature."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.initialTemperature"
+summary "Sets the initial temperature; must be $\\ge$ |minimalTemperature|."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.gravitationalConstant"
+summary "Sets the gravitational constant; must be $\\ge 0$."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.desiredLength"
+summary "Sets the desired edge length; must be $\\ge 0$."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.maximalDisturbance"
+summary "Sets the maximal disturbance; must be $\\ge 0$."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.rotationAngle"
+summary "Sets the opening angle for rotations ($0 \\le x \\le \\pi / 2$)."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.oscillationAngle"
+summary "Sets the opening angle for oscillations ($0 \\le x \\le \\pi / 2$)."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.rotationSensitivity"
+summary "Sets the rotation sensitivity ($0 \\le x \\le 1$)."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.oscillationSensitivity"
+summary "Sets the oscillation sensitivity ($0 \\le x \\le 1$)."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "GEMLayout.attractionFormula"
+summary "sets the formula for attraction (1 = Fruchterman / Reingold, 2 = GEM)."
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua
new file mode 100644
index 0000000000..6210c93941
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "MultilevelLayout"
+summary "A wrapper for the multilevel layout computation using the modular multi-level mixer."
+
+example [[
+\tikz \graph [MultilevelLayout] {
+ a -- b -- c -- a -- d -- e -- f -- a
+};
+]]
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua
new file mode 100644
index 0000000000..ae3cf9c8ef
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua
@@ -0,0 +1,53 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFR"
+summary "The spring-embedder layout algorithm by Fruchterman and Reingold."
+
+documentation [[
+ The implementation used in SpringEmbedderFR is based on the following
+ publication:
+
+ Thomas M. J. Fruchterman, Edward M. Reingold: \emph{Graph Drawing by Force-directed
+ Placement}. Software - Practice and Experience 21(11), pp. 1129--1164, 1991.
+]]
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFR.iterations"
+summary "Sets the number of iterations."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFR.noise"
+summary "Sets the parameter noise."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFR.scaleFunctionFactor"
+summary "Sets the scale function factor."
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua
new file mode 100644
index 0000000000..6286e9f395
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua
@@ -0,0 +1,57 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFRExact"
+summary "Declaration of Spring-Embedder (Fruchterman,Reingold) algorithm with exact force computations."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFRExact.iterations"
+summary "Sets the number of iterations."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFRExact.noise"
+summary "Sets the parameter noise."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFRExact.coolingFunction"
+summary "Sets the parameter coolingFunction to |factor| or to |logarithmic|."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFRExact.idealEdgeLength"
+summary "Sets the ideal edge length to a length."
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderFRExact.convTolerance"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua
new file mode 100644
index 0000000000..a4fd46aa77
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua
@@ -0,0 +1,62 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderKK"
+summary "The spring embedder of Kamada and Kawai"
+
+documentation [[
+ The implementation used in |SpringEmbedderKK| is based on
+ the following publication:
+
+ Tomihisa Kamada, Satoru Kawai: \emph{An Algorithm for Drawing
+ General Undirected Graphs.} Information Processing Letters 31, pp. 7--15, 1989.
+
+ There are some parameters that can be tuned to optimize the
+ algorithm's behavior regarding runtime and layout quality.
+ First of all note that the algorithm uses all pairs shortest path
+ to compute the graph theoretic distance. This can be done either
+ with BFS (ignoring node sizes) in quadratic time or by using
+ e.g. Floyd's algorithm in cubic time with given edge lengths
+ that may reflect the node sizes. Also |m_computeMaxIt| decides
+ if the computation is stopped after a fixed maximum number of
+ iterations. The desirable edge length can either be set or computed
+ from the graph and the given layout.
+]]
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderKK.stopTolerance"
+summary "Sets the value for the stop tolerance."
+documentation [[
+ Below this value, the system is regarded stable (balanced) and the
+ optimization stopped.
+]]
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SpringEmbedderKK.desLength"
+summary "Sets desirable edge length directly"
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua
new file mode 100644
index 0000000000..e658a896bd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "BarycenterPlacer"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "BarycenterPlacer.weightedPositionPriority"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua
new file mode 100644
index 0000000000..e6f06add57
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua
@@ -0,0 +1,45 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "CirclePlacer"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "CirclePlacer.circleSize"
+summary ""
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "CirclePlacer.radiusFixed"
+summary ""
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "CirclePlacer.nodeSelection"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua
new file mode 100644
index 0000000000..e8723272ee
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "EdgeCoverMerger"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "EdgeCoverMerger.factor"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua
new file mode 100644
index 0000000000..81e2f37db0
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "IndependentSetMerger"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "IndependentSetMerger.searchDepthBase"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua
new file mode 100644
index 0000000000..7fbca25e81
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "LocalBiconnectedMerger"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "LocalBiconnectedMerger.factor"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua
new file mode 100644
index 0000000000..e966b49056
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "MatchingMerger"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "MatchingMerger.selectByNodeMass"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua
new file mode 100644
index 0000000000..0b9d967db9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua
@@ -0,0 +1,27 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "MedianPlacer"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua
new file mode 100644
index 0000000000..71bdbc7340
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "RandomMerger"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "RandomMerger.factor"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua
new file mode 100644
index 0000000000..c26946d4e1
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "RandomPlacer"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "RandomPlacer.circleSize"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua
new file mode 100644
index 0000000000..76b084fa67
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua
@@ -0,0 +1,39 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "SolarMerger"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SolarMerger.simple"
+summary ""
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "SolarMerger.massAsNodeRadius"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua
new file mode 100644
index 0000000000..530ddbc0d8
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua
@@ -0,0 +1,27 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "SolarPlacer"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua
new file mode 100644
index 0000000000..6f579d0a45
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua
@@ -0,0 +1,33 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "ZeroPlacer"
+summary "?"
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "ZeroPlacer.randomRange"
+summary ""
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End:
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered.lua
new file mode 100644
index 0000000000..ffd3ea844d
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered.lua
@@ -0,0 +1,19 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Algorithms for Drawing Layered Graphs}
+--
+--
+
+local _ \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/BarycenterHeuristic.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/BarycenterHeuristic.lua
new file mode 100644
index 0000000000..5e4138eece
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/BarycenterHeuristic.lua
@@ -0,0 +1,23 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+
+--------------------------------------------------------------------
+key "BarycenterHeuristic"
+summary "The barycenter heuristic for 2-layer crossing minimization."
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua
new file mode 100644
index 0000000000..fd13e9bd4b
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua
@@ -0,0 +1,35 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "CoffmanGrahamRanking"
+summary "The ranking algorithm due to Coffman and Graham."
+documentation
+[[
+|CoffmanGrahamRanking| implements a node ranking algorithm based on
+the Coffman--Graham scheduling algorithm, which can be used as first
+phase in |SugiyamaLayout|. The aim of the algorithm is to ensure that
+the height of the ranking (the number of layers) is kept small.
+]]
+--------------------------------------------------------------------
+
+
+--------------------------------------------------------------------
+key "CoffmanGrahamRanking.width"
+summary "A mysterious width parameter..."
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/DfsAcyclicSubgraph.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/DfsAcyclicSubgraph.lua
new file mode 100644
index 0000000000..eced60b2ed
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/DfsAcyclicSubgraph.lua
@@ -0,0 +1,27 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+
+--------------------------------------------------------------------
+key "DfsAcyclicSubgraph"
+summary "DFS-based algorithm for computing a maximal acyclic subgraph."
+documentation
+[[
+The algorithm simply removes all DFS-backedges and works in linear-time.
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua
new file mode 100644
index 0000000000..a7baad7e10
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua
@@ -0,0 +1,99 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "FastHierarchyLayout"
+summary "Coordinate assignment phase for the Sugiyama algorithm by Buchheim et al."
+documentation
+[[
+This class implements a hierarchy layout algorithm, that is, it
+layouts hierarchies with a given order of nodes on each
+layer. It is used as a third phase of the Sugiyama algorithm.
+
+All edges of the layout will have at most two
+bends. Additionally, for each edge having exactly two bends, the
+segment between them is drawn vertically. This applies in
+particular to the long edges arising in the first phase of the
+Sugiyama algorithm.
+
+The implementation is based on:
+%
+\begin{itemize}
+ \item
+ Christoph Buchheim, Michael Jünger, Sebastian Leipert: A Fast
+ Layout Algorithm for k-Level Graphs. \emph{Proc. Graph
+ Drawing 2000}, volume 1984 of LNCS, pages 229--240, 2001.
+\end{itemize}
+]]
+
+example
+[[
+\tikz \graph [SugiyamaLayout, FastHierarchyLayout] {
+ a -- {b,c,d} -- e -- a;
+};
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "FastHierarchyLayout.fixedLayerDistance"
+summary "If true, the distance between neighbored layers is fixed, otherwise variable."
+--------------------------------------------------------------------
+
+
+
+
+--------------------------------------------------------------------
+key "FastHierarchyLayout.layerDistance"
+summary "Separation distance (padding) between two consecutive layers."
+
+documentation
+[[
+Sets the (minimum?) padding between nodes on two consecutive
+layers. It defaults to the sum of the keys
+|level pre sep| and |level post sep|.
+]]
+
+example
+[[
+\tikz \graph [SugiyamaLayout, FastHierarchyLayout,
+ level sep=1cm] {
+ a -- {b,c,d} -- e -- a;
+};
+]]
+--------------------------------------------------------------------
+
+--------------------------------------------------------------------
+key "FastHierarchyLayout.nodeDistance"
+summary "Separation distance (padding) between two consecutive nodes on the same layer."
+
+documentation
+[[
+Sets the (minimum?) padding between sibling nodes. It defaults to the
+sum of the keys |sibling pre sep| and |sibling post sep|.
+]]
+
+example
+[[
+\tikz \graph [SugiyamaLayout, FastHierarchyLayout,
+ sibling sep=5mm] {
+ a -- {b,c,d} -- e -- a;
+};
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua
new file mode 100644
index 0000000000..4af6daa620
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua
@@ -0,0 +1,99 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "FastSimpleHierarchyLayout"
+summary "Coordinate assignment phase for the Sugiyama algorithm by Ulrik Brandes and Boris Köpf."
+
+documentation
+[[
+This class implements a hierarchy layout algorithm, that is, it
+layouts hierarchies with a given order of nodes on each
+layer. It is used as a third phase of the Sugiyama algorithm.
+
+The algorithm runs in three phases:
+%
+\begin{enumerate}
+ \item Alignment (4x)
+ \item Horizontal Compactation (4x)
+ \item Balancing
+\end{enumerate}
+%
+The alignment and horizontal compactification phases are calculated
+downward, upward, left-to-right and right-to-left. The four
+resulting layouts are combined in a balancing step.
+
+Warning: The implementation is known to not always produce a
+correct layout. Therefore this Algorithm is for testing purpose
+only.
+
+The implementation is based on:
+%
+\begin{itemize}
+ \item
+ Ulrik Brandes, Boris Köpf: Fast and Simple Horizontal
+ Coordinate Assignment. \emph{LNCS} 2002, Volume 2265/2002,
+ pp. 33--36
+\end{itemize}
+]]
+
+example
+[[
+\tikz \graph [SugiyamaLayout, FastSimpleHierarchyLayout] {
+ a -- {b,c,d} -- e -- a;
+};
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "FastSimpleHierarchyLayout.layerDistance"
+summary "Distance between the centers of nodes of two consecutive layers."
+
+documentation
+[[
+Sets the (minimum?) distance between nodes on two consecutive
+layers. It defaults to the key |level distance|.
+]]
+example
+[[
+\tikz \graph [SugiyamaLayout, FastSimpleHierarchyLayout,
+ level distance=2cm] {
+ a -- {b,c,d} -- e -- a;
+};
+]]
+--------------------------------------------------------------------
+
+--------------------------------------------------------------------
+key "FastSimpleHierarchyLayout.siblingDistance"
+summary "Distance between the centers of nodes of sibling nodes."
+
+documentation
+[[
+Sets the (minimum?) padding between sibling nodes. It defaults to
+|sibling distance|.
+]]
+example
+[[
+\tikz \graph [SugiyamaLayout, FastSimpleHierarchyLayout,
+ sibling distance=5mm] {
+ a -- {b,c,d} -- e -- a;
+};
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua
new file mode 100644
index 0000000000..d2f1d8eeea
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua
@@ -0,0 +1,27 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "GreedyCycleRemoval"
+summary "Greedy algorithm for computing a maximal acyclic subgraph."
+documentation
+[[
+ The algorithm applies a greedy heuristic to compute a maximal
+ acyclic subgraph and works in linear-time.
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyInsertHeuristic.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyInsertHeuristic.lua
new file mode 100644
index 0000000000..a8cd94ef19
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/GreedyInsertHeuristic.lua
@@ -0,0 +1,23 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+
+--------------------------------------------------------------------
+key "GreedyInsertHeuristic"
+summary "The greedy-insert heuristic for 2-layer crossing minimization."
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua
new file mode 100644
index 0000000000..3d98fbe9c6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua
@@ -0,0 +1,57 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "LongestPathRanking"
+summary "The longest-path ranking algorithm."
+documentation
+[[
+ |LongestPathRanking| implements the well-known longest-path ranking
+ algorithm, which can be used as first phase in |SugiyamaLayout|. The
+ implementation contains a special optimization for reducing edge
+ lengths, as well as special treatment of mixed-upward graphs (for
+ instance, \textsc{uml} class diagrams).
+]]
+--------------------------------------------------------------------
+
+
+--------------------------------------------------------------------
+key "LongestPathRanking.separateDeg0Layer"
+summary "If set to true, isolated nodes are placed on a separate layer."
+--------------------------------------------------------------------
+
+
+--------------------------------------------------------------------
+key "LongestPathRanking.separateMultiEdges"
+summary "If set to true, multi-edges will span at least two layers."
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "LongestPathRanking.optimizeEdgeLength"
+summary
+[[
+ If set to true the ranking algorithm tries to reduce edge
+ length even if this might increase the height of the layout. Choose
+ false, if the longest-path ranking known from the literature should be
+ used.
+]]
+--------------------------------------------------------------------
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/MedianHeuristic.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/MedianHeuristic.lua
new file mode 100644
index 0000000000..b37480ac78
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/MedianHeuristic.lua
@@ -0,0 +1,24 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+
+--------------------------------------------------------------------
+key "MedianHeuristic"
+summary "The median heuristic for 2-layer crossing minimization."
+--------------------------------------------------------------------
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/OptimalRanking.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/OptimalRanking.lua
new file mode 100644
index 0000000000..25a8dd5262
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/OptimalRanking.lua
@@ -0,0 +1,35 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "OptimalRanking"
+summary "The optimal ranking algorithm."
+documentation
+[[
+ The |OptimalRanking| implements the LP-based algorithm for
+ computing a node ranking with minimal edge lengths, which can
+ be used as first phase in |SugiyamaLayout|.
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "OptimalRanking.separateMultiEdges"
+summary "If set to true, multi-edges will span at least two layers."
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua
new file mode 100644
index 0000000000..d0815a5b76
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua
@@ -0,0 +1,34 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+
+--------------------------------------------------------------------
+key "SiftingHeuristic"
+summary "The sifting heuristic for 2-layer crossing minimization."
+--------------------------------------------------------------------
+
+
+--------------------------------------------------------------------
+key "SiftingHeuristic.strategy"
+summary "Sets a so-called ``sifting strategy''."
+documentation
+[[
+ The following values are permissible: |left_to_right|, |desc_degree|,
+ and |random|.
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SplitHeuristic.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SplitHeuristic.lua
new file mode 100644
index 0000000000..1579c7153d
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SplitHeuristic.lua
@@ -0,0 +1,24 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+
+--------------------------------------------------------------------
+key "SplitHeuristic"
+summary "The split heuristic for 2-layer crossing minimization."
+--------------------------------------------------------------------
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua
new file mode 100644
index 0000000000..ab9d9ee77f
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua
@@ -0,0 +1,113 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "SugiyamaLayout"
+summary "The OGDF implementation of the Sugiyama algorithm."
+
+documentation [[
+ This layout represents a customizable implementation of Sugiyama's
+ layout algorithm. The implementation used in |SugiyamaLayout| is based
+ on the following publications:
+
+ \begin{itemize}
+ \item Emden R. Gansner, Eleftherios Koutsofios, Stephen
+ C. North, Kiem-Phong Vo: A technique for drawing directed
+ graphs. \emph{IEEE Trans. Software Eng.} 19(3):214--230, 1993.
+ \item Georg Sander: \emph{Layout of compound directed graphs.}
+ Technical Report, Universität des Saarlandes, 1996.
+ \end{itemize}
+]]
+
+example
+[[
+\tikz \graph [SugiyamaLayout] { a -- {b,c,d} -- e -- a };
+]]
+
+example
+[[
+\tikz \graph [SugiyamaLayout, grow=right] {
+ a -- {b,c,d} -- e -- a
+};
+]]
+
+example
+[[
+\tikz [nodes={text height=.7em, text depth=.2em,
+ draw=black!20, thick, fill=white, font=\footnotesize},
+ >=spaced stealth', rounded corners, semithick]
+ \graph [SugiyamaLayout, FastSimpleHierarchyLayout, grow=-80,
+ level distance=1.5cm, sibling distance=7mm] {
+ "5th Edition" -> { "6th Edition", "PWB 1.0" };
+ "6th Edition" -> { "LSX", "1 BSD", "Mini Unix", "Wollongong", "Interdata" };
+ "Interdata" -> { "Unix/TS 3.0", "PWB 2.0", "7th Edition" };
+ "7th Edition" -> { "8th Edition", "32V", "V7M", "Ultrix-11", "Xenix", "UniPlus+" };
+ "V7M" -> "Ultrix-11";
+ "8th Edition" -> "9th Edition";
+ "1 BSD" -> "2 BSD" -> "2.8 BSD" -> { "Ultrix-11", "2.9 BSD" };
+ "32V" -> "3 BSD" -> "4 BSD" -> "4.1 BSD" -> { "4.2 BSD", "2.8 BSD", "8th Edition" };
+ "4.2 BSD" -> { "4.3 BSD", "Ultrix-32" };
+ "PWB 1.0" -> { "PWB 1.2" -> "PWB 2.0", "USG 1.0" -> { "CB Unix 1", "USG 2.0" }};
+ "CB Unix 1" -> "CB Unix 2" -> "CB Unix 3" -> { "Unix/TS++", "PDP-11 Sys V" };
+ { "USG 2.0" -> "USG 3.0", "PWB 2.0", "Unix/TS 1.0" } -> "Unix/TS 3.0";
+ { "Unix/TS++", "CB Unix 3", "Unix/TS 3.0" } ->
+ "TS 4.0" -> "System V.0" -> "System V.2" -> "System V.3";
+ };
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "SugiyamaLayout.runs"
+summary "Determines, how many times the crossing minimization is repeated."
+documentation
+[[
+Each repetition (except for the first) starts with
+randomly permuted nodes on each layer. Deterministic behavior can
+be achieved by setting |SugiyamaLayout.runs| to 1.
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "SugiyamaLayout.transpose"
+documentation [[
+ Determines whether the transpose step is performed
+ after each 2-layer crossing minimization; this step tries to
+ reduce the number of crossings by switching neighbored nodes on
+ a layer.
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "SugiyamaLayout.fails"
+documentation [[
+ The number of times that the number of crossings may
+ not decrease after a complete top-down bottom-up traversal,
+ before a run is terminated.
+]]
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End: \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout.lua
new file mode 100644
index 0000000000..9f5f291461
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout.lua
@@ -0,0 +1,19 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Miscellaneous Algorithms for Graph Drawing}
+--
+--
+
+local _ \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua
new file mode 100644
index 0000000000..2a250ecece
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua
@@ -0,0 +1,48 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "BalloonLayout"
+summary "A ``balloon layout''."
+
+documentation
+[[
+This algorithm computes a radial (balloon) layout based on a
+spanning tree. The algorithm is partially based on the paper
+\emph{On Balloon Drawings of Rooted Trees} by Lin and Yen and on
+\emph{Interacting with Huge Hierarchies: Beyond Cone Trees} by
+Carriere and Kazman.
+]]
+
+example
+[[
+\tikz \graph [BalloonLayout] { a -- {b,c,d -- {e,f,h,h,i}, j -- k -- {l,m,n}} };
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "BalloonLayout.evenAngles"
+summary "Subtrees may be assigned even angles or angles depending on their size."
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End: \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua
new file mode 100644
index 0000000000..c5e2cf7a6c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua
@@ -0,0 +1,95 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "CircularLayout"
+summary "The circular layout algorithm."
+
+documentation
+[[
+The implementation used in CircularLayout is based on the following publication:
+%
+\begin{itemize}
+ \item Ugur Dogrus\"oz, Brendan Madden, Patrick Madden: Circular
+ Layout in the Graph Layout Toolkit. \emph{Proc. Graph Drawing 1996,}
+ LNCS 1190, pp. 92--100, 1997.
+\end{itemize}
+]]
+
+example
+[[
+\tikz \graph [CircularLayout] {
+ a -- b -- c -- a -- d -- e -- f -- g -- d;
+ b -- {x,y,z};
+};
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "CircularLayout.minDistCircle"
+summary "The minimal padding between nodes on a circle."
+
+documentation "This is an alias for |part sep|."
+
+example
+[[
+\tikz \graph [CircularLayout, part sep=1cm] {
+ a -- b -- c -- a -- d -- e -- f -- g -- d;
+ b -- {x,y,z};
+};
+]]
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "CircularLayout.minDistLevel"
+summary "The minimal padding between nodes on different levels."
+
+documentation "This is an alias for |layer sep| and |level sep|."
+
+example
+[[
+\tikz \graph [CircularLayout, layer sep=1cm] {
+ a -- b -- c -- a -- d -- e -- f -- g -- d;
+ b -- {x,y,z};
+};
+]]
+--------------------------------------------------------------------------------
+
+
+--------------------------------------------------------------------------------
+key "CircularLayout.minDistSibling"
+summary "The minimal padding between sibling nodes."
+
+documentation "This is an alias for |sibling sep|."
+
+example
+[[
+\tikz \graph [CircularLayout, sibling sep=1cm] {
+ a -- b -- c -- a -- d -- e -- f -- g -- d;
+ b -- {x,y,z};
+};
+]]
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End: \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/AcyclicSubgraphModule.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/AcyclicSubgraphModule.lua
new file mode 100644
index 0000000000..b2bb7e1d24
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/AcyclicSubgraphModule.lua
@@ -0,0 +1,18 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {Computing Acyclic Subgraphs Module}
+--
+
+local _
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/HierarchyLayoutModule.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/HierarchyLayoutModule.lua
new file mode 100644
index 0000000000..a0292530cd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/HierarchyLayoutModule.lua
@@ -0,0 +1,17 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {The Hierarchy Layout Module}
+--
+
+local _
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/InitialPlacer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/InitialPlacer.lua
new file mode 100644
index 0000000000..328a2806db
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/InitialPlacer.lua
@@ -0,0 +1,17 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {The Initial Placer Module}
+--
+
+local _
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/MultilevelBuilder.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/MultilevelBuilder.lua
new file mode 100644
index 0000000000..9604c98640
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/MultilevelBuilder.lua
@@ -0,0 +1,17 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {The Multilevel Builder Module}
+--
+
+local _
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/RankingModule.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/RankingModule.lua
new file mode 100644
index 0000000000..8dce27a335
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/RankingModule.lua
@@ -0,0 +1,17 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {The Ranking Module}
+--
+
+local _
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/TwoLayerCrossMin.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/TwoLayerCrossMin.lua
new file mode 100644
index 0000000000..877cba47f6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/module/TwoLayerCrossMin.lua
@@ -0,0 +1,17 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {The Two Layer Crossing Minimization Module}
+--
+
+local _
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity.lua
new file mode 100644
index 0000000000..fb1abb5ccd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity.lua
@@ -0,0 +1,19 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Algorithms for Drawing Planar Graphs}
+--
+--
+
+local _ \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua
new file mode 100644
index 0000000000..e61f9281b9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua
@@ -0,0 +1,66 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------------------
+key "PlanarizationLayout"
+summary "The planarization layout algorithm."
+
+documentation
+[[
+ A |PlanarizationLayout| represents a customizable implementation
+ of the planarization approach for drawing graphs. The implementation
+ used in PlanarizationLayout is based on the following publication:
+ %
+ \begin{itemize}
+ \item C. Gutwenger, P. Mutzel: \emph{An Experimental Study of Crossing
+ Minimization Heuristics.} 11th International Symposium on Graph
+ Drawing 2003, Perugia (GD '03), LNCS 2912, pp. 13--24, 2004.
+ \end{itemize}
+]]
+
+example
+[[
+\tikz \graph [PlanarizationLayout] { a -- {b,c,d,e,f} -- g -- a };
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "PlanarizationLayout.preprocessCliques"
+summary "Configures, whether cliques are collapsed in a preprocessing step."
+documentation
+[[
+ If set to true, a preprocessing for cliques (complete subgraphs)
+ is performed and cliques will be laid out in a special form (straight-line,
+ not orthogonal). The preprocessing may reduce running time and improve
+ layout quality if the input graphs contains dense subgraphs.
+]]
+--------------------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------------------
+key "PlanarizationLayout.minCliqueSize"
+summary "The minimum size of cliques collapsed in preprocessing."
+--------------------------------------------------------------------------------
+
+
+-- Local Variables:
+-- mode:latex
+-- End: \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples.lua
new file mode 100644
index 0000000000..de33c0ed37
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.examples = {}
+
+
+-- Done
+
+return pgf.gd.examples \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/ASCIIDisplayer.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/ASCIIDisplayer.lua
new file mode 100644
index 0000000000..5acc28396b
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/ASCIIDisplayer.lua
@@ -0,0 +1,32 @@
+local InterfaceToDisplay = require "pgf.gd.interface.InterfaceToDisplay"
+
+InterfaceToDisplay.bind(require "pgf.gd.examples.BindingToASCII")
+require "pgf.gd.layered.library"
+require "pgf.gd.force.library"
+
+local algorithm = io.read():match("%s*graph%s*%[(.-)%]")
+
+InterfaceToDisplay.pushPhase(algorithm, "main", 1)
+InterfaceToDisplay.pushOption("level distance", 6, 2)
+InterfaceToDisplay.pushOption("sibling distance", 8, 3)
+InterfaceToDisplay.beginGraphDrawingScope(3)
+InterfaceToDisplay.pushLayout(4)
+
+for line in io.lines() do
+ if line:match("}") then
+ break
+ elseif line:find("-") then
+ local n1, dir, n2 = string.match(line, "^%s*(.-)%s*(-.)%s*(.-)%s*;")
+ InterfaceToDisplay.createEdge(n1, n2, dir, 4)
+ else
+ local n1 = string.match(line, "^%s*(.-)%s*;")
+ InterfaceToDisplay.createVertex(n1, "rectangle", nil, 4)
+ end
+end
+
+InterfaceToDisplay.runGraphDrawingAlgorithm()
+InterfaceToDisplay.renderGraph()
+InterfaceToDisplay.endGraphDrawingScope()
+
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/BindingToASCII.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/BindingToASCII.lua
new file mode 100644
index 0000000000..2b5c9cc0b6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/BindingToASCII.lua
@@ -0,0 +1,87 @@
+local lib = require "pgf.gd.lib"
+
+-- Create a binding to ourselves
+local BindingToASCII = lib.class { base_class = require "pgf.gd.bindings.Binding" }
+
+local canvas
+
+function BindingToASCII:renderStart()
+ canvas = {}
+ -- Clear the canvas
+ for x=-30,30 do
+ canvas [x] = {}
+ for y=-30,30 do
+ canvas[x][y] = ' '
+ end
+ end
+end
+
+function BindingToASCII:renderStop()
+ for y=10,-30,-1 do
+ local t = {}
+ for x=-30,30 do
+ local s = canvas[x][y]
+ for i=1,#s do
+ pos = x+30+i-math.floor(#s/2)
+ if not t[pos] or t[pos] == " " or t[pos] == "." then
+ t[pos] = string.sub(s,i,i)
+ end
+ end
+ end
+ print(table.concat(t))
+ end
+end
+
+function BindingToASCII:renderVertex(v)
+ canvas [math.floor(v.pos.x)][math.floor(v.pos.y)] = v.name
+end
+
+function BindingToASCII:renderEdge(e)
+
+ local function connect (p,q)
+
+ local x1, y1, x2, y2 = math.floor(p.x+0.5), math.floor(p.y+0.5), math.floor(q.x+0.5), math.floor(q.y+0.5)
+
+ -- Go upward with respect to x
+ if x2 < x1 then
+ x1, y1, x2, y2 = x2, y2, x1, y1
+ end
+
+ local delta_x = x2-x1
+ local delta_y = y2-y1
+
+ if math.abs(delta_x) > math.abs(delta_y) then
+ local slope = delta_y/delta_x
+ for i=x1,x2 do
+ local x,y = i, math.floor(y1 + (i-x1)*slope + 0.5)
+
+ if canvas[x][y] == " " then
+ canvas[x][y] = '.'
+ end
+ end
+ elseif math.abs(delta_y) > 0 then
+ local slope = delta_x/delta_y
+ for i=y1,y2,(y1<y2 and 1) or -1 do
+ local x,y = math.floor(x1 + (i-y1)*slope + 0.5), i
+
+ if canvas[x][y] == " " then
+ canvas[x][y] = '.'
+ end
+ end
+ end
+ end
+
+
+ local p = e.tail.pos
+
+ for i=1,#e.path do
+ if type(e.path[i]) == "table" then
+ connect(p, e.path[i])
+ p = e.path[i]
+ end
+ end
+
+ connect(p, e.head.pos)
+end
+
+return BindingToASCII
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleDemo.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleDemo.lua
new file mode 100644
index 0000000000..46eb4eff38
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleDemo.lua
@@ -0,0 +1,82 @@
+-- Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {The ``Hello World'' of Graph Drawing}
+--
+-- @end
+
+
+-- Inputs
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+---
+
+declare {
+ key = "simple demo layout",
+ algorithm = {
+ run =
+ function (self)
+ local g = self.digraph
+ local alpha = (2 * math.pi) / #g.vertices
+
+ for i,vertex in ipairs(g.vertices) do
+ local radius = vertex.options['radius'] or g.options['radius']
+ vertex.pos.x = radius * math.cos(i * alpha)
+ vertex.pos.y = radius * math.sin(i * alpha)
+ end
+ end
+ },
+
+ summary = [["
+ This algorithm is the ``Hello World'' of graph drawing.
+ "]],
+ documentation = [=["
+ The algorithm arranges nodes in a circle (without paying heed to the
+ sizes of the nodes or to the edges). In order to ``really'' layout
+ nodes in a circle, use |simple necklace layout|; the present layout
+ is only intended to demonstrate how much (or little) is needed to
+ implement a graph drawing algorithm.
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+-- File pgf.gd.examples.SimpleDemo
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+declare {
+ key = "simple demo layout",
+ algorithm = {
+ run =
+ function (self)
+ local g = self.digraph
+ local alpha = (2 * math.pi) / #g.vertices
+
+ for i,vertex in ipairs(g.vertices) do
+ local radius = vertex.options['radius'] or g.options['radius']
+ vertex.pos.x = radius * math.cos(i * alpha)
+ vertex.pos.y = radius * math.sin(i * alpha)
+ end
+ end
+ },
+ summary = "This algorithm is the 'Hello World' of graph drawing.",
+ documentation = [["
+ This algorithm arranges nodes in a circle ...
+ "]]
+}
+\end{codeexample}
+
+ On the display layer (\tikzname, that is) the algorithm can now
+ immediately be employed; you just need to say
+ |\usegdlibrary{examples.SimpleDemo}| at the beginning
+ somewhere.
+ "]=]
+} \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleEdgeDemo.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleEdgeDemo.lua
new file mode 100644
index 0000000000..c22c4decf2
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleEdgeDemo.lua
@@ -0,0 +1,143 @@
+-- Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {How To Generate Edges Inside an Algorithm}
+--
+-- @end
+
+
+-- Imports
+local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+local declare = InterfaceToAlgorithms.declare
+
+-- The class object
+local SimpleEdgeDemo = {}
+
+
+---
+declare {
+ key = "simple edge demo layout",
+ algorithm = SimpleEdgeDemo,
+
+ summary = "This algorithm shows how edges can be created by an algorithm.",
+ documentation = [["
+ For its job, the algorithm uses the function |createEdge|, which can be
+ called during the run of the algorithm to create edges in the
+ syntactic graph. The algorithm first does exactly the same as the
+ simple demo layout, then it creates an edge for every node where the
+ |new edge to| option is set. You will see in the code how this
+ option is declared and how we use it to look up a vertex in the
+ graph by its name.
+ %
+\begin{codeexample}[]
+\tikz [simple edge demo layout]
+\graph [radius=2cm] {
+ a, b, c, d, e, f;
+
+ e -> [red] f; % normal edge
+
+ % Edges generated by the algorithm:
+ a[new edge to=b];
+ b[new edge to=d];
+ c[new edge to=f];
+};
+\end{codeexample}
+
+ And the algorithm:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+ -- File pgf.gd.examples.SimpleEdgeDemo
+
+ -- Imports
+ local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+ local declare = InterfaceToAlgorithms.declare
+
+ -- The class object
+ local SimpleEdgeDemo = {}
+
+declare {
+ key = "simple edge demo layout",
+ algorithm = SimpleEdgeDemo,
+ summary = "This algorithm shows...",
+}
+\end{codeexample}
+
+ Next comes the declaration of the new option |new edge to|:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+declare {
+ key = "new edge to",
+ type = "string",
+ summary = "This option takes the name of a vertex..."
+}
+\end{codeexample}
+
+ Finally, the algorithm's code:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+function SimpleEdgeDemo:run()
+ -- As in a SimpleDemo:
+ ...
+ -- Now add some edges:
+ for _,tail in ipairs(g.vertices) do
+ local name = tail.options['new edge to']
+ if name then
+ local node = InterfaceToAlgorithms.findVertexByName(name)
+ if node and self.digraph:contains(node) then
+ InterfaceToAlgorithms.createEdge (self, tail, node)
+ end
+ end
+ end
+end
+\end{codeexample}
+ "]]
+}
+
+---
+declare {
+ key = "new edge to",
+ type = "string",
+
+ summary = [["
+ This option takes the name of a vertex. An edge leading to this
+ vertex is added to the syntactic digraph.
+ "]]
+}
+
+
+function SimpleEdgeDemo:run()
+
+ -- As in a SimpleDemo:
+ local g = self.digraph
+ local alpha = (2 * math.pi) / #g.vertices
+
+ for i,vertex in ipairs(g.vertices) do
+ local radius = vertex.options['radius'] or g.options['radius']
+ vertex.pos.x = radius * math.cos(i * alpha)
+ vertex.pos.y = radius * math.sin(i * alpha)
+ end
+
+ -- Now add some edges:
+ for _,tail in ipairs(g.vertices) do
+ local name = tail.options['new edge to']
+ if name then
+ local node = InterfaceToAlgorithms.findVertexByName(name)
+ if node and self.digraph:contains(node) then
+ InterfaceToAlgorithms.createEdge (self, tail, node)
+ end
+ end
+ end
+end
+
+return SimpleEdgeDemo \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleHuffman.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleHuffman.lua
new file mode 100644
index 0000000000..f81abf1105
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/SimpleHuffman.lua
@@ -0,0 +1,285 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- @section subsubsection {How To Generate Nodes Inside an Algorithm}
+--
+-- @end
+
+
+
+-- Imports
+local layered = require "pgf.gd.layered"
+local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+-- The class
+local SimpleHuffman = {}
+
+
+---
+
+declare {
+ key = "simple Huffman layout",
+ algorithm = SimpleHuffman,
+
+ postconditions = {
+ upward_oriented = true
+ },
+
+ summary = [["
+ This algorithm demonstrates how an algorithm can generate new nodes.
+ "]],
+ documentation = [["
+ The input graph should just consist of some nodes (without
+ edges) and each node should have a |probability| key set. The nodes
+ will then be arranged in a line (as siblings) and a Huffman tree
+ will be constructed ``above'' these nodes. For the construction of
+ the Huffman tree, new nodes are created and connected.
+
+ \pgfgdset{
+ HuffmanLabel/.style={/tikz/edge node={node[fill=white,font=\footnotesize,inner sep=1pt]{#1}}},
+ HuffmanNode/.style={/tikz/.cd,circle,inner sep=0pt,outer sep=0pt,draw,minimum size=3pt}
+ }
+
+\begin{codeexample}[]
+\tikz \graph [simple Huffman layout,
+ level distance=7mm, sibling distance=8mm, grow'=up]
+{
+ a ["0.5", probability=0.5],
+ b ["0.12", probability=0.12],
+ c ["0.2", probability=0.2],
+ d ["0.1", probability=0.1],
+ e ["0.11", probability=0.11]
+};
+\end{codeexample}
+ %
+ The file starts with some setups and declarations:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+-- File pgf.gd.examples.SimpleHuffman
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+-- The class
+local SimpleHuffman = {}
+
+declare {
+ key = "simple Huffman layout",
+ algorithm = SimpleHuffman,
+ postconditions = { upward_oriented = true }
+ summary = "..."
+}
+
+declare {
+ key = "probability",
+ type = "number",
+ initial = "1",
+ summary = "..."
+}
+
+-- Import
+local layered = require "pgf.gd.layered"
+local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+local Storage = require "pgf.gd.lib.Storage"
+
+local probability = Storage.new()
+local layer = Storage.new()
+
+function SimpleHuffman:run()
+ -- Construct a Huffman tree on top of the vertices...
+\end{codeexample}
+
+ Next comes a setup, where we create the working list of vertices
+ that changes as the Huffman coding method proceeds:
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+ -- Shorthand
+ local function prop (v)
+ return probability[v] or v.options['probability']
+ end
+
+ -- Copy the vertex table, since we are going to modify it:
+ local vertices = {}
+ for i,v in ipairs(self.ugraph.vertices) do
+ vertices[i] = v
+ end
+\end{codeexample}
+
+ The initial vertices are arranged in a line on the last layer. The
+ function |ideal_sibling_distance| takes care of the rather
+ complicated handling of the (possibly rotated) bounding boxes and
+ separations. The |props| and |layer| are tables used by
+ algorithms to ``store stuff'' at a vertex or at an arc. The
+ table will be accessed by |arrange_layers_by_baselines| to
+ determine the ideal vertical placements.
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+ -- Now, arrange the nodes in a line:
+ vertices [1].pos.x = 0
+ layer[ vertices [1] ] = #vertices
+ for i=2,#vertices do
+ local d = layered.ideal_sibling_distance(self.adjusted_bb, self.ugraph, vertices[i-1], vertices[i])
+ vertices [i].pos.x = vertices[i-1].pos.x + d
+ layer[ vertices [i] ] = #vertices
+ end
+\end{codeexample}
+
+ Now comes the actual Huffman algorithm: Always find the vertices
+ with a minimal probability\dots
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+ -- Now, do the Huffman thing...
+ while #vertices > 1 do
+ -- Find two minimum probabilities
+ local min1, min2
+
+ for i=1,#vertices do
+ if not min1 or prop(vertices[i]) < prop(vertices[min1]) then
+ min2 = min1
+ min1 = i
+ elseif not min2 or prop(vertices[i]) < prop(vertices[min2]) then
+ min2 = i
+ end
+ end
+\end{codeexample}
+ %
+ \dots and connect them with a new node. This new node gets the
+ option |HuffmanNode|. It is now the job of the higher layers to map
+ this option to something ``nice''.
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+ -- Create new node:
+ local p = prop(vertices[min1]) + prop(vertices[min2])
+ local v = InterfaceToAlgorithms.createVertex(self, { generated_options = {{key="HuffmanNode"}}})
+ probability[v] = p
+ layer[v] = #vertices-1
+ v.pos.x = (vertices[min1].pos.x + vertices[min2].pos.x)/2
+ vertices[#vertices + 1] = v
+
+ InterfaceToAlgorithms.createEdge (self, v, vertices[min1],
+ {generated_options = {{key="HuffmanLabel", value = "0"}}})
+ InterfaceToAlgorithms.createEdge (self, v, vertices[min2],
+ {generated_options = {{key="HuffmanLabel", value = "1"}}})
+
+ table.remove(vertices, math.max(min1, min2))
+ table.remove(vertices, math.min(min1, min2))
+ end
+\end{codeexample}
+ %
+ Ok, we are mainly done now. Finish by computing vertical placements
+ and do formal cleanup.
+\begin{codeexample}[code only, tikz syntax=false]
+ layered.arrange_layers_by_baselines(layers, self.adjusted_bb, self.ugraph)
+end
+\end{codeexample}
+
+ In order to use the class, we have to make sure that, on the
+ display layer, the options |HuffmanLabel| and |HuffmanNode| are
+ defined. This is done by adding, for instance, the following to
+ \tikzname:
+ %
+\begin{codeexample}[code only]
+\pgfkeys{
+ /graph drawing/HuffmanLabel/.style={
+ /tikz/edge node={node[fill=white,font=\footnotesize,inner sep=1pt]{#1}}
+ },
+ /graph drawing/HuffmanNode/.style={
+ /tikz/.cd,circle,inner sep=0pt,outer sep=0pt,draw,minimum size=3pt
+ }
+}
+\end{codeexample}
+ "]]
+}
+
+
+---
+
+declare {
+ key = "probability",
+ type = "number",
+ initial = "1",
+
+ summary = [["
+ The probability parameter. It is used by the Huffman algorithm to
+ group nodes.
+ "]]
+}
+
+-- Imports
+
+local Storage = require 'pgf.gd.lib.Storage'
+
+-- Storages
+
+local probability = Storage.new()
+local layer = Storage.new()
+
+
+function SimpleHuffman:run()
+ -- Construct a Huffman tree on top of the vertices...
+
+ -- Shorthand
+ local function prop (v)
+ return probability[v] or v.options['probability']
+ end
+
+ -- Copy the vertex table, since we are going to modify it:
+ local vertices = {}
+ for i,v in ipairs(self.ugraph.vertices) do
+ vertices[i] = v
+ end
+
+ -- Now, arrange the nodes in a line:
+ vertices [1].pos.x = 0
+ layer[vertices [1]] = #vertices
+ for i=2,#vertices do
+ local d = layered.ideal_sibling_distance(self.adjusted_bb, self.ugraph, vertices[i-1], vertices[i])
+ vertices [i].pos.x = vertices[i-1].pos.x + d
+ layer[vertices [i]] = #vertices
+ end
+
+ -- Now, do the Huffman thing...
+ while #vertices > 1 do
+ -- Find two minimum probabilities
+ local min1, min2
+
+ for i=1,#vertices do
+ if not min1 or prop(vertices[i]) < prop(vertices[min1]) then
+ min2 = min1
+ min1 = i
+ elseif not min2 or prop(vertices[i]) < prop(vertices[min2]) then
+ min2 = i
+ end
+ end
+
+ -- Create new node:
+ local p = prop(vertices[min1]) + prop(vertices[min2])
+ local v = InterfaceToAlgorithms.createVertex(self, { generated_options = {{key="HuffmanNode"}}})
+ probability[v] = p
+ layer[v] = #vertices-1
+ v.pos.x = (vertices[min1].pos.x + vertices[min2].pos.x)/2
+ vertices[#vertices + 1] = v
+
+ InterfaceToAlgorithms.createEdge (self, v, vertices[min1],
+ {generated_options = {{key="HuffmanLabel", value = "0"}}})
+ InterfaceToAlgorithms.createEdge (self, v, vertices[min2],
+ {generated_options = {{key="HuffmanLabel", value = "1"}}})
+
+ table.remove(vertices, math.max(min1, min2))
+ table.remove(vertices, math.min(min1, min2))
+ end
+
+ layered.arrange_layers_by_baselines(layer, self.adjusted_bb, self.ugraph)
+end
+
+return SimpleHuffman \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/library.lua
new file mode 100644
index 0000000000..0c977600a7
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/examples/library.lua
@@ -0,0 +1,30 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This package presents some examples of how different aspects of the
+-- graph drawing engine can be used. In particular, the algorithms of
+-- this package are not really meant to be used to layout graphs
+-- (although they can be used, in principle); rather you are invited
+-- to have a look at their implementation and to adapt them to your needs.
+--
+-- @library
+
+local examples
+
+
+-- Load algorithms from:
+require "pgf.gd.examples.SimpleDemo"
+require "pgf.gd.examples.SimpleEdgeDemo"
+require "pgf.gd.examples.SimpleHuffman"
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua
new file mode 100644
index 0000000000..31f8f27431
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua
@@ -0,0 +1,638 @@
+-- Copyright 2015 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+
+
+--
+--
+-- @field.visible_objects An array which stores for each supernode a mapping
+-- of snapshots to the related visible snapshot nodes.
+-- Note that these mappings may differ from the supergraph
+-- because if there are two snapshot nodes in consecutive snapshots
+-- then the first can be shown for a longer time period to
+-- put aside some fade animations.
+-- @field is_first A table storing for each snapshot node or snapshot arc if it
+-- appears in its snapshot. This means that in the previous snapshot
+-- there is no corresponding arc or node.
+-- @field is_last A table storing for each snapshot node or arc if there
+-- is no representative in the next snapshot.
+-- @field move_on_enter A table which stores for each snapshot object if it is in
+-- motion while it appears in its snapshot.
+-- @field move_on_leave A table which stores for each snapshot object if it is in
+-- motion while switching to the next snapshot
+-- @field last_rep
+-- A table which stores for every snapshot node if the representing (visible) node
+-- disappears with the next snapshot.
+--
+-- @field previous_node The same as |next_node| just for the previous node
+-- @field next_node A Storage to map each snapshot node to the next node in the
+-- following snapshot related to the same supernode.
+-- If in the next snapshot there is node following snapshot node
+-- then the value is nil.
+--
+local GraphAnimationCoordination = {}
+
+-- Imports
+local lib = require "pgf.gd.lib"
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+local Storage = require "pgf.gd.lib.Storage"
+local Coordinate = require "pgf.gd.model.Coordinate"
+
+
+declare {
+ key = "modified",
+ type = "boolean",
+ Initial = false,
+ documentation = [["
+ This key specifies, if a supernode changed its
+ visual properties since the last snapshot.
+ The default value is |false| and prevent the algorithm
+ to produce a lot of unnecessary animations.
+ "]]
+}
+
+declare {
+ key = "unmodified",
+ use = {
+ { key = "modified", boolean = false},
+ },
+}
+
+
+---
+declare {
+ key = "minimum rest time",
+ type = "number",
+ initial = 0.5,
+ documentation = [["
+ This key specifies a minimum time in which a single node
+ has to be prohibited to be animated.
+ For a node with minimum rest time of 1s that exists in a snapshot
+ at time $t$ this means that all animations including movements and fadings
+ are only allowed before $t$-0.5s and after $t$+0.5s.
+ "]],
+}
+
+declare {
+ key = "maximum motion time",
+ type = "number",
+ initial = math.huge,
+ documentation = [["
+ Use this key if you want to limit the time during nodes are allowed to move
+ when they changing their positions.
+ "]],
+}
+
+declare {
+ key = "overlapping transition",
+ type = "boolean",
+ initial = true,
+ documentation = [["
+ Use this key if you want to allow that the fade animations for or
+ disappearing nodes may occurs while the mid time between two snapshots.
+ If false then the appearing ends on the midtime and the disappearing
+ starts in this moment.
+ "]]
+}
+
+---
+declare {
+ key = "default evolving graph animation",
+ algorithm = GraphAnimationCoordination,
+ phase = "evolving graph animation",
+ phase_default = true,
+ summary = [["
+ This phase animates all vertices including movements and
+ fade in or fade out animations given an evolving graph as sequence
+ of single snapshot graphs.
+ "]],
+ documentation = [["
+ This phase animates all vertices including movements and
+ fade in or fade out animations given an evolving graph as sequence
+ of single snapshot graphs.
+
+ Your algorithm needs to work on evolving graphs and has to use
+ the |evolving graph animation| phase. You do not need to use
+ this key by yourself then because this key starts the default
+ algorithm algorithm of the phase.
+ %
+ \begin{codeexample}[]
+ local ga_class = self.digraph.options.algorithm_phases['evolving graph animation']
+ -- animate graph
+ ga_class.new {
+ main_algorithm = self,
+ supergraph = supergraph,
+ digraph = self.digraph,
+ ugraph = self.ugraph
+ }:run()
+ \end{codeexample}
+
+ This algorithm and phase require a supergraph instance and the original
+ digraph and ugraph. Note that you have to set the layout of the snapshot
+ nodes before running algorithms of this is useful.
+ "]],
+}
+
+-- Help functions
+
+--
+-- Appends a move animation to a given snapshot object such that the
+-- object moves from one point to another on a straight line. Note
+-- that the coordinates of the two points are given as relative
+-- coordinates to the current origin of the object.
+--
+-- This means if we want to move a node 1cm to the right the value of
+-- |c_from| has to be (0,0) while |c_to| must be (1,0). The argument
+-- |c_from| is useful for a node which has a position but its
+-- previous node related to the same supervertex is at a different
+-- position. Then we can use this argument to move the new node to
+-- its origin position for smooth transitions.
+--
+-- @field object The snapshot object which should be moved
+--
+-- @field c_from The coordinate where the animation starts
+--
+-- @field c_to The coordinate where the animation should end
+--
+-- @field t_start The time when the movement starts.
+--
+-- @field t_end The time when the animation stops.
+local function append_move_animation(object, c_from, c_to, t_start, t_end)
+ if not object then return end
+ assert(object, "no object to animate")
+ if ((c_from.x~=c_to.x) or (c_from.y~=c_to.y))then
+ local animations = object.animations or {}
+ local c1 = Coordinate.new((2*c_from.x+c_to.x)/3,(2*c_from.y+c_to.y)/3)
+ local c2 = Coordinate.new((c_from.x+2*c_to.x)/3,(c_from.y+2*c_to.y)/3)
+ local t1 = (7*t_start + 5*t_end)/12
+ local t2 = (5*t_start + 7*t_end)/12
+ table.insert(animations, {
+ attribute = "translate",
+ entries = {
+ { t = t_start, value = c_from},
+-- { t = t1, value = c1 },
+-- { t = t2, value = c2 },
+ { t = t_end, value = c_to }
+ },
+ options = { { key = "freeze at end", },
+-- {key = "entry control", value="0}{1",}
+ }
+ })
+ object.animations = animations
+ end
+end
+
+local function append_fade_animation(object, v_start, v_end, t_start, t_end)
+ local animations = object.animations or {}
+
+ if v_start == 0 then
+ table.insert(animations, {
+ attribute = "stage",
+ entries = { { t = t_start, value = "true"}, },
+ options = { { key = "freeze at end" } }
+ })
+ elseif v_end == 0 and nil then
+ table.insert(animations, {
+ attribute = "stage",
+ entries = { { t = t_end, value = "false"}, },
+ options = { --{ key = "freeze at end" }
+ }
+ })
+ end
+
+ table.insert(animations, {
+ attribute = "opacity",
+ entries = {
+ { t = t_start, value = v_start },
+ { t = t_end, value = v_end } },
+ options = { { key = "freeze at end" } }
+ })
+ object.animations = animations
+end
+
+--
+-- check if the difference/vector between two pairs (a1,a2),(b1,b2) of points
+-- is the same.
+local function eq_offset(a1, a2, b1, b2)
+ local dx = ((a1.x-a2.x) - (b1.x-b2.x))
+ local dy = ((a1.y-a2.y) - (b1.y-b2.y))
+ if dx<0 then dx = -dx end
+ if dy<0 then dy = -dy end
+ return dx<0.001 and dy<0.001
+end
+
+--
+-- Check if two arcs connect a pair of nodes at the same position.
+-- This can be used as an indicator that two consecutive arcs
+-- can be represented by the same arc object.
+--
+local function eq_arc(arc1, arc2)
+ if not arc1 or not arc2 then
+ return false
+ end
+ return eq_offset(arc1.tail.pos, arc1.head.pos, arc2.tail.pos, arc2.head.pos)
+end
+
+
+-- Implementation
+
+function GraphAnimationCoordination:run()
+ assert(self.supergraph, "no supergraph defined")
+
+ self.is_first = Storage.new()
+ self.is_last = Storage.new()
+ self.last_rep = Storage.new()
+ self.move_on_enter = Storage.new()
+ self.move_on_leave = Storage.new()
+ self.previous_node = Storage.new()
+ self.next_node = Storage.new()
+ self.visible_objects = Storage.new()
+
+
+ self:precomputeNodes()
+ self:precomputeEdges()
+ self:animateNodeAppearing()
+ self:animateEdgeAppearing()
+ self:generateNodeMotions()
+ self:generateEdgeMotions()
+end
+
+function GraphAnimationCoordination:generateNodeMotions(node_types)
+ local supergraph = self.supergraph
+ local graph = self.digraph
+
+ for _, supervertex in ipairs(self.supergraph.vertices) do
+ local lj = -1
+ local last_v = nil
+ local last_time = nil
+ for j, s in ipairs(supergraph.snapshots) do
+ local vertex = supergraph:getSnapshotVertex(supervertex, s)
+
+ if lj == j-1 and vertex and last_v then
+ local mrt1 = last_v.options["minimum rest time"]/2
+ local mrt2 = vertex.options["minimum rest time"]/2
+
+ local s1 = Coordinate.new(0,0)
+ local e1 = Coordinate.new(vertex.pos.x-last_v.pos.x,-vertex.pos.y+last_v.pos.y)
+
+ local s2 = Coordinate.new(-vertex.pos.x+last_v.pos.x,vertex.pos.y-last_v.pos.y)
+ local e2 = Coordinate.new(0,0)
+
+ local t_end = s.timestamp - math.max(0, mrt2)
+ local t_start = last_time + math.max(0,mrt1)
+
+ local representative = self.visible_objects[supervertex][s]
+ if representative == vertex then
+ append_move_animation(vertex, s2, e2, t_start, t_end)
+ append_move_animation(last_v, s1, e1, t_start, t_end)
+ else
+ append_move_animation(representative,s1,e1,t_start,t_end)
+ end
+ end
+ last_time = s.timestamp
+ lj = j
+ last_v = vertex
+ end
+ end
+end
+
+
+
+
+
+function GraphAnimationCoordination:generateEdgeMotions()
+ local supergraph = self.supergraph
+ local graph = self.digraph
+
+ for i, arc in ipairs(supergraph.arcs) do
+ local head = arc.head
+ local tail = arc.tail
+
+ local last_arc = nil
+ local last_time = nil
+ local last_v = nil
+ local last_w = nil
+
+ for j, s in ipairs(supergraph.snapshots) do
+ local v = supergraph:getSnapshotVertex(tail,s)
+ local w = supergraph:getSnapshotVertex(head,s)
+
+ if v and w then
+ local this_arc = graph:arc(v,w) --or graph:arc(w,v)
+ if this_arc then
+ if this_arc and last_arc then
+ local mrt1 = last_v.options["minimum rest time"]/2
+ local mrt2 = v.options["minimum rest time"]/2
+
+ local s1 = Coordinate.new(0,0)--lv.pos
+ local e1 = Coordinate.new(v.pos.x-last_v.pos.x,-v.pos.y+last_v.pos.y)
+
+ local s2 = Coordinate.new(-v.pos.x+last_v.pos.x,v.pos.y-last_v.pos.y)
+ local e2 = Coordinate.new(0,0)
+
+ local t_end = s.timestamp - math.max(0,mrt2)
+ local t_start = last_time + math.max(0,mrt1)
+
+ local representative = self.visible_objects[arc][s]
+ if representative == this_arc then
+ append_move_animation(last_arc, s1, e1, t_start,t_end)
+ append_move_animation(this_arc, s2, e2, t_start,t_end)
+ else
+ append_move_animation(representative,s1,e1,t_start,t_end)
+ end
+ this_arc = representative
+ end
+ last_arc = this_arc
+ last_v = v
+ last_time = s.timestamp
+ else
+ last_arc = nil
+ end
+ else
+ last_arc = nil
+ end
+ end
+ end
+end
+
+--
+--
+-- @field t_transition The mid time between two snapshot times.
+-- @field fade_duration The duration of the fade animation
+-- @field overlapping A boolean defining if the animation occurs
+-- before and after the mid time (true) or if it
+-- starts/end only in one interval (false)
+-- @field closing A boolean specifying if this is an outfading time
+local function compute_fade_times(t_transition, fade_duration, overlapping, closing)
+
+ if overlapping then
+ t_start = t_transition - fade_duration / 2
+ t_end = t_transition + fade_duration / 2
+ else
+ if closing then
+ t_start = t_transition - fade_duration
+ t_end = t_transition
+ else
+ t_start = t_transition
+ t_end = t_transition + fade_duration
+ end
+ end
+ return {t_start = t_start, t_end = t_end}
+end
+
+function GraphAnimationCoordination:animateNodeAppearing()
+ local supergraph = self.supergraph
+ for i,vertex in ipairs(self.ugraph.vertices) do
+ local snapshot = supergraph:getSnapshot(vertex)
+ local interval = snapshot.interval
+ local supernode = supergraph:getSupervertex(vertex)
+ local representative = self.visible_objects[supernode][snapshot]
+ local overlapping_in = true -- init true for crossfading
+ local overlapping_out= true
+ local minimum_rest_time = math.max(0,vertex.options["minimum rest time"])
+ local allow_overlapping = vertex.options["overlapping transition"]
+ local fadein_duration = 0.01
+ local fadeout_duration = 0.01
+
+ if self.is_first[vertex] then
+ fadein_duration = self.ugraph.options["fadein time"]
+ overlapping_in = false or allow_overlapping
+ end
+ if self.is_last[vertex] then
+ fadeout_duration = self.ugraph.options["fadeout time"]
+ overlapping_out = false or allow_overlapping
+ end
+
+ if fadein_duration == math.huge or fadein_duration<0 then
+ fadein_duration = (interval.to-interval.from-minimum_rest_time)/2
+ if overlapping then fadein_duration = fadein_duration * 2 end
+ end
+ if fadeout_duration == math.huge or fadeout_duration<0 then
+ fadeout_duration = (interval.to-interval.from-minimum_rest_time)/2
+ if overlapping then fadeout_duration = fadeout_duration*2 end
+ end
+
+ local fin = compute_fade_times(interval.from, fadein_duration, overlapping_in, false)
+ local fout = compute_fade_times(interval.to, fadeout_duration, overlapping_out, true)
+
+ vertex.animations = vertex.animations or {}
+
+ if representative~= vertex then
+ table.insert(vertex.animations,{
+ attribute = "stage",
+ entries = { { t = 0, value = "false"}, },
+ options = {}
+ })
+ end
+
+ if interval.from > -math.huge and (vertex == representative or self.is_first[vertex]) then
+ -- only appears if the snapshot node is its own repr. or if in the prev snapshot is
+ -- no representative.
+ append_fade_animation(representative, 0, 1, fin.t_start, fin.t_end)
+ end
+ if interval.to < math.huge and (self.is_last[vertex] or self.last_rep[vertex]) then
+ -- The snapshot node only disappears when the node is not visible
+ -- in the next or (this=)last snapshot:
+ append_fade_animation(representative, 1, 0, fout.t_start, fout.t_end)
+ end
+ end
+end
+
+
+
+function GraphAnimationCoordination:animateEdgeAppearing()
+ local supergraph = self.supergraph
+ local graph = self.digraph
+ for _,edge in ipairs(graph.arcs) do
+ local snapshot = supergraph:getSnapshot(edge.head)
+ local int = snapshot.interval
+ local superarc = supergraph:getSuperarc(edge)
+ local representative = self.visible_objects[superarc][snapshot] or edge
+
+ local minimum_rest_time = math.max(0,edge.head.options["minimum rest time"]/2,
+ edge.tail.options["minimum rest time"]/2)
+
+ local appears = math.max(int.from, int.from)
+ local disappears = math.min(int.to, int.to)
+
+ local overlapping_in = true -- init true for crossfading
+ local overlapping_out= true
+ local fadein_duration = 0.01
+ local fadeout_duration = 0.01
+ local allow_overlapping = (edge.tail.options["overlapping transition"] and edge.head.options["overlapping transition"])
+
+ if self.is_first[edge] and not self.move_on_enter[edge] and not self.move_on_enter[edge.head] then
+ fadein_duration = self.ugraph.options["fadein time"]
+ overlapping_in = false or allow_overlapping
+ end
+
+ if self.is_last[edge] and not self.move_on_leave[edge] then
+ fadeout_duration = self.ugraph.options["fadeout time"]
+ overlapping_out = false or allow_overlapping
+ end
+
+
+ if self.is_first[edge]
+ and (self.move_on_enter[edge.head]
+ or self.move_on_enter[edge.tail] )
+ then
+ appears = snapshot.timestamp - minimum_rest_time
+ end
+ if self.is_last[edge] and
+ (self.move_on_leave[edge.head]
+ or self.move_on_leave[edge.tail]
+ ) then
+ disappears = snapshot.timestamp + minimum_rest_time
+ end
+
+ local fin = compute_fade_times(appears, fadein_duration, overlapping_in,false)
+ local fout = compute_fade_times(disappears,fadeout_duration,overlapping_out,true)
+
+ edge.animations = edge.animations or {}
+
+ if representative~=edge then
+ table.insert(edge.animations,{
+ attribute = "stage",
+ entries = { { t = 0, value = "false"}, },
+ options = {}})
+ end
+
+ -- Fade in:
+ if appears > -math.huge and (edge == representative or self.is_first[edge]) then
+ append_fade_animation(representative, 0, 1, fin.t_start, fin.t_end )
+ end
+
+ -- Fade out:
+ if disappears < math.huge and (self.is_last[edge] or self.last_rep[edge])then
+ append_fade_animation(representative, 1, 0, fout.t_start,fout.t_end )
+ end
+ end
+end
+
+function GraphAnimationCoordination:precomputeNodes()
+ local supergraph = self.supergraph
+
+ for _, supernode in ipairs(supergraph.vertices) do
+
+ local vis_nodes = {}
+ self.visible_objects[supernode] = vis_nodes
+
+ local any_previous_node = nil
+ local previous_representant = nil
+ local node_before = nil
+
+ for i, s in ipairs(supergraph.snapshots) do
+ local node = supergraph:getSnapshotVertex(supernode, s)
+
+ if node then
+ -- assume the node is the last node
+ self.is_last[node] = true
+
+ if node.options["modified"] then
+ -- modified
+ vis_nodes[s] = node
+ previous_representant = node
+ if any_previous_node then
+ self.last_rep[any_previous_node] = true
+ end
+ else
+ -- unmodified
+ previous_representant = previous_representant or node
+ vis_nodes[s] = previous_representant
+ end
+ any_previous_node = node
+
+ if node_before then
+ self.is_last[node_before] = false
+ self.previous_node[node] = node_before
+ self.next_node[node_before] = node
+
+ local do_move = (( node.pos.x ~= node_before.pos.x )
+ or (node.pos.y ~= node_before.pos.y))
+ self.move_on_enter[node] = do_move
+ self.move_on_leave[node_before] = do_move
+ else
+ self.is_first[node] = true
+ end
+ node_before = node
+ else
+ node_before = nil
+ end
+ end
+ end
+end
+
+function GraphAnimationCoordination:precomputeEdges()
+ -- 1. classify arcs (appearing, disappearing)
+ for _, arc in ipairs(self.digraph.arcs) do
+ local head = arc.head
+ local tail = arc.tail
+ if not ( self.is_first[head] or self.is_first[tail]) then
+ if not self.digraph:arc(self.previous_node[tail], self.previous_node[head]) then
+ -- new arc connects existing nodes
+ self.is_first[arc] = true
+ end
+ else
+ -- arc and at least one node is new.
+ self.is_first[arc] = true
+ end
+ if not ( self.is_last[head] or self.is_last[tail]) then
+ if not self.digraph:arc(self.next_node[tail],self.next_node[head]) then
+ -- arc disappears while nodes are still in the next snapshot
+ self.is_last[arc] = true
+ end
+ else
+ -- arc and at least one node disappears in the next snapshot
+ self.is_last[arc] = true
+ end
+ self.move_on_enter[arc] = self.move_on_enter[head] or self.move_on_enter[tail]
+ self.move_on_leave[arc] = self.move_on_leave[head] or self.move_on_leave[tail]
+ end
+
+ -- 2. precompute the unmodified edges
+ local supergraph = self.supergraph
+
+ for _, superarc in ipairs(supergraph.arcs) do
+ local vis_objects = {}
+ self.visible_objects[superarc] = vis_objects
+
+ local previous_arc
+ local previous_representant
+
+ for _, s in ipairs(supergraph.arc_snapshots[superarc]) do
+ local head = supergraph:getSnapshotVertex(superarc.head, s)
+ local tail = supergraph:getSnapshotVertex(superarc.tail, s)
+ -- use the digraph because the snapshot arc is not synced
+ local arc = self.digraph:arc(tail, head)
+
+ local modified = false
+ local opt_array = arc:optionsArray('modified')
+ for i = 1,#opt_array.aligned do
+ modified = modified or opt_array[i]
+ end
+
+ if modified or
+ not eq_arc(arc, previous_arc) or self.is_first[arc] then
+ --modified
+ previous_representant = arc
+ vis_objects[s] = arc
+ if previous_arc then
+ self.last_rep[previous_arc] = true
+ end
+ else
+ -- unmodified
+ previous_representant = previous_representant or arc
+ vis_objects[s] = previous_representant
+ end
+ previous_arc = arc
+ end
+ end
+end
+-- Done
+
+return GraphAnimationCoordination
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua
new file mode 100644
index 0000000000..0c348bcc8f
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua
@@ -0,0 +1,177 @@
+-- Copyright 2015 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+
+
+local GreedyTemporalCycleRemoval = {}
+
+-- Imports
+local lib = require "pgf.gd.lib"
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+local Vertex = require "pgf.gd.model.Vertex"
+local Digraph = require "pgf.gd.model.Digraph"
+local Coordinate = require "pgf.gd.model.Coordinate"
+
+local PriorityQueue = require "pgf.gd.lib.PriorityQueue"
+
+-- Keys
+
+---
+
+declare {
+ key = "split critical arc head",
+ type = "boolean",
+ initial = true,
+ summary = "Specifies, that for a critical the tail node is separated"
+}
+
+---
+
+declare {
+ key = "split critical arc tail",
+ type = "boolean",
+ initial = true,
+ summary = "Specifies, that for a critical the tail node is separated"
+}
+
+---
+
+declare {
+ key = "greedy temporal cycle removal",
+ algorithm = GreedyTemporalCycleRemoval,
+ phase = "temporal cycle removal",
+ phase_default = true,
+ summary = [["
+ A temporal dependency cycle is a cyclic path in the supergraph of
+ an evolving graph. Use this key if you want remove all temporal
+ dependency cycles by a greedy strategy which incrementally inserts
+ edge checks if this edge creates a cycle and splits at least one node
+ into two supernode at a given time.
+ "]],
+ documentation = [["
+ See ToDo
+ "]]
+}
+
+-- Help functions
+local function reachable(graph, v, w)
+ local visited = {}
+ local queue = PriorityQueue.new()
+ queue:enqueue(v,1)
+ while not queue:isEmpty() do
+ local vertex = queue:dequeue()
+ if vertex==w then
+ return true
+ end
+ local outgoings = graph:outgoing(vertex)
+ for _, e in ipairs(outgoings) do
+ local head = e.head
+ if not visited[head] then
+ visited[head] = true
+ if head == w then
+ return true
+ else
+ queue:enqueue(head,1)
+ end
+ end
+ end
+ end
+ return false
+end
+
+-- Implementation
+
+function GreedyTemporalCycleRemoval:run()
+ local supergraph = assert(self.supergraph, "no supergraph passed")
+ local digraph = assert(self.digraph, "no digraph passed to the phase")
+ local split_tail = digraph.options["split critical arc tail"]
+ local split_head = digraph.options["split critical arc head"]
+ assert(split_tail or split_head, "without splitting nodes dependency cycles cannot be removed.")
+
+ self:iterativeCycleRemoval(supergraph, split_tail, split_head)
+end
+
+--
+-- Resolves all dependencies by splitting supernodes into multiple supernodes.
+-- To resolve a cycle each edge will be inserted into a dependency graph
+-- successively. Each time such edge closes a cycle the head and tail will
+-- be split at the related snapshot.
+--
+-- @param supergraph
+--
+function GreedyTemporalCycleRemoval:iterativeCycleRemoval(supergraph, split_tail, split_head)
+ -- Build up the global dependency graph
+ -- A supernode v directly depends on another supernode w if
+ -- there is a snapshot in which w is a child of w
+ local dependency_graph = Digraph.new(supergraph)
+ local stable_arcs = {}
+ for i, snapshot in ipairs(supergraph.snapshots) do
+ --local tree = snapshot.spanning_tree
+ for _,tree in ipairs(snapshot.spanning_trees) do
+ local new_arcs = {}
+
+ for _, e in ipairs(tree.arcs) do
+ if e.head.kind ~= "dummy" and e.tail.kind~="dummy" then
+ table.insert(new_arcs, e)
+
+ local sv = supergraph:getSupervertex(e.tail)
+ local sw = supergraph:getSupervertex(e.head)
+ local dep_arc = dependency_graph:arc(sv, sw)
+
+
+ if (not dep_arc) then
+ -- check if the edge v->w closes a cycle in the dependency graph
+ --pgf.debug{dependency_graph}
+ local cycle_arc = reachable(dependency_graph, sw, sv)
+ dep_arc = dependency_graph:connect(sv,sw)
+-- texio.write("\ncheck ".. sv.name.."->" .. sw.name)
+ if cycle_arc then
+ if split_tail then
+ supergraph:splitSupervertex(sv, { [1]=snapshot })
+ end
+ if split_head then
+ supergraph:splitSupervertex(sw, { [1]=snapshot })
+ end
+
+ -- rebuild dependency graph
+ dependency_graph = Digraph.new(supergraph)
+
+ for _, arc in ipairs(stable_arcs) do
+ dependency_graph:connect(arc.tail, arc.head)
+ end
+
+ for _, arc in ipairs(new_arcs) do
+ local sv = supergraph:getSupervertex(arc.tail)
+ local sw = supergraph:getSupervertex(arc.head)
+ dependency_graph:connect(sv, sw)
+ end
+ end -- end of resolve cycle_arc
+ end
+ end
+ end
+ -- Stable Arcs:
+ for _, arc in ipairs(new_arcs) do
+
+ local sv = supergraph:getSupervertex(arc.tail)
+ local sw = supergraph:getSupervertex(arc.head)
+ local deparc = dependency_graph:arc(sv, sw)
+-- if not deparc or not stable_arcs[deparc] then
+-- stable_arcs[deparc] = true
+ table.insert(stable_arcs, deparc)
+-- end
+
+ end
+ end -- end for spanning_tree
+ end -- end for snapshot
+end
+
+
+-- Done
+
+return GreedyTemporalCycleRemoval
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Skambath2016.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Skambath2016.lua
new file mode 100644
index 0000000000..2beec1e216
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Skambath2016.lua
@@ -0,0 +1,875 @@
+-- Copyright 2015 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+--
+
+-- Imports
+require "pgf.gd.trees.ChildSpec"
+
+local Digraph = require "pgf.gd.model.Digraph"
+local Vertex = require "pgf.gd.model.Vertex"
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+local layered = require "pgf.gd.layered"
+local tlayered = require "pgf.gd.experimental.evolving.layered"
+local SpanningTreeComputation = require "pgf.gd.trees.SpanningTreeComputation"
+local lib = require "pgf.gd.lib"
+
+local Storage = require "pgf.gd.lib.Storage"
+local PriorityQueue = require "pgf.gd.lib.PriorityQueue"
+
+local Supergraph = require "pgf.gd.experimental.evolving.Supergraph"
+
+local LayoutPipeline = require "pgf.gd.control.LayoutPipeline"
+local Direct = require "pgf.gd.lib.Direct"
+
+--
+--
+local Skambath2016 = {}
+
+
+---
+declare {
+ key = "animated tree layout",
+ algorithm = Skambath2016,
+ postconditions = {
+ upward_oriented = true
+ },
+ documentation_in = "pgf.gd.evolving.doc"
+}
+
+---
+declare {
+ key = "animated binary tree layout",
+ use = {
+ { key = "animated tree layout" },
+ { key = "minimum number of children", value = 2 },
+ { key = "significant sep", value = 0 },
+ },
+
+ documentation_in = "pgf.gd.evolving.doc"
+}
+
+---
+declare {
+ key = "extended animated binary tree layout",
+ use = {
+ { key = "animated tree layout" },
+ { key = "minimum number of children", value=2 },
+ { key = "missing nodes get space" },
+ { key = "significant sep", value = 0 }
+ },
+ documentation_in = "pgf.gd.evolving.doc"
+}
+
+
+
+
+
+-- Help functions
+
+---
+-- Borders models the borderlines / the line of border vertices
+-- of a tree or subtree structure which can change over time.
+-- Each ordered and rooted tree or subtree has vertices per layer for which they
+-- are on the outer places. On the left or respectively on the right.
+-- The field |left| and |right| stores the both borderlines.
+-- A \emph{borderline} is an array. This array contains for each layer of the tree
+-- a table mapping a given snapshot to the related border-vertex of the layer
+-- in the snapshot.
+--
+-- @field left
+-- @field right
+--
+local Borders = {}
+Borders.__index = Borders
+
+
+-- Namespace
+
+--require("pgf.gd.experimental.evolving").Borders = Borders
+
+
+--- Create a new tree border description.
+--
+--
+function Borders.new()
+ return setmetatable( {left = {}, right = {}}, Borders )
+end
+
+function Borders:addBoth(layer, snapshot, vertex)
+ local lleft = self.left[layer] or {}
+ local lright = self.right[layer] or {}
+ assert(not lleft[snapshot] and not lright[snapshot], "borders already defined for given layer and snapshot")
+ lleft[snapshot] = vertex
+ lright[snapshot] = vertex
+ self.left[layer] = lleft
+ self.right[layer] = lright
+end
+
+function Borders:appendBelow(level, borders)
+ assert(borders, "invalid argument for borders. Value must not be 'nil'.")
+ assert((#self.left == #self.right) and (#self.left == level), "cannot be appended")
+ local new_level = borders:getLevel()
+ for i = 1, new_level do
+ self.left[i + level] = borders.left[i]
+ self.right[i + level] = borders.right[i]
+ end
+end
+
+---
+--
+-- @return the number of levels in which bordervertices exists.
+function Borders:getLevel()
+ assert(#self.left == #self.right, "different levels")
+ return #self.left
+end
+
+function Borders.copyBordersAtSnapshot(source, target, snapshot)
+ local source_level = source:getLevel()
+ for i = 1, source_level do
+ level_border_left = target.left[i] or {}
+ level_border_right = target.right[i] or {}
+ assert(not level_border_left[snapshot] and not level_border_right[snapshot],
+ "border for a given snapshot already defined")
+ level_border_left[snapshot] = source.left[i][snapshot]
+ level_border_right[snapshot] = source.right[i][snapshot]
+ target.left[i] = level_border_left
+ target.right[i] = level_border_right
+ end
+end
+
+--
+-- Adapt existing borders with the borders of a group which will be
+-- placed on the right next to the existing borders. For each level
+-- and time in which the group has a border the borders on the right
+-- will be replaced with this border. If it is not existing in the old
+-- borders then also the left border will be adapted
+--
+-- @param borders The existing borders. These will be modified with
+-- the borders of
+--
+-- @param group_borders The borders of the group
+--
+-- @param snapshots All snapshots in which checking for distances is necessary.
+--
+local function adapt_borders(borders, group_borders, snapshots, ignore_dummies)
+ for level = 1, group_borders:getLevel() do
+ local l = borders.left[level] or {}
+ local r = borders.right[level] or {}
+ for _, s in pairs(snapshots) do
+ if ignore_dummies then
+ local gls,grs = group_borders.left[level][s], group_borders.right[level][s]
+ if gls~=nil then
+ if gls.kind~="dummy" then
+ l[s] = l[s] or gls
+ end
+ end
+ if grs~=nil then
+ if grs.kind~="dummy" then
+ r[s] = grs or r[s]
+ end
+ end
+ else
+ l[s] = l[s] or group_borders.left[level][s]
+ r[s] = group_borders.right[level][s] or r[s]
+ end
+
+ end
+ borders.left[level] = l
+ borders.right[level] = r
+ end
+
+end
+
+--
+-- Shift all vertices of a group and their descendants
+-- for a certain length into horizontal direction.
+--
+-- @param shift the length all involved vertices
+-- should be shifted in horizontal direction
+--
+--
+-- @param group A group of the spanning trees that should be shifted.
+-- A group entry has to map snapshots to root nodes
+--
+-- @param snapshots An array of at least all snapshots in which the group
+-- has a vertex
+--
+-- @param descendants A table or Storage storing the list of descendants
+-- for each vertex
+--
+-- @return the highest x-coordinate of vertices in the group after the shift.
+-- If there is no vertex which was shifted then -math.huge
+-- will be returned
+--
+local function shift_group(shift, group, snapshots, descendants)
+ assert(group,"no group passed")
+ assert(shift~=math.huge and shift ~=-math.huge,
+ "shift must be a valid finite length")
+ local shifted = {} -- remember which vertex was shifted during this run
+ local anchor = -math.huge
+ for _, s in ipairs(snapshots) do
+ local v = group[s]
+ if not shifted[v] and v then
+ v.pos.x = v.pos.x + shift
+ shifted[v] = true
+
+ -- also shift all descendants of the group vertex
+ for _, d in ipairs(descendants[v]) do
+ if not shifted[d] then
+ d.pos.x = d.pos.x + shift
+ shifted[d] = true
+ end
+ end
+ anchor = math.max(anchor, v.pos.x )
+ end
+ end
+ return anchor
+end
+
+--
+-- Traverse through the spanning tree |tree| of a snapshot and sort
+-- the child nodes into groups. A group summarizes for a given parent
+-- node all children node over time that are at the same child
+-- position. The k-th child group groups[i] maps each snapshot to the
+-- k-th node in the related snapshot.
+--
+--
+-- @field supergraph the supergraph
+--
+-- @field tree the tree or spanning tree to decide the indices of the
+-- child nodes
+--
+-- @field childgroups a Storage which contains the list of childgroups
+-- for each supernode
+--
+-- @field snapshot
+--
+local function precompute_childgroups(supergraph, tree, node, childgroups, snapshot)
+ local outgoings = tree:outgoing(node)
+ if #outgoings > 0 then
+ local supervertex = supergraph:getSupervertex(node)
+ local groups = childgroups[supervertex] or {}
+ for i, e in ipairs(outgoings) do
+
+ group = groups[i] or {}
+ assert(e.head, "no edge")
+ group[snapshot] = e.head
+ groups[i] = group
+ precompute_childgroups(supergraph, tree, e.head, childgroups, snapshot)
+ end
+ assert(supervertex, "no mv")
+ childgroups[supervertex] = groups
+ end
+end
+
+--
+-- Use this function to compute the horizontal positions of all
+-- vertices in a tree by accumulation of the relative shifts on the
+-- path from the root to the vertex recursively.
+--
+-- @param tree the tree in which the vertex's position should be
+-- computed.
+--
+-- @param vertex the next vertex that gets its absolute coordinate.
+--
+-- @param shifts a Storage, which stores for each node the relative
+-- shift between the vertex and its parent.
+--
+-- @param abs_shift the sum of all relative shifts on the path from
+-- the root to the vertex.
+--
+local function accumulate_hpos(tree, vertex, shifts, abs_shift)
+ local new_shift = abs_shift + shifts[vertex]
+ local test = vertex.pos.x
+ vertex.pos.x = new_shift
+-- if vertex.pos.x - test > 0.0001 then texio.write("X")end
+ local outgoings = tree:outgoing(vertex)
+ for _, e in ipairs(outgoings) do
+ accumulate_hpos(tree, e.head, shifts, new_shift)
+ end
+end
+
+
+local function get_next(border_pair, next)
+ local nl = next.left[border_pair.left]
+ local nr = next.right[border_pair.right]
+ assert ((nl and nr) or (not nl and not nr))
+ return {left = nl, right = nr,
+ }
+end
+
+local function add_shift(abs_shift, border_pair, next)
+ abs_shift.left = abs_shift.left + next.left_shift[border_pair.left]
+ abs_shift.right = abs_shift.right + next.right_shift[border_pair.right]
+end
+
+--
+-- Given a tree, computes the required distance between the i-th and the (i+1)-th subtree
+-- of the vertex |snapshot_vertex|.
+--
+-- @param shifts a Storage, which contains for each vertex the relative horizontal shift
+-- to its parent vertex.
+--
+function Skambath2016:computeRequiredDistance(tree, vertex, i, shifts, next)
+ local outgoings = tree:outgoing(vertex)
+-- texio.write("\n::"..vertex.name.. " "..i.."|"..(i+1))
+ if #outgoings > 0 then
+ local clumb = {left = outgoings[1].head,right = outgoings[i].head}
+ if clumb.right.kind=="dummy" then shifts[clumb.right] = 0 end
+ local v0 = outgoings[i].head
+ local v1 = outgoings[i+1].head
+ local shift = layered.ideal_sibling_distance(self.adjusted_bb, self.ugraph, v0, v1) + shifts[clumb.right]
+ local last0 = {left = clumb.left, right = clumb.right}
+ local last1 = {left = v1, right = v1}
+ local next0 = get_next(last0, next)
+ local next1 = get_next(last1, next)
+ local abs_shift0 = {left = shifts[clumb.left], right = shifts[clumb.right]}
+ local abs_shift1 = {left = 0, right = 0}
+
+ while (next0.left and next1.left) do
+ add_shift(abs_shift0, last0, next)
+ add_shift(abs_shift1, last1, next)
+
+ shift = math.max(shift,
+ layered.ideal_sibling_distance(self.adjusted_bb,
+ self.ugraph,
+ next0.right,
+ next1.left)
+ + abs_shift0.right - abs_shift1.left)
+-- texio.write("\n | "..(next0.right.name or "dummy").."<->"..(next1.left.name or "dummy").." :\t"..shift)
+ last0, last1 = next0, next1
+ next0 = get_next(next0, next)
+ next1 = get_next(next1, next)
+ end
+ return shift, {l0 = last0, l1 = last1, n0 = next0, n1 = next1,abs_shift1 = abs_shift1,abs_shift0=abs_shift0}
+ -- end
+ else
+ return 0
+ end
+end
+
+local function apply_shift(tree, vertex, i, shifts, next, border_ptr, shift)
+ local outgoings = tree:outgoing(vertex)
+-- texio.write("\n" .. (vertex.name or "dummy")..": ".. shift )
+ if #outgoings >= (i+1) then
+ assert(border_ptr, "unexpected error")
+ local last0 = border_ptr.l0
+ local last1 = border_ptr.l1
+ local next0 = border_ptr.n0
+ local next1 = border_ptr.n1
+ local abs0 = border_ptr.abs_shift0
+ local abs1 = border_ptr.abs_shift1
+ local vbase = outgoings[1].head -- before centering the 1st vertex is at x=0
+ local v0 = outgoings[i].head
+ local v1 = outgoings[i+1].head
+ if v0.kind=="dummy" then shifts[v0] = 0 end
+ shifts[v1] = shifts[vbase] + shift
+ if next0.left then
+ assert(next0.right and next0.left, "failA")
+ -- pointer from T_i to T_{i+0}
+ next.right[last1.right] = next0.right
+ next.right_shift[last1.right] = - shift - abs1.right + (abs0.right + next.right_shift[last0.right])
+ elseif next1.right then
+ assert(next1.right and next1.left, "")
+ -- pointer from T_{i+0} to T_i
+ -- texio.write(last0.left .." -> " ..next1.left)
+ next.left[last0.left] = next1.left
+-- pgf.debug{last0,abs0,abs1,last1}
+ next.left_shift[last0.left] = shift - abs0.left + (abs1.left + next.left_shift[last1.left] )
+
+ else
+ -- both trees have the same height
+ end
+ end
+end
+
+-- Implementation
+
+function Skambath2016:run()
+ local layers = Storage.new()
+ local descendants = Storage.new()
+ local childgroups = Storage.new()
+
+ local phases = self.digraph.options.algorithm_phases
+
+ local so_class = phases['supergraph optimization']
+ local ga_class = phases['evolving graph animation']
+ local cr_class = phases['temporal cycle removal']
+
+ self.extended_version = self.digraph.options['missing nodes get space']
+ self.supergraph = Supergraph.generateSupergraph(self.digraph)
+ local supergraph_original = Supergraph.generateSupergraph(self.digraph)
+
+ -- optimize graph by splitting nodes by trivial criteria
+ so_class.new {
+ main_algorithm = self,
+ supergraph = self.supergraph,
+ digraph = self.digraph,
+ ugraph = self.ugraph
+ }:run()
+
+
+ self:precomputeSpanningTrees()
+
+ -- Resolve cyclic dependencies if exists.
+ cr_class.new {
+ main_algorithm = self,
+ supergraph = self.supergraph,
+ digraph = self.digraph,
+ }:run()
+
+
+
+ self:precomputeDescendants(layers, descendants)
+ self:precomputeChildgroups(childgroups)
+
+ self:computeHorizontalLayout(childgroups, descendants)
+-- self:computeHorizontalLayoutFast()
+
+ -- vertical positions
+ tlayered.arrange_layers_by_baselines(layers,
+ self.adjusted_bb,
+ self.ugraph,
+ self.supergraph.snapshots,
+ self.supergraph.vertex_snapshots)
+
+ -- animate graph
+ ga_class.new {
+ main_algorithm = self,
+ supergraph = supergraph_original,
+ digraph = self.digraph,
+ ugraph = self.ugraph
+ }:run()
+end
+
+--
+-- Compute the required shift value for a second tree to guarantee
+-- a required node distance.
+-- @field right_borders The Border data structure for the right border of
+-- the left tree
+-- @field left_borders The Border data structure for the left border of
+-- the right tree
+-- @field selected_snapshots if you set this value with an array of snapshots
+-- only the predefined snapshots are used in the border
+-- computation.
+--
+function Skambath2016:computeMinShift(right_borders, left_borders, selected_snapshots)
+ local shift = -math.huge
+ local max_level = math.min(#right_borders, #left_borders)
+ local first_shift = 0
+ local snapshots = selected_snapshots or self.supergraph.snapshots
+
+ for layer = 1, max_level do
+ local rb, lb = right_borders[layer], left_borders[layer]
+ for _,s in ipairs(snapshots) do
+
+ local v1,v2 = rb[s],lb[s]
+ if v1 and v2 then
+ local local_shift = layered.ideal_sibling_distance(self.adjusted_bb, self.ugraph, v1, v2) + v1.pos.x - v2.pos.x
+ shift = math.max(shift, local_shift)
+ end
+ end
+ if layer == 1 then
+ first_shift = shift
+ end
+ end
+
+ local is_significant = false
+
+ if max_level > 1 and shift<=first_shift then
+ -- if the necessary shift of the subtrees
+ -- is the minimum required shift between two
+ -- nodes than a node is significant
+ is_significant = true
+ end
+
+ if shift <= -math.huge then
+ shift = 0
+ end
+
+ if is_significant then
+ shift = shift + self.ugraph.options['significant sep']
+ end
+
+ return shift
+end
+
+
+--
+-- The main algorithm: This method computes the layout for each vertex.
+-- For this all supervertices are visited in a topological order to their dependency.
+-- If a . This requires the supergraph to be acyclic. If this is not the case
+-- the calling process has to remove all cycles otherwise the x-coordinate will
+-- not be computed for every vertex.
+--
+function Skambath2016:computeHorizontalLayout(groups, descendants)
+ local subtree_borders = Storage.new()
+ local dep_counter = {}
+ local visited = {}
+ local queue = PriorityQueue.new()
+ local dependency_graph = Digraph.new()
+ for _, vertex in ipairs(self.supergraph.vertices) do
+ dep_counter[vertex] = 0
+ dependency_graph:add {vertex}
+ end
+
+ -- 1. Initialize Dependencies
+
+ for _, snapshot in ipairs(self.supergraph.snapshots) do
+ for _, spanning_tree in ipairs(snapshot.spanning_trees) do
+ for _, arc in ipairs(spanning_tree.arcs) do
+
+ local head = self.supergraph:getSupervertex(arc.head)
+ local tail = self.supergraph:getSupervertex(arc.tail)
+
+ if(head and tail) then
+ if not dependency_graph:arc(tail, head) then
+ dependency_graph:connect(tail, head)
+ dep_counter[tail] = dep_counter[tail] + 1
+ end
+ end
+ end
+ end
+ end
+
+ -- 2. Find independent vertices
+ for _, vertex in ipairs(dependency_graph.vertices) do
+ local outgoings = dependency_graph:outgoing(vertex)
+ if #outgoings == 0 then
+ queue:enqueue(vertex, 1)
+ end
+ end
+
+ -- 2.
+ while not queue:isEmpty() do
+ local vertex = queue:dequeue()
+ local vertex_snapshots = self.supergraph:getSnapshots(vertex)
+
+ -- a. Resolve dependencies on this vertex:
+ local incomings = dependency_graph:incoming(vertex)
+ for _, e in ipairs(incomings) do
+ dep_counter[e.tail] = dep_counter[e.tail] - 1
+ if dep_counter[e.tail] == 0 then
+ queue:enqueue(e.tail, 1)
+ end
+ end
+
+ -- b. Compute borders of this supervertex:
+ local vertex_borders = Borders.new()
+ for _, s in ipairs(vertex_snapshots) do
+ local snapshot_vertex = self.supergraph:getSnapshotVertex(vertex, s)
+ vertex_borders:addBoth(1, s, snapshot_vertex)
+ snapshot_vertex.pos.x = 0
+ snapshot_vertex.pos.y = 0
+ end
+
+ local vertex_groups = groups[vertex]
+ local last_pos_x = 0
+ if vertex_groups then
+ -- c. Compute borders of groups:
+ local all_group_borders = {}
+ for i, group in ipairs(vertex_groups) do
+ local group_boders = Borders.new()
+ for _,s in ipairs(vertex_snapshots) do
+ local child = group[s]
+ if child then
+ local child_borders
+ if not (child.kind == "dummy") then
+ local superchild = self.supergraph:getSupervertex(child)
+ child_borders = subtree_borders[superchild] or Borders.new()
+ else
+ child_borders = Borders.new()
+ child_borders:addBoth(1, s, child)
+ end
+ assert(child.pos~=math.huge, "invalid child pos")
+ shift_group(-child.pos.x,{[s]=child},{[1]=s}, descendants)
+ Borders.copyBordersAtSnapshot(child_borders, group_boders, s)
+ end
+ end
+ all_group_borders[i] = group_boders
+ end
+
+ -- d. Place groups and merge borders of groups:
+ local last_group = nil
+ last_pos_x = 0
+ local merged_borders = Borders.new()
+ local final_borders = Borders.new()
+ for i, group in ipairs(vertex_groups) do
+ local group_borders = all_group_borders[i]
+ if last_group_borders then
+ -- i. compute minimal shift
+
+ local shift
+ shift = self:computeMinShift(merged_borders.right, group_borders.left)
+
+
+ assert(shift ~= math.huge and shift~=-math.huge, "invalid shift")
+
+ -- ii. shift group
+ local anchor = shift_group(shift, group,vertex_snapshots, descendants)
+ last_pos_x = anchor
+ end
+ last_group_borders = group_borders
+
+ -- iii. adapt borders
+ adapt_borders(merged_borders,
+ group_borders,
+ self.supergraph.snapshots)
+ adapt_borders(final_borders,
+ group_borders,
+ self.supergraph.snapshots,
+ not self.extended_version)
+ end -- for (group)
+ vertex_borders:appendBelow(1, final_borders)
+ end
+ -- e. store borders:
+ assert(last_pos_x~=math.huge and last_pos_x~=-math.huge, "invalid position")
+ local x = ((last_pos_x) - 0)/2 + 0
+ assert(x~=math.huge and x~=-math.huge, "invalid position")
+ for _,s in ipairs(vertex_snapshots) do
+ local snapshot_vertex = self.supergraph:getSnapshotVertex(vertex, s)
+ snapshot_vertex.pos.x = x
+ end
+
+ subtree_borders[vertex] = vertex_borders
+ end
+
+ -- align roots
+ for _, s in ipairs(self.supergraph.snapshots) do
+ local lastroot
+ local rborder
+ for i, spanning_tree in ipairs(s.spanning_trees) do
+ local root = spanning_tree.root
+ local rootborders = subtree_borders[self.supergraph:getSupervertex(root)]
+ shift_group(-root.pos.x,{[s]=root},{[1]=s}, descendants)
+ if i>1 then
+ local l = subtree_borders[self.supergraph:getSupervertex(lastroot)]
+ local r = rootborders
+ shift = math.max(self:computeMinShift(l.right, r.left, {[1]=s}),
+ self:computeMinShift(rborder.right,r.left, {[1]=s}))
+ shift_group(shift,{[s]=root},{[1]=s}, descendants)
+ else
+ rborder = Borders.new()
+ end
+ adapt_borders(rborder,rootborders,self.supergraph.snapshots,false)
+ lastroot = root
+ end
+ end
+end
+
+--
+-- The main algorithm: This method computes the layout for each vertex.
+-- For this all supervertices are visited in a topological order to their dependency.
+-- If a . This requires the supergraph to be acyclic. If this is not the case
+-- the calling process has to remove all cycles otherwise the x-coordinate will
+-- not be computed for every vertex.
+--
+function Skambath2016:computeHorizontalLayoutFast()
+ local all_trees = Storage.new()
+ local dep_counter = {}
+ local visited = {}
+ local queue = PriorityQueue.new()
+ local dependency_graph = Digraph.new()
+ local shifts = Storage.new()
+ local next = Storage.new()
+ for _, vertex in ipairs(self.supergraph.vertices) do
+ dep_counter[vertex] = 0
+ dependency_graph:add {vertex}
+ end
+
+
+ -- I. Initialize Dependencies (Build Dependency Graph)
+ for _, snapshot in ipairs(self.supergraph.snapshots) do
+ for _, spanning_tree in ipairs(snapshot.spanning_trees) do
+ table.insert(all_trees, spanning_tree)
+ shifts[spanning_tree] = Storage.new()
+ next[spanning_tree] = {left= Storage.new(),
+ right= Storage.new(),
+ left_shift = Storage.new(),
+ right_shift = Storage.new()
+ }
+
+ for _, arc in ipairs(spanning_tree.arcs) do
+ local head = self.supergraph:getSupervertex(arc.head)
+ local tail = self.supergraph:getSupervertex(arc.tail)
+
+ if(head and tail) then
+ if not dependency_graph:arc(tail, head) then
+ dependency_graph:connect(tail, head)
+ dep_counter[tail] = dep_counter[tail] + 1
+ end
+ end
+ end
+ end
+ end
+
+ -- II. Visit vertices in topological ordering
+ -- Find independent vertices
+ for _, vertex in ipairs(dependency_graph.vertices) do
+ local outgoings = dependency_graph:outgoing(vertex)
+ if #outgoings == 0 then
+ queue:enqueue(vertex, 1)
+ end
+ end
+
+ while not queue:isEmpty() do
+ -- Next node in topological order
+ local vertex = queue:dequeue()
+-- texio.write("\n\n --- "..vertex.name .. " ---")
+ --pgf.debug{next}
+ local vertex_snapshots = self.supergraph:getSnapshots(vertex)
+
+ -- a. Resolve dependencies on this vertex:
+ local incomings = dependency_graph:incoming(vertex)
+ for _, e in ipairs(incomings) do
+ dep_counter[e.tail] = dep_counter[e.tail] - 1
+ if dep_counter[e.tail] == 0 then
+ queue:enqueue(e.tail, 1)
+ end
+ end
+
+ -- b. Compute maximum number of children over time:
+ local num_children = 0
+ for _, s in ipairs(vertex_snapshots) do
+ local v = self.supergraph:getSnapshotVertex(vertex, s)
+ local tree = s.spanning_trees[1]
+ num_children = math.max(num_children, #(tree:outgoing(v)))
+ shifts[tree][v] = 0
+ end
+
+ -- c. Shift all subtrees in all snapshots:
+ local hlp_ptr = Storage.new()
+ local max_shift = 0
+ for i = 1, (num_children - 1) do
+ -- i) Compute the necessary shift between the i-th and (i+1)-th subtrees (per snapshot):
+ local min_shift = 0
+ for t, s in ipairs(vertex_snapshots) do
+ local snapshot_vertex = self.supergraph:getSnapshotVertex(vertex, s)
+ local tree = s.spanning_trees[1]
+ local req_shift, hptr
+ req_shift, hptr = self:computeRequiredDistance(tree,
+ snapshot_vertex,
+ i,
+ shifts[tree],
+ next[tree]
+ )
+ hlp_ptr[t] = hptr
+-- texio.write(" -> \t"..req_shift)
+ min_shift = math.max(min_shift, req_shift)
+ end
+
+-- texio.write("\n \t\t".. min_shift )
+
+ -- ii) Synchronize distance between neighbored subtrees and apply shifts
+ for t, s in ipairs(vertex_snapshots) do
+ local snapshot_vertex = self.supergraph:getSnapshotVertex(vertex, s)
+ local tree = s.spanning_trees[1]
+ apply_shift(tree, snapshot_vertex, i, shifts[tree], next[tree], hlp_ptr[t], min_shift)
+ end
+
+ max_shift = min_shift
+ end
+
+ for t, s in ipairs(vertex_snapshots) do
+ local snapshot_vertex = self.supergraph:getSnapshotVertex(vertex, s)
+ local tree = s.spanning_trees[1]
+ local outgoings = tree:outgoing(snapshot_vertex)
+
+-- next[tree].left[snapshot_vertex] = outgoings[1].head
+
+
+ for i = 1,#outgoings do
+ if i==1 then
+ next[tree].left_shift[snapshot_vertex] = - max_shift / 2
+ next[tree].left[snapshot_vertex]= outgoings[i].head
+ end
+ shifts[tree][outgoings[i].head] = shifts[tree][outgoings[i].head] - max_shift / 2
+ next[tree].right[snapshot_vertex] = outgoings[i].head
+ next[tree].right_shift[snapshot_vertex] = shifts[tree][outgoings[i].head]
+ end
+
+ end
+
+ end -- end while (all vertices have been processed)
+
+ -- III. Accumulate absolute horizontal coordinates
+ for _, tree in ipairs(all_trees) do
+ accumulate_hpos(tree, tree.root, shifts[tree], 0)
+ end
+end
+
+
+
+
+function Skambath2016:precomputeTreeDescendants(tree, node, depth, layers, descendants)
+ local my_descendants = { node }
+
+ for _,arc in ipairs(tree:outgoing(node)) do
+ local head = arc.head
+ self:precomputeTreeDescendants(tree, head, depth+1, layers, descendants)
+ for _,d in ipairs(descendants[head]) do
+ my_descendants[#my_descendants + 1] = d
+ end
+ end
+ layers[node] = depth
+ descendants[node] = my_descendants
+end
+
+function Skambath2016:precomputeDescendants(layers, descendants)
+ for _,snapshot in ipairs(self.supergraph.snapshots) do
+ for _, spanning_tree in ipairs(snapshot.spanning_trees) do
+ self:precomputeTreeDescendants(spanning_tree, spanning_tree.root, 1, layers, descendants)
+ end
+ end
+end
+
+
+--
+--
+--
+function Skambath2016:precomputeChildgroups(childgroups)
+ for _,s in ipairs(self.supergraph.snapshots) do
+ for _,spanning_tree in ipairs(s.spanning_trees) do
+ precompute_childgroups(self.supergraph, spanning_tree, spanning_tree.root, childgroups, s)
+ end
+ end
+end
+
+--
+-- Compute a for each connected component of each
+-- snapshot and appends the result for a snapshot s to
+-- the array s.spanning_trees.
+--
+function Skambath2016:precomputeSpanningTrees()
+ local events = assert(self.scope.events,
+ "no events found for the spanning tree computation")
+
+ for i, s in ipairs(self.supergraph.snapshots) do
+ -- The involved snapshot graph:
+ local s_copy = Digraph.new(s)
+ for _,a in ipairs(s.arcs) do
+ local new_a = s_copy:connect(a.tail,a.head)
+ new_a.syntactic_edges = a.syntactic_edges
+ end
+ s.spanning_trees = s.spanning_trees or {}
+ -- Step 1: Decompose the snapshot into its connected components
+ local syntactic_components = LayoutPipeline.decompose(s_copy)
+ for i, syntactic_component in ipairs (syntactic_components) do
+ local tree = SpanningTreeComputation.computeSpanningTree(syntactic_component, true, events)
+ s.spanning_trees[i] = tree
+ end
+ end
+end
+
+return Skambath2016
+
+
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Supergraph.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Supergraph.lua
new file mode 100644
index 0000000000..99e79919b5
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/Supergraph.lua
@@ -0,0 +1,571 @@
+-- Copyright 2015 by Malte Skambath
+--
+-- This file may be distributed an/or modified
+--
+-- 1. under the LaTeX Project Public License and/or
+-- 2. under the GNU Public License
+--
+
+-- Imports
+local lib = require "pgf.gd.lib"
+
+local Vertex = require "pgf.gd.model.Vertex"
+local Digraph = require "pgf.gd.model.Digraph"
+local Storage = require "pgf.gd.lib.Storage"
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+---
+-- Each |Supergraph| instance is a |Digraph| instance which represents
+-- the graph by union operation on all graphs G_i of an evolving graph
+-- $G=(G_1, G_2, \dots, G_n)$. Additional to that all references to
+-- the snapshot-graphs are shared such that is possible to get access
+-- to all vertices for each snapshot graph in a sequence. A vertex of
+-- an evolving graph may exists at different times, thus in in
+-- different snapshots. Each vertex will be a vertex in the supergraph
+-- and if there is a single snapshot in which two vertices are
+-- connected by an edge they are connected in the supergraph.
+--
+-- Note that in \tikzname\ a \emph{node} is more than a single dot. A node
+-- has a content and different properties like background-color or a
+-- shape. Formally this can be modeled by function mapping vertices
+-- to their properties. For evolving graphs this could be done in the
+-- same way. As this is difficult to be realized in PGF because there
+-- is no basic support for time dependent properties on nodes, each
+-- vertex will be displayed over time by different single
+-- (snapshot-)nodes which can have different visual properties. This
+-- means for a vertex which we call |supervertex| in the following we
+-- will have a (snapshot-)node for each time stamp.
+--
+-- \medskip
+-- \noindent\emph{Snapshots.}
+-- Since an evolving graph is a sequence of different snapshot-graphs
+-- $G_i$ each snapshot is assigned to a time
+--
+--
+-- @field vertex_snapshots This storage maps each pgf-node to the snapshots
+-- in which they are visible.
+--
+-- @field supervertices This storage maps each pgf-node to its supervertex
+-- which represents all pgf-vertices assigned to the same node
+--
+-- @field supervertices_by_id This storage maps a node identifier to the
+-- related supervertex such that PGF-nodes which belonging to
+-- the same superverticex can be identified
+--
+-- @field snapshots An array of all snapshots. Sorted in ascending order
+-- over the timestamps of the snapshots.
+--
+-- @field arc_snapshots A table storing all snapshots of a supervertex in which
+-- the related nodes are connected. Using a snapshot as key you can check
+-- if a given snapshot is in the array.
+--
+-- Assume we want to iterate over all snapshots
+-- for a certain pair of supernodes in which they are connected
+-- by an arc. The arc_snapshots storage helps in this case:
+-- %
+-- \begin{codeexample}[code only, tikz syntax=false]
+-- local supergraph = Supergraph.generateSupergraph(self.digraph)
+-- local u = supergraph.vertices[1]
+-- local v = supergraph.vertices[2]
+--
+-- local snapshots = supergraph.arc_snapshots[supergraph:arc(u, v)]
+-- for _, snapshot in ipairs(snapshots) do
+-- do_something(snapshot)
+-- end
+-- \end{codeexample}
+--
+local Supergraph = lib.class { base_class = Digraph }
+
+-- Namespace
+--require("pgf.gd.experimental.evolving").Supergraph = Supergraph
+
+Supergraph.__index =
+ function (t, k)
+ if k == "arcs" then
+ return Digraph.__index(t,k)
+ else
+ return rawget(Supergraph, k) or rawget(Digraph, k)
+ end
+ end
+
+function Supergraph.new(initial)
+ local supergraph = Digraph.new(initial)
+ setmetatable(supergraph, Supergraph)
+
+ supergraph.vertex_snapshots = Storage.new()
+ supergraph.supervertices = Storage.new()
+ supergraph.supervertices_by_id = {}
+ supergraph.arc_snapshots = Storage.newTableStorage()
+
+ return supergraph
+
+end
+
+
+local get_snapshot
+
+---
+-- Generate or extract a snapshot instance for a given snapshot time.
+--
+-- @param snapshots An array of all existing snapshots
+-- @param timestamps A table which maps known timestamps to their
+-- related snapshots
+-- @param ugraph The ugraph of the underlying graph structure
+-- @param snapshot_time
+--
+-- @return The snapshot instance found in the snapshots array for the
+-- wanted timestamp snapshot_time if it doesn't exists a new snapshot
+-- will be generated and added to the arrays
+--
+function get_snapshot(snapshots, timestamps, ugraph, snapshot_time)
+ local snapshot
+ local snapshot_idx = timestamps[snapshot_time]
+
+ if not snapshot_idx then
+ -- store snapshot if it doesn't exists
+ snapshot_idx = timestamps.n + 1
+ timestamps[snapshot_time] = snapshot_idx
+ timestamps.n = timestamps.n + 1
+ snapshot = Digraph.new {
+ syntactic_digraph = ugraph.syntactic_digraph,
+ options = ugraph.options
+ }
+ snapshot.timestamp = snapshot_time
+ snapshots[snapshot_idx] = snapshot
+ else
+ snapshot = snapshots[snapshot_idx]
+ end
+ assert(snapshot~=nil, "an unexpected error occurred")
+ return snapshot
+end
+
+
+---
+-- Generate a new supergraph to describe the whole evolving graph by
+-- collecting all temporal information from the digraph and the node
+-- options. All nodes in the |digraph| require a |snapshot| and
+-- a |supernode| option. To identify a (snapshot-)node with its
+-- supernode and snapshot.
+--
+-- @param digraph
+--
+-- @return The supergraph which is a |Digraph| that has a supervertex
+-- for each set of snapshot-vertices with the same |supernode|
+-- attribute.
+--
+function Supergraph.generateSupergraph(digraph)
+ local new_supergraph
+ new_supergraph = Supergraph.new {
+ syntactic_digraph = digraph.syntactic_digraph,
+ options = digraph.options,
+ digraph = digraph,
+ }
+
+ -- array to store the supervertices for a given vertex name
+ local local_snapshots = {} -- array to store each snapshot graphs
+
+ local timestamps = { n = 0 } -- set of snapshot times
+
+ -- separate and assign vertices to their snapshots and supervertices
+ for i,vertex in ipairs(digraph.vertices) do
+ local snapshot_time = assert(vertex.options["snapshot"], "Missing option 'snapshot' for vertex ".. vertex.name ..". ")
+ local supernode_name = assert(vertex.options["supernode"], "Missing option 'supernode' for vertex"..vertex.name..". ")
+
+ local snapshot = get_snapshot(local_snapshots, timestamps, digraph, snapshot_time)
+ local supervertex = new_supergraph.supervertices_by_id[supernode_name]
+
+ if not supervertex then
+ -- first appearance of the supernode id
+ supervertex = Vertex.new {
+ kind = "super",
+ name = supernode_name
+ }
+ supervertex.snapshots = {}
+ supervertex.subvertex = {}
+ new_supergraph.supervertices_by_id[supernode_name] = supervertex
+ new_supergraph:add{supervertex}
+
+ supervertex.options = {}
+ supervertex.options = vertex.options
+ end
+
+ snapshot:add{vertex}
+
+ new_supergraph.supervertices[vertex] = supervertex
+ new_supergraph.vertex_snapshots[vertex] = snapshot
+ new_supergraph:addSnapshotVertex(supervertex, snapshot, vertex)
+ end
+
+ -- Create edges
+ for i, e in ipairs(digraph.arcs) do
+ local u,v = e.tail, e.head
+ local snapshot_tail = new_supergraph.vertex_snapshots[e.tail]
+ local snapshot_head = new_supergraph.vertex_snapshots[e.head]
+
+ assert(snapshot_head == snapshot_tail, "Arcs must connect nodes that exist at the same time.")
+
+ -- connect in the snapshot graph
+ local arc = snapshot_tail:connect(u,v)
+
+ -- connect in the supergraph:
+ local super_tail = new_supergraph.supervertices[u]
+ local super_head = new_supergraph.supervertices[v]
+
+ new_supergraph:assignToSuperarc(super_tail, super_head, snapshot_tail)
+ end
+
+ -- snapshots in temporal order
+ table.sort(local_snapshots,
+ function(s1,s2)
+ return s1.timestamp < s2.timestamp
+ end )
+
+ local previous_snapshot
+
+ for i,s in ipairs(local_snapshots) do
+ local start = -math.huge
+ if previous_snapshot then
+ start = (s.timestamp - previous_snapshot.timestamp) / 2 + previous_snapshot.timestamp
+ previous_snapshot.interval.to = start
+ end
+ s.interval = { from = start , to = math.huge }
+ previous_snapshot = s
+ end
+
+ new_supergraph.snapshots = local_snapshots
+ new_supergraph.snapshots_indices = Storage.new()
+
+ for i, s in ipairs(new_supergraph.snapshots) do
+ new_supergraph.snapshots_indices[s] = i
+ end
+
+ return new_supergraph
+end
+
+
+function Supergraph:getSnapshotStaticDuration(snapshot)
+ assert(snapshot, "a snapshot as parameter expected, but got nil")
+ local idur = snapshot.interval.to - snapshot.interval.from
+ assert(idur, "unexpected nil-value")
+ local d1 = snapshot.interval.to - snapshot.timestamp
+ local d2 = snapshot.timestamp - snapshot.interval.from
+ local dm = math.min(d1,d2)
+ if (idur >= math.huge and dm < math.huge) then
+ return dm -- [-\infty,t] or [t,\infty]
+ elseif idur >= math.huge then
+ return 0 -- only one snapshot [-\infty,\infty]
+ else
+ return d1 + d2 -- [t_1, t_2]
+ end
+end
+
+---
+-- Get the durations of the graph in which snapshots are given which is exactly
+-- the time between the first and the last defined snapshot
+--
+-- @return The time between the last and first snapshot in seconds
+function Supergraph:getDuration()
+ local first_snapshot = self.snapshots[1]
+ local last_snapshot = self.snapshots[#self.snapshots]
+ return last_snapshot.timestamp - first_snapshot.timestamp
+end
+
+---
+--
+-- @return The ratio of the time of a snapshot related to the global duration of the whole
+-- evolving trees. (The time between the last and first snapshot)
+function Supergraph:getSnapshotRelativeDuration(snapshot)
+ if self:getDuration() == 0 then
+ return 1
+ else
+ return self:getSnapshotStaticDuration(snapshot) / self:getDuration()
+ end
+end
+
+---
+-- Give the supervertex for a certain pgf-vertex (vertex of a snapshot)
+--
+-- @param vertex A vertex of a snapshot.
+--
+-- @return A supervertex in the supergraph for the given vertex, nil if no
+-- supervertex was assigned before.
+--
+function Supergraph:getSupervertex(vertex)
+ assert(vertex, "vertex required")
+ assert(self.supervertices, "supervertex table is not defined")
+ return self.supervertices[vertex]
+end
+
+function Supergraph:getSuperarc(arc)
+ local superhead = self:getSupervertex(arc.head)
+ local supertail = self:getSupervertex(arc.tail)
+ local arc = assert(self:arc(supertail, superhead),"unexpected problem")
+ return arc
+end
+
+function Supergraph:getSnapshots(supervertex)
+ return supervertex.snapshots
+end
+
+---
+-- Find the snapshot-instance for a given pgf-vertex
+-- (which is a vertex for one certain snapshot)
+--
+-- @param vertex A vertex for which you want to get the related snapshot
+--
+-- @return The snapshot which contains the given vertex as vertex.
+function Supergraph:getSnapshot(vertex)
+ return self.vertex_snapshots[vertex]
+end
+
+---
+-- For a given supervertex get the related vertex for a snapshot
+--
+-- @param supervertex
+--
+-- @param snapshot
+--
+-- @return The vertex of the supervertex at the specified snapshot
+--
+function Supergraph:getSnapshotVertex(supervertex, snapshot)
+ assert(supervertex, "supervertex must not be nil")
+ assert(snapshot, "snapshot must not be nil")
+ return supervertex.subvertex[snapshot]
+end
+
+
+function Supergraph:consecutiveSnapshots(snapshot1, snapshot2, n)
+ assert(snapshot1 and snapshot2, "no snapshot passed")
+ local idx1 = self.snapshots_indices[snapshot1] --or -1
+ local idx2 = self.snapshots_indices[snapshot2] --or -1
+ local d = n or 1
+
+ return (idx2-idx1 <= d) or (idx1-idx2 <= d)
+end
+
+function Supergraph:consecutive(vertex1, vertex2, n)
+ local s1 = self:getSnapshot(vertex1)
+ local s2 = self:getSnapshot(vertex2)
+ return self:consecutiveSnapshots(s1, s2, n)
+end
+
+---
+-- Write pack all position information to the nodes of each snapshot
+-- such that all nodes with the same supervertex have the same position
+--
+-- @param ugraph An undirected graph for which the vertices should get
+-- their positions from the supergraph.
+--
+function Supergraph:sharePositions(ugraph, ignore)
+
+ for _,vertex in ipairs(ugraph.vertices) do
+ if not ignore then
+ vertex.pos.x = self.supervertices[vertex].pos.x
+ vertex.pos.y = self.supervertices[vertex].pos.y
+ else
+ if not ignore.x then
+ vertex.pos.x = self.supervertices[vertex].pos.x
+ end
+ if not ignore.y then
+ vertex.pos.y = self.supervertices[vertex].pos.y
+ end
+ end
+
+
+ end
+end
+
+function Supergraph:onAllSnapshotvertices(f, ugraph)
+ for _,vertex in ipairs(ugraph.vertices) do
+ local snapshot_vertex = self.supertvertices[vertex]
+ if snapshot_vertex then
+ f(vertex, snapshot_vertex)
+ end
+ end
+end
+
+---
+-- Split a supervertex into new supervertices such that
+-- for a given snapshot there is a new pseudo-supervertex.
+-- This pseudo-supervertex will be assigned to all snapshots
+-- after the given snapshot.
+-- All snapshots of a new pseudo-supervertex are removed from
+-- the original vertex.
+-- If a supervertex has no subvertices then it will not be added to the graph.
+--
+-- @param supervertex The supervertex which should be split.
+--
+-- @param snapshots An array of snapshots at which the supervertex
+-- should be split into a new one with the corresponding pgf-vertices.
+-- If there are more than one snapshots passed to the function
+-- for each snapshot there will be a new pseudo-vertex
+--
+function Supergraph:splitSupervertex(supervertex, snapshots)
+ assert(supervertex, "no supervertex defined")
+ -- snapshots in temporal order
+ table.sort(snapshots,
+ function(s1,s2)
+ return s1.timestamp < s2.timestamp
+ end )
+
+ assert(#snapshots~=0)
+
+ local edit_snapshots = supervertex.snapshots
+ local first_removed = math.huge
+ local rem_arcs = {}
+ for i = 1, #snapshots do
+ local s_first = self.snapshots_indices[snapshots[i]]
+ first_removed = math.min(s_first,first_removed)
+ local s_last
+ if i==#snapshots then
+ s_last = #self.snapshots
+ else
+ s_last = self.snapshots_indices[snapshots[i+1]]-1
+ end
+
+ local pseudovertex = Vertex.new {
+ kind = "super",
+ name = supervertex.name.."*"..i,
+ subvertex = {},
+ snapshots = {}
+ }
+
+ local has_subvertices = false
+
+ for j = s_first, s_last do
+ local s = self.snapshots[j]
+ local vertex = self:getSnapshotVertex(supervertex, s)
+ if vertex then
+ self.supervertices[vertex] = pseudovertex
+ self:addSnapshotVertex(pseudovertex, s, vertex)
+ self:removeSnapshotVertex(supervertex, s)
+
+ if not has_subvertices then
+ has_subvertices = true
+ self:add{pseudovertex}
+ end
+
+ -- update edges:
+ local incoming = self.digraph:incoming(vertex)
+ local outgoing = self.digraph:outgoing(vertex)
+
+ for _, arc in ipairs(incoming) do
+ local tail = self.supervertices[arc.tail]
+ local head = self.supervertices[arc.head]
+ self:assignToSuperarc(tail, pseudovertex, s)
+
+ local super_arc = self:arc(tail, supervertex)
+ if not rem_arcs[super_arc] then
+ table.insert(rem_arcs, {arc = super_arc, snapshot = s})
+ rem_arcs[super_arc] = true
+ end
+ end
+
+ for _, arc in ipairs(outgoing) do
+ local tail = self.supervertices[arc.tail]
+ local head = self.supervertices[arc.head]
+ self:assignToSuperarc(pseudovertex, head, s)
+
+ local super_arc = self:arc(supervertex, head)
+ if not rem_arcs[super_arc] then
+ table.insert(rem_arcs, {arc = super_arc, snapshot = s})
+ rem_arcs[super_arc] = true
+ end
+ end
+ end
+ end
+ end
+
+ if first_removed ~= math.huge then
+ for _, removed_arc in ipairs(rem_arcs) do
+ local snapshots = self.arc_snapshots[removed_arc.arc]
+ for i=#snapshots,1,-1 do
+ local s = snapshots[i]
+ if s.timestamp >= removed_arc.snapshot.timestamp then
+ table.remove(snapshots, i)
+ end
+ end
+
+ if #snapshots==0 then
+ self:disconnect(removed_arc.arc.tail, removed_arc.arc.head)
+ end
+ end
+ end
+end
+
+-- function Supergraph:reloadArcSnapshots()
+-- for _, arc in ipairs(self.digraph.arcs) do
+-- local snapshot = self:getSnapshot(arc.head)
+-- local superarc = self:getSuperarc(arc)
+-- texio.write("\n"..arc.tail.name..">"..arc.head.name)
+-- self.arc_snapshots[superarc] = snapshot
+-- end
+-- end
+
+---
+-- Remove the binding of a vertex at a certain snapshot from its assigned
+-- supervertex.
+-- This requires time $O(n)$ where $n$ is the number of nodes actually
+-- assigned to the supervertex.
+function Supergraph:removeSnapshotVertex(supervertex, snapshot)
+ assert(supervertex and snapshot,"missing argument: the supervertex and snapshot must not be nil")
+
+ -- remove reference to snapshot
+ for i = #supervertex.snapshots,1,-1 do
+ if supervertex.snapshots[i] == snapshot then
+ table.remove(supervertex.snapshots, i)
+ end
+ end
+ -- remove vertex at snapshot
+ supervertex.subvertex[snapshot] = nil
+end
+
+---
+-- Assign a vertex to a snapshot vertex of this supergraph.
+-- This requires time $O(1)$
+-- @param supervertex
+--
+-- @param snapshot
+--
+-- @param vertex The vertex which should be assigned to the supervertex
+-- for the given snapshot.
+--
+function Supergraph:addSnapshotVertex(supervertex, snapshot, vertex)
+ supervertex.subvertex[snapshot] = vertex
+ table.insert(supervertex.snapshots, snapshot)
+end
+
+---
+-- Assign a given snapshot to the superarc between two supernodes.
+-- If still no arc between those nodes exists a new edges will
+-- be created.
+-- This requires time $O(n)$ where $n$ is the number of snapshots already
+-- assigned to the given arc.
+--
+-- @param super_tail The tail of the directed arc in the supergraph.
+--
+-- @param super_head The head of the directed arc in the supergraph.
+--
+-- @param snapshot A snapshot in which both nodes are connected.
+--
+-- @return The arc which was created or updated.
+--
+function Supergraph:assignToSuperarc(super_tail, super_head, snapshot)
+ assert(self:contains(super_tail) and self:contains(super_head),
+ "tried to connect supernodes not in the supergraph")
+
+ local super_arc = self:arc(super_tail, super_head)
+ if not super_arc then
+ super_arc = self:connect(super_tail, super_head)
+ end
+
+ table.insert(self.arc_snapshots[super_arc], snapshot)
+ self.arc_snapshots[super_arc][snapshot] = true
+
+ return super_arc
+end
+
+return Supergraph
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua
new file mode 100644
index 0000000000..b5a4ea22c9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua
@@ -0,0 +1,196 @@
+-- Copyright 2015 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+
+
+local SupergraphVertexSplitOptimization = {}
+
+-- Imports
+local lib = require "pgf.gd.lib"
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+local Vertex = require "pgf.gd.model.Vertex"
+local Digraph = require "pgf.gd.model.Digraph"
+local Coordinate = require "pgf.gd.model.Coordinate"
+
+declare {
+ key = "split me",
+ type = "boolean",
+ initial = false
+}
+
+declare {
+ key = "split on disappearing",
+ type = "boolean",
+ initial = true
+}
+
+declare {
+ key = "split on disjoint neighbors",
+ type = "boolean",
+ initial = false
+}
+
+declare {
+ key = "split on disjoint children",
+ type = "boolean",
+ initial = false
+}
+
+declare {
+ key = "split on disjoint parents",
+ type = "boolean",
+ initial = false
+}
+
+declare {
+ key = "split all supervertices",
+ type = "boolean",
+ initial = false
+}
+
+declare {
+ key = "unbound vertex splitting",
+ algorithm = SupergraphVertexSplitOptimization,
+ phase = "supergraph optimization",
+ phase_default = true,
+ summary = [["
+ Use this key if you want to disable animations.
+ Instead of producing animations the evolving graph animation phasephase animates all vertices including movements and
+ fade in or fade out animations.
+ "]],
+ documentation = [["
+ See ToDo
+ "]]
+}
+
+
+
+-- Help functions
+
+
+-- Implementation
+
+function SupergraphVertexSplitOptimization:run()
+ local supergraph = assert(self.supergraph, "no supergraph passed")
+
+ local split_on_dissapearing = self.digraph.options["split on disappearing"]
+ local split_on_no_common_neighbor = self.digraph.options["split on disjoint neighbors"]
+ local split_on_no_common_child = self.digraph.options["split on disjoint children"]
+ local split_on_no_common_parent = self.digraph.options["split on disjoint parents"]
+ local split_all = self.digraph.options["split all supervertices"]
+
+ for _, supernode in ipairs(supergraph.vertices) do
+ -- follow trace of the supernode
+ local snapshots = supergraph:getSnapshots(supernode)
+ local splitsnapshots = {}
+
+ for i=2, #snapshots do
+ local s = snapshots[i]
+ local s_prev = snapshots[i - 1]
+ local can_split = false
+
+ if supergraph:consecutiveSnapshots(s_prev, s) then
+ local v1 = supergraph:getSnapshotVertex(supernode, s_prev)
+ local v2 = supergraph:getSnapshotVertex(supernode, s)
+ local is_child1 = {}
+ local is_parent1 = {}
+ local is_neighbor1 = {}
+
+ local incoming1 = s_prev:incoming(v1)
+ local outgoing1 = s_prev:outgoing(v1)
+
+ for _,e in ipairs(incoming1) do
+ local p = supergraph:getSupervertex(e.tail)
+ if p then
+ is_parent1[p] = true
+ is_neighbor1[p] = true
+ end
+ end
+
+ for _,e in ipairs(outgoing1) do
+ local p = supergraph:getSupervertex(e.head)
+ if p then
+ is_child1[p] = true
+ is_neighbor1[p] = true
+ end
+ end
+
+ local incoming2 = s:incoming(v2)
+ local outgoing2 = s:outgoing(v2)
+
+ no_common_parent = true
+ no_common_child = true
+ no_common_neighbor = true
+ for _,e in ipairs(incoming2) do
+ local p = supergraph:getSupervertex(e.tail)
+ if p then
+ if is_neighbor1[p] then
+ no_common_neighbor = false
+ end
+ if is_parent1[p] then
+ no_common_parent = false
+ end
+ if (not no_common_neighbor) and (not no_common_parent) then
+ break
+ end
+ end
+ end
+
+ for _,e in ipairs(outgoing2) do
+ local p = supergraph:getSupervertex(e.head)
+ if p then
+ if is_neighbor1[p] then
+ no_common_neighbor = false
+ end
+ if is_child1[p] then
+ no_common_child = false
+ end
+ if (not no_common_neighbor) and (not no_common_child) then
+ break
+ end
+ end
+ end
+
+
+
+ if no_common_neighbor and split_on_no_common_neighbor then
+ can_split = true
+ --texio.write("[N@".. s.timestamp .."]")
+ end
+ if no_common_parent and split_on_no_common_parent then
+ can_split = true
+ --texio.write("[P@".. s.timestamp .."]")
+ end
+ if no_common_child and split_on_no_common_child then
+ can_split = true
+ --texio.write("[N@".. s.timestamp .."]")
+ end
+ if v2.options["split me"] then
+ can_split = true
+ end
+ else
+ can_split = true
+ --texio.write("[R@".. s.timestamp .."]")
+ end
+ if can_split or split_all then
+ table.insert(splitsnapshots, s)
+ end
+ end
+ if #splitsnapshots>0 then
+ supergraph:splitSupervertex(supernode, splitsnapshots)
+ end
+ end
+end
+
+
+
+
+-- Done
+
+return SupergraphVertexSplitOptimization
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/TimeSpec.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/TimeSpec.lua
new file mode 100644
index 0000000000..2b2168da1a
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/TimeSpec.lua
@@ -0,0 +1,62 @@
+-- Copyright 2015 by Malte Skambath
+--
+-- 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 information
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+---
+
+declare {
+ key = "snapshot",
+ type = "time",
+ initial = "0s",
+ summary = "The time of the snapshot in which a PGF node should be visible.",
+ documentation = [["
+ This option defines the time in seconds when respectively in which
+ state or snapshot of the graph the PGF represents a graph node.
+ "]],
+}
+
+---
+
+declare {
+ key = "supernode",
+ type = "string",
+ initial = "null",
+ summary = "A unique name for a node a given PGF node should be assigned to.",
+ documentation = [["
+ Because it should be possible that nodes can change their
+ appearance, they are represented by separate PGF nodes in each
+ snapshot. To identify PGF nodes of the same supernode we have to
+ specify this key.
+ "]],
+}
+
+---
+
+declare {
+ key = "fadein time",
+ type = "time",
+ initial = "0.5s",
+ summary = [["
+ The time in seconds it should take that a nodes will be fade in
+ when it disappears in the graph.
+ "]],
+}
+
+---
+
+declare {
+ key = "fadeout time",
+ type = "time",
+ initial = "0.5s",
+ summary = "",
+ documentation = "The same as |fadein time| but for disappearing nodes.",
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/doc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/doc.lua
new file mode 100644
index 0000000000..dbd8146275
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/doc.lua
@@ -0,0 +1,120 @@
+-- Copyright 2012 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+
+--
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "animated tree layout"
+
+summary "This layout uses the Reingold--Tilform method for drawing trees."
+
+documentation
+[[
+A method to create layouts for evolving graphs as an SVG animation.The Reingold--Tilford method is a standard method for drawing
+trees. It is described in:
+
+The algorithm, which is based on the Reingold--Tilford algorithm and
+its implementation in |graphdrawing.trees|, is introduced in my Masthesis:
+%
+\begin{itemize}
+ \item
+ M.\ Skambath,
+ \newblock Algorithmic Drawing of Evolving Trees, Masterthesis, 2016
+\end{itemize}
+
+You can use the same known graph macros as for other graph drawing
+algorithms in Ti\emph{k}Z. In addition all keys and features that
+are available for the static tree algorithm can be used:
+%
+\begin{codeexample}[animation list={1,1.5,2,2.5,3,3.5,4}]
+ \tikz \graph[animated binary tree layout,
+ nodes={draw,circle}, auto supernode,
+ ] {
+ {[when=1] 15 -> {10 -> { ,11}, 20 }},
+ {[when=2] 15 -> {10 -> {3,11}, 20 }},
+ {[when=3] 15 -> {10 -> {3, }, 20 }},
+ {[when=4] 15 -> {10 -> {3, }, 20 -> 18 }},
+ };
+\end{codeexample}
+]]
+
+
+example
+[[
+\tikz[animated binary tree layout]
+ \graph[nodes={draw,circle}, auto supernode] {
+ {[when=1] 15 -> {10 -> { ,11}, 20 }},
+ {[when=2] 15 -> {10 -> {3,11}, 20 }},
+ {[when=3] 15 -> {10 -> {3, }, 20 }},
+ {[when=4] 15 -> {10 -> {3, }, 20 -> 18 }},
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "animated binary tree layout"
+
+summary
+[[ A layout based on the Reingold--Tilford method for drawing
+binary trees.
+]]
+
+documentation
+[[
+This key executes:
+%
+\begin{enumerate}
+ \item |animated tree layout|, thereby selecting the Reingold--Tilford method,
+ \item |minimum number of children=2|, thereby ensuring the all nodes
+ have (at least) two children or none at all, and
+\end{enumerate}
+]]
+
+
+example
+[[
+]]
+
+example
+[[
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "extended animated binary tree layout"
+
+summary
+[[ This algorithm is similar to |animated binary tree layout|, only the
+option \texttt{missing nodes get space} is executed and the
+\texttt{significant sep} is zero.
+]]
+
+example
+[[
+]]
+--------------------------------------------------------------------
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/layered.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/layered.lua
new file mode 100644
index 0000000000..15df9990f8
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/layered.lua
@@ -0,0 +1,107 @@
+-- Copyright 2012 by Till Tantau
+-- Copyright 2015 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+
+
+
+
+local temporallayered = {}
+
+-- Namespace
+
+--require("pgf.gd").layered = layered
+--require("pgf.gd.experimental.evolving").layered = layered
+
+-- Import
+local lib = require "pgf.gd.lib"
+local Storage = require "pgf.gd.lib.Storage"
+local layered = require "pgf.gd.layered"
+
+--
+-- This file defines some basic functions to compute and/or set the
+-- ideal distances between nodes of any kind of layered drawing of a
+-- graph.
+
+
+
+---
+-- Position nodes in layers using baselines
+--
+-- @param layers A |Storage| object assigning layers to vertices.
+-- @param paddings A |Storage| object storing the computed distances
+-- (paddings).
+-- @param graph The graph in which the nodes reside
+-- @param snapshots The list of snapshots over which the overlaying evolving
+-- graph exists
+function temporallayered.arrange_layers_by_baselines (layers, paddings, graph, snapshots, vertex_snapshots)
+ assert(vertex_snapshots, "vertex_snapshots must not be nil")
+ --local layer_vertices = Storage.newTableStorage()
+ local snapshots_layers = Storage.newTableStorage()
+ local count_layers = 0
+ -- Decompose into layers:
+ for _,v in ipairs(graph.vertices) do
+ local layer_vertices = snapshots_layers[vertex_snapshots[v]] or {}
+ if layer_vertices[layers[v]] == nil then
+ assert( layers[v], "layer of node " .. v.name .. " has not been computed.")
+ layer_vertices[layers[v]] = {}
+ end
+ table.insert(layer_vertices[layers[v]], v)
+ count_layers = math.max(count_layers, layers[v])
+ end
+
+ if count_layers > 0 then
+
+
+ -- Now compute ideal distances and store
+ local height = 0
+
+ for _, s in ipairs(snapshots) do
+ local layer_vertices = snapshots_layers[s]
+ if #layer_vertices > 0 then -- sanity check
+ for _,v in ipairs(layer_vertices[1]) do
+ v.pos.y = 0
+ end
+ end
+ end
+
+ for i=2, count_layers do
+ local distance = 0
+ for _, s in ipairs(snapshots) do
+ local layer_vertices = snapshots_layers[s]
+ if #layer_vertices >= i then
+ distance = math.max(
+ distance,
+ layered.baseline_distance(
+ paddings,
+ s,
+ layer_vertices[i-1],
+ layer_vertices[i]))
+ end
+ end
+
+ height = height + distance
+
+ for _, s in ipairs(snapshots) do
+ local layer_vertices = snapshots_layers[s]
+ if #layer_vertices >= i then
+ for _,v in ipairs(layer_vertices[i]) do
+ v.pos.y = height
+ end
+ end
+ end
+ end
+ end
+end
+
+
+
+
+-- Done
+
+return temporallayered
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/library.lua
new file mode 100644
index 0000000000..bb50eaf2cb
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/experimental/evolving/library.lua
@@ -0,0 +1,33 @@
+-- Copyright 2016 by Malte Skambath
+--
+-- This file may be distributed an/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 information
+
+
+
+-- @library
+
+local evolving -- Library name
+
+-- Load dependencies:
+require "pgf.gd.trees.ChildSpec"
+require "pgf.gd.trees.ReingoldTilford1981"
+require "pgf.gd.layered"
+
+-- Load declarations from:
+require "pgf.gd.experimental.evolving.TimeSpec"
+require "pgf.gd.experimental.evolving.Supergraph"
+
+-- Load preprocessing/optimization phases from:
+require "pgf.gd.experimental.evolving.SupergraphVertexSplitOptimization"
+require "pgf.gd.experimental.evolving.GreedyTemporalCycleRemoval"
+
+-- Load postprocessing/graph animation phases from:
+require "pgf.gd.experimental.evolving.GraphAnimationCoordination"
+
+-- Load algorithms from:
+require "pgf.gd.experimental.evolving.Skambath2016"
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force.lua
new file mode 100644
index 0000000000..71efda1b35
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.force = {}
+
+
+-- Done
+
+return pgf.gd.force \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/CoarseGraph.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/CoarseGraph.lua
new file mode 100644
index 0000000000..a4e51dfeff
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/CoarseGraph.lua
@@ -0,0 +1,435 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+--- A class for handling "coarse" versions of a graph. Such versions contain
+-- less nodes and edges than the original graph while retaining the overall
+-- structure.
+
+local Graph = require "pgf.gd.deprecated.Graph" -- we subclass from here
+local CoarseGraph = Graph.new()
+CoarseGraph.__index = CoarseGraph
+
+
+
+-- Namespace:
+local force = require "pgf.gd.force"
+force.CoarseGraph = CoarseGraph
+
+
+-- Imports
+local Node = require "pgf.gd.deprecated.Node"
+local Edge = require "pgf.gd.deprecated.Edge"
+
+local lib = require "pgf.gd.lib"
+
+
+-- Class setup
+
+CoarseGraph.COARSEN_INDEPENDENT_EDGES = 0 -- TT: Remark: These uppercase constants are *ugly*. Why do people do this?!
+CoarseGraph.COARSEN_INDEPENDENT_NODES = 1
+CoarseGraph.COARSEN_HYBRID = 2
+
+
+
+--- Creates a new coarse graph derived from an existing graph.
+--
+-- Generates a coarse graph for the input |Graph|.
+--
+-- Coarsening describes the process of reducing the amount of nodes in a graph
+-- by merging nodes into supernodes. There are different strategies, called
+-- schemes, that can be applied, like merging nodes that belong to edges in a
+-- maximal independent edge set or by creating supernodes based on a maximal
+-- independent node set.
+--
+-- Coarsening is not performed automatically. The functions |CoarseGraph:coarsen|
+-- and |CoarseGraph:interpolate| can be used to further coarsen the graph or
+-- to restore the previous state (while interpolating the node positions from
+-- the coarser version of the graph).
+--
+-- Note, however, that the input \meta{graph} is always modified in-place, so
+-- if the original version of \meta{graph} is needed in parallel to its
+-- coarse representations, a deep copy of \meta{graph} needs to be passed over
+-- to |CoarseGraph.new|.
+--
+-- @param graph An existing graph that needs to be coarsened.
+-- @param scheme Coarsening scheme to use. Possible values are:\par
+-- |CoarseGraph.COARSEN_INDEPENDENT_EDGES|:
+-- Coarsen the input graph by computing a maximal independent edge set
+-- and collapsing edges from this set. The resulting coarse graph has
+-- at least 50% of the nodes of the input graph. This coarsening scheme
+-- gives slightly better results than
+-- |CoarseGraph.COARSEN_INDEPENDENT_NODES| because it is less aggressive.
+-- However, this comes at higher computational cost.\par
+-- |CoarseGraph.COARSEN_INDEPENDENT_NODES|:
+-- Coarsen the input graph by computing a maximal independent node set,
+-- making nodes from this set supernodes in the coarse graph, merging
+-- adjacent nodes into the supernodes and connecting the supernodes
+-- if their graph distance is no greater than three. This scheme gives
+-- slightly worse results than |CoarseGraph.COARSEN_INDEPENDENT_EDGES|
+-- but is computationally more efficient.\par
+-- |CoarseGraph.COARSEN_HYBRID|: Combines the other schemes by starting
+-- with |CoarseGraph.COARSEN_INDEPENDENT_EDGES| and switching to
+-- |CoarseGraph.COARSEN_INDEPENDENT_NODES| as soon as the first scheme
+-- does not reduce the amount of nodes by a factor of 25%.
+--
+function CoarseGraph.new(graph, scheme)
+ local coarse_graph = {
+ graph = graph,
+ level = 0,
+ scheme = scheme or CoarseGraph.COARSEN_INDEPENDENT_EDGES,
+ ratio = 0,
+ }
+ setmetatable(coarse_graph, CoarseGraph)
+ return coarse_graph
+end
+
+
+
+local function custom_merge(table1, table2, first_metatable)
+ local result = table1 and lib.copy(table1) or {}
+ local first_metatable = first_metatable == true or false
+
+ for key, value in pairs(table2) do
+ if not result[key] then
+ result[key] = value
+ end
+ end
+
+ if not first_metatable or not getmetatable(result) then
+ setmetatable(result, getmetatable(table2))
+ end
+
+ return result
+end
+
+
+local function pairs_by_sorted_keys (t, f)
+ local a = {}
+ for n in pairs(t) do a[#a + 1] = n end
+ table.sort (a, f)
+ local i = 0
+ return function ()
+ i = i + 1
+ return a[i], t[a[i]]
+ end
+end
+
+
+
+function CoarseGraph:coarsen()
+ -- update the level
+ self.level = self.level + 1
+
+ local old_graph_size = #self.graph.nodes
+
+ if self.scheme == CoarseGraph.COARSEN_INDEPENDENT_EDGES then
+ local matching, unmatched_nodes = self:findMaximalMatching()
+
+ for _,edge in ipairs(matching) do
+ -- get the two nodes of the edge that we are about to collapse
+ local u, v = edge.nodes[1], edge.nodes[2]
+
+ assert(u ~= v, 'the edge ' .. tostring(edge) .. ' is a loop. loops are not supported by this algorithm')
+
+ -- create a supernode
+ local supernode = Node.new{
+ name = '(' .. u.name .. ':' .. v.name .. ')',
+ weight = u.weight + v.weight,
+ subnodes = { u, v },
+ subnode_edge = edge,
+ level = self.level,
+ }
+
+ -- add the supernode to the graph
+ self.graph:addNode(supernode)
+
+ -- collect all neighbors of the nodes to merge, create a node -> edge mapping
+ local u_neighbours = lib.map(u.edges, function(edge) return edge, edge:getNeighbour(u) end)
+ local v_neighbours = lib.map(v.edges, function(edge) return edge, edge:getNeighbour(v) end)
+
+ -- remove the two nodes themselves from the neighbor lists
+ u_neighbours = lib.map(u_neighbours, function (edge,node) if node ~= v then return edge,node end end)
+ v_neighbours = lib.map(v_neighbours, function (edge,node) if node ~= u then return edge,node end end)
+
+ -- compute a list of neighbors u and v have in common
+ local common_neighbours = lib.map(u_neighbours,
+ function (edge,node)
+ if v_neighbours[node] ~= nil then return edge,node end
+ end)
+
+ -- create a node -> edges mapping for common neighbors
+ common_neighbours = lib.map(common_neighbours, function (edge, node)
+ return { edge, v_neighbours[node] }, node
+ end)
+
+ -- drop common edges from the neighbor mappings
+ u_neighbours = lib.map(u_neighbours, function (val,node) if not common_neighbours[node] then return val,node end end)
+ v_neighbours = lib.map(v_neighbours, function (val,node) if not common_neighbours[node] then return val,node end end)
+
+ -- merge neighbor lists
+ local disjoint_neighbours = custom_merge(u_neighbours, v_neighbours)
+
+ -- create edges between the supernode and the neighbors of the merged nodes
+ for neighbour, edge in pairs_by_sorted_keys(disjoint_neighbours, function (n,m) return n.index < m.index end) do
+
+ -- create a superedge to replace the existing one
+ local superedge = Edge.new{
+ direction = edge.direction,
+ weight = edge.weight,
+ subedges = { edge },
+ level = self.level,
+ }
+
+ -- add the supernode and the neighbor to the edge
+ if u_neighbours[neighbour] then
+ superedge:addNode(neighbour)
+ superedge:addNode(supernode)
+
+ else
+ superedge:addNode(supernode)
+ superedge:addNode(neighbour)
+
+ end
+
+ -- replace the old edge
+ self.graph:addEdge(superedge)
+ self.graph:deleteEdge(edge)
+ end
+
+ -- do the same for all neighbors that the merged nodes have
+ -- in common, except that the weights of the new edges are the
+ -- sums of the of the weights of the edges to the common neighbors
+ for neighbour, edges in pairs_by_sorted_keys(common_neighbours, function (n,m) return n.index < m.index end) do
+ local weights = 0
+ for _,e in ipairs(edges) do
+ weights = weights + edge.weight
+ end
+
+ local superedge = Edge.new{
+ direction = Edge.UNDIRECTED,
+ weight = weights,
+ subedges = edges,
+ level = self.level,
+ }
+
+ -- add the supernode and the neighbor to the edge
+ superedge:addNode(supernode)
+ superedge:addNode(neighbour)
+
+ -- replace the old edges
+ self.graph:addEdge(superedge)
+ for _,edge in ipairs(edges) do
+ self.graph:deleteEdge(edge)
+ end
+ end
+
+ -- delete the nodes u and v which were replaced by the supernode
+ assert(#u.edges == 1, 'node ' .. u.name .. ' is part of a multiedge') -- if this fails, then there is a multiedge involving u
+ assert(#v.edges == 1, 'node ' .. v.name .. ' is part of a multiedge') -- same here
+ self.graph:deleteNode(u)
+ self.graph:deleteNode(v)
+ end
+ else
+ assert(false, 'schemes other than CoarseGraph.COARSEN_INDEPENDENT_EDGES are not implemented yet')
+ end
+
+ -- calculate the number of nodes ratio compared to the previous graph
+ self.ratio = #self.graph.nodes / old_graph_size
+end
+
+
+
+function CoarseGraph:revertSuperedge(superedge)
+ -- TODO we can probably skip adding edges that have one or more
+ -- subedges with the same level. But that needs more testing.
+
+ -- TODO we might have to pass the corresponding supernode to
+ -- this method so that we can move subnodes to the same
+ -- position, right? Interpolating seems to work fine without
+ -- though...
+
+ if #superedge.subedges == 1 then
+ local subedge = superedge.subedges[1]
+
+ if not self.graph:findNode(subedge.nodes[1].name) then
+ self.graph:addNode(subedge.nodes[1])
+ end
+
+ if not self.graph:findNode(subedge.nodes[2].name) then
+ self.graph:addNode(subedge.nodes[2])
+ end
+
+ if not self.graph:findEdge(subedge) then
+ subedge.nodes[1]:addEdge(subedge)
+ subedge.nodes[2]:addEdge(subedge)
+ self.graph:addEdge(subedge)
+ end
+
+ if subedge.level and subedge.level >= self.level then
+ self:revertSuperedge(subedge)
+ end
+ else
+ for _,subedge in ipairs(superedge.subedges) do
+ if not self.graph:findNode(subedge.nodes[1].name) then
+ self.graph:addNode(subedge.nodes[1])
+ end
+
+ if not self.graph:findNode(subedge.nodes[2].name) then
+ self.graph:addNode(subedge.nodes[2])
+ end
+
+ if not self.graph:findEdge(subedge) then
+ subedge.nodes[1]:addEdge(subedge)
+ subedge.nodes[2]:addEdge(subedge)
+ self.graph:addEdge(subedge)
+ end
+
+ if subedge.level and subedge.level >= self.level then
+ self:revertSuperedge(subedge)
+ end
+ end
+ end
+end
+
+
+
+function CoarseGraph:interpolate()
+ -- FIXME TODO Jannis: This does not work now that we allow multi-edges
+ -- and loops! Reverting generates the same edges multiple times which leads
+ -- to distorted drawings compared to the awesome results we had before!
+
+ local nodes = lib.copy(self.graph.nodes)
+
+ for _,supernode in ipairs(nodes) do
+ assert(not supernode.level or supernode.level <= self.level)
+
+ if supernode.level and supernode.level == self.level then
+ -- move the subnode to the position of the supernode and add it to the graph
+ supernode.subnodes[1].pos.x = supernode.pos.x
+ supernode.subnodes[1].pos.y = supernode.pos.y
+
+ if not self.graph:findNode(supernode.subnodes[1].name) then
+ self.graph:addNode(supernode.subnodes[1])
+ end
+
+ -- move the subnode to the position of the supernode and add it to the graph
+ supernode.subnodes[2].pos.x = supernode.pos.x
+ supernode.subnodes[2].pos.y = supernode.pos.y
+
+ if not self.graph:findNode(supernode.subnodes[2].name) then
+ self.graph:addNode(supernode.subnodes[2])
+ end
+
+ if not self.graph:findEdge(supernode.subnode_edge) then
+ supernode.subnodes[1]:addEdge(supernode.subnode_edge)
+ supernode.subnodes[2]:addEdge(supernode.subnode_edge)
+ self.graph:addEdge(supernode.subnode_edge)
+ end
+
+ local superedges = lib.copy(supernode.edges)
+
+ for _,superedge in ipairs(superedges) do
+ self:revertSuperedge(superedge)
+ end
+
+ self.graph:deleteNode(supernode)
+ end
+ end
+
+ -- Make sure that the nodes and edges are in the correct order:
+ table.sort (self.graph.nodes, function (a, b) return a.index < b.index end)
+ table.sort (self.graph.edges, function (a, b) return a.index < b.index end)
+ for _, n in pairs(self.graph.nodes) do
+ table.sort (n.edges, function (a, b) return a.index < b.index end)
+ end
+
+ -- update the level
+ self.level = self.level - 1
+end
+
+
+
+function CoarseGraph:getSize()
+ return #self.graph.nodes
+end
+
+
+
+function CoarseGraph:getRatio()
+ return self.ratio
+end
+
+
+
+function CoarseGraph:getLevel()
+ return self.level
+end
+
+
+
+function CoarseGraph:getGraph()
+ return self.graph
+end
+
+
+
+function CoarseGraph:findMaximalMatching()
+ local matching = {}
+ local matched_nodes = {}
+ local unmatched_nodes = {}
+
+ -- iterate over nodes in random order
+ for _,j in ipairs(lib.random_permutation(#self.graph.nodes)) do
+ local node = self.graph.nodes[j]
+ -- ignore nodes that have already been matched
+ if not matched_nodes[node] then
+ -- mark the node as matched
+ matched_nodes[node] = true
+
+ -- filter out edges adjacent to neighbors already matched
+ local edges = lib.imap(node.edges,
+ function (edge)
+ if not matched_nodes[edge:getNeighbour(node)] then return edge end
+ end)
+
+ -- FIXME TODO We use a light-vertex matching here. This is
+ -- different from the algorithm proposed by Hu which collapses
+ -- edges based on a heavy-edge matching...
+ if #edges > 0 then
+ -- sort edges by the weights of the node's neighbors
+ table.sort(edges, function (a, b)
+ return a:getNeighbour(node).weight < b:getNeighbour(node).weight
+ end)
+
+ -- match the node against the neighbor with minimum weight
+ matched_nodes[edges[1]:getNeighbour(node)] = true
+ table.insert(matching, edges[1])
+ end
+ end
+ end
+
+ -- generate a list of nodes that were not matched at all
+ for _,j in ipairs(lib.random_permutation(#self.graph.nodes)) do
+ local node = self.graph.nodes[j]
+ if not matched_nodes[node] then
+ table.insert(unmatched_nodes, node)
+ end
+ end
+
+ return matching, unmatched_nodes
+end
+
+
+-- done
+
+return CoarseGraph
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlCoarsening.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlCoarsening.lua
new file mode 100644
index 0000000000..d69d5fc6c9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlCoarsening.lua
@@ -0,0 +1,148 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+---
+-- @section subsubsection {Coarsening}
+--
+-- @end
+
+
+---
+
+declare {
+ key = "coarsen",
+ type = "boolean",
+ initial = "true",
+
+ summary = [["
+ Defines whether or not a multilevel approach is used that
+ iteratively coarsens the input graph into graphs $G_1,\dots,G_l$
+ with a smaller and smaller number of nodes. The coarsening stops as
+ soon as a minimum number of nodes is reached, as set via the
+ |minimum coarsening size| option, or if, in the last iteration, the
+ number of nodes was not reduced by at least the ratio specified via
+ |downsize ratio|.
+ "]],
+ documentation = [["
+ A random initial layout is computed for the coarsest graph $G_l$ first.
+ Afterwards, it is laid out by computing the attractive and repulsive
+ forces between its nodes.
+
+ In the subsequent steps, the previous coarse graph $G_{l-1}$ is
+ restored and its node positions are interpolated from the nodes
+ in~$G_l$. The graph $G_{l-1}$ is again laid out by computing the forces
+ between its nodes. These steps are repeated with $G_{l-2},\dots,G_1$ until
+ the original input graph $G_0$ has been restored, interpolated
+ and laid out.
+
+ The idea behind this approach is that, by arranging recursively
+ formed supernodes first and then interpolating and arranging their
+ subnodes step by step, the algorithm is less likely to settle in a
+ local energy minimum (of which there can be many, particularly for
+ large graphs). The quality of the drawings with coarsening enabled is
+ expected to be higher than graphics where this feature is not applied.
+
+ The following example demonstrates how coarsening can improve the
+ quality of graph drawings generated with Walshaw's algorihtm
+ |spring electrical layout'|.
+ "]],
+ examples = [["
+ \tikz \graph [spring electrical layout', coarsen=false, vertical=3 to 4]
+ {
+ { [clique] 1, 2 } -- 3 -- 4 -- { 5, 6, 7 }
+ };
+
+ \tikz \graph [spring electrical layout', coarsen, vertical=3 to 4]
+ {
+ { [clique] 1, 2 } -- 3 -- 4 -- { 5, 6, 7 }
+ };
+ "]]
+}
+
+---
+
+declare {
+ key = "minimum coarsening size",
+ type = "number",
+ initial = 2,
+
+ summary = [["
+ Defines the minimum number of nodes down to which the graph is
+ coarsened iteratively. The first graph that has a smaller or equal
+ number of nodes becomes the coarsest graph $G_l$, where $l$ is the
+ number of coarsening steps. The algorithm proceeds with the steps
+ described in the documentation of the |coarsen| option.
+ "]],
+ documentation = [["
+ In the following example the same graph is coarsened down to two
+ and four nodes, respectively. The layout of the original graph is
+ interpolated from the random initial layout and is not improved
+ further because the forces are not computed (0 iterations). Thus,
+ in the two graphs, the nodes are placed at exactly two and four
+ coordinates in the final drawing.
+ "]],
+ examples = [["
+ \tikz \graph [spring layout, iterations=0,
+ minimum coarsening size=2]
+ { subgraph C_n [n=8] };
+
+ \tikz \graph [spring layout, iterations=0,
+ minimum coarsening size=4]
+ { subgraph C_n [n=8] };
+ "]]
+}
+
+---
+
+declare {
+ key = "downsize ratio",
+ type = "number",
+ initial = "0.25",
+
+ summary = [["
+ Minimum ratio between 0 and 1 by which the number of nodes between
+ two coarse graphs $G_i$ and $G_{i+1}$ need to be reduced in order for
+ the coarsening to stop and for the algorithm to use $G_{i+1}$ as the
+ coarsest graph $G_l$. Aside from the input graph, the optimal value
+ of |downsize ratio| mostly depends on the coarsening scheme being
+ used. Possible schemes are |collapse independent edges| and
+ |connect independent nodes|.
+ "]],
+ documentation = [["
+ Increasing this option possibly reduces the number of coarse
+ graphs computed during the coarsening phase as coarsening will stop as
+ soon as a coarse graph does not reduce the number of nodes
+ substantially. This may speed up the algorithm but if the size of the
+ coarsest graph $G_l$ is much larger than |minimum coarsening size|, the
+ multilevel approach may not produce drawings as good as with a lower
+ |downsize ratio|.
+ "]],
+ examples = [["
+ % 1. ratio too high, coarsening stops early, benefits are lost
+ \tikz \graph [spring electrical layout',
+ downsize ratio=1.0,
+ node distance=7mm, vertical=3 to 4]
+ { { [clique] 1, 2 } -- 3 -- 4 -- { 5, 6, 7 } };
+
+ % 2. ratio set to default, coarsening benefits are visible
+ \tikz \graph [spring electrical layout',
+ downsize ratio=0.2,
+ node distance=7mm, vertical=3 to 4]
+ { { [clique] 1, 2 } -- 3 -- 4 -- { 5, 6, 7 } };
+ "]]
+}
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlDeclare.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlDeclare.lua
new file mode 100644
index 0000000000..af209d2c78
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlDeclare.lua
@@ -0,0 +1,41 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Controlling and Configuring Force-Based Algorithms}
+--
+-- All force-based algorithms are based on
+-- a general pattern which we detail in the following. Numerous options
+-- can be used to influence the behavior of this general pattern; more
+-- specific options that apply only to individual algorithms are
+-- explained along with these algorithms.
+--
+-- The vertices are initially laid out in a random configuration.
+-- Then the configuration is annealed to find a configuration of
+-- minimal energy. To avoid getting stuck in a local minimum or at a
+-- saddle point, random forces are added. All of this makes the final
+-- layout extremely susceptible to changes in the random numbers. To
+-- achieve a certain stability of the results, you should fix the
+-- random seed. However, in the recent past Lua has switched its
+-- random number generator, which means that you won't get the same
+-- sequence of random numbers as in a previous version, even for
+-- identical seed. If you rely on the long-term stability of vertex
+-- placement, you should consider using a different layout. With the
+-- spring layout you have to assume that the layout will be random.
+--
+-- @end
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlElectric.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlElectric.lua
new file mode 100644
index 0000000000..47e3cee45d
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlElectric.lua
@@ -0,0 +1,97 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+---
+-- @section subsubsection {Forces and Their Effects: Electrical
+-- Repulsion}
+--
+-- @end
+
+
+---
+
+declare {
+ key = "electric charge",
+ type = "number",
+ initial = 1,
+
+ summary = [["
+ Defines the electric charge of the node. The stronger the
+ |electric charge| of a node the stronger the repulsion between the
+ node and others in the graph. A negative |electric charge| means that
+ other nodes are further attracted to the node rather than repulsed,
+ although in theory this effect strongly depends on how the
+ |spring electrical layout| algorithm works.
+ Two typical effects of increasing the |electric charge| are distortion
+ of symmetries and an upscaling of the drawings.
+ "]],
+ examples = {[["
+ \tikz \graph [spring electrical layout, horizontal=0 to 1]
+ { 0 [electric charge=1] -- subgraph C_n [n=10] };
+ "]],[["
+ \tikz \graph [spring electrical layout, horizontal=0 to 1]
+ { 0 [electric charge=5] -- subgraph C_n [n=10] };
+ "]],[["
+ \tikz \graph [spring electrical layout, horizontal=0 to 1]
+ { [clique] 1 [electric charge=5], 2, 3, 4 };
+ "]]
+ }
+}
+
+
+---
+
+declare {
+ key = "electric force order",
+ type = "number",
+ initial = "1",
+
+ summary = [["
+ Sometimes, when drawing symmetric and mesh-like graphs, the
+ peripheral distortion caused by long-range electric forces may be
+ undesired. Some electric force models allow to reduce long-range
+ forces and distortion effects by increasing
+ the order (exponent) of electric forces. Values between 0 and 1
+ increase long-range electric forces and the scaling of the
+ generated layouts. Value greater than 1 decrease long-range
+ electric forces and results in shrinking drawings.
+ "]]
+ }
+
+
+---
+
+declare {
+ key = "approximate remote forces",
+ type = "boolean",
+
+ summary = [["
+ Force based algorithms often need to compute a force for each pair
+ of vertices, which, for larger numbers of vertices, can lead to a
+ significant time overhead. This problem can be addressed by
+ approximating these forces: For a vertex far removed from a cluster
+ of vertices, instead of computing the force contribution of each
+ vertex of the cluster individually, we form a sort of
+ ``supervertex'' at the ``gravitational center'' of the cluster and
+ then compute only the force between this supervertex and the single
+ vertex.
+
+ \emph{Remark:} Currently, the implementation seems to be broken, at
+ least the results are somewhat strange when this key is used.
+ "]]
+ }
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlIteration.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlIteration.lua
new file mode 100644
index 0000000000..b8d96630cd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlIteration.lua
@@ -0,0 +1,136 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+
+---
+-- @section subsubsection {The Iterative Process and Cooling}
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "iterations",
+ type = "number",
+ initial = "500",
+
+ summary = [["
+ Limits the number of iterations of algorithms for force-based
+ layouts to \meta{number}.
+ "]],
+ documentation = [["
+ Depending on the characteristics of the input graph and the parameters
+ chosen for the algorithm, minimizing the system energy may require
+ many iterations.
+
+ In these situations it may come in handy to limit the number of
+ iterations. This feature can also be useful to draw the same graph
+ after different iterations and thereby demonstrate how the spring or
+ spring-electrical algorithm improves the drawing step by step.
+
+ The examples shows two drawings generated using two
+ different |iteration| limits.
+ "]],
+ examples = {[["
+ \tikz \graph [spring layout, iterations=10] { subgraph K_n [n=4] };
+ "]],[["
+ \tikz \graph [spring layout, iterations=500] { subgraph K_n [n=4] };
+ "]],[["
+ \tikz \graph [spring electrical layout, iterations=10]
+ { subgraph K_n [n=4] };
+ "]],[["
+ \tikz \graph [spring electrical layout, iterations=500]
+ { subgraph K_n [n=4] };
+ "]]
+ }
+}
+
+---
+
+declare {
+ key = "initial step length",
+ type = "length",
+ initial = "0",
+
+ summary = [["
+ This parameter specifies the amount by which nodes will be
+ displaced in each iteration, initially. If set to |0| (which is the
+ default), an appropriate value is computed automatically.
+ "]]
+ }
+
+---
+
+declare {
+ key = "cooling factor",
+ type = "number",
+ initial = "0.95",
+
+ summary = [["
+ This parameter helps in controlling how layouts evolve over
+ time. It is used to gradually reduce the step size
+ between one iteration to the next.
+ "]],
+ documentation = [["
+ A small positive cooling factor
+ $\ge 0$ means that the movement of nodes is quickly or abruptly
+ reduced, while a large cooling factor $\le 1$ allows for a smoother
+ step by step layout refinement at the cost of more iterations. The
+ following example demonstrates how a smaller cooling factor may
+ result in a less balanced drawing. By default, Hu2006 spring,
+ Hu2006 spring electrical, and Walshaw2000 spring electrical use a
+ cooling factor of |0.95|.
+ "]],
+ examples = {[["
+ \tikz \graph [spring layout, cooling factor=0.1]
+ { a -> b -> c -> a };
+ "]],[["
+ \tikz \graph [spring layout, cooling factor=0.5]
+ { a -> b -> c -> a };
+ "]]
+ }
+}
+
+---
+
+declare {
+ key = "convergence tolerance",
+ type = "number",
+ initial = "0.01",
+
+ summary = [["
+ All spring and spring-electrical algorithms implemented in the
+ thesis terminate as soon as the maximum movement of any node drops
+ below $k \cdot \meta{tolerance}$. This tolerance factor can be changed
+ with the convergence tolerance option:
+ "]],
+ examples = {[["
+ \tikz \graph [spring layout, convergence tolerance=0.001]
+ { { [clique] 1, 2 } -- 3 -- 4 -- { 5, 6, 7 } };
+ "]],[["
+ \tikz \graph [spring layout, convergence tolerance=1.0]
+ { { [clique] 1, 2 } -- 3 -- 4 -- { 5, 6, 7 } };
+ "]]
+ }
+}
+
+
+
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlSprings.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlSprings.lua
new file mode 100644
index 0000000000..45b9c9ef55
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlSprings.lua
@@ -0,0 +1,60 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsubsection {Forces and Their Effects: Springs}
+--
+-- The most important parameter of springs is their ``natural
+-- length'', which can be configured using the general-purpose
+-- |node distance| parameter. It is the ``equilibrium length'' of a
+-- spring between two nodes in the graph. When an edge has this
+-- length, no forces will ``push'' or ``pull'' along the edge.
+--
+-- The following examples shows how a simple graph can be scaled by
+-- changing the |node distance|:
+-- %
+-- \begin{codeexample}[]
+-- \tikz \graph [spring layout, node distance=7mm] { subgraph C_n[n=3] };
+-- \tikz \graph [spring layout] { subgraph C_n[n=3] };
+-- \tikz \graph [spring layout, node distance=15mm]{ subgraph C_n[n=3] };
+-- \end{codeexample}
+-- %
+-- \begin{codeexample}[]
+-- \tikz \graph [spring electrical layout, node distance=0.7cm] { subgraph C_n[n=3] };
+-- \tikz \graph [spring electrical layout] { subgraph C_n[n=3] };
+-- \tikz \graph [spring electrical layout, node distance=1.5cm] { subgraph C_n[n=3] };
+-- \end{codeexample}
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "spring constant",
+ type = "number",
+ initial = "0.01",
+
+ summary = [["
+ The ``spring constant'' is a factor from Hooke's law describing the
+ ``stiffness'' of a spring. This factor is used inside spring-based
+ algorithms to determine how strongly edges ``pull'' and ``push'' at
+ the nodes they connect.
+ "]]
+}
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlStart.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlStart.lua
new file mode 100644
index 0000000000..269b81a3d7
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/ControlStart.lua
@@ -0,0 +1,41 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+
+---
+-- @section subsubsection {Start Configuration}
+--
+-- Currently, the start configuration for force-based algorithms is a
+-- random distribution of the vertices. You can influence it by
+-- changing the |random seed|:
+-- %
+--\begin{codeexample}[]
+--\tikz \graph [random seed=10, spring layout] {
+-- a -- {b, c, d} -- e -- f -- {g,h} -- {a,b,e};
+--};
+--\end{codeexample}
+-- %
+--\begin{codeexample}[]
+--\tikz \graph [random seed=11, spring layout] {
+-- a -- {b, c, d} -- e -- f -- {g,h} -- {a,b,e};
+--};
+--\end{codeexample}
+--
+-- Other methods, like a planar preembedding, are not implemented
+-- currently.
+--
+-- @end \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/QuadTree.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/QuadTree.lua
new file mode 100644
index 0000000000..3e1620dc21
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/QuadTree.lua
@@ -0,0 +1,280 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+--- An implementation of a quad trees.
+--
+-- The class QuadTree provides methods form handling quadtrees.
+--
+
+local QuadTree = {
+ -- Subclasses
+ Particle = {},
+ Cell = {}
+}
+QuadTree.__index = QuadTree
+
+-- Namespace:
+require("pgf.gd.force").QuadTree = QuadTree
+
+-- Imports:
+local Vector = require "pgf.gd.deprecated.Vector"
+local lib = require "pgf.gd.lib"
+
+
+--- Creates a new quad tree.
+--
+-- @return A newly-allocated quad tree.
+--
+function QuadTree.new(x, y, width, height, max_particles)
+ local tree = {
+ root_cell = QuadTree.Cell.new(x, y, width, height, max_particles)
+ }
+ setmetatable(tree, QuadTree)
+ return tree
+end
+
+
+
+--- Inserts a particle
+--
+-- @param param A particle of type QuadTree.Particle
+--
+function QuadTree:insert(particle)
+ self.root_cell:insert(particle)
+end
+
+
+
+--- Computes the interactions of a particle with other cells
+--
+-- @param particle A particle
+-- @param test_func A test function, which on input of a cubical cell and a particle should
+-- decide whether the cubical cell should be inserted into the result
+-- @param cells An optional array of cells, to which the found cells will be added
+--
+-- @return The cells array or a new array, if it was empty.
+--
+function QuadTree:findInteractionCells(particle, test_func, cells)
+ local test_func = test_func or function (cell, particle) return true end
+ cells = cells or {}
+
+ self.root_cell:findInteractionCells(particle, test_func, cells)
+
+ return cells
+end
+
+
+
+
+--- Particle subclass
+QuadTree.Particle.__index = QuadTree.Particle
+
+
+
+--- Creates a new particle.
+--
+-- @return A newly-allocated particle.
+--
+function QuadTree.Particle.new(pos, mass)
+ local particle = {
+ pos = pos:copy(),
+ mass = mass or 1,
+ subparticles = {},
+ }
+ setmetatable(particle, QuadTree.Particle)
+ return particle
+end
+
+
+
+--- A cell of a quadtree
+--
+-- TT: Why is it called "cubical", by the way?!
+
+QuadTree.Cell.__index = QuadTree.Cell
+
+
+
+--- Creates a new cubicle cell.
+--
+-- @return a newly-allocated cubicle cell.
+--
+function QuadTree.Cell.new(x, y, width, height, max_particles)
+ local cell = {
+ x = x,
+ y = y,
+ width = width,
+ height = height,
+ max_particles = max_particles or 1,
+ subcells = {},
+ particles = {},
+ center_of_mass = nil,
+ mass = 0,
+ }
+ setmetatable(cell, QuadTree.Cell)
+ return cell
+end
+
+
+
+function QuadTree.Cell:containsParticle(particle)
+ return particle.pos.x >= self.x and particle.pos.x <= self.x + self.width
+ and particle.pos.y >= self.y and particle.pos.y <= self.y + self.height
+end
+
+
+
+function QuadTree.Cell:findSubcell(particle)
+ return lib.find(self.subcells, function (cell)
+ return cell:containsParticle(particle)
+ end)
+end
+
+
+
+function QuadTree.Cell:createSubcells()
+ assert(type(self.subcells) == 'table' and #self.subcells == 0)
+ assert(type(self.particles) == 'table' and #self.particles <= self.max_particles)
+
+ if #self.subcells == 0 then
+ for _,x in ipairs({self.x, self.x + self.width/2}) do
+ for _,y in ipairs({self.y, self.y + self.height/2}) do
+ local cell = QuadTree.Cell.new(x, y, self.width/2, self.height/2, self.max_particles)
+ table.insert(self.subcells, cell)
+ end
+ end
+ end
+end
+
+
+
+function QuadTree.Cell:insert(particle)
+ -- check if we have a particle with the exact same position already
+ local existing = lib.find(self.particles, function (other)
+ return other.pos:equals(particle.pos)
+ end)
+
+ if existing then
+ -- we already have a particle at the same position; splitting the cell
+ -- up makes no sense; instead we add the new particle as a
+ -- subparticle of the existing one
+ table.insert(existing.subparticles, particle)
+ else
+ if #self.subcells == 0 and #self.particles < self.max_particles then
+ table.insert(self.particles, particle)
+ else
+ if #self.subcells == 0 then
+ self:createSubcells()
+ end
+
+ -- move particles to the new subcells
+ for _,existing in ipairs(self.particles) do
+ local cell = self:findSubcell(existing)
+ assert(cell, 'failed to find a cell for particle ' .. tostring(existing.pos))
+ cell:insert(existing)
+ end
+
+ self.particles = {}
+
+ local cell = self:findSubcell(particle)
+ assert(cell)
+ cell:insert(particle)
+ end
+ end
+
+ self:updateMass()
+ self:updateCenterOfMass()
+
+ assert(self.mass)
+ assert(self.center_of_mass)
+end
+
+
+
+function QuadTree.Cell:updateMass()
+ -- reset mass to zero
+ self.mass = 0
+
+ if #self.subcells == 0 then
+ -- the mass is the number of particles of the cell
+ for _,particle in ipairs(self.particles) do
+ self.mass = self.mass + particle.mass
+ for _,subparticle in ipairs(particle.subparticles) do
+ self.mass = self.mass + subparticle.mass
+ end
+ end
+ else
+ -- the mass is the sum of the masses of the subcells
+ for _,subcell in ipairs(self.subcells) do
+ self.mass = self.mass + subcell.mass
+ end
+ end
+end
+
+
+
+function QuadTree.Cell:updateCenterOfMass()
+ -- reset center of mass, assuming the cell is empty
+ self.center_of_mass = nil
+
+ if #self.subcells == 0 then
+ -- the center of mass is the average position of the particles
+ -- weighted by their masses
+ self.center_of_mass = Vector.new (2)
+ for _,p in ipairs(self.particles) do
+ for _,sp in ipairs(p.subparticles) do
+ self.center_of_mass = self.center_of_mass:plus(sp.pos:timesScalar(sp.mass))
+ end
+ self.center_of_mass = self.center_of_mass:plus(p.pos:timesScalar(p.mass))
+ end
+ self.center_of_mass = self.center_of_mass:dividedByScalar(self.mass)
+ else
+ -- the center of mass is the average of the weighted centers of mass
+ -- of the subcells
+ self.center_of_mass = Vector.new(2)
+ for _,sc in ipairs(self.subcells) do
+ if sc.center_of_mass then
+ self.center_of_mass = self.center_of_mass:plus(sc.center_of_mass:timesScalar(sc.mass))
+ else
+ assert(sc.mass == 0)
+ end
+ end
+ self.center_of_mass = self.center_of_mass:dividedByScalar(self.mass)
+ end
+end
+
+
+
+function QuadTree.Cell:findInteractionCells(particle, test_func, cells)
+ if #self.subcells == 0 or test_func(self, particle) then
+ table.insert(cells, self)
+ else
+ for _,subcell in ipairs(self.subcells) do
+ subcell:findInteractionCells(particle, test_func, cells)
+ end
+ end
+end
+
+
+function QuadTree.Cell:__tostring()
+ return '((' .. self.x .. ', ' .. self.y .. ') '
+ .. 'to (' .. self.x + self.width .. ', ' .. self.y + self.height .. '))'
+ .. (self.particle and ' => ' .. self.particle.name or '')
+ .. (self.center_of_mass and ' mass ' .. self.mass .. ' at ' .. tostring(self.center_of_mass) or '')
+end
+
+
+
+-- done
+
+return QuadTree
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalHu2006.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalHu2006.lua
new file mode 100644
index 0000000000..a7230eb1f6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalHu2006.lua
@@ -0,0 +1,633 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local SpringElectricalHu2006 = {}
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+
+---
+
+declare {
+ key = "spring electrical Hu 2006 layout",
+ algorithm = SpringElectricalHu2006,
+
+ preconditions = {
+ connected = true,
+ loop_free = true,
+ simple = true,
+ },
+
+ old_graph_model = true,
+
+ summary = [["
+ Implementation of a spring electrical graph drawing algorithm based on
+ a paper by Hu.
+ "]],
+ documentation = [["
+ \begin{itemize}
+ \item
+ Y. Hu.
+ \newblock Efficient, high-quality force-directed graph drawing.
+ \newblock \emph{The Mathematica Journal}, 2006.
+ \end{itemize}
+
+ There are some modifications compared to the original algorithm,
+ see the Diploma thesis of Pohlmann for details.
+ "]]
+}
+
+-- Imports
+
+local PathLengths = require "pgf.gd.lib.PathLengths"
+local Vector = require "pgf.gd.deprecated.Vector"
+
+local QuadTree = require "pgf.gd.force.QuadTree"
+local CoarseGraph = require "pgf.gd.force.CoarseGraph"
+
+local lib = require "pgf.gd.lib"
+
+
+function SpringElectricalHu2006:run()
+
+ -- Setup properties
+ local options = self.digraph.options
+
+ self.iterations = options['iterations']
+ self.cooling_factor = options['cooling factor']
+ self.initial_step_length = options['initial step length']
+ self.convergence_tolerance = options['convergence tolerance']
+
+ self.natural_spring_length = options['node distance']
+ self.spring_constant = options['spring constant']
+
+ self.approximate_repulsive_forces = options['approximate remote forces']
+ self.repulsive_force_order = options['electric force order']
+
+ self.coarsen = options['coarsen']
+ self.downsize_ratio = options['downsize ratio']
+ self.minimum_graph_size = options['minimum coarsening size']
+
+ -- Adjust types
+ self.downsize_ratio = math.max(0, math.min(1, self.downsize_ratio))
+ self.graph_size = #self.graph.nodes
+ self.graph_density = (2 * #self.graph.edges) / (#self.graph.nodes * (#self.graph.nodes - 1))
+
+ -- validate input parameters
+ assert(self.iterations >= 0, 'iterations (value: ' .. self.iterations .. ') need to be greater than 0')
+ assert(self.cooling_factor >= 0 and self.cooling_factor <= 1, 'the cooling factor (value: ' .. self.cooling_factor .. ') needs to be between 0 and 1')
+ assert(self.initial_step_length >= 0, 'the initial step length (value: ' .. self.initial_step_length .. ') needs to be greater than or equal to 0')
+ assert(self.convergence_tolerance >= 0, 'the convergence tolerance (value: ' .. self.convergence_tolerance .. ') needs to be greater than or equal to 0')
+ assert(self.natural_spring_length >= 0, 'the natural spring dimension (value: ' .. self.natural_spring_length .. ') needs to be greater than or equal to 0')
+ assert(self.spring_constant >= 0, 'the spring constant (value: ' .. self.spring_constant .. ') needs to be greater or equal to 0')
+ assert(self.downsize_ratio >= 0 and self.downsize_ratio <= 1, 'the downsize ratio (value: ' .. self.downsize_ratio .. ') needs to be between 0 and 1')
+ assert(self.minimum_graph_size >= 2, 'the minimum coarsening size of coarse graphs (value: ' .. self.minimum_graph_size .. ') needs to be greater than or equal to 2')
+
+ -- initialize node weights
+ for _,node in ipairs(self.graph.nodes) do
+ if node:getOption('electric charge') ~= nil then
+ node.weight = node:getOption('electric charge')
+ else
+ node.weight = 1
+ end
+ end
+
+ -- initialize edge weights
+ for _,edge in ipairs(self.graph.edges) do
+ edge.weight = 1
+ end
+
+ -- initialize the coarse graph data structure. note that the algorithm
+ -- is the same regardless whether coarsening is used, except that the
+ -- number of coarsening steps without coarsening is 0
+ local coarse_graph = CoarseGraph.new(self.graph)
+
+ -- check if the multilevel approach should be used
+ if self.coarsen then
+ -- coarsen the graph repeatedly until only minimum_graph_size nodes
+ -- are left or until the size of the coarse graph was not reduced by
+ -- at least the downsize ratio configured by the user
+ while coarse_graph:getSize() > self.minimum_graph_size
+ and coarse_graph:getRatio() <= (1 - self.downsize_ratio)
+ do
+ coarse_graph:coarsen()
+ end
+ end
+
+ if self.coarsen then
+ -- use the natural spring length as the initial natural spring length
+ local spring_length = self.natural_spring_length
+
+ -- compute a random initial layout for the coarsest graph
+ self:computeInitialLayout(coarse_graph.graph, spring_length)
+
+ -- set the spring length to the average edge length of the initial layout
+ spring_length = 0
+ for _,edge in ipairs(coarse_graph.graph.edges) do
+ spring_length = spring_length + edge.nodes[1].pos:minus(edge.nodes[2].pos):norm()
+ end
+ spring_length = spring_length / #coarse_graph.graph.edges
+
+ -- additionally improve the layout with the force-based algorithm
+ -- if there are more than two nodes in the coarsest graph
+ if coarse_graph:getSize() > 2 then
+ self:computeForceLayout(coarse_graph.graph, spring_length, SpringElectricalHu2006.adaptive_step_update)
+ end
+
+ -- undo coarsening step by step, applying the force-based sub-algorithm
+ -- to every intermediate coarse graph as well as the original graph
+ while coarse_graph:getLevel() > 0 do
+
+ -- compute the diameter of the parent coarse graph
+ local parent_diameter = PathLengths.pseudoDiameter(coarse_graph.graph)
+
+ -- interpolate the previous coarse graph from its parent
+ coarse_graph:interpolate()
+
+ -- compute the diameter of the current coarse graph
+ local current_diameter = PathLengths.pseudoDiameter(coarse_graph.graph)
+
+ -- scale node positions by the quotient of the pseudo diameters
+ for _,node in ipairs(coarse_graph.graph) do
+ node.pos:update(function (n, value)
+ return value * (current_diameter / parent_diameter)
+ end)
+ end
+
+ -- compute forces in the graph
+ self:computeForceLayout(coarse_graph.graph, spring_length, SpringElectricalHu2006.conservative_step_update)
+ end
+ else
+ -- compute a random initial layout for the coarsest graph
+ self:computeInitialLayout(coarse_graph.graph, self.natural_spring_length)
+
+ -- set the spring length to the average edge length of the initial layout
+ spring_length = 0
+ for _,edge in ipairs(coarse_graph.graph.edges) do
+ spring_length = spring_length + edge.nodes[1].pos:minus(edge.nodes[2].pos):norm()
+ end
+ spring_length = spring_length / #coarse_graph.graph.edges
+
+ -- improve the layout with the force-based algorithm
+ self:computeForceLayout(coarse_graph.graph, spring_length, SpringElectricalHu2006.adaptive_step_update)
+ end
+end
+
+
+
+function SpringElectricalHu2006:computeInitialLayout(graph, spring_length)
+ -- TODO how can supernodes and fixed nodes go hand in hand?
+ -- maybe fix the supernode if at least one of its subnodes is
+ -- fixated?
+
+ -- fixate all nodes that have a 'desired at' option. this will set the
+ -- node.fixed member to true and also set node.pos.x and node.pos.y
+ self:fixateNodes(graph)
+
+ if #graph.nodes == 2 then
+ if not (graph.nodes[1].fixed and graph.nodes[2].fixed) then
+ local fixed_index = graph.nodes[2].fixed and 2 or 1
+ local loose_index = graph.nodes[2].fixed and 1 or 2
+
+ if not graph.nodes[1].fixed and not graph.nodes[2].fixed then
+ -- both nodes can be moved, so we assume node 1 is fixed at (0,0)
+ graph.nodes[1].pos.x = 0
+ graph.nodes[1].pos.y = 0
+ end
+
+ -- position the loose node relative to the fixed node, with
+ -- the displacement (random direction) matching the spring length
+ local direction = Vector.new{x = lib.random(1, spring_length), y = lib.random(1, spring_length)}
+ local distance = 3 * spring_length * self.graph_density * math.sqrt(self.graph_size) / 2
+ local displacement = direction:normalized():timesScalar(distance)
+
+ graph.nodes[loose_index].pos = graph.nodes[fixed_index].pos:plus(displacement)
+ else
+ -- both nodes are fixed, initial layout may be far from optimal
+ end
+ else
+
+ -- use a random positioning technique
+ local function positioning_func(n)
+ local radius = 3 * spring_length * self.graph_density * math.sqrt(self.graph_size) / 2
+ return lib.random(-radius, radius)
+ end
+
+ -- compute initial layout based on the random positioning technique
+ for _,node in ipairs(graph.nodes) do
+ if not node.fixed then
+ node.pos.x = positioning_func(1)
+ node.pos.y = positioning_func(2)
+ end
+ end
+ end
+end
+
+
+
+function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_update_func)
+ -- global (=repulsive) force function
+ function accurate_repulsive_force(distance, weight)
+ -- note: the weight is taken into the equation here. unlike in the original
+ -- algorithm different electric charges are allowed for each node in this
+ -- implementation
+ return - weight * self.spring_constant * math.pow(spring_length, self.repulsive_force_order + 1) / math.pow(distance, self.repulsive_force_order)
+ end
+
+ -- global (=repulsive, approximated) force function
+ function approximated_repulsive_force(distance, mass)
+ return - mass * self.spring_constant * math.pow(spring_length, self.repulsive_force_order + 1) / math.pow(distance, self.repulsive_force_order)
+ end
+
+ -- local (spring) force function
+ function attractive_force(distance)
+ return (distance * distance) / spring_length
+ end
+
+ -- define the Barnes-Hut opening criterion
+ function barnes_hut_criterion(cell, particle)
+ local distance = particle.pos:minus(cell.center_of_mass):norm()
+ return cell.width / distance <= 1.2
+ end
+
+ -- fixate all nodes that have a 'desired at' option. this will set the
+ -- node.fixed member to true and also set node.pos.x and node.pos.y
+ self:fixateNodes(graph)
+
+ -- adjust the initial step length automatically if desired by the user
+ local step_length = self.initial_step_length == 0 and spring_length or self.initial_step_length
+
+ -- convergence criteria etc.
+ local converged = false
+ local energy = math.huge
+ local iteration = 0
+ local progress = 0
+
+ while not converged and iteration < self.iterations do
+ -- remember old node positions
+ local old_positions = lib.map(graph.nodes, function (node)
+ return node.pos:copy(), node
+ end)
+
+ -- remember the old system energy and reset it for the current iteration
+ local old_energy = energy
+ energy = 0
+
+ -- build the quadtree for approximating repulsive forces, if desired
+ local quadtree = nil
+ if self.approximate_repulsive_forces then
+ quadtree = self:buildQuadtree(graph)
+ end
+
+ for _,v in ipairs(graph.nodes) do
+ if not v.fixed then
+ -- vector for the displacement of v
+ local d = Vector.new(2)
+
+ -- compute repulsive forces
+ if self.approximate_repulsive_forces then
+ -- determine the cells that have a repulsive influence on v
+ local cells = quadtree:findInteractionCells(v, barnes_hut_criterion)
+
+ -- compute the repulsive force between these cells and v
+ for _,cell in ipairs(cells) do
+ -- check if the cell is a leaf
+ if #cell.subcells == 0 then
+ -- compute the forces between the node and all particles in the cell
+ for _,particle in ipairs(cell.particles) do
+ local real_particles = lib.copy(particle.subparticles)
+ table.insert(real_particles, particle)
+
+ for _,real_particle in ipairs(real_particles) do
+ local delta = real_particle.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the node and the cell's
+ -- center of mass are located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = approximated_repulsive_force(delta:norm(), real_particle.mass)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ else
+ -- compute the distance between the node and the cell's center of mass
+ local delta = cell.center_of_mass:minus(v.pos)
+
+ -- enforce a small virtual distance if the node and the cell's
+ -- center of mass are located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = approximated_repulsive_force(delta:norm(), cell.mass)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ else
+ for _,u in ipairs(graph.nodes) do
+ if v ~= u then
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = accurate_repulsive_force(delta:norm(), u.weight)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ end
+
+ -- compute attractive forces between v and its neighbors
+ for _,edge in ipairs(v.edges) do
+ local u = edge:getNeighbour(v)
+
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the spring force vector between u and v
+ local attr_force = attractive_force(delta:norm())
+ local force = delta:normalized():timesScalar(attr_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+
+ -- really move the node now
+ -- TODO note how all nodes are moved by the same amount (step_length)
+ -- while Walshaw multiplies the normalized force with min(step_length,
+ -- d:norm()). could that improve this algorithm even further?
+ v.pos = v.pos:plus(d:normalized():timesScalar(step_length))
+
+ -- TODO Hu doesn't mention this but the energy of a particle is
+ -- typically considered as the product of its mass and the square of
+ -- its forces. This means we should probably take the weight of
+ -- the node v into the equation, doesn't it?
+ --
+ -- update the energy function
+ energy = energy + math.pow(d:norm(), 2)
+ -- vector for the displacement of v
+ local d = Vector.new(2)
+
+ -- compute repulsive forces
+ if self.approximate_repulsive_forces then
+ -- determine the cells that have a repulsive influence on v
+ local cells = quadtree:findInteractionCells(v, barnes_hut_criterion)
+
+ -- compute the repulsive force between these cells and v
+ for _,cell in ipairs(cells) do
+ -- check if the cell is a leaf
+ if #cell.subcells == 0 then
+ -- compute the forces between the node and all particles in the cell
+ for _,particle in ipairs(cell.particles) do
+ local real_particles = lib.copy(particle.subparticles)
+ table.insert(real_particles, particle)
+
+ for _,real_particle in ipairs(real_particles) do
+ local delta = real_particle.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the node and the cell's
+ -- center of mass are located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = approximated_repulsive_force(delta:norm(), real_particle.mass)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ else
+ -- compute the distance between the node and the cell's center of mass
+ local delta = cell.center_of_mass:minus(v.pos)
+
+ -- enforce a small virtual distance if the node and the cell's
+ -- center of mass are located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = approximated_repulsive_force(delta:norm(), cell.mass)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ else
+ for _,u in ipairs(graph.nodes) do
+ if v ~= u then
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = accurate_repulsive_force(delta:norm(), u.weight)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ end
+
+ -- compute attractive forces between v and its neighbours
+ for _,edge in ipairs(v.edges) do
+ local u = edge:getNeighbour(v)
+
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the spring force vector between u and v
+ local attr_force = attractive_force(delta:norm())
+ local force = delta:normalized():timesScalar(attr_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+
+ -- really move the node now
+ -- TODO note how all nodes are moved by the same amount (step_length)
+ -- while Walshaw multiplies the normalized force with min(step_length,
+ -- d:norm()). could that improve this algorithm even further?
+ v.pos = v.pos:plus(d:normalized():timesScalar(step_length))
+
+ -- TODO Hu doesn't mention this but the energy of a particle is
+ -- typically considered as the product of its mass and the square of
+ -- its forces. This means we should probably take the weight of
+ -- the node v into the equation, doesn't it?
+ --
+ -- update the energy function
+ energy = energy + math.pow(d:norm(), 2)
+ end
+ end
+
+ -- update the step length and progress counter
+ step_length, progress = step_update_func(step_length, self.cooling_factor, energy, old_energy, progress)
+
+ -- compute the maximum node movement in this iteration
+ local max_movement = 0
+ for _,x in ipairs(graph.nodes) do
+ local delta = x.pos:minus(old_positions[x])
+ max_movement = math.max(delta:norm(), max_movement)
+ end
+
+ -- the algorithm will converge if the maximum movement is below a
+ -- threshold depending on the spring length and the convergence
+ -- tolerance
+ if max_movement < spring_length * self.convergence_tolerance then
+ converged = true
+ end
+
+ -- increment the iteration counter
+ iteration = iteration + 1
+ end
+end
+
+
+
+-- Fixes nodes at their specified positions.
+--
+function SpringElectricalHu2006:fixateNodes(graph)
+ local number_of_fixed_nodes = 0
+
+ for _,node in ipairs(graph.nodes) do
+ -- read the 'desired at' option of the node
+ local coordinate = node:getOption('desired at')
+
+ if coordinate then
+ -- apply the coordinate
+ node.pos.x = coordinate.x
+ node.pos.y = coordinate.y
+
+ -- mark the node as fixed
+ node.fixed = true
+
+ number_of_fixed_nodes = number_of_fixed_nodes + 1
+ end
+ end
+ if number_of_fixed_nodes > 1 then
+ self.growth_direction = "fixed" -- do not grow, orientation is now fixed
+ end
+end
+
+
+
+function SpringElectricalHu2006:buildQuadtree(graph)
+ -- compute the minimum x and y coordinates of all nodes
+ local min_pos = graph.nodes[1].pos
+ for _,node in ipairs(graph.nodes) do
+ min_pos = Vector.new(2, function (n) return math.min(min_pos[n], node.pos[n]) end)
+ end
+
+ -- compute maximum x and y coordinates of all nodes
+ local max_pos = graph.nodes[1].pos
+ for _,node in ipairs(graph.nodes) do
+ max_pos = Vector.new(2, function (n) return math.max(max_pos[n], node.pos[n]) end)
+ end
+
+ -- make sure the maximum position is at least a tiny bit
+ -- larger than the minimum position
+ if min_pos:equals(max_pos) then
+ max_pos = max_pos:plus(Vector.new(2, function (n)
+ return 0.1 + lib.random() * 0.1
+ end))
+ end
+
+ -- make sure to make the quadtree area slightly larger than required
+ -- in theory; for some reason Lua will otherwise think that nodes with
+ -- min/max x/y coordinates are outside the box... weird? yes.
+ min_pos = min_pos:minus({1,1})
+ max_pos = max_pos:plus({1,1})
+
+ -- create the quadtree
+ quadtree = QuadTree.new(min_pos.x, min_pos.y,
+ max_pos.x - min_pos.x,
+ max_pos.y - min_pos.y)
+
+ -- insert nodes into the quadtree
+ for _,node in ipairs(graph.nodes) do
+ local particle = QuadTree.Particle.new(node.pos, node.weight)
+ particle.node = node
+ quadtree:insert(particle)
+ end
+
+ return quadtree
+end
+
+
+
+function SpringElectricalHu2006.conservative_step_update(step, cooling_factor)
+ return cooling_factor * step, nil
+end
+
+
+
+function SpringElectricalHu2006.adaptive_step_update(step, cooling_factor, energy, old_energy, progress)
+ if energy < old_energy then
+ progress = progress + 1
+ if progress >= 5 then
+ progress = 0
+ step = step / cooling_factor
+ end
+ else
+ progress = 0
+ step = cooling_factor * step
+ end
+ return step, progress
+end
+
+
+-- done
+
+return SpringElectricalHu2006
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalLayouts.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalLayouts.lua
new file mode 100644
index 0000000000..6ab74fc367
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalLayouts.lua
@@ -0,0 +1,54 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Spring Electrical Layouts}
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "spring electrical layout",
+ use = {
+ { key = "spring electrical Hu 2006 layout" },
+ { key = "spring constant", value = "0.2" }
+ },
+
+ summary = [["
+ This key selects Hu's 2006 spring electrical layout with
+ appropriate settings for some parameters.
+ "]]
+}
+
+
+---
+
+declare {
+ key = "spring electrical layout'",
+ use = {
+ { key = "spring electrical Walshaw 2000 layout" },
+ { key = "spring constant", value = "0.01" },
+ { key = "convergence tolerance", value = "0.001" },
+ },
+
+ summary = [["
+ This key selects Walshaw's 2000 spring electrical layout with
+ appropriate settings for some parameters.
+ "]]
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalWalshaw2000.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalWalshaw2000.lua
new file mode 100644
index 0000000000..5f7978da4e
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringElectricalWalshaw2000.lua
@@ -0,0 +1,520 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+
+local SpringElectricalWalshaw2000 = {}
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+
+---
+
+declare {
+ key = "spring electrical Walshaw 2000 layout",
+ algorithm = SpringElectricalWalshaw2000,
+
+ preconditions = {
+ connected = true,
+ loop_free = true,
+ simple = true,
+ },
+
+ old_graph_model = true,
+
+ summary = [["
+ Implementation of a spring electrical graph drawing algorithm based on
+ a paper by Walshaw.
+ "]],
+ documentation = [["
+ \begin{itemize}
+ \item
+ C. Walshaw.
+ \newblock A multilevel algorithm for force-directed graph drawing.
+ \newblock In J. Marks, editor, \emph{Graph Drawing}, Lecture Notes in
+ Computer Science, 1984:31--55, 2001.
+ \end{itemize}
+
+ The following modifications compared to the original algorithm were applied:
+ %
+ \begin{itemize}
+ \item An iteration limit was added.
+ \item The natural spring length for all coarse graphs is computed based
+ on the formula presented by Walshaw, so that the natural spring
+ length of the original graph (coarse graph 0) is the same as
+ the value requested by the user.
+ \item Users can define custom node and edge weights.
+ \item Coarsening stops when $|V(G_i+1)|/|V(G_i)| < p$ where $p = 0.75$.
+ \item Coarsening stops when the maximal matching is empty.
+ \item The runtime of the algorithm is improved by use of a quadtree
+ data structure like Hu does in his algorithm.
+ \item A limiting the number of levels of the quadtree is not implemented.
+ \end{itemize}
+ "]]
+}
+
+-- TODO Implement the following keys (or whatever seems appropriate
+-- and doable for this algorithm):
+-- - /tikz/desired at
+-- - /tikz/influence cutoff distance
+-- - /tikz/spring stiffness (could this be the equivalent to the electric
+-- charge of nodes?
+-- - /tikz/natural spring dimension per edge
+--
+-- TODO Implement the following features:
+-- - clustering of nodes using color classes
+-- - different cluster layouts (vertical line, horizontal line,
+-- normal cluster, internally fixed subgraph)
+
+
+
+local Vector = require "pgf.gd.deprecated.Vector"
+
+local QuadTree = require "pgf.gd.force.QuadTree"
+local CoarseGraph = require "pgf.gd.force.CoarseGraph"
+
+
+local lib = require "pgf.gd.lib"
+
+
+function SpringElectricalWalshaw2000:run()
+
+ -- Setup parameters
+ local options = self.digraph.options
+
+ self.iterations = options['iterations']
+ self.cooling_factor = options['cooling factor']
+ self.initial_step_length = options['initial step length']
+ self.convergence_tolerance = options['convergence tolerance']
+
+ self.natural_spring_length = options['node distance']
+ self.spring_constant = options['spring constant']
+
+ self.approximate_repulsive_forces = options['approximate remote forces']
+ self.repulsive_force_order = options['electric force order']
+
+ self.coarsen = options['coarsen']
+ self.downsize_ratio = options['downsize ratio']
+ self.minimum_graph_size = options['minimum coarsening size']
+
+ -- Adjust types
+ self.downsize_ratio = math.max(0, math.min(1, self.downsize_ratio))
+ self.graph_size = #self.graph.nodes
+ self.graph_density = (2 * #self.graph.edges) / (#self.graph.nodes * (#self.graph.nodes - 1))
+
+ -- validate input parameters
+ assert(self.iterations >= 0, 'iterations (value: ' .. self.iterations .. ') need to be greater than 0')
+ assert(self.cooling_factor >= 0 and self.cooling_factor <= 1, 'the cooling factor (value: ' .. self.cooling_factor .. ') needs to be between 0 and 1')
+ assert(self.initial_step_length >= 0, 'the initial step length (value: ' .. self.initial_step_length .. ') needs to be greater than or equal to 0')
+ assert(self.convergence_tolerance >= 0, 'the convergence tolerance (value: ' .. self.convergence_tolerance .. ') needs to be greater than or equal to 0')
+ assert(self.natural_spring_length >= 0, 'the natural spring dimension (value: ' .. self.natural_spring_length .. ') needs to be greater than or equal to 0')
+ assert(self.spring_constant >= 0, 'the spring constant (value: ' .. self.spring_constant .. ') needs to be greater or equal to 0')
+ assert(self.downsize_ratio >= 0 and self.downsize_ratio <= 1, 'the downsize ratio (value: ' .. self.downsize_ratio .. ') needs to be between 0 and 1')
+ assert(self.minimum_graph_size >= 2, 'the minimum coarsening size of coarse graphs (value: ' .. self.minimum_graph_size .. ') needs to be greater than or equal to 2')
+
+ -- initialize node weights
+ for _,node in ipairs(self.graph.nodes) do
+ if node:getOption('electric charge') ~= nil then
+ node.weight = node:getOption('electric charge')
+ else
+ node.weight = 1
+ end
+
+ -- a node is charged if its weight derives from the default setting
+ -- of 1 (where it has no influence on the forces)
+ node.charged = node.weight ~= 1
+ end
+
+ -- initialize edge weights
+ for _,edge in ipairs(self.graph.edges) do
+ edge.weight = 1
+ end
+
+
+ -- initialize the coarse graph data structure. note that the algorithm
+ -- is the same regardless whether coarsening is used, except that the
+ -- number of coarsening steps without coarsening is 0
+ local coarse_graph = CoarseGraph.new(self.graph)
+
+ -- check if the multilevel approach should be used
+ if self.coarsen then
+ -- coarsen the graph repeatedly until only minimum_graph_size nodes
+ -- are left or until the size of the coarse graph was not reduced by
+ -- at least the downsize ratio configured by the user
+ while coarse_graph:getSize() > self.minimum_graph_size
+ and coarse_graph:getRatio() < (1 - self.downsize_ratio)
+ do
+ coarse_graph:coarsen()
+ end
+ end
+
+ -- compute the natural spring length for the coarsest graph in a way
+ -- that will result in the desired natural spring length in the
+ -- original graph
+ local spring_length = self.natural_spring_length / math.pow(math.sqrt(4/7), coarse_graph:getLevel())
+
+ if self.coarsen then
+ -- generate a random initial layout for the coarsest graph
+ self:computeInitialLayout(coarse_graph.graph, spring_length)
+
+ -- undo coarsening step by step, applying the force-based sub-algorithm
+ -- to every intermediate coarse graph as well as the original graph
+ while coarse_graph:getLevel() > 0 do
+ -- interpolate the previous coarse graph
+ coarse_graph:interpolate()
+
+ -- update the natural spring length so that, for the original graph,
+ -- it equals the natural spring dimension configured by the user
+ spring_length = spring_length * math.sqrt(4/7)
+
+ -- apply the force-based algorithm to improve the layout
+ self:computeForceLayout(coarse_graph.graph, spring_length)
+ end
+ else
+ -- generate a random initial layout for the coarsest graph
+ self:computeInitialLayout(coarse_graph.graph, spring_length)
+
+ -- apply the force-based algorithm to improve the layout
+ self:computeForceLayout(coarse_graph.graph, spring_length)
+ end
+end
+
+
+
+function SpringElectricalWalshaw2000:computeInitialLayout(graph, spring_length)
+ -- TODO how can supernodes and fixed nodes go hand in hand?
+ -- maybe fix the supernode if at least one of its subnodes is
+ -- fixated?
+
+ -- fixate all nodes that have a 'desired at' option. this will set the
+ -- node.fixed member to true and also set node.pos.x and node.pos.y
+ self:fixateNodes(graph)
+
+ if #graph.nodes == 2 then
+ if not (graph.nodes[1].fixed and graph.nodes[2].fixed) then
+ local fixed_index = graph.nodes[2].fixed and 2 or 1
+ local loose_index = graph.nodes[2].fixed and 1 or 2
+
+ if not graph.nodes[1].fixed and not graph.nodes[2].fixed then
+ -- both nodes can be moved, so we assume node 1 is fixed at (0,0)
+ graph.nodes[1].pos.x = 0
+ graph.nodes[1].pos.y = 0
+ end
+
+ -- position the loose node relative to the fixed node, with
+ -- the displacement (random direction) matching the spring length
+ local direction = Vector.new{x = lib.random(1, 2), y = lib.random(1, 2)}
+ local distance = 3 * spring_length * self.graph_density * math.sqrt(self.graph_size) / 2
+ local displacement = direction:normalized():timesScalar(distance)
+
+ graph.nodes[loose_index].pos = graph.nodes[fixed_index].pos:plus(displacement)
+ else
+ -- both nodes are fixed, initial layout may be far from optimal
+ end
+ else
+ -- function to filter out fixed nodes
+ local function nodeNotFixed(node) return not node.fixed end
+
+ -- use the random positioning technique
+ local function positioning_func(n)
+ local radius = 3 * spring_length * self.graph_density * math.sqrt(self.graph_size) / 2
+ return lib.random(-radius, radius)
+ end
+
+ -- compute initial layout based on the random positioning technique
+ for _,node in ipairs(graph.nodes) do
+ if not node.fixed then
+ node.pos.x = positioning_func(1)
+ node.pos.y = positioning_func(2)
+ end
+ end
+ end
+end
+
+
+
+function SpringElectricalWalshaw2000:computeForceLayout(graph, spring_length)
+ -- global (=repulsive) force function
+ local function accurate_repulsive_force(distance, weight)
+ return - self.spring_constant * weight * math.pow(spring_length, self.repulsive_force_order + 1) / math.pow(distance, self.repulsive_force_order)
+ end
+
+ -- global (=repulsive, approximated) force function
+ local function approximated_repulsive_force(distance, mass)
+ return - mass * self.spring_constant * math.pow(spring_length, self.repulsive_force_order + 1) / math.pow(distance, self.repulsive_force_order)
+ end
+
+ -- local (spring) force function
+ local function attractive_force(distance, d, weight, charged, repulsive_force)
+ -- for charged nodes, never subtract the repulsive force; we want ALL other
+ -- nodes to be attracted more / repulsed less (not just non-adjacent ones),
+ -- depending on the charge of course
+ if charged then
+ return (distance - spring_length) / d - accurate_repulsive_force(distance, weight)
+ else
+ return (distance - spring_length) / d - (repulsive_force or 0)
+ end
+ end
+
+ -- define the Barnes-Hut opening criterion
+ function barnes_hut_criterion(cell, particle)
+ local distance = particle.pos:minus(cell.center_of_mass):norm()
+ return cell.width / distance <= 1.2
+ end
+
+ -- fixate all nodes that have a 'desired at' option. this will set the
+ -- node.fixed member to true and also set node.pos.x and node.pos.y
+ self:fixateNodes(graph)
+
+ -- adjust the initial step length automatically if desired by the user
+ local step_length = self.initial_step_length == 0 and spring_length or self.initial_step_length
+
+ -- convergence criteria
+ local converged = false
+ local i = 0
+
+ while not converged and i < self.iterations do
+
+ -- assume that we are converging
+ converged = true
+ i = i + 1
+
+ -- build the quadtree for approximating repulsive forces, if desired
+ local quadtree = nil
+ if self.approximate_repulsive_forces then
+ quadtree = self:buildQuadtree(graph)
+ end
+
+ local function nodeNotFixed(node) return not node.fixed end
+
+ -- iterate over all nodes
+ for _,v in ipairs(graph.nodes) do
+ if not v.fixed then
+ -- vector for the displacement of v
+ local d = Vector.new(2)
+
+ -- repulsive force induced by other nodes
+ local repulsive_forces = {}
+
+ -- compute repulsive forces
+ if self.approximate_repulsive_forces then
+ -- determine the cells that have an repulsive influence on v
+ local cells = quadtree:findInteractionCells(v, barnes_hut_criterion)
+
+ -- compute the repulsive force between these cells and v
+ for _,cell in ipairs(cells) do
+ -- check if the cell is a leaf
+ if #cell.subcells == 0 then
+ -- compute the forces between the node and all particles in the cell
+ for _,particle in ipairs(cell.particles) do
+ -- build a table that contains the particle plus all its subparticles
+ -- (particles at the same position)
+ local real_particles = lib.copy(particle.subparticles)
+ table.insert(real_particles, particle)
+
+ for _,real_particle in ipairs(real_particles) do
+ local delta = real_particle.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the node and the cell's
+ -- center of mass are located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = approximated_repulsive_force(delta:norm(), real_particle.mass)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- remember the repulsive force for the particle so that we can
+ -- subtract it later when computing the attractive forces with
+ -- adjacent nodes
+ repulsive_forces[real_particle.node] = repulsive_force
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ else
+ -- compute the distance between the node and the cell's center of mass
+ local delta = cell.center_of_mass:minus(v.pos)
+
+ -- enforce a small virtual distance if the node and the cell's
+ -- center of mass are located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = approximated_repulsive_force(delta:norm(), cell.mass)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- TODO for each neighbor of v, check if it is in this cell.
+ -- if this is the case, compute the quadtree force for the mass
+ -- 'node.weight / cell.mass' and remember this as the repulsive
+ -- force of the neighbor; (it is not necessarily at
+ -- the center of mass of the cell, so the result is only an
+ -- approximation of the real repulsive force generated by the
+ -- neighbor)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ else
+ for _,u in ipairs(graph.nodes) do
+ if u.name ~= v.name then
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the repulsive force vector
+ local repulsive_force = accurate_repulsive_force(delta:norm(), u.weight)
+ local force = delta:normalized():timesScalar(repulsive_force)
+
+ -- remember the repulsive force so we can later subtract them
+ -- when computing the attractive forces
+ repulsive_forces[u] = repulsive_force
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+ end
+
+ -- compute attractive forces between v and its neighbors
+ for _,edge in ipairs(v.edges) do
+ local u = edge:getNeighbour(v)
+
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ -- compute the spring force between them
+ local attr_force = attractive_force(delta:norm(), #v.edges, u.weight, u.charged, repulsive_forces[u])
+ local force = delta:normalized():timesScalar(attr_force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+
+ -- remember the previous position of v
+ old_position = v.pos:copy()
+
+ if d:norm() > 0 then
+ -- reposition v according to the force vector and the current temperature
+ v.pos = v.pos:plus(d:normalized():timesScalar(math.min(step_length, d:norm())))
+ end
+
+ -- we need to improve the system energy as long as any of
+ -- the node movements is large enough to assume we're far
+ -- away from the minimum system energy
+ if v.pos:minus(old_position):norm() > spring_length * self.convergence_tolerance then
+ converged = false
+ end
+ end
+ end
+
+ -- update the step length using the conservative cooling scheme
+ step_length = self.cooling_factor * step_length
+ end
+end
+
+
+
+-- Fixes nodes at their specified positions.
+--
+function SpringElectricalWalshaw2000:fixateNodes(graph)
+ local number_of_fixed_nodes = 0
+
+ for _,node in ipairs(graph.nodes) do
+ -- read the 'desired at' option of the node
+ local coordinate = node:getOption('desired at')
+
+ if coordinate then
+ -- parse the coordinate
+ node.pos.x = coordinate.x
+ node.pos.y = coordinate.y
+
+ -- mark the node as fixed
+ node.fixed = true
+
+ number_of_fixed_nodes = number_of_fixed_nodes + 1
+ end
+ end
+ if number_of_fixed_nodes > 1 then
+ self.growth_direction = "fixed" -- do not grow, orientation is now fixed
+ end
+end
+
+
+
+function SpringElectricalWalshaw2000:buildQuadtree(graph)
+ -- compute the minimum x and y coordinates of all nodes
+ local min_pos = graph.nodes[1].pos
+ for _,node in ipairs(graph.nodes) do
+ min_pos = Vector.new(2, function (n) return math.min(min_pos[n], node.pos[n]) end)
+ end
+
+ -- compute maximum x and y coordinates of all nodes
+ local max_pos = graph.nodes[1].pos
+ for _,node in ipairs(graph.nodes) do
+ max_pos = Vector.new(2, function (n) return math.max(max_pos[n], node.pos[n]) end)
+ end
+
+ -- make sure the maximum position is at least a tiny bit
+ -- larger than the minimum position
+ if min_pos:equals(max_pos) then
+ max_pos = max_pos:plus(Vector.new(2, function (n)
+ return 0.1 + lib.random() * 0.1
+ end))
+ end
+
+ -- make sure to make the quadtree area slightly larger than required
+ -- in theory; for some reason Lua will otherwise think that nodes with
+ -- min/max x/y coordinates are outside the box... weird? yes.
+ min_pos = min_pos:minusScalar(1)
+ max_pos = max_pos:plusScalar(1)
+
+ -- create the quadtree
+ quadtree = QuadTree.new(min_pos.x, min_pos.y,
+ max_pos.x - min_pos.x,
+ max_pos.y - min_pos.y)
+
+ -- insert nodes into the quadtree
+ for _,node in ipairs(graph.nodes) do
+ local particle = QuadTree.Particle.new(node.pos, node.weight)
+ particle.node = node
+ quadtree:insert(particle)
+ end
+
+ return quadtree
+end
+
+
+
+-- done
+
+return SpringElectricalWalshaw2000
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringHu2006.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringHu2006.lua
new file mode 100644
index 0000000000..86b65abc83
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringHu2006.lua
@@ -0,0 +1,386 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+local SpringHu2006 = {}
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+
+---
+
+declare {
+ key = "spring Hu 2006 layout",
+ algorithm = SpringHu2006,
+
+ preconditions = {
+ connected = true,
+ loop_free = true,
+ simple = true,
+ },
+
+ old_graph_model = true,
+
+ summary = [["
+ Implementation of a spring graph drawing algorithm based on
+ a paper by Hu.
+ "]],
+ documentation = [["
+ \begin{itemize}
+ \item
+ Y. Hu.
+ \newblock Efficient, high-quality force-directed graph drawing.
+ \newblock \emph{The Mathematica Journal}, 2006.
+ \end{itemize}
+
+ There are some modifications compared to the original algorithm,
+ see the Diploma thesis of Pohlmann for details.
+ "]]
+}
+
+
+-- Imports
+
+local PathLengths = require "pgf.gd.lib.PathLengths"
+local Vector = require "pgf.gd.deprecated.Vector"
+
+local CoarseGraph = require "pgf.gd.force.CoarseGraph"
+
+local lib = require("pgf.gd.lib")
+
+
+
+
+function SpringHu2006:run()
+
+ -- Setup some parameters
+ local options = self.digraph.options
+
+ self.iterations = options['iterations']
+ self.cooling_factor = options['cooling factor']
+ self.initial_step_length = options['initial step length']
+ self.convergence_tolerance = options['convergence tolerance']
+
+ self.natural_spring_length = options['node distance']
+
+ self.coarsen = options['coarsen']
+ self.downsize_ratio = options['downsize ratio']
+ self.minimum_graph_size = options['minimum coarsening size']
+
+
+ -- Setup
+
+ self.downsize_ratio = math.max(0, math.min(1, tonumber(self.downsize_ratio)))
+
+ self.graph_size = #self.graph.nodes
+ self.graph_density = (2 * #self.graph.edges) / (#self.graph.nodes * (#self.graph.nodes - 1))
+
+ -- validate input parameters
+ assert(self.iterations >= 0, 'iterations (value: ' .. self.iterations .. ') need to be greater than 0')
+ assert(self.cooling_factor >= 0 and self.cooling_factor <= 1, 'the cooling factor (value: ' .. self.cooling_factor .. ') needs to be between 0 and 1')
+ assert(self.initial_step_length >= 0, 'the initial step length (value: ' .. self.initial_step_length .. ') needs to be greater than or equal to 0')
+ assert(self.convergence_tolerance >= 0, 'the convergence tolerance (value: ' .. self.convergence_tolerance .. ') needs to be greater than or equal to 0')
+ assert(self.natural_spring_length >= 0, 'the natural spring dimension (value: ' .. self.natural_spring_length .. ') needs to be greater than or equal to 0')
+ assert(self.downsize_ratio >= 0 and self.downsize_ratio <= 1, 'the downsize ratio (value: ' .. self.downsize_ratio .. ') needs to be between 0 and 1')
+ assert(self.minimum_graph_size >= 2, 'the minimum coarsening size of coarse graphs (value: ' .. self.minimum_graph_size .. ') needs to be greater than or equal to 2')
+
+ -- initialize node weights
+ for _,node in ipairs(self.graph.nodes) do
+ node.weight = 1
+ end
+
+ -- initialize edge weights
+ for _,edge in ipairs(self.graph.edges) do
+ edge.weight = 1
+ end
+
+
+ -- initialize the coarse graph data structure. note that the algorithm
+ -- is the same regardless whether coarsening is used, except that the
+ -- number of coarsening steps without coarsening is 0
+ local coarse_graph = CoarseGraph.new(self.graph)
+
+ -- check if the multilevel approach should be used
+ if self.coarsen then
+ -- coarsen the graph repeatedly until only minimum_graph_size nodes
+ -- are left or until the size of the coarse graph was not reduced by
+ -- at least the downsize ratio configured by the user
+ while coarse_graph:getSize() > self.minimum_graph_size
+ and coarse_graph:getRatio() <= (1 - self.downsize_ratio)
+ do
+ coarse_graph:coarsen()
+ end
+ end
+
+ if self.coarsen then
+ -- use the natural spring length as the initial natural spring length
+ local spring_length = self.natural_spring_length
+
+ -- compute a random initial layout for the coarsest graph
+ self:computeInitialLayout(coarse_graph.graph, spring_length)
+
+ -- set the spring length to the average edge length of the initial layout
+ spring_length = 0
+ for _,edge in ipairs(coarse_graph.graph.edges) do
+ spring_length = spring_length + edge.nodes[1].pos:minus(edge.nodes[2].pos):norm()
+ end
+ spring_length = spring_length / #coarse_graph.graph.edges
+
+ -- additionally improve the layout with the force-based algorithm
+ -- if there are more than two nodes in the coarsest graph
+ if coarse_graph:getSize() > 2 then
+ self:computeForceLayout(coarse_graph.graph, spring_length, SpringHu2006.adaptive_step_update)
+ end
+
+ -- undo coarsening step by step, applying the force-based sub-algorithm
+ -- to every intermediate coarse graph as well as the original graph
+ while coarse_graph:getLevel() > 0 do
+ -- compute the diameter of the parent coarse graph
+ local parent_diameter = PathLengths.pseudoDiameter(coarse_graph.graph)
+
+ -- interpolate the previous coarse graph from its parent
+ coarse_graph:interpolate()
+
+ -- compute the diameter of the current coarse graph
+ local current_diameter = PathLengths.pseudoDiameter(coarse_graph.graph)
+
+ -- scale node positions by the quotient of the pseudo diameters
+ for _,node in ipairs(coarse_graph.graph) do
+ node.pos:update(function (n, value)
+ return value * (current_diameter / parent_diameter)
+ end)
+ end
+
+ -- compute forces in the graph
+ self:computeForceLayout(coarse_graph.graph, spring_length, SpringHu2006.conservative_step_update)
+ end
+ else
+ -- compute a random initial layout for the coarsest graph
+ self:computeInitialLayout(coarse_graph.graph, self.natural_spring_length)
+
+ -- set the spring length to the average edge length of the initial layout
+ spring_length = 0
+ for _,edge in ipairs(coarse_graph.graph.edges) do
+ spring_length = spring_length + edge.nodes[1].pos:minus(edge.nodes[2].pos):norm()
+ end
+ spring_length = spring_length / #coarse_graph.graph.edges
+
+ -- improve the layout with the force-based algorithm
+ self:computeForceLayout(coarse_graph.graph, spring_length, SpringHu2006.adaptive_step_update)
+ end
+
+ local avg_spring_length = 0
+ for _,edge in ipairs(self.graph.edges) do
+ avg_spring_length = avg_spring_length + edge.nodes[1].pos:minus(edge.nodes[2].pos):norm()
+ end
+ avg_spring_length = avg_spring_length / #self.graph.edges
+end
+
+
+
+function SpringHu2006:computeInitialLayout(graph, spring_length)
+ -- TODO how can supernodes and fixed nodes go hand in hand?
+ -- maybe fix the supernode if at least one of its subnodes is
+ -- fixated?
+
+ -- fixate all nodes that have a 'desired at' option. this will set the
+ -- node.fixed member to true and also set node.pos.x and node.pos.y
+ self:fixateNodes(graph)
+
+ if #graph.nodes == 2 then
+ if not (graph.nodes[1].fixed and graph.nodes[2].fixed) then
+ local fixed_index = graph.nodes[2].fixed and 2 or 1
+ local loose_index = graph.nodes[2].fixed and 1 or 2
+
+ if not graph.nodes[1].fixed and not graph.nodes[2].fixed then
+ -- both nodes can be moved, so we assume node 1 is fixed at (0,0)
+ graph.nodes[1].pos.x = 0
+ graph.nodes[1].pos.y = 0
+ end
+
+ -- position the loose node relative to the fixed node, with
+ -- the displacement (random direction) matching the spring length
+ local direction = Vector.new{x = lib.random(1, spring_length), y = lib.random(1, spring_length)}
+ local distance = 1.8 * spring_length * self.graph_density * math.sqrt(self.graph_size) / 2
+ local displacement = direction:normalized():timesScalar(distance)
+
+ graph.nodes[loose_index].pos = graph.nodes[fixed_index].pos:plus(displacement)
+ else
+ -- both nodes are fixed, initial layout may be far from optimal
+ end
+ else
+ -- use a random positioning technique
+ local function positioning_func(n)
+ local radius = 2 * spring_length * self.graph_density * math.sqrt(self.graph_size) / 2
+ return lib.random(-radius, radius)
+ end
+
+ -- compute initial layout based on the random positioning technique
+ for _,node in ipairs(graph.nodes) do
+ if not node.fixed then
+ node.pos.x = positioning_func(1)
+ node.pos.y = positioning_func(2)
+ end
+ end
+ end
+end
+
+
+
+function SpringHu2006:computeForceLayout(graph, spring_length, step_update_func)
+ -- global (=repulsive) force function
+ function repulsive_force(distance, graph_distance, weight)
+ --return (1/4) * (1/math.pow(graph_distance, 2)) * (distance - (spring_length * graph_distance))
+ return (distance - (spring_length * graph_distance))
+ end
+
+ -- fixate all nodes that have a 'desired at' option. this will set the
+ -- node.fixed member to true and also set node.pos.x and node.pos.y
+ self:fixateNodes(graph)
+
+ -- adjust the initial step length automatically if desired by the user
+ local step_length = self.initial_step_length == 0 and spring_length or self.initial_step_length
+
+ -- convergence criteria etc.
+ local converged = false
+ local energy = math.huge
+ local iteration = 0
+ local progress = 0
+
+ -- compute graph distance between all pairs of nodes
+ local distances = PathLengths.floydWarshall(graph)
+
+ while not converged and iteration < self.iterations do
+ -- remember old node positions
+ local old_positions = lib.map(graph.nodes, function (node) return node.pos:copy(), node end)
+
+ -- remember the old system energy and reset it for the current iteration
+ local old_energy = energy
+ energy = 0
+
+ for _,v in ipairs(graph.nodes) do
+ if not v.fixed then
+ -- vector for the displacement of v
+ local d = Vector.new(2)
+
+ for _,u in ipairs(graph.nodes) do
+ if v ~= u then
+ -- compute the distance between u and v
+ local delta = u.pos:minus(v.pos)
+
+ -- enforce a small virtual distance if the nodes are
+ -- located at (almost) the same position
+ if delta:norm() < 0.1 then
+ delta:update(function (n, value) return 0.1 + lib.random() * 0.1 end)
+ end
+
+ local graph_distance = (distances[u] and distances[u][v]) and distances[u][v] or #graph.nodes + 1
+
+ -- compute the repulsive force vector
+ local force = repulsive_force(delta:norm(), graph_distance, v.weight)
+ local force = delta:normalized():timesScalar(force)
+
+ -- move the node v accordingly
+ d = d:plus(force)
+ end
+ end
+
+ -- really move the node now
+ -- TODO note how all nodes are moved by the same amount (step_length)
+ -- while Walshaw multiplies the normalized force with min(step_length,
+ -- d:norm()). could that improve this algorithm even further?
+ v.pos = v.pos:plus(d:normalized():timesScalar(step_length))
+
+ -- update the energy function
+ energy = energy + math.pow(d:norm(), 2)
+ end
+ end
+
+ -- update the step length and progress counter
+ step_length, progress = step_update_func(step_length, self.cooling_factor, energy, old_energy, progress)
+
+ -- compute the maximum node movement in this iteration
+ local max_movement = 0
+ for _,x in ipairs(graph.nodes) do
+ local delta = x.pos:minus(old_positions[x])
+ max_movement = math.max(delta:norm(), max_movement)
+ end
+
+ -- the algorithm will converge if the maximum movement is below a
+ -- threshold depending on the spring length and the convergence
+ -- tolerance
+ if max_movement < spring_length * self.convergence_tolerance then
+ converged = true
+ end
+
+ -- increment the iteration counter
+ iteration = iteration + 1
+ end
+end
+
+
+
+-- Fixes nodes at their specified positions.
+--
+function SpringHu2006:fixateNodes(graph)
+ local number_of_fixed_nodes = 0
+
+ for _,node in ipairs(graph.nodes) do
+ -- read the 'desired at' option of the node
+ local coordinate = node:getOption('desired at')
+
+ if coordinate then
+ -- apply the coordinate
+ node.pos.x = coordinate.x
+ node.pos.y = coordinate.y
+
+ -- mark the node as fixed
+ node.fixed = true
+
+ number_of_fixed_nodes = number_of_fixed_nodes + 1
+ end
+ end
+ if number_of_fixed_nodes > 1 then
+ self.growth_direction = "fixed" -- do not grow, orientation is now fixed
+ end
+end
+
+
+
+function SpringHu2006.conservative_step_update(step, cooling_factor)
+ return cooling_factor * step, nil
+end
+
+
+
+function SpringHu2006.adaptive_step_update(step, cooling_factor, energy, old_energy, progress)
+ if energy < old_energy then
+ progress = progress + 1
+ if progress >= 5 then
+ progress = 0
+ step = step / cooling_factor
+ end
+ else
+ progress = 0
+ step = cooling_factor * step
+ end
+ return step, progress
+end
+
+
+-- done
+
+return SpringHu2006
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringLayouts.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringLayouts.lua
new file mode 100644
index 0000000000..e3ac58d571
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/SpringLayouts.lua
@@ -0,0 +1,36 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Spring Layouts}
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "spring layout",
+ use = {
+ { key = "spring Hu 2006 layout" },
+ },
+
+ summary = [["
+ This key selects Hu's 2006 spring layout with appropriate settings
+ for some parameters.
+ "]]
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua
new file mode 100644
index 0000000000..2450bba2a2
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua
@@ -0,0 +1,124 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+local SpringElectricNoCoarsenClass = {}
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local ForceController = require "pgf.gd.force.jedi.base.ForceController"
+local ForceCanvasDistance = require "pgf.gd.force.jedi.forcetypes.ForceCanvasDistance"
+local ForceGraphDistance = require "pgf.gd.force.jedi.forcetypes.ForceGraphDistance"
+local Storage = require "pgf.gd.lib.Storage"
+
+---
+declare {
+ key = "spring electric no coarsen layout",
+ algorithm = SpringElectricNoCoarsenClass,
+ preconditions = { connected = true },
+ postconditions = {fixed = true},
+
+ summary = [[
+ This layout uses the algorithm proposed by Fruchterman and Reingold to draw graphs."
+ ]],
+
+ documentation = [[
+ The Fruchterman-Reingold algorithm is one if the oldest methods
+ for force-based graph drawing. It is described in:
+ %
+ \begin{itemize}
+ \item
+ Thomas M.~J.~ Fruchterman and Edward M.~ Reingold,
+ \newblock Graph Drawing by Force-directed Placement,
+ \newblock \emph{Software -- practice and experience,}
+ 21(1 1), 1129-1164, 1991.
+ \end{itemize}
+ %
+ Fruchterman and Reingold had to principles in graph drawing:
+ %
+ \begin{enumerate}
+ \item Vertices connected by an edge should be drawn close to another and
+ \item in general, vertices should not be drawn too close to each other.
+ \end{itemize}
+ %
+ The spring electric no coarsen layout uses spring forces as attractive
+ forces influencing vertex pairs connected by an edge and electric forces
+ as repulsive forces between all vertex pairs. The original algorithm
+ also contained a frame that stopped the vertices from drifting too far
+ apart, but this concept was not implemented. This algorithm will not be
+ affected by coarsening. This layout was implemented by using the Jedi
+ framework.
+ ]],
+
+ example =
+ [[
+ \tikz
+ \graph[spring electric no coarsen layout, speed = 0.35, node distance = 2.5cm, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, coarsen = true, maximum step = 1]{
+ a -- {b, c, d, e, f, g, h, i, j},
+ b -- {c, d, e, f, g, h, i, j},
+ c -- {d, e, f, g, h, i, j},
+ d -- {e, f, g, h, i, j},
+ e -- {f, g, h, i, j},
+ f -- {g, h, i, j},
+ g -- {h, i, j},
+ h -- {i, j},
+ i -- j
+ };
+ ]],
+
+ example =
+ [[
+ \graph[spring electric no coarsen layout, speed = 0.25, node distance = 0.25cm, horizontal = c to l, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, coarsen = false, maximum step = 1]{
+ a -> b -> c -> {d1 -> e -> f -> g -> h -> i -> {j1 -> e, j2 -> l}, d2 -> l -> m}, m -> a
+ };
+ ]]
+}
+
+
+
+
+-- Implementation starts here
+
+--define a local time function
+local time_fun_1
+function time_fun_1 (t_total, t_now)
+ if t_now/t_total <= 0.5 then
+ return 0.5
+ else
+ return 2
+ end
+end
+
+-- define storage table to add attributes if wanted
+local fw_attributes = Storage.newTableStorage()
+
+function SpringElectricNoCoarsenClass:run()
+ -- add options to storage table
+ fw_attributes.options = self.ugraph.options
+
+ --Generate new force class
+ local spring_electric_no_coarsen = ForceController.new(self.ugraph)
+
+ spring_electric_no_coarsen:addForce{
+ force_type = ForceCanvasDistance,
+ fun_u = function (data) return data.k*data.k/(data.d) end,
+ time_fun = time_fun_1,
+ epoch = {"after expand"}
+ }
+ spring_electric_no_coarsen:addForce{
+ force_type = ForceGraphDistance,
+ fun_u = function (data) return -data.d*data.d/(data.k) end,
+ n = 1,
+ epoch = {"after expand"}
+ }
+
+ -- run algorithm
+ spring_electric_no_coarsen:run()
+end
+
+return SpringElectricNoCoarsenClass \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua
new file mode 100644
index 0000000000..57cd1547b6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua
@@ -0,0 +1,95 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+local HuClass = {}
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local ForceController = require "pgf.gd.force.jedi.base.ForceController"
+local ForceCanvasDistance = require "pgf.gd.force.jedi.forcetypes.ForceCanvasDistance"
+local ForceGraphDistance = require "pgf.gd.force.jedi.forcetypes.ForceGraphDistance"
+
+---
+declare {
+ key = "jedi spring electric layout",
+ algorithm = HuClass,
+ documentation_in = "documentation_hu_layout",
+ preconditions = { connected = true },
+ postconditions = {fixed = true},
+
+ summary = "This layout uses the spring electric algorithm proposed by Hu to draw graphs.",
+
+ documentation = [[
+ The spring electric algorithm by Hu uses two kinds of forces and coarsening.
+ It is described in:
+ %
+ \begin{itemize}
+ \item
+ Yifan Hu,
+ \newblock Efficient, high quality force-directed graph drawing,
+ \newblock \emph{The Mathematica Journal,}
+ 10(1), 37--71, 2006.
+ \end{itemize}
+ %
+ This algorithm uses spring forces as attractive forces between vertices
+ connected by an edge and electric forces as repulsive forces between
+ all vertex pairs. Hu introduces coarsening, a procedure which repeatedly
+ merges vertices in order to obtain a smaller version of the graph, to
+ overcome local minima. He also uses the Barnes-Hut algorithm to enhance
+ the runtime of his algorithms. This algorithm is not used in this
+ implementation. This layout was implemented by using the Jedi framework.
+ ]],
+
+ example =
+ [[
+ \tikz
+ \graph[spring electric fw layout, speed = 0.35, node distance = 5cm, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, maximum displacement per step = 10]{
+ a -- {b, c, d, e},
+ b -- {c, d, e},
+ c -- {d, e},
+ d --e
+ };
+ ]],
+
+ example =
+ [[
+ \tikz
+ \graph[spring electric fw layout, speed = 0.35, node distance = 1cm, horizontal = c to l, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, maximum displacement per step = 10]{
+ a -> b -> c -> {d1 -> e -> f -> g -> h -> i -> {j1 -> e, j2 -> l}, d2 -> l -> m}, m -> a
+ };
+ ]]
+}
+
+
+
+
+-- Implementation starts here:
+
+function HuClass:run()
+ -- Generate new force class
+ local hu = ForceController.new(self.ugraph)
+
+ -- add all required forces
+ hu:addForce{
+ force_type = ForceCanvasDistance,
+ fun_u = function (data) return (data.k*data.k)/data.d end,
+ epoch = {"during expand", "after expand"}
+ }
+ hu:addForce{
+ force_type = ForceGraphDistance,
+ fun_u = function (data) return -(data.d*data.d)/data.k end,
+ n = 1,
+ epoch = {"during expand", "after expand"}
+ }
+
+ -- run algorithm
+ hu:run()
+end
+
+return HuClass \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SimpleSpring.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SimpleSpring.lua
new file mode 100644
index 0000000000..4dbae2b1f4
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SimpleSpring.lua
@@ -0,0 +1,74 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+local SimpleSpringClass = {}
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local ForceController = require 'pgf.gd.force.jedi.base.ForceController'
+local ForceGraphDistance = require "pgf.gd.force.jedi.forcetypes.ForceGraphDistance"
+
+---
+declare {
+ key = "trivial spring layout",
+ algorithm = SimpleSpringClass,
+ documentation_in = "pgf.gd.doc.jedi.algorithms.SimpleSpringLayout",
+ preconditions = { connected = true },
+ postconditions = {fixed = true},
+
+ summary = "This layout uses only spring forces to draw graphs.",
+
+ documentation = [[
+ The simple spring algorithm only uses one force kind: A spring force
+ that serves as both attractive and repulsive force. The edges are modeled as
+ springs and act according to Hoke's law: They have an ideal length and will
+ expand if they are contracted below this length, pushing the adjacent
+ vertices away from each other, and contract if it is stretched, pulling the
+ adjacent vertices towards each other. This ideal length is given by the
+ parameter |node distance|. There is no force repelling vertices that are not
+ connected to each other, which can lead to vertices being placed at the same
+ point. It is not a very powerful layout and will probably fail with large
+ graphs, especially if they have few edges. It can however be used to
+ demonstrate the effect of spring forces. This layout was implemented by using
+ the Jedi framework.
+ ]],
+
+ example = [[
+ \tikz
+ \graph[simple spring layout, node distance = 3cm, speed = 2, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, coarsen = true, maximum step = 1]{
+ a -- {b, c, d, e},
+ b -- {c, d, e},
+ c -- {d, e},
+ d --e
+ };
+ ]]
+}
+
+
+
+
+-- Implementation starts here:
+
+function SimpleSpringClass:run()
+ --Generate new force class
+ simple_spring = ForceController.new(self.ugraph)
+
+ --add all required forces
+ simple_spring:addForce{
+ force_type = ForceGraphDistance,
+ fun_u = function (data) return data.k*(data.k-data.d) end,
+ n = 1,
+ epoch = {"after expand", "during expand"}
+ }
+
+ -- run algorithm
+ simple_spring:run()
+end
+
+return SimpleSpringClass \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua
new file mode 100644
index 0000000000..1c8a1bb8d9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua
@@ -0,0 +1,129 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+local SocialClass = {}
+
+--Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local ForceController = require 'pgf.gd.force.jedi.base.ForceController'
+local ForceCanvasDistance = require "pgf.gd.force.jedi.forcetypes.ForceCanvasDistance"
+local ForceCanvasPosition = require "pgf.gd.force.jedi.forcetypes.ForceCanvasPosition"
+local ForceGraphDistance = require "pgf.gd.force.jedi.forcetypes.ForceGraphDistance"
+local PathLengthsFW = require "pgf.gd.force.jedi.base.PathLengthsFW"
+local Storage = require "pgf.gd.lib.Storage"
+
+---
+declare {
+ key = "social closeness layout",
+ algorithm = SocialClass,
+ postconditions = {fixed = true},
+
+ summary = [[
+ This layout uses the social gravity algorithm proposed by Bannister
+ with closeness mass to draw graphs.
+ ]],
+
+ documentation = [[
+ Bannister et all described a social gravity algorithm that can be
+ implemented with different kinds of gravity.
+ It is described in:
+ %
+ \begin{itemize}
+ \item Michael J.~ Bannister and David Eppstein and Michael T~. Goodrich
+ and Lowell Trott,
+ \newblock Force-Directed Graph Drawing Using Social Gravity and Scaling,
+ \newblock \emph{CoRR,}
+ abs/1209.0748, 2012.
+ \end{itemize}
+ %
+ This implementation uses the closeness mass to determine the gravity of each
+ vertex. There are three forces in this algorithm: A spring force as
+ attractive force between vertices connected by an edge, an electric force as
+ repulsive force between all vertex pairs, and a gravitational force pulling
+ all vertices closer to their midpoint. The gravitational force depends on
+ the social mass of a vertex, which can be determined in different ways. This
+ algorithm uses the closeness mass. The closeness of a vertex $u$ is the
+ reciprocal of the sum of the shortest path from $u$ to every other vertex
+ $v$. The gravitational force leads to more "important" vertices ending up
+ closer to the middle of the drawing, since the social mass of a vertex is
+ proportional to its importance. The social layouts work especially well on
+ unconnected graphs like forests. This layout was implemented by using the
+ Jedi framework.
+ ]],
+
+ example = [[
+ \tikz
+ \graph[social closeness layout, speed = 0.9, gravity = 0.2, node distance = 0.65cm, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, find equilibrium = true, maximum step = 5]{
+ a -- a1 -- a2 -- a,
+ b -- b1 -- b2 -- b,
+ c -- c1 -- c2 -- c,
+ d -- d1 -- d2 -- d,
+ e -- e1 -- e2 -- e,
+ f -- f1 -- f2 -- f,
+ g -- g1 -- g2 -- g,
+ h -- h1 -- h2 -- h,
+ i -- i1 -- i2 -- i,
+ j -- j1 -- j2 -- j,
+ a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- a
+ };
+ ]],
+
+ example = [[
+ \tikz
+ \graph[social closeness layout, speed = 0.35, node distance = 0.7cm, maximum step = 5, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, radius = 1cm, gravity = 2]{
+ a -- {a1 -- a2, a3},
+ b -- {b1, b2 -- b3 -- b4 --{b5, b6}},
+ c -- {c1--c2},
+ d -- {d1, d2, d3 -- {d4, d5}, d6 --{d7, d8}}
+ };
+ ]]
+}
+
+local fw_attributes = Storage.newTableStorage()
+
+function SocialClass:run()
+ local dist = PathLengthsFW:breadthFirstSearch(self.ugraph)
+ local tmp
+ for vertex, n in pairs(dist) do
+ tmp = fw_attributes[vertex]
+ local sum = 0
+ for i, w in pairs(n) do
+ sum = sum + w
+ end
+ sum = sum / # self.ugraph.vertices
+ tmp.mass = 1/sum
+ end
+
+ fw_attributes.options = self.ugraph.options
+
+ --Generate new force class
+ social_gravity = ForceController.new(self.ugraph, fw_attributes)
+
+ --add all required forces
+ social_gravity:addForce{
+ force_type = ForceCanvasDistance,
+ fun_u = function (data) return data.k/(data.d*data.d) end,
+ epoch = {"after expand", "during expand"}
+ }
+ social_gravity:addForce{
+ force_type = ForceCanvasPosition,
+ fun_u = function (data) return data.attributes[data.u].mass*data.attributes.options.gravity end,
+ epoch = {"after expand", "during expand"}
+ }
+ social_gravity:addForce{
+ force_type = ForceGraphDistance,
+ fun_u = function (data) return -data.d/(data.k*data.k) end,
+ n = 1,
+ epoch = {"after expand", "during expand"}
+ }
+
+ social_gravity:run()
+end
+
+return SocialClass
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua
new file mode 100644
index 0000000000..6408349107
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua
@@ -0,0 +1,183 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local ForceController = require 'pgf.gd.force.jedi.base.ForceController'
+local ForceCanvasDistance = require "pgf.gd.force.jedi.forcetypes.ForceCanvasDistance"
+local ForceCanvasPosition = require "pgf.gd.force.jedi.forcetypes.ForceCanvasPosition"
+local ForceGraphDistance = require "pgf.gd.force.jedi.forcetypes.ForceGraphDistance"
+local Storage = require "pgf.gd.lib.Storage"
+
+local SocialClass = {}
+
+---
+declare {
+ key = "social degree layout",
+ algorithm = SocialClass,
+ postconditions = {fixed = true},
+
+ summary = [[
+ This layout uses the social gravity algorithm proposed by Bannister
+ with closeness mass to draw graphs.]],
+
+ documentation = [[
+ Bannister et all described a social gravity algorithm that can be
+ implemented with different kinds of gravity.
+ It is described in:
+ %
+ \begin{itemize}
+ \item
+ Michael J.~ Bannister and David Eppstein and Michael T~. Goodrich and
+ Lowell Trott,
+ \newblock Force-Directed Graph Drawing Using Social Gravity and Scaling,
+ \newblock \emph{CoRR,} abs/1209.0748, 2012.
+ \end{itemize}
+ %
+ This implementation uses the degree mass to determine the gravity of each
+ vertex. There are three forces in this algorithm: A spring force as
+ attractive force between vertices connected by an edge, an electric force as
+ repulsive force between all vertex pairs, and a gravitational force pulling
+ all vertices closer to their midpoint. The gravitational force depends on
+ the social mass of a vertex, which can be determined in different ways. This
+ algorithm uses the degree of each vertex as its mass. The gravitational
+ force leads to more "important" vertices ending up closer to the middle of
+ the drawing, since the social mass of a vertex is proportional to its
+ importance. The social layouts work especially well on unconnected graphs
+ like forests. This layout was implemented by using the Jedi framework.
+ ]],
+
+ example =
+ [[
+ \tikz
+ \graph[social degree layout, speed = 0.9, gravity = 0.2, node distance = 0.65cm, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, find equilibrium = true, maximum step = 5]{
+ a -- a1 -- a2 -- a,
+ b -- b1 -- b2 -- b,
+ c -- c1 -- c2 -- c,
+ d -- d1 -- d2 -- d,
+ e -- e1 -- e2 -- e,
+ f -- f1 -- f2 -- f,
+ g -- g1 -- g2 -- g,
+ h -- h1 -- h2 -- h,
+ i -- i1 -- i2 -- i,
+ j -- j1 -- j2 -- j,
+ a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- a
+ };
+ ]],
+
+ example =
+ [[
+ \tikz
+ \graph[social degree layout, speed = 0.35, node distance = 0.7cm, maximum step = 15, nodes={as=,circle, draw, inner sep=3pt,outer sep=0pt}, radius = 1cm, gravity = 0.2]{
+ a -- {a1 -- a2, a3},
+ b -- {b1, b2 -- b3 -- b4 --{b5, b6}},
+ c -- {c1--c2},
+ d -- {d1, d2, d3 -- {d4, d5}, d6 --{d7, d8}}
+ };
+ ]]
+}
+
+---
+declare {
+ key = "gravity",
+ type = "number",
+ initial = 0.2,
+
+ summary = "The gravity key describes the magnitude of the gravitational force.",
+
+ documentation = [[
+ This parameter currently only affects the \lstinline{social degree layout}
+ and the \lstinline{social closeness layout}. The gravity key determines the
+ strength used to pull the vertices to the center of the canvas.
+ ]],
+
+ example =
+ [[
+ \tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, maximum step = 10]{
+ a1[weight = 2] -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+ ]],
+
+ example = [[
+ \tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, gravity = 0.5, maximum step = 10]{
+ a1 -- {a2 [mass = 2], a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+ ]]
+}
+
+
+
+
+-- Implementation starts here:
+
+-- define time functions
+local time_fun_1, time_fun_2, time_fun_3
+
+function time_fun_1 (t_total, t_now)
+ if t_now > 3*t_total/4 then
+ return t_now/t_total
+ end
+ return 0
+end
+
+function time_fun_3 (t_total, t_now)
+ if t_now >= t_total/2 then
+ return 2
+ else
+ return 1
+ end
+end
+
+-- define table to store variables if needed
+local fw_attributes = Storage.newTableStorage()
+
+function SocialClass:run()
+ --initialize masses
+ local tmp
+ for _, vertex in ipairs(self.ugraph.vertices) do
+ tmp = fw_attributes[vertex]
+ tmp.social_mass = #self.ugraph:incoming(vertex)
+ end
+
+ -- add options to storage table
+ fw_attributes.options = self.ugraph.options
+
+ -- generate new force class
+ local social_gravity = ForceController.new(self.ugraph, fw_attributes)
+
+ -- add all required forces
+ social_gravity:addForce{
+ force_type = ForceCanvasDistance,
+ fun_u = function (data) return 4*data.k/(data.d*data.d) end,
+ time_fun = time_fun_2,
+ epoch = {"after expand", "during expand"}
+ }
+ social_gravity:addForce{
+ force_type = ForceCanvasPosition,
+ fun_u = function (data) return data.attributes[data.u].social_mass*data.attributes.options.gravity end,
+ time_fun = time_fun_1,
+ epoch = {"after expand", "during expand"}
+ }
+ social_gravity:addForce{
+ force_type = ForceGraphDistance,
+ fun_u = function (data) return -data.d/(data.k*data.k) end,
+ n = 1,
+ time_fun = time_fun_3,
+ epoch = {"after expand", "during expand"}
+ }
+
+ -- run algorithm
+ social_gravity:run()
+end
+
+return SocialClass \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/CoarseGraphFW.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/CoarseGraphFW.lua
new file mode 100644
index 0000000000..0487214654
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/CoarseGraphFW.lua
@@ -0,0 +1,264 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- A class for creating and handling "coarse" versions of a graph. Such versions contain
+-- less nodes and edges than the original graph while retaining the overall
+-- structure. This class offers functions to create coarse graphs and to expand them
+-- to regain their original size.
+
+-- Imports
+local Digraph = require "pgf.gd.model.Digraph"
+local Vertex = require "pgf.gd.model.Vertex"
+local Arc = require "pgf.gd.model.Arc"
+
+local lib = require "pgf.gd.lib"
+
+local CoarseGraph = Digraph.new()
+CoarseGraph.__index = CoarseGraph
+
+--- Creates a new coarse graph derived from an existing graph.
+--
+-- Generates a coarse graph for the input |Digraph|.
+--
+-- Coarsening describes the process of reducing the amount of vertices in a graph
+-- by merging vertices into pseudo-vertices. There are different strategies,
+-- to decide which vertices should be merged, like merging vertices that belong to edges in a
+-- maximal independent edge set or by creating pseudo-vertices based on a maximal
+-- independent node set. Those strategies are called
+-- schemes.
+--
+-- Coarsening is not performed automatically. The function |CoarseGraph:coarsen|
+-- can be used to further coarsen the graph, or the function |CoarseGraph:uncoarsen|
+-- can be used to restore the previous state.
+--
+-- Note, however, that the input \meta{graph} is always modified in-place, so
+-- if the original version of \meta{graph} is needed in parallel to its
+-- coarse representations, a deep copy of \meta{graph} needs to be passed over
+-- to |CoarseGraph.new|.
+--
+-- @param graph An existing graph that needs to be coarsened.
+-- @param fw_attributes The user defined attributes, possibly attached to vertices.
+
+function CoarseGraph.new(ugraph, fw_attributes)
+ local coarse_graph = {
+ ugraph = ugraph,
+ level = 0,
+ scheme = CoarseGraph.coarsen_independent_edges,
+ ratio = 0,
+ fw_attributes = fw_attributes,
+ collapsed_vertices = {}
+ }
+ setmetatable(coarse_graph, CoarseGraph)
+ return coarse_graph
+end
+
+-- locals for performance
+local find_maximal_matching, arc_function
+
+-- This function performs one coarsening step: It finds all independent vertex
+-- set according to |scheme|, coarsens them and adds the newly created
+-- vertices to the collapsed_vertices table, associating them with the current
+-- level.
+function CoarseGraph:coarsen()
+ -- update the level
+ self.level = self.level + 1
+
+ local vertices = self.ugraph.vertices
+ local old_graph_size = #vertices
+ local c = {}
+ local fw_attributes = self.fw_attributes
+ local ugraph = self.ugraph
+
+ if self.scheme == CoarseGraph.coarsen_independent_edges then
+ local matching = find_matching(ugraph)
+ local collapse_vertex
+
+ for _,arc in ipairs(matching) do
+ -- get the two nodes of the edge that we are about to collapse
+ local a_h = arc.head
+ local a_t = arc.tail
+ local collapse_vertices = {a_h, a_t}
+ collapse_vertex = Vertex.new {weight = 0, mass = 0}
+
+ ugraph:collapse(collapse_vertices,
+ collapse_vertex,
+ function (a,b)
+ a.weight = a.weight + b.weight
+ a.mass = a.mass + b.mass
+ if fw_attributes then
+ for key,value in pairs(fw_attributes[b]) do
+ if fw_attributes.functions[key] then
+ fw_attributes.functions[key](a,b)
+ elseif type(value) == "number" then
+ local tmp = fw_attributes[a]
+ if not tmp[key] then
+ tmp[key] = 0
+ end
+ tmp[key] = tmp[key] + value
+ end
+ end
+ end
+ end,
+ function (a,b)
+ if a.weight == nil then
+ a.weight = b.weight
+ else
+ a.weight = a.weight + b.weight
+ end
+ end)
+
+ local c_v_p = collapse_vertex.pos
+ local a_h_p = a_h.pos
+ local a_t_p = a_t.pos
+ c_v_p.x = (a_h_p.x + a_t_p.x)/2
+ c_v_p.y = (a_h_p.y + a_t_p.y)/2
+
+ c[#c+1] = collapse_vertex
+ ugraph:remove{a_h, a_t}
+ end
+
+ -- Enter all collapsed vertices into a table to uncoarsen one level at a time
+ self.collapsed_vertices[self.level] = c
+ else
+ assert(false, 'schemes other than CoarseGraph.coarsen_independent_edges are not implemented yet')
+ end
+ -- calculate the number of nodes ratio compared to the previous graph
+ self.ratio = #vertices / old_graph_size
+end
+
+-- This function expands all vertices associated with the current level, then
+-- updates the level.
+function CoarseGraph:uncoarsen()
+ local a = self.collapsed_vertices[self.level]
+ local ugraph = self.ugraph
+ local random = lib.random
+ local randomseed = lib.randomseed
+
+ for j=#a,1,-1 do
+ randomseed(42)
+ local to_expand = a[j]
+
+ ugraph:expand(to_expand, function(a,b)
+ b.pos.x = a.pos.x + random()*10
+ b.pos.y = a.pos.y + random()*10
+ end)
+ ugraph:remove{to_expand}
+ ugraph:sync()
+ end
+
+ self.level = self.level - 1
+end
+
+-- Getters
+function CoarseGraph:getSize()
+ return #self.ugraph.vertices
+end
+
+
+function CoarseGraph:getRatio()
+ return self.ratio
+end
+
+
+function CoarseGraph:getLevel()
+ return self.level
+end
+
+
+function CoarseGraph:getGraph()
+ return self.ugraph
+end
+
+-- Private helper function to determine whether the second vertex in the
+-- current arc has been matched already
+--
+-- @param arc The arc in question
+-- @param vertex One of the arc's endpoints, either head or tail
+-- @param matched_vertices The table holding all matched vertices
+--
+-- @return The arc if the other endpoint has not been matched yet
+function arc_function (arc, vertex, matched_vertices)
+ local x
+ if arc.head ~= vertex then
+ x = arc.head
+ else
+ x = arc.tail
+ end
+ if not matched_vertices[x] then
+ return arc
+ end
+end
+
+-- The function finding a maximum matching of independent arcs.
+--
+-- @param ugraph The current graph
+--
+-- @return A table of arcs which are in the matching
+function find_matching(ugraph)
+ local matching = {}
+ local matched_vertices = {}
+ local unmatched_vertices = {}
+ local vertices = ugraph.vertices
+
+ -- iterate over nodes in random order
+ for _,j in ipairs(lib.random_permutation(#vertices)) do
+ local vertex = vertices[j]
+ -- ignore nodes that have already been matched
+ if not matched_vertices[vertex] then
+ local arcs = {}
+ local all_arcs = {}
+ for _,v in pairs(ugraph:incoming(vertex)) do all_arcs[#all_arcs+1] = v end
+ for _,v in pairs(ugraph:outgoing(vertex)) do all_arcs[#all_arcs+1] = v end
+ -- mark the node as matched
+ matched_vertices[vertex] = true
+
+ for _, a in ipairs(all_arcs) do
+ arcs[#arcs +1] = arc_function(a, vertex, matched_vertices)
+ end
+
+ if #arcs > 0 then
+ -- sort edges by the weights of the adjacent vertices
+ table.sort(arcs, function (a, b)
+ local x, y
+ if a.head == vertex then
+ x = a.tail
+ else
+ x = a.head
+ end
+ if b.head == vertex then
+ y = b.tail
+ else
+ y = b.head
+ end
+ return x.weight < y.weight
+ end)
+
+ -- match the node against the neighbor with minimum weight
+ matched_vertices[arcs[1].head] = true
+ matched_vertices[arcs[1].tail] = true
+ table.insert(matching, arcs[1])
+ end
+ end
+ end
+
+ -- generate a list of nodes that were not matched at all
+ for _,j in ipairs(lib.random_permutation(#vertices)) do
+ local vertex = vertices[j]
+ if not matched_vertices[vertex] then
+ table.insert(unmatched_vertices, vertex)
+ end
+ end
+ return matching
+end
+
+
+-- done
+
+return CoarseGraph
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceController.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceController.lua
new file mode 100644
index 0000000000..ab30ada5b3
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceController.lua
@@ -0,0 +1,489 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This class is the most basic class for the Jedi framework. It manages the
+-- forces, epochs, options and streamlines the graph drawing process.
+-- In detail, the force template will do the following:
+-- %
+-- \begin{itemize}
+-- \item Hold the table with all epochs currently defined, and provide
+-- a function to add new ones
+-- \item Hold the table associating forces with the epochs, and provide a
+-- function to add new ones
+-- \item Define all the non-algorithm-specific options provided by Jedi
+-- \item Assert user options to catch exceptions
+-- \item Save user options and library functions to local variables to enhance
+-- runtime.
+-- \item Add any forces that are indicated by set options
+-- \item Find and call the initial positioning algorithm requested
+-- \item Determine if coarsening is enabled, and manage coarsening process if so
+-- \item Call the preprocessing function of each force to obtain a vertex list the
+-- force will be applied to
+-- \item Calculate the forces affecting each vertex.
+-- \item Move the vertices, check for equilibria/used up iterations, update
+-- virtual time
+-- \end{itemize}
+
+local ForceController = {}
+ForceController.__index = ForceController
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local Coordinate = require "pgf.gd.model.Coordinate"
+local CoarseGraph = require 'pgf.gd.force.jedi.base.CoarseGraphFW'
+local PriorityQueue = require "pgf.gd.lib.PriorityQueue"
+local ForcePullToPoint = require "pgf.gd.force.jedi.forcetypes.ForcePullToPoint"
+local ForcePullToGrid = require "pgf.gd.force.jedi.forcetypes.ForcePullToGrid"
+
+local epochs = {
+ [1] = "preprocessing",
+ [2] = "initial layout",
+ [3] = "start coarsening process",
+ [4] = "before coarsen",
+ [5] = "start coarsen",
+ [6] = "during coarsen",
+ [7] = "end coarsen",
+ [8] = "before expand",
+ [9] = "start expand",
+ [10] = "during expand",
+ [11] = "end expand",
+ [12] = "end coarsening process",
+ [13] = "after expand",
+ [14] = "postprocessing"
+}
+
+-- Automatic parameter generation for epoch-variables
+for _,e in ipairs(epochs) do
+ ---
+ declare {
+ key = "iterations " .. e,
+ type = "number"
+ }
+
+ ---
+ declare {
+ key = "maximum displacement per step " .. e,
+ type = "number"
+ }
+
+ ---
+ declare {
+ key = "global speed factor " .. e,
+ type = "length"
+ }
+
+ ---
+ declare {
+ key = "maximum time " .. e,
+ type = "number"
+ }
+
+ ---
+ declare {
+ key = "find equilibrium ".. e,
+ type = "boolean"
+ }
+
+ ---
+ declare {
+ key = "equilibrium threshold ".. e,
+ type = "number"
+ }
+end
+
+-- Implementation starts here
+
+--- Function allowing user to add an at the specified position
+--
+-- @params epoch A string that names the epoch
+-- @params position The position in the epoch array at which the epoch should be inserted
+
+function ForceController:addEpoch(epoch, position)
+ table.insert(epochs, position, epoch)
+end
+
+--- Function allowing the user to find an epoch's position in the epoch table
+--
+-- @params epoch The epoch who's position we are trying to find
+--
+-- @return An integer value matching the epch's index, or $-1$ if epoch was not found
+
+function ForceController:findEpoch(epoch)
+ for j, e in ipairs(epochs) do
+ if e == epoch then
+ return j
+ end
+ end
+ return -1
+end
+
+
+-- locals for performance
+local net_forces = {}
+local sqrt = math.sqrt
+local abs = math.abs
+local sum_up, options, move_vertices, get_net_force, preprocessing, epoch_forces
+
+--- Creating a new force algorithm
+-- @params ugraph The ugraph object the graph drawing algorithm will run on
+-- @params fw_attributes The storage object holding the additional attributes defined by
+-- the engineer
+--
+-- @returns A new instance of force template
+function ForceController.new(ugraph, fw_attributes)
+ return setmetatable(
+ {epoch_forces = {},
+ ugraph = ugraph,
+ fw_attributes = fw_attributes,
+ pull_to_point = false,
+ }, ForceController)
+end
+
+--- Running the force algorithm
+
+function ForceController:run()
+ -- locals for performance
+ local ugraph = self.ugraph
+ local coarse_graph = CoarseGraph.new(ugraph, self.fw_attributes)
+ local vertices_initalized = false
+ options = ugraph.options
+ epoch_forces = self.epoch_forces
+ local minimum_graph_size = options["minimum coarsening size"]
+ local vertices = ugraph.vertices
+ local arcs = ugraph.arcs
+ local downsize_ratio = options["downsize ratio"]
+ local natural_spring_length = options["node distance"]
+ local snap_to_grid = options["snap to grid"]
+ local coarsen = options["coarsen"]
+
+ -- Assert user input
+ assert(minimum_graph_size >= 2, 'the minimum coarsening size of coarse graphs (value: ' .. minimum_graph_size .. ') needs to be greater than or equal to 2')
+ assert(downsize_ratio >= 0 and downsize_ratio <=1, 'the downsize ratio of the coarse graphs (value: ' .. downsize_ratio .. ') needs to be greater than or equal to 0 and smaller than or equal to 1')
+ assert(natural_spring_length >= 0, 'the node distance (value: ' .. natural_spring_length .. ') needs to be greater than or equal to 0')
+
+ -- initialize vertex and arc weights
+ for _,vertex in ipairs(vertices) do
+ vertex.weight = vertex.options["coarsening weight"]
+ vertex.mass = vertex.options.mass
+ end
+
+ for _,arc in ipairs(arcs) do
+ arc.weight = 1
+ end
+
+ -- Initialize epoch_forces table entries as empty tables
+ for _, e in ipairs(epochs) do
+ if not self.epoch_forces[e] then
+ self.epoch_forces[e] = {}
+ end
+ end
+
+ -- Find initial positioning algorithm
+ local initial_positioning_class = options.algorithm_phases['initial positioning force framework'] -- initial_types[self.initial_layout]
+
+ -- If snap to grid option is set and no force was added yet, add an extra
+ -- force to post-processing
+ if snap_to_grid then
+ self:addForce{
+ force_type = ForcePullToGrid,
+ cap = 1,
+ time_fun = function() return 40 end,
+ epoch = {"postprocessing"}
+ }
+ options["iterations postprocessing"] = options["iterations postprocessing"] or 200
+ options["maximum time postprocessing"] = options["maximum time postprocessing"] or 200
+ options["find equilibrium postprocessing"] = options["find equilibrium postprocessing"] or true
+ options["equilibrium threshold postprocessing"] = options["equilibrium threshold postprocessing"] or 1
+ options["maximum displacement per step postprocessing"] = options["maximum displacement per step postprocessing"] or 1
+ options["global speed factor postprocessing"] = options["global speed factor postprocessing"] or 1
+ end
+
+ -- Find marker epochs
+ local start_coarsening = self:findEpoch("start coarsening process")
+ local end_coarsening = self:findEpoch("end coarsening process")
+ local start_coarsen = self:findEpoch("start coarsen")
+ local end_coarsen = self:findEpoch("end coarsen")
+ local start_expand = self:findEpoch("start expand")
+ local end_expand = self:findEpoch("end expand")
+
+
+ -- iterate over epoch table
+ local i = 1
+ while i <= #epochs do
+ local e = epochs[i]
+
+ local iterations = options["iterations "..e] or options["iterations"]
+ -- assert input
+ assert(iterations >= 0, 'iterations (value: ' .. iterations .. ') needs to be greater than 0')
+
+ -- Check for desired vertices and collect them in a table if any are found
+ local desired = false
+ local desired_vertices = {}
+ -- initialize node weights
+ for _,vertex in ipairs(vertices) do
+ if vertex.options then
+ if vertex.options["desired at"] then
+ desired = true
+ desired_vertices[vertex] = vertex.options["desired at"]
+ end
+ end
+ end
+
+ -- Add pull to point force if desired vertices were found and engineer did not add
+ -- this force
+ if desired and not self.pull_to_point then
+ self:addForce{
+ force_type = ForcePullToPoint,
+ time_fun = function(t_now, t_max) return 5 end
+ }
+ end
+
+ -- initialize the coarse graph data structure.
+ if coarsen then
+ -- vertices = coarse_graph.ugraph.vertices
+ -- arcs = coarse_graph.ugraph.arcs
+ if i >= start_coarsening and i < end_coarsening then
+ -- coarsen the graph repeatedly until only minimum_graph_size nodes
+ -- are left or until the size of the coarse graph was not reduced by
+ -- at least the downsize ratio configured by the user
+ if i >= start_coarsen and i < start_expand then
+ if coarse_graph:getSize() > minimum_graph_size and coarse_graph:getRatio() <= (1 - downsize_ratio) then
+ if i == start_coarsen then
+ coarse_graph:coarsen()
+ elseif i < end_coarsen then
+ preprocessing(coarse_graph.ugraph.vertices, coarse_graph.ugraph.arcs, e, coarse_graph.ugraph)
+ move_vertices(coarse_graph.ugraph.vertices, e)
+ else
+ i = start_coarsen - 1
+ end
+ end
+ end
+
+ -- between coarsening and expanding
+ if (i > end_coarsen) and (i < start_expand) then
+ -- use the natural spring length as the initial natural spring length
+ local spring_length = natural_spring_length
+
+ if not vertices_initalized then
+ initial_positioning_class.new { vertices = coarse_graph.ugraph.vertices,
+ options = options,
+ desired_vertices = desired_vertices
+ }:run()
+ vertices_initalized = true
+ end
+
+ preprocessing(coarse_graph.ugraph.vertices, coarse_graph.ugraph.arcs, e, coarse_graph.ugraph)
+
+ -- set the spring length to the average arc length of the initial layout
+ local spring_length = 0
+ for _,arc in ipairs(arcs) do
+ local x = abs(arc.head.pos.x - arc.tail.pos.x)
+ local y = abs(arc.head.pos.y - arc.tail.pos.y)
+ spring_length = spring_length + sqrt(x * x + y * y)
+ end
+ spring_length = spring_length / #arcs
+
+ -- additionally improve the layout with the force-based algorithm
+ -- if there are more than two nodes in the coarsest graph
+ if coarse_graph:getSize() > 2 and end_coarsen and not start_expand then
+ move_vertices(coarse_graph.ugraph.vertices, e)
+ end
+ end
+
+ -- undo coarsening step by step, applying the force-based sub-algorithm
+ -- to every intermediate coarse graph as well as the original graph
+ if i >= start_expand then
+ if coarse_graph:getLevel() > 0 then
+ if i == start_expand then
+ coarse_graph:uncoarsen()
+ elseif i < end_expand then
+ preprocessing(coarse_graph.ugraph.vertices, coarse_graph.ugraph.arcs, e, coarse_graph.ugraph)
+ move_vertices(coarse_graph.ugraph.vertices, e)
+ else
+ i = start_expand - 1
+ end
+ else
+ preprocessing(coarse_graph.ugraph.vertices, coarse_graph.ugraph.arcs, e, coarse_graph.ugraph)
+ move_vertices(coarse_graph.ugraph.vertices, e)
+ end
+ end
+ -- Before and after the coarsening process
+ elseif i < start_coarsening or i > end_coarsening then
+ if not vertices_initalized then
+ initial_positioning_class.new {
+ vertices = coarse_graph.ugraph.vertices,
+ options = options,
+ desired_vertices = desired_vertices }:run()
+ vertices_initalized = true
+ end
+ preprocessing(coarse_graph.ugraph.vertices, coarse_graph.ugraph.arcs, e, coarse_graph.ugraph)
+ move_vertices(coarse_graph.ugraph.vertices, e)
+ end
+ else
+ -- Same without coarsen
+ if i < start_coarsening or i > end_coarsening then
+ if not vertices_initalized then
+ initial_positioning_class.new {
+ vertices = vertices,
+ options = options,
+ desired_vertices = desired_vertices }:run()
+ vertices_initalized = true
+ end
+ preprocessing(vertices, arcs, e, ugraph)
+ move_vertices(vertices, e, self.ugraph)
+ end
+ end
+ i = i + 1
+ end
+end
+
+
+--- Preprocessing for all force types in force configuration
+--
+-- @params v The vertices of the current graph
+-- @params a The arcs of the current graph
+-- @params epoch The preprocessing algorithm will only be applied to the forces
+-- associated with this epoch.
+-- @params ugraph The current graph object
+
+function preprocessing(v, a, epoch, ugraph)
+ for _, fc in ipairs(epoch_forces[epoch]) do
+ fc:preprocess(v, a, ugraph)
+ end
+end
+
+
+--- Adding forces to the algorithm.
+--
+-- @params force_data A table containing force type, time function, force function,
+-- capping thresholds and the epochs in which this force will be active
+
+function ForceController:addForce(force_data)
+ local t = force_data.force_type
+ if t == ForcePullToPoint then
+ self.pull_to_point = true
+ end
+
+ local f = t.new {force = force_data, options = self.ugraph.options, fw_attributes = self.fw_attributes or {}}
+ if force_data.epoch == nil then
+ force_data.epoch = {}
+ end
+ for _,e in ipairs(force_data.epoch) do
+ local tab = self.epoch_forces[e]
+ if not tab then
+ tab = {}
+ end
+ tab[#tab +1] = f
+ self.epoch_forces[e] = tab
+ end
+end
+
+
+--- Moving vertices according to force functions until the maximum number of
+-- iterations is reached
+--
+-- @params vertices The vertices in the current graph
+-- @params epoch The current epoch, to find the forces that are active
+
+function move_vertices(vertices, epoch, g)
+ if #epoch_forces[epoch] == 0 then
+ return
+ end
+ local iterations = options["iterations ".. epoch] or options["iterations"]
+ local find_equilibrium = options["find equilibrium ".. epoch] or options["find equilibrium"]
+ local epsilon = options["equilibrium threshold ".. epoch] or options["equilibrium threshold"]
+ local speed = options["global speed factor ".. epoch] or options["global speed factor"]
+ local max_step = options["maximum displacement per step ".. epoch] or options["maximum displacement per step"]
+
+ assert(epsilon >= 0, 'the threshold for finding an equilibirum (equilibrium threshold) (value: ' .. epsilon .. ') needs to be greater than or equal to 0')
+ assert(speed > 0, 'the speed at which the vertices move (value: ' .. speed .. ') needs to be greater than 0')
+ assert(max_step > 0, 'the maximum displacement per step each vertex can move per iteration (value: ' .. max_step .. ') needs to be greater than 0')
+
+ local max_time = options["maximum time ".. epoch] or options["maximum time"]
+ local d_t = max_time/iterations
+ local t_now = 0
+ local random = lib.random
+ local randomseed = lib.randomseed
+
+ for j = 1 , iterations do
+ t_now = t_now + d_t
+ net_forces = get_net_force(vertices, j, t_now, epoch)
+
+ -- normalize the force vector if necessary
+ for v, c in pairs(net_forces) do
+ local n = sqrt(c.x*c.x+c.y*c.y)
+ if n > max_step then
+ local factor = max_step/n
+ c.x = c.x*factor
+ c.y = c.y*factor
+ end
+ end
+
+ -- if not in equilibrium yet, apply forces
+ if not find_equilibrium or sum_up(net_forces)*d_t > epsilon then
+ local cool_down_dt = d_t
+ if cool_down_dt > 1 then
+ cool_down_dt = 1 + 1/d_t
+ end
+ for _, v in ipairs(vertices) do
+ local factor = 1/(v.mass or 1)
+ local c1 = net_forces[v]
+ local x = speed * cool_down_dt * c1.x * factor
+ local y = speed * cool_down_dt * c1.y * factor
+ local p = v.pos
+ p.x = p.x + x
+ p.y = p.y + y
+ end
+ else
+ break
+ end
+ end
+end
+
+
+-- calculate the net force for each vertex in one iteration
+--
+-- @params vertices the vertices of the current graph
+-- @params j The current iteration
+-- @params t_now The current virtual time
+-- @params epoch The current epoch
+--
+-- @return A table of coordinate-objects associated with vertices. The
+-- coordinate object hold the calculated net displacement for
+-- the $x$ and $y$ coordinate.
+function get_net_force(vertices, j, t_now, epoch)
+ local net_forces = {}
+ local natural_spring_length = options["node distance"]
+
+ for _,v in ipairs(vertices) do
+ net_forces[v] = Coordinate.new(0,0)
+ end
+
+ for _,force_class in ipairs(epoch_forces[epoch]) do
+ force_class:applyTo{net_forces = net_forces, options = options, j = j, t_now = t_now, k = natural_spring_length}
+ end
+
+ return net_forces
+end
+
+-- Helper function to sum up all calculated forces
+--
+-- @params tab A table holding coordinate objects as values
+--
+-- @returns The sum of the absolute $x$ and $y$ values in this table
+function sum_up(tab)
+ local sum = 0
+ for v, c in pairs(tab) do
+ sum = sum + abs(c.x) + abs(c.y)
+ end
+ return sum
+end
+
+return ForceController
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceTemplate.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceTemplate.lua
new file mode 100644
index 0000000000..29370fc029
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/ForceTemplate.lua
@@ -0,0 +1,44 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This is the parent class for forces. It provides a constructor and methods
+-- stubs to be overwritten in the subclasses.
+
+-- Imports
+local lib = require "pgf.gd.lib"
+
+local ForceTemplate = lib.class {}
+
+-- constructor
+function ForceTemplate:constructor()
+ self.force = self.force
+ self.fw_attributes = self.fw_attributes
+ if not self.force.time_fun then
+ self.force.time_fun = function() return 1 end
+ end
+end
+
+-- Method stub for preprocessing
+--
+-- @param v The vertices the list will be build on
+
+function ForceTemplate:preprocess(v)
+end
+
+-- Method stub for applying the forces
+--
+-- @param data A table holding data like the table the forces are collected
+-- in, the current iteration, the current time stamp, some options
+-- or the natural spring length
+
+function ForceTemplate:applyTo(data)
+end
+
+return ForceTemplate \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/InitialTemplate.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/InitialTemplate.lua
new file mode 100644
index 0000000000..762717f64a
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/InitialTemplate.lua
@@ -0,0 +1,64 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This is the parent class for initial layout algorithms. It provides a
+-- constructor and methods stubs to be overwritten in the subclasses as well
+-- as placing vertices which are |desired at| a certain point.
+
+-- Imports
+local lib = require "pgf.gd.lib"
+
+local InitialTemplate = lib.class {}
+
+-- constructor
+function InitialTemplate:constructor()
+ self.vertices = self.vertices
+ self.options = self.options
+ self.desired_vertices = self.desired_vertices
+end
+
+-- Method placing |desired at| vertices at the point they are desired
+--
+-- @params desired_vertices A table containing all the vertices where the
+-- |desired at| option is set.
+--
+-- @return |placed| A boolean array stating if vertices have been placed yet
+-- @return |centroid_x| The x-coordinate of the midpoint of all placed vertices
+-- @return |centroid_y| The y-coordinate of the midpoint of all placed vertices
+
+function InitialTemplate:desired(desired_vertices)
+ local placed = {}
+
+ local centroid_x, centroid_y = 0, 0
+
+ local size = 0
+ for v, da in pairs(desired_vertices) do
+ local p = v.pos
+ local x, y = da.x, da.y
+ p.x = x or 0
+ p.y = y or 0
+ centroid_x = centroid_x + x
+ centroid_y = centroid_y + y
+ placed[v] = true
+ size = size +1
+ end
+ if size>0 then
+ centroid_x = centroid_x / size
+ centroid_y = centroid_y / size
+ end
+
+ return placed, centroid_x, centroid_y
+end
+
+-- Method stub for running the layout algorithm
+function InitialTemplate:run()
+end
+
+return InitialTemplate \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/PathLengthsFW.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/PathLengthsFW.lua
new file mode 100644
index 0000000000..2d50677fa5
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/PathLengthsFW.lua
@@ -0,0 +1,174 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+--- This is a helper class providing different functions that deal with graph
+-- distances. This class can be used by engineers and implementers if they
+-- need to calculate anything regarding graph distances.
+
+local PathLengths = {}
+
+-- Imports
+local PriorityQueue = require "pgf.gd.lib.PriorityQueue"
+local Preprocessing = require "pgf.gd.force.jedi.base.Preprocessing"
+
+-- This algorithm conducts a breadth first search on the graph it is given.
+--
+-- @param ugraph The graph on which the search should be conducted
+--
+-- @return A table holding every vertex $v$ as key and a table as value. The
+-- value table holds all other vertices $u$ as keys and their shortest
+-- distance to $v$ as value
+
+function PathLengths:breadthFirstSearch(ugraph)
+ local distances = {}
+ local vertices = ugraph.vertices
+ local arcs = ugraph.arcs
+
+ for _,v in ipairs(vertices) do
+ distances[v] = {}
+ local dist = distances[v]
+ for _,w in ipairs(vertices) do
+ dist[w] = #vertices +1
+ end
+ dist[v] = 0
+ end
+ local n = 1
+ local p = Preprocessing.overExactlyNPairs(vertices, arcs, n)
+ while (#p > 0) do
+ for _, v in ipairs(p) do
+ local tab = distances[v.tail]
+ tab[v.head] = n
+ end
+ n = n + 1
+ p = Preprocessing.overExactlyNPairs(vertices, arcs, n)
+ end
+ return(distances)
+end
+
+
+-- This function performs Dijkstra's algorithm on the graph.
+--
+-- @param ugraph The graph where the paths should be found
+-- @param source The source vertex
+--
+-- @return |distance| A table holding every vertex $v$ as key and a table as
+-- value. The value table holds all other vertices $u$ as
+-- keys and their shortest distance to $v$ as value
+-- @return |levels| A table holding the levels of the graph as keys and a
+-- table holding the vertices found on that level as values
+-- @return |parent| A table holding each vertex as key and it's parent vertex
+-- as value
+
+function PathLengths:dijkstra(ugraph, source)
+ local distance = {}
+ local levels = {}
+ local parent = {}
+
+ local queue = PriorityQueue.new()
+
+ -- reset the distance of all nodes and insert them into the priority queue
+ for _,v in ipairs(ugraph.vertices) do
+ if v == source then
+ distance[v] = 0
+ parent[v] = nil
+ queue:enqueue(v, distance[v])
+ else
+ distance[v] = #ugraph.vertices + 1 -- this is about infinity ;)
+ queue:enqueue(v, distance[v])
+ end
+ end
+
+ while not queue:isEmpty() do
+ local u = queue:dequeue()
+
+ assert(distance[u] < #ugraph.vertices + 1, 'the graph is not connected, Dijkstra will not work')
+
+ if distance[u] > 0 then
+ levels[distance[u]] = levels[distance[u]] or {}
+ table.insert(levels[distance[u]], u)
+ end
+
+
+
+ for _,edge in ipairs(ugraph:outgoing(u)) do
+ local v = edge.head
+ local alternative = distance[u] + 1
+ if alternative < distance[v] then
+ distance[v] = alternative
+
+ parent[v] = u
+
+ -- update the priority of v
+ queue:updatePriority(v, distance[v])
+ end
+ end
+ end
+
+ return distance, levels, parent
+end
+
+-- This function finds the pseudo diameter of the graph, which is the longest
+-- shortest path in the graph
+--
+-- @param ugraph The graph who's pseudo diameter is wanted
+--
+-- @ return |diameter| The pseudo diameter of the graph
+-- @ return |start_node| The start node of the longest shortest path in the
+-- graph
+-- @ return |end_node| The end node of the longest shortest path in the graph
+
+function PathLengths:pseudoDiameter(ugraph)
+
+ -- find a node with minimum degree
+ local start_node = ugraph.vertices[1]
+ for _,v in ipairs(ugraph.vertices) do
+ if #ugraph:incoming(v) + #ugraph:outgoing(v) < #ugraph:incoming(start_node) + #ugraph:outgoing(start_node) then
+ start_node = v
+ end
+ end
+
+ assert(start_node)
+
+ local old_diameter = 0
+ local diameter = 0
+ local end_node = nil
+
+ while true do
+ local distance, levels = self:dijkstra(ugraph, start_node)
+
+ -- the number of levels is the same as the distance of the nodes
+ -- in the last level to the start node
+ old_diameter = diameter
+ diameter = #levels
+
+ -- abort if the diameter could not be improved
+ if diameter == old_diameter then
+ end_node = levels[#levels][1]
+ break
+ end
+
+ -- select the node with the smallest degree from the last level as
+ -- the start node for the next iteration
+ start_node = levels[#levels][1]
+ for _,node in ipairs(levels[#levels]) do
+ if #ugraph:incoming(node)+#ugraph:outgoing(node) < #ugraph:incoming(start_node) + #ugraph:outgoing(start_node) then
+ start_node = node
+ end
+ end
+
+ assert(start_node)
+ end
+
+ assert(start_node)
+ assert(end_node)
+
+ return diameter, start_node, end_node
+end
+
+return PathLengths \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/Preprocessing.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/Preprocessing.lua
new file mode 100644
index 0000000000..de59e0cb5c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/base/Preprocessing.lua
@@ -0,0 +1,122 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- This file may be distributed an/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 information
+
+
+--- This file holds functions to create lists of vertex pairs. All
+-- functions return a Graph object containing the vertices of the
+-- original graph and an edge between the vertices forming a pair
+-- under the specified conditions. The lists can be precomputed to
+-- enhance performance.
+
+local PreprocessClass = {}
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local Digraph = require "pgf.gd.model.Digraph"
+
+
+-- Creates a graph object with an arc between all pairwise disjoint vertex
+-- pairs and returns the arc table
+--
+-- @param vertices The vertices of the original graph
+--
+-- @return An arc table
+
+function PreprocessClass.allPairs(vertices)
+ local aP = Digraph.new{}
+ for _, vertex in ipairs(vertices) do
+ for _, vertex2 in ipairs(vertices) do
+ if vertex ~= vertex2 then
+ if not aP:contains(vertex) then
+ aP:add {vertex}
+ end
+ if not aP:contains(vertex2) then
+ aP:add {vertex2}
+ end
+ if not aP:arc(vertex, vertex2) and not aP:arc(vertex2, vertex) then
+ aP:connect(vertex, vertex2)
+ end
+ end
+ end
+ end
+ return aP.arcs
+end
+
+
+-- Creates a graph object with an arc between all pairwise disjoint vertex
+-- pairs that are connected by a shortest path of length n in the original
+-- graph and returns the arc table
+--
+-- @param vertices The vertices of the original graph
+-- @param arcs The arcs of the original graph
+-- @param n The length of the shortest path we are looking for
+--
+-- @return An arc table
+
+function PreprocessClass.overExactlyNPairs(vertices, arcs, n)
+ local waste, p_full = PreprocessClass.overMaxNPairs(vertices, arcs, n)
+ local waste, p_small = PreprocessClass.overMaxNPairs(vertices, arcs, n-1)
+ for _, paar in ipairs(p_full.arcs) do
+ if p_small:arc(paar.head, paar.tail) ~= nil or p_small:arc(paar.tail, paar.head) ~= nil then
+ p_full:disconnect(paar.head, paar.tail)
+ p_full:disconnect(paar.tail, paar.head)
+ end
+ end
+ return p_full.arcs
+end
+
+
+-- Creates a graph object with an arc between all pairwise disjoint vertex
+-- pairs that are connected by a shortest path of length n or shorter in the
+-- original graph and returns the arc table
+--
+-- @param vertices The vertices of the original graph
+-- @param arcs The arcs of the original graph
+-- @param n The length of the shortest path we are looking for
+--
+-- @return An arc table
+
+function PreprocessClass.overMaxNPairs(vertices, arcs, n)
+ assert(n >= 0, 'n (value: ' .. n.. ') needs to be greater or equal 0')
+ local p = Digraph.new{}
+ local oneHop = Digraph.new{}
+ if n> 0 then
+ for _, arc in ipairs(arcs) do
+ local vertex = arc.head
+ local vertex2 = arc.tail
+ if not p:contains(vertex) then
+ p:add {vertex}
+ oneHop:add {vertex}
+ end
+ if not p:contains(vertex2) then
+ p:add {vertex2}
+ oneHop:add {vertex2}
+ end
+ if p:arc(vertex, vertex2) == nil and p:arc(vertex2, vertex) == nil then
+ p:connect(vertex, vertex2)
+ oneHop:connect(vertex, vertex2)
+ end
+ end
+ end
+
+ n = n-1
+ while n > 0 do
+ for _, paar in ipairs(p.arcs) do
+ for _, vertex in ipairs(vertices) do
+ if paar.head ~= vertex and p:arc(paar.head, vertex) == nil and p:arc(vertex, paar.head) == nil and (oneHop:arc(paar.tail, vertex) ~= nil or oneHop:arc(vertex, paar.tail) ~= nil) then
+ p:connect(paar.head, vertex)
+ end
+ end
+ end
+ n = n-1
+ end
+ return p.arcs, p
+end
+
+return PreprocessClass
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/doc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/doc.lua
new file mode 100644
index 0000000000..19baca7333
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/doc.lua
@@ -0,0 +1,377 @@
+-- Copyright 2014 by Ida Bruhns and Till Tantau
+--
+-- 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 information
+
+-- Imports
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "maximum step"
+
+summary
+[[
+This option determines the maximum distance every vertex is allowed to travel
+in one iteration.
+]]
+
+documentation
+[[
+No matter how large the forces influencing a vertex, the effect
+on the drawing should be limited to avoid vertices "jumping" from one side of
+the canvas to each other due to a strong force pulling them further than their
+ideal destination. The amount of space a vertex is allowed to travel in one
+iteration is limited by the \lstinline{maximum step} parameter. It is $5000$
+by default. That means by default, this parameter should not get in your way.
+]]
+
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 2, maximum time = 2, maximum step = 6pt, coarsen = false]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 2, maximum time = 2, maximum step = 12pt, coarsen = false]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+
+
+--------------------------------------------------------------------
+key "speed"
+
+summary
+[[
+This is a factor every calculated step is multiplied by.
+]]
+
+documentation
+[[
+The speed is the distance a vertex travels if it is influenced by a force of
+$1$N$\cdot\gamma$. The speed is only a factor that will influence the total
+amount every vertex can move: Half the speed makes half the movement, twice
+the speed doubles the distance traveled.
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 1, maximum time = 1, maximum step = 100, speed = 0.2, coarsen = false]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 1, maximum time= 1, maximum step = 100, speed = 0.4, coarsen = false]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "maximum time"
+
+summary
+[[
+The highest amount of virtual time the algorithm is allowed to take.
+]]
+
+documentation
+[[
+This option is part of the virtual time construct of Jedi. The virtual time
+concept allows graph drawing algorithm engineers to switch forces on and of
+after a relative or absolute amount of time has elapsed. If the iterations
+stay the same, doubling the maximum time has the same effect as doubling the
+speed: Vertices move faster, but it is possible they miss their intended
+destination. Also increasing the iterations changes the "resolution" of the
+graph drawing algorithm: More steps are simulated in the same time.
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 20, maximum time = 100, coarsen = false, maximum step = 0.5, gravity = 2]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 20, maximum time = 200, coarsen = false, maximum step = 0.5, gravity = 2]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "find equilibrium"
+
+summary
+[[
+If this option is |true|, the framework checks the vertex movement to detect
+low movement near the equilibrium and stop the algorithm.
+]]
+
+documentation
+[[
+Since we often do not know how many iterations are enough, the framework will
+detect when the vertices (almost) stop moving and stop the algorithm. After
+each iteration, the framework adds up the net force influencing all the
+vertices. If it falls below the threshold |epsilon|, the algorithm
+will ignore the left over iterations and terminate. You can disable this
+behavior by setting this parameter to |false|. Allowing the framework to find
+the equilibrium usually saves you time, while allowing more iterations (or a
+lower threshold) generates higher quality drawings.
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 300, maximum time = 300, coarsen = false, maximum step = 10, epsilon = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 300, maximum time = 300, maximum step = 10, find equilibrium = false]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "epsilon"
+
+summary
+[[
+The threshold for the |find equilibrium| option.
+]]
+
+documentation
+[[
+This key specifies the threshold for the |find equilibrium| option. The lower
+epsilon, the longer the graph drawing algorithm will take, but the closer the
+resulting drawing will be to the true energy minimum.
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 200, maximum time = 200, maximum step = 10, coarsen = false, epsilon = 2]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 200, maximum time = 200, maximum step = 10, epsilon = 12, coarsen = false]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "snap to grid"
+
+summary
+[[
+This option enables the post-processing step |snap to grid|.
+]]
+
+documentation
+[[
+This key is the on/off-switch for the grid forces. The |snap to grid| option
+triggers a form of post-processing were all vertices are pulled to the closest
+point on a virtual grid. Please note that there is no repulsive force between
+the vertices, so it is possible that two vertices are pulled to the same grid
+point. The grid size is determined by the parameters |grid x length| and
+|grid y length|.
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, maximum step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz{
+ \graph[social degree layout, iterations = 100, maximum time = 100, snap to grid =true, grid x length = 5mm, grid y length = 5mm, maximum step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "grid x length"
+
+summary
+[[
+This option determines the cell size in $x$ direction for the |snap to grid|
+option.
+]]
+
+documentation
+[[
+The size of the cells of the virtual grid can be configured by the user. This
+key allows a configuration of the horizontal cell width.
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, snap to grid =true, grid x length = 5mm, grid y length = 5mm, maximum step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, snap to grid =true, grid x length = 9mm, grid y length = 5mm, maximum step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "grid y length"
+
+summary
+[[
+This option determines the cell size in $x$ direction for the |snap to grid|
+option.
+]]
+
+documentation
+[[
+Same as |grid x length|, but in vertical direction (height of the cells).
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, snap to grid =true, grid x length = 5mm, grid y length = 5mm, maximum step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+\tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, snap to grid =true, grid x length = 5mm, grid y length = 9mm, maximum step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+--------------------------------------------------------------------
+key "mass"
+
+summary
+[[
+ The mass of a vertex determines how fast it can move. Vertices
+ with higher mass move slower.
+]]
+
+documentation
+[[
+ The mass of a vertex determines how fast this vertex
+ moves. Mass is directly inverse proportional to the distance the vertex
+ moves. In contrast to the global speed factor, mass usually only affects a
+ single vertex. A vertex with a higher mass will move slower if affected by
+ the same mass than a vertex with a lower mass. By default, each vertex has a
+ mass of $1$.
+]]
+
+example
+[[
+ \tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, maximum displacement per step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1 -- {b2 -- {b3, b4}, b5}
+ };
+]]
+
+example
+[[
+ \tikz
+ \graph[social degree layout, iterations = 100, maximum time = 100, maximum displacement per step = 10]{
+ a1 -- {a2, a3, a4, a5},
+ b1[mass = 4] -- {b2 -- {b3, b4}, b5}
+ };
+]]
+--------------------------------------------------------------------
+
+
+--------------------------------------------------------------------
+key "coarsening weight"
+
+summary
+[[
+ The coarsening weight of a vertex determines when it will be
+ coarsened.
+]]
+
+documentation
+[[
+ Vertices with higher coarsening weight are considered more important and
+ will be coarsened later, or not at all.
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua
new file mode 100644
index 0000000000..4634b70123
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua
@@ -0,0 +1,94 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+--- This is a subclass of ForceTemplate, which is used to implement forces
+-- that work on individual vertices. Forces of this kind simply add an
+-- absolute value set in the force data to each vertex' $x$ and $y$ coordinate
+
+-- Imports
+local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate"
+local lib = require "pgf.gd.lib"
+local Preprocessing = require "pgf.gd.force.jedi.base.Preprocessing"
+
+-- Localize math functions
+local max = math.max
+local sqrt = math.sqrt
+local min = math.min
+
+-- Implementation starts here:
+
+local ForceAbsoluteValue = lib.class { base_class = ForceTemplate }
+
+function ForceAbsoluteValue:constructor ()
+ ForceTemplate.constructor(self)
+ self.p = {}
+end
+
+
+-- This force class works on a vertex array that is part of the force data
+-- defined when adding the force. This array is copied into p. All vertices of
+-- the graph are saved in the local variable |ver|.
+--
+-- @param v The vertices of the graph we are trying to find a layout for.
+
+function ForceAbsoluteValue:preprocess(v)
+ self.ver = v
+ self.p = self.force.vertices
+end
+
+
+-- Applying the force to the vertices and adding the effect to the passed net
+-- force array
+--
+-- @param data The parameters needed to apply the force: The options table,
+-- the current time stamp, an array containing the summed up net
+-- forces
+
+function ForceAbsoluteValue:applyTo(data)
+ -- locals for speed
+ local cap = self.force.cap
+ local value = self.force.value
+ local net_forces = data.net_forces
+ local t_max = self.options["maximum time"]
+ local t_now = data.t_now
+ local p = self.p
+ local time_fun = self.force.time_fun
+
+ -- Evaluate time function
+ local time_factor = time_fun(t_max, t_now)
+ if time_factor == 0 then
+ return
+ end
+
+ for _,v in ipairs(self.ver) do
+ for _, i in ipairs (self.p) do
+ -- Is the vertex in the list?
+ if v.name == i then
+
+ local f = value * time_factor
+
+ -- cap effect if necessary
+ if cap then
+ if f <= 0 then
+ x = max(-cap, f)
+ else
+ x = min(cap, f)
+ end
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[v]
+ c1.x = c1.x + f
+ c1.y = c1.y + f
+ end
+ end
+ end
+end
+
+return ForceAbsoluteValue \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua
new file mode 100644
index 0000000000..8cea1aec6a
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua
@@ -0,0 +1,201 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This is a subclass of ForceTemplate, which is used to implement forces between
+-- vertex pairs. The forces depend on the canvas distance of the vertices in
+-- the pair. This class is e.~g.~ used for electric forces.
+
+-- Imports
+local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate"
+local lib = require "pgf.gd.lib"
+local Preprocessing = require "pgf.gd.force.jedi.base.Preprocessing"
+
+-- Localize math functions
+local max = math.max
+local sqrt = math.sqrt
+local min = math.min
+
+-- Implementation starts here:
+local ForceCanvasDistance = lib.class { base_class = ForceTemplate }
+
+function ForceCanvasDistance:constructor ()
+ ForceTemplate.constructor(self)
+ self.p = {}
+end
+
+
+-- This force class works on all pairwise disjoint vertex pairs. This
+-- function generates a new graph object containing all vertices from the
+-- original graph and arcs between all pairwise disjoint vertex pairs. The
+-- arcs-table of this new object will be saved in the variable |p|.
+--
+-- @param v The vertices of the graph we are trying to find a layout for.
+
+function ForceCanvasDistance:preprocess(v)
+ self.p = Preprocessing.allPairs(v)
+end
+
+
+-- Applying the force to the vertices and adding the effect to the passed net
+-- force array
+--
+-- @param data The parameters needed to apply the force: The options table,
+-- the current time stamp, an array containing the summed up net
+-- forces
+
+function ForceCanvasDistance:applyTo(data)
+ -- locals for speed
+ local cap = self.force.cap
+ local fun_u = self.force.fun_u
+ local fun_v = self.force.fun_v
+ local net_forces = data.net_forces
+ local t_max = self.options["maximum time"]
+ local t_now = data.t_now
+ local k = data.k
+ local p = self.p
+ local time_fun = self.force.time_fun
+ local fw_attributes = self.fw_attributes
+
+ -- Evaluate time function
+ local time_factor = time_fun(t_max, t_now)
+ if time_factor == 0 then
+ return
+ end
+
+ if not fun_v then
+ local data = { k = k, attributes = fw_attributes }
+ for _, i in ipairs(p) do
+ -- dereference
+ local p2 = i.head
+ local p1 = i.tail
+ local p2_pos = p2.pos
+ local p1_pos = p1.pos
+
+ -- calculate distance between two points
+ local x = p2_pos.x - p1_pos.x
+ local y = p2_pos.y - p1_pos.y
+ local d = max(sqrt(x*x+y*y),0.1)
+
+ -- apply force function
+ data.u = p2
+ data.v = p1
+ data.d = d
+ local e = fun_u(data)
+
+ -- Include time function
+ local f = e * time_factor / d
+
+ -- calculate effect on x/y
+ local g = x * f
+ local h = y * f
+
+ -- cap effect if necessary
+ if cap then
+ if g <= 0 then
+ x = max(-cap, g)
+ else
+ x = min(cap, g)
+ end
+
+ if h <= 0 then
+ y = max(-cap, h)
+ else
+ y = min(cap, h)
+ end
+ else
+ x = g
+ y = h
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[p1]
+ c1.x = c1.x - x
+ c1.y = c1.y - y
+ local c2 = net_forces[p2]
+ c2.x = c2.x + x
+ c2.y = c2.y + y
+ end
+ else
+ -- There are different functions for head and tail vertex
+ local data = { k = k, attributes = fw_attributes }
+ for _, i in ipairs(p) do
+ -- dereference
+ local p2 = i.head
+ local p1 = i.tail
+ local p2_pos = p2.pos
+ local p1_pos = p1.pos
+
+ -- calculate distance between two points
+ local x = p2_pos.x - p1_pos.x
+ local y = p2_pos.y - p1_pos.y
+ local d = max(sqrt(x*x+y*y),0.1)
+
+ -- apply force function to distance and k (natural spring length
+ data.u = p2
+ data.v = p1
+ data.d = d
+ local e_head = fun_u(data)
+ local e_tail = fun_v(data)
+
+ -- Include time function
+ local f_head = time_factor * e_head / d
+ local f_tail = time_factor * e_tail / d
+
+ -- calculate effect on x/y
+ local g_head = x * f_head
+ local g_tail = x * f_tail
+ local h_head = y * f_head
+ local h_tail = y * f_tail
+
+ -- cap effect if necessary
+ local x_head, x_tail, y_head, y_tail
+ if cap then
+ if g_head <= 0 then
+ x_head = max(-cap, g_head)
+ else
+ x_head = min(cap, g_head)
+ end
+
+ if g_tail <= 0 then
+ x_tail = max(-cap, g_tail)
+ else
+ x_tail = min(cap, g_tail)
+ end
+
+ if h_head <= 0 then
+ y_head = max(-cap, h_head)
+ else
+ y_head = min(cap, h_head)
+ end
+
+ if h_tail <= 0 then
+ y_tail = max(-cap, h_tail)
+ else
+ y_tail = min(cap, h_tail)
+ end
+ else
+ x_head = g_head
+ x_tail = g_tail
+ y_head = h_head
+ y_tail = h_tail
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[p1]
+ c1.x = c1.x - x_tail
+ c1.y = c1.y - y_tail
+ local c2 = net_forces[p2]
+ c2.x = c2.x + x_head
+ c2.y = c2.y + y_head
+ end
+ end
+end
+
+return ForceCanvasDistance \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua
new file mode 100644
index 0000000000..41edaba358
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua
@@ -0,0 +1,117 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This is a subclass of ForceTemplate, which is used to implement forces
+-- that work on individual vertices. The forces depend on the canvas position
+-- of the vertices. This class is e.~g.~ used for gravitational forces.
+
+local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate"
+local lib = require "pgf.gd.lib"
+
+local ForceCanvasPosition = lib.class { base_class = ForceTemplate }
+
+-- Localize math functions
+local max = math.max
+local sqrt = math.sqrt
+local min = math.min
+
+-- Implementation starts here:
+
+function ForceCanvasPosition:constructor ()
+ ForceTemplate.constructor(self)
+ self.p = {}
+end
+
+
+-- This force class works on individual vertices and only depends on their
+-- current position. Thus the vertex table of the current graph is simply
+-- copied to the variable |p|.
+--
+-- @param v The vertices of the graph we are trying to find a layout for.
+
+function ForceCanvasPosition:preprocess(v)
+ self.p = v
+end
+
+
+-- Applying the force to the vertices and adding the effect to the passed net
+-- force array
+--
+-- @param data The parameters needed to apply the force: The options table,
+-- the current time stamp, an array containing the summed up net
+-- forces
+
+function ForceCanvasPosition:applyTo(data)
+ --localize
+ local cap = self.force.cap
+ local fun_u = self.force.fun_u
+ local net_forces = data.net_forces
+ local t_max = self.options["maximum time"]
+ local t_now = data.t_now
+ local p = self.p
+ local time_fun = self.force.time_fun
+ local initial_gravity = self.options["gravity"]
+ local fw_attributes = self.fw_attributes
+
+ -- evaluate time function
+ local time_factor = time_fun(t_max, t_now)
+ if time_factor == 0 then
+ return
+ end
+
+ -- Find midpoint of all vertices since they will be attracted to this point
+ local centroid_x, centroid_y = 0,0
+ for _, v in ipairs(p) do
+ local pos = v.pos
+ centroid_x = centroid_x + pos.x
+ centroid_y = centroid_y + pos.y
+ end
+ centroid_x = centroid_x/#p
+ centroid_y = centroid_y/#p
+
+ -- Iterate over the precomputed vertex list
+ for _, v in ipairs(p) do
+ -- localize
+ local p1 = v.pos
+
+ -- apply force function
+ local factor = fun_u{attributes = fw_attributes, u = v}
+
+ -- calculate distance between vertex and centroid
+ local x = centroid_x - p1.x
+ local y = centroid_y - p1.y
+
+ -- calculate effect on x/y
+ local h = factor * time_factor
+ x = x * h
+ y = y * h
+
+ -- cap effect if necessary
+ if cap then
+ if x <= 0 then
+ x = max(-cap, x)
+ else
+ x = min(cap, x)
+ end
+ if y <= 0 then
+ y = max(-cap, y)
+ else
+ y = min(cap, y)
+ end
+ end
+
+ -- add calculated effect to net forces
+ local c = net_forces[v]
+ c.x = c.x + x
+ c.y = c.y + y
+ end
+end
+
+return ForceCanvasPosition \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua
new file mode 100644
index 0000000000..86d67f2678
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua
@@ -0,0 +1,205 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This is a subclass of ForceTemplate, which is used to implement forces between
+-- vertex pairs. The forces depend on the graph distance of the vertices in
+-- the pair. This class is e.\,g.\ used for spring forces.
+
+
+local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate"
+local lib = require "pgf.gd.lib"
+local Preprocessing = require "pgf.gd.force.jedi.base.Preprocessing"
+
+-- Localize math functions
+local max = math.max
+local sqrt = math.sqrt
+local min = math.min
+
+-- Implementation starts here:
+
+local ForceGraphDistance = lib.class { base_class = ForceTemplate }
+
+function ForceGraphDistance:constructor ()
+ ForceTemplate.constructor(self)
+ self.p = {}
+end
+
+
+-- This force class works on all pairwise disjoint vertex pairs connected by
+-- a path of length maximum $n$. The parameter $n$ is given by the engineer in
+-- the force declaration. This function generates a new graph object
+-- containing all vertices from the original graph and arcs between all
+-- pairwise disjoint vertex pairs. The arcs-table of this new object will be
+-- saved in the variable |p|.
+--
+-- @param v The vertices of the graph we are trying to find a layout for.
+
+function ForceGraphDistance:preprocess(v, a)
+ self.p = Preprocessing.overExactlyNPairs(v, a, self.force.n)
+end
+
+
+-- Applying the force to the vertices and adding the effect to the passed net
+-- force array
+--
+-- @param data The parameters needed to apply the force: The options table,
+-- the current time stamp, an array containing the summed up net
+-- forces
+
+function ForceGraphDistance:applyTo(data)
+ -- locals for speed
+ local cap = self.force.cap
+ local fun_u = self.force.fun_u
+ local fun_v = self.force.fun_v
+ local net_forces = data.net_forces
+ local t_max = self.options["maximum time"]
+ local t_now = data.t_now
+ local k = data.k
+ local p = self.p
+ local time_fun = self.force.time_fun
+ local fw_attributes = self.fw_attributes
+
+ -- Evaluate time function
+ local time_factor = time_fun(t_max, t_now)
+ if time_factor == 0 then
+ return
+ end
+
+ if not fun_v then
+ local data = { k = k, attributes = fw_attributes }
+ for _, i in ipairs(p) do
+ -- dereference
+ local p2 = i.head
+ local p1 = i.tail
+ local p2_pos = p2.pos
+ local p1_pos = p1.pos
+
+ -- calculate distance between two points
+ local x = p2_pos.x - p1_pos.x
+ local y = p2_pos.y - p1_pos.y
+ local d = max(sqrt(x*x+y*y),0.1)
+
+ -- apply force function to distance and k (natural spring length)
+ data.u = p2
+ data.v = p1
+ data.d = d
+ local e = fun_u(data)
+
+ -- Include time function
+ local f = e * time_factor / d
+
+ -- calculate effect on x/y
+ local g = x * f
+ local h = y * f
+
+ -- cap effect if necessary
+ if cap then
+ if g <= 0 then
+ x = max(-cap, g)
+ else
+ x = min(cap, g)
+ end
+
+ if g <= 0 then
+ y = max(-cap, h)
+ else
+ y = min(cap, h)
+ end
+ else
+ x = g
+ y = h
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[p1]
+ c1.x = c1.x - x
+ c1.y = c1.y - y
+ local c2 = net_forces[p2]
+ c2.x = c2.x + x
+ c2.y = c2.y + y
+ end
+ else
+ -- There are different functions for head and tail vertex
+ local data = { k = k, attributes = fw_attributes }
+ for _, i in ipairs(p) do
+ -- dereference
+ local p2 = i.head
+ local p1 = i.tail
+ local p2_pos = p2.pos
+ local p1_pos = p1.pos
+
+ -- calculate distance between two points
+ local x = p2_pos.x - p1_pos.x
+ local y = p2_pos.y - p1_pos.y
+
+ local d = max(sqrt(x*x+y*y),0.1)
+
+ -- apply force function to distance and k (natural spring length
+ data.u = p2
+ data.v = p1
+ data.d = d
+ local e_head = fun_u(data)
+ local e_tail = fun_v(data)
+
+ -- Include time function
+ local f_head = time_factor * e_head / d
+ local f_tail = time_factor * e_tail / d
+
+ -- calculate effect on x/y
+ local g_head = x * f_head
+ local g_tail = x * f_tail
+ local h_head = y * f_head
+ local h_tail = y * f_tail
+
+ -- cap effect if necessary
+ local x_head, x_tail, y_head, y_tail
+ if cap then
+ if g_head <= 0 then
+ x_head = max(-cap, g_head)
+ else
+ x_head = min(cap, g_head)
+ end
+
+ if g_tail <= 0 then
+ x_tail = max(-cap, g_tail)
+ else
+ x_tail = min(cap, g_tail)
+ end
+
+ if h_head <= 0 then
+ y_head = max(-cap, h_head)
+ else
+ y_head = min(cap, h_head)
+ end
+
+ if h_tail <= 0 then
+ y_tail = max(-cap, h_tail)
+ else
+ y_tail = min(cap, h_tail)
+ end
+ else
+ x_head = g_head
+ x_tail = g_tail
+ y_head = h_head
+ y_tail = h_tail
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[p1]
+ c1.x = c1.x - x_tail
+ c1.y = c1.y - y_tail
+ local c2 = net_forces[p2]
+ c2.x = c2.x + x_head
+ c2.y = c2.y + y_head
+ end
+ end
+end
+
+return ForceGraphDistance \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua
new file mode 100644
index 0000000000..5f53f5da78
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua
@@ -0,0 +1,123 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- This is a subclass of ForceTemplate, which is used to implement forces
+-- that work on individual vertices and pulls them to a virtual grid with
+-- cells of the size determined by the user options |grid x length| and
+-- |grid y length|. The forces depend on the canvas position
+-- of the vertices relative to th next grid point. This class is e.\,g.\ used
+-- for the post-processing technique |snap to grid|.
+
+
+-- Imports
+local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate"
+local lib = require "pgf.gd.lib"
+local Preprocessing = require "pgf.gd.force.jedi.base.Preprocessing"
+
+-- Localize math functions
+local max = math.max
+local sqrt = math.sqrt
+local min = math.min
+local floor = math.floor
+local round
+function round(number)
+ return floor((number * 10 + 0.5) / 10)
+end
+
+-- Implementation starts here:
+
+local ForcePullToGrid = lib.class { base_class = ForceTemplate }
+
+function ForcePullToGrid:constructor ()
+ ForceTemplate.constructor(self)
+ self.p = {}
+end
+
+-- This force class works on individual vertices and only depends on their
+-- current position. Thus the vertex table of the current graph is simply
+-- copied to the variable |p|.
+--
+-- @param v The vertices of the graph we are trying to find a layout for.
+
+function ForcePullToGrid:preprocess(v)
+ self.p = v
+end
+
+
+-- Applying the force to the vertices and adding the effect to the passed net
+-- force array
+--
+-- @param data The parameters needed to apply the force: The options table,
+-- the current time stamp, an array containing the summed up net
+-- forces
+
+function ForcePullToGrid:applyTo(data)
+ -- locals for speed
+ local cap = self.force.cap
+ local net_forces = data.net_forces
+ local t_max = self.options["maximum time"]
+ local grid_x_distance = self.options["grid x length"]
+ local grid_y_distance = self.options["grid y length"]
+ local t_now = data.t_now
+ local p = self.p
+ local time_fun = self.force.time_fun
+ local length = 5--self.options["node distance"]
+
+ -- Evaluate time function
+ local time_factor = time_fun(t_max, t_now)
+ if time_factor == 0 then
+ return
+ end
+
+ for _, v in ipairs(p) do
+ -- dereference
+ local p1 = v.pos
+ local p2_x = round(p1.x/grid_x_distance)*grid_x_distance
+ local p2_y = round(p1.y/grid_y_distance)*grid_y_distance
+
+ -- calculate distance between vertex and grid point
+ local x = p1.x - p2_x
+ local y = p1.y - p2_y
+ local d = max(sqrt(x*x+y*y),0.1)
+ local l = -d/(length*length)
+
+ -- Include time function
+ local h = l * time_factor
+
+ -- scale effect according to direction
+ local f = x * h
+ local g = y * h
+
+ -- cap effect if necessary
+ if cap then
+ if f <= 0 then
+ x = max(-cap, f)
+ else
+ x = min(cap, f)
+ end
+
+ if g <= 0 then
+ y = max(-cap, g)
+ else
+ y = min(cap, g)
+ end
+ else
+ x = f
+ y = g
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[v]
+ c1.x = c1.x - x
+ c1.y = c1.y - y
+ end
+end
+
+return ForcePullToGrid \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua
new file mode 100644
index 0000000000..985b8eec2e
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua
@@ -0,0 +1,119 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+--- This is a subclass of ForceTemplate, which is used to implement forces
+-- that work on individual vertices and pulls them to a specific point on the
+-- canvas. This point is given by the |desired at| option. The forces depend
+-- on the canvas position of the vertices relative to the canvas point it is
+-- pulled to.
+
+
+-- Imports
+local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate"
+local lib = require "pgf.gd.lib"
+local Preprocessing = require "pgf.gd.force.jedi.base.Preprocessing"
+
+-- Localize math functions
+local max = math.max
+local sqrt = math.sqrt
+local min = math.min
+
+-- Implementation starts here:
+
+local ForcePullToPoint = lib.class { base_class = ForceTemplate }
+
+function ForcePullToPoint:constructor ()
+ ForceTemplate.constructor(self)
+ self.p = {}
+end
+
+-- This force class works on individual vertices and depends on their
+-- current position as well as the point it is desired at. Thus all vertices
+-- where the |desired at| option is set are added to the table |p| together
+-- with the point where they are wanted.
+--
+-- @param v The vertices of the graph we are trying to find a layout for.
+
+function ForcePullToPoint:preprocess(v)
+ for _,vertex in ipairs(v) do
+ if vertex.options then
+ local da = vertex.options["desired at"]
+ if da then
+ self.p[vertex]= {da}
+ end
+ end
+ end
+end
+
+
+-- Applying the force to the vertices and adding the effect to the passed net
+-- force array
+--
+-- @param data The parameters needed to apply the force: The options table,
+-- the current time stamp, an array containing the summed up net
+-- forces
+
+function ForcePullToPoint:applyTo(data)
+ -- locals for speed
+ local cap = self.force.cap
+ local net_forces = data.net_forces
+ local t_max = self.options["maximum time"]
+ local t_now = data.t_now
+ local p = self.p
+ local time_fun = self.force.time_fun
+
+ -- Evaluate time function
+ local time_factor = time_fun(t_max, t_now)
+ if time_factor == 0 then
+ return
+ end
+
+ for v, point in pairs(p) do
+ -- dereference
+ local p1 = v.pos
+ local p2 = point[1]
+
+ -- calculate distance between vertex and centroid
+ local x = p1.x - p2.x
+ local y = p1.y - p2.y
+ local d = max(sqrt(x*x+y*y),0.1)
+
+ -- Include time function
+ local h = d * time_factor
+
+ -- scale effect according to direction
+ local f = x * h
+ local g = y * h
+
+ -- cap effect if necessary
+ if cap then
+ if f <= 0 then
+ x = max(-cap, f)
+ else
+ x = min(cap, f)
+ end
+
+ if g <= 0 then
+ y = max(-cap, g)
+ else
+ y = min(cap, g)
+ end
+ else
+ x = f
+ y = g
+ end
+
+ -- add calculated effect to net forces
+ local c1 = net_forces[v]
+ c1.x = c1.x - x
+ c1.y = c1.y - y
+ end
+end
+
+return ForcePullToPoint \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua
new file mode 100644
index 0000000000..ab8f1fad9a
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua
@@ -0,0 +1,60 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+--- This class implements an initial position algorithm for graph drawing, placing the vertices on
+-- a circle with th radius given by the |radius| key
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local InitialTemplate = require "pgf.gd.force.jedi.base.InitialTemplate"
+local lib = require "pgf.gd.lib"
+
+local CircularInitialPositioning = lib.class { base_class = InitialTemplate }
+
+
+---
+declare {
+ key = "circular initial position",
+ algorithm = CircularInitialPositioning,
+ phase = "initial positioning force framework",
+ phase_default = true
+}
+
+-- Implementation starts here:
+
+function CircularInitialPositioning:constructor ()
+ InitialTemplate.constructor(self)
+end
+
+function CircularInitialPositioning:run()
+ -- locals for speed
+ local vertices = self.vertices
+ local tmp = (self.options["node pre sep"] + self.options["node post sep"]) +
+ (self.options["sibling pre sep"] + self.options["sibling post sep"])
+ local min_radius = tmp * #self.vertices/2/math.pi
+ local radius = math.max(self.options.radius, min_radius)
+ local desired_vertices = self.desired_vertices
+ -- place vertices where the |desired at | option has been set first
+ local placed, centroid_x, centroid_y = InitialTemplate:desired(desired_vertices)
+ local angle = 2*math.pi / #vertices
+ local a = angle
+ local sin = math.sin
+ local cos = math.cos
+
+ for _, vertex in ipairs(vertices) do
+ -- place all other vertices with respect to the one already placed
+ if placed[vertex] == nil then
+ local p = vertex.pos
+ p.x = sin(a) * radius + centroid_x
+ p.y = cos(a) * radius + centroid_y
+ a = a + angle
+ end
+ end
+end
+
+
+return CircularInitialPositioning \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua
new file mode 100644
index 0000000000..2b131e8ad9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua
@@ -0,0 +1,60 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+--- This class implements an initial position algorithm for graph drawing,
+-- placing the vertices on a grid with square cells with width |node distance|
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local InitialTemplate = require "pgf.gd.force.jedi.base.InitialTemplate"
+local lib = require "pgf.gd.lib"
+
+local GridInitialPositioning = lib.class { base_class = InitialTemplate }
+
+
+---
+declare {
+ key = "grid initial position",
+ algorithm = GridInitialPositioning,
+ phase = "initial positioning force framework",
+}
+
+-- Implementation starts here:
+
+function GridInitialPositioning:constructor ()
+ InitialTemplate.constructor(self)
+end
+
+function GridInitialPositioning:run()
+ -- locals for speed
+ local vertices = self.vertices
+ local dist = self.options["node distance"]
+ local desired_vertices = self.desired_vertices
+ -- place vertices where the |desired at | option has been set first
+ local placed, centroid_x, centroid_y = InitialTemplate:desired(desired_vertices)
+ local n = math.ceil(math.sqrt(#vertices))
+ local x = -dist
+ local y = 0
+
+ for i, vertex in ipairs(vertices) do
+ -- place all other vertices with respect to the one already placed
+ if placed[vertex] == nil then
+ if i <= (y/dist+1)*n then
+ x = x + dist
+ else
+ x = 0
+ y = y + dist
+ end
+ local p = vertex.pos
+ p.x = x + centroid_x
+ p.y = y + centroid_y
+ end
+ end
+end
+
+
+return GridInitialPositioning \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua
new file mode 100644
index 0000000000..ce3a40582c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua
@@ -0,0 +1,49 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+--- This class implements an initial position algorithm for graph drawing,
+-- placing the vertices at random positions.
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+local InitialTemplate = require "pgf.gd.force.jedi.base.InitialTemplate"
+local lib = require "pgf.gd.lib"
+
+local RandomInitialPositioning = lib.class { base_class = InitialTemplate }
+
+---
+declare {
+ key = "random initial position",
+ algorithm = RandomInitialPositioning,
+ phase = "initial positioning force framework"
+}
+
+-- Implementation starts here:
+
+function RandomInitialPositioning:constructor ()
+ InitialTemplate.constructor(self)
+end
+
+function RandomInitialPositioning:run()
+ -- locals for speed
+ local random = lib.random
+ local vertices = self.vertices
+ local desired_vertices = self.desired_vertices
+ -- place vertices where the |desired at | option has been set first
+ local placed, centroid_x, centroid_y = InitialTemplate:desired(desired_vertices)
+
+ for _, vertex in ipairs(vertices) do
+ -- place all other vertices with respect to the one already placed
+ if placed[vertex] == nil then
+ p = vertex.pos
+ p.x = 100 * random() + centroid_x
+ p.y = 100 * random() + centroid_y
+ end
+ end
+end
+
+return RandomInitialPositioning
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/library.lua
new file mode 100644
index 0000000000..5d5554ce35
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/jedi/library.lua
@@ -0,0 +1,115 @@
+-- Copyright 2014 by Ida Bruhns
+--
+-- 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 information
+
+
+--- The library providing the graph drawing framework Jedi
+-- This library requires all graph drawing algorithms and initial
+-- positioning algorithms provided with the first release of Jedi.
+-- It also defines the mass key attached to all vertices.
+
+-- Library name
+local jedi
+
+-- require initial positioning algorithms
+require "pgf.gd.force.jedi.initialpositioning.CircularInitialPositioning"
+require "pgf.gd.force.jedi.initialpositioning.RandomInitialPositioning"
+require "pgf.gd.force.jedi.initialpositioning.GridInitialPositioning"
+
+-- require graph drawing algorithms
+require "pgf.gd.force.jedi.algorithms.FruchtermanReingold"
+require "pgf.gd.force.jedi.algorithms.HuSpringElectricalFW"
+require "pgf.gd.force.jedi.algorithms.SimpleSpring"
+require "pgf.gd.force.jedi.algorithms.SocialGravityCloseness"
+require "pgf.gd.force.jedi.algorithms.SocialGravityDegree"
+
+
+-- define parameter
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+---
+declare {
+ key = "maximum displacement per step",
+ type = "length",
+ initial = "100",
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "global speed factor",
+ type = "length",
+ initial = "1",
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "maximum time",
+ type = "number",
+ initial = "50",
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "find equilibrium",
+ type = "boolean",
+ initial = true,
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "equilibrium threshold",
+ type = "number",
+ initial = "3",
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "grid x length",
+ type = "length",
+ initial = "10pt",
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "grid y length",
+ type = "length",
+ initial = "10pt",
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "snap to grid",
+ type = "boolean",
+ initial = false,
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "mass",
+ type = "number",
+ initial = "1",
+
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
+
+---
+declare {
+ key = "coarsening weight",
+ type = "number",
+ initial = "1",
+
+ documentation_in = "pgf.gd.force.jedi.doc"
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/library.lua
new file mode 100644
index 0000000000..acfda34ffc
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/force/library.lua
@@ -0,0 +1,126 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- Nature creates beautiful graph layouts all the time. Consider a
+-- spider's web: Nodes are connected by edges in a visually most pleasing
+-- manner (if you ignore the spider in the middle). The layout of a
+-- spider's web is created just by the physical forces exerted by the
+-- threads. The idea behind force-based graph drawing algorithms is to
+-- mimic nature: We treat edges as threads that exert forces and simulate
+-- into which configuration the whole graph is ``pulled'' by these
+-- forces.
+--
+-- When you start thinking about for a moment, it turns out that there
+-- are endless variations of the force model. All of these models have
+-- the following in common, however:
+-- %
+-- \begin{itemize}
+-- \item ``Forces'' pull and push at the nodes in different directions.
+-- \item The effect of these forces is simulated by iteratively moving
+-- all the nodes simultaneously a little in the direction of the forces
+-- and by then recalculating the forces.
+-- \item The iteration is stopped either after a certain number of
+-- iterations or when a \emph{global energy minimum} is reached (a very
+-- scientific way of saying that nothing happens anymore).
+-- \end{itemize}
+--
+-- The main difference between the different force-based approaches is
+-- how the forces are determined. Here are some ideas what could cause a
+-- force to be exerted between two nodes (and there are more):
+-- %
+-- \begin{itemize}
+-- \item If the nodes are connected by an edge, one can treat the edge as
+-- a ``spring'' that has a ``natural spring dimension''. If the nodes
+-- are nearer than the spring dimension, they are push apart; if they
+-- are farther aways than the spring dimension, they are pulled together.
+-- \item If two nodes are connected by a path of a certain length, the
+-- nodes may ``wish to be at a distance proportional to the path
+-- length''. If they are nearer, they are pushed apart; if they are
+-- farther, they are pulled together. (This is obviously a
+-- generalization of the previous idea.)
+-- \item There may be a general force field that pushes nodes apart (an
+-- electrical field), so that nodes do not tend to ``cluster''.
+-- \item There may be a general force field that pulls nodes together (a
+-- gravitational field), so that nodes are not too loosely scattered.
+-- \item There may be highly nonlinear forces depending on the distance of
+-- nodes, so that nodes very near to each get pushed apart strongly,
+-- but the effect wears of rapidly at a distance. (Such forces are
+-- known as strong nuclear forces.)
+-- \item There rotational forces caused by the angles between the edges
+-- leaving a node. Such forces try to create a \emph{perfect angular
+-- resolution} (a very scientific way of saying that all angles
+-- at a node are equal).
+-- \end{itemize}
+--
+-- Force-based algorithms combine one or more of the above ideas into a
+-- single algorithm that uses ``good'' formulas for computing the
+-- forces.
+--
+-- Currently, three algorithms are implemented in this library, two of
+-- which are from the first of the following paper, while the third is
+-- from the third paper:
+-- %
+-- \begin{itemize}
+-- \item
+-- Y. Hu.
+-- \newblock Efficient, high-quality force-directed graph drawing.
+-- \newblock \emph{The Mathematica Journal}, 2006.
+-- \item
+-- C. Walshaw.
+-- \newblock A multilevel algorithm for force-directed graph
+-- drawing.
+-- \newblock In J. Marks, editor, \emph{Graph Drawing}, Lecture Notes in
+-- Computer Science, 1984:31--55, 2001.
+-- \end{itemize}
+--
+-- Our implementation is described in detail in the following
+-- diploma thesis:
+-- %
+-- \begin{itemize}
+-- \item
+-- Jannis Pohlmann,
+-- \newblock \emph{Configurable Graph Drawing Algorithms
+-- for the \tikzname\ Graphics Description Language,}
+-- \newblock Diploma Thesis,
+-- \newblock Institute of Theoretical Computer Science, Universit\"at
+-- zu L\"ubeck, 2011.\\[.5em]
+-- \newblock Online at
+-- \url{http://www.tcs.uni-luebeck.de/downloads/papers/2011/}\\ \url{2011-configurable-graph-drawing-algorithms-jannis-pohlmann.pdf}
+-- \end{itemize}
+--
+-- In the future, I hope that most, if not all, of the force-based
+-- algorithms become ``just configuration options'' of a general
+-- force-based algorithm similar to the way the modular Sugiyama method
+-- is implemented in the |layered| graph drawing library.
+--
+-- @library
+
+local force -- Library name
+
+-- Load declarations from:
+require "pgf.gd.force.ControlDeclare"
+require "pgf.gd.force.ControlStart"
+require "pgf.gd.force.ControlIteration"
+require "pgf.gd.force.ControlSprings"
+require "pgf.gd.force.ControlElectric"
+require "pgf.gd.force.ControlCoarsening"
+
+require "pgf.gd.force.SpringLayouts"
+require "pgf.gd.force.SpringElectricalLayouts"
+
+-- Load algorithms from:
+require "pgf.gd.force.SpringHu2006"
+require "pgf.gd.force.SpringElectricalHu2006"
+require "pgf.gd.force.SpringElectricalWalshaw2000"
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface.lua
new file mode 100644
index 0000000000..df2649521b
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.interface = {}
+
+
+-- Done
+
+return pgf.gd.interface \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceCore.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceCore.lua
new file mode 100644
index 0000000000..8473eb3f10
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceCore.lua
@@ -0,0 +1,191 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This class provides the core functionality of the interface between
+-- all the different layers (display layer, binding layer, and
+-- algorithm layer). The two classes |InterfaceToAlgorithms| and
+-- |InterfaceToDisplay| use, in particular, the data structures
+-- provided by this class.
+--
+-- @field binding This field stores the ``binding''. The graph drawing
+-- system is ``bound'' to the display layer through such a binding (a
+-- subclass of |Binding|). Such a binding can be thought of as a
+-- ``driver'' in operating systems terminology: It is a small set of
+-- functions needed to adapt the functionality to one specific display
+-- system. Note that the whole graph drawing scope is bound to exactly
+-- one display layer; to use several bindings you need to setup a
+-- completely new Lua instance.
+--
+-- @field scopes This is a stack of graph drawing scopes. All
+-- interface methods refer to the top of this stack.
+--
+-- @field collection_kinds This table stores which collection kinds
+-- have been defined together with their properties.
+--
+-- @field algorithm_classes A table that maps algorithm keys (like
+-- |tree layout| to class objects).
+--
+-- @field keys A lookup table of all declared keys. Each entry of this
+-- table consists of the original entry passed to the |declare|
+-- method. Each of these tables is both index at a number (so you can
+-- iterate over it using |ipairs|) and also via the key's name.
+
+local InterfaceCore = {
+ -- The main binding. Set by |InterfaceToDisplay.bind| method.
+ binding = nil,
+
+ -- The stack of Scope objects.
+ scopes = {},
+
+ -- The collection kinds.
+ collection_kinds = {},
+
+ -- The algorithm classes
+ algorithm_classes = {},
+
+ -- The declared keys
+ keys = {},
+
+ -- The phase kinds
+ phase_kinds = {},
+
+ -- Internals for handling the options stack
+ option_stack = {},
+ option_cache_height = nil,
+ option_initial = {
+ algorithm_phases = {
+ ["preprocessing stack"] = {},
+ ["edge routing stack"] = {},
+ ["postprocessing stack"] = {},
+ }
+ },
+ option_aliases = {
+ [{}] = true -- Remove, once Lua Link Bug is fixed
+ },
+
+ -- Constant strings for special collection kinds.
+ sublayout_kind = "INTERNAL_sublayout_kind",
+ subgraph_node_kind = "INTERNAL_subgraph_node_kind",
+}
+
+-- Namespace
+require("pgf.gd.interface").InterfaceCore = InterfaceCore
+
+
+InterfaceCore.option_initial.__index = InterfaceCore.option_initial
+InterfaceCore.option_initial.algorithm_phases.__index = InterfaceCore.option_initial.algorithm_phases
+
+
+-- Imports
+local Coordinate = require "pgf.gd.model.Coordinate"
+
+
+--- Returns the top scope
+--
+-- @return The current top scope, which is the scope in which
+-- everything should happen right now.
+
+function InterfaceCore.topScope()
+ return assert(InterfaceCore.scopes[#InterfaceCore.scopes], "no graph drawing scope open")
+end
+
+
+
+local factors = {
+ cm=28.45274,
+ mm=2.84526,
+ pt=1.0,
+ bp=1.00374,
+ sp=0.00002,
+ pc=12.0,
+ em=10,
+ ex=4.30554,
+ ["in"]=72.27,
+ dd=1.07,
+ cc=12.8401,
+ [""]=1,
+}
+
+local time_factors = {
+ s=1,
+ ms=0.001,
+ min=60,
+ h=3600
+}
+
+local directions = {
+ down = -90,
+ up = 90,
+ left = 180,
+ right = 0,
+ south = -90,
+ north = 90,
+ west = 180,
+ east = 0,
+ ["north east"] = 45,
+ ["north west"] = 135,
+ ["south east"] = -45,
+ ["south west"] = -135,
+ ["-"] = 0,
+ ["|"] = -90,
+}
+
+---
+-- Converts parameters types. This method is used by both the
+-- algorithm layer as well as the display layer to convert strings
+-- into the different types of parameters. When a parameter
+-- is pushed onto the option stack, you can either provide a value of
+-- the parameter's type; but you can also provide a string. This
+-- string can then be converted by this function to a value of the
+-- correct type.
+--
+-- @param s A parameter value or a string.
+-- @param t The type of the parameter
+--
+-- @return If |s| is not a string, it is just returned. If it is a
+-- string, it is converted to the type |t|.
+
+function InterfaceCore.convert(s,t)
+ if type(s) ~= "string" then
+ return s
+ elseif t == "number" then
+ return tonumber(s)
+ elseif t == "length" then
+ local num, dim = string.match(s, "([%d.]+)(.*)")
+ return tonumber(num) * assert(factors[dim], "unknown unit")
+ elseif t == "time" then
+ local num, dim = string.match(s, "([%d.]+)(.*)")
+ return tonumber(num) * assert(time_factors[dim], "unknown time unit")
+ elseif t == "string" then
+ return s
+ elseif t == "canvas coordinate" or t == "coordinate" then
+ local x, y = string.match(s,"%(([%d.]+)pt,([%d.]+)pt%)")
+ return Coordinate.new(tonumber(x),tonumber(y))
+ elseif t == "boolean" then
+ return s == "true"
+ elseif t == "raw" then
+ return loadstring(s)()
+ elseif t == "direction" then
+ return directions[s] or tonumber(s)
+ elseif t == "nil" or t == nil then
+ return nil
+ else
+ error ("unknown parameter type")
+ end
+end
+
+
+-- Done
+
+return InterfaceCore
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToAlgorithms.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToAlgorithms.lua
new file mode 100644
index 0000000000..1187fbc313
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToAlgorithms.lua
@@ -0,0 +1,968 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This class provides the interface between the graph drawing system
+-- and algorithms. Another class, |InterfaceToDisplay|, binds the
+-- display layers (like \tikzname\ or a graph drawing editor) to the
+-- graph drawing system ``from the other side''.
+--
+-- The functions declared here can be used by algorithms to
+-- communicate with the graph drawing system, which will usually
+-- forward the ``requests'' of the algorithms to the display layers in
+-- some way. For instance, when you declare a new parameter, this
+-- parameter will become available on the display layer.
+
+local InterfaceToAlgorithms = {}
+
+-- Namespace
+require("pgf.gd.interface").InterfaceToAlgorithms = InterfaceToAlgorithms
+
+
+-- Imports
+local InterfaceCore = require "pgf.gd.interface.InterfaceCore"
+local InterfaceToDisplay = require "pgf.gd.interface.InterfaceToDisplay"
+local InterfaceToC = require "pgf.gd.interface.InterfaceToC"
+
+local LookupTable = require "pgf.gd.lib.LookupTable"
+local LayoutPipeline = require "pgf.gd.control.LayoutPipeline"
+
+local Edge = require "pgf.gd.model.Edge"
+
+local lib = require "pgf.gd.lib"
+
+local doc = require "pgf.gd.doc"
+
+-- Forwards
+
+local declare_handlers
+
+
+
+
+---
+-- Adds a handler for the |declare| function. The |declare|
+-- command is just a ``dispatcher'' to one of many possible
+-- declaration functions. Which function is used, depends on which
+-- fields are present in the table passed to |declare|. For each
+-- registered handler, we call the |test| function. If it returns
+-- neither |nil| nor |false|, the |handler| field of this handler is
+-- called. If it returns |true|, the handler immediately
+-- finishes. Otherwise, the next handler is tried.
+
+function InterfaceToAlgorithms.addHandler(test, handler)
+ table.insert(declare_handlers, 1, { test = test, handler = handler })
+end
+
+
+
+-- Local stuff
+
+local key_metatable = {}
+
+---
+-- This function is the ``work-horse'' for declaring things. It allows
+-- you to specify on the algorithmic layer that a key ``is available''
+-- for use on the display layer. There is just one function for
+-- handling all declarations in order to make the declarations
+-- easy-to-use since you just need to import a single function:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+--\end{codeexample}
+--
+-- You can now use |declare| it as follows: You pass it a table
+-- containing information about the to-be-declared key. The table
+-- \emph{must} have a field |key| whose value is unique and must be a
+-- string. If the value of |key| is, say, |"foo"|, the
+-- parameter can be set on the display layer such as, say, the
+-- \tikzname\ layer, using |/graph drawing/foo|. Here is a typical
+-- example of how a declaration is done:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- ---
+-- declare {
+-- key = "electrical charge",
+-- type = "number",
+-- initial = "1.0",
+--
+-- summary = "The ``electrical charge'' is a property...",
+-- documentation = [[...]],
+-- examples = [[...]]
+-- }
+--\end{codeexample}
+--
+-- \medskip\noindent\textbf{Inlining Documentation.}
+-- The three keys |summary|, |documentation| and |examples| are
+-- intended for the display layer to give the users information about
+-- what the key does. The |summary| should be a string that succinctly
+-- describes the option. This text will typically be displayed for
+-- instance as a ``tool tip'' or in an option overview. The
+-- |documentation| optionally provides more information and should be
+-- typeset using \TeX. The |examples| can either be a single string or
+-- an array of strings. Each should be a \tikzname\ example
+-- demonstrating how the key is used.
+--
+-- Note that you can take advantage of the Lua syntax of enclosing
+-- very long multi-line strings in |[[| and |]]|. As a bonus, if the
+-- summary, documentation, or an example starts and ends with a quote,
+-- these two quotes will be stripped. This allows you to enclose the
+-- whole multi-line string (additionally) in quotes, leading to better
+-- syntax highlighting in editors.
+--
+-- \medskip\noindent\textbf{External Documentation.}
+-- It is sometimes more desirable to put the documentation of a key
+-- into an external file. First, this makes the code leaner and, thus,
+-- faster to read (both for humans and for computers). Second, for C
+-- code, it is quite inconvenient to have long strings inside a C
+-- file. In such cases, you can use the |documentation_in| field:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- ---
+-- declare {
+-- key = "electrical charge",
+-- type = "number",
+-- initial = "1.0",
+-- documentation_in = "some_filename"
+-- }
+--\end{codeexample}
+--
+-- The |some_filename| must be the name of a Lua file that will be
+-- read ``on demand'', that is, whenever someone tries to access the
+-- documentation, summary, or examples field of the key, this file
+-- will be loaded using |require|. The file should then use
+-- |pgf.gd.doc| to install the missing information in the keys.
+--
+-- \medskip\noindent\textbf{The Use Field.}
+-- When you declare a key, you can provide a |use| field. If present,
+-- you must set it to an array of small tables which have two fields:
+-- %
+-- \begin{itemize}
+-- \item |key| This is the name of another key or a function.
+-- \item |value| This is either a value (like a string or a number) or
+-- a function or |nil|.
+-- \end{itemize}
+--
+-- Here is an example:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- ---
+-- declare {
+-- key = "binary tree layout",
+-- use = {
+-- { key = "minimum number of children", value = 2 },
+-- { key = "significant sep", value = 12 },
+-- { key = "tree layout" }
+-- },
+-- summary = "The |binary tree layout| places node...",
+-- documentation = ...,
+-- examples = ...,
+-- }
+--\end{codeexample}
+--
+-- The effect of a |use| field is the following: Whenever the key is
+-- encountered on the option stack, the key is first handled
+-- normally. Then, we iterate over all elements of the |use|
+-- array. For each element, we perform the action as if the |key| of
+-- the array had been set explicitly to the value given by the |value|
+-- field. If the |value| is a function, we pass a different value to
+-- the key, namely the result of applying the function to the value
+-- originally passed to the original key. Here is a typical example:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- ---
+-- declare {
+-- key = "level sep",
+-- type = "length",
+-- use = {
+-- { key = "level pre sep", value = function (v) return v/2 end },
+-- { key = "level post sep", value = function (v) return v/2 end }
+-- },
+-- summary = "..."
+-- }
+--\end{codeexample}
+--
+-- Just like the value, the key itself can also be a function. In this
+-- case, the to-be-used key is also computed by applying the function
+-- to the value passed to the original key.
+--
+-- As mentioned at the beginning, |declare| is a work-horse that will call
+-- different internal functions depending on whether you declare a
+-- parameter key or a new algorithm or a collection kind. Which kind
+-- of declaration is being done is detected by the presence of certain
+-- fields in the table passed to |t|. The different kind of
+-- possible declarations are documented in the |declare_...|
+-- functions. Note that these functions are internal and cannot be
+-- called from outside; you must use the |declare| function.
+--
+-- @param t A table contain the field |key| and other fields as
+-- described.
+
+function InterfaceToAlgorithms.declare (t)
+ local keys = InterfaceCore.keys
+
+ -- Sanity check:
+ assert (type(t.key) == "string" and t.key ~= "", "parameter key may not be the empty string")
+ if keys[t.key] or t.keys == "algorithm_phases" then
+ error("parameter '" .. t.key .. "' already declared")
+ end
+
+ for _,h in ipairs (declare_handlers) do
+ if h.test(t) then
+ if h.handler(t) then
+ break
+ end
+ end
+ end
+
+ -- Attach metatable:
+ setmetatable (t, key_metatable)
+
+ -- Set!
+ keys[t.key] = t
+ keys[#keys + 1] = t
+end
+
+
+function key_metatable.__index (key_table, what)
+ if what == "documentation" or what == "summary" or what == "examples" then
+ local doc = rawget(key_table,"documentation_in")
+ if doc then
+ require (doc)
+ return rawget(key_table, what)
+ end
+ end
+end
+
+
+
+---
+-- This function is called by |declare| for ``normal parameter keys'',
+-- which are all keys for which no special field like |algorithm| or
+-- |layer| is declared. You write
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- ---
+-- declare {
+-- key = "electrical charge",
+-- type = "number",
+-- initial = "1.0",
+--
+-- summary = "The ``electrical charge'' is a property...",
+-- documentation = [[...]],
+-- examples = [[...]]
+-- }
+--\end{codeexample}
+--
+-- When an author writes |my node[electrical charge=5-3]| in the
+-- description of her graph, the object |vertex| corresponding to the
+-- node |my node| will have a field |options| attached to it with
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--vertex.options["electrical charge"] == 2
+--\end{codeexample}
+--
+-- The |type| field does not refer to Lua types. Rather, these types are
+-- sensible types for graph drawing and they are mapped by the higher
+-- layers to Lua types. In detail, the following types are available:
+-- %
+-- \begin{itemize}
+-- \item |number| A dimensionless number. Will be mapped to a normal
+-- Lua |number|. So, when the author writes |foo=5*2|, the |foo| key
+-- of the |options| field of the corresponding object will be set to
+-- |10.0|.
+-- \item |length| A ``dimension'' in the sense of \TeX\ (a number with
+-- a dimension like |cm| attached to it). It is the job of the display
+-- layer to map this to a number in ``\TeX\ points'', that is, to a
+-- multiple of $1/72.27$th of an inch.
+-- \item |time| A ``time'' in the sense of |\pgfparsetime|. Examples
+-- are |6s| or |0.1min| or |6000ms|, all of which will map to |6|.
+-- \item |string| Some text. Will be mapped to a Lua |string|.
+-- \item |canvas coordinate| A position on the canvas. Will be mapped
+-- to a |model.Coordinate|.
+-- \item |boolean| A Boolean value.
+-- \item |raw| Some to-be-executed Lua text.
+-- \item |direction| Normally, an angle; however,
+-- the special values of |down|, |up|, |left|, |right| as well as the
+-- directions |north|, |north west|, and so on are also legal on the
+-- display layer. All of them will be mapped to a number. Furthermore,
+-- a vertical bar (\verb!|!) will be mapped to |-90| and a minus sign
+-- (|-|) will be mapped to |0|.
+-- \item |hidden| A key of this type ``cannot be set'', that is,
+-- users cannot set this key at all. However algorithms can still read
+-- this key and, through the use of |alias|, can use the key as a
+-- handle to another key.
+-- \item |user value| The key stores a Lua user value (userdata). Such
+-- keys can only be set from C since user values cannot be created in
+-- Lua (let alone in \tikzname).
+-- \end{itemize}
+--
+-- If the |type| field is missing, it is automatically set to
+-- |"string"|.
+--
+-- A parameter can have an |initial| value. This value will be used
+-- whenever the parameter has not been set explicitly for an object.
+--
+-- A parameter can have a |default| value. This value will be used as
+-- the parameter value whenever the parameter is explicitly set, but
+-- no value is provided. For a key of type |"boolean"|, if no
+-- |default| is provided, |"true"| will be used automatically.
+--
+-- A parameter can have an |alias| field. This field must be set to
+-- the name of another key or to a function. Whenever you access the
+-- current key and this key is not set, the |alias| key is tried
+-- instead. If it is set, its value will be returned (if the |alias|
+-- key has itself an alias set, this is tried recursively). If the
+-- alias is not set either and neither does it have an initial value,
+-- the |initial| value is used. Note that in case the alias has its
+-- |initial| field set, the |initial| value of the current key will
+-- never be used.
+--
+-- The main purpose of the current key is to allow algorithms to
+-- introduce their own terminology for keys while still having access
+-- to the standard keys. For instance, the |OptimalHierarchyLayout|
+-- class uses the name |layerDistance| for what would be called
+-- |level distance| in the rest of the graph drawing system. In this
+-- case, we can declare the |layerDistance| key as follows:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- declare {
+-- key = "layerDistance",
+-- type = "length",
+-- alias = "level distance"
+-- }
+--\end{codeexample}
+--
+-- Inside the algorithm, we can write |...options.layerDistance| and
+-- will get the current value of the |level distance| unless the
+-- |layerDistance| has been set explicitly. Indeed, we might set the
+-- |type| to |hidden| to ensure that \emph{only} the |level distance|
+-- can and must set to set the layerDistance.
+--
+-- Note that there is a difference between |alias| and the |use|
+-- field: Suppose we write
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- declare {
+-- key = "layerDistance",
+-- type = "length",
+-- use = {
+-- { key = "level distance", value = lib.id }
+-- }
+-- }
+--\end{codeexample}
+--
+-- Here, when you say |layerDistance=1cm|, the |level distance| itself
+-- will be modified. When the |level distance| is set, however, the
+-- |layerDistance| will not be modified.
+--
+-- If the alias is a function, it will be called with the option table
+-- as its parameter. You can thus say things like
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- declare {
+-- key = "layerDistance",
+-- type = "length",
+-- alias = function (option)
+-- return option["layer pre dist"] + option["layer post dist"]
+-- end
+-- }
+--\end{codeexample}
+--
+-- As a special courtesy to C code, you can also set the key
+-- |alias_function_string|, which allows you to put the function into
+-- a string that is read using |loadstring|.
+--
+-- (You cannot call this function directly, it is included for
+-- documentation purposes only.)
+--
+-- @param t The table originally passed to |declare|.
+
+local function declare_parameter (t)
+
+ t.type = t.type or "string"
+
+ if t.type == "boolean" and t.default == nil then
+ t.default = true
+ end
+
+ -- Normal key
+ assert (type(t.type) == "string", "key type must be a string")
+
+ -- Declare via the hub:
+ if t.type ~= "hidden" then
+ InterfaceCore.binding:declareCallback(t)
+
+ -- Handle initials:
+ if t.initial then
+ InterfaceCore.option_initial[t.key] = InterfaceCore.convert(t.initial, t.type)
+ end
+ end
+
+ if t.alias_function_string and not t.alias then
+ local count = 0
+ t.alias = load (
+ function ()
+ count = count + 1
+ if count == 1 then
+ return "return "
+ elseif count == 2 then
+ return t.alias_function_string
+ else
+ return nil
+ end
+ end)()
+ end
+
+ if t.alias then
+ assert (type(t.alias) == "string" or type(t.alias == "function"), "alias must be a string or a function")
+ InterfaceCore.option_aliases[t.key] = t.alias
+ end
+
+ return true
+end
+
+
+
+
+---
+-- This function is called by |declare| for ``algorithm
+-- keys''. These keys are normally used without a value as in just
+-- |\graph[tree layout]|, but you can optionally pass a value to
+-- them. In this case, this value must be the name of a \emph{phase}
+-- and the algorithm of this phase will be set (and not the
+-- default phase of the key), see the description of phases below for
+-- details.
+--
+-- Algorithm keys are detected by the presence of the field |algorithm|
+-- in the table |t| passed to |declare|. Here is an example of how it
+-- is used:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- local ReingoldTilford1981 = {}
+--
+-- ---
+-- declare {
+-- key = "tree layout",
+-- algorithm = ReingoldTilford1981,
+--
+-- preconditions = {
+-- connected = true,
+-- tree = true
+-- },
+--
+-- postconditions = {
+-- upward_oriented = true
+-- },
+--
+-- summary = "The Reingold--Tilford method is...",
+-- documentation = ...,
+-- examples = ...,
+-- }
+--
+-- function ReingoldTilford1981:run()
+-- ...
+-- end
+--\end{codeexample}
+--
+-- The |algorithm| field expects either a table or a string as
+-- value. If you provide a string, then |require| will be applied to
+-- this string to obtain the table; however, this will happen only
+-- when the key is actually used for the first time. This means that
+-- you can declare (numerous) algorithms in a library without these
+-- algorithms actually being loaded until they are needed.
+--
+-- Independently of how the table is obtained, it will be ``upgraded''
+-- to a class by setting its |__index| field and installing a static
+-- |new| function (which takes a table of initial values as
+-- argument). Both these settings will only be done if they have not
+-- yet been performed.
+--
+-- Next, you can specify the fields |preconditions| and
+-- |postconditions|. The preconditions are a table that tell the graph
+-- drawing engine what kind of graphs your algorithm expects. If the
+-- input graph is not of this kind, it will be automatically
+-- transformed to meet this condition. Similarly, the postconditions
+-- tell the engine about properties of your graph after the algorithm
+-- has run. Again, additional transformations may be performed.
+--
+-- You can also specify the field |phase|. This tells the graph
+-- drawing engine which ``phase'' of the graph drawing process your
+-- option applies to. Each time you select an algorithm later on
+-- through use of the algorithm's key, the algorithm for this phase
+-- will be set; algorithms of other phases will not be changed.
+-- For instance, when an algorithm is part of the spanning tree
+-- computation, its phase will be |"spanning tree computation"| and
+-- using its key does not change the main algorithm, but only the
+-- algorithm used during the computation of a spanning tree for the
+-- current graph (in case this is needed by the main algorithm). In
+-- case the |phase| field is missing, the phase |main| is used. Thus,
+-- when no phase field is given, the key will change the main
+-- algorithm used to draw the graph.
+--
+-- Later on, the algorithm set for the current phase can be accessed
+-- through the special |algorithm_phases| field of |options|
+-- tables. The |algorithm_phases| table will contain two fields for each
+-- phase for which some algorithm has been set: One field is the name
+-- of the phase and its value will be the most recently set algorithm
+-- (class) set for this phase. The other field is the name of the
+-- phase followed by |" stack"|. It will contain an array of all
+-- algorithm classes that have been set for this key with the most
+-- recently at the end.
+--
+-- The following example shows the declaration of an algorithm that is
+-- the default for the phase |"spanning tree computation"|:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- ---
+-- declare {
+-- key = "breadth first spanning tree",
+-- algorithm = {
+-- run =
+-- function (self)
+-- return SpanningTreeComputation.computeSpanningTree(self.ugraph, false, self.events)
+-- end
+-- },
+-- phase = "spanning tree computation",
+-- phase_default = true,
+-- summary = ...
+-- }
+--\end{codeexample}
+--
+-- The algorithm is called as follows during a run of the main
+-- algorithms:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- local graph = ... -- the graph object
+-- local spanning_algorithm_class = graph.options.algorithm_phases["spanning tree computation"]
+-- local spanning_algorithm =
+-- spanning_algorithm_class.new{
+-- ugraph = ugraph,
+-- events = scope.events
+-- }
+-- local spanning_tree = spanning_algorithm:run()
+--\end{codeexample}
+--
+-- If you set the |phase_default| field of |t| to |true|, the algorithm will
+-- be installed as the default algorithm for the phase. This can be
+-- done only once per phase. Furthermore, for such a default algorithm
+-- the |algorithm| key must be table, it may not be a string (in other
+-- words, all default algorithms are loaded immediately). Accessing
+-- the |algorithm_phases| table for a phase for which no algorithm has
+-- been set will result in the default algorithm and the phase stack
+-- will also contain this algorithm; otherwise the phase stack will be empty.
+--
+-- (You cannot call this function directly, it is included for
+-- documentation purposes only.)
+--
+-- @param t The table originally passed to |declare|.
+
+local function declare_algorithm (t)
+ -- Algorithm declaration!
+ assert(type(t.algorithm) == "table" or type(t.algorithm) == "string")
+
+ t.phase = t.phase or "main"
+
+ local function make_class ()
+ local class
+
+ if type(t.algorithm) == "table" then
+ class = lib.class(t.algorithm)
+ else
+ class = lib.class(require(t.algorithm))
+ end
+
+ -- Now, save pre- and postconditions
+ class.preconditions = t.preconditions or {}
+ class.postconditions = t.postconditions or {}
+
+ -- Save phase
+ class.phase = t.phase
+
+ -- Compatibility
+ class.old_graph_model = t.old_graph_model
+
+ return class
+ end
+
+ -- Store this:
+ local store_me
+ if type(t.algorithm) == "table" then
+ store_me = make_class()
+ else
+ store_me = make_class
+ end
+
+ -- Save in the algorithm_classes table:
+ InterfaceCore.algorithm_classes[t.key] = store_me
+
+ assert(t.type == nil, "type may not be set for an algorithm key")
+ t.type = "string"
+
+ -- Install!
+ InterfaceCore.binding:declareCallback(t)
+
+ if t.phase_default then
+ assert (not InterfaceCore.option_initial.algorithm_phases[t.phase],
+ "default algorithm for phase already set")
+ assert (type(store_me) == "table",
+ "default algorithms must be loaded immediately")
+ InterfaceCore.option_initial.algorithm_phases[t.phase] = store_me
+ InterfaceCore.option_initial.algorithm_phases[t.phase .. " stack"] = { store_me }
+ else
+ InterfaceCore.option_initial.algorithm_phases[t.phase .. " stack"] = {
+ dummy = true -- Remove once Lua Link Bug is fixed
+ }
+ end
+
+ return true
+end
+
+
+
+
+---
+-- This function is called by |declare| for ``collection kinds''. They
+-- are detected by the presence of the field |layer|
+-- in the table |t| passed to |declare|. See the class |Collection|
+-- for details on what a collection and a collection kind is.
+--
+-- The |key| field of the table |t| passed to this function is both
+-- the name of the to-be-declared collection kind as well as the key
+-- that is used on the display layer to indicate that a node or edge
+-- belongs to a collection.
+--
+-- \medskip
+-- \noindent\textbf{The Display Layer.}
+-- Let us first have a look at what happens on the display layer:
+-- A key |t.key| is setup on the display layer that, when used inside
+-- a graph drawing scope, starts a new collection of the specified
+-- kind. ``Starts'' means that all nodes and edges mentioned in the
+-- rest of the current option scope will belong to a new collection
+-- of kind |t.key|.
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--declare { key = "hyper", layer = 1 }
+--\end{codeexample}
+-- %
+-- you can say on the \tikzname\ layer
+-- %
+--\begin{codeexample}[code only]
+-- \graph {
+-- a, b, c, d;
+-- { [hyper] a, b, c }
+-- { [hyper] b, c, d }
+-- };
+--\end{codeexample}
+--
+-- In this case, the nodes |a|, |b|, |c| will belong to a collection of
+-- kind |hyper|. The nodes |b|, |c|, and |d| will (also) belong to
+-- another collection of the same kind |hyper|. You can nest
+-- collections; in this case, nodes will belong to several
+-- collections.
+--
+-- The effect of declaring a collection kind on the algorithm layer
+-- it, first of all, that |scope.collections| will have a field named
+-- by the collection kind. This field will store an array that
+-- contains all collections that were declared as part of the
+-- graph. For instance, |collections.hyper| will contain all
+-- hyperedges, each of which is a table with the following fields: The
+-- |vertices| and |edges| fields each contain arrays of all objects
+-- being part of the collection. The |sub| field is an array of
+-- ``subcollections'', that is, all collections that were started
+-- inside another collection. (For the collection kinds |hyper| and
+-- |same layer| this makes no sense, but subgraphs could, for instance,
+-- be nested.)
+--
+-- \medskip
+-- \noindent\textbf{Rendering of Collections.}
+-- For some kinds of collections, it makes sense to \emph{render} them,
+-- but only after the graph drawing algorithm has run. For this
+-- purpose, the binding layer will use a callback for each collection
+-- kind and each collection, see the |Binding| class for details.
+-- Suppose, for instance, you would
+-- like hyperedges to be rendered. In this case, a graph drawing
+-- algorithm should iterate over all collections of type |hyper| and
+-- compute some hints on how to render the hyperedge and store this
+-- information in the |generated_options| table of the hyperedge. Then,
+-- the binding layer will ask the display layer to run some some code
+-- that is able to read key--value pairs passed to
+-- it (which are the key--value pairs of the |generated_options| table)
+-- and use this information to nicely draw the hyperedge.
+--
+-- The number |t.layer| determines in which order the different
+-- collection kinds are rendered.
+--
+-- The last parameter, the layer number, is used to specify the order
+-- in which the different collection kinds are rendered. The higher the
+-- number, the later the collection will be rendered. Thus, if there is
+-- a collection kind with layer number 10 and another with layer number
+-- 20, all collections of the first kind will be rendered first,
+-- followed by all collections of the second kind.
+--
+-- Collections whose layer kinds are non-negative get rendered
+-- \emph{after} the nodes and edges have already been rendered. In
+-- contrast, collections with a negative layer number get shown
+-- ``below'' the nodes and edges.
+--
+-- (You cannot call this function directly, it is included for
+-- documentation purposes only.)
+--
+-- @param t The table originally passed to |declare|.
+
+local function declare_collection_kind (t)
+ assert (type(t.layer) == "number", "layer must be a number")
+
+ local layer = t.layer
+ local kind = t.key
+ local kinds = InterfaceCore.collection_kinds
+ local new_entry = { kind = kind, layer = layer }
+
+ -- Insert into table part:
+ kinds[kind] = new_entry
+
+ -- Insert into array part:
+ local found
+ for i=1,#kinds do
+ if kinds[i].layer > layer or (kinds[i].layer == layer and kinds[i].kind > kind) then
+ table.insert(kinds, i, new_entry)
+ return
+ end
+ end
+
+ kinds[#kinds+1] = new_entry
+
+ -- Bind
+ InterfaceCore.binding:declareCallback(t)
+
+ return true
+end
+
+
+
+-- Build in handlers:
+
+declare_handlers = {
+ { test = function (t) return t.algorithm_written_in_c end, handler = InterfaceToC.declare_algorithm_written_in_c },
+ { test = function (t) return t.algorithm end, handler = declare_algorithm },
+ { test = function (t) return t.layer end, handler = declare_collection_kind },
+ { test = function (t) return true end, handler = declare_parameter }
+}
+
+
+
+
+
+
+
+
+---
+-- Finds a node by its name. This method should be used by algorithms
+-- for which a node name is specified in some option and, thus, needs
+-- to be converted to a vertex object during a run of the algorithm.
+--
+-- @param name A node name
+--
+-- @return The vertex of the given name in the syntactic digraph or
+-- |nil|.
+
+function InterfaceToAlgorithms.findVertexByName(name)
+ return InterfaceCore.topScope().node_names[name]
+end
+
+
+
+
+
+-- Helper function
+local function add_to_collections(collection,where,what)
+ if collection then
+ LookupTable.addOne(collection[where],what)
+ add_to_collections(collection.parent,where,what)
+ end
+end
+
+local unique_count = 1
+
+---
+-- Generate a new vertex in the syntactic digraph. Calling this method
+-- allows algorithms to create vertices that are not present in the
+-- original input graph. Using the graph drawing coroutine, this
+-- function will pass back control to the display layer in order to
+-- render the vertex and, thereby, create precise size information
+-- about it.
+--
+-- Note that creating new vertices in the syntactic digraph while the
+-- algorithm is already running is a bit at odds with the notion of
+-- treating graph drawing as a series of graph transformations: For
+-- instance, when a new vertex is created, the graph will (at least
+-- temporarily) no longer be connected; even though an algorithm may
+-- have requested that it should only be fed connected
+-- graphs. Likewise, more complicated requirements like insisting on
+-- the graph being a tree also cannot be met.
+--
+-- For these reasons, the following happens, when a new vertex is
+-- created using the function:
+-- %
+-- \begin{enumerate}
+-- \item The vertex is added to the syntactic digraph.
+-- \item It is added to all layouts on the current layout stack. When
+-- a graph drawing algorithm is run, it is not necessarily run on the
+-- original syntactic digraph. Rather, a sequence / stack of nested
+-- layouts may currently
+-- be processed and the vertex is added to all of them.
+-- \item The vertex is added to both the |digraph| and the |ugraph| of
+-- the current algorithm.
+-- \end{enumerate}
+--
+-- @param algorithm An algorithm for whose syntactic digraph the node
+-- should be added
+-- @param init A table of initial values for the node that is passed
+-- to |Binding:createVertex|, see that function for details.
+--
+-- @return The newly created node
+--
+function InterfaceToAlgorithms.createVertex(algorithm, init)
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ local binding = InterfaceCore.binding
+
+ -- Setup node
+ if not init.name then
+ init.name = "internal@gd@node@" .. unique_count
+ unique_count = unique_count + 1
+ end
+
+ -- Does vertex already exist?
+ assert (not scope.node_names[name], "node already created")
+
+ if not init.shape or init.shape == "none" then
+ init.shape = "rectangle"
+ end
+
+ -- Call binding
+ binding:createVertex(init)
+
+ local v = assert(scope.node_names[init.name], "internal node creation failed")
+
+ -- Add vertex to the algorithm's digraph and ugraph
+ algorithm.syntactic_component:add {v}
+ algorithm.digraph:add {v}
+ algorithm.ugraph:add {v}
+
+ -- Compute bounding boxes:
+ LayoutPipeline.prepareBoundingBoxes(algorithm.rotation_info, algorithm.adjusted_bb, algorithm.digraph, {v})
+
+ -- Add the node to the layout stack:
+ add_to_collections(algorithm.layout, "vertices", v)
+
+ algorithm.layout_graph:add { v }
+
+ return v
+end
+
+
+
+---
+-- Generate a new edge in the syntactic digraph. This method is quite
+-- similar to |createVertex| and has the same effects with respect to
+-- the edge: The edge is added to the syntactic digraph and also to
+-- all layouts on the layout stack. Furthermore, appropriate edges are
+-- added to the |digraph| and the |ugraph| of the algorithm currently
+-- running.
+--
+-- @param algorithm An algorithm for whose syntactic digraph the node should be added
+-- @param tail A syntactic tail vertex
+-- @param head A syntactic head vertex
+-- @param init A table of initial values for the edge.
+--
+-- The following fields are useful for |init|:
+-- %
+-- \begin{itemize}
+-- \item |init.direction| If present, a direction for the edge. Defaults to "--".
+-- \item |init.options| If present, some options for the edge.
+-- \item |init.generated_options| A table that is passed back to the
+-- display layer as a list of key-value pairs in the syntax of
+-- |declare_parameter|.
+-- \end{itemize}
+
+function InterfaceToAlgorithms.createEdge(algorithm, tail, head, init)
+
+ init = init or {}
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ local binding = InterfaceCore.binding
+ local syntactic_digraph = algorithm.layout_graph
+ local syntactic_component = algorithm.syntactic_component
+
+ assert (syntactic_digraph:contains(tail) and
+ syntactic_digraph:contains(head),
+ "attempting to create edge between nodes that are not in the syntactic digraph")
+
+ local arc = syntactic_digraph:connect(tail, head)
+
+ local edge = Edge.new {
+ head = head,
+ tail = tail,
+ direction = init.direction or "--",
+ options = init.options or algorithm.layout.options,
+ path = init.path,
+ generated_options = init.generated_options
+ }
+
+ -- Add to arc
+ arc.syntactic_edges[#arc.syntactic_edges+1] = edge
+
+ local s_arc = syntactic_component:connect(tail, head)
+ s_arc.syntactic_edges = arc.syntactic_edges
+
+ -- Create Event
+ local e = InterfaceToDisplay.createEvent ("edge", { arc, #arc.syntactic_edges })
+ edge.event = e
+
+ -- Make part of collections
+ for _,c in ipairs(edge.options.collections) do
+ LookupTable.addOne(c.edges, edge)
+ end
+
+ -- Call binding
+ binding.storage[edge] = {}
+ binding:everyEdgeCreation(edge)
+
+ -- Add edge to digraph and ugraph
+ local direction = edge.direction
+ if direction == "->" then
+ algorithm.digraph:connect(tail, head)
+ elseif direction == "<-" then
+ algorithm.digraph:connect(head, tail)
+ elseif direction == "--" or direction == "<->" then
+ algorithm.digraph:connect(tail, head)
+ algorithm.digraph:connect(head, tail)
+ end
+ algorithm.ugraph:connect(tail, head)
+ algorithm.ugraph:connect(head, tail)
+
+ -- Add edge to layouts
+ add_to_collections(algorithm.layout, "edges", edge)
+
+end
+
+
+
+
+
+-- Done
+
+return InterfaceToAlgorithms
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToC.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToC.lua
new file mode 100644
index 0000000000..282727b66a
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToC.lua
@@ -0,0 +1,78 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- This table contains functions that are used (on the Lua side) to
+-- prepare a graph for use in C and, vice versa, to translate back the
+-- results of C to Lua.
+
+local InterfaceToC = {}
+
+-- Imports
+
+local lib = require "pgf.gd.lib"
+
+
+---
+-- This function is called by |declare| for ``algorithm
+-- keys'' where the algorithm is not written in Lua, but rather in the
+-- programming language C. You do not call this function yourself;
+-- |InterfaceFromC.h| will do it for you. Nevertheless, if you
+-- provide a table to |declare| with the field
+-- |algorithm_written_in_c| set, the following happens: The table's
+-- |algorithm| field is set to an algorithm class object whose |run|
+-- method calls the function passed via the
+-- |algorithm_written_in_c| field. It will be called with the
+-- following parameters (in that order):
+-- %
+-- \begin{enumerate}
+-- \item The to-be-laid out digraph. This will not be the whole layout
+-- graph (syntactic digraph) if preprocessing like decomposition into
+-- connected components is used.
+-- \item An array of the digraph's vertices, but with the table part
+-- hashing vertex objects to their indices in the array part.
+-- \item An array of the syntactic edges of the digraph. Like the
+-- array, the table part will hash back the indices of the edge objects.
+-- \item The algorithm object.
+-- \end{enumerate}
+--
+-- @param t The table originally passed to |declare|.
+
+function InterfaceToC.declare_algorithm_written_in_c (t)
+ t.algorithm = {
+ run = function (self)
+ local back_table = lib.icopy(self.ugraph.vertices)
+ for i,v in ipairs(self.ugraph.vertices) do
+ back_table[v] = i
+ end
+ local edges = {}
+ for _,a in ipairs(self.ugraph.arcs) do
+ local b = self.layout_graph:arc(a.tail,a.head)
+ if b then
+ lib.icopy(b.syntactic_edges, edges)
+ end
+ end
+ for i=1,#edges do
+ edges[edges[i]] = i
+ end
+ collectgarbage("stop") -- Remove once Lua Link Bug is fixed
+ t.algorithm_written_in_c (self.digraph, back_table, edges, self)
+ collectgarbage("restart") -- Remove once Lua Link Bug is fixed
+ end
+ }
+end
+
+
+
+-- Done
+
+return InterfaceToC
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToDisplay.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToDisplay.lua
new file mode 100644
index 0000000000..23018efcaa
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/InterfaceToDisplay.lua
@@ -0,0 +1,1002 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This class provides the interface between a display
+-- layer (like \tikzname\ or a graph editor) and graph drawing
+-- system. Another class, |InterfaceToAlgorithms|, binds the algorithm
+-- layer (which are written in Lua) to the graph drawing system.
+--
+-- The functions declared here are independent of the actual display
+-- layer. Rather, the differences between the layers are encapsulated
+-- by subclasses of the |Binding| class, see that class for
+-- details. Thus, when a new display layer is written, the present
+-- class is \emph{used}, but not \emph{modified}. Instead, only a new
+-- binding is created and all display layer specific interaction is
+-- put there.
+--
+-- The job of this class is to provide convenient methods that can be
+-- called by the display layer. For instance, it provides methods for
+-- starting a graph drawing scope, managing the stack of such scope,
+-- adding a node to a graph and so on.
+
+local InterfaceToDisplay = {}
+
+-- Namespace
+require("pgf.gd.interface").InterfaceToDisplay = InterfaceToDisplay
+
+
+-- Imports
+local InterfaceCore = require "pgf.gd.interface.InterfaceCore"
+local Scope = require "pgf.gd.interface.Scope"
+
+local Binding = require "pgf.gd.bindings.Binding"
+
+local Sublayouts = require "pgf.gd.control.Sublayouts"
+local LayoutPipeline = require "pgf.gd.control.LayoutPipeline"
+
+local Digraph = require "pgf.gd.model.Digraph"
+local Vertex = require "pgf.gd.model.Vertex"
+local Edge = require "pgf.gd.model.Edge"
+local Collection = require "pgf.gd.model.Collection"
+
+local Storage = require "pgf.gd.lib.Storage"
+local LookupTable = require "pgf.gd.lib.LookupTable"
+local Event = require "pgf.gd.lib.Event"
+
+local lib = require "pgf.gd.lib"
+
+
+-- Forward declarations
+local get_current_options_table
+local render_collections
+local push_on_option_stack
+local vertex_created
+
+-- Local objects
+
+local phase_unique = {} -- a unique handle
+local collections_unique = {} -- a unique handle
+local option_cache = nil -- The option cache
+
+
+
+
+---
+-- Initialize the binding. This function is called once by the display
+-- layer at the very beginning. For instance, \tikzname\ does the
+-- following call:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--InterfaceToDisplay.bind(require "pgf.gd.bindings.BindingToPGF")
+--\end{codeexample}
+--
+-- Inside this call, many standard declarations will be executed, that
+-- is, the declared binding will be used immediately.
+--
+-- Subsequently, the |binding| field of the |InterfaceCore| can be used.
+--
+-- @param class A subclass of |Binding|.
+
+function InterfaceToDisplay.bind(class)
+ assert (not InterfaceCore.binding, "binding already initialized")
+
+ -- Create a new object
+ InterfaceCore.binding = setmetatable({}, class)
+
+ -- Load these libraries, which contain many standard declarations:
+ require "pgf.gd.model.library"
+ require "pgf.gd.control.library"
+end
+
+
+
+
+---
+-- Start a graph drawing scope. Note that this is not the same as
+-- starting a subgraph / sublayout, which are local to a graph drawing
+-- scope: When a new graph drawing scope is started, it is pushed on
+-- top of a stack of graph drawing scopes and all other ``open''
+-- scopes are no longer directly accessible. All method calls to an
+-- |Interface...| object will refer to this newly created scope until
+-- either a new scope is opened or until the current scope is closed
+-- once more.
+--
+-- Each graph drawing scope comes with a syntactic digraph that is
+-- build using methods like |addVertex| or |addEdge|.
+--
+-- @param height The to-be-used height of the options stack. All
+-- options above this height will be popped prior to attacking the
+-- options to the syntactic digraph.
+
+function InterfaceToDisplay.beginGraphDrawingScope(height)
+
+ -- Create a new scope table
+ local scope = Scope.new {}
+
+ -- Setup syntactic digraph:
+ local g = scope.syntactic_digraph
+
+ g.options = get_current_options_table(height)
+ g.syntactic_digraph = g
+ g.scope = scope
+
+ -- Push scope:
+ InterfaceCore.scopes[#InterfaceCore.scopes + 1] = scope
+end
+
+
+
+---
+-- Arranges the current graph using the specified algorithm and options.
+--
+-- This function should be called after the graph drawing scope has
+-- been opened and the syntactic digraph has been completely
+-- specified. It will now start running the algorithm specified
+-- through the |algorithm_phase| options.
+--
+-- Internally, this function creates a coroutine that will run the current graph
+-- drawing algorithm. Coroutines are needed since a graph drawing
+-- algorithm may choose to create a new node. In this case, the
+-- algorithm needs to be suspended and control must be returned back
+-- to the display layer, so that the node can be typeset in order to
+-- determine the precise size information. Once this is done, control
+-- must be passed back to the exact point inside the algorithm where
+-- the node was created. Clearly, all of these actions are exactly
+-- what coroutines are for.
+--
+-- @return Time it took to run the algorithm
+
+function InterfaceToDisplay.runGraphDrawingAlgorithm()
+
+ -- Time things
+ local start = os.clock()
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ assert(not scope.coroutine, "coroutine already created for current gd scope")
+
+ -- The actual drawing function
+ local function run ()
+ if #scope.syntactic_digraph.vertices == 0 then
+ -- Nothing needs to be done
+ return
+ end
+
+ LayoutPipeline.run(scope)
+ end
+
+ scope.coroutine = coroutine.create(run)
+
+ -- Run it:
+ InterfaceToDisplay.resumeGraphDrawingCoroutine()
+
+ -- End timing:
+ local stop = os.clock()
+
+ return stop - start
+end
+
+
+---
+-- Resume the graph drawing coroutine.
+--
+-- This function is the work horse of the coroutine management. It
+-- gets called whenever control passes back from the display layer to
+-- the algorithm level. We resume the graph drawing coroutine so that the
+-- algorithm can start/proceed. The tricky part is when the algorithm
+-- yields, but is not done. In this case, the code needed for creating
+-- a new node is passed back to the display layer through the binding,
+-- which must then execute the code and then resuming the coroutine.
+--
+function InterfaceToDisplay.resumeGraphDrawingCoroutine()
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ local binding = InterfaceCore.binding
+
+ -- Asserts
+ assert(scope.coroutine, "coroutine not created for current gd scope")
+
+ -- Run
+ local ok, text = coroutine.resume(scope.coroutine)
+ assert(ok, text)
+ if coroutine.status(scope.coroutine) ~= "dead" then
+ -- Ok, ask binding to continue
+ binding:resumeGraphDrawingCoroutine(text)
+ end
+end
+
+
+
+--- Ends the current graph drawing scope.
+--
+function InterfaceToDisplay.endGraphDrawingScope()
+ assert(#InterfaceCore.scopes > 0, "no gd scope open")
+ InterfaceCore.scopes[#InterfaceCore.scopes] = nil -- pop
+end
+
+
+
+
+---
+-- Creates a new vertex in the syntactic graph of the current graph
+-- drawing scope. The display layer should call this function for each
+-- node of the graph. The |name| must be a unique string identifying
+-- the node. The newly created vertex will be added to the syntactic
+-- digraph. The binding function |everyVertexCreation| will then be
+-- called, allowing the binding to store information regarding the newly
+-- created vertex.
+--
+-- For each vertex an event will be created in the event
+-- sequence. This event will have the kind |"node"| and its
+-- |parameter| will be the vertex.
+--
+-- @param name Name of the vertex.
+--
+-- @param shape The shape of the vertex such as |"circle"| or
+-- |"rectangle"|. This shape may help a graph drawing algorithm
+-- figuring out how the node should be placed.
+--
+-- @param path A |Path| object representing the vertex's path.
+--
+-- @param height The to-be-used height of the options stack. All
+-- options above this height will be popped prior to attacking the
+-- options to the syntactic digraph.
+--
+-- @param binding_infos These options are passed to and are specific
+-- to the current |Binding|.
+--
+-- @param anchors A table of anchors (mapping anchor positions to
+-- |Coordinates|).
+
+
+function InterfaceToDisplay.createVertex(name, shape, path, height, binding_infos, anchors)
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ local binding = InterfaceCore.binding
+
+ -- Does vertex already exist?
+ local v = scope.node_names[name]
+ assert (not v or not v.created_on_display_layer, "node already created")
+
+ -- Create vertex
+ if not v then
+ v = Vertex.new {
+ name = name,
+ shape = shape,
+ kind = "node",
+ path = path,
+ options = get_current_options_table(height),
+ anchors = anchors,
+ }
+
+ vertex_created(v,scope)
+ else
+ assert(v.kind == "subgraph node", "subgraph node expected")
+ v.shape = shape
+ v.path = path
+ v.anchors = anchors
+ end
+
+ v.created_on_display_layer = true
+
+ -- Call binding
+ binding.storage[v] = binding_infos
+ binding:everyVertexCreation(v)
+end
+
+
+-- This is a helper function
+function vertex_created(v,scope)
+
+ -- Create Event
+ local e = InterfaceToDisplay.createEvent ("node", v)
+ v.event = e
+
+ -- Create name lookup
+ scope.node_names[v.name] = v
+
+ -- Add vertex to graph
+ scope.syntactic_digraph:add {v}
+
+ -- Add to collections
+ for _,c in ipairs(v.options.collections) do
+ LookupTable.addOne(c.vertices, v)
+ end
+
+end
+
+
+
+---
+-- Creates a new vertex in the syntactic graph of the current graph
+-- drawing scope that is a subgraph vertex. Such a vertex
+-- ``surrounds'' the vertices of a subgraph. The special property of a
+-- subgraph node opposed to a normal node is that it is created only
+-- after the subgraph has been laid out. However, the difference to a
+-- collection like |hyper| is that the node is available immediately as
+-- a normal node in the sense that you can connect edges to it.
+--
+-- What happens internally is that subgraph nodes get ``registered''
+-- immediately both on the display level and on the algorithm level,
+-- but the actual node is only created inside the layout pipeline
+-- using a callback of the binding. The present function is used to
+-- perform this registering. The node creation happens when the
+-- innermost layout in which the subgraph node is declared has
+-- finished. For each subgraph node, a collection is created that
+-- contains all vertices (and edges) being part of the subgraph. For
+-- this reason, this method is a |push...| method, since it pushes
+-- something on the options stack.
+--
+-- The |init| parameter will be used during the creation of the node,
+-- see |Binding:createVertex| for details on the fields. Note that
+-- |init.text| is often not displayed for such ``vast'' nodes as those
+-- created for whole subgraphs, but a shape may use it nevertheless
+-- (for instance, one might display this text at the top of the node
+-- or, in case of a \textsc{uml} package, in a special box above the
+-- actual node).
+--
+-- The |init.generated_options| will be augmented by additional
+-- key--value pairs when the vertex is created:
+-- %
+-- \begin{itemize}
+-- \item The key |subgraph point cloud| will have as its value a
+-- string that is be a list of points (without separating commas)
+-- like |"(10pt,20pt)(0pt,0pt)(30pt,40pt)"|, always in
+-- this syntax. The list will contain all points inside the
+-- subgraph. In particular, a bounding box around these points will
+-- encompass all nodes and bend points of the subgraph.
+-- The bounding box of this point cloud is guaranteed to be centered on
+-- the origin.
+-- \item The key |subgraph bounding box width| will have as its value
+-- the width of a bounding box (in \TeX\ points, as a string with the
+-- suffix |"pt"|).
+-- \item The key |subgraph bounding box height| stores the height of a
+-- bounding box.
+-- \end{itemize}
+--
+-- @param name The name of the node.
+-- @param height Height of the options stack. Note that this method
+-- pushes something (namely a collection) on the options stack.
+-- @param info A table passed to |Binding:createVertex|, see that function.
+--
+function InterfaceToDisplay.pushSubgraphVertex(name, height, info)
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ local binding = InterfaceCore.binding
+
+ -- Does vertex already exist?
+ assert (not scope.node_names[name], "node already created")
+
+ -- Create vertex
+ local v = Vertex.new {
+ name = name,
+ kind = "subgraph node",
+ options = get_current_options_table(height-1)
+ }
+
+ vertex_created(v,scope)
+
+ -- Store info
+ info.generated_options = info.generated_options or {}
+ info.name = name
+ v.subgraph_info = info
+
+ -- Create collection and link it to v
+ local _, _, entry = InterfaceToDisplay.pushOption(InterfaceCore.subgraph_node_kind, nil, height)
+ v.subgraph_collection = entry.value
+ v.subgraph_collection.subgraph_node = v
+
+ -- Find parent collection in options stack:
+ local collections = v.options.collections
+ for i=#collections,1,-1 do
+ if collections[i].kind == InterfaceCore.sublayout_kind then
+ v.subgraph_collection.parent_layout = collections[i]
+ break
+ end
+ end
+end
+
+
+
+---
+-- Add options for an already existing vertex.
+--
+-- This function allows you to add options to an already existing
+-- vertex. The options that will be added are all options on the
+-- current options stack; they will overwrite existing options of the
+-- same name. For collections, the vertex stays in all collections it
+-- used to, it is only added to all collections that are currently on
+-- the options stack.
+--
+-- @param name Name of the vertex.
+-- @param height The option stack height.
+
+function InterfaceToDisplay.addToVertexOptions(name, height)
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+
+ -- Does vertex already exist?
+ local v = assert (scope.node_names[name], "node is missing, cannot add options")
+
+ v.options = get_current_options_table(height, v.options)
+
+ -- Add to collections
+ for _,c in ipairs(v.options.collections) do
+ LookupTable.addOne(c.vertices, v)
+ end
+
+end
+
+
+
+
+
+---
+-- Creates a new edge in the syntactic graph of the current graph
+-- drawing scope. The display layer should call this function for each
+-- edge that is created. Both the |from| vertex and the |to| vertex
+-- must exist (have been created through |createVertex|) prior to your
+-- being able to call this function.
+--
+-- After the edge has been created, the binding layer's function
+-- |everyEdgeCreation| will be called, allowing the binding layer to
+-- store information about the edge.
+--
+-- For each edge an event is created, whose kind is |"edge"| and whose
+-- |parameter| is a two-element array whose first entry is the edge's
+-- arc in the syntactic digraph and whose second entry is the position
+-- of the edge in the arc's array of syntactic edges.
+--
+-- @param tail Name of the node the edge begins at.
+-- @param head Name of the node the edge ends at.
+-- @param direction Direction of the edge (e.g. |--| for an undirected edge
+-- or |->| for a directed edge from the first to the second
+-- node).
+-- @param height The option stack height, see for instance |createVertex|.
+--
+-- @param binding_infos These options will be stored in the |storage|
+-- of the vertex at the field index by the binding.
+
+function InterfaceToDisplay.createEdge(tail, head, direction, height, binding_infos)
+
+ -- Setup
+ local scope = InterfaceCore.topScope()
+ local binding = InterfaceCore.binding
+
+ -- Does vertex already exist?
+ local h = scope.node_names[head]
+ local t = scope.node_names[tail]
+ assert (h and t, "attempting to create edge between nodes that are not in the graph")
+
+ -- Create Arc object
+ local arc = scope.syntactic_digraph:connect(t, h)
+
+ -- Create Edge object
+ local edge = Edge.new {
+ head = h,
+ tail = t,
+ direction = direction,
+ options = get_current_options_table(height)
+ }
+
+ -- Add to arc
+ arc.syntactic_edges[#arc.syntactic_edges+1] = edge
+
+ -- Create Event
+ local e = InterfaceToDisplay.createEvent ("edge", { arc, #arc.syntactic_edges })
+ edge.event = e
+
+ -- Make part of collections
+ for _,c in ipairs(edge.options.collections) do
+ LookupTable.addOne(c.edges, edge)
+ end
+
+ -- Call binding
+ binding.storage[edge] = binding_infos
+ binding:everyEdgeCreation(edge)
+
+end
+
+
+
+
+
+---
+-- Push an option to the stack of options.
+--
+-- As a graph is parsed, a stack of ``current options''
+-- is created. To add something to this table, the display layers may
+-- call the method |pushOption|. To pop something from this stack,
+-- just set the |height| value during the next push to the position to
+-- which you actually wish to push something; everything above and
+-- including this position will be popped from the stack.
+--
+-- When an option is pushed, several additional options may also be
+-- pushed, namely whenever the option has a |use| field set. These
+-- additional options may, in turn, also push new options. Because of
+-- this, this function returns a new stack height, representing the
+-- resulting stack height.
+--
+-- In addition to this stack height, this function returns a Boolean
+-- value indicating whether a ``main algorithm phase was set''. This
+-- happens whenever a key is executed (directly or indirectly through
+-- the |use| field) that selects an algorithm for the ``main''
+-- algorithm phase. This information may help the caller to setup the
+-- graph drawing scopes correctly.
+--
+-- @param key A parameter (must be a string).
+-- @param value A value (can be anything). If it is a string, it will
+-- be converted to whatever the key expects.
+-- @param height A stack height at which to insert the key. Everything
+-- above this height will be removed.
+--
+-- @return A new stack height
+-- @return A Boolean that is |true| if the main algorithm phase was
+-- set by the option or one option |use|d by it.
+-- @return The newly created entry on the stack. If more entries are
+-- created through the use of the |use| field, the original entry is
+-- returned nevertheless.
+
+
+function InterfaceToDisplay.pushOption(key, value, height)
+ assert(type(key) == "string", "illegal key")
+
+ local key_record = assert(InterfaceCore.keys[key], "unknown key")
+ local main_phase_set = false
+
+ if value == nil and key_record.default then
+ value = key_record.default
+ end
+
+ -- Find out what kind of key we are pushing:
+
+ if key_record.algorithm then
+ -- Push a phase
+ if type(InterfaceCore.algorithm_classes[key]) == "function" then
+ -- Call the constructor function
+ InterfaceCore.algorithm_classes[key] = InterfaceCore.algorithm_classes[key]()
+ end
+
+ local algorithm = InterfaceCore.algorithm_classes[key]
+
+ assert (algorithm, "algorithm class not found")
+
+ push_on_option_stack(phase_unique,
+ { phase = value or key_record.phase, algorithm = algorithm },
+ height)
+
+ if key_record.phase == "main" then
+ main_phase_set = true
+ end
+
+ elseif key_record.layer then
+ -- Push a collection
+ local stack = InterfaceCore.option_stack
+ local scope = InterfaceCore.topScope()
+
+ -- Get the stack above "height":
+ local options = get_current_options_table(height-1)
+
+ -- Create the collection event
+ local event = InterfaceToDisplay.createEvent ("collection", key)
+
+ -- Create collection object:
+ local collection = Collection.new { kind = key, options = options, event = event }
+
+ -- Store in collections table of current scope:
+ local collections = scope.collections[key] or {}
+ collections[#collections + 1] = collection
+ scope.collections[key] = collections
+
+ -- Build collection tree
+ collection:registerAsChildOf(options.collections[#options.collections])
+
+ -- Push on stack
+ push_on_option_stack(collections_unique, collection, height)
+
+ else
+
+ -- A normal key
+ push_on_option_stack(key, InterfaceCore.convert(value, InterfaceCore.keys[key].type), height)
+
+ end
+
+ local newly_created = InterfaceCore.option_stack[#InterfaceCore.option_stack]
+
+ -- Now, push use keys:
+ local use = key_record.use
+ if key_record.use then
+ local flag
+ for _,u in ipairs(InterfaceCore.keys[key].use) do
+ local use_k = u.key
+ local use_v = u.value
+ if type(use_k) == "function" then
+ use_k = use_k(value)
+ end
+ if type(use_v) == "function" then
+ use_v = use_v(value)
+ end
+ height, flag = InterfaceToDisplay.pushOption(use_k, use_v, height+1)
+ main_phase_set = main_phase_set or flag
+ end
+ end
+
+ return height, main_phase_set, newly_created
+end
+
+
+---
+-- Push a layout on the stack of options. As long as this layout is on
+-- the stack, all vertices and edges will be part of this layout. For
+-- details on layouts, please see |Sublayouts|.
+--
+-- @param height A stack height at which to insert the key. Everything
+-- above this height will be removed.
+
+function InterfaceToDisplay.pushLayout(height)
+ InterfaceToDisplay.pushOption(InterfaceCore.sublayout_kind, nil, height)
+end
+
+
+
+---
+-- Creates an event and adds it to the event string of the current scope.
+--
+-- @param kind Name/kind of the event.
+-- @param parameters Parameters of the event.
+--
+-- @return The newly pushed event
+--
+function InterfaceToDisplay.createEvent(kind, param)
+ local scope = InterfaceCore.topScope()
+ local n = #scope.events + 1
+ local e = Event.new { kind = kind, parameters = param, index = n }
+ scope.events[n] = e
+
+ return e
+end
+
+
+
+---
+-- This method allows you to query the table of all declared keys. It
+-- contains them both as an array and also as a table index by the
+-- keys's names. In particular, you can then iterate over it using
+-- |ipairs| and you can check whether a key is defined by accessing
+-- the table at the key's name. Each entry of the table is the
+-- original table passed to |InterfaceToAlgorithms.declare|.
+--
+-- @return A lookup table of all declared keys.
+
+function InterfaceToDisplay.getDeclaredKeys()
+ return InterfaceCore.keys
+end
+
+
+
+
+---
+-- Renders the graph.
+--
+-- This function is called after the graph has been laid out by the
+-- graph drawing algorithms. It will trigger a sequence of calls to
+-- the binding layer that will, via callbacks, start rendering the
+-- whole graph.
+--
+-- In detail, this function calls:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local binding = InterfaceCore.binding
+--
+--binding:renderStart()
+--render_vertices()
+--render_edges()
+--render_collections()
+--binding:renderStop()
+--\end{codeexample}
+--
+-- Here, the |render_...| functions are local, internal functions that are,
+-- nevertheless, documented here.
+--
+-- @param name Returns the algorithm class that has been declared using
+-- |declare| under the given name.
+
+function InterfaceToDisplay.renderGraph()
+ local scope = InterfaceCore.topScope()
+ local syntactic_digraph = scope.syntactic_digraph
+
+ local binding = InterfaceCore.binding
+
+ binding:renderStart()
+ render_vertices(syntactic_digraph.vertices)
+ render_edges(syntactic_digraph.arcs)
+ render_collections(scope.collections)
+ binding:renderStop()
+end
+
+
+
+
+
+---
+-- Render the vertices after the graph drawing algorithm has
+-- finished. This function is local and internal and included only for
+-- documenting the call graph.
+--
+-- When the graph drawing algorithm is done, the interface will start
+-- rendering the vertices by calling appropriate callbacks of the
+-- binding layer.
+--
+-- Consider the following code:
+-- %
+--\begin{codeexample}[code only]
+--\graph [... layout] {
+-- a -- b -- c -- d;
+--};
+--\end{codeexample}
+--
+-- In this case, after the graph drawing algorithm has run, the
+-- present function will call:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local binding = InterfaceCore.binding
+--
+--binding:renderVerticesStart()
+--binding:renderVertex(vertex_a)
+--binding:renderVertex(vertex_b)
+--binding:renderVertex(vertex_c)
+--binding:renderVertex(vertex_d)
+--binding:renderVerticesStop()
+--\end{codeexample}
+--
+-- @param vertices An array of all vertices in the syntactic digraph.
+
+function render_vertices(vertices)
+ InterfaceCore.binding:renderVerticesStart()
+ for _,vertex in ipairs(vertices) do
+ InterfaceCore.binding:renderVertex(vertex)
+ end
+ InterfaceCore.binding:renderVerticesStop()
+end
+
+
+---
+-- Render the collections whose layer is not |0|. This local, internal
+-- function is called to render the different collection kinds.
+--
+-- Collection kinds rendered in the order provided by the |layer|
+-- field passed to |declare| during the declaration of the collection
+-- kind, see also |declare_collection|. If several collection kinds
+-- have the same layer, they are rendered in lexicographical ordering
+-- (to ensure that they are always rendered in the same order).
+--
+-- Consider the following code:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--declare { key = "hyper", layer = 1 }
+--\end{codeexample}
+-- you can say on the \tikzname\ layer
+--\begin{codeexample}[code only]
+--\graph {
+-- a, b, c, d;
+-- { [hyper] a, b, c }
+-- { [hyper] b, c, d }
+--};
+--\end{codeexample}
+--
+-- In this case, after the graph drawing algorithm has run, the
+-- present function will call:
+--
+--\begin{codeexample}[code only, tikz syntax=false]
+--local binding = InterfaceCore.binding
+--
+--binding:renderCollectionStartKind("hyper", 1)
+--binding:renderCollection(collection_containing_abc)
+--binding:renderCollection(collection_containing_bcd)
+--binding:renderCollectionStopKind("hyper", 1)
+--\end{codeexample}
+--
+-- @param collections The |collections| table of the current scope.
+
+function render_collections(collections)
+ local kinds = InterfaceCore.collection_kinds
+ local binding = InterfaceCore.binding
+
+ for i=1,#kinds do
+ local kind = kinds[i].kind
+ local layer = kinds[i].layer
+
+ if layer ~= 0 then
+ binding:renderCollectionStartKind(kind, layer)
+ for _,c in ipairs(collections[kind] or {}) do
+ binding:renderCollection(c)
+ end
+ binding:renderCollectionStopKind(kind, layer)
+ end
+ end
+end
+
+
+---
+-- Render the syntactic edges of a graph after the graph drawing
+-- algorithm has finished. This function is local and internal and included only
+-- for documenting the call graph.
+--
+-- When the graph drawing algorithm is done, the interface will first
+-- rendering the vertices using |render_vertices|, followed by calling
+-- this function, which in turn calls appropriate callbacks to the
+-- binding layer.
+--
+-- Consider the following code:
+-- %
+--\begin{codeexample}[code only]
+-- \graph [... layout] {
+-- a -- b -- c -- d;
+-- };
+--\end{codeexample}
+--
+-- In this case, after the graph drawing algorithm has run, the
+-- present function will call:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+-- local binding = InterfaceCore.binding
+--
+-- binding:renderEdgesStart()
+-- binding:renderEdge(edge_from_a_to_b)
+-- binding:renderEdge(edge_from_b_to_c)
+-- binding:renderEdge(edge_from_c_to_d)
+-- binding:renderEdgesStop()
+--\end{codeexample}
+--
+-- @param arcs The array of arcs of the syntactic digraph.
+
+function render_edges(arcs)
+ InterfaceCore.binding:renderEdgesStart()
+ for _,a in ipairs(arcs) do
+ for _,e in ipairs (a.syntactic_edges) do
+ InterfaceCore.binding:renderEdge(e)
+ end
+ end
+ InterfaceCore.binding:renderEdgesStop()
+end
+
+
+local aliases = InterfaceCore.option_aliases
+local option_initial = InterfaceCore.option_initial
+
+local option_metatable = {
+ __index =
+ function (t, key)
+ local k = aliases[key]
+ if k then
+ local v = (type(k) == "string" and t[k]) or (type(k) == "function" and k(t)) or nil
+ if v ~= nil then
+ return v
+ end
+ end
+ return option_initial[key]
+ end
+}
+
+
+---
+-- Get the current options table.
+--
+-- An option table can be accessed like a normal table; however, there
+-- is a global fallback for this table. If an index is not defined,
+-- the value of this index in the global fallback table is used. (This
+-- reduces the overall amount of option keys that need to be stored
+-- with object.)
+--
+-- (This function is local and internal and included only for documentation
+-- purposes.)
+--
+-- @param height The stack height for which the option table is
+-- required.
+-- @param table If non |nil|, the options will be added to this
+-- table.
+--
+-- @return The option table as described above.
+
+function get_current_options_table (height, table)
+ local stack = InterfaceCore.option_stack
+ assert (height >= 0 and height <= #stack, "height value out of bounds")
+
+ if height == InterfaceCore.option_cache_height and not table then
+ return option_cache
+ else
+ -- Clear superfluous part of stack
+ for i=#stack,height+1,-1 do
+ stack[i] = nil
+ end
+
+ -- Build options table
+ local cache
+ if not table then
+ cache = setmetatable(
+ {
+ algorithm_phases = setmetatable({}, InterfaceCore.option_initial.algorithm_phases),
+ collections = {}
+ }, option_metatable)
+ else
+ cache = lib.copy(table)
+ cache.algorithm_phases = lib.copy(cache.algorithm_phases)
+ cache.collections = lib.copy(cache.collections)
+ end
+
+ local algorithm_phases = cache.algorithm_phases
+ local collections = cache.collections
+ local keys = InterfaceCore.keys
+
+ local function handle (k, v)
+ if k == phase_unique then
+ algorithm_phases[v.phase] = v.algorithm
+ local phase_stack = v.phase .. " stack"
+ local t = rawget(algorithm_phases, phase_stack)
+ if not t then
+ t = algorithm_phases[phase_stack]
+ assert(type(t) == "table", "unknown phase")
+ t = lib.copy(t)
+ algorithm_phases[phase_stack] = t
+ end
+ t[#t + 1] = v.algorithm
+ elseif k == collections_unique then
+ LookupTable.addOne(collections, v)
+ else
+ cache[k] = v
+ end
+ end
+
+ for _,s in ipairs(stack) do
+ handle (s.key, s.value)
+ end
+
+ -- Cache it, if this was not added:
+ if not table then
+ InterfaceCore.option_cache_height = height
+ option_cache = cache
+ end
+
+ return cache
+ end
+end
+
+
+
+-- A helper function
+
+function push_on_option_stack(key, value, height)
+ local stack = InterfaceCore.option_stack
+
+ assert (type(height) == "number" and height > 0 and height <= #stack + 1,
+ "height value out of bounds")
+
+ -- Clear superfluous part of stack
+ for i=#stack,height+1,-1 do
+ stack[i] = nil
+ end
+
+ stack[height] = { key = key, value = value }
+ InterfaceCore.option_cache_height = nil -- invalidate cache
+end
+
+
+
+-- Done
+
+return InterfaceToDisplay
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/Scope.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/Scope.lua
new file mode 100644
index 0000000000..a750308e69
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/interface/Scope.lua
@@ -0,0 +1,92 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- In theory, graph drawing algorithms take graphs as input and
+-- output graphs embedded into the plane as output. In practice, however,
+-- the input to a graph drawing algorithm is not ``just'' the
+-- graph. Rather, additional information about the graph, in particular
+-- about the way the user specified the graph, is also important to many
+-- graph drawing algorithms.
+--
+-- The graph drawing system gathers both the original input graph as well
+-- as all additional information that is provided in the graph drawing
+-- scope inside a scope table. The object has a number of fields that
+-- inform an algorithm about the input.
+--
+-- For each graph drawing scope, a new |Scope| object is
+-- created. Graph drawing scopes are kept track of using a stack, but
+-- only the top of this stack is available to the interface classes.
+--
+-- @field syntactic_digraph The syntactic digraph is a digraph that
+-- faithfully encodes the way the input graph is represented
+-- syntactically. However, this does not mean that the syntactic
+-- digraph contains the actual textual representation of the input
+-- graph. Rather, when an edge is specified as, say, |a <- b|, the
+-- syntactic digraph will contains an arc from |a| to |b| with an edge
+-- object attached to it that is labeled as a ``backward''
+-- edge. Similarly, an edge |a -- b| is also stored as a directed arc
+-- from |a| to |b| with the label |--| attached to it. Algorithms will
+-- often be more interested graphs derived from the syntactic digraph
+-- such as its underlying undirected graph. These derived graphs are
+-- made accessible by the graph drawing engine during the preprocessing.
+--
+-- @field events An array of |Event| objects. These objects, see the
+-- |Event| class for details, are created during the parsing of the
+-- input graph.
+--
+-- @field node_names A table that maps the names of nodes to node
+-- objects. Every node must have a unique name.
+--
+-- @field coroutine A Lua coroutine that is used internally to allow
+-- callbacks to the display layer to be issued deep down during a run
+-- of an algorithm.
+--
+-- @field collections The collections specified inside the scope, see
+-- the |Collection| class.
+
+local Scope = {}
+Scope.__index = Scope
+
+-- Namespace
+require("pgf.gd.interface").Scope = Scope
+
+-- Imports
+local lib = require "pgf.gd.lib"
+local Storage = require "pgf.gd.lib.Storage"
+
+local Digraph = require "pgf.gd.model.Digraph"
+
+---
+-- Create a new |Scope| object.
+--
+-- @param initial A table of initial values for the newly created
+-- |Scope| object.
+--
+-- @return The new scope object.
+
+function Scope.new(initial)
+ return setmetatable(lib.copy(initial,
+ {
+ syntactic_digraph = Digraph.new{},
+ events = {},
+ node_names = {},
+ coroutine = nil,
+ collections = {},
+ }), Scope)
+end
+
+
+-- Done
+
+return Scope
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered.lua
new file mode 100644
index 0000000000..6988e7a3d9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered.lua
@@ -0,0 +1,159 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+local layered = {}
+
+-- Namespace
+
+require("pgf.gd").layered = layered
+
+
+local lib = require "pgf.gd.lib"
+local Storage = require "pgf.gd.lib.Storage"
+
+--
+-- This file defines some basic functions to compute and/or set the
+-- ideal distances between nodes of any kind of layered drawing of a
+-- graph.
+
+
+---
+-- Compute the ideal distance between two siblings
+--
+-- @param paddings A |Storage| object in which the computed distances
+-- (paddings) are stored.
+-- @param graph The graph object
+-- @param n1 The first node
+-- @param n2 The second node
+
+function layered.ideal_sibling_distance (paddings, graph, n1, n2)
+ local ideal_distance
+ local sep
+
+ local n1_is_node = n1.kind == "node"
+ local n2_is_node = n2.kind == "node"
+
+ if not n1_is_node and not n2_is_node then
+ ideal_distance = graph.options['sibling distance']
+ sep = graph.options['sibling post sep']
+ + graph.options['sibling pre sep']
+ else
+ if n1_is_node then
+ ideal_distance = lib.lookup_option('sibling distance', n1, graph)
+ else
+ ideal_distance = lib.lookup_option('sibling distance', n2, graph)
+ end
+ sep = (n1_is_node and lib.lookup_option('sibling post sep', n1, graph) or 0)
+ + (n2_is_node and lib.lookup_option('sibling pre sep', n2, graph) or 0)
+ end
+
+ return math.max(ideal_distance, sep +
+ ((n1_is_node and paddings[n1].sibling_post) or 0) -
+ ((n2_is_node and paddings[n2].sibling_pre) or 0))
+end
+
+
+
+---
+-- Compute the baseline distance between two layers
+--
+-- The "baseline" distance is the distance between two layers that
+-- corresponds to the distance of the two layers if the nodes where
+-- "words" on two adjacent lines. In this case, the distance is
+-- normally the layer_distance, but will be increased such that if we
+-- draw a horizontal line below the deepest character on the first
+-- line and a horizontal line above the highest character on the
+-- second line, the lines will have a minimum distance of layer sep.
+--
+-- Since each node on the lines might have a different layer sep and
+-- layer distance specified, the maximum over all the values is taken.
+--
+-- @param paddings A |Storage| object in which the distances
+-- (paddings) are stored.
+-- @param graph The graph in which the nodes reside
+-- @param l1 An array of the nodes of the first layer
+-- @param l2 An array of the nodes of the second layer
+
+function layered.baseline_distance (paddings, graph, l1, l2)
+
+ if #l1 == 0 or #l2 == 0 then
+ return 0
+ end
+
+ local layer_distance = -math.huge
+ local layer_pre_sep = -math.huge
+ local layer_post_sep = -math.huge
+
+ local max_post = -math.huge
+ local min_pre = math.huge
+
+ for _,n in ipairs(l1) do
+ layer_distance = math.max(layer_distance, lib.lookup_option('level distance', n, graph))
+ layer_post_sep = math.max(layer_post_sep, lib.lookup_option('level post sep', n, graph))
+ if n.kind == "node" then
+ max_post = math.max(max_post, paddings[n].layer_post)
+ end
+ end
+
+ for _,n in ipairs(l2) do
+ layer_pre_sep = math.max(layer_pre_sep, lib.lookup_option('level pre sep', n, graph))
+ if n.kind == "node" then
+ min_pre = math.min(min_pre, paddings[n].layer_pre)
+ end
+ end
+
+ return math.max(layer_distance, layer_post_sep + layer_pre_sep + max_post - min_pre)
+end
+
+
+
+---
+-- Position nodes in layers using baselines
+--
+-- @param layers A |Storage| object assigning layers to vertices.
+-- @param paddings A |Storage| object storing the computed distances
+-- (paddings).
+-- @param graph The graph in which the nodes reside
+
+function layered.arrange_layers_by_baselines (layers, paddings, graph)
+
+ local layer_vertices = Storage.newTableStorage()
+
+ -- Decompose into layers:
+ for _,v in ipairs(graph.vertices) do
+ table.insert(layer_vertices[layers[v]], v)
+ end
+
+ if #layer_vertices > 0 then -- sanity check
+ -- Now compute ideal distances and store
+ local height = 0
+
+ for _,v in ipairs(layer_vertices[1]) do
+ v.pos.y = 0
+ end
+
+ for i=2,#layer_vertices do
+ height = height + layered.baseline_distance(paddings, graph, layer_vertices[i-1], layer_vertices[i])
+
+ for _,v in ipairs(layer_vertices[i]) do
+ v.pos.y = height
+ end
+ end
+ end
+end
+
+
+
+
+-- Done
+
+return layered
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua
new file mode 100644
index 0000000000..da9ff9698c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua
@@ -0,0 +1,342 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+local CrossingMinimizationGansnerKNV1993 = {}
+
+
+-- Imports
+
+local lib = require "pgf.gd.lib"
+local DepthFirstSearch = require "pgf.gd.lib.DepthFirstSearch"
+
+
+
+function CrossingMinimizationGansnerKNV1993:run()
+
+ self:computeInitialRankOrdering()
+
+ local best_ranking = self.ranking:copy()
+ local best_crossings = self:countRankCrossings(best_ranking)
+
+ for iteration=1,24 do
+ local direction = (iteration % 2 == 0) and 'down' or 'up'
+
+ self:orderByWeightedMedian(direction)
+ self:transpose(direction)
+
+ local current_crossings = self:countRankCrossings(self.ranking)
+
+ if current_crossings < best_crossings then
+ best_ranking = self.ranking:copy()
+ best_crossings = current_crossings
+ end
+ end
+
+ self.ranking = best_ranking:copy()
+
+ return self.ranking
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:computeInitialRankOrdering()
+
+ local best_ranking = self.ranking:copy()
+ local best_crossings = self:countRankCrossings(best_ranking)
+
+ for _,direction in ipairs({'down', 'up'}) do
+
+ local function init(search)
+ for i=#self.graph.nodes,1,-1 do
+ local node = self.graph.nodes[i]
+ if direction == 'down' then
+ if node:getInDegree() == 0 then
+ search:push(node)
+ search:setDiscovered(node)
+ end
+ else
+ if node:getOutDegree() == 0 then
+ search:push(node)
+ search:setDiscovered(node)
+ end
+ end
+ end
+ end
+
+ local function visit(search, node)
+ search:setVisited(node, true)
+
+ local rank = self.ranking:getRank(node)
+ local pos = self.ranking:getRankSize(rank)
+ self.ranking:setRankPosition(node, pos)
+
+ if direction == 'down' then
+ local out = node:getOutgoingEdges()
+ for i=#out,1,-1 do
+ local neighbour = out[i]:getNeighbour(node)
+ if not search:getDiscovered(neighbour) then
+ search:push(neighbour)
+ search:setDiscovered(neighbour)
+ end
+ end
+ else
+ local into = node:getIncomingEdges()
+ for i=#into,1,-1 do
+ local neighbour = into[i]:getNeighbour(node)
+ if not search:getDiscovered(neighbour) then
+ search:push(neighbour)
+ search:setDiscovered(neighbour)
+ end
+ end
+ end
+ end
+
+ DepthFirstSearch.new(init, visit):run()
+
+ local crossings = self:countRankCrossings(self.ranking)
+
+ if crossings < best_crossings then
+ best_ranking = self.ranking:copy()
+ best_crossings = crossings
+ end
+ end
+
+ self.ranking = best_ranking:copy()
+
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:countRankCrossings(ranking)
+
+ local crossings = 0
+
+ local ranks = ranking:getRanks()
+
+ for rank_index = 2, #ranks do
+ local nodes = ranking:getNodes(ranks[rank_index])
+ for i = 1, #nodes-1 do
+ for j = i+1, #nodes do
+ local v = nodes[i]
+ local w = nodes[j]
+
+ -- TODO Jannis: We are REQUIRED to only check edges that lead to nodes
+ -- on the next or previous rank, depending on the sweep direction!!!!
+ local cn_vw = self:countNodeCrossings(ranking, v, w, 'down')
+
+ crossings = crossings + cn_vw
+ end
+ end
+ end
+
+ return crossings
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:countNodeCrossings(ranking, left_node, right_node, sweep_direction)
+
+ local ranks = ranking:getRanks()
+ local _, rank_index = lib.find(ranks, function (rank)
+ return rank == ranking:getRank(left_node)
+ end)
+ local other_rank_index = (sweep_direction == 'down') and rank_index-1 or rank_index+1
+
+ assert(ranking:getRank(left_node) == ranking:getRank(right_node))
+ assert(rank_index >= 1 and rank_index <= #ranks)
+
+ -- 0 crossings if we're at the top or bottom and are sweeping down or up
+ if other_rank_index < 1 or other_rank_index > #ranks then
+ return 0
+ end
+
+ local left_edges = {}
+ local right_edges = {}
+
+ if sweep_direction == 'down' then
+ left_edges = left_node:getIncomingEdges()
+ right_edges = right_node:getIncomingEdges()
+ else
+ left_edges = left_node:getOutgoingEdges()
+ right_edges = right_node:getOutgoingEdges()
+ end
+
+ local crossings = 0
+
+ local function left_neighbour_on_other_rank(edge)
+ local neighbour = edge:getNeighbour(left_node)
+ return ranking:getRank(neighbour) == ranking:getRanks()[other_rank_index]
+ end
+
+ local function right_neighbour_on_other_rank(edge)
+ local neighbour = edge:getNeighbour(right_node)
+ return ranking:getRank(neighbour) == ranking:getRanks()[other_rank_index]
+ end
+
+ for _,left_edge in ipairs(left_edges) do
+ if left_neighbour_on_other_rank(left_edge) then
+ local left_neighbour = left_edge:getNeighbour(left_node)
+
+ for _,right_edge in ipairs(right_edges) do
+ if right_neighbour_on_other_rank(right_edge) then
+ local right_neighbour = right_edge:getNeighbour(right_node)
+
+ local left_position = ranking:getRankPosition(left_neighbour)
+ local right_position = ranking:getRankPosition(right_neighbour)
+
+ local neighbour_diff = right_position - left_position
+
+ if neighbour_diff < 0 then
+ crossings = crossings + 1
+ end
+ end
+ end
+ end
+ end
+
+ return crossings
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:orderByWeightedMedian(direction)
+
+ local median = {}
+
+ local function get_index(n, node) return median[node] end
+ local function is_fixed(n, node) return median[node] < 0 end
+
+ if direction == 'down' then
+ local ranks = self.ranking:getRanks()
+
+ for rank_index = 2, #ranks do
+ median = {}
+ local nodes = self.ranking:getNodes(ranks[rank_index])
+ for _,node in ipairs(nodes) do
+ median[node] = self:computeMedianPosition(node, ranks[rank_index-1])
+ end
+
+ self.ranking:reorderRank(ranks[rank_index], get_index, is_fixed)
+ end
+ else
+ local ranks = self.ranking:getRanks()
+
+ for rank_index = 1, #ranks-1 do
+ median = {}
+ local nodes = self.ranking:getNodes(ranks[rank_index])
+ for _,node in ipairs(nodes) do
+ median[node] = self:computeMedianPosition(node, ranks[rank_index+1])
+ end
+
+ self.ranking:reorderRank(ranks[rank_index], get_index, is_fixed)
+ end
+ end
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:computeMedianPosition(node, prev_rank)
+
+ local positions = lib.imap(
+ node.edges,
+ function (edge)
+ local n = edge:getNeighbour(node)
+ if self.ranking:getRank(n) == prev_rank then
+ return self.ranking:getRankPosition(n)
+ end
+ end)
+
+ table.sort(positions)
+
+ local median = math.ceil(#positions / 2)
+ local position = -1
+
+ if #positions > 0 then
+ if #positions % 2 == 1 then
+ position = positions[median]
+ elseif #positions == 2 then
+ return (positions[1] + positions[2]) / 2
+ else
+ local left = positions[median-1] - positions[1]
+ local right = positions[#positions] - positions[median]
+ position = (positions[median-1] * right + positions[median] * left) / (left + right)
+ end
+ end
+
+ return position
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:transpose(sweep_direction)
+
+ local function transpose_rank(rank)
+
+ local improved = false
+
+ local nodes = self.ranking:getNodes(rank)
+
+ for i = 1, #nodes-1 do
+ local v = nodes[i]
+ local w = nodes[i+1]
+
+ local cn_vw = self:countNodeCrossings(self.ranking, v, w, sweep_direction)
+ local cn_wv = self:countNodeCrossings(self.ranking, w, v, sweep_direction)
+
+ if cn_vw > cn_wv then
+ improved = true
+
+ self:switchNodePositions(v, w)
+ end
+ end
+
+ return improved
+ end
+
+ local ranks = self.ranking:getRanks()
+
+ local improved = false
+ repeat
+ local improved = false
+
+ if sweep_direction == 'down' then
+ for rank_index = 1, #ranks-1 do
+ improved = transpose_rank(ranks[rank_index]) or improved
+ end
+ else
+ for rank_index = #ranks-1, 1, -1 do
+ improved = transpose_rank(ranks[rank_index]) or improved
+ end
+ end
+ until not improved
+end
+
+
+
+function CrossingMinimizationGansnerKNV1993:switchNodePositions(left_node, right_node)
+ assert(self.ranking:getRank(left_node) == self.ranking:getRank(right_node))
+ assert(self.ranking:getRankPosition(left_node) < self.ranking:getRankPosition(right_node))
+
+ local left_position = self.ranking:getRankPosition(left_node)
+ local right_position = self.ranking:getRankPosition(right_node)
+
+ self.ranking:switchPositions(left_node, right_node)
+
+ local nodes = self.ranking:getNodes(self.ranking:getRank(left_node))
+end
+
+
+
+-- done
+
+return CrossingMinimizationGansnerKNV1993
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990a.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990a.lua
new file mode 100644
index 0000000000..76deb8adaf
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990a.lua
@@ -0,0 +1,74 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local CycleRemovalBergerS1990a = {}
+
+local lib = require("pgf.gd.lib")
+
+
+function CycleRemovalBergerS1990a:run()
+ -- remember edges that were removed
+ local removed = {}
+
+ -- remember edges that need to be reversed
+ local reverse = {}
+
+ -- iterate over all nodes of the graph
+ for _,node in ipairs(self.graph.nodes) do
+ -- get all outgoing edges that have not been removed yet
+ local out_edges = lib.imap(node:getOutgoingEdges(),
+ function (edge)
+ if not removed[edge] then return edge end
+ end)
+
+ -- get all incoming edges that have not been removed yet
+ local in_edges = lib.imap(node:getIncomingEdges(),
+ function (edge)
+ if not removed[edge] then return edge end
+ end)
+
+ if #out_edges >= #in_edges then
+ -- we have more outgoing than incoming edges, reverse all incoming
+ -- edges and mark all incident edges as removed
+
+ for _,edge in ipairs(out_edges) do
+ removed[edge] = true
+ end
+ for _,edge in ipairs(in_edges) do
+ reverse[edge] = true
+ removed[edge] = true
+ end
+ else
+ -- we have more incoming than outgoing edges, reverse all outgoing
+ -- edges and mark all incident edges as removed
+
+ for _,edge in ipairs(out_edges) do
+ reverse[edge] = true
+ removed[edge] = true
+ end
+ for _,edge in ipairs(in_edges) do
+ removed[edge] = true
+ end
+ end
+ end
+
+ -- mark edges as reversed
+ for edge in pairs(reverse) do
+ edge.reversed = true
+ end
+end
+
+
+
+-- done
+
+return CycleRemovalBergerS1990a
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990b.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990b.lua
new file mode 100644
index 0000000000..d8f28980c8
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalBergerS1990b.lua
@@ -0,0 +1,76 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local CycleRemovalBergerS1990b = {}
+
+local lib = require("pgf.gd.lib")
+
+
+function CycleRemovalBergerS1990b:run()
+ -- remember edges that were removed
+ local removed = {}
+
+ -- remember edges that need to be reversed
+ local reverse = {}
+
+ -- iterate over all nodes of the graph
+ for _,j in ipairs(lib.random_permutation(#self.graph.nodes)) do
+ local node = self.graph.nodes[j]
+ -- get all outgoing edges that have not been removed yet
+ -- get all outgoing edges that have not been removed yet
+ local out_edges = lib.imap(node:getOutgoingEdges(),
+ function (edge)
+ if not removed[edge] then return edge end
+ end)
+
+ -- get all incoming edges that have not been removed yet
+ local in_edges = lib.imap(node:getIncomingEdges(),
+ function (edge)
+ if not removed[edge] then return edge end
+ end)
+
+ if #out_edges >= #in_edges then
+ -- we have more outgoing than incoming edges, reverse all incoming
+ -- edges and mark all incident edges as removed
+
+ for _,edge in ipairs(out_edges) do
+ removed[edge] = true
+ end
+ for _,edge in ipairs(in_edges) do
+ reverse[edge] = true
+ removed[edge] = true
+ end
+ else
+ -- we have more incoming than outgoing edges, reverse all outgoing
+ -- edges and mark all incident edges as removed
+
+ for _,edge in ipairs(out_edges) do
+ reverse[edge] = true
+ removed[edge] = true
+ end
+ for _,edge in ipairs(in_edges) do
+ removed[edge] = true
+ end
+ end
+ end
+
+ -- mark edges as reversed
+ for edge in pairs(reverse) do
+ edge.reversed = true
+ end
+end
+
+
+
+-- done
+
+return CycleRemovalBergerS1990b
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalEadesLS1993.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalEadesLS1993.lua
new file mode 100644
index 0000000000..ffb919b209
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalEadesLS1993.lua
@@ -0,0 +1,124 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+-- Declare
+local CycleRemovalEadesLS1993 = {}
+
+-- Import
+local lib = require "pgf.gd.lib"
+
+
+function CycleRemovalEadesLS1993:run()
+ local copied_graph = self.graph:copy()
+
+ local copied_node = {}
+ local origin_node = {}
+ local copied_edge = {}
+ local origin_edge = {}
+
+ local preserve = {}
+
+ for _,edge in ipairs(self.graph.edges) do
+ copied_edge[edge] = edge:copy()
+ origin_edge[copied_edge[edge]] = edge
+
+ for _,node in ipairs(edge.nodes) do
+ if copied_node[node] then
+ copied_edge[edge]:addNode(copied_node[node])
+ else
+ copied_node[node] = node:copy()
+ origin_node[copied_node[node]] = node
+
+ copied_graph:addNode(copied_node[node])
+ copied_edge[edge]:addNode(copied_node[node])
+ end
+ end
+ end
+
+ local function node_is_sink(node)
+ return node:getOutDegree() == 0
+ end
+
+ local function node_is_source(node)
+ return node:getInDegree() == 0
+ end
+
+ local function node_is_isolated(node)
+ return node:getDegree() == 0
+ end
+
+ while #copied_graph.nodes > 0 do
+ local sink = lib.find(copied_graph.nodes, node_is_sink)
+ while sink do
+ for _,edge in ipairs(sink:getIncomingEdges()) do
+ preserve[edge] = true
+ end
+ copied_graph:deleteNode(sink)
+ sink = lib.find(copied_graph.nodes, node_is_sink)
+ end
+
+ local isolated_node = lib.find(copied_graph.nodes, node_is_isolated)
+ while isolated_node do
+ copied_graph:deleteNode(isolated_node)
+ isolated_node = lib.find(copied_graph.nodes, node_is_isolated)
+ end
+
+ local source = lib.find(copied_graph.nodes, node_is_source)
+ while source do
+ for _,edge in ipairs(source:getOutgoingEdges()) do
+ preserve[edge] = true
+ end
+ copied_graph:deleteNode(source)
+ source = lib.find(copied_graph.nodes, node_is_source)
+ end
+
+ if #copied_graph.nodes > 0 then
+ local max_node = nil
+ local max_out_edges = nil
+ local max_in_edges = nil
+
+ for _,node in ipairs(copied_graph.nodes) do
+ local out_edges = node:getOutgoingEdges()
+ local in_edges = node:getIncomingEdges()
+
+ if max_node == nil or (#out_edges - #in_edges > #max_out_edges - #max_in_edges) then
+ max_node = node
+ max_out_edges = out_edges
+ max_in_edges = in_edges
+ end
+ end
+
+ assert(max_node and max_out_edges and max_in_edges)
+
+ for _,edge in ipairs(max_out_edges) do
+ preserve[edge] = true
+ copied_graph:deleteEdge(edge)
+ end
+ for _,edge in ipairs(max_in_edges) do
+ copied_graph:deleteEdge(edge)
+ end
+
+ copied_graph:deleteNode(max_node)
+ end
+ end
+
+ for _,edge in ipairs(self.graph.edges) do
+ if not preserve[copied_edge[edge]] then
+ edge.reversed = true
+ end
+ end
+end
+
+-- done
+
+return CycleRemovalEadesLS1993 \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua
new file mode 100644
index 0000000000..e52b0d38d1
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua
@@ -0,0 +1,52 @@
+-- Copyright 2011 by Jannis Pohlmann and 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local CycleRemovalGansnerKNV1993 = {}
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+local Simplifiers = require "pgf.gd.lib.Simplifiers"
+
+
+function CycleRemovalGansnerKNV1993:run ()
+ -- merge nonempty sets into supernodes
+ --
+ -- ignore self-loops
+ --
+ -- merge multiple edges into one edge each, whose weight is the sum of the
+ -- individual edge weights
+ --
+ -- ignore leaf nodes that are not part of the user-defined sets (their ranks
+ -- are trivially determined)
+ --
+ -- ensure that supernodes S_min and S_max are assigned first and last ranks
+ -- reverse in-edges of S_min
+ -- reverse out-edges of S_max
+ --
+ -- ensure the supernodes S_min and S_max are are the only nodes in these ranks
+ -- for all nodes with indegree of 0, insert temporary edge (S_min, v) with delta=0
+ -- for all nodes with outdegree of 0, insert temporary edge (v, S_max) with delta=0
+
+ -- classify edges as tree/forward, cross and back edges using a DFS traversal
+ local tree_or_forward_edges, cross_edges, back_edges = Simplifiers:classifyEdges(self.graph)
+
+ -- reverse the back edges in order to make the graph acyclic
+ for _,edge in ipairs(back_edges) do
+ edge.reversed = true
+ end
+end
+
+
+-- done
+
+return CycleRemovalGansnerKNV1993 \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/EdgeRoutingGansnerKNV1993.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/EdgeRoutingGansnerKNV1993.lua
new file mode 100644
index 0000000000..c451f74116
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/EdgeRoutingGansnerKNV1993.lua
@@ -0,0 +1,22 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+local EdgeRoutingGansnerKNV1993 = {}
+
+
+function EdgeRoutingGansnerKNV1993:run()
+end
+
+
+-- done
+return EdgeRoutingGansnerKNV1993 \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NetworkSimplex.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NetworkSimplex.lua
new file mode 100644
index 0000000000..0ccf7694ca
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NetworkSimplex.lua
@@ -0,0 +1,898 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+--- This file contains an implementation of the network simplex method
+--- for node ranking and x coordinate optimization in layered drawing
+--- algorithms, as proposed in
+---
+--- "A Technique for Drawing Directed Graphs"
+-- by Gansner, Koutsofios, North, Vo, 1993.
+
+
+local NetworkSimplex = {}
+NetworkSimplex.__index = NetworkSimplex
+
+-- Namespace
+local layered = require "pgf.gd.layered"
+layered.NetworkSimplex = NetworkSimplex
+
+
+-- Imports
+local DepthFirstSearch = require "pgf.gd.lib.DepthFirstSearch"
+local Ranking = require "pgf.gd.layered.Ranking"
+local Graph = require "pgf.gd.deprecated.Graph"
+local lib = require "pgf.gd.lib"
+
+
+
+-- Definitions
+
+NetworkSimplex.BALANCE_TOP_BOTTOM = 1
+NetworkSimplex.BALANCE_LEFT_RIGHT = 2
+
+
+function NetworkSimplex.new(graph, balancing)
+ local simplex = {
+ graph = graph,
+ balancing = balancing,
+ }
+ setmetatable(simplex, NetworkSimplex)
+ return simplex
+end
+
+
+
+function NetworkSimplex:run()
+
+ assert (#self.graph.nodes > 0, "graph must contain at least one node")
+
+ -- initialize the tree edge search index
+ self.search_index = 1
+
+ -- initialize internal edge parameters
+ self.cut_value = {}
+ for _,edge in ipairs(self.graph.edges) do
+ self.cut_value[edge] = 0
+ end
+
+ -- reset graph information needed for ranking
+ self.lim = {}
+ self.low = {}
+ self.parent_edge = {}
+ self.ranking = Ranking.new()
+
+ if #self.graph.nodes == 1 then
+ self.ranking:setRank(self.graph.nodes[1], 1)
+ else
+ self:rankNodes()
+ end
+end
+
+
+
+function NetworkSimplex:rankNodes()
+ -- construct feasible tree of tight edges
+ self:constructFeasibleTree()
+
+ -- iteratively replace edges with negative cut values
+ -- with non-tree edges (chosen by minimum slack)
+ local leave_edge = self:findNegativeCutEdge()
+ while leave_edge do
+ local enter_edge = self:findReplacementEdge(leave_edge)
+
+ assert(enter_edge, 'no non-tree edge to replace ' .. tostring(leave_edge) .. ' could be found')
+
+ -- exchange leave_edge and enter_edge in the tree, updating
+ -- the ranks and cut values of all nodes
+ self:exchangeTreeEdges(leave_edge, enter_edge)
+
+ -- find the next tree edge with a negative cut value, if
+ -- there are any left
+ leave_edge = self:findNegativeCutEdge()
+ end
+
+ if self.balancing == NetworkSimplex.BALANCE_TOP_BOTTOM then
+ -- normalize by setting the least rank to zero
+ self.ranking:normalizeRanks()
+
+ -- move nodes to feasible ranks with the least number of nodes
+ -- in order to avoid crowding and to improve the overall aspect
+ -- ratio of the drawing
+ self:balanceRanksTopBottom()
+ elseif self.balancing == NetworkSimplex.BALANCE_LEFT_RIGHT then
+ self:balanceRanksLeftRight()
+ end
+end
+
+
+
+function NetworkSimplex:constructFeasibleTree()
+
+ self:computeInitialRanking()
+
+ -- find a maximal tree of tight edges in the graph
+ while self:findTightTree() < #self.graph.nodes do
+
+ local min_slack_edge = nil
+
+ for _,node in ipairs(self.graph.nodes) do
+ local out_edges = node:getOutgoingEdges()
+ for _,edge in ipairs(out_edges) do
+ if not self.tree_edge[edge] and self:isIncidentToTree(edge) then
+ if not min_slack_edge or self:edgeSlack(edge) < self:edgeSlack(min_slack_edge) then
+ min_slack_edge = edge
+ end
+ end
+ end
+ end
+
+ if min_slack_edge then
+ local delta = self:edgeSlack(min_slack_edge)
+
+ if delta > 0 then
+ local head = min_slack_edge:getHead()
+ local tail = min_slack_edge:getTail()
+
+ if self.tree_node[head] then
+ delta = -delta
+ end
+
+
+ for _,node in ipairs(self.tree.nodes) do
+ local rank = self.ranking:getRank(self.orig_node[node])
+ self.ranking:setRank(self.orig_node[node], rank + delta)
+ end
+ end
+ end
+ end
+
+ self:initializeCutValues()
+end
+
+
+
+function NetworkSimplex:findNegativeCutEdge()
+ local minimum_edge = nil
+
+ for n=1,#self.tree.edges do
+ local index = self:nextSearchIndex()
+
+ local edge = self.tree.edges[index]
+
+ if self.cut_value[edge] < 0 then
+ if minimum_edge then
+ if self.cut_value[minimum_edge] > self.cut_value[edge] then
+ minimum_edge = edge
+ end
+ else
+ minimum_edge = edge
+ end
+ end
+ end
+
+ return minimum_edge
+end
+
+
+
+function NetworkSimplex:findReplacementEdge(leave_edge)
+ local tail = leave_edge:getTail()
+ local head = leave_edge:getHead()
+
+ local v = nil
+ local direction = nil
+
+ if self.lim[tail] < self.lim[head] then
+ v = tail
+ direction = 'in'
+ else
+ v = head
+ direction = 'out'
+ end
+
+ local search_root = v
+ local enter_edge = nil
+ local slack = math.huge
+
+ -- TODO Jannis: Get rid of this recursion:
+
+ local function find_edge(v, direction)
+
+ if direction == 'out' then
+ local out_edges = self.orig_node[v]:getOutgoingEdges()
+ for _,edge in ipairs(out_edges) do
+ local head = edge:getHead()
+ local tree_head = self.tree_node[head]
+
+ assert(head and tree_head)
+
+ if not self.tree_edge[edge] then
+ if not self:inTailComponentOf(tree_head, search_root) then
+ if self:edgeSlack(edge) < slack or not enter_edge then
+ enter_edge = edge
+ slack = self:edgeSlack(edge)
+ end
+ end
+ else
+ if self.lim[tree_head] < self.lim[v] then
+ find_edge(tree_head, 'out')
+ end
+ end
+ end
+
+ for _,edge in ipairs(v:getIncomingEdges()) do
+ if slack <= 0 then
+ break
+ end
+
+ local tail = edge:getTail()
+
+ if self.lim[tail] < self.lim[v] then
+ find_edge(tail, 'out')
+ end
+ end
+ else
+ local in_edges = self.orig_node[v]:getIncomingEdges()
+ for _,edge in ipairs(in_edges) do
+ local tail = edge:getTail()
+ local tree_tail = self.tree_node[tail]
+
+ assert(tail and tree_tail)
+
+ if not self.tree_edge[edge] then
+ if not self:inTailComponentOf(tree_tail, search_root) then
+ if self:edgeSlack(edge) < slack or not enter_edge then
+ enter_edge = edge
+ slack = self:edgeSlack(edge)
+ end
+ end
+ else
+ if self.lim[tree_tail] < self.lim[v] then
+ find_edge(tree_tail, 'in')
+ end
+ end
+ end
+
+ for _,edge in ipairs(v:getOutgoingEdges()) do
+ if slack <= 0 then
+ break
+ end
+
+ local head = edge:getHead()
+
+ if self.lim[head] < self.lim[v] then
+ find_edge(head, 'in')
+ end
+ end
+ end
+ end
+
+ find_edge(v, direction)
+
+ return enter_edge
+end
+
+
+
+function NetworkSimplex:exchangeTreeEdges(leave_edge, enter_edge)
+
+ self:rerankBeforeReplacingEdge(leave_edge, enter_edge)
+
+ local cutval = self.cut_value[leave_edge]
+ local head = self.tree_node[enter_edge:getHead()]
+ local tail = self.tree_node[enter_edge:getTail()]
+
+ local ancestor = self:updateCutValuesUpToCommonAncestor(tail, head, cutval, true)
+ local other_ancestor = self:updateCutValuesUpToCommonAncestor(head, tail, cutval, false)
+
+ assert(ancestor == other_ancestor)
+
+ -- remove the old edge from the tree
+ self:removeEdgeFromTree(leave_edge)
+
+ -- add the new edge to the tree
+ local tree_edge = self:addEdgeToTree(enter_edge)
+
+ -- set its cut value
+ self.cut_value[tree_edge] = -cutval
+
+ -- update DFS search tree traversal information
+ self:calculateDFSRange(ancestor, self.parent_edge[ancestor], self.low[ancestor])
+end
+
+
+
+function NetworkSimplex:balanceRanksTopBottom()
+
+ -- available ranks
+ local ranks = self.ranking:getRanks()
+
+ -- node to in/out weight mappings
+ local in_weight = {}
+ local out_weight = {}
+
+ -- node to lowest/highest possible rank mapping
+ local min_rank = {}
+ local max_rank = {}
+
+ -- compute the in and out weights of each node
+ for _,node in ipairs(self.graph.nodes) do
+ -- assume there are no restrictions on how to rank the node
+ min_rank[node], max_rank[node] = ranks[1], ranks[#ranks]
+
+ for _,edge in ipairs(node:getIncomingEdges()) do
+ -- accumulate the weights of all incoming edges
+ in_weight[node] = (in_weight[node] or 0) + edge.weight
+
+ -- update the minimum allowed rank (which is the maximum of
+ -- the ranks of all parent neighbors plus the minimum level
+ -- separation caused by the connecting edges)
+ local neighbour = edge:getNeighbour(node)
+ local neighbour_rank = self.ranking:getRank(neighbour)
+ min_rank[node] = math.max(min_rank[node], neighbour_rank + edge.minimum_levels)
+ end
+
+ for _,edge in ipairs(node:getOutgoingEdges()) do
+ -- accumulate the weights of all outgoing edges
+ out_weight[node] = (out_weight[node] or 0) + edge.weight
+
+ -- update the maximum allowed rank (which is the minimum of
+ -- the ranks of all child neighbors minus the minimum level
+ -- separation caused by the connecting edges)
+ local neighbour = edge:getNeighbour(node)
+ local neighbour_rank = self.ranking:getRank(neighbour)
+ max_rank[node] = math.min(max_rank[node], neighbour_rank - edge.minimum_levels)
+ end
+
+ -- check whether the in- and outweight is the same
+ if in_weight[node] == out_weight[node] then
+
+ -- check which of the allowed ranks has the least number of nodes
+ local min_nodes_rank = min_rank[node]
+ for n = min_rank[node] + 1, max_rank[node] do
+ if #self.ranking:getNodes(n) < #self.ranking:getNodes(min_nodes_rank) then
+ min_nodes_rank = n
+ end
+ end
+
+ -- only move the node to the rank with the least number of nodes
+ -- if it differs from the current rank of the node
+ if min_nodes_rank ~= self.ranking:getRank(node) then
+ self.ranking:setRank(node, min_nodes_rank)
+ end
+
+ end
+ end
+end
+
+
+
+function NetworkSimplex:balanceRanksLeftRight()
+ for _,edge in ipairs(self.tree.edges) do
+ if self.cut_value[edge] == 0 then
+ local other_edge = self:findReplacementEdge(edge)
+ if other_edge then
+ local delta = self:edgeSlack(other_edge)
+ if delta > 1 then
+ if self.lim[edge:getTail()] < self.lim[edge:getHead()] then
+ self:rerank(edge:getTail(), delta / 2)
+ else
+ self:rerank(edge:getHead(), -delta / 2)
+ end
+ end
+ end
+ end
+ end
+end
+
+
+
+function NetworkSimplex:computeInitialRanking()
+
+ -- queue for nodes to rank next
+ local queue = {}
+
+ -- convenience functions for managing the queue
+ local function enqueue(node) table.insert(queue, node) end
+ local function dequeue() return table.remove(queue, 1) end
+
+ -- reset the two-dimensional mapping from ranks to lists
+ -- of corresponding nodes
+ self.ranking:reset()
+
+ -- mapping of nodes to the number of unscanned incoming edges
+ local remaining_edges = {}
+
+ -- add all sinks to the queue
+ for _,node in ipairs(self.graph.nodes) do
+ local edges = node:getIncomingEdges()
+
+ remaining_edges[node] = #edges
+
+ if #edges == 0 then
+ enqueue(node)
+ end
+ end
+
+ -- run long as there are nodes to be ranked
+ while #queue > 0 do
+
+ -- fetch the next unranked node from the queue
+ local node = dequeue()
+
+ -- get a list of its incoming edges
+ local in_edges = node:getIncomingEdges()
+
+ -- determine the minimum possible rank for the node
+ local rank = 1
+ for _,edge in ipairs(in_edges) do
+ local neighbour = edge:getNeighbour(node)
+ if self.ranking:getRank(neighbour) then
+ -- the minimum possible rank is the maximum of all neighbor ranks plus
+ -- the corresponding edge lengths
+ rank = math.max(rank, self.ranking:getRank(neighbour) + edge.minimum_levels)
+ end
+ end
+
+ -- rank the node
+ self.ranking:setRank(node, rank)
+
+ -- get a list of the node's outgoing edges
+ local out_edges = node:getOutgoingEdges()
+
+ -- queue neighbors of nodes for which all incoming edges have been scanned
+ for _,edge in ipairs(out_edges) do
+ local head = edge:getHead()
+ remaining_edges[head] = remaining_edges[head] - 1
+ if remaining_edges[head] <= 0 then
+ enqueue(head)
+ end
+ end
+ end
+end
+
+
+
+function NetworkSimplex:findTightTree()
+
+ -- TODO: Jannis: Remove the recursion below:
+
+ local marked = {}
+
+ local function build_tight_tree(node)
+
+ local out_edges = node:getOutgoingEdges()
+ local in_edges = node:getIncomingEdges()
+
+ local edges = lib.copy(out_edges)
+ for _,v in ipairs(in_edges) do
+ edges[#edges + 1] = v
+ end
+
+ for _,edge in ipairs(edges) do
+ local neighbour = edge:getNeighbour(node)
+ if (not marked[neighbour]) and math.abs(self:edgeSlack(edge)) < 0.00001 then
+ self:addEdgeToTree(edge)
+
+ for _,node in ipairs(edge.nodes) do
+ marked[node] = true
+ end
+
+ if #self.tree.edges == #self.graph.nodes-1 then
+ return true
+ end
+
+ if build_tight_tree(neighbour) then
+ return true
+ end
+ end
+ end
+
+ return false
+ end
+
+ for _,node in ipairs(self.graph.nodes) do
+ self.tree = Graph.new()
+ self.tree_node = {}
+ self.orig_node = {}
+ self.tree_edge = {}
+ self.orig_edge = {}
+
+ build_tight_tree(node)
+
+ if #self.tree.edges > 0 then
+ break
+ end
+ end
+
+ return #self.tree.nodes
+end
+
+
+
+function NetworkSimplex:edgeSlack(edge)
+ -- make sure this is never called with a tree edge
+ assert(not self.orig_edge[edge])
+
+ local head_rank = self.ranking:getRank(edge:getHead())
+ local tail_rank = self.ranking:getRank(edge:getTail())
+ local length = head_rank - tail_rank
+ return length - edge.minimum_levels
+end
+
+
+
+function NetworkSimplex:isIncidentToTree(edge)
+ -- make sure this is never called with a tree edge
+ assert(not self.orig_edge[edge])
+
+ local head = edge:getHead()
+ local tail = edge:getTail()
+
+ if self.tree_node[head] and not self.tree_node[tail] then
+ return true
+ elseif self.tree_node[tail] and not self.tree_node[head] then
+ return true
+ else
+ return false
+ end
+end
+
+
+
+function NetworkSimplex:initializeCutValues()
+ self:calculateDFSRange(self.tree.nodes[1], nil, 1)
+
+ local function init(search)
+ search:push({ node = self.tree.nodes[1], parent_edge = nil })
+ end
+
+ local function visit(search, data)
+ search:setVisited(data, true)
+
+ local into = data.node:getIncomingEdges()
+ local out = data.node:getOutgoingEdges()
+
+ for i=#into,1,-1 do
+ local edge = into[i]
+ if edge ~= data.parent_edge then
+ search:push({ node = edge:getTail(), parent_edge = edge })
+ end
+ end
+
+ for i=#out,1,-1 do
+ local edge = out[i]
+ if edge ~= data.parent_edge then
+ search:push({ node = edge:getHead(), parent_edge = edge })
+ end
+ end
+ end
+
+ local function complete(search, data)
+ if data.parent_edge then
+ self:updateCutValue(data.parent_edge)
+ end
+ end
+
+ DepthFirstSearch.new(init, visit, complete):run()
+end
+
+
+
+--- DFS algorithm that calculates post-order traversal indices and parent edges.
+--
+-- This algorithm performs a depth-first search in a directed or undirected
+-- graph. For each node it calculates the node's post-order traversal index, the
+-- minimum post-order traversal index of its descendants as well as the edge by
+-- which the node was reached in the depth-first traversal.
+--
+function NetworkSimplex:calculateDFSRange(root, edge_from_parent, lowest)
+
+ -- global traversal index counter
+ local lim = lowest
+
+ -- start the traversal at the root node
+ local function init(search)
+ search:push({ node = root, parent_edge = edge_from_parent, low = lowest })
+ end
+
+ -- visit nodes in depth-first order
+ local function visit(search, data)
+ -- mark node as visited so we only visit it once
+ search:setVisited(data, true)
+
+ -- remember the parent edge
+ self.parent_edge[data.node] = data.parent_edge
+
+ -- remember the minimum traversal index for this branch of the search tree
+ self.low[data.node] = lim
+
+ -- next we push all outgoing and incoming edges in reverse order
+ -- to simulate recursive calls
+
+ local into = data.node:getIncomingEdges()
+ local out = data.node:getOutgoingEdges()
+
+ for i=#into,1,-1 do
+ local edge = into[i]
+ if edge ~= data.parent_edge then
+ search:push({ node = edge:getTail(), parent_edge = edge })
+ end
+ end
+
+ for i=#out,1,-1 do
+ local edge = out[i]
+ if edge ~= data.parent_edge then
+ search:push({ node = edge:getHead(), parent_edge = edge })
+ end
+ end
+ end
+
+ -- when completing a node, store its own traversal index
+ local function complete(search, data)
+ self.lim[data.node] = lim
+ lim = lim + 1
+ end
+
+ -- kick off the depth-first search
+ DepthFirstSearch.new(init, visit, complete):run()
+
+ local lim_lookup = {}
+ local min_lim = math.huge
+ local max_lim = -math.huge
+ for _,node in ipairs(self.tree.nodes) do
+ assert(self.lim[node])
+ assert(self.low[node])
+ assert(not lim_lookup[self.lim[node]])
+ lim_lookup[self.lim[node]] = true
+ min_lim = math.min(min_lim, self.lim[node])
+ max_lim = math.max(max_lim, self.lim[node])
+ end
+ for n = min_lim, max_lim do
+ assert(lim_lookup[n] == true)
+ end
+end
+
+
+
+function NetworkSimplex:updateCutValue(tree_edge)
+
+ local v = nil
+ if self.parent_edge[tree_edge:getTail()] == tree_edge then
+ v = tree_edge:getTail()
+ dir = 1
+ else
+ v = tree_edge:getHead()
+ dir = -1
+ end
+
+ local sum = 0
+
+ local out_edges = self.orig_node[v]:getOutgoingEdges()
+ local in_edges = self.orig_node[v]:getIncomingEdges()
+ local edges = lib.copy(out_edges)
+ for _,v in ipairs(in_edges) do
+ edges[#edges + 1] = v
+ end
+
+ for _,edge in ipairs(edges) do
+ local other = edge:getNeighbour(self.orig_node[v])
+
+ local f = 0
+ local rv = 0
+
+ if not self:inTailComponentOf(self.tree_node[other], v) then
+ f = 1
+ rv = edge.weight
+ else
+ f = 0
+
+ if self.tree_edge[edge] then
+ rv = self.cut_value[self.tree_edge[edge]]
+ else
+ rv = 0
+ end
+
+ rv = rv - edge.weight
+ end
+
+ local d = 0
+
+ if dir > 0 then
+ if edge:isHead(self.orig_node[v]) then
+ d = 1
+ else
+ d = -1
+ end
+ else
+ if edge:isTail(self.orig_node[v]) then
+ d = 1
+ else
+ d = -1
+ end
+ end
+
+ if f > 0 then
+ d = -d
+ end
+
+ if d < 0 then
+ rv = -rv
+ end
+
+ sum = sum + rv
+ end
+
+ self.cut_value[tree_edge] = sum
+end
+
+
+
+function NetworkSimplex:inTailComponentOf(node, v)
+ return (self.low[v] <= self.lim[node]) and (self.lim[node] <= self.lim[v])
+end
+
+
+
+function NetworkSimplex:nextSearchIndex()
+ local index = 1
+
+ -- avoid tree edge index out of bounds by resetting the search index
+ -- as soon as it leaves the range of edge indices in the tree
+ if self.search_index > #self.tree.edges then
+ self.search_index = 1
+ index = 1
+ else
+ index = self.search_index
+ self.search_index = self.search_index + 1
+ end
+
+ return index
+end
+
+
+
+function NetworkSimplex:rerank(node, delta)
+ local function init(search)
+ search:push({ node = node, delta = delta })
+ end
+
+ local function visit(search, data)
+ search:setVisited(data, true)
+
+ local orig_node = self.orig_node[data.node]
+ self.ranking:setRank(orig_node, self.ranking:getRank(orig_node) - data.delta)
+
+ local into = data.node:getIncomingEdges()
+ local out = data.node:getOutgoingEdges()
+
+ for i=#into,1,-1 do
+ local edge = into[i]
+ if edge ~= self.parent_edge[data.node] then
+ search:push({ node = edge:getTail(), delta = data.delta })
+ end
+ end
+
+ for i=#out,1,-1 do
+ local edge = out[i]
+ if edge ~= self.parent_edge[data.node] then
+ search:push({ node = edge:getHead(), delta = data.delta })
+ end
+ end
+ end
+
+ DepthFirstSearch.new(init, visit):run()
+end
+
+
+
+function NetworkSimplex:rerankBeforeReplacingEdge(leave_edge, enter_edge)
+ local delta = self:edgeSlack(enter_edge)
+
+ if delta > 0 then
+ local tail = leave_edge:getTail()
+
+ if #tail.edges == 1 then
+ self:rerank(tail, delta)
+ else
+ local head = leave_edge:getHead()
+
+ if #head.edges == 1 then
+ self:rerank(head, -delta)
+ else
+ if self.lim[tail] < self.lim[head] then
+ self:rerank(tail, delta)
+ else
+ self:rerank(head, -delta)
+ end
+ end
+ end
+ end
+end
+
+
+
+function NetworkSimplex:updateCutValuesUpToCommonAncestor(v, w, cutval, dir)
+
+ while not self:inTailComponentOf(w, v) do
+ local edge = self.parent_edge[v]
+
+ if edge:isTail(v) then
+ d = dir
+ else
+ d = not dir
+ end
+
+ if d then
+ self.cut_value[edge] = self.cut_value[edge] + cutval
+ else
+ self.cut_value[edge] = self.cut_value[edge] - cutval
+ end
+
+ if self.lim[edge:getTail()] > self.lim[edge:getHead()] then
+ v = edge:getTail()
+ else
+ v = edge:getHead()
+ end
+ end
+
+ return v
+end
+
+
+
+function NetworkSimplex:addEdgeToTree(edge)
+ assert(not self.tree_edge[edge])
+
+ -- create the new tree edge
+ local tree_edge = edge:copy()
+ self.orig_edge[tree_edge] = edge
+ self.tree_edge[edge] = tree_edge
+
+ -- create tree nodes if necessary
+ for _,node in ipairs(edge.nodes) do
+ local tree_node
+
+ if self.tree_node[node] then
+ tree_node = self.tree_node[node]
+ else
+ tree_node = node:copy()
+ self.orig_node[tree_node] = node
+ self.tree_node[node] = tree_node
+ end
+
+ self.tree:addNode(tree_node)
+ tree_edge:addNode(tree_node)
+ end
+
+ self.tree:addEdge(tree_edge)
+
+ return tree_edge
+end
+
+
+
+function NetworkSimplex:removeEdgeFromTree(edge)
+ self.tree:deleteEdge(edge)
+ self.tree_edge[self.orig_edge[edge]] = nil
+ self.orig_edge[edge] = nil
+end
+
+
+
+
+-- Done
+
+return NetworkSimplex \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodePositioningGansnerKNV1993.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodePositioningGansnerKNV1993.lua
new file mode 100644
index 0000000000..3e5a0f8f87
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodePositioningGansnerKNV1993.lua
@@ -0,0 +1,154 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+local NodePositioningGansnerKNV1993 = {}
+
+
+-- Imports
+
+local layered = require "pgf.gd.layered"
+
+local Graph = require "pgf.gd.deprecated.Graph"
+local Edge = require "pgf.gd.deprecated.Edge"
+local Node = require "pgf.gd.deprecated.Node"
+
+local NetworkSimplex = require "pgf.gd.layered.NetworkSimplex"
+local Storage = require "pgf.gd.lib.Storage"
+
+
+function NodePositioningGansnerKNV1993:run()
+ local auxiliary_graph = self:constructAuxiliaryGraph()
+
+ local simplex = NetworkSimplex.new(auxiliary_graph, NetworkSimplex.BALANCE_LEFT_RIGHT)
+ simplex:run()
+ local x_ranking = simplex.ranking
+
+ local layers = Storage.new()
+
+ local ranks = self.ranking:getRanks()
+ for _,rank in ipairs(ranks) do
+ local nodes = self.ranking:getNodes(rank)
+ for _,node in ipairs(nodes) do
+ node.pos.x = x_ranking:getRank(node.aux_node)
+ layers[node.orig_vertex] = rank
+ end
+ end
+
+ layered.arrange_layers_by_baselines(layers, self.main_algorithm.adjusted_bb, self.main_algorithm.ugraph)
+
+ -- Copy back
+ for _,rank in ipairs(ranks) do
+ local nodes = self.ranking:getNodes(rank)
+ for _,node in ipairs(nodes) do
+ node.pos.y = node.orig_vertex.pos.y
+ end
+ end
+end
+
+
+
+
+function NodePositioningGansnerKNV1993:constructAuxiliaryGraph()
+
+ local aux_graph = Graph.new()
+
+ local edge_node = {}
+
+ for _,node in ipairs(self.graph.nodes) do
+ local copy = Node.new{
+ name = node.name,
+ orig_node = node,
+ }
+ node.aux_node = copy
+ aux_graph:addNode(copy)
+ end
+
+ for i=#self.graph.edges,1,-1 do
+ local edge = self.graph.edges[i]
+ local node = Node.new{
+ name = '{' .. tostring(edge) .. '}',
+ }
+
+ aux_graph:addNode(node)
+
+ node.orig_edge = edge
+ edge_node[edge] = node
+
+ local head = edge:getHead()
+ local tail = edge:getTail()
+
+ local tail_edge = Edge.new{
+ direction = Edge.RIGHT,
+ minimum_levels = 0,
+ weight = edge.weight * self:getOmega(edge),
+ }
+ tail_edge:addNode(node)
+ tail_edge:addNode(tail.aux_node)
+ aux_graph:addEdge(tail_edge)
+
+ local head_edge = Edge.new{
+ direction = Edge.RIGHT,
+ minimum_levels = 0,
+ weight = edge.weight * self:getOmega(edge),
+ }
+ head_edge:addNode(node)
+ head_edge:addNode(head.aux_node)
+ aux_graph:addEdge(head_edge)
+ end
+
+ local ranks = self.ranking:getRanks()
+ for _,rank in ipairs(ranks) do
+ local nodes = self.ranking:getNodes(rank)
+ for n = 1, #nodes-1 do
+ local v = nodes[n]
+ local w = nodes[n+1]
+
+ local separator_edge = Edge.new{
+ direction = Edge.RIGHT,
+ minimum_levels = self:getDesiredHorizontalDistance(v, w),
+ weight = 0,
+ }
+ separator_edge:addNode(v.aux_node)
+ separator_edge:addNode(w.aux_node)
+ aux_graph:addEdge(separator_edge)
+ end
+ end
+
+ return aux_graph
+end
+
+
+
+function NodePositioningGansnerKNV1993:getOmega(edge)
+ local node1 = edge.nodes[1]
+ local node2 = edge.nodes[2]
+
+ if (node1.kind == "dummy") and (node2.kind == "dummy") then
+ return 8
+ elseif (node1.kind == "dummy") or (node2.kind == "dummy") then
+ return 2
+ else
+ return 1
+ end
+end
+
+
+
+function NodePositioningGansnerKNV1993:getDesiredHorizontalDistance(v, w)
+ return layered.ideal_sibling_distance(self.main_algorithm.adjusted_bb, self.graph.orig_digraph, v.orig_vertex, w.orig_vertex)
+end
+
+
+-- done
+
+return NodePositioningGansnerKNV1993 \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingGansnerKNV1993.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingGansnerKNV1993.lua
new file mode 100644
index 0000000000..d6765ae2f0
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingGansnerKNV1993.lua
@@ -0,0 +1,159 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local NodeRankingGansnerKNV1993 = {}
+
+
+-- Imports
+
+local Edge = require "pgf.gd.deprecated.Edge"
+local Node = require "pgf.gd.deprecated.Node"
+
+local NetworkSimplex = require "pgf.gd.layered.NetworkSimplex"
+
+
+
+function NodeRankingGansnerKNV1993:run()
+
+ local simplex = NetworkSimplex.new(self.graph, NetworkSimplex.BALANCE_TOP_BOTTOM)
+ simplex:run()
+ self.ranking = simplex.ranking
+
+ return simplex.ranking
+end
+
+
+
+function NodeRankingGansnerKNV1993:mergeClusters()
+
+ self.cluster_nodes = {}
+ self.cluster_node = {}
+ self.cluster_edges = {}
+
+ self.original_nodes = {}
+ self.original_edges = {}
+
+ for _,cluster in ipairs(self.graph.clusters) do
+
+ local cluster_node = Node.new{
+ name = 'cluster@' .. cluster.name,
+ }
+ table.insert(self.cluster_nodes, cluster_node)
+
+ for _,node in ipairs(cluster.nodes) do
+ self.cluster_node[node] = cluster_node
+ table.insert(self.original_nodes, node)
+ end
+
+ self.graph:addNode(cluster_node)
+ end
+
+ for _,edge in ipairs(self.graph.edges) do
+ local tail = edge:getTail()
+ local head = edge:getHead()
+
+ if self.cluster_node[tail] or self.cluster_node[head] then
+ table.insert(self.original_edges, edge)
+
+ local cluster_edge = Edge.new{
+ direction = Edge.RIGHT,
+ weight = edge.weight,
+ minimum_levels = edge.minimum_levels,
+ }
+ table.insert(self.cluster_edges, cluster_edge)
+
+ if self.cluster_node[tail] then
+ cluster_edge:addNode(self.cluster_node[tail])
+ else
+ cluster_edge:addNode(tail)
+ end
+
+ if self.cluster_node[head] then
+ cluster_edge:addNode(self.cluster_node[head])
+ else
+ cluster_edge:addNode(head)
+ end
+
+ end
+ end
+
+ for _,edge in ipairs(self.cluster_edges) do
+ self.graph:addEdge(edge)
+ end
+
+ for _,edge in ipairs(self.original_edges) do
+ self.graph:deleteEdge(edge)
+ end
+
+ for _,node in ipairs(self.original_nodes) do
+ self.graph:deleteNode(node)
+ end
+end
+
+
+
+function NodeRankingGansnerKNV1993:createClusterEdges()
+ for n = 1, #self.cluster_nodes-1 do
+ local first_cluster = self.cluster_nodes[n]
+ local second_cluster = self.cluster_nodes[n+1]
+
+ local edge = Edge.new{
+ direction = Edge.RIGHT,
+ weight = 1,
+ minimum_levels = 1,
+ }
+
+ edge:addNode(first_cluster)
+ edge:addNode(second_cluster)
+
+ self.graph:addEdge(edge)
+
+ table.insert(self.cluster_edges, edge)
+ end
+end
+
+
+
+function NodeRankingGansnerKNV1993:removeClusterEdges()
+end
+
+
+
+function NodeRankingGansnerKNV1993:expandClusters()
+
+ for _,node in ipairs(self.original_nodes) do
+ assert(self.ranking:getRank(self.cluster_node[node]))
+ self.ranking:setRank(node, self.ranking:getRank(self.cluster_node[node]))
+ self.graph:addNode(node)
+ end
+
+ for _,edge in ipairs(self.original_edges) do
+ for _,node in ipairs(edge.nodes) do
+ node:addEdge(edge)
+ end
+ self.graph:addEdge(edge)
+ end
+
+ for _,node in ipairs(self.cluster_nodes) do
+ self.ranking:setRank(node, nil)
+ self.graph:deleteNode(node)
+ end
+
+ for _,edge in ipairs(self.cluster_edges) do
+ self.graph:deleteEdge(edge)
+ end
+end
+
+
+-- done
+
+return NodeRankingGansnerKNV1993 \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingMinimumHeight.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingMinimumHeight.lua
new file mode 100644
index 0000000000..644b99c28a
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/NodeRankingMinimumHeight.lua
@@ -0,0 +1,47 @@
+-- Copyright 2011 by Jannis Pohlmann
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local NodeRankingMinimumHeight = {}
+
+-- Imports
+
+local Ranking = require "pgf.gd.layered.Ranking"
+local Iterators = require "pgf.gd.deprecated.Iterators"
+
+
+function NodeRankingMinimumHeight:run()
+ local ranking = Ranking.new()
+
+ for node in Iterators.topologicallySorted(self.graph) do
+ local edges = node:getIncomingEdges()
+
+ if #edges == 0 then
+ ranking:setRank(node, 1)
+ else
+ local max_rank = -math.huge
+ for _,edge in ipairs(edges) do
+ max_rank = math.max(max_rank, ranking:getRank(edge:getNeighbour(node)))
+ end
+
+ assert(max_rank >= 1)
+
+ ranking:setRank(node, max_rank + 1)
+ end
+ end
+
+ return ranking
+end
+
+
+-- done
+
+return NodeRankingMinimumHeight
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Ranking.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Ranking.lua
new file mode 100644
index 0000000000..6ed63b0249
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Ranking.lua
@@ -0,0 +1,291 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- The Ranking class is used by the Sugiyama algorithm to compute an
+-- ordering on the nodes of a layer
+
+local Ranking = {}
+Ranking.__index = Ranking
+
+-- Namespace
+local layered = require "pgf.gd.layered"
+layered.Ranking = Ranking
+
+
+local lib = require "pgf.gd.lib"
+
+
+-- TODO Jannis: document!
+
+
+function Ranking.new()
+ local ranking = {
+ rank_to_nodes = {},
+ node_to_rank = {},
+ position_in_rank = {},
+ }
+ setmetatable(ranking, Ranking)
+ return ranking
+end
+
+
+
+function Ranking:copy()
+ local copied_ranking = Ranking.new()
+
+ -- copy rank to nodes mapping
+ for rank, nodes in pairs(self.rank_to_nodes) do
+ copied_ranking.rank_to_nodes[rank] = lib.copy(self.rank_to_nodes[rank])
+ end
+
+ -- copy node to rank mapping
+ copied_ranking.node_to_rank = lib.copy(self.node_to_rank)
+
+ -- copy node to position in rank mapping
+ copied_ranking.position_in_rank = lib.copy(self.position_in_rank)
+
+ return copied_ranking
+end
+
+
+
+function Ranking:reset()
+ self.rank_to_nodes = {}
+ self.node_to_rank = {}
+ self.position_in_rank = {}
+end
+
+
+
+function Ranking:getRanks()
+ local ranks = {}
+ for rank, nodes in pairs(self.rank_to_nodes) do
+ table.insert(ranks, rank)
+ end
+ table.sort(ranks)
+ return ranks
+end
+
+
+
+function Ranking:getRankSize(rank)
+ if self.rank_to_nodes[rank] then
+ return #self.rank_to_nodes[rank]
+ else
+ return 0
+ end
+end
+
+
+
+function Ranking:getNodeInfo(node)
+ return self:getRank(node), self:getRankPosition(node)
+end
+
+
+
+function Ranking:getNodes(rank)
+ return self.rank_to_nodes[rank] or {}
+end
+
+
+
+function Ranking:getRank(node)
+ return self.node_to_rank[node]
+end
+
+
+
+function Ranking:setRank(node, new_rank)
+ local rank, pos = self:getNodeInfo(node)
+
+ if rank == new_rank then
+ return
+ end
+
+ if rank then
+ for n = pos+1, #self.rank_to_nodes[rank] do
+ local other_node = self.rank_to_nodes[rank][n]
+ self.position_in_rank[other_node] = self.position_in_rank[other_node]-1
+ end
+
+ table.remove(self.rank_to_nodes[rank], pos)
+ self.node_to_rank[node] = nil
+ self.position_in_rank[node] = nil
+
+ if #self.rank_to_nodes[rank] == 0 then
+ self.rank_to_nodes[rank] = nil
+ end
+ end
+
+ if new_rank then
+ self.rank_to_nodes[new_rank] = self.rank_to_nodes[new_rank] or {}
+ table.insert(self.rank_to_nodes[new_rank], node)
+ self.node_to_rank[node] = new_rank
+ self.position_in_rank[node] = #self.rank_to_nodes[new_rank]
+ end
+end
+
+
+
+function Ranking:getRankPosition(node)
+ return self.position_in_rank[node]
+end
+
+
+
+function Ranking:setRankPosition(node, new_pos)
+ local rank, pos = self:getNodeInfo(node)
+
+ assert((rank and pos) or ((not rank) and (not pos)))
+
+ if pos == new_pos then
+ return
+ end
+
+ if rank and pos then
+ for n = pos+1, #self.rank_to_nodes[rank] do
+ local other_node = self.rank_to_nodes[rank][n]
+ self.position_in_rank[other_node] = self.position_in_rank[other_node]-1
+ end
+
+ table.remove(self.rank_to_nodes[rank], pos)
+ self.node_to_rank[node] = nil
+ self.position_in_rank[node] = nil
+ end
+
+ if new_pos then
+ self.rank_to_nodes[rank] = self.rank_to_nodes[rank] or {}
+
+ for n = new_pos+1, #self.rank_to_nodes[rank] do
+ local other_node = self.rank_to_nodes[rank][new_pos]
+ self.position_in_rank[other_node] = self.position_in_rank[other_node]+1
+ end
+
+ table.insert(self.rank_to_nodes[rank], node)
+ self.node_to_rank[node] = rank
+ self.position_in_rank[node] = new_pos
+ end
+end
+
+
+
+function Ranking:normalizeRanks()
+
+ -- get the current ranks
+ local ranks = self:getRanks()
+
+ local min_rank = ranks[1]
+ local max_rank = ranks[#ranks]
+
+ -- clear ranks
+ self.rank_to_nodes = {}
+
+ -- iterate over all nodes and rerank them manually
+ for node in pairs(self.position_in_rank) do
+ local rank, pos = self:getNodeInfo(node)
+ local new_rank = rank - (min_rank - 1)
+
+ self.rank_to_nodes[new_rank] = self.rank_to_nodes[new_rank] or {}
+ self.rank_to_nodes[new_rank][pos] = node
+
+ self.node_to_rank[node] = new_rank
+ end
+end
+
+
+
+function Ranking:switchPositions(left_node, right_node)
+ local left_rank = self.node_to_rank[left_node]
+ local right_rank = self.node_to_rank[right_node]
+
+ assert(left_rank == right_rank, 'only positions of nodes in the same rank can be switched')
+
+ local left_pos = self.position_in_rank[left_node]
+ local right_pos = self.position_in_rank[right_node]
+
+ self.rank_to_nodes[left_rank][left_pos] = right_node
+ self.rank_to_nodes[left_rank][right_pos] = left_node
+
+ self.position_in_rank[left_node] = right_pos
+ self.position_in_rank[right_node] = left_pos
+end
+
+
+
+function Ranking:reorderRank(rank, get_index_func, is_fixed_func)
+ self:reorderTable(self.rank_to_nodes[rank], get_index_func, is_fixed_func)
+
+ for n = 1, #self.rank_to_nodes[rank] do
+ self.position_in_rank[self.rank_to_nodes[rank][n]] = n
+ end
+end
+
+
+
+function Ranking:reorderTable(input, get_index_func, is_fixed_func)
+ -- collect all allowed indices
+ local allowed_indices = {}
+ for n = 1, #input do
+ if not is_fixed_func(n, input[n]) then
+ table.insert(allowed_indices, n)
+ end
+ end
+
+ -- collect all desired indices; for each of these desired indices,
+ -- remember by which element it was requested
+ local desired_to_real_indices = {}
+ local sort_indices = {}
+ for n = 1, #input do
+ if not is_fixed_func(n, input[n]) then
+ local index = get_index_func(n, input[n])
+ if not desired_to_real_indices[index] then
+ desired_to_real_indices[index] = {}
+ table.insert(sort_indices, index)
+ end
+ table.insert(desired_to_real_indices[index], n)
+ end
+ end
+
+ -- sort the desired indices
+ table.sort(sort_indices)
+
+ -- compute the final indices by counting the final indices generated
+ -- prior to the current one and by mapping this number to the allowed
+ -- index with the same number
+ local final_indices = {}
+ local n = 1
+ for _,index in ipairs(sort_indices) do
+ local real_indices = desired_to_real_indices[index]
+ for _,real_index in ipairs(real_indices) do
+ final_indices[real_index] = allowed_indices[n]
+ n = n + 1
+ end
+ end
+
+ -- flat-copy the input table so that we can still access the elements
+ -- using their real index while overwriting the input table in-place
+ local input_copy = lib.copy(input)
+
+ -- move flexible elements to their final indices
+ for old_index, new_index in pairs(final_indices) do
+ input[new_index] = input_copy[old_index]
+ end
+end
+
+
+
+-- Done
+
+return Ranking \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Sugiyama.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Sugiyama.lua
new file mode 100644
index 0000000000..c91818dc30
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/Sugiyama.lua
@@ -0,0 +1,476 @@
+-- Copyright 2011 by Jannis Pohlmann, 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {The Modular Sugiyama Method}
+--
+-- @end
+
+local Sugiyama = {}
+
+-- Namespace
+require("pgf.gd.layered").Sugiyama = Sugiyama
+
+-- Imports
+local layered = require "pgf.gd.layered"
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+local Ranking = require "pgf.gd.layered.Ranking"
+local Simplifiers = require "pgf.gd.lib.Simplifiers"
+
+-- Deprecated stuff. Need to get rid of it!
+local Edge = require "pgf.gd.deprecated.Edge"
+local Node = require "pgf.gd.deprecated.Node"
+
+local Iterators = require "pgf.gd.deprecated.Iterators"
+local Vector = require "pgf.gd.deprecated.Vector"
+
+
+
+---
+
+declare {
+ key = "layered layout",
+ algorithm = Sugiyama,
+
+ preconditions = {
+ connected = true,
+ loop_free = true,
+ },
+
+ postconditions = {
+ upward_oriented = true
+ },
+
+ old_graph_model = true,
+
+ summary = [["
+ The |layered layout| is the key used to select the modular Sugiyama
+ layout algorithm.
+ "]],
+ documentation = [["
+ This algorithm consists of five consecutive steps, each of which can be
+ configured independently of the other ones (how this is done is
+ explained later in this section). Naturally, the ``best'' heuristics
+ are selected by default, so there is typically no need to change the
+ settings, but what is the ``best'' method for one graph need not be
+ the best one for another graph.
+
+ As can be seen in the first example, the algorithm will not only
+ position the nodes of a graph, but will also perform an edge
+ routing. This will look visually quite pleasing if you add the
+ |rounded corners| option:
+ "]],
+ examples = {[["
+ \tikz \graph [layered layout, sibling distance=7mm]
+ {
+ a -> {
+ b,
+ c -> { d, e, f }
+ } ->
+ h ->
+ a
+ };
+ "]],[["
+ \tikz [rounded corners] \graph [layered layout, sibling distance=7mm]
+ {
+ a -> {
+ b,
+ c -> { d, e, f }
+ } ->
+ h ->
+ a
+ };
+ "]]
+ }
+}
+
+---
+
+declare {
+ key = "minimum layers",
+ type = "number",
+ initial = "1",
+
+ summary = [["
+ The minimum number of levels that an edge must span. It is a bit of
+ the opposite of the |weight| parameter: While a large |weight|
+ causes an edge to become shorter, a larger |minimum layers| value
+ causes an edge to be longer.
+ "]],
+ examples = [["
+ \tikz \graph [layered layout] {
+ a -- {b [> minimum layers=3], c, d} -- e -- a;
+ };
+ "]]
+}
+
+
+---
+
+declare {
+ key = "same layer",
+ layer = 0,
+
+ summary = [["
+ The |same layer| collection allows you to enforce that several nodes
+ a on the same layer of a layered layout (this option is also known
+ as |same rank|). You use it like this:
+ "]],
+ examples = {[["
+ \tikz \graph [layered layout] {
+ a -- b -- c -- d -- e;
+
+ { [same layer] a, b };
+ { [same layer] d, e };
+ };
+ "]],[["
+ \tikz [rounded corners] \graph [layered layout] {
+ 1972 -> 1976 -> 1978 -> 1980 -> 1982 -> 1984 -> 1986 -> 1988 -> 1990 -> future;
+
+ { [same layer] 1972, Thompson };
+ { [same layer] 1976, Mashey, Bourne },
+ { [same layer] 1978, Formshell, csh },
+ { [same layer] 1980, esh, vsh },
+ { [same layer] 1982, ksh, "System-V" },
+ { [same layer] 1984, v9sh, tcsh },
+ { [same layer] 1986, "ksh-i" },
+ { [same layer] 1988, KornShell ,Perl, rc },
+ { [same layer] 1990, tcl, Bash },
+ { [same layer] "future", POSIX, "ksh-POSIX" },
+
+ Thompson -> { Mashey, Bourne, csh -> tcsh},
+ Bourne -> { ksh, esh, vsh, "System-V", v9sh -> rc, Bash},
+ { "ksh-i", KornShell } -> Bash,
+ { esh, vsh, Formshell, csh } -> ksh,
+ { KornShell, "System-V" } -> POSIX,
+ ksh -> "ksh-i" -> KornShell -> "ksh-POSIX",
+ Bourne -> Formshell,
+
+ { [edge={draw=none}]
+ Bash -> tcl,
+ KornShell -> Perl
+ }
+ };
+ "]]
+ }
+}
+
+
+
+-- Implementation
+
+function Sugiyama:run()
+ if #self.graph.nodes <= 1 then
+ return
+ end
+
+ local options = self.digraph.options
+
+ local cycle_removal_algorithm_class = options.algorithm_phases['cycle removal']
+ local node_ranking_algorithm_class = options.algorithm_phases['node ranking']
+ local crossing_minimization_algorithm_class = options.algorithm_phases['crossing minimization']
+ local node_positioning_algorithm_class = options.algorithm_phases['node positioning']
+ local edge_routing_algorithm_class = options.algorithm_phases['layer edge routing']
+
+ self:preprocess()
+
+ -- Helper function for collapsing multiedges
+ local function collapse (m,e)
+ m.weight = (m.weight or 0) + e.weight
+ m.minimum_levels = math.max((m.minimum_levels or 0), e.minimum_levels)
+ end
+
+ -- Rank using cluster
+
+ -- Create a subalgorithm object. Needed so that removed loops
+ -- are not stored on top of removed loops from main call.
+ local cluster_subalgorithm = { graph = self.graph }
+ self.graph:registerAlgorithm(cluster_subalgorithm)
+
+ self:mergeClusters()
+
+ Simplifiers:removeLoopsOldModel(cluster_subalgorithm)
+ Simplifiers:collapseMultiedgesOldModel(cluster_subalgorithm, collapse)
+
+ cycle_removal_algorithm_class.new { main_algorithm = self, graph = self.graph }:run()
+ self.ranking = node_ranking_algorithm_class.new{ main_algorithm = self, graph = self.graph }:run()
+ self:restoreCycles()
+
+ Simplifiers:expandMultiedgesOldModel(cluster_subalgorithm)
+ Simplifiers:restoreLoopsOldModel(cluster_subalgorithm)
+
+ self:expandClusters()
+
+ -- Now do actual computation
+ Simplifiers:collapseMultiedgesOldModel(cluster_subalgorithm, collapse)
+ cycle_removal_algorithm_class.new{ main_algorithm = self, graph = self.graph }:run()
+ self:insertDummyNodes()
+
+ -- Main algorithm
+ crossing_minimization_algorithm_class.new{
+ main_algorithm = self,
+ graph = self.graph,
+ ranking = self.ranking
+ }:run()
+ node_positioning_algorithm_class.new{
+ main_algorithm = self,
+ graph = self.graph,
+ ranking = self.ranking
+ }:run()
+
+ -- Cleanup
+ self:removeDummyNodes()
+ Simplifiers:expandMultiedgesOldModel(cluster_subalgorithm)
+ edge_routing_algorithm_class.new{ main_algorithm = self, graph = self.graph }:run()
+ self:restoreCycles()
+
+end
+
+
+
+function Sugiyama:preprocess()
+ -- initialize edge parameters
+ for _,edge in ipairs(self.graph.edges) do
+ -- read edge parameters
+ edge.weight = edge:getOption('weight')
+ edge.minimum_levels = edge:getOption('minimum layers')
+
+ -- validate edge parameters
+ assert(edge.minimum_levels >= 0, 'the edge ' .. tostring(edge) .. ' needs to have a minimum layers value greater than or equal to 0')
+ end
+end
+
+
+
+function Sugiyama:insertDummyNodes()
+ -- enumerate dummy nodes using a globally unique numeric ID
+ local dummy_id = 1
+
+ -- keep track of the original edges removed
+ self.original_edges = {}
+
+ -- keep track of dummy nodes introduced
+ self.dummy_nodes = {}
+
+ for node in Iterators.topologicallySorted(self.graph) do
+ local in_edges = node:getIncomingEdges()
+
+ for _,edge in ipairs (in_edges) do
+ local neighbour = edge:getNeighbour(node)
+ local dist = self.ranking:getRank(node) - self.ranking:getRank(neighbour)
+
+ if dist > 1 then
+ local dummies = {}
+
+ for i=1,dist-1 do
+ local rank = self.ranking:getRank(neighbour) + i
+
+ local dummy = Node.new{
+ pos = Vector.new(),
+ name = 'dummy@' .. neighbour.name .. '@to@' .. node.name .. '@at@' .. rank,
+ kind = "dummy",
+ orig_vertex = pgf.gd.model.Vertex.new{}
+ }
+
+ dummy_id = dummy_id + 1
+
+ self.graph:addNode(dummy)
+ self.ugraph:add {dummy.orig_vertex}
+
+ self.ranking:setRank(dummy, rank)
+
+ table.insert(self.dummy_nodes, dummy)
+ table.insert(edge.bend_nodes, dummy)
+
+ table.insert(dummies, dummy)
+ end
+
+ table.insert(dummies, 1, neighbour)
+ table.insert(dummies, #dummies+1, node)
+
+ for i = 2, #dummies do
+ local source = dummies[i-1]
+ local target = dummies[i]
+
+ local dummy_edge = Edge.new{
+ direction = Edge.RIGHT,
+ reversed = false,
+ weight = edge.weight, -- TODO or should we divide the weight of the original edge by the number of virtual edges?
+ }
+
+ dummy_edge:addNode(source)
+ dummy_edge:addNode(target)
+
+ self.graph:addEdge(dummy_edge)
+ end
+
+ table.insert(self.original_edges, edge)
+ end
+ end
+ end
+
+ for _,edge in ipairs(self.original_edges) do
+ self.graph:deleteEdge(edge)
+ end
+end
+
+
+
+function Sugiyama:removeDummyNodes()
+ -- delete dummy nodes
+ for _,node in ipairs(self.dummy_nodes) do
+ self.graph:deleteNode(node)
+ end
+
+ -- add original edge again
+ for _,edge in ipairs(self.original_edges) do
+ -- add edge to the graph
+ self.graph:addEdge(edge)
+
+ -- add edge to the nodes
+ for _,node in ipairs(edge.nodes) do
+ node:addEdge(edge)
+ end
+
+ -- convert bend nodes to bend points for TikZ
+ for _,bend_node in ipairs(edge.bend_nodes) do
+ local point = bend_node.pos:copy()
+ table.insert(edge.bend_points, point)
+ end
+
+ if edge.reversed then
+ local bp = edge.bend_points
+ for i=1,#bp/2 do
+ local j = #bp + 1 - i
+ bp[i], bp[j] = bp[j], bp[i]
+ end
+ end
+
+ -- clear the list of bend nodes
+ edge.bend_nodes = {}
+ end
+end
+
+
+
+function Sugiyama:mergeClusters()
+
+ self.cluster_nodes = {}
+ self.cluster_node = {}
+ self.cluster_edges = {}
+ self.cluster_original_edges = {}
+ self.original_nodes = {}
+
+ for _,cluster in ipairs(self.graph.clusters) do
+
+ local cluster_node = cluster.nodes[1]
+ table.insert(self.cluster_nodes, cluster_node)
+
+ for n = 2, #cluster.nodes do
+ local other_node = cluster.nodes[n]
+ self.cluster_node[other_node] = cluster_node
+ table.insert(self.original_nodes, other_node)
+ end
+ end
+
+ for _,edge in ipairs(self.graph.edges) do
+ local tail = edge:getTail()
+ local head = edge:getHead()
+
+ if self.cluster_node[tail] or self.cluster_node[head] then
+ local cluster_edge = Edge.new{
+ direction = Edge.RIGHT,
+ weight = edge.weight,
+ minimum_levels = edge.minimum_levels,
+ }
+
+ if self.cluster_node[tail] then
+ cluster_edge:addNode(self.cluster_node[tail])
+ else
+ cluster_edge:addNode(tail)
+ end
+
+ if self.cluster_node[head] then
+ cluster_edge:addNode(self.cluster_node[head])
+ else
+ cluster_edge:addNode(head)
+ end
+
+ table.insert(self.cluster_edges, cluster_edge)
+ table.insert(self.cluster_original_edges, edge)
+ end
+ end
+
+ for n = 1, #self.cluster_nodes-1 do
+ local first_node = self.cluster_nodes[n]
+ local second_node = self.cluster_nodes[n+1]
+
+ local edge = Edge.new{
+ direction = Edge.RIGHT,
+ weight = 1,
+ minimum_levels = 1,
+ }
+
+ edge:addNode(first_node)
+ edge:addNode(second_node)
+
+ table.insert(self.cluster_edges, edge)
+ end
+
+ for _,node in ipairs(self.original_nodes) do
+ self.graph:deleteNode(node)
+ end
+ for _,edge in ipairs(self.cluster_edges) do
+ self.graph:addEdge(edge)
+ end
+ for _,edge in ipairs(self.cluster_original_edges) do
+ self.graph:deleteEdge(edge)
+ end
+end
+
+
+
+function Sugiyama:expandClusters()
+
+ for _,node in ipairs(self.original_nodes) do
+ self.ranking:setRank(node, self.ranking:getRank(self.cluster_node[node]))
+ self.graph:addNode(node)
+ end
+
+ for _,edge in ipairs(self.cluster_original_edges) do
+ for _,node in ipairs(edge.nodes) do
+ node:addEdge(edge)
+ end
+ self.graph:addEdge(edge)
+ end
+
+ for _,edge in ipairs(self.cluster_edges) do
+ self.graph:deleteEdge(edge)
+ end
+end
+
+
+function Sugiyama:restoreCycles()
+ for _,edge in ipairs(self.graph.edges) do
+ edge.reversed = false
+ end
+end
+
+
+
+
+
+-- done
+
+return Sugiyama
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/crossing_minimization.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/crossing_minimization.lua
new file mode 100644
index 0000000000..54a1fafb23
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/crossing_minimization.lua
@@ -0,0 +1,81 @@
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Crossing Minimization (Node Ordering)}
+--
+-- The number of edge crossings in a layered drawing is determined by
+-- the ordering of nodes at each of its layers. Therefore, crossing
+-- minimization is the problem of reordering the nodes at each layer
+-- so that the overall number of edge crossings is minimized. The
+-- crossing minimization step takes a proper layering where every edge
+-- connects nodes in neighbored layers, allowing algorithms to
+-- minimize crossings layer by layer rather than all at once. While
+-- this does not reduce the complexity of the problem, it does make it
+-- considerably easier to understand and implement. Techniques based
+-- on such an iterative approach are also known as layer-by-layer
+-- sweep methods. They are used in many popular heuristics due to
+-- their simplicity and the good results they produce.
+--
+-- Sweeping refers to moving up and down from one layer to the next,
+-- reducing crossings along the way. In layer-by-layer sweep methods,
+-- an initial node ordering for one of the layers is computed
+-- first. Depending on the sweep direction this can either be the
+-- first layer or the last; in rare occasions the layer in the middle
+-- is used instead. Followed by this, the actual layer-by-layer sweep
+-- is performed. Given an initial ordering for the first layer $L_1$, a
+-- downward sweep first holds the nodes in $L_1$ fixed while reordering
+-- the nodes in the second layer $L_2$ to reduce the number of
+-- crossings between $L_1$ and $L_2$. It then goes on to reorder the
+-- third layer while holding the second layer fixed. This is continued
+-- until all layers except for the first one have been
+-- examined. Upward sweeping and sweeping from the middle work
+-- analogous.
+--
+-- Obviously, the central aspect of the layer-by-layer sweep is how
+-- the nodes of a specific layer are reordered using a neighbored
+-- layer as a fixed reference. This problem is known as one-sided
+-- crossing minimization, which unfortunately is NP-hard. In the
+-- following various heuristics to solve this problem are
+-- presented.
+--
+-- For more details, please see Section 4.1.4 of Pohlmann's Diploma
+-- thesis.
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "sweep crossing minimization",
+ algorithm = require "pgf.gd.layered.CrossingMinimizationGansnerKNV1993",
+ phase = "crossing minimization",
+ phase_default = true,
+
+ summary = [["
+ Gansner et al. combine an initial ordering based on a depth-first
+ search with the median and greedy switch heuristics applied in the
+ form of an alternating layer-by-layer sweep based on a weighted
+ median.
+ "]],
+ documentation = [["
+ For more details, please see Section~4.1.4 of Pohlmann's Diploma
+ thesis.
+
+ This is the default algorithm for crossing minimization.
+ "]]
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/cycle_removal.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/cycle_removal.lua
new file mode 100644
index 0000000000..18670df14e
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/cycle_removal.lua
@@ -0,0 +1,136 @@
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Cycle Removal}
+--
+-- The Sugiyama method works only on directed \emph{acyclic}
+-- graphs. For this reason, if the input graph is not (yet) acyclic, a
+-- number of edges need to be redirected so that acyclicity arises. In
+-- the following, the different options that allow you to fine-tune
+-- this process are documented.
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "depth first cycle removal",
+ algorithm = require "pgf.gd.layered.CycleRemovalGansnerKNV1993",
+ phase = "cycle removal",
+ phase_default = true,
+
+ summary = [["
+ Selects a cycle removal algorithm that is especially
+ appropriate for graphs specified ``by hand''.
+ "]],
+ documentation = [["
+ When graphs are created by humans manually, one can
+ make assumptions about the input graph that would otherwise not
+ be possible. For instance, it seems reasonable to assume that the
+ order in which nodes and edges are entered by the user somehow
+ reflects the natural flow the user has had in mind for the graph.
+
+ In order to preserve the natural flow of the input graph, Gansner
+ et al.\ propose to remove cycles by performing a series of
+ depth-first searches starting at individual nodes in the order they
+ appear in the graph. This algorithm implicitly constructs a spanning
+ tree of the nodes reached during the searches. It thereby partitions
+ the edges of the graph into tree edges and non-tree edges. The
+ non-tree edges are further subdivided into forward edges, cross edges,
+ and back edges. Forward edges point from a tree nodes to one of their
+ descendants. Cross edges connect unrelated branches in the search tree.
+ Back edges connect descendants to one of their ancestors. It is not
+ hard to see that reversing back edges will not only introduce no new
+ cycles but will also make any directed graph acyclic.
+ Gansner et al.\ argue that this approach is more stable than others
+ in that fewer inappropriate edges are reversed compared to other
+ methods, despite the lack of a provable upper bound for the number
+ of reversed edges.
+
+ See section~4.1.1 of Pohlmann's Diplom thesis for more details.
+
+ This is the default algorithm for cycle removals.
+ "]]
+ }
+
+---
+
+declare {
+ key = "prioritized greedy cycle removal",
+ algorithm = "pgf.gd.layered.CycleRemovalEadesLS1993",
+ phase = "cycle removal",
+
+ summary = [["
+ This algorithm implements a greedy heuristic of Eades et al.\ for
+ cycle removal that prioritizes sources and sinks.
+ "]],
+ documentation = [["
+ See section~4.1.1 of Pohlmann's Diploma theses for details.
+ "]]
+}
+
+
+---
+
+declare {
+ key = "greedy cycle removal",
+ algorithm = "pgf.gd.layered.CycleRemovalEadesLS1993",
+ phase = "cycle removal",
+
+ summary = [["
+ This algorithm implements a greedy heuristic of Eades et al.\ for
+ cycle removal that prioritizes sources and sinks.
+ "]],
+ documentation = [["
+ See section~4.1.1 of Pohlmann's Diploma theses for details.
+ "]]
+ }
+
+---
+
+declare {
+ key = "naive greedy cycle removal",
+ algorithm = "pgf.gd.layered.CycleRemovalBergerS1990a",
+ phase = "cycle removal",
+
+ summary = [["
+ This algorithm implements a greedy heuristic of Berger and Shor for
+ cycle removal. It is not really compared to the other heuristics and
+ only included for demonstration purposes.
+ "]],
+ documentation = [["
+ See section~4.1.1 of Pohlmann's Diploma theses for details.
+ "]]
+ }
+
+---
+
+declare {
+ key = "random greedy cycle removal",
+ algorithm = "pgf.gd.layered.CycleRemovalBergerS1990b",
+ phase = "cycle removal",
+
+ summary = [["
+ This algorithm implements a randomized greedy heuristic of Berger
+ and Shor for cycle removal. It, too, is not really compared to
+ the other heuristics and only included for demonstration purposes.
+ "]],
+ documentation = [["
+ See section~4.1.1 of Pohlmann's Diploma theses for details.
+ "]]
+ } \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/edge_routing.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/edge_routing.lua
new file mode 100644
index 0000000000..eb9939c74c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/edge_routing.lua
@@ -0,0 +1,49 @@
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Edge Routing}
+--
+-- The original layered drawing method described by Eades and Sugiyama
+-- in does not include the routing or shaping of edges as a main
+-- step. This makes sense if all nodes have the same size and
+-- shape. In practical scenarios, however, this assumption often does
+-- not hold. In these cases, advanced techniques may have to be
+-- applied in order to avoid overlaps of nodes and edges.
+--
+-- For more details, please see Section~4.1.5 of Pohlmann's Diploma
+-- thesis.
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "polyline layer edge routing",
+ algorithm = require "pgf.gd.layered.EdgeRoutingGansnerKNV1993",
+ phase = "layer edge routing",
+ phase_default = true,
+
+ summary = [["
+ This edge routing algorithm uses polygonal lines to connect nodes.
+ "]],
+ documentation = [["
+ For more details, please see Section~4.1.5 of Pohlmann's Diploma thesis.
+
+ This is the default algorithm for edge routing.
+ "]]
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/library.lua
new file mode 100644
index 0000000000..950e02ffa3
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/library.lua
@@ -0,0 +1,94 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- A ``layered'' layout of a graph tries to arrange the nodes in
+-- consecutive horizontal layers (naturally, by rotating the graph, this
+-- can be changed in to vertical layers) such that edges tend to be only
+-- between nodes on adjacent layers. Trees, for instance, can always be
+-- laid out in this way. This method of laying out a graph is especially
+-- useful for hierarchical graphs.
+--
+-- The method implemented in this library is often called the
+-- \emph{Sugiyama method}, which is a rather advanced method of
+-- assigning nodes to layers and positions on these layers. The same
+-- method is also used in the popular GraphViz program, indeed, the
+-- implementation in \tikzname\ is based on the same pseudo-code from the
+-- same paper as the implementation used in GraphViz and both programs
+-- will often generate the same layout (but not always, as explained
+-- below). The current implementation is due to Jannis Pohlmann, who
+-- implemented it as part of his Diploma thesis. Please consult this
+-- thesis for a detailed explanation of the Sugiyama method and its
+-- history:
+-- %
+-- \begin{itemize}
+-- \item
+-- Jannis Pohlmann,
+-- \newblock \emph{Configurable Graph Drawing Algorithms
+-- for the \tikzname\ Graphics Description Language,}
+-- \newblock Diploma Thesis,
+-- \newblock Institute of Theoretical Computer Science, Universit\"at
+-- zu L\"ubeck, 2011.\\[.5em]
+-- \newblock Available online via
+-- \url{http://www.tcs.uni-luebeck.de/downloads/papers/2011/}\\
+-- \url{2011-configurable-graph-drawing-algorithms-jannis-pohlmann.pdf}
+-- \\[.5em]
+-- (Note that since the publication of this thesis some option names
+-- have been changed. Most noticeably, the option name
+-- |layered drawing| was changed to |layered layout|, which is somewhat
+-- more consistent with other names used in the graph drawing
+-- libraries. Furthermore, the keys for choosing individual
+-- algorithms for the different algorithm phases, have all changed.)
+-- \end{itemize}
+--
+-- The Sugiyama methods lays out a graph in five steps:
+-- %
+-- \begin{enumerate}
+-- \item Cycle removal.
+-- \item Layer assignment (sometimes called node ranking).
+-- \item Crossing minimization (also referred to as node ordering).
+-- \item Node positioning (or coordinate assignment).
+-- \item Edge routing.
+-- \end{enumerate}
+-- %
+-- It turns out that behind each of these steps there lurks an
+-- NP-complete problem, which means, in practice, that each step is
+-- impossible to perform optimally for larger graphs. For this reason,
+-- heuristics and approximation algorithms are used to find a ``good''
+-- way of performing the steps.
+--
+-- A distinctive feature of Pohlmann's implementation of the Sugiyama
+-- method for \tikzname\ is that the algorithms used for each of the
+-- steps can easily be exchanged, just specify a different option. For
+-- the user, this means that by specifying a different option and thereby
+-- using a different heuristic for one of the steps, a better layout can
+-- often be found. For the researcher, this means that one can very
+-- easily test new approaches and new heuristics without having to
+-- implement all of the other steps anew.
+--
+-- @library
+
+local layered
+
+
+-- Load declarations from:
+require "pgf.gd.layered"
+
+-- Load algorithms from:
+require "pgf.gd.layered.Sugiyama"
+require "pgf.gd.layered.cycle_removal"
+require "pgf.gd.layered.node_ranking"
+require "pgf.gd.layered.crossing_minimization"
+require "pgf.gd.layered.node_positioning"
+require "pgf.gd.layered.edge_routing"
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_positioning.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_positioning.lua
new file mode 100644
index 0000000000..e51382d642
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_positioning.lua
@@ -0,0 +1,55 @@
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Node Positioning (Coordinate Assignment)}
+--
+-- The second last step of the Sugiyama method decides about the final
+-- $x$- and $y$-coordinates of the nodes. The main objectives of this
+-- step are to position nodes so that the number of edge bends is kept
+-- small and edges are drawn as vertically as possible. Another goal
+-- is to avoid node and edge overlaps which is crucial in particular
+-- if the nodes are allowed to have non-uniform sizes. The
+-- $y$-coordinates of the nodes have no influence on the number of
+-- bends. Obviously, nodes need to be separated enough geometrically
+-- so that they do not overlap. It feels natural to aim at separating
+-- all layers in the drawing by the same amount. Large nodes, however,
+-- may force node positioning algorithms to override this uniform
+-- level distance in order to avoid overlaps.
+--
+-- For more details, please see Section~4.1.2 of Pohlmann's Diploma thesis.
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "linear optimization node positioning",
+ algorithm = require "pgf.gd.layered.NodePositioningGansnerKNV1993",
+ phase = "node positioning",
+ phase_default = true,
+
+ summary = [["
+ This node positioning method, due to Gasner et al., is based on a
+ linear optimization problem.
+ "]],
+ documentation = [["
+ For more details, please see Section~4.1.3 of Pohlmann's Diploma thesis.
+
+ This is the default algorithm for layer assignments.
+ "]]
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_ranking.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_ranking.lua
new file mode 100644
index 0000000000..c663d9ce36
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/layered/node_ranking.lua
@@ -0,0 +1,72 @@
+-- Copyright 2012 by Till Tantau
+--
+-- 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 information
+
+-- @release $Header$
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+---
+-- @section subsection {Layer Assignment (Node Ranking)}
+--
+-- Algorithms for producing layered drawings place nodes on discrete
+-- layers from top to bottom. Layer assignment is the problem of
+-- finding a partition so that for all edges $e = (u,v) \in E(G)$ the
+-- equation $\mathit{layer}(u) < \mathit{layer}(v)$ holds. Such a
+-- partition is called a \emph{layering}. This definition can be extended by
+-- introducing edge weights or priorities and minimum length
+-- constraints which has practical applications and allows users to
+-- fine-tune the results.
+--
+-- For more details, please see Section~4.1.2 of Pohlmann's Diploma
+-- thesis.
+--
+-- @end
+
+
+
+---
+
+declare {
+ key = "linear optimization layer assignment",
+ algorithm = require "pgf.gd.layered.NodeRankingGansnerKNV1993",
+ phase = "node ranking",
+ phase_default = true,
+
+ summary = [["
+ This layer assignment method, due to Gasner et al., is based on a
+ linear optimization problem.
+ "]],
+ documentation = [["
+ For more details, please see Section~4.1.2 of Pohlmann's Diploma
+ thesis.
+
+ This is the default algorithm for layer assignments.
+ "]]
+}
+
+
+
+---
+
+declare {
+ key = "minimum height layer assignment",
+ algorithm = "pgf.gd.layered.NodeRankingMinimumHeight",
+ phase = "node ranking",
+
+ summary = [["
+ This layer assignment method minimizes the height of the resulting graph.
+ "]],
+ documentation = [["
+ For more details, please see Section~4.1.3 of Pohlmann's Diploma thesis.
+ "]]
+}
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib.lua
new file mode 100644
index 0000000000..cc39ddd607
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib.lua
@@ -0,0 +1,435 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- Basic library functions
+
+local lib = {}
+
+-- Declare namespace
+
+require("pgf.gd").lib = lib
+
+
+-- General lib functions:
+
+
+---
+-- Finds the first value in the |array| for which |test| is true.
+--
+-- @param array An array to search in.
+-- @param test A function that is applied to each element of the
+-- array together with the index of the element and the
+-- whole table.
+--
+-- @return The value of the first value where the test is true.
+-- @return The index of the first value where the test is true.
+-- @return The function value of the first value where the test is
+-- true (only returned if test is a function).
+--
+function lib.find(array, test)
+ for i=1,#array do
+ local t = array[i]
+ local result = test(t,i,array)
+ if result then
+ return t,i,result
+ end
+ end
+end
+
+
+---
+-- Finds the first value in the |array| for which a function
+-- returns a minimal value
+--
+-- @param array An array to search in.
+-- @param f A function that is applied to each element of the
+-- array together with the index of the element and the
+-- whole table. It should return an integer and, possibly, a value.
+--
+-- Among all elements for which a non-nil integer is returned, let |i|
+-- by the index of the element where this integer is minimal.
+--
+-- @return |array[i]|
+-- @return |i|
+-- @return The return value(s) of the function at |array[i]|.
+--
+function lib.find_min(array, f)
+ local best = math.huge
+ local best_result
+ local best_index
+ for i=1,#array do
+ local t = array[i]
+ local result, p = f(t,i,array)
+ if result and p < best then
+ best = p
+ best_result = result
+ best_index = i
+ end
+ end
+ if best_index then
+ return array[best_index],best_index,best_result,best
+ end
+end
+
+
+
+
+---
+-- Copies a table while preserving its metatable.
+--
+-- @param source The table to copy.
+-- @param target The table to which values are to be copied or |nil| if a new
+-- table is to be allocated.
+--
+-- @return The |target| table or a newly allocated table containing all
+-- keys and values of the |source| table.
+--
+function lib.copy(source, target)
+ if not target then
+ target = {}
+ end
+ for key, val in pairs(source) do
+ target[key] = val
+ end
+ return setmetatable(target, getmetatable(source))
+end
+
+
+---
+-- Copies an array while preserving its metatable.
+--
+-- @param source The array to copy.
+-- @param target The array to which values are to be copied or |nil| if a new
+-- table is to be allocated. The elements of the
+-- |source| array will be added at the end.
+--
+-- @return The |target| table or a newly allocated table containing all
+-- keys and values of the |source| table.
+--
+function lib.icopy(source, target)
+ target = target or {}
+ for _, val in ipairs(source) do
+ target[#target+1] = val
+ end
+ return setmetatable(target, getmetatable(source))
+end
+
+
+
+
+---
+-- Apply a function to all pairs of a table, resulting in a new table.
+--
+-- @param source The table.
+-- @param fun A function taking two arguments (|val| and |key|, in
+-- that order). Should return two values (a |new_val| and a
+-- |new_key|). This pair will be inserted into the new table. If,
+-- however, |new_key| is |nil|, the |new_value| will be inserted at
+-- the position |key|. This means, in particular, that if the |fun|
+-- takes only a single argument and returns only a single argument,
+-- you have a ``classical'' value mapper. Also note that if
+-- |new_value| is |nil|, the value is removed from the table.
+--
+-- @return The new table.
+--
+function lib.map(source, fun)
+ local target = {}
+ for key, val in pairs(source) do
+ local new_val, new_key = fun(val, key)
+ if new_key == nil then
+ new_key = key
+ end
+ target[new_key] = new_val
+ end
+ return target
+end
+
+
+
+---
+-- Apply a function to all elements of an array, resulting in a new
+-- array.
+--
+-- @param source The array.
+-- @param fun A function taking two arguments (|val| and |i|, the
+-- current index). This function is applied to all elements of the
+-- array. The result of this function is placed at the end of a new
+-- array, expect when the function returns |nil|, in which case the
+-- element is skipped. If this function is not provided (is |nil|),
+-- the identity function is used.
+-- @param new The target array (if |nil|, a new array is create).
+-- %
+--\begin{codeexample}[code only]
+-- local a = lib.imap(array, function(v) if some_test(v) then return v end end)
+--\end{codeexample}
+--
+-- The above code is a filter that will remove all elements from the
+-- array that do not pass |some_test|.
+-- %
+--\begin{codeexample}[code only]
+-- lib.imap(a, lib.id, b)
+--\end{codeexample}
+--
+-- The above code has the same effect as |lib.icopy(a,b)|.
+--
+-- @return The new array
+--
+function lib.imap(source, fun, new)
+ if not new then
+ new = { }
+ end
+ for i, v in ipairs(source) do
+ new[#new+1] = fun(v, i)
+ end
+ return new
+end
+
+
+---
+-- Generate a random permutation of the numbers $1$ to $n$ in time
+-- $O(n)$. Knuth's shuffle is used for this.
+--
+-- @param n The desired size of the table
+-- @return A random permutation
+
+function lib.random_permutation(n)
+ local p = {}
+ for i=1,n do
+ p[i] = i
+ end
+ for i=1,n-1 do
+ local j = lib.random(i,n)
+ p[i], p[j] = p[i], p[j]
+ end
+ return p
+end
+
+
+---
+-- The identity function, so you can write |lib.id| instead of
+-- |function (x) return x end|.
+--
+
+function lib.id(...)
+ return ...
+end
+
+
+
+---
+-- Tries to find an option in different objects that have an
+-- options field.
+--
+-- This function iterates over all objects given as parameters. In
+-- each, it tries to find out whether the options field of the object
+-- contains the option |name| and, if so,
+-- returns the value. The important point is that checking whether the
+-- option table of an object contains the name field is done using
+-- |rawget| for all but the last parameter. This means that when you
+-- write
+-- %
+--\begin{codeexample}[code only]
+--lib.lookup_option("foo", vertex, graph)
+--\end{codeexample}
+-- %
+-- and if |/graph drawing/foo| has an initial value set, if the
+-- parameter is not explicitly set in a vertex, you will get the value
+-- set for the graph or, if it is not set there either, the initial
+-- value. In contrast, if you write
+-- %
+--\begin{codeexample}[code only]
+-- vertex.options["foo"] or graph.options["foo"]
+--\end{codeexample}
+-- %
+-- what happens is that the first access to |.options| will
+-- \emph{always} return something when an initial parameter has been
+-- set for the option |foo|.
+--
+-- @param name The name of the options
+-- @param ... Any number of objects. Each must have an options
+-- field.
+--
+-- @return The found option
+
+function lib.lookup_option(name, ...)
+ local list = {...}
+ for i=1,#list-1 do
+ local o = list[i].options
+ if o then
+ local v = rawget(o, name)
+ if v then
+ return v
+ end
+ end
+ end
+ return list[#list].options[name]
+end
+
+
+
+---
+-- Turns a table |t| into a class in the sense of object oriented
+-- programming. In detail, this means that |t| is augmented by
+-- a |new| function, which takes an optional table of |initial| values
+-- and which outputs a new table whose metatable is the
+-- class. The |new| function will call the function |constructor| if
+-- it exists. Furthermore, the class object's |__index| is set to itself
+-- and its meta table is set to the |base_class| field of the
+-- table. If |t| is |nil|, a new table is created.
+--
+-- Here is a typical usage of this function:
+-- %
+--\begin{codeexample}[code only]
+--local Point = lib.class {}
+--
+--function Point:length()
+-- return math.sqrt(self.x*self.x + self.y*self.y)
+--end
+--
+--local p = Point.new { x = 5, y = 6 }
+--
+--print(p:length())
+--\end{codeexample}
+-- %
+-- We can subclass this as follows:
+-- %
+--\begin{codeexample}[code only]
+--local Point3D = lib.class { base_class = Point }
+--
+--function Point3D:length()
+-- local l = Point.length(self) -- Call base class's function
+-- return math.sqrt(l*l + self.z*self.zdy)
+--end
+--
+--local p = Point3D.new { x = 5, y = 6, z = 6 }
+--
+--print(p:length())
+--\end{codeexample}
+--
+-- @param t A table that gets augmented to a class. If |nil|, a new
+-- table is created.
+-- @return The augmented table.
+
+function lib.class(t)
+ t = t or {}
+
+ -- First, setup indexing, if necessary
+ if not t.__index then
+ t.__index = t
+ end
+
+ -- Second, setup new method, if necessary
+ t.new = t.new or
+ function (initial)
+
+ -- Create new object
+ local obj = {}
+ for k,v in pairs(initial or {}) do
+ obj[k] = v
+ end
+ setmetatable(obj, t)
+
+ if obj.constructor then
+ obj:constructor()
+ end
+
+ return obj
+ end
+
+ -- Third, setup inheritance, if necessary
+ if not getmetatable(t) then
+ setmetatable(t, t.base_class)
+ end
+
+ return t
+end
+
+
+
+---
+-- Returns a method that is loaded only on demand for a class.
+--
+-- The idea behind this function is that you may have a class (or just
+-- a table) for which some methods are needed only seldomly. In this
+-- case, you can put these methods in a separate file and then use
+-- |ondemand| to indicate that the methods are found in a
+-- another file.
+-- %
+--\begin{codeexample}[code only]
+-- -- File Foo.lua
+-- local Foo = {}
+-- function Foo.bar () ... end
+-- function Foo.bar2 () ... end
+-- Foo.bar3 = lib.ondemand("Foo_extra", Foo, "bar3")
+-- Foo.bar4 = lib.ondemand("Foo_extra", Foo, "bar4")
+--
+-- return Foo
+--
+-- -- Foo_extra.lua
+-- local Foo = require "Foo"
+-- function Foo.bar3 () ... end
+-- function Foo.bar4 () ... end
+--\end{codeexample}
+--
+-- @param filename The name of the file when extra methods are
+-- located.
+-- @param table The table for which the missing functions should be
+-- loaded when they are accessed.
+-- @param method The name of the method.
+--
+-- @return A function that, when called, loads the filename using
+-- |require| and, then, forwards the call to the method.
+
+function lib.ondemand(filename, table, name)
+ return function(...)
+ require (filename)
+ return table[name] (...)
+ end
+end
+
+
+
+---
+-- This implements the a random number generator similar to the one
+-- provided by Lua, but based on the tex.uniformdeviate primitive to
+-- avoid differences in random numbers due to platform specifics.
+--
+-- @param l Lower bound
+-- @param u Upper bound
+-- @return A random number
+function lib.random(l,u)
+ local fraction_one = 268435456
+ local r = tex.uniform_rand(fraction_one)/fraction_one
+ if l and u then
+ assert(l <= u)
+ return math.floor(r*(u-l+1)) + l
+ elseif l then
+ assert(1.0 <= l)
+ return math.floor(r*l) + 1.0
+ else
+ return r
+ end
+end
+
+---
+-- Provide the seed for the random number generator
+--
+-- @param seed random seed
+function lib.randomseed(seed)
+ tex.init_rand(seed)
+end
+
+-- Done
+
+return lib
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Bezier.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Bezier.lua
new file mode 100644
index 0000000000..e4fe21d942
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Bezier.lua
@@ -0,0 +1,160 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This library offers a number of methods for working with Bezi\'er
+-- curves.
+
+local Bezier = {}
+
+-- Namespace
+require("pgf.gd.lib").Bezier = Bezier
+
+
+-- Imports
+
+local Coordinate = require 'pgf.gd.model.Coordinate'
+
+
+---
+-- Compute a point ``along a curve at a time''. You provide the four
+-- coordinates of the curve and a time. You get a point on the curve
+-- as return value as well as the two support vector for curve
+-- before this point and two support vectors for the curve after the
+-- point.
+--
+-- For speed reasons and in order to avoid superfluous creation of
+-- lots of tables, all values are provided and returned as pairs of
+-- values rather than as |Coordinate| objects.
+--
+-- @param ax The coordinate where the curve starts.
+-- @param ay
+-- @param bx The first support point.
+-- @param by
+-- @param cx The second support point.
+-- @param cy
+-- @param dx The coordinate where the curve ends.
+-- @param dy
+-- @param t A time (a number).
+--
+-- @return The point |p| on the curve at time |t| ($x$-part).
+-- @return The point |p| on the curve at time |t| ($y$-part).
+-- @return The first support point of the curve between |a| and |p| ($x$-part).
+-- @return The first support point of the curve between |a| and |p| ($y$-part).
+-- @return The second support point of the curve between |a| and |p| ($x$-part).
+-- @return The second support point of the curve between |a| and |p| ($y$-part).
+-- @return The first support point of the curve between |p| and |d| ($x$-part).
+-- @return The first support point of the curve between |p| and |d| ($y$-part).
+-- @return The second support point of the curve between |p| and |d| ($x$-part).
+-- @return The second support point of the curve between |p| and |d| ($y$-part).
+
+function Bezier.atTime(ax,ay,bx,by,cx,cy,dx,dy,t)
+
+ local s = 1-t
+
+ local ex, ey = ax*s + bx*t, ay*s + by*t
+ local fx, fy = bx*s + cx*t, by*s + cy*t
+ local gx, gy = cx*s + dx*t, cy*s + dy*t
+
+ local hx, hy = ex*s + fx*t, ey*s + fy*t
+ local ix, iy = fx*s + gx*t, fy*s + gy*t
+
+ local jx, jy = hx*s + ix*t, hy*s + iy*t
+
+ return jx, jy, ex, ey, hx, hy, ix, iy, gx, gy
+end
+
+
+---
+-- The ``coordinate version'' of the |atTime| function, where both the
+-- parameters and the return values are coordinate objects.
+
+function Bezier.atTimeCoordinates(a,b,c,d,t)
+ local jx, jy, ex, ey, hx, hy, ix, iy, gx, gy =
+ Bezier.atTime(a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y,t)
+
+ return
+ Coordinate.new(jx, jy),
+ Coordinate.new(ex, ey),
+ Coordinate.new(hx, hy),
+ Coordinate.new(ix, iy),
+ Coordinate.new(gx, gy)
+end
+
+
+---
+-- Computes the support points of a Bezier curve based on two points
+-- on the curves at certain times.
+--
+-- @param from The start point of the curve
+-- @param p1 A first point on the curve
+-- @param t1 A time when this point should be reached
+-- @param p2 A second point of the curve
+-- @param t2 A time when this second point should be reached
+-- @param to The end of the curve
+--
+-- @return sup1 A first support point of the curve
+-- @return sup2 A second support point of the curve
+
+function Bezier.supportsForPointsAtTime(from, p1, t1, p2, t2, to)
+
+ local s1 = 1 - t1
+ local s2 = 1 - t2
+
+ local f1a = s1^3
+ local f1b = t1 * s1^2 * 3
+ local f1c = t1^2 * s1 * 3
+ local f1d = t1^3
+
+ local f2a = s2^3
+ local f2b = t2 * s2^2 * 3
+ local f2c = t2^2 * s2 * 3
+ local f2d = t2^3
+
+ -- The system:
+ -- p1.x - from.x * f1a - to.x * f1d = sup1.x * f1b + sup2.x * f1c
+ -- p2.x - from.x * f2a - to.x * f2d = sup1.x * f2b + sup2.x * f2c
+ --
+ -- p1.y - from.y * f1a - to.y * f1d = sup1.y * f1b + sup2.y * f1c
+ -- p2.y - from.y * f2a - to.y * f2d = sup1.y * f2b + sup2.y * f2c
+
+ local a = f1b
+ local b = f1c
+ local c = p1.x - from.x * f1a - to.x * f1d
+ local d = f2b
+ local e = f2c
+ local f = p2.x - from.x * f2a - to.x * f2d
+
+ local det = a*e - b*d
+ local x1 = -(b*f - e*c)/det
+ local x2 = -(c*d - a*f)/det
+
+ local c = p1.y - from.y * f1a - to.y * f1d
+ local f = p2.y - from.y * f2a - to.y * f2d
+
+ local det = a*e - b*d
+ local y1 = -(b*f - e*c)/det
+ local y2 = -(c*d - a*f)/det
+
+ return Coordinate.new(x1,y1), Coordinate.new(x2,y2)
+
+end
+
+
+
+
+
+
+-- Done
+
+return Bezier \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/DepthFirstSearch.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/DepthFirstSearch.lua
new file mode 100644
index 0000000000..564b8f6839
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/DepthFirstSearch.lua
@@ -0,0 +1,125 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- The DepthFirstSearch class implements a generic depth first function. It does not
+-- require that it is run on graphs, but can be used for anything where a visit function and
+-- a complete function is available.
+
+local DepthFirstSearch = {}
+DepthFirstSearch.__index = DepthFirstSearch
+
+-- Namespace
+require("pgf.gd.lib").DepthFirstSearch = DepthFirstSearch
+
+-- Imports
+local Stack = require "pgf.gd.lib.Stack"
+
+
+
+-- TT: TODO Jannis: Please document...
+
+function DepthFirstSearch.new(init_func, visit_func, complete_func)
+ local dfs = {
+ init_func = init_func,
+ visit_func = visit_func,
+ complete_func = complete_func,
+
+ stack = Stack.new(),
+ discovered = {},
+ visited = {},
+ completed = {},
+ }
+ setmetatable(dfs, DepthFirstSearch)
+ return dfs
+end
+
+
+
+function DepthFirstSearch:run()
+ self:reset()
+ self.init_func(self)
+
+ while self.stack:getSize() > 0 do
+ local data = self.stack:peek()
+
+ if not self:getVisited(data) then
+ if self.visit_func then
+ self.visit_func(self, data)
+ end
+ else
+ if self.complete_func then
+ self.complete_func(self, data)
+ end
+ self:setCompleted(data, true)
+ self.stack:pop()
+ end
+ end
+end
+
+
+
+function DepthFirstSearch:reset()
+ self.discovered = {}
+ self.visited = {}
+ self.completed = {}
+ self.stack = Stack.new()
+end
+
+
+
+function DepthFirstSearch:setDiscovered(data, discovered)
+ self.discovered[data] = discovered
+end
+
+
+
+function DepthFirstSearch:getDiscovered(data)
+ return self.discovered[data]
+end
+
+
+
+function DepthFirstSearch:setVisited(data, visited)
+ self.visited[data] = visited
+end
+
+
+
+function DepthFirstSearch:getVisited(data)
+ return self.visited[data]
+end
+
+
+
+function DepthFirstSearch:setCompleted(data, completed)
+ self.completed[data] = completed
+end
+
+
+
+function DepthFirstSearch:getCompleted(data)
+ return self.completed[data]
+end
+
+
+
+function DepthFirstSearch:push(data)
+ self.stack:push(data)
+end
+
+
+
+-- Done
+
+return DepthFirstSearch \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Direct.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Direct.lua
new file mode 100644
index 0000000000..81728a1a44
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Direct.lua
@@ -0,0 +1,95 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- Direct is a class that collects algorithms for computing new
+-- versions of a graph where arcs point in certain directions.
+
+local Direct = {}
+
+-- Namespace
+require("pgf.gd.lib").Direct = Direct
+
+-- Imports
+local Digraph = require "pgf.gd.model.Digraph"
+
+
+--- Compute a digraph from a syntactic digraph.
+--
+-- This function takes a syntactic digraph and compute a new digraph
+-- where all arrow point in the "semantic direction" of the syntactic
+-- arrows. For instance, while "a <- b" will cause an arc from a to be
+-- to be added to the syntactic digraph, calling this function will
+-- return a digraph in which there is an arc from b to a rather than
+-- the other way round. In detail, "a <- b" is translated as just
+-- described, "a -> b" yields an arc from a to b as expected, "a <-> b"
+-- and "a -- b" yield arcs in both directions and, finally, "a -!- b"
+-- yields no arc at all.
+--
+-- @param syntactic_digraph A syntactic digraph, usually the "input"
+-- graph as specified syntactically be the user.
+--
+-- @return A new "semantic" digraph object.
+
+function Direct.digraphFromSyntacticDigraph(syntactic_digraph)
+ local digraph = Digraph.new(syntactic_digraph) -- copy
+
+ -- Now go over all arcs of the syntactic_digraph and turn them into
+ -- arcs with the correct direction in the digraph:
+ for _,a in ipairs(syntactic_digraph.arcs) do
+ for _,m in ipairs(a.syntactic_edges) do
+ local direction = m.direction
+ if direction == "->" then
+ digraph:connect(a.tail, a.head)
+ elseif direction == "<-" then
+ digraph:connect(a.head, a.tail)
+ elseif direction == "--" or direction == "<->" then
+ digraph:connect(a.tail, a.head)
+ digraph:connect(a.head, a.tail)
+ end
+ -- Case -!-: No edges...
+ end
+ end
+
+ return digraph
+end
+
+
+--- Turn an arbitrary graph into a directed graph
+--
+-- Takes a digraph as input and returns its underlying undirected
+-- graph, coded as a digraph. This means that between any two vertices
+-- if there is an arc in one direction, there is also one in the other.
+--
+-- @param digraph A directed graph
+--
+-- @return The underlying undirected graph of digraph.
+
+function Direct.ugraphFromDigraph(digraph)
+ local ugraph = Digraph.new(digraph)
+
+ -- Now go over all arcs of the syntactic_digraph and turn them into
+ -- arcs with the correct direction in the digraph:
+ for _,a in ipairs(digraph.arcs) do
+ ugraph:connect(a.head,a.tail)
+ ugraph:connect(a.tail,a.head)
+ end
+
+ return ugraph
+end
+
+
+
+
+-- Done
+
+return Direct
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Event.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Event.lua
new file mode 100644
index 0000000000..880796ce97
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Event.lua
@@ -0,0 +1,98 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- Events are used to communicate ``interesting'' events from the
+-- parser to the graph drawing algorithms.
+--
+-- As a syntactic description of some graph is being parsed, vertices,
+-- arcs, and a digraph object representing this graph get
+-- constructed. However, even though syntactic annotations such as
+-- options for the vertices and arcs are attached to them and can be
+-- accessed through the graph objects, some syntactic information is
+-- neither represented in the digraph object nor in the vertices and
+-- the arcs. A typical example is a ``missing'' node in a tree: Since
+-- it is missing, there is neither a vertex object nor arc objects
+-- representing it. It is also not a global option of the graph.
+--
+-- For these reasons, in addition to the digraph object itself,
+-- additional information can be passed by a parser to graph drawing
+-- algorithms through the means of events. Each |Event| consists of a
+-- |kind| field, which is just some string, and a |parameters| field,
+-- which stores additional, kind-specific information. As a graph is
+-- being parsed, a string of events is accumulated and is later on
+-- available through the |events| field of the graph drawing scope.
+--
+-- The following events are created during the parsing process by the
+-- standard parsers of \tikzname:
+-- %
+-- \begin{itemize}
+-- \item[|node|] When a node of the input graph has been parsed and
+-- a |Vertex| object has been created for it, an event with kind
+-- |node| is created. The |parameter| of this event is the
+-- just-created vertex.
+--
+-- The same kind of event is used to indicate ``missing'' nodes. In
+-- this case, the |parameters| field is |nil|.
+-- \item[|edge|] When an edge of the input graph has been parsed, an
+-- event is created of kind |edge|. The |parameters| field will store
+-- an array with two entries: The first is the |Arc| object whose
+-- |syntactic_edges| field stores the |edge|. The second is the index
+-- of the edge inside the |syntactic_edges| field.
+-- \item[|begin|]
+-- Signals the beginning of a group, which will be ended with a
+-- corresponding |end| event later on. The |parameters| field will
+-- indicate the kind of group. Currently, only the string
+-- |"descendants"| is used as |parameters|, indicating the start of
+-- several nodes that are descendants of a given node. This
+-- information can be used by algorithms for reconstructing the
+-- input structure of trees.
+-- \item[|end|] Signals the end of a group begun by a |begin| event
+-- earlier on.
+-- \end{itemize}
+--
+-- @field kind A string representing the kind of the events.
+-- @field parameters Kind-specific parameters.
+-- @field index A number that stores the events logical position in
+-- the sequence of events. The number need not be an integer array
+-- index.
+--
+local Event = {}
+Event.__index = Event
+
+
+-- Namespace
+require("pgf.gd.lib").Event = Event
+
+
+
+---
+-- Create a new event object
+--
+-- @param initial Initial fields of the new event.
+--
+-- @return The new object
+
+function Event.new(values)
+ local new = {}
+ for k,v in pairs(values) do
+ new[k] = v
+ end
+ return setmetatable(new, Event)
+end
+
+
+
+-- done
+
+return Event \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/LookupTable.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/LookupTable.lua
new file mode 100644
index 0000000000..fc2043d523
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/LookupTable.lua
@@ -0,0 +1,111 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This table provides two utility functions for managing ``lookup
+-- tables''. Such a table is a mixture of an array and a hashtable:
+-- It stores (only) tables. Each table is stored once in a normal
+-- array position. Additionally, the lookup table is also indexed at
+-- the position of the table (used as a key) and this position is set
+-- to |true|. This means that you can test whether a table |t| is in the
+-- lookup table |l| simply by testing whether |l[t]| is true.
+--
+local LookupTable = {}
+
+-- Namespace
+require("pgf.gd.lib").LookupTable = LookupTable
+
+
+
+---
+-- Add all elements in the |array| to a lookup table. If an element of
+-- the array is already present in the table, it will not be added
+-- again.
+--
+-- This operation takes time $O(|\verb!array!|)$.
+--
+-- @param l Lookup table
+-- @param array An array of to-be-added tables.
+
+function LookupTable.add(l, array)
+ for i=1,#array do
+ local t = array[i]
+ if not l[t] then
+ l[t] = true
+ l[#l + 1] = t
+ end
+ end
+end
+
+
+---
+-- Add one element to a lookup table. If it is already present in the
+-- table, it will not be added again.
+--
+-- This operation takes time $O(1)$.
+--
+-- @param l Lookup table
+-- @param e The to-be-added element.
+
+function LookupTable.addOne(l, e)
+ if not l[e] then
+ l[e] = true
+ l[#l + 1] = e
+ end
+end
+
+
+---
+-- Remove tables from a lookup table.
+--
+-- Note that this operation is pretty expensive insofar as it will
+-- always cost a traversal of the whole lookup table. However, this is
+-- also the maximum cost, even when a lot of entries need to be
+-- deleted. Thus, it is much better to ``pool'' multiple remove
+-- operations in a single one.
+--
+-- This operation takes time $O(\max\{|\verb!array!|, |\verb!l!|\})$.
+--
+-- @param l Lookup table
+-- @param t An array of to-be-removed tables.
+
+function LookupTable.remove(l, array)
+ -- Step 1: Mark all to-be-deleted entries
+ for i=1,#array do
+ local t = array[i]
+ if l[t] then
+ l[t] = false
+ end
+ end
+
+ -- Step 2: Collect garbage...
+ local target = 1
+ for i=1,#l do
+ local t = l[i]
+ if l[t] == false then
+ l[t] = nil
+ else
+ l[target] = t
+ target = target + 1
+ end
+ end
+ for i=#l,target,-1 do
+ l[i] = nil
+ end
+end
+
+
+
+-- Done
+
+return LookupTable \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PathLengths.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PathLengths.lua
new file mode 100644
index 0000000000..4bfa896ef9
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PathLengths.lua
@@ -0,0 +1,209 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This table provides algorithms for computing distances between
+-- nodes of a graph (in the sense of path lengths).
+
+local PathLengths = {}
+
+-- Namespace
+require("pgf.gd.lib").PathLengths = PathLengths
+
+-- Import
+local PriorityQueue = require "pgf.gd.lib.PriorityQueue"
+
+
+
+---
+-- Performs the Dijkstra algorithm to solve the single-source shortest path problem.
+--
+-- The algorithm computes the shortest paths from |source| to all nodes
+-- in the graph. It also generates a table with distance level sets, each of
+-- which contain all nodes that have the same corresponding distance to
+-- |source|. Finally, a mapping of nodes to their parents along the
+-- shortest paths is generated to allow the reconstruction of the paths
+-- that were chosen by the Dijkstra algorithm.
+--
+-- @param graph The graph to compute the shortest paths for.
+-- @param source The node to compute the distances to.
+--
+-- @return A mapping of nodes to their distance to |source|.
+-- @return An array of distance level sets. The set at index |i| contains
+-- all nodes that have a distance of |i| to |source|.
+-- @return A mapping of nodes to their parents to allow the reconstruction
+-- of the shortest paths chosen by the Dijkstra algorithm.
+--
+function PathLengths.dijkstra(graph, source)
+ local distance = {}
+ local levels = {}
+ local parent = {}
+
+ local queue = PriorityQueue.new()
+
+ -- reset the distance of all nodes and insert them into the priority queue
+ for _,node in ipairs(graph.nodes) do
+ if node == source then
+ distance[node] = 0
+ parent[node] = nil
+ queue:enqueue(node, distance[node])
+ else
+ distance[node] = #graph.nodes + 1 -- this is about infinity ;)
+ queue:enqueue(node, distance[node])
+ end
+ end
+
+ while not queue:isEmpty() do
+ local u = queue:dequeue()
+
+ assert(distance[u] < #graph.nodes + 1, 'the graph is not connected, Dijkstra will not work')
+
+ if distance[u] > 0 then
+ levels[distance[u]] = levels[distance[u]] or {}
+ table.insert(levels[distance[u]], u)
+ end
+
+ for _,edge in ipairs(u.edges) do
+ local v = edge:getNeighbour(u)
+ local alternative = distance[u] + 1
+ if alternative < distance[v] then
+ distance[v] = alternative
+
+ parent[v] = u
+
+ -- update the priority of v
+ queue:updatePriority(v, distance[v])
+ end
+ end
+ end
+
+ return distance, levels, parent
+end
+
+
+
+
+---
+-- Performs the Floyd-Warshall algorithm to solve the all-source shortest path problem.
+--
+-- @param graph The graph to compute the shortest paths for.
+--
+-- @return A distance matrix
+--
+function PathLengths.floydWarshall(graph)
+ local distance = {}
+ local infinity = math.huge
+
+ for _,i in ipairs(graph.nodes) do
+ distance[i] = {}
+ for _,j in ipairs(graph.nodes) do
+ distance[i][j] = infinity
+ end
+ end
+
+ for _,i in ipairs(graph.nodes) do
+ for _,edge in ipairs(i.edges) do
+ local j = edge:getNeighbour(i)
+ distance[i][j] = edge.weight or 1
+ end
+ end
+
+ for _,k in ipairs(graph.nodes) do
+ for _,i in ipairs(graph.nodes) do
+ for _,j in ipairs(graph.nodes) do
+ distance[i][j] = math.min(distance[i][j], distance[i][k] + distance[k][j])
+ end
+ end
+ end
+
+ return distance
+end
+
+
+
+
+---
+-- Computes the pseudo diameter of a graph.
+--
+-- The diameter of a graph is the maximum of the shortest paths between
+-- any pair of nodes in the graph. A pseudo diameter is an approximation
+-- of the diameter that is computed by picking a starting node |u| and
+-- finding a node |v| that is farthest away from |u| and has the smallest
+-- degree of all nodes that have the same distance to |u|. The algorithm
+-- continues with |v| as the new starting node and iteratively tries
+-- to find an end node that is generates a larger pseudo diameter.
+-- It terminates as soon as no such end node can be found.
+--
+-- @param graph The graph.
+--
+-- @return The pseudo diameter of the graph.
+-- @return The start node of the corresponding approximation of a maximum
+-- shortest path.
+-- @return The end node of that path.
+--
+function PathLengths.pseudoDiameter(graph)
+
+ -- find a node with minimum degree
+ local start_node = graph.nodes[1]
+ for _,node in ipairs(graph.nodes) do
+ if node:getDegree() < start_node:getDegree() then
+ start_node = node
+ end
+ end
+
+ assert(start_node)
+
+ local old_diameter = 0
+ local diameter = 0
+ local end_node = nil
+
+ while true do
+ local distance, levels = PathLengths.dijkstra(graph, start_node)
+
+ -- the number of levels is the same as the distance of the nodes
+ -- in the last level to the start node
+ old_diameter = diameter
+ diameter = #levels
+
+ -- abort if the diameter could not be improved
+ if diameter == old_diameter then
+ end_node = levels[#levels][1]
+ break
+ end
+
+ -- select the node with the smallest degree from the last level as
+ -- the start node for the next iteration
+ start_node = levels[#levels][1]
+ for _,node in ipairs(levels[#levels]) do
+ if node:getDegree() < start_node:getDegree() then
+ start_node = node
+ end
+ end
+
+ assert(start_node)
+ end
+
+ assert(start_node)
+ assert(end_node)
+
+ return diameter, start_node, end_node
+end
+
+
+
+
+
+-- Done
+
+return PathLengths \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PriorityQueue.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PriorityQueue.lua
new file mode 100644
index 0000000000..3fd29cdb74
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/PriorityQueue.lua
@@ -0,0 +1,342 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- A PriorityQueue supports operations for quickly finding the minimum from a set of elements
+--
+-- Its implementation is based on (simplified) Fibonacci heaps.
+local PriorityQueue = {}
+PriorityQueue.__index = PriorityQueue
+
+
+-- Namespace
+local lib = require "pgf.gd.lib"
+lib.PriorityQueue = PriorityQueue
+
+
+
+-- Local declarations
+local FibonacciHeap = {}
+local FibonacciHeapNode = {}
+
+
+
+
+--- Creates a new priority queue
+--
+-- @return The newly created queue
+
+function PriorityQueue.new()
+ local queue = {
+ heap = FibonacciHeap.new(),
+ nodes = {},
+ values = {},
+ }
+ setmetatable(queue, PriorityQueue)
+ return queue
+end
+
+
+
+--- Add an element with a certain priority to the queue
+--
+-- @param value An object
+-- @param priority Its priority
+
+function PriorityQueue:enqueue(value, priority)
+ local node = self.heap:insert(priority)
+ self.nodes[value] = node
+ self.values[node] = value
+end
+
+
+
+--- Removes the element with the minimum priority from the queue
+--
+-- @return The element with the minimum priority
+
+function PriorityQueue:dequeue()
+ local node = self.heap:extractMinimum()
+
+ if node then
+ local value = self.values[node]
+ self.nodes[value] = nil
+ self.values[node] = nil
+ return value
+ else
+ return nil
+ end
+end
+
+
+
+--- Lower the priority of an element of a queue
+--
+-- @param value An object
+-- @param priority A new priority, which must be lower than the old priority
+
+function PriorityQueue:updatePriority(value, priority)
+ local node = self.nodes[value]
+ assert(node, 'updating the priority of ' .. tostring(value) .. ' failed because it is not in the priority queue')
+ self.heap:updateValue(node, priority)
+end
+
+
+
+--- Tests, whether the queue is empty
+--
+-- @return True, if the queue is empty
+
+function PriorityQueue:isEmpty()
+ return #self.heap.trees == 0
+end
+
+
+
+
+
+
+-- Internals: An implementation of Fibonacci heaps.
+FibonacciHeap.__index = FibonacciHeap
+
+
+function FibonacciHeap.new()
+ local heap = {
+ trees = trees or {},
+ minimum = nil,
+ }
+ setmetatable(heap, FibonacciHeap)
+ return heap
+end
+
+
+
+function FibonacciHeap:insert(value)
+ local node = FibonacciHeapNode.new(value)
+ local heap = FibonacciHeap.new()
+ table.insert(heap.trees, node)
+ self:merge(heap)
+ return node
+end
+
+
+
+function FibonacciHeap:merge(other)
+ for _, tree in ipairs(other.trees) do
+ table.insert(self.trees, tree)
+ end
+ self:updateMinimum()
+end
+
+
+
+function FibonacciHeap:extractMinimum()
+ if self.minimum then
+ local minimum = self:removeTableElement(self.trees, self.minimum)
+
+ for _, child in ipairs(minimum.children) do
+ child.root = child
+ table.insert(self.trees, child)
+ end
+
+ local same_degrees_found = true
+ while same_degrees_found do
+ same_degrees_found = false
+
+ local degrees = {}
+
+ for _, root in ipairs(self.trees) do
+ local degree = root:getDegree()
+
+ if degrees[degree] then
+ if root.value < degrees[degree].value then
+ self:linkRoots(root, degrees[degree])
+ else
+ self:linkRoots(degrees[degree], root)
+ end
+
+ degrees[degree] = nil
+ same_degrees_found = true
+ break
+ else
+ degrees[degree] = root
+ end
+ end
+ end
+
+ self:updateMinimum()
+
+ return minimum
+ end
+end
+
+
+
+function FibonacciHeap:updateValue(node, value)
+ local old_value = node.value
+ local new_value = value
+
+ if new_value <= old_value then
+ self:decreaseValue(node, value)
+ else
+ assert(false, 'FibonacciHeap:increaseValue is not implemented yet')
+ end
+end
+
+
+
+function FibonacciHeap:decreaseValue(node, value)
+ assert(value <= node.value)
+
+ node.value = value
+
+ if node.value < node.parent.value then
+ local parent = node.parent
+ self:cutFromParent(node)
+
+ if not parent:isRoot() then
+ if parent.marked then
+ self:cutFromParent(parent)
+ else
+ parent.marked = true
+ end
+ end
+ end
+
+ if node.value < self.minimum.value then
+ self.minimum = node
+ end
+end
+
+
+
+function FibonacciHeap:delete(node)
+ self:decreaseValue(node, -math.huge)
+ self:extractMinimum()
+end
+
+
+
+function FibonacciHeap:linkRoots(root, child)
+ child.root = root
+ child.parent = root
+
+ child = self:removeTableElement(self.trees, child)
+ table.insert(root.children, child)
+
+ return root
+end
+
+
+
+function FibonacciHeap:cutFromParent(node)
+ local parent = node.parent
+
+ node.root = node
+ node.parent = node
+ node.marked = false
+
+ node = self:removeTableElement(parent.children, node)
+ table.insert(self.trees, node)
+end
+
+
+
+function FibonacciHeap:updateMinimum()
+ self.minimum = self.trees[1]
+
+ for _, root in ipairs(self.trees) do
+ if root.value < self.minimum.value then
+ self.minimum = root
+ end
+ end
+end
+
+
+
+function FibonacciHeap:removeTableElement(input_table, element)
+ for i = 1, #input_table do
+ if input_table[i] == element then
+ return table.remove(input_table, i)
+ end
+ end
+end
+
+
+
+
+-- Now come the nodes
+
+FibonacciHeapNode.__index = FibonacciHeapNode
+
+function FibonacciHeapNode.new(value, root, parent)
+ local node = {
+ value = value,
+ children = {},
+ marked = false,
+ root = nil,
+ parent = nil,
+ }
+ setmetatable(node, FibonacciHeapNode)
+
+ if root then
+ node.root = root
+ node.parent = parent
+ else
+ node.root = node
+ node.parent = node
+ end
+
+ return node
+end
+
+function FibonacciHeapNode:addChild(value)
+ local child = FibonacciHeapNode.new(value, self.root, self)
+ table.insert(self.children, child)
+end
+
+function FibonacciHeapNode:getDegree()
+ return #self.children
+end
+
+
+
+function FibonacciHeapNode:setRoot(root)
+ self.root = root
+
+ if root == self then
+ self.parent = root
+ end
+
+ if #self.children > 0 then
+ for _, child in ipairs(self.children) do
+ child.root = root
+ end
+ end
+end
+
+
+
+function FibonacciHeapNode:isRoot()
+ return self.root == self
+end
+
+
+
+
+
+
+-- done
+
+return PriorityQueue \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Simplifiers.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Simplifiers.lua
new file mode 100644
index 0000000000..bcb7276190
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Simplifiers.lua
@@ -0,0 +1,279 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+--- The Simplifiers class is a singleton object.
+-- Its methods allow implement methods for simplifying graphs, for instance
+-- for removing loops or multiedges or computing spanning trees.
+
+local Simplifiers = {}
+
+-- Namespace
+local lib = require "pgf.gd.lib"
+lib.Simplifiers = Simplifiers
+
+
+
+
+-- Imports
+
+local Edge = require "pgf.gd.deprecated.Edge"
+local Node = require "pgf.gd.deprecated.Node"
+
+
+
+
+
+--- Algorithm to classify edges of a DFS search tree.
+--
+-- TODO Jannis: document this algorithm as soon as it is completed and bug-free.
+-- TT: Replace this algorithm by something else, perhaps?
+--
+function Simplifiers:classifyEdges(graph)
+ local discovered = {}
+ local visited = {}
+ local recursed = {}
+ local completed = {}
+
+ local tree_and_forward_edges = {}
+ local cross_edges = {}
+ local back_edges = {}
+
+ local stack = {}
+
+ local function push(node)
+ table.insert(stack, node)
+ end
+
+ local function peek()
+ return stack[#stack]
+ end
+
+ local function pop()
+ return table.remove(stack)
+ end
+
+ local initial_nodes = graph.nodes
+
+ for i=#initial_nodes,1,-1 do
+ local node = initial_nodes[i]
+ push(node)
+ discovered[node] = true
+ end
+
+ while #stack > 0 do
+ local node = peek()
+ local edges_to_traverse = {}
+
+ visited[node] = true
+
+ if not recursed[node] then
+ recursed[node] = true
+
+ local out_edges = node:getOutgoingEdges()
+ for _,edge in ipairs(out_edges) do
+ local neighbour = edge:getNeighbour(node)
+
+ if not discovered[neighbour] then
+ table.insert(tree_and_forward_edges, edge)
+ table.insert(edges_to_traverse, edge)
+ else
+ if not completed[neighbour] then
+ if not visited[neighbour] then
+ table.insert(tree_and_forward_edges, edge)
+ table.insert(edges_to_traverse, edge)
+ else
+ table.insert(back_edges, edge)
+ end
+ else
+ table.insert(cross_edges, edge)
+ end
+ end
+ end
+
+ if #edges_to_traverse == 0 then
+ completed[node] = true
+ pop()
+ else
+ for i=#edges_to_traverse,1,-1 do
+ local neighbour = edges_to_traverse[i]:getNeighbour(node)
+ discovered[neighbour] = true
+ push(neighbour)
+ end
+ end
+ else
+ completed[node] = true
+ pop()
+ end
+ end
+
+ return tree_and_forward_edges, cross_edges, back_edges
+end
+
+
+
+
+
+--
+--
+-- Loops and Multiedges
+--
+--
+
+
+--- Remove all loops from a graph
+--
+-- This method will remove all loops from a graph.
+--
+-- @param algorithm An algorithm object
+
+function Simplifiers:removeLoopsOldModel(algorithm)
+ local graph = algorithm.graph
+ local loops = {}
+
+ for _,edge in ipairs(graph.edges) do
+ if edge:getHead() == edge:getTail() then
+ loops[#loops+1] = edge
+ end
+ end
+
+ for i=1,#loops do
+ graph:deleteEdge(loops[i])
+ end
+
+ graph[algorithm].loops = loops
+end
+
+
+
+--- Restore loops that were previously removed.
+--
+-- @param algorithm An algorithm object
+
+function Simplifiers:restoreLoopsOldModel(algorithm)
+ local graph = algorithm.graph
+
+ for _,edge in ipairs(graph[algorithm].loops) do
+ graph:addEdge(edge)
+ edge:getTail():addEdge(edge)
+ end
+
+ graph[algorithm].loops = nil
+end
+
+
+
+
+--- Remove all multiedges.
+--
+-- Every multiedge of the graph will be replaced by a single edge.
+--
+-- @param algorithm An algorithm object
+
+function Simplifiers:collapseMultiedgesOldModel(algorithm, collapse_action)
+ local graph = algorithm.graph
+ local collapsed_edges = {}
+ local node_processed = {}
+
+ for _,node in ipairs(graph.nodes) do
+ node_processed[node] = true
+
+ local multiedge = {}
+
+ local function handle_edge (edge)
+
+ local neighbour = edge:getNeighbour(node)
+
+ if not node_processed[neighbour] then
+ if not multiedge[neighbour] then
+ multiedge[neighbour] = Edge.new{ direction = Edge.RIGHT }
+ collapsed_edges[multiedge[neighbour]] = {}
+ end
+
+ if collapse_action then
+ collapse_action(multiedge[neighbour], edge, graph)
+ end
+
+ table.insert(collapsed_edges[multiedge[neighbour]], edge)
+ end
+ end
+
+ for _,edge in ipairs(node:getIncomingEdges()) do
+ handle_edge(edge)
+ end
+
+ for _,edge in ipairs(node:getOutgoingEdges()) do
+ handle_edge(edge)
+ end
+
+ for neighbour, multiedge in pairs(multiedge) do
+
+ if #collapsed_edges[multiedge] <= 1 then
+ collapsed_edges[multiedge] = nil
+ else
+ for _,subedge in ipairs(collapsed_edges[multiedge]) do
+ graph:deleteEdge(subedge)
+ end
+
+ multiedge:addNode(node)
+ multiedge:addNode(neighbour)
+
+ graph:addEdge(multiedge)
+ end
+ end
+ end
+
+ graph[algorithm].collapsed_edges = collapsed_edges
+end
+
+
+--- Expand multiedges that were previously collapsed
+--
+-- @param algorithm An algorithm object
+
+function Simplifiers:expandMultiedgesOldModel(algorithm)
+ local graph = algorithm.graph
+ for multiedge, subedges in pairs(graph[algorithm].collapsed_edges) do
+ assert(#subedges >= 2)
+
+ graph:deleteEdge(multiedge)
+
+ for _,edge in ipairs(subedges) do
+
+ -- Copy bend points
+ for _,p in ipairs(multiedge.bend_points) do
+ edge.bend_points[#edge.bend_points+1] = p:copy()
+ end
+
+ -- Copy options
+ for k,v in pairs(multiedge.algorithmically_generated_options) do
+ edge.algorithmically_generated_options[k] = v
+ end
+
+ for _,node in ipairs(edge.nodes) do
+ node:addEdge(edge)
+ end
+
+ graph:addEdge(edge)
+ end
+ end
+
+ graph[algorithm].collapsed_edges = nil
+end
+
+
+
+
+
+-- Done
+
+return Simplifiers
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Stack.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Stack.lua
new file mode 100644
index 0000000000..75084b6e38
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Stack.lua
@@ -0,0 +1,61 @@
+-- Copyright 2011 by Jannis Pohlmann
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+--- A Stack is a very simple wrapper around an array
+--
+--
+
+local Stack = {}
+Stack.__index = Stack
+
+
+-- Namespace
+require("pgf.gd.lib").Stack = Stack
+
+
+--- Create a new stack
+function Stack.new()
+ local stack = {}
+ setmetatable(stack, Stack)
+ return stack
+end
+
+
+--- Push an element on top of the stack
+function Stack:push(data)
+ self[#self+1] = data
+end
+
+
+--- Inspect (but not pop) the top element of a stack
+function Stack:peek()
+ return self[#self]
+end
+
+
+--- Pop an element from the top of the stack
+function Stack:pop()
+ return table.remove(self, #self)
+end
+
+
+--- Get the height of the stack
+function Stack:getSize()
+ return #self
+end
+
+
+
+-- done
+
+return Stack \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Storage.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Storage.lua
new file mode 100644
index 0000000000..e029fdf7ff
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Storage.lua
@@ -0,0 +1,110 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- A storage is an object that, as the name suggests, allows you to
+-- ``store stuff concerning objects.'' Basically, it behaves like
+-- table having weak keys, which means that once the objects for which
+-- you ``store stuff'' go out of scope, they are also removed from the
+-- storage. Also, you can specify that for each object of the storage
+-- you store a table. In this case, there is no need to initialize
+-- this table for each object; rather, when you write into such a
+-- table and it does not yet exist, it is created ``on the fly''.
+--
+-- The typical way you use storages is best explained with the
+-- following example: Suppose you want to write a depth-first search
+-- algorithm for a graph. This algorithm might wish to mark all nodes
+-- it has visited. It could just say |v.marked = true|, but this might
+-- clash with someone else also using the |marked| key. The solution is
+-- to create a |marked| storage. The algorithm can first say
+--\begin{codeexample}[code only, tikz syntax=false]
+--local marked = Storage.new()
+--\end{codeexample}
+-- and then say
+--\begin{codeexample}[code only, tikz syntax=false]
+--marked[v] = true
+--\end{codeexample}
+-- to mark its objects. The |marked| storage object does not need to
+-- be created locally inside a function, you can declare it as a local
+-- variable of the whole file; nevertheless, the entries for vertices
+-- no longer in use get removed automatically. You can also make it a
+-- member variable of the algorithm class, which allows you make the
+-- information about which objects are marked globally
+-- accessible.
+--
+-- Now suppose the algorithm would like to store even more stuff in
+-- the storage. For this, we might use a table and can use the fact
+-- that a storage will automatically create a table when necessary:
+--\begin{codeexample}[code only, tikz syntax=false]
+--local info = Storage.newTableStorage()
+--
+--info[v].marked = true -- the "info[v]" table is
+-- -- created automatically here
+--
+--info[v].foo = "bar"
+--\end{codeexample}
+-- Again, once |v| goes out of scope, both it and the info table will
+-- removed.
+
+local Storage = {}
+
+-- Namespace
+require("pgf.gd.lib").Storage = Storage
+
+
+-- The simple metatable
+
+local SimpleStorageMetaTable = { __mode = "k" }
+
+-- The advanced metatable for table storages:
+
+local TableStorageMetaTable = {
+ __mode = "k",
+ __index =
+ function(t, k)
+ local new = {}
+ rawset(t, k, new)
+ return new
+ end
+}
+
+
+---
+-- Create a new storage object.
+--
+-- @return A new |Storage| instance.
+
+function Storage.new()
+ return setmetatable({}, SimpleStorageMetaTable)
+end
+
+
+---
+-- Create a new storage object which will install a table for every
+-- entry automatically.
+--
+-- @return A new |Storage| instance.
+
+function Storage.newTableStorage()
+ return setmetatable({}, TableStorageMetaTable)
+end
+
+
+
+
+
+
+
+-- Done
+
+return Storage
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Transform.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Transform.lua
new file mode 100644
index 0000000000..7695b1b239
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/lib/Transform.lua
@@ -0,0 +1,120 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- The |Transform| table provides a set of static methods for
+-- creating and handling canvas transformation matrices. Such a matrix
+-- is actually just an array of six numbers. The idea is that
+-- ``applying'' an array { a, b, c, d, e, f } a vector $(x,y)$ will
+-- yield the new vector $(ax+by+e,cx+dy+f)$. For details on how such
+-- matrices work, see Section~\ref{section-transform-cm}
+--
+local Transform = {}
+
+
+-- Namespace
+
+require("pgf.gd.model").Transform = Transform
+
+
+--- Creates a new transformation array.
+--
+-- @param a First component
+-- @param b Second component
+-- @param c Third component
+-- @param d Fourth component
+-- @param x The x shift
+-- @param y The y shift
+--
+-- @return A transformation object.
+--
+function Transform.new(a,b,c,d,x,y)
+ return { a, b, c, d, x, y }
+end
+
+
+--- Creates a new transformation object that represents a shift.
+--
+-- @param x An x-shift
+-- @param y A y-shift
+--
+-- @return A transformation object
+--
+function Transform.new_shift(x,y)
+ return { 1, 0, 0, 1, x, y }
+end
+
+
+--- Creates a new transformation object that represents a rotation.
+--
+-- @param angle An angle
+--
+-- @return A transformation object
+--
+function Transform.new_rotation(angle)
+ local c = math.cos(angle)
+ local s = math.sin(angle)
+ return { c, -s, s, c, 0, 0 }
+end
+
+
+--- Creates a new transformation object that represents a scaling.
+--
+-- @param x The horizontal scaling
+-- @param y The vertical scaling (if missing, the horizontal scaling is used)
+--
+-- @return A transformation object
+--
+function Transform.new_scaling(x_scale, y_scale)
+ return { x_scale, 0, 0, y_scale or x_scale, 0, 0 }
+end
+
+
+
+
+---
+-- Concatenate two transformation matrices, returning the new one.
+--
+-- @param a The first transformation
+-- @param b The second transformation
+--
+-- @return The transformation representing first applying |b| and then
+-- applying |a|.
+--
+function Transform.concat(a,b)
+ local a1, a2, a3, a4, a5, a6, b1, b2, b3, b4, b5, b6 =
+ a[1], a[2], a[3], a[4], a[5], a[6], b[1], b[2], b[3], b[4], b[5], b[6]
+ return { a1*b1 + a2*b3, a1*b2 + a2*b4,
+ a3*b1 + a4*b3, a3*b2 + a4*b4,
+ a1*b5 + a2*b6 + a5, a3*b5 + a4*b6 + a6 }
+end
+
+
+
+---
+-- Inverts a transformation matrix.
+--
+-- @param t The transformation.
+--
+-- @return The inverted transformation
+--
+function Transform.invert(t)
+ local t1, t2, t3, t4 = t[1], t[2], t[3], t[4]
+ local idet = 1/(t1*t4 - t2*t3)
+
+ return { t4*idet, -t2*idet, -t3*idet, t1*idet, -t[5], -t[6] }
+end
+
+
+-- Done
+
+return Transform
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model.lua
new file mode 100644
index 0000000000..4a0130488b
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.model = {}
+
+
+-- Done
+
+return pgf.gd.model \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Arc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Arc.lua
new file mode 100644
index 0000000000..e007e9b59b
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Arc.lua
@@ -0,0 +1,653 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- An arc is a light-weight object representing an arc from a vertex
+-- in a graph to another vertex. You may not create an |Arc| by
+-- yourself, which is why there is no |new| method, arc creation is
+-- done by the Digraph class.
+--
+-- Every arc belongs to exactly one graph. If you want the same arc in
+-- another graph, you need to newly connect two vertices in the other graph.
+--
+-- You may read the |head| and |tail| fields, but you may not write
+-- them. In order to store data for an arc, use |Storage| objects.
+--
+-- Between any two vertices of a graph there can be only one arc, so
+-- all digraphs are always simple graphs. However, in the
+-- specification of a graph (the syntactic digraph), there might
+-- be multiple edges between two vertices. This means, in particular,
+-- that an arc has no |options| field. Rather, it has several
+-- |optionsXxxx| functions, that will search for options in all of the
+-- syntactic edges that ``belong'' to an edge.
+--
+-- In order to \emph{set} options of the edges, you can set the
+-- |generated_options| field of an arc (which is |nil| by default), see
+-- the |declare_parameter_sequence| function for the syntax. Similar
+-- to the |path| field below, the options set in this table are
+-- written back to the syntactic edges during a sync.
+--
+-- Finally, there is also an |animations| field, which, similarly to
+-- the |generated_options|, gets written back during a sync when it is
+-- not |nil|.
+--
+-- In detail, the following happens: Even though an arc has a |path|,
+-- |generated_options|, and |animations| fields, setting these fields does
+-- not immediately set the paths of the syntactic edges nor does it
+-- generate options. Indeed, you will normally want to setup and
+-- modify the |path| field of an arc during your algorithm and only at
+-- the very end, ``write it back'' to the multiple syntactic edges
+-- underlying the graph. For this purpose, the method |sync| is used,
+-- which is called automatically for the |ugraph| and |digraph| of a
+-- scope as well as for spanning trees.
+--
+-- The bottom line concerning the |path| field is the following: If
+-- you just want a straight line along an arc, just leave the field as
+-- it is (namely, |nil|). If you want to have all edges along a path
+-- to follow a certain path, set the |path| field of the arc to the
+-- path you desire (typically, using the |setPolylinePath| or a
+-- similar method). This will cause all syntactic edges underlying the
+-- arc to be set to the specified path. In the event that you want to
+-- set different paths for the edges underlying a single arc
+-- differently, set the |path| fields of these edges and set the
+-- |path| field of the arc to |nil|. This will disable the syncing for
+-- the arc and will cause the edge |paths| to remain untouched.
+--
+-- @field tail The tail vertex of the arc.
+-- @field head The head vertex of the arc. May be the same as the tail
+-- in case of a loop.
+-- @field path If non-nil, the path of the arc. See the description
+-- above.
+-- @field generated_options If non-nil, some options to be passed back
+-- to the original syntactic edges, see the description above.
+-- @field animations If non-nil, some animations to be passed back
+-- to the original syntactic edges. See the description of the
+-- |animations| field for |Vertex| for details on the syntax.
+-- @field syntactic_edges In case this arc is an arc in the syntactic
+-- digraph (and only then), this field contains an array containing
+-- syntactic edges (``real'' edges in the syntactic digraph) that
+-- underly this arc. Otherwise, the field will be empty or |nil|.
+--
+local Arc = {}
+Arc.__index = Arc
+
+
+-- Namespace
+
+require("pgf.gd.model").Arc = Arc
+
+
+-- Imports
+
+local Path = require 'pgf.gd.model.Path'
+local lib = require 'pgf.gd.lib'
+
+
+---
+-- Get an array of options of the syntactic edges corresponding to an arc.
+--
+-- An arc in a digraph is typically (but not always) present because
+-- there are one or more edges in the syntactic digraph between the
+-- tail and the head of the arc or between the head and the tail.
+--
+-- Since for every arc there can be several edges present in the
+-- syntactic digraph, an option like |length| may have
+-- been given multiple times for the edges corresponding to the arc.
+--
+-- If your algorithm gets confused by multiple edges, try saying
+-- |a:options(your_option)|. This will always give the ``most
+-- sensible'' choice of the option if there are multiple edges
+-- corresponding to the same arc.
+--
+-- @param option A string option like |"length"|.
+--
+-- @return A table with the following contents:
+-- %
+-- \begin{enumerate}
+-- \item It is an array of all values the option has for edges
+-- corresponding to |self| in the syntactic digraph. Suppose, for
+-- instance, you write the following:
+-- %
+--\begin{codeexample}[code only]
+--graph {
+-- tail -- [length=1] head, % multi edge 1
+-- tail -- [length=3] head, % mulit edge 2
+-- head -- [length=8] tail, % multi edge 3
+-- tail -- head, % multi edge 4
+-- head -- [length=7] tail, % multi edge 5
+-- tail -- [length=2] head, % multi edge 6
+--}
+--\end{codeexample}
+-- %
+-- Suppose, furthermore, that |length| has been setup as an edge
+-- option. Now suppose that |a| is the arc from the vertex |tail| to
+-- the vertex |head|. Calling |a:optionsArray('length')| will
+-- yield the array part |{1,3,2,8,7}|. The reason for the ordering is
+-- as follows: First come all values |length| had for syntactic edges
+-- going from |self.tail| to |self.head| in the order they appear in the
+-- graph description. Then come all values the options has for syntactic
+-- edges going from |self.head| to |self.tail|. The reason for this
+-- slightly strange behavior is that many algorithms do not really
+-- care whether someone writes |a --[length=1] b| or
+-- |b --[length=1] a|; in both cases they would ``just'' like to know
+-- that the length is~|1|.
+--
+-- \item There is field called |aligned|, which is an array storing
+-- the actual syntactic edge objects whose values can be found in the
+-- array part of the returned table. However, |aligned| contains only
+-- the syntactic edges pointing ``in the same direction'' as the arc,
+-- that is, the tail and head of the syntactic edge are the same as
+-- those of the arc. In the above example, this array would contain
+-- the edges with the comment numbers |1|, |2|, and |6|.
+--
+-- Using the length of this array and the fact that the ``aligned''
+-- values come first in the table, you can easily iterate over the
+-- |option|'s values of only those edges that are aligned with the arc:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local a = g:arc(tail.head) -- some arc
+--local opt = a:optionsArray('length')
+--local sum = 0
+--for i=1,#opt.aligned do
+-- sum = sum + opt[i]
+--end
+--\end{codeexample}
+-- %
+-- \item There is a field called |anti_aligned|, which is an array
+-- containing exactly the edges in the array part of the table not
+-- aligned with the arc. The numbering start at |1| as usual, so the
+-- $i$th entry of this table corresponds to the entry at position $i +
+-- \verb!#opt.aligned!$ of the table.
+-- \end{enumerate}
+--
+function Arc:optionsArray(option)
+
+ local cache = self.option_cache
+ local t = cache[option]
+ if t then
+ return t
+ end
+
+ -- Accumulate the edges for which the option is set:
+ local tail = self.tail
+ local head = self.head
+ local s_graph = self.syntactic_digraph
+
+ local arc = s_graph:arc(tail, head)
+ local aligned = {}
+ if arc then
+ for _,m in ipairs(arc.syntactic_edges) do
+ if m.options[option] ~= nil then
+ aligned[#aligned + 1] = m
+ end
+ end
+ table.sort(aligned, function (a,b) return a.event.index < b.event.index end)
+ end
+
+ local arc = head ~= tail and s_graph:arc(head, tail)
+ local anti_aligned = {}
+ if arc then
+ for _,m in ipairs(arc.syntactic_edges) do
+ if m.options[option] ~= nil then
+ anti_aligned[#anti_aligned + 1] = m
+ end
+ end
+ table.sort(anti_aligned, function (a,b) return a.event.index < b.event.index end)
+ end
+
+ -- Now merge them together
+ local t = { aligned = aligned, anti_aligned = anti_aligned }
+ for i=1,#aligned do
+ t[i] = aligned[i].options[option]
+ end
+ for i=1,#anti_aligned do
+ t[#t+1] = anti_aligned[i].options[option]
+ end
+ cache[option] = t
+
+ return t
+end
+
+
+
+---
+-- Returns the first option, that is, the first entry of
+-- |Arc:optionsArray(option)|. However, if the |only_aligned|
+-- parameter is set to true and there is no option with any aligned
+-- syntactic edge, |nil| is returned.
+--
+-- @param option An option
+-- @param only_aligned If true, only aligned syntactic edges will be
+-- considered.
+-- @return The first entry of the |optionsArray|
+function Arc:options(option, only_aligned)
+ if only_aligned then
+ local opt = self:optionsArray(option)
+ if #opt.aligned > 0 then
+ return opt[1]
+ end
+ else
+ return self:optionsArray(option)[1]
+ end
+end
+
+
+
+
+---
+-- Get an accumulated value of an option of the syntactic edges
+-- corresponding to an arc.
+--
+-- @param option The option of interest
+-- @param accumulator A function taking two values. When there are
+-- more than one syntactic edges corresponding to |self| for which the
+-- |option| is set, this function will be called repeatedly for the
+-- different values. The first time it will be called for the first
+-- two values. Next, it will be called for the result of this call and
+-- the third value, and so on.
+-- @param only_aligned A boolean. If true, only the aligned syntactic
+-- edges will be considered.
+--
+-- @return If the option is not set for any (aligned) syntactic edges
+-- corresponding to |self|, |nil| is returned. If there is exactly one
+-- edge, the value of this edge is returned. Otherwise, the result of
+-- repeatedly applying the |accumulator| function as described
+-- above.
+--
+-- The result is cached, repeated calls will not invoke the
+-- |accumulator| function again.
+--
+-- @usage Here is typical usage:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local total_length = a:optionsAccumulated('length', function (a,b) return a+b end) or 0
+--\end{codeexample}
+--
+function Arc:optionsAccumulated(option, accumulator, only_aligned)
+ local opt = self:options(option)
+ if only_aligned then
+ local aligned = opt.aligned
+ local v = aligned[accumulator]
+ if v == nil then
+ v = opt[1]
+ for i=2,#aligned do
+ v = accumulator(v, opt[i])
+ end
+ align[accumulator] = v
+ end
+ return v
+ else
+ local v = opt[accumulator]
+ if v == nil then
+ v = opt[1]
+ for i=2,#opt do
+ v = accumulator(v, opt[i])
+ end
+ opt[accumulator] = v
+ end
+ return v
+ end
+end
+
+
+
+---
+-- Compute the syntactic head and tail of an arc. For this, we have a
+-- look at the syntactic digraph underlying the arc. If there is at
+-- least once syntactic edge going from the arc's tail to the arc's
+-- head, the arc's tail and head are returned. Otherwise, we test
+-- whether there is a syntactic edge in the other direction and, if
+-- so, return head and tail in reverse order. Finally, if there is no
+-- syntactic edge at all corresponding to the arc in either direction,
+-- |nil| is returned.
+--
+-- @return The syntactic tail
+-- @return The syntactic head
+
+function Arc:syntacticTailAndHead ()
+ local s_graph = self.syntactic_digraph
+ local tail = self.tail
+ local head = self.head
+ if s_graph:arc(tail, head) then
+ return tail, head
+ elseif s_graph:arc(head, tail) then
+ return head, tail
+ end
+end
+
+
+---
+-- Compute the point cloud.
+--
+-- @return This method will return the ``point cloud'' of an arc,
+-- which is an array of all points that must be rotated and shifted
+-- along with the endpoints of an edge.
+--
+function Arc:pointCloud ()
+ if self.cached_point_cloud then
+ return self.cached_point_cloud -- cached
+ end
+ local cloud = {}
+ local a = self.syntactic_digraph:arc(self.tail,self.head)
+ if a then
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,p in ipairs(e.path) do
+ if type(p) == "table" then
+ cloud[#cloud + 1] = p
+ end
+ end
+ end
+ end
+ self.cached_point_cloud = cloud
+ return cloud
+end
+
+
+
+---
+-- Compute an event index for the arc.
+--
+-- @return The lowest event index of any edge involved
+-- in the arc (or nil, if there is no syntactic edge).
+--
+function Arc:eventIndex ()
+ if self.cached_event_index then
+ return self.cached_event_index
+ end
+ local head = self.head
+ local tail = self.tail
+ local e = math.huge
+ local a = self.syntactic_digraph:arc(tail,head)
+ if a then
+ for _,m in ipairs(a.syntactic_edges) do
+ e = math.min(e, m.event.index)
+ end
+ end
+ local a = head ~= tail and self.syntactic_digraph:arc(head,tail)
+ if a then
+ for _,m in ipairs(a.syntactic_edges) do
+ e = math.min(e, m.event.index)
+ end
+ end
+ self.cached_event_index = e
+ return e
+end
+
+
+
+
+---
+-- The span collector
+--
+-- This method returns the top (that is, smallest) priority of any
+-- edge involved in the arc.
+--
+-- The priority of an edge is computed as follows:
+-- %
+-- \begin{enumerate}
+-- \item If the option |"span priority"| is set, this number
+-- will be used.
+-- \item If the edge has the same head as the arc, we lookup the key\\
+-- |"span priority " .. edge.direction|. If set, we use this value.
+-- \item If the edge has a different head from the arc (the arc is
+-- ``reversed'' with respect to the syntactic edge), we lookup the key
+-- |"span priority reversed " .. edge.direction|. If set, we use this value.
+-- \item Otherwise, we use priority 5.
+-- \end{enumerate}
+--
+-- @return The priority of the arc, as described above.
+--
+function Arc:spanPriority()
+ if self.cached_span_priority then
+ return self.cached_span_priority
+ end
+
+ local head = self.head
+ local tail = self.tail
+ local min
+ local g = self.syntactic_digraph
+
+ local a = g:arc(tail,head)
+ if a then
+ for _,m in ipairs(a.syntactic_edges) do
+ local p =
+ m.options["span priority"] or
+ lib.lookup_option("span priority " .. m.direction, m, g)
+
+ min = math.min(p or 5, min or math.huge)
+ end
+ end
+
+ local a = head ~= tail and g:arc(head,tail)
+ if a then
+ for _,m in ipairs(a.syntactic_edges) do
+ local p =
+ m.options["span priority"] or
+ lib.lookup_option("span priority reversed " .. m.direction, m, g)
+
+ min = math.min(p or 5, min or math.huge)
+ end
+ end
+
+ self.cached_span_priority = min or 5
+
+ return min or 5
+end
+
+
+
+
+
+
+---
+-- Sync an |Arc| with its syntactic edges with respect to the path and
+-- generated options. It causes the following to happen:
+-- If the |path| field of the arc is |nil|, nothing
+-- happens with respect to the path. Otherwise, a copy of the |path|
+-- is created. However, for every path element that is a function,
+-- this function is invoked with the syntactic edge as its
+-- parameter. The result of this call should now be a |Coordinate|,
+-- which will replace the function in the |Path|.
+--
+-- You use this method like this:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--...
+--local arc = g:connect(s,t)
+--arc:setPolylinePath { Coordinate.new(x,y), Coordinate.new(x1,y1) }
+--...
+--arc:sync()
+--\end{codeexample}
+--
+-- Next, similar to the path, the field |generated_options| is
+-- considered. If it is not |nil|, then all options listed in this
+-- field are appended to all syntactic edges underlying the arc.
+--
+-- Note that this function will automatically be called for all arcs
+-- of the |ugraph|, the |digraph|, and the |spanning_tree| of an
+-- algorithm by the rendering pipeline.
+--
+function Arc:sync()
+ if self.path then
+ local path = self.path
+ local head = self.head
+ local tail = self.tail
+ local a = self.syntactic_digraph:arc(tail,head)
+ if a and #a.syntactic_edges>0 then
+ for _,e in ipairs(a.syntactic_edges) do
+ local clone = path:clone()
+ for i=1,#clone do
+ local p = clone[i]
+ if type(p) == "function" then
+ clone[i] = p(e)
+ if type(clone[i]) == "table" then
+ clone[i] = clone[i]:clone()
+ end
+ end
+ end
+ e.path = clone
+ end
+ end
+ local a = head ~= tail and self.syntactic_digraph:arc(head,tail)
+ if a and #a.syntactic_edges>0 then
+ for _,e in ipairs(a.syntactic_edges) do
+ local clone = path:reversed()
+ for i=1,#clone do
+ local p = clone[i]
+ if type(p) == "function" then
+ clone[i] = p(e)
+ if type(clone[i]) == "table" then
+ clone[i] = clone[i]:clone()
+ end
+ end
+ end
+ e.path = clone
+ end
+ end
+ end
+ if self.generated_options then
+ local head = self.head
+ local tail = self.tail
+ local a = self.syntactic_digraph:arc(tail,head)
+ if a and #a.syntactic_edges>0 then
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,o in ipairs(self.generated_options) do
+ e.generated_options[#e.generated_options+1] = o
+ end
+ end
+ end
+ local a = head ~= tail and self.syntactic_digraph:arc(head,tail)
+ if a and #a.syntactic_edges>0 then
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,o in ipairs(self.generated_options) do
+ e.generated_options[#e.generated_options+1] = o
+ end
+ end
+ end
+ end
+ if self.animations then
+ local head = self.head
+ local tail = self.tail
+ local a = self.syntactic_digraph:arc(tail,head)
+ if a and #a.syntactic_edges>0 then
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,o in ipairs(self.animations) do
+ e.animations[#e.animations+1] = o
+ end
+ end
+ end
+ local a = head ~= tail and self.syntactic_digraph:arc(head,tail)
+ if a and #a.syntactic_edges>0 then
+ for _,e in ipairs(a.syntactic_edges) do
+ for _,o in ipairs(self.animations) do
+ e.animations[#e.animations+1] = o
+ end
+ end
+ end
+ end
+end
+
+
+---
+-- This method returns a ``coordinate factory'' that can be used as
+-- the coordinate of a |moveto| at the beginning of a path starting at
+-- the |tail| of the arc. Suppose you want to create a path starting
+-- at the tail vertex, going to the coordinate $(10,10)$ and ending at
+-- the head vertex. The trouble is that when you create the path
+-- corresponding to this route, you typically do not know where the
+-- tail vertex is going to be. Even if that \emph{has} already been
+-- settled, you will still have the problem that different edges
+-- underlying the arc may wish to start their paths at different
+-- anchors inside the tail vertex. In such cases, you use this
+-- method to get a function that will, later on, compute the correct
+-- position of the anchor as needed.
+--
+-- Here is the code you would use to create the above-mentioned path:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local a = g:connect(tail,head)
+--...
+--arc.path = Path.new()
+--arc.path:appendMoveto(arc:tailAnchorForArcPath())
+--arc.path:appendLineto(10, 10)
+--arc.path:appendLineto(arc:headAnchorForArcPath())
+--\end{codeexample}
+--
+-- Normally, however, you will not write code as detailed as the above
+-- and you would just write instead of the last three lines:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--arc:setPolylinePath { Coordinate.new (10, 10) }
+--\end{codeexample}
+
+function Arc:tailAnchorForArcPath()
+ return function (edge)
+ local a = edge.options['tail anchor']
+ if a == "" then
+ a = "center"
+ end
+ return self.tail:anchor(a) + self.tail.pos
+ end
+end
+
+---
+-- See |Arc:tailAnchorForArcPath|.
+
+function Arc:headAnchorForArcPath()
+ return function (edge)
+ local a = edge.options['head anchor']
+ if a == "" then
+ a = "center"
+ end
+ return self.head:anchor(a) + self.head.pos
+ end
+end
+
+
+
+---
+-- Setup the |path| field of an arc in such a way that it corresponds
+-- to a sequence of straight line segments starting at the tail's
+-- anchor and ending at the head's anchor.
+--
+-- @param coordinates An array of |Coordinates| through which the line
+-- will go through.
+
+function Arc:setPolylinePath(coordinates)
+ local p = Path.new ()
+
+ p:appendMoveto(self:tailAnchorForArcPath())
+
+ for _,c in ipairs(coordinates) do
+ p:appendLineto(c)
+ end
+
+ p:appendLineto(self:headAnchorForArcPath())
+
+ self.path = p
+end
+
+
+
+
+-- Returns a string representation of an arc. This is mainly for debugging
+--
+-- @return The Arc as string.
+--
+function Arc:__tostring()
+ return tostring(self.tail) .. "->" .. tostring(self.head)
+end
+
+
+-- Done
+
+return Arc
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Collection.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Collection.lua
new file mode 100644
index 0000000000..abc454b7db
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Collection.lua
@@ -0,0 +1,208 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- A collection is essentially a subgraph of a graph, that is, a
+-- ``collection'' of some nodes and some edges of the graph. The name
+-- ``collection'' was chosen over ``subgraph'' since the latter are
+-- often thought of as parts of a graph that are rendered in a special
+-- way (such as being surrounded by a rectangle), while collections
+-- are used to model such diverse things as hyperedges, sets of
+-- vertices that should be on the same level in a layered algorithm,
+-- or, indeed, subgraphs that are rendered in a special way.
+--
+-- Collections are grouped into ``kinds''. All collections of a given
+-- kind can be accessed by algorithms through an array whose elements
+-- are the collections. On the display layer, for each kind a separate
+-- key is available to indicate that a node or an edge belongs to a
+-- collection.
+--
+-- Collections serve two purposes: First, they can be seen as ``hints''
+-- to graph drawing algorithms that certain nodes and/or edges ``belong
+-- together''. For instance, collections of kind |same layer| are used
+-- by the Sugiyama algorithm to group together nodes that should appear
+-- at the same height of the output. Second, since collections are also
+-- passed back to the display layer in a postprocessing step, they can be
+-- used to render complicated concepts such as hyperedges (which are
+-- just collections of nodes, after all) or subgraphs.
+--
+-- @field kind The ``kind'' of the collection.
+--
+-- @field vertices A lookup table of vertices (that is, both an array
+-- with the vertices in the order in which they appear as well as a
+-- table such that |vertices[vertex] == true| whenever |vertex| is
+-- present in the table.
+--
+-- @field edges A lookup table of edges (not arcs!).
+--
+-- @field options An options table. This is the table of options that
+-- was in force when the collection was created.
+--
+-- @field child_collections An array of all collections that are
+-- direct children of this collection (that is,
+-- they were defined while the current collection was the most
+-- recently defined collection on the options stack). However, you
+-- should use the methods |children|, |descendants|, and so to access
+-- this field.
+--
+-- @field parent_collection The parent collection of the current
+-- collection. This field may be |nil| in case a collection has no parent.
+--
+-- @field event An |Event| object that was create for this
+-- collection. Its |kind| will be |"collection"| while its |parameter|
+-- will be the collection kind.
+
+local Collection = {}
+Collection.__index = Collection
+
+
+-- Namespace
+
+require("pgf.gd.model").Collection = Collection
+
+
+-- Imports
+local Storage = require "pgf.gd.lib.Storage"
+
+
+
+---
+-- Creates a new collection. You should not call this function
+-- directly, it is called by the interface classes.
+--
+-- @param t A table of initial values. The field |t.kind| must be a
+-- nonempty string.
+--
+-- @return The new collection
+--
+function Collection.new(t)
+ assert (type(t.kind) == "string" and t.kind ~= "", "collection kind not set")
+
+ return setmetatable(
+ {
+ vertices = t.vertices or {},
+ edges = t.edges or {},
+ options = t.options or {},
+ generated_options = t.generated_options or {},
+ kind = t.kind,
+ event = t.event,
+ child_collections = t.child_collections or {},
+ }, Collection)
+end
+
+
+
+
+--
+-- An internal function for registering a collection as child of
+-- another collection. The collection |self| will be made a child
+-- collection of |parent|.
+--
+-- @param parent A collection.
+
+function Collection:registerAsChildOf(parent)
+ self.parent = parent
+ if parent then
+ assert (getmetatable(parent) == Collection, "parent must be a collection")
+ parent.child_collections[#parent.child_collections+1] = self
+ end
+end
+
+
+
+---
+-- A collection can have any number of \emph{child collections}, which
+-- are collections nested inside the collection. You can access the
+-- array of these children through this method. You may not modify
+-- the array returned by this function.
+--
+-- @return The array of children of |self|.
+--
+function Collection:children()
+ return self.child_collections
+end
+
+
+---
+-- This method works like the |children| method. However, the tree of
+-- collections is, conceptually, contracted by considering only these
+-- collections that have the |kind| given as parameter. For instance,
+-- if |self| has a child collection of a kind different from |kind|,
+-- but this child collection has, in turn, a child collection of kind
+-- |kind|, this latter child collection will be included in the array
+-- -- but not any of its child collections.
+--
+-- @param kind The collection kind to which the tree of collections
+-- should be restricted.
+--
+-- @return The array of children of |self| in this contracted tree.
+--
+function Collection:childrenOfKind(kind)
+ local function rec (c, a)
+ for _,d in ipairs(c.child_collections) do
+ if d.kind == kind then
+ a[#a + 1] = d
+ else
+ rec (d, a)
+ end
+ end
+ return a
+ end
+ return rec(self, {})
+end
+
+
+---
+-- The descendants of a collection are its children, plus their
+-- children, plus their children, and so on.
+--
+-- @return An array of all descendants of |self|. It will be in
+-- preorder.
+
+function Collection:descendants()
+ local function rec (c, a)
+ for _,d in ipairs(c.child_collections) do
+ a[#a + 1] = d
+ rec (d, a)
+ end
+ return a
+ end
+ return rec(self, {})
+end
+
+
+
+---
+-- The descendants of a collection of the given |kind|.
+--
+-- @param kind A collection kind.
+--
+-- @return An array of all descendants of |self| of the given |kind|.
+
+function Collection:descendantsOfKind(kind)
+ local function rec (c, a)
+ for _,d in ipairs(c.child_collections) do
+ if d.kind == kind then
+ a[#a + 1] = d
+ end
+ rec (d, a)
+ end
+ return a
+ end
+ return rec(self, {})
+end
+
+
+
+-- Done
+
+return Collection
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Coordinate.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Coordinate.lua
new file mode 100644
index 0000000000..3a4448ab08
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Coordinate.lua
@@ -0,0 +1,306 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- A Coordinate models a position on the drawing canvas.
+--
+-- It has an |x| field and a |y| field, which are numbers that will be
+-- interpreted as \TeX\ points (1/72.27th of an inch). The $x$-axis goes
+-- right and the $y$-axis goes up.
+--
+-- @field x
+-- @field y
+--
+-- There is also a static field called |origin| that is always equal to the origin.
+
+local Coordinate = {}
+Coordinate.__index = Coordinate
+
+
+-- Namespace
+
+require("pgf.gd.model").Coordinate = Coordinate
+
+
+
+
+--- Creates a new coordinate.
+--
+-- @param x The $x$ value
+-- @param y The $y$ value
+--
+-- @return A coordinate
+--
+function Coordinate.new(x,y)
+ return setmetatable( {x=x, y=y}, Coordinate)
+end
+
+
+Coordinate.origin = Coordinate.new(0,0)
+
+
+--- Creates a new coordinate that is a copy of an existing one.
+--
+-- @return A new coordinate at the same location as |self|
+--
+function Coordinate:clone()
+ return setmetatable( { x = self.x, y = self.y }, Coordinate)
+end
+
+
+
+--- Apply a transformation matrix to a coordinate,
+-- see |pgf.gd.lib.Transform| for details.
+--
+-- @param t A transformation.
+
+function Coordinate:apply(t)
+ local x = self.x
+ local y = self.y
+ self.x = t[1]*x + t[2]*y + t[5]
+ self.y = t[3]*x + t[4]*y + t[6]
+end
+
+
+--- Shift a coordinate
+--
+-- @param a An $x$ offset
+-- @param b A $y$ offset
+
+function Coordinate:shift(a,b)
+ self.x = self.x + a
+ self.y = self.y + b
+end
+
+
+---
+-- ``Unshift'' a coordinate (which is the same as shifting by the
+-- inversed coordinate; only faster).
+--
+-- @param a An $x$ offset
+-- @param b A $y$ offset
+
+function Coordinate:unshift(a,b)
+ self.x = self.x - a
+ self.y = self.y - b
+end
+
+
+---
+-- Like |shift|, only for coordinate parameters.
+--
+-- @param c Another coordinate. The $x$- and $y$-values of |self| are
+-- increased by the $x$- and $y$-values of this coordinate.
+
+function Coordinate:shiftByCoordinate(c)
+ self.x = self.x + c.x
+ self.y = self.y + c.y
+end
+
+
+---
+-- Like |unshift|, only for coordinate parameters.
+--
+-- @param c Another coordinate.
+
+function Coordinate:unshiftByCoordinate(c)
+ self.x = self.x - c.x
+ self.y = self.y - c.y
+end
+
+
+---
+-- Moves the coordinate a fraction of |f| along a straight line to |c|.
+--
+-- @param c Another coordinate
+-- @param f A fraction
+
+function Coordinate:moveTowards(c,f)
+ self.x = self.x + f*(c.x-self.x)
+ self.y = self.y + f*(c.y-self.y)
+end
+
+
+
+--- Scale a coordinate by a factor
+--
+-- @param s A factor.
+
+function Coordinate:scale(s)
+ self.x = s*self.x
+ self.y = s*self.y
+end
+
+
+
+
+---
+-- Add two coordinates, yielding a new coordinate. Note that it will
+-- be a lot faster to call shift, whenever this is possible.
+--
+-- @param a A coordinate
+-- @param b A coordinate
+
+function Coordinate.__add(a,b)
+ return setmetatable({ x = a.x + b.x, y = a.y + b.y }, Coordinate)
+end
+
+
+---
+-- Subtract two coordinates, yielding a new coordinate. Note that it will
+-- be a lot faster to call unshift, whenever this is possible.
+--
+-- @param a A coordinate
+-- @param b A coordinate
+
+function Coordinate.__sub(a,b)
+ return setmetatable({ x = a.x - b.x, y = a.y - b.y }, Coordinate)
+end
+
+
+---
+-- The unary minus (mirror the coordinate against the origin).
+--
+-- @param a A coordinate
+
+function Coordinate.__unm(a)
+ return setmetatable({ x = - a.x, y = - a.y }, Coordinate)
+end
+
+
+---
+-- The multiplication operator. Its effect depends on the parameters:
+-- If both are coordinates, their dot-product is returned. If exactly
+-- one of them is a coordinate and the other is a number, the scalar
+-- multiple of this coordinate is returned.
+--
+-- @param a A coordinate or a scalar
+-- @param b A coordinate or a scalar
+-- @return The dot product or scalar product.
+
+function Coordinate.__mul(a,b)
+ if getmetatable(a) == Coordinate then
+ if getmetatable(b) == Coordinate then
+ return a.x * b.x + a.y * b.y
+ else
+ return setmetatable({ x = a.x * b, y = a.y *b }, Coordinate)
+ end
+ else
+ return setmetatable({ x = a * b.x, y = a * b.y }, Coordinate)
+ end
+end
+
+---
+-- The division operator. Returns the scalar division of a coordinate
+-- by a scalar.
+--
+-- @param a A coordinate
+-- @param b A scalar (not equal to zero).
+-- @return The scalar product or a * (1/b).
+
+function Coordinate.__div(a,b)
+ return setmetatable({ x = a.x / b, y = a.y / b }, Coordinate)
+end
+
+
+---
+-- The norm function. Returns the norm of a coordinate.
+--
+-- @param a A coordinate
+-- @return The norm of the coordinate
+
+function Coordinate:norm()
+ return math.sqrt(self.x * self.x + self.y * self.y)
+end
+
+
+---
+-- Normalize a vector: Ensure that it has length 1. If the vector used
+-- to be the 0-vector, it gets replaced by (1,0).
+--
+
+function Coordinate:normalize()
+ local x, y = self.x, self.y
+ if x == 0 and y == 0 then
+ self.x = 1
+ else
+ local norm = math.sqrt(x*x+y*y)
+ self.x = x / norm
+ self.y = y / norm
+ end
+end
+
+
+---
+-- Normalized version of a vector: Like |normalize|, only the result is
+-- returned in a new vector.
+--
+-- @return Normalized version of |self|
+
+function Coordinate:normalized()
+ local x, y = self.x, self.y
+ if x == 0 and y == 0 then
+ return setmetatable({ x = 1, y = 0 }, Coordinate)
+ else
+ local norm = math.sqrt(x*x+y*y)
+ return setmetatable({ x = x/norm, y = y/norm }, Coordinate)
+ end
+end
+
+
+
+---
+-- Compute a bounding box around an array of coordinates
+--
+-- @param array An array of coordinates
+--
+-- @return |min_x| The minimum $x$ value of the bounding box of the array
+-- @return |min_y| The minimum $y$ value
+-- @return |max_x|
+-- @return |max_y|
+-- @return |center_x| The center of the bounding box
+-- @return |center_y|
+
+function Coordinate.boundingBox(array)
+ if #array > 0 then
+ local min_x, min_y = math.huge, math.huge
+ local max_x, max_y = -math.huge, -math.huge
+
+ for i=1,#array do
+ local c = array[i]
+ local x = c.x
+ local y = c.y
+ if x < min_x then min_x = x end
+ if y < min_y then min_y = y end
+ if x > max_x then max_x = x end
+ if y > max_y then max_y = y end
+ end
+
+ return min_x, min_y, max_x, max_y, (min_x+max_x) / 2, (min_y+max_y) / 2
+ end
+end
+
+
+
+
+-- Returns a string representation of an arc. This is mainly for debugging
+--
+-- @return The Arc as string.
+--
+function Coordinate:__tostring()
+ return "(" .. self.x .. "pt," .. self.y .. "pt)"
+end
+
+
+-- Done
+
+return Coordinate \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Digraph.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Digraph.lua
new file mode 100644
index 0000000000..30b600e308
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Digraph.lua
@@ -0,0 +1,849 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+---
+-- Each |Digraph| instance models a \emph{directed, simple}
+-- graph. ``Directed'' means that all edges ``point'' from a head node
+-- to a tail node. ``Simple'' means that between any nodes there can be
+-- (at most) one edge. Since these properties are a bit at odds with
+-- the normal behavior of ``nodes'' and ``edges'' in \tikzname,
+-- different names are used for them inside the |model| namespace:
+-- The class modeling ``edges'' is actually called |Arc| to stress
+-- that an arc has a specific ``start'' (the tail) and a specific
+-- ``end'' (the head). The class modeling ``nodes'' is actually called
+-- |Vertex|, just to stress that this is not a direct model of a
+-- \tikzname\ |node|, but can represent a arbitrary vertex of a graph,
+-- independently of whether it is an actual |node| in \tikzname.
+--
+-- \medskip
+-- \noindent\emph{Time Bounds.}
+-- Since digraphs are constantly created and modified inside the graph
+-- drawing engine, some care was taken to ensure that all operations
+-- work as quickly as possible. In particular:
+-- %
+-- \begin{itemize}
+-- \item Adding an array of $k$ vertices using the |add| method needs
+-- time $O(k)$.
+-- \item Adding an arc between two vertices needs time $O(1)$.
+-- \item Accessing both the |vertices| and the |arcs| fields takes time
+-- $O(1)$, provided only the above operations are used.
+-- \end{itemize}
+-- %
+-- Deleting vertices and arcs takes more time:
+-- %
+-- \begin{itemize}
+-- \item Deleting the vertices given in an array of $k$ vertices from a
+-- graph with $n$ vertices takes time $O(\max\{n,c\})$ where $c$ is the
+-- number of arcs between the to-be-deleted nodes and the remaining
+-- nodes. Note that this time bound in independent of~$k$. In
+-- particular, it will be much faster to delete many vertices by once
+-- calling the |remove| function instead of calling it repeatedly.
+-- \item Deleting an arc takes time $O(t_o+h_i)$ where $t_o$ is the
+-- number of outgoing arcs at the arc's tail and $h_i$ is the number
+-- of incoming arcs at the arc's head. After a call to |disconnect|,
+-- the next use of the |arcs| field will take time $O(|V| + |E|)$,
+-- while subsequent accesses take time $O(1)$ -- till the
+-- next use of |disconnect|. This means that once you start deleting
+-- arcs using |disconnect|, you should perform as many additional
+-- |disconnect|s as possible before accessing |arcs| one more.
+-- \end{itemize}
+--
+-- \medskip
+-- \noindent\emph{Stability.} The |vertices| field and the array
+-- returned by |Digraph:incoming| and |Digraph:outgoing| are
+-- \emph{stable} in the following sense: The ordering of the elements
+-- when you use |ipairs| on the will be the ordering in which the
+-- vertices or arcs were added to the graph. Even when you remove a
+-- vertex or an arc, the ordering of the remaining elements stays the
+-- same.
+--
+-- @field vertices This array contains the vertices that are part of
+-- the digraph. Internally, this array
+-- is an object of type |LookupTable|, but you can mostly treat it as
+-- if it were an array. In particular, you can iterate over its
+-- elements using |ipairs|, but you may not modify the array; use the
+-- |add| and |remove| methods, instead.
+--
+-- \begin{codeexample}[code only, tikz syntax=false]
+-- local g = Digraph.new {}
+--
+-- g:add { v1, v2 } -- Add vertices v1 and v2
+-- g:remove { v2 } -- Get rid of v2.
+--
+-- assert (g:contains(v1))
+-- assert (not g:contains(v2))
+-- \end{codeexample}
+--
+-- It is important to note that although each digraph stores a
+-- |vertices| array, the elements in this array are not exclusive to
+-- the digraph: A vertex can be an element of any number of
+-- digraphs. Whether or not a vertex is an element of digraph is not
+-- stored in the vertex, only in the |vertices| array of the
+-- digraph. To test whether a digraph contains a specific node, use the
+-- |contains| method, which takes time $O(1)$ to perform the test (this
+-- is because, as mentioned earlier, the |vertices| array is actually a
+-- |LookupTable| and for each vertex |v| the field |vertices[v]| will
+-- be true if, and only if, |v| is an element of the |vertices| array).
+--
+-- Do not use |pairs(g.vertices)| because this may cause your graph
+-- drawing algorithm to produce different outputs on different runs.
+--
+-- A slightly annoying effect of vertices being able to belong to
+-- several graphs at the same time is that the set of arcs incident to
+-- a vertex is not a property of the vertex, but rather of the
+-- graph. In other words, to get a list of all arcs whose tail is a
+-- given vertex |v|, you cannot say something like |v.outgoings| or
+-- perhaps |v:getOutgoings()|. Rather, you have to say |g:outgoing(v)|
+-- to get this list:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--for _,a in ipairs(g:outgoing(v)) do -- g is a Digraph object.
+-- pgf.debug ("There is an arc leaving " .. tostring(v) ..
+-- " heading to " .. tostring(a.head))
+--end
+--\end{codeexample}
+-- %
+-- Naturally, there is also a method |g:incoming()|.
+--
+-- To iterate over all arcs of a graph you can say:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--for _,v in ipairs(g.vertices) do
+-- for _,a in ipairs(g:outgoing(v)) do
+-- ...
+-- end
+--end
+--\end{codeexample}
+--
+-- However, it will often be more convenient and, in case the there
+-- are far less arcs than vertices, also faster to write
+--
+--\begin{codeexample}[code only, tikz syntax=false]
+--for _,a in ipairs(g.arcs) do
+-- ...
+--end
+--\end{codeexample}
+--
+-- @field arcs For any two vertices |t| and |h| of a graph, there may
+-- or may not be
+-- an arc from |t| to |h|. If this is the case, there is an |Arc|
+-- object that represents this arc. Note that, since |Digraph|s are
+-- always simple graphs, there can be at most one such object for every
+-- pair of vertices. However, you can store any information you like for
+-- an |Arc| through a |Storage|, see the |Storage| class for
+-- details. Each |Arc| for an edge of the syntactic digraph stores
+-- an array called |syntactic_edges| of all the multiple edges that
+-- are present in the user's input.
+--
+-- Unlike vertices, the arc objects of a graph are always local to a
+-- graph; an |Arc| object can never be part of two digraphs at the same
+-- time. For this reason, while for vertices it makes sense to create
+-- |Vertex| objects independently of any |Digraph| objects, it is not
+-- possible to instantiate an |Arc| directly: only the |Digraph| method
+-- |connect| is allowed to create new |Arc| objects and it will return
+-- any existing arcs instead of creating new ones, if there is already
+-- an arc present between two nodes.
+--
+-- The |arcs| field of a digraph contains a |LookupTable| of all arc
+-- objects present in the |Digraph|. Although you can access this field
+-- normally and use it in |ipairs| to iterate over all arcs of a graph,
+-- note that this array is actually ``reconstructed lazily'' whenever
+-- an arc is deleted from the graph. What happens is the following: As
+-- long as you just add arcs to a graph, the |arcs| array gets updated
+-- normally. However, when you remove an arc from a graph, the arc does
+-- not get removed from the |arcs| array (which would be an expensive
+-- operation). Instead, the |arcs| array is invalidated (internally set
+-- to |nil|), allowing us to perform a |disconnect| in time
+-- $O(1)$. The |arcs| array is then ignored until the next time it is
+-- accessed, for instance when a user says |ipairs(g.arcs)|. At this
+-- point, the |arcs| array is reconstructed by adding all arcs of all
+-- nodes to it.
+--
+-- The bottom line of the behavior of the |arcs| field is that (a) the
+-- ordering of the elements may change abruptly whenever you remove an
+-- arc from a graph and (b) performing $k$ |disconnect| operations in
+-- sequence takes time $O(k)$, provided you do not access the |arcs|
+-- field between calls.
+--
+-- @field syntactic_digraph is a reference to the syntactic digraph
+-- from which this graph stems ultimately. This may be a cyclic
+-- reference to the graph itself.
+-- @field options If present, it will be a table storing
+-- the options set for the syntactic digraph.
+--
+local Digraph = {}
+
+local function recalc_arcs (digraph)
+ local arcs = {}
+ local vertices = digraph.vertices
+ for i=1,#vertices do
+ local out = vertices[i].outgoings[digraph]
+ for j=1,#out do
+ arcs[#arcs + 1] = out[j]
+ end
+ end
+ digraph.arcs = arcs
+ return arcs
+end
+
+Digraph.__index =
+ function (t, k)
+ if k == "arcs" then
+ return recalc_arcs(t)
+ else
+ return rawget(Digraph,k)
+ end
+ end
+
+
+
+-- Namespace
+require("pgf.gd.model").Digraph = Digraph
+
+-- Imports
+local Arc = require "pgf.gd.model.Arc"
+local LookupTable = require "pgf.gd.lib.LookupTable"
+local Vertex = require "pgf.gd.model.Vertex"
+
+
+
+
+
+---
+-- Graphs are created using the |new| method, which takes a table of
+-- |initial| values as input (like most |new| methods in the graph
+-- drawing system). It is permissible that this table of initial values
+-- has a |vertices| field, in which case this array will be copied. In
+-- contrast, an |arcs| field in the table will be ignored -- newly
+-- created graphs always have an empty arcs set. This means that
+-- writing |Digraph.new(g)| where |g| is a graph creates a new graph
+-- whose vertex set is the same as |g|'s, but where there are no edges:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local g = Digraph.new {}
+--g:add { v1, v2, v3 }
+--g:connect (v1, v2)
+--
+--local h = Digraph.new (g)
+--assert (h:contains(v1))
+--assert (not h:arc(v1, v2))
+--\end{codeexample}
+--
+-- To completely copy a graph, including all arcs, you have to write:
+--\begin{codeexample}[code only, tikz syntax=false]
+--local h = Digraph.new (g)
+--for _,a in ipairs(g.arcs) do h:connect(a.tail, a.head) end
+--\end{codeexample}
+--
+-- This operation takes time $O(1)$.
+--
+-- @param initial A table of initial values. It is permissible that
+-- this array contains a |vertices| field. In this
+-- case, this field must be an array and its entries
+-- must be nodes, which will be inserted. If initial
+-- has an |arcs| field, this field will be ignored.
+-- The table must contain a field |syntactic_digraph|,
+-- which should normally be the syntactic digraph of
+-- the graph, but may also be the string |"self"|, in
+-- which case it will be set to the newly created
+-- (syntactic) digraph.
+-- @return A newly-allocated digraph.
+--
+function Digraph.new(initial)
+ local digraph = {}
+ setmetatable(digraph, Digraph)
+
+ if initial then
+ for k,v in pairs(initial or {}) do
+ digraph [k] = v
+ end
+ end
+
+ local vertices = digraph.vertices
+ digraph.vertices = {}
+ digraph.arcs = {}
+
+ if vertices then
+ digraph:add(vertices)
+ end
+ return digraph
+end
+
+
+--- Add vertices to a digraph.
+--
+-- This operation takes time $O(|\verb!array!|)$.
+--
+-- @param array An array of to-be-added vertices.
+--
+function Digraph:add(array)
+ local vertices = self.vertices
+ for i=1,#array do
+ local v = array[i]
+ if not vertices[v] then
+ vertices[v] = true
+ vertices[#vertices + 1] = v
+ v.incomings[self] = {}
+ v.outgoings[self] = {}
+ end
+ end
+end
+
+
+--- Remove vertices from a digraph.
+--
+-- This operation removes an array of vertices from a graph. The
+-- operation takes time linear in the number of vertices, regardless of
+-- how many vertices are to be removed. Thus, it will be (much) faster
+-- to delete many vertices by first compiling them in an array and to
+-- then delete them using one call to this method.
+--
+-- This operation takes time $O(\max\{|\verb!array!|, |\verb!self.vertices!|\})$.
+--
+-- @param array The to-be-removed vertices.
+--
+function Digraph:remove(array)
+ local vertices = self.vertices
+
+ -- Mark all to-be-deleted nodes
+ for i=1,#array do
+ local v = array[i]
+ assert(vertices[v], "to-be-deleted node is not in graph")
+ vertices[v] = false
+ end
+
+ -- Disconnect them
+ for i=1,#array do
+ self:disconnect(array[i])
+ end
+
+ LookupTable.remove(self.vertices, array)
+end
+
+
+
+--- Test, whether a graph contains a given vertex.
+--
+-- This operation takes time $O(1)$.
+--
+-- @param v The vertex to be tested.
+--
+function Digraph:contains(v)
+ return v and self.vertices[v] == true
+end
+
+
+
+
+---
+-- Returns the arc between two nodes, provided it exists. Otherwise,
+-- |nil| is returned.
+--
+-- This operation takes time $O(1)$.
+--
+-- @param tail The tail vertex
+-- @param head The head vertex
+--
+-- @return The arc object connecting them
+--
+function Digraph:arc(tail, head)
+ local out = tail.outgoings[self]
+ if out then
+ return out[head]
+ end
+end
+
+
+
+---
+-- Returns an array containing the outgoing arcs of a vertex. You may
+-- only iterate over his array using ipairs, not using pairs.
+--
+-- This operation takes time $O(1)$.
+--
+-- @param v The vertex
+--
+-- @return An array of all outgoing arcs of this vertex (all arcs
+-- whose tail is the vertex)
+--
+function Digraph:outgoing(v)
+ return assert(v.outgoings[self], "vertex not in graph")
+end
+
+
+
+---
+-- Sorts the array of outgoing arcs of a vertex. This allows you to
+-- later iterate over the outgoing arcs in a specific order.
+--
+-- This operation takes time $O(|\verb!outgoing!| \log |\verb!outgoings!|)$.
+--
+-- @param v The vertex
+-- @param f A comparison function that is passed to |table.sort|
+--
+function Digraph:sortOutgoing(v, f)
+ table.sort(assert(v.outgoings[self], "vertex not in graph"), f)
+end
+
+
+---
+-- Reorders the array of outgoing arcs of a vertex. The parameter array
+-- \emph{must} contain the same set of vertices as the outgoing array,
+-- but possibly in a different order.
+--
+-- This operation takes time $O(|\verb!outgoing!|)$, where |outgoing|
+-- is the array of |v|'s outgoing arcs in |self|.
+--
+-- @param v The vertex
+-- @param vertices An array containing the outgoing vertices in some order.
+--
+function Digraph:orderOutgoing(v, vertices)
+ local outgoing = assert (v.outgoings[self], "vertex not in graph")
+ assert (#outgoing == #vertices)
+
+ -- Create back hash
+ local lookup = {}
+ for i=1,#vertices do
+ lookup[vertices[i]] = i
+ end
+
+ -- Compute ordering of the arcs
+ local reordered = {}
+ for _,arc in ipairs(outgoing) do
+ reordered [lookup[arc.head]] = arc
+ end
+
+ -- Copy back
+ for i=1,#outgoing do
+ outgoing[i] = assert(reordered[i], "illegal vertex order")
+ end
+end
+
+
+
+--- See |outgoing|.
+--
+function Digraph:incoming(v)
+ return assert(v.incomings[self], "vertex not in graph")
+end
+
+
+---
+-- See |sortOutgoing|.
+--
+function Digraph:sortIncoming(v, f)
+ table.sort(assert(v.incomings[self], "vertex not in graph"), f)
+end
+
+
+---
+-- See |orderOutgoing|.
+--
+function Digraph:orderIncoming(v, vertices)
+ local incoming = assert (v.incomings[self], "vertex not in graph")
+ assert (#incoming == #vertices)
+
+ -- Create back hash
+ local lookup = {}
+ for i=1,#vertices do
+ lookup[vertices[i]] = i
+ end
+
+ -- Compute ordering of the arcs
+ local reordered = {}
+ for _,arc in ipairs(incoming) do
+ reordered [lookup[arc.head]] = arc
+ end
+
+ -- Copy back
+ for i=1,#incoming do
+ incoming[i] = assert(reordered[i], "illegal vertex order")
+ end
+end
+
+
+
+
+
+---
+-- Connects two nodes by an arc and returns the newly created arc
+-- object. If they are already connected, the existing arc is returned.
+--
+-- This operation takes time $O(1)$.
+--
+-- @param s The tail vertex
+-- @param t The head vertex (may be identical to |tail| in case of a
+-- loop)
+--
+-- @return The arc object connecting them (either newly created or
+-- already existing)
+--
+function Digraph:connect(s, t)
+ assert (s and t and self.vertices[s] and self.vertices[t], "trying connect nodes not in graph")
+
+ local s_outgoings = s.outgoings[self]
+ local arc = s_outgoings[t]
+
+ if not arc then
+ -- Ok, create and insert new arc object
+ arc = {
+ tail = s,
+ head = t,
+ option_cache = {},
+ syntactic_digraph = self.syntactic_digraph,
+ syntactic_edges = {}
+ }
+ setmetatable(arc, Arc)
+
+ -- Insert into outgoings:
+ s_outgoings [#s_outgoings + 1] = arc
+ s_outgoings [t] = arc
+
+ local t_incomings = t.incomings[self]
+ -- Insert into incomings:
+ t_incomings [#t_incomings + 1] = arc
+ t_incomings [s] = arc
+
+ -- Insert into arcs field, if it exists:
+ local arcs = rawget(self, "arcs")
+ if arcs then
+ arcs[#arcs + 1] = arc
+ end
+ end
+
+ return arc
+end
+
+
+
+
+---
+-- Disconnect either a single vertex |v| from all its neighbors (remove all
+-- incoming and outgoing arcs of this vertex) or, in case two nodes
+-- are given as parameter, remove the arc between them, if it exists.
+--
+-- This operation takes time $O(|I_v| + |I_t|)$, where $I_x$ is the set
+-- of vertices incident to $x$, to remove the single arc between $v$ and
+-- $v$. For a single vertex $v$, it takes time $O(\sum_{y: \text{there is some
+-- arc between $v$ and $y$ or $y$ and $v$}} |I_y|)$.
+--
+-- @param v The single vertex or the tail vertex
+-- @param t The head vertex
+--
+function Digraph:disconnect(v, t)
+ if t then
+ -- Case 2: Remove a single arc.
+ local s_outgoings = assert(v.outgoings[self], "tail node not in graph")
+ local t_incomings = assert(t.incomings[self], "head node not in graph")
+
+ if s_outgoings[t] then
+ -- Remove:
+ s_outgoings[t] = nil
+ for i=1,#s_outgoings do
+ if s_outgoings[i].head == t then
+ table.remove (s_outgoings, i)
+ break
+ end
+ end
+ t_incomings[v] = nil
+ for i=1,#t_incomings do
+ if t_incomings[i].tail == v then
+ table.remove (t_incomings, i)
+ break
+ end
+ end
+ self.arcs = nil -- invalidate arcs field
+ end
+ else
+ -- Case 1: Remove all arcs incident to v:
+
+ -- Step 1: Delete all incomings arcs:
+ local incomings = assert(v.incomings[self], "node not in graph")
+ local vertices = self.vertices
+
+ for i=1,#incomings do
+ local s = incomings[i].tail
+ if s ~= v and vertices[s] then -- skip self-loop and to-be-deleted nodes
+ -- Remove this arc from s:
+ local s_outgoings = s.outgoings[self]
+ s_outgoings[v] = nil
+ for i=1,#s_outgoings do
+ if s_outgoings[i].head == v then
+ table.remove (s_outgoings, i)
+ break
+ end
+ end
+ end
+ end
+
+ -- Step 2: Delete all outgoings arcs:
+ local outgoings = v.outgoings[self]
+ for i=1,#outgoings do
+ local t = outgoings[i].head
+ if t ~= v and vertices[t] then
+ local t_incomings = t.incomings[self]
+ t_incomings[v] = nil
+ for i=1,#t_incomings do
+ if t_incomings[i].tail == v then
+ table.remove (t_incomings, i)
+ break
+ end
+ end
+ end
+ end
+
+ if #incomings > 0 or #outgoings > 0 then
+ self.arcs = nil -- invalidate arcs field
+ end
+
+ -- Step 3: Reset incomings and outgoings fields
+ v.incomings[self] = {}
+ v.outgoings[self] = {}
+ end
+end
+
+
+
+
+---
+-- An arc is changed so that instead of connecting |self.tail|
+-- and |self.head|, it now connects a new |head| and |tail|. The
+-- difference to first disconnecting and then reconnecting is that all
+-- fields of the arc (other than |head| and |tail|, of course), will
+-- be ``moved along''. Reconnecting an arc in the same way as before has no
+-- effect.
+--
+-- If there is already an arc at the new position, fields of the
+-- to-be-reconnected arc overwrite fields of the original arc. This is
+-- especially dangerous with a syntactic digraph, so do not reconnect
+-- arcs of the syntactic digraph (which you should not do anyway).
+--
+-- The |arc| object may no longer be valid after a reconnect, but the
+-- operation returns the new arc object.
+--
+-- This operation needs the time of a disconnect (if necessary).
+--
+-- @param arc The original arc object
+-- @param tail The new tail vertex
+-- @param head The new head vertex
+--
+-- @return The new arc object connecting them (either newly created or
+-- already existing)
+--
+function Digraph:reconnect(arc, tail, head)
+ assert (arc and tail and head, "connect with nil parameters")
+
+ if arc.head == head and arc.tail == tail then
+ -- Nothing to be done
+ return arc
+ else
+ local new_arc = self:connect(tail, head)
+
+ for k,v in pairs(arc) do
+ if k ~= "head" and k ~= "tail" then
+ new_arc[k] = v
+ end
+ end
+
+ -- Remove old arc:
+ self:disconnect(arc.tail, arc.head)
+
+ return new_arc
+ end
+end
+
+
+
+---
+-- Collapse a set of vertices into a single vertex
+--
+-- Often, algorithms will wish to treat a whole set of vertices ``as a
+-- single vertex''. The idea is that a new vertex is then inserted
+-- into the graph, and this vertex is connected to all vertices to
+-- which any of the original vertices used to be connected.
+--
+-- The |collapse| method takes an array of to-be-collapsed vertices as
+-- well as a vertex. First, it will store references to the
+-- to-be-collapsed vertices inside the vertex. Second, we iterate over
+-- all arcs of the to-be-collapsed vertices. If this arc connects a
+-- to-be-collapsed vertex with a not-to-be-collapsed vertex, the
+-- not-to-be-collapsed vertex is connected to the collapse
+-- vertex. Additionally, the arc is stored at the vertex.
+--
+-- Note that the collapse vertex will be added to the graph if it is
+-- not already an element. The collapsed vertices will not be removed
+-- from the graph, so you must remove them yourself, if necessary.
+--
+-- A collapse vertex will store the collapsed vertices so that you can
+-- call |expand| later on to ``restore'' the vertices and arcs that
+-- were saved during a collapse. This storage is \emph{not} local to
+-- the graph in which the collapse occurred.
+--
+-- @param collapse_vertices An array of to-be-collapsed vertices
+-- @param collapse_vertex The vertex that represents the collapse. If
+-- missing, a vertex will be created automatically and added to the graph.
+-- @param vertex_fun This function is called for each to-be-collapsed
+-- vertex. The parameters are the collapse vertex and the
+-- to-be-collapsed vertex. May be |nil|.
+-- @param arc_fun This function is called whenever a new arc is added
+-- between |rep| and some other vertex. The arguments are the new arc
+-- and the original arc. May be |nil|.
+--
+-- @return The new vertex that represents the collapsed vertices.
+
+function Digraph:collapse(collapse_vertices, collapse_vertex, vertex_fun, arc_fun)
+
+
+ -- Create and add node, if necessary.
+ if not collapse_vertex then
+ collapse_vertex = Vertex.new {}
+ end
+ self:add {collapse_vertex}
+
+ -- Copy the collapse_vertices and create lookup
+ local cvs = {}
+ for i=1,#collapse_vertices do
+ local v = collapse_vertices[i]
+ cvs[i] = v
+ cvs[v] = true
+ end
+ assert (cvs[collapse_vertex] ~= true, "collapse_vertex is in collapse_vertices")
+
+ -- Connected collapse_vertex appropriately
+ local collapsed_arcs = {}
+
+ if not arc_fun then
+ arc_fun = function () end
+ end
+
+ for _,v in ipairs(cvs) do
+ if vertex_fun then
+ vertex_fun (collapse_vertex, v)
+ end
+ for _,a in ipairs(v.outgoings[self]) do
+ if cvs[a.head] ~= true then
+ arc_fun (self:connect(collapse_vertex, a.head), a)
+ collapsed_arcs[#collapsed_arcs + 1] = a
+ end
+ end
+ for _,a in ipairs(v.incomings[self]) do
+ if cvs[a.tail] ~= true then
+ arc_fun (self:connect(a.tail, collapse_vertex), a)
+ end
+ collapsed_arcs[#collapsed_arcs + 1] = a
+ end
+ end
+
+ -- Remember the old vertices.
+ collapse_vertex.collapsed_vertices = cvs
+ collapse_vertex.collapsed_arcs = collapsed_arcs
+
+ return collapse_vertex
+end
+
+
+
+---
+-- Expand a previously collapsed vertex.
+--
+-- If you have collapsed a set of vertices in a graph using
+-- |collapse|, you can expand this set once more using this method. It
+-- will add all vertices that were previously removed from the graph
+-- and will also reinstall the deleted arcs. The collapse vertex is
+-- not removed.
+--
+-- @param vertex A to-be-expanded vertex that was previously returned
+-- by |collapse|.
+-- @param vertex_fun A function that is called once for each
+-- reinserted vertex. The parameters are the collapse vertex and the
+-- reinstalled vertex. May be |nil|.
+-- @param arc_fun A function that is called once for each
+-- reinserted arc. The parameter is the arc and the |vertex|. May be |nil|.
+--
+function Digraph:expand(vertex, vertex_fun, arc_fun)
+ local cvs = assert(vertex.collapsed_vertices, "no expand information stored")
+
+ -- Add all vertices:
+ self:add(cvs)
+ if vertex_fun then
+ for _,v in ipairs(cvs) do
+ vertex_fun(vertex, v)
+ end
+ end
+
+ -- Add all arcs:
+ for _,arc in ipairs(vertex.collapsed_arcs) do
+ local new_arc = self:connect(arc.tail, arc.head)
+
+ for k,v in pairs(arc) do
+ if k ~= "head" and k ~= "tail" then
+ new_arc[k] = v
+ end
+ end
+
+ if arc_fun then
+ arc_fun(new_arc, vertex)
+ end
+ end
+end
+
+
+
+
+
+---
+-- Invokes the |sync| method for all arcs of the graph.
+--
+-- @see Arc:sync()
+--
+function Digraph:sync()
+ for _,a in ipairs(self.arcs) do
+ a:sync()
+ end
+end
+
+
+
+---
+-- Computes a string representation of this graph including all nodes
+-- and edges. The syntax of this representation is such that it can be
+-- used directly in \tikzname's |graph| syntax.
+--
+-- @return |self| as string.
+--
+function Digraph:__tostring()
+ local vstrings = {}
+ local astrings = {}
+ for i,v in ipairs(self.vertices) do
+ vstrings[i] = " " .. tostring(v) .. "[x=" .. math.floor(v.pos.x) .. "pt,y=" .. math.floor(v.pos.y) .. "pt]"
+ local out_arcs = v.outgoings[self]
+ if #out_arcs > 0 then
+ local t = {}
+ for j,a in ipairs(out_arcs) do
+ t[j] = tostring(a.head)
+ end
+ astrings[#astrings + 1] = " " .. tostring(v) .. " -> { " .. table.concat(t,", ") .. " }"
+ end
+ end
+ return "graph [id=" .. tostring(self.vertices) .. "] {\n {\n" ..
+ table.concat(vstrings, ",\n") .. "\n }; \n" ..
+ table.concat(astrings, ";\n") .. "\n}";
+end
+
+
+
+
+-- Done
+
+return Digraph
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Edge.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Edge.lua
new file mode 100644
index 0000000000..45cbc60f9f
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Edge.lua
@@ -0,0 +1,209 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- An |Edge| is a ``syntactic'' connection between two
+-- vertices that represents a connection present in the syntactic
+-- digraph. Unlike an |Arc|, |Edge| objects are not controlled by the
+-- |Digraph| class. Also unlike |Arc| objects, there can be several
+-- edges between the same vertices, namely whenever several such edges
+-- are present in the syntactic digraph.
+--
+-- In detail, the relationship between arcs and edges is as follows:
+-- If there is an |Edge| between two vertices $u$ and $v$ in the
+-- syntactic digraph, there will be an |Arc| from $u$ to $v$ and the
+-- array |syntactic_edges| of this |Arc| object will contain the
+-- |Edge| object. In particular, if there are several edges between
+-- the same vertices, all of these edges will be part of the array in
+-- a single |Arc| object.
+--
+-- Edges, like arcs, are always directed from a |tail| vertex to a
+-- |head| vertex; this is true even for undirected vertices. The
+-- |tail| vertex will always be the vertex that came first in the
+-- syntactic specification of the edge, the |head| vertex is the
+-- second one. Whether
+-- an edge is directed or not depends on the |direction| of the edge, which
+-- may be one of the following:
+-- %
+-- \begin{enumerate}
+-- \item |"->"|
+-- \item |"--"|
+-- \item |"<-"|
+-- \item |"<->"|
+-- \item |"-!-"|
+-- \end{enumerate}
+--
+--
+-- @field head The head vertex of this edge.
+--
+-- @field tail The tail vertex of this edge.
+--
+-- @field event The creation |Event| of this edge.
+--
+-- @field options A table of options that contains user-defined options.
+--
+-- @field direction One of the directions named above.
+--
+-- @field path A |Path| object that describes the path of the
+-- edge. The path's coordinates are interpreted \emph{absolutely}.
+--
+-- @field generated_options This is an options array that is generated
+-- by the algorithm. When the edge is rendered later on, this array
+-- will be passed back to the display layer. The syntax is the same as
+-- for the |declare_parameter_sequence| function, see
+-- |InterfaceToAlgorithms|.
+--
+-- @field animations An array of animations, see the |animations|
+-- field of the |Vertex| class for the syntax.
+
+local Edge = {}
+Edge.__index = Edge
+
+
+-- Namespace
+
+require("pgf.gd.model").Edge = Edge
+
+
+-- Imports
+
+local Path = require "pgf.gd.model.Path"
+
+
+---
+-- Create a new edge. The |initial| parameter allows you to setup
+-- some initial values.
+--
+-- @usage
+--\begin{codeexample}[code only, tikz syntax=false]
+--local v = Edge.new { tail = v1, head = v2 }
+--\end{codeexample}
+--
+-- @param initial Values to override defaults. --
+-- @return A new edge object.
+--
+function Edge.new(values)
+ local new = {}
+ for k,v in pairs(values) do
+ new[k] = v
+ end
+ new.generated_options = new.generated_options or {}
+ new.animations = new.animations or {}
+ if not new.path then
+ local p = Path.new ()
+ p:appendMoveto(Edge.tailAnchorForEdgePath(new))
+ p:appendLineto(Edge.headAnchorForEdgePath(new))
+ new.path = p
+ end
+
+ return setmetatable(new, Edge)
+end
+
+
+
+
+---
+-- This method returns a ``coordinate factory'' that can be used as
+-- the coordinate of a |moveto| at the beginning of a path starting at
+-- the |tail| of the arc. Suppose you want to create a path starting
+-- at the tail vertex, going to the coordinate $(10,10)$ and ending at
+-- the head vertex. The trouble is that when you create the path
+-- corresponding to this route, you typically do not know where the
+-- tail vertex is going to be. In this case, you use this
+-- method to get a function that will, later on, compute the correct
+-- position of the anchor as needed.
+--
+-- Note that you typically do not use this function, but use the
+-- corresponding function of the |Arc| class. Use this function only
+-- if there are multiple edges between two vertices that need to be
+-- routed differently.
+--
+-- Here is the code you would use to create the above-mentioned path:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--local a = g:connect(tail,head)
+--local e = a.syntactic_edges[1]
+--...
+--e.path = Path.new()
+--e.path:appendMoveto(e:tailAnchorForEdgePath())
+--e.path:appendLineto(10, 10)
+--e.path:appendLineto(e:headAnchorForEdgePath())
+--\end{codeexample}
+--
+-- As for the |Arc| class, you can also setup a polyline more easily:
+-- %
+--\begin{codeexample}[code only, tikz syntax=false]
+--e:setPolylinePath { Coordinate.new (10, 10) }
+--\end{codeexample}
+
+function Edge:tailAnchorForEdgePath()
+ return function ()
+ local a = self.options['tail anchor']
+ if a == "" then
+ a = "center"
+ end
+ return self.tail:anchor(a) + self.tail.pos
+ end
+end
+
+---
+-- See |Arc:tailAnchorForArcPath|.
+
+function Edge:headAnchorForEdgePath()
+ return function ()
+ local a = self.options['head anchor']
+ if a == "" then
+ a = "center"
+ end
+ return self.head:anchor(a) + self.head.pos
+ end
+end
+
+
+
+---
+-- Setup the |path| field of an edge in such a way that it corresponds
+-- to a sequence of straight line segments starting at the tail's
+-- anchor and ending at the head's anchor.
+--
+-- @param coordinates An array of |Coordinates| through which the line
+-- will go through.
+
+function Edge:setPolylinePath(coordinates)
+ local p = Path.new ()
+
+ p:appendMoveto(self:tailAnchorForEdgePath())
+
+ for _,c in ipairs(coordinates) do
+ p:appendLineto(c)
+ end
+
+ p:appendLineto(self:headAnchorForEdgePath())
+
+ self.path = p
+end
+
+
+
+--
+-- Returns a string representation of an edge. This is mainly for debugging.
+--
+-- @return The Edge as a string.
+--
+function Edge:__tostring()
+ return tostring(self.tail) .. self.direction .. tostring(self.head)
+end
+
+
+-- Done
+
+return Edge
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Hyperedge.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Hyperedge.lua
new file mode 100644
index 0000000000..cc265023fa
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Hyperedge.lua
@@ -0,0 +1,56 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Hyperedges}
+--
+-- @end
+
+
+-- Includes
+
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+
+---
+
+declare {
+ key = "hyper",
+ layer = -10,
+
+ summary = [["
+ A \emph{hyperedge} of a graph does not connect just two nodes, but
+ is any subset of the node set (although a normal edge is also a
+ hyperedge that happens to contain just two nodes). Internally, a
+ collection of kind |hyper| is created. Currently, there is
+ no default renderer for hyper edges.
+ "]],
+ documentation = [["
+\begin{codeexample}[code only]
+\graph {
+ % The nodes:
+ a, b, c, d;
+
+ % The edges:
+ {[hyper] a,b,c};
+ {[hyper] b,c,d};
+ {[hyper] a,c};
+ {[hyper] d}
+};
+\end{codeexample}
+ "]]
+}
+
+-- Done
+
+return Hyperedge \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path.lua
new file mode 100644
index 0000000000..cbd0f079bf
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path.lua
@@ -0,0 +1,1278 @@
+-- Copyright 2014 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- A Path models a path in the plane.
+--
+-- Following the PostScript/\textsc{pdf}/\textsc{svg} convention, a
+-- path consists of a series of path segments, each of which can be
+-- closed or not. Each path segment, in turn, consists of a series of
+-- Bézier curves and straight line segments; see
+-- Section~\ref{section-paths} for an introduction to paths in
+-- general.
+--
+-- A |Path| object is a table whose array part stores
+-- |Coordinate| objects, |strings|, and |function|s that
+-- describe the path of the edge. The following strings are allowed in
+-- this array:
+-- %
+-- \begin{itemize}
+-- \item |"moveto"| The line's path should stop at the current
+-- position and then start anew at the next coordinate in the array.
+-- \item |"lineto"| The line should continue from the current position
+-- to the next coordinate in the array.
+-- \item |"curveto"| The line should continue form the current
+-- position with a Bézier curve that is specified by the next three
+-- |Coordinate| objects (in the usual manner).
+-- \item |"closepath"| The line's path should be ``closed'' in the sense
+-- that the current subpath that was started with the most recent
+-- moveto operation should now form a closed curve.
+-- \end{itemize}
+--
+-- Instead of a |Coordinate|, a |Path| may also contain a function. In
+-- this case, the function, when called, must return the |Coordinate|
+-- that is ``meant'' by the position. This allows algorithms to
+-- add coordinates to a path that are still not fixed at the moment
+-- they are added to the path.
+
+local Path = {}
+Path.__index = Path
+
+
+-- Namespace
+
+require("pgf.gd.model").Path = Path
+
+
+-- Imports
+
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Bezier = require "pgf.gd.lib.Bezier"
+
+local lib = require "pgf.gd.lib"
+
+
+-- Private function
+
+function Path.rigid (x)
+ if type(x) == "function" then
+ return x()
+ else
+ return x
+ end
+end
+
+local rigid = Path.rigid
+
+
+---
+-- Creates an empty path.
+--
+-- @param initial A table containing an array of strings and
+-- coordinates that constitute the path. Coordinates may be given as
+-- tables or as a pair of numbers. In this case, each pair of numbers
+-- is converted into one coordinate. If omitted, a new empty path
+-- is created.
+--
+-- @return A empty Path
+--
+function Path.new(initial)
+ if initial then
+ local new = {}
+ local i = 1
+ local count = 0
+ while i <= #initial do
+ local e = initial[i]
+ if type(e) == "string" then
+ assert (count == 0, "illformed path")
+ if e == "moveto" then
+ count = 1
+ elseif e == "lineto" then
+ count = 1
+ elseif e == "closepath" then
+ count = 0
+ elseif e == "curveto" then
+ count = 3
+ else
+ error ("unknown path command " .. e)
+ end
+ new[#new+1] = e
+ elseif type(e) == "number" then
+ if count == 0 then
+ new[#new+1] = "lineto"
+ else
+ count = count - 1
+ end
+ new[#new+1] = Coordinate.new(e,initial[i+1])
+ i = i + 1
+ elseif type(e) == "table" or type(e) == "function" then
+ if count == 0 then
+ new[#new+1] = "lineto"
+ else
+ count = count - 1
+ end
+ new[#new+1] = e
+ else
+ error ("invalid object on path")
+ end
+ i = i + 1
+ end
+ return setmetatable(new, Path)
+ else
+ return setmetatable({}, Path)
+ end
+end
+
+
+---
+-- Creates a copy of a path.
+--
+-- @return A copy of the path
+
+function Path:clone()
+ local new = {}
+ for _,x in ipairs(self) do
+ if type(x) == "table" then
+ new[#new+1] = x:clone()
+ else
+ new[#new+1] = x
+ end
+ end
+ return setmetatable(new, Path)
+end
+
+
+
+---
+-- Returns the path in reverse order.
+--
+-- @return A copy of the reversed path
+
+function Path:reversed()
+
+ -- First, build segments
+ local subpaths = {}
+ local subpath = {}
+
+ local function closepath ()
+ if subpath.start then
+ subpaths [#subpaths + 1] = subpath
+ subpath = {}
+ end
+ end
+
+ local prev
+ local start
+
+ local i = 1
+ while i <= #self do
+ local x = self[i]
+ if x == "lineto" then
+ subpath[#subpath+1] = {
+ action = 'lineto',
+ from = prev,
+ to = self[i+1]
+ }
+ prev = self[i+1]
+ i = i + 2
+ elseif x == "moveto" then
+ closepath()
+ prev = self[i+1]
+ start = prev
+ subpath.start = prev
+ i = i + 2
+ elseif x == "closepath" then
+ subpath [#subpath + 1] = {
+ action = "closepath",
+ from = prev,
+ to = start,
+ }
+ prev = nil
+ start = nil
+ closepath()
+ i = i + 1
+ elseif x == "curveto" then
+ local s1, s2, to = self[i+1], self[i+2], self[i+3]
+ subpath [#subpath + 1] = {
+ action = "curveto",
+ from = prev,
+ to = to,
+ support_1 = s1,
+ support_2 = s2,
+ }
+ prev = self[i+3]
+ i = i + 4
+ else
+ error ("illegal path command '" .. x .. "'")
+ end
+ end
+ closepath ()
+
+ local new = Path.new ()
+
+ for _,subpath in ipairs(subpaths) do
+ if #subpath == 0 then
+ -- A subpath that consists only of a moveto:
+ new:appendMoveto(subpath.start)
+ else
+ -- We start with a moveto to the end point:
+ new:appendMoveto(subpath[#subpath].to)
+
+ -- Now walk backwards:
+ for i=#subpath,1,-1 do
+ if subpath[i].action == "lineto" then
+ new:appendLineto(subpath[i].from)
+ elseif subpath[i].action == "closepath" then
+ new:appendLineto(subpath[i].from)
+ elseif subpath[i].action == "curveto" then
+ new:appendCurveto(subpath[i].support_2,
+ subpath[i].support_1,
+ subpath[i].from)
+ else
+ error("illegal path command")
+ end
+ end
+
+ -- Append a closepath, if necessary
+ if subpath[#subpath].action == "closepath" then
+ new:appendClosepath()
+ end
+ end
+ end
+
+ return new
+end
+
+
+---
+-- Transform all points on a path.
+--
+-- @param t A transformation, see |pgf.gd.lib.Transform|. It is
+-- applied to all |Coordinate| objects on the path.
+
+function Path:transform(t)
+ for _,c in ipairs(self) do
+ if type(c) == "table" then
+ c:apply(t)
+ end
+ end
+end
+
+
+---
+-- Shift all points on a path.
+--
+-- @param x An $x$-shift
+-- @param y A $y$-shift
+
+function Path:shift(x,y)
+ for _,c in ipairs(self) do
+ if type(c) == "table" then
+ c.x = c.x + x
+ c.y = c.y + y
+ end
+ end
+end
+
+
+---
+-- Shift by all points on a path.
+--
+-- @param x A coordinate
+
+function Path:shiftByCoordinate(x)
+ for _,c in ipairs(self) do
+ if type(c) == "table" then
+ c.x = c.x + x.x
+ c.y = c.y + x.y
+ end
+ end
+end
+
+
+---
+-- Makes the path empty.
+--
+
+function Path:clear()
+ for i=1,#self do
+ self[i] = nil
+ end
+end
+
+
+---
+-- Appends a |moveto| to the path.
+--
+-- @param x A |Coordinate| or |function| or, if the |y| parameter is
+-- not |nil|, a number that is the $x$-part of a coordinate.
+-- @param y The $y$-part of the coordinate.
+
+function Path:appendMoveto(x,y)
+ self[#self + 1] = "moveto"
+ self[#self + 1] = y and Coordinate.new(x,y) or x
+end
+
+
+---
+-- Appends a |lineto| to the path.
+--
+-- @param x A |Coordinate| or |function|, if the |y| parameter is not
+-- |nil|, a number that is the $x$-part of a coordinate.
+-- @param y The $y$-part of the coordinate.
+
+function Path:appendLineto(x,y)
+ self[#self + 1] = "lineto"
+ self[#self + 1] = y and Coordinate.new(x,y) or x
+end
+
+
+
+---
+-- Appends a |closepath| to the path.
+
+function Path:appendClosepath()
+ self[#self + 1] = "closepath"
+end
+
+
+---
+-- Appends a |curveto| to the path. There can be either three
+-- coordinates (or functions) as parameters (the two support points
+-- and the target) or six numbers, where two consecutive numbers form a
+-- |Coordinate|. Which case is meant is detected by the presence of a
+-- sixth non-nil parameter.
+
+function Path:appendCurveto(a,b,c,d,e,f)
+ self[#self + 1] = "curveto"
+ if f then
+ self[#self + 1] = Coordinate.new(a,b)
+ self[#self + 1] = Coordinate.new(c,d)
+ self[#self + 1] = Coordinate.new(e,f)
+ else
+ self[#self + 1] = a
+ self[#self + 1] = b
+ self[#self + 1] = c
+ end
+end
+
+
+
+
+
+
+---
+-- Makes a path ``rigid'', meaning that all coordinates that are only
+-- given as functions are replaced by the values these functions
+-- yield.
+
+function Path:makeRigid()
+ for i=1,#self do
+ self[i] = rigid(self[i])
+ end
+end
+
+
+---
+-- Returns an array of all coordinates that are present in a
+-- path. This means, essentially, that all strings are filtered out.
+--
+-- @return An array of all coordinate objects on the path.
+
+function Path:coordinates()
+ local cloud = {}
+ for i=1,#self do
+ local p = self[i]
+ if type(p) == "table" then
+ cloud[#cloud + 1] = p
+ elseif type(p) == "function" then
+ cloud[#cloud + 1] = p()
+ end
+ end
+ return cloud
+end
+
+
+---
+-- Returns a bounding box of the path. This will not necessarily be
+-- the minimal bounding box in case the path contains curves because,
+-- then, the support points of the curve are used for the computation
+-- rather than the actual bounding box of the path.
+--
+-- If the path contains no coordinates, all return values are 0.
+--
+-- @return |min_x| The minimum $x$ value of the bounding box of the path
+-- @return |min_y| The minimum $y$ value
+-- @return |max_x|
+-- @return |max_y|
+-- @return |center_x| The center of the bounding box
+-- @return |center_y|
+
+function Path:boundingBox()
+ if #self > 0 then
+ local min_x, min_y = math.huge, math.huge
+ local max_x, max_y = -math.huge, -math.huge
+
+ for i=1,#self do
+ local c = rigid(self[i])
+ if type(c) == "table" then
+ local x = c.x
+ local y = c.y
+ if x < min_x then min_x = x end
+ if y < min_y then min_y = y end
+ if x > max_x then max_x = x end
+ if y > max_y then max_y = y end
+ end
+ end
+
+ if min_x ~= math.huge then
+ return min_x, min_y, max_x, max_y, (min_x+max_x) / 2, (min_y+max_y) / 2
+ end
+ end
+ return 0, 0, 0, 0, 0, 0
+end
+
+
+-- Forwards
+
+local segmentize, bb, boxes_intersect, intersect_curves
+
+local eps = 0.0001
+
+
+
+---
+-- Computes all intersections of a path with another path and returns
+-- them as an array of coordinates. The intersections will be sorted
+-- ``along the path |self|''. The implementation uses a
+-- divide-and-conquer approach that should be reasonably fast in
+-- practice.
+--
+-- @param path Another path
+--
+-- @return Array of all intersections of |path| with |self| in the
+-- order they appear on |self|. Each entry of this array is a table
+-- with the following fields:
+-- %
+-- \begin{itemize}
+-- \item |index| The index of the segment in |self| where
+-- the intersection occurs.
+-- \item |time| The ``time'' at which a point traveling along the
+-- segment from its start point to its end point.
+-- \item |point| The point itself.
+-- \end{itemize}
+
+function Path:intersectionsWith(path)
+
+ local p1 = segmentize(self)
+ local memo1 = prepare_memo(p1)
+ local p2 = segmentize(path)
+ local memo2 = prepare_memo(p2)
+
+ local intersections = {}
+
+ local function intersect_segments(i1, i2)
+
+ local s1 = p1[i1]
+ local s2 = p2[i2]
+ local r = {}
+
+ if s1.action == 'lineto' and s2.action == 'lineto' then
+ local a = s2.to.x - s2.from.x
+ local b = s1.from.x - s1.to.x
+ local c = s2.from.x - s1.from.x
+ local d = s2.to.y - s2.from.y
+ local e = s1.from.y - s1.to.y
+ local f = s2.from.y - s1.from.y
+
+ local det = a*e - b*d
+
+ if math.abs(det) > eps*eps then
+ local t, s = (c*d - a*f)/det, (b*f - e*c)/det
+
+ if t >= 0 and t<=1 and s>=0 and s <= 1 then
+ local p = s1.from:clone()
+ p:moveTowards(s1.to, t)
+ return { { time = t, point = p } }
+ end
+ end
+ elseif s1.action == 'lineto' and s2.action == 'curveto' then
+ intersect_curves (0, 1,
+ s1.from.x, s1.from.y,
+ s1.from.x*2/3+s1.to.x*1/3, s1.from.y*2/3+s1.to.y*1/3,
+ s1.from.x*1/3+s1.to.x*2/3, s1.from.y*1/3+s1.to.y*2/3,
+ s1.to.x, s1.to.y,
+ s2.from.x, s2.from.y,
+ s2.support_1.x, s2.support_1.y,
+ s2.support_2.x, s2.support_2.y,
+ s2.to.x, s2.to.y,
+ r)
+ elseif s1.action == 'curveto' and s2.action == 'lineto' then
+ intersect_curves (0, 1,
+ s1.from.x, s1.from.y,
+ s1.support_1.x, s1.support_1.y,
+ s1.support_2.x, s1.support_2.y,
+ s1.to.x, s1.to.y,
+ s2.from.x, s2.from.y,
+ s2.from.x*2/3+s2.to.x*1/3, s2.from.y*2/3+s2.to.y*1/3,
+ s2.from.x*1/3+s2.to.x*2/3, s2.from.y*1/3+s2.to.y*2/3,
+ s2.to.x, s2.to.y,
+ r)
+ else
+ intersect_curves (0, 1,
+ s1.from.x, s1.from.y,
+ s1.support_1.x, s1.support_1.y,
+ s1.support_2.x, s1.support_2.y,
+ s1.to.x, s1.to.y,
+ s2.from.x, s2.from.y,
+ s2.support_1.x, s2.support_1.y,
+ s2.support_2.x, s2.support_2.y,
+ s2.to.x, s2.to.y,
+ r)
+ end
+ return r
+ end
+
+ local function intersect (i1, j1, i2, j2)
+
+ if i1 > j1 or i2 > j2 then
+ return
+ end
+
+ local bb1 = bb(i1, j1, memo1)
+ local bb2 = bb(i2, j2, memo2)
+
+ if boxes_intersect(bb1, bb2) then
+ -- Ok, need to do something
+ if i1 == j1 and i2 == j2 then
+ local intersects = intersect_segments (i1, i2)
+ for _,t in ipairs(intersects) do
+ intersections[#intersections+1] = {
+ time = t.time,
+ index = p1[i1].path_pos,
+ point = t.point
+ }
+ end
+ elseif i1 == j1 then
+ local m2 = math.floor((i2 + j2) / 2)
+ intersect(i1, j1, i2, m2)
+ intersect(i1, j1, m2+1, j2)
+ elseif i2 == j2 then
+ local m1 = math.floor((i1 + j1) / 2)
+ intersect(i1, m1, i2, j2)
+ intersect(m1+1, j1, i2, j2)
+ else
+ local m1 = math.floor((i1 + j1) / 2)
+ local m2 = math.floor((i2 + j2) / 2)
+ intersect(i1, m1, i2, m2)
+ intersect(m1+1, j1, i2, m2)
+ intersect(i1, m1, m2+1, j2)
+ intersect(m1+1, j1, m2+1, j2)
+ end
+ end
+ end
+
+ -- Run the recursion
+ intersect(1, #p1, 1, #p2)
+
+ -- Sort
+ table.sort(intersections, function(a,b)
+ return a.index < b.index or
+ a.index == b.index and a.time < b.time
+ end)
+
+ -- Remove duplicates
+ local remains = {}
+ remains[1] = intersections[1]
+ for i=2,#intersections do
+ local next = intersections[i]
+ local prev = remains[#remains]
+ if math.abs(next.point.x - prev.point.x) + math.abs(next.point.y - prev.point.y) > eps then
+ remains[#remains+1] = next
+ end
+ end
+
+ return remains
+end
+
+
+-- Returns true if two bounding boxes intersection
+
+function boxes_intersect (bb1, bb2)
+ return (bb1.max_x >= bb2.min_x - eps*eps and
+ bb1.min_x <= bb2.max_x + eps*eps and
+ bb1.max_y >= bb2.min_y - eps*eps and
+ bb1.min_y <= bb2.max_y + eps*eps)
+end
+
+
+-- Turns a path into a sequence of segments, each being either a
+-- lineto or a curveto from some point to another point. It also sets
+-- up a memorization array for the bounding boxes.
+
+function segmentize (path)
+
+ local prev
+ local start
+ local s = {}
+
+ local i = 1
+ while i <= #path do
+ local x = path[i]
+
+ if x == "lineto" then
+ x = rigid(path[i+1])
+ s [#s + 1] = {
+ path_pos = i,
+ action = "lineto",
+ from = prev,
+ to = x,
+ bb = {
+ min_x = math.min(prev.x, x.x),
+ max_x = math.max(prev.x, x.x),
+ min_y = math.min(prev.y, x.y),
+ max_y = math.max(prev.y, x.y),
+ }
+ }
+ prev = x
+ i = i + 2
+ elseif x == "moveto" then
+ prev = rigid(path[i+1])
+ start = prev
+ i = i + 2
+ elseif x == "closepath" then
+ s [#s + 1] = {
+ path_pos = i,
+ action = "lineto",
+ from = prev,
+ to = start,
+ bb = {
+ min_x = math.min(prev.x, start.x),
+ max_x = math.max(prev.x, start.x),
+ min_y = math.min(prev.y, start.y),
+ max_y = math.max(prev.y, start.y),
+ }
+ }
+ prev = nil
+ start = nil
+ i = i + 1
+ elseif x == "curveto" then
+ local s1, s2, to = rigid(path[i+1]), rigid(path[i+2]), rigid(path[i+3])
+ s [#s + 1] = {
+ action = "curveto",
+ path_pos = i,
+ from = prev,
+ to = to,
+ support_1 = s1,
+ support_2 = s2,
+ bb = {
+ min_x = math.min(prev.x, s1.x, s2.x, to.x),
+ max_x = math.max(prev.x, s1.x, s2.x, to.x),
+ min_y = math.min(prev.y, s1.y, s2.y, to.y),
+ max_y = math.max(prev.y, s1.y, s2.y, to.y),
+ }
+ }
+ prev = path[i+3]
+ i = i + 4
+ else
+ error ("illegal path command '" .. x .. "'")
+ end
+ end
+
+ return s
+end
+
+
+function prepare_memo (s)
+
+ local memo = {}
+
+ memo.base = #s
+
+ -- Fill memo table
+ for i,e in ipairs (s) do
+ memo[i*#s + i] = e.bb
+ end
+
+ return memo
+end
+
+
+-- This function computes the bounding box of all segments between i
+-- and j (inclusively)
+
+function bb (i, j, memo)
+ local b = memo[memo.base*i + j]
+ if not b then
+ assert (i < j, "memorization table filled incorrectly")
+
+ local mid = math.floor((i+j)/2)
+ local bb1 = bb (i, mid, memo)
+ local bb2 = bb (mid+1, j, memo)
+ b = {
+ min_x = math.min(bb1.min_x, bb2.min_x),
+ max_x = math.max(bb1.max_x, bb2.max_x),
+ min_y = math.min(bb1.min_y, bb2.min_y),
+ max_y = math.max(bb1.max_y, bb2.max_y)
+ }
+ memo[memo.base*i + j] = b
+ end
+
+ return b
+end
+
+
+
+-- Intersect two Bézier curves.
+
+function intersect_curves(t0, t1,
+ c1_ax, c1_ay, c1_bx, c1_by,
+ c1_cx, c1_cy, c1_dx, c1_dy,
+ c2_ax, c2_ay, c2_bx, c2_by,
+ c2_cx, c2_cy, c2_dx, c2_dy,
+ intersections)
+
+ -- Only do something, if the bounding boxes intersect:
+ local c1_min_x = math.min(c1_ax, c1_bx, c1_cx, c1_dx)
+ local c1_max_x = math.max(c1_ax, c1_bx, c1_cx, c1_dx)
+ local c1_min_y = math.min(c1_ay, c1_by, c1_cy, c1_dy)
+ local c1_max_y = math.max(c1_ay, c1_by, c1_cy, c1_dy)
+ local c2_min_x = math.min(c2_ax, c2_bx, c2_cx, c2_dx)
+ local c2_max_x = math.max(c2_ax, c2_bx, c2_cx, c2_dx)
+ local c2_min_y = math.min(c2_ay, c2_by, c2_cy, c2_dy)
+ local c2_max_y = math.max(c2_ay, c2_by, c2_cy, c2_dy)
+
+ if c1_max_x >= c2_min_x and
+ c1_min_x <= c2_max_x and
+ c1_max_y >= c2_min_y and
+ c1_min_y <= c2_max_y then
+
+ -- Everything "near together"?
+ if c1_max_x - c1_min_x < eps and c1_max_y - c1_min_y < eps then
+
+ -- Compute intersection of lines c1_a to c1_d and c2_a to c2_d
+ local a = c2_dx - c2_ax
+ local b = c1_ax - c1_dx
+ local c = c2_ax - c1_ax
+ local d = c2_dy - c2_ay
+ local e = c1_ay - c1_dy
+ local f = c2_ay - c1_ay
+
+ local det = a*e - b*d
+ local t
+
+ t = (c*d - a*f)/det
+ if t<0 then
+ t=0
+ elseif t>1 then
+ t=1
+ end
+
+ intersections [#intersections + 1] = {
+ time = t0 + t*(t1-t0),
+ point = Coordinate.new(c1_ax + t*(c1_dx-c1_ax), c1_ay+t*(c1_dy-c1_ay))
+ }
+ else
+ -- Cut 'em in half!
+ local c1_ex, c1_ey = (c1_ax + c1_bx)/2, (c1_ay + c1_by)/2
+ local c1_fx, c1_fy = (c1_bx + c1_cx)/2, (c1_by + c1_cy)/2
+ local c1_gx, c1_gy = (c1_cx + c1_dx)/2, (c1_cy + c1_dy)/2
+
+ local c1_hx, c1_hy = (c1_ex + c1_fx)/2, (c1_ey + c1_fy)/2
+ local c1_ix, c1_iy = (c1_fx + c1_gx)/2, (c1_fy + c1_gy)/2
+
+ local c1_jx, c1_jy = (c1_hx + c1_ix)/2, (c1_hy + c1_iy)/2
+
+ local c2_ex, c2_ey = (c2_ax + c2_bx)/2, (c2_ay + c2_by)/2
+ local c2_fx, c2_fy = (c2_bx + c2_cx)/2, (c2_by + c2_cy)/2
+ local c2_gx, c2_gy = (c2_cx + c2_dx)/2, (c2_cy + c2_dy)/2
+
+ local c2_hx, c2_hy = (c2_ex + c2_fx)/2, (c2_ey + c2_fy)/2
+ local c2_ix, c2_iy = (c2_fx + c2_gx)/2, (c2_fy + c2_gy)/2
+
+ local c2_jx, c2_jy = (c2_hx + c2_ix)/2, (c2_hy + c2_iy)/2
+
+ intersect_curves (t0, (t0+t1)/2,
+ c1_ax, c1_ay, c1_ex, c1_ey, c1_hx, c1_hy, c1_jx, c1_jy,
+ c2_ax, c2_ay, c2_ex, c2_ey, c2_hx, c2_hy, c2_jx, c2_jy,
+ intersections)
+ intersect_curves (t0, (t0+t1)/2,
+ c1_ax, c1_ay, c1_ex, c1_ey, c1_hx, c1_hy, c1_jx, c1_jy,
+ c2_jx, c2_jy, c2_ix, c2_iy, c2_gx, c2_gy, c2_dx, c2_dy,
+ intersections)
+ intersect_curves ((t0+t1)/2, t1,
+ c1_jx, c1_jy, c1_ix, c1_iy, c1_gx, c1_gy, c1_dx, c1_dy,
+ c2_ax, c2_ay, c2_ex, c2_ey, c2_hx, c2_hy, c2_jx, c2_jy,
+ intersections)
+ intersect_curves ((t0+t1)/2, t1,
+ c1_jx, c1_jy, c1_ix, c1_iy, c1_gx, c1_gy, c1_dx, c1_dy,
+ c2_jx, c2_jy, c2_ix, c2_iy, c2_gx, c2_gy, c2_dx, c2_dy,
+ intersections)
+ end
+ end
+end
+
+
+---
+-- Shorten a path at the beginning. We are given the index of a
+-- segment inside the path as well as a point in time along this
+-- segment. The path is now shortened so that everything before this
+-- segment and everything in the segment before the given time is
+-- removed from the path.
+--
+-- @param index The index of a path segment.
+-- @param time A time along the specified path segment.
+
+function Path:cutAtBeginning(index, time)
+
+ local cut_path = Path:new ()
+
+ -- Ok, first, we need to find the segment *before* the current
+ -- one. Usually, this will be a moveto or a lineto, but things could
+ -- be different.
+ assert (type(self[index-1]) == "table" or type(self[index-1]) == "function",
+ "segment before intersection does not end with a coordinate")
+
+ local from = rigid(self[index-1])
+ local action = self[index]
+
+ -- Now, depending on the type of segment, we do different things:
+ if action == "lineto" then
+
+ -- Ok, compute point:
+ local to = rigid(self[index+1])
+
+ from:moveTowards(to, time)
+
+ -- Ok, this is easy: We start with a fresh moveto ...
+ cut_path[1] = "moveto"
+ cut_path[2] = from
+
+ -- ... and copy the rest
+ for i=index,#self do
+ cut_path[#cut_path+1] = self[i]
+ end
+ elseif action == "curveto" then
+
+ local to = rigid(self[index+3])
+ local s1 = rigid(self[index+1])
+ local s2 = rigid(self[index+2])
+
+ -- Now, compute the support vectors and the point at time:
+ from:moveTowards(s1, time)
+ s1:moveTowards(s2, time)
+ s2:moveTowards(to, time)
+
+ from:moveTowards(s1, time)
+ s1:moveTowards(s2, time)
+
+ from:moveTowards(s1, time)
+
+ -- Ok, this is easy: We start with a fresh moveto ...
+ cut_path[1] = "moveto"
+ cut_path[2] = from
+ cut_path[3] = "curveto"
+ cut_path[4] = s1
+ cut_path[5] = s2
+ cut_path[6] = to
+
+ -- ... and copy the rest
+ for i=index+4,#self do
+ cut_path[#cut_path+1] = self[i]
+ end
+
+ elseif action == "closepath" then
+ -- Let us find the start point:
+ local found
+ for i=index,1,-1 do
+ if self[i] == "moveto" then
+ -- Bingo:
+ found = i
+ break
+ end
+ end
+
+ assert(found, "no moveto found in path")
+
+ local to = rigid(self[found+1])
+ from:moveTowards(to,time)
+
+ cut_path[1] = "moveto"
+ cut_path[2] = from
+ cut_path[3] = "lineto"
+ cut_path[4] = to
+
+ -- ... and copy the rest
+ for i=index+1,#self do
+ cut_path[#cut_path+1] = self[i]
+ end
+ else
+ error ("wrong path operation")
+ end
+
+ -- Move cut_path back:
+ for i=1,#cut_path do
+ self[i] = cut_path[i]
+ end
+ for i=#cut_path+1,#self do
+ self[i] = nil
+ end
+end
+
+
+
+
+---
+-- Shorten a path at the end. This method works like |cutAtBeginning|,
+-- only the path is cut at the end.
+--
+-- @param index The index of a path segment.
+-- @param time A time along the specified path segment.
+
+function Path:cutAtEnd(index, time)
+
+ local cut_path = Path:new ()
+
+ -- Ok, first, we need to find the segment *before* the current
+ -- one. Usually, this will be a moveto or a lineto, but things could
+ -- be different.
+ assert (type(self[index-1]) == "table" or type(self[index-1]) == "function",
+ "segment before intersection does not end with a coordinate")
+
+ local from = rigid(self[index-1])
+ local action = self[index]
+
+ -- Now, depending on the type of segment, we do different things:
+ if action == "lineto" then
+
+ -- Ok, compute point:
+ local to = rigid(self[index+1])
+ to:moveTowards(from, 1-time)
+
+ for i=1,index do
+ cut_path[i] = self[i]
+ end
+ cut_path[index+1] = to
+
+ elseif action == "curveto" then
+
+ local s1 = rigid(self[index+1])
+ local s2 = rigid(self[index+2])
+ local to = rigid(self[index+3])
+
+ -- Now, compute the support vectors and the point at time:
+ to:moveTowards(s2, 1-time)
+ s2:moveTowards(s1, 1-time)
+ s1:moveTowards(from, 1-time)
+
+ to:moveTowards(s2, 1-time)
+ s2:moveTowards(s1, 1-time)
+
+ to:moveTowards(s2, 1-time)
+
+ -- ... and copy the rest
+ for i=1,index do
+ cut_path[i] = self[i]
+ end
+
+ cut_path[index+1] = s1
+ cut_path[index+2] = s2
+ cut_path[index+3] = to
+
+ elseif action == "closepath" then
+ -- Let us find the start point:
+ local found
+ for i=index,1,-1 do
+ if self[i] == "moveto" then
+ -- Bingo:
+ found = i
+ break
+ end
+ end
+
+ assert(found, "no moveto found in path")
+
+ local to = rigid(self[found+1]:clone())
+ to:moveTowards(from,1-time)
+
+ for i=1,index-1 do
+ cut_path[i] = self[i]
+ end
+ cut_path[index] = 'lineto'
+ cut_path[index+1] = to
+ else
+ error ("wrong path operation")
+ end
+
+ -- Move cut_path back:
+ for i=1,#cut_path do
+ self[i] = cut_path[i]
+ end
+ for i=#cut_path+1,#self do
+ self[i] = nil
+ end
+end
+
+
+
+
+---
+-- ``Pads'' the path. The idea is the following: Suppose we stroke the
+-- path with a pen whose width is twice the value |padding|. The outer
+-- edge of this stroked drawing is now a path by itself. The path will
+-- be a bit longer and ``larger''. The present function tries to
+-- compute an approximation to this resulting path.
+--
+-- The algorithm used to compute the enlarged part does not necessarily
+-- compute the precise new path. It should work correctly for polyline
+-- paths, but not for curved paths.
+--
+-- @param padding A padding distance.
+-- @return The padded path.
+--
+
+function Path:pad(padding)
+
+ local padded = self:clone()
+ padded:makeRigid()
+
+ if padding == 0 then
+ return padded
+ end
+
+ -- First, decompose the path into subpaths:
+ local subpaths = {}
+ local subpath = {}
+ local start_index = 1
+
+ local function closepath(end_index)
+ if #subpath >= 1 then
+ subpath.start_index = start_index
+ subpath.end_index = end_index
+ start_index = end_index + 1
+
+ local start = 1
+ if (subpath[#subpath] - subpath[1]):norm() < 0.01 and subpath[2] then
+ start = 2
+ subpath.skipped = subpath[1]
+ end
+ subpath[#subpath + 1] = subpath[start]
+ subpath[#subpath + 1] = subpath[start+1]
+ subpaths[#subpaths + 1] = subpath
+ subpath = {}
+ end
+ end
+
+ for i,p in ipairs(padded) do
+ if p ~= "closepath" then
+ if type(p) == "table" then
+ subpath[#subpath + 1] = p
+ end
+ else
+ closepath (i)
+ end
+ end
+ closepath(#padded)
+
+ -- Second, iterate over the subpaths:
+ for _,subpath in ipairs(subpaths) do
+ local new_coordinates = {}
+ local _,_,_,_,c_x,c_y = Coordinate.boundingBox(subpath)
+ local c = Coordinate.new(c_x,c_y)
+
+ -- Find out the orientation of the path
+ local count = 0
+ for i=1,#subpath-2 do
+ local d2 = subpath[i+1] - subpath[i]
+ local d1 = subpath[i+2] - subpath[i+1]
+
+ local diff = math.atan2(d2.y,d2.x) - math.atan2(d1.y,d1.x)
+
+ if diff < -math.pi then
+ count = count + 1
+ elseif diff > math.pi then
+ count = count - 1
+ end
+ end
+
+ for i=2,#subpath-1 do
+ local p = subpath[i]
+ local d1 = subpath[i] - subpath[i-1]
+ local d2 = subpath[i+1] - subpath[i]
+
+ local orth1 = Coordinate.new(-d1.y, d1.x)
+ local orth2 = Coordinate.new(-d2.y, d2.x)
+
+ orth1:normalize()
+ orth2:normalize()
+
+ if count < 0 then
+ orth1:scale(-1)
+ orth2:scale(-1)
+ end
+
+ -- Ok, now we want to compute the intersection of the lines
+ -- perpendicular to p + padding*orth1 and p + padding*orth2:
+
+ local det = orth1.x * orth2.y - orth1.y * orth2.x
+
+ local c
+ if math.abs(det) < 0.1 then
+ c = orth1 + orth2
+ c:scale(padding/2)
+ else
+ c = Coordinate.new (padding*(orth2.y-orth1.y)/det, padding*(orth1.x-orth2.x)/det)
+ end
+
+ new_coordinates[i] = c+p
+ end
+
+ for i=2,#subpath-1 do
+ local p = subpath[i]
+ local new_p = new_coordinates[i]
+ p.x = new_p.x
+ p.y = new_p.y
+ end
+
+ if subpath.skipped then
+ local p = subpath[1]
+ local new_p = new_coordinates[#subpath-2]
+ p.x = new_p.x
+ p.y = new_p.y
+ end
+
+ -- Now, we need to correct the curveto fields:
+ for i=subpath.start_index,subpath.end_index do
+ if self[i] == 'curveto' then
+ local from = rigid(self[i-1])
+ local s1 = rigid(self[i+1])
+ local s2 = rigid(self[i+2])
+ local to = rigid(self[i+3])
+
+ local p1x, p1y, _, _, h1x, h1y =
+ Bezier.atTime(from.x, from.y, s1.x, s1.y, s2.x, s2.y,
+ to.x, to.y, 1/3)
+
+ local p2x, p2y, _, _, _, _, h2x, h2y =
+ Bezier.atTime(from.x, from.y, s1.x, s1.y, s2.x, s2.y,
+ to.x, to.y, 2/3)
+
+ local orth1 = Coordinate.new (p1y - h1y, -(p1x - h1x))
+ orth1:normalize()
+ orth1:scale(-padding)
+
+ local orth2 = Coordinate.new (p2y - h2y, -(p2x - h2x))
+ orth2:normalize()
+ orth2:scale(padding)
+
+ if count < 0 then
+ orth1:scale(-1)
+ orth2:scale(-1)
+ end
+
+ local new_s1, new_s2 =
+ Bezier.supportsForPointsAtTime(padded[i-1],
+ Coordinate.new(p1x+orth1.x,p1y+orth1.y), 1/3,
+ Coordinate.new(p2x+orth2.x,p2y+orth2.y), 2/3,
+ padded[i+3])
+
+ padded[i+1] = new_s1
+ padded[i+2] = new_s2
+ end
+ end
+ end
+
+ return padded
+end
+
+
+
+---
+-- Appends an arc (as in the sense of ``a part of the circumference of
+-- a circle'') to the path. You may optionally provide a
+-- transformation matrix, which will be applied to the arc. In detail,
+-- the following happens: We first invert the transformation
+-- and apply it to the start point. Then we compute the arc
+-- ``normally'', as if no transformation matrix were present. Then we
+-- apply the transformation matrix to all computed points.
+--
+-- @function Path:appendArc(start_angle,end_angle,radius,trans)
+--
+-- @param start_angle The start angle of the arc. Must be specified in
+-- degrees.
+-- @param end_angle the end angle of the arc.
+-- @param radius The radius of the circle on which this arc lies.
+-- @param trans A transformation matrix. If |nil|, the identity
+-- matrix will be assumed.
+
+Path.appendArc = lib.ondemand("Path_arced", Path, "appendArc")
+
+
+
+---
+-- Appends a clockwise arc (as in the sense of ``a part of the circumference of
+-- a circle'') to the path such that it ends at a given point. If a
+-- transformation matrix is given, both start and end point are first
+-- transformed according to the inverted transformation, then the arc
+-- is computed and then transformed back.
+--
+-- @function Path:appendArcTo(target,radius_or_center,clockwise,trans)
+--
+-- @param target The point where the arc should end.
+-- @param radius_or_center If a number, it is the radius of the circle
+-- on which this arc lies. If it is a |Coordinate|, this is the center
+-- of the circle.
+-- @param clockwise If true, the arc will be clockwise. Otherwise (the
+-- default, if nothing or |nil| is given), the arc will be counter
+-- clockwise.
+-- @param trans A transformation matrix. If missing,
+-- the identity matrix is assumed.
+
+Path.appendArcTo = lib.ondemand("Path_arced", Path, "appendArcTo")
+
+
+
+
+--
+-- @return The Path as string.
+--
+function Path:__tostring()
+ local r = {}
+ local i = 1
+ while i <= #self do
+ local p = self[i]
+
+ if p == "lineto" then
+ r [#r+1] = " -- " .. tostring(rigid(self[i+1]))
+ i = i + 1
+ elseif p == "moveto" then
+ r [#r+1] = " " .. tostring(rigid(self[i+1]) )
+ i = i + 1
+ elseif p == "curveto" then
+ r [#r+1] = " .. controls " .. tostring(rigid(self[i+1])) .. " and " ..
+ tostring(rigid(self[i+2])) .. " .. " .. tostring(rigid(self[i+3]))
+ i = i + 3
+ elseif p == "closepath" then
+ r [#r+1] = " -- cycle"
+ else
+ error("illegal path command")
+ end
+ i = i + 1
+ end
+ return table.concat(r)
+end
+
+
+
+-- Done
+
+return Path
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path_arced.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path_arced.lua
new file mode 100644
index 0000000000..1875b8d1a5
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Path_arced.lua
@@ -0,0 +1,316 @@
+-- Copyright 2014 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local Path = require 'pgf.gd.model.Path'
+
+-- Imports
+
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Transform = require "pgf.gd.lib.Transform"
+
+
+
+-- Locals
+
+local rigid = Path.rigid
+
+local tan = math.tan
+local sin = math.sin
+local cos = math.cos
+local sqrt = math.sqrt
+local atan2 = math.atan2
+local abs = math.abs
+
+local to_rad = math.pi/180
+local to_deg = 180/math.pi
+local pi_half = math.pi/2
+
+local function sin_quarter(x)
+ x = x % 360
+ if x == 0 then
+ return 0
+ elseif x == 90 then
+ return 1
+ elseif x == 180 then
+ return 0
+ else
+ return -1
+ end
+end
+
+local function cos_quarter(x)
+ x = x % 360
+ if x == 0 then
+ return 1
+ elseif x == 90 then
+ return 0
+ elseif x == 180 then
+ return -1
+ else
+ return 0
+ end
+end
+
+local function atan2deg(y,x)
+
+ -- Works like atan2, but returns the angle in degrees and, returns
+ -- exactly a multiple of 90 if x or y are zero
+
+ if x == 0 then
+ if y < 0 then
+ return -90
+ else
+ return 90
+ end
+ elseif y == 0 then
+ if x < 0 then
+ return 180
+ else
+ return 0
+ end
+ else
+ return atan2(y,x) * to_deg
+ end
+
+end
+
+local function subarc (path, startx, starty, start_angle, delta, radius, trans, center_x, center_y)
+
+ local end_angle = start_angle + delta
+ local factor = tan (delta*to_rad/4) * 1.333333333333333333333 * radius
+
+ local s1, c1, s190, c190, s2, c2, s290, c290
+
+ if start_angle % 90 == 0 then
+ s1, c1, s190, c190 = sin_quarter(start_angle), cos_quarter(start_angle), sin_quarter(start_angle+90), cos_quarter(start_angle+90)
+ else
+ local a1 = start_angle*to_rad
+ s1, c1, s190, c190 = sin(a1), cos(a1), sin(a1+pi_half), cos(a1+pi_half)
+ end
+
+ if end_angle % 90 == 0 then
+ s2, c2, s290, c290 = sin_quarter(end_angle), cos_quarter(end_angle), sin_quarter(end_angle-90), cos_quarter(end_angle-90)
+ else
+ local a2 = end_angle * to_rad
+ s2, c2, s290, c290 = sin(a2), cos(a2), sin(a2-pi_half), cos(a2-pi_half)
+ end
+
+ local lastx, lasty = center_x + c2*radius, center_y + s2*radius
+
+ path[#path + 1] = "curveto"
+ path[#path + 1] = Coordinate.new (startx + c190*factor, starty + s190*factor)
+ path[#path + 1] = Coordinate.new (lastx + c290*factor, lasty + s290*factor)
+ path[#path + 1] = Coordinate.new (lastx, lasty)
+
+ if trans then
+ path[#path-2]:apply(trans)
+ path[#path-1]:apply(trans)
+ path[#path ]:apply(trans)
+ end
+
+ return lastx, lasty, end_angle
+end
+
+
+
+local function arc (path, start, start_angle, end_angle, radius, trans, centerx, centery)
+
+ -- @param path is the path object
+ -- @param start is the start coordinate
+ -- @param start_angle is given in degrees
+ -- @param end_angle is given in degrees
+ -- @param radius is the radius
+ -- @param trans is an optional transformation matrix that gets applied to all computed points
+ -- @param centerx optionally: x-part of the center of the circle
+ -- @param centery optionally: y-part of the center of the circle
+
+ local startx, starty = start.x, start.y
+
+ -- Compute center:
+ centerx = centerx or startx - cos(start_angle*to_rad)*radius
+ centery = centery or starty - sin(start_angle*to_rad)*radius
+
+ if start_angle < end_angle then
+ -- First, ensure that the angles are in a reasonable range:
+ start_angle = start_angle % 360
+ end_angle = end_angle % 360
+
+ if end_angle <= start_angle then
+ -- In case the modulo has inadvertently moved the end angle
+ -- before the start angle:
+ end_angle = end_angle + 360
+ end
+
+ -- Ok, now create a series of arcs that are at most quarter-cycles:
+ while start_angle < end_angle do
+ if start_angle + 179 < end_angle then
+ -- Add a quarter cycle:
+ startx, starty, start_angle = subarc(path, startx, starty, start_angle, 90, radius, trans, centerx, centery)
+ elseif start_angle + 90 < end_angle then
+ -- Add 60 degrees to ensure that there are no small segments
+ -- at the end
+ startx, starty, start_angle = subarc(path, startx, starty, start_angle, (end_angle-start_angle)/2, radius, trans, centerx, centery)
+ else
+ subarc(path, startx, starty, start_angle, end_angle - start_angle, radius, trans, centerx, centery)
+ break
+ end
+ end
+
+ elseif start_angle > end_angle then
+ -- First, ensure that the angles are in a reasonable range:
+ start_angle = start_angle % 360
+ end_angle = end_angle % 360
+
+ if end_angle >= start_angle then
+ -- In case the modulo has inadvertedly moved the end angle
+ -- before the start angle:
+ end_angle = end_angle - 360
+ end
+
+ -- Ok, now create a series of arcs that are at most quarter-cycles:
+ while start_angle > end_angle do
+ if start_angle - 179 > end_angle then
+ -- Add a quarter cycle:
+ startx, starty, start_angle = subarc(path, startx, starty, start_angle, -90, radius, trans, centerx, centery)
+ elseif start_angle - 90 > end_angle then
+ -- Add 60 degrees to ensure that there are no small segments
+ -- at the end
+ startx, starty, start_angle = subarc(path, startx, starty, start_angle, (end_angle-start_angle)/2, radius, trans, centerx, centery)
+ else
+ subarc(path, startx, starty, start_angle, end_angle - start_angle, radius, trans, centerx, centery)
+ break
+ end
+ end
+
+ -- else, do nothing
+ end
+end
+
+
+-- Doc see Path.lua
+
+function Path:appendArc(start_angle,end_angle,radius, trans)
+
+ local start = rigid(self[#self])
+ assert(type(start) == "table", "trying to append an arc to a path that does not end with a coordinate")
+
+ if trans then
+ start = start:clone()
+ start:apply(Transform.invert(trans))
+ end
+
+ arc (self, start, start_angle, end_angle, radius, trans)
+end
+
+
+
+
+-- Doc see Path.lua
+
+function Path:appendArcTo (target, radius_or_center, clockwise, trans)
+
+ local start = rigid(self[#self])
+ assert(type(start) == "table", "trying to append an arc to a path that does not end with a coordinate")
+
+ local trans_target = target
+ local centerx, centery, radius
+
+ if type(radius_or_center) == "number" then
+ radius = radius_or_center
+ else
+ centerx, centery = radius_or_center.x, radius_or_center.y
+ end
+
+ if trans then
+ start = start:clone()
+ trans_target = target:clone()
+ local itrans = Transform.invert(trans)
+ start:apply(itrans)
+ trans_target:apply(itrans)
+ if centerx then
+ local t = radius_or_center:clone()
+ t:apply(itrans)
+ centerx, centery = t.x, t.y
+ end
+ end
+
+ if not centerx then
+ -- Compute center
+ local dx, dy = target.x - start.x, target.y - start.y
+
+ if abs(dx) == abs(dy) and abs(dx) == radius then
+ if (dx < 0 and dy < 0) or (dx > 0 and dy > 0) then
+ centerx = start.x
+ centery = trans_target.y
+ else
+ centerx = trans_target.x
+ centery = start.y
+ end
+ else
+ local l_sq = dx*dx + dy*dy
+ if l_sq >= radius*radius*4*0.999999 then
+ centerx = (start.x+trans_target.x) / 2
+ centery = (start.y+trans_target.y) / 2
+ assert(l_sq <= radius*radius*4/0.999999, "radius too small for arc")
+ else
+ -- Normalize
+ local l = sqrt(l_sq)
+ local nx = dx / l
+ local ny = dy / l
+
+ local e = sqrt(radius*radius - 0.25*l_sq)
+
+ centerx = start.x + 0.5*dx - ny*e
+ centery = start.y + 0.5*dy + nx*e
+ end
+ end
+ end
+
+ local start_dx, start_dy, target_dx, target_dy =
+ start.x - centerx, start.y - centery,
+ trans_target.x - centerx, trans_target.y - centery
+
+ if not radius then
+ -- Center is given, compute radius:
+ radius_sq = start_dx^2 + start_dy^2
+
+ -- Ensure that the circle is, indeed, centered:
+ assert (abs(target_dx^2 + target_dy^2 - radius_sq)/radius_sq < 1e-5, "attempting to add an arc with incorrect center")
+
+ radius = sqrt(radius_sq)
+ end
+
+ -- Compute start and end angle:
+ local start_angle = atan2deg(start_dy, start_dx)
+ local end_angle = atan2deg(target_dy, target_dx)
+
+ if clockwise then
+ if end_angle > start_angle then
+ end_angle = end_angle - 360
+ end
+ else
+ if end_angle < start_angle then
+ end_angle = end_angle + 360
+ end
+ end
+
+ arc (self, start, start_angle, end_angle, radius, trans, centerx, centery)
+
+ -- Patch last point to avoid rounding problems:
+ self[#self] = target
+end
+
+
+
+-- Done
+
+return true
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Vertex.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Vertex.lua
new file mode 100644
index 0000000000..677ea4fbd0
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/Vertex.lua
@@ -0,0 +1,296 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- A |Vertex| instance models a node of graphs. Each |Vertex| object can be an
+-- element of any number of graphs (whereas an |Arc| object can only be an
+-- element of a single graph).
+--
+-- When a vertex is added to a digraph |g|, two tables are created in
+-- the vertex' storage: An array of incoming arcs (with respect to
+-- |g|) and an array of outgoing arcs (again, with respect to
+-- |g|). The fields are managed by the |Digraph| class and should not
+-- be modified directly.
+--
+-- Note that a |Vertex| is an abstraction of \tikzname\ nodes; indeed
+-- the objective is to ensure that, in principle, we can use them
+-- independently of \TeX. For this reason, you will not find any
+-- references to |tex| inside a |Vertex|; this information is only
+-- available in the syntactic digraph.
+--
+-- One important aspect of vertices are its anchors -- a concept well
+-- familiar for users of \tikzname, but since we need to abstract from
+-- \tikzname, a separate anchor management is available inside the
+-- graph drawing system. It works as follows:
+--
+-- First of all, every vertex has a path, which is a (typically
+-- closed) line around the vertex. The display system will pass down
+-- the vertex' path to the graph drawing system and this path will be
+-- stored as a |Path| object in the |path| field of the vertex. This
+-- path lives in a special ``local'' coordinate system, that is, all
+-- coordinates of this path should actually be considered relative to
+-- the vertex' |pos| field. Note that the path is typically, but not
+-- always, ``centered'' on the origin. A graph drawing algorithm
+-- should arrange the vertices in such a way that the origins in the
+-- path coordinate systems are aligned.
+--
+-- To illustrate the difference between the origin and the vertex
+-- center, consider a tree drawing algorithm in which a node |root| has
+-- three children |a|, |b|, and |g|. Now, if we were to simply center
+-- these three letters vertically and arrange them in a line, the
+-- letters would appear to ``jump up and down'' since the height of
+-- the three letters are quite different. A solution is to shift the
+-- letters (and, thus, the paths of the vertices) in such a way that
+-- in all three letters the baseline of the letters is exactly at the
+-- origin. Now, when a graph drawing algorithm aligns these vertices
+-- along the origins, the letters will all have the same baseline.
+--
+-- Apart from the origin, there may be other positions in the path
+-- coordinate system that are of interest -- such as the center of
+-- the vertex. As mentioned above, this need not be the origin and
+-- although a graph drawing algorithm should align the origins,
+-- \emph{edges} between vertices should head toward these vertex
+-- centers rather that toward the origins. Other points of interest
+-- might be the ``top'' of the node.
+--
+-- All points of special interest are called ``anchors''. The |anchor|
+-- method allows you to retrieve them. By default, you always have
+-- access to the |center| anchor, but other anchors may or may not be
+-- available also, see the |anchor| method for details.
+--
+-- @field pos A coordinate object that stores the position where the
+-- vertex should be placed on the canvas. The main objective of graph drawing
+-- algorithms is to update this coordinate.
+--
+-- @field name An optional string that is used as a textual representation
+-- of the node.
+--
+-- @field path The path of the vertex's shape. This is a path along
+-- the outer line resulting from stroking the vertex's original
+-- shape. For instance, if you have a quadratic shape of size 1cm and
+-- you stroke the path with a pen of 2mm thickness, this |path| field
+-- would store a path of a square of edge length 12mm.
+--
+-- @field anchors A table of anchors (in the TikZ sense). The table is
+-- indexed by the anchor names (strings) and the values are
+-- |Coordinate|s. Currently, it is only guaranteed that the |center|
+-- anchor is present. Note that the |center| anchor need not lie at
+-- the origin: A graph drawing system should align nodes relative to
+-- the origin of the path's coordinate system. However, lines going to
+-- and from the node will head towards the |center| anchor. See
+-- Section~\ref{section-gd-anchors} for details.
+--
+-- @field options A table of options that contains user-defined options.
+--
+-- @field animations An array of attribute animations for the
+-- node. When an algorithm adds entries to this array, the display
+-- layer should try to render these. The syntax is as follows: Each
+-- element in the array is a table with a field |attribute|, which must
+-- be a string like |"opacity"| or |"translate"|, a field |entries|,
+-- which must be an array to be explained in a moment, and field
+-- |options|, which must be a table of the same syntax as the
+-- |options| field. For the |entries| array, each element must be
+-- table with two field: |t| must be set to a number, representing a
+-- time in seconds, and |value|, which must be set to a value that
+-- the |attribute| should have at the given time. The entries and the
+-- options will then be interpreted as described in \pgfname's basic
+-- layer animation system, except that where a |\pgfpoint| is expected
+-- you provide a |Coordinate| and a where a path is expected you
+-- provide a |Path|.
+--
+-- @field shape A string describing the shape of the node (like |rectangle|
+-- or |circle|). Note, however, that this is more ``informative''; the
+-- actual information that is used by the graph drawing system for
+-- determining the extent of a node, its bounding box, convex hull,
+-- and line intersections is the |path| field.
+--
+-- @field kind A string describing the kind of the node. For instance, a
+-- node of type |"dummy"| does not correspond to any real node in
+-- the graph but is used by the graph drawing algorithm.
+--
+-- @field event The |Event| when this vertex was created (may be |nil|
+-- if the vertex is not part of the syntactic digraph).
+--
+-- @field incomings A table indexed by |Digraph| objects. For each
+-- digraph, the table entry is an array of all vertices from which
+-- there is an |Arc| to this vertex. This field is internal and may
+-- not only be accessed by the |Digraph| class.
+--
+-- @field outgoings Like |incomings|, but for outgoing arcs.
+--
+local Vertex = {}
+Vertex.__index = Vertex
+
+
+-- Namespace
+
+require("pgf.gd.model").Vertex = Vertex
+
+
+-- Imports
+
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Path = require "pgf.gd.model.Path"
+local Storage = require "pgf.gd.lib.Storage"
+
+
+---
+-- Create a new vertex. The |initial| parameter allows you to setup
+-- some initial values.
+--
+-- @usage
+--\begin{codeexample}[code only, tikz syntax=false]
+--local v = Vertex.new { name = "hello", pos = Coordinate.new(1,1) }
+--\end{codeexample}
+--
+-- @param initial Values to override default node settings. The
+-- following are permissible:
+-- \begin{description}
+-- \item[|pos|] Initial position of the node.
+-- \item[|name|] The name of the node. It is optional to define this.
+-- \item[|path|] A |Path| object representing the vertex's hull.
+-- \item[|anchors|] A table of anchors.
+-- \item[|options|] An options table for the vertex.
+-- \item[|animations|] An array of generated animation attributes.
+-- \item[|shape|] A string describing the shape. If not given, |"none"| is used.
+-- \item[|kind|] A kind like |"node"| or |"dummy"|. If not given, |"dummy"| is used.
+-- \end{description}
+--
+-- @return A newly allocated node.
+--
+function Vertex.new(values)
+ local new = {
+ incomings = Storage.new(),
+ outgoings = Storage.new()
+ }
+ for k,v in pairs(values) do
+ new[k] = v
+ end
+ new.path = new.path or Path.new { 0, 0 }
+ new.shape = new.shape or "none"
+ new.kind = new.kind or "dummy"
+ new.pos = new.pos or Coordinate.new(0,0)
+ new.anchors = new.anchors or { center = Coordinate.new(0,0) }
+ new.animations = new.animations or {}
+ return setmetatable (new, Vertex)
+end
+
+
+
+
+---
+-- Returns a bounding box of a vertex.
+--
+-- @return |min_x| The minimum $x$ value of the bounding box of the path
+-- @return |min_y| The minimum $y$ value
+-- @return |max_x|
+-- @return |max_y|
+-- @return |center_x| The center of the bounding box
+-- @return |center_y|
+
+function Vertex:boundingBox()
+ return self.path:boundingBox()
+end
+
+
+
+local anchor_cache = Storage.new ()
+
+local directions = {
+ north = function(min_x, min_y, max_x, max_y)
+ return (min_x+max_x)/2, max_y
+ end,
+ south = function(min_x, min_y, max_x, max_y)
+ return (min_x+max_x)/2, min_y
+ end,
+ east = function(min_x, min_y, max_x, max_y)
+ return max_x, (min_y+max_y)/2
+ end,
+ west = function(min_x, min_y, max_x, max_y)
+ return min_x, (min_y+max_y)/2
+ end,
+ ["north west"] = function(min_x, min_y, max_x, max_y)
+ return min_x, max_y
+ end,
+ ["north east"] = function(min_x, min_y, max_x, max_y)
+ return max_x, max_y
+ end,
+ ["south west"] = function(min_x, min_y, max_x, max_y)
+ return min_x, min_y
+ end,
+ ["south east"] = function(min_x, min_y, max_x, max_y)
+ return max_x, min_y
+ end,
+}
+
+---
+-- Returns an anchor position in a vertex. First, we try to look
+-- the anchor up in the vertex's |anchors| table. If it is not found
+-- there, we test whether it is one of the direction strings |north|,
+-- |south east|, and so on. If so, we consider a line from the center
+-- of the node to the position on the bounding box that corresponds to
+-- the given direction (so |south east| would be the lower right
+-- corner). We intersect this line with the vertex's path and return
+-- the result. Finally, if the above fails, we try to consider the
+-- anchor as a number and return the intersection of a line starting
+-- at the vertex's center with the number as its angle and the path of
+-- the vertex.
+--
+-- @param anchor An anchor as detailed above
+-- @return A coordinate in the vertex's local coordinate system (so
+-- add the |pos| field to arrive at the actual position). If the
+-- anchor was not found, |nil| is returned
+
+function Vertex:anchor(anchor)
+ local c = self.anchors[anchor]
+ if not c then
+ local b
+ local d = directions [anchor]
+ if d then
+ b = Coordinate.new(d(self:boundingBox()))
+ else
+ local n = tonumber(anchor)
+ if n then
+ local x1, y1, x2, y2 = self:boundingBox()
+ local r = math.max(x2-x1, y2-y1)
+ b = Coordinate.new(r*math.cos(n/180*math.pi),r*math.sin(n/180*math.pi))
+ b:shiftByCoordinate(self.anchors.center)
+ end
+ end
+ if not b then
+ return
+ end
+ local p = Path.new {'moveto', self.anchors.center, 'lineto', b}
+ local intersections = p:intersectionsWith(self.path)
+ if #intersections > 0 then
+ c = intersections[1].point
+ end
+ end
+ self.anchors[anchor] = c
+ return c
+end
+
+
+
+--
+-- Returns a string representation of a vertex. This is mainly for debugging
+--
+-- @return The Arc as string.
+--
+function Vertex:__tostring()
+ return self.name or tostring(self.anchors)
+end
+
+
+-- Done
+
+return Vertex
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/library.lua
new file mode 100644
index 0000000000..ad62faa0f3
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/model/library.lua
@@ -0,0 +1,15 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+-- Load declarations from:
+require "pgf.gd.model.Hyperedge"
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf.lua
new file mode 100644
index 0000000000..f7905f2418
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf.lua
@@ -0,0 +1,26 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+-- Imports
+
+require "pgf"
+require "pgf.gd"
+
+
+-- Declare namespace
+pgf.gd.ogdf = {}
+
+
+-- Done
+
+return pgf.gd.ogdf \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf/library.lua
new file mode 100644
index 0000000000..f91c75a4d6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/ogdf/library.lua
@@ -0,0 +1,33 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- The Open Graph Drawing Framework (\textsc{ogdf}) is a large,
+-- powerful graph drawing system written in C++. This library enables
+-- its use inside \tikzname's graph drawing system by translating
+-- back-and-forth between Lua and C++.
+--
+-- Since C++ code is compiled and not interpreted (like Lua), in order
+-- to use the present library, you need a compiled version of the
+-- \pgfname\ interface code for the \textsc{ogdf} library
+-- (|pgf/gd/ogdf/c/ogdf_script.so|) installed correctly for your particular
+-- architecture. This is by no means trivial\dots
+--
+-- @library
+
+local ogdf
+
+
+-- Load the C++ code:
+
+require "pgf_gd_ogdf_c_ogdf_script"
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees.lua
new file mode 100644
index 0000000000..95689e6379
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees.lua
@@ -0,0 +1,21 @@
+-- Copyright 2015 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+local pedigrees = {}
+
+-- Declare namespace
+require("pgf.gd").pedigrees = tree
+
+
+-- Done
+
+return pedigrees \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/Koerner2015.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/Koerner2015.lua
new file mode 100644
index 0000000000..32927530a2
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/Koerner2015.lua
@@ -0,0 +1,163 @@
+-- Copyright 2015 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local Koerner2015 = {}
+
+
+-- Namespace
+require("pgf.gd.pedigrees").Koerner2015 = Koerner2015
+
+-- Imports
+local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+local Storage = require "pgf.gd.lib.Storage"
+local Direct = require "pgf.gd.lib.Direct"
+
+-- Shorthand:
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+declare {
+ key = "mate",
+ type = "boolean",
+
+ summary = [["
+ Edges of type |mate| join mates.
+ "]],
+}
+
+
+---
+declare {
+ key = "child",
+ type = "boolean",
+
+ summary = [["
+ Edges of type |child| join a parent to a child. The parent is the tail
+ of the edge, the child is the head.
+ "]],
+}
+
+---
+declare {
+ key = "sibling",
+ type = "boolean",
+
+ summary = [["
+ Edges of type |sibling| join a siblings (persons with identical parents).
+ "]],
+}
+
+
+---
+declare {
+ key = "simple pedigree layout",
+ algorithm = Koerner2015,
+
+ postconditions = {
+ upward_oriented = true
+ },
+
+ summary = [["
+ A simple algorithm for drawing a pedigree.
+ "]],
+ documentation = [["
+ ...
+ "]],
+ examples = [["
+ \tikz \graph [simple pedigree layout, default edge operator=complete bipartite]
+ {
+ Eve -- [mate] Felix;
+ { Eve, Felix } -> [child] { George, Hank };
+
+ Alice -- [mate] Bob;
+ { Alice, Bob } -> [child] { Charly, Dave, Eve };
+ };
+ "]]
+}
+
+
+function Koerner2015:run()
+
+ local g = self.digraph
+
+ -- Compute ranks:
+
+ local visited = {}
+ local ranks = {}
+
+ local queue = { { g.vertices[1], 1 } }
+
+ local queue_start = 1
+ local queue_end = 1
+
+ local function put(v, r)
+ queue_end = queue_end + 1
+ queue [queue_end] = { v, r }
+ end
+
+ local function get()
+ local v = queue[queue_start][1]
+ local r = queue[queue_start][2]
+ queue_start = queue_start + 1
+ return v,r
+ end
+
+ while queue_start <= queue_end do
+
+ -- Pop
+ local v, rank = get()
+ ranks[v] = rank
+
+ visited [v] = true
+
+ -- Follow mates:
+ for _,a in ipairs(g:outgoing(v)) do
+ if a:options("sibling") then
+ if not visited[a.head] then
+ put(a.head, rank)
+ end
+ end
+ end
+ for _,a in ipairs(g:incoming(v)) do
+ if a:options("child") then
+ if not visited[a.tail] then
+ put(a.tail, rank-1)
+ end
+ end
+ end
+ for _,a in ipairs(g:outgoing(v)) do
+ if a:options("child") then
+ if not visited[a.head] then
+ put(a.head, rank+1)
+ end
+ end
+ end
+ for _,a in ipairs(g:outgoing(v)) do
+ if a:options("mate") then
+ if not visited[a.head] then
+ put(a.head, rank)
+ end
+ end
+ end
+ end
+
+ for i,v in ipairs(g.vertices) do
+ v.pos.x = i*50
+ v.pos.y = ranks[v] * 50
+ end
+
+end
+
+return Koerner2015
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/library.lua
new file mode 100644
index 0000000000..db3d4f9cf7
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/pedigrees/library.lua
@@ -0,0 +1,21 @@
+-- Copyright 2015 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- A pedigree depicts parent--mate--sibling relationships between individuals.
+--
+-- @library
+
+local pedigrees -- Library name
+
+require "pgf.gd.pedigrees.Koerner2015"
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics.lua
new file mode 100644
index 0000000000..77c66de5b2
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics.lua
@@ -0,0 +1,21 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+local phylogenetics = {}
+
+-- Declare namespace
+require("pgf.gd").phylogenetics = tree
+
+
+-- Done
+
+return phylogenetics \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua
new file mode 100644
index 0000000000..04e1ca49f1
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua
@@ -0,0 +1,77 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+local AuthorDefinedPhylogeny = {}
+
+
+-- Namespace
+require("pgf.gd.phylogenetics").AuthorDefinedPhylogeny = AuthorDefinedPhylogeny
+
+-- Imports
+local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+local Direct = require "pgf.gd.lib.Direct"
+
+-- Shorthand:
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+declare {
+ key = "phylogenetic tree by author",
+ algorithm = AuthorDefinedPhylogeny,
+ phase = "phylogenetic tree generation",
+ phase_default = true,
+
+ summary = [["
+ When this key is used, the phylogenetic tree must be specified
+ by the author (rather than being generated algorithmically).
+ "]],
+ documentation = [["
+ A spanning tree of the input graph will be computed first (it
+ must be connected, otherwise errors will result).
+ The evolutionary length of the edges must be specified through
+ the use of the |length| key for each edge.
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout] {
+ a -- {
+ b [>length=2] --[length=1] { c, d },
+ e [>length=3]
+ }
+ };
+ "]]
+}
+
+
+
+function AuthorDefinedPhylogeny:run()
+
+ local spanning_tree = self.main_algorithm.digraph.options.algorithm_phases["spanning tree computation"].new {
+ ugraph = self.main_algorithm.ugraph,
+ events = {} -- no events
+ }:run()
+
+ local phylogenetic_tree = Direct.ugraphFromDigraph(spanning_tree)
+ local lengths = self.lengths
+
+ for _,a in ipairs(phylogenetic_tree.arcs) do
+ lengths[a.tail][a.head] = a:options('length')
+ end
+
+ return phylogenetic_tree
+end
+
+
+
+return AuthorDefinedPhylogeny
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua
new file mode 100644
index 0000000000..ef40f0ee60
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua
@@ -0,0 +1,593 @@
+-- Copyright 2013 by Sarah Mäusle and Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+local BalancedMinimumEvolution = {}
+
+
+-- Namespace
+require("pgf.gd.phylogenetics").BalancedMinimumEvolution = BalancedMinimumEvolution
+
+-- Imports
+local InterfaceToAlgorithms = require("pgf.gd.interface.InterfaceToAlgorithms")
+local DistanceMatrix = require("pgf.gd.phylogenetics.DistanceMatrix")
+local Storage = require("pgf.gd.lib.Storage")
+local Digraph = require("pgf.gd.model.Digraph")
+local lib = require("pgf.gd.lib")
+
+-- Shorthand:
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+declare {
+ key = "balanced minimum evolution",
+ algorithm = BalancedMinimumEvolution,
+ phase = "phylogenetic tree generation",
+
+ summary = [["
+ The BME (Balanced Minimum Evolution) algorithm tries to minimize
+ the total tree length.
+ "]],
+ documentation = [["
+ This algorithm is from Desper and Gascuel, \emph{Fast and
+ Accurate Phylogeny Reconstruction Algorithms Based on the
+ Minimum-Evolution Principle}, 2002. The tree is built in a way
+ that minimizes the total tree length. The leaves are inserted
+ into the tree one after another, creating new edges and new
+ nodes. After every insertion the distance matrix has to be
+ updated.
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout,
+ balanced minimum evolution,
+ grow'=right, sibling distance=0pt,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]
+}
+
+
+
+
+function BalancedMinimumEvolution:run()
+
+ self.tree = Digraph.new(self.main_algorithm.digraph)
+
+ self.distances = Storage.newTableStorage()
+
+ local vertices = self.tree.vertices
+
+ -- Sanity checks:
+ if #vertices == 2 then
+ self.tree:connect(vertices[1],vertices[2])
+ return self.tree
+ elseif #vertices > 2 then
+
+ -- Setup storages:
+ self.is_leaf = Storage.new()
+
+ -- First, build the initial distance matrix:
+ local matrix = DistanceMatrix.graphDistanceMatrix(self.tree)
+
+ -- Store distance information in the distance fields of the storages:
+ for _,u in ipairs(vertices) do
+ for _,v in ipairs(vertices) do
+ self.distances[u][v] = matrix[u][v]
+ end
+ end
+
+ -- Run BME
+ self:runBME()
+
+ -- Run postoptimizations
+ local optimization_class = self.tree.options.algorithm_phases['phylogenetic tree optimization']
+ optimization_class.new {
+ main_algorithm = self.main_algorithm,
+ tree = self.tree,
+ matrix = self.matrix,
+ distances = self.distances,
+ is_leaf = self.is_leaf,
+ }:run()
+ end
+
+ -- Finish
+ self:computeFinalLengths()
+ self:createFinalEdges()
+
+ return self.tree
+end
+
+
+
+
+-- the BME (Balanced Minimum Evolution) algorithm
+-- [DESPER and GASCUEL: Fast and Accurate Phylogeny Reconstruction
+-- Algorithms Based on the Minimum-Evolution Principle, 2002]
+--
+-- The tree is built in a way that minimizes the total tree length.
+-- The leaves are inserted into the tree one after another, creating new edges and new nodes.
+-- After every insertion the distance matrix has to be updated.
+function BalancedMinimumEvolution:runBME()
+ local g = self.tree
+ local leaves = {}
+ local is_leaf = self.is_leaf
+ local distances = self.distances
+
+ -- get user input
+ for i, vertex in ipairs (g.vertices) do
+ leaves[i] = vertex
+ is_leaf[vertex] = true
+ end
+
+ -- create the new node which will be connected to the first three leaves
+ local new_node = InterfaceToAlgorithms.createVertex(
+ self.main_algorithm,
+ {
+ name = "BMEnode"..#g.vertices+1,
+ generated_options = { { key = "phylogenetic inner node" } }
+ }
+ )
+ g:add {new_node}
+ -- set the distances of new_node to subtrees
+ local distance_1_2 = self:distance(leaves[1],leaves[2])
+ local distance_1_3 = self:distance(leaves[1],leaves[3])
+ local distance_2_3 = self:distance(leaves[2],leaves[3])
+ distances[new_node][leaves[1]] = 0.5*(distance_1_2 + distance_1_3)
+ distances[new_node][leaves[2]] = 0.5*(distance_1_2 + distance_2_3)
+ distances[new_node][leaves[3]] = 0.5*(distance_1_3 + distance_2_3)
+
+ --connect the first three leaves to the new node
+ for i = 1,3 do
+ g:connect(new_node, leaves[i])
+ g:connect(leaves[i], new_node)
+ end
+
+ for k = 4,#leaves do
+ -- compute distance from k to any subtree
+ local k_dists = Storage.newTableStorage()
+ for i = 1,k-1 do
+ -- note that the function called stores the k_dists before they are overwritten
+ self:computeAverageDistancesToAllSubtreesForK(g.vertices[i], { }, k,k_dists)
+ end
+
+ -- find the best insertion point
+ local best_arc = self:findBestEdge(g.vertices[1],nil,k_dists)
+ local head = best_arc.head
+ local tail = best_arc.tail
+
+ -- remove the old arc
+ g:disconnect(tail, head)
+ g:disconnect(head, tail)
+
+ -- create the new node
+ local new_node = InterfaceToAlgorithms.createVertex(
+ self.main_algorithm,
+ {
+ name = "BMEnode"..#g.vertices+1,
+ generated_options = {
+ { key = "phylogenetic inner node" }
+ }
+ }
+ )
+ g:add{new_node}
+
+ -- gather the vertices that will be connected to the new node...
+ local vertices_to_connect = { head, tail, leaves[k] }
+
+ -- ...and connect them
+ for _, vertex in pairs (vertices_to_connect) do
+ g:connect(new_node, vertex)
+ g:connect(vertex, new_node)
+ end
+
+ if not is_leaf[tail] then
+ distances[leaves[k]][tail] = k_dists[head][tail]
+ end
+ if not is_leaf[head] then
+ distances[leaves[k]][head] = k_dists[tail][head]
+ end
+ -- insert distances from k to subtrees into actual matrix...
+ self:setAccurateDistancesForK(new_node,nil,k,k_dists,leaves)
+
+ -- set the distance from k to the new node, which was created by inserting k into the graph
+ distances[leaves[k]][new_node] = 0.5*( self:distance(leaves[k], head) + self:distance(leaves[k],tail))
+
+ -- update the average distances
+ local values = {}
+ values.s = head -- s--u is the arc into which k has been inserted
+ values.u = tail
+ values.new_node = new_node -- the new node created by inserting k
+ self:updateAverageDistances(new_node, values,k,leaves)
+ end
+end
+
+--
+-- Updates the average distances from k to all subtrees
+--
+-- @param vertex The starting point of the recursion
+-- @param values The values needed for the recursion
+-- - s, u The nodes which span the edge into which k has been
+-- inserted
+-- - new_node The new_node which has been created to insert k
+-- - l (l-1) is the number of edges between the
+-- new_node and the current subtree Y
+--
+-- values.new_node, values.u and values.s must be set
+-- the depth first search must begin at the new node, thus vertex
+-- must be set to the newly created node
+function BalancedMinimumEvolution:updateAverageDistances(vertex, values, k, leaves)
+ local g = self.tree
+ local leaf_k = leaves[k]
+ local y, z, x
+ if not values.visited then
+ values.visited = {}
+ values.visited[leaf_k] = leaf_k -- we don't want to visit k!
+ end
+ -- there are (l-1) edges between new_node and y
+ if not values.l then values.l = 1 end
+ if not values.new_node then values.new_node = g:outgoing(leaf_k)[1].head end
+ --values.s and values.u must be set
+
+ -- the two nodes which connect the edge on which k was inserted: s,u
+
+ local new_node = values.new_node
+ local l = values.l
+ local visited = values.visited
+
+ visited[vertex] = vertex
+
+ -- computes the distances to Y{k} for all subtrees X of Z
+ function loop_over_x( x, y, values )
+ local l = values.l
+ local y1= values.y1
+
+ -- calculate distance between Y{k} and X
+ local old_distance -- the distance between Y{/k} and X needed for calculating the new distance
+ if y == new_node then -- this y didn't exist in the former tree; so use y1 (see below)
+ old_distance = self:distance(x,y1)
+ else
+ old_distance = self:distance(x,y)
+ end
+
+ local new_distance = old_distance + math.pow(2,-l) * ( self:distance(leaf_k,x) - self:distance(x,y1) )
+ self.distances[x][y] = new_distance
+ self.distances[y][x] = new_distance -- symmetric matrix
+
+ values.x_visited[x] = x
+ --go deeper to next x
+ for _, x_arc in ipairs (self.tree:outgoing(x)) do
+ if not values.x_visited[x_arc.head] then
+ local new_x = x_arc.head
+ loop_over_x( new_x, y, values )
+ end
+ end
+ end
+
+ --loop over Z's
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not visited[arc.head] then
+ -- set y1, which is the node which was pushed further away from
+ -- subtree Z by inserting k
+ if arc.head == values.s then
+ values.y1 = values.u
+ elseif arc.head == values.u then
+ values.y1 = values.s
+ else
+ assert(values.y1,"no y1 set!")
+ end
+
+ z = arc.head -- root of the subtree we're looking at
+ y = arc.tail -- the root of the subtree-complement of Z
+
+ x = z -- the first subtree of Z is Z itself
+ values.x_visited = {}
+ values.x_visited[y] = y -- we don't want to go there, as we want to stay within Z
+ loop_over_x( z,y, values ) -- visit all possible subtrees of Z
+
+ -- go to next Z
+ values.l = values.l+1 -- moving further away from the new_node
+ self:updateAverageDistances(z,values,k,leaves)
+ values.l = values.l-1 -- moving back to the new_node
+ end
+ end
+end
+
+
+--
+-- Computes the average distances of a node, which does not yet belong
+-- to the graph, to all subtrees. This is done using a depth first
+-- search
+--
+-- @param vertex The starting point of the depth first search
+-- @param values The values for the recursion
+-- - distances The table in which the distances are to be
+-- stored
+-- - outgoing_arcs The table containing the outgoing arcs
+-- of the current vertex
+--
+-- @return The average distance of the new node #k to any subtree
+-- The distances are stored as follows:
+-- example: distances[center][a]
+-- center is any vertex, thus if center is an inner vertex
+-- it has 3 neighbors a,b and c, which can all be seen as the
+-- roots of subtrees A,B,C.
+-- distances[center][a] gives us the distance of the new
+-- node k to the subtree A.
+-- if center is a leaf, it has only one neighbor, which
+-- can also be seen as the root of the subtree T\{center}
+--
+function BalancedMinimumEvolution:computeAverageDistancesToAllSubtreesForK(vertex, values, k, k_dists)
+ local is_leaf = self.is_leaf
+ local arcs = self.tree.arcs
+ local vertices = self.tree.vertices
+ local center_vertex = vertex
+ -- for every vertex a table is created, in which the distances to all
+ -- its subtrees will be stored
+
+ values.outgoing_arcs = values.outgoing_arcs or self.tree:outgoing(center_vertex)
+ for _, arc in ipairs (values.outgoing_arcs) do
+ local root = arc.head -- this vertex can be seen as the root of a subtree
+ if is_leaf[root] then -- we know the distance of k to the leaf!
+ k_dists[center_vertex][root] = self:distance(vertices[k], root)
+ else -- to compute the distance we need the root's neighboring vertices, which we can access by its outgoing arcs
+ local arc1, arc2
+ local arc_back -- the arc we came from
+ for _, next_arc in ipairs (self.tree:outgoing(root)) do
+ if next_arc.head ~= center_vertex then
+ arc1 = arc1 or next_arc
+ arc2 = next_arc
+ else
+ arc_back = next_arc
+ end
+ end
+
+ values.outgoing_arcs = { arc1, arc2, arc_back }
+
+ -- go deeper, if the distances for the next center node haven't been set yet
+ if not (k_dists[root][arc1.head] and k_dists[root][arc2.head]) then
+ self:computeAverageDistancesToAllSubtreesForK(root, values, k,k_dists)
+ end
+
+ -- set the distance between k and subtree
+ k_dists[center_vertex][root] = 1/2 * (k_dists[root][arc1.head] + k_dists[root][arc2.head])
+ end
+ end
+end
+
+
+--
+-- Sets the distances from k to subtrees
+-- In computeAverageDistancesToAllSubtreesForK the distances to ALL possible
+-- subtrees are computed. Once k is inserted many of those subtrees don't
+-- exist for k, as k is now part of them. In this function all
+-- still accurate subtrees and their distances to k are
+-- extracted.
+--
+-- @param center The vertex serving as the starting point of the depth-first search;
+-- should be the new_node
+
+function BalancedMinimumEvolution:setAccurateDistancesForK(center,visited,k,k_dists,leaves)
+ local visited = visited or {}
+ local distances = self.distances
+
+ visited[center] = center
+ local outgoings = self.tree:outgoing(center)
+ for _,arc in ipairs (outgoings) do
+ local vertex = arc.head
+ if vertex ~= leaves[k] then
+ local distance
+ -- set the distance
+ if not distances[leaves[k]][vertex] and k_dists[center] then
+ distance = k_dists[center][vertex] -- use previously calculated distance
+ distances[leaves[k]][vertex] = distance
+ distances[vertex][leaves[k]] = distance
+ end
+ -- go deeper
+ if not visited[vertex] then
+ self:setAccurateDistancesForK(vertex,visited,k,k_dists,leaves)
+ end
+ end
+ end
+end
+
+
+--
+-- Find the best edge for the insertion of leaf #k, such that the
+-- total tree length is minimized. This function uses a depth first
+-- search.
+--
+-- @param vertex The vertex where the depth first search is
+-- started; must be a leaf
+-- @param values The values needed for the recursion
+-- - visited: The vertices that already have been visited
+-- - tree_length: The current tree_length
+-- - best_arc: The current best_arc, such that the tree
+-- length is minimized
+-- - min_length: The smallest tree_length found so far
+function BalancedMinimumEvolution:findBestEdge(vertex, values, k_dists)
+ local arcs = self.tree.arcs
+ local vertices = self.tree.vertices
+ values = values or { visited = {} }
+ values.visited[vertex] = vertex
+
+ local c -- the arc we came from
+ local unvisited_arcs = {} --unvisited arcs
+ --identify arcs
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not values.visited[arc.head] then
+ unvisited_arcs[#unvisited_arcs+1] = arc
+ else
+ c = arc.head --last visited arc
+ end
+ end
+
+ for i, arc in ipairs (unvisited_arcs) do
+ local change_in_tree_length = 0
+ -- set tree length to 0 for first insertion arc
+ if not values.tree_length then
+ values.tree_length = 0
+ values.best_arc = arc
+ values.min_length = 0
+ else -- compute new tree length for the case that k is inserted into this arc
+ local b = arc.head --current arc
+ local a = unvisited_arcs[i%2+1].head -- the remaining arc
+ local k_v = vertices[k] -- the leaf to be inserted
+ change_in_tree_length = 1/4 * ( ( self:distance(a,c)
+ + k_dists[vertex][b])
+ - (self:distance(a,b)
+ + k_dists[vertex][c]) )
+ values.tree_length = values.tree_length + change_in_tree_length
+ end
+ -- if the tree length becomes shorter, this is the new best arc
+ -- for the insertion of leaf k
+ if values.tree_length < values.min_length then
+ values.best_arc = arc
+ values.min_length = values.tree_length
+ end
+
+ -- go deeper
+ self:findBestEdge(arc.head, values, k_dists)
+
+ values.tree_length = values.tree_length - change_in_tree_length
+ end
+ return values.best_arc
+end
+
+-- Calculates the total tree length
+-- This is done by adding up all the edge lengths
+--
+-- @return the tree length
+function BalancedMinimumEvolution:calculateTreeLength()
+ local vertices = self.tree.vertices
+ local sum = 0
+
+ for index, v1 in ipairs(vertices) do
+ for i = index+1,#vertices do
+ local v2 = vertices[i]
+ local dist = self.lengths[v1][v2]
+ if dist then
+ sum = sum + dist
+ end
+ end
+ end
+ return sum
+end
+
+-- generates edges for the final graph
+--
+-- throughout the process of creating the tree, arcs have been
+-- disconnected and connected, without truly creating edges. this is
+-- done in this function
+function BalancedMinimumEvolution:createFinalEdges()
+ local g = self.tree
+ local o_arcs = {} -- copy arcs since createEdge is going to modify the arcs array...
+ for _,arc in ipairs(g.arcs) do
+ if arc.tail.event.index < arc.head.event.index then
+ o_arcs[#o_arcs+1] = arc
+ end
+ end
+ for _,arc in ipairs(o_arcs) do
+ InterfaceToAlgorithms.createEdge(
+ self.main_algorithm, arc.tail, arc.head,
+ { generated_options = {
+ { key = "phylogenetic edge", value = tostring(self.lengths[arc.tail][arc.head]) }
+ }})
+ end
+end
+
+
+-- Gets the distance between two nodes as specified in their options
+-- or storage fields.
+-- Note: this function implies that the distance from a to b is the
+-- same as the distance from b to a.
+--
+-- @param a,b The nodes
+-- @return The distance between the two nodes
+
+function BalancedMinimumEvolution:distance(a, b)
+ if a == b then
+ return 0
+ else
+ local distances = self.distances
+ return distances[a][b] or distances[b][a]
+ end
+end
+
+
+--
+-- computes the final branch lengths
+--
+-- goes over all arcs and computes the final branch lengths,
+-- as neither the BME nor the BNNI main_algorithm does so.
+function BalancedMinimumEvolution:computeFinalLengths()
+ local is_leaf = self.is_leaf
+ local lengths = self.lengths
+ local g = self.tree
+ for _, arc in ipairs(g.arcs) do
+ local head = arc.head
+ local tail = arc.tail
+ local distance
+ local a,b,c,d
+ -- assert, that the length hasn't already been computed for this arc
+ if not lengths[head][tail] then
+ if not is_leaf[head] then
+ -- define subtrees a and b
+ for _, arc in ipairs (g:outgoing(head)) do
+ local subtree = arc.head
+ if subtree ~= tail then
+ a = a or subtree
+ b = subtree
+ end
+ end
+ end
+ if not is_leaf[tail] then
+ -- define subtrees c and d
+ for _, arc in ipairs (g:outgoing(tail)) do
+ local subtree = arc.head
+ if subtree ~= head then
+ c = c or subtree
+ d = subtree
+ end
+ end
+ end
+ -- compute the distance using the formula for outer or inner edges, respectively
+ if is_leaf[head] then
+ distance = 1/2 * ( self:distance(head,c)
+ + self:distance(head,d)
+ - self:distance(c,d) )
+ elseif is_leaf[tail] then
+ distance = 1/2 * ( self:distance(tail,a)
+ + self:distance(tail,b)
+ - self:distance(a,b) )
+ else --inner edge
+ distance = self:distance(head, tail)
+ -1/2 * ( self:distance(a,b)
+ + self:distance(c,d) )
+ end
+ lengths[head][tail] = distance
+ lengths[tail][head] = distance
+ end
+ end
+
+end
+
+
+
+return BalancedMinimumEvolution
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua
new file mode 100644
index 0000000000..1980afe7ad
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua
@@ -0,0 +1,372 @@
+-- Copyright 2013 by Sarah Mäusle and Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+local BalancedNearestNeighbourInterchange = {}
+
+
+-- Namespace
+require("pgf.gd.phylogenetics").BalancedNearestNeighbourInterchange = BalancedNearestNeighbourInterchange
+
+-- Imports
+local InterfaceToAlgorithms = require("pgf.gd.interface.InterfaceToAlgorithms")
+local DistanceMatrix = require("pgf.gd.phylogenetics.DistanceMatrix")
+local lib = require("pgf.gd.lib")
+
+-- Shorthand:
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+declare {
+ key = "balanced nearest neighbour interchange",
+ algorithm = BalancedNearestNeighbourInterchange,
+ phase = "phylogenetic tree optimization",
+ phase_default = true,
+
+ summary = [["
+ The BNNI (Balanced Nearest Neighbor Interchange) is a
+ postprocessing algorithm for phylogenetic trees. It swaps two
+ distant 3-subtrees if the total tree length is reduced by doing
+ so, until no such swaps are left.
+ "]],
+ documentation = [["
+ This algorithm is from Desper and Gascuel, \emph{Fast and
+ Accurate Phylogeny Reconstruction Algorithms Based on the
+ Minimum-Evolution Principle}, 2002.
+ "]]
+}
+
+
+---
+declare {
+ key = "no phylogenetic tree optimization",
+ algorithm = { run = function(self) end },
+ phase = "phylogenetic tree optimization",
+
+ summary = [["
+ Switches off any phylogenetic tree optimization.
+ "]],
+}
+
+
+
+-- creates a binary heap, implementation as an array as described in
+-- the respective wikipedia article
+local function new_heap()
+ local heap = {}
+
+ function heap:insert(element, value)
+ local object = { element = element, value = value }
+ heap[#heap+1]= object
+
+ local i = #heap
+ local parent = math.floor(i/2)
+
+ -- sort the new object into its correct place
+ while heap[parent] and heap[parent].value < heap[i].value do
+ heap[i] = heap[parent]
+ heap[parent] = object
+ i = parent
+ parent = math.floor(i/2)
+ end
+ end
+
+ -- deletes the top element from the heap
+ function heap:remove_top_element()
+ -- replace first element with last and delete the last element
+ local element = heap[1].element
+ heap[1] = heap[#heap]
+ heap[#heap] = nil
+
+ local i = 1
+ local left_child = 2*i
+ local right_child = 2*i +1
+
+ -- sort the new top element into its correct place by swapping it
+ -- against its largest child
+ while heap[left_child] do
+ local largest_child = left_child
+ if heap[right_child] and heap[left_child].value < heap[right_child].value then
+ largest_child = right_child
+ end
+
+ if heap[largest_child].value > heap[i].value then
+ heap[largest_child], heap[i] = heap[i], heap[largest_child]
+ i = largest_child
+ left_child = 2*i
+ right_child = 2*i +1
+ else
+ return element
+ end
+ end
+ return element
+ end
+
+ return heap
+end
+
+
+-- BNNI (Balanced Nearest Neighbor Interchange)
+-- [DESPER and GASCUEL: Fast and Accurate Phylogeny Reconstruction Algorithms Based on the Minimum-Evolution Principle, 2002]
+-- swaps two distant-3 subtrees if the total tree length is reduced by doing so, until no such swaps are left
+--
+-- step 1: precomputation of all average distances between non-intersecting subtrees (already done by BME)
+-- step 2: create heap of possible swaps
+-- step 3: ( current tree with subtrees a,b,c,d: a--v-- {b, w -- {c, d}} )
+-- (a): edge (v,w) is the best swap on the heap. Remove (v,c) and (w,b)
+-- (b), (c), (d) : update the distance matrix
+-- (e): remove the edge (v,w) from the heap; check the four edges adjacent to it for new possible swaps
+-- (d): if the heap is non-empty, return to (a)
+
+function BalancedNearestNeighbourInterchange:run()
+ local g = self.tree
+ -- create a heap of possible swaps
+ local possible_swaps = new_heap()
+ -- go over all arcs, look for possible swaps and add them to the heap [step 2]
+ for _, arc in ipairs (g.arcs) do
+ self:getBestSwap(arc, possible_swaps)
+ end
+
+ -- achieve best swap and update the distance matrix, until there is
+ -- no more swap to perform
+
+ while #possible_swaps > 0 do
+ -- get the best swap and delete it from the heap
+ local swap = possible_swaps:remove_top_element() --[part of step 3 (a)]
+
+ -- Check if the indicated swap is still possible. Another swap may
+ -- have interfered.
+ if g:arc(swap.v, swap.subtree1) and g:arc(swap.w, swap.subtree2) and g:arc(swap.v, swap.w) and g:arc(swap.a, swap.v) and g:arc(swap.d, swap.w) then
+ -- insert new arcs and delete the old ones to perform the swap [part of step 3 (a)]
+
+ -- disconnect old arcs
+ g:disconnect(swap.v, swap.subtree1)
+ g:disconnect(swap.subtree1, swap.v)
+ g:disconnect(swap.w, swap.subtree2)
+ g:disconnect(swap.subtree2, swap.w)
+
+ -- connect new arcs
+ g:connect(swap.v, swap.subtree2)
+ g:connect(swap.subtree2, swap.v)
+ g:connect(swap.w, swap.subtree1)
+ g:connect(swap.subtree1, swap.w)
+
+ --update distance matrix
+ self:updateBNNI(swap)
+
+ -- update heap: check neighboring arcs for new possible swaps
+ -- [step 3 (e)]
+ self:getBestSwap(g:arc(swap.a,swap.v), possible_swaps)
+ self:getBestSwap(g:arc(swap.subtree2, swap.v), possible_swaps)
+ self:getBestSwap(g:arc(swap.d,swap.w), possible_swaps)
+ self:getBestSwap(g:arc(swap.subtree1, swap.w), possible_swaps)
+ end
+ end
+
+end
+
+
+--
+-- Gets the distance between two nodes as specified in the distances
+-- fields. Note: this function assumes that the distance from a to b
+-- is the
+-- same as the distance from b to a.
+--
+-- @param a,b The nodes
+-- @return The distance between the two nodes
+function BalancedNearestNeighbourInterchange:distance(a, b)
+ if a == b then
+ return 0
+ else
+ local distances = self.distances
+ return distances[a][b] or distances[b][a]
+ end
+end
+
+-- updates the distance matrix after a swap has been performed [step3(b),(c),(d)]
+--
+-- @param swap A table containing the information on the performed swap
+-- subtree1, subtree2: the two subtrees, which
+-- were swapped
+-- a, d: The other two subtrees bordering the
+-- swapping edge
+-- v, w : the two nodes connecting the swapping edge
+
+function BalancedNearestNeighbourInterchange:updateBNNI(swap)
+ local g = self.tree
+ local b = swap.subtree1
+ local c = swap.subtree2
+ local a = swap.a
+ local d = swap.d
+ local v = swap.v
+ local w = swap.w
+ local distances = self.distances
+
+ -- updates the distances in one of the four subtrees adjacent to the
+ -- swapping edge
+ function update_BNNI_subtree(swap, values)
+ local g = self.tree
+ local b = swap.farther
+ local c = swap.nearer
+ local a = swap.subtree
+ local v = swap.v
+ local d = swap.same
+ local w = swap.w
+
+ if not values then
+ values = {
+ visited = {[v] = v},
+ possible_ys = {v},
+ x = a,
+ y = v
+ }
+ -- if we're looking at subtrees in one of the swapped subtrees,
+ -- then need the old root (w) for the calculations
+ if swap.swapped_branch then values.possible_ys = {w} end
+ end
+ local visited = values.visited
+ local x = values.x
+ local y = values.y
+ local ys = values.possible_ys
+ local l = 0 -- number of edges between y and v
+
+ local dist_x_b = self:distance(x,b)
+ local dist_x_c = self:distance(x,c)
+ visited[x] = x --mark current x as visited
+
+ -- loop over possible y's:
+ for _, y in ipairs (ys) do
+ -- update distance [step 3(b)]
+ local distance = self:distance(x,y) - 2^(-l-2)*dist_x_b + 2^(-l-2)*dist_x_c
+
+ if y == w then y = v end -- the old distance w,x was used for the new distance calculation, but it needs to be
+ -- saved under its appropriate new name according to its new root. this case only arises when looking at x's
+ -- in one of the swapped subtrees (b or c)
+
+ distances[x][y] = distance
+ distances[y][x] = distance
+ l = l+1 -- length + 1, as the next y will be further away from v
+ end
+
+ -- update the distance between x and w (root of subtree c and d)
+ -- [step 3(c)]
+ local distance = 1/2 * (self:distance(x,b) + self:distance(x,d))
+ distances[x][w] = distance
+ distances[w][x] = distance
+
+ -- go to next possible x's
+ table.insert(ys, x) -- when we're at the next possible x, y can also be the current x
+ for _,arc in ipairs (g:outgoing(x)) do
+ if not visited[arc.head] then
+ values.x = arc.head
+ --go deeper
+ update_BNNI_subtree(swap, values)
+ end
+ end
+ end
+
+ -- name the nodes/subtrees in a general way that allows the use of the function update_BNNI_subtree
+ local update_a = {subtree = a, farther = b, nearer = c, v = v, same = d, w = w}
+ local update_b = {subtree = b, farther = a, nearer = d, v = w, same = c, w = v, swapped_branch = true}
+ local update_c = {subtree = c, farther = d, nearer = a, v = v, same = b, w = w, swapped_branch = true}
+ local update_d = {subtree = d, farther = c, nearer = b, v = w, same = a, w = v}
+
+ -- update the distances within the subtrees a,b,c,d respectively
+ update_BNNI_subtree(update_a)
+ update_BNNI_subtree(update_b)
+ update_BNNI_subtree(update_c)
+ update_BNNI_subtree(update_d)
+
+ -- update the distance between subtrees v and w [step 3 (d)]:
+ local distance = 1/4*( self:distance(a,b) + self:distance(a,d) + self:distance(c,b) + self:distance(c,d) )
+ distances[v][w] = distance
+ distances[w][v] = distance
+end
+
+
+
+-- finds the best swap across an arc and inserts it into the heap of
+-- possible swaps
+--
+-- @param arc The arc, which is to be checked for possible swaps
+-- @param heap_of_swaps The heap, containing all swaps, which
+-- improve the total tree length
+--
+-- the following data of the swap are saved:
+-- v,w = the nodes connecting the arc, across which the swap is
+-- performed
+-- subtree1,2 = the roots of the subtrees that are to be swapped
+-- a,d = the roots of the two remaining subtrees adjacent to the arc
+
+function BalancedNearestNeighbourInterchange:getBestSwap(arc, heap_of_swaps)
+ local g = self.tree
+ local possible_swaps = heap_of_swaps
+ local v = arc.tail
+ local w = arc.head
+ local is_leaf = self.is_leaf
+
+ -- only look at inner edges:
+ if not is_leaf[v] and not is_leaf[w] then
+ -- get the roots of the adjacent subtrees
+ local a, b, c, d
+ for _,outgoing in ipairs (g:outgoing(v)) do
+ local head = outgoing.head
+ if head ~= w then
+ a = a or head
+ b = head
+ end
+ end
+
+ for _,outgoing in ipairs (g:outgoing(w)) do
+ local head = outgoing.head
+ if head ~= v then
+ c = c or head
+ d = head
+ end
+ end
+
+ -- get the distances between the four subtrees
+ local a_b = self:distance(a,b)
+ local a_c = self:distance(a,c)
+ local a_d = self:distance(a,d)
+ local b_c = self:distance(b,c)
+ local b_d = self:distance(b,d)
+ local c_d = self:distance(c,d)
+
+ -- difference in total tree length between old tree (T) and new tree (T')
+ -- when nodes b and c are swapped
+ local swap1 = 1/4*(a_b + c_d - a_c - b_d )
+
+ -- difference in total tree length between old tree and new tree when nodes b and d are swapped
+ local swap2 = 1/4*(a_b + c_d - a_d - b_c)
+
+ -- choose the best swap that reduces the total tree length most (T-T' > 0)
+ if swap1 > swap2 and swap1 > 0 then
+ -- v,w = the nodes connecting the edge across which the swap is performed
+ -- subtree1 = one of the nodes to be swapped; connected to v
+ -- subtree2 = the other node to be swapped; connected to w
+ -- a = other node connected to v
+ -- d = other node connected to w
+ local swap = { v = v, w = w, subtree1 = b, subtree2 = c, a = a, d = d }
+ -- insert the swap into the heap
+ possible_swaps:insert(swap, swap1)
+ elseif swap2 > 0 then
+ local swap = { v = v, w = w, subtree1 = b, subtree2 = d, d = c, a = a }
+ possible_swaps:insert(swap, swap2)
+ end
+ end
+end
+
+
+
+return BalancedNearestNeighbourInterchange
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/DistanceMatrix.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/DistanceMatrix.lua
new file mode 100644
index 0000000000..a65a83da17
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/DistanceMatrix.lua
@@ -0,0 +1,451 @@
+-- Copyright 2013 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+local DistanceMatrix = {}
+
+
+-- Imports
+local InterfaceToAlgorithms = require("pgf.gd.interface.InterfaceToAlgorithms")
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+
+declare {
+ key = "distance matrix vertices",
+ type = "string",
+
+ summary = [["
+ A list of vertices that are used in the parsing of the
+ |distance matrix| key. If this key is not used at all, all
+ vertices of the graph will be used for the computation of a
+ distance matrix.
+ "]],
+
+ documentation = [["
+ The vertices must be separated by spaces and/or
+ commas. For vertices containing spaces or commas, the vertex
+ names may be surrounded by single or double quotes (as in
+ Lua). Typical examples are |a, b, c| or |"hello world", 'foo'|.
+ "]]
+}
+
+
+
+---
+
+declare {
+ key = "distance matrix",
+ type = "string",
+
+ summary = [["
+ A distance matrix specifies ``desired distances'' between
+ vertices in a graph. These distances are used, in particular, in
+ algorithms for computing phylogenetic trees.
+ "]],
+
+ documentation = [["
+ When this key is parsed, the key |distance matrix vertices| is
+ considered first. It is used to determine a list of vertices
+ for which a distance matrix is computed, see that key for
+ details. Let $n$ be the number of vertices derived from that
+ key.
+
+ The string passed to the |distance matrix| key is basically
+ a sequence of numbers that are used to fill an $n \times n$
+ matrix. This works as follows: We keep track of a \emph{current
+ position $p$} in the matrix, starting at the upper left corner
+ of the matrix. We read the numbers in the string
+ one by one, write it to the current position of the matrix, and
+ advance the current position by going right one step; if we go
+ past the right end of the matrix, we ``wrap around'' by going
+ back to the left border of the matrix, but one line down. If we
+ go past the bottom of the matrix, we start at the beginning once
+ more.
+
+ This basic behavior can be modified in different ways. First,
+ when a number is followed by a semicolon instead of a comma or a
+ space (which are the ``usual'' ways of indicating the end of a
+ number), we immediately go down to the next line. Second,
+ instead of a number you can directly provide a \emph{position}
+ in the matrix and the current position will be set to this
+ position. Such a position information is detected by a
+ greater-than sign (|>|). It must be followed by
+ %
+ \begin{itemize}
+ \item a number or a vertex name or
+ \item a number or a vertex name, a comma, and another number or
+ vertex name or
+ \item a comma and a number and a vertex name.
+ \end{itemize}
+ %
+ Examples of the respective cases are |>1|, |>a,b|, and
+ |>,5|. The semantics is as follows: In all cases, if a vertex
+ name rather than a number is given, it is converted into a
+ number (namely the index of the vertex inside the matrix). Then,
+ in the first case, the column of the current position is set to
+ the given number; in the second case, the columns is set to the
+ first number and the column is set to the second number; and in
+ the third case only the row is set to the given number. (This
+ idea is that following the |>|-sign comes a ``coordinate pair''
+ whose components are separated by a comma, but part of that pair
+ may be missing.) If a vertex name contains special symbols like
+ a space or a comma, you must surround it by single or double
+ quotation marks (as in Lua).
+
+ Once the string has been parsed completely, the matrix may be
+ filled only partially. In this case, for each missing entry
+ $(x,y)$, we try to set it to the value of the entry $(y,x)$,
+ provided that entry is set. If neither are set, the entry is set
+ to $0$.
+
+ Let us now have a look at several examples that all produce the
+ same matrix. The vertices are |a|, |b|, |c|.
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+0, 1, 2
+1, 0, 3
+2, 3, 0
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+0 1 2 1 0 3 2 3 0
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+;
+1;
+2 3
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+>,b 1; 2 3
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+>b 1 2 >c 3
+\end{codeexample}
+ "]]
+}
+
+
+---
+
+declare {
+ key = "distances",
+ type = "string",
+
+ summary = [["
+ This key is used to specify the ``desired distances'' between
+ a vertex and the other vertices in a graph.
+ "]],
+
+ documentation = [["
+ This key works similar to the |distance matrix| key, only it is
+ passed to a vertex instead of to a whole graph. The syntax is
+ the same, only the notion of different ``rows'' is not
+ used. Here are some examples that all have the same effect,
+ provided the nodes are |a|, |b|, and |c|.
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+0, 1, 2
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+0 1 2
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+>b 1 2
+\end{codeexample}
+ %
+\begin{codeexample}[code only, tikz syntax=false]
+>c 2, >b 1
+\end{codeexample}
+ "]]
+}
+
+
+
+local function to_index(s, indices)
+ if s and s ~= "" then
+ if s:sub(1,1) == '"' then
+ local _, _, m = s:find('"(.*)"')
+ return indices[InterfaceToAlgorithms.findVertexByName(m)]
+ elseif s:sub(1,1) == "'" then
+ local _, _, m = s:find("'(.*)'")
+ return indices[InterfaceToAlgorithms.findVertexByName(m)]
+ else
+ local num = tonumber(s)
+ if not num then
+ return indices[InterfaceToAlgorithms.findVertexByName(s)]
+ else
+ return num
+ end
+ end
+ end
+end
+
+local function compute_indices(vertex_string, vertices)
+ local indices = {}
+
+ if not vertex_string then
+ for i,v in ipairs(vertices) do
+ indices[i] = v
+ indices[v] = i
+ end
+ else
+ -- Ok, need to parse the vertex_string. Sigh.
+ local pos = 1
+ while pos <= #vertex_string do
+ local start = vertex_string:sub(pos,pos)
+ if not start:find("[%s,]") then
+ local _, vertex
+ if start == '"' then
+ _, pos, vertex = vertex_string:find('"(.-)"', pos)
+ elseif start == "'" then
+ _, pos, vertex = vertex_string:find("'(.-)'", pos)
+ else
+ _, pos, vertex = vertex_string:find("([^,%s'\"]*)", pos)
+ end
+ local v = assert(InterfaceToAlgorithms.findVertexByName(vertex), "unknown vertex name '" .. vertex .. "'")
+ indices [#indices + 1] = v
+ indices [v] = #indices
+ end
+ pos = pos + 1
+ end
+ end
+
+ return indices
+end
+
+
+---
+-- Compute a distance matrix based on the values of a
+-- |distance matrix| and a |distance matrix vertices|.
+--
+-- @param matrix_string A distance matrix string
+-- @param vertex_string A distance matrix vertex string
+-- @param vertices An array of all vertices in the graph.
+--
+-- @return A distance matrix. This matrix will contain both a
+-- two-dimensional array (accessed through numbers) and also a
+-- two-dimensional hash table (accessed through vertex indices). Thus,
+-- you can write both |m[1][1]| and also |m[v][v]| to access the first
+-- entry of this matrix, provided |v == vertices[1]|.
+-- @return An index vector. This is an array of the vertices
+-- identified for the |vertex_string| parameter.
+
+function DistanceMatrix.computeDistanceMatrix(matrix_string, vertex_string, vertices)
+ -- First, we create a table of the vertices we need to consider:
+ local indices = compute_indices(vertex_string, vertices)
+
+ -- Second, build matrix.
+ local n = #indices
+ local m = {}
+ for i=1,n do
+ m[i] = {}
+ end
+
+ local x = 1
+ local y = 1
+ local pos = 1
+ -- Start scanning the matrix_string
+ while pos <= #matrix_string do
+ local start = matrix_string:sub(pos,pos)
+ if not start:find("[%s,]") then
+ if start == '>' then
+ local _, parse
+ _, pos, parse = matrix_string:find(">([^%s>;]*)", pos)
+ local a, b
+ if parse:find(",") then
+ _,_,a,b = parse:find("(.*),(.*)")
+ else
+ a = parse
+ end
+ x = to_index(a, indices) or x
+ y = to_index(b, indices) or y
+ elseif start == ';' then
+ x = 1
+ y = y + 1
+ elseif start == ',' then
+ x = x + 1
+ else
+ local _, n
+ _, pos, n = matrix_string:find("([^,;%s>]*)", pos)
+ local num = assert(tonumber(n), "number expected in distance matrix")
+ m[x][y] = num
+ x = x + 1
+ -- Skip everything up to first comma:
+ _, pos = matrix_string:find("(%s*,?)", pos+1)
+ end
+ end
+ pos = pos + 1
+ if x > n then
+ x = 1
+ y = y + 1
+ end
+ if y > n then
+ y = 1
+ end
+ end
+
+ -- Fill up
+ for x=1,n do
+ for y=1,n do
+ if not m[x][y] then
+ m[x][y] = m[y][x] or 0
+ end
+ end
+ end
+
+ -- Copy to index version
+ for x=1,n do
+ local v = indices[x]
+ m[v] = {}
+ for y=1,n do
+ local u = indices[y]
+ m[v][u] = m[x][y]
+ end
+ end
+
+ return m, indices
+end
+
+
+
+
+---
+-- Compute a distance vector. See the key |distances| for details.
+--
+-- @param vector_string A distance vector string
+-- @param vertex_string A distance matrix vertex string
+-- @param vertices An array of all vertices in the graph.
+--
+-- @return A distance vector. Like a distance matrix, this vector will
+-- double indexed, once by numbers and once be vertex objects.
+-- @return An index vector. This is an array of the vertices
+-- identified for the |vertex_string| parameter.
+
+function DistanceMatrix.computeDistanceVector(vector_string, vertex_string, vertices)
+ -- First, we create a table of the vertices we need to consider:
+ local indices = compute_indices(vertex_string, vertices)
+
+ -- Second, build matrix.
+ local n = #indices
+ local m = {}
+ local x = 1
+ local pos = 1
+ -- Start scanning the vector_string
+ while pos <= #vector_string do
+ local start = vector_string:sub(pos,pos)
+ if not start:find("[%s,]") then
+ if start == '>' then
+ local _, parse
+ _, pos, parse = vector_string:find(">([^%s>;]*)", pos)
+ x = to_index(parse, indices) or x
+ elseif start == ',' then
+ x = x + 1
+ else
+ local _, n
+ _, pos, n = vector_string:find("([^,;%s>]*)", pos)
+ local num = assert(tonumber(n), "number expected in distance matrix")
+ m[x] = num
+ x = x + 1
+ -- Skip everything up to first comma:
+ _, pos = vector_string:find("(%s*,?)", pos+1)
+ end
+ end
+ pos = pos + 1
+ if x > n then
+ x = 1
+ end
+ end
+
+ -- Fill up
+ for x=1,n do
+ m[x] = m[x] or 0
+ m[indices[x]] = m[x]
+ end
+
+ return m, indices
+end
+
+
+
+---
+-- Compute a distance matrix for a graph that incorporates all
+-- information stored in the different options of the graph and the
+-- vertices.
+--
+-- @param graph A digraph object.
+--
+-- @return A distance matrix for all vertices of the graph.
+
+function DistanceMatrix.graphDistanceMatrix(digraph)
+ local vertices = digraph.vertices
+ local n = #vertices
+ local m = {}
+ for i,v in ipairs(vertices) do
+ m[i] = {}
+ m[v] = {}
+ end
+
+ local indices = {}
+ for i,v in ipairs(vertices) do
+ indices[i] = v
+ indices[v] = i
+ end
+
+ if digraph.options['distance matrix'] then
+ local sub, vers = DistanceMatrix.computeDistanceMatrix(
+ digraph.options['distance matrix'],
+ digraph.options['distance matrix vertices'],
+ vertices
+ )
+
+ for x=1,#vers do
+ for y=1,#vers do
+ m[vers[x]][vers[y]] = sub[x][y]
+ end
+ end
+ end
+
+ for i,v in ipairs(vertices) do
+ if v.options['distances'] then
+ local sub, vers = DistanceMatrix.computeDistanceVector(
+ v.options['distances'],
+ v.options['distance matrix vertices'],
+ vertices
+ )
+
+ for x=1,#vers do
+ m[vers[x]][v] = sub[x]
+ end
+ end
+ end
+
+ -- Fill up number versions:
+ for x,vx in ipairs(vertices) do
+ for y,vy in ipairs(vertices) do
+ m[x][y] = m[vx][vy]
+ end
+ end
+
+ return m
+end
+
+
+
+return DistanceMatrix
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/Maeusle2012.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/Maeusle2012.lua
new file mode 100644
index 0000000000..a9acc48865
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/Maeusle2012.lua
@@ -0,0 +1,778 @@
+-- Copyright 2013 by Sarah Mäusle and Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local Digraph = require 'pgf.gd.model.Digraph'
+local Coordinate = require 'pgf.gd.model.Coordinate'
+local Path = require 'pgf.gd.model.Path'
+
+local layered = require 'pgf.gd.layered'
+
+local lib = require 'pgf.gd.lib'
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+-- Main class of this file:
+
+local Maeusle2012 = lib.class {}
+
+-- Namespace
+require("pgf.gd.phylogenetics").Maeusle2012 = Maeusle2012
+
+
+
+
+---
+declare {
+ key = "rooted rectangular phylogram",
+ algorithm = {
+ base_class = Maeusle2012,
+ run = function (self)
+ local root = self:getRoot()
+ self:setPosForRectangularLayout(root)
+ end
+ },
+ phase = "phylogenetic tree layout",
+ phase_default = true,
+
+ summary = [["
+ A rooted rectangular phylogram is...
+ "]],
+ documentation = [["
+ ...
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout,
+ rooted rectangular phylogram,
+ balanced minimum evolution,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]
+}
+
+---
+declare {
+ key = "rectangular phylogram",
+ use = { { key = "rooted rectangular phylogram" } },
+ summary = "An alias for |rooted rectangular phylogram|"
+}
+
+---
+declare {
+ key = "rooted straight phylogram",
+ algorithm = {
+ base_class = Maeusle2012,
+ run = function (self)
+ local root = self:getRoot()
+ self:setXPos(root)
+ self:setYPosForStraightLayout(root)
+ end
+ },
+ phase = "phylogenetic tree layout",
+
+ summary = [["
+ A rooted straight phylogram is...
+ "]],
+ documentation = [["
+ ...
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout,
+ rooted straight phylogram,
+ balanced minimum evolution, grow=right,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]}
+
+---
+declare {
+ key = "straight phylogram",
+ use = { { key = "rooted straight phylogram" } },
+ summary = "An alias for |rooted straight phylogram|"
+}
+
+---
+declare {
+ key = "unrooted rectangular phylogram",
+ algorithm = {
+ base_class = Maeusle2012,
+ run = function (self)
+ local root1, root2 = self:getRoot()
+ self:setPosForUnrootedRectangular(root2, root1)
+ end
+ },
+ phase = "phylogenetic tree layout",
+
+ summary = [["
+ A unrooted rectangular phylogram is...
+ "]],
+ documentation = [["
+ ...
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout,
+ unrooted rectangular phylogram,
+ balanced minimum evolution, grow=right,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]
+}
+
+---
+declare {
+ key = "unrooted straight phylogram",
+ algorithm = {
+ base_class = Maeusle2012,
+ run = function (self)
+ local root1, root2 = self:getRoot()
+ self:setPosForUnrootedStraight(root2, root1)
+ end
+ },
+ phase = "phylogenetic tree layout",
+
+ summary = [["
+ A unrooted straight phylogram is...
+ "]],
+ documentation = [["
+ ...
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout,
+ unrooted straight phylogram,
+ balanced minimum evolution, grow=right,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]
+}
+
+
+---
+declare {
+ key = "evolutionary unit length",
+ type = "length",
+ initial = "1cm",
+
+ summary = [["
+ Specifies how long a ``unit'' of evolutionary time should be on
+ paper. For instance, if two nodes in a phylogenetic tree have an
+ evolutionary distance of 3 and this length is set to |1cm|, then
+ they will be |3cm| apart in a straight-line phylogram.
+ "]],
+ documentation = [["
+ (This key used to be called |distance scaling factor|.)
+ "]],
+}
+
+
+
+--
+-- Gets the edge length between two nodes
+--
+-- @param vertex1, vertex2 The two nodes
+--
+-- @return The length of the edge between the two nodes
+function Maeusle2012:edgeLength(vertex1, vertex2)
+ return self.lengths[vertex1][vertex2]
+end
+
+
+-- Sets the x and y coordinates for all nodes, using a depth first
+-- search
+--
+-- @param vertex The starting point; should usually be the root
+-- @param values Values needed for the recursion
+-- @param vertex2 A node that will not be visited; this parameter should only be set
+-- for an unrooted layout to ensure that only the half of the tree is set.
+function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2)
+ local arcs = self.tree.arcs
+ local vertices = self.tree.vertices
+ local adjusted_bb = self.main_algorithm.adjusted_bb
+
+ values = values or {
+ length = 0, -- current path length
+ visited = {}, -- all nodes that have already been visited
+ leaves = {}, -- all leaves from left to right
+ }
+
+ local vertex_is_leaf = true
+ values.visited[vertex] = true
+
+ local children = {} -- a table containing all children of the
+ -- current vertex (for the later determination of inner vertices
+ -- x-positions)
+
+
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not values.visited[arc.head] and arc.head ~= vertex2 then
+ -- if arc.head hasn't been visited, the current vertex cannot be a leaf
+ vertex_is_leaf = false
+ local arc_length = self:edgeLength(vertex, arc.head)
+
+ values.length = values.length + arc_length
+
+ -- go deeper
+ self:setPosForRectangularLayout(arc.head, values, vertex2)
+
+ -- get the children of the current vertex
+ children[#children+1] = arc.head
+
+ values.length = values.length - arc_length
+ end
+ end
+
+ if vertex_is_leaf then
+ -- subtract layer_pre, thus the leaf itself is NOT part of the
+ -- edge length
+ vertex.pos.y = - adjusted_bb[vertex].layer_pre
+
+ values.leaves[#values.leaves+1] = vertex
+
+ -- x coordinate:
+ -- the x coordinates of the leaves are the first to be set; the
+ -- first leave stays at x = 0, the x coordinates for the other
+ -- leaves is computed with help of the ideal_sibling_distance
+ -- function
+ if #values.leaves > 1 then
+ local left_sibling = values.leaves[#values.leaves-1]
+ local ideal_distance = layered.ideal_sibling_distance(adjusted_bb, self.tree, vertex, left_sibling )
+ vertex.pos.x = left_sibling.pos.x + ideal_distance
+ end
+
+ else -- the vertex is an inner node
+ -- the x position of an inner vertex is at the center of its children.
+
+ -- determine the outer children
+ local left_child = children[1]
+ local right_child = left_child
+ for _, child in ipairs(children) do
+ if child.pos.x < left_child.pos.x then left_child = child end
+ if child.pos.x > right_child.pos.x then right_child = child end
+ end
+
+ -- position between child with highest and child with lowest x-value,
+ -- if number of children is even
+ local index_of_middle_child = math.ceil(#children/2)
+ local even = #children/2 == index_of_middle_child
+
+ if even then
+ vertex.pos.x = (left_child.pos.x + right_child.pos.x) / 2
+ index_of_middle_child = 0
+ else -- if number of children is odd, position above the middle child
+ vertex.pos.x = children[index_of_middle_child].pos.x
+ table.remove(children, index_of_middle_child) -- don't bend the edge to this node, as it it above it anyway
+ end
+ end
+
+ -- set the node's y-coordinate, using the calculated length
+ -- and a scaling factor
+ vertex.pos.y = vertex.pos.y + (values.length * self.tree.options['evolutionary unit length'])
+
+ -- if this is the second subtree to be set of an unrooted tree, have
+ -- it grow in the other direction
+ if values.second_subtree then
+ vertex.pos.y = -vertex.pos.y
+ end
+
+ -- bend the edges for the rectangular layout
+ for i,child in ipairs(children) do
+ self:bendEdge90Degree(child, vertex)
+ end
+
+ return values
+end
+
+
+-- Sets only the x-positions of all nodes using a depth-first search.
+-- This is necessary for straight-edge layouts.
+--
+-- @param vertex The starting point of the depth-first search; should usually be the root
+-- @param values Values needed for the recursion
+-- @param vertex2 A node that will not be visited; this parameter should only be set
+-- for an unrooted layout to ensure that only the half of the tree is set.
+function Maeusle2012:setXPos(vertex, values, vertex2)
+ local arcs = self.tree.arcs
+ local vertices = self.tree.vertices
+ if not values then
+ values = {
+ visited = {}, -- all nodes that have already been visited
+ leaves = {}, -- all leaves from left to right
+ }
+ end
+
+ local vertex_is_leaf = true
+ values.visited[vertex] = true
+ local children = {} -- a table containing all children of the current vertex (for the later determination of inner vertices x-positions)
+
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not values.visited[arc.head] and arc.head ~= vertex2 then
+ -- if arc.head hasn't been visited, the current vertex cannot be a leaf
+ vertex_is_leaf = false
+
+ -- go deeper
+ self:setXPos(arc.head, values, vertex2)
+
+ -- get the children of the current vertex
+ table.insert(children, arc.head)
+ end
+ end
+
+ -- set the x-position of a leaf
+ if vertex_is_leaf then
+
+ table.insert(values.leaves, vertex)
+
+ if #values.leaves > 1 then
+ local left_sibling = values.leaves[#values.leaves-1]
+ local ideal_distance = layered.ideal_sibling_distance(self.main_algorithm.adjusted_bb, self.tree, vertex, left_sibling )
+ vertex.pos.x = left_sibling.pos.x + ideal_distance
+ end
+
+ -- set x position of an inner node, which is at the center of its
+ -- children
+ else
+ -- determine the outer children
+ local left_child = children[1]
+ local right_child = left_child
+ for _, child in ipairs(children) do
+ if child.pos.x < left_child.pos.x then left_child = child end
+ if child.pos.x > right_child.pos.x then right_child = child end
+ end
+
+ -- position between child with highest and child with lowest x-value,
+ -- if number of children is even
+ local index_of_middle_child = math.ceil(#children/2)
+ local even = #children/2 == index_of_middle_child
+
+ if even then
+ vertex.pos.x = (left_child.pos.x + right_child.pos.x) / 2
+ else -- if number of children is odd, position above the middle child
+ vertex.pos.x = children[index_of_middle_child].pos.x
+ end
+ end
+ return values
+end
+
+
+--
+-- Sets only the y-positions of all nodes using a depth-first search.
+-- This is needed for a straight-edge layout, as the x-positions have
+-- to bet first so that the y-coordinates can be calculated correctly
+-- here.
+--
+-- @param vertex1 The starting point of the depth-first search
+-- @param values Values needed for the recursion
+-- @param vertex2 For unrooted layout only: The root of the second subtree.
+-- This node and all its children will not be visited.
+function Maeusle2012:setYPosForStraightLayout(vertex, values, vertex2)
+ local arcs = self.tree.arcs
+ local vertices = self.tree.vertices
+ local adjusted_bb = self.main_algorithm.adjusted_bb
+
+ values = values or {
+ length = 0, -- current path length
+ visited = {}, -- all nodes that have already been visited
+ leaves = {}, -- all leaves from left to right
+ }
+
+ local vertex_is_leaf = true
+ values.visited[vertex] = true
+ local children = {} -- a table containing all children of the current vertex (for the later determination of inner vertices x-positions)
+
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not values.visited[arc.head] and arc.head ~= vertex2 then
+ -- if arc.head hasn't been visited, the current vertex cannot be a leaf
+ vertex_is_leaf = false
+
+ -- calculate the arc length with the help of the Pythagorean
+ -- theorem
+ local a
+ local l = self:edgeLength(vertex, arc.head) * self.tree.options['evolutionary unit length']
+ local b = math.abs(vertex.pos.x - arc.head.pos.x)
+ if b > l then
+ a = 0
+ else
+ a = math.sqrt(l^2-b^2)
+ end
+ local arc_length = a
+
+
+ values.length = values.length + arc_length
+
+ -- go deeper
+ self:setYPosForStraightLayout(arc.head, values, vertex2)
+
+ -- get the children of the current vertex
+ table.insert(children, arc.head)
+
+ values.length = values.length - arc_length
+ end
+ end
+
+ if vertex_is_leaf then
+ -- subtract layer_pre, thus the leaf itself is NOT part of the
+ -- edge length
+ vertex.pos.y = - adjusted_bb[vertex].layer_pre
+
+ table.insert(values.leaves, vertex)
+ end
+
+ -- set the node's y-coordinate, using the calculated length
+ vertex.pos.y = vertex.pos.y + values.length
+
+ -- if this is the second subtree to be set of an unrooted tree, have
+ -- it grow in the other direction
+ if values.second_subtree then vertex.pos.y = -vertex.pos.y end
+end
+
+--
+-- Correct the x-positions in the unrooted layout for a more aesthetic result
+--
+-- If the roots of the two subtrees have different x-positions, this is corrected
+-- by shifting the x-positions of all nodes in one subtree by that difference.
+--
+-- @param vertex1 The root of the first subtree
+-- @param vertex2 The root of the second subtree.
+function Maeusle2012:correctXPos(vertex1, vertex2, straight)
+
+ -- correct the x-positions
+ --
+ -- @param vertex Starting point of the depth-first search
+ -- @param values Values needed for the recursion
+ -- @param vertex2 The root of the subtree that will not be visited
+ local function x_correction(vertex, values, vertex2)
+ values.visited[vertex] = true
+ local children = {}
+
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not values.visited[arc.head] and arc.head ~= vertex2 then
+
+ table.insert(children, arc.head)
+ x_correction(arc.head, values, vertex2)
+ end
+ end
+
+ vertex.pos.x = vertex.pos.x + values.diff
+ if not straight then
+ for i,child in ipairs(children) do
+ self:bendEdge90Degree(child, vertex)
+ end
+ end
+
+ return values
+ end
+
+ -- compute the difference of the x-positions of the two subtrees'
+ -- roots
+ local diff = vertex1.pos.x - vertex2.pos.x
+ local values = { visited = {} }
+ if diff < 0 then
+ values.diff = - diff
+ x_correction(vertex1, values, vertex2)
+ elseif diff > 0 then
+ values.diff = diff
+ x_correction(vertex2, values, vertex1)
+ end
+end
+
+
+--
+-- Sets the x- and y-positions of the vertices in an unrooted layout
+--
+-- This is done using the function for setting the positions for a rooted layout:
+-- Two neighboring vertices are chosen as roots; one half of the tree
+-- is drawn in one direction, the other half 180° to the other
+-- direction.
+--
+-- @param vertex1, vertex2: The vertices functioning as roots
+function Maeusle2012:setPosForUnrootedRectangular(vertex1, vertex2)
+ -- set positions for first half of the tree...
+ self:setPosForRectangularLayout(vertex2,false,vertex1)
+ local vals={
+ length = self:edgeLength(vertex1, vertex2), -- the length between the two roots
+ visited={},
+ leaves={},
+ path={},
+ second_subtree = true
+ }
+ -- ... and for the second half.
+ self:setPosForRectangularLayout(vertex1,vals,vertex2)
+ -- if the two roots have different x-values, correct the x-positions for nicer layout
+ self:correctXPos(vertex1, vertex2, false)
+end
+
+
+--
+-- Sets the x- and y-positions of the vertices in an unrooted straight layout
+--
+-- This is done using the function for setting the positions for a rooted straight layout:
+-- Two neighboring vertices are chosen as roots; one half of the tree
+-- is drawn in one direction, the other half 180° to the other
+-- direction.
+--
+-- @param vertex1, vertex2: The vertices functioning as roots
+function Maeusle2012:setPosForUnrootedStraight(vertex1, vertex2)
+ -- first set the x-positions of the two subtrees...
+ local vals = {visited = {}, leaves = {} }
+ self:setXPos(vertex2, vals, vertex1)
+ self:setXPos(vertex1, vals, vertex2)
+
+ -- ... and then the y-positions
+ self:setYPosForStraightLayout(vertex2, false, vertex1)
+ local vals={
+ length = self:edgeLength(vertex1, vertex2) * self.tree.options['evolutionary unit length'],
+ visited={},
+ leaves={},
+ path={},
+ second_subtree = true
+ }
+ self:setYPosForStraightLayout(vertex1, vals, vertex2)
+
+ -- if the two roots have different x-values, correct the x-positions for nicer layout
+ -- as the length between the roots of the two subtrees is set to the calculated value,
+ -- this step is mandatory for the unrooted, straight layout
+ self:correctXPos(vertex1, vertex2, true)
+end
+
+
+
+-- Bends the arc between two nodes by 90 degree by updating the arc's
+-- path
+--
+-- @param head The head of the arc
+-- @param tail The tail of the arc
+function Maeusle2012:bendEdge90Degree(head, tail)
+ local arc = self.tree:arc(tail,head)
+ local syntactic_tail = arc:syntacticTailAndHead()
+ arc:setPolylinePath { Coordinate.new(head.pos.x, tail.pos.y) }
+end
+
+
+
+-- Finds the longest path in a graph
+--
+-- @ return A table containing the path (an array of nodes) and the
+-- path length
+function Maeusle2012:findLongestPath()
+ local starting_point = self.tree.vertices[1] -- begin at any vertex
+ -- get the path lengths from the starting point to all leaves:
+ local paths_to_leaves = self:getPathLengthsToLeaves(starting_point)
+ local path_lengths = paths_to_leaves.path_lengths
+ local paths = paths_to_leaves.paths
+
+ -- looks for the longest path and identifies its end-point
+ local function find_head_of_longest_path(path_lengths, paths)
+ local longest_path
+ local node
+ -- to make sure that the same path is chosen every time, we go over all vertices with "ipairs"; if we would go over path_lengths directly, we could only use "pairs"
+ for _, vertex in ipairs(self.tree.vertices) do
+ local path_length = path_lengths[vertex]
+ if path_length then
+ -- choose longest path. if two paths have the same length, take the path with more nodes
+ if not longest_path or path_length > longest_path or (path_length == longest_path and #paths[vertex]>#paths[node]) then
+ longest_path = path_length
+ node = vertex
+ end
+ end
+ end
+ return node
+ end
+
+ -- find the longest path leading away from the starting point and identify
+ -- the leaf it leads to. Use that leaf as the tail for the next path
+ -- search
+ local tail = find_head_of_longest_path(path_lengths, paths)
+ paths_to_leaves = self:getPathLengthsToLeaves(tail) -- gets new path information
+ -- paths_to leaves now has all paths starting at vertex "tail"; one of these paths is the
+ -- longest (globally)
+ path_lengths = paths_to_leaves.path_lengths
+ paths = paths_to_leaves.paths
+ local head = find_head_of_longest_path(path_lengths, paths)
+
+ local path_information =
+ { path = paths_to_leaves.paths[head], -- longest path
+ length = path_lengths[head] } -- length of that path
+
+ return path_information
+end
+
+
+-- a depth first search for getting all path lengths from a
+-- starting point to all leaves
+--
+-- @param vertex The vertex where the search is to start
+-- @param values Table of values needed for the recursive computation
+--
+-- @return A table containing:
+-- a table of the leaves with corresponding path lengths
+-- and a table containing the path to each leaf (an array of
+-- nodes)
+function Maeusle2012:getPathLengthsToLeaves(vertex, values)
+ local arcs = self.tree.arcs
+ local vertices = self.tree.vertices
+ if not values then
+ values = {
+ paths = {}, -- all paths we've found so far
+ path_lengths = {}, -- all path lengths that have so far been computed
+ length = 0, -- current path length
+ visited = {}, -- all nodes that have already been visited
+ path = {}, -- the current path we're on
+ leaves = {} -- all leaves from left to right
+ }
+ table.insert(values.path,vertex)
+ end
+
+ local vertex_is_leaf = true
+ values.visited[vertex] = true
+
+ for _, arc in ipairs (self.tree:outgoing(vertex)) do
+ if not values.visited[arc.head] then
+ -- the current vertex is not a leaf! note: if the starting vertex is a leaf, vertex_is_leaf
+ -- will be set to 'false' for it anyway. as we're not interested in the distance
+ -- of the starting vertex to itself, this is fine.
+ vertex_is_leaf = false
+ local arc_length = self.lengths[vertex][arc.head]
+ values.length = values.length + arc_length
+
+ -- add arc.head to path...
+ table.insert(values.path,arc.head)
+
+ -- ... and go down that path
+ self:getPathLengthsToLeaves(arc.head, values)
+
+ -- remove arc.head again to go a different path
+ table.remove(values.path)
+ values.length = values.length - arc_length
+ end
+ end
+
+ if vertex_is_leaf then -- we store the information gained on the path to this leaf
+ values.path_lengths[vertex] = values.length
+ values.paths[vertex] = {}
+ table.insert(values.leaves, vertex)
+ for i,k in pairs(values.path) do
+ values.paths[vertex][i] = k
+ end
+ end
+ -- the path_lengths and the paths are stored in one table and
+ -- returned together
+ local path_information =
+ { path_lengths = values.path_lengths,
+ paths = values.paths,
+ leaves = values.leaves }
+ return path_information
+end
+
+
+-- Gets the root of a tree
+-- checks whether a tree is already rooted, if not, computeCenterOfPath() is
+-- called, which defines a node in the center of the graph as the root
+--
+-- @return The root
+function Maeusle2012:getRoot()
+ -- check whether a root exists (vertex with degree 2)
+ local root = lib.find (self.tree.vertices, function(v) return #self.tree:outgoing(v) == 2 end)
+ if root then
+ return root, self.tree:outgoing(root)[1].head
+ else
+ return self:computeCenterOfPath()
+ end
+end
+
+
+--
+-- @return The newly computed root and its nearest neighbor
+function Maeusle2012:computeCenterOfPath()
+ local longest_path = self:findLongestPath()
+ local path = longest_path.path
+ local root, neighbor_of_root
+
+ local length = 0 --length between first vertex on the path and the current vertex we're looking at
+ for i = 1, #path-1 do
+ local node1 = path[i]
+ local node2 = path[i+1]
+ local node3 = path[i+2]
+
+ local dist_node_1_2, dist_node_2_3 --distances between node1 and node2, and node2 and node3
+ dist_node_1_2 = self:edgeLength(node1, node2)
+ if node3 then dist_node_2_3 = self:edgeLength(node2, node3) end
+ length = length + dist_node_1_2 -- length between first vertex on the path and current node2
+
+ if length == longest_path.length/2 then
+ root = node2 -- if there is a node exactly at the half of the path, use this node as root
+
+ -- and find nearest neighbor of the root
+ if node3 == nil or dist_node_1_2 < dist_node_2_3 then -- neu 3.8
+ neighbor_of_root = node1
+ else
+ neighbor_of_root = node3
+ end
+ break
+
+ elseif length > longest_path.length/2 then
+ -- else find node closest to the center of the path and use it as the root;
+ local node2_length = math.abs(longest_path.length/2 - length)
+ local node1_length = math.abs(longest_path.length/2 - (length - dist_node_1_2))
+ if node2_length < node1_length then
+ root = node2
+ neighbor_of_root = node1
+ -- if node3 is closer to node2 than node1 is, use node3 as neighbor!
+ if node3 and dist_node_2_3 < dist_node_1_2 then neighbor_of_root = node3 end
+ else
+ root = node1
+ neighbor_of_root = node2
+ --check if node i-1 is closer to node1
+ local dist_node_0_1
+ if i>1 then
+ node0 = path[i-1]
+ dist_node_0_1 = self:edgeLength(node0, node1)
+ if dist_node_0_1 < dist_node_1_2 then neighbor_of_root = node0 end
+ end
+ end
+ break
+ end
+ end
+
+ return root, neighbor_of_root
+end
+
+
+return Maeusle2012
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/PhylogeneticTree.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/PhylogeneticTree.lua
new file mode 100644
index 0000000000..242ccf183f
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/PhylogeneticTree.lua
@@ -0,0 +1,91 @@
+-- Copyright 2013 by Sarah Mäusle and Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local PhylogeneticTree = {}
+
+
+-- Namespace
+require("pgf.gd.phylogenetics").PhylogeneticTree = PhylogeneticTree
+
+-- Imports
+local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms"
+local Storage = require "pgf.gd.lib.Storage"
+local Direct = require "pgf.gd.lib.Direct"
+
+-- Shorthand:
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+declare {
+ key = "phylogenetic tree layout",
+ algorithm = PhylogeneticTree,
+
+ postconditions = {
+ upward_oriented = true
+ },
+
+ summary = [["
+ Layout for drawing phylogenetic trees.
+ "]],
+ documentation = [["
+ ...
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout, upgma,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]
+}
+
+
+-- Computes a phylogenetic tree and/or visualizes it
+-- - computes a phylogenetic tree according to what the "phylogenetic
+-- algorithm" key is set to
+-- - invokes a graph drawing algorithm according to what the
+-- "phylogenetic layout" key is set to
+function PhylogeneticTree:run()
+
+ local options = self.digraph.options
+
+ -- Two storages for some information computed by the phylogenetic
+ -- tree generation algorithm
+ local lengths = Storage.newTableStorage()
+
+ -- First, compute the phylogenetic tree
+ local tree = options.algorithm_phases['phylogenetic tree generation'].new {
+ main_algorithm = self,
+ lengths = lengths
+ }:run()
+
+ tree = Direct.ugraphFromDigraph(tree)
+
+ -- Second, layout the tree
+ local layout_class = options.algorithm_phases['phylogenetic tree layout']
+ layout_class.new {
+ main_algorithm = self,
+ distances = distances,
+ lengths = lengths,
+ tree = tree
+ }:run()
+
+ tree:sync()
+end
+
+return PhylogeneticTree
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/SokalMichener1958.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/SokalMichener1958.lua
new file mode 100644
index 0000000000..6a665b6732
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/SokalMichener1958.lua
@@ -0,0 +1,261 @@
+-- Copyright 2013 by Sarah Mäusle and Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+
+local SokalMichener1958 = {}
+
+
+-- Namespace
+require("pgf.gd.phylogenetics").SokalMichener1958 = SokalMichener1958
+
+-- Imports
+local InterfaceToAlgorithms = require("pgf.gd.interface.InterfaceToAlgorithms")
+local DistanceMatrix = require("pgf.gd.phylogenetics.DistanceMatrix")
+local lib = require("pgf.gd.lib")
+local Storage = require("pgf.gd.lib.Storage")
+local Digraph = require("pgf.gd.model.Digraph")
+
+-- Shorthand:
+local declare = InterfaceToAlgorithms.declare
+
+
+---
+declare {
+ key = "unweighted pair group method using arithmetic averages",
+ algorithm = SokalMichener1958,
+ phase = "phylogenetic tree generation",
+
+ summary = [["
+ The UPGMA (Unweighted Pair Group Method using arithmetic
+ Averages) algorithm of Sokal and Michener, 1958. It generates a
+ graph on the basis of such a distance matrix by generating nodes
+ and computing the edge lengths.
+ "]],
+ documentation = [["
+ This algorithm uses a distance matrix, ideally an ultrametric
+ one, to compute the graph.
+ "]],
+ examples = [["
+ \tikz \graph [phylogenetic tree layout, sibling distance=0pt, sibling sep=2pt,
+ unweighted pair group method using arithmetic averages,
+ distance matrix={
+ 0 4 9 9 9 9 9
+ 4 0 9 9 9 9 9
+ 9 9 0 2 7 7 7
+ 9 9 2 0 7 7 7
+ 9 9 7 7 0 3 5
+ 9 9 7 7 3 0 5
+ 9 9 7 7 5 5 0}]
+ { a, b, c, d, e, f, g };
+ "]]
+}
+
+
+---
+declare {
+ key = "upgma",
+ use = { { key = "unweighted pair group method using arithmetic averages" } },
+ summary = "An shorthand for |unweighted pair group method using arithmetic averages|"
+}
+
+
+
+
+--
+-- The run function of the upgma algorithm.
+--
+-- You must setup the following fields: The |main_algorithm| must
+-- store the main algorithm object (for phase |main|). The |distances|
+-- field must be a |Storage| object that will get filled with the
+-- distances computed by this algorithm. The |lengths| field must also
+-- be a |Storage| for the computed distances.
+--
+
+function SokalMichener1958:run()
+ self.distances = Storage.newTableStorage()
+
+ self.tree = Digraph.new(self.main_algorithm.digraph)
+
+ -- store the phylogenetic tree object, containing all user-specified
+ -- graph information
+ self:runUPGMA()
+ self:createFinalEdges()
+
+ return self.tree
+end
+
+
+
+-- UPGMA (Unweighted Pair Group Method using arithmetic Averages) algorithm
+-- (Sokal and Michener, 1958)
+--
+-- this function generates a graph on the basis of such a distance
+-- matrix by generating nodes and computing the edge lengths; the x-
+-- and y-positions of the nodes must be set separately
+--
+-- requirement: a distance matrix, ideally an ultrametric
+function SokalMichener1958:runUPGMA()
+ local matrix = DistanceMatrix.graphDistanceMatrix(self.tree)
+
+ local g = self.tree
+ local clusters = {}
+
+ -- create the clusters
+ for _,v in ipairs(g.vertices) do
+ clusters[#clusters+1] = self:newCluster(v)
+ end
+
+ -- Initialize the distances of these clusters:
+ for _,cx in ipairs(clusters) do
+ for _,cy in ipairs(clusters) do
+ cx.distances[cy] = matrix[cx.root][cy.root]
+ end
+ end
+
+ -- search for clusters with smallest distance and merge them
+ while #clusters > 1 do
+ local minimum_distance = math.huge
+ local min_cluster1
+ local min_cluster2
+ for i, cluster in ipairs (clusters) do
+ for j = i+1,#clusters do
+ local cluster2 = clusters[j]
+ local cluster_distance = self:getClusterDistance(cluster, cluster2)
+ if cluster_distance < minimum_distance then
+ minimum_distance, min_cluster1, min_cluster2 = cluster_distance, i, j
+ end
+ end
+ end
+ self:mergeClusters(clusters, min_cluster1, min_cluster2, minimum_distance)
+ end
+end
+
+
+-- a new cluster is created
+--
+-- @param vertex The vertex the cluster is initialized with
+--
+-- @return The new cluster
+function SokalMichener1958:newCluster(vertex)
+ return {
+ root = vertex, -- the root of the cluster
+ size = 1, -- the number of vertices in the cluster,
+ distances = {}, -- cached cluster distances to all other clusters
+ cluster_height = 0 -- this value is equivalent to half the distance of the last two clusters
+ -- that have been merged to form the current cluster;
+ -- necessary for determining the distances of newly generated nodes to their children.
+ }
+end
+
+
+-- gets the distance between two clusters
+--
+-- @param cluster1, cluster2 The two clusters
+--
+-- @return the distance between the clusters
+function SokalMichener1958:getClusterDistance(c,d)
+ return c.distances[d] or d.distances[c] or 0
+end
+
+
+-- merges two clusters by doing the following:
+-- - deletes cluster2 from the clusters table
+-- - adds all vertices from cluster2 to the vertices table of cluster1
+-- - updates the distances of the new cluster to all remaining clusters
+-- - generates a new node, as the new root of the cluster
+-- - computes the distance of the new node to the former roots (for
+-- later computation of the y-positions)
+-- - generates edges, connecting the new node to the former roots
+-- - updates the cluster height
+--
+-- @param clusters The array of clusters
+-- @param index_of_first_cluster The index of the first cluster
+-- @param index_of_second_cluster The index of the second cluster
+-- @param distance The distance between the two clusters
+
+function SokalMichener1958:mergeClusters(clusters, index_of_first_cluster, index_of_second_cluster, distance)
+
+ local g = self.tree
+ local cluster1 = clusters[index_of_first_cluster]
+ local cluster2 = clusters[index_of_second_cluster]
+
+ --update cluster distances
+ for i,cluster in ipairs (clusters) do
+ if cluster ~= cluster1 and cluster ~= cluster2 then
+ local dist1 = self:getClusterDistance (cluster1, cluster)
+ local dist2 = self:getClusterDistance (cluster2, cluster)
+ local dist = (dist1*cluster1.size + dist2*cluster2.size)/ (cluster1.size+cluster2.size)
+ cluster1.distances[cluster] = dist
+ cluster.distances[cluster1] = dist
+ end
+ end
+
+ -- delete cluster2
+ table.remove(clusters, index_of_second_cluster)
+
+ --add node and connect last vertex of each cluster with new node
+ local new_node = InterfaceToAlgorithms.createVertex(
+ self.main_algorithm,
+ {
+ name = "UPGMA-node ".. #self.tree.vertices+1,
+ generated_options = { { key = "phylogenetic inner node" } },
+ }
+ )
+ g:add{new_node}
+ -- the distance of the new node ( = the new root of the cluster) to its children (= the former roots) is
+ -- equivalent to half the distance between the two former clusters
+ -- minus the respective cluster height
+ local distance1 = distance/2-cluster1.cluster_height
+ self.distances[new_node][cluster1.root] = distance1
+ local distance2 = distance/2-cluster2.cluster_height
+ self.distances[new_node][cluster2.root] = distance2
+
+ -- these distances are also the final edge lengths, thus:
+ self.lengths[new_node][cluster1.root] = distance1
+ self.lengths[cluster1.root][new_node] = distance1
+
+ self.lengths[new_node][cluster2.root] = distance2
+ self.lengths[cluster2.root][new_node] = distance2
+
+ g:connect(new_node, cluster1.root)
+ g:connect(new_node, cluster2.root)
+
+ cluster1.root = new_node
+ cluster1.size = cluster1.size + cluster2.size
+ cluster1.cluster_height = distance/2 -- set new height of the cluster
+end
+
+
+
+-- generates edges for the final graph
+--
+-- throughout the process of creating the tree, arcs have been
+-- disconnected and connected, without truly creating edges. this is
+-- done in this function
+function SokalMichener1958:createFinalEdges()
+ local g = self.tree
+ local o_arcs = {} -- copy arcs since createEdge is going to modify the arcs array...
+ for _,arc in ipairs(g.arcs) do
+ o_arcs[#o_arcs+1] = arc
+ end
+ for _,arc in ipairs(o_arcs) do
+ InterfaceToAlgorithms.createEdge(
+ self.main_algorithm, arc.tail, arc.head,
+ { generated_options = {
+ { key = "phylogenetic edge", value = tostring(self.lengths[arc.tail][arc.head]) }
+ }})
+ end
+end
+
+
+return SokalMichener1958
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/library.lua
new file mode 100644
index 0000000000..5ab821c4a8
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/phylogenetics/library.lua
@@ -0,0 +1,35 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- A phylogenetic tree (or network) depicts the evolutionary history
+-- of species or, more generally, so called taxa. The present library
+-- includes a number of algorithms for drawing phylogenetic trees.
+--
+-- @library
+
+local phylogenetics -- Library name
+
+-- Main layout:
+require "pgf.gd.phylogenetics.PhylogeneticTree"
+
+-- Phylogenetic tree drawing:
+require "pgf.gd.phylogenetics.Maeusle2012"
+
+-- Phylogenetic tree generation:
+require "pgf.gd.phylogenetics.SokalMichener1958"
+require "pgf.gd.phylogenetics.BalancedMinimumEvolution"
+require "pgf.gd.phylogenetics.BalancedNearestNeighbourInterchange"
+require "pgf.gd.phylogenetics.AuthorDefinedPhylogeny"
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar.lua
new file mode 100644
index 0000000000..5d80de77cd
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar.lua
@@ -0,0 +1,6 @@
+require "pgf"
+require "pgf.gd"
+
+pgf.gd.planar = {}
+
+return pgf.gd.planar
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/BoyerMyrvold2004.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/BoyerMyrvold2004.lua
new file mode 100644
index 0000000000..f587861d79
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/BoyerMyrvold2004.lua
@@ -0,0 +1,678 @@
+
+--[[
+---Data structures---
+
+Vertices from the original ugraph are referred to as input vertices.
+The tables that contain vertex data relevant to the algorithm
+are referred to as vertices.
+A vertex table may have the following keys:
+
+-sign
+1 or -1, indicates whether this and all in the depth-first search
+following vertices must be considered flipped
+(i. e. adjacency lists reversed) in respect to the dfs parent
+
+-childlist
+A linked list containing all dfs children of the vertex whose virtual roots
+have not yet been merged into the vertex, sorted by lowpoint
+
+-adjlistlinks
+A table with two fields with keys 0 and 1, containing the two half edges
+of the vertex which lie on the external face of the graph
+(if the vertex lies on the external face).
+The half edge with key 0 lies in the 0-direction of the other half edge
+and vice-versa
+The two fields may hold the same half edge, if the vertex has degree one
+
+-pertinentroots
+A linked list containing all virtual roots of this vertex that are
+pertinent during the current step
+
+-inputvertex
+The input vertex that corresponds to the vertex
+
+-dfi
+The depth-first search index (number of the step in the dfs at which
+the vertex was discovered)
+
+-dfsparent
+The depth-first search parent (vertex from which the vertex was discovered
+first in the dfs)
+
+-leastancestor
+Dfi of the vertex with lowest dfi that can be reached using one back edge
+(non-tree edge)
+
+-lowpoint
+Dfi of the vertex with lowest dfi that can be reached using any number of
+tree edges plus one back edge
+
+
+A root vertex is a virtual vertex not contained in the original ugraph.
+The root vertex represents another vertex in a biconnected component (block)
+which is a child of the biconnected component the represented vertex is in.
+The only field that it has in common with other vertices is the
+adjacency list links array:
+
+-isroot
+always true, indicates that this vertex is a virtual root
+
+-rootparent
+The vertex which this root represents
+
+-rootchild
+The only dfs child of the original vertex which is contained in the
+root verticis biconnected component
+
+-adjlistlinks
+See adjlistlinks of a normal vertex
+
+
+A half edge is a table with the following fields:
+
+-links
+A table with two fields with keys 0 and 1, containing the neighboring
+half edges in the adjacency list of the vertex these edges originate from.
+
+-target
+The vertex the half edge leads to
+
+-twin
+The twin half edge which connects the two vertices in the opposite direction
+
+-shortcircuit
+True if the half edge was inserted in order to make a short circuit for the
+algorithm. The edge will be removed at the end.
+
+The BoyerMyrvold2004 class has the following fields:
+
+-inputgraph
+The original ugraph given to the algorithm
+
+-numvertices
+The number of vertices of the graph
+
+-vertices
+The vertex table with depth-first search indices as keys
+
+-verticesbyinputvertex
+The vertex table with input vertices as keys
+
+-verticesbylowpoint
+The vertex table with low points as keys
+
+-shortcircuitedges
+An array of all short circuit half edges
+(which may not be in the original graph and will be removed at the end)
+
+--]]
+
+local BM = {}
+require("pgf.gd.planar").BoyerMyrvold2004 = BM
+
+-- imports
+local Storage = require "pgf.gd.lib.Storage"
+local LinkedList = require "pgf.gd.planar.LinkedList"
+local Embedding = require "pgf.gd.planar.Embedding"
+
+-- create class properties
+BM.__index = BM
+
+function BM.new()
+ local t = {}
+ setmetatable(t, BM)
+ return t
+end
+
+-- initializes some data structures at the beginning
+-- takes the ugraph of the layout algorithm as input
+function BM:init(g)
+ self.inputgraph = g
+ self.numvertices = #g.vertices
+ self.vertices = {}
+ self.verticesbyinputvertex = Storage.new()
+ self.verticesbylowpoint = Storage.newTableStorage()
+ self.shortcircuitedges = {}
+ for _, inputvertex in ipairs(self.inputgraph.vertices) do
+ local vertex = {
+ sign = 1,
+ childlist = LinkedList.new(),
+ adjlistlinks = {},
+ pertinentroots = LinkedList.new(),
+ inputvertex = inputvertex,
+ }
+ setmetatable(vertex, Embedding.vertexmetatable)
+ self.verticesbyinputvertex[inputvertex] = vertex
+ end
+end
+
+--[[
+local function nilmax(a, b)
+ if a == nil then return b end
+ if b == nil then return a end
+ return math.max(a, b)
+end
+
+local function nilmin(a, b)
+ if a == nil then return b end
+ if b == nil then return a end
+ return math.min(a, b)
+end
+--]]
+
+-- the depth-first search of the preprocessing
+function BM:predfs(inputvertex, parent)
+ local dfi = #self.vertices + 1
+ local vertex = self.verticesbyinputvertex[inputvertex]
+ self.vertices[dfi] = vertex
+ -- set the dfs infos in the vertex
+ vertex.dfi = dfi
+ vertex.dfsparent = parent
+ vertex.leastancestor = dfi
+ vertex.lowpoint = dfi
+ -- find neighbors
+ for _, arc in ipairs(self.inputgraph:outgoing(inputvertex)) do
+ local ninputvertex = arc.head
+ assert(ninputvertex ~= inputvertex, "Self-loop detected!")
+ local nvertex = self.verticesbyinputvertex[ninputvertex]
+ if nvertex.dfi == nil then
+ -- new vertex discovered
+ self:predfs(ninputvertex, vertex) -- recursive call
+ vertex.lowpoint = math.min(vertex.lowpoint, nvertex.lowpoint)
+ elseif parent and ninputvertex ~= parent.inputvertex then
+ -- back edge found
+ vertex.leastancestor = math.min(vertex.leastancestor, nvertex.dfi)
+ vertex.lowpoint = math.min(vertex.lowpoint, nvertex.dfi)
+ end
+ end
+ -- put vertex into lowpoint sort bucket
+ table.insert(self.verticesbylowpoint[vertex.lowpoint], vertex)
+end
+
+-- the preprocessing at the beginning of the algorithm
+-- does the depth-first search and the bucket sort for the child lists
+function BM:preprocess()
+ -- make dfs starting at an arbitrary vertex
+ self:predfs(self.inputgraph.vertices[1])
+ -- create separated child lists with bucket sort
+ for i = 1, self.numvertices do
+ for _, vertex in ipairs(self.verticesbylowpoint[i]) do
+ if vertex.dfsparent then
+ vertex.childlistelement
+ = vertex.dfsparent.childlist:addback(vertex)
+ end
+ end
+ end
+end
+
+-- adds tree edges and the corresponding virtual root vertices
+-- of the currentvertex
+function BM:add_trivial_edges(vertex)
+ -- find all dfs children
+ for _, arc in ipairs(self.inputgraph:outgoing(vertex.inputvertex)) do
+ local nvertex = self.verticesbyinputvertex[arc.head]
+ if nvertex.dfsparent == vertex then
+ -- create root vertex
+ local rootvertex = {
+ isroot = true,
+ rootparent = vertex,
+ rootchild = nvertex,
+ adjlistlinks = {},
+ name = tostring(vertex) .. "^" .. tostring(nvertex)
+ }
+ setmetatable(rootvertex, Embedding.vertexmetatable)
+ nvertex.parentroot = rootvertex
+ -- create half edges
+ local halfedge1 = {target = nvertex, links = {}}
+ local halfedge2 = {target = rootvertex, links = {}}
+ halfedge1.twin = halfedge2
+ halfedge2.twin = halfedge1
+ -- create circular adjacency lists
+ halfedge1.links[0] = halfedge1
+ halfedge1.links[1] = halfedge1
+ halfedge2.links[0] = halfedge2
+ halfedge2.links[1] = halfedge2
+ -- create links to adjacency lists
+ rootvertex.adjlistlinks[0] = halfedge1
+ rootvertex.adjlistlinks[1] = halfedge1
+ nvertex.adjlistlinks[0] = halfedge2
+ nvertex.adjlistlinks[1] = halfedge2
+ end
+ end
+end
+
+-- for the external face vertex which was entered through link vin
+-- returns the successor on the external face and the link through
+-- which it was entered
+local function get_successor_on_external_face(vertex, vin)
+ local halfedge = vertex.adjlistlinks[1 - vin]
+ local svertex = halfedge.target
+ local sin
+ if vertex.adjlistlinks[0] == vertex.adjlistlinks[1] then
+ sin = vin
+ elseif svertex.adjlistlinks[0].twin == halfedge then
+ sin = 0
+ else
+ sin = 1
+ end
+ return svertex, sin
+end
+
+-- the "walkup", used to identify the pertinent subgraph,
+-- i. e. the subgraph that contains end points of backedges
+-- for one backedge this function will mark all virtual roots
+-- as pertinent that lie on the path between the backedge and the current vertex
+-- backvertex: a vertex that is an endpoint of a backedge to the current vertex
+-- currentvertex: the vertex of the current step
+-- returns a root vertex of the current step, if one was found
+local function walkup(backvertex, currentvertex)
+ local currentindex = currentvertex.dfi
+ -- set the backedgeflag
+ backvertex.backedgeindex = currentindex
+ -- initialize traversal variables for both directions
+ local x, xin, y, yin = backvertex, 1, backvertex, 0
+ while x ~= currentvertex do
+ if x.visited == currentindex or y.visited == currentindex then
+ -- we found a path that already has the pertinent roots marked
+ return nil
+ end
+ -- mark vertices as visited for later calls
+ x.visited = currentindex
+ y.visited = currentindex
+
+ -- check for rootvertex
+ local rootvertex
+ if x.isroot then
+ rootvertex = x
+ elseif y.isroot then
+ rootvertex = y
+ end
+ if rootvertex then
+ local rootchild = rootvertex.rootchild
+ local rootparent = rootvertex.rootparent
+ if rootvertex.rootparent == currentvertex then
+ -- we found the other end of the back edge
+ return rootvertex
+ elseif rootchild.lowpoint < currentindex then
+ -- the block we just traversed is externally active
+ rootvertex.pertinentrootselement
+ = rootparent.pertinentroots:addback(rootvertex)
+ else
+ -- the block we just traversed is internally active
+ rootvertex.pertinentrootselement
+ = rootparent.pertinentroots:addfront(rootvertex)
+ end
+ -- jump to parent block
+ x, xin, y, yin = rootvertex.rootparent, 1, rootvertex.rootparent, 0
+ else
+ -- just continue on the external face
+ x, xin = get_successor_on_external_face(x, xin)
+ y, yin = get_successor_on_external_face(y, yin)
+ end
+ end
+end
+
+-- inverts the adjacency of a vertex
+-- i. e. reverses the order of the adjacency list and flips the links
+local function invert_adjacency(vertex)
+ -- reverse the list
+ for halfedge in Embedding.adjacency_iterator(vertex.adjlistlinks[0]) do
+ halfedge.links[0], halfedge.links[1]
+ = halfedge.links[1], halfedge.links[0]
+ end
+ -- flip links
+ vertex.adjlistlinks[0], vertex.adjlistlinks[1]
+ = vertex.adjlistlinks[1], vertex.adjlistlinks[0]
+end
+
+-- merges two blocks by merging the virtual root of the child block
+-- into it's parent, while making sure the external face stays consistent
+-- by flipping the root block if needed
+-- mergeinfo contains four fields:
+-- root - the virtual root vertex
+-- parent - it's parent
+-- rout - the link of the root through which we have exited it
+-- during the walkdown
+-- pin - the link of the parent through which we have entered it
+-- during the walkdown
+local function mergeblocks(mergeinfo)
+ local root = mergeinfo.root
+ local parent = mergeinfo.parent
+ local rout = mergeinfo.rootout
+ local pin = mergeinfo.parentin
+ if pin == rout then
+ -- flip required
+ invert_adjacency(root)
+ root.rootchild.sign = -1
+ --rout = 1 - rout -- not needed
+ end
+
+ -- redirect edges of the root vertex
+ for halfedge in Embedding.adjacency_iterator(root.adjlistlinks[0]) do
+ halfedge.twin.target = parent
+ end
+
+ -- remove block from data structures
+ root.rootchild.parentroot = nil
+ parent.pertinentroots:remove(root.pertinentrootselement)
+ parent.childlist:remove(root.rootchild.childlistelement)
+
+ -- merge adjacency lists
+ parent.adjlistlinks[0].links[1] = root.adjlistlinks[1]
+ parent.adjlistlinks[1].links[0] = root.adjlistlinks[0]
+ root.adjlistlinks[0].links[1] = parent.adjlistlinks[1]
+ root.adjlistlinks[1].links[0] = parent.adjlistlinks[0]
+ parent.adjlistlinks[pin] = root.adjlistlinks[pin]
+end
+
+-- inserts a half edge pointing to "to" into the adjacency list of "from",
+-- replacing the link "linkindex"
+local function insert_half_edge(from, linkindex, to)
+ local halfedge = {target = to, links = {}}
+ halfedge.links[ linkindex] = from.adjlistlinks[ linkindex]
+ halfedge.links[1 - linkindex] = from.adjlistlinks[1 - linkindex]
+ from.adjlistlinks[ linkindex].links[1 - linkindex] = halfedge
+ from.adjlistlinks[1 - linkindex].links[ linkindex] = halfedge
+ from.adjlistlinks[linkindex] = halfedge
+ return halfedge
+end
+
+-- connect the vertices x and y through the links xout and yin
+-- if shortcircuit is true, the edge will be marked as a short circuit edge
+-- and removed at the end of the algorithm
+function BM:embed_edge(x, xout, y, yin, shortcircuit)
+ -- create half edges
+ local halfedgex = insert_half_edge(x, xout, y)
+ local halfedgey = insert_half_edge(y, yin, x)
+ halfedgex.twin = halfedgey
+ halfedgey.twin = halfedgex
+ -- short circuit handling
+ if shortcircuit then
+ halfedgex.shortcircuit = true
+ halfedgey.shortcircuit = true
+ table.insert(self.shortcircuitedges, halfedgex)
+ table.insert(self.shortcircuitedges, halfedgey)
+ end
+end
+
+-- returns true if the given vertex is pertinent at the current step
+local function pertinent(vertex, currentindex)
+ return vertex.backedgeindex == currentindex
+ or not vertex.pertinentroots:empty()
+end
+
+-- returns true if the given vertex is externally active at the current step
+local function externally_active(vertex, currentindex)
+ return vertex.leastancestor < currentindex
+ or (not vertex.childlist:empty()
+ and vertex.childlist:first().lowpoint < currentindex)
+end
+
+-- the "walkdown", which merges the pertinent subgraph and embeds
+-- back and short circuit edges
+-- childrootvertex - a root vertex of the current vertex
+-- which the walkdown will start at
+-- currentvertex - the vertex of the current step
+function BM:walkdown(childrootvertex, currentvertex)
+ local currentindex = currentvertex.dfi
+ local mergestack = {}
+ local numinsertededges = 0 -- to return the number for count check
+ -- two walkdowns into both directions
+ for vout = 0,1 do
+ -- initialize the traversal variables
+ local w, win = get_successor_on_external_face(childrootvertex, 1 - vout)
+ while w ~= childrootvertex do
+ if w.backedgeindex == currentindex then
+ -- we found a backedge endpoint
+ -- merge all pertinent roots we found
+ while #mergestack > 0 do
+ mergeblocks(table.remove(mergestack))
+ end
+ -- embed the back edge
+ self:embed_edge(childrootvertex, vout, w, win)
+ numinsertededges = numinsertededges + 1
+ w.backedgeindex = 0 -- this shouldn't be necessary
+ end
+ if not w.pertinentroots:empty() then
+ -- we found a pertinent vertex with child blocks
+ -- create merge info for the later merge
+ local mergeinfo = {}
+ mergeinfo.parent = w
+ mergeinfo.parentin = win
+ local rootvertex = w.pertinentroots:first()
+ mergeinfo.root = rootvertex
+ -- check both directions for active vertices
+ local x, xin = get_successor_on_external_face(rootvertex, 1)
+ local y, yin = get_successor_on_external_face(rootvertex, 0)
+ local xpertinent = pertinent(x, currentindex)
+ local xexternallyactive = externally_active(x, currentindex)
+ local ypertinent = pertinent(y, currentindex)
+ local yexternallyactive = externally_active(y, currentindex)
+ -- chose the direction with the best vertex
+ if xpertinent and not xexternallyactive then
+ w, win = x, xin
+ mergeinfo.rootout = 0
+ elseif ypertinent and not yexternallyactive then
+ w, win = y, yin
+ mergeinfo.rootout = 1
+ elseif xpertinent then
+ w, win = x, xin
+ mergeinfo.rootout = 0
+ else
+ w, win = y, yin
+ mergeinfo.rootout = 1
+ end
+ -- this is what the paper says, but it might cause problems
+ -- not sure though...
+ --[[if w == x then
+ mergeinfo.rootout = 0
+ else
+ mergeinfo.rootout = 1
+ end--]]
+ table.insert(mergestack, mergeinfo)
+ elseif not pertinent(w, currentindex)
+ and not externally_active(w, currentindex) then
+ -- nothing to see here, just continue on the external face
+ w, win = get_successor_on_external_face(w, win)
+ else
+ -- this is a stopping vertex, walkdown will end here
+ -- paper puts this into the if,
+ -- but this should always be the case, i think
+ assert(childrootvertex.rootchild.lowpoint < currentindex)
+ if #mergestack == 0 then
+ -- we're in the block we started at, so we embed a back edge
+ self:embed_edge(childrootvertex, vout, w, win, true)
+ end
+ break
+ end
+ end
+ if #mergestack > 0 then
+ -- this means, there is a pertinent vertex blocked by stop vertices,
+ -- so the graph is not planar and we can skip the second walkdown
+ break
+ end
+ end
+ return numinsertededges
+end
+
+-- embeds the back edges for the current vertex
+-- walkup and walkdown are called from here
+-- returns true, if all back edges could be embedded
+function BM:add_back_edges(vertex)
+ local pertinentroots = {} -- not in the paper
+ local numbackedges = 0
+ -- find all back edges to vertices with lower dfi
+ for _, arc in ipairs(self.inputgraph:outgoing(vertex.inputvertex)) do
+ local nvertex = self.verticesbyinputvertex[arc.head]
+ if nvertex.dfi > vertex.dfi
+ and nvertex.dfsparent ~= vertex
+ and nvertex ~= vertex.dfsparent then
+ numbackedges = numbackedges + 1
+ -- do the walkup
+ local rootvertex = walkup(nvertex, vertex)
+ if rootvertex then
+ -- remember the root vertex the walkup found, so we don't
+ -- have to call the walkdown for all root vertices
+ -- (or even know what the root vertices are)
+ table.insert(pertinentroots, rootvertex)
+ end
+ end
+ end
+ -- for all root vertices the walkup found
+ local insertededges = 0
+ while #pertinentroots > 0 do
+ -- do the walkdown
+ insertededges = insertededges
+ + self:walkdown(table.remove(pertinentroots), vertex)
+ end
+ if insertededges ~= numbackedges then
+ -- not all back edges could be embedded -> graph is not planar
+ return false
+ end
+ return true
+end
+
+-- the depth-first search of the postprocessing
+-- flips the blocks according to the sign field
+function BM:postdfs(vertex, sign)
+ sign = sign or 1
+ local root = vertex.parentroot
+ if root then
+ sign = 1
+ else
+ sign = sign * vertex.sign
+ end
+
+ if sign == -1 then
+ -- number of flips is odd, so we need to flip here
+ invert_adjacency(vertex)
+ end
+
+ -- for all dfs children
+ for _, arc in ipairs(self.inputgraph:outgoing(vertex.inputvertex)) do
+ local nvertex = self.verticesbyinputvertex[arc.head]
+ if nvertex.dfsparent == vertex then
+ -- recursive call
+ self:postdfs(nvertex, sign)
+ end
+ end
+end
+
+-- the postprocessing at the end of the algorithm
+-- calls the post depth-first search,
+-- removes the short circuit edges from the adjacency lists,
+-- adjusts the links of the vertices,
+-- merges root vertices
+-- and cleans up the vertices
+function BM:postprocess()
+ -- flip components
+ self:postdfs(self.vertices[1])
+
+ -- unlink the short circuit edges
+ for _, halfedge in ipairs(self.shortcircuitedges) do
+ halfedge.links[0].links[1] = halfedge.links[1]
+ halfedge.links[1].links[0] = halfedge.links[0]
+ end
+
+ -- vertex loop
+ local rootvertices = {}
+ local edgetoface = {}
+ for _, vertex in ipairs(self.vertices) do
+ -- check for root vertex and save it
+ local root = vertex.parentroot
+ if root then
+ table.insert(rootvertices, root)
+ end
+
+ -- clean up links and create adjacency matrix
+ local link = vertex.adjlistlinks[0]
+ local adjmat = {}
+ vertex.adjmat = adjmat
+ if link then
+ -- make sure the link points to a half edge
+ -- that is no short circuit edge
+ while link.shortcircuit do
+ link = link.links[0]
+ end
+ -- create link
+ vertex.link = link
+
+ -- create adjacency matrix
+ for halfedge in Embedding.adjacency_iterator(link) do
+ setmetatable(halfedge, Embedding.halfedgemetatable)
+ local target = halfedge.target
+ if target.isroot then
+ target = target.rootparent
+ end
+ adjmat[target] = halfedge
+ end
+ end
+
+ -- clean up vertex
+ vertex.sign = nil
+ vertex.childlist = nil
+ vertex.adjlistlinks = nil
+ vertex.pertinentroots = nil
+ vertex.dfi = nil
+ vertex.dfsparent = nil
+ vertex.leastancestor = nil
+ vertex.lowpoint = nil
+ vertex.parentroot = nil
+ end
+
+ -- root vertex loop
+ for _, root in ipairs(rootvertices) do
+ -- make sure the links point to a half edges
+ -- that are no short circuit edge
+ local link = root.adjlistlinks[0]
+ while link.shortcircuit do
+ link = link.links[0]
+ end
+
+ -- merge into parent
+ local rootparent = root.rootparent
+ local parentlink = rootparent.link
+ local adjmat = rootparent.adjmat
+ for halfedge in Embedding.adjacency_iterator(link) do
+ setmetatable(halfedge, Embedding.halfedgemetatable)
+ halfedge.twin.target = rootparent
+ adjmat[halfedge.target] = halfedge
+ end
+ if parentlink == nil then
+ assert(rootparent.link == nil)
+ rootparent.link = link
+ else
+ -- merge adjacency lists
+ parentlink.links[0].links[1] = link
+ link.links[0].links[1] = parentlink
+ local tmp = link.links[0]
+ link.links[0] = parentlink.links[0]
+ parentlink.links[0] = tmp
+ end
+ end
+end
+
+-- the entry point of the algorithm
+-- returns the array of vertices
+-- the vertices now only contain the inputvertex field
+-- and a field named "link" which contains an arbitrary half edge
+-- from the respective adjacency list
+-- the adjacency lists are in a circular order in respect to the plane graph
+function BM:run()
+ self:preprocess()
+ -- main loop over all vertices from lowest dfi to highest
+ for i = self.numvertices, 1, -1 do
+ local vertex = self.vertices[i]
+ self:add_trivial_edges(vertex)
+ if not self:add_back_edges(vertex) then
+ -- graph not planar
+ return nil
+ end
+ end
+ self:postprocess()
+ local embedding = Embedding.new()
+ embedding.vertices = self.vertices
+ return embedding
+end
+
+return BM
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/Embedding.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/Embedding.lua
new file mode 100644
index 0000000000..8d9d3b53b1
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/Embedding.lua
@@ -0,0 +1,788 @@
+local E = {}
+
+require("pgf.gd.planar").Embedding = E
+
+-- includes
+local LinkedList = require("pgf.gd.planar.LinkedList")
+
+E.vertexmetatable = {
+ __tostring = function(v)
+ if v.name then
+ return v.name
+ elseif v.inputvertex then
+ return v.inputvertex.name
+ else
+ return tostring(v)
+ end
+ end
+}
+
+E.halfedgemetatable = {
+ __tostring = function(e)
+ return tostring(e.twin.target)
+ .. " -> "
+ .. tostring(e.target)
+ end
+}
+
+-- create class properties
+E.__index = E
+
+function E.new()
+ local t = {
+ vertices = {},
+ }
+ setmetatable(t, E)
+ return t
+end
+
+function E:add_vertex(name, inputvertex, virtual)
+ virtual = virtual or nil
+ local vertex = {
+ adjmat = {},
+ name = name,
+ inputvertex = inputvertex,
+ virtual = virtual,
+ }
+ setmetatable(vertex, E.vertexmetatable)
+ table.insert(self.vertices, vertex)
+ return vertex
+end
+
+function E:add_edge(v1, v2, after1, after2, virtual)
+ assert(v1.link == nil or v1 == after1.twin.target)
+ assert(v2.link == nil or v2 == after2.twin.target)
+ assert(v1.adjmat[v2] == nil)
+ assert(v2.adjmat[v1] == nil)
+
+ virtual = virtual or nil
+
+ local halfedge1 = {
+ target = v2,
+ virtual = virtual,
+ links = {},
+ }
+ local halfedge2 = {
+ target = v1,
+ virtual = virtual,
+ links = {},
+ }
+ halfedge1.twin = halfedge2
+ halfedge2.twin = halfedge1
+
+ setmetatable(halfedge1, E.halfedgemetatable)
+ setmetatable(halfedge2, E.halfedgemetatable)
+
+ if v1.link == nil then
+ v1.link = halfedge1
+ halfedge1.links[0] = halfedge1
+ halfedge1.links[1] = halfedge1
+ else
+ halfedge1.links[0] = after1.links[0]
+ after1.links[0].links[1] = halfedge1
+ halfedge1.links[1] = after1
+ after1.links[0] = halfedge1
+ end
+
+ if v2.link == nil then
+ v2.link = halfedge2
+ halfedge2.links[0] = halfedge2
+ halfedge2.links[1] = halfedge2
+ else
+ halfedge2.links[0] = after2.links[0]
+ after2.links[0].links[1] = halfedge2
+ halfedge2.links[1] = after2
+ after2.links[0] = halfedge2
+ end
+
+ v1.adjmat[v2] = halfedge1
+ v2.adjmat[v1] = halfedge2
+
+ return halfedge1, halfedge2
+end
+
+function E:remove_virtual()
+ local virtuals = {}
+ for i, v in ipairs(self.vertices) do
+ if v.virtual then
+ table.insert(virtuals, i)
+ else
+ local start = v.link
+ local current = start
+ repeat
+ current = current.links[0]
+ if current.virtual then
+ current.links[0].links[1] = current.links[1]
+ current.links[1].links[0] = current.links[0]
+ v.adjmat[current.target] = nil
+ current.target.adjmat[v] = nil
+ end
+ until current == start
+ end
+ end
+ for i = #virtuals, 1, -1 do
+ self.vertices[virtuals[i]] = self.vertices[#self.vertices]
+ table.remove(self.vertices)
+ end
+end
+
+-- for the use in for-loops
+-- iterates over the adjacency list of a vertex
+-- given a half edge to start and a direction (0 or 1, default 0)
+function E.adjacency_iterator(halfedge, direction)
+ direction = direction or 0
+ local function next_edge(startedge, prevedge)
+ if prevedge == nil then
+ return startedge
+ else
+ local nextedge = prevedge.links[direction]
+ if nextedge ~= startedge then
+ return nextedge
+ else
+ return nil
+ end
+ end
+ end
+ return next_edge, halfedge, nil
+end
+
+function E.face_iterator(halfedge, direction)
+ direction = direction or 0
+ local function next_edge(startedge, prevedge)
+ if prevedge == nil then
+ return startedge
+ else
+ local nextedge = prevedge.twin.links[1 - direction]
+ if nextedge ~= startedge then
+ return nextedge
+ else
+ return nil
+ end
+ end
+ end
+ return next_edge, halfedge, nil
+end
+
+function E:triangulate()
+ local visited = {}
+ for _, vertex in ipairs(self.vertices) do
+ for start in E.adjacency_iterator(vertex.link) do
+ if not visited[start] then
+ local prev = start
+ local beforestart = start.links[0].twin
+ local current = start.twin.links[1]
+ local next = current.twin.links[1]
+ visited[start] = true
+ visited[current] = true
+ visited[next] = true
+ while next ~= beforestart do
+ local halfedge1, halfedge2
+ if vertex ~= current.target
+ and not vertex.adjmat[current.target] then
+ halfedge1, halfedge2 = self:add_edge(
+ vertex, current.target,
+ prev, next,
+ true
+ )
+
+ prev = halfedge1
+ current = next
+ next = next.twin.links[1]
+ elseif not prev.target.adjmat[next.target] then
+ halfedge1, halfedge2 = self:add_edge(
+ prev.target, next.target,
+ current, next.twin.links[1],
+ true
+ )
+
+ current = halfedge1
+ next = halfedge2.links[1]
+ else
+ local helper = next.twin.links[1]
+ halfedge1, halfedge2 = self:add_edge(
+ current.target, helper.target,
+ next, helper.twin.links[1],
+ true
+ )
+
+ next = halfedge1
+ end
+
+ visited[next] = true
+ visited[halfedge1] = true
+ visited[halfedge2] = true
+ end
+ end
+ end
+ end
+end
+
+function E:canonical_order(v1, v2, vn)
+ local n = #self.vertices
+ local order = { v1 }
+ local marks = { [v1] = "ordered", [v2] = 0 }
+ local visited = {}
+ local vk = v1
+ local candidates = LinkedList.new()
+ local listelements = {}
+ for k = 1, n-2 do
+ for halfedge in E.adjacency_iterator(vk.link) do
+ local vertex = halfedge.target
+ if vertex ~= vn then
+ local twin = halfedge.twin
+ visited[twin] = true
+ if marks[vertex] == nil then
+ marks[vertex] = "visited"
+ elseif marks[vertex] ~= "ordered" then
+ local neighbor1 = visited[twin.links[0]]
+ local neighbor2 = visited[twin.links[1]]
+ if marks[vertex] == "visited" then
+ if neighbor1 or neighbor2 then
+ marks[vertex] = 1
+ listelements[vertex] = candidates:addback(vertex)
+ else
+ marks[vertex] = 2
+ end
+ else
+ if neighbor1 == neighbor2 then
+ if neighbor1 and neighbor2 then
+ marks[vertex] = marks[vertex] - 1
+ else
+ marks[vertex] = marks[vertex] + 1
+ end
+ if marks[vertex] == 1 then
+ listelements[vertex]
+ = candidates:addback(vertex)
+ elseif listelements[vertex] then
+ candidates:remove(listelements[vertex])
+ listelements[vertex] = nil
+ end
+ end
+ end
+ end
+ end
+ end
+ vk = candidates:popfirst()
+ order[k+1] = vk
+ marks[vk] = "ordered"
+ end
+ order[n] = vn
+ return order
+end
+
+function E:get_biggest_face()
+ local number = 0
+ local edge
+ local visited = {}
+ for _, vertex in ipairs(self.vertices) do
+ for start in E.adjacency_iterator(vertex.link) do
+ local count = 0
+ if not visited[start] then
+ visited[start] = true
+ local current = start
+ repeat
+ count = count + 1
+ current = current.twin.links[1]
+ until current == start
+ if count > number then
+ number = count
+ edge = start
+ end
+ end
+ end
+ end
+ return edge, number
+end
+
+function E:surround_by_triangle(faceedge, facesize)
+ local divisor = 3
+ if facesize > 3 then
+ divisor = 4
+ end
+ local basenodes = math.floor(facesize / divisor)
+ local extranodes = facesize % divisor
+ local attachnodes = { basenodes, basenodes, basenodes }
+ if facesize > 3 then
+ attachnodes[2] = basenodes * 2
+ end
+ for i = 1,extranodes do
+ attachnodes[i] = attachnodes[i] + 1
+ end
+
+ local v = {
+ self:add_vertex("$v_1$", nil, true),
+ self:add_vertex("$v_n$", nil, true),
+ self:add_vertex("$v_2$", nil, true)
+ }
+ for i = 1,3 do
+ local currentv = v[i]
+ local nextv = v[i % 3 + 1]
+ self:add_edge(currentv, nextv, currentv.link, nextv.link, true)
+ end
+
+ local current = faceedge
+ local next = current.twin.links[1]
+ for i = 1,3 do
+ local vertex = v[i]
+ local otheredge = vertex.adjmat[v[i % 3 + 1]]
+ local previnserted = otheredge.links[1]
+ for count = 1, attachnodes[i] do
+ if not vertex.adjmat[current.target] then
+ previnserted, _ = self:add_edge(
+ vertex, current.target,
+ previnserted, next,
+ true
+ )
+ end
+
+ current = next
+ next = next.twin.links[1]
+ end
+ if not vertex.adjmat[current.target] then
+ previnserted, _ = self:add_edge(
+ vertex, current.target,
+ previnserted, next,
+ true
+ )
+ current = previnserted
+ end
+ end
+ return v[1], v[3], v[2]
+end
+
+function E:improve()
+ local pairdata = {}
+ local inpair = {}
+ for i, v1 in ipairs(self.vertices) do
+ for j = i + 1, #self.vertices do
+ local v2 = self.vertices[j]
+ local pd = self:find_pair_components(v1, v2)
+ if pd then
+ inpair[v1] = true
+ inpair[v2] = true
+ table.insert(pairdata, pd)
+ end
+ end
+ if not inpair[v1] then
+ local pd = self:find_pair_components(v1, nil)
+ if pd then
+ inpair[v1] = true
+ table.insert(pairdata, pd)
+ end
+ end
+ end
+
+ local changed
+ local runs = 1
+ local edgepositions = {}
+ repeat
+ changed = false
+ for i, pd in ipairs(pairdata) do
+ self:improve_separation_pair(pd)
+ end
+ -- check for changes
+ for i, v in ipairs(self.vertices) do
+ local start = v.link
+ local current = start
+ local counter = 1
+ repeat
+ if counter ~= edgepositions[current] then
+ changed = true
+ edgepositions[current] = counter
+ end
+ counter = counter + 1
+ current = current.links[0]
+ until current == start
+ end
+ runs = runs + 1
+ until changed == false or runs > 100
+end
+
+function E:find_pair_components(v1, v2)
+ local visited = {}
+ local companchors = {}
+ local edgecomps = {}
+ local compvertices = {}
+ local islinear = {}
+ local edgeindices = {}
+
+ local pair = { v1, v2 }
+ local start = v1.link
+ local current = start
+ local edgeindex = 1
+ -- start searches from v1
+ repeat
+ edgeindices[current] = edgeindex
+ edgeindex = edgeindex + 1
+ if not edgecomps[current] then
+ local compindex = #companchors + 1
+ local ca, il
+ edgecomps[current] = compindex
+ compvertices[compindex] = {}
+ local target = current.target
+ if target == v2 then
+ edgecomps[current.twin] = compindex
+ ca = 3
+ il = true
+ else
+ ca, il = self:component_dfs(
+ target,
+ pair,
+ visited,
+ edgecomps,
+ compvertices[compindex],
+ compindex
+ )
+ end
+ companchors[compindex] = ca
+ islinear[compindex] = il
+ end
+ current = current.links[0]
+ until current == start
+
+ if v2 then
+ start = v2.link
+ current = start
+ local lastincomp = true
+ local edgeindex = 1
+ -- now find the remaining blocks at v2
+ repeat
+ edgeindices[current] = edgeindex
+ edgeindex = edgeindex + 1
+ if not edgecomps[current] then
+ local compindex = #companchors + 1
+ edgecomps[current] = compindex
+ compvertices[compindex] = {}
+ self:component_dfs(
+ current.target,
+ pair,
+ visited,
+ edgecomps,
+ compvertices[compindex],
+ compindex
+ )
+ companchors[compindex] = 2
+ end
+ current = current.links[0]
+ until current == start
+ end
+
+ -- init compedges, tricomps, twocomps
+ local tricomps = {}
+ local twocomps = {{}, {}}
+ for i, anchors in ipairs(companchors) do
+ if anchors == 3 then
+ table.insert(tricomps, i)
+ else
+ table.insert(twocomps[anchors], i)
+ end
+ end
+
+ local flipimmune = #tricomps == 2
+ and (islinear[tricomps[1]] or islinear[tricomps[2]])
+ if (#tricomps < 2 or flipimmune)
+ and (v2 ~= nil or #twocomps[1] < 2) then
+ return nil
+ end
+
+ -- order tri comps cyclic
+ local function sorter(a, b)
+ return #compvertices[a] < #compvertices[b]
+ end
+
+ table.sort(tricomps, sorter)
+
+ -- determine order of comps
+ local numtricomps = #tricomps
+ local comporder = { {}, {} }
+ local bottom = math.ceil(numtricomps / 2)
+ local top = bottom + 1
+ for i, comp in ipairs(tricomps) do
+ if i % 2 == 1 then
+ comporder[1][bottom] = comp
+ comporder[2][numtricomps - bottom + 1] = comp
+ bottom = bottom - 1
+ else
+ comporder[1][top] = comp
+ comporder[2][numtricomps - top + 1] = comp
+ top = top + 1
+ end
+ end
+
+ local pairdata = {
+ pair = pair,
+ companchors = companchors,
+ edgecomps = edgecomps,
+ edgeindices = edgeindices,
+ compvertices = compvertices,
+ tricomps = tricomps,
+ twocomps = twocomps,
+ comporder = comporder,
+ }
+ return pairdata
+end
+
+function E:component_dfs(v, pair, visited, edgecomps, compvertices, compindex)
+ visited[v] = true
+ local start = v.link
+ local current = start
+ local companchors = 1
+ local numedges = 0
+ local islinear = true
+ table.insert(compvertices, v)
+ repeat
+ numedges = numedges + 1
+ local target = current.target
+ if target == pair[1] or target == pair[2] then
+ edgecomps[current.twin] = compindex
+ if target == pair[2] then
+ companchors = 3
+ end
+ elseif not visited[target] then
+ local ca, il = self:component_dfs(
+ target,
+ pair,
+ visited,
+ edgecomps,
+ compvertices,
+ compindex
+ )
+ if ca == 3 then
+ companchors = 3
+ end
+ islinear = islinear and il
+ end
+ current = current.links[0]
+ until current == start
+ return companchors, islinear and numedges == 2
+end
+
+function E:improve_separation_pair(pairdata)
+ local pair = pairdata.pair
+ local companchors = pairdata.companchors
+ local edgecomps = pairdata.edgecomps
+ local edgeindices = pairdata.edgeindices
+ local compvertices = pairdata.compvertices
+ local tricomps = pairdata.tricomps
+ local twocomps = pairdata.twocomps
+ local comporder = pairdata.comporder
+ local v1 = pair[1]
+ local v2 = pair[2]
+
+ local compedges = {}
+ for i = 1, #companchors do
+ compedges[i] = {{}, {}}
+ end
+
+ local numtricomps = #tricomps
+ local numtwocomps = { #twocomps[1], #twocomps[2] }
+
+ -- find compedges
+ for i = 1, #pair do
+ -- first find an edge that is the first of a triconnected component
+ local start2
+ if v2 then
+ start = pair[i].link
+ current = start
+ local last
+ repeat
+ local comp = edgecomps[current]
+ if companchors[comp] == 3 then
+ if last == nil then
+ last = comp
+ elseif last ~= comp then
+ start2 = current
+ break
+ end
+ end
+ current = current.links[0]
+ until current == start
+ else
+ start2 = pair[i].link
+ end
+ -- now list the edges by components
+ current = start2
+ repeat
+ table.insert(compedges[edgecomps[current]][i], current)
+ current = current.links[0]
+ until current == start2
+ end
+
+ -- count edges on each side of tri comps
+ local edgecount = {}
+ for _, comp in ipairs(tricomps) do
+ edgecount[comp] = {}
+ for i = 1, #pair do
+ local count = 1
+ local current = compedges[comp][i][1]
+ local other = pair[3 - i]
+ while current.target ~= other do
+ count = count + 1
+ current = current.twin.links[0]
+ end
+ edgecount[comp][i] = count
+ end
+ end
+
+ -- determine which comps have to be flipped
+ local flips = {}
+ local numflips = 0
+ local allflipped = true
+ for i, comp in ipairs(comporder[1]) do
+ local side1, side2
+ if i > numtricomps / 2 then
+ side1 = edgecount[comp][1]
+ side2 = edgecount[comp][2]
+ else
+ side1 = edgecount[comp][2]
+ side2 = edgecount[comp][1]
+ end
+ if side1 > side2 then
+ numflips = numflips + 1
+ flips[comp] = true
+ elseif side1 < side2 then
+ allflipped = false
+ end
+ end
+
+ if allflipped then
+ for i, comp in ipairs(tricomps) do
+ flips[comp] = false
+ end
+ else
+ for i, comp in ipairs(tricomps) do
+ if flips[comp] then
+ for _, v in ipairs(compvertices[comp]) do
+ local start = v.link
+ local current = start
+ repeat
+ current.links[0], current.links[1]
+ = current.links[1], current.links[0]
+ current = current.links[1]
+ until current == start
+ end
+ end
+ end
+ end
+
+ -- order edges cyclic per component (one cycle for all tri comps)
+ for i = 1, #pair do
+ if v2 then
+ local co
+ if allflipped then
+ co = comporder[3 - i]
+ else
+ co = comporder[i]
+ end
+
+ local id = co[numtricomps]
+ lastedges = compedges[id][i]
+ if flips[id] then
+ lastedge = lastedges[1]
+ else
+ lastedge = lastedges[#lastedges]
+ end
+
+ -- tri comps
+ for _, id in ipairs(co) do
+ local edges = compedges[id][i]
+ local from
+ local to
+ local step
+ if flips[id] then
+ from = #edges
+ to = 1
+ step = -1
+ else
+ from = 1
+ to = #edges
+ step = 1
+ end
+ for k = from, to, step do
+ local edge = edges[k]
+ lastedge.links[0] = edge
+ edge.links[1] = lastedge
+ lastedge = edge
+ end
+ end
+ end
+
+ -- two comps
+ for _, id in ipairs(twocomps[i]) do
+ lastedges = compedges[id][i]
+ lastedge = lastedges[#lastedges]
+ for _, edge in ipairs(compedges[id][i]) do
+ lastedge.links[0] = edge
+ edge.links[1] = lastedge
+ lastedge = edge
+ end
+ end
+ end
+
+ -- now merge the cycles
+ for i = 1, #pair do
+ local outeredges = {}
+ -- find the biggest face of the tri comps
+ if v2 then
+ local biggestedge
+ local biggestsize
+ local biggestindex
+ local start = compedges[tricomps[1]][i][1]
+ local current = start
+ repeat
+ local size = self:get_face_size(current)
+ if not biggestedge or size > biggestsize
+ or (size == biggestsize
+ and edgeindices[current] > biggestindex) then
+ biggestedge = current
+ biggestsize = size
+ biggestindex = edgeindices[current]
+ end
+ current = current.links[0]
+ until current == start
+ outeredges[1] = biggestedge
+ end
+
+ -- now for every two comp
+ for _, id in ipairs(twocomps[i]) do
+ local biggestedge
+ local biggestsize
+ local biggestindex
+ local start = compedges[id][i][1]
+ local current = start
+ repeat
+ local size = self:get_face_size(current)
+ if not biggestedge or size > biggestsize
+ or (size == biggestsize
+ and edgeindices[current] > biggestindex) then
+ biggestedge = current
+ biggestsize = size
+ biggestindex = edgeindices[current]
+ end
+ current = current.links[0]
+ until current == start
+ table.insert(outeredges, biggestedge)
+ end
+
+ -- now merge all comps at the outer edges
+ local lastedge = outeredges[#outeredges].links[0]
+ for _, edge in ipairs(outeredges) do
+ local nextlastedge = edge.links[0]
+ lastedge.links[1] = edge
+ edge.links[0] = lastedge
+ lastedge = nextlastedge
+ end
+ end
+end
+
+function E:get_face_size(halfedge)
+ local size = 0
+ local current = halfedge
+ repeat
+ size = size + 1
+ current = current.twin.links[1]
+ until current == halfedge
+ return size
+end
+
+return E
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/LinkedList.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/LinkedList.lua
new file mode 100644
index 0000000000..35f8418fdf
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/LinkedList.lua
@@ -0,0 +1,88 @@
+local LinkedList = {}
+
+LinkedList.__index = LinkedList
+
+function LinkedList.new()
+ local list = {elements = {}}
+ setmetatable(list, LinkedList)
+ return list
+end
+
+function LinkedList:addback(payload)
+ if payload == nil then
+ error("Need a payload!", 2)
+ end
+ local element = { payload = payload }
+ if self.head then
+ local tail = self.head.prev
+ self.head.prev = element
+ tail.next = element
+ element.next = self.head
+ element.prev = tail
+ else
+ self.head = element
+ element.next = element
+ element.prev = element
+ end
+ self.elements[element] = true
+ return element
+end
+
+function LinkedList:addfront(payload)
+ self.head = self:addback(payload)
+ return self.head
+end
+
+function LinkedList:remove(element)
+ if self.elements[element] == nil then
+ error("Element not in list!", 2)
+ end
+ if self.head == element then
+ if element.next == element then
+ self.head = nil
+ else
+ self.head = element.next
+ end
+ end
+ element.prev.next = element.next
+ element.next.prev = element.prev
+ self.elements[element] = nil
+end
+
+function LinkedList:popfirst()
+ if self.head == nil then
+ return nil
+ end
+ local element = self.head
+ if element.next == element then
+ self.head = nil
+ else
+ self.head = element.next
+ element.next.prev = element.prev
+ element.prev.next = element.next
+ end
+ self.elements[element] = nil
+ return element.payload
+end
+
+function LinkedList:poplast()
+ if self.head == nil then
+ return nil
+ end
+ self.head = self.head.prev
+ return self:popfirst()
+end
+
+function LinkedList:first()
+ return self.head and self.head.payload
+end
+
+function LinkedList:last()
+ return self.head and self.head.prev.payload
+end
+
+function LinkedList:empty()
+ return self.head == nil
+end
+
+return LinkedList
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/List.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/List.lua
new file mode 100644
index 0000000000..22a91e6571
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/List.lua
@@ -0,0 +1,49 @@
+local List = {}
+
+List.__index = List
+
+function List.new()
+ local t = {first = 0, last = -1}
+ setmetatable(t, List)
+ return t
+end
+
+function List:pushleft(value)
+ local first = self.first - 1
+ self.first = first
+ self[first] = value
+end
+
+function List:pushright(value)
+ local last = self.last + 1
+ self.last = last
+ self[last] = value
+end
+
+function List:popleft()
+ local first = self.first
+ if first > self.last then error("List is empty") end
+ local value = self[first]
+ self[first] = nil
+ self.first = first + 1
+ return value
+end
+
+function List:popright()
+ local last = self.last
+ if self.first > last then error("List is empty") end
+ local value = self[last]
+ self[last] = nil
+ self.last = last - 1
+ return value
+end
+
+function List:size()
+ return self.last - self.first + 1
+end
+
+function List:empty()
+ return self.last < self.first
+end
+
+return List
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PDP.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PDP.lua
new file mode 100644
index 0000000000..8c159cf61d
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PDP.lua
@@ -0,0 +1,576 @@
+
+local PDP = {}
+require("pgf.gd.planar").PDP = PDP
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+local Storage = require "pgf.gd.lib.Storage"
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Path = require "pgf.gd.model.Path"
+---
+PDP.__index = PDP
+
+function PDP.new(ugraph, embedding,
+ delta, gamma, coolingfactor,
+ expiterations,
+ startrepexp, endrepexp,
+ startattexp, endattexp,
+ appthreshold, stretchthreshold,
+ stresscounterthreshold,
+ numdivisions)
+ local t = {
+ ugraph = ugraph,
+ embedding = embedding,
+ delta = delta ,
+ gamma = gamma,
+ coolingfactor = coolingfactor,
+ expiterations = expiterations,
+ startrepexp = startrepexp,
+ endrepexp = endrepexp,
+ startattexp = startattexp,
+ endattexp = endattexp,
+ appthreshold = appthreshold,
+ stretchthreshold = stretchthreshold,
+ stresscounterthreshold = stresscounterthreshold,
+ numdivisions = numdivisions,
+ posxs = {},
+ posys = {},
+ cvsxs = {},
+ cvsys = {},
+ embeddingedges = {},
+ edgeids = {},
+ numedgeids = 0,
+ vertexids = {},
+ numvertexids = 0,
+ vertexpairs1 = {},
+ vertexpairs2 = {},
+ pairconnected = {},
+ edgepairsvertex = {},
+ edgepairsedge = {},
+ edgevertex1 = {},
+ edgevertex2 = {},
+ edgedeprecated = {},
+ subdivisionedges = {},
+ subdivisionvertices = {},
+ temperature = 1,
+ }
+
+ setmetatable(t, PDP)
+ return t
+end
+
+function PDP:run()
+ self:normalize_size()
+ self:find_force_pairs()
+
+ local delta = self.delta
+ local gamma = self.gamma
+ local coolingfactor = self.coolingfactor
+ local expiterations = self.expiterations
+ local startrepexp = self.startrepexp
+ local endattexp = self.endattexp
+ local startattexp = self.startattexp
+ local endrepexp = self.endrepexp
+
+ local vertexpairs1 = self.vertexpairs1
+ local vertexpairs2 = self.vertexpairs2
+ local pairconnected = self.pairconnected
+ local edgepairsvertex = self.edgepairsvertex
+ local edgepairsedge = self.edgepairsedge
+ local edgevertex1 = self.edgevertex1
+ local edgevertex2 = self.edgevertex2
+ local edgedeprecated = self.edgedeprecated
+
+ local forcexs = {}
+ local forceys = {}
+ local posxs = self.posxs
+ local posys = self.posys
+ local cvsxs = self.cvsxs
+ local cvsys = self.cvsys
+ local numcvs = {}
+ for i, v in ipairs(self.embedding.vertices) do
+ cvsxs[i] = {}
+ cvsys[i] = {}
+ posxs[i] = v.inputvertex.pos.x
+ posys[i] = v.inputvertex.pos.y
+ end
+
+ local numorigvertices = self.numvertexids
+ local numorigedges = self.numedgeids
+ local numdivisions = self.numdivisions
+ local divdelta = delta / (numdivisions + 1)
+ local stresscounter = {}
+ for i = 1, self.numedgeids do
+ stresscounter[i] = 0
+ end
+
+ local appthreshold = self.appthreshold
+ local stretchthreshold = self.stretchthreshold
+ local stresscounterthreshold = self.stresscounterthreshold
+
+ for i = 1, numorigedges do
+ local iv1 = self.embedding.vertices[edgevertex1[i]].inputvertex
+ local iv2 = self.embedding.vertices[edgevertex2[i]].inputvertex
+ local arc = self.ugraph:arc(iv1, iv2)
+ --TODO subdivide edge if desired
+ --self:subdivide_edge(i)
+ end
+
+ -- main loop
+ local iteration = 0
+ repeat
+ iteration = iteration + 1
+ local temperature = self.temperature
+ local ratio = math.min(1, iteration / expiterations)
+ local repexp = startrepexp + (endrepexp - startrepexp) * ratio
+ local attexp = startattexp + (endattexp - startattexp) * ratio
+ for i = 1, self.numvertexids do
+ forcexs[i] = 0
+ forceys[i] = 0
+ numcvs[i] = 0
+ end
+ -- vertex-vertex forces
+ for i = 1, #vertexpairs1 do
+ local id1 = vertexpairs1[i]
+ local id2 = vertexpairs2[i]
+ local diffx = posxs[id2] - posxs[id1]
+ local diffy = posys[id2] - posys[id1]
+ local dist2 = diffx * diffx + diffy * diffy
+ local dist = math.sqrt(dist2)
+ local dirx = diffx / dist
+ local diry = diffy / dist
+ assert(dist ~= 0)
+
+ local useddelta = delta
+ local hasdivvertex = id1 > numorigvertices or id2 > numorigvertices
+
+ -- calculate attractive force
+ if pairconnected[i] then
+ if hasdivvertex then
+ useddelta = divdelta
+ end
+ local mag = (dist / useddelta) ^ attexp * useddelta
+ local fax = mag * dirx
+ local fay = mag * diry
+ forcexs[id1] = forcexs[id1] + fax
+ forceys[id1] = forceys[id1] + fay
+ forcexs[id2] = forcexs[id2] - fax
+ forceys[id2] = forceys[id2] - fay
+ elseif hasdivvertex then
+ useddelta = gamma
+ end
+
+ -- calculate repulsive force
+ local mag = (useddelta / dist) ^ repexp * useddelta
+ local frx = mag * dirx
+ local fry = mag * diry
+ forcexs[id1] = forcexs[id1] - frx
+ forceys[id1] = forceys[id1] - fry
+ forcexs[id2] = forcexs[id2] + frx
+ forceys[id2] = forceys[id2] + fry
+ end
+
+ -- edge-vertex forces and collisions
+ for i = 1, #edgepairsvertex do
+ local edgeid = edgepairsedge[i]
+ if not edgedeprecated[edgeid] then
+ local id1 = edgepairsvertex[i]
+ local id2 = edgevertex1[edgeid]
+ local id3 = edgevertex2[edgeid]
+ assert(id2 ~= id1 and id3 ~= id1)
+
+ local abx = posxs[id3] - posxs[id2]
+ local aby = posys[id3] - posys[id2]
+ local dab2 = abx * abx + aby * aby
+ local dab = math.sqrt(dab2)
+ assert(dab ~= 0)
+ local abnx = abx / dab
+ local abny = aby / dab
+ local avx = posxs[id1] - posxs[id2]
+ local avy = posys[id1] - posys[id2]
+ local daiv = abnx * avx + abny * avy
+ local ivx = posxs[id2] + abnx * daiv
+ local ivy = posys[id2] + abny * daiv
+ local vivx = ivx - posxs[id1]
+ local vivy = ivy - posys[id1]
+ local dviv2 = vivx * vivx + vivy * vivy
+ local dviv = math.sqrt(dviv2)
+ local afactor, bfactor = 1, 1
+ local cvx
+ local cvy
+ if daiv < 0 then
+ cvx = -avx / 2
+ cvy = -avy / 2
+ local norm2 = cvx * cvx + cvy * cvy
+ bfactor = 1 + (cvx * abx + cvy * aby) / norm2
+ elseif daiv > dab then
+ cvx = (abx - avx) / 2
+ cvy = (aby - avy) / 2
+ local norm2 = cvx * cvx + cvy * cvy
+ afactor = 1 - (cvx * abx + cvy * aby) / norm2
+ else
+ if edgeid < numorigedges
+ and dviv < gamma * appthreshold
+ and dab > delta * stretchthreshold then
+ stresscounter[edgeid] = stresscounter[edgeid] + 1
+ end
+ assert(dviv > 0)
+ cvx = vivx / 2
+ cvy = vivy / 2
+ -- calculate edge repulsive force
+ local dirx = -vivx / dviv
+ local diry = -vivy / dviv
+ local mag = (gamma / dviv) ^ repexp * gamma
+ local fex = mag * dirx
+ local fey = mag * diry
+ local abratio = daiv / dab
+ forcexs[id1] = forcexs[id1] + fex
+ forceys[id1] = forceys[id1] + fey
+ forcexs[id2] = forcexs[id2] - fex * (1 - abratio)
+ forceys[id2] = forceys[id2] - fey * (1 - abratio)
+ forcexs[id3] = forcexs[id3] - fex * abratio
+ forceys[id3] = forceys[id3] - fey * abratio
+ end
+ local nv = numcvs[id1] + 1
+ local na = numcvs[id2] + 1
+ local nb = numcvs[id3] + 1
+ numcvs[id1] = nv
+ numcvs[id2] = na
+ numcvs[id3] = nb
+ cvsxs[id1][nv] = cvx
+ cvsys[id1][nv] = cvy
+ cvsxs[id2][na] = -cvx * afactor
+ cvsys[id2][na] = -cvy * afactor
+ cvsxs[id3][nb] = -cvx * bfactor
+ cvsys[id3][nb] = -cvy * bfactor
+ end
+ end
+
+ -- clamp forces
+ local scalefactor = 1
+ local collision = false
+ for i = 1, self.numvertexids do
+ local forcex = forcexs[i]
+ local forcey = forceys[i]
+ forcex = forcex * temperature
+ forcey = forcey * temperature
+ forcexs[i] = forcex
+ forceys[i] = forcey
+ local forcenorm2 = forcex * forcex + forcey * forcey
+ local forcenorm = math.sqrt(forcenorm2)
+ scalefactor = math.min(scalefactor, delta * 3 * temperature / forcenorm)
+ local cvys = cvsys[i]
+ for j, cvx in ipairs(cvsxs[i]) do
+ local cvy = cvys[j]
+ local cvnorm2 = cvx * cvx + cvy * cvy
+ local cvnorm = math.sqrt(cvnorm2)
+ local projforcenorm = (cvx * forcex + cvy * forcey) / cvnorm
+ if projforcenorm > 0 then
+ local factor = cvnorm * 0.9 / projforcenorm
+ if factor < scalefactor then
+ scalefactor = factor
+ collision = true
+ end
+ end
+ end
+ end
+ local moved = false
+ for i = 1, self.numvertexids do
+ local forcex = forcexs[i] * scalefactor
+ local forcey = forceys[i] * scalefactor
+ posxs[i] = posxs[i] + forcex
+ posys[i] = posys[i] + forcey
+ local forcenorm2 = forcex * forcex + forcey * forcey
+ if forcenorm2 > 0.0001 * delta * delta then moved = true end
+ end
+
+ -- subdivide stressed edges
+ if numdivisions > 0 then
+ for i = 1, numorigedges do
+ if stresscounter[i] > stresscounterthreshold then
+ self:subdivide_edge(i)
+ stresscounter[i] = 0
+ end
+ end
+ end
+ self.temperature = self.temperature * coolingfactor
+ until not collision and not moved
+ print("\nfinished PDP after " .. iteration .. " iterations")
+
+ -- write the positions back
+ for i, v in ipairs(self.embedding.vertices) do
+ v.inputvertex.pos.x = posxs[i]
+ v.inputvertex.pos.y = posys[i]
+ end
+
+ -- route the edges
+ for i = 1, self.numedgeids do
+ if self.subdivisionvertices[i] then
+ local iv1 = self.embedding.vertices[self.edgevertex1[i]].inputvertex
+ local iv2 = self.embedding.vertices[self.edgevertex2[i]].inputvertex
+ local arc = self.ugraph:arc(iv1, iv2)
+ local p = Path.new()
+ p:appendMoveto(arc.tail.pos:clone())
+ for _, vid in ipairs(self.subdivisionvertices[i]) do
+ p:appendLineto(self.posxs[vid], self.posys[vid])
+ end
+ p:appendLineto(arc.head.pos:clone())
+ arc.path = p
+ end
+ end
+end
+
+function PDP:subdivide_edge(edgeid)
+ assert(self.subdivisionedges[edgeid] == nil)
+ local numdivisions = self.numdivisions
+ local subdivisionedges = {}
+ local subdivisionvertices = {}
+ local id1 = self.edgevertex1[edgeid]
+ local id2 = self.edgevertex2[edgeid]
+ local x1 = self.posxs[id1]
+ local y1 = self.posys[id1]
+ local x2 = self.posxs[id2]
+ local y2 = self.posys[id2]
+ local prevvertexid = id1
+ for i = 1, numdivisions do
+ -- create new edge and vertex
+ local newvertexid1 = self.numvertexids + i
+ table.insert(subdivisionvertices, newvertexid1)
+ self.posxs[newvertexid1] = (x1 * (numdivisions + 1 - i) + x2 * i)
+ / (numdivisions + 1)
+ self.posys[newvertexid1] = (y1 * (numdivisions + 1 - i) + y2 * i)
+ / (numdivisions + 1)
+ self.cvsxs[newvertexid1] = {}
+ self.cvsys[newvertexid1] = {}
+
+ local newedgeid = self.numedgeids + i
+ table.insert(subdivisionedges, newedgeid)
+ table.insert(self.edgevertex1, prevvertexid)
+ table.insert(self.edgevertex2, newvertexid1)
+ prevvertexid = newvertexid1
+
+ -- pair the new vertex
+ -- with first vertex of the edge being divided
+ table.insert(self.vertexpairs1, self.edgevertex1[edgeid])
+ table.insert(self.vertexpairs2, newvertexid1)
+ table.insert(self.pairconnected, i == 1)
+
+ -- with second vertex of the edge being divided
+ table.insert(self.vertexpairs1, self.edgevertex2[edgeid])
+ table.insert(self.vertexpairs2, newvertexid1)
+ table.insert(self.pairconnected, i == numdivisions)
+
+ -- with each other
+ for j = i + 1, numdivisions do
+ local newvertexid2 = self.numvertexids + j
+ table.insert(self.vertexpairs1, newvertexid1)
+ table.insert(self.vertexpairs2, newvertexid2)
+ table.insert(self.pairconnected, j == i + 1)
+ end
+
+ -- with new edges
+ -- before vertex
+ for j = 1, i - 1 do
+ local newedgeid = self.numedgeids + j
+ table.insert(self.edgepairsvertex, newvertexid1)
+ table.insert(self.edgepairsedge, newedgeid)
+ end
+ -- after vertex
+ for j = i + 2, numdivisions + 1 do
+ local newedgeid = self.numedgeids + j
+ table.insert(self.edgepairsvertex, newvertexid1)
+ table.insert(self.edgepairsedge, newedgeid)
+ end
+
+ -- pair the new edges with vertices of the edge being divided
+ if i > 1 then
+ table.insert(self.edgepairsvertex, id1)
+ table.insert(self.edgepairsedge, newedgeid)
+ end
+ table.insert(self.edgepairsvertex, id2)
+ table.insert(self.edgepairsedge, newedgeid)
+ end
+ -- create last edge
+ table.insert(subdivisionedges, self.numedgeids + numdivisions + 1)
+ table.insert(self.edgevertex1, prevvertexid)
+ table.insert(self.edgevertex2, id2)
+
+ -- pair last edge with first vertex of the edge being divided
+ table.insert(self.edgepairsvertex, id1)
+ table.insert(self.edgepairsedge, self.numedgeids + numdivisions + 1)
+
+ self.subdivisionedges[edgeid] = subdivisionedges
+ self.subdivisionvertices[edgeid] = subdivisionvertices
+
+ -- pair new edges and vertices with existing edges and vertices
+ local sameface = false
+ local start = self.embeddingedges[edgeid]
+ local twin = start.twin
+ local donevertices = { [start.target] = true, [twin.target] = true }
+ local doneedges = { [start] = true, [twin] = true }
+ local current = start.twin.links[1]
+ for twice = 1, 2 do
+ while current ~= start do
+ if current == twin then
+ sameface = true
+ end
+
+ -- pair edge with the new vertices
+ -- or pair subdivision of edge with new vertices and edges
+ if not doneedges[current] then
+ local currentedgeid = self.edgeids[current]
+ if self.subdivisionvertices[currentedgeid] then
+ for _, vid in ipairs(self.subdivisionvertices[currentedgeid]) do
+ for i = 1, numdivisions do
+ local newvertexid = self.numvertexids + i
+ table.insert(self.vertexpairs1, vid)
+ table.insert(self.vertexpairs2, newvertexid)
+ self.pairconnected[#self.vertexpairs1] = false
+ end
+ for i = 1, numdivisions + 1 do
+ local newedgeid = self.numedgeids + i
+ table.insert(self.edgepairsvertex, vid)
+ table.insert(self.edgepairsedge, newedgeid)
+ end
+ end
+ for _, eid in ipairs(self.subdivisionedges[currentedgeid]) do
+ for i = 1, numdivisions do
+ local newvertexid = self.numvertexids + i
+ table.insert(self.edgepairsvertex, newvertexid)
+ table.insert(self.edgepairsedge, eid)
+ end
+ end
+ else
+ for i = 1, numdivisions do
+ local newvertexid = self.numvertexids + i
+ table.insert(self.edgepairsvertex, newvertexid)
+ table.insert(self.edgepairsedge, currentedgeid)
+ end
+ end
+ doneedges[current] = true
+ end
+
+ -- pair target vertex with the new vertices and edges
+ local vertexid = self.vertexids[current.target]
+ if not donevertices[current.target] then
+ for i = 1, numdivisions do
+ local newvertexid = self.numvertexids + i
+ table.insert(self.vertexpairs1, vertexid)
+ table.insert(self.vertexpairs2, newvertexid)
+ self.pairconnected[#self.vertexpairs1] = false
+ end
+ for i = 1, numdivisions + 1 do
+ local newedgeid = self.numedgeids + i
+ table.insert(self.edgepairsvertex, vertexid)
+ table.insert(self.edgepairsedge, newedgeid)
+ end
+ end
+ current = current.twin.links[1]
+ end
+ start = self.embeddingedges[edgeid].twin
+ current = start.twin.links[1]
+ if sameface then
+ break
+ end
+ end
+
+ self.edgedeprecated[edgeid] = true
+ self.numvertexids = self.numvertexids + numdivisions
+ self.numedgeids = self.numedgeids + numdivisions + 1
+end
+
+function PDP:find_force_pairs()
+ local donevertices = {}
+ -- number all vertices
+ local vertexids = self.vertexids
+ for i, v in ipairs(self.embedding.vertices) do
+ vertexids[v] = i
+ end
+ self.numvertexids = #self.embedding.vertices
+
+ local edgeids = self.edgeids
+ local numedgeids = 0
+ -- number all edges
+ for _, v in ipairs(self.embedding.vertices) do
+ local id = vertexids[v]
+ local start = v.link
+ local current = start
+ repeat
+ local targetid = vertexids[current.target]
+ if edgeids[current] == nil then
+ table.insert(self.edgevertex1, id)
+ table.insert(self.edgevertex2, targetid)
+ numedgeids = numedgeids + 1
+ edgeids[current] = numedgeids
+ edgeids[current.twin] = numedgeids
+ self.embeddingedges[numedgeids] = current
+ end
+ current = current.links[0]
+ until current == start
+ end
+
+ -- find all force pairs
+ for _, v in ipairs(self.embedding.vertices) do
+ local id = vertexids[v]
+ donevertices[id] = true
+ local vertexset = {}
+ local edgeset = {}
+ local start = v.link
+ repeat
+ local targetid = vertexids[start.target]
+ if vertexset[targetid] == nil and not donevertices[targetid] then
+ table.insert(self.pairconnected, true)
+ table.insert(self.vertexpairs1, id)
+ table.insert(self.vertexpairs2, targetid)
+ vertexset[targetid] = true
+ end
+ local current = start.twin.links[1]
+ while current.target ~= v do
+ local targetid = vertexids[current.target]
+ if vertexset[targetid] == nil and not donevertices[targetid] then
+ table.insert(self.pairconnected, self.ugraph:arc(v.inputvertex, current.target.inputvertex) ~= nil)
+ table.insert(self.vertexpairs1, id)
+ table.insert(self.vertexpairs2, targetid)
+ vertexset[targetid] = true
+ end
+ if edgeset[current] == nil then
+ table.insert(self.edgepairsvertex, id)
+ table.insert(self.edgepairsedge, edgeids[current])
+ edgeset[current] = true
+ edgeset[current.twin] = true
+ end
+ current = current.twin.links[1]
+ end
+ start = start.links[0]
+ until start == v.link
+ end
+
+ self.numedgeids = numedgeids
+end
+
+function PDP:normalize_size()
+ local minx = math.huge
+ local maxx = -math.huge
+ local miny = math.huge
+ local maxy = -math.huge
+
+ for _, v in ipairs(self.ugraph.vertices) do
+ minx = math.min(minx, v.pos.x)
+ maxx = math.max(maxx, v.pos.x)
+ miny = math.min(miny, v.pos.y)
+ maxy = math.max(maxy, v.pos.y)
+ end
+
+ local area = (maxx - minx) * (maxy - miny)
+ local gridarea = #self.ugraph.vertices * self.delta * self.delta
+
+ local scale = math.sqrt(gridarea) / math.sqrt(area)
+
+ for _, v in ipairs(self.ugraph.vertices) do
+ v.pos = v.pos * scale
+ end
+end
+
+-- done
+
+return PDP
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PlanarLayout.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PlanarLayout.lua
new file mode 100644
index 0000000000..9e5b8d72ec
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/PlanarLayout.lua
@@ -0,0 +1,159 @@
+
+
+local PlanarLayout = {}
+require("pgf.gd.planar").PlanarLayout = PlanarLayout
+
+-- imports
+local Coordinate = require "pgf.gd.model.Coordinate"
+local Storage = require "pgf.gd.lib.Storage"
+local BoyerMyrvold = require "pgf.gd.planar.BoyerMyrvold2004"
+local ShiftMethod = require "pgf.gd.planar.ShiftMethod"
+local Embedding = require "pgf.gd.planar.Embedding"
+local PDP = require "pgf.gd.planar.PDP"
+local InterfaceToAlgorithms = require("pgf.gd.interface.InterfaceToAlgorithms")
+local createEdge = InterfaceToAlgorithms.createEdge
+local createVertex = InterfaceToAlgorithms.createVertex
+
+InterfaceToAlgorithms.declare {
+ key = "planar layout",
+ algorithm = PlanarLayout,
+ preconditions = {
+ connected = true,
+ loop_free = true,
+ simple = true,
+ },
+ postconditions = {
+ fixed = true,
+ },
+ summary = [["
+ The planar layout draws planar graphs without edge crossings.
+ "]],
+ documentation = [["
+ The planar layout is a pipeline of algorithms to produce
+ a crossings-free drawing of a planar graph.
+ First a combinatorical embedding of the graph is created using
+ the Algorithm from Boyer and Myrvold.
+ The combinatorical Embedding is then being improved by
+ by the Sort and Flip algorithm and triangulated afterwards.
+ To determine the actual node positions the shift method
+ by de Fraysseix, Pach and Pollack is used.
+ Finally the force based Planar Drawing Postprocessing improves the drawing.
+ "]],
+ examples = {
+ [["
+ \tikz \graph [nodes={draw, circle}] {
+ a -- {
+ b -- {
+ d -- i,
+ e,
+ f
+ },
+ c -- {
+ g,
+ h
+ }
+ },
+ f --[no span edge] a,
+ h --[no span edge] a,
+ i --[no span edge] g,
+ f --[no span edge] g,
+ c --[no span edge] d,
+ e --[no span edge] c
+ }
+ "]]
+ }
+}
+
+function PlanarLayout:run()
+ --local file = io.open("timing.txt", "a")
+
+ local options = self.digraph.options
+
+ -- get embedding
+ local bm = BoyerMyrvold.new()
+ bm:init(self.ugraph)
+ local embedding = bm:run()
+
+ assert(embedding, "Graph is not planar")
+
+ --local start = os.clock()
+ if options["use sf"] then
+ embedding:improve()
+ end
+
+ -- choose external face
+ local exedge, exsize = embedding:get_biggest_face()
+
+ -- surround graph with triangle
+ local v1, v2, vn = embedding:surround_by_triangle(exedge, exsize)
+
+ -- make maximal planar
+ embedding:triangulate()
+
+ if options["show virtual"] then
+ -- add virtual vertices to input graph
+ for _, vertex in ipairs(embedding.vertices) do
+ if vertex.virtual then
+ vertex.inputvertex = createVertex(self, {
+ name = nil,--vertex.name,
+ generated_options = {},
+ text = vertex.name
+ })
+ vertex.virtual = false
+ end
+ end
+
+ -- add virtual edges to input graph
+ for _, vertex in ipairs(embedding.vertices) do
+ for halfedge in Embedding.adjacency_iterator(vertex.link) do
+ if halfedge.virtual then
+ createEdge(
+ self,
+ vertex.inputvertex,
+ halfedge.target.inputvertex
+ )
+ end
+ halfedge.virtual = false
+ end
+ end
+ end
+
+ -- create canonical ordering
+ local order = embedding:canonical_order(v1, v2, vn)
+
+ local sm = ShiftMethod.new()
+ sm:init(order)
+ local gridpos = sm:run()
+
+ local gridspacing = options["grid spacing"]
+ for _, v in ipairs(order) do
+ if not v.virtual then
+ local iv = v.inputvertex
+ iv.pos.x = gridpos[v].x * gridspacing
+ iv.pos.y = gridpos[v].y * gridspacing
+ end
+ end
+
+ embedding:remove_virtual()
+
+ --start = os.clock()
+ if options["use pdp"] then
+ local pdp = PDP.new(
+ self.ugraph, embedding,
+ options["node distance"],
+ options["node distance"],
+ options["pdp cooling factor"],
+ options["exponent change iterations"],
+ options["start repulsive exponent"],
+ options["end repulsive exponent"],
+ options["start attractive exponent"],
+ options["end attractive exponent"],
+ options["edge approach threshold"],
+ options["edge stretch threshold"],
+ options["stress counter threshold"],
+ options["edge divisions"]
+ )
+ pdp:run()
+ end
+
+end
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/ShiftMethod.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/ShiftMethod.lua
new file mode 100644
index 0000000000..c568ca5696
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/ShiftMethod.lua
@@ -0,0 +1,128 @@
+local SM = {}
+require("pgf.gd.planar").ShiftMethod = SM
+
+-- imports
+local Embedding = require("pgf.gd.planar.Embedding")
+
+-- create class properties
+SM.__index = SM
+
+function SM.new()
+ local t = {}
+ setmetatable(t, SM)
+ return t
+end
+
+function SM:init(vertices)
+ self.vertices = vertices
+ self.xoff = {}
+ self.pos = {}
+ for _, v in ipairs(vertices) do
+ self.pos[v] = {}
+ end
+ self.left = {}
+ self.right = {}
+end
+
+function SM:run()
+ local v1 = self.vertices[1]
+ local v2 = self.vertices[2]
+ local v3 = self.vertices[3]
+
+ self.xoff[v1] = 0
+ self.pos[v1].y = 0
+ self.right[v1] = v3
+
+ self.xoff[v3] = 1
+ self.pos[v3].y = 1
+ self.right[v3] = v2
+
+ self.xoff[v2] = 1
+ self.pos[v2].y = 0
+
+ local n = #self.vertices
+ for k = 4, n do
+ local vk = self.vertices[k]
+ local wplink, wqlink, wp1qsum
+ if k ~= n then
+ wplink, wqlink, wp1qsum = self:get_attachments(vk)
+ else
+ wplink, wqlink, wp1qsum = self:get_last_attachments(vk, v1, v2)
+ end
+ local wp, wq = wplink.target, wqlink.target
+ local wp1 = wplink.links[0].target
+ local wq1 = wqlink.links[1 - 0].target
+ self.xoff[wp1] = self.xoff[wp1] + 1
+ self.xoff[wq] = self.xoff[wq] + 1
+ wp1qsum = wp1qsum + 2
+ self.xoff[vk] = (wp1qsum + self.pos[wq].y - self.pos[wp].y) / 2
+ self.pos[vk].y = (wp1qsum + self.pos[wq].y + self.pos[wp].y) / 2
+ -- = self.xoff[vk] + self.pos[wp].y ?
+ self.right[wp] = vk
+ if wp ~= wq1 then
+ self.left[vk] = wp1
+ self.right[wq1] = nil
+ self.xoff[wp1] = self.xoff[wp1] - self.xoff[vk]
+ end
+ self.right[vk] = wq
+ self.xoff[wq] = wp1qsum - self.xoff[vk]
+ end
+ self.pos[v1].x = 0
+ self:accumulate_offset(v1, 0)
+ return self.pos
+end
+
+function SM:get_attachments(vk)
+ local wplink, wqlink
+ local wp1qsum = 0
+ local start = vk.link
+ local startattach = self.xoff[start.target] ~= nil
+ local current = start.links[0]
+ local last = start
+ repeat
+ local currentattach = self.xoff[current.target] ~= nil
+ local lastattach = self.xoff[last.target] ~= nil
+ if currentattach ~= lastattach then
+ if currentattach then
+ wplink = current
+ else
+ wqlink = last
+ end
+ if currentattach == startattach and not startattach then
+ break
+ end
+ currentattach = lastattach
+ elseif currentattach then
+ wp1qsum = wp1qsum + self.xoff[current.target]
+ end
+ last = current
+ current = current.links[0]
+ until last == start
+ return wplink, wqlink, wp1qsum
+end
+
+function SM:get_last_attachments(vn, v1, v2)
+ local wplink, wqlink
+ local wp1qsum = 0
+ for halfedge in Embedding.adjacency_iterator(vn.link, ccwdir) do
+ local target = halfedge.target
+ if target == v1 then
+ wplink = halfedge
+ elseif target == v2 then
+ wqlink = halfedge
+ end
+ wp1qsum = wp1qsum + self.xoff[target]
+ end
+ return wplink, wqlink, wp1qsum
+end
+
+function SM:accumulate_offset(v, x)
+ x = x + self.xoff[v]
+ self.pos[v].x = x
+ local l = self.left[v]
+ local r = self.right[v]
+ if l then self:accumulate_offset(l, x) end
+ if r then self:accumulate_offset(r, x) end
+end
+
+return SM
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/library.lua
new file mode 100644
index 0000000000..68c46898e3
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/library.lua
@@ -0,0 +1,2 @@
+require "pgf.gd.planar.PlanarLayout"
+require "pgf.gd.planar.parameters"
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/parameters.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/parameters.lua
new file mode 100644
index 0000000000..603f2ee7cc
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/planar/parameters.lua
@@ -0,0 +1,144 @@
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+declare {
+ key = "use pdp",
+ type = "boolean",
+ initial = "true",
+
+ summary = [["
+ Whether or not to use the Planar Drawing Postprocessing
+ to improve the drawing.
+ "]]
+}
+
+declare {
+ key = "use sf",
+ type = "boolean",
+ initial = "true",
+
+ summary = [["
+ Whether or not to use the Sort and Flip Algorithm
+ to improve the combinatorical embedding.
+ "]]
+}
+
+declare {
+ key = "grid spacing",
+ type = "number",
+ initial = "10",
+
+ summary = [["
+ If the |use pdp| option is not set,
+ this sets the spacing of the grid used by the shift method.
+ A bigger grid spacing will result in a bigger drawing.
+ "]]
+}
+
+declare {
+ key = "pdp cooling factor",
+ type = "number",
+ initial = "0.98",
+
+ summary = [["
+ This sets the cooling factor used by the Planar Drawing Postprocessing.
+ A higher cooling factor can result in better quality of the drawing,
+ but will increase the run time of the algorithm.
+ "]]
+}
+
+declare {
+ key = "start repulsive exponent",
+ type = "number",
+ initial = "2",
+
+ summary = [["
+ Start value of the exponent used in the calculation of all repulsive forces in PDP
+ "]]
+}
+
+declare {
+ key = "end repulsive exponent",
+ type = "number",
+ initial = "2",
+
+ summary = [["
+ End value of the exponent used in the calculation of all repulsive forces in PDP.
+ "]]
+}
+
+declare {
+ key = "start attractive exponent",
+ type = "number",
+ initial = "2",
+
+ summary = [["
+ Start value of the exponent used in PDP's calculation of the attractive force between
+ nodes connected by an edge.
+ "]]
+}
+
+declare {
+ key = "end attractive exponent",
+ type = "number",
+ initial = "2",
+
+ summary = [["
+ End value of the exponent used in PDP's calculation of the attractive force between
+ nodes connected by an edge.
+ "]]
+}
+
+declare {
+ key = "exponent change iterations",
+ type = "number",
+ initial = "1",
+
+ summary = [["
+ The number of iterations over which to modify the force exponents.
+ In iteration one the exponents will have their start value and in iteration
+ |exponent change iterations| they will have their end value.
+ "]]
+}
+
+declare {
+ key = "edge approach threshold",
+ type = "number",
+ initial = "0.3",
+
+ summary = [["
+ The maximum ration between the actual and the desired node-edge distance
+ which is required to count an edge as stressed.
+ "]]
+}
+
+declare {
+ key = "edge stretch threshold",
+ type = "number",
+ initial = "1.5",
+
+ summary = [["
+ The minimum ration between the actual and the desired edge length
+ which is required to count an edge as stressed.
+ "]]
+}
+
+declare {
+ key = "stress counter threshold",
+ type = "number",
+ initial = "30",
+
+ summary = [["
+ The number of iterations an edge has to be under stress before it will be subdivided.
+ "]]
+}
+
+declare {
+ key = "edge divisions",
+ type = "number",
+ initial = "0",
+
+ summary = [["
+ The number of edges in which stressed edges will be subdivided.
+ "]]
+}
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing.lua
new file mode 100644
index 0000000000..77166c5cbf
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing.lua
@@ -0,0 +1,22 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+
+local routing = {}
+
+-- Declare namespace
+require("pgf.gd").routing = routing
+
+
+-- Done
+
+return routing \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/Hints.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/Hints.lua
new file mode 100644
index 0000000000..7d34726f47
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/Hints.lua
@@ -0,0 +1,100 @@
+-- Copyright 2014 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+---
+-- The |Hints| class provides a way for graph drawing algorithms to
+-- communicate certain possibilities concerning the routing of edges
+-- to edge routing algorithms. This partly decouples the choice of the
+-- vertex positioning algorithms from the choice of edge routing
+-- algorithm. For instance, for a simple necklace routing, it is
+-- unclear whether the edges on the necklace should be routing ``along
+-- the necklace'' or not. Thus, necklace routing algorithms will
+-- ``hint'' that a necklace is present and only when the
+-- |necklace routing| algorithm is selected will these hints lead to
+-- actual bending of edges.
+--
+-- For each kind of hint, there are methods in this class for creating
+-- the hints and other methods for reading them. Hints are always
+-- local to the ugraph.
+
+local Hints = {}
+
+-- Namespace
+require("pgf.gd.routing").Hints = Hints
+
+-- Imports
+local Storage = require("pgf.gd.lib.Storage")
+local Coordinate = require("pgf.gd.model.Coordinate")
+
+
+
+
+-- The necklace storage
+
+local necklaces = Storage.new()
+
+
+---
+-- Adds a necklace hint. In this case, the hint indicates that the
+-- given sequence of vertices lie on a circle.
+--
+-- The idea is that an algorithm may specify that in a
+-- given graph certain sequences of nodes form a ``necklace'', which
+-- is typically a circle. There may be more than one necklace inside a
+-- given graph. For each necklace,
+-- whenever an arc connects subsequent nodes on the necklace, they get
+-- bend in such a way that they lie follow the path of the
+-- necklace. If an arc lies on more than one necklace, the ``last one
+-- wins''.
+--
+-- @param ugraph The ugraph to which this hint is added
+-- @param necklace The sequence of vertices that form the necklace. If
+-- the necklace is closed, the last vertex must equal the first one.
+-- @param center If provided, must be |Coordinate| that specifies the
+-- center of the circle on which the vertices lie. If not provided,
+-- the origin is assumed.
+-- @param clockwise If |true|, the vertices are in clockwise order,
+-- otherwise in counter-clockwise order.
+
+function Hints.addNecklaceCircleHint(ugraph, necklace, center, clockwise)
+ local a = necklaces[ugraph] or {}
+ necklaces[ugraph] = a
+
+ a[#a+1] = {
+ necklace = necklace,
+ center = center or Coordinate.origin,
+ clockwise = clockwise
+ }
+end
+
+
+---
+-- Gets the necklace hints.
+--
+-- This function will return an array whose entries are necklace
+-- hints. Each entry in the array has a |necklace| field, which is the
+-- field passed to the |addNecklaceXxxx| methods. For a circle
+-- necklace, the |center| and |clockwise| fields will be set. (Other
+-- necklaces are not yet implemented.)
+--
+-- @param ugraph The ugraph for which the necklace hints are
+-- requested.
+-- @return The array of necklaces as described above.
+
+function Hints.getNecklaceHints(ugraph)
+ return necklaces[ugraph] or {}
+end
+
+-- done
+
+return Hints
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/NecklaceRouting.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/NecklaceRouting.lua
new file mode 100644
index 0000000000..defcf9f8c6
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/NecklaceRouting.lua
@@ -0,0 +1,90 @@
+-- Copyright 2014 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- The class; it processes necklace hints.
+
+local NecklaceRouting = {}
+
+
+-- Namespace
+require("pgf.gd.routing").NecklaceRouting = NecklaceRouting
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+local Hints = require "pgf.gd.routing.Hints"
+local Path = require "pgf.gd.model.Path"
+
+
+---
+declare {
+ key = "necklace routing",
+ algorithm = NecklaceRouting,
+
+ phase = "edge routing",
+
+ summary = "Bends all edges of a graph that lie on ``necklaces'' along these necklaces.",
+
+ documentation = [["
+ Some graph drawing algorithms lay out some or all nodes along a
+ path, which is then called a \emph{necklace}. For instance, the
+ |simple necklace layout| places all nodes on a circle and that
+ circle is the ``necklace''. When the |necklace routing| edge
+ routing algorithm is selected, all edges that connect subsequent
+ nodes on such a necklace are bend in such a way that the
+ ``follow the necklace path''. In the example case, this will
+ cause all edges that connect adjacent nodes to become arcs on
+ of the circle on which the nodes lie.
+
+ Note that local edge routing options for an edge may overrule
+ the edge routing computed by the algorithm as in the edge from 6
+ to 7 in the example.
+ "]],
+
+ examples = [["
+ \tikz \graph [simple necklace layout, node distance=1.5cm,
+ necklace routing,
+ nodes={draw,circle}, edges={>={Stealth[round,sep,bend]}}]
+ { 1 -> 2 [minimum size=30pt] <- 3 <-> 4 --
+ 5 -- 6 -- [bend left] 7 -- 1 -- 4 };
+ "]]
+}
+
+
+
+-- The implementation
+
+function NecklaceRouting:run()
+ local ugraph = self.ugraph
+
+ for _,entry in ipairs(Hints.getNecklaceHints(ugraph)) do
+ assert (entry.center) -- no other necklace types, yet
+ local prev
+ for _,vertex in ipairs(entry.necklace) do
+ if prev then
+ local a = ugraph:arc(prev, vertex)
+ if a then
+ local p = Path.new()
+ p:appendMoveto(a.tail.pos:clone())
+ p:appendArcTo(a.head.pos:clone(), entry.center, entry.clockwise)
+ a.path = p
+ end
+ end
+ prev = vertex
+ end
+ end
+end
+
+
+-- done
+
+return NecklaceRouting
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/library.lua
new file mode 100644
index 0000000000..17c959d685
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/routing/library.lua
@@ -0,0 +1,29 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+-- Imports
+local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare
+
+---
+-- This library contains algorithms for routing edges through a graph.
+--
+-- @library
+
+local routing -- Library name
+
+-- Load declarations from:
+
+-- Load algorithms from:
+require "pgf.gd.routing.NecklaceRouting"
+
+
+-- General declarations
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/tools/make_gd_wrap.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/tools/make_gd_wrap.lua
new file mode 100644
index 0000000000..a0aee6501c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/tools/make_gd_wrap.lua
@@ -0,0 +1,183 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- This program generates a C wrap file around graph drawing
+-- algorithms. The idea is that when you have a graph drawing
+-- algorithm implemented in C and wish to invoke it from Lua, you need
+-- a wrapper that manages the translation between Lua and C. This
+-- program is intended to make it (reasonably) easy to produce such a
+-- wrapper.
+
+
+
+-- Sufficient number of arguments?
+
+if #arg < 4 or arg[1] == "-h" or arg[1] == "-?" or arg[1] == "--help" then
+ print([["
+Usage: make_gd_wrap library1 library2 ... libraryn template library_name target_c_file
+
+This program will read all of the graph drawing library files using
+Lua's require. Then, it will iterate over all declared algorithm keys
+(declared using declare { algorithm_written_in_c = ... }) and will
+produce the code for library for the required target C files based on
+the template.
+"]])
+ os.exit()
+end
+
+
+-- Imports
+
+local InterfaceToDisplay = require "pgf.gd.interface.InterfaceToDisplay"
+local InterfaceCore = require "pgf.gd.interface.InterfaceCore"
+
+
+-- Ok, setup:
+
+InterfaceToDisplay.bind(require "pgf.gd.bindings.Binding")
+
+
+-- Now, read all libraries:
+
+for i=1,#arg-3 do
+ require(arg[i])
+end
+
+
+-- Now, read the template:
+
+local file = io.open(arg[#arg-2])
+local template = file:read("*a")
+file:close()
+
+-- Let us grab the declaration:
+
+local functions_dec = (template:match("%$functions(%b{})") or ""):match("^{(.*)}$")
+local functions_reg_dec = (template:match("%$functions_registry(%b{})") or ""):match("^{(.*)}$")
+local factories_dec = (template:match("%$factories(%b{})") or ""):match("^{(.*)}$")
+local factories_reg_dec = (template:match("%$factories_registry(%b{})") or ""):match("^{(.*)}$")
+
+-- Now, handle all keys with a algorithm_written_in_c field
+
+local keys = InterfaceCore.keys
+local filename = arg[#arg]
+local target = arg[#arg-1]
+
+local includes = {}
+local functions = {}
+local functions_registry = {}
+
+local factories = {}
+local factories_reg = {}
+
+for _,k in ipairs(keys) do
+
+ if k.algorithm_written_in_c and k.code then
+
+ local library, fun_name = k.algorithm_written_in_c:match("(.*)%.(.*)")
+
+ if target == library then
+ -- First, gather the includes:
+ if type(k.includes) == "string" then
+ if not includes[k.includes] then
+ includes[#includes + 1] = k.includes
+ includes[k.includes] = true
+ end
+ elseif type(k.includes) == "table" then
+ for _,i in ipairs(k.includes) do
+ if not includes[i] then
+ includes[#includes + 1] = i
+ includes[i] = true
+ end
+ end
+ end
+
+ -- Second, create a code block:
+ functions[#functions+1] = functions_dec:gsub("%$([%w_]-)%b{}",
+ {
+ function_name = fun_name,
+ function_body = k.code
+ })
+
+ -- Third, create functions_registry entry
+ functions_registry[#functions_registry + 1] = functions_reg_dec:gsub("%$([%w_]-)%b{}",
+ {
+ function_name = fun_name,
+ function_body = k.code
+ })
+ end
+ end
+
+
+ if k.module_class then
+
+ -- First, gather the includes:
+ if type(k.includes) == "string" then
+ if not includes[k.includes] then
+ includes[#includes + 1] = k.includes
+ includes[k.includes] = true
+ end
+ elseif type(k.includes) == "table" then
+ for _,i in ipairs(k.includes) do
+ if not includes[i] then
+ includes[#includes + 1] = i
+ includes[i] = true
+ end
+ end
+ end
+
+ -- Second, create a code block:
+ factories[#factories+1] = factories_dec:gsub(
+ "%$([%w_]-)%b{}",
+ {
+ factory_class = k.module_class,
+ factory_code = k.code,
+ factory_base = k.module_base,
+ factory_name = k.module_class .. '_factory'
+ })
+
+ -- Third, create factories_registry entry
+ factories_reg[#factories_reg + 1] = factories_reg_dec:gsub(
+ "%$([%w_]-)%b{}",
+ {
+ factory_class = k.module_class,
+ factory_code = k.code,
+ factory_base = k.module_base,
+ factory_name = k.module_class .. '_factory'
+ })
+ end
+end
+
+
+local file = io.open(filename, "w")
+
+if not file then
+ print ("failed to open file " .. filename)
+ os.exit(-1)
+end
+
+file:write ((template:gsub(
+ "%$([%w_]-)%b{}",
+ {
+ factories = table.concat(factories, "\n\n"),
+ factories_registry = table.concat(factories_reg, "\n"),
+ functions = table.concat(functions, "\n\n"),
+ functions_registry = table.concat(functions_registry, "\n"),
+ includes = table.concat(includes, "\n"),
+ library_c_name = target:gsub("%.", "_"),
+ library_name = target
+ })))
+file:close()
+
+
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees.lua
new file mode 100644
index 0000000000..8c45e912dc
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees.lua
@@ -0,0 +1,21 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+--- @release $Header$
+
+
+local trees = {}
+
+-- Declare namespace
+require("pgf.gd").trees = tree
+
+
+-- Done
+
+return trees \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ChildSpec.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ChildSpec.lua
new file mode 100644
index 0000000000..5af3642885
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ChildSpec.lua
@@ -0,0 +1,225 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Specifying Missing Children}
+--
+-- \label{section-gd-missing-children}
+--
+-- In the present section we discuss keys for specifying missing children
+-- in a tree. For many certain kind of trees, in particular for binary
+-- trees, there are not just ``a certain number of children'' at each
+-- node, but, rather, there is a designated ``first'' (or ``left'') child
+-- and a ``second'' (or ``right'') child. Even if one of these children
+-- is missing and a node actually has only one child, the single child will
+-- still be a ``first'' or ``second'' child and this information should
+-- be taken into consideration when drawing a tree.
+--
+-- The first useful key for specifying missing children is
+-- |missing number of children| which allows you to state how many
+-- children there are, at minimum.
+--
+-- Once the minimum number of children has been set, we still need a way
+-- of specifying ``missing first children'' or, more generally, missing
+-- children that are not ``at the end'' of the list of children. For
+-- this, there are three methods:
+-- %
+-- \begin{enumerate}
+-- \item When you use the |child| syntax, you can use the |missing| key
+-- with the |child| command to indicate a missing child:
+-- %
+-- \begin{codeexample}[]
+-- \tikz [binary tree layout, level distance=5mm]
+-- \node {a}
+-- child { node {b}
+-- child { node {c}
+-- child { node {d} }
+-- } }
+-- child { node {e}
+-- child [missing]
+-- child { node {f}
+-- child [missing]
+-- child { node {g}
+-- } } };
+-- \end{codeexample}
+-- %
+-- \item When using the |graph| syntax, you can use an ``empty node'',
+-- which really must be completely empty and may not even contain a
+-- slash, to indicate a missing node:
+-- %
+-- \begin{codeexample}[]
+-- \tikz [binary tree layout, level distance=5mm]
+-- \graph { a -> { b -> c -> d, e -> { , f -> { , g} } } };
+-- \end{codeexample}
+-- %
+-- \item You can simply specify the index of a child directly using
+-- the key |desired child index|.
+-- \end{enumerate}
+--
+-- @end
+
+
+-- Imports
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+---
+--
+declare {
+ key = "minimum number of children",
+ type = "number",
+ initial = "0",
+
+ summary = [["
+ Specifies how many children a tree node must have at least. If
+ there are less, ``virtual'' children are added.
+ "]],
+ documentation = [["
+ When this key is set to |2| or more, the following happens: We first
+ compute a spanning tree for the graph, see
+ Section~\ref{subsection-gd-spanning-tree}. Then, whenever a node is
+ not a leaf in this spanning tree (when it has at least one child),
+ we add ``virtual'' or ``dummy'' nodes as children of the node until
+ the total number of real and dummy children is at least
+ \meta{number}. If there where at least \meta{number} children at the
+ beginning, nothing happens.
+
+ The new children are added after the existing children. This means
+ that, for instance, in a tree with \meta{number} set to |2|, for
+ every node with a single child, this child will be the first child
+ and the second child will be missing.
+ "]],
+ examples = [["
+ \tikz \graph [binary tree layout,level distance=5mm]
+ { a -> { b->c->d, e->f->g } };
+ "]]
+}
+
+---
+
+declare {
+ key = "desired child index",
+ type = "number",
+
+ summary = [["
+ Pass this key to a node to tell the graph drawing engine which child
+ number you ``desired'' for the node. Whenever all desires for the
+ children of a node are conflict-free, they will all be met; children
+ for which no desired indices were given will remain at their
+ position, whenever possible, but will ``make way'' for children with
+ a desired position.
+ "]],
+ documentation = [["
+ In detail, the following happens: We first
+ determine the total number of children (real or dummy) needed, which
+ is the maximum of the actual number of children, of the
+ \texttt{minimum number of children}, and of the highest desired
+ child index. Then we go over all children that have a desired child
+ index and put they at this position. If the position is already
+ taken (because some other child had the same desired index), the
+ next free position is used with a wrap-around occurring at the
+ end. Next, all children without a desired index are place using the
+ same mechanism, but they want to be placed at the position they had
+ in the original spanning tree.
+
+ While all of this might sound a bit complicated, the application of
+ the key in a binary tree is pretty straightforward: To indicate that
+ a node is a ``right'' child in a tree, just add \texttt{desired child index=2}
+ to it. This will make it a second child, possibly causing the fist
+ child to be missing. If there are two nodes specified as children of
+ a node, by saying \texttt{desired child index=}\meta{number} for one
+ of them, you will cause it be first or second child, depending on
+ \meta{number}, and cause the \emph{other} child to become the other
+ child.
+
+ Since |desired child index=2| is a bit long, the following shortcuts
+ are available: |first|, |second|, |third|, and |fourth|.
+ You might wonder why |second| is used rather than |right|. The
+ reason is that trees may also grow left and right and, additionally,
+ the |right| and |left| keys are already in use for
+ anchoring. Naturally, you can locally redefine them, if you want.
+ "]],
+ examples = {[["
+ \tikz \graph [binary tree layout, level distance=5mm]
+ { a -> b[second] };
+ "]],[["
+ \tikz \graph [binary tree layout, level distance=5mm]
+ { a -> { b[second], c} };
+ "]],[["
+ \tikz \graph [binary tree layout, level distance=5mm]
+ { a -> { b, c[first]} };
+ "]],[["
+ \tikz \graph [binary tree layout, level distance=5mm]
+ { a -> { b[second], c[second]} };
+ "]],[["
+ \tikz \graph [binary tree layout, level distance=5mm]
+ { a -> { b[third], c[first], d} };
+ "]]
+ }
+}
+
+
+---
+
+declare {
+ key = "first",
+ use = {
+ { key = "desired child index", value = 1},
+ },
+
+ summary = [["
+ A shorthand for setting the desired child number to |1|.
+ "]]
+ }
+
+---
+
+declare {
+ key = "second",
+ use = {
+ { key = "desired child index", value = 2},
+ },
+
+ summary = [["
+ A shorthand for setting the desired child number to |2|.
+ "]]
+ }
+
+
+---
+
+declare {
+ key = "third",
+ use = {
+ { key = "desired child index", value = 3},
+ },
+
+ summary = [["
+ A shorthand for setting the desired child number to |3|.
+ "]]
+ }
+
+
+---
+
+declare {
+ key = "fourth",
+ use = {
+ { key = "desired child index", value = 4}
+ },
+
+ summary = [["
+ A shorthand for setting the desired child number to |4|.
+ "]]
+ }
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ReingoldTilford1981.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ReingoldTilford1981.lua
new file mode 100644
index 0000000000..69babd443c
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/ReingoldTilford1981.lua
@@ -0,0 +1,211 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsubsection {The Reingold--Tilford Layout}
+--
+-- @end
+
+local ReingoldTilford1981 = {}
+
+-- Imports
+local layered = require "pgf.gd.layered"
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+local Storage = require "pgf.gd.lib.Storage"
+
+---
+declare {
+ key = "tree layout",
+ algorithm = ReingoldTilford1981,
+
+ preconditions = {
+ connected = true,
+ tree = true
+ },
+
+ postconditions = {
+ upward_oriented = true
+ },
+
+ documentation_in = "pgf.gd.trees.doc"
+}
+
+
+---
+declare {
+ key = "missing nodes get space",
+ type = "boolean",
+ documentation_in = "pgf.gd.trees.doc"
+}
+
+
+
+---
+declare {
+ key = "significant sep",
+ type = "length",
+ initial = "0",
+ documentation_in = "pgf.gd.trees.doc"
+}
+
+
+---
+declare {
+ key = "binary tree layout",
+ use = {
+ { key = "tree layout" },
+ { key = "minimum number of children" , value=2 },
+ { key = "significant sep", value = 10 },
+ },
+ documentation_in = "pgf.gd.trees.doc"
+}
+
+---
+declare {
+ key = "extended binary tree layout",
+ use = {
+ { key = "tree layout" },
+ { key = "minimum number of children" , value=2 },
+ { key = "missing nodes get space" },
+ { key = "significant sep", value = 0 },
+ },
+ documentation_in = "pgf.gd.trees.doc"
+}
+
+
+
+
+-- Now comes the implementation:
+
+function ReingoldTilford1981:run()
+
+ local root = self.spanning_tree.root
+
+ local layers = Storage.new()
+ local descendants = Storage.new()
+
+ self.extended_version = self.digraph.options['missing nodes get space']
+
+ self:precomputeDescendants(root, 1, layers, descendants)
+ self:computeHorizontalPosition(root, layers, descendants)
+ layered.arrange_layers_by_baselines(layers, self.adjusted_bb, self.ugraph)
+
+end
+
+
+function ReingoldTilford1981:precomputeDescendants(node, depth, layers, descendants)
+ local my_descendants = { node }
+
+ for _,arc in ipairs(self.spanning_tree:outgoing(node)) do
+ local head = arc.head
+ self:precomputeDescendants(head, depth+1, layers, descendants)
+ for _,d in ipairs(descendants[head]) do
+ my_descendants[#my_descendants + 1] = d
+ end
+ end
+
+ layers[node] = depth
+ descendants[node] = my_descendants
+end
+
+
+
+function ReingoldTilford1981:computeHorizontalPosition(node, layers, descendants)
+
+ local children = self.spanning_tree:outgoing(node)
+
+ node.pos.x = 0
+
+ local child_depth = layers[node] + 1
+
+ if #children > 0 then
+ -- First, compute positions for all children:
+ for i=1,#children do
+ self:computeHorizontalPosition(children[i].head, layers, descendants)
+ end
+
+ -- Now, compute minimum distances and shift them
+ local right_borders = {}
+
+ for i=1,#children-1 do
+
+ local local_right_borders = {}
+
+ -- Advance "right border" of the subtree rooted at
+ -- the i-th child
+ for _,d in ipairs(descendants[children[i].head]) do
+ local layer = layers[d]
+ local x = d.pos.x
+ if self.extended_version or not (layer > child_depth and d.kind == "dummy") then
+ if not right_borders[layer] or right_borders[layer].pos.x < x then
+ right_borders[layer] = d
+ end
+ if not local_right_borders[layer] or local_right_borders[layer].pos.x < x then
+ local_right_borders[layer] = d
+ end
+ end
+ end
+
+ local left_borders = {}
+ -- Now left for i+1 st child
+ for _,d in ipairs(descendants[children[i+1].head]) do
+ local layer = layers[d]
+ local x = d.pos.x
+ if self.extended_version or not (layer > child_depth and d.kind == "dummy") then
+ if not left_borders[layer] or left_borders[layer].pos.x > x then
+ left_borders[layer] = d
+ end
+ end
+ end
+
+ -- Now walk down the lines and try to find out what the minimum
+ -- distance needs to be.
+
+ local shift = -math.huge
+ local first_dist = left_borders[child_depth].pos.x - local_right_borders[child_depth].pos.x
+ local is_significant = false
+
+ for layer,n2 in pairs(left_borders) do
+ local n1 = right_borders[layer]
+ if n1 then
+ shift = math.max(
+ shift,
+ layered.ideal_sibling_distance(self.adjusted_bb, self.ugraph, n1, n2) + n1.pos.x - n2.pos.x
+ )
+ end
+ if local_right_borders[layer] then
+ if layer > child_depth and
+ (left_borders[layer].pos.x - local_right_borders[layer].pos.x <= first_dist) then
+ is_significant = true
+ end
+ end
+ end
+
+ if is_significant then
+ shift = shift + self.ugraph.options['significant sep']
+ end
+
+ -- Shift all nodes in the subtree by shift:
+ for _,d in ipairs(descendants[children[i+1].head]) do
+ d.pos.x = d.pos.x + shift
+ end
+ end
+
+ -- Finally, position root in the middle:
+ node.pos.x = (children[1].head.pos.x + children[#children].head.pos.x) / 2
+ end
+end
+
+
+
+return ReingoldTilford1981 \ No newline at end of file
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/SpanningTreeComputation.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/SpanningTreeComputation.lua
new file mode 100644
index 0000000000..8951ce0538
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/SpanningTreeComputation.lua
@@ -0,0 +1,643 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- @section subsection {Spanning Tree Computation}
+--
+-- \label{subsection-gd-spanning-tree}
+-- Although the algorithms of this library are tailored to layout trees,
+-- they will work for any graph as input. First, if the graph is not
+-- connected, it is decomposed into connected components and these are
+-- laid out individually. Second, for each component, a spanning tree of
+-- the graph is computed first and the layout is computed for this
+-- spanning tree; all other edges will still be drawn, but they have no
+-- impact on the placement of the nodes. If the graph is already a tree,
+-- the spanning tree will be the original graph.
+--
+-- The computation of the spanning tree is a non-trivial process since
+-- a non-tree graph has many different possible spanning trees. You can
+-- choose between different methods for deciding on a spanning tree, it
+-- is even possible to implement new algorithms. (In the future, the
+-- computation of spanning trees and the cycle removal in layered graph
+-- drawing algorithms will be unified, but, currently, they are
+-- implemented differently.)
+--
+-- Selects the (sub)algorithm that is to be used for computing spanning
+-- trees whenever this is requested by a tree layout algorithm. The
+-- default algorithm is |breadth first spanning tree|.
+--
+--\begin{codeexample}[]
+--\tikz \graph [tree layout, breadth first spanning tree]
+--{
+-- 1 -- {2,3,4,5} -- 6;
+--};
+--\end{codeexample}
+--\begin{codeexample}[]
+--\tikz \graph [tree layout, depth first spanning tree]
+--{
+-- 1 --[bend right] {2,3,4,5 [>bend left]} -- 6;
+--};
+--\end{codeexample}
+--
+-- @end
+
+local SpanningTreeComputation = {}
+
+
+
+-- Namespace
+require("pgf.gd.trees").SpanningTreeComputation = SpanningTreeComputation
+
+
+-- Imports
+local lib = require "pgf.gd.lib"
+
+local Vertex = require "pgf.gd.model.Vertex"
+local Digraph = require "pgf.gd.model.Digraph"
+
+
+local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare
+
+
+
+
+-- ------------------------- --
+-- General tree parameters --
+-- ------------------------- --
+
+
+
+
+---
+--
+declare {
+ key = "breadth first spanning tree",
+ algorithm = {
+ run =
+ function (self)
+ return SpanningTreeComputation.computeSpanningTree(self.ugraph, false, self.events)
+ end
+ },
+ phase = "spanning tree computation",
+ phase_default = true,
+
+ summary = [["
+ This key selects ``breadth first'' as the (sub)algorithm for
+ computing spanning trees. Note that this key does not cause a graph
+ drawing scope to start; the key only has an effect in conjunction
+ with keys like |tree layout|.
+"]],
+ documentation = [["
+ The algorithm will be called whenever a graph drawing algorithm
+ needs a spanning tree on which to operate. It works as follows:
+ %
+ \begin{enumerate}
+ \item It looks for a node for which the |root| parameter is
+ set. If there are several such nodes, the first one is used.
+ If there are no such nodes, the first node is used.
+
+ Let call the node determined in this way the \emph{root node}.
+ \item For every edge, a \emph{priority} is determined, which is a
+ number between 1 and 10. How this happens, exactly, will be
+ explained in a moment. Priority 1 means ``most important'' while
+ priority 10 means ``least important''.
+ \item Starting from the root node, we now perform a breadth first
+ search through the tree, thereby implicitly building a spanning
+ tree: Suppose for a moment that all edges have priority~1. Then,
+ the algorithm works just the way that a normal breadth first
+ search is performed: We keep a queue of to-be-visited nodes and
+ while this queue is not empty, we remove its first node. If this
+ node has not yet been visited, we add all its neighbors at the
+ end of the queue. When a node is taken out of the queue, we make
+ it the child of the node whose neighbor it was when it was
+ added. Since the queue follows the ``first in, first out''
+ principle (it is a fifo queue), the children of the root will be
+ all nodes at distance $1$ form the root, their children will be
+ all nodes at distance $2$, and so on.
+ \item Now suppose that some edges have a priority different
+ from~1, in which case things get more complicated. We now keep
+ track of one fifo queue for each of the ten possible
+ priorities. When we consider the neighbors of a node, we actually
+ consider all its incident edges. Each of these edges has a certain
+ priority and the neighbor is put into the queue of the edge's
+ priority. Now, we still remove nodes normally from the queue for
+ priority~1; only if this queue is empty and there is still a node
+ in the queue for priority~2 we remove the first element from this
+ queue (and proceed as before). If the second queue is also empty,
+ we try the third, and so on up to the tenth queue. If all queues
+ are empty, the algorithm stops.
+ \end{enumerate}
+
+ The effect of the ten queues is the following: If the edges of
+ priority $1$ span the whole graph, a spanning tree consisting solely
+ of these edges will be computed. However, if they do not, once we
+ have visited reachable using only priority 1 edges, we will extend
+ the spanning tree using a priority 2 edge; but then we once switch
+ back to using only priority 1 edges. If neither priority~1 nor
+ priority~2 edges suffice to cover the whole graph, priority~3 edges
+ are used, and so on.
+ "]]
+}
+
+---
+
+declare {
+ key = "depth first spanning tree",
+ algorithm = {
+ run =
+ function (self)
+ return SpanningTreeComputation.computeSpanningTree(self.ugraph, true, self.events)
+ end
+ },
+ phase = "spanning tree computation",
+
+ summary = [["
+ Works exactly like |breadth first spanning tree| (same handling of
+ priorities), only the queues are now lifo instead of
+ fifo.
+ "]]
+}
+
+---
+--
+declare {
+ key = "root",
+ type = "boolean",
+ default = true,
+
+ summary = [["
+ This Boolean parameter is used in the computation of spanning
+ trees. When can be set for a node, this node will be used as the
+ root for the spanning tree computation. If several nodes have this
+ option set, the first node will be used.
+ "]]
+}
+
+
+---
+--
+declare {
+ key = "span priority",
+ type = "number",
+
+ summary = [["
+ Explicitly sets the ``span priority'' of an edge to \meta{number}, which must be
+ a number between |1| and |10|. The priority of edges is used by
+ spanning tree computations, see |breadth first spanning tree|.
+ "]]
+}
+
+
+
+---
+-- when it comes to choosing which edges are part of the spanning tree.
+declare {
+ key = "span edge",
+ use = {
+ { key = "span priority", value = 1 },
+ },
+
+ summary = [["
+ An easy-to-remember shorthand for |span priority=1|. When this key
+ is used with an edge, it will always be preferred over other edges
+ "]]
+}
+
+
+
+
+---
+--
+declare {
+ key = "no span edge",
+ use = {
+ { key = "span priority", value = 10 },
+ },
+
+ summary = [["
+ An easy-to-remember shorthand for |span priority=10|. This causes
+ the edge to be used only as a last resort as part of a spanning
+ tree.
+ "]],
+ documentation = [["
+ In the example, we add lots of edges that would normally be
+ preferred in the computation of the spanning tree, but use
+ |no span edge| to cause the algorithm to ignore these edges.
+ "]],
+ examples = [["
+ \tikz \graph [tree layout, nodes={draw}, sibling distance=0pt,
+ every group/.style={
+ default edge kind=->, no span edge,
+ path=source}]
+ {
+ 5 -> {
+ "1,3" -> {0,2,4},
+ 11 -> {
+ "7,9" -> { 6, 8, 10 }
+ }
+ }
+ };
+ "]]
+}
+
+
+
+---
+declare {
+ key = "span priority ->",
+ type = "number",
+ initial = "3",
+
+ summary = [["
+ This key stores the span priority of all edges whose direction is
+ |->|. There are similar keys for all other directions, such as
+ |span priority <-| and so on.
+ "]],
+ documentation = [["
+ When you write
+ %
+\begin{codeexample}[code only]
+graph { a -> b -- c <- [span priority=2] d }
+\end{codeexample}
+ %
+ the priority of the edge from |a| to |b| would be the current
+ value of the key |span priority ->|, the priority of the edge from
+ |b| to |c| would be the current value of |span priority --|, and
+ the priority of the edge from |c| to |d| would be |2|, regardless
+ of the value of |span priority <-|.
+
+ The defaults for the priorities are:
+ %
+ \begin{itemize}
+ \item |span priority -> = 3|
+ \item |span priority -- = 5|
+ \item |span priority <-> = 5|
+ \item |span priority <- = 8|
+ \item |span priority -!- = 10|
+ \end{itemize}
+ "]]
+}
+
+
+
+---
+
+declare {
+ key = "span priority reversed ->",
+ type = "number",
+ initial = "9",
+
+ documentation = [["
+ This key stores the span priority of traveling across reversed
+ edges whose actual direction is |->| (again, there are similar keys
+ for all other directions).
+ "]],
+ documentation = [["
+ When you write
+ %
+\begin{codeexample}[code only]
+graph { a -> b -- c <- [span priority=2] d }
+\end{codeexample}
+ %
+ there are, in addition to the priorities indicated above, also
+ further edge priorities: The priority of the (reversed) edge |b|
+ to |a| is |span priority reversed ->|, the priority of the
+ (reversed) edge |c| to |b| is |span priority reversed --|, and the
+ span priority of the reversed edge |d| to |c| is |2|, regardless
+ of the value of |span priority reversed <-|.
+
+ The defaults for the priorities are:
+ %
+ \begin{itemize}
+ \item |span priority reversed -> = 9|
+ \item |span priority reversed -- = 5|
+ \item |span priority reversed <-> = 5|
+ \item |span priority reversed <- = 7|
+ \item |span priority reversed -!- = 10|
+ \end{itemize}
+
+ The default priorities are set in such a way, that non-reversed |->|
+ edges have top priorities, |--| and |<->| edges have the same
+ priorities in either direction, and |<-| edges have low priority in
+ either direction (but going |a <- b| from |b| to |a| is given higher
+ priority than going from |a| to |b| via this edge and also higher
+ priority than going from |b| to |a| in |a -> b|).
+
+ Keys like |span using directed| change the priorities ``en bloc''.
+ "]]
+}
+
+
+declare {
+ key = "span priority <-",
+ type = "number",
+ initial = "8",
+}
+
+declare {
+ key = "span priority reversed <-",
+ type = "number",
+ initial = "7",
+}
+
+declare {
+ key = "span priority --",
+ type = "number",
+ initial = "5",
+}
+
+declare {
+ key = "span priority reversed --",
+ type = "number",
+ initial = "5",
+}
+
+declare {
+ key = "span priority <->",
+ type = "number",
+ initial = "5",
+}
+
+declare {
+ key = "span priority reversed <->",
+ type = "number",
+ initial = "5",
+}
+
+declare {
+ key = "span priority -!-",
+ type = "number",
+ initial= "10",
+}
+
+declare {
+ key = "span priority reversed -!-",
+ type = "number",
+ initial= "10",
+}
+
+---
+
+declare {
+ key = "span using directed",
+ use = {
+ { key = "span priority reversed <-", value = 3},
+ { key = "span priority <->", value = 3},
+ { key = "span priority reversed <->", value = 3},
+ },
+ summary = [["
+ This style sets a priority of |3| for all edges that are directed
+ and ``go along the arrow direction'', that is, we go from |a| to
+ |b| with a priority of |3| for the cases |a -> b|, |b <- a|,
+ |a <-> b|, and |b <-> a|.
+ This strategy is nice with trees specified with both forward and
+ backward edges.
+ "]],
+ examples = [["
+ \tikz \graph [tree layout, nodes={draw}, sibling distance=0pt,
+ span using directed]
+ {
+ 3 <- 5[root] -> 8,
+ 1 <- 3 -> 4,
+ 7 <- 8 -> 9,
+ 1 -- 4 -- 7 -- 9
+ };
+ "]]
+}
+
+---
+
+declare {
+ key = "span using all",
+ use = {
+ { key = "span priority <-", value = 5},
+ { key = "span priority ->", value = 5},
+ { key = "span priority <->", value = 5},
+ { key = "span priority --", value = 5},
+ { key = "span priority -!-", value = 5},
+ { key = "span priority reversed <-", value = 5},
+ { key = "span priority reversed ->", value = 5},
+ { key = "span priority reversed <->", value = 5},
+ { key = "span priority reversed --", value = 5},
+ { key = "span priority reversed -!-", value = 5},
+ },
+
+ summary = [["
+ Assings a uniform priority of 5 to all edges.
+ "]]
+}
+
+
+-- The implementation
+
+--
+-- Compute a spanning tree of a graph
+--
+-- The algorithm will favor nodes according to their priority. This is
+-- determined through an edge priority function.
+--
+-- @param ugraph An undirected graph for which the spanning tree
+-- should be computed
+-- @param dfs True if depth first should be used, false if breadth
+-- first should be used.
+--
+-- @return A new graph that is a spanning tree.
+
+function SpanningTreeComputation.computeSpanningTree (ugraph, dfs, events)
+
+ local tree = Digraph.new (ugraph) -- copy vertices
+
+ local edge_priorities = ugraph.options['/graph drawing/edge priorities']
+
+ local root = lib.find(ugraph.vertices, function (v) return v.options['root'] end) or ugraph.vertices[1]
+
+ -- Traverse tree, giving preference to directed edges and, that
+ -- failing, to undirected and bidirected edges, and, that failing,
+ -- all other edges.
+ local marked = {}
+
+ local stacks = { -- 10 stacks for 10 priorities, with 1 being the highest
+ { { parent = nil, node = root}, top = 1, bottom = 1 },
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1},
+ { top = 0, bottom = 1}
+ }
+
+ local function stack_is_non_empty (s) return s.top >= s.bottom end
+
+ while lib.find(stacks, stack_is_non_empty) do
+ local parent, node
+
+ for _,stack in ipairs(stacks) do
+ if stack_is_non_empty(stack) then
+ -- Pop
+ parent = stack[stack.top].parent
+ node = stack[stack.top].node
+
+ stack[stack.top] = nil
+ stack.top = stack.top - 1
+
+ break
+ end
+ end
+
+ if not marked[node] then
+
+ -- The node is good!
+ marked[node] = true
+
+ if parent then
+ tree:connect(parent,node)
+ end
+
+ local arcs = ugraph:outgoing(node)
+
+ for j=1,#arcs do
+ local arc = arcs[dfs and j or #arcs - j + 1]
+ local head = arc.head
+
+ if not marked[head] then
+ local priority = arc:spanPriority()
+ local stack = assert(stacks[priority], "illegal edge priority")
+ if dfs then
+ stack.top = stack.top + 1
+ stack[stack.top] = { parent = node, node = head}
+ else
+ stack.bottom = stack.bottom - 1
+ stack[stack.bottom] = { parent = node, node = head}
+ end
+ end
+ end
+ end
+ end
+
+ -- Now, copy vertex list
+ local copy = {}
+ for i,v in ipairs(tree.vertices) do
+ copy[i] = v
+ end
+
+ -- Now, setup child lists
+ for _,v in ipairs(copy) do
+
+ -- Children as they come from the spanning tree computation
+ tree:sortOutgoing(v, function (a,b) return a:eventIndex() < b:eventIndex() end)
+ local outgoings = tree:outgoing(v)
+
+ -- Compute children as they come in the event list:
+ local children = {}
+
+ local i = (v.event.index or 0)+1
+ while i <= #events and events[i].kind == "edge" do
+ i = i + 1
+ end
+
+ if events[i] and events[i].kind == "begin" and events[i].parameters == "descendants" then
+ -- Ok, the node is followed by a descendants group
+ -- Now scan for nodes that are not inside a descendants group
+ local stop = events[i].end_index
+ local j = i+1
+ while j <= stop do
+ if events[j].kind == "node" then
+ children[#children+1] = events[j].parameters
+ elseif events[j].kind == "begin" and events[j].parameters == "descendants" then
+ j = events[j].end_index
+ end
+ j = j + 1
+ end
+
+ -- Test, whether outgoings and children contain the same nodes:
+ local function same_elements()
+ local hash = {}
+ for v,c in ipairs(outgoings) do
+ hash[c.head] = true
+ end
+ local count = 0
+ for _,c in pairs(children) do
+ if c ~= "" then
+ count = count + 1
+ if not hash[c] or count > #outgoings then
+ return false
+ end
+ end
+ end
+ return count == #outgoings
+ end
+
+ if same_elements() and #outgoings > 0 then
+ -- increase number of children, if necessary
+ local needed = math.max(#children, lib.lookup_option('minimum number of children', v, ugraph))
+ for i=1,#children do
+ if children[i] ~= "" then
+ local d = children[i].options['desired child index']
+ needed = d and math.max(needed, d) or needed
+ end
+ end
+
+ local new_children = {}
+ for i=1,#children do
+ if children[i] ~= "" then
+ local d = children[i].options['desired child index']
+ if d then
+ local target = d
+
+ while new_children[target] do
+ target = 1 + (target % #children)
+ end
+ new_children[target] = children[i]
+ end
+ end
+ end
+ for i=1,#children do
+ if children[i] ~= "" then
+ local d = children[i].options['desired child index']
+ if not d then
+ local target = i
+
+ while new_children[target] do
+ target = 1 + (target % #children)
+ end
+ new_children[target] = children[i]
+ end
+ end
+ end
+ for i=1,needed do
+ if not new_children[i] then
+ local new_child = Vertex.new{ kind = "dummy" }
+ new_children[i] = new_child
+ tree:add {new_child}
+ tree:connect(v,new_child)
+ end
+ end
+
+ tree:orderOutgoing(v,new_children)
+ end
+ end
+ end
+
+ tree.root = root
+
+ return tree
+end
+
+
+
+-- Done
+
+return SpanningTreeComputation
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/doc.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/doc.lua
new file mode 100644
index 0000000000..169c7ff5e1
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/doc.lua
@@ -0,0 +1,331 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+local key = require 'pgf.gd.doc'.key
+local documentation = require 'pgf.gd.doc'.documentation
+local summary = require 'pgf.gd.doc'.summary
+local example = require 'pgf.gd.doc'.example
+
+
+--------------------------------------------------------------------
+key "tree layout"
+
+summary "This layout uses the Reingold--Tilform method for drawing trees."
+
+documentation
+[[
+The Reingold--Tilford method is a standard method for drawing
+trees. It is described in:
+%
+\begin{itemize}
+ \item
+ E.~M.\ Reingold and J.~S.\ Tilford,
+ \newblock Tidier drawings of trees,
+ \newblock \emph{IEEE Transactions on Software Engineering,}
+ 7(2), 223--228, 1981.
+\end{itemize}
+%
+My implementation in |graphdrawing.trees| follows the following paper, which
+introduces some nice extensions of the basic algorithm:
+%
+\begin{itemize}
+ \item
+ A.\ Br\"uggemann-Klein, D.\ Wood,
+ \newblock Drawing trees nicely with \TeX,
+ \emph{Electronic Publishing,} 2(2), 101--115, 1989.
+\end{itemize}
+%
+As a historical remark, Br\"uggemann-Klein and Wood have implemented
+their version of the Reingold--Tilford algorithm directly in \TeX\
+(resulting in the Tree\TeX\ style). With the power of Lua\TeX\ at
+our disposal, the 2012 implementation in the |graphdrawing.tree|
+library is somewhat more powerful and cleaner, but it really was an
+impressive achievement to implement this algorithm back in 1989
+directly in \TeX.
+
+The basic idea of the Reingold--Tilford algorithm is to use the
+following rules to position the nodes of a tree (the following
+description assumes that the tree grows downwards, other growth
+directions are handled by the automatic orientation mechanisms of
+the graph drawing library):
+%
+\begin{enumerate}
+ \item For a node, recursively compute a layout for each of its children.
+ \item Place the tree rooted at the first child somewhere on the page.
+ \item Place the tree rooted at the second child to the right of the
+ first one as near as possible so that no two nodes touch (and such
+ that the |sibling sep| padding is not violated).
+ \item Repeat for all subsequent children.
+ \item Then place the root above the child trees at the middle
+ position, that is, at the half-way point between the left-most and
+ the right-most child of the node.
+\end{enumerate}
+%
+The standard keys |level distance|, |level sep|, |sibling distance|,
+and |sibling sep|, as well as the |pre| and |post| versions of these
+keys, as taken into consideration when nodes are positioned. See also
+Section~\ref{subsection-gd-dist-pad} for details on these keys.
+
+\noindent\textbf{Handling of Missing Children.}
+As described in Section~\ref{section-gd-missing-children}, you can
+specify that some child nodes are ``missing'' in the tree, but some
+space should be reserved for them. This is exactly what happens:
+When the subtrees of the children of a node are arranged, each
+position with a missing child is treated as if a zero-width,
+zero-height subtree were present at that positions:
+%
+\begin{codeexample}[]
+\tikz [tree layout, nodes={draw,circle}]
+ \node {r}
+ child { node {a}
+ child [missing]
+ child { node {b} }
+ }
+ child[missing];
+\end{codeexample}
+%
+or in |graph| syntax:
+%
+\begin{codeexample}[]
+ \tikz \graph [tree layout, nodes={draw,circle}]
+ {
+ r -> {
+ a -> {
+ , %missing
+ b},
+ % missing
+ }
+ };
+\end{codeexample}
+%
+More than one child can go missing:
+%
+\begin{codeexample}[]
+\tikz \graph [tree layout, nodes={draw,circle}, sibling sep=0pt]
+ { r -> { a, , ,b -> {c,d}, ,e} };
+\end{codeexample}
+%
+Although missing children are taken into consideration for the
+computation of the placement of the children of a root node relative
+to one another and also for the computation of the position of the
+root node, they are usually \emph{not} considered as part of the
+``outline'' of a subtree (the \texttt{minimum number of children}
+key ensures that |b|, |c|, |e|, and |f| all have a missing right
+child):
+%
+\begin{codeexample}[]
+\tikz \graph [tree layout, minimum number of children=2,
+ nodes={draw,circle}]
+ { a -> { b -> c -> d, e -> f -> g } };
+\end{codeexample}
+%
+This behaviour of ``ignoring'' missing children in later stages of
+the recursion can be changed using the key |missing nodes get space|.
+
+\noindent\textbf{Significant Pairs of Siblings.}
+Br\"uggemann-Klein and Wood have proposed an extension of the
+Reingold--Tilford method that is intended to better highlight the
+overall structure of a tree. Consider the following two trees:
+%
+\begin{codeexample}[]
+\tikz [baseline=(a.base), tree layout, minimum number of children=2,
+ sibling distance=5mm, level distance=5mm]
+ \graph [nodes={circle, inner sep=0pt, minimum size=2mm, fill, as=}]{
+ a -- { b -- c -- { d -- e, f -- { g, h }}, i -- j -- k[second] }
+ };\quad
+\tikz [baseline=(a.base), tree layout, minimum number of children=2,
+ sibling distance=5mm, level distance=5mm]
+ \graph [nodes={circle, inner sep=0pt, minimum size=2mm, fill, as=}]{
+ a -- { b -- c -- d -- e, i -- j -- { f -- {g,h}, k } }
+ };
+\end{codeexample}
+%
+As observed by Br\"uggemann-Klein and Wood, the two trees are
+structurally quite different, but the Reingold--Tilford method
+places the nodes at exactly the same positions and only one edge
+``switches'' positions. In order to better highlight the differences
+between the trees, they propose to add a little extra separation
+between siblings that form a \emph{significant pair}. They define
+such a pair as follows: Consider the subtrees of two adjacent
+siblings. There will be one or more levels where these subtrees have
+a minimum distance. For instance, the following two trees the
+subtrees of the nodes |a| and |b| have a minimum distance only at
+the top level in the left example, and in all levels in the second
+example. A \emph{significant pair} is a pair of siblings where the
+minimum distance is encountered on any level other than the first
+level. Thus, in the first example there is no significant pair,
+while in the second example |a| and |b| form such a pair.
+%
+\begin{codeexample}[]
+\tikz \graph [tree layout, minimum number of children=2,
+ level distance=5mm, nodes={circle,draw}]
+ { / -> { a -> / -> /, b -> /[second] -> /[second] }};
+ \quad
+\tikz \graph [tree layout, minimum number of children=2,
+ level distance=5mm, nodes={circle,draw}]
+ { / -> { a -> / -> /, b -> / -> / }};
+\end{codeexample}
+%
+Whenever the algorithm encounters a significant pair, it adds extra
+space between the siblings as specified by the |significant sep|
+key.
+]]
+
+
+example
+[[
+\tikz [tree layout, sibling distance=8mm]
+ \graph [nodes={circle, draw, inner sep=1.5pt}]{
+ 1 -- { 2 -- 3 -- { 4 -- 5, 6 -- { 7, 8, 9 }}, 10 -- 11 -- { 12, 13 } }
+ };
+]]
+
+
+example
+[[
+\tikz [tree layout, grow=-30,
+ sibling distance=0mm, level distance=0mm,]
+ \graph [nodes={circle, draw, inner sep=1.5pt}]{
+ 1 -- { 2 -- 3 -- { 4 -- 5, 6 -- { 7, 8, 9 }}, 10 -- 11 -- { 12, 13 } }
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "missing nodes get space"
+
+summary
+[[
+When set to true, missing children are treated as if they where
+zero-width, zero-height nodes during the whole tree layout process.
+]]
+
+
+example
+[[
+\tikz \graph [tree layout, missing nodes get space,
+ minimum number of children=2, nodes={draw,circle}]
+{ a -> { b -> c -> d, e -> f -> g } };
+]]
+--------------------------------------------------------------------
+
+
+
+
+
+--------------------------------------------------------------------
+key "significant sep"
+
+summary
+[[
+This space is added to significant pairs by the modified
+Reingold--Tilford algorithm.
+]]
+
+example
+[[
+\tikz [baseline=(a.base), tree layout, significant sep=1em,
+ minimum number of children=2,
+ sibling distance=5mm, level distance=5mm]
+ \graph [nodes={circle, inner sep=0pt, minimum size=2mm, fill, as=}]{
+ a -- { b -- c -- { d -- e, f -- { g, h }}, i -- j -- k[second] }
+ };\quad
+\tikz [baseline=(a.base), tree layout, significant sep=1em,
+ minimum number of children=2,
+ sibling distance=5mm, level distance=5mm]
+ \graph [nodes={circle, inner sep=0pt, minimum size=2mm, fill, as=}]{
+ a -- { b -- c -- d -- e, i -- j -- { f -- {g,h}, k } }
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "binary tree layout"
+
+summary
+[[
+A layout based on the Reingold--Tilford method for drawing
+binary trees.
+]]
+
+documentation
+[[
+This key executes:
+%
+\begin{enumerate}
+ \item |tree layout|, thereby selecting the Reingold--Tilford method,
+ \item |minimum number of children=2|, thereby ensuring the all nodes
+ have (at least) two children or none at all, and
+ \item |significant sep=10pt| to highlight significant pairs.
+\end{enumerate}
+%
+In the examples, the last one is taken from the paper of
+Br\"uggemann-Klein and Wood. It demonstrates nicely the
+advantages of having the full power of \tikzname's anchoring and the
+graph drawing engine's orientation mechanisms at one's disposal.
+]]
+
+
+example
+[[
+\tikz [grow'=up, binary tree layout, sibling distance=7mm, level distance=7mm]
+ \graph {
+ a -- { b -- c -- { d -- e, f -- { g, h }}, i -- j -- k[second] }
+ };
+]]
+
+example
+[[
+\tikz \graph [binary tree layout] {
+ Knuth -> {
+ Beeton -> Kellermann [second] -> Carnes,
+ Tobin -> Plass -> { Lamport, Spivak }
+ }
+};\qquad
+\tikz [>=spaced stealth']
+ \graph [binary tree layout, grow'=right, level sep=1.5em,
+ nodes={right, fill=blue!50, text=white, chamfered rectangle},
+ edges={decorate,decoration={snake, post length=5pt}}]
+ {
+ Knuth -> {
+ Beeton -> Kellermann [second] -> Carnes,
+ Tobin -> Plass -> { Lamport, Spivak }
+ }
+ };
+]]
+--------------------------------------------------------------------
+
+
+
+--------------------------------------------------------------------
+key "extended binary tree layout"
+
+summary
+[[
+This algorithm is similar to |binary tree layout|, only the
+option \texttt{missing nodes get space} is executed and the
+\texttt{significant sep} is zero.
+]]
+
+example
+[[
+\tikz [grow'=up, extended binary tree layout,
+ sibling distance=7mm, level distance=7mm]
+ \graph {
+ a -- { b -- c -- { d -- e, f -- { g, h }}, i -- j -- k[second] }
+ };
+]]
+--------------------------------------------------------------------
diff --git a/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/library.lua b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/library.lua
new file mode 100644
index 0000000000..a0019666ac
--- /dev/null
+++ b/graphics/pgf/base/lua/graphdrawing/pgf/gd/trees/library.lua
@@ -0,0 +1,35 @@
+-- Copyright 2012 by Till Tantau
+--
+-- This file may be distributed an/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 information
+
+-- @release $Header$
+
+
+
+---
+-- \tikzname\ offers several different syntax to specify trees (see
+-- Sections \ref{section-library-graphs}
+-- and~\ref{section-trees}). The job of the graph drawing algorithms from
+-- this library is to turn the specification of trees into beautiful
+-- layouts.
+--
+-- We start this section with a description of algorithms, then we have a
+-- look at how missing children can be specified and at what happens when
+-- the input graph is not a tree.
+--
+-- @library
+
+local trees -- Library name
+
+-- Load declarations from:
+require "pgf.gd.trees.ChildSpec"
+require "pgf.gd.trees.SpanningTreeComputation"
+
+-- Load algorithms from:
+require "pgf.gd.trees.ReingoldTilford1981"
+
diff --git a/graphics/pgf/base/lua/luamath/pgf/luamath/functions.lua b/graphics/pgf/base/lua/luamath/pgf/luamath/functions.lua
new file mode 100644
index 0000000000..367d6ae298
--- /dev/null
+++ b/graphics/pgf/base/lua/luamath/pgf/luamath/functions.lua
@@ -0,0 +1,626 @@
+-- Copyright 2011 by Christophe Jorssen
+--
+-- 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.
+--
+-- $Id$
+--
+
+local pgfluamathfunctions = pgfluamathfunctions or {}
+
+-- Maps function names to their function.
+--
+-- Note that this allows to register functions which are not in pgfluamathfunctions.
+--
+-- Note that the string keys are not necessarily the same as the function
+-- names. In particular, the math expression "not(1,1)" will execute notPGF(1,1)
+--
+-- Note that each function which is added to pgfluamathfunctions will _automatically_ be inserted into this map, see __newindex.
+-- (I fear it will not be erased directly...)
+pgfluamathfunctions.stringToFunctionMap = {}
+
+local newFunctionAllocatedCallback = function(table,key,value)
+ local keyName = tostring(key):gsub("PGF","")
+ if not value then
+ stringToFunctionMap[keyName] = nil
+ elseif type(value) == 'function' then
+ -- remember it, and strip PGF suffix (i.e. remember 'not' instead of 'notPGF')
+ pgfluamathfunctions.stringToFunctionMap[keyName] = value
+ end
+ rawset(table,key,value)
+end
+
+setmetatable(pgfluamathfunctions, { __newindex = newFunctionAllocatedCallback })
+
+local mathabs, mathacos, mathasin = math.abs, math.acos, math.asin
+local mathatan, mathceil = math.atan, math.ceil
+local mathcos, mathdeg = math.cos, math.deg
+local mathexp, mathfloor, mathfmod = math.exp, math.floor, math.fmod
+local mathlog, mathmax = math.log, math.max
+local mathmin, mathpi = math.min, math.pi
+local mathrad, mathrandom = math.rad, math.random
+local mathrandomseed, mathsin = math.randomseed, math.sin
+local mathsqrt = math.sqrt
+local mathtan = math.tan
+
+local trigFormatToRadians = mathrad
+
+local radiansToTrigFormat = mathdeg
+
+pgfluamathfunctions.TrigFormat = { 'deg', 'rad' }
+pgfluamathfunctions.stringToFunctionMap["TrigFormat"] = nil
+
+-- choice is one of the valid choices in TrigFormat.
+function pgfluamathfunctions.setTrigFormat(choice)
+ if choice == 'deg' then
+ trigFormatToRadians = mathrad
+ radiansToTrigFormat = mathdeg
+ elseif choice == 'rad' then
+ local identity = function(x) return x end
+ trigFormatToRadians = identity
+ radiansToTrigFormat = identity
+ else
+ error("The argument '" .. tostring(choice) .. "' is no valid choice for setTrigFormat.")
+ end
+end
+pgfluamathfunctions.stringToFunctionMap["setTrigFormat"] = nil
+
+pgfluamathfunctions.setRandomSeed = mathrandomseed
+pgfluamathfunctions.stringToFunctionMap["setRandomSeed"] = nil
+
+-------------------------------------------
+
+function pgfluamathfunctions.add(x,y)
+ return x+y
+end
+
+function pgfluamathfunctions.subtract(x,y)
+ return x-y
+end
+
+function pgfluamathfunctions.neg(x)
+ return -x
+end
+
+function pgfluamathfunctions.multiply(x,y)
+ return x*y
+end
+
+function pgfluamathfunctions.veclen(x,y)
+ return mathsqrt(x*x+y*y)
+end
+
+function pgfluamathfunctions.divide(x,y)
+ return x/y
+end
+
+function pgfluamathfunctions.div(x,y)
+ return mathfloor(x/y)
+end
+
+function pgfluamathfunctions.pow(x,y)
+ -- do not use math.pow -- it is deprecated as of LUA 5.3
+ return x^y
+end
+
+function pgfluamathfunctions.factorial(x)
+-- TODO: x must be an integer
+ if x == 0 then
+ return 1
+ else
+ return x * pgfluamathfunctions.factorial(x-1)
+ end
+end
+
+function pgfluamathfunctions.ifthenelse(x,y,z)
+ if x~= 0 then
+ return y
+ else
+ return z
+ end
+end
+
+function pgfluamathfunctions.equal(x,y)
+ if x == y then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.greater(x,y)
+ if x > y then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.less(x,y)
+ if x < y then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.min(x,y)
+ return mathmin(x,y)
+end
+
+function pgfluamathfunctions.max(x,y)
+ return mathmax(x,y)
+end
+
+function pgfluamathfunctions.notequal(x,y)
+ if x ~= y then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.notless(x,y)
+ if x >= y then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.notgreater(x,y)
+ if x <= y then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.andPGF(x,y)
+ if (x ~= 0) and (y ~= 0) then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.orPGF(x,y)
+ if (x ~= 0) or (y ~= 0) then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.notPGF(x)
+ if x == 0 then
+ return 1
+ else
+ return 0
+ end
+end
+
+function pgfluamathfunctions.pi()
+ return mathpi
+end
+
+function pgfluamathfunctions.e()
+ return mathexp(1)
+end
+
+function pgfluamathfunctions.abs(x)
+ return mathabs(x)
+end
+
+function pgfluamathfunctions.floor(x)
+ return mathfloor(x)
+end
+
+function pgfluamathfunctions.ceil(x)
+ return mathceil(x)
+end
+
+function pgfluamathfunctions.exp(x)
+ return mathexp(x)
+end
+
+function pgfluamathfunctions.ln(x)
+ return mathlog(x)
+end
+
+local logOf10 = mathlog(10)
+function pgfluamathfunctions.log10(x)
+ return mathlog(x) / logOf10
+end
+
+local logOf2 = mathlog(2)
+function pgfluamathfunctions.log2(x)
+ return mathlog(x) / logOf2
+end
+
+function pgfluamathfunctions.sqrt(x)
+ return mathsqrt(x)
+end
+
+function pgfluamathfunctions.sign(x)
+ if x < 0 then
+ return -1.0
+ elseif x == 0 then
+ return 0.0
+ else
+ return 1.0
+ end
+end
+function pgfluamathfunctions.real(x)
+ -- "ensure that x contains a decimal point" is kind of a no-op here, isn't it!?
+ return x
+end
+
+function pgfluamathfunctions.rnd()
+ return mathrandom()
+end
+
+function pgfluamathfunctions.rand()
+ return -1 + mathrandom() *2
+end
+
+function pgfluamathfunctions.random(x,y)
+ if x == nil and y == nil then
+ return mathrandom()
+ elseif y == nil then
+ return mathrandom(x)
+ else
+ return mathrandom(x,y)
+ end
+end
+
+function pgfluamathfunctions.deg(x)
+ return mathdeg(x)
+end
+
+function pgfluamathfunctions.rad(x)
+ return mathrad(x)
+end
+
+function pgfluamathfunctions.round(x)
+ if x<0 then
+ return -mathfloor(mathabs(x)+0.5)
+ else
+ return mathfloor(x + 0.5)
+ end
+end
+
+function pgfluamathfunctions.gcd(a, b)
+ if b == 0 then
+ return a
+ else
+ return pgfluamathfunctions.gcd(b, a%b)
+ end
+end
+
+function pgfluamathfunctions.isprime(a)
+ local ifisprime = true
+ if a == 1 then
+ ifisprime = false
+ elseif a == 2 then
+ ifisprime = true
+-- if a > 2 then
+ else
+ local i, imax = 2, mathceil(mathsqrt(a)) + 1
+ while ifisprime and (i < imax) do
+ if pgfluamathfunctions.gcd(a,i) ~= 1 then
+ ifisprime = false
+ end
+ i = i + 1
+ end
+ end
+ if ifisprime then
+ return 1
+ else
+ return 0
+ end
+end
+
+
+function pgfluamathfunctions.split_braces_to_explist(s)
+ -- (Thanks to mpg and zappathustra from fctt)
+ -- Make unpack available whatever lua version is used
+ -- (unpack in lua 5.1 table.unpack in lua 5.2)
+ local unpack = table.unpack or unpack
+ local t = {}
+ for i in s:gmatch('%b{}') do
+ table.insert(t, tonumber(i:sub(2, -2)))
+ end
+ return unpack(t)
+end
+
+function pgfluamathfunctions.split_braces_to_table(s)
+ local t = {}
+ for i in s:gmatch('%b{}') do
+ table.insert(t, tonumber(i:sub(2, -2)))
+ end
+ return t
+end
+
+function pgfluamathfunctions.mathtrue()
+ return 1.0
+end
+pgfluamathfunctions.stringToFunctionMap["true"] = pgfluamathfunctions.mathtrue
+
+function pgfluamathfunctions.mathfalse()
+ return 0.0
+end
+pgfluamathfunctions.stringToFunctionMap["false"] = pgfluamathfunctions.mathfalse
+
+function pgfluamathfunctions.frac(a)
+ -- should be positive, apparently
+ return mathabs(a - pgfluamathfunctions.int(a))
+end
+
+function pgfluamathfunctions.int(a)
+ if a < 0 then
+ return -mathfloor(mathabs(a))
+ else
+ return mathfloor(a)
+ end
+end
+
+function pgfluamathfunctions.iseven(a)
+ if (a % 2) == 0 then
+ return 1.0
+ else
+ return 0.0
+ end
+end
+
+function pgfluamathfunctions.isodd(a)
+ if (a % 2) == 0 then
+ return 0.0
+ else
+ return 1.0
+ end
+end
+
+function pgfluamathfunctions.mod(x,y)
+ if x/y < 0 then
+ return -(mathabs(x)%mathabs(y))
+ else
+ return mathabs(x)%mathabs(y)
+ end
+end
+
+function pgfluamathfunctions.Mod(x,y)
+ local tmp = pgfluamathfunctions.mod(x,y)
+ if tmp < 0 then
+ tmp = tmp + y
+ end
+ return tmp
+end
+
+function pgfluamathfunctions.Sin(x)
+ return mathsin(trigFormatToRadians(x))
+end
+pgfluamathfunctions.sin=pgfluamathfunctions.Sin
+
+
+function pgfluamathfunctions.cosh(x)
+ -- math.cosh is deprecated as of LUA 5.3 . reimplement it:
+ return 0.5* (mathexp(x) + mathexp(-x))
+end
+function pgfluamathfunctions.sinh(x)
+ -- math.sinh is deprecated as of LUA 5.3 . reimplement it:
+ return 0.5* (mathexp(x) - mathexp(-x))
+end
+
+local sinh = pgfluamathfunctions.sinh
+local cosh = pgfluamathfunctions.cosh
+function pgfluamathfunctions.tanh(x)
+ -- math.tanh is deprecated as of LUA 5.3 . reimplement it:
+ return sinh(x)/cosh(x)
+end
+
+function pgfluamathfunctions.Cos(x)
+ return mathcos(trigFormatToRadians(x))
+end
+pgfluamathfunctions.cos=pgfluamathfunctions.Cos
+
+function pgfluamathfunctions.Tan(x)
+ return mathtan(trigFormatToRadians(x))
+end
+pgfluamathfunctions.tan=pgfluamathfunctions.Tan
+
+function pgfluamathfunctions.aSin(x)
+ return radiansToTrigFormat(mathasin(x))
+end
+pgfluamathfunctions.asin=pgfluamathfunctions.aSin
+
+function pgfluamathfunctions.aCos(x)
+ return radiansToTrigFormat(mathacos(x))
+end
+pgfluamathfunctions.acos=pgfluamathfunctions.aCos
+
+function pgfluamathfunctions.aTan(x)
+ return radiansToTrigFormat(mathatan(x))
+end
+pgfluamathfunctions.atan=pgfluamathfunctions.aTan
+
+local mathatan2
+if math.atan2 == nil then
+ -- math.atan2 has been deprecated since LUA 5.3
+ mathatan2 = function (y,x) return mathatan(y,x) end
+else
+ mathatan2 = math.atan2
+end
+
+function pgfluamathfunctions.aTan2(y,x)
+ return radiansToTrigFormat(mathatan2(y,x))
+end
+pgfluamathfunctions.atan2=pgfluamathfunctions.aTan2
+pgfluamathfunctions.atantwo=pgfluamathfunctions.aTan2
+
+function pgfluamathfunctions.cot(x)
+ return pgfluamathfunctions.cos(x) / pgfluamathfunctions.sin(x)
+end
+function pgfluamathfunctions.sec(x)
+ return 1 / pgfluamathfunctions.cos(x)
+end
+function pgfluamathfunctions.cosec(x)
+ return 1 / pgfluamathfunctions.sin(x)
+end
+
+function pgfluamathfunctions.pointnormalised (pgfx, pgfy)
+ local pgfx_normalised, pgfy_normalised
+ if pgfx == 0. and pgfy == 0. then
+ -- Original pgf macro gives this result
+ tex.dimen['pgf@x'] = "0pt"
+ tex.dimen['pgf@y'] = "1pt"
+ else
+ pgfx_normalised = pgfx/math.sqrt(pgfx^2 + pgfy^2)
+ pgfx_normalised = pgfx_normalised - pgfx_normalised%0.00001
+ pgfy_normalised = pgfy/math.sqrt(pgfx^2 + pgfy^2)
+ pgfy_normalised = pgfy_normalised - pgfy_normalised%0.00001
+ tex.dimen['pgf@x'] = tostring(pgfx_normalised) .. "pt"
+ tex.dimen['pgf@y'] = tostring(pgfy_normalised) .. "pt"
+ end
+ return nil
+end
+
+local isnan = function(x)
+ return x ~= x
+end
+
+pgfluamathfunctions.isnan = isnan
+
+local infty = 1/0
+pgfluamathfunctions.infty = infty
+
+local nan = math.sqrt(-1)
+pgfluamathfunctions.nan = nan
+
+local stringlen = string.len
+local globaltonumber = tonumber
+local stringsub=string.sub
+local stringformat = string.format
+local stringsub = string.sub
+
+-- like tonumber(x), but it also accepts nan, inf, infty, and the TeX FPU format
+function pgfluamathfunctions.tonumber(x)
+ if type(x) == 'number' then return x end
+ if not x then return x end
+
+ local len = stringlen(x)
+ local result = globaltonumber(x)
+ if not result then
+ if len >2 and stringsub(x,2,2) == 'Y' and stringsub(x,len,len) == ']' then
+ -- Ah - some TeX FPU input of the form 1Y1.0e3] . OK. transform it
+ local flag = stringsub(x,1,1)
+ if flag == '0' then
+ -- ah, 0.0
+ result = 0.0
+ elseif flag == '1' then
+ result = globaltonumber(stringsub(x,3, len-1))
+ elseif flag == '2' then
+ result = globaltonumber("-" .. stringsub(x,3, len-1))
+ elseif flag == '3' then
+ result = nan
+ elseif flag == '4' then
+ result = infty
+ elseif flag == '5' then
+ result = -infty
+ end
+ else
+ local lower = x:lower()
+ if lower == 'nan' then
+ result = nan
+ elseif lower == "-nan" then
+ result = nan
+ elseif lower == 'inf' or lower == 'infty' then
+ result = infty
+ elseif lower == '-inf' or lower == '-infty' then
+ result = -infty
+ end
+ end
+ end
+
+ return result
+end
+
+local stringlen = string.len
+local globaltonumber = tonumber
+local stringformat = string.format
+local stringsub = string.sub
+local stringfind = string.find
+local stringbyte = string.byte
+local NULL_CHAR = string.byte("0",1)
+
+local function discardTrailingZeros(x)
+ local result = x
+ -- printf is too stupid: I would like to have
+ -- 1. a fast method
+ -- 2. a reliable method
+ -- 3. full precision of x
+ -- 4. a fixed point representation
+ -- the 'f' modifier has trailing zeros (stupid!)
+ -- the 'g' modified can switch to scientific notation (no-go!)
+ local periodOff = stringfind(result, '.',1,true)
+ if periodOff ~= nil then
+ -- strip trailing zeros
+ local chars = { stringbyte(result,1,#result) };
+ local lastNonZero = #chars
+ for i = #chars, periodOff, -1 do
+ if chars[i] ~= NULL_CHAR then lastNonZero=i; break; end
+ end
+ if lastNonZero ~= #chars then
+ -- Ah: we had at least one trailing zero.
+ -- discard all but the last.
+ lastNonZero = mathmax(periodOff+1,lastNonZero)
+ end
+ result = stringsub(result, 1, lastNonZero)
+ end
+ return result;
+end
+
+local function discardTrailingZerosFromMantissa(x)
+ local mantissaStart = stringfind(x, "e")
+
+ local mantissa = stringsub(x,1,mantissaStart-1)
+ local exponent = stringsub(x,mantissaStart)
+
+ return discardTrailingZeros(mantissa) .. exponent
+end
+
+
+-- a helper function which has no catcode issues when communicating with TeX:
+function pgfluamathfunctions.tostringfixed(x)
+ if x == nil then
+ return ""
+ end
+
+ return discardTrailingZeros(stringformat("%f", x))
+end
+
+-- converts an input number to a string which is accepted by the TeX FPU
+function pgfluamathfunctions.toTeXstring(x)
+ local result = ""
+ if x ~= nil then
+ if x == infty then result = "4Y0.0e0]"
+ elseif x == -infty then result = "5Y0.0e0]"
+ elseif isnan(x) then result = "3Y0.0e0]"
+ elseif x == 0 then result = "0Y0.0e0]"
+ else
+ result = discardTrailingZerosFromMantissa(stringformat("%.10e", x))
+ if x > 0 then
+ result = "1Y" .. result .. "]"
+ else
+ result = "2Y" .. stringsub(result,2) .. "]"
+ end
+ end
+ end
+ return result
+end
+
+return pgfluamathfunctions
diff --git a/graphics/pgf/base/lua/luamath/pgf/luamath/parser.lua b/graphics/pgf/base/lua/luamath/pgf/luamath/parser.lua
new file mode 100644
index 0000000000..42b690e6cf
--- /dev/null
+++ b/graphics/pgf/base/lua/luamath/pgf/luamath/parser.lua
@@ -0,0 +1,481 @@
+-- Copyright 2011 by Christophe Jorssen and Mark Wibrow
+-- Copyright 2014 by Christian Feuersaenger
+--
+-- 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.
+--
+-- $Id$
+--
+-- usage:
+--
+-- pgfluamathparser = require("pgf.luamath.parser")
+--
+-- local result = pgfluamathparser.pgfmathparse("1+ 2*4^2")
+--
+-- This LUA class has a direct backend in \pgfuselibrary{luamath}, see the documentation of that TeX package.
+
+local pgfluamathparser = pgfluamathparser or {}
+
+pgfluamathfunctions = require("pgf.luamath.functions")
+
+-- lpeg is always present in luatex
+local lpeg = require("lpeg")
+
+local S, P, R = lpeg.S, lpeg.P, lpeg.R
+local C, Cc, Ct = lpeg.C, lpeg.Cc, lpeg.Ct
+local Cf, Cg, Cs = lpeg.Cf, lpeg.Cg, lpeg.Cs
+local V = lpeg.V
+local match = lpeg.match
+
+local space_pattern = S(" \n\r\t")^0
+local tex_unit =
+ P('pt') + P('mm') + P('cm') + P('in') +
+ -- while valid units, the font-depending ones need special attention... move them to the TeX side. For now.
+ -- P('ex') + P('em') +
+ P('bp') + P('pc') +
+ P('dd') + P('cc') + P('sp');
+
+local one_digit_pattern = R("09")
+local positive_integer_pattern = one_digit_pattern^1
+-- FIXME : it might be a better idea to remove '-' from all number_patterns! Instead, rely on the prefix operator 'neg' to implement negative numbers.
+-- Is that wise? It is certainly less efficient...
+local integer_pattern = S("+-")^-1 * positive_integer_pattern
+-- Valid positive decimals are |xxx.xxx|, |.xxx| and |xxx.|
+local positive_integer_or_decimal_pattern = positive_integer_pattern * ( P(".") * one_digit_pattern^0)^-1 +
+ (P(".") * one_digit_pattern^1)
+local integer_or_decimal_pattern = S("+-")^-1 * positive_integer_or_decimal_pattern
+local fpu_pattern = R"05" * P"Y" * positive_integer_or_decimal_pattern * P"e" * S("+-")^-1 * R("09")^1 * P"]"
+local unbounded_pattern = P"inf" + P"INF" + P"nan" + P"NaN" + P"Inf"
+local number_pattern = C(unbounded_pattern + fpu_pattern + integer_or_decimal_pattern * (S"eE" * integer_pattern + C(tex_unit))^-1)
+
+local underscore_pattern = P("_")
+
+local letter_pattern = R("az","AZ")
+local alphanum__pattern = letter_pattern + one_digit_pattern + underscore_pattern
+
+local identifier_pattern = letter_pattern^1 * alphanum__pattern^0
+
+local openparen_pattern = P("(") * space_pattern
+local closeparen_pattern = P(")")
+local opencurlybrace_pattern = P("{")
+local closecurlybrace_pattern = P("}")
+local openbrace_pattern = P("[")
+local closebrace_pattern = P("]")
+
+-- hm. what about '\\' or '\%' ?
+-- accept \pgf@x, \count0, \dimen42, \c@pgf@counta, \wd0, \ht0, \dp 0
+local controlsequence_pattern = P"\\" * C( (R("az","AZ") + P"@")^1) * space_pattern* C( R"09"^0 )
+
+-- local string = P('"') * C((1 - P('"'))^0) * P('"')
+
+local comma_pattern = P(",") * space_pattern
+
+
+----------------
+local TermOp = C(S("+-")) * space_pattern
+local EqualityOp = C( P"==" + P"!=" ) * space_pattern
+local RelationalOp = C( P"<=" + P">=" + P"<" + P">" ) * space_pattern
+local FactorOp = C(S("*/")) * space_pattern
+
+-- Grammar
+local Exp, Term, Factor = V"Exp", V"Term", V"Factor"
+local Prefix = V"Prefix"
+local Postfix = V"Postfix"
+
+
+
+local function eval (v1, op, v2)
+ if (op == "+") then return v1 + v2
+ elseif (op == "-") then return v1 - v2
+ elseif (op == "*") then return v1 * v2
+ elseif (op == "/") then return v1 / v2
+ else
+ error("This function must not be invoked for operator "..op)
+ end
+end
+
+local pgfStringToFunctionMap = pgfluamathfunctions.stringToFunctionMap
+local function function_eval(name, ... )
+ local f = pgfStringToFunctionMap[name]
+ if not f then
+ error("Function '" .. name .. "' is undefined (did not find pgfluamathfunctions."..name .." (looked into pgfluamathfunctions.stringToFunctionMap))")
+ end
+ -- FIXME: validate signature
+ return f(...)
+end
+
+
+local func =
+ (C(identifier_pattern) * space_pattern * openparen_pattern * Exp * (comma_pattern * Exp)^0 * closeparen_pattern) / function_eval;
+
+local functionWithoutArg = identifier_pattern / function_eval
+
+-- this is what can occur as exponent after '^'.
+-- I have the impression that the priorities could be implemented in a better way than this... but it seems to work.
+local pow_exponent =
+ -- allows 2^-4, 2^1e4, 2^2
+ -- FIXME : why not 2^1e2 ?
+ Cg(C(integer_or_decimal_pattern)
+ -- 2^pi, 2^multiply(2,2)
+ + Cg(func+functionWithoutArg)
+ -- 2^(2+2)
+ + openparen_pattern * Exp * closeparen_pattern )
+
+local function prefix_eval(op, x)
+ if op == "-" then
+ return pgfluamathfunctions.neg(x)
+ elseif op == "!" then
+ return pgfluamathfunctions.notPGF(x)
+ else
+ error("This function must not be invoked for operator "..op)
+ end
+end
+
+
+local prefix_operator = C( S"-!" )
+local prefix_operator_pattern = (prefix_operator * space_pattern * Cg(Prefix) ) / prefix_eval
+
+-- apparently, we need to distinguish between <expr> ! and <expr> != <expr2>:
+local postfix_operator = C( S"r!" - P"!=" ) + C(P"^") * space_pattern * pow_exponent
+
+pgfluamathfunctions.functionMustBeEvaluatedInTeX = function()
+ error("The function in this context cannot be evaluated by LUA because it depends on TeX macros.")
+end
+
+local ternary_eval = pgfluamathfunctions.ifthenelse
+
+local factorial_eval = pgfluamathfunctions.factorial
+local deg = pgfluamathfunctions.deg
+local pow_eval = pgfluamathfunctions.pow
+
+-- @param prefix the argument before the postfix operator.
+-- @param op either nil or the postfix operator
+-- @param arg either nil or the (mandatory) argument for 'op'
+local function postfix_eval(prefix, op, arg)
+ local result
+ if op == nil then
+ result = prefix
+ elseif op == "r" then
+ if arg then error("parser setup error: expected nil argument") end
+ result = deg(prefix)
+ elseif op == "!" then
+ if arg then error("parser setup error: expected nil argument") end
+ result = factorial_eval(prefix)
+ elseif op == "^" then
+ if not arg then error("parser setup error: ^ with its argument") end
+ result = pow_eval(prefix, arg)
+ else
+ error("Parser setup error: " .. tostring(op) .. " unexpected in this context")
+ end
+ return result
+end
+
+local function equality_eval(v1, op, v2)
+ local fct
+ if (op == "==") then fct = pgfluamathfunctions.equal
+ elseif (op == "!=") then fct = pgfluamathfunctions.notequal
+ else
+ error("This function must not be invoked for operator "..op)
+ end
+ return fct(v1,v2)
+end
+local function relational_eval(v1, op, v2)
+ local fct
+ if (op == "<") then fct = pgfluamathfunctions.less
+ elseif (op == ">") then fct = pgfluamathfunctions.greater
+ elseif (op == ">=") then fct = pgfluamathfunctions.notless
+ elseif (op == "<=") then fct = pgfluamathfunctions.notgreater
+ else
+ error("This function must not be invoked for operator "..op)
+ end
+ return fct(v1,v2)
+end
+
+-- @return either the box property or nil
+-- @param cs "wd", "ht", or "dp"
+-- @param intSuffix some integer
+local function get_tex_box(cs, intSuffix)
+ -- assume get_tex_box is only called when a dimension is required.
+ local result
+ pgfluamathparser.units_declared = true
+ local box =tex.box[tonumber(intSuffix)]
+ if not box then error("There is no box " .. intSuffix) end
+ if cs == "wd" then
+ result = box.width / 65536
+ elseif cs == "ht" then
+ result = box.height / 65536
+ elseif cs == "dp" then
+ result = box.depth / 65536
+ else
+ result = nil
+ end
+ return result
+end
+
+
+local function controlsequence_eval(cs, intSuffix)
+ local result
+ if intSuffix and #intSuffix >0 then
+ if cs == "count" then
+ result= pgfluamathparser.get_tex_count(intSuffix)
+ elseif cs == "dimen" then
+ result= pgfluamathparser.get_tex_dimen(intSuffix)
+ else
+ result = get_tex_box(cs,intSuffix)
+ if not result then
+ -- this can happen - we cannot expand \chardef'ed boxes here.
+ -- this will be done by the TeX part
+ error('I do not know/support the TeX register "\\' .. cs .. '"')
+ end
+ end
+ else
+ result = pgfluamathparser.get_tex_register(cs)
+ end
+ return result
+end
+
+pgfluamathparser.units_declared = false
+function pgfluamathparser.get_tex_register(register)
+ -- register is a string which could be a count or a dimen.
+ if pcall(tex.getcount, register) then
+ return tex.count[register]
+ elseif pcall(tex.getdimen, register) then
+ pgfluamathparser.units_declared = true
+ return tex.dimen[register] / 65536 -- return in points.
+ else
+ error('I do not know the TeX register "' .. register .. '"')
+ return nil
+ end
+end
+
+function pgfluamathparser.get_tex_count(count)
+ -- count is expected to be a number
+ return tex.count[tonumber(count)]
+end
+
+function pgfluamathparser.get_tex_dimen(dimen)
+ -- dimen is expected to be a number
+ pgfluamathparser.units_declared = true
+ return tex.dimen[tonumber(dimen)] / 65536
+end
+
+function pgfluamathparser.get_tex_sp(dimension)
+ -- dimension should be a string
+ pgfluamathparser.units_declared = true
+ return tex.sp(dimension) / 65536
+end
+
+
+local initialRule = V"initial"
+
+local Summand = V"Summand"
+local Relational = V"Relational"
+local Equality = V"Equality"
+local LogicalOr = V"LogicalOr"
+local LogicalAnd = V"LogicalAnd"
+
+local pgftonumber = pgfluamathfunctions.tonumber
+local tonumber_withunit = pgfluamathparser.get_tex_sp
+local function number_optional_units_eval(x, unit)
+ if not unit then
+ return pgftonumber(x)
+ else
+ return tonumber_withunit(x)
+ end
+end
+
+-- @param scale the number.
+-- @param controlsequence either nil in which case just the number must be returned or a control sequence
+-- @see controlsequence_eval
+local function scaled_controlsequence_eval(scale, controlsequence, intSuffix)
+ if controlsequence==nil then
+ return scale
+ else
+ return scale * controlsequence_eval(controlsequence, intSuffix)
+ end
+end
+
+-- Grammar
+--
+-- for me:
+-- - use '/' to evaluate all expressions which contain a _constant_ number of captures.
+-- - use Cf to evaluate expressions which contain a _dynamic_ number of captures
+--
+-- see unittest_luamathparser.tex for tons of examples
+local G = P{ "initialRule",
+ initialRule = space_pattern* Exp * -1;
+ -- ternary operator (or chained ternary operators):
+ -- FIXME : is this chaining a good idea!?
+ Exp = Cf( LogicalOr * Cg(P"?" * space_pattern * LogicalOr * P":" *space_pattern * LogicalOr )^0, ternary_eval) ;
+ LogicalOr = Cf(LogicalAnd * (P"||" * space_pattern * LogicalAnd)^0, pgfluamathfunctions.orPGF);
+ LogicalAnd = Cf(Equality * (P"&&" * space_pattern * Equality)^0, pgfluamathfunctions.andPGF);
+ Equality = Cf(Relational * Cg(EqualityOp * Relational)^0, equality_eval);
+ Relational = Cf(Summand * Cg(RelationalOp * Summand)^0, relational_eval);
+ Summand = Cf(Term * Cg(TermOp * Term)^0, eval) ;
+ Term = Cf(Prefix * Cg(FactorOp * Prefix)^0, eval);
+ Prefix = prefix_operator_pattern + Postfix;
+ -- this calls 'postfix_eval' with nil arguments if it is no postfix operation.. but that does not hurt (right?)
+ Postfix = Factor * (postfix_operator * space_pattern)^-1 / postfix_eval;
+ Factor =
+ (
+ number_pattern / number_optional_units_eval *
+ -- this construction will evaluate number_pattern with 'number_optional_units_eval' FIRST.
+ -- also accept '0.5 \pgf@x' here:
+ space_pattern *controlsequence_pattern^-1 / scaled_controlsequence_eval
+ + func
+ + functionWithoutArg
+ + openparen_pattern * Exp * closeparen_pattern
+ + controlsequence_pattern / controlsequence_eval
+ ) *space_pattern
+ ;
+}
+
+-- does not reset units_declared.
+local function pgfmathparseinternal(str)
+ local result = match(G,str)
+ if result == nil then
+ error("The string '" .. str .. "' is no valid PGF math expression. Please check for syntax errors.")
+ end
+ return result
+end
+
+
+-- This is the math parser function in this module.
+--
+-- @param str a string like "1+1" which is accepted by the PGF math language
+-- @return the result of the expression.
+--
+-- Throws an error if the string is no valid expression.
+function pgfluamathparser.pgfmathparse(str)
+ pgfluamathparser.units_declared = false
+
+ return pgfmathparseinternal(str)
+end
+
+local pgfmathparse = pgfluamathparser.pgfmathparse
+local tostringfixed = pgfluamathfunctions.tostringfixed
+local tostringfpu = pgfluamathfunctions.toTeXstring
+
+local tmpFunctionArgumentPrefix = "tmpVar"
+local stackOfLocalFunctions = {}
+
+-- This is a backend for PGF's 'declare function'.
+-- \tikzset{declare function={mu(\x,\i)=\x^\i;}}
+-- will boil down to
+-- pgfluamathparser.declareExpressionFunction("mu", 2, "#1^#2")
+--
+-- The local function will be pushed on a stack of known local functions and is
+-- available until popLocalExpressionFunction() is called. TeX will call this using
+-- \aftergroup.
+--
+-- @param name the name of the new function
+-- @param numArgs the number of arguments
+-- @param expression an expression containing #1, ... #n where n is numArgs
+--
+-- ATTENTION: local functions behave DIFFERENTLY in LUA!
+-- In LUA, local variables are not expanded whereas TeX expands them.
+-- The difference is
+--
+-- declare function={mu1(\x,\i)=\x^\i;}
+-- \pgfmathparse{mu1(-5,2)} --> -25
+-- \pgfluamathparse{mu1(-5,2)} --> 25
+--
+-- x = -5
+-- \pgfmathparse{mu1(x,2)} --> 25
+-- \pgfluamathparse{mu1(x,2)} --> 25
+--
+-- In an early prototype, I simulated TeX's expansion to fix the first case (successfully).
+-- BUT: that "simulated expansion" broke the second case because LUA will evaluate "x" and hand -5 to the local function.
+-- I decided to keep it as is. Perhaps we should fix PGF's expansion approach in TeX (which is ugly anyway)
+function pgfluamathparser.pushLocalExpressionFunction(name, numArgs, expression)
+ -- now we have "tmpVar1^tmpVar2" instead of "#1^#2"
+ local normalizedExpr = expression:gsub("#", tmpFunctionArgumentPrefix)
+ local restores = {}
+ local tmpVars = {}
+ for i=1,numArgs do
+ local tmpVar = tmpFunctionArgumentPrefix .. tostring(i)
+ tmpVars[i] = tmpVar
+ end
+
+ local newFunction = function(...)
+ local args = table.pack(...)
+
+ -- define "tmpVar1" ... "tmpVarN" to return args[i].
+ -- Of course, we need to restore "tmpVar<i>" after we return!
+ for i=1,numArgs do
+ local tmpVar = tmpVars[i]
+ local value = args[i]
+ restores[i] = pgfStringToFunctionMap[tmpVar]
+ pgfStringToFunctionMap[tmpVar] = function () return value end
+ end
+
+ -- parse our expression.
+
+ -- FIXME : this here is an attempt to mess around with "units_declared".
+ -- It would be better to call pgfmathparse and introduce some
+ -- semaphore to check if pgfmathparse is a nested call-- in this case, it should
+ -- not reset units_declared. But there is no "finally" block and pcall is crap (looses stack trace).
+ local success,result = pcall(pgfmathparseinternal, normalizedExpr)
+
+ -- remove 'tmpVar1', ... from the function table:
+ for i=1,numArgs do
+ local tmpVar = tmpVars[i]
+ pgfStringToFunctionMap[tmpVar] = restores[i]
+ end
+
+ if success==false then error(result) end
+ return result
+ end
+ table.insert(stackOfLocalFunctions, name)
+ pgfStringToFunctionMap[name] = newFunction
+end
+
+function pgfluamathparser.popLocalExpressionFunction()
+ local name = stackOfLocalFunctions[#stackOfLocalFunctions]
+ pgfStringToFunctionMap[name] = nil
+ -- this removes the last element:
+ table.remove(stackOfLocalFunctions)
+end
+
+
+-- A Utility function which simplifies the interaction with the TeX code
+-- @param expression the input expression (string)
+-- @param outputFormatChoice 0 if the result should be a fixed point number, 1 if it should be in FPU format
+-- @param showErrorMessage (boolean) true if any error should be displayed, false if errors should simply result in an invocation of TeX's parser (the default)
+--
+-- it defines \pgfmathresult and \ifpgfmathunitsdeclared
+function pgfluamathparser.texCallParser(expression, outputFormatChoice, showErrorMessage)
+ local success, result
+ if showErrorMessage then
+ result = pgfmathparse(expression)
+ success = true
+ else
+ success, result = pcall(pgfmathparse, expression)
+ end
+
+ if success and result then
+ local result_str
+ if outputFormatChoice == 0 then
+ -- luamath/output format=fixed
+ result_str = tostringfixed(result)
+ else
+ -- luamath/output format=fixed
+ result_str = tostringfpu(result)
+ end
+ tex.sprint("\\def\\pgfmathresult{" .. result_str .. "}")
+ if pgfluamathparser.units_declared then
+ tex.sprint("\\pgfmathunitsdeclaredtrue")
+ else
+ tex.sprint("\\pgfmathunitsdeclaredfalse")
+ end
+ else
+ tex.sprint("\\def\\pgfmathresult{}")
+ tex.sprint("\\pgfmathunitsdeclaredfalse")
+ end
+end
+
+return pgfluamathparser
diff --git a/graphics/pgf/base/source/BalloonLayout_script.h b/graphics/pgf/base/source/BalloonLayout_script.h
new file mode 100644
index 0000000000..311bee3e09
--- /dev/null
+++ b/graphics/pgf/base/source/BalloonLayout_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/misclayout/BalloonLayout.h>
+
+struct BalloonLayout_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ BalloonLayout layout;
+
+ parameters->configure_option ("BalloonLayout.evenAngles",
+ &BalloonLayout::setEvenAngles, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("BalloonLayout")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.misclayout.BalloonLayout"));
+
+ s.declare (key ("BalloonLayout.evenAngles")
+ .type ("boolean")
+ .documentation_in ("pgf.gd.doc.ogdf.misclayout.BalloonLayout"));
+ }
+};
+
diff --git a/graphics/pgf/base/source/BarycenterHeuristic_script.h b/graphics/pgf/base/source/BarycenterHeuristic_script.h
new file mode 100644
index 0000000000..709e91d3de
--- /dev/null
+++ b/graphics/pgf/base/source/BarycenterHeuristic_script.h
@@ -0,0 +1,20 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/BarycenterHeuristic.h>
+
+struct BarycenterHeuristic_script :
+ scripting::declarations,
+ scripting::factory<ogdf::BarycenterHeuristic>
+{
+
+ ogdf::BarycenterHeuristic* make (scripting::run_parameters* parameters) {
+ return new ogdf::BarycenterHeuristic;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("BarycenterHeuristic")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.BarycenterHeuristic")
+ .set_module ("TwoLayerCrossMin", this));
+ }
+};
+
diff --git a/graphics/pgf/base/source/BarycenterPlacer_script.h b/graphics/pgf/base/source/BarycenterPlacer_script.h
new file mode 100644
index 0000000000..19ac75d314
--- /dev/null
+++ b/graphics/pgf/base/source/BarycenterPlacer_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/BarycenterPlacer.h>
+
+struct BarycenterPlacer_script :
+ scripting::declarations,
+ scripting::factory<ogdf::BarycenterPlacer>
+{
+ ogdf::BarycenterPlacer* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ BarycenterPlacer* r = new BarycenterPlacer;
+
+ parameters->configure_option ("BarycenterPlacer.weightedPositionPriority",
+ &BarycenterPlacer::weightedPositionPriority, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("BarycenterPlacer")
+ .set_module ("InitialPlacer", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.BarycenterPlacer"));
+
+ s.declare (key ("BarycenterPlacer.weightedPositionPriority")
+ .type ("boolean")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.BarycenterPlacer"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/CirclePlacer_script.h b/graphics/pgf/base/source/CirclePlacer_script.h
new file mode 100644
index 0000000000..f208dbdecf
--- /dev/null
+++ b/graphics/pgf/base/source/CirclePlacer_script.h
@@ -0,0 +1,56 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/CirclePlacer.h>
+
+struct CirclePlacer_script :
+ scripting::declarations,
+ scripting::factory<ogdf::CirclePlacer>
+{
+ ogdf::CirclePlacer* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ CirclePlacer* r = new CirclePlacer;
+
+ parameters->configure_option ("CirclePlacer.circleSize",
+ &CirclePlacer::setCircleSize, *r);
+ parameters->configure_option ("CirclePlacer.radiusFixed",
+ &CirclePlacer::setRadiusFixed, *r);
+
+
+ char* s = 0;
+
+ if (parameters->option("CirclePlacer.nodeSelection", s)) {
+ if (strcmp(s, "new") == 0)
+ r->setNodeSelection(CirclePlacer::nsNew);
+ else if (strcmp(s, "old") == 0)
+ r->setNodeSelection(CirclePlacer::nsOld);
+ else if (strcmp(s, "all") == 0)
+ r->setNodeSelection(CirclePlacer::nsAll);
+
+ free(s);
+ }
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("CirclePlacer")
+ .set_module ("InitialPlacer", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.CirclePlacer"));
+
+ s.declare (key ("CirclePlacer.circleSize")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.CirclePlacer"));
+
+ s.declare (key ("CirclePlacer.radiusFixed")
+ .type ("boolean")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.CirclePlacer"));
+
+ s.declare (key ("CirclePlacer.nodeSelection")
+ .type ("string")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.CirclePlacer"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/CircularLayout_script.h b/graphics/pgf/base/source/CircularLayout_script.h
new file mode 100644
index 0000000000..d0840e64f6
--- /dev/null
+++ b/graphics/pgf/base/source/CircularLayout_script.h
@@ -0,0 +1,47 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/misclayout/CircularLayout.h>
+
+struct CircularLayout_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ CircularLayout layout;
+
+ parameters->configure_option ("CircularLayout.minDistCircle",
+ &CircularLayout::minDistCircle, layout);
+ parameters->configure_option ("CircularLayout.minDistLevel",
+ &CircularLayout::minDistLevel, layout);
+ parameters->configure_option ("CircularLayout.minDistSibling",
+ &CircularLayout::minDistSibling, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("CircularLayout")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.misclayout.CircularLayout"));
+
+ s.declare (key ("CircularLayout.minDistCircle")
+ .type ("length")
+ .alias_function ("function (o) return o['part pre sep'] + o['part post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.CircularLayout"));
+
+ s.declare (key ("CircularLayout.minDistLevel")
+ .type ("length")
+ .alias_function ("function (o) return o['level pre sep'] + o['level post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.CircularLayout"));
+
+ s.declare (key ("CircularLayout.minDistSibling")
+ .type ("length")
+ .alias_function ("function (o) return o['sibling pre sep'] + o['sibling post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.CircularLayout"));
+ }
+};
+
diff --git a/graphics/pgf/base/source/CoffmanGrahamRanking_script.h b/graphics/pgf/base/source/CoffmanGrahamRanking_script.h
new file mode 100644
index 0000000000..d8cb01a771
--- /dev/null
+++ b/graphics/pgf/base/source/CoffmanGrahamRanking_script.h
@@ -0,0 +1,34 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/CoffmanGrahamRanking.h>
+
+struct CoffmanGrahamRanking_script :
+ scripting::declarations,
+ scripting::factory<ogdf::CoffmanGrahamRanking>
+{
+
+ ogdf::CoffmanGrahamRanking* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ CoffmanGrahamRanking* r = new CoffmanGrahamRanking;
+
+ parameters->configure_option ("CoffmanGrahamRanking.width",
+ &CoffmanGrahamRanking::width, *r);
+ parameters->configure_module ("AcyclicSubgraphModule",
+ &CoffmanGrahamRanking::setSubgraph, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+ s.declare (key ("CoffmanGrahamRanking")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.CoffmanGrahamRanking")
+ .set_module ("RankingModule", this));
+
+ s.declare (key ("CoffmanGrahamRanking.width")
+ .type ("number")
+ .initial ("3")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.CoffmanGrahamRanking"));
+ }
+};
+
diff --git a/graphics/pgf/base/source/DfsAcyclicSubgraph_script.h b/graphics/pgf/base/source/DfsAcyclicSubgraph_script.h
new file mode 100644
index 0000000000..0d784ff3f5
--- /dev/null
+++ b/graphics/pgf/base/source/DfsAcyclicSubgraph_script.h
@@ -0,0 +1,20 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/DfsAcyclicSubgraph.h>
+
+struct DfsAcyclicSubgraph_script :
+ scripting::declarations,
+ scripting::factory<ogdf::DfsAcyclicSubgraph>
+{
+
+ ogdf::DfsAcyclicSubgraph* make (scripting::run_parameters* parameters) {
+ return new ogdf::DfsAcyclicSubgraph;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("DfsAcyclicSubgraph")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.DfsAcyclicSubgraph")
+ .set_module ("AcyclicSubgraphModule", this));
+ }
+};
+
diff --git a/graphics/pgf/base/source/EdgeCoverMerger_script.h b/graphics/pgf/base/source/EdgeCoverMerger_script.h
new file mode 100644
index 0000000000..cb91637d5d
--- /dev/null
+++ b/graphics/pgf/base/source/EdgeCoverMerger_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/EdgeCoverMerger.h>
+
+struct EdgeCoverMerger_script :
+ scripting::declarations,
+ scripting::factory<ogdf::EdgeCoverMerger>
+{
+ ogdf::EdgeCoverMerger* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ EdgeCoverMerger* r = new EdgeCoverMerger;
+
+ parameters->configure_option ("EdgeCoverMerger.factor",
+ &EdgeCoverMerger::setFactor, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("EdgeCoverMerger")
+ .set_module ("MultilevelBuilder", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.EdgeCoverMerger"));
+
+ s.declare (key ("EdgeCoverMerger.factor")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.EdgeCoverMerger"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/ExampleLocalMakefileConfig.mk b/graphics/pgf/base/source/ExampleLocalMakefileConfig.mk
new file mode 100644
index 0000000000..b42f097f54
--- /dev/null
+++ b/graphics/pgf/base/source/ExampleLocalMakefileConfig.mk
@@ -0,0 +1,7 @@
+MYCFLAGS=-isysroot/Developer/SDKs/MacOSX10.7.sdk
+MYLDFLAGS=
+
+ARCHFLAGS=-arch x86_64
+
+SHAREDFLAGS=-undefined dynamic_lookup -bundle -llua -L$(LUALIBPATH)
+
diff --git a/graphics/pgf/base/source/FMMMLayout_script.h b/graphics/pgf/base/source/FMMMLayout_script.h
new file mode 100644
index 0000000000..bdaf26bf67
--- /dev/null
+++ b/graphics/pgf/base/source/FMMMLayout_script.h
@@ -0,0 +1,44 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/FMMMLayout.h>
+
+struct FMMMLayout_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ FMMMLayout layout;
+
+ layout.newInitialPlacement(false);
+ layout.qualityVersusSpeed(FMMMLayout::qvsGorgeousAndEfficient);
+
+ parameters->configure_option ("FMMMLayout.unitEdgeLength",
+ &FMMMLayout::unitEdgeLength, layout);
+ parameters->configure_option ("FMMMLayout.randSeed",
+ &FMMMLayout::randSeed, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+ s.declare (key ("FMMMLayout")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FMMMLayout"));
+
+ s.declare (key ("FMMMLayout.randSeed")
+ .type ("number")
+ .initial ("42")
+ .alias ("random seed")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FMMMLayout"));
+
+ s.declare (key ("FMMMLayout.unitEdgeLength")
+ .type ("length")
+ .initial ("1cm")
+ .alias_function ("function (o) return o['node pre sep'] + o['node post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FMMMLayout"));
+ }
+
+};
diff --git a/graphics/pgf/base/source/FastHierarchyLayout_script.h b/graphics/pgf/base/source/FastHierarchyLayout_script.h
new file mode 100644
index 0000000000..c8063e063a
--- /dev/null
+++ b/graphics/pgf/base/source/FastHierarchyLayout_script.h
@@ -0,0 +1,48 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/FastHierarchyLayout.h>
+
+struct FastHierarchyLayout_script :
+ scripting::declarations,
+ scripting::factory<ogdf::FastHierarchyLayout>
+{
+
+ ogdf::FastHierarchyLayout* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ FastHierarchyLayout* r = new FastHierarchyLayout;
+
+ parameters->configure_option ("FastHierarchyLayout.fixedLayerDistance",
+ &FastHierarchyLayout::fixedLayerDistance, *r);
+ parameters->configure_option ("FastHierarchyLayout.layerDistance",
+ &FastHierarchyLayout::layerDistance, *r);
+ parameters->configure_option ("FastHierarchyLayout.nodeDistance",
+ &FastHierarchyLayout::nodeDistance, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("FastHierarchyLayout")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastHierarchyLayout")
+ .set_module ("HierarchyLayoutModule", this));
+
+ s.declare (key ("FastHierarchyLayout.fixedLayerDistance")
+ .type ("boolean")
+ .initial ("false")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastHierarchyLayout"));
+
+ s.declare (key ("FastHierarchyLayout.layerDistance")
+ .type ("length")
+ .alias_function ("function (o) return o['level pre sep'] + o['level post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastHierarchyLayout"));
+
+ s.declare (key ("FastHierarchyLayout.nodeDistance")
+ .type ("length")
+ .alias_function ("function (o) return o['sibling pre sep'] + o['sibling post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastHierarchyLayout"));
+ }
+};
+
+
diff --git a/graphics/pgf/base/source/FastMultipoleEmbedder_script.h b/graphics/pgf/base/source/FastMultipoleEmbedder_script.h
new file mode 100644
index 0000000000..38d9b032c9
--- /dev/null
+++ b/graphics/pgf/base/source/FastMultipoleEmbedder_script.h
@@ -0,0 +1,51 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/FastMultipoleEmbedder.h>
+
+struct FastMultipoleEmbedder_script :
+ scripting::declarations,
+ scripting::factory<ogdf::FastMultipoleEmbedder>
+{
+ ogdf::FastMultipoleEmbedder* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ FastMultipoleEmbedder* r = new FastMultipoleEmbedder;
+
+ parameters->configure_option ("FastMultipoleEmbedder.numIterations",
+ &FastMultipoleEmbedder::setNumIterations, *r);
+ parameters->configure_option ("FastMultipoleEmbedder.multipolePrec",
+ &FastMultipoleEmbedder::setMultipolePrec, *r);
+ parameters->configure_option ("FastMultipoleEmbedder.defaultEdgeLength",
+ &FastMultipoleEmbedder::setDefaultEdgeLength, *r);
+ parameters->configure_option ("FastMultipoleEmbedder.defaultNodeSize",
+ &FastMultipoleEmbedder::setDefaultNodeSize, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("FastMultipoleEmbedder")
+ .set_module ("LayoutModule", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FastMultipoleEmbedder"));
+
+ s.declare (key ("FastMultipoleEmbedder.numIterations")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FastMultipoleEmbedder"));
+
+ s.declare (key ("FastMultipoleEmbedder.multipolePrec")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FastMultipoleEmbedder"));
+
+ s.declare (key ("FastMultipoleEmbedder.defaultEdgeLength")
+ .type ("length")
+ .alias_function ("function (o) return o['node pre sep'] + o['node post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FastMultipoleEmbedder"));
+
+ s.declare (key ("FastMultipoleEmbedder.defaultNodeSize")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.FastMultipoleEmbedder"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/FastSimpleHierarchyLayout_script.h b/graphics/pgf/base/source/FastSimpleHierarchyLayout_script.h
new file mode 100644
index 0000000000..37c6c94bc0
--- /dev/null
+++ b/graphics/pgf/base/source/FastSimpleHierarchyLayout_script.h
@@ -0,0 +1,41 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/FastSimpleHierarchyLayout.h>
+
+struct FastSimpleHierarchyLayout_script :
+ scripting::declarations,
+ scripting::factory<ogdf::FastSimpleHierarchyLayout>
+{
+
+ ogdf::FastSimpleHierarchyLayout* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+
+ FastSimpleHierarchyLayout* r = new FastSimpleHierarchyLayout
+ (
+ parameters->option<int> ("FastSimpleHierarchyLayout.siblingDistance"),
+ parameters->option<int> ("FastSimpleHierarchyLayout.layerDistance")
+ );
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("FastSimpleHierarchyLayout")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastSimpleHierarchyLayout")
+ .set_module ("HierarchyLayoutModule", this));
+
+ s.declare (key ("FastSimpleHierarchyLayout.layerDistance")
+ .type ("length")
+ .alias ("level distance")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastSimpleHierarchyLayout"));
+
+ s.declare (key ("FastSimpleHierarchyLayout.siblingDistance")
+ .type ("length")
+ .alias ("sibling distance")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.FastSimpleHierarchyLayout"));
+ }
+};
+
+
diff --git a/graphics/pgf/base/source/GEMLayout_script.h b/graphics/pgf/base/source/GEMLayout_script.h
new file mode 100644
index 0000000000..7b4fda7e68
--- /dev/null
+++ b/graphics/pgf/base/source/GEMLayout_script.h
@@ -0,0 +1,101 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/GEMLayout.h>
+
+struct GEMLayout_script :
+ scripting::declarations,
+ scripting::factory<ogdf::GEMLayout>
+{
+ ogdf::GEMLayout* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ GEMLayout* r = new GEMLayout;
+
+ parameters->configure_option ("GEMLayout.numberOfRounds",
+ &GEMLayout::numberOfRounds, *r);
+ parameters->configure_option ("GEMLayout.minimalTemperature",
+ &GEMLayout::minimalTemperature, *r);
+ parameters->configure_option ("GEMLayout.initialTemperature",
+ &GEMLayout::initialTemperature, *r);
+ parameters->configure_option ("GEMLayout.gravitationalConstant",
+ &GEMLayout::gravitationalConstant, *r);
+ parameters->configure_option ("GEMLayout.desiredLength",
+ &GEMLayout::desiredLength, *r);
+ parameters->configure_option ("GEMLayout.maximalDisturbance",
+ &GEMLayout::maximalDisturbance, *r);
+ parameters->configure_option ("GEMLayout.rotationAngle",
+ &GEMLayout::rotationAngle, *r);
+ parameters->configure_option ("GEMLayout.oscillationAngle",
+ &GEMLayout::oscillationAngle, *r);
+ parameters->configure_option ("GEMLayout.rotationSensitivity",
+ &GEMLayout::rotationSensitivity, *r);
+ parameters->configure_option ("GEMLayout.oscillationSensitivity",
+ &GEMLayout::oscillationSensitivity, *r);
+ parameters->configure_option ("GEMLayout.attractionFormula",
+ &GEMLayout::attractionFormula, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("GEMLayout")
+ .set_module ("LayoutModule", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.numberOfRounds")
+ .type ("number")
+ .initial ("20000")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.minimalTemperature")
+ .type ("number")
+ .initial ("0.005")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.initialTemperature")
+ .type ("number")
+ .initial ("10")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.gravitationalConstant")
+ .type ("number")
+ .initial ("0.0625")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.desiredLength")
+ .type ("length")
+ .alias_function ("function (o) return o['node pre sep'] + o['node post sep'] end")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.maximalDisturbance")
+ .type ("number")
+ .initial ("0")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.rotationAngle")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.oscillationAngle")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.rotationSensitivity")
+ .type ("number")
+ .initial ("0.01")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.oscillationSensitivity")
+ .type ("number")
+ .initial ("0.3")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ s.declare (key ("GEMLayout.attractionFormula")
+ .type ("number")
+ .initial ("1")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.GEMLayout"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/GreedyCycleRemoval_script.h b/graphics/pgf/base/source/GreedyCycleRemoval_script.h
new file mode 100644
index 0000000000..7461698141
--- /dev/null
+++ b/graphics/pgf/base/source/GreedyCycleRemoval_script.h
@@ -0,0 +1,20 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/GreedyCycleRemoval.h>
+
+struct GreedyCycleRemoval_script :
+ scripting::declarations,
+ scripting::factory<ogdf::GreedyCycleRemoval>
+{
+
+ ogdf::GreedyCycleRemoval* make (scripting::run_parameters* parameters) {
+ return new ogdf::GreedyCycleRemoval;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("GreedyCycleRemoval")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.GreedyCycleRemoval")
+ .set_module ("AcyclicSubgraphModule", this));
+ }
+};
+
diff --git a/graphics/pgf/base/source/GreedyInsertHeuristic_script.h b/graphics/pgf/base/source/GreedyInsertHeuristic_script.h
new file mode 100644
index 0000000000..4ab2675b5a
--- /dev/null
+++ b/graphics/pgf/base/source/GreedyInsertHeuristic_script.h
@@ -0,0 +1,20 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/GreedyInsertHeuristic.h>
+
+struct GreedyInsertHeuristic_script :
+ scripting::declarations,
+ scripting::factory<ogdf::GreedyInsertHeuristic>
+{
+
+ ogdf::GreedyInsertHeuristic* make (scripting::run_parameters* parameters) {
+ return new ogdf::GreedyInsertHeuristic;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("GreedyInsertHeuristic")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.GreedyInsertHeuristic")
+ .set_module ("TwoLayerCrossMin", this));
+ }
+};
+
diff --git a/graphics/pgf/base/source/INSTALL b/graphics/pgf/base/source/INSTALL
new file mode 100644
index 0000000000..0690faba7d
--- /dev/null
+++ b/graphics/pgf/base/source/INSTALL
@@ -0,0 +1,28 @@
+In order to use the C code in these directories, you should first
+modify / setup the file config/LocalMakefileConfig.mk, which is
+included by the main Makefiles and allows you to overwrite the
+settings from config/Makefile.mk.
+
+Once this is done, run make.
+
+You must then use the install targets to copy / link the resulting
+shared libraries with their full paths into the "luatex/lib"
+subdirectory of the directory where your TeX executable resides. For
+instance, if the luatex program is in
+
+/usr/texbin
+
+then you would put SimpleDemoC.so into
+
+/usr/texbin/lib/luatex/lua/pgf/gd/examples/c
+
+
+Due to bugs in the LuaTeX code, you currently need to append the paths
+of the libraries to their name as done in the Makefiles.
+
+Note that, currently, the Makefile will link the Lua library
+statically into the shared graph drawing library (at least on
+MacOS). This is conceptually wrong and, indeed, a lot of effort was
+need to avoid having LuaTeX crash on a TeX run because of two Lua
+libraries being used simultaneously. It works, but hopefully, in the
+fututure, this will be fixed. \ No newline at end of file
diff --git a/graphics/pgf/base/source/IndependentSetMerger_script.h b/graphics/pgf/base/source/IndependentSetMerger_script.h
new file mode 100644
index 0000000000..2d950f8b9c
--- /dev/null
+++ b/graphics/pgf/base/source/IndependentSetMerger_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/IndependentSetMerger.h>
+
+struct IndependentSetMerger_script :
+ scripting::declarations,
+ scripting::factory<ogdf::IndependentSetMerger>
+{
+ ogdf::IndependentSetMerger* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ IndependentSetMerger* r = new IndependentSetMerger;
+
+ parameters->configure_option ("IndependentSetMerger.searchDepthBase",
+ &IndependentSetMerger::setSearchDepthBase, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("IndependentSetMerger")
+ .set_module ("MultilevelBuilder", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.IndependentSetMerger"));
+
+ s.declare (key ("IndependentSetMerger.searchDepthBase")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.IndependentSetMerger"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/InterfaceFromC++.c++ b/graphics/pgf/base/source/InterfaceFromC++.c++
new file mode 100644
index 0000000000..11c1f99dee
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromC++.c++
@@ -0,0 +1,215 @@
+
+// Own header:
+#include <pgf/gd/interface/c/InterfaceFromC++.h>
+
+extern "C" {
+
+// Own C header:
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+
+// Lua stuff:
+#include <lauxlib.h>
+
+}
+
+
+namespace {
+
+ void cpp_caller(pgfgd_SyntacticDigraph* g, void* f)
+ {
+ using namespace scripting;
+
+ run_parameters p;
+ p.syntactic_digraph = g;
+
+ runner* algo = static_cast<runner*> (f);
+
+ algo->prepare(&p);
+ algo->bridge();
+ algo->run();
+ algo->unbridge();
+ }
+
+}
+
+
+namespace scripting {
+
+ // The key class
+
+ key::key(const char* key) : d (pgfgd_new_key(key)) {}
+ key::key(struct pgfgd_Declaration* dec) : d (dec) {}
+ key::~key() {pgfgd_free_key(d); }
+
+ const key& key::summary (const char* x) const {
+ pgfgd_key_summary(d, x);
+ return *this;
+ }
+
+ const key& key::initial (const char* x) const {
+ pgfgd_key_initial(d, x);
+ return *this;
+ }
+
+ const key& key::initial (factory_base* fac) const {
+ pgfgd_key_initial_user(d, static_cast<void*>(fac));
+ return *this;
+ }
+
+ const key& key::type (const char* x) const {
+ pgfgd_key_type(d, x);
+ return *this;
+ }
+
+ const key& key::module_type () const {
+ pgfgd_key_type(d, "user value");
+ return *this;
+ }
+
+ const key& key::default_value (const char* x) const {
+ pgfgd_key_default(d, x);
+ return *this;
+ }
+
+ const key& key::alias (const char* x) const {
+ pgfgd_key_alias(d, x);
+ return *this;
+ }
+
+ const key& key::alias_function (const char* x) const {
+ pgfgd_key_alias_function(d, x);
+ return *this;
+ }
+
+ const key& key::documentation (const char* x) const {
+ pgfgd_key_documentation(d, x);
+ return *this;
+ }
+
+ const key& key::documentation_in (const char* x) const {
+ pgfgd_key_documentation_in(d, x);
+ return *this;
+ }
+
+ const key& key::phase (const char* x) const {
+ pgfgd_key_phase(d, x);
+ return *this;
+ }
+
+ const key& key::set_key (const char* k, const char* v) const {
+ pgfgd_key_add_use(d, k, v);
+ return *this;
+ }
+
+ const key& key::set_module (const char* k, factory_base* fac) const {
+ pgfgd_key_add_use_user(d, k, static_cast<void*>(fac));
+ return *this;
+ }
+
+ const key& key::example (const char* x) const {
+ pgfgd_key_add_example(d, x);
+ return *this;
+ }
+
+ const key& key::precondition (const char* x) const {
+ pgfgd_key_add_precondition(d, x);
+ return *this;
+ }
+
+ const key& key::postcondition (const char* x) const {
+ pgfgd_key_add_postcondition(d, x);
+ return *this;
+ }
+
+ const key& key::algorithm (runner* a) const {
+ pgfgd_key_algorithm(d, cpp_caller, static_cast<void*>(a));
+ return *this;
+ }
+
+
+ // The script class
+
+ script::script (struct lua_State* s) : state(s) {}
+
+ void script::declare (const key& k) {
+ pgfgd_declare(state, k.d);
+ }
+
+ void script::declare (declarations* d) {
+ d->declare(*this);
+ }
+
+ void script::declare (declarations& d) {
+ d.declare(*this);
+ }
+
+
+ // The run_parameters class
+
+ namespace {
+
+ // Helpers:
+ template <class T>
+ bool fromnumber (pgfgd_SyntacticDigraph* g, const char* k, T& t)
+ {
+ if (pgfgd_isnumber(g->options, k)) {
+ t = static_cast<T>(pgfgd_tonumber(g->options, k));
+ return true;
+ }
+ return false;
+ }
+
+ };
+
+ template <> bool run_parameters::option<bool> (const char* k, bool& t)
+ {
+ if (pgfgd_isboolean(syntactic_digraph->options, k)) {
+ t = static_cast<bool>(pgfgd_toboolean(syntactic_digraph->options, k));
+ return true;
+ }
+ return false;
+ }
+
+ template <> bool run_parameters::option<char*> (const char* k, char*& t)
+ {
+ if (pgfgd_isstring(syntactic_digraph->options, k)) {
+ t = pgfgd_tostring(syntactic_digraph->options, k);
+ return true;
+ }
+ return false;
+ }
+
+ template <> bool run_parameters::option<short> (const char* k, short& t)
+ { return fromnumber<short> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<unsigned short> (const char* k, unsigned short& t)
+ { return fromnumber<unsigned short> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<int> (const char* k, int& t)
+ { return fromnumber<int> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<unsigned int> (const char* k, unsigned int& t)
+ { return fromnumber<unsigned int> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<long> (const char* k, long& t)
+ { return fromnumber<long> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<unsigned long> (const char* k, unsigned long& t)
+ { return fromnumber<unsigned long> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<float> (const char* k, float& t)
+ { return fromnumber<float> (syntactic_digraph, k, t); }
+
+ template <> bool run_parameters::option<double> (const char* k, double& t)
+ { return fromnumber<double> (syntactic_digraph, k, t); }
+
+ void* run_parameters::invoke_void_factory_for (const char* k)
+ {
+ if (pgfgd_isuser (syntactic_digraph->options, k)) {
+ factory_base* user = static_cast<factory_base *>(pgfgd_touser (syntactic_digraph->options, k));
+ return user->make_void(this);
+ }
+ return 0;
+ }
+
+}
diff --git a/graphics/pgf/base/source/InterfaceFromC++.h b/graphics/pgf/base/source/InterfaceFromC++.h
new file mode 100644
index 0000000000..40cccb7884
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromC++.h
@@ -0,0 +1,190 @@
+#ifndef PGF_GD_INTERFACE_C_INTERFACEFROMCPP_H
+#define PGF_GD_INTERFACE_C_INTERFACEFROMCPP_H
+
+/** \file pgf/gd/interface/c/InterfaceFromC++.h
+
+ The C++-header file that should be used by algorithms written
+ in C++ for graph drawing in Lua.
+*/
+
+
+struct lua_State;
+struct pgfgd_Declaration;
+struct pgfgd_SyntacticDigraph;
+
+namespace scripting {
+
+ // Forward;
+ class script;
+ class run_parameters;
+
+
+ class runner {
+ public:
+
+ void prepare (run_parameters* p) { parameters = p; }
+
+ virtual void bridge () {}
+ virtual void run () = 0;
+ virtual void unbridge () {}
+
+ virtual ~runner () {}
+
+ protected:
+
+ run_parameters* parameters;
+
+ };
+
+ class factory_base {
+ public:
+ virtual void* make_void (run_parameters*) = 0;
+ virtual ~factory_base () {}
+ };
+
+ template <class T> class factory : public factory_base {
+ virtual void* make_void (run_parameters*r) { return static_cast<void*>(make(r)); }
+ virtual T* make (run_parameters*) { return new T(); }
+ };
+
+ class key {
+ public:
+
+ key (const char*);
+ key (struct pgfgd_Declaration*);
+ ~key ();
+
+ const key& summary (const char*) const;
+ const key& initial (const char*) const;
+ const key& initial (factory_base*) const;
+ const key& type (const char*) const;
+ const key& module_type () const;
+ const key& default_value (const char*) const;
+ const key& alias (const char*) const;
+ const key& alias_function (const char*) const;
+ const key& documentation (const char*) const;
+ const key& documentation_in (const char*) const;
+ const key& phase (const char*) const;
+ const key& set_key (const char*, const char*) const;
+ const key& set_module (const char*, factory_base*) const;
+ const key& example (const char*) const;
+ const key& precondition (const char*) const;
+ const key& postcondition (const char*) const;
+ const key& algorithm (runner*) const;
+
+ private:
+
+ struct pgfgd_Declaration* d;
+ friend class script;
+
+ key (const key& k); // Not implemented.
+ key& operator = (const key& k); // Not implemented.
+
+ };
+
+
+ // Declarations are useful for scripting:
+
+ class declarations {
+
+ public:
+
+ virtual void declare (script) = 0;
+ virtual ~declarations () {}
+
+ };
+
+
+ // The script class
+
+ class script {
+
+ public:
+
+ script (struct lua_State*);
+
+ // Declares a key
+ void declare (const key&);
+ void declare (declarations&);
+ void declare (declarations*);
+
+ private:
+
+ struct lua_State* state;
+
+ };
+
+
+
+ // Declaring algorithms defined in a function
+
+ class function_runner : public runner {
+ public:
+ function_runner (void (*f) (run_parameters&)) : fun(f) {}
+ virtual void run () { fun(*parameters); }
+
+ private:
+ void (*fun) (run_parameters&);
+ };
+
+
+ // Configuring a class
+
+ class run_parameters {
+ public:
+
+ struct pgfgd_SyntacticDigraph* syntactic_digraph;
+
+ template <class Layout, class T>
+ void configure_option (const char*, void (Layout::*) (T), Layout&);
+
+ template <class Layout, class T>
+ void configure_module (const char*, void (Layout::*) (T*), Layout&);
+
+ template <class T> bool option (const char*, T&);
+ template <class T> T option (const char*);
+ template <class T> bool option_is_set (const char*);
+
+ template <class T> T* make (const char*);
+
+ protected:
+ void* invoke_void_factory_for (const char*);
+ };
+
+ template <class T>
+ T run_parameters::option (const char* k)
+ {
+ T t;
+ option (k, t);
+ return t;
+ }
+
+ template <class T>
+ bool run_parameters::option_is_set (const char* k)
+ {
+ T t;
+ return option(k, t);
+ }
+
+ template <class Layout, class T>
+ void run_parameters::configure_option (const char* k, void (Layout::*f) (T), Layout& l)
+ {
+ T t;
+ if (option<T> (k, t))
+ (l.*f) (t);
+ }
+
+ template <class Layout, class T>
+ void run_parameters::configure_module (const char* k, void (Layout::*f) (T*), Layout& l)
+ {
+ if (void* obj = invoke_void_factory_for(k))
+ (l.*f) (static_cast<T*> (obj));
+ }
+
+ template <class T>
+ T* run_parameters::make (const char* k) { return static_cast<T*>(invoke_void_factory_for(k)); }
+
+}
+
+
+#endif
diff --git a/graphics/pgf/base/source/InterfaceFromC.c b/graphics/pgf/base/source/InterfaceFromC.c
new file mode 100644
index 0000000000..b5606f2f39
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromC.c
@@ -0,0 +1,1189 @@
+
+// Own header:
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+
+// Lua stuff:
+#include <lauxlib.h>
+
+// C stuff:
+#include <stdlib.h>
+#include <string.h>
+
+
+// Remove once Lua Link Bug is fixed:
+//
+// The following is a hack to avoid a problem with the Lua lib being linked twice.
+// When this happens, two version of "dummynode" exist in Lua and we must ensure that
+// we never create a table using such a dummynode while using a second lib.
+// The following should later be set to 0 and replaced everywhere, once this is fixed.
+#define MIN_HASH_SIZE_FIX 1
+
+
+
+// Help functions
+
+static void set_field (lua_State* L, const char* what, const char* where)
+{
+ if (what) {
+ lua_pushstring(L, what);
+ lua_setfield(L, -2, where);
+ }
+}
+
+
+static void init_vertex_array(pgfgd_Vertex_array* a, int count)
+{
+ a->length = count;
+ a->array = (pgfgd_Vertex**) calloc(count, sizeof(pgfgd_Vertex*));
+}
+
+static void init_edge_array(pgfgd_Edge_array* a, int count)
+{
+ a->length = count;
+ a->array = (pgfgd_Edge**) calloc(count, sizeof(pgfgd_Edge*));
+}
+
+static void init_arcs_array(pgfgd_Arc_array* arcs, int length)
+{
+ arcs->length = length;
+ arcs->tails = (int*) calloc(length, sizeof(int));
+ arcs->heads = (int*) calloc(length, sizeof(int));
+}
+
+static void init_path(pgfgd_Path* a, int count)
+{
+ a->length = count;
+ a->coordinates = (pgfgd_Coordinate*) calloc(count, sizeof(pgfgd_Coordinate));
+ a->strings = (char**) calloc(count, sizeof(char*));
+}
+
+static void clear_path(pgfgd_Path* p)
+{
+ int i;
+ for (i=0; i < p->length; i++)
+ free(p->strings[i]);
+
+ free(p->strings);
+ free(p->coordinates);
+
+ p->length = 0;
+ p->strings = 0;
+ p->coordinates = 0;
+}
+
+
+
+// Option handling
+
+struct pgfgd_OptionTable {
+ lua_State* state;
+
+ int kind;
+ int index;
+};
+
+// These are the indices of the parameters during a run of the main
+// algorithm:
+#define GRAPH_INDEX 1
+#define VERTICES_INDEX 2
+#define EDGES_INDEX 3
+#define ALGORITHM_INDEX 4
+
+// This is the index of a special table mapping vertices back to the
+// index they have. It is created in the C code, but stays on the
+// stack during the computations.
+#define BACKINDEX_STORAGE_INDEX 5
+
+// These are the positions of different upvalues for the C closure of
+// a C algorithm.
+#define FUNCTION_UPVALUE 1
+#define USER_UPVALUE 2
+#define DIGRAPH_OBJECT_UPVALUE 3
+
+
+static pgfgd_OptionTable* make_option_table(lua_State* L, int kind, int index)
+{
+ pgfgd_OptionTable* t = (pgfgd_OptionTable*) malloc(sizeof(pgfgd_OptionTable));
+
+ t->state = L;
+ t->kind = kind;
+ t->index = index;
+
+ return t;
+}
+
+static void push_option_table(pgfgd_OptionTable* t)
+{
+ switch (t->kind) {
+ case GRAPH_INDEX:
+ lua_getfield(t->state, GRAPH_INDEX, "options");
+ break;
+ case VERTICES_INDEX:
+ lua_rawgeti(t->state, VERTICES_INDEX, t->index);
+ lua_getfield(t->state, -1, "options");
+ lua_replace(t->state, -2);
+ break;
+ case EDGES_INDEX:
+ lua_rawgeti(t->state, EDGES_INDEX, t->index);
+ lua_getfield(t->state, -1, "options");
+ lua_replace(t->state, -2);
+ break;
+ }
+}
+
+int pgfgd_isset(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ int is_nil = lua_isnil(t->state, -1);
+ lua_pop(t->state, 2);
+ return !is_nil;
+}
+
+int pgfgd_isnumber(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ int is_number = lua_isnumber(t->state, -1);
+ lua_pop(t->state, 2);
+ return is_number;
+}
+
+int pgfgd_isboolean(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ int is_bool = lua_isboolean(t->state, -1);
+ lua_pop(t->state, 2);
+ return is_bool;
+}
+
+int pgfgd_isstring(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ int is_string = lua_isstring(t->state, -1);
+ lua_pop(t->state, 2);
+ return is_string;
+}
+
+int pgfgd_isuser(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ int is_user = lua_isuserdata(t->state, -1);
+ lua_pop(t->state, 2);
+ return is_user;
+}
+
+
+double pgfgd_tonumber(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ double d = lua_tonumber(t->state, -1);
+ lua_pop(t->state, 2);
+ return d;
+}
+
+int pgfgd_toboolean(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ int d = lua_toboolean(t->state, -1);
+ lua_pop(t->state, 2);
+ return d;
+}
+
+char* pgfgd_tostring(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ const char* s = lua_tostring(t->state, -1);
+ char* copy = strcpy((char*) malloc(strlen(s)+1), s);
+ lua_pop(t->state, 2);
+ return copy;
+}
+
+void* pgfgd_touser(pgfgd_OptionTable* t, const char* key)
+{
+ push_option_table(t);
+ lua_getfield(t->state, -1, key);
+ void* d = lua_touserdata(t->state, -1);
+ lua_pop(t->state, 2);
+ return d;
+}
+
+
+// Handling algorithms
+
+struct pgfgd_SyntacticDigraph_internals {
+ lua_State* state;
+};
+
+static char* make_string_from(lua_State* L, const char* name)
+{
+ lua_getfield(L, -1, name);
+ if (lua_isnil(L, -1)) {
+ // Field not set; return emtpy string.
+ lua_pop(L, 1);
+ return (char*) calloc(1, sizeof(char));
+ }
+ else {
+ const char* s = lua_tostring(L, -1);
+ char* copy = strcpy((char*) malloc(strlen(s)+1), s);
+ lua_pop(L, 1);
+ return copy;
+ }
+}
+
+static void make_coordinate(lua_State* L, pgfgd_Coordinate* c)
+{
+ lua_getfield(L, -1, "x");
+ c->x = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "y");
+ c->y = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+}
+
+static pgfgd_Path* make_empty_path(lua_State* L)
+{
+ return (pgfgd_Path*) calloc(1, sizeof(pgfgd_Path));
+}
+
+static pgfgd_Path* make_path(lua_State* L)
+{
+ /* Path object must be on top of stack. */
+ pgfgd_Path* p = make_empty_path(L);
+
+ // Fill path:
+ int path_length = lua_rawlen(L, -1);
+ if (path_length > 0) {
+ init_path(p, path_length);
+ int i;
+ for (i = 0; i < path_length; i++) {
+ lua_rawgeti(L, -1, i+1);
+ if (lua_isstring(L, -1)) {
+ const char* s = lua_tostring(L, -1);
+ p->strings[i] = strcpy((char*) malloc(strlen(s)+1), s);
+ } else {
+ lua_getfield(L, -1, "x");
+ p->coordinates[i].x = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "y");
+ p->coordinates[i].y = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ }
+ lua_pop(L, 1);
+ }
+ }
+
+ return p;
+}
+
+static void construct_digraph(lua_State* L, pgfgd_SyntacticDigraph* d)
+{
+ d->internals = (pgfgd_SyntacticDigraph_internals*) calloc(1, sizeof(pgfgd_SyntacticDigraph_internals));
+ d->internals->state = L;
+
+ // Create the options table:
+ d->options = make_option_table(L, GRAPH_INDEX, 0);
+
+ // Create the vertex table
+ init_vertex_array(&d->vertices, lua_rawlen(L, VERTICES_INDEX));
+
+ // Create the vertices
+ int i;
+ for (i=0; i<d->vertices.length; i++) {
+ pgfgd_Vertex* v = (pgfgd_Vertex*) calloc(1, sizeof(pgfgd_Vertex));
+
+ // Push the vertex onto the Lua stack:
+ lua_rawgeti(L, VERTICES_INDEX, i+1);
+
+ // Fill v with information:
+ v->name = make_string_from(L, "name");
+ v->shape = make_string_from(L, "shape");
+ v->kind = make_string_from(L, "kind");
+
+ // Options:
+ v->options = make_option_table(L, VERTICES_INDEX, i+1);
+
+ // Index:
+ v->array_index = i;
+
+ // Setup pos field
+ lua_getfield(L, -1, "pos");
+ make_coordinate(L, &v->pos);
+ lua_pop(L, 1);
+
+ // Setup path array:
+ lua_getfield(L, -1, "path");
+ v->path = make_path(L);
+ lua_pop(L, 1);
+
+ // Pop the vertex
+ lua_pop(L, 1);
+
+ d->vertices.array[i] = v;
+ }
+
+ // Construct the edges:
+ init_edge_array(&d->syntactic_edges, lua_rawlen(L, EDGES_INDEX));
+
+ int edge_index;
+ for (edge_index = 0; edge_index < d->syntactic_edges.length; edge_index++) {
+ pgfgd_Edge* e = (pgfgd_Edge*) calloc(1, sizeof(pgfgd_Edge));
+
+ lua_rawgeti(L, EDGES_INDEX, edge_index+1);
+
+ e->direction = make_string_from(L, "direction");
+ e->options = make_option_table(L, EDGES_INDEX, edge_index+1);
+
+ // Index:
+ e->array_index = edge_index;
+
+ // Compute the tail vertex index:
+ lua_getfield(L, -1, "tail");
+ lua_gettable(L, VERTICES_INDEX);
+ e->tail = d->vertices.array[lua_tointeger(L, -1) - 1];
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "head");
+ lua_gettable(L, VERTICES_INDEX);
+ e->head = d->vertices.array[lua_tointeger(L, -1) - 1];
+ lua_pop(L, 1);
+
+ // Fill path:
+ e->path = make_empty_path(L);
+ e->path->length = -1; // Means that a default path should be created.
+
+ // Pop the edge form the Lua stack:
+ lua_pop(L, 1);
+
+ d->syntactic_edges.array[edge_index] = e;
+ }
+}
+
+
+static void sync_digraph(lua_State* L, pgfgd_SyntacticDigraph* d)
+{
+ // Writes back the computed position information to the digraph:
+ int i;
+ for (i=0; i<d->vertices.length; i++) {
+
+ // Push pos field of vertex:
+ lua_rawgeti(L, VERTICES_INDEX, i+1);
+ lua_getfield(L, -1, "pos");
+
+ // Set x and y coordinates:
+ pgfgd_Vertex* v = d->vertices.array[i];
+ lua_pushnumber(L, v->pos.x);
+ lua_setfield(L, -2, "x");
+ lua_pushnumber(L, v->pos.y);
+ lua_setfield(L, -2, "y");
+
+ // pop pos and vertex
+ lua_pop(L, 2);
+ }
+
+ // Write back the paths
+
+ int tos = lua_gettop(L);
+
+ // First, get "Coordinate.new" as a "local"
+ lua_getglobal(L, "require");
+ lua_pushstring(L, "pgf.gd.model.Path");
+ lua_call(L, 1, 1);
+ int Path_index = lua_gettop(L);
+
+ lua_getglobal(L, "require");
+ lua_pushstring(L, "pgf.gd.model.Coordinate");
+ lua_call(L, 1, 1);
+ lua_getfield(L, -1, "new");
+
+ int Coordinate_new_index = lua_gettop(L);
+
+ for (i=0; i < d->syntactic_edges.length; i++) {
+ pgfgd_Edge* e = d->syntactic_edges.array[i];
+
+ lua_rawgeti(L, EDGES_INDEX, i+1);
+
+ if (e->path->length == -1) {
+ // Create default path
+ pgfgd_path_append_moveto_tail(e);
+ pgfgd_path_append_lineto_head(e);
+ }
+
+ lua_createtable(L, e->path->length ? e->path->length : 1, MIN_HASH_SIZE_FIX);
+ lua_pushvalue(L, Path_index);
+ lua_setmetatable(L, -2);
+
+ int j;
+ for (j=0; j<e->path->length; j++) {
+ if (e->path->strings[j]) {
+ lua_pushstring(L, e->path->strings[j]);
+ lua_rawseti(L, -2, j+1);
+ } else {
+ lua_pushvalue(L, Coordinate_new_index);
+ lua_pushnumber(L, e->path->coordinates[j].x);
+ lua_pushnumber(L, e->path->coordinates[j].y);
+ lua_call(L, 2, 1);
+
+ lua_rawseti(L, -2, j+1);
+ }
+ }
+
+ lua_setfield(L, -2, "path");
+ lua_pop(L, 1); // The edge object
+ }
+
+ lua_settop(L, tos); // Cleanup
+}
+
+
+static void free_digraph(pgfgd_SyntacticDigraph* digraph)
+{
+ int i;
+ for (i=0; i < digraph->vertices.length; i++) {
+ pgfgd_Vertex* v = digraph->vertices.array[i];
+
+ clear_path(v->path);
+ free(v->path);
+ free(v->name);
+ free(v->shape);
+ free(v->kind);
+ free(v->options);
+ free(v->incoming.array);
+ free(v->outgoing.array);
+ free(v);
+ }
+
+ for (i=0; i < digraph->syntactic_edges.length; i++) {
+ pgfgd_Edge* e = digraph->syntactic_edges.array[i];
+
+ clear_path(e->path);
+ free(e->path);
+ free(e->direction);
+ free(e->options);
+ free(e);
+ }
+
+ free(digraph->vertices.array);
+ free(digraph->syntactic_edges.array);
+ free(digraph->options);
+ free(digraph->internals);
+ free(digraph);
+}
+
+static int algorithm_dispatcher(lua_State* L)
+{
+ // Create the back index table. It will be at index BACKINDEX_STORAGE_INDEX
+ lua_createtable(L, 0, MIN_HASH_SIZE_FIX);
+
+ // The actual function is stored in an upvalue.
+ pgfgd_SyntacticDigraph* digraph = (pgfgd_SyntacticDigraph*) calloc(1, sizeof(pgfgd_SyntacticDigraph));
+
+ construct_digraph(L, digraph);
+
+ pgfgd_algorithm_fun fun = lua_touserdata(L, lua_upvalueindex(FUNCTION_UPVALUE));
+ fun(digraph, lua_touserdata(L, lua_upvalueindex(USER_UPVALUE)));
+
+ sync_digraph(L, digraph);
+
+ free_digraph(digraph);
+
+ return 0;
+}
+
+
+int pgfgd_vertex_anchor(pgfgd_Vertex* v, const char* anchor, double* x, double* y)
+{
+ lua_State* L = v->options->state;
+
+ // Ok, first, find the vertex:
+ lua_rawgeti(L, VERTICES_INDEX, v->array_index+1);
+
+ // Find the anchor function:
+ lua_getfield(L, -1, "anchor");
+ lua_pushvalue(L, -2);
+ lua_pushstring(L, anchor);
+
+ // Find the anchor:
+ lua_call(L, 2, 1);
+
+ if (lua_isnil(L, -1)) {
+ // Failed. Cleanup!
+ lua_pop(L, 2);
+ *x = 0;
+ *y = 0;
+ return 0;
+ } else {
+ lua_getfield(L, -1, "x");
+ *x = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+
+ lua_getfield(L, -1, "y");
+ *y = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+
+ lua_pop(L, 2);
+ return 1;
+ }
+ return 0;
+}
+
+
+
+void pgfgd_path_clear(pgfgd_Edge* e)
+{
+ clear_path (e->path);
+}
+
+static void path_add_segment(pgfgd_Edge* edge, const char* s, int num, double a, double b, double c, double d, double e, double f)
+{
+ if (edge->path->length == -1)
+ pgfgd_path_clear(edge);
+
+ int start = edge->path->length;
+
+ edge->path->length += num + 1;
+ edge->path->strings = (char **)
+ realloc(edge->path->strings, edge->path->length*sizeof(char*));
+ edge->path->coordinates = (pgfgd_Coordinate*)
+ realloc(edge->path->coordinates, edge->path->length*sizeof(pgfgd_Coordinate));
+
+ edge->path->coordinates[start].x = 0;
+ edge->path->coordinates[start].y = 0;
+ edge->path->strings[start] = strcpy((char*) malloc(strlen(s)+1), s);
+
+ if (num > 0) {
+ edge->path->coordinates[start+1].x = a;
+ edge->path->coordinates[start+1].y = b;
+ edge->path->strings[start+1] = 0;
+ }
+
+ if (num > 1) {
+ edge->path->coordinates[start+2].x = c;
+ edge->path->coordinates[start+2].y = d;
+ edge->path->strings[start+2] = 0;
+ }
+
+ if (num > 2) {
+ edge->path->coordinates[start+3].x = e;
+ edge->path->coordinates[start+3].y = f;
+ edge->path->strings[start+3] = 0;
+ }
+}
+
+
+void pgfgd_path_append_moveto(pgfgd_Edge* e, double x, double y)
+{
+ path_add_segment(e, "moveto", 1, x, y, 0, 0, 0, 0);
+}
+
+void pgfgd_path_append_moveto_tail (pgfgd_Edge* e)
+{
+ double x, y;
+ char* tail_anchor = pgfgd_tostring(e->tail->options, "tail anchor");
+
+ pgfgd_vertex_anchor(e->tail, tail_anchor, &x, &y);
+ x += e->tail->pos.x;
+ y += e->tail->pos.y;
+
+ pgfgd_path_append_moveto(e, x, y);
+ free(tail_anchor);
+}
+
+void pgfgd_path_append_lineto(pgfgd_Edge* e, double x, double y)
+{
+ path_add_segment(e, "lineto", 1, x, y, 0, 0, 0, 0);
+}
+
+void pgfgd_path_append_lineto_head (pgfgd_Edge* e)
+{
+ double x, y;
+ char* head_anchor = pgfgd_tostring(e->head->options, "head anchor");
+
+ pgfgd_vertex_anchor(e->head, head_anchor, &x, &y);
+ x += e->head->pos.x;
+ y += e->head->pos.y;
+
+ pgfgd_path_append_lineto(e, x, y);
+ free(head_anchor);
+}
+
+void pgfgd_path_append_curveto(pgfgd_Edge* edge, double a, double b, double c, double d, double e, double f)
+{
+ path_add_segment(edge, "curveto", 3, a, b, c, d, e, f);
+}
+
+void pgfgd_path_append_closepath(pgfgd_Edge* e)
+{
+ path_add_segment(e, "closepath", 0, 0, 0, 0, 0, 0, 0);
+}
+
+
+
+// Handling digraphs
+
+struct pgfgd_Digraph {
+ lua_State* state;
+ const char* name;
+ pgfgd_SyntacticDigraph* syntactic_digraph;
+};
+
+
+pgfgd_Digraph* pgfgd_get_digraph (pgfgd_SyntacticDigraph* g, const char* graph_name)
+{
+ lua_State* L = g->internals->state;
+
+ lua_getfield(L, ALGORITHM_INDEX, graph_name);
+ if (lua_isnil(L, -1))
+ luaL_error(L, "digraph named %s not found in algorithm class", graph_name);
+ lua_pop(L, 1);
+
+ pgfgd_Digraph* new = (pgfgd_Digraph*) calloc(1, sizeof(pgfgd_Digraph));
+
+ new->state = L;
+ new->name = graph_name;
+ new->syntactic_digraph = g;
+
+ return new;
+}
+
+int pgfgd_digraph_num_vertices (pgfgd_Digraph* g)
+{
+ lua_getfield(g->state, ALGORITHM_INDEX, g->name);
+ lua_getfield(g->state, -1, "vertices");
+ int num = lua_rawlen(g->state, -1);
+ lua_pop(g->state, 2);
+
+ return num;
+}
+
+static void push_digraph_and_backindex(pgfgd_Digraph* g)
+{
+ lua_State* L = g->state;
+
+ // Get digraph
+ lua_getfield(L, ALGORITHM_INDEX, g->name);
+ int digraph_pos = lua_gettop(L);
+
+ // Get entry in back index table
+ lua_pushvalue(L, digraph_pos);
+ lua_gettable(L, BACKINDEX_STORAGE_INDEX);
+ int backtable_pos = lua_gettop(L);
+ if (lua_isnil(L, backtable_pos)) {
+ // Aha. We need to install a new table:
+ lua_pop(L, 1); // Get rid of nil
+
+ lua_createtable(L, 0, MIN_HASH_SIZE_FIX);
+
+ lua_pushvalue(L, digraph_pos); // The digraph object
+ lua_pushvalue(L, backtable_pos); // The new table
+ lua_settable(L, BACKINDEX_STORAGE_INDEX);
+
+ // Fill the table:
+ lua_getfield(L, digraph_pos, "vertices");
+ int vertex_pos = lua_gettop(L);
+ int i;
+ int n = lua_rawlen(L, -1);
+ for (i = 1; i <= n; i++) {
+ lua_rawgeti(L, vertex_pos, i);
+ lua_pushinteger(L, i);
+ lua_settable(L, backtable_pos);
+ }
+ lua_pop(L, 1);
+ }
+}
+
+static pgfgd_Arc_array* build_c_array_of_arcs_from_lua_array_of_arcs(pgfgd_Digraph* g)
+{
+ lua_State* L = g->state;
+
+ pgfgd_Arc_array* arcs = (pgfgd_Arc_array*) calloc(1, sizeof(pgfgd_Arc_array));
+
+ int array_pos = lua_gettop(L);
+
+ push_digraph_and_backindex(g);
+ int backtable_pos = lua_gettop(L);
+
+ // Get number of arcs:
+ init_arcs_array(arcs, lua_rawlen(L, array_pos));
+ int i;
+ for (i = 1; i<=arcs->length; i++) {
+ lua_rawgeti(L, array_pos, i); // Get arcs[i]
+
+ // The tail field:
+ lua_getfield(L, -1, "tail");
+ lua_gettable(L, backtable_pos);
+
+ arcs->tails[i-1] = lua_tointeger(L, -1);
+ lua_pop(L, 1); // The number
+
+ // The head field:
+ lua_getfield(L, -1, "head");
+ lua_gettable(L, backtable_pos);
+ arcs->heads[i-1] = lua_tointeger(L, -1);
+ lua_pop(L, 1); // The number
+
+ lua_pop(L, 1); // Pop arcs[i]
+ }
+
+ lua_settop(L, array_pos);
+
+ return arcs;
+}
+
+
+pgfgd_Arc_array* pgfgd_digraph_arcs (pgfgd_Digraph* g)
+{
+ lua_getfield(g->state, ALGORITHM_INDEX, g->name);
+ lua_getfield(g->state, -1, "arcs");
+
+ pgfgd_Arc_array* a = build_c_array_of_arcs_from_lua_array_of_arcs(g);
+
+ lua_pop(g->state, 2);
+
+ return a;
+}
+
+
+pgfgd_Vertex* pgfgd_digraph_syntactic_vertex (pgfgd_Digraph* g, int v)
+{
+ int tos = lua_gettop(g->state);
+ pgfgd_Vertex* return_me = 0;
+
+ lua_getfield(g->state, ALGORITHM_INDEX, g->name);
+ lua_getfield(g->state, -1, "vertices");
+ lua_rawgeti(g->state, -1, v);
+
+ lua_gettable(g->state, VERTICES_INDEX);
+ if (lua_isnumber(g->state, -1)) {
+ return_me = g->syntactic_digraph->vertices.array[lua_tointeger(g->state, -1)-1];
+ }
+
+ lua_settop(g->state, tos);
+ return return_me;
+}
+
+
+int pgfgd_digraph_isarc (pgfgd_Digraph* g, int tail, int head)
+{
+ lua_State* L = g->state;
+ int is_arc = 0;
+
+ lua_getfield(L, ALGORITHM_INDEX, g->name);
+ int digraph_pos = lua_gettop(L);
+
+ lua_getfield(L, digraph_pos, "vertices");
+ int vertices_pos = lua_gettop(L);
+
+ // Call digraph:connected(tail, head)
+ lua_pushvalue(L, lua_upvalueindex(DIGRAPH_OBJECT_UPVALUE));
+ lua_getfield(L, -1, "arc");
+ lua_pushvalue(L, digraph_pos);
+ lua_rawgeti(L, vertices_pos, tail);
+ lua_rawgeti(L, vertices_pos, head);
+ lua_call(L, 3, 1);
+
+ is_arc = !lua_isnil(L, -1);
+
+ lua_settop(L, digraph_pos-1);
+
+ return is_arc;
+}
+
+pgfgd_Arc_array* pgfgd_digraph_incoming (pgfgd_Digraph* g, int v)
+{
+ lua_State* L = g->state;
+
+ lua_getfield(L, ALGORITHM_INDEX, g->name);
+ int digraph_pos = lua_gettop(L);
+
+ lua_getfield(L, digraph_pos, "vertices");
+ int vertices_pos = lua_gettop(L);
+
+ // Call digraph:connected(tail, head)
+ lua_pushvalue(L, lua_upvalueindex(DIGRAPH_OBJECT_UPVALUE));
+ lua_getfield(L, -1, "incoming");
+ lua_pushvalue(L, digraph_pos);
+ lua_rawgeti(L, vertices_pos, v);
+ lua_call(L, 2, 1);
+
+ pgfgd_Arc_array* a = build_c_array_of_arcs_from_lua_array_of_arcs(g);
+
+ lua_settop(L, digraph_pos-1);
+
+ return a;
+}
+
+pgfgd_Arc_array* pgfgd_digraph_outgoing (pgfgd_Digraph* g, int v)
+{
+ lua_State* L = g->state;
+
+ lua_getfield(L, ALGORITHM_INDEX, g->name);
+ int digraph_pos = lua_gettop(L);
+
+ lua_getfield(L, digraph_pos, "vertices");
+ int vertices_pos = lua_gettop(L);
+
+ // Call digraph:connected(tail, head)
+ lua_pushvalue(L, lua_upvalueindex(DIGRAPH_OBJECT_UPVALUE));
+ lua_getfield(L, -1, "outgoing");
+ lua_pushvalue(L, digraph_pos);
+ lua_rawgeti(L, vertices_pos, v);
+ lua_call(L, 2, 1);
+
+ pgfgd_Arc_array* a = build_c_array_of_arcs_from_lua_array_of_arcs(g);
+
+ lua_settop(L, digraph_pos-1);
+
+ return a;
+}
+
+pgfgd_Edge_array* pgfgd_digraph_syntactic_edges (pgfgd_Digraph* g, int tail, int head)
+{
+ pgfgd_Edge_array* edges = (pgfgd_Edge_array*) calloc(1, sizeof(pgfgd_Edge_array));
+
+ // First, get the arc in the syntatic digraph.
+ lua_State* L = g->state;
+ int tos = lua_gettop(L);
+
+ lua_getfield(L, ALGORITHM_INDEX, g->name);
+ int digraph_pos = lua_gettop(L);
+
+ lua_getfield(L, digraph_pos, "vertices");
+ int vertices_pos = lua_gettop(L);
+
+ // Call digraph:arc(tail, head)
+ lua_pushvalue(L, lua_upvalueindex(DIGRAPH_OBJECT_UPVALUE));
+ int digraph_class_index = lua_gettop(L);
+
+ lua_getfield(L, digraph_class_index, "arc");
+ lua_pushvalue(L, digraph_pos);
+ lua_rawgeti(L, vertices_pos, tail);
+ lua_rawgeti(L, vertices_pos, head);
+ lua_call(L, 3, 1);
+
+ if (!lua_isnil(L, -1)) {
+ // Get syntactic_digraph of the arc:
+ lua_getfield(L, -1, "syntactic_digraph");
+
+ // Call syntactic_digraph:arc(tail, head)
+ lua_getfield(L, digraph_class_index, "arc");
+ lua_pushvalue(L, -2);
+ lua_rawgeti(L, vertices_pos, tail);
+ lua_rawgeti(L, vertices_pos, head);
+ lua_call(L, 3, 1);
+
+ if (!lua_isnil(L, -1)) {
+ lua_getfield(L, -1, "syntactic_edges");
+ int syntactic_edges_index = lua_gettop(L);
+
+ int n = lua_rawlen(L, syntactic_edges_index);
+ init_edge_array(edges, n);
+ int i;
+ for (i=1; i<=n; i++) {
+ lua_rawgeti(L, syntactic_edges_index, i);
+ lua_gettable(L, EDGES_INDEX);
+ if (!lua_isnumber(L, -1)) {
+ pgfgd_digraph_free_edge_array(edges);
+ luaL_error(L, "syntactic edge index not found");
+ }
+ int p = lua_tonumber(L, -1);
+ edges->array[i-1] = g->syntactic_digraph->syntactic_edges.array[p-1];
+ }
+ }
+ }
+
+ lua_settop(L, tos);
+
+ return edges;
+}
+
+
+
+void pgfgd_digraph_free (pgfgd_Digraph* g)
+{
+ free(g);
+}
+
+void pgfgd_digraph_free_arc_array (pgfgd_Arc_array* arcs)
+{
+ free (arcs->tails);
+ free (arcs->heads);
+ free (arcs);
+}
+
+void pgfgd_digraph_free_edge_array (pgfgd_Edge_array* edges)
+{
+ free (edges->array);
+ free (edges);
+}
+
+
+
+// Handling declarations
+
+
+struct pgfgd_Declaration {
+ const char* key;
+ const char* summary;
+ const char* type;
+ const char* initial;
+ void* initial_user;
+ const char* default_value;
+ const char* alias;
+ const char* alias_function_string;
+ const char* documentation;
+ const char* documentation_in;
+ pgfgd_algorithm_fun algorithm;
+ void* algorithm_user;
+ const char* phase;
+
+ int use_length;
+ const char** use_keys;
+ const char** use_values_strings;
+ void** use_values_user;
+
+ int examples_length;
+ const char** examples;
+
+ int pre_length;
+ const char** pre;
+
+ int post_length;
+ const char** post;
+};
+
+
+pgfgd_Declaration* pgfgd_new_key (const char* key)
+{
+ pgfgd_Declaration* d = (pgfgd_Declaration*) calloc(1, sizeof(pgfgd_Declaration));
+
+ d->key = key;
+
+ return d;
+}
+
+void pgfgd_declare(struct lua_State* state, pgfgd_Declaration* d)
+{
+ if (d && d->key) {
+ int tos = lua_gettop(state);
+
+ lua_gc(state, LUA_GCSTOP, 0); // Remove once Lua Link Bug is fixed
+
+ // Find declare function:
+ lua_getglobal(state, "require");
+ lua_pushstring(state, "pgf.gd.interface.InterfaceToAlgorithms");
+ lua_call(state, 1, 1);
+ lua_getfield(state, -1, "declare");
+
+ // Build a Lua table:
+ lua_createtable(state, 0, 11);
+
+ set_field (state, d->key, "key");
+ set_field (state, d->summary, "summary");
+ set_field (state, d->type, "type");
+ set_field (state, d->initial, "initial");
+ set_field (state, d->documentation, "documentation");
+ set_field (state, d->documentation_in, "documentation_in");
+ set_field (state, d->default_value, "default");
+ set_field (state, d->alias, "alias");
+ set_field (state, d->alias_function_string, "alias_function_string");
+ set_field (state, d->phase, "phase");
+
+ if (d->initial_user) {
+ lua_pushlightuserdata(state, d->initial_user);
+ lua_setfield(state, -2, "initial");
+ }
+
+ if (d->use_length > 0) {
+ lua_createtable(state, d->use_length, MIN_HASH_SIZE_FIX);
+ int i;
+ for (i=0; i < d->use_length; i++) {
+ lua_createtable(state, 0, 2);
+ set_field(state, d->use_keys[i], "key");
+ if (d->use_values_strings[i])
+ set_field(state, d->use_values_strings[i], "value");
+ if (d->use_values_user[i]) {
+ lua_pushlightuserdata(state, d->use_values_user[i]);
+ lua_setfield(state, -2, "value");
+ }
+ lua_rawseti(state, -2, i+1);
+ }
+ lua_setfield(state, -2, "use");
+ }
+
+ if (d->pre) {
+ lua_createtable(state, 0, d->pre_length);
+ int i;
+ for (i=0; i < d->pre_length; i++) {
+ lua_pushboolean(state, 1);
+ lua_setfield(state, -2, d->pre[i]);
+ }
+ lua_setfield(state, -2, "preconditions");
+ }
+
+ if (d->post) {
+ lua_createtable(state, 0, d->post_length);
+ int i;
+ for (i=0; i < d->post_length; i++) {
+ lua_pushboolean(state, 1);
+ lua_setfield(state, -2, d->post[i]);
+ }
+ lua_setfield(state, -2, "postconditions");
+ }
+
+ if (d->examples) {
+ lua_createtable(state, d->examples_length, MIN_HASH_SIZE_FIX);
+ int i;
+ for (i=0; i < d->examples_length; i++) {
+ lua_pushstring(state, d->examples[i]);
+ lua_rawseti(state, -2, i+1);
+ }
+ lua_setfield(state, -2, "examples");
+ }
+
+ if (d->algorithm) {
+ // The algorithm function and the user data is stored as lightuserdate upvalue
+ lua_pushlightuserdata(state, (void *) d->algorithm);
+ lua_pushlightuserdata(state, (void *) d->algorithm_user);
+
+ // Find the Digraph.arc function and store it as the second upvalue:
+ lua_getglobal(state, "require");
+ lua_pushstring(state, "pgf.gd.model.Digraph");
+ lua_call(state, 1, 1);
+
+ lua_pushcclosure(state, algorithm_dispatcher, 3);
+ lua_setfield(state, -2, "algorithm_written_in_c");
+ }
+
+ // Call the declare function:
+ lua_call(state, 1, 0);
+
+ // Cleanup:
+ lua_settop(state, tos);
+
+ lua_gc(state, LUA_GCRESTART, 0); // Remove once Lua Link Bug is fixed
+ }
+}
+
+void pgfgd_key_add_use(pgfgd_Declaration* d, const char* key, const char* value)
+{
+ d->use_length++;
+ d->use_keys = (const char **) realloc(d->use_keys, d->use_length*sizeof(const char*));
+ d->use_values_strings = (const char **) realloc(d->use_values_strings, d->use_length*sizeof(const char*));
+ d->use_values_user = (void **) realloc(d->use_values_user, d->use_length*sizeof(void*));
+
+ d->use_keys [d->use_length-1] = key;
+ d->use_values_strings[d->use_length-1] = value;
+ d->use_values_user [d->use_length-1] = 0;
+}
+
+void pgfgd_key_add_use_user(pgfgd_Declaration* d, const char* key, void* value)
+{
+ d->use_length++;
+ d->use_keys = (const char **) realloc(d->use_keys, d->use_length*sizeof(const char*));
+ d->use_values_strings = (const char **) realloc(d->use_values_strings, d->use_length*sizeof(const char*));
+ d->use_values_user = (void **) realloc(d->use_values_user, d->use_length*sizeof(void*));
+
+ d->use_keys [d->use_length-1] = key;
+ d->use_values_strings[d->use_length-1] = 0;
+ d->use_values_user [d->use_length-1] = value;
+}
+
+void pgfgd_key_add_example(pgfgd_Declaration* d, const char* s)
+{
+ d->examples_length++;
+ d->examples = (const char **) realloc(d->examples, d->examples_length*sizeof(const char*));
+
+ d->examples[d->examples_length-1] = s;
+}
+
+void pgfgd_key_add_precondition(pgfgd_Declaration* d, const char* s)
+{
+ d->pre_length++;
+ d->pre = (const char **) realloc(d->pre, d->pre_length*sizeof(const char*));
+
+ d->pre[d->pre_length-1] = s;
+}
+
+void pgfgd_key_add_postcondition(pgfgd_Declaration* d, const char* s)
+{
+ d->post_length++;
+ d->post = (const char **) realloc(d->post, d->post_length*sizeof(const char*));
+
+ d->post[d->post_length-1] = s;
+}
+
+void pgfgd_key_summary(pgfgd_Declaration* d, const char* s)
+{
+ d->summary = s;
+}
+
+void pgfgd_key_type(pgfgd_Declaration* d, const char* s)
+{
+ d->type = s;
+}
+
+void pgfgd_key_initial(pgfgd_Declaration* d, const char* s)
+{
+ d->initial = s;
+}
+
+void pgfgd_key_initial_user(pgfgd_Declaration* d, void* s)
+{
+ d->initial_user = s;
+}
+
+void pgfgd_key_default(pgfgd_Declaration* d, const char* s)
+{
+ d->default_value = s;
+}
+
+void pgfgd_key_alias(pgfgd_Declaration* d, const char* s)
+{
+ d->alias = s;
+}
+
+void pgfgd_key_alias_function(pgfgd_Declaration* d, const char* s)
+{
+ d->alias_function_string = s;
+}
+
+void pgfgd_key_documentation(pgfgd_Declaration* d, const char* s)
+{
+ d->documentation = s;
+}
+
+void pgfgd_key_documentation_in(pgfgd_Declaration* d, const char* s)
+{
+ d->documentation_in = s;
+}
+
+void pgfgd_key_phase(pgfgd_Declaration* d, const char* s)
+{
+ d->phase = s;
+}
+
+void pgfgd_key_algorithm(pgfgd_Declaration* d, pgfgd_algorithm_fun f, void* user_data)
+{
+ d->algorithm = f;
+ d->algorithm_user = user_data;
+}
+
+void pgfgd_free_key(pgfgd_Declaration* d)
+{
+ if (d) {
+ free(d->examples);
+ free(d->use_keys);
+ free(d->use_values_user);
+ free(d->use_values_strings);
+ free(d);
+ }
+}
diff --git a/graphics/pgf/base/source/InterfaceFromC.h b/graphics/pgf/base/source/InterfaceFromC.h
new file mode 100644
index 0000000000..40495dbdc2
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromC.h
@@ -0,0 +1,613 @@
+#ifndef PGF_GD_INTERFACE_C_INTERFACEFROMC_H
+#define PGF_GD_INTERFACE_C_INTERFACEFROMC_H
+
+/** \file pgf/gd/interface/c/InterfaceFromC.h
+
+ The C-header file that should be used by algorithms written
+ in C for graph drawing in Lua.
+*/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+
+
+// Option handling
+
+/** Abstraction of a Lua option table.
+ You cannot access it directly, but only through the function
+ pgfgd_isset and so on. Note that pointers to such option tables
+ will only be valid during a run of the algorithm; you cannot store
+ a point to an option table past the run of an algorithm.
+*/
+
+typedef struct pgfgd_OptionTable pgfgd_OptionTable;
+
+
+/** Returns 1 if the key is actually set in the option table to any
+ non-nil value; otherwise 0. */
+int pgfgd_isset(pgfgd_OptionTable* t, const char* key);
+
+/** Returns 1 if the key is a number (or can be converted to a
+ number) in the option table. */
+int pgfgd_isnumber(pgfgd_OptionTable* t, const char* key);
+
+/** Returns 1 if the key is a string in the option table. */
+int pgfgd_isstring(pgfgd_OptionTable* t, const char* key);
+
+/** Returns 1 if the key is a Boolean value in the option table. */
+int pgfgd_isboolean(pgfgd_OptionTable* t, const char* key);
+
+/** Returns 1 if the key is a user value in the option table. */
+int pgfgd_isuser(pgfgd_OptionTable* t, const char* key);
+
+/** Provided that pgfgd_isnumber returns 1 for the key, this funciton
+ will return the number stored in the key (otherwise, the function
+ may crash). Note that integers are also retrieved through this function. */
+double pgfgd_tonumber(pgfgd_OptionTable* t, const char* key);
+
+/** Provided that pgfgd_isstring returns 1 for this key, this function
+ returns a copy of the string stored in the key. You must free the
+ returned string yourself. */
+char* pgfgd_tostring(pgfgd_OptionTable* t, const char* key);
+
+/** Provided that pgfgd_isboolean returns 1 for this key, the function
+ returns this Boolean value. */
+int pgfgd_toboolean(pgfgd_OptionTable* t, const char* key);
+
+/** Provided that pgfgd_isuser returns 1 for this key, the function
+ returns this user value. */
+void* pgfgd_touser(pgfgd_OptionTable* t, const char* key);
+
+
+
+// Graph model
+
+/** An abstraction of a pgf.gd.model.Coordinate object. */
+typedef struct pgfgd_Coordinate {
+ double x;
+ double y;
+} pgfgd_Coordinate;
+
+
+/** Used to pass around arrays of Coordinate objects. The main purpose
+ of the structure is to provide access to the length of the
+ array. Note that numbering starts with 0.
+*/
+typedef struct pgfgd_Coordinate_array {
+ int length;
+ pgfgd_Coordinate* array;
+} pgfgd_Coordinate_array;
+
+
+typedef struct pgfgd_Edge pgfgd_Edge;
+
+/** An array of Edge objects. */
+typedef struct pgfgd_Edge_array {
+
+ int length;
+ pgfgd_Edge** array;
+
+} pgfgd_Edge_array;
+
+
+/** This struct is used to model a Lua Path. In Lua, a path is an
+ array where each entry is either a Coordinate object or a
+ string. This is modeled on the C layer by having
+ two arrays and for each position, either the coordinates array or
+ the strings array is set (the strings
+ array is set at position i if, and only if, it is not null).
+
+ Graph drawing functions may wish to modify Edge paths, namely
+ whenever they wish to setup a special routing for an edge. In this
+ case, you may not directly modify the object, but, rather, you
+ must use the functions pgfgd_path_xxx to modify the path
+ field. When the graph drawing function is done, the values stored
+ in the the path fields of the Edges of the syntactic digraph are
+ copied back to Lua.
+
+ Note that numbering starts at 0. Also note that you have to set
+ the path field for each syntactic edge individually.
+
+ The |length| field will be |-1| for the ``default path'' of an
+ edge. The actual path (a straight line from the tail to the head
+ vertex) is generated only when the graph is written back, because
+ only then the coordinates of the nodes will be known.
+*/
+
+typedef struct pgfgd_Path {
+
+ /** Both arrays of this struct will have this length, except when
+ this field is set to -1, indicating that a default path should
+ be generated when this path is written back to the graph. */
+ int length;
+
+ /** An array of coordinates. Not all entries of this array are
+ relevant, namely only those for which the strings array is null
+ at the some position.
+ */
+ pgfgd_Coordinate* coordinates;
+
+ /** An array of strings. Whenever an entry in this array is not
+ null, the entry in the coordinates array at the same position is
+ ignored. */
+ char** strings;
+
+} pgfgd_Path;
+
+
+
+/** An abstraction of a pgf.gd.model.Vertex. These objects are
+ managed by the library (including creation and deletion), you
+ should not create them yourself or modify them, except for the pos
+ field, which you should modify (indeed, this is the whole purpose
+ of your graph drawing algorithm).
+*/
+
+typedef struct pgfgd_Vertex {
+
+ /** The name field of the Lua Vertex class. */
+ char* name;
+
+ /** The path field of the Lua Vertex class. */
+ pgfgd_Path* path;
+
+ /** The shape field of the Lua Vertex class. */
+ char* shape;
+
+ /** The kind field of the Lua Vertex class. */
+ char* kind;
+
+ /** The pos field of the Lua Vertex class. Unlike the other fields
+ of this struct, you can write pos.x and pos.y. When the graph
+ drawing function returns, the values stored in theses fields
+ will be written back to the Lua layer.
+ */
+ pgfgd_Coordinate pos;
+
+ /** The options fields of the Lua Vertex class. Note that you do
+ not have direct access to theses options. Rather, all access to
+ them must go through functions like pgfgd_isset that take a
+ pgfgd_OptionsTable* as input. Also note that you cannot store a
+ pointer to an options table: At the end of the graph drawing
+ function, all option table pointers will loose their
+ meaning. If you really wish to store an options table, you need
+ to retrieve all information stored in it while the point is
+ still active and then store the retrieved information in your
+ own table.
+ */
+ pgfgd_OptionTable* options;
+
+ /** Similar to the incoming field of the Lua Vertex class, but it
+ stores abstractions of the syntactic Edges objects of the
+ syntactic digraph, rather than the table of Arc objects that are
+ really stored in a Vertex. Also note that in a Lua Vertex
+ object, the incoming and outgoing arcs depend on the graph,
+ while a pgfgd_Vertex always only stores the incoming and
+ outgoing edges of the syntactic digraph. The order of the edges
+ in the incoming array will be the same as on the Lua layer, but
+ numbering starts with 0 (since these are C arrays).
+ */
+ pgfgd_Edge_array incoming;
+
+ /** Like the incoming fields. */
+ pgfgd_Edge_array outgoing;
+
+ /** The index of this vertex in the array entry of the syntactic
+ digraph. */
+ int array_index;
+
+} pgfgd_Vertex;
+
+
+
+/** Used to pass around arrays of Vertex objects (more precisely, of
+ arrays of pointers to pgfgd_Vertex objects). Note that numbering
+ starts with 0.
+*/
+
+typedef struct pgfgd_Vertex_array {
+ int length;
+ pgfgd_Vertex** array;
+} pgfgd_Vertex_array;
+
+
+
+/** This function allows you to query an anchor of a vertex (like a
+ call to |Vertex:anchor|). The function returns
+ |1| if there is such an anchor, otherwise |0| is returned and
+ both |x| and |y| will be set to 0. */
+extern int pgfgd_vertex_anchor(pgfgd_Vertex* v, const char* anchor, double* x, double* y);
+
+
+
+/** An abstraction of pgf.gd.model.Edge. */
+
+struct pgfgd_Edge {
+
+ /** The tail field of the Lua Edge class. */
+ pgfgd_Vertex* tail;
+
+ /** The head field of the Lua Edge class. */
+ pgfgd_Vertex* head;
+
+ /** The direction field of the Lua Edge class. */
+ char* direction;
+
+ /** The path field of the Lua Edge class. You can read this field
+ directly, but you can write it only through the function whose
+ names start with pgfgd_path.
+
+ For each pgfgd_Edge object, at the end of the graph drawing
+ routinge, the value stored in this field will be written back to
+ the path field of the original syntactic edge.
+ */
+ pgfgd_Path* path;
+
+ /** A pointer to the options table of the Edge. This works like the
+ options table of pgdgd_Vertex and the same restrictions apply.
+ */
+ pgfgd_OptionTable* options;
+
+ /** The index of this edge in the array entry of the syntactic
+ digraph. */
+ int array_index;
+
+};
+
+
+typedef struct pgfgd_SyntacticDigraph_internals pgfgd_SyntacticDigraph_internals;
+
+
+/** The class pgf.gd.model.Digraph is modeled using two different C
+ structs: First, we have pgfgd_SyntacticDigraph and, second, we
+ have pgfgd_Digraph. The first is used, only, to model the (single)
+ syntactic digraph that is passed to the graph drawing function,
+ while the second is used to model different, more light weight
+ digraphs that are computed be the graph drawing system prior to
+ the call of the graph drawing routine. For instance, the spanning
+ tree computed by the graph drawing system for algorithms whose
+ preconditions included "tree" will be modeled as a pgfgd_Digraph.
+
+ There is only one pgfgd_SyntacticDigraph during a call of
+ the graph drawing routine and you can access its properties
+ directly by accessing the fields of the struct. You cannot,
+ however, modify the syntactic digraph, except for setting the pos
+ fields of the vertices and for setting the path field arrays of
+ the syntactic edges (through the pgfgd_path_xxx functions). When
+ the graph drawing function is done, the modifications will be
+ written back to the Lua layer.
+
+ Note that the syntactic digraph only stores the syntactic edges,
+ not the Arc objects. In particular, when you write
+ |graph { a <- b }| on the TikZ layer, you will get one syntactic
+ edge from a to b (not the other way round) with its direction
+ field set to "<-" in the syntactic digraph object.
+ */
+
+typedef struct pgfgd_SyntacticDigraph {
+
+ /** The vertices field of a Lua (syntactic) digraph. You may not
+ modify this array, except for changing the pos fields of the
+ vertices. */
+ pgfgd_Vertex_array vertices;
+
+ /** All syntactic edges of the graph. You cannot modify this array,
+ but you can use the pgfgd_path_xxx funtion to change the routing
+ of the edges stored here. Note that, since you get access to
+ syntactic edges, the direction of these edges may not be what
+ you expect and there may be several syntactic edges between the
+ same vertices.
+ */
+ pgfgd_Edge_array syntactic_edges;
+
+ /** The syntactic digraph's options field. Like all options fields,
+ it will go out of scope at the end of the graph drawing
+ routine.
+ */
+ pgfgd_OptionTable* options;
+
+ pgfgd_SyntacticDigraph_internals* internals;
+
+} pgfgd_SyntacticDigraph;
+
+
+
+
+// Modifying edge bend paths
+
+/** You can apply this function to an Edge to clear the routing path
+ stored in it.
+*/
+extern void pgfgd_path_clear (pgfgd_Edge* e);
+
+/** This function adds a moveto at the end of a path. */
+extern void pgfgd_path_append_moveto (pgfgd_Edge* e, double x, double y);
+
+/** This function adds a moveto to the |tail anchor| of the tail of
+ the edge. This call is useful for ``starting'' a path. This
+ function is a ``service function,'' you can achieve the same
+ effect by directly reading the option table of the tail vertex
+ and then using the pgfgd_vertex_anchor method. */
+extern void pgfgd_path_append_moveto_tail (pgfgd_Edge* e);
+
+/** This function adds a lineto at the end of a path. */
+extern void pgfgd_path_append_lineto (pgfgd_Edge* e, double x, double y);
+
+/** This function adds a linto to the |head anchor| of the head of
+ the edge. This call is useful for ``ending'' a path. */
+extern void pgfgd_path_append_lineto_head (pgfgd_Edge* e);
+
+/** This function adds a closepath at the end of a path. */
+extern void pgfgd_path_append_closepath (pgfgd_Edge* e);
+
+/** This function adds a curevto at the end of a path. */
+extern void pgfgd_path_append_curveto (pgfgd_Edge* e, double x1, double y1, double x2, double y2, double x, double y);
+
+
+
+
+// Querying graphs other than the syntactic digraph
+
+/** A pgfgd_Digraph is a light-weight abstraction of a Lua Digraph
+ object. Unlike a pgfgd_SyntacticDigraph, you cannot access the
+ fields such an object directly, rather, all information is
+ retrieved through functions starting with pgfgd_digraph.
+
+ When the graph drawing function is called, the graph drawing
+ system will already have computed a number of special digraphs in
+ addition to the syntactic digraph passed to the function. For
+ instance, there is always the "ugraph", which is the undirected
+ graph underlying the syntactic digraph. To access these special
+ graphs, you first call pgfgd_get_digraph and then use the
+ pgfgd_digraph_xxx function to retrieve information about them.
+
+ Unlike the pgfgd_SyntacticDigraph object, which is managed by the
+ library, you must free pgfgd_Digraph objects yourself through the
+ pgfgd_digraph_free function.
+*/
+
+typedef struct pgfgd_Digraph pgfgd_Digraph;
+
+/** There is no abstraction of an Arc object on the C layer. Rather,
+ an arc is simply the index of the tail vertex plus the index of
+ the head vertex, where the indices are relative to the array of
+ vertices making up the digraph under consideration.
+
+ You may wonder why we store indices rather than pointers to
+ pgfgd_Vertex objects. The reason is that a pgfgd_Digraph may
+ actually contain vertices that are not present in the syntactic
+ digraph (for instance, dummy vertices in a spanning tree) and for
+ which no pgfgd_Vertex obejct exists. For this reason, we only use
+ indices and there is a special function
+ (pgfgd_digraph_syntactic_vertex) that can be used to retrieve the
+ pgfgd_Vertex object, provided it exists.
+
+ Note that the numbers stored in the tails and heads arrays, which
+ refer to positions inside a Lua vertices array, start numbering
+ with 1. The arrays themselves, however, start numbering with
+ 0. So, tails[0] == 1 and heads[0] == 2 would mean that there is an
+ Arc from the first to the second vertex. You can pass the numbers
+ stored in these arrays directly to the pgfgd_digraph_xxx
+ functions.
+
+ You must free pgfgd_Arc_array objects yourself via
+ pgfgd_digraph_free_arc_array.
+ */
+typedef struct pgfgd_Arc_array {
+
+ /** The length of both arrays. */
+ int length;
+
+ /** The array of the numbers of the tail vertices of the arcs. The
+ array itself starts numbering with 0, but its entries refer to
+ positions inside Lua array, so their numbering starts with 1. */
+ int* tails;
+
+ /** Like tails. */
+ int* heads;
+
+} pgfgd_Arc_array;
+
+
+/** In order to access special digraphs like the |ugraph| or the
+ |spanning_tree| computed by the graph drawing system, you first
+ need to call this function. In detail, the graph_name must be the
+ name of a field of the Lua algorithm object and this field must
+ store a |Digraph| object. Examples are "digraph" or "ugraph". The
+ function will then return a handle to this digraph which you can
+ subsequently access. The handle will become invalid at the end of
+ the graph drawing funciton and you must free it explicitly using
+ pgfgd_digraph_free.
+ */
+extern pgfgd_Digraph* pgfgd_get_digraph (pgfgd_SyntacticDigraph* g, const char* graph_name);
+
+/** Returns the number of vertices in the digraph. Note that this
+ number needs not be the same as the number of vertices in the
+ syntactic digraph and that the ordering need not be the
+ same as in the syntactic digraph. */
+extern int pgfgd_digraph_num_vertices (pgfgd_Digraph* g);
+
+/** Returns a newly allocated array of all arcs present in the
+ digraph. You must free this array explicitly using
+ pgfgd_digraph_free_arc_array.
+*/
+extern pgfgd_Arc_array* pgfgd_digraph_arcs (pgfgd_Digraph* g);
+
+/** This function allows you to retrieve the syntatic vertex that
+ corresponds to a given index in the digraph. Normally, the first
+ vertex of a digraph like the ugraph will also be the first entry
+ of the vertices field of the syntactic digraph, but this need not
+ always be the case. For instance, for a spanning_tree digraph,
+ there will be more vertices in the graph than there are syntactic
+ vertices and the order may be quite different. For theses reaons,
+ you must use this function to convert a vertex index into the
+ digraph g into a pgfgd_Vertex object. It may happen that the index
+ does not refer to any syntactic vertex, in this case 0 is
+ returned.
+
+ Note that v is an index into a Lua array and, thus, numbering
+ starts with 1.
+*/
+extern pgfgd_Vertex* pgfgd_digraph_syntactic_vertex (pgfgd_Digraph* g, int v);
+
+/** Tests whether there is an arc between two vertices in the digraph
+ g. The tail and head are indices starting with 1. This operation
+ takes time $O(1)$.
+*/
+extern int pgfgd_digraph_isarc (pgfgd_Digraph* g, int tail, int head);
+
+/** Returns an array of all syntactic edges present between two
+ vertices (whose indices are given as input). You must free the
+ returned array explicitly using
+ pgfgd_digraph_free_edge_array. Typically, this array will have at
+ most one entry, but it may happen that the user has specified
+ several syntatic edges between the same vertices, in which case
+ you get a larger array here.
+
+ Note that tail and head are indices (starting with 1) into the
+ digraph's vertices array, which the return value is an array of
+ syntactic edges present in the syntactic digraph between the
+ vertices corresponding to these indices. In particular, if the
+ vertices do not correspond to syntactic vertices, the returned
+ array will always be empty.
+*/
+extern pgfgd_Edge_array* pgfgd_digraph_syntactic_edges (pgfgd_Digraph* g, int tail, int head);
+
+/** Returns an array of all incoming arcs of the given vertex. (As
+ always, the vertex is coded as an index starting with 1 into the
+ vertices array of the digraph.) You must free this array
+ yourself using pgfgd_digraph_free_arc_array. In the returned
+ array, all entries of the head array will equal v.
+ */
+extern pgfgd_Arc_array* pgfgd_digraph_incoming (pgfgd_Digraph* g, int v);
+
+/** Like pgfgd_digraph_incoming. */
+extern pgfgd_Arc_array* pgfgd_digraph_outgoing (pgfgd_Digraph* g, int v);
+
+/** Frees a pgfgd_Digraph object previously allocated by the
+ pgfgd_get_digraph function. */
+extern void pgfgd_digraph_free (pgfgd_Digraph* d);
+
+/** Frees a pgfgd_Arc_array object; in particular, the arrays stored
+ inside it are freed. You should call this function once at some
+ point for all objects of this kind returned by any library function.
+*/
+extern void pgfgd_digraph_free_arc_array (pgfgd_Arc_array* arcs);
+
+/** Like pgfgd_digraph_free_arc_array, but for the Edge arrays
+ returned by pgfgd_digraph_syntactic_edges. Do not call this
+ function for the syntactic_edges field of a syntactic digraph.
+*/
+extern void pgfgd_digraph_free_edge_array (pgfgd_Edge_array* edges);
+
+
+
+// Declarations
+
+struct lua_State;
+typedef void (*pgfgd_algorithm_fun) (pgfgd_SyntacticDigraph* component, void* user_data);
+typedef struct pgfgd_Declaration pgfgd_Declaration;
+
+
+/** Each declaration of a new option starts with a call to this
+ function. The function returns an object whose properties you can
+ set subsequently through the pgfgd_key_xxx function. Once all
+ properties of the key have been set, you call pgfgd_declare to
+ make Lua aware of the option. Then, you need to call
+ pgfgd_free_key on it.
+ */
+
+extern pgfgd_Declaration* pgfgd_new_key (const char* key);
+
+/** Sets the summary field of the key. You should always call this
+ function. */
+extern void pgfgd_key_summary (pgfgd_Declaration* d, const char* s);
+
+/** Sets the type field of the key. */
+extern void pgfgd_key_type (pgfgd_Declaration* d, const char* s);
+
+/** Sets the initial field of the key to a string. */
+extern void pgfgd_key_initial (pgfgd_Declaration* d, const char* s);
+
+/** Sets the initial field of the key to void* value (a light userdata
+ in Lua-speak). */
+extern void pgfgd_key_initial_user (pgfgd_Declaration* d, void* v);
+
+/** Sets the default field of the key. */
+extern void pgfgd_key_default (pgfgd_Declaration* d, const char* s);
+
+/** Sets the alias field of the key. */
+extern void pgfgd_key_alias (pgfgd_Declaration* d, const char* s);
+
+/** Sets the alias_function_string field of the key. */
+extern void pgfgd_key_alias_function (pgfgd_Declaration* d, const char* s);
+
+/** Sets the documentation field of the key. */
+extern void pgfgd_key_documentation (pgfgd_Declaration* d, const char* s);
+
+/** Sets the documentation_in field of the key. */
+extern void pgfgd_key_documentation_in (pgfgd_Declaration* d, const char* s);
+
+/** Sets the phase field of the key. */
+extern void pgfgd_key_phase (pgfgd_Declaration* d, const char* s);
+
+/** Sets the algorithm field of the key. The function f must conform
+ to the function prototype pgfgd_algorithm_fun, which prescribes
+ that the function takes a syntactic digraph as input
+ (pgfgd_SyntacticDigraph*) and some user data and does not return
+ anything. The user data that is passed to the function is the
+ datum passed here.
+
+ Whenever the key is now used on the Lua layer, the graph drawing
+ system will run the normal layout pipeline on the graph. Then, at
+ some point, it would call the actual Lua graph drawing
+ algorithm. At that point, the function f is called instead. The
+ parameter of this function will be a representation of the
+ to-be-drawn syntatic digraph as a C pgfgd_SyntacticDigraph.
+*/
+extern void pgfgd_key_algorithm (pgfgd_Declaration* d,
+ pgfgd_algorithm_fun f,
+ void* user_data);
+
+/** Adds a use to the key. This means that whenever the key is used,
+ the given key--value pairs will also be set. This is used, in
+ particular, to create aliases for keys (but is not to be confused
+ with the |alias| field, whose semantics are slightly different).
+ */
+extern void pgfgd_key_add_use (pgfgd_Declaration* d, const char* key, const char* value);
+
+/** Adds a use to the key, but with the value being a user value in
+ Lua-speak.
+ */
+extern void pgfgd_key_add_use_user (pgfgd_Declaration* d, const char* key, void* value);
+
+/** Adds an example to the examples field of the key. */
+extern void pgfgd_key_add_example (pgfgd_Declaration* d, const char* s);
+
+/** Adds a precondition (the field s of the precondition table is set
+ to true) to the key. */
+extern void pgfgd_key_add_precondition (pgfgd_Declaration* d, const char* s);
+
+/** Adds a postcondition to the key. */
+extern void pgfgd_key_add_postcondition (pgfgd_Declaration* d, const char* s);
+
+/** After all properties of an option key have been set, call this
+ function once to actually declare the key inside the state that
+ your graph drawing library's main function gets
+ passed by the Lua dynamic linkage code. */
+extern void pgfgd_declare (struct lua_State* s, pgfgd_Declaration* d);
+
+/** Frees the memory used by the key object. */
+extern void pgfgd_free_key (pgfgd_Declaration* d);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/graphics/pgf/base/source/InterfaceFromOGDF.c++ b/graphics/pgf/base/source/InterfaceFromOGDF.c++
new file mode 100644
index 0000000000..248ee0b19e
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromOGDF.c++
@@ -0,0 +1,105 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+
+#include <ogdf/basic/geometry.h>
+
+
+using namespace ogdf;
+
+namespace scripting {
+
+
+ void ogdf_runner::bridge ()
+ {
+ graph = Graph();
+ graph_attributes = GraphAttributes (graph,
+ GraphAttributes::nodeGraphics |
+ GraphAttributes::edgeGraphics |
+ GraphAttributes::nodeLevel |
+ GraphAttributes::edgeIntWeight |
+ GraphAttributes::edgeDoubleWeight |
+ GraphAttributes::nodeWeight);
+
+ pgfgd_SyntacticDigraph* g = parameters->syntactic_digraph;
+
+ int n = g->vertices.length;
+ int m = g->syntactic_edges.length;
+
+ node* nodes = new node [n];
+
+ for (int i=0; i < n; i++) {
+ nodes[i] = graph.newNode();
+
+ // Compute width and height
+ double x1, x2,y1,y2;
+ x1 = x2 = y1 = y2 = 0;
+
+ int first = 1;
+
+ pgfgd_Path* path = g->vertices.array[i]->path;
+
+ for (int j = 1; j < path->length; j++)
+ if (!path->strings[j]) {
+ double x = path->coordinates[j].x;
+ double y = path->coordinates[j].y;
+
+ if (first) {
+ x1 = x2 = x;
+ y1 = y2 = y;
+ first = 0;
+ } else {
+ x1 = x < x1 ? x : x1;
+ x2 = x > x2 ? x : x2;
+ y1 = y < y1 ? y : y1;
+ y2 = y > y2 ? y : y2;
+ }
+ }
+
+ graph_attributes.width(nodes[i]) = x2-x1;
+ graph_attributes.height(nodes[i]) = y2-y1;
+ }
+
+ for (int i=0; i < m; i++) {
+ int tail = g->syntactic_edges.array[i]->tail->array_index;
+ int head = g->syntactic_edges.array[i]->head->array_index;
+
+ graph.newEdge(nodes[tail], nodes[head]);
+ }
+ }
+
+ void ogdf_runner::unbridge ()
+ {
+ pgfgd_SyntacticDigraph* g = parameters->syntactic_digraph;
+
+ node v;
+ int i;
+ for (i = 0, v = graph.firstNode(); v; v=v->succ(), i++) {
+ g->vertices.array[i]->pos.x = graph_attributes.x(v);
+ g->vertices.array[i]->pos.y = graph_attributes.y(v);
+ }
+
+ edge e;
+ for (i = 0, e = graph.firstEdge(); e; e=e->succ(), i++) {
+ pgfgd_Edge* ed = g->syntactic_edges.array[i];
+
+ DPolyline bend = graph_attributes.bends(e);
+
+ if (bend.begin().valid()) {
+ bend.unify();
+ bend.normalize();
+
+ // We start with a moveto:
+ pgfgd_path_clear (ed);
+
+ pgfgd_path_append_moveto_tail(ed);
+
+ for (List<DPoint>::iterator it = bend.begin(); it.valid(); it++)
+ pgfgd_path_append_lineto(ed, (*it).m_x, (*it).m_y);
+
+ // We end with a lineto:
+ pgfgd_path_append_lineto_head(ed);
+ }
+ }
+ }
+
+}
diff --git a/graphics/pgf/base/source/InterfaceFromOGDF.h b/graphics/pgf/base/source/InterfaceFromOGDF.h
new file mode 100644
index 0000000000..bd742eb161
--- /dev/null
+++ b/graphics/pgf/base/source/InterfaceFromOGDF.h
@@ -0,0 +1,45 @@
+#ifndef PGF_GD_INTERFACE_C_INTERFACEFROMOGDF_H
+#define PGF_GD_INTERFACE_C_INTERFACEFROMOGDF_H
+
+/** \file pgf/gd/interface/c/InterfaceFromOGDF.h
+
+ The C++-header file that should be used by algorithms written
+ for the OGFD library when the algorithm should be included in Lua.
+*/
+
+#include <pgf/gd/interface/c/InterfaceFromC++.h>
+#include <ogdf/basic/Graph.h>
+#include <ogdf/basic/GraphAttributes.h>
+
+namespace scripting {
+
+ class ogdf_runner : public runner {
+ public:
+
+ void bridge ();
+ void unbridge ();
+
+ protected:
+
+ ogdf::Graph graph;
+ ogdf::GraphAttributes graph_attributes;
+
+ };
+
+
+ class ogdf_function_runner : public ogdf_runner {
+ public:
+ typedef void (*function) (run_parameters&,
+ ogdf::Graph&,
+ ogdf::GraphAttributes&);
+
+ ogdf_function_runner (function f) : fun(f) {}
+ virtual void run () { fun(*parameters, graph, graph_attributes); }
+
+ private:
+ function fun;
+ };
+}
+
+
+#endif
diff --git a/graphics/pgf/base/source/LocalBiconnectedMerger_script.h b/graphics/pgf/base/source/LocalBiconnectedMerger_script.h
new file mode 100644
index 0000000000..898822e0c0
--- /dev/null
+++ b/graphics/pgf/base/source/LocalBiconnectedMerger_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.h>
+
+struct LocalBiconnectedMerger_script :
+ scripting::declarations,
+ scripting::factory<ogdf::LocalBiconnectedMerger>
+{
+ ogdf::LocalBiconnectedMerger* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ LocalBiconnectedMerger* r = new LocalBiconnectedMerger;
+
+ parameters->configure_option ("LocalBiconnectedMerger.factor",
+ &LocalBiconnectedMerger::setFactor, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("LocalBiconnectedMerger")
+ .set_module ("MultilevelBuilder", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.LocalBiconnectedMerger"));
+
+ s.declare (key ("LocalBiconnectedMerger.factor")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.LocalBiconnectedMerger"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/LongestPathRanking_script.h b/graphics/pgf/base/source/LongestPathRanking_script.h
new file mode 100644
index 0000000000..ca2e634485
--- /dev/null
+++ b/graphics/pgf/base/source/LongestPathRanking_script.h
@@ -0,0 +1,50 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/LongestPathRanking.h>
+
+struct LongestPathRanking_script :
+ scripting::declarations,
+ scripting::factory<ogdf::LongestPathRanking>
+{
+
+ ogdf::LongestPathRanking* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ LongestPathRanking* r = new LongestPathRanking;
+
+ parameters->configure_option ("LongestPathRanking.separateDeg0Layer",
+ &LongestPathRanking::separateDeg0Layer, *r);
+ parameters->configure_option ("LongestPathRanking.separateMultiEdges",
+ &LongestPathRanking::separateMultiEdges, *r);
+ parameters->configure_option ("LongestPathRanking.optimizeEdgeLength",
+ &LongestPathRanking::optimizeEdgeLength, *r);
+
+ parameters->configure_module ("AcyclicSubgraphModule",
+ &LongestPathRanking::setSubgraph, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+ s.declare (key ("LongestPathRanking")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.LongestPathRanking")
+ .set_module ("RankingModule", this));
+
+ s.declare (key ("LongestPathRanking.separateDeg0Layer")
+ .type ("boolean")
+ .initial ("true")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.LongestPathRanking"));
+
+ s.declare (key ("LongestPathRanking.separateMultiEdges")
+ .type ("boolean")
+ .initial ("true")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.LongestPathRanking"));
+
+ s.declare (key ("LongestPathRanking.optimizeEdgeLength")
+ .type ("boolean")
+ .initial ("true")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.LongestPathRanking"));
+ }
+};
+
+
diff --git a/graphics/pgf/base/source/MakefileConfig.mk b/graphics/pgf/base/source/MakefileConfig.mk
new file mode 100644
index 0000000000..25310b6987
--- /dev/null
+++ b/graphics/pgf/base/source/MakefileConfig.mk
@@ -0,0 +1,45 @@
+
+# Where Lua is installed
+LUAPATH=/usr/local/lua52
+
+LUAINCLUDES = $(LUAPATH)/include
+LUALIBPATH = $(LUAPATH)/lib
+
+
+# Where ogdf is installed
+OGDFPATH=/usr/local/ogdf
+
+OGDFINCLUDES = $(OGDFPATH)
+OGDFLIBPATH = $(OGDFPATH)/_release
+
+
+# Where the pgf C includes are found
+PGFINCLUDES=../../../..
+
+
+# Where the shared libraries should be installed (base dir)
+INSTALLDIR=/usr/texbin/lib/luatex/lua
+
+
+# If you need special flags:
+MYCFLAGS=
+MYLDFLAGS=
+
+# Link flags for building a shared library
+SHAREDFLAGS=
+
+# Link flags for linking against the shared Lua lib
+LINKSHAREDLUA=
+
+# Architecture flags:
+ARCHFLAGS=
+
+# The to-be-used compiler
+CC=gcc
+
+
+# Now read local definition, which may overwrite the above
+-include $(CONFIGDIR)/LocalMakefileConfig.mk
+
+
+
diff --git a/graphics/pgf/base/source/MatchingMerger_script.h b/graphics/pgf/base/source/MatchingMerger_script.h
new file mode 100644
index 0000000000..1d50c273cd
--- /dev/null
+++ b/graphics/pgf/base/source/MatchingMerger_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/MatchingMerger.h>
+
+struct MatchingMerger_script :
+ scripting::declarations,
+ scripting::factory<ogdf::MatchingMerger>
+{
+ ogdf::MatchingMerger* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ MatchingMerger* r = new MatchingMerger;
+
+ parameters->configure_option ("MatchingMerger.selectByNodeMass",
+ &MatchingMerger::selectByNodeMass, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("MatchingMerger")
+ .set_module ("MultilevelBuilder", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.MatchingMerger"));
+
+ s.declare (key ("MatchingMerger.selectByNodeMass")
+ .type ("boolean")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.MatchingMerger"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/MedianHeuristic_script.h b/graphics/pgf/base/source/MedianHeuristic_script.h
new file mode 100644
index 0000000000..8ce4a610e7
--- /dev/null
+++ b/graphics/pgf/base/source/MedianHeuristic_script.h
@@ -0,0 +1,20 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/MedianHeuristic.h>
+
+struct MedianHeuristic_script :
+ scripting::declarations,
+ scripting::factory<ogdf::MedianHeuristic>
+{
+
+ ogdf::MedianHeuristic* make (scripting::run_parameters* parameters) {
+ return new ogdf::MedianHeuristic;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("MedianHeuristic")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.MedianHeuristic")
+ .set_module ("TwoLayerCrossMin", this));
+ }
+};
+
diff --git a/graphics/pgf/base/source/MedianPlacer_script.h b/graphics/pgf/base/source/MedianPlacer_script.h
new file mode 100644
index 0000000000..4670554393
--- /dev/null
+++ b/graphics/pgf/base/source/MedianPlacer_script.h
@@ -0,0 +1,26 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/MedianPlacer.h>
+
+struct MedianPlacer_script :
+ scripting::declarations,
+ scripting::factory<ogdf::MedianPlacer>
+{
+ ogdf::MedianPlacer* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ MedianPlacer* r = new MedianPlacer;
+
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("MedianPlacer")
+ .set_module ("InitialPlacer", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.MedianPlacer"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/MultilevelLayout_script.h b/graphics/pgf/base/source/MultilevelLayout_script.h
new file mode 100644
index 0000000000..091ab9766c
--- /dev/null
+++ b/graphics/pgf/base/source/MultilevelLayout_script.h
@@ -0,0 +1,33 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/MultilevelLayout.h>
+
+struct MultilevelLayout_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ MultilevelLayout layout;
+
+ parameters->configure_module ("LayoutModule",
+ &MultilevelLayout::setLayout, layout);
+ parameters->configure_module ("MultilevelBuilder",
+ &MultilevelLayout::setMultilevelBuilder, layout);
+ parameters->configure_module ("InitialPlacer",
+ &MultilevelLayout::setPlacer, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("MultilevelLayout")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.MultilevelLayout"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/OptimalRanking_script.h b/graphics/pgf/base/source/OptimalRanking_script.h
new file mode 100644
index 0000000000..f35fc67da7
--- /dev/null
+++ b/graphics/pgf/base/source/OptimalRanking_script.h
@@ -0,0 +1,34 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/OptimalRanking.h>
+
+struct OptimalRanking_script :
+ scripting::declarations,
+ scripting::factory<ogdf::OptimalRanking>
+{
+
+ ogdf::OptimalRanking* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ OptimalRanking* r = new OptimalRanking;
+
+ parameters->configure_option ("OptimalRanking.separateMultiEdges",
+ &OptimalRanking::separateMultiEdges, *r);
+ parameters->configure_module ("AcyclicSubgraphModule",
+ &OptimalRanking::setSubgraph, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+ s.declare (key ("OptimalRanking")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.OptimalRanking")
+ .set_module ("RankingModule", this));
+
+ s.declare (key ("OptimalRanking.separateMultiEdges")
+ .type ("boolean")
+ .initial ("true")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.OptimalRanking"));
+ }
+};
+
diff --git a/graphics/pgf/base/source/PlanarizationLayout_script.h b/graphics/pgf/base/source/PlanarizationLayout_script.h
new file mode 100644
index 0000000000..4fa89d5d19
--- /dev/null
+++ b/graphics/pgf/base/source/PlanarizationLayout_script.h
@@ -0,0 +1,43 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/planarity/PlanarizationLayout.h>
+
+struct PlanarizationLayout_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+
+ void run () {
+ using namespace ogdf;
+ PlanarizationLayout layout;
+
+ parameters->configure_option ("PlanarizationLayout.preprocessCliques",
+ &PlanarizationLayout::preprocessCliques, layout);
+ parameters->configure_option ("PlanarizationLayout.minCliqueSize",
+ &PlanarizationLayout::minCliqueSize, layout);
+
+ // .. TODO: configure modules
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+ s.declare (key ("PlanarizationLayout")
+ .precondition ("connected")
+ .postcondition ("fixed")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.planarity.PlanarizationLayout"));
+
+ s.declare (key ("PlanarizationLayout.preprocessCliques")
+ .type ("boolean")
+ .initial ("false")
+ .documentation_in ("pgf.gd.doc.ogdf.planarity.PlanarizationLayout"));
+
+ s.declare (key ("PlanarizationLayout.minCliqueSize")
+ .type ("number")
+ .initial ("10")
+ .documentation_in ("pgf.gd.doc.ogdf.planarity.PlanarizationLayout"));
+ }
+
+};
diff --git a/graphics/pgf/base/source/RandomMerger_script.h b/graphics/pgf/base/source/RandomMerger_script.h
new file mode 100644
index 0000000000..8acc53bbef
--- /dev/null
+++ b/graphics/pgf/base/source/RandomMerger_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/RandomMerger.h>
+
+struct RandomMerger_script :
+ scripting::declarations,
+ scripting::factory<ogdf::RandomMerger>
+{
+ ogdf::RandomMerger* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ RandomMerger* r = new RandomMerger;
+
+ parameters->configure_option ("RandomMerger.factor",
+ &RandomMerger::setFactor, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("RandomMerger")
+ .set_module ("MultilevelBuilder", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.RandomMerger"));
+
+ s.declare (key ("RandomMerger.factor")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.RandomMerger"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/RandomPlacer_script.h b/graphics/pgf/base/source/RandomPlacer_script.h
new file mode 100644
index 0000000000..a92873ff47
--- /dev/null
+++ b/graphics/pgf/base/source/RandomPlacer_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/RandomPlacer.h>
+
+struct RandomPlacer_script :
+ scripting::declarations,
+ scripting::factory<ogdf::RandomPlacer>
+{
+ ogdf::RandomPlacer* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ RandomPlacer* r = new RandomPlacer;
+
+ parameters->configure_option ("RandomPlacer.circleSize",
+ &RandomPlacer::setCircleSize, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("RandomPlacer")
+ .set_module ("InitialPlacer", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.RandomPlacer"));
+
+ s.declare (key ("RandomPlacer.circleSize")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.RandomPlacer"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/SiftingHeuristic_script.h b/graphics/pgf/base/source/SiftingHeuristic_script.h
new file mode 100644
index 0000000000..653432f52b
--- /dev/null
+++ b/graphics/pgf/base/source/SiftingHeuristic_script.h
@@ -0,0 +1,40 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/SiftingHeuristic.h>
+
+struct SiftingHeuristic_script :
+ scripting::declarations,
+ scripting::factory<ogdf::SiftingHeuristic>
+{
+
+ ogdf::SiftingHeuristic* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+
+ SiftingHeuristic* h = new SiftingHeuristic;
+
+ char* strategy = 0;
+
+ if (parameters->option("SiftingHeuristic.strategy", strategy)) {
+ if (strcmp(strategy, "left_to_right") == 0)
+ h->strategy(SiftingHeuristic::left_to_right);
+ else if (strcmp(strategy, "desc_degree") == 0)
+ h->strategy(SiftingHeuristic::desc_degree);
+ else if (strcmp(strategy, "random") == 0)
+ h->strategy(SiftingHeuristic::random);
+
+ free(strategy);
+ }
+ return h;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("SiftingHeuristic")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SiftingHeuristic")
+ .set_module ("TwoLayerCrossMin", this));
+
+ s.declare (key ("SiftingHeuristic.strategy")
+ .type ("string")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SiftingHeuristic"));
+ }
+};
+
diff --git a/graphics/pgf/base/source/SimpleDemoC.c b/graphics/pgf/base/source/SimpleDemoC.c
new file mode 100644
index 0000000000..18e5889ad1
--- /dev/null
+++ b/graphics/pgf/base/source/SimpleDemoC.c
@@ -0,0 +1,42 @@
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+#include <math.h>
+
+static void fast_hello_world (pgfgd_SyntacticDigraph* graph, void* v) {
+ double angle = 6.28318530718 / graph->vertices.length;
+ double radius = pgfgd_tonumber(graph->options, "fast simple demo radius");
+
+ int i;
+ for (i = 0; i < graph->vertices.length; i++) {
+ pgfgd_Vertex* v = graph->vertices.array[i];
+ v->pos.x = cos(angle*i) * radius;
+ v->pos.y = sin(angle*i) * radius;
+ }
+}
+
+int luaopen_pgf_gd_examples_c_SimpleDemoC (struct lua_State *state) {
+ pgfgd_Declaration* d;
+
+ // The main layout key
+ d = pgfgd_new_key ("fast simple demo layout");
+ pgfgd_key_summary (d, "The C version of the hello world of graph drawing.");
+ pgfgd_key_algorithm (d, fast_hello_world, 0);
+ pgfgd_key_documentation (d,
+ "Just like the |SimpleDemo| algorithm, this algorithm arranges \
+ the nodes of a graph in a circle (without paying heed to the sizes of the \
+ nodes or to the edges). Its main purpose is to show how C code \
+ can access the Lua representation of graphs. See \
+ Section~\ref{section-algorithms-in-c} of the manual for detais.");
+ pgfgd_key_add_precondition (d, "connected");
+ pgfgd_declare (state, d);
+ pgfgd_free_key (d);
+
+ // The radius key
+ d = pgfgd_new_key ("fast simple demo radius");
+ pgfgd_key_summary (d, "A radius value for the hello world of graph drawing");
+ pgfgd_key_type (d, "length");
+ pgfgd_key_initial (d, "1cm");
+ pgfgd_declare (state, d);
+ pgfgd_free_key (d);
+
+ return 0;
+}
diff --git a/graphics/pgf/base/source/SimpleDemoCPlusPlus.c++ b/graphics/pgf/base/source/SimpleDemoCPlusPlus.c++
new file mode 100644
index 0000000000..0c810d2570
--- /dev/null
+++ b/graphics/pgf/base/source/SimpleDemoCPlusPlus.c++
@@ -0,0 +1,47 @@
+#include <pgf/gd/interface/c/InterfaceFromC++.h>
+#include <pgf/gd/interface/c/InterfaceFromC.h>
+
+#include <math.h>
+
+
+struct FastLayout : scripting::declarations, scripting::runner {
+
+ void run () {
+ pgfgd_SyntacticDigraph* graph = parameters->syntactic_digraph;
+
+ double angle = 6.28318530718 / graph->vertices.length;
+ double radius = parameters->option<double>("fast simple demo radius c++");
+
+ for (int i = 0; i < graph->vertices.length; i++) {
+ pgfgd_Vertex* v = graph->vertices.array[i];
+ v->pos.x = cos(angle*i) * radius;
+ v->pos.y = sin(angle*i) * radius;
+ }
+ }
+
+ void declare(scripting::script s) {
+ using namespace scripting;
+
+ s.declare(key ("fast simple demo layout c++")
+ .summary ("The C++ version of the hello world of graph drawing")
+ .precondition ("connected")
+ .precondition ("tree")
+ .algorithm (this));
+
+ s.declare(key ("fast simple demo radius c++")
+ .summary ("A radius value for the hello world of graph drawing")
+ .type ("length")
+ .initial ("1cm"));
+ }
+
+};
+
+extern "C" int luaopen_pgf_gd_examples_c_SimpleDemoCPlusPlus (struct lua_State *state) {
+
+ scripting::script s (state);
+
+ s.declare (new FastLayout);
+
+ return 0;
+}
+
diff --git a/graphics/pgf/base/source/SimpleDemoOGDF.c++ b/graphics/pgf/base/source/SimpleDemoOGDF.c++
new file mode 100644
index 0000000000..b7d914c520
--- /dev/null
+++ b/graphics/pgf/base/source/SimpleDemoOGDF.c++
@@ -0,0 +1,43 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include <math.h>
+
+using namespace ogdf;
+using namespace scripting;
+
+struct FastLayoutOGDF : declarations, ogdf_runner {
+
+ void run () {
+ double angle = 6.28318530718 / graph.numberOfNodes();
+ double radius = parameters->option<double>("my radius ogdf");
+
+ int i = 0;
+ for (node v = graph.firstNode(); v; v=v->succ(), i++) {
+ graph_attributes.x(v) = cos(angle*i) * radius;
+ graph_attributes.y(v) = sin(angle*i) * radius;
+ }
+ }
+
+ void declare(script s) {
+ using namespace scripting;
+
+ s.declare(key ("fast simple demo layout ogdf")
+ .summary ("The OGDF version of the hello world of graph drawing")
+ .precondition ("connected")
+ .algorithm (this));
+
+ s.declare(key ("my radius ogdf")
+ .summary ("A radius value for the hello world of graph drawing")
+ .type ("length")
+ .initial ("1cm"));
+ }
+
+};
+
+extern "C" int luaopen_pgf_gd_ogdf_c_SimpleDemoOGDF (struct lua_State *state) {
+
+ script (state).declare (new FastLayoutOGDF);
+
+ return 0;
+}
+
diff --git a/graphics/pgf/base/source/SolarMerger_script.h b/graphics/pgf/base/source/SolarMerger_script.h
new file mode 100644
index 0000000000..8453241bd6
--- /dev/null
+++ b/graphics/pgf/base/source/SolarMerger_script.h
@@ -0,0 +1,36 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/SolarMerger.h>
+
+struct SolarMerger_script :
+ scripting::declarations,
+ scripting::factory<ogdf::SolarMerger>
+{
+ ogdf::SolarMerger* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ SolarMerger* r = new SolarMerger (parameters->option<bool>("SolarMerger.simple"),
+ parameters->option<bool>("SolarMerger.massAsNodeRadius"));
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("SolarMerger")
+ .set_module ("MultilevelBuilder", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.SolarMerger"));
+
+ s.declare (key ("SolarMerger.simple")
+ .type ("boolean")
+ .initial ("false")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.SolarMerger"));
+
+ s.declare (key ("SolarMerger.massAsNodeRadius")
+ .type ("boolean")
+ .initial ("false")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.SolarMerger"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/SolarPlacer_script.h b/graphics/pgf/base/source/SolarPlacer_script.h
new file mode 100644
index 0000000000..5f9191251c
--- /dev/null
+++ b/graphics/pgf/base/source/SolarPlacer_script.h
@@ -0,0 +1,26 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/SolarPlacer.h>
+
+struct SolarPlacer_script :
+ scripting::declarations,
+ scripting::factory<ogdf::SolarPlacer>
+{
+ ogdf::SolarPlacer* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ SolarPlacer* r = new SolarPlacer;
+
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("SolarPlacer")
+ .set_module ("InitialPlacer", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.SolarPlacer"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/SplitHeuristic_script.h b/graphics/pgf/base/source/SplitHeuristic_script.h
new file mode 100644
index 0000000000..6799be36e9
--- /dev/null
+++ b/graphics/pgf/base/source/SplitHeuristic_script.h
@@ -0,0 +1,20 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/SplitHeuristic.h>
+
+struct SplitHeuristic_script :
+ scripting::declarations,
+ scripting::factory<ogdf::SplitHeuristic>
+{
+
+ ogdf::SplitHeuristic* make (scripting::run_parameters* parameters) {
+ return new ogdf::SplitHeuristic;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ s.declare (key ("SplitHeuristic")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SplitHeuristic")
+ .set_module ("TwoLayerCrossMin", this));
+ }
+};
+
diff --git a/graphics/pgf/base/source/SpringEmbedderFRExact_script.h b/graphics/pgf/base/source/SpringEmbedderFRExact_script.h
new file mode 100644
index 0000000000..4e9fbfb3f1
--- /dev/null
+++ b/graphics/pgf/base/source/SpringEmbedderFRExact_script.h
@@ -0,0 +1,66 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/SpringEmbedderFRExact.h>
+
+struct SpringEmbedderFRExact_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ SpringEmbedderFRExact layout;
+
+ parameters->configure_option ("SpringEmbedderFRExact.iterations",
+ &SpringEmbedderFRExact::iterations, layout);
+ parameters->configure_option ("SpringEmbedderFRExact.noise",
+ &SpringEmbedderFRExact::noise, layout);
+ parameters->configure_option ("SpringEmbedderFRExact.idealEdgeLength",
+ &SpringEmbedderFRExact::idealEdgeLength, layout);
+ parameters->configure_option ("SpringEmbedderFRExact.convTolerance",
+ &SpringEmbedderFRExact::convTolerance, layout);
+
+ char* s = 0;
+
+ if (parameters->option("SpringEmbedderFRExact.coolingFunction", s)) {
+ if (strcmp(s, "factor") == 0)
+ layout.coolingFunction(SpringEmbedderFRExact::cfFactor);
+ else if (strcmp(s, "logarithmic") == 0)
+ layout.coolingFunction(SpringEmbedderFRExact::cfLogarithmic);
+
+ free(s);
+ }
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("SpringEmbedderFRExact")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact"));
+
+ s.declare (key ("SpringEmbedderFRExact.iterations")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact"));
+
+ s.declare (key ("SpringEmbedderFRExact.noise")
+ .type ("boolean")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact"));
+
+ s.declare (key ("SpringEmbedderFRExact.coolingFunction")
+ .type ("string")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact"));
+
+ s.declare (key ("SpringEmbedderFRExact.idealEdgeLength")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact"));
+
+ s.declare (key ("SpringEmbedderFRExact.convTolerance")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFRExact"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/SpringEmbedderFR_script.h b/graphics/pgf/base/source/SpringEmbedderFR_script.h
new file mode 100644
index 0000000000..5ae182e589
--- /dev/null
+++ b/graphics/pgf/base/source/SpringEmbedderFR_script.h
@@ -0,0 +1,45 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/SpringEmbedderFR.h>
+
+struct SpringEmbedderFR_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ SpringEmbedderFR layout;
+
+ parameters->configure_option ("SpringEmbedderFR.iterations",
+ &SpringEmbedderFR::iterations, layout);
+ parameters->configure_option ("SpringEmbedderFR.noise",
+ &SpringEmbedderFR::noise, layout);
+ parameters->configure_option ("SpringEmbedderFR.scaleFunctionFactor",
+ &SpringEmbedderFR::scaleFunctionFactor, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("SpringEmbedderFR")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFR"));
+
+ s.declare (key ("SpringEmbedderFR.iterations")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFR"));
+
+ s.declare (key ("SpringEmbedderFR.noise")
+ .type ("boolean")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFR"));
+
+ s.declare (key ("SpringEmbedderFR.scaleFunctionFactor")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderFR"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/SpringEmbedderKK_script.h b/graphics/pgf/base/source/SpringEmbedderKK_script.h
new file mode 100644
index 0000000000..2b1586a546
--- /dev/null
+++ b/graphics/pgf/base/source/SpringEmbedderKK_script.h
@@ -0,0 +1,39 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/SpringEmbedderKK.h>
+
+struct SpringEmbedderKK_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ SpringEmbedderKK layout;
+
+ parameters->configure_option ("SpringEmbedderKK.stopTolerance",
+ &SpringEmbedderKK::setStopTolerance, layout);
+ parameters->configure_option ("SpringEmbedderKK.desLength",
+ &SpringEmbedderKK::setDesLength, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("SpringEmbedderKK")
+ .precondition ("connected")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderKK"));
+
+ s.declare (key ("SpringEmbedderKK.stopTolerance")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderKK"));
+
+ s.declare (key ("SpringEmbedderKK.desLength")
+ .type ("length")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.SpringEmbedderKK"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/SugiyamaLayout_script.h b/graphics/pgf/base/source/SugiyamaLayout_script.h
new file mode 100644
index 0000000000..c9cf097373
--- /dev/null
+++ b/graphics/pgf/base/source/SugiyamaLayout_script.h
@@ -0,0 +1,54 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/layered/SugiyamaLayout.h>
+
+struct SugiyamaLayout_script :
+ scripting::declarations,
+ scripting::ogdf_runner
+{
+ void run () {
+ using namespace ogdf;
+ SugiyamaLayout layout;
+
+ parameters->configure_option ("SugiyamaLayout.runs",
+ &SugiyamaLayout::runs, layout);
+ parameters->configure_option ("SugiyamaLayout.transpose",
+ &SugiyamaLayout::transpose, layout);
+ parameters->configure_option ("SugiyamaLayout.fails",
+ &SugiyamaLayout::fails, layout);
+
+ parameters->configure_module ("RankingModule",
+ &SugiyamaLayout::setRanking, layout);
+ parameters->configure_module ("TwoLayerCrossMin",
+ &SugiyamaLayout::setCrossMin, layout);
+ parameters->configure_module ("HierarchyLayoutModule",
+ &SugiyamaLayout::setLayout, layout);
+
+ layout.call (graph_attributes);
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+ s.declare (key ("SugiyamaLayout")
+ .precondition ("connected")
+ .postcondition ("upward_oriented_swapped")
+ .algorithm (this)
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SugiyamaLayout"));
+
+ s.declare (key ("SugiyamaLayout.runs")
+ .type ("number")
+ .initial ("15")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SugiyamaLayout"));
+
+ s.declare (key ("SugiyamaLayout.transpose")
+ .type ("boolean")
+ .initial ("true")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SugiyamaLayout"));
+
+ s.declare (key ("SugiyamaLayout.fails")
+ .type ("number")
+ .initial ("4")
+ .documentation_in ("pgf.gd.doc.ogdf.layered.SugiyamaLayout"));
+ }
+
+};
diff --git a/graphics/pgf/base/source/ZeroPlacer_script.h b/graphics/pgf/base/source/ZeroPlacer_script.h
new file mode 100644
index 0000000000..255ac34bd8
--- /dev/null
+++ b/graphics/pgf/base/source/ZeroPlacer_script.h
@@ -0,0 +1,32 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+#include <ogdf/energybased/multilevelmixer/ZeroPlacer.h>
+
+struct ZeroPlacer_script :
+ scripting::declarations,
+ scripting::factory<ogdf::ZeroPlacer>
+{
+ ogdf::ZeroPlacer* make (scripting::run_parameters* parameters) {
+ using namespace ogdf;
+ ZeroPlacer* r = new ZeroPlacer;
+
+ parameters->configure_option ("ZeroPlacer.randomRange",
+ &ZeroPlacer::setRandomRange, *r);
+
+ return r;
+ }
+
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (key ("ZeroPlacer")
+ .set_module ("InitialPlacer", this)
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.ZeroPlacer"));
+
+ s.declare (key ("ZeroPlacer.randomRange")
+ .type ("number")
+ .documentation_in ("pgf.gd.doc.ogdf.energybased.multilevelmixer.ZeroPlacer"));
+
+ }
+
+};
diff --git a/graphics/pgf/base/source/energybased_script.h b/graphics/pgf/base/source/energybased_script.h
new file mode 100644
index 0000000000..fdcd92565e
--- /dev/null
+++ b/graphics/pgf/base/source/energybased_script.h
@@ -0,0 +1,31 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include "FMMMLayout_script.h"
+#include "GEMLayout_script.h"
+#include "FastMultipoleEmbedder_script.h"
+
+#include "SpringEmbedderFR_script.h"
+#include "SpringEmbedderFRExact_script.h"
+#include "SpringEmbedderKK_script.h"
+
+#include "MultilevelLayout_script.h"
+
+#include "multilevelmixer/multilevelmixer_script.h"
+
+struct energybased_script :
+ scripting::declarations
+{
+ void declare (scripting::script s) {
+ s.declare (new FMMMLayout_script);
+ s.declare (new GEMLayout_script);
+ s.declare (new FastMultipoleEmbedder_script);
+
+ s.declare (new SpringEmbedderFR_script);
+ s.declare (new SpringEmbedderFRExact_script);
+ s.declare (new SpringEmbedderKK_script);
+
+ s.declare (new MultilevelLayout_script);
+
+ s.declare (new multilevelmixer_script);
+ }
+};
diff --git a/graphics/pgf/base/source/layered_script.h b/graphics/pgf/base/source/layered_script.h
new file mode 100644
index 0000000000..8a117f1fc6
--- /dev/null
+++ b/graphics/pgf/base/source/layered_script.h
@@ -0,0 +1,46 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include "SugiyamaLayout_script.h"
+
+#include "LongestPathRanking_script.h"
+#include "OptimalRanking_script.h"
+#include "CoffmanGrahamRanking_script.h"
+
+#include "DfsAcyclicSubgraph_script.h"
+#include "GreedyCycleRemoval_script.h"
+
+#include "BarycenterHeuristic_script.h"
+#include "GreedyInsertHeuristic_script.h"
+#include "SiftingHeuristic_script.h"
+#include "MedianHeuristic_script.h"
+#include "SplitHeuristic_script.h"
+
+#include "FastHierarchyLayout_script.h"
+#include "FastSimpleHierarchyLayout_script.h"
+
+struct layered_script :
+ scripting::declarations
+{
+ void declare (scripting::script s) {
+ using namespace scripting;
+ using namespace ogdf;
+
+ s.declare (new SugiyamaLayout_script);
+
+ s.declare (new LongestPathRanking_script);
+ s.declare (new OptimalRanking_script);
+ s.declare (new CoffmanGrahamRanking_script);
+
+ s.declare (new DfsAcyclicSubgraph_script);
+ s.declare (new GreedyCycleRemoval_script);
+
+ s.declare (new BarycenterHeuristic_script);
+ s.declare (new GreedyInsertHeuristic_script);
+ s.declare (new SiftingHeuristic_script);
+ s.declare (new MedianHeuristic_script);
+ s.declare (new SplitHeuristic_script);
+
+ s.declare (new FastHierarchyLayout_script);
+ s.declare (new FastSimpleHierarchyLayout_script);
+ }
+};
diff --git a/graphics/pgf/base/source/misclayout_script.h b/graphics/pgf/base/source/misclayout_script.h
new file mode 100644
index 0000000000..22ac039b7f
--- /dev/null
+++ b/graphics/pgf/base/source/misclayout_script.h
@@ -0,0 +1,13 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include "BalloonLayout_script.h"
+#include "CircularLayout_script.h"
+
+struct misclayout_script :
+ scripting::declarations
+{
+ void declare (scripting::script s) {
+ s.declare (new BalloonLayout_script);
+ s.declare (new CircularLayout_script);
+ }
+};
diff --git a/graphics/pgf/base/source/module_script.h b/graphics/pgf/base/source/module_script.h
new file mode 100644
index 0000000000..97579ecdd9
--- /dev/null
+++ b/graphics/pgf/base/source/module_script.h
@@ -0,0 +1,27 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+struct module_script : scripting::declarations {
+ void declare (scripting::script s)
+ {
+ using namespace scripting;
+
+ s.declare (key ("RankingModule")
+ .module_type ());
+
+ s.declare (key ("AcyclicSubgraphModule")
+ .module_type ());
+
+ s.declare (key ("HierarchyLayoutModule")
+ .module_type ());
+
+ s.declare (key ("TwoLayerCrossMin")
+ .module_type ());
+
+ s.declare (key ("InitialPlacer")
+ .module_type ());
+
+ s.declare (key ("MultilevelBuilder")
+ .module_type ());
+ }
+};
+
diff --git a/graphics/pgf/base/source/multilevelmixer_script.h b/graphics/pgf/base/source/multilevelmixer_script.h
new file mode 100644
index 0000000000..499406bc33
--- /dev/null
+++ b/graphics/pgf/base/source/multilevelmixer_script.h
@@ -0,0 +1,33 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include "BarycenterPlacer_script.h"
+#include "IndependentSetMerger_script.h"
+#include "MedianPlacer_script.h"
+#include "SolarMerger_script.h"
+#include "CirclePlacer_script.h"
+#include "LocalBiconnectedMerger_script.h"
+#include "RandomMerger_script.h"
+#include "SolarPlacer_script.h"
+#include "EdgeCoverMerger_script.h"
+#include "MatchingMerger_script.h"
+#include "RandomPlacer_script.h"
+#include "ZeroPlacer_script.h"
+
+struct multilevelmixer_script :
+ scripting::declarations
+{
+ void declare (scripting::script s) {
+ s.declare (new BarycenterPlacer_script);
+ s.declare (new IndependentSetMerger_script);
+ s.declare (new MedianPlacer_script);
+ s.declare (new SolarMerger_script);
+ s.declare (new CirclePlacer_script);
+ s.declare (new LocalBiconnectedMerger_script);
+ s.declare (new RandomMerger_script);
+ s.declare (new SolarPlacer_script);
+ s.declare (new EdgeCoverMerger_script);
+ s.declare (new MatchingMerger_script);
+ s.declare (new RandomPlacer_script);
+ s.declare (new ZeroPlacer_script);
+ }
+};
diff --git a/graphics/pgf/base/source/ogdf_script.c++ b/graphics/pgf/base/source/ogdf_script.c++
new file mode 100644
index 0000000000..12a5f6bfeb
--- /dev/null
+++ b/graphics/pgf/base/source/ogdf_script.c++
@@ -0,0 +1,23 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include "module/module_script.h"
+
+#include "layered/layered_script.h"
+#include "energybased/energybased_script.h"
+#include "misclayout/misclayout_script.h"
+#include "planarity/planarity_script.h"
+
+
+extern "C" int luaopen_pgf_gd_ogdf_c_ogdf_script (struct lua_State *state) {
+
+ scripting::script s (state);
+
+ s.declare (new module_script);
+ s.declare (new layered_script);
+ s.declare (new energybased_script);
+ s.declare (new misclayout_script);
+ s.declare (new planarity_script);
+
+ return 0;
+}
+
diff --git a/graphics/pgf/base/source/pgfmathtestsuite.tex b/graphics/pgf/base/source/pgfmathtestsuite.tex
new file mode 100644
index 0000000000..6baf5ddba4
--- /dev/null
+++ b/graphics/pgf/base/source/pgfmathtestsuite.tex
@@ -0,0 +1,1264 @@
+% FIXME: this class is MESSY.
+%
+% rewrite with proper assertions ... it goes back to a time where I
+% merely wanted to inspect the results!
+%
+% --> see 'assertEquals' in this file
+%
+\documentclass[a4paper]{article}
+
+\usepackage[intlimits]{amsmath}
+\usepackage{amssymb}
+\usepackage{amsfonts}
+\usepackage{ifpdf}
+
+\ifpdf
+ \usepackage{hyperref}
+\else
+ \def\pgfsysdriver{pgfsys-dvipdfm.def}
+ \usepackage[dvipdfm]{hyperref}
+\fi
+\usepackage{tikz}
+\usepackage{fp}
+
+\makeatletter
+\pgfutil@ifundefined{pgfmathdeclarefunction}{
+ % load pgfplots with its pgf 2.00 compatibility code:
+ \usepackage{pgfplots}
+}{
+ \usepgflibrary{fpu}
+}
+\makeatother
+
+\pgfmathfloatcreate{1}{5.0}{-4}
+\let\THRESH=\pgfmathresult
+
+
+\parindent=0pt
+
+
+\author{Christian Feuers\"anger}
+\title{Test cases for pgffloatmath.code.tex}
+
+\def\testsection#1{\message{---------- STARTING TEST SECTION '#1'}\section{#1}}
+\def\testsubsection#1{\message{-------STARTING TEST SUBSECTION '#1'}\subsection{#1}}
+\def\testsubsubsection#1{\message{------STARTING TEST SUBSUBSECTION '#1'}\subsubsection{#1}}
+
+
+\def\compare#1#2{%
+ \begingroup
+ \message{COMPUTING LOG(#1)}%
+ \pgfmathlog{#1}%
+ \let\actual=\pgfmathresult
+ \def\expected{#2}%
+ \pgfmathsubtract\actual\expected%
+ \let\abserr=\pgfmathresult
+ \pgfmathdivide\abserr\expected
+ \let\relerr=\pgfmathresult
+ \noindent
+ log(#1)\hfill=
+ \expected;\hfill%
+ actual=\actual;\hfill%
+ abserr=\abserr;\hfill%
+ relerr=\relerr;\hfill%
+ \endgroup
+ \par
+}%
+%--------------------------------------------------
+% \def\showlowlevelfloat#1#2e#3\relax{%
+% \ensuremath{[#1] \cdot #2 \cdot 10^{#3}}%
+% }%
+%--------------------------------------------------
+\long\def\showlowlevelfloatmacro#1{#1}
+
+\long\def\showlowlevelfloatmacrolong#1{%
+ #1 is decomposed into
+
+ {%
+ \gdef\testerror{}%
+ \pgfmathfloattoregisters{#1}{\count0 }{\dimen0 }{\count1 }%
+ pgfmathfloattoregisters: flags \the\count0; M=\the\dimen0; E=\the\count1
+ \ifx\testerror\empty
+ \else
+ \par (caught \texttt{\testerror})%
+ \fi
+ }%
+
+ {%
+ \gdef\testerror{}%
+ pgfmathfloattoregisterstok: \pgfmathfloattoregisterstok{#1}{\count0 }{\toks0 }{\count1 }%
+ flags \the\count0; M=\the\toks0; E=\the\count1
+ \ifx\testerror\empty
+ \else
+ \par (caught \texttt{\testerror})%
+ \fi
+ }%
+
+ {%
+ \gdef\testerror{}%
+ pgfmathfloatgetflags \pgfmathfloatgetflags{#1}{\count0 }
+ flags \the\count0;
+ \ifx\testerror\empty
+ \else
+ \par (caught \texttt{\testerror})%
+ \fi
+ }%
+
+ \medskip
+ %\expandafter\showlowlevelfloat#1\relax
+}%
+
+\def\showsinglenumberparsing#1{%
+%\tracingmacros=2\tracingcommands=2
+ \begingroup
+ \message{PARSING NUMBER #1...}%
+ \gdef\testerror{}%
+ \pgfmathfloatparsenumber{#1}%
+ \let\resultasfloat=\pgfmathresult
+ \pgfmathfloattofixed\resultasfloat
+ \let\resultasfixed=\pgfmathresult
+ \[ #1 \mapsto \resultasfloat = \showlowlevelfloatmacro\resultasfloat \mapsto \resultasfixed
+ \]
+ \ifx\testerror\empty
+ \else
+ \par (caught \texttt{\testerror})%
+ \fi
+ \endgroup
+%\tracingmacros=0\tracingcommands=0
+}
+
+\def\pretty#1{%
+ \message{Pretty-printing #1...}%
+ \pgfmathprintnumberto{#1}\result
+ {\pgfkeys{/pgf/number format/showpos}\pgfmathprintnumberto{#1}\resultpos\global\let\resultpos=\resultpos}%
+ \[ #1 \mapsto \pgfmathprintnumber{#1} [=\resultpos] \]
+ \message{#1 mapsto \meaning\result}%
+}
+
+\begin{document}
+\maketitle
+
+
+%--------------------------------------------------
+% \showit{2.8128}
+% log(12)=\pgfmathlog{1.2}\pgfmathadd{\pgfmathresult}{2.30258}\pgfmathresult\par
+% \showit{1.2}
+% \showit{4.0}
+% log(1200)=\pgfmathlog{1.2}\pgfmathadd{\pgfmathresult}{6.9077}\pgfmathresult\par
+% log(6.241e-7)=\pgfmathlog{6.241}\pgfmathadd{\pgfmathresult}{-16.11809}\pgfmathresult\par
+%--------------------------------------------------
+
+\testsection{Conversion to normalised floating point numbers basis 10}
+\showsinglenumberparsing{123.41251}%
+\showsinglenumberparsing{1023.52}
+\showsinglenumberparsing{123412.51}%
+\showsinglenumberparsing{12341251.0}%
+\showsinglenumberparsing{-12341251.0}%
+\showsinglenumberparsing{1.2341251}%
+\showsinglenumberparsing{8.02410024}
+\showsinglenumberparsing{8.024100}
+\showsinglenumberparsing{0001234.3100}
+\showsinglenumberparsing{0001234.00001}
+\showsinglenumberparsing{0001000.00001}
+\showsinglenumberparsing{0001000.00001000}
+\showsinglenumberparsing{0.12341251}%
+\showsinglenumberparsing{0.0012341251}%
+\showsinglenumberparsing{0.00000012341251}%
+\showsinglenumberparsing{-0.00000012341251}%
+\showsinglenumberparsing{10}
+\showsinglenumberparsing{100.351}
+\showsinglenumberparsing{100.35100}
+\showsinglenumberparsing{100.35100234}
+\showsinglenumberparsing{100.0035100234}
+\showsinglenumberparsing{100}
+\showsinglenumberparsing{99999}
+\showsinglenumberparsing{999.000}
+
+%\tracingmacros=2 \tracingcommands=2
+\showsinglenumberparsing{8.31160034e-02}%
+\showsinglenumberparsing{2.54685628e-02}%
+\showsinglenumberparsing{7.40715288e-03}%
+\showsinglenumberparsing{2.10192154e-03}%
+\showsinglenumberparsing{5.87352989e-04}%
+\showsinglenumberparsing{-1.62269942e-04}%
+\showsinglenumberparsing{4.44248889e-05}%
+\showsinglenumberparsing{1.20714122e-05}%
+\showsinglenumberparsing{3.26101452e-06}%
+\showsinglenumberparsing{3261.01452e-06}%
+\showsinglenumberparsing{0.000326101452e-06}%
+\showsinglenumberparsing{1.2345e-12}%
+\showsinglenumberparsing{1.2345e+12}%
+
+\message{SPECIAL CASE 0}%
+\showsinglenumberparsing{0}
+\showsinglenumberparsing{-0}
+\showsinglenumberparsing{-0.000}
+\showsinglenumberparsing{+0.000}
+\showsinglenumberparsing{+0}
+\showsinglenumberparsing{-1}
+\showsinglenumberparsing{1.0e1}
+\showsinglenumberparsing{1e1}
+\showsinglenumberparsing{1141}
+\showsinglenumberparsing{-53e-5}
+
+\testsubsection{Error handling}
+{
+ \pgfkeys{
+ /pgf/fpu/handlers/empty number/.code 2 args={%
+ \gdef\testerror{handlers/empty number=\{#1\}\{#2\}}%
+ },
+ /pgf/fpu/handlers/invalid number/.code 2 args={%
+ \gdef\testerror{handlers/invalid number=\{#1\}\{#2\}}%
+ },
+ /pgf/fpu/handlers/wrong lowlevel format/.code 2 args={%
+ \gdef\testerror{handlers/wrong lowlevel format=\{#1\}\{#2\}}%
+ },
+ }
+ \showsinglenumberparsing{-53e-5 not terminated}
+ %\showsinglenumberparsing{-53e-}
+ \showsinglenumberparsing{}
+ \showsinglenumberparsing{ ASDZ@414e12}
+
+ This one has trailing spaces and should work:
+ \showsinglenumberparsing{10 }
+
+ This one has leading spaces and should work:
+ \showsinglenumberparsing{ 10}
+
+ \testsubsection{Error handling of decompose routines}
+
+ \pgfmathfloatparsenumber{100}
+ \showlowlevelfloatmacrolong{\pgfmathresult}
+
+ \showlowlevelfloatmacrolong{132}
+
+ \showlowlevelfloatmacrolong{Z}
+}
+
+\testsection{logarithms, compared with PGF arithmetics}
+
+\compare{0.1}{-2.30259}
+\compare{0.12}{-2.12026}
+\compare{0.2}{-1.60944}
+\compare{0.3}{-1.20397}
+\compare{0.4}{-0.916291}
+\compare{0.5}{-0.693147}
+\compare{0.6}{-0.510826}
+\compare{0.7}{-0.356675}
+\compare{0.75}{-0.287682}
+\compare{0.8}{-0.223144}
+\compare{0.823}{-0.194799}
+\compare{0.9}{-0.105361}
+\compare{0.96}{-0.040822}
+\compare{1.2}{0.182322}
+\compare{1.5}{0.405465}
+\compare{1.6}{0.470004}
+\compare{9.0}{2.1972245773}
+\compare{9.2}{2.2192034}
+\compare{9.3}{2.23001440}
+\compare{9.7}{2.27212588}
+\compare{10.0}{2.302585092}
+\compare{100.0}{4.605170185}
+\compare{1351.0}{7.208600337}
+\compare{9752.0}{9.185227671}
+\compare{9600.0}{9.169518377}
+
+\vskip1cm
+\compare{0.000142}{-8.8596835}
+\compare{0.0054124}{-5.219062661}
+\compare{0.000912697124}{-6.9991064}
+
+\vskip1cm
+\compare{8.31160034e-02}{-2.48751801563782}%
+\compare{2.54685628e-02}{-3.67031041875206}%
+\compare{7.40715288e-03}{-4.90530914022879}%
+\compare{2.10192154e-03}{-6.16490333357987}%
+\compare{5.87352989e-04}{-7.43988457474844}%
+\compare{1.62269942e-04}{-8.72624930084187}%
+\compare{4.44248889e-05}{-10.0217106847708}%
+\compare{1.20714122e-05}{-11.3246705288704}%
+\compare{3.26101452e-06}{-12.6334722085451}%
+
+\vskip1cm
+\compare{5}{1.6094379124341}%
+\compare{17}{2.83321334405622}%
+\compare{39}{3.66356164612965}%
+\compare{49}{3.89182029811063}%
+\compare{129}{4.85981240436167}%
+\compare{321}{5.77144112313002}%
+\compare{769}{6.64509096950564}%
+\compare{1793}{7.49164547360513}%
+\compare{4097}{8.31801027754687}%
+\compare{9217}{9.12880488399366}%
+
+
+\testsection{Test for prettyprinter}
+%\tracingmacros=2\tracingcommands=2
+\message{PRETTY PRINTING}
+{
+\twocolumn
+\def\prettytest{%
+ \pretty{1}
+ \pretty{1.0}
+ \pretty{-1.02311}
+ \pretty{-11241.02311}
+ \pretty{-11241}
+ \pretty{8124.99999}
+ \pretty{8124.849999}
+ \pretty{8124.843333}
+ \pretty{8.82}
+ \pretty{8.5}
+ \pretty{9.}
+ \pretty{5.9}
+ \pretty{-0.00001}
+ \pretty{-1.00001}
+ \pretty{-0.559}
+ \pretty{-0.554}
+ \pretty{-0.00000141}
+ \pretty{1.234e10}
+ \pretty{123456781}
+ \pretty{1234}
+ \pretty{8}
+ \pretty{-9.995}
+ \pretty{-0.015}
+ \pretty{-0.1}
+ \pretty{-0.15}
+ \pretty{0.15}
+ \pretty{-0}
+ \pretty{0}
+ \pretty{9.00}
+ \pretty{200.01}
+ \pretty{200.0000}
+ \pretty{1.5e-7}
+ \pretty{0.00035}
+ \pretty{0.00005}
+ \pretty{nan}
+ \pretty{inf}
+ \pretty{-inf}
+ \pretty{10}
+ \pretty{100}
+ \pretty{200}
+ \pretty{500}
+ \pretty{1000}
+ \pretty{30000}
+ \pretty{600000}
+ \pretty{1000000}
+ \pretty{30000000}
+ \pretty{600000000}
+ \pretty{1000000000}
+ \pretty{-10}
+ \pretty{-100}
+ \pretty{-200}
+ \pretty{-500}
+ \pretty{-1000}
+ \pretty{-30000}
+ \pretty{-600000}
+ \pretty{-1000000}
+ \pretty{-30000000}
+ \pretty{-600000000}
+ \pretty{-1000000000}
+}
+
+\testsubsection{STD format}
+\pgfqkeys{/pgf/number format}{std}
+\prettytest
+
+{
+\testsubsubsection{precision 0}
+\pgfqkeys{/pgf/number format}{precision=0}
+\prettytest
+}
+
+{
+\testsubsection{FIXED format}
+\testsubsubsection{with period}
+\pgfqkeys{/pgf/number format}{fixed,use period}
+\prettytest
+
+{
+\testsubsubsection{precision 0}
+\pgfqkeys{/pgf/number format}{precision=0}
+\prettytest
+}
+{
+\testsubsubsection{skip 0.=true}
+\pgfqkeys{/pgf/number format}{skip 0.=true}
+\prettytest
+}
+
+{
+\testsubsubsection{1000 sep; min exponent for 1000 sep=4}
+\pgfqkeys{/pgf/number format}{1000 sep=',min exponent for 1000 sep=4}
+\prettytest
+}
+
+\testsubsubsection{with comma}
+\pgfqkeys{/pgf/number format}{fixed,use comma}
+\prettytest
+}
+
+
+{
+\testsubsection{FIXED ZEROFILL format}
+\testsubsubsection{with period}
+\pgfqkeys{/pgf/number format}{fixed,fixed zerofill,use period}
+\prettytest
+
+{
+\testsubsubsection{precision 0}
+\pgfqkeys{/pgf/number format}{precision=0}
+\prettytest
+}
+
+\testsubsubsection{with comma}
+\pgfqkeys{/pgf/number format}{fixed,fixed zerofill,use comma}
+%\tracingmacros=2\tracingcommands=2
+\prettytest
+%\tracingmacros=0\tracingcommands=0
+}
+
+{
+\testsubsection{sci format}
+\testsubsubsection{with period}
+\pgfqkeys{/pgf/number format}{sci,use period}
+\prettytest
+
+{
+\testsubsubsection{precision 0}
+\pgfqkeys{/pgf/number format}{precision=0}
+\prettytest
+}
+
+\testsubsubsection{with comma}
+\pgfqkeys{/pgf/number format}{sci,use comma}
+\prettytest
+
+%\testsubsection{may skip mantisse}
+%\pgfqkeys{/pgf/number format}{sci may skip mantisse=true}
+%\prettytest
+
+}{
+\testsubsection{sci format zerofill}
+\testsubsubsection{with period}
+\pgfqkeys{/pgf/number format}{sci,sci zerofill,use period}
+\prettytest
+
+\testsubsubsection{with comma}
+\pgfqkeys{/pgf/number format}{sci,sci zerofill,use comma}
+\prettytest
+
+\testsubsubsection{e-style}
+\pgfqkeys{/pgf/number format}{sci e}
+\prettytest
+
+\testsubsubsection{subscript-style}
+\pgfqkeys{/pgf/number format}{sci subscript}
+\prettytest
+
+\testsubsubsection{subscript-style + period + no zero fill}
+\pgfqkeys{/pgf/number format}{sci subscript,use period,sci}
+\prettytest
+
+\testsubsubsection{subscript-style precision 4}
+\pgfqkeys{/pgf/number format}{sci subscript,precision=4}
+\prettytest
+}
+
+\testsubsection{int trunc format}
+\pgfqkeys{/pgf/number format}{int trunc}
+\prettytest
+
+\testsubsection{int detect format}
+\pgfqkeys{/pgf/number format}{int detect}
+\prettytest
+
+\testsubsection{frac}
+\pgfqkeys{/pgf/number format}{frac}
+\pretty{0.333333333333333}
+\pretty{0.5}
+\pretty{2.133333333333325e-01}%
+\pretty{0.12}
+\pretty{2.666666666666646e-02}%
+\pretty{-1.333333333333334e-02}%
+\pretty{7.200000000000000e-01}%
+\pretty{6.666666666666667e-02}%
+\pretty{1.333333333333333e-01}%
+\pretty{-1.333333333333333e-02}%
+\pretty{8.533333333333298e-01}
+\pretty{8.533333e-01}
+}
+\onecolumn
+
+\testsection{Pretty printing using the relative style}
+{
+\long\def\TESTIT#1#2{%
+ \gdef\temptable{\begin{tabular}}%
+ \gdef\header{l}%
+ \def\n{\noexpand\n}%
+ \foreach \number in {#2} {%
+ \xdef\header{\header c}%
+ }%
+ \toks0=\expandafter{\temptable}%
+ \xdef\temptable{\the\toks0 {\header}\n}%
+ %
+ \toks0=\expandafter{\temptable}%
+ \toks1={}%
+ \xdef\temptable{\the\toks0 \the\toks1}%
+ \foreach \number in {#2} {%
+ \toks0=\expandafter{\temptable}%
+ \toks1=\expandafter{\number}%
+ \xdef\temptable{\the\toks0 & \noexpand\texttt{\the\toks1}}%
+ }%
+ \toks0=\expandafter{\temptable}%
+ \xdef\temptable{\the\toks0 \noexpand\\\n}%
+ %
+ \toks0=\expandafter{\temptable}%
+ \toks1={With actual config:}%
+ \xdef\temptable{\the\toks0 \the\toks1}%
+ \foreach \number in {#2} {%
+ \toks0=\expandafter{\temptable}%
+ \toks1=\expandafter{\number}%
+ \xdef\temptable{\the\toks0 & \noexpand\pgfmathprintnumber{\the\toks1}}%
+ }%
+ \toks0=\expandafter{\temptable}%
+ \xdef\temptable{\the\toks0 \noexpand\\\n}%
+ %
+ \foreach \relativeto in {#1} {%
+ \toks0=\expandafter{\temptable}%
+ \xdef\temptable{\the\toks0 Relative to $10^{\relativeto}$:}%
+ \foreach \number in {#2} {%
+ \toks0=\expandafter{\temptable}%
+ \toks1=\expandafter{\number}%
+ \xdef\temptable{\the\toks0 & \noexpand\pgfmathprintnumber[relative={\relativeto}]{\the\toks1}}%
+ }%
+ \toks0=\expandafter{\temptable}%
+ \xdef\temptable{\the\toks0 \noexpand\\\n}%
+ }%
+ %
+ %
+ \toks0=\expandafter{\temptable}%
+ \toks1={\end{tabular}\n}%
+ \xdef\temptable{\the\toks0 \the\toks1}%
+ %
+ \def\n{^^J}%
+%\message{TEMP-TABLE: \n\meaning\temptable\n}%
+ %
+ \let\n=\relax
+ \noindent
+ \temptable
+}%
+%\tracingmacros=2 \tracingcommands=2
+
+\TESTIT{1,3}{1e-16,0,15,17,20}
+
+\TESTIT{0,1,3,4,5,6,7,8,9}{-100.123456,1e-16,1431,2000.1234,123456789.1234}
+
+
+
+\TESTIT{-4,-3,-2,-1,0,1,2,3}{0.0001,0.00012678,0.00013678,0.00016678,1.23,2.345,123.4,1234.5}
+
+{
+\subsection*{every relative/.style={sci}}
+\pgfkeys{/pgf/number format/every relative/.style={sci}}
+\TESTIT{-4,-3,-2,-1,0,1,2,3}{0.0001,0.00012678,0.00013678,0.00016678,1.23,2.345,123.4,1234.5}
+}
+
+\TESTIT{-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9}{-123.123456,123.1234565}
+{
+\subsection*{precision=4}
+\pgfkeys{/pgf/number format/precision=4}
+\TESTIT{-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9}{-123.123456,123.1234565}
+}
+}
+
+\begingroup
+\testsection{testing pgfmathfloatadd}
+\def\testfloataddnonsymmetric#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\first=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\second=\pgfmathresult
+ \message{computing #1 + #2; \first + \second}%
+ \pgfmathfloatadd\first\second
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \let\resultfixed=\pgfmathresult
+ \[ \text{pgfmathfloatadd: } \showlowlevelfloatmacro\first + \showlowlevelfloatmacro\second = \showlowlevelfloatmacro\result \; \bigl( #1 + #2 = \resultfixed \bigr). \]
+}%
+\def\testfloatadd#1#2{%
+ \testfloataddnonsymmetric{#1}{#2}%
+ \testfloataddnonsymmetric{#2}{#1}%
+}%
+
+\testfloatadd{1}{100}
+\testfloatadd{100}{100}
+\testfloatadd{1}{2}
+\testfloatadd{1}{0}
+\testfloatadd{9.999999}{0}
+\testfloatadd{9.9999}{0.0001}
+\testfloatadd{9.9999e-5}{0.0001e-5}
+\testfloatadd{1e6}{1e5}
+\testfloatadd{1e6}{1e3}
+\testfloatadd{1e6}{1}
+\testfloatadd{1e6}{0.1}
+
+\testfloatadd{1}{-100}
+\testfloatadd{100}{-100}
+\testfloatadd{1}{-2}
+\testfloatadd{1e6}{-1e5}
+\testfloatadd{1e6}{-1e3}
+\testfloatadd{1e6}{-1}
+\testfloatadd{1e6}{-0.1}
+
+\testfloatadd{1e-3}{0}
+
+\testfloatadd{inf}{0}
+\testfloatadd{inf}{5}
+\testfloatadd{nan}{5}
+\testfloatadd{0}{0}
+\testfloatadd{-inf}{inf}
+\testfloatadd{-inf}{40}
+\endgroup
+
+\begingroup
+\testsection{testing pgfmathfloatmultiplyfixed}
+\def\testfloatmultiplyfixed#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\first=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \pgfmathfloattofixed\pgfmathresult
+ \let\second=\pgfmathresult
+ \message{computing #1 * #2; \first * \second}%
+ \pgfmathfloatmultiplyfixed\first\second
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \let\resultfixed=\pgfmathresult
+ \[ \text{pgfmathfloatmultiplyfixed: } \showlowlevelfloatmacro\first \cdot \second = \showlowlevelfloatmacro\result \; \bigl( #1 \cdot #2 = \resultfixed \bigr). \]
+}%
+
+\testfloatmultiplyfixed{1}{100}
+\testfloatmultiplyfixed{100}{100}
+\testfloatmultiplyfixed{1}{2}
+\testfloatmultiplyfixed{5}{2}
+\testfloatmultiplyfixed{5e4}{10}
+\testfloatmultiplyfixed{1}{0}
+\testfloatmultiplyfixed{9.999999}{0}
+\testfloatmultiplyfixed{9.9999}{0.0001}
+\testfloatmultiplyfixed{9.9999e-5}{0.001}
+\testfloatmultiplyfixed{1e6}{4}
+\testfloatmultiplyfixed{1e6}{100}
+\testfloatmultiplyfixed{1e6}{1}
+\testfloatmultiplyfixed{1e6}{0.1}
+
+\testfloatmultiplyfixed{1}{-100}
+\testfloatmultiplyfixed{100}{-100}
+\testfloatmultiplyfixed{1}{-2}
+\testfloatmultiplyfixed{1e6}{-9}
+\testfloatmultiplyfixed{1e6}{-100}
+\testfloatmultiplyfixed{1e6}{-1}
+\testfloatmultiplyfixed{1e6}{-0.1}
+
+\testfloatmultiplyfixed{1e-3}{0}
+
+\testfloatmultiplyfixed{inf}{0}
+\testfloatmultiplyfixed{inf}{5}
+\testfloatmultiplyfixed{nan}{5}
+\testfloatmultiplyfixed{0}{0}
+\testfloatmultiplyfixed{-inf}{40}
+\endgroup
+
+
+\testsection{testing pgfmathfloatlessthan}
+\def\testfloatlessthan#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\first=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\second=\pgfmathresult
+ \message{checking #1 <= #2; \first <= \second}%
+ \pgfmathfloatlessthan\first\second
+ \ifpgfmathfloatcomparison
+ \def\result{<}%
+ \else
+ \def\result{\ge}%
+ \fi
+ \[ \text{pgfmathfloatlessthan: } \bigl( \showlowlevelfloatmacro\first \bigr)\; = #1 \result #2\; \bigl( = \showlowlevelfloatmacro\second \big). \]
+}%
+
+\testfloatlessthan{4}{5}
+\testfloatlessthan{0}{2}
+\testfloatlessthan{91751123}{241924}
+\testfloatlessthan{-1}{-1}
+\testfloatlessthan{-1231}{0}
+\testfloatlessthan{10}{-5}
+\testfloatlessthan{0}{0}
+\testfloatlessthan{-0}{-0}
+\testfloatlessthan{0}{14}
+\testfloatlessthan{114812}{-123124123}
+\testfloatlessthan{114812}{1241231451}
+\testfloatlessthan{-141285}{29}
+\testfloatlessthan{-141285}{0}
+\testfloatlessthan{-141285}{-50}
+\testfloatlessthan{-141285}{-12498149012}
+
+\testsection{float to fixed test}
+\def\testpgfmathfloattofixed#1{%
+ \pgfmathfloatparsenumber{#1}%
+%\tracingmacros=2\tracingcommands=2
+ \let\argument=\pgfmathresult
+ \message{converting #1 = \argument\ to fixed point}%
+ \pgfmathfloattofixed\argument
+ \let\result=\pgfmathresult
+ \message{-> \result}%
+%\tracingmacros=0\tracingcommands=0
+ \[ \bigl( \showlowlevelfloatmacro\argument \bigr)\; = #1 \mapsto \result \]
+}%
+\testpgfmathfloattofixed{0}
+\testpgfmathfloattofixed{5}
+\testpgfmathfloattofixed{5.520241}
+\testpgfmathfloattofixed{124.10241}
+\testpgfmathfloattofixed{-121.248}
+\testpgfmathfloattofixed{-12e-5}
+\testpgfmathfloattofixed{412e3}
+\testpgfmathfloattofixed{0.0001}
+\testpgfmathfloattofixed{0.0}
+\testpgfmathfloattofixed{-0.012125}
+\testpgfmathfloattofixed{1.2e-1}
+\testpgfmathfloattofixed{1.2e-2}
+\testpgfmathfloattofixed{1.2e4}
+\testpgfmathfloattofixed{1.2345e4}
+\testpgfmathfloattofixed{1.234567e4}
+\testpgfmathfloattofixed{1.51234e0}
+\testpgfmathfloattofixed{15}
+\testpgfmathfloattofixed{-20}
+
+\testsection{Testing pgfmathfloatmin and pgfmathfloatmax}
+\def\testfloatminmax#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\first=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\second=\pgfmathresult
+%\tracingmacros=2\tracingcommands=2
+ \message{computing min/max #1 and #2}%
+ \pgfmathfloatmin\first\second
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \[ \min\{#1,#2\} = \min\{ \showlowlevelfloatmacro\first, \showlowlevelfloatmacro\second \} \; = \showlowlevelfloatmacro\result = \pgfmathresult \]
+ %
+ \pgfmathfloatmax\first\second
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \[ \max\{#1,#2\} = \max\{ \showlowlevelfloatmacro\first, \showlowlevelfloatmacro\second \} \; = \showlowlevelfloatmacro\result = \pgfmathresult \]
+}%
+\testfloatminmax{42}{56}
+\testfloatminmax{-4122}{1256}
+\testfloatminmax{1e12}{5.235412e24}
+\testfloatminmax{-12}{-145}
+
+\testsection{Testing pgfmathfloatshift}
+\def\pgfmathfloatshifttest#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argument=\pgfmathresult
+ \message{computing mathshift #1 by #2}%
+ \pgfmathfloatshift\argument{#2}%
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \[ #1 \cdot 10^{#2} = \showlowlevelfloatmacro\argument \cdot 10^{#2} = \showlowlevelfloatmacro\result = \pgfmathresult \]
+}%
+\pgfmathfloatshifttest{4}{1}
+\pgfmathfloatshifttest{4}{2}
+\pgfmathfloatshifttest{4}{-1}
+\pgfmathfloatshifttest{4}{-2}
+\pgfmathfloatshifttest{0}{-2}
+\pgfmathfloatshifttest{1.1415130}{-2}
+\pgfmathfloatshifttest{1.1415130}{5}
+
+\testsection{Testing pgfmathfloatmultiply}
+\begingroup
+\def\pgfmathfloatmultiplytest#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\argumentb=\pgfmathresult
+ \message{computing mathmultiply #1 by #2}%
+ \pgfmathfloatmultiply\argumenta\argumentb%
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \[ #1 \cdot #2 = \showlowlevelfloatmacro\result = \pgfmathresult \]
+}%
+\def\tests{%
+ \pgfmathfloatmultiplytest{4}{1}
+ \pgfmathfloatmultiplytest{4}{2}
+ \pgfmathfloatmultiplytest{4}{-1}
+ \pgfmathfloatmultiplytest{4}{-2}
+ \pgfmathfloatmultiplytest{0}{-2}
+ \pgfmathfloatmultiplytest{1.1415130}{-2}
+ \pgfmathfloatmultiplytest{1.1415130}{5}
+ \pgfmathfloatmultiplytest{10}{10}
+ \pgfmathfloatmultiplytest{100}{100}
+ \pgfmathfloatmultiplytest{9999999}{9999999}
+ gnuplot for $\cdot$: $99999980000001.0$
+ \pgfmathfloatmultiplytest{-10}{10}
+ \pgfmathfloatmultiplytest{-90}{3}
+ \pgfmathfloatmultiplytest{-90}{-3}
+ \pgfmathfloatmultiplytest{-inf}{nan}
+ \pgfmathfloatmultiplytest{-inf}{+inf}
+ \pgfmathfloatmultiplytest{1}{0}
+ \pgfmathfloatmultiplytest{1}{0}
+ \pgfmathfloatmultiplytest{1}{-0}
+ \pgfmathfloatmultiplytest{3.14159265358979}{2}
+}%
+\tests
+
+\testsection{Testing pgfmathfloatdivide}
+
+\def\pgfmathfloatmultiplytest#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\argumentb=\pgfmathresult
+ \message{computing mathdivide #1 by #2}%
+ \pgfmathfloatdivide\argumenta\argumentb%
+ \let\result=\pgfmathresult
+ \pgfmathfloattofixed\result
+ \[ #1 / #2 = \showlowlevelfloatmacro\result = \pgfmathresult \]
+}%
+\tests
+
+% #1/#2 expected #3
+\def\pgfmathfloattest#1#2#3{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\argumentb=\pgfmathresult
+ \pgfmathfloatparsenumber{#3}%
+ \let\reference=\pgfmathresult
+ \message{computing (#1/#2)}%
+ \pgfmathfloatdivide\argumenta\argumentb%
+ \let\resultfloat=\pgfmathresult
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \pgfmathfloatrelerror\resultfloat\reference
+ \pgfmathfloattosci\pgfmathresult
+ \[ #1/#2 = \result\quad (\text{error/r to }#3 = \pgfmathprintnumber\pgfmathresult)\]
+}%
+\pgfmathfloattest{83407811.0}{166815640.0}{0.499999946048224}
+\endgroup
+
+
+{
+\testsection{Testing pgfmathfloatsqrt}
+% #1 : number
+% #2 : the reference, sqrt (#1)
+\def\pgfmathfloatsqrttest#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\reference=\pgfmathresult
+ \message{computing sqrt(#1)}%
+ \pgfmathfloatsqrt\argumenta%
+ \let\resultfloat=\pgfmathresult
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \pgfmathfloatrelerror\resultfloat\reference
+ \pgfmathfloattosci\pgfmathresult
+ \[ \sqrt{#1} = \result\quad (\text{rel. error } \pgfmathresult)\]
+}%
+\def\tests{%
+ \pgfmathfloatsqrttest{0}{0}
+ \pgfmathfloatsqrttest{1}{1}
+ \pgfmathfloatsqrttest{2}{1.414213562373}
+ \pgfmathfloatsqrttest{4}{2}
+ \pgfmathfloatsqrttest{16}{4}
+ \pgfmathfloatsqrttest{10}{3.162277660168}
+ \pgfmathfloatsqrttest{1000000}{1000}
+ \pgfmathfloatsqrttest{123456789}{1.111111106055556e+04}
+}%
+\tests
+}
+
+{
+\testsection{Testing pgfmathfloatint}
+% #1 : number
+\def\pgfmathfloatinttest#1{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \message{computing int(#1)}%
+ \pgfmathfloatint\argumenta%
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \[ int(#1) = \result \]
+ %
+ \pgfmathfloatparsenumber{-#1}%
+ \let\argumenta=\pgfmathresult
+ \message{computing int(-#1)}%
+ \pgfmathfloatint\argumenta%
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \[ int(-#1) = \result \]
+}%
+\def\tests{%
+ \pgfmathfloatinttest{1.23}
+ \pgfmathfloatinttest{12.34}
+ \pgfmathfloatinttest{123.4}
+ \pgfmathfloatinttest{1234.}
+ \pgfmathfloatinttest{1234.1}
+ \pgfmathfloatinttest{1e-2}
+ \pgfmathfloatinttest{0}
+ \pgfmathfloatinttest{3.456789e4}
+ \pgfmathfloatinttest{3.456789e10}
+}%
+\tests
+}
+
+{
+\testsection{Testing pgfmathfloatexp}
+% #1 : number
+% #2 : the reference, sqrt (#1)
+\def\pgfmathfloattest#1#2{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\reference=\pgfmathresult
+ \message{computing (#1)}%
+ \pgfmathfloatexp\argumenta%
+ \let\resultfloat=\pgfmathresult
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \pgfmathfloatrelerror\resultfloat\reference
+ \pgfmathfloattosci\pgfmathresult
+ \[ \exp(#1) = \result\quad (\text{error/r to }#2 = \pgfmathresult)\]
+}%
+%\tracingmacros=2\tracingcommands=2
+ \pgfmathfloattest{-700}{9.85967654375977e-305}
+ \pgfmathfloattest{-1.0000000e+02}{3.7200760e-44}
+ \pgfmathfloattest{-9.5918367e+01}{2.2038516e-42}
+ \pgfmathfloattest{-9.1836735e+01}{1.3056083e-40}
+ \pgfmathfloattest{-8.7755102e+01}{7.7346991e-39}
+ \pgfmathfloattest{-8.3673469e+01}{4.5821992e-37}
+ \pgfmathfloattest{-7.9591837e+01}{2.7145916e-35}
+ \pgfmathfloattest{-7.5510204e+01}{1.6081814e-33}
+ \pgfmathfloattest{-7.1428571e+01}{9.5272065e-32}
+ \pgfmathfloattest{-6.7346939e+01}{5.6441184e-30}
+ \pgfmathfloattest{-6.3265306e+01}{3.3436950e-28}
+ \pgfmathfloattest{-5.9183673e+01}{1.9808756e-26}
+ \pgfmathfloattest{-5.5102041e+01}{1.1735125e-24}
+ \pgfmathfloattest{-5.1020408e+01}{6.9521362e-23}
+ \pgfmathfloattest{-4.6938776e+01}{4.1185924e-21}
+ \pgfmathfloattest{-4.2857143e+01}{2.4399411e-19}
+ \pgfmathfloattest{-3.8775510e+01}{1.4454727e-17}
+ \pgfmathfloattest{-3.4693878e+01}{8.5632855e-16}
+ \pgfmathfloattest{-3.0612245e+01}{5.0730713e-14}
+ \pgfmathfloattest{-2.6530612e+01}{3.0053946e-12}
+ \pgfmathfloattest{-2.2448980e+01}{1.7804593e-10}
+ \pgfmathfloattest{-1.8367347e+01}{1.0547817e-08}
+ \pgfmathfloattest{-1.4285714e+01}{6.2487495e-07}
+ \pgfmathfloattest{-1.0204082e+01}{3.7018912e-05}
+ \pgfmathfloattest{-6.1224490e+00}{2.1930786e-03}
+ \pgfmathfloattest{-2.0408163e+00}{1.2992261e-01}
+ \pgfmathfloattest{2.0408163e+00}{7.6968898e+00}
+ \pgfmathfloattest{6.1224490e+00}{4.5598001e+02}
+ \pgfmathfloattest{1.0204082e+01}{2.7013219e+04}
+ \pgfmathfloattest{1.4285714e+01}{1.6003202e+06}
+ \pgfmathfloattest{1.8367347e+01}{9.4806349e+07}
+ \pgfmathfloattest{2.2448980e+01}{5.6165284e+09}
+ \pgfmathfloattest{2.6530612e+01}{3.3273501e+11}
+ \pgfmathfloattest{3.0612245e+01}{1.9711925e+13}
+ \pgfmathfloattest{3.4693878e+01}{1.1677761e+15}
+ \pgfmathfloattest{3.8775510e+01}{6.9181522e+16}
+ \pgfmathfloattest{4.2857143e+01}{4.0984595e+18}
+ \pgfmathfloattest{4.6938776e+01}{2.4280140e+20}
+ \pgfmathfloattest{5.1020408e+01}{1.4384068e+22}
+ \pgfmathfloattest{5.5102041e+01}{8.5214258e+23}
+ \pgfmathfloattest{5.9183673e+01}{5.0482727e+25}
+ \pgfmathfloattest{6.3265306e+01}{2.9907034e+27}
+ \pgfmathfloattest{6.7346939e+01}{1.7717559e+29}
+ \pgfmathfloattest{7.1428571e+01}{1.0496256e+31}
+ \pgfmathfloattest{7.5510204e+01}{6.2182039e+32}
+ \pgfmathfloattest{7.9591837e+01}{3.6837954e+34}
+ \pgfmathfloattest{8.3673469e+01}{2.1823582e+36}
+ \pgfmathfloattest{8.7755102e+01}{1.2928751e+38}
+ \pgfmathfloattest{9.1836735e+01}{7.6592653e+39}
+ \pgfmathfloattest{9.5918367e+01}{4.5375106e+41}
+ \pgfmathfloattest{1.0000000e+02}{2.6881171e+43}
+ \pgfmathfloattest{700}{1.014232054735e+304}
+}
+
+{
+\testsection{Testing pgfmathfloatmod}
+% #1 : operand 1
+% #2 : operand 2
+% #3 : the reference, #1 mod #2
+\def\pgfmathfloattest#1#2#3{%
+ \pgfmathfloatparsenumber{#1}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\argumentb=\pgfmathresult
+ \pgfmathfloatparsenumber{#3}%
+ \let\reference=\pgfmathresult
+ \message{computing #1 mod #2}%
+ \pgfmathfloatmod\argumenta\argumentb%
+ \let\resultfloat=\pgfmathresult
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \pgfmathfloatrelerror\resultfloat\reference
+ \pgfmathfloattosci\pgfmathresult
+ \[ #1\text{ mod }#2 = \result\quad (\text{error/r to }#3 = \pgfmathresult)\]
+}%
+%\tracingmacros=2\tracingcommands=2
+ \pgfmathfloattest{4}{3}{1}
+ \pgfmathfloattest{10}{10}{0}
+ \pgfmathfloattest{20}{6}{2}
+ \pgfmathfloattest{-100}{30}{-10}
+ \pgfmathfloattest{10.5}{5}{0.5}
+ \pgfmathfloattest{300.63}{360}{300.63}
+ \pgfmathfloattest{-20}{30}{-20}
+}
+
+{
+\testsection{Testing Trigonometric functions}
+% #1 : operator
+% #2 : operand
+% #3 : the reference, #2(#1)
+\def\pgfmathfloattest#1#2#3{%
+ \pgfmathfloatparsenumber{#2}%
+ \let\argumenta=\pgfmathresult
+ \pgfmathfloatparsenumber{#3}%
+ \let\reference=\pgfmathresult
+ \message{computing \string#1(#2)}%
+ #1\argumenta%
+ \let\resultfloat=\pgfmathresult
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \pgfmathfloatrelerror\resultfloat\reference
+ \pgfmathfloattosci\pgfmathresult
+ \[ \string#1(#2) = \result\quad (\text{error/r to }#3 = \pgfmathresult)\]
+}%
+%\tracingmacros=2\tracingcommands=2
+\testsubsection{SIN}
+ \pgfmathfloattest\pgfmathfloatsin{-7.2000000e+02}{4.8985872e-16}
+ \pgfmathfloattest\pgfmathfloatsin{-6.5454545e+02}{9.0963200e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-5.8909091e+02}{7.5574957e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-5.2363636e+02}{-2.8173256e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-4.5818182e+02}{-9.8982144e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-3.9272727e+02}{-5.4064082e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-3.2727273e+02}{5.4064082e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-2.6181818e+02}{9.8982144e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-1.9636364e+02}{2.8173256e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-1.3090909e+02}{-7.5574957e-01}
+ \pgfmathfloattest\pgfmathfloatsin{-6.5454545e+01}{-9.0963200e-01}
+ \pgfmathfloattest\pgfmathfloatsin{0.0000000e+00}{0.0000000e+00}
+ \pgfmathfloattest\pgfmathfloatsin{6.5454545e+01}{9.0963200e-01}
+ \pgfmathfloattest\pgfmathfloatsin{1.3090909e+02}{7.5574957e-01}
+ \pgfmathfloattest\pgfmathfloatsin{1.9636364e+02}{-2.8173256e-01}
+ \pgfmathfloattest\pgfmathfloatsin{2.6181818e+02}{-9.8982144e-01}
+ \pgfmathfloattest\pgfmathfloatsin{3.2727273e+02}{-5.4064082e-01}
+ \pgfmathfloattest\pgfmathfloatsin{3.9272727e+02}{5.4064082e-01}
+ \pgfmathfloattest\pgfmathfloatsin{4.5818182e+02}{9.8982144e-01}
+ \pgfmathfloattest\pgfmathfloatsin{5.2363636e+02}{2.8173256e-01}
+ \pgfmathfloattest\pgfmathfloatsin{5.8909091e+02}{-7.5574957e-01}
+ \pgfmathfloattest\pgfmathfloatsin{6.5454545e+02}{-9.0963200e-01}
+ \pgfmathfloattest\pgfmathfloatsin{7.2000000e+02}{-4.8985872e-16}
+
+
+
+\testsubsection{COS}
+ \pgfmathfloattest\pgfmathfloatcos{-7.2000000e+02}{1.0000000e+00}
+ \pgfmathfloattest\pgfmathfloatcos{-6.5454545e+02}{4.1541501e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-5.8909091e+02}{-6.5486073e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-5.2363636e+02}{-9.5949297e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-4.5818182e+02}{-1.4231484e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-3.9272727e+02}{8.4125353e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-3.2727273e+02}{8.4125353e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-2.6181818e+02}{-1.4231484e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-1.9636364e+02}{-9.5949297e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-1.3090909e+02}{-6.5486073e-01}
+ \pgfmathfloattest\pgfmathfloatcos{-6.5454545e+01}{4.1541501e-01}
+ \pgfmathfloattest\pgfmathfloatcos{0.0000000e+00}{1.0000000e+00}
+ \pgfmathfloattest\pgfmathfloatcos{6.5454545e+01}{4.1541501e-01}
+ \pgfmathfloattest\pgfmathfloatcos{1.3090909e+02}{-6.5486073e-01}
+ \pgfmathfloattest\pgfmathfloatcos{1.9636364e+02}{-9.5949297e-01}
+ \pgfmathfloattest\pgfmathfloatcos{2.6181818e+02}{-1.4231484e-01}
+ \pgfmathfloattest\pgfmathfloatcos{3.2727273e+02}{8.4125353e-01}
+ \pgfmathfloattest\pgfmathfloatcos{3.9272727e+02}{8.4125353e-01}
+ \pgfmathfloattest\pgfmathfloatcos{4.5818182e+02}{-1.4231484e-01}
+ \pgfmathfloattest\pgfmathfloatcos{5.2363636e+02}{-9.5949297e-01}
+ \pgfmathfloattest\pgfmathfloatcos{5.8909091e+02}{-6.5486073e-01}
+ \pgfmathfloattest\pgfmathfloatcos{6.5454545e+02}{4.1541501e-01}
+ \pgfmathfloattest\pgfmathfloatcos{7.2000000e+02}{1.0000000e+00}
+
+
+\testsubsection{TAN}
+ \pgfmathfloattest\pgfmathfloattan{-7.2000000e+02}{4.8985872e-16}
+ \pgfmathfloattest\pgfmathfloattan{-6.5454545e+02}{2.1896946e+00}
+ \pgfmathfloattest\pgfmathfloattan{-5.8909091e+02}{-1.1540615e+00}
+ \pgfmathfloattest\pgfmathfloattan{-5.2363636e+02}{2.9362649e-01}
+ \pgfmathfloattest\pgfmathfloattan{-4.5818182e+02}{6.9551528e+00}
+ \pgfmathfloattest\pgfmathfloattan{-3.9272727e+02}{-6.4266098e-01}
+ \pgfmathfloattest\pgfmathfloattan{-3.2727273e+02}{6.4266098e-01}
+ \pgfmathfloattest\pgfmathfloattan{-2.6181818e+02}{-6.9551528e+00}
+ \pgfmathfloattest\pgfmathfloattan{-1.9636364e+02}{-2.9362649e-01}
+ \pgfmathfloattest\pgfmathfloattan{-1.3090909e+02}{1.1540615e+00}
+ \pgfmathfloattest\pgfmathfloattan{-6.5454545e+01}{-2.1896946e+00}
+ \pgfmathfloattest\pgfmathfloattan{0.0000000e+00}{0.0000000e+00}
+ \pgfmathfloattest\pgfmathfloattan{6.5454545e+01}{2.1896946e+00}
+ \pgfmathfloattest\pgfmathfloattan{1.3090909e+02}{-1.1540615e+00}
+ \pgfmathfloattest\pgfmathfloattan{1.9636364e+02}{2.9362649e-01}
+ \pgfmathfloattest\pgfmathfloattan{2.6181818e+02}{6.9551528e+00}
+ \pgfmathfloattest\pgfmathfloattan{3.2727273e+02}{-6.4266098e-01}
+ \pgfmathfloattest\pgfmathfloattan{3.9272727e+02}{6.4266098e-01}
+ \pgfmathfloattest\pgfmathfloattan{4.5818182e+02}{-6.9551528e+00}
+ \pgfmathfloattest\pgfmathfloattan{5.2363636e+02}{-2.9362649e-01}
+ \pgfmathfloattest\pgfmathfloattan{5.8909091e+02}{1.1540615e+00}
+ \pgfmathfloattest\pgfmathfloattan{6.5454545e+02}{-2.1896946e+00}
+ \pgfmathfloattest\pgfmathfloattan{7.2000000e+02}{-4.8985872e-16}
+
+
+
+}
+
+{
+ % #1 : expression
+ % #2 : the reference
+ \def\assertEquals#1#2{%
+ \pgfmathfloatparsenumber{#2}%
+ \let\reference=\pgfmathresult
+ \message{parsing expression #1...}%
+ \pgfmathparse{#1}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ \let\argumenta=\pgfmathresult
+ \let\resultfloat=\pgfmathresult
+ \pgfmathfloattosci\pgfmathresult
+ \let\result=\pgfmathresult
+ \pgfmathfloatrelerror\resultfloat\reference
+ \let\actualerror=\pgfmathresult
+ \pgfmathfloatgreaterthan{\pgfmathresult}{\THRESH}%
+ \ifpgfmathfloatcomparison
+ \begingroup
+ \pgfkeys{/pgf/fpu=false}%
+ \pgfmathparse{#1}%
+ \global\let\actualBasic=\pgfmathresult
+ \endgroup
+ \PackageError{pgf-fpu}{Got error: expected #1=#2, but was \result\space (error \actualerror; basic level returns \actualBasic)}{}%
+ \fi
+ \pgfmathfloattosci\actualerror
+ \[ #1 = \result \quad[= \resultfloat] \quad (\text{error/r to }#2 = \pgfmathresult)\]
+ }%
+ \def\mathparserTestCases{%
+ \assertEquals{1+1}{2}
+ \assertEquals{1234567*4}{4938268}
+ \assertEquals{exp(200)}{7.22597376812575e+86}
+ \assertEquals{rad(360)}{6.28318530717959}
+ \assertEquals{rad(180)}{3.14159265358979}
+ \assertEquals{deg(2*pi)}{360}
+ \assertEquals{deg(pi)}{180}
+ \assertEquals{ln(1)}{0}
+ \assertEquals{round(1.5)}{2}
+ \assertEquals{round(-1.5)}{-2}
+ \assertEquals{- (1.5)}{-1.5}
+ \assertEquals{(1e4 - 1e3) * 1e5}{900000000.0}
+ \assertEquals{4^2}{16}
+ \assertEquals{4^3}{64}
+ \assertEquals{4^-3}{0.015625}
+ \assertEquals{4^-6}{0.000244140625}
+ \assertEquals{111^4}{151807041}
+ \assertEquals{8^10}{1073741824}
+ \assertEquals{3^1.5}{5.19615242270663}
+ \assertEquals{16^5.5}{4194304}
+ \assertEquals{15^-0.25}{0.508132748154615}
+ \assertEquals{sec(45)}{1.4142136e+00}
+ \assertEquals{cot(30)}{1.7320508e+00}
+ \assertEquals{asin(7.0710678e-01)}{45}
+ \assertEquals{acos(8.6602540e-01)}{30}
+ \assertEquals{atan(5.7735027e-01)}{30}
+ \assertEquals{atan(16000)}{89.9964}
+ \assertEquals{atan(1e6)}{8.9999943e+01}
+ \assertEquals{atan(-1e6)}{-8.9999943e+01}
+ \assertEquals{-12^2}{-144}%
+ \assertEquals{0-12^2}{-144}%
+ \assertEquals{-(12)^2}{-144}%
+ \assertEquals{exp(-12^2)}{2.8946e-63}%
+ \assertEquals{round(98.8)}{99}%
+ \assertEquals{-pi}{-3.14159265358979}%
+ \assertEquals{2*(-pi)}{-6.28318530717959}%
+ \assertEquals{2*(-3)}{-6}%
+ \assertEquals{veclen(1,1)}{1.414213562373095}%
+ \assertEquals{veclen(1e5,6e5)}{6.082762530298220e+05}%
+ \assertEquals{cosh(5)}{74.20994852478784}%
+ \assertEquals{sinh(0.6)}{0.636653582148241}%
+ \assertEquals{tanh(0.6)}{0.537049566998035}%
+
+ {\pgfkeys{/pgf/trig format=rad}
+ \assertEquals{atan2(4,5)}{0.674740942223553}%
+ \assertEquals{atan2(-4,5)}{-0.674740942223553}%
+ \assertEquals{atan2(4,-5)}{2.46685171136624}%
+ \assertEquals{atan2(-4,-5)}{-2.46685171136624}%
+ %
+ \assertEquals{atan2(5,4)}{0.89605538457134}%
+ \assertEquals{atan2(-5,4)}{-0.89605538457134}%
+ \assertEquals{atan2(5,-4)}{2.24553726901845}%
+ \assertEquals{atan2(-5,-4)}{-2.24553726901845}%
+ %
+ \assertEquals{atan2(4e-5,5)}{0}%
+ \assertEquals{atan2(4e-5,-5)}{3.1415126535899}%
+ }
+ % \assertEquals{ceil(1.5)}{2}
+ }
+
+
+ {
+ \testsection{Testing the FPU library (and math parser)}
+ \pgfkeys{/pgf/fpu}
+ %\tracingmacros=2\tracingcommands=2
+ \mathparserTestCases
+ }
+
+ {
+ \def\mathparserTestCases{%
+ \assertEquals{sin(90)}{1.0}%
+ \assertEquals{cos(90)}{0.0}%
+ \assertEquals{tan(45)}{1.0}%
+ \assertEquals{sec(45)}{1.41429}%
+ \assertEquals{cosec(30)}{2.0}%
+ \assertEquals{cot(15)}{3.73215}%
+ \assertEquals{asin(0.7071)}{44.99945}%
+ \assertEquals{acos(0.5)}{60}%
+ \assertEquals{atan(1)}{45}%
+ \assertEquals{atan(16001)}{90}%
+ \assertEquals{atan(-16001)}{-90}%
+ %\assertEquals{atan2(-4,3)}{-53.13011}%
+ }%
+ \testsection{Testing trig format=deg, basic layer (selected examples)}
+ %\tracingmacros=2\tracingcommands=2
+ \mathparserTestCases
+
+ \testsection{Testing trig format=deg, FPU (selected examples)}
+ \pgfkeys{/pgf/fpu}
+ \mathparserTestCases
+ }
+
+ {
+ \pgfkeys{/pgf/trig format=rad}
+ \def\mathparserTestCases{%
+ \assertEquals{sin(pi/2)}{1.0}%
+ \assertEquals{cos(pi/2)}{0.0}%
+ \assertEquals{tan(pi/4)}{1.0}%
+ \assertEquals{sec(pi/4)}{1.41429}%
+ \assertEquals{cosec(rad(30))}{2.0}%
+ \assertEquals{cot(rad(15))}{3.73215}%
+ \assertEquals{asin(0.7071)}{0.785388564086562}% 44.99945}%
+ \assertEquals{acos(0.5)}{1.0471975511966}%
+ \assertEquals{atan(1)}{0.785398163397448}%45}%
+ \assertEquals{atan(16001)}{1.570796326794}%
+ \assertEquals{atan(-16001)}{-1.570796326794}%
+ %\assertEquals{atan2(-4,3)}{-53.13011}%
+ }%
+ \testsection{Testing trig format=rad, basic layer (selected examples)}
+ %\tracingmacros=2\tracingcommands=2
+ \mathparserTestCases
+
+ \testsection{Testing trig format=rad, FPU (selected examples)}
+ \pgfkeys{/pgf/fpu}
+ \mathparserTestCases
+ }
+}
+\end{document}
diff --git a/graphics/pgf/base/source/planarity_script.h b/graphics/pgf/base/source/planarity_script.h
new file mode 100644
index 0000000000..dd337fcc0e
--- /dev/null
+++ b/graphics/pgf/base/source/planarity_script.h
@@ -0,0 +1,11 @@
+#include <pgf/gd/ogdf/c/InterfaceFromOGDF.h>
+
+#include "PlanarizationLayout_script.h"
+
+struct planarity_script :
+ scripting::declarations
+{
+ void declare (scripting::script s) {
+ s.declare (new PlanarizationLayout_script);
+ }
+};
diff --git a/graphics/pgf/base/source/tikzexternaltest.code.tex b/graphics/pgf/base/source/tikzexternaltest.code.tex
new file mode 100644
index 0000000000..153a074255
--- /dev/null
+++ b/graphics/pgf/base/source/tikzexternaltest.code.tex
@@ -0,0 +1,41 @@
+\parskip=1cm
+\parindent=0pt
+
+A small image with a filled circle follows here (with baseline): \tikz[baseline] \fill[red] (0,1cm) circle(2pt);
+
+\tikzsetnextfilename{\tikzexternalrealjob-setnextfilename}
+The next one uses
+\begin{tikzpicture}[baseline]
+ \draw (0,0) grid (4,4);
+\end{tikzpicture}
+an explizit file name.
+
+\begin{tikzpicture}
+ \node[draw,rounded corners] {A node with a ref (\ref{eq:1})};
+\end{tikzpicture}
+
+\begin{equation}
+ 1+1=3
+ \label{eq:1}
+\end{equation}
+
+\begin{tikzpicture}
+ \node[draw,rounded corners] {A node which contains a label\label{a:label:in:a:picture}};
+\end{tikzpicture}
+
+The label inside of a node is on page~\pageref{a:label:in:a:picture}.
+
+\expandafter\ifx\csname pgfplotslegendfromname\endcsname\relax
+\else
+The following picture exports a legend to the aux file (if possible).
+\begin{tikzpicture}
+ \begin{axis}[legend entries={1,2,3,4},legend to name=legend:name]
+ \addplot {x};
+ \addplot {x+1};
+ \addplot {x+2};
+ \addplot {x+3};
+ \end{axis}
+\end{tikzpicture}
+
+Here is the legend: \pgfplotslegendfromname{legend:name}.
+\fi
diff --git a/graphics/pgf/base/source/tikzexternaltest.sharedpreamble.tex b/graphics/pgf/base/source/tikzexternaltest.sharedpreamble.tex
new file mode 100644
index 0000000000..d2577b01b1
--- /dev/null
+++ b/graphics/pgf/base/source/tikzexternaltest.sharedpreamble.tex
@@ -0,0 +1,20 @@
+\documentclass[a4paper]{article}
+\usepackage[utf8]{inputenc}
+
+\usepackage{tikz}
+\usepackage{hyperref}
+
+\IfFileExists{pgfplots.sty}{%
+ \usepackage{pgfplots}
+}{}%
+
+\IfFileExists{tikzlibraryexternal.code.tex}{%
+ \usetikzlibrary{external}
+}{%
+ \message{TEST IS RUNNING IN COMPATIBILITY MODE}%
+ % a test to check for pgf 2.00 compatibility, to check whether the
+ % external library copy shipped with pgfplots works:
+ \usepgfplotslibrary{external}
+}%
+
+\pgfkeys{/pgf/images/include external/.code={\href{file:#1}{\pgfimage{#1}}}}
diff --git a/graphics/pgf/base/source/tikzexternaltest.tex b/graphics/pgf/base/source/tikzexternaltest.tex
new file mode 100644
index 0000000000..2aaef55eff
--- /dev/null
+++ b/graphics/pgf/base/source/tikzexternaltest.tex
@@ -0,0 +1,12 @@
+\input tikzexternaltest.sharedpreamble.tex
+
+\tikzexternalize{tikzexternaltest}
+
+\author{Christian Feuers\"anger}
+\title{Test with default config and Provided Basefilename}
+
+\begin{document}
+\maketitle
+\input{tikzexternaltest.code.tex}
+\end{document}
+
diff --git a/graphics/pgf/base/source/tikzexternaltestmakefile.tex b/graphics/pgf/base/source/tikzexternaltestmakefile.tex
new file mode 100644
index 0000000000..232489823e
--- /dev/null
+++ b/graphics/pgf/base/source/tikzexternaltestmakefile.tex
@@ -0,0 +1,12 @@
+\input tikzexternaltest.sharedpreamble.tex
+
+\tikzexternalize[mode=list and make]
+
+\author{Christian Feuers\"anger}
+\title{Test with mode list and make, automatic Basefilename}
+
+\begin{document}
+\maketitle
+\input{tikzexternaltest.code.tex}
+\end{document}
+
diff --git a/graphics/pgf/base/source/unittest_luamathparser.tex b/graphics/pgf/base/source/unittest_luamathparser.tex
new file mode 100644
index 0000000000..225927eb41
--- /dev/null
+++ b/graphics/pgf/base/source/unittest_luamathparser.tex
@@ -0,0 +1,562 @@
+\documentclass{article}
+
+\makeatletter
+\usepackage{pgf}
+\usepgflibrary{luamath,fpu}
+
+\begin{document}
+
+X
+
+\def\SHOW#1{%
+ \dimen0=#1 %
+ #1 = \the\dimen0
+}
+
+\SHOW{1pt}
+
+\SHOW{1mm}
+
+\SHOW{1cm}
+
+\SHOW{1in}
+
+\SHOW{1ex}
+
+\SHOW{1em}
+
+\SHOW{1bp}
+
+\SHOW{1pc}
+
+\SHOW{1dd}
+
+\SHOW{1cc}
+
+\SHOW{1sp}
+
+%\tracingmacros=2 \tracingcommands=2
+%
+\newif\ifcomparewithtex
+\newif\ifcomparewithfpu
+\pgfkeys{
+ /ut/compare with TeX/.is if=comparewithtex,
+ /ut/compare with TeX=true,
+ /ut/compare with fpu/.is if=comparewithfpu,
+ /ut/compare with fpu=true,
+ /ut/.search also={/pgf/luamath},
+ /pgf/luamath/show error message=true,
+ /pgf/luamath/enable TeX fallback=false,
+}
+
+\newcount\numErrors
+
+% #1: options
+% #2: expression
+% #3: expected result
+% #4: expected 'units declared' (1 or 0)
+\def\parsertest{\pgfutil@ifnextchar[\parsertest@{\parsertest@[]}}%
+\def\parsertest@[#1]#2#3#4{%
+ \begingroup
+ \pgfqkeys{/ut}{#1}%
+ \pgfluamathparse{#2}%
+ \let\actual=\pgfmathresult
+ \ifpgfmathunitsdeclared
+ \def\actualunitsdeclared{1}%
+ \else
+ \def\actualunitsdeclared{0}%
+ \fi
+ %
+ \ifcomparewithtex
+ \ifpgfluamathusedTeXfallback
+ \let\expectedTeX=\actual
+ \else
+ \pgfmathparse{#2}%
+ \let\expectedTeX=\pgfmathresult
+ \fi
+ \else
+ \def\expectedTeX{--}%
+ \fi
+ %
+ \edef\expected{#3}%
+ \def\success{1}%
+ \ifx\expected\empty
+ \ifx\actual\empty
+ \else
+ \def\success{0}%
+ \fi
+ \else
+ \ifx\actual\expected
+ \else
+ \def\success{0}%
+ \fi
+ \fi
+ %
+ \if1\success
+ \else
+ \message{FAILURE for #2 expected \expected\space but was \actual^^J}%
+ \global\advance\numErrors by1
+ \fi
+ %
+ \if1\success
+ \def\expectedunitsdeclared{#4}%
+ \ifx\actualunitsdeclared\expectedunitsdeclared
+ \else
+ \def\success{0}%
+ \message{FAILURE for #2 expected units declared #4 but was \actualunitsdeclared^^J}%
+ \global\advance\numErrors by1
+ \fi
+ \fi
+ %
+ \if1\success
+ \ifcomparewithtex
+ % check against PGF's basic layer as reference:
+ \dimen0=\actual pt %
+ \dimen1=\expectedTeX pt %
+ \advance\dimen0 by-\dimen1
+ \ifdim\dimen0<0sp
+ \dimen0=-\dimen0
+ \fi
+ \ifdim\dimen0 > 0.004pt %
+ \def\success{0}%
+ \message{FAILURE for #2 : matches expectations, but does NOT match TeX output (error \the\dimen0). expected \expectedTeX\space but was \actual^^J}%
+ \global\advance\numErrors by1
+ \fi
+ %
+ %
+ \ifpgfmathunitsdeclared
+ \def\actualTeXunitsdeclared{1}%
+ \else
+ \def\actualTeXunitsdeclared{0}%
+ \fi
+ \ifx\actualTeXunitsdeclared\actualunitsdeclared
+ \else
+ \message{WARNING for #2 : matches ALL expectations, but TeX's output does NOT match TeX expected units declared (TeX returns \actualTeXunitsdeclared, expectation = LUA is \actualunitsdeclared)^^J}%
+ \fi
+ \fi
+ %
+ \ifcomparewithfpu
+ % check that FPU works as well. This
+ % * tests the FPU
+ % * tests that FPU values can be injected into the LUA backend:
+ \begingroup
+ \pgfkeys{/pgf/fpu,/pgf/fpu/output format=float}%
+ \pgfmathparse{#2}%
+ \xdef\actualfpu{\pgfmathresult}%
+ \ifpgfmathunitsdeclared
+ \xdef\actualfpuunitsdeclared{1}%
+ \else
+ \xdef\actualfpuunitsdeclared{0}%
+ \fi
+ \endgroup
+ %
+ \pgfkeys{/pgf/luamath/output format=fixed}%
+ \pgfluamathparse{abs(\actual - \actualfpu) > 0.004}%
+ \ifdim\pgfmathresult pt=1pt
+ \def\success{0}%
+ \pgfluamathparse{abs(\actual - \actualfpu)}%
+ \message{FAILURE for #2 : matches expectations, but does NOT match output of FPU (error \pgfmathresult). fpu=\actualfpu\space lua=\actual^^J}%
+ \global\advance\numErrors by1
+ \fi
+ \fi
+ %
+ \fi
+ %
+ \message{#2 = \actual\space (pgf=\expectedTeX) \if1\success OK\else FAILURE\fi^^J}%
+ \endgroup
+}%
+
+\parsertest{1}{1.0}{0}
+\parsertest{ 1}{1.0}{0}
+\parsertest{-123}{-123.0}{0}
+\parsertest{+123}{123.0}{0}
+\parsertest{+1.23}{1.23}{0}
+\parsertest{+.123}{0.123}{0}
+\parsertest{1.23}{1.23}{0}
+\parsertest{1.}{1.0}{0}
+\parsertest{0.123}{0.123}{0}
+\parsertest{.123}{0.123}{0}
+\parsertest{1e4}{10000.0}{0}
+\parsertest{1e-4}{0.0001}{0}
+\parsertest{1e+4}{10000.0}{0}
+% only supported by FPU
+\parsertest[compare with TeX=false]{1Y1.23e4]}{12300.0}{0}
+\parsertest{1.23e-004}{0.000123}{0}
+\parsertest{004}{4.0}{0}
+\parsertest{1 + 10}{11.0}{0}
+\parsertest{1 - 10}{-9.0}{0}
+\parsertest{(1)}{1.0}{0}
+\parsertest{3 + 5*9 / (1+1) - 12}{13.5}{0}
+\parsertest{pi}{3.141593}{0}
+\parsertest{sin(0)}{0.0}{0}
+\parsertest{max(0,1)}{1.0}{0}
+\parsertest{min(0.01,-5)}{-5.0}{0}
+\parsertest{sin(90)}{1.0}{0}
+\parsertest{cos(90)}{0.0}{0}
+\parsertest{pow(2,3)}{8.0}{0}
+\parsertest{-pow(2,3)}{-8.0}{0}
+\parsertest{-pi}{-3.141593}{0}
+% this is actually UNSUPPORTED by TeX:
+\parsertest[compare with TeX=false]{inf}{inf}{0}
+\parsertest[compare with TeX=false]{INF}{inf}{0}
+\parsertest{not(100)}{0.0}{0}% non-trivial since the function is pgfluamathfunctions.notPGF
+\parsertest{2^2}{4.0}{0}
+% only supported by FPU
+\parsertest[compare with TeX=false]{1Y2.0e0]^2}{4.0}{0}
+\parsertest{0-2^2}{-4.0}{0}
+\parsertest{-2^2}{-4.0}{0}
+\parsertest{pi^2}{9.869604}{0}
+\parsertest{2^2+2}{6.0}{0}
+\parsertest{2^2-1}{3.0}{0}
+\parsertest{-1 + 4}{3.0}{0}
+\parsertest{2^2*5}{20.0}{0}
+\parsertest{2^(2+2)}{16.0}{0}
+\parsertest{multiply(2,3)^2}{36.0}{0}
+\parsertest{(2+3)^2}{25.0}{0}
+\parsertest{(2 + 3 ) ^ 2}{25.0}{0}
+\parsertest{2^add(1,1)}{4.0}{0}
+\parsertest{3!}{6.0}{0}
+\parsertest{1+3!}{7.0}{0}
+\parsertest{2*3!}{12.0}{0}
+\parsertest{3! + 1}{7.0}{0}
+\parsertest{3 !}{6.0}{0}
+\parsertest{3*2+4}{10.0}{0}
+\pgfmathdeclarefunction{x}{0}{\def\pgfmathresult{4}}%
+\pgfmathdeclarefunction{N1}{3}{\pgfmathparse{#1+#2+#3}}%
+\directlua{
+function pgfluamathfunctions.x()
+ return 4
+end
+function pgfluamathfunctions.N1(x,m,n)
+ return x+m+n
+end
+}
+\parsertest{2^x}{16.0}{0}
+\parsertest{exp(-x^2)}{0.0}{0} % requires output format=fpu
+\parsertest{N1(1,2,3)}{6.0}{0}
+\parsertest{ 1 + 2 * 4 ^ 2 }{33.0}{0}
+\parsertest{-x + 4}{0.0}{0}
+\parsertest{-x * 4}{-16.0}{0}
+\parsertest{-x * - 4}{16.0}{0}
+\parsertest{2*pi r}{360.0}{0}
+\parsertest{6.28318530717959 r}{360.0}{0}
+\parsertest{sin(2*pi r)}{-0.0}{0}
+\parsertest{1.5707963267949r + 1.5707963267949r}{180.0}{0}
+\parsertest{1 ? 42 : 0}{42.0}{0}
+\parsertest{0 ? 42 : 0}{0.0}{0}
+\parsertest{-1 + 1 ? 42 : 0}{0.0}{0}
+\parsertest{1 + (1 ? 42 : 0)}{43.0}{0}
+\parsertest{1 ? 42 : 0 ? 5 : 6}{5.0}{0}
+\parsertest{(1 ? 42 : 0) ? 5 : 6}{5.0}{0}
+\parsertest{43 == 43}{1.0}{0}
+\parsertest{43 == 42}{0.0}{0}
+\parsertest{43 != 43}{0.0}{0}
+\parsertest{43 != 42}{1.0}{0}
+\parsertest{43 > 42}{1.0}{0}
+\parsertest{43 > 44}{0.0}{0}
+\parsertest{43 < 42}{0.0}{0}
+\parsertest{43 < 44}{1.0}{0}
+\parsertest{43 <= 44}{1.0}{0}
+\parsertest{43 >= 44}{0.0}{0}
+\parsertest{43 >= 44 == 1}{0.0}{0}
+\parsertest{!1}{0.0}{0}
+\parsertest{! 1}{0.0}{0}
+\parsertest{! -1}{0.0}{0}
+\parsertest{--1}{1.0}{0}
+\parsertest{! !1}{1.0}{0}
+\parsertest{3! - !0}{5.0}{0}
+\parsertest{1 && 1 }{1.0}{0}
+\parsertest{1 && 0 || 1 }{1.0}{0}
+\parsertest{1 && 0 && 1 }{0.0}{0}
+\parsertest{1 || 0 }{1.0}{0}
+\parsertest{0 || 0 || 1 }{1.0}{0}
+
+% I test every function here to see that it is connected correctly
+\parsertest{abs(1)}{1.0}{0}
+\parsertest{add(1,2)}{3.0}{0}
+\parsertest{and(1,1)}{1.0}{0}
+% \parsertest{array(1)}{1.0}{0}
+\parsertest{asin(0.7071)}{44.999451}{0}
+\parsertest{atan(1)}{45.0}{0}
+\parsertest{atan2(-4,3)}{-53.130102}{0}
+% \parsertest{bin(1)}{1.0}{0}
+\parsertest{cos(60)}{0.5}{0}
+\parsertest{cosec(30)}{2.0}{0}
+\parsertest{cosh(0.5)}{1.127626}{0}
+\parsertest{cot(15)}{3.732051}{0}
+\parsertest{deg(2*pi)}{360.0}{0}
+% \parsertest{depth(1)}{1.0}{0}
+\parsertest[compare with fpu=false]{div(1,2)}{0.0}{0}
+\parsertest{divide(1,2)}{0.5}{0}
+\parsertest{e}{2.718282}{0}
+\parsertest{equal(1,2)}{0.0}{0}
+\parsertest{factorial(3)}{6.0}{0}
+\parsertest{false}{0.0}{0}
+\parsertest{floor(0)}{0.0}{0}
+\parsertest{floor(0.6)}{0.0}{0}
+\parsertest{floor(1.6)}{1.0}{0}
+\parsertest{floor(1)}{1.0}{0}
+\parsertest{floor(100)}{100.0}{0}
+\parsertest{floor(-100)}{-100.0}{0}
+\parsertest{floor(-0.6)}{-1.0}{0}
+\parsertest{floor(-1.6)}{-2.0}{0}
+\parsertest{floor(-15000.6)}{-15001.0}{0}
+\parsertest{floor(15000.6)}{15000.0}{0}
+\parsertest{ceil(0)}{0.0}{0}
+\parsertest{ceil(0.6)}{1.0}{0}
+\parsertest{ceil(1.6)}{2.0}{0}
+\parsertest{ceil(-0.6)}{-0.0}{0}
+\parsertest{ceil(-1.6)}{-1.0}{0}
+\parsertest{ceil(1)}{1.0}{0}
+\parsertest{ceil(100)}{100.0}{0}
+\parsertest{ceil(-100)}{-100.0}{0}
+\parsertest{ceil(-15000.6)}{-15000.0}{0}
+\parsertest{ceil(15000.6)}{15001.0}{0}
+\parsertest[compare with fpu=false]{frac(1.1)}{0.1}{0}
+\parsertest[compare with fpu=false]{frac(-1.1)}{0.1}{0}
+\parsertest[compare with fpu=false]{gcd(42,56)}{14.0}{0}
+\parsertest{greater(1,0)}{1.0}{0}
+% \parsertest{height(1)}{1.0}{0}
+% \parsertest{hex(1)}{1.0}{0}
+% \parsertest{Hex(1)}{1.0}{0}
+\parsertest{int(1.2)}{1.0}{0}
+\parsertest{int(-1.2)}{-1.0}{0}
+\parsertest{ifthenelse(1,2,3)}{2.0}{0}
+\parsertest[compare with fpu=false]{iseven(2)}{1.0}{0}
+\parsertest{isodd(1)}{1.0}{0}
+\parsertest[compare with fpu=false]{isprime(3)}{1.0}{0}
+\parsertest{less(1,2)}{1.0}{0}
+\parsertest{ln(e)}{1.0}{0}
+\parsertest{log10(100)}{2.0}{0}
+\parsertest{log2(2)}{1.0}{0}
+\parsertest{max(1,2)}{2.0}{0}
+\parsertest{min(1,2)}{1.0}{0}
+\parsertest{mod(20,6)}{2.0}{0}
+\parsertest{mod(-100,30)}{-10.0}{0}
+\parsertest[compare with fpu=false]{Mod(-100,30)}{20.0}{0}
+\parsertest{multiply(1,2)}{2.0}{0}
+\parsertest{neg(1)}{-1.0}{0}
+\parsertest{not(1)}{0.0}{0}
+\parsertest{notequal(1,1)}{0.0}{0}
+\parsertest{notgreater(1,1)}{1.0}{0}
+\parsertest{notless(1,1)}{1.0}{0}
+%\parsertest{oct(1)}{1.0}{0}
+\parsertest{or(1,0)}{1.0}{0}
+\parsertest{pi}{3.141593}{0}
+\parsertest{pow(2,2)}{4.0}{0}
+\parsertest{rad(180)}{3.141593}{0}
+% done below \parsertest{rand(1)}{1.0}{0}
+% done below \parsertest{random(1)}{1.0}{0}
+\parsertest[compare with fpu=false]{real(1)}{1.0}{0}
+% done below \parsertest{rnd(1)}{1.0}{0}
+\parsertest{round(1.5)}{2.0}{0}
+\parsertest{round(1.2)}{1.0}{0}
+\parsertest{round(1.9)}{2.0}{0}
+\parsertest{round(-1.9)}{-2.0}{0}
+\parsertest{round(-1.2)}{-1.0}{0}
+% \parsertest{scalar(1)}{1.0}{0}
+\parsertest{sec(45)}{1.414214}{0}
+\parsertest{sign(-1)}{-1.0}{0}
+\parsertest{sin(60)}{0.866025}{0}
+\parsertest{sinh(0.5)}{0.521095}{0}
+\parsertest{sqrt(4)}{2.0}{0}
+\parsertest{subtract(1,1)}{0.0}{0}
+\parsertest{tan(45)}{1.0}{0}
+\parsertest{tanh(0.5)}{0.462117}{0}
+\parsertest{true}{1.0}{0}
+\parsertest{veclen(12,5)}{13.0}{0}
+%\parsertest{width(1)}{1.0}{0}
+
+\parsertest{0 <0.1 && 4 <0.1}{0.0}{0}
+\parsertest{0 <0.1 || 4 <0.1}{1.0}{0}
+{
+\pgfkeys{/pgf/declare function={
+ xx=4;
+ yy=4;
+}}
+\parsertest{abs(xx-yy)<0.1 ? -42 : 42}{-42.0}{0}
+\parsertest{abs(xx-yy)<0.1 || abs(xx-0.5)<0.1}{1.0}{0}
+\parsertest{0 <0.1 || 4 <0.1}{1.0}{0}
+\parsertest{(abs(xx-yy)<0.1) || (abs(xx-0.5)<0.1)}{1.0}{0}
+\parsertest{abs(xx-yy)<0.1 || abs(xx-0.5)<0.1 ? -42 : 42}{-42.0}{0}
+\parsertest{4 < 2 || 5==5 ? -42 : 42}{-42.0}{0}
+}
+
+\parsertest{1pt}{1.0}{1}
+\parsertest{1mm}{2.845261}{1}
+\parsertest{1cm}{28.452744}{1}
+\parsertest{1in}{72.269989}{1}
+% \parsertest{1ex}{4.305542}{1}
+% \parsertest{1em}{10.000015}{1}
+\parsertest{1bp}{1.003738}{1}
+\parsertest{1dd}{1.070007}{1}
+\parsertest{1cc}{12.840103}{1}
+\parsertest{1sp}{0.000015}{1}
+\parsertest{1pc}{12.0}{1}
+% these TeX macros must be defined and set, of course!
+
+
+
+\count1=43
+% this is actually UNSUPPORTED by TeX:
+\parsertest[compare with TeX=false,compare with fpu=false]{\count1}{43.0}{0}
+%
+\newdimen\luamathparse@dimen
+\luamathparse@dimen=42pt
+\parsertest{1*\luamathparse@dimen}{42.0}{1}
+\parsertest{2\luamathparse@dimen}{84.0}{1}
+%
+\newcount\luamathparse@count
+\luamathparse@count=42
+\parsertest{1*\luamathparse@count}{42.0}{0}
+
+% this is a BUG in TeX, but works in LUA...:
+\parsertest[compare with TeX=false,compare with fpu=false]{0.5\luamathparse@count}{21.0}{0}
+%
+\setbox0=\hbox{1233}
+\parsertest{\wd0}{20.000061}{1}
+\parsertest{\ht0}{6.444443}{1}
+\parsertest{\dp0}{0.0}{1}
+
+%--------------------------------------------------
+% FIXME : these cases are still missing:
+% if false then
+% -- arrays created via '{}' and indexed with '[]'
+% -- strings with "<str>"
+% -- 'scalar' function
+% -- hex/octal/binary input
+% -- tex registers
+% -- What happens for undefined functions!? --> return nil and let TeX invoke its parser (no warning!?)
+% -- width/height/depth
+% end
+%--------------------------------------------------
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% The following tests are just for the TeX part, not for the LUA part.
+%
+%
+
+\parsertest[output format=float,compare with TeX=false]{4+4}{1Y8.0e+00]}{0}
+
+\begingroup
+\pgfmathdeclarefunction{testfct}{0}{\def\pgfmathresult{42.42}}
+\parsertest[parser,compare with TeX=false,compare with fpu=false,show error message=false]{testfct}{}{0}
+\parsertest[parser,enable TeX fallback]{testfct}{42.42}{0}
+
+\def\macro{1234}
+\pgfkeys{/pgf/declare function={res(\x)=\x*\macro;}}
+\parsertest[enable TeX fallback=true]{res(1)}{1234.0}{0}
+\endgroup
+
+% Check that setseed is communicated to LUA:
+\pgfmathsetseed{123}
+\parsertest[compare with TeX=false,compare with fpu=false]{rnd}{0.788318}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{rnd}{0.203068}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{rand}{-0.302874}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{rand}{-0.276781}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{random}{0.134639}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{random}{0.375968}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{random(4)}{2.0}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{random(4)}{1.0}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{random(4,10)}{10.0}{0}
+\parsertest[compare with TeX=false,compare with fpu=false]{random(4,10)}{8.0}{0}
+
+\begingroup
+% Check that 'trig format' is property communicated to LUA and
+% implemented correctly:
+\parsertest{sin(50)}{0.766044}{0}%
+\parsertest{cos(50)}{0.642788}{0}%
+\parsertest{tan(50)}{1.191754}{0}%
+\parsertest{asin(0.766044)}{49.999961}{0}%
+\parsertest{acos(0.642788)}{49.999971}{0}%
+\parsertest{atan(1.191754)}{50.00001}{0}%
+\parsertest{atan2(-4,3)}{-53.130102}{0}%
+\parsertest{cot(50)}{0.8391}{0}%
+\parsertest{sec(50)}{1.555724}{0}%
+\parsertest{cosec(50)}{1.305407}{0}%
+%
+\pgfkeys{/pgf/trig format=rad}
+\parsertest{sin(0.5)}{0.479426}{0}%
+\parsertest{cos(0.5)}{0.877583}{0}%
+\parsertest{tan(0.5)}{0.546302}{0}%
+\parsertest{asin(0.5)}{0.523599}{0}%
+\parsertest{acos(0.5)}{1.047198}{0}%
+\parsertest{atan(0.5)}{0.463648}{0}%
+\parsertest{atan2(-4,3)}{-0.927295}{0}%
+\parsertest{cot(0.5)}{1.830488}{0}%
+\parsertest{sec(0.5)}{1.139494}{0}%
+\parsertest{cosec(0.5)}{2.08583}{0}%
+\endgroup
+
+\begingroup
+\pgfkeys{/pgf/declare function={mu1(\x,\i)=\x^\i;}}
+
+\parsertest{mu1(5,2)}{25.0}{0}
+% produces something different in TeX :-( See docs in LUA
+\parsertest[compare with TeX=false]{mu1(-5,2)}{25.0}{0}
+
+\begingroup
+\pgfkeys{/pgf/declare function={mu2=42;}}
+\parsertest{mu2}{42.0}{0}
+\endgroup
+% should have been clean up:
+\parsertest[show error message=false,compare with TeX=false,compare with fpu=false]{mu2}{}{0}
+% ... but this should NOT have been cleaned up!
+\parsertest{mu1(5,2)}{25.0}{0}
+
+\endgroup
+% should have been clean up:
+\parsertest[show error message=false,compare with TeX=false,compare with fpu=false]{mu1(-5,2)}{}{0}
+
+
+\def\pgfmathifexpressionTest#1{%
+ \pgfmathifexpression{1000>999}{%
+ % ok
+ \message{PASSED for mathifexpression(1000>999) #1: = '\pgfmathresult'^^J}%
+ }{%
+ \message{FAILURE for mathifexpression(1000>999) #1: = '\pgfmathresult'^^J}%
+ \global\advance\numErrors by1
+ }%
+}
+
+\pgfmathifexpressionTest{basicmath}
+
+
+\begingroup
+\pgfkeys{/pgf/fpu}%
+\pgfmathifexpressionTest{fpu}
+\endgroup
+
+\begingroup
+\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
+\pgfmathifexpressionTest{fpu output fixed}
+\endgroup
+
+\begingroup
+\pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}%
+\pgfmathifexpressionTest{fpu output sci}
+\endgroup
+
+\begingroup
+\pgfkeys{/pgf/luamath/parser}%
+\pgfmathifexpressionTest{luamath}
+\endgroup
+
+\begingroup
+\pgfkeys{/pgf/luamath/parser,/pgf/luamath/output format=float}%
+\pgfmathifexpressionTest{luamath output float}
+\endgroup
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
+% NO MORE TEST CASES HERE!
+
+\ifnum\numErrors>0
+ \PackageError{pgf}{Has \the\numErrors\space FAILURES}{}
+\else
+ \message{All cases PASSED^^J}%
+\fi
+
+
+\end{document}
diff --git a/graphics/pgf/base/tex/LUA_CODING_STYLE b/graphics/pgf/base/tex/LUA_CODING_STYLE
new file mode 100644
index 0000000000..295a8b2ed1
--- /dev/null
+++ b/graphics/pgf/base/tex/LUA_CODING_STYLE
@@ -0,0 +1,27 @@
+Lua coding style for the graphdrawing library
+=============================================
+
+General naming rules and indentation:
+
+ * 2 spaces indentation
+ * variable_names_with_underscores
+ * namespaced.low_level_functions_with_underscores(foo, bar)
+ * CamelCaseClassNames
+ * CamelCaseClassNames.nameOfStaticFunctionLikeNewOrClone(foo, bar)
+ * CamelCaseClass:functionNamesLikeThis(foo, bar)
+ * never use global variables
+ * Use . for static functions and : for member functions
+
+LuaDoc comments:
+
+ ---
+ -- A function to do this and that.
+ --
+ -- @param first Description of the first parameter.
+ -- @param second Description of the second parameter.
+ --
+ -- @return This function returns something.
+ --
+ function myClass:myFunction(first, second)
+ ...
+ end
diff --git a/graphics/pgf/base/tex/example_graph_for_ascii_displayer.txt b/graphics/pgf/base/tex/example_graph_for_ascii_displayer.txt
new file mode 100644
index 0000000000..052ebdcdb8
--- /dev/null
+++ b/graphics/pgf/base/tex/example_graph_for_ascii_displayer.txt
@@ -0,0 +1,20 @@
+graph [layered layout] {
+ Alice;
+ Bob;
+ Charly;
+ Dave;
+ Eve;
+ Fritz;
+ George;
+ Alice -> Bob;
+ Alice -> Charly;
+ Charly -> Dave;
+ Bob -> Dave;
+ Dave -> Eve;
+ Eve -> Fritz;
+ Fritz -> Alice;
+ George -> Eve;
+ George -> Fritz;
+ Alice -> George;
+}
+
diff --git a/graphics/pgf/base/tex/pgf.cfg b/graphics/pgf/base/tex/pgf.cfg
new file mode 100644
index 0000000000..5f7a34c837
--- /dev/null
+++ b/graphics/pgf/base/tex/pgf.cfg
@@ -0,0 +1,33 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgf.cfg}
+
+% Copy this file to somewhere local and uncomment one of the following
+% if you do not trust/use/like the automatic driver selection
+% algorithms:
+
+% \def\pgfsysdriver{pgfsys-dvi.def}
+% \def\pgfsysdriver{pgfsys-dvipdfm.def}
+% \def\pgfsysdriver{pgfsys-dvipdfmx.def}
+% \def\pgfsysdriver{pgfsys-dvips.def}
+% \def\pgfsysdriver{pgfsys-pdftex.def}
+% \def\pgfsysdriver{pgfsys-luatex.def}
+% \def\pgfsysdriver{pgfsys-tex4ht.def}
+% \def\pgfsysdriver{pgfsys-textures.def}
+% \def\pgfsysdriver{pgfsys-vtex.def}
+% \def\pgfsysdriver{pgfsys-xetex.def}
+
+% Alternatively, use one of the above commands in your own files.
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgf.revision.tex b/graphics/pgf/base/tex/pgf.revision.tex
new file mode 100644
index 0000000000..714fd17d5d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgf.revision.tex
@@ -0,0 +1,15 @@
+\begingroup
+\catcode`\-=12
+\catcode`\/=12
+\catcode`\.=12
+\catcode`\:=12
+\catcode`\+=12
+\catcode`\-=12
+\gdef\pgfrevision{3.1.4b}
+\gdef\pgfversion{3.1.4b}
+\gdef\pgfversiondatetime{2019-08-03 20:21:02 +1200}
+\gdef\pgfrevisiondatetime{2019-08-03 20:21:02 +1200}
+\gdef\pgf@glob@TMPa#1-#2-#3 #4\relax{#1/#2/#3}
+\xdef\pgfversiondate{\expandafter\pgf@glob@TMPa\pgfversiondatetime\relax}
+\xdef\pgfrevisiondate{\expandafter\pgf@glob@TMPa\pgfrevisiondatetime\relax}
+\endgroup
diff --git a/graphics/pgf/base/tex/pgf.sty b/graphics/pgf/base/tex/pgf.sty
new file mode 100644
index 0000000000..710eea546b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgf.sty
@@ -0,0 +1,39 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgf.sty}
+
+\def\pgf@draft{}
+\DeclareOption{draft}{\def\pgf@draft{\pgf@draftmodetrue}}
+
+% the following obsolete stuff is loaded by default:
+\def\pgf@obsolete{\RequirePackage{pgfcomp-version-0-65,pgfcomp-version-1-18}}
+
+\DeclareOption{version=0.65}{} % obsolete stuff is loaded
+\DeclareOption{version=0.96}{\def\pgf@obsolete{\RequirePackage{pgfcomp-version-1-18}}} % less obsolete stuff is loaded
+\DeclareOption{version=1.18}{\def\pgf@obsolete{\RequirePackage{pgfcomp-version-1-18}}} % less obsolete stuff is loaded
+\DeclareOption{version=latest}{\def\pgf@obsolete{}} % no obsolete stuff is loaded
+
+\ProcessOptions
+
+\RequirePackage{pgfcore}
+
+\usepgfmodule{shapes,plot}
+
+%\RequirePackage{pgfbasesnakes}
+%\RequirePackage{pgfbasedecorations}
+%\RequirePackage{pgfbasematrix}
+
+\pgf@obsolete
+\pgf@draft
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgf.tex b/graphics/pgf/base/tex/pgf.tex
new file mode 100644
index 0000000000..777bafc505
--- /dev/null
+++ b/graphics/pgf/base/tex/pgf.tex
@@ -0,0 +1,28 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfatcode{\the\catcode`\@}
+\catcode`\@=11
+
+
+\input pgfrcs.tex
+\ProvidesPackageRCS{pgf.tex}
+
+\input pgfcore.tex
+
+\usepgfmodule{shapes,plot}
+
+%\input pgfbasesnakes.tex
+%\input pgfbasedecorations.tex
+%\input pgfbasematrix.tex
+
+\catcode`\@=\pgfatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfarrows.sty b/graphics/pgf/base/tex/pgfarrows.sty
new file mode 100644
index 0000000000..419be0065b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfarrows.sty
@@ -0,0 +1,19 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfarrows.sty}
+
+\RequirePackage{pgf}
+
+\PackageWarning{pgfarrows}{This package is obsolete. pgf.sty will load
+ arrow management automatically}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfautomata.sty b/graphics/pgf/base/tex/pgfautomata.sty
new file mode 100644
index 0000000000..d43cdd4f78
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfautomata.sty
@@ -0,0 +1,315 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfautomata.sty}
+
+
+\RequirePackage{pgf}
+
+\PackageWarning{pgfautomata}{This package is obsolete.}
+
+\ProcessOptions
+
+%
+% Package for drawing finite automata.
+%
+
+
+\newdimen\pgf@stateradius
+\newdimen\pgf@mooreradius
+\newdimen\pgf@doublethickness
+\newdimen\pgf@statebackoff
+
+
+
+
+% Automaton environment - setup of certain drawing parameters like arrows.
+%
+% Example:
+%
+% \begin{pgfpicture}{-2cm}{-2cm}{2cm}{2cm}%
+% \begin{pgfautomaton}
+% \pgfstaterejecting{q1}{\pgforigin}{$q_1$}
+% \pgfstateaccepting{q2}{\pgfstaterelative[east]{q1}{1cm}}{$q_2$}
+% \pgfstateaccepting{q3}{\pgfstaterelative[east]{q2}{1cm}}{$q_3$}
+%
+% \pgfstateconnect{q1}{q2}[.5]{$0$}
+% \pgfstateconnect{q2}{q3}[.5]{$1$}
+% \pgfstateloop{q1}{90}{$1$}
+% \pgfstateloop{q2}{90}{$1$}
+% \end{pgfautomaton}
+% \end{pgfpicture}
+
+\def\pgfautomaton{\begin{pgfscope}%
+ \pgfsetendarrow{\pgfarrowto}%
+ \pgfnodesetsepend{4pt}\ignorespaces}
+\def\endpgfautomaton{\end{pgfscope}}
+
+
+
+% Set the outer state radius to #1.
+%
+% #1 = new state radius.
+%
+% Example:
+%
+% \pgfsetstateradius{10pt}
+
+\def\pgfsetstateradius#1{\setlength\pgf@stateradius{#1}\ignorespaces}
+
+\pgfsetstateradius{1em}
+
+
+
+% Set the state radius for Moore states to #1.
+%
+% #1 = new state radius.
+%
+% Example:
+%
+% \pgfsetstatemooreradius{10pt}
+
+\def\pgfsetstatemooreradius#1{\setlength\pgf@mooreradius{#1}\ignorespaces}
+
+\pgfsetstatemooreradius{2em}
+
+
+
+% Set the distance between the outer and the inner circle in an
+% accepting state.
+%
+% #1 = new distance radius.
+%
+% Example:
+%
+% \pgfsetstatecircledistance{1.2pt}
+
+\def\pgfsetstatecircledistance#1{\setlength\pgf@doublethickness{#1}\ignorespaces}
+
+\pgfsetstatecircledistance{1.6pt}
+
+
+
+% Set the distance between a connecting line and a label to #1.
+%
+% #1 = new distance
+%
+% Example:
+%
+% \pgfsetstatelabeldistance{4pt}
+
+\def\pgfsetstatelabeldistance#1{\setlength\pgf@statebackoff{#1}\ignorespaces}
+
+\pgfsetstatelabeldistance{4pt}
+
+
+% Draws an accepting state #1 with name #3 at position #2.
+%
+% #1 = a name
+% #2 = a point
+% #3 = a text
+%
+% Example:
+%
+% \pgfstateaccepting{q1}{\pgfxy(1,1)}{$q_1$}
+
+\def\pgfstateaccepting#1#2#3{%
+ \pgfnodecircle{#1}[stroke]{#2}{\pgf@stateradius}%
+ \pgfputat{#2}{\pgfbox[center,center]{#3}}%
+ {%
+ \pgf@xa=\pgf@stateradius%
+ \advance\pgf@xa by-\pgf@doublethickness%
+ \pgfcircle[stroke]{#2}{\pgf@xa}}\ignorespaces}
+
+
+% Draws a rejecting state #1 with name #3 at position #2.
+%
+% #1 = a name
+% #2 = a point
+% #3 = a text
+%
+% Example:
+%
+% \pgfstaterejecting{q2}{\pgfstatedirection[n]{q1}}{$q_2$}
+
+\def\pgfstaterejecting#1#2#3{%
+ \pgfnodecircle{#1}[stroke]{#2}{\pgf@stateradius}%
+ \pgfputat{#2}{\pgfbox[center,center]{#3}}\ignorespaces}
+
+
+% Draws a Moore state #1 with name #3 and output #4 at position #2.
+%
+% #1 = a name
+% #2 = a point
+% #3 = a text
+% #4 = an output text
+%
+% Example:
+%
+% \pgfstatemoore{q}{\pgfxy(1,1)}{$q_1$}{$0,1$}
+
+\def\pgfstatemoore#1#2#3#4{%
+ \pgfnodecircle{#1}[stroke]{#2}{\pgf@mooreradius}%
+ \begin{pgftranslate}{#2}%
+ \begin{pgfscope}%
+ \pgfsetdash{{2pt}{1pt}}{0pt}%
+ \pgfmoveto{\pgfpoint{-\pgf@mooreradius}{0cm}}%
+ \pgflineto{\pgfpoint{\pgf@mooreradius}{0cm}}%
+ \pgfqstroke%
+ \end{pgfscope}%
+ \pgfputat{\pgfpoint{0cm}{0.4\pgf@mooreradius}}{\pgfbox[center,base]{#3}}%
+ \pgfputat{\pgfpoint{0cm}{-0.2\pgf@mooreradius}}{\pgfbox[center,top]{#4}}%
+ \end{pgftranslate}\ignorespaces}
+
+
+
+
+% Connect states #1 and #2 and draw #4 above label, #3-th part of the
+% way from #1 to #2.
+%
+% #1 = a start state
+% #2 = an end state
+% #3 = a fraction of the distance between the two
+% #4 = a label
+%
+% Example:
+%
+% \pgfstateconnect{q1}{q2}[.5]{$0$}
+
+\def\pgfstateconnect#1#2[#3]#4{%
+ \pgfnodeconnline{#1}{#2}%
+ \pgfnodelabel{#1}{#2}[#3][\pgf@statebackoff]%
+ {\pgfbox[center,bottom]{#4}}\ignorespaces}
+
+
+
+% Connect states #1 and #2 and draw #4 above label, #3-th part of the
+% way from #1 to #2.
+%
+% #1 = a start state
+% #2 = an end state
+% #3 = a fraction of the distance between the two
+% #4 = a label
+%
+% Example:
+%
+% \pgfstateconnectrotated{q1}{q2}[.5]{$0$}
+
+\def\pgfstateconnectrotated#1#2[#3]#4{%
+ \pgfnodeconnline{#1}{#2}%
+ \pgfnodelabelrotated{#1}{#2}[#3][\pgf@statebackoff]%
+ {\pgfbox[center,bottom]{#4}}\ignorespaces}
+
+
+
+% Connect state #1 with itself with label #3 and a loop going in
+% direction #2.
+%
+% #1 = a state
+% #2 = an angle
+% #3 = a label
+%
+% Example:
+%
+% \pgfstateloop{q1}{90}{$0$}
+
+\def\pgfstateloop#1#2#3{%
+ \c@pgf@counta=#2\relax%
+ \c@pgf@countb=#2\relax%
+ \advance\c@pgf@counta by15\relax%
+ \advance\c@pgf@countb by-15\relax%
+ \pgfnodeconncurve{#1}{#1}{\the\c@pgf@counta}{\the\c@pgf@countb}{2\pgf@stateradius}{2\pgf@stateradius}%
+ \pgfputat{\pgfnodeborder{#1}{#2}{2.25\pgf@stateradius}}{\pgfbox[center,center]{#3}}\ignorespaces}
+
+
+
+% Connect states #1 and #2 and draw #4 above label, #3-th part of the
+% way from #1 to #2.
+%
+% #1 = a start state
+% #2 = an end state
+% #3 = a start angle
+% #4 = an end angle
+%
+% Example:
+%
+% \pgfstatecurve{q1}{q2}{10}{-10}
+
+\def\pgfstatecurve#1#2#3#4{%
+ \pgfnodeconncurve{#1}{#2}{#3}{#4}{2\pgf@stateradius}{2\pgf@stateradius}\ignorespaces}
+
+
+
+% Give a position relative to some state.
+%
+% #1 = a direction
+% #2 = a state
+% #3 = a distance
+%
+% Example:
+%
+% \pgfstaterelative[east]{q2}{1cm}
+
+\def\pgfstaterelative{\pgfnoderelative}
+
+
+
+% Draw an initial state by drawing an inleading line.
+%
+% #1 = a state
+% #2 = a direction leading into the state (n,s,e,w)
+% #3 = a label (for example ``start'')
+%
+% Example:
+%
+% \pgfstateinitial{q1}[w]{start}
+
+\def\pgfstateinitial#1[#2]#3{{%
+ \pgfmoveto{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{-2pt}}%
+ {\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
+ \pgflineto{\pgfnodeborder{#1}{\pgfdirection{#2}}{\pgf@nodesepend}}%
+ \pgfstroke%
+ \edef\temp{[\csname pgf@statepos\pgfdirection{#2}\endcsname]}%
+ \pgfputat{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{0pt}}%
+ {\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
+ {\expandafter\pgfbox\temp{#3}}}\ignorespaces}
+
+\expandafter\def\csname pgf@statepos0\endcsname{left,center}
+\expandafter\def\csname pgf@statepos90\endcsname{center,bottom}
+\expandafter\def\csname pgf@statepos180\endcsname{right,center}
+\expandafter\def\csname pgf@statepos270\endcsname{center,top}
+
+
+
+% Draw an final state by drawing an outleading line.
+%
+% #1 = a state
+% #2 = a direction leading out of the state (valid directions are
+% n,s,e,w)
+% #3 = a label (for example ``exit'')
+%
+% Example:
+%
+% \pgfstatefinal{q1}[right]{accept}
+
+\def\pgfstatefinal#1[#2]#3{{%
+ \pgfmoveto{\pgfnodeborder{#1}{\pgfdirection{#2}}{\pgf@nodesepstart}}%
+ \pgflineto{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{-\pgf@nodesepend}}%
+ {\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
+ \pgfstroke%
+ \edef\tempb{[\csname pgf@statepos\pgfdirection{#2}\endcsname]}%
+ \pgfputat{\pgfrelative{\pgfnodeborder{#1}{\pgfdirection{#2}}{0pt}}%
+ {\pgfpolar{\pgfdirection{#2}}{1.5\pgf@stateradius}}}%
+ {\expandafter\pgfbox\tempb{#3}}}\ignorespaces}
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaseimage.sty b/graphics/pgf/base/tex/pgfbaseimage.sty
new file mode 100644
index 0000000000..0785efc1cd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaseimage.sty
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete and no longer needed}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaseimage.tex b/graphics/pgf/base/tex/pgfbaseimage.tex
new file mode 100644
index 0000000000..675ac960c4
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaseimage.tex
@@ -0,0 +1,20 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbaseimageatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete and no longer needed}
+
+\catcode`\@=\pgfbaseimageatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaselayers.sty b/graphics/pgf/base/tex/pgfbaselayers.sty
new file mode 100644
index 0000000000..0785efc1cd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaselayers.sty
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete and no longer needed}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaselayers.tex b/graphics/pgf/base/tex/pgfbaselayers.tex
new file mode 100644
index 0000000000..626c89d5a8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaselayers.tex
@@ -0,0 +1,20 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbaselayersatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete and no longer needed}
+
+\catcode`\@=\pgfbaselayersatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbasematrix.sty b/graphics/pgf/base/tex/pgfbasematrix.sty
new file mode 100644
index 0000000000..6ae9ba0fb5
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbasematrix.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{matrix} instead}
+
+\usepgfmodule{matrix}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbasematrix.tex b/graphics/pgf/base/tex/pgfbasematrix.tex
new file mode 100644
index 0000000000..a860a1a7bc
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbasematrix.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbasematrixatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{matrix} instead}
+
+\usepgfmodule{matrix}
+
+\catcode`\@=\pgfbasematrixatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbasepatterns.sty b/graphics/pgf/base/tex/pgfbasepatterns.sty
new file mode 100644
index 0000000000..0785efc1cd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbasepatterns.sty
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete and no longer needed}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbasepatterns.tex b/graphics/pgf/base/tex/pgfbasepatterns.tex
new file mode 100644
index 0000000000..3b14b0a3a3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbasepatterns.tex
@@ -0,0 +1,20 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbasepatternsatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete and no longer needed}
+
+\catcode`\@=\pgfbasepatternsatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaseplot.sty b/graphics/pgf/base/tex/pgfbaseplot.sty
new file mode 100644
index 0000000000..8f40563cec
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaseplot.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{plot} instead}
+
+\usepgfmodule{plot}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaseplot.tex b/graphics/pgf/base/tex/pgfbaseplot.tex
new file mode 100644
index 0000000000..ef56ce8715
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaseplot.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbaseplotatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{plot} instead}
+
+\usepgfmodule{plot}
+
+\catcode`\@=\pgfbaseplotatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaseshapes.sty b/graphics/pgf/base/tex/pgfbaseshapes.sty
new file mode 100644
index 0000000000..1829c521c5
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaseshapes.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{shapes} instead}
+
+\usepgfmodule{shapes}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbaseshapes.tex b/graphics/pgf/base/tex/pgfbaseshapes.tex
new file mode 100644
index 0000000000..94fa7a2888
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbaseshapes.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbaseshapesatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{shapes} instead}
+
+\usepgfmodule{shapes}
+
+\catcode`\@=\pgfbaseshapesatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbasesnakes.sty b/graphics/pgf/base/tex/pgfbasesnakes.sty
new file mode 100644
index 0000000000..8995a463d3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbasesnakes.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgfcore}
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{decorations} instead}
+
+\usepgfmodule{decorations}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfbasesnakes.tex b/graphics/pgf/base/tex/pgfbasesnakes.tex
new file mode 100644
index 0000000000..7902e02bf3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfbasesnakes.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\edef\pgfbasesnakesatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfcore.tex
+
+\PackageWarning{pgf}{This package is obsolete. Use \string\usepgfmodule{decorations} instead}
+
+\usepgfmodule{decorations}
+
+\catcode`\@=\pgfbasesnakesatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcalendar.code.tex b/graphics/pgf/base/tex/pgfcalendar.code.tex
new file mode 100644
index 0000000000..89ee8963e9
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcalendar.code.tex
@@ -0,0 +1,800 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcalendar.code.tex}
+
+\input pgfint.code.tex
+
+% Translation stuff
+
+\ifx\translate\@undefined
+ \def\translate#1{#1}
+\fi
+
+% Load month dictionary, if possible
+
+\ifx\usedictionary\@undefined
+\else
+ \usedictionary{translator-months-dictionary}
+\fi
+
+
+
+
+% Typeset a calendar
+%
+% #1 = prefix for the calendar nodes
+% #2 = begin date in ISO format
+% #3 = end date in ISO format
+% #4 = date rendering code
+%
+% Description:
+%
+% First note that this macro need not be called inside a pgfpicture
+% (even though it often will be). You can use it to typeset
+% calendars also using packages other than pgf. You do not even need
+% to load pgf to use this file.
+%
+% A calendar is typeset as follows: You specify a range of dates (by
+% providing a begin and an end date). Then, for each date the code #4
+% is executed. When the code is called, lots of information about the
+% current date (like its day of week) is available. The job of
+% #4 is to render the date. Typically, this is done by placing nodes
+% somewhere, but the function could do other things as well.
+% It is also the job of #4 to position the calendar correctly.
+%
+% The different calls of #4 are not surrounded by TeX groups (though
+% you can do so yourself, of course). This means that settings can
+% accumulate between different calls, which is often desirable and
+% useful.
+%
+% Inside #4 code, different macros can be access:
+%
+% \pgfcalendarprefix
+% The parameter #1. This prefix is recommended for nodes inside the
+% calendar, but you have to use it yourself explicitly.
+%
+% \pgfcalendarbeginiso
+% Start date of range being typeset in ISO format (like 2006-01-10)
+%
+% \pgfcalendarbeginjulian
+% Julian day number of start date begin typeset
+%
+% \pgfcalendarendiso
+% End date of range begin typeset
+%
+% \pgfcalendarendjulian
+% Same as Julian day number
+%
+% \pgfcalendarcurrentjulian (a TeX-count)
+% Julian day number of day to be rendered/considered
+%
+% \pgfcalendarcurrentweekday
+% Weekday (0 = Monday) of day to be checked
+%
+% \pgfcalendarcurrentyear
+% Year of day to be checked
+%
+% \pgfcalendarcurrentmonth
+% Month of day to be checked
+%
+% \pgfcalendarcurrentday
+% Day of month of day to be checked
+%
+%
+% Inside the \pgfcalendar macro the macro \ifdate is available, which
+% has the same effect as \pgfcalendarifdate{\pgfcalendarcurrentjulian}
+% (only faster). This means that you
+% can write, say, \ifdate{Monday}{current date is a Monday}{Not a Monday}.
+%
+% Example:
+%
+% \begin{tikzpicture}
+% \pgfcalendar{cal}{2007-01-20}{2007-02-10}
+% {\node[anchor=base] {\pgfcalendaronday}; \pgftransformyshift{-1.5em}}
+% \end{tikzpicture}
+%
+% \pgfcalendar{cal}{2007-01-20}{2007-02-10}{ \pgfcalendaronday\ }
+
+\long\def\pgfcalendar#1#2#3#4{%
+ \begingroup%
+ % Setup local \ifdate
+ \let\ifdate=\pgfcalendar@local@ifdate%
+ % Let's start with computing start and end dates...
+ \def\pgfcalendarprefix{#1}%
+ \pgfcalendardatetojulian{#2}{\pgfcalendarcurrentjulian}%
+ \edef\pgfcalendarbeginjulian{\the\pgfcalendarcurrentjulian}%
+ \edef\pgfcalendarbeginiso{#2}%
+ \pgfcalendardatetojulian{#3}{\pgfutil@tempcnta}%
+ \edef\pgfcalendarendjulian{\the\pgfutil@tempcnta}%
+ \advance\pgfutil@tempcnta by1\relax%
+ \edef\pgfcalendarendjulianplus{\the\pgfutil@tempcnta}%
+ \edef\pgfcalendarendiso{#3}%
+ %
+ % Start main loop
+ %
+ \loop%
+ \ifnum\pgfcalendarcurrentjulian<\pgfcalendarendjulianplus\relax%
+ % Setup information about current date
+ \pgfcalendarjuliantodate{\pgfcalendarcurrentjulian}%
+ {\pgfcalendarcurrentyear}{\pgfcalendarcurrentmonth}{\pgfcalendarcurrentday}%
+ \pgfcalendarjuliantoweekday{\pgfcalendarcurrentjulian}{\pgfutil@tempcntb}%
+ \edef\pgfcalendarcurrentweekday{\the\pgfutil@tempcntb}%
+ % Render:
+ #4%
+ % Advance day:
+ \advance\pgfcalendarcurrentjulian by1\relax%
+ \repeat%
+ \endgroup%
+}
+
+\newcount\pgfcalendarcurrentjulian
+
+\def\pgfcalendar@local@ifdate{%
+ \let\pgfcalendarifdatejulian=\pgfcalendarcurrentjulian%
+ \let\pgfcalendarifdateyear=\pgfcalendarcurrentyear%
+ \let\pgfcalendarifdatemonth=\pgfcalendarcurrentmonth%
+ \let\pgfcalendarifdateday=\pgfcalendarcurrentday%
+ \let\pgfcalendarifdateweekday=\pgfcalendarcurrentweekday%
+ \pgfcalendar@launch@ifdate%
+}
+
+
+
+% Execute on specific kinds of dates
+%
+% #1 = ISO-format date
+% #2 = date specification
+% #3 = code
+%
+% Description:
+%
+% The given code #3 is execute on every day that matches the date
+% specification #2. This specification is a comma-separated list of
+% key-value pairs with the path /pgf/calendar. The code for a
+% key-value should check whether the given day matches its
+% specification. If so, it should set \pgfcalendarmatches to true.
+%
+% When the key-value code is executed, the following macros will have
+% been setup:
+%
+% \pgfcalendarifdatejulian
+% Julian day number of day to be checked
+%
+% \pgfcalendarifdateweekday
+% Weekday (0 = Monday) of day to be checked
+%
+% \pgfcalendarifdateyear
+% Year of day to be checked
+%
+% \pgfcalendarifdatemonth
+% Month of day to be checked
+%
+% \pgfcalendarifdateday
+% Day of month of day to be checked
+%
+% The setting of these macros will persist after the call, so a
+% side-effect of calling this macro is to setup these macros.
+%
+% By setting \ifpgfcalendar@do@not@recompute to false, the computation
+% of the year, month etc. is suppressed.
+%
+% Examples:
+%
+% \pgfcalendarifdate{2007-01-10}{all}{}
+% % Simply setup the macros
+%
+% \pgfcalendarifdate{2007-01-10}{mondays}{Is a monday}
+%
+% \pgfcalendarifdate{\mydate}{date=05-01}{\mydate is a Worker's Day}
+
+\def\pgfcalendarifdate#1#2#3#4{%
+ \pgfcalendardatetojulian{#1}{\pgfutil@tempcnta}%
+ \pgfcalendarjuliantodate{\pgfutil@tempcnta}
+ {\pgfcalendarifdateyear}{\pgfcalendarifdatemonth}{\pgfcalendarifdateday}%
+ \edef\pgfcalendarifdatejulian{\the\pgfutil@tempcnta}%
+ % Compute info about date
+ \pgfcalendarjuliantoweekday{\pgfutil@tempcnta}{\pgfutil@tempcntb}%
+ \edef\pgfcalendarifdateweekday{\the\pgfutil@tempcntb}%
+ %
+ \pgfcalendar@launch@ifdate{#2}{#3}{#4}%
+}
+
+
+\long\def\pgfcalendar@launch@ifdate#1#2#3{%
+ % When this macro is called, the pgfcalendarifdatexxxx macros must
+ % be setup correctly
+ %
+ % Set match to false
+ \pgfcalendarmatchesfalse%
+ \pgfqkeys{/pgf/calendar}{#1}%
+ \ifpgfcalendarmatches%
+ #2%
+ \else%
+ #3%
+ \fi%
+}
+
+\newif\ifpgfcalendarmatches
+
+
+% Keys for matching
+
+\pgfkeys{/pgf/calendar/all/.code=\pgfcalendarmatchestrue}
+
+\pgfkeys{/pgf/calendar/Monday/.code={\ifnum\pgfcalendarifdateweekday=0\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/Tuesday/.code={\ifnum\pgfcalendarifdateweekday=1\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/Wednesday/.code={\ifnum\pgfcalendarifdateweekday=2\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/Thursday/.code={\ifnum\pgfcalendarifdateweekday=3\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/Friday/.code={\ifnum\pgfcalendarifdateweekday=4\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/Saturday/.code={\ifnum\pgfcalendarifdateweekday=5\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/Sunday/.code={\ifnum\pgfcalendarifdateweekday=6\relax\pgfcalendarmatchestrue\fi}}
+
+\pgfkeys{/pgf/calendar/workday/.code={\ifnum\pgfcalendarifdateweekday<5\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/weekend/.code={\ifnum\pgfcalendarifdateweekday>4\relax\pgfcalendarmatchestrue\fi}}
+
+\pgfkeys{/pgf/calendar/equals/.cd,.value required,.code={%
+ \pgfcalendar@special@datetojulian{#1}%
+ \ifnum\pgfcalendarifdatejulian=\pgfutil@tempcnta\relax%
+ \pgfcalendarmatchestrue%
+ \fi}%
+}
+
+\pgfkeys{/pgf/calendar/day of month/.cd,.value required,.code={\ifnum#1=\pgfcalendarifdateday\relax\pgfcalendarmatchestrue\fi}}
+\pgfkeys{/pgf/calendar/end of month/.cd,.default=1,.code={%
+ % Tricky and expensive ... do only if necessary
+ \ifpgfcalendarmatches%
+ \else% sigh
+ {%
+ \pgfutil@tempcnta=\pgfcalendarifdatejulian\relax%
+ \advance\pgfutil@tempcnta by#1\relax%
+ \pgfcalendarjuliantodate{\pgfutil@tempcnta}{\pgf@dummy}{\pgf@dummy}{\pgf@cal@temp}%
+ \global\let\pgf@cal@temp=\pgf@cal@temp%
+ }%
+ \ifnum\pgf@cal@temp=1\relax\pgfcalendarmatchestrue\fi%
+ \fi}%
+}
+
+\pgfkeys{/pgf/calendar/at least/.cd,.value required,.code={%
+ \pgfcalendar@special@datetojulian{#1}%
+ \ifnum\pgfcalendarifdatejulian<\pgfutil@tempcnta\relax%
+ \else%
+ \pgfcalendarmatchestrue%
+ \fi%
+}}
+
+\pgfkeys{/pgf/calendar/at most/.cd,.value required,.code={%
+ \pgfcalendar@special@datetojulian{#1}%
+ \ifnum\pgfcalendarifdatejulian>\pgfutil@tempcnta\relax%
+ \else%
+ \pgfcalendarmatchestrue%
+ \fi%
+}}
+
+\pgfkeys{/pgf/calendar/between/.cd,.value required,.code args={#1and#2}{%
+ \pgfcalendar@special@datetojulian{#1}%
+ \ifnum\pgfcalendarifdatejulian<\pgfutil@tempcnta\relax%
+ \else%
+ \pgfcalendar@special@datetojulian{#2}%
+ \ifnum\pgfcalendarifdatejulian>\pgfutil@tempcnta\relax%
+ \else%
+ \pgfcalendarmatchestrue%
+ \fi%
+ \fi%
+}}
+
+\def\pgfcalendar@special@datetojulian#1{%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfcalendar@special@split@test\pgf@temp-\relax{#1}%
+}
+
+\def\pgfcalendar@special@split@test#1-#2-#3\relax#4{%
+ \def\pgf@temp{#3}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \def\pgf@temp{\pgfcalendarifdateyear-#1-#2}%
+ \else%
+ \def\pgf@temp{#4}%
+ \fi%
+ \pgfcalendardatetojulian{\pgf@temp}{\pgfutil@tempcnta}%
+}
+
+
+% Suggested name for nodes inside a calendar
+%
+% Description:
+%
+% It is suggested that (main) nodes (if present) in a calendar should
+% get this name.
+%
+% Example:
+%
+% \pgfcalendar{cal}{2007-01-20}{2007-02-10}{}
+% { \node[anchor=base] (\pgfcalendarsuggestedname) {\pgfcalendarifdateday};
+% \pgftransformyshift{-1.5em} }
+%
+% \draw (cal-2007-01-30) -- (cal-2007-02-08);
+
+\def\pgfcalendarsuggestedname{%
+ \ifx\pgfcalendarprefix\pgfutil@empty\else\pgfcalendarprefix-%
+ \pgfcalendarcurrentyear-\pgfcalendarcurrentmonth-\pgfcalendarcurrentday\fi%
+}
+
+
+
+%
+%
+% Date conversion functions
+%
+%
+
+
+
+% Convert a date to the Julian day number (number of days since
+% January 1st, -4712)
+%
+% #1 = date specification
+% #2 = counter that should be set to the number of days
+%
+% Description:
+%
+% The conversion is taken from the Wikipedia entry on Julian days.
+%
+% The date specification works as follows:
+%
+% - It starts with a year. Use \year for the current year (the year
+% the file is being typeset).
+% - Next comes a hyphen.
+% - Next comes a month (number). Use \month for the current month.
+% - Next comes a hyphen.
+% - Next comes either a day of month (number, use \day for current
+% day) or "last". The keyword "last" refers the last day of the
+% month. Thus, 2006-01-last is the same as 2006-01-31 and
+% 2000-02-last is the same as 2002-02-29.
+% - Next may come a plus sign, followed by a number (positive or
+% negative). This will adjust the date by the given number of
+% days. Thus, 2006-01-31+1 is the same as 2006-02-01 and
+% 2006-02-01+-2 is the same as 2006-01-30. And \year-\month-day+1 is
+% tomorrow. You may add a space before the +.
+%
+% Example:
+%
+% \pgfcalendardatetojulian{2006-01-10}{\mycount}
+
+\def\pgfcalendardatetojulian#1#2{\edef\pgf@temp{#1}\expandafter\pgfcalendar@datetojulian\pgf@temp+/{#2}}
+\def\pgfcalendar@datetojulian#1-#2-#3+#4/#5{%
+ {%
+ %
+ % Store year, month and days.
+ %
+ \count1=#1\relax%
+ \count2=#2\relax%
+ % If #3=="last", then calculate first day of next month
+ \edef\pgf@temp{#3}%
+ \ifx\pgf@temp\pgfcalendar@last@text%
+ \advance\count2 by1\relax%
+ \count3=1\relax%
+ \else%
+ \count3=#3\relax%
+ \fi%
+ %
+ % Store offset
+ %
+ \edef\pgf@@temp{#4}%
+ \ifx\pgf@@temp\pgfutil@empty%
+ \count8=0\relax%
+ \else%
+ \pgfcalendar@unpack#4%
+ \fi%
+ %
+ %
+ % 4) a = \lfloor (14-month) /12 \rfloor
+ %
+ \ifnum\count2<3\relax%
+ \count4=1\relax%
+ \else%
+ \count4=0\relax%
+ \fi%
+ %
+ % 5) y = year + 4800 - a
+ %
+ \count5=\count1\relax%
+ \advance\count5 by 4800\relax%
+ \advance\count5 by-\count4\relax%
+ %
+ % 6) m = month + 12a - 3
+ %
+ \count6=\count2\relax%
+ \count0=\count4\relax%
+ \multiply\count0 by12\relax
+ \advance\count6 by\count0\relax%
+ \advance\count6 by-3\relax%
+ %
+ % 7) jdn = day + \floor{(153 m+2)/5} + 365y + \floor{y/4} -
+ % \floor{y/100} + \florr{y/400} - 32045
+ %
+ \count7=\count3\relax%
+ % + \floor{(153 m+2)/5} :
+ \count0=\count6\relax%
+ \multiply\count0 by 153\relax%
+ \advance\count0 by 2\relax%
+ \divide\count0 by 5\relax%
+ \advance\count7 by \count0\relax%
+ % + 365y :
+ \count0=\count5%
+ \multiply\count0by365\relax%
+ \advance\count7 by\count0\relax%
+ % + \floor{y/4}
+ \count0=\count5\relax%
+ \divide\count0 by 4\relax%
+ \advance\count7 by\count0%
+ % - \floor{y/100}
+ \count0=\count5\relax%
+ \divide\count0 by 100\relax%
+ \advance\count7 by-\count0\relax%
+ % + \floor{y/400}
+ \count0=\count5\relax%
+ \divide\count0 by 400\relax%
+ \advance\count7 by\count0%
+ % - 32045
+ \advance\count7 by-32045\relax%
+ %
+ % Undo "last" advance
+ \ifx\pgf@temp\pgfcalendar@last@text%
+ \advance\count7by-1\relax%
+ \fi%
+ % Add offset
+ \advance\count7by\count8\relax%
+ \expandafter%
+ }%
+ \expandafter#5\the\count7\relax%
+}
+\def\pgfcalendar@last@text{last}
+\def\pgfcalendar@unpack#1+{%
+ \count8=#1\relax%
+}
+
+% Convert Julian day number date.
+%
+% #1 = the number of Julian days
+% #2 = a macro in which the year should be stored.
+% #3 = a macro in which the month should be stored.
+% #4 = a macro in which the day should be stored.
+%
+% Formula used:
+%
+% 1) J = Julian day number
+% 2) j = J + 32044
+% 3) g = j div 146097
+% 4) dg = j mod 146097
+% 5) c = (dg div 36524 + 1) * 3 div 4
+% 6) dc = dg - c * 36524
+% 7) b = dc div 1461
+% 8) db = dc mod 1461
+% 9) a = (db div 365 + 1) * 3 div 4
+% 10)da = db - a * 365
+% 11)y = g * 400 + c * 100 + b * 4 + a
+% 12)m = (da * 5 + 308) div 153 - 2
+% 13)d = da - (m + 4) * 153 div 5 + 122
+% 14)Y = y - 4800 + (m + 2) div 12
+% 15)M = (m + 2) mod 12 + 1
+% 16)D = d + 1
+%
+% Example
+%
+% \pgfcalendarjuliantodate{\mynumber}{\myyear}{\mymonth}{\myday}
+
+\def\pgfcalendarjuliantodate#1#2#3#4{%
+ {%
+ % 1) J = Julian day number
+ \count1=#1\relax%
+ % 2) j = J + 32044
+ \count2=\count1\relax%
+ \advance\count2 by 32044\relax%
+ % 3) g = j div 146097
+ \count3=\count2\relax%
+ \divide\count3 by 146097\relax%
+ % 4) dg = j mod 146097
+ \count4=\count3\relax%
+ \multiply\count4 by-146097\relax%
+ \advance\count4 by\count2\relax%
+ % 5) c = (dg div 36524 + 1) * 3 div 4
+ \count5=\count4\relax%
+ \divide\count5 by36524\relax%
+ \advance\count5 by1\relax%
+ \multiply\count5 by3\relax%
+ \divide\count5 by4\relax%
+ % 6) dc = dg - c * 36524
+ \count6=\count4\relax%
+ \count0=\count5\relax%
+ \multiply\count0 by-36524\relax%
+ \advance\count6 by\count0\relax%
+ % 7) b = dc div 1461
+ \count7=\count6\relax%
+ \divide\count7 by1461\relax%
+ % 8) db = dc mod 1461
+ \count8=\count7\relax%
+ \multiply\count8 by-1461\relax%
+ \advance\count8 by\count6\relax%
+ % 9) a = (db div 365 + 1) * 3 div 4
+ \count9=\count8\relax%
+ \divide\count9 by 365\relax%
+ \advance\count9 by 1\relax%
+ \multiply\count9 by3\relax%
+ \divide\count9 by4\relax%
+ % 10)da = db - a * 365
+ \count10=\count8\relax%
+ \count0=\count9\relax%
+ \multiply\count0 by-365\relax%
+ \advance\count10 by\count0\relax%
+ % 11)y = g * 400 + c * 100 + b * 4 + a
+ \count11=\count3\relax%
+ \multiply\count11 by400\relax%
+ \count0=\count5\relax%
+ \multiply\count0 by100\relax%
+ \advance\count11 by\count0\relax%
+ \count0=\count7\relax%
+ \multiply\count0 by4\relax%
+ \advance\count11 by\count0\relax%
+ \advance\count11 by\count9\relax%
+ % 12)m = (da * 5 + 308) div 153 - 2
+ \count12=\count10\relax%
+ \multiply\count12 by5\relax%
+ \advance\count12 by 308\relax%
+ \divide\count12 by 153\relax%
+ \advance\count12 by -2\relax%
+ % 13)d = - (m + 4) * 153 div 5 + 122 + da
+ \count13=\count12\relax%
+ \advance\count13 by 4\relax%
+ \multiply\count13 by153\relax%
+ \divide\count13 by5\relax%
+ \count13=-\count13\relax%
+ \advance\count13 by 122\relax%
+ \advance\count13 by \count10\relax%
+ % 14)Y = (m + 2) div 12 + y - 4800
+ \count14=\count12\relax%
+ \advance\count14 by 2\relax%
+ \divide\count14 by12\relax%
+ \advance\count14 by\count11\relax%
+ \advance\count14 by-4800\relax%
+ % 15)M = (m + 2) mod 12 + 1
+ \count15=\count12\relax%
+ \advance\count15 by2\relax%
+ \count0=\count15\relax%
+ \divide\count0 by12\relax%
+ \multiply\count0 by12\relax%
+ \advance\count15 by-\count0\relax%
+ \advance\count15 by1\relax%
+ % 16)D = d + 1
+ \count16=\count13%
+ \advance\count16by 1\relax%
+ %
+ \xdef\pgf@temp@year{\the\count14}%
+ \xdef\pgf@temp@month{\ifnum\count15<10 0\fi\the\count15}%
+ \xdef\pgf@temp@day{\ifnum\count16<10 0\fi\the\count16}%
+ }%
+ \let#2=\pgf@temp@year%
+ \let#3=\pgf@temp@month%
+ \let#4=\pgf@temp@day%
+}
+
+
+
+% Returns the day of week as a number between 0 = Monday and 6 =
+% Sunday
+%
+% #1 = a Julian day number
+% #2 = a counter into which the weekday should be put.
+%
+% Example:
+%
+% \pgfcalendardatetojulian{2006-01-10}{\mycount}
+% \pgfcalendarjuliantoweekday{\mycount}{\myweekday}
+
+\def\pgfcalendarjuliantoweekday#1#2{%
+ {%
+ \pgfutil@tempcnta=#1\relax%
+ #2=\pgfutil@tempcnta%
+ \divide#2by7\relax%
+ \multiply#2by-7\relax%
+ \advance#2by\pgfutil@tempcnta\relax%
+ \expandafter%
+ }%
+ \expandafter#2\the#2\relax%
+}
+
+
+
+% Converts a day of week into a weekday name (long or short)
+%
+% #1 = a number representing a weekday (0=Monday)
+%
+% Example:
+%
+% \pgfcalendardatetojulian{2006-01-10}{\mycount}
+% \pgfcalendarjuliantoweekday{\mycount}{\myweekday}
+% October 1st, 2006 was a \pgfcalendarweekdayname{\myweekday}
+
+\def\pgfcalendarweekdayname#1{%
+ \pgfutil@translate{\ifcase#1Monday\or Tuesday\or Wednesday\or Thursday\or Friday\or Saturday\or Sunday\fi}%
+}
+
+\def\pgfcalendarweekdayshortname#1{%
+ \pgfutil@translate{\ifcase#1Mon\or Tue\or Wed\or Thu\or Fri\or Sat\or Sun\fi}%
+}
+
+
+% Converts a month of year number into a month name (long or short)
+%
+% #1 = a number representing a month (1=January)
+%
+% Example:
+%
+% \pgfcalendarmonthname
+
+\def\pgfcalendarmonthname#1{%
+ \pgfutil@translate{\ifcase#1\or January\or February\or March\or April\or
+ May\or June\or July\or August\or September\or October\or
+ November\or December\fi}%
+}
+
+\def\pgfcalendarmonthshortname#1{%
+ \pgfutil@translate{\ifcase#1\or Jan\or Feb\or Mar\or Apr\or
+ May\or Jun\or Jul\or Aug\or Sep\or Oct\or
+ Nov\or Dec\fi}%
+}
+
+
+
+
+
+
+% Macro for easy typesetting of days, etc.
+%
+% #1 = kind selection
+% #2 = length and representation selection
+%
+% Description:
+%
+% Replaces the shorthand according to the following rules: The
+% first letter of the shorthand describes the kind of
+% shorthand. Possible kinds are:
+%
+% d = day of current date (in an invocation of \pgfcalendar)
+% m = month of current date
+% y = year of current date
+% w = week day of current date
+%
+% The second parameter determines how the kind is represented:
+%
+% - = shortest possible numerical way (allowed only for d, m, y)
+% = = same, but always of the same length (padded with blanks as
+% needed, allowed only for d, m, y)
+% 0 = numerical representation for d and m padded with leading zeros.
+% t = textual representation (allowed only for d, m, w)
+% . = abbreviated textual representation (allowed only for d, m, w)
+%
+% It is advised that you say, for example,
+% \let\%=\pgfcalendarshorthand.
+%
+% With this setting, you can typeset an ISO-date by saying \%y0-\%m0-\%d0.
+% For another example, on 2007-02-09, which is a
+% Friday, you can write "\%wt, \%mt \%d-, \%y0" to get "Friday, February 9, 2007"
+
+\def\pgfcalendarshorthand#1#2{\csname pgfcalendar@shorthand@#1#2\endcsname}
+\expandafter\def\csname pgfcalendar@shorthand@d-\endcsname{%
+ {\pgfutil@tempcnta=\pgfcalendarcurrentday\relax\the\pgfutil@tempcnta}}
+\expandafter\def\csname pgfcalendar@shorthand@d=\endcsname{%
+ {\pgfutil@tempcnta=\pgfcalendarcurrentday\relax\ifnum\pgfutil@tempcnta<10\relax\setbox0=\hbox{1}\kern\wd0\relax\fi\the\pgfutil@tempcnta}}
+\expandafter\def\csname pgfcalendar@shorthand@d0\endcsname{%
+ \pgfcalendarcurrentday}
+\expandafter\def\csname pgfcalendar@shorthand@m-\endcsname{%
+ {\pgfutil@tempcnta=\pgfcalendarcurrentmonth\relax\the\pgfutil@tempcnta}}
+\expandafter\def\csname pgfcalendar@shorthand@m=\endcsname{%
+ {\pgfutil@tempcnta=\pgfcalendarcurrentmonth\relax\ifnum\pgfutil@tempcnta<10\relax\setbox0=\hbox{1}\kern\wd0\relax\fi\the\pgfutil@tempcnta}}
+\expandafter\def\csname pgfcalendar@shorthand@m0\endcsname{%
+ \pgfcalendarcurrentmonth}
+\expandafter\def\csname pgfcalendar@shorthand@y-\endcsname{%
+ \pgfcalendarcurrentyear}
+\expandafter\def\csname pgfcalendar@shorthand@y=\endcsname{%
+ \pgfcalendarcurrentyear}
+\expandafter\def\csname pgfcalendar@shorthand@y0\endcsname{%
+ \pgfcalendarcurrentyear}
+\expandafter\def\csname pgfcalendar@shorthand@w.\endcsname{%
+ \pgfcalendarweekdayshortname{\pgfcalendarcurrentweekday}}
+\expandafter\def\csname pgfcalendar@shorthand@wt\endcsname{%
+ \pgfcalendarweekdayname{\pgfcalendarcurrentweekday}}
+\expandafter\def\csname pgfcalendar@shorthand@m.\endcsname{%
+ \pgfcalendarmonthshortname{\pgfcalendarcurrentmonth}}
+\expandafter\def\csname pgfcalendar@shorthand@mt\endcsname{%
+ \pgfcalendarmonthname{\pgfcalendarcurrentmonth}}
+
+% Calculate the date of Easter
+
+% Credits to HÃ¥kon Malmedal on TeX.SX https://tex.stackexchange.com/a/57243
+% and Donald Knuth, TAoCP, Vol 1, 3rd Ed, Section 1.3.2, Algorithm E, p. 160.
+
+\newcount\pgf@cal@easter@Y
+\newcount\pgf@cal@easter@G
+\newcount\pgf@cal@easter@C
+\newcount\pgf@cal@easter@X
+\newcount\pgf@cal@easter@Z
+\newcount\pgf@cal@easter@D
+\newcount\pgf@cal@easter@E
+\newcount\pgf@cal@easter@N
+\newcount\pgf@cal@easter@M
+\newcount\pgf@cal@easter@julianday
+
+\pgfutil@protected\def\pgfcalendareastersunday#1#2{%
+ \pgfintset\pgf@cal@easter@Y{#1}%
+ % E1. Golden number
+ \pgfintset\pgf@cal@easter@G{%
+ \pgfintmod{\pgf@cal@easter@Y}{19}+1
+ }%
+ % E2. Century
+ \pgfintset\pgf@cal@easter@C{%
+ \pgfintdivfloor{\pgf@cal@easter@Y}{100}+1
+ }%
+ % E3. Corrections
+ \pgfintset\pgf@cal@easter@X{%
+ \pgfintdivfloor{3*\pgf@cal@easter@C}{4}-12
+ }%
+ \pgfintset\pgf@cal@easter@Z{%
+ \pgfintdivfloor{8*\pgf@cal@easter@C+5}{25}-5
+ }%
+ % E4. Find Sunday
+ \pgfintset\pgf@cal@easter@D{%
+ \pgfintdivfloor{5*\pgf@cal@easter@Y}{4}-\pgf@cal@easter@X-10
+ }%
+ % E5. Epact (full moon)
+ \pgfintset\pgf@cal@easter@E{%
+ \pgfintmod{11*\pgf@cal@easter@G+20+\pgf@cal@easter@Z-\pgf@cal@easter@X}{30}
+ }%
+ \ifnum\pgf@cal@easter@E<0
+ \pgfintset\pgf@cal@easter@E{\pgf@cal@easter@E+30}%
+ \fi
+ \ifnum\pgf@cal@easter@E=25
+ \ifnum\pgf@cal@easter@G>11
+ \pgfintset\pgf@cal@easter@E{\pgf@cal@easter@E+1}%
+ \fi
+ \else
+ \ifnum\pgf@cal@easter@E=24
+ \pgfintset\pgf@cal@easter@E{\pgf@cal@easter@E+1}%
+ \fi
+ \fi
+ % E6. Find full moon
+ \pgfintset\pgf@cal@easter@N{44-\pgf@cal@easter@E}%
+ \ifnum\pgf@cal@easter@N<21
+ \pgfintset\pgf@cal@easter@N{\pgf@cal@easter@N+30}%
+ \fi
+ % E7. Advance to Sunday
+ \pgfintset\pgf@cal@easter@N{%
+ \pgf@cal@easter@N+7-\pgfintmod{\pgf@cal@easter@D+\pgf@cal@easter@N}{7}
+ }%
+ % E8. Get month
+ \ifnum\pgf@cal@easter@N>31
+ \pgfintset\pgf@cal@easter@N{\pgf@cal@easter@N-31}%
+ \pgfintset\pgf@cal@easter@M{4}% April
+ \else
+ \pgfintset\pgf@cal@easter@M{3}% March
+ \fi
+ \pgfcalendardatetojulian
+ {\pgf@cal@easter@Y-\pgf@cal@easter@M-\pgf@cal@easter@N}%
+ {#2}%
+}
+
+\pgfkeys{/pgf/calendar/Easter/.cd,.default=0,.code={%
+ \show\pgfcalendarifdateyear
+ \pgfcalendareastersunday{\pgfcalendarifdateyear}{\pgf@cal@easter@julianday}%
+ \ifnum\pgfcalendarifdatejulian=\pgfinteval{\pgf@cal@easter@julianday+#1}
+ \expandafter\pgfcalendarmatchestrue
+ \fi}%
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcalendar.sty b/graphics/pgf/base/tex/pgfcalendar.sty
new file mode 100644
index 0000000000..c209bcdb7e
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcalendar.sty
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+\RequirePackage{pgfkeys}
+
+\input{pgfcalendar.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcalendar.tex b/graphics/pgf/base/tex/pgfcalendar.tex
new file mode 100644
index 0000000000..768357527a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcalendar.tex
@@ -0,0 +1,18 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\edef\pgfcalendaratcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfrcs.tex
+\input pgfcalendar.code.tex
+
+\catcode`\@=\pgfcalendaratcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcomp-version-0-65.sty b/graphics/pgf/base/tex/pgfcomp-version-0-65.sty
new file mode 100644
index 0000000000..571f2e5b3c
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcomp-version-0-65.sty
@@ -0,0 +1,719 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfcomp-version-0-65.sty}
+
+\def\pgfdirection#1{\csname pgf@direction#1\endcsname}
+
+\def\pgf@directionn{90}
+\def\pgf@directionnorth{90}
+\def\pgf@directionabove{90}
+\def\pgf@directions{270}
+\def\pgf@directionsouth{270}
+\def\pgf@directionbelow{270}
+\def\pgf@directionw{180}
+\def\pgf@directionwest{180}
+\def\pgf@directionleft{180}
+\def\pgf@directione{0}
+\def\pgf@directioneast{0}
+\def\pgf@directionright{0}
+\def\pgf@directionne{45}
+\def\pgf@directionse{315}
+\def\pgf@directionnw{135}
+\def\pgf@directionsw{-135}
+
+
+\def\pgfpictureboxed#1#2#3#4{%
+ \pgfpicture{#1}{#2}{#3}{#4}%
+ \pgfmoveto{\pgfpoint{#1}{#2}}%
+ \pgflineto{\pgfpoint{#1}{#4}}%
+ \pgflineto{\pgfpoint{#3}{#4}}%
+ \pgflineto{\pgfpoint{#3}{#2}}%
+ \pgfclosestroke\ignorespaces}
+\def\endpgfpictureboxed{\endpgfpicture}
+
+\def\pgfxyline(#1,#2)(#3,#4){%
+ \pgfmoveto{\pgfxy(#1,#2)}%
+ \pgflineto{\pgfxy(#3,#4)}%
+ \pgfstroke}
+
+\def\pgfxycurve(#1,#2)(#3,#4)(#5,#6)(#7,#8){%
+ \pgfmoveto{\pgfxy(#1,#2)}%
+ \pgfbezier{\pgfxy(#3,#4)}{\pgfxy(#5,#6)}{\pgfxy(#7,#8)}%
+ \pgfstroke}
+
+\def\pgfline#1#2{%
+ \pgfmoveto{#1}%
+ \pgflineto{#2}%
+ \pgfstroke}
+
+\let\pgflineto=\pgfpathlineto
+\let\pgfmoveto=\pgfpathmoveto
+\let\pgfcurveto=\pgfpathcurveto
+\let\pgfbezier=\pgfpathcurveto
+\let\pgfarc=\pgfpatharc
+
+\def\pgfzerocircle#1{\pgfcircle{\pgforigin}{#1}}
+\def\pgfzeroellipse#1#2{\pgfellipse{\pgforigin}{#1}{#2}}
+\def\pgfeofill{{\pgfseteorule\pgfsys@flushpath\pgfsys@fill}\pgf@resetpathsizes\ignorespaces}
+\def\pgfeofillstroke{{\pgfseteorule\pgfsys@flushpath\pgfsys@fillstroke}\pgf@resetpathsizes\ignorespaces}
+\def\pgf@perform@eofill{\pgfeofill}
+\def\pgf@perform@eofillstroke{\pgfeofillstroke}
+\let\pgfdiff=\pgfpointdiff
+\let\pgfrelative=\pgfpointadd
+\let\pgfpartway=\pgfpointlineattime
+\let\pgfbackoff=\pgfpointlineatdistance
+\def\pgflabel#1#2#3#4{%
+ % First, calculate base point
+ \pgfpointlineattime{#1}{#2}{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x% xb/yb = start point
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \pgf@process{\pgfpointnormalised{}}% x/y = normalised vector
+ \setlength\pgf@ya{#4}%
+ \pgf@xa=-\pgf@ya\relax%
+ \pgf@xa=\pgf@sys@tonumber{\pgf@y}\pgf@xa%
+ \pgf@ya=\pgf@sys@tonumber{\pgf@x}\pgf@ya%
+ \pgf@x=\pgf@xb\relax%
+ \pgf@y=\pgf@yb\relax%
+ \advance\pgf@x by\pgf@xa\relax%
+ \advance\pgf@y by\pgf@ya\relax%
+ \ignorespaces}
+\let\pgfnormalise=\pgfpointnormalised
+\let\pgfpolar=\pgfpointpolar
+\let\pgforigin=\pgfpointorigin
+\let\pgfclosepath=\pgfpathclose
+
+\def\pgfxy(#1,#2){\pgfpointxy{#1}{#2}}
+\def\pgfxyz(#1,#2,#3){\pgfpointxyz{#1}{#2}{#3}}
+\newcommand\pgfgrid[3][]{\pgfpathgrid[#1]{#2}{#3}\pgfqstroke}
+\newcommand\pgfellipse[4][]{%
+ \pgfpathellipse{#2}{#3}{#4}%
+ \csname pgf@perform@#1\endcsname\ignorespaces
+}
+\newcommand\pgfcircle[3][]{\pgfellipse[#1]{#2}{\pgfpoint{#3}{0pt}}{\pgfpoint{0pt}{#3}}}
+\newcommand\pgfrect[3][]{%
+ \pgfpathrectangle{#2}{#3}%
+ \csname pgf@perform@#1\endcsname%
+}
+\def\pgf@perform@stroke{\pgfqstroke}
+\def\pgf@perform@fill{\pgffill}
+\def\pgf@perform@fillstroke{\pgffillstroke}
+\def\pgf@perform@clip{\pgfclip}
+
+\def\pgfsincos#1{%
+ \pgfmathparse{#1}%
+ \pgfmathcos@{#1}\pgf@y\pgfmathresult pt%
+ \pgfmathsin@{#1}\pgf@x\pgfmathresult pt%
+}
+
+\let\pgfdegree=\pgfsincos
+
+\newenvironment{pgfmagnify}[2]{\pgflowlevelscope{\pgftransformcm{#1}{0}{0}{#2}{\pgfpointorigin}}}{\endpgflowlevelscope}
+\newenvironment{pgftranslate}[1]{\pgflowlevelscope{\pgftransformshift{#1}}}{\endpgflowlevelscope}
+\newcommand{\pgftranslateto}[1]{\pgflowlevel{\pgftransformshift{#1}}}
+\newenvironment{pgfrotateby}[1]{%
+ \pgf@process{#1}%
+ \pgf@xa=-\pgf@x%
+ \edef\pgf@temp{\noexpand\pgflowlevelscope{\noexpand\pgftransformcm{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@xa}}{\pgf@sys@tonumber{\pgf@y}}{\noexpand\pgfpointorigin}}}%
+ \pgf@temp}
+{\endpgflowlevelscope}
+
+\long\def\pgfputat#1#2{\begin{pgftranslate}{#1}#2\end{pgftranslate}}
+\def\pgfputlabelrotated#1#2#3#4#5{%
+ \pgflabel{#1}{#2}{#3}{#4}%
+ \pgfputat{}{%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x% xb/yb = start point
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \pgfnormalise{}% x/y = normalised vector
+ \pgf@ya=-\pgf@y%
+ \pgfsys@transformcm{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{0pt}{0pt}%
+ #5}%
+ \ignorespaces}
+\def\pgfqcurveto#1#2#3#4#5#6{\pgfpathqcurveto{#1bp}{#2bp}{#3bp}{#4bp}{#5bp}{#6bp}}
+\let\pgfqbezier=\pgfqcurveto
+\def\pgfqlineto#1#2{\pgfpathqlineto{#1bp}{#2bp}}
+\def\pgfqmoveto#1#2{\pgfpathqmoveto{#1bp}{#2bp}}
+\let\pgfqstroke=\pgfusepathqstroke
+
+\def\pgfstroke{\pgfusepath{stroke}}
+\def\pgfclip{\pgfusepath{clip}}
+\def\pgffill{\pgfusepath{fill}}
+\def\pgfclosestroke{\pgfpathclose\pgfusepath{stroke}}
+\def\pgffillstroke{\pgfusepath{fill,stroke}}
+\def\pgfstrokeclip{\pgfusepath{clip,stroke}}
+\def\pgffillclip{\pgfusepath{clip,stroke}}
+\def\pgfclosestrokeclip{\pgfpathclose\pgfusepath{stroke,clip}}
+\def\pgffillstrokeclip{\pgfusepath{stroke,fill,clip}}
+\def\pgfclearendarrow{\pgfsetendarrow{}}
+\def\pgfclearstartarrow{\pgfsetstartarrow{}}
+
+\def\pgfputarrow#1#2#3{\pgflowlevelobj{\pgftransformarrow{#1}{#2}}{\pgfsys@setdash{}{0pt}#3}}
+
+\def\pgfsetstartarrow#1{\def\pgf@startarrow{#1}\def\pgf@shorten@start{\pgf@x=0.0pt}}
+\def\pgfsetendarrow#1{\def\pgf@endarrow{#1}\def\pgf@shorten@end{\pgf@x=0.0pt}}
+
+\def\pgfdefarrow#1#2#3#4{%
+ \pgfdefobject{pgf@#1}{#2}{#3}{\pgfsys@setlinewidth{1bp}#4}%
+ \expandafter\gdef\csname#1\endcsname{%
+ \pgf@x=\pgflinewidth%
+ \pgf@y=\pgflinewidth%
+ \pgfuseobjectmagnify{pgf@#1}\ignorespaces}}
+\def\pgfdefarrowabs#1#2#3#4{%
+ \pgfdefobject{pgf@#1}{#2}{#3}{\pgfarrowlinewidthscale{1}#4}%
+ \expandafter\gdef\csname#1\endcsname{%
+ \pgfuseobject{pgf@#1}\ignorespaces}
+ }
+\def\pgfarrowlinewidthscale#1{\pgfsys@setlinewidth{#1bp}\ignorespaces}
+\pgfdefarrow{pgfarrowsingle}{\pgfpoint{-7pt}{-5pt}}{\pgfpoint{3pt}{5pt}}{%
+ \pgfqmoveto{2}{0}
+ \pgfqlineto{-6}{4}
+ \pgfqlineto{-3}{0}
+ \pgfqlineto{-6}{-4}
+ \pgfusepathqfill}
+\def\pgfarrowswap#1{\pgflowlevelobj{\pgftransformxscale{-1}}{#1}}
+\def\pgfarrowcombine#1#2{%
+ #1%
+ \pgflowlevelobj{\pgftransformshift{\pgfpoint{-7\pgflinewidth}{0pt}}}{#2}}
+\def\pgfarrowcombineloose#1#2{#1\pgflowlevelobj{\pgftransformshift{\pgfpoint{-14\pgflinewidth}{0pt}}}{#2}}
+\def\pgfarrowdouble#1{\pgfarrowcombine{#1}{#1}}
+\def\pgfarrowtriple#1{%
+ #1%
+ \pgflowlevelobj{\pgftransformshift{\pgfpoint{-7\pgflinewidth}{0pt}}}{#1}%
+ \pgflowlevelobj{\pgftransformshift{\pgfpoint{-14\pgflinewidth}{0pt}}}{#1}}
+\pgfdefarrow{pgfarrowto}{\pgfpoint{-4pt}{-5pt}}{\pgfpoint{2pt}{5pt}}{%
+ \pgfarrowlinewidthscale{0.8}
+ \pgfsetdash{}{0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfqmoveto{-3}{4}
+ \pgfqcurveto{-2.75}{2.5}{0}{0.25}{0.75}{0}
+ \pgfqcurveto{0}{-0.25}{-2.75}{-2.5}{-3}{-4}
+ \pgfusepathqstroke}
+\pgfdefarrow{pgfarrowbar}{\pgfpoint{-1pt}{-6pt}}{\pgfpoint{1pt}{6pt}}{%
+ \pgfsetdash{}{0pt}
+ \pgfqmoveto{0}{-5}
+ \pgfqlineto{0}{5}
+ \pgfusepathqstroke}
+\pgfdefarrow{pgfarrowsquare}{\pgfpoint{-4pt}{-6pt}}{\pgfpoint{1pt}{6pt}}{%
+ \pgfsetdash{}{0pt}
+ \pgfqmoveto{-3}{-5}
+ \pgfqlineto{0}{-5}
+ \pgfqlineto{0}{5}
+ \pgfqlineto{-3}{5}
+ \pgfusepathqstroke}
+\pgfdefarrow{pgfarrowround}{\pgfpoint{-3pt}{-6pt}}{\pgfpoint{2pt}{6pt}}{%
+ \pgfsetdash{}{0pt}
+ \pgfqmoveto{-2}{-5}
+ \pgfqcurveto{1}{-3}{1}{3}{-2}{5}
+ \pgfusepathqstroke}
+\pgfdefarrow{pgfarrowpointed}{\pgfpoint{-6pt}{-6pt}}{\pgfpoint{2pt}{6pt}}{%
+ \pgfsetdash{}{0pt}
+ \pgfqmoveto{-4.5}{-5}
+ \pgfqlineto{0.5}{0}
+ \pgfqlineto{-4.5}{5}
+ \pgfusepathqstroke}
+\pgfdefarrow{pgfarrowdot}{\pgfpoint{-7pt}{-4pt}}{\pgfpoint{2pt}{4pt}}{%
+ \pgfsys@transformshift{-2.5bp}{0bp}%
+ \pgfsetdash{}{0pt}
+ \pgfpathqcircle{3bp}
+ \pgfusepathqfillstroke}
+\pgfdefarrow{pgfarrowdiamond}{\pgfpoint{-12pt}{-4pt}}{\pgfpoint{2pt}{4pt}}{%
+ \pgfsetdash{}{0pt}
+ \pgfqmoveto{1}{0}
+ \pgfqlineto{-5}{3}
+ \pgfqlineto{-11}{0}
+ \pgfqlineto{-5}{-3}
+ \pgfpathclose
+ \pgfusepathqfillstroke}
+\def\pgfarrowcircle#1{%
+ \pgfsetdash{}{0pt}
+ \setlength\pgf@xa{#1}%
+ \pgf@xb=\pgf@xa%
+ \advance\pgf@xa by-0.5\pgflinewidth
+ \begin{pgflowlevelscope}{\pgftransformshift{\pgfpoint{-\pgf@xa}{0pt}}}%
+ \pgfpathqcircle{\pgf@sys@tonumber{\pgf@xb}bp}
+ \pgfusepathqfillstroke
+ \end{pgflowlevelscope}}
+\def\pgfarrowtriangle#1{%
+ \pgfsetdash{}{0pt}
+ \begin{pgfscope}%
+ \setlength\pgf@xa{#1}%
+ \pgf@ya=0.577\pgf@xa%
+ \advance\pgf@xb by-\pgflinewidth%
+ \pgfpathmoveto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}%
+ \pgfpathlineto{\pgfpoint{\pgflinewidth}{0pt}}%
+ \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}%
+ \pgfpathclose%
+ \pgfusepathqfillstroke%
+ \end{pgfscope}}
+\def\pgfarrowlargepointed#1{%
+ \pgfsetdash{}{0pt}
+ \begin{pgfscope}%
+ \setlength\pgf@xa{#1}%
+ \pgfpathmoveto{\pgfpoint{-\pgf@xa}{-\pgf@xa}}
+ \pgfpathlineto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@xa}}
+ \pgfusepathqstroke
+ \end{pgfscope}}
+
+\newcommand\pgfcorner[3][sw]{%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \ifdim\pgf@xa<\pgf@x%
+ \pgf@xb=\pgf@x%
+ \pgf@x=\pgf@xa%
+ \pgf@xa=\pgf@xb%
+ \fi%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgf@yb=\pgf@y%
+ \pgf@y=\pgf@ya%
+ \pgf@ya=\pgf@yb%
+ \fi%
+ \csname pgf@corner@#1\endcsname\relax%
+}
+\def\pgf@corner@se{\pgf@x=\pgf@xa}
+\def\pgf@corner@ne{\pgf@x=\pgf@xa\pgf@y=\pgf@ya}
+\def\pgf@corner@nw{\pgf@y=\pgf@ya}
+\def\pgf@corner@sw{}
+\def\pgf@corner@s{\pgf@x=.5\pgf@x\advance\pgf@x by.5\pgf@xa}
+\def\pgf@corner@n{\pgf@x=.5\pgf@x\advance\pgf@x by.5\pgf@xa\pgf@y=\pgf@ya}
+\def\pgf@corner@w{\pgf@y=.5\pgf@y\advance\pgf@y by.5\pgf@ya}
+\def\pgf@corner@e{\pgf@y=.5\pgf@y\advance\pgf@y by.5\pgf@ya\pgf@x=\pgf@xa}
+
+% Defines a circle node of name #1 at position #3 of radius #4.
+%
+% #1 = a name
+% #2 = ``stroke'' or ``fill'' or ``fillstroke'' or ``virtual'' (= draw
+% nothing)
+% #3 = a point
+% #4 = a radius
+%
+% Example:
+%
+% \pgfnodecircle{mynode}[stroke]{\pgfxy(1,1)}{2cm}
+
+\def\pgfnodecircle#1[#2]#3#4{%
+ \pgf@process{#3}%
+ \expandafter\def\csname pgfno@#1\endcsname{\pgf@backoffcircle{#4}}%
+ \expandafter\def\csname pgfnob@#1\endcsname{\pgf@anglecircle{#4}}%
+ \expandafter\edef\csname pgfnom@#1\endcsname{\noexpand\pgf@x=\pgf@sys@tonumber{\pgf@x}pt\noexpand\pgf@y=\pgf@sys@tonumber{\pgf@y}pt}%
+ \expandafter\ifx\csname pgf@@#2\endcsname\pgf@@virtual%
+ \else%
+ \pgfcircle[#2]{\csname pgfnom@#1\endcsname}{#4}%
+ \fi\ignorespaces}
+
+\def\pgf@@virtual{}
+
+
+% Defines a rectangular node of name #1 with center at position #3 and
+% width/height vector #4
+%
+% #1 = a name
+% #2 = ``stroke'' or ``fill'' or ``fillstroke'' or ``virtual'' (= draw
+% nothing)
+% #3 = a center
+% #4 = width/height vector
+%
+% Example:
+%
+% \pgfnoderect{mynode}[stroke]{\pgfxy(1,1)}{\pgfxy(2,2)}
+
+\def\pgfnoderect#1[#2]#3#4{%
+ \pgf@process{#3}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#4}%
+ \pgf@x=.5\pgf@x%
+ \pgf@y=.5\pgf@y%
+ \expandafter\edef\csname pgfno@#1\endcsname{\noexpand\pgf@backoffrect%
+ {\pgf@sys@tonumber{\pgf@x}pt}{\pgf@sys@tonumber{\pgf@y}pt}}%
+ \expandafter\edef\csname pgfnob@#1\endcsname{\noexpand\pgf@anglerect%
+ {\pgf@sys@tonumber{\pgf@x}pt}{\pgf@sys@tonumber{\pgf@y}pt}}%
+ \expandafter\edef\csname
+ pgfnom@#1\endcsname{\noexpand\pgf@x=\pgf@sys@tonumber{\pgf@xa}pt\noexpand\pgf@y=\pgf@sys@tonumber{\pgf@ya}pt}%
+ \expandafter\ifx\csname pgf@@#2\endcsname\pgf@@virtual%
+ \else%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \edef\pgf@temp{\noexpand\pgf@x=\pgf@sys@tonumber{\pgf@xa}pt\noexpand\pgf@y=\pgf@sys@tonumber{\pgf@ya}pt}%
+ \pgfrect[#2]{\pgf@temp}{#4}%
+ \fi\ignorespaces}
+
+
+% Defines a rectangular node of name #1 with center at position #3
+% contaning a box #4
+%
+% #1 = a name
+% #2 = ``stroke'' or ``fill'' or ``fillstroke'' or ``virtual'' (= draw
+% nothing)
+% #3 = a center
+% #4 = TeX text that will be boxed
+% #5 = a horizontal border offset
+% #6 = a vertical border offset
+%
+% Example:
+%
+% \pgfnodebox{mynode}[stroke]{\pgfxy(1,1)}{start}{2pt}{2pt}
+
+\def\pgfnodebox#1[#2]#3#4#5#6{%
+ \pgf@makehbox{#4}%
+ \pgf@x=\wd\pgf@hbox%
+ \pgf@y=\ht\pgf@hbox%
+ \advance\pgf@y by \dp\pgf@hbox%
+ \addtolength\pgf@x{#5}%
+ \addtolength\pgf@x{#5}%
+ \addtolength\pgf@y{#6}%
+ \addtolength\pgf@y{#6}%
+ \edef\pgf@boxsize{\noexpand\pgf@x=\the\pgf@x\noexpand\pgf@y=\the\pgf@y}%
+ \csname pgf@haligncompcenter\endcsname%
+ \csname pgf@valigncompcenter\endcsname%
+ \wd\pgf@hbox=0pt%
+ \pgfputat{#3}{%
+ \pgfsys@hbox\pgf@hbox}%
+ \pgfnoderect{#1}[#2]{#3}{\pgf@boxsize}\ignorespaces}
+
+
+
+
+% Retrieves the center of #1.
+%
+% #1 = a node name
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfnodecenter{mynode}}
+
+\def\pgfnodecenter#1{%
+ \expandafter\ifx\csname pgfnom@#1\endcsname\relax%
+ \GenericError{\space\space\space\@spaces\@spaces\@spaces}%
+ {PGF Error: Node "#1" undefined.}{}{\@ehc}%
+ \pgfpoint{0pt}{0pt}%
+ \else\csname pgfnom@#1\endcsname\fi\ignorespaces}
+
+
+
+% Returns a position relative to the center of #1.
+%
+% #1 = a node name
+% #2 = a direction (see \pgfdirection)
+% #3 = a distance
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfnoderelative{mynode}[north]{1cm}}
+
+\def\pgfnoderelative#1[#2]#3{%
+ \pgfrelative{\pgfnodecenter{#1}}{\pgfpolar{\pgfdirection{#2}}{#3}}\ignorespaces}
+
+
+
+% Retrieves a border point of #1 at angle #2 and distance #3 from
+% border.
+%
+% #1 = a node name
+% #2 = an angle
+% #3 = a distance from the border
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfnodeborder{first}{30}{0pt}}
+% \pgfpathlineto{\pgfnodeborder{second}{180}{2pt}}
+% \pgfstroke
+
+\def\pgfnodeborder#1#2#3{%
+ \csname pgfnob@#1\endcsname{#3}{#2}{\pgfnodecenter{#1}}\ignorespaces}
+
+
+
+% Gives the beginning of a connection of #2 and #3, taking a
+% separation distance of #1 into account.
+%
+% #1 = a separation distance
+% #2 = a node name
+% #3 = a second node name
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfnodeconnstart{first}{second}}
+% \pgfpathlineto{\pgfnodeconnstart{second}{first}}
+
+\def\pgfnodeconnstart[#1]#2#3{%
+ \csname pgfno@#2\endcsname[#1]{\pgfnodecenter{#2}}{\pgfnodecenter{#3}}%
+ \ignorespaces}
+
+
+
+\newdimen\pgf@nodesepstart
+\newdimen\pgf@nodesepend
+
+% Sets the node separation for starts of lines.
+%
+% #1 = a distance
+%
+% Example:
+%
+% \pgfnodesetsepstart{2pt}
+
+\def\pgfnodesetsepstart#1{\setlength\pgf@nodesepstart{#1}\ignorespaces}
+
+\pgfnodesetsepstart{0pt}
+
+
+% Sets the node separation for end of lines.
+%
+% #1 = a distance
+%
+% Example:
+%
+% \pgfnodesetsepend{2pt}
+
+\def\pgfnodesetsepend#1{\setlength\pgf@nodesepend{#1}\ignorespaces}
+
+\pgfnodesetsepend{0pt}
+
+
+
+
+% Draws a line from #1 to #2.
+%
+% #1 = a node name
+% #2 = a second node name
+%
+% Example:
+%
+% \pgfnodeconnline{first}{second}
+
+\def\pgfnodeconnline#1#2{%
+ \pgfpathmoveto{\pgfnodeconnstart[\pgf@nodesepstart]{#1}{#2}}%
+ \pgfpathlineto{\pgfnodeconnstart[\pgf@nodesepend]{#2}{#1}}%
+ \pgfstroke%
+ \ignorespaces}
+
+
+
+% Draws a curve from #1 to #2. The starting angle at #1 is #3 and the
+% length to the first support point is #5. The starting angle at #2
+% is #4 and the length to the second support point is #6.
+%
+% #1 = a node name
+% #2 = a second node name
+% #3 = angle at first node
+% #4 = angle at second node
+% #5 = distance to support point at first node
+% #6 = distance to support point at second node
+%
+% Example:
+%
+% \pgfnodeconncurve{first}{second}{10}{-10}{1cm}{1cm}
+
+\def\pgfnodeconncurve#1#2#3#4#5#6{%
+ \pgfpathmoveto{\pgfnodeborder{#1}{#3}{\pgf@nodesepstart}}%
+ \pgfpathcurveto{\pgfnodeborder{#1}{#3}{#5}}{\pgfnodeborder{#2}{#4}{#6}}%
+ {\pgfnodeborder{#2}{#4}{\pgf@nodesepend}}%
+ \pgfstroke\ignorespaces}
+
+
+
+
+% Put a label on a line from #1 to #2.
+%
+% #1 = a node name
+% #2 = a second node name
+% #3 = fraction of way from #1 to #2
+% #4 = vertical offset
+% #5 = label
+%
+% Example:
+%
+% \pgfnodelabel{first}{second}[.5][2pt]{\pgfbox[center,base]{owns}}
+
+\def\pgfnodelabel#1#2[#3][#4]#5{%
+ \pgfputat{\pgflabel%
+ {#3}%
+ {\pgfnodeconnstart[\pgf@nodesepstart]{#1}{#2}}%
+ {\pgfnodeconnstart[\pgf@nodesepend]{#2}{#1}}%
+ {#4}}%
+ {#5}\ignorespaces}
+
+
+% Put a rotated label on a line from #1 to #2.
+%
+% #1 = a node name
+% #2 = a second node name
+% #3 = fraction of way from #1 to #2
+% #4 = vertical offset
+% #5 = label
+%
+% Example:
+%
+% \pgfnodelabelrotated{first}{second}[.5][2pt]{\pgfbox[center,base]{owns}}
+
+\def\pgfnodelabelrotated#1#2[#3][#4]#5{%
+ \pgfputlabelrotated%
+ {#3}%
+ {\pgfnodeconnstart[\pgf@nodesepstart]{#1}{#2}}%
+ {\pgfnodeconnstart[\pgf@nodesepend]{#2}{#1}}%
+ {#4}%
+ {#5}\ignorespaces}
+
+
+
+% Internals
+
+\def\pgf@backoffcircle#1[#2]#3#4{%
+ % Calculate backoff for a circle of radius
+ % #1 and offset separation #2. #3 is the center of the circle, #4
+ % is the target point.
+ \setlength\pgf@x{#1}%
+ \addtolength\pgf@x{#2}%
+ \edef\pgf@temp{{\pgf@sys@tonumber{\pgf@x}pt}}%
+ \expandafter\pgfbackoff\pgf@temp{#3}{#4}\ignorespaces}
+
+\def\pgf@mult#1#2#3{#1=#2#3}
+
+\def\pgf@anglecircle#1#2#3#4{%
+ % Calculate border point. #1 is radius, #2 is additional backoff, #3
+ % is an angle, #4 is the center of the circle.
+ \pgfsincos{#3}%
+ \setlength\pgf@xa{#1}%
+ \addtolength\pgf@xa{#2}%
+ \pgf@ya=\pgf@xa\relax%
+ \pgf@mult{\pgf@xa}{\pgf@sys@tonumber{\pgf@x}}{\pgf@xa}%
+ \pgf@mult{\pgf@ya}{\pgf@sys@tonumber{\pgf@y}}{\pgf@ya}%
+ \pgf@process{#4}%
+ \advance\pgf@y by\pgf@xa\relax%
+ \advance\pgf@x by\pgf@ya\ignorespaces}
+
+\def\pgf@backoffrect#1#2[#3]#4#5{%
+ % Calculate backoff for a rect with half width #1,
+ % half height #2, offset separation #3. #4 is the center of the rect, #5
+ % is the target point.
+ \pgfdiff{#4}{#5}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \setlength\pgf@xb{#1}%
+ \setlength\pgf@yb{#2}%
+ \addtolength\pgf@xb{#3}%
+ \addtolength\pgf@yb{#3}%
+ \ifnum\pgf@xa<0\relax% move into first quadrant
+ \pgf@x=-\pgf@x%
+ \fi%
+ \ifnum\pgf@ya<0\relax%
+ \pgf@y=-\pgf@y%
+ \fi%
+ \c@pgf@counta=\pgf@x%
+ \c@pgf@countb=\pgf@y%
+ \divide\c@pgf@counta by 256\relax%
+ \divide\c@pgf@countb by 256\relax%
+ \ifnum\c@pgf@countb<\c@pgf@counta%
+ \ifnum\c@pgf@counta<1\relax%
+ \pgf@y=\pgf@yb\relax%
+ \pgf@x=0pt\relax%
+ \else%
+ \pgf@y=16\pgf@y%
+ \divide\pgf@y by \c@pgf@counta%
+ \pgf@y=16\pgf@y%
+ \pgf@mult{\pgf@y}{\pgf@sys@tonumber{\pgf@xb}}{\pgf@y}%
+ \ifnum\pgf@y<\pgf@yb%
+ \pgf@x=\pgf@xb%
+ \else% rats, calculate intersection on upper side
+ \ifnum\c@pgf@countb<1\relax%
+ \pgf@x=\pgf@xb\relax%
+ \pgf@y=0pt\relax%
+ \else%
+ \pgf@x=16\pgf@x%
+ \divide\pgf@x by \c@pgf@countb%
+ \pgf@x=16\pgf@x%
+ \pgf@mult{\pgf@x}{\pgf@sys@tonumber{\pgf@yb}}{\pgf@x}%
+ \pgf@y=\pgf@yb%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifnum\c@pgf@countb<1\relax%
+ \pgf@x=\pgf@xb\relax%
+ \pgf@y=0pt\relax%
+ \else%
+ \pgf@x=16\pgf@x%
+ \divide\pgf@x by \c@pgf@countb%
+ \pgf@x=16\pgf@x%
+ \pgf@mult{\pgf@x}{\pgf@sys@tonumber{\pgf@yb}}{\pgf@x}%
+ \ifnum\pgf@x<\pgf@xb%
+ \pgf@y=\pgf@yb%
+ \else%
+ \ifnum\c@pgf@counta<1\relax%
+ \pgf@y=\pgf@yb\relax%
+ \pgf@x=0pt\relax%
+ \else%
+ \pgf@y=16\pgf@y%
+ \divide\pgf@y by \c@pgf@counta%
+ \pgf@y=16\pgf@y%
+ \pgf@mult{\pgf@y}{\pgf@sys@tonumber{\pgf@xb}}{\pgf@y}%
+ \pgf@x=\pgf@xb%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\pgf@xa<0\relax\pgf@x=-\pgf@x\fi%
+ \ifnum\pgf@ya<0\relax\pgf@y=-\pgf@y\fi%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#4}%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya\ignorespaces}
+
+\def\pgf@anglerect#1#2#3#4#5{%
+ % Calculate border point. #1/#2 is half width/height, #3 is additional backoff, #4
+ % is an angle, #5 is the center of the rect.
+ \pgfsincos{#4}%
+ \pgf@xa=100\pgf@x%
+ \pgf@ya=100\pgf@y%
+ \pgf@process{#5}%
+ \advance\pgf@x by\pgf@ya%
+ \advance\pgf@y by\pgf@xa%
+ \edef\pgf@temp{{\noexpand\pgf@x=\the\pgf@x\noexpand\pgf@y=\the\pgf@y}}%
+ \expandafter\pgf@caller\pgf@temp{#1}{#2}{#3}{#5}\ignorespaces}
+
+\def\pgf@caller#1#2#3#4#5{\pgf@backoffrect{#2}{#3}[#4]{#5}{#1}}
+
+\long\def\pgfbox[#1,#2]#3{%
+ \pgf@makehbox{#3}%
+ \csname pgf@haligncomp#1\endcsname%
+ \csname pgf@valigncomp#2\endcsname%
+ \wd\pgf@hbox=0pt%
+ \ht\pgf@hbox=0pt%
+ \dp\pgf@hbox=0pt%
+ \pgfqbox{\pgf@hbox}%
+ \ignorespaces}
+
+\def\pgf@haligncompleft{}% do nothing
+\def\pgf@haligncompcenter{\setbox\pgf@hbox=\hbox{\hskip-.5\wd\pgf@hbox\box\pgf@hbox}}
+\def\pgf@haligncompright{\setbox\pgf@hbox=\hbox{\hskip-\wd\pgf@hbox\box\pgf@hbox}}
+\def\pgf@valigncompbase{}% do nothing
+\def\pgf@valigncompbottom{\setbox\pgf@hbox=\hbox{\raise\dp\pgf@hbox\box\pgf@hbox}}
+\def\pgf@valigncompcenter{%
+ \setbox\pgf@hbox=\hbox{\raise.5\dp\pgf@hbox\hbox{\lower.5\ht\pgf@hbox\box\pgf@hbox}}}%
+\def\pgf@valigncomptop{\setbox\pgf@hbox=\hbox{\lower\ht\pgf@hbox\box\pgf@hbox}}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcomp-version-1-18.sty b/graphics/pgf/base/tex/pgfcomp-version-1-18.sty
new file mode 100644
index 0000000000..470868e793
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcomp-version-1-18.sty
@@ -0,0 +1,29 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfcomp-version-1-18.sty}
+
+\def\pgfsetshapeinnerxsep#1{\pgfset{inner xsep=#1}}
+\def\pgfsetshapeinnerysep#1{\pgfset{inner ysep=#1}}
+\def\pgfsetshapeouterxsep#1{\pgfset{outer xsep=#1}}
+\def\pgfsetshapeouterysep#1{\pgfset{outer ysep=#1}}
+\def\pgfsetshapeminwidth#1{\pgfset{minimum width=#1}}
+\def\pgfsetshapeminheight#1{\pgfset{minimum height=#1}}
+
+\def\pgfshapeinnerxsep{\pgfkeysvalueof{/pgf/inner xsep}}
+\def\pgfshapeinnerysep{\pgfkeysvalueof{/pgf/inner ysep}}
+\def\pgfshapeouterxsep{\pgfkeysvalueof{/pgf/outer xsep}}
+\def\pgfshapeouterysep{\pgfkeysvalueof{/pgf/outer ysep}}
+\def\pgfshapeminwidth{\pgfkeysvalueof{/pgf/minimum width}}
+\def\pgfshapeminheight{\pgfkeysvalueof{/pgf/minimum height}}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcore.code.tex b/graphics/pgf/base/tex/pgfcore.code.tex
new file mode 100644
index 0000000000..e1dda6194d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcore.code.tex
@@ -0,0 +1,38 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesPackageRCS{pgfcore.code.tex}
+
+\newif\ifpgf@draftmode
+\def\pgf@typeout{\immediate\write0}
+
+\input pgfmath.code.tex
+\input pgfint.code.tex
+
+\input pgfcorepoints.code.tex
+\input pgfcorepathconstruct.code.tex
+\input pgfcorepathusage.code.tex
+\input pgfcorescopes.code.tex
+\input pgfcoregraphicstate.code.tex
+\input pgfcoretransformations.code.tex
+\input pgfcorequick.code.tex
+\input pgfcoreobjects.code.tex
+\input pgfcorepathprocessing.code.tex
+\input pgfcorearrows.code.tex
+\input pgfcoreshade.code.tex
+\input pgfcoreimage.code.tex
+\input pgfcorelayers.code.tex
+\input pgfcoretransparency.code.tex
+\input pgfcorepatterns.code.tex
+\input pgfcorerdf.code.tex
+
+\pgfutil@ifundefined{pgf@texdist@protect}{%
+ \def\pgf@texdist@protect{}%
+}{}
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcore.sty b/graphics/pgf/base/tex/pgfcore.sty
new file mode 100644
index 0000000000..67ad19b741
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcore.sty
@@ -0,0 +1,19 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{graphicx}
+\RequirePackage{pgfsys}
+\RequirePackage{keyval}
+\RequirePackage{xcolor}
+
+\def\pgf@texdist@protect{\protect}%
+
+\input{pgfcore.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcore.tex b/graphics/pgf/base/tex/pgfcore.tex
new file mode 100644
index 0000000000..590120a96c
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcore.tex
@@ -0,0 +1,23 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\ifx\pgfcoreincluded\undefined
+\def\pgfcoreincluded{}
+
+\edef\pgfcoreatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfsys.tex
+\input pgfcore.code.tex
+\catcode`\@=\pgfcoreatcode
+
+\fi
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorearrows.code.tex b/graphics/pgf/base/tex/pgfcorearrows.code.tex
new file mode 100644
index 0000000000..843a8cd23f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorearrows.code.tex
@@ -0,0 +1,1253 @@
+% Copyright 2006, 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorearrows.code.tex}
+
+
+
+% Define a new (meta) arrow or a shorthand
+%
+% #1 = key--value pairs
+%
+% Description:
+%
+% This command is used to define a new arrow tip kind. For more
+% details on the description of the keys, please see the pgfmanual.
+%
+% name = Name of the arrow. If the name contains a dash
+% (hyphen), the text before the hyphen is the start name
+% and the text behind it the end name.
+%
+% means = If set, none of the below options may be
+% given. The effect is that whenever the arrow is
+% used, it gets replaced by this "text", which is
+% parsed by the parser.
+%
+% setup code = Code that does "precomputations". These will be
+% executed only once for each combination of the
+% dependencies. At the end of this code, you can use
+% \savethe and \save to "save" computed values, which
+% will then be available inside the "code". Values needed
+% only for the "... end" keys and the convex hull do not
+% need to be saved since these are also executed only
+% once.
+% drawing code = Code for drawing the arrow. When the cache key is set to
+% true, which is the default, the code will be protocolled
+% and the resulting code is inserted using \pgflowlevelobj.
+% cache = Boolean that decides whether the arrow can be cached. The
+% default is true, so you have to say cache=false to switch
+% caching off. In this case, each time the arrow is drawn,
+% its code is simply executed. This allows you to put things
+% like text or shadings in arrow tips.
+% bending mode = Can be set to "orthogonal", "polar", or
+% "none". Defaults to "orthogonal".
+% defaults = A list of "default" options for the arrow tip. These
+% are executed as if they were given to the arrow tip in
+% brackets. This is useful for setting up default values.
+% parameters = A list of comma-separated macro names on whose values
+% the appearance of the arrow tip depends. When an arrow
+% tip is used, these macros are expanded. If an
+% arrow tip was already installed with the same macro
+% names (and caching is true), the cached code is
+% used. Note that when you use dimensions here, add \the.
+%
+% Inside the setup code, the following macros are available:
+%
+% \pgfarrowssettipend
+% The code should draw an arrow pointing "right along the x
+% axis". The "tip" key specifies how far the arrow goes
+% along the x axis, that is, it should be the x coordinate
+% of the very tip of the arrow. In previous versions this
+% was called the "right extend". The value passed to this
+% key should be some code that sets the dimension
+% "\pgfarrowresult", which is \let to be equal to
+% \pgf@x. A \relax will be added after the code provided
+% here, so you can write things like "\pgfarrowresult=1pt".
+% \pgfarrowssetbackend
+% The leftmost x-coordinate that is still part of the
+% arrow tip (the "back end" of the arrow"). This coordinate
+% will be used when multiple arrow tips are
+% composed. Defaults to 0pt.
+% \pgfarrowssetlineend
+% The x-coordinate where a line should stop inside the arrow
+% tip so that it gets "obscured" by the arrow. Defaults to 0pt.
+% \pgfarrowssetvisualtipend
+% When the arrow tip is drawn in flex mode, it is rotated
+% such that the x-coordinates of "visual tip end" and "visual
+% back end" lie on the path. Defaults to \pgfarrowssettipend.
+% \pgfarrowssetvisualbackend
+% See above. Defaults to \pgfarrowssetbackend
+
+\def\pgfdeclarearrow#1{%
+ \let\pgf@decl@arrow@defaults\pgfutil@empty%
+ \let\pgf@decl@arrow@means\relax%
+ \let\pgf@decl@arrow@code\relax%
+ \pgfkeys{/pgf/@arrows decl/.cd,
+ name=,
+ setup code=,
+ cache=true,
+ bending mode=orthogonal,
+ parameters=,%
+ #1%
+ }%
+ \ifx\pgf@decl@arrow@name@end\pgfutil@empty%
+ \pgferror{Declaring unnamed arrow}%
+ \else%
+ \pgf@arrow@letter{name@end}%
+ \pgf@arrow@letter{name@start}%
+ \expandafter\let\csname pgf@ar@start@\pgf@decl@arrow@name@start\endcsname\pgf@decl@arrow@name@end%
+ \expandafter\let\expandafter\pgf@old@code\csname pgf@ar@code@\pgf@decl@arrow@name@end\endcsname%
+ \expandafter\let\expandafter\pgf@old@means\csname pgf@ar@means@\pgf@decl@arrow@name@end\endcsname%
+ \ifx\pgf@decl@arrow@code\relax%
+ \ifx\pgf@decl@arrow@means\relax%
+ \pgferror{You must set either the 'means' or the drawing code' keys for arrow tip '\pgf@decl@arrow@name@end'}%
+ \else%
+ \ifx\pgf@old@code\relax%
+ \let\pgf@arrow@tip@sequence\pgfutil@empty%
+ \let\pgf@arrow@translate\relax%
+ \expandafter\let\expandafter\pgf@arrows@direct\csname pgf@arrows@direct@name@end@\pgf@decl@arrow@means\endcsname%
+ \ifx\pgf@arrows@direct\relax%
+ \let\pgf@arrows@options\pgfutil@empty%
+ \expandafter\pgfarrows@initial@parser\pgf@decl@arrow@means[]\pgf@stop%
+ \else%
+ \let\pgf@arrow@tip@sequence\pgf@arrows@direct%
+ \fi%
+ \pgf@arrow@letter@\pgf@arrow@tip@sequence{means}%
+ \expandafter\let\csname pgf@ar@code@\pgf@decl@arrow@name@end\endcsname\relax%
+ \else%
+ \pgferror{Arrow tip '\pgf@decl@arrow@name@end' was already
+ defined with key 'drawing code' previously and you cannot change this}%
+ \fi%
+ \fi%
+ \else%
+ \ifx\pgf@decl@arrow@means\relax%
+ \ifx\pgf@old@means\relax%
+ \pgf@arrow@letter{code}%
+ \pgf@arrow@letter{defaults}%
+ \pgf@arrow@letter{setup}%
+ \pgf@arrow@letter{bending@mode}%
+ \pgf@arrow@letter{par}%
+ \expandafter\let\csname pgf@ar@do@cache@\pgf@decl@arrow@name@end\endcsname\pgf@decl@arrow@cache%
+ \else%
+ \pgferror{Arrow tip '\pgf@decl@arrow@name@end' was already
+ defined with key 'means' previously and you cannot change this}%
+ \fi%
+ \else%
+ \pgferror{You cannot set both the 'means' and also the 'drawing code'
+ keys for arrow tip '\pgf@decl@arrow@name@end'}%
+ \fi%
+ \fi%
+ \fi%
+}
+
+\def\pgf@arrow@letter#1{%
+ \expandafter\pgf@arrow@letter@\expandafter{\csname pgf@decl@arrow@#1\endcsname}{#1}%
+}
+\def\pgf@arrow@letter@#1#2{%
+ \expandafter\let\csname pgf@ar@#2@\pgf@decl@arrow@name@end\endcsname#1%
+}
+
+\pgfkeys{
+ /pgf/@arrows decl/.cd,
+ name/.code={%
+ \pgfutil@in@-{#1}%
+ \ifpgfutil@in@%
+ \pgf@arrows@name@decomp#1\pgf@stop%
+ \else%
+ \def\pgf@decl@arrow@name@end{#1}\let\pgf@decl@arrow@name@start\pgf@decl@arrow@name@end%
+ \fi},
+ means/.store in=\pgf@decl@arrow@means,
+ setup code/.store in=\pgf@decl@arrow@setup,
+ drawing code/.store in=\pgf@decl@arrow@code,
+ cache/.store in=\pgf@decl@arrow@cache,
+ bending mode/.is choice,
+ bending mode/none/.code=\let\pgf@decl@arrow@bending@mode\pgfutil@empty,
+ bending mode/orthogonal/.code=\def\pgf@decl@arrow@bending@mode{\pgfpointcurvilinearbezierorthogonal},
+ bending mode/polar/.code=\def\pgf@decl@arrow@bending@mode{\pgfpointcurvilinearbezierpolar},
+ parameters/.store in=\pgf@decl@arrow@par,
+ defaults/.code={%
+ \let\pgf@arrows@options\pgfutil@empty%
+ \pgfkeys{/pgf/arrow keys/.cd,#1}%
+ \let\pgf@decl@arrow@defaults\pgf@arrows@options%
+ }
+}
+
+\def\pgf@arrows@name@decomp#1-#2\pgf@stop{%
+ \def\pgf@decl@arrow@name@start{#1}%
+ \def\pgf@decl@arrow@name@end{#2}%
+}
+
+
+% Handler for defining arrow tips:
+%
+% Description:
+%
+% When you write "my name/.tip = arrow spec", this has the same
+% effect as writing \pgfdeclarearrow{name = my name, means = arrow spec}.
+
+\pgfkeys{/handlers/.tip/.code=%
+ \expandafter\expandafter\expandafter\pgf@arrows@unravel\pgfkeyscurrentpath/\pgf@stop%
+ \expandafter\pgf@arrows@key@call\expandafter{\pgf@arrows@unravelled}{#1}}
+\def\pgf@arrows@unravel#1/{\pgfutil@ifnextchar\pgf@stop{\def\pgf@arrows@unravelled{#1}\pgfutil@gobble}{\pgf@arrows@unravel}}
+\def\pgf@arrows@key@call#1#2{\pgfdeclarearrow{name={#1},means={#2}}}
+
+
+
+
+% Draw an arrow
+%
+% #1 = arrow specification
+%
+% Description:
+%
+% Draws the arrow in the given specification (and "end"
+% specification). The arrow will be drawn such that it touches the
+% origin "from the left", that is, the arrow will lie completely in
+% the half plane with negative $x$ values and the tip will end exactly
+% at the origin.
+
+\def\pgfarrowdraw#1{%
+ {%
+ \pgfsetarrowsend{#1}%
+ \pgf@arrow@compute@shortening\pgf@end@tip@sequence%
+ \pgf@arrow@draw@arrow\pgf@end@tip@sequence\pgf@xb%
+ }%
+}
+
+
+
+% Compute the length of an arrow
+%
+% #1 = arrow specification
+%
+% Description:
+%
+% In \pgf@x, this will return the total length of the arrow given as
+% #1, in \pgf@xa it will return the distance from the tip to the line
+% end.
+
+\def\pgfarrowtotallength#1{%
+ {%
+ \pgfsetarrowsend{#1}%
+ \pgf@arrow@compute@shortening\pgf@end@tip@sequence%
+ \expandafter\expandafter\expandafter%
+ }%
+ \expandafter\expandafter\expandafter\pgf@x\expandafter\the\expandafter\pgf@xb\expandafter\pgf@xa\the\pgf@xa%
+}
+
+
+
+
+
+% Sets the end arrow tip
+%
+% #1 = An arrow specification
+%
+% Description:
+%
+% An "arrow specification" is a sequence of names of meta arrow tips
+% together with options in brackets. In detail:
+%
+% In #1, consider the text from the start up to the first bracket. If
+% this text is the name of a (meta) arrow tip, we use this arrow tip
+% with the provided options. If it is the name of a arrow tip
+% shorthand, this shorthand is expanded and the options are applied to
+% each arrow tip inside the shorthand. If the text is neither or the
+% above, the first letter of text is treated as a shorthand without
+% options.
+%
+% The special arrow tip "." is used to indicate the end of the line.
+%
+% \pgfsetarrowsend{stealth[reversed]}
+% \pgfsetarrowsend{stealth[length=1pt] . stealth[length=2pt]}
+% \pgfsetarrowsend{>>>}
+% \pgfsetarrowsend{>.>}
+
+\def\pgfsetarrowsend#1{%
+ \let\pgf@arrow@tip@sequence\pgfutil@empty%
+ \pgf@arrows@translatefalse%
+ \expandafter\let\expandafter\pgf@arrows@direct\csname pgf@arrows@direct@name@end@#1\endcsname%
+ \ifx\pgf@arrows@direct\relax%
+ \edef\pgf@marshal{\noexpand\pgfarrows@initial@parser#1[]\noexpand\pgf@stop}%
+ \pgf@marshal%
+ \else%
+ \let\pgf@arrow@tip@sequence\pgf@arrows@direct%
+ \fi%
+ \let\pgf@end@tip@sequence\pgf@arrow@tip@sequence%
+}
+
+\newif\ifpgf@arrows@translate
+
+\def\pgfarrows@initial@parser{%
+ \pgfutil@ifnextchar[\pgfarrows@initial@parser@{\pgfarrows@initial@parser@[]}}%}
+
+\def\pgfarrows@initial@parser@[#1]{%
+ \let\pgf@arrows@options\pgfutil@empty%
+ \pgfkeys{/pgf/arrow keys/.cd,#1}%
+ \let\pgf@arrows@options@initial\pgf@arrows@options%
+ \pgfarrows@parser%
+}
+
+\def\pgfarrows@parser#1[{%
+ \pgfkeys@spdef\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \let\pgf@next\pgf@arrows@empty%
+ \else%
+ \ifx\pgf@temp\pgf@dot@text%
+ \let\pgf@next\pgf@arrows@dot@parsed%
+ \else%
+ \let\pgf@untranslated\pgf@temp%
+ \ifpgf@arrows@translate%
+ \pgf@arrow@swapper%
+ \fi%
+ % Now, let's see what we do with this...
+ \expandafter\ifx\csname pgf@ar@code@\pgf@temp\endcsname\relax
+ \expandafter\ifx\csname pgf@ar@means@\pgf@temp\endcsname\relax
+ % #1 should start with a single-char shorthands
+ \let\pgf@next\pgf@arrows@single@char@parser%
+ \let\pgf@temp\pgf@untranslated%
+ \else%
+ % #1 is a shorthand!
+ \let\pgf@next\pgf@arrows@shorthand@parsed%
+ \fi%
+ \else%
+ % #1 is a meta arrow!
+ \let\pgf@next\pgf@arrows@meta@parsed%
+ \fi%
+ \fi%
+ \fi%
+ \expandafter\pgf@next\pgf@temp[%
+}
+
+\def\pgf@arrows@empty[#1]{%
+ \pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
+}
+
+\def\pgf@arrows@single@char@parser#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@dot@text%
+ \let\pgf@next\pgf@arrows@dot@parsed%
+ \else%
+ \let\pgf@untranslated\pgf@temp%
+ \ifpgf@arrows@translate%
+ \pgf@arrow@swapper%
+ \fi%
+ \expandafter\ifx\csname pgf@ar@code@\pgf@temp\endcsname\relax
+ \expandafter\ifx\csname pgf@ar@means@\pgf@temp\endcsname\relax
+ \let\pgf@temp\pgf@untranslated%
+ \let\pgf@next\pgf@arrows@unknown%
+ \else%
+ \let\pgf@next\pgf@arrows@shorthand@parsed%
+ \fi%
+ \else%
+ \let\pgf@next\pgf@arrows@meta@parsed%
+ \fi
+ \fi
+ \expandafter\pgf@next\pgf@temp[]%
+}
+\def\pgf@arrows@unknown#1[]#2[#3]{%
+ \pgferror{Unknown arrow tip kind '#1#2'}%
+}
+
+\def\pgf@arrows@meta@parsed#1[#2]{%
+ % Ok, run the keys #2. This will add commands to \pgf@arrows@options:
+ %
+ \let\pgf@arrows@options\pgf@arrows@options@initial%
+ \pgfkeys{/pgf/arrow keys/.cd,#2}%
+ % Append the arrow and its options to the arrow tip sequence:
+ \expandafter\pgf@arrows@meta@set\expandafter{\pgf@arrows@options}{#1}{\pgf@arrow@handle}%
+ \pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
+}
+
+\def\pgf@arrows@parser@done#1{%
+}
+
+\def\pgf@arrows@dot@parsed#1[#2]{%
+ \pgf@arrows@append@to@tips{\pgf@arrow@handle@dot}%
+ \pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
+}
+
+\def\pgf@arrows@meta@set#1#2#3{%
+ \pgf@arrows@append@to@tips{#3{#2}{#1}}%
+}
+\def\pgf@arrows@append@to@tips#1{%
+ \let\pgf@tempa\pgf@arrow@tip@sequence%
+ \def\pgf@tempb{#1}%
+ \ifpgf@arrows@translate%
+ \let\pgf@tempa\pgf@tempb%
+ \let\pgf@tempb\pgf@arrow@tip@sequence%
+ \fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@arrow@tip@sequence%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@tempa\pgf@tempb}%
+}
+
+\def\pgf@arrows@shorthand@parsed#1[#2]{%
+ \let\pgf@arrows@options\pgf@arrows@options@initial%
+ \pgfkeys{/pgf/arrow keys/.cd,#2}%
+ \ifx\pgf@arrows@options\pgfutil@empty%
+ \expandafter\pgf@arrows@append@to@tips\expandafter{%
+ \expandafter\pgf@arrow@handle@shorthand@empty\expandafter{\csname pgf@ar@means@#1\endcsname}}%
+ \else%
+ \expandafter\expandafter\expandafter\pgf@arrows@meta@set\expandafter\expandafter\expandafter{%
+ \expandafter\pgf@arrows@options\expandafter}\expandafter{\csname pgf@ar@means@#1\endcsname}{\pgf@arrow@handle@shorthand}%
+ \fi%
+ \pgfutil@ifnextchar\pgf@stop\pgf@arrows@parser@done\pgfarrows@parser%
+}
+
+
+% General handler:
+
+\def\pgf@arrow@handle@shorthand@empty#1{#1}
+
+\def\pgf@arrow@handle@shorthand#1#2{%
+ \def\pgf@temp@opt{#2}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@arrows@nested@options@temp%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@temp@opt\pgf@arrows@nested@options}%
+ \expandafter\let\expandafter\pgf@arrows@nested@options\expandafter\pgf@arrows@nested@options@temp%
+ \expandafter#1% all these expandafters to avoid creating groups, but having the options nest
+ \expandafter\def\expandafter\pgf@arrows@nested@options\expandafter{\pgf@arrows@nested@options}%
+}
+
+\let\pgf@arrows@nested@options\pgfutil@empty
+
+
+
+
+% Sets the start arrow tip
+%
+% #1 = An arrow specification
+%
+% Description:
+%
+% This works like \pgfsetarrowsend, only the order of the tips in the
+% arrow specification is reversed and the "reversed names" are used.
+%
+% \pgfsetarrowsend{<<}
+% \pgfsetarrowsend{>.>}
+
+\def\pgfsetarrowsstart#1{%
+ \let\pgf@arrow@tip@sequence\pgfutil@empty%
+ \pgf@arrows@translatetrue%
+ \expandafter\let\expandafter\pgf@arrows@direct\csname pgf@arrows@direct@name@start@#1\endcsname%
+ \ifx\pgf@arrows@direct\relax%
+ \edef\pgf@marshal{\noexpand\pgfarrows@initial@parser#1[]\noexpand\pgf@stop}%
+ \pgf@marshal%
+ \else%
+ \let\pgf@arrow@tip@sequence\pgf@arrows@direct%
+ \fi%
+ \let\pgf@start@tip@sequence\pgf@arrow@tip@sequence%
+}
+
+\def\pgf@arrow@swapper{%
+ \expandafter\let\expandafter\pgf@temp\csname pgf@ar@start@\pgf@temp\endcsname%
+ \ifx\pgf@temp\relax%
+ \def\pgf@temp{undefined}%
+ \fi%
+}
+
+\let\pgf@start@tip@sequence\pgfutil@empty
+\let\pgf@end@tip@sequence\pgfutil@empty
+
+
+\expandafter\def\csname pgf@arrows@direct@name@start@\endcsname{}
+\expandafter\def\csname pgf@arrows@direct@name@end@\endcsname{}
+
+
+% Predefined lengths and ifs
+
+\newdimen\pgfarrowsep
+
+\newif\ifpgfarrowswap
+\newif\ifpgfarrowreversed
+\newif\ifpgfarrowharpoon
+\newif\ifpgfarrowopen
+
+\let\pgf@arrows@stroke@color\pgfutil@empty
+\let\pgf@arrows@fill@color\pgfutil@empty
+
+\def\pgfarrows@length@scale{1}
+\def\pgfarrows@width@scale{1}
+\def\pgfarrows@slant{0}
+
+\let\pgfarrows@scale@list\pgfutil@empty
+\def\pgfarrowsaddtolengthscalelist#1{\expandafter\def\expandafter\pgfarrows@scale@list\expandafter{\pgfarrows@scale@list#1\pgfarrows@length@scale#1}}
+\def\pgfarrowsaddtowidthscalelist#1{\expandafter\def\expandafter\pgfarrows@scale@list\expandafter{\pgfarrows@scale@list#1\pgfarrows@width@scale#1}}
+
+\pgfkeys{
+ /pgf/arrow keys/.cd,
+ scale/.code={%
+ \pgfmathparse{#1}%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@length@scale\expandafter{\pgfmathresult}}%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@width@scale\expandafter{\pgfmathresult}}%
+ },
+ scale length/.code={\pgfmathparse{#1}\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@length@scale\expandafter{\pgfmathresult}}},
+ scale width/.code={\pgfmathparse{#1}\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@width@scale\expandafter{\pgfmathresult}}},
+ slant/.code={\pgfmathparse{#1}\expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrows@slant\expandafter{\pgfmathresult}}},
+ sep/.code={
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters\pgfarrowsep\pgf@x}%
+ },
+ sep/.default=0.88pt .3 1,
+ %
+ swap/.code=\pgfarrowsaddtooptions{\ifpgfarrowswap\pgfarrowswapfalse\else\pgfarrowswaptrue\fi},
+ reversed/.code=\pgfarrowsaddtooptions{\ifpgfarrowreversed\pgfarrowreversedfalse\else\pgfarrowreversedtrue\fi},
+ harpoon/.is choice,
+ harpoon/.default=true,
+ harpoon/true/.code=\pgfarrowsaddtooptions{\pgfarrowharpoontrue},
+ harpoon/false/.code=\pgfarrowsaddtooptions{\pgfarrowharpoonfalse},
+ left/.style={harpoon},
+ right/.style={harpoon,swap},
+ %
+ color/.code=\pgfarrowsaddtooptions{\def\pgf@arrows@stroke@color{#1}},
+ fill/.code={%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@nonetext%
+ \pgfarrowsaddtooptions{\pgfarrowopentrue}
+ \else
+ \pgfarrowsaddtooptions{\pgfarrowopenfalse\def\pgf@arrows@fill@color{#1}}
+ \fi
+ },
+ fill/.value required,
+ open/.style={fill=none},
+ .unknown/.code={
+ \expandafter\pgfutil@in@\expandafter!\expandafter{\pgfkeyscurrentname}%
+ \ifpgfutil@in@%
+ % this is a color!
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgf@arrows@stroke@color\expandafter{\pgfkeyscurrentname}}%
+ \else%
+ \pgfutil@doifcolorelse{\pgfkeyscurrentname}
+ {%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgf@arrows@stroke@color\expandafter{\pgfkeyscurrentname}}%
+ }
+ {%
+ \edef\pgf@temp{\pgfkeyscurrentname}%
+ \pgfkeys{/errors/unknown key/.expand once=\expandafter{\pgf@temp}{#1}}%
+ }
+ \fi
+ }
+}
+\def\pgf@nonetext{none}
+
+\def\pgfarrowsaddtooptions#1{\expandafter\def\expandafter\pgf@arrows@options\expandafter{\pgf@arrows@options#1}}
+\def\pgfarrowsaddtolateoptions#1{\expandafter\def\expandafter\pgf@arrows@options\expandafter{\pgf@arrows@options\pgf@arrows@add@to@late@options{#1}}}
+\def\pgf@arrows@add@to@late@options#1{\expandafter\def\expandafter\pgf@arrows@late@options\expandafter{\pgf@arrows@late@options#1}}
+
+
+
+\def\pgfarrowsthreeparameters#1{%
+ \pgfarrowsthreeparameters@#1 +0 +0 +0 \pgf@stop%
+}
+\def\pgfarrowsthreeparameters@#1 #2 #3 #4\pgf@stop{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgfmathsetmacro\pgf@temp@a{#2}%
+ \pgfmathsetmacro\pgf@temp@b{#3}%
+ \edef\pgfarrowstheparameters{{\the\pgf@x}{\pgf@temp@a}{\pgf@temp@b}}%
+}
+
+\def\pgfarrowsfourparameters#1{%
+ \pgfarrowsfourparameters@#1 +0 +0 +0 \pgf@stop%
+}
+\def\pgfarrowsfourparameters@#1:#2 #3 #4 #5\pgf@stop{%
+ \pgfmathsetmacro\pgf@temp@z{#1}%
+ \pgfmathsetlength\pgf@x{#2}%
+ \pgfmathsetmacro\pgf@temp@a{#3}%
+ \pgfmathsetmacro\pgf@temp@b{#4}%
+ \edef\pgfarrowstheparameters{{\pgf@temp@z}{\the\pgf@x}{\pgf@temp@a}{\pgf@temp@b}}%
+}
+
+\def\pgfarrows@angle@setup#1#2#3#4{%
+ \pgfarrowslinewidthdependent{#2}{#3}{#4}
+ \pgf@xc\pgf@x
+ \pgf@yc#1 pt%
+ \pgf@yc.5\pgf@yc%
+ \pgfpointpolar{\pgf@yc}{\pgf@xc}
+ \pgfarrowlength\pgf@x%
+ \pgf@y2\pgf@y%
+ \expandafter\pgf@arrows@add@to@late@options\expandafter{\expandafter\pgfarrowwidth\the\pgf@y}%
+}
+
+\def\pgfarrows@angle@setup@prime#1{%
+ \pgf@yc#1 pt %
+ \pgf@yc=0.5\pgf@yc
+ \pgfmathtan@{\pgf@sys@tonumber\pgf@yc}%
+ \pgfarrowwidth\pgfmathresult\pgfarrowlength%
+ \pgfarrowwidth2\pgfarrowwidth%
+}
+
+\def\pgfarrowslinewidthdependent#1#2#3{%
+ \pgf@x#1%
+ \ifdim\pgfinnerlinewidth>0pt%
+ \pgf@arrows@inner@line@width@dep{#2}{#3}%
+ \else%
+ \advance\pgf@x by#2\pgflinewidth%
+ \fi%
+}
+\def\pgf@arrows@inner@line@width@dep#1#2{%
+ % #1*((1-#2/2)*full line width - (#2/2) * inner line width)
+ % Compute "real" line width
+ \pgf@xa\pgflinewidth%
+ \pgf@xb-.5\pgflinewidth%
+ \pgf@xb#2\pgf@xb%
+ \advance\pgf@xa by\pgf@xb%
+ \pgf@xb\pgfinnerlinewidth%
+ \pgf@xb-.5\pgf@xb
+ \advance\pgf@xa by#2\pgf@xb%
+ \advance\pgf@x by#1\pgf@xa%
+}
+
+
+\def\pgfarrowslengthdependent#1#2#3#4{%
+ #4#1%
+ \advance#4by#2\pgfarrowlength%
+ \advance#4by#3\pgflinewidth%
+}
+
+
+
+% Build the full name:
+
+\def\pgf@arrow@fullname#1{pgf@@ar@#1@\the\pgflinewidth @\pgfinnerlinewidth @\ifpgfarrowreversed r\fi @\pgf@arrows@stroke@color @\pgf@arrows@fill@color @\csname pgf@ar@par@#1\endcsname}
+\def\pgf@arrow@id@count{0}%
+
+% Compute the arrow id of an arrow
+%
+% #1 = arrow name
+% #2 = options
+%
+% Description:
+%
+% Returns the an id in \pgf@arrow@id that identifies the instantiation
+% of the given arrow. If the arrow was not instantiated, this happens now.
+
+\def\pgfarrows@getid#1#2{%
+ % Execute options:
+ \let\pgf@arrows@late@options\pgfutil@empty%
+ % 1. Defaults:
+ \csname pgf@ar@defaults@#1\endcsname%
+ % 2. Scope:
+ \pgf@arrows@options@scope
+ % 3. Local:
+ #2\relax%
+ % 4. Nested:
+ \pgf@arrows@nested@options%
+ % 5. Last options:
+ \pgf@arrows@late@options%
+ % 6. Scaling:
+ \pgfarrows@scale@list%
+ % Now, test:
+ \expandafter\global\expandafter\let\expandafter\pgf@arrow@id\csname\pgf@arrow@fullname{#1}\endcsname\relax%
+ \ifx\pgf@arrow@id\relax%
+ \pgf@arrows@instantiate{#1}
+ \fi%
+}
+
+\def\pgf@arrows@instantiate#1{%
+ % Not defined. Rats!
+ % Allocate new id:
+ \pgfutil@tempcnta\pgf@arrow@id@count\relax%
+ \advance\pgfutil@tempcnta by1\relax%
+ \xdef\pgf@arrow@id@count{\the\pgfutil@tempcnta}%
+ \expandafter\global\expandafter\let\csname\pgf@arrow@fullname{#1}\endcsname\pgf@arrow@id@count%
+ \global\let\pgf@arrow@id\pgf@arrow@id@count%
+ {%
+ \pgfclearid%
+ \csname pgf@ar@setup@#1\endcsname%
+ % Handle reversal
+ \ifpgfarrowreversed%
+ % Compute transformation:
+ \pgf@arrows@handle@reverse%
+ \fi%
+ % Save computed values
+ \expandafter\global\expandafter\let\csname pgf@ar@saves@\pgf@arrow@id\endcsname\pgf@arrows@saves%
+ \expandafter\global\expandafter\let\csname pgf@ar@hull@\pgf@arrow@id\endcsname\pgf@arrows@convexhull%
+ \expandafter\xdef\csname pgf@ar@ends@\pgf@arrow@id\endcsname{{\pgf@arrows@the@tipend}{\pgf@arrows@the@backend}{\pgf@arrows@the@lineend}}%
+ \expandafter\xdef\csname pgf@ar@visual@\pgf@arrow@id\endcsname{{\pgf@arrows@the@visualtipend}{\pgf@arrows@the@visualbackend}{}}%
+ % Save code (needed for bending)
+ \edef\pgf@arrow@code{%
+ \ifpgfarrowreversed\noexpand\pgftransformxscale{-1}\fi%
+ \expandafter\noexpand\csname pgf@ar@code@#1\endcsname%
+ }%
+ \expandafter\global\expandafter\let\csname pgf@ar@inst@code@\pgf@arrow@id\endcsname\pgf@arrow@code%
+ % Should we cache?
+ \expandafter\ifx\csname pgf@ar@do@cache@#1\endcsname\pgf@truetext%
+ \pgfsysprotocol@getcurrentprotocol\pgf@arrow@temp%
+ {%
+ \pgfinterruptpath%
+ \let\pgfusepath=\pgf@nousepath@here%
+ \pgf@relevantforpicturesizefalse%
+ \pgftransformreset%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfscope%
+ \pgf@arrow@code%
+ \endpgfscope%
+ \pgfsysprotocol@getcurrentprotocol\pgf@@arrow@temp%
+ \expandafter\gdef\expandafter\pgf@arrow@code\expandafter{\expandafter\pgfsysprotocol@literal\expandafter{\pgf@@arrow@temp}}%
+ \endpgfinterruptpath%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgf@arrow@temp%
+ \fi%
+ \expandafter\global\expandafter\let\csname pgf@ar@cache@\pgf@arrow@id\endcsname\pgf@arrow@code%
+ }%
+}
+\def\pgf@truetext{true}
+
+% Ok, now run setup:
+\def\pgf@arrows@copy@tipend{\pgf@arrows@the@tipend}
+\def\pgf@arrows@copy@backend{\pgf@arrows@the@backend}
+\def\pgf@arrows@copy@lineend{\pgf@arrows@the@lineend}
+\def\pgf@arrows@zeropt{0pt}%
+
+\let\pgf@arrows@saves\pgfutil@empty%
+\let\pgf@arrows@convexhull\pgfutil@empty%
+\let\pgf@arrows@the@tipend\pgf@arrows@zeropt%
+\let\pgf@arrows@the@backend\pgf@arrows@zeropt%
+\let\pgf@arrows@the@lineend\pgf@arrows@zeropt%
+\let\pgf@arrows@the@visualtipend\pgf@arrows@copy@tipend%
+\let\pgf@arrows@the@visualbackend\pgf@arrows@copy@backend%
+
+
+\def\pgf@arrows@handle@reverse{%
+ \pgf@x\pgf@arrows@the@visualtipend\pgf@x-\pgf@x%
+ \pgf@y\pgf@arrows@the@visualbackend\pgf@y-\pgf@y
+ \edef\pgf@arrows@the@visualtipend{\the\pgf@y}%
+ \edef\pgf@arrows@the@visualbackend{\the\pgf@x}%
+ \pgf@x\pgf@arrows@the@tipend\pgf@x-\pgf@x%
+ \pgf@y\pgf@arrows@the@backend\pgf@y-\pgf@y
+ \edef\pgf@arrows@the@tipend{\the\pgf@y}%
+ \edef\pgf@arrows@the@backend{\the\pgf@x}%
+ \pgf@x\pgf@arrows@the@lineend\pgf@x-\pgf@x\edef\pgf@arrows@the@lineend{\the\pgf@x}%
+ \let\pgf@temp\pgf@arrows@convexhull%
+ \let\pgf@arrows@convexhull\pgfutil@empty%
+ \let\pgf@arrow@hull@point\pgf@arrow@hull@point@reverse%
+ \pgf@temp%
+}
+\def\pgf@arrow@hull@point@reverse#1#2{%
+ \pgf@x#1%
+ \pgfarrowshullpoint{-\pgf@x}{#2}%
+}
+
+\def\pgf@nousepath@here#1{\pgferror{The definition of an arrow may not use \string\pgfusepath}}
+
+\def\pgfarrowssavethe#1{%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@arrows@saves%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@arrows@saves\expandafter#1\the#1\relax}
+}
+
+\def\pgfarrowssave#1{%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@arrows@saves%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@arrows@saves\expandafter\def\expandafter#1\expandafter{#1}}
+}
+
+\def\pgfarrowshullpoint#1#2{%
+ \pgf@x#1\relax%
+ \pgf@y#2\relax%
+ \edef\pgf@arrows@temp{\noexpand\pgf@arrows@convexhull\noexpand\pgf@arrow@hull@point{\the\pgf@x}{\the\pgf@y}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@arrows@convexhull\expandafter\expandafter\expandafter{\pgf@arrows@temp}%
+}
+
+\def\pgfarrowsupperhullpoint#1#2{%
+ \pgf@x#1\relax%
+ \pgf@y#2\relax%
+ \ifdim\pgf@y>0pt
+ \edef\pgf@arrows@temp{\noexpand\pgf@arrows@convexhull\noexpand\pgf@arrow@hull@point{\the\pgf@x}{\the\pgf@y}\ifpgfarrowharpoon\else\noexpand\pgf@arrow@hull@point{\the\pgf@x}{-\the\pgf@y}\fi}%
+ \else
+ \edef\pgf@arrows@temp{\noexpand\pgf@arrows@convexhull\noexpand\pgf@arrow@hull@point{\the\pgf@x}{\the\pgf@y}}%
+ \fi
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@arrows@convexhull\expandafter\expandafter\expandafter{\pgf@arrows@temp}%
+}
+
+\def\pgfarrowssettipend#1{\pgf@x#1\edef\pgf@arrows@the@tipend{\the\pgf@x}}
+\def\pgfarrowssetbackend#1{\pgf@x#1\edef\pgf@arrows@the@backend{\the\pgf@x}}
+\def\pgfarrowssetlineend#1{\pgf@x#1\edef\pgf@arrows@the@lineend{\the\pgf@x}}
+\def\pgfarrowssetvisualtipend#1{\pgf@x#1\edef\pgf@arrows@the@visualtipend{\the\pgf@x}}
+\def\pgfarrowssetvisualbackend#1{\pgf@x#1\edef\pgf@arrows@the@visualbackend{\the\pgf@x}}
+
+
+% Internal computation of the line end (shortening) for an arrow
+%
+% #1 = arrow tip list
+%
+% Description:
+%
+% \pgf@xa will contain the necessary path shortening for the given
+% arrow tip list, \pgf@xb will contain the total length of the arrow
+% tip list (sum of the differences between tip end and back end plus
+% the seps).
+
+\def\pgf@arrow@compute@shortening#1{%
+ \let\pgf@arrow@handle\pgf@arrow@compute@shortening@
+ \let\pgf@arrow@handle@dot\pgf@arrow@after@line@endtrue%
+ \pgf@arrow@after@line@endfalse%
+ \pgf@xa0pt%
+ \pgf@xb0pt%
+ #1%
+}
+\newif\ifpgf@arrow@after@line@end
+
+\def\pgf@arrow@compute@shortening@#1#2{%
+ {\pgfarrows@getid{#1}{#2}\ifnum\pgf@arrow@flex@mode>0\relax\global\pgf@precise@shorteningtrue\fi\expandafter}\expandafter\pgf@x\the\pgfarrowsep%
+ \expandafter\expandafter\expandafter\pgf@arrow@cont@short\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+}
+\def\pgf@dot@text{.}
+
+\def\pgf@arrow@cont@short#1#2#3{% tip end, back end, line end, sep
+ \advance\pgf@xb by#1%
+ \pgf@xc#2%
+ \advance\pgf@xb by-\pgf@xc%
+ \advance\pgf@xb by\pgf@x%
+ \ifpgf@arrow@after@line@end%
+ \advance\pgf@xa by#1%
+ \advance\pgf@xa by\pgf@x%
+ \pgf@xc#2%
+ \advance\pgf@xa by-\pgf@xc%
+ \else%
+ \pgf@xa#1%
+ \advance\pgf@xa by\pgf@x%
+ \pgf@xc#3%
+ \advance\pgf@xa by-\pgf@xc%
+ \fi%
+}
+
+
+
+\def\pgf@arrow@rigid@arrow#1#2{%
+ {%
+ \pgf@xb=#2%
+ \pgftransformxshift{-\pgf@xb}%
+ \let\pgf@arrow@handle\pgf@arrow@rigid
+ \let\pgf@arrow@handle@dot\relax%
+ #1%
+ }%
+}
+
+
+\def\pgf@arrow@rigid#1#2{%
+ % Prepare:
+ {%
+ \pgfarrows@getid{#1}{#2}%
+ % Do shift:
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+ % Do slant:
+ \ifdim\pgfarrows@slant pt=0pt%
+ \else%
+ \pgftransformxslant{\pgfarrows@slant}%
+ \fi%
+ % do swap:
+ \ifpgfarrowswap%
+ \pgftransformyscale{-1}%
+ \fi%
+ {%
+ \csname pgf@ar@saves@\pgf@arrow@id\endcsname%
+ \pgf@arrows@rigid@hull%
+ }%
+ \expandafter}%
+ % Transform to next tip:
+ \expandafter\pgftransformxshift\expandafter{\the\pgf@xc}%
+}
+
+
+
+
+% Draw an arrow
+%
+% #1 = arrow tip list
+% #2 = total length of the arrow (the value of \pgf@xb computed by
+% \pgf@arrow@compute@shortening)
+%
+% Description:
+%
+% Draws an arrow tip list. The coordinate system must have been
+% transformed so that the to-be-drawn arrow points right and should
+% "end" at the origin.
+
+\def\pgf@arrow@draw@arrow#1#2{%
+ {%
+ \pgf@xb=#2%
+ \pgftransformxshift{-\pgf@xb}%
+ \let\pgf@arrow@handle\pgf@arrow@drawer
+ \let\pgf@arrow@handle@dot\relax%
+ #1%
+ }%
+}
+
+
+\def\pgf@arrow@drawer#1#2{%
+ % Prepare:
+ {%
+ \pgfarrows@getid{#1}{#2}%
+ % Do shift:
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+ % Do slant:
+ \ifdim\pgfarrows@slant pt=0pt%
+ \else%
+ \pgftransformxslant{\pgfarrows@slant}%
+ \fi%
+ % do swap:
+ \ifpgfarrowswap%
+ \pgftransformyscale{-1}%
+ \fi%
+ {%
+ \csname pgf@ar@saves@\pgf@arrow@id\endcsname%
+ \pgfscope%
+ \pgf@arrows@color@setup%
+ \pgflowlevelsynccm\csname pgf@ar@cache@\pgf@arrow@id\endcsname%
+ \endpgfscope%
+ \pgf@arrows@rigid@hull%
+ }%
+ \expandafter}%
+ % Transform to next tip:
+ \expandafter\pgftransformxshift\expandafter{\the\pgf@xc}%
+}
+
+\def\pgf@arrows@color@setup@restore@std@colors{%
+ % we want to allow 'arrows={fill=pgffillcolor}'. To this end, we have to ensure that \string\color@pgffillcolor is known.
+ % we can safely keep the macro in the current TeX group since it has global character anyway.
+ %
+ % Note that declaring \string\color@pgfstrokecolor as \global macro causes save stack issues and should be avoided.
+ \pgfutil@namelet{\string\color@pgfstrokecolor}{pgf@strokecolor@global}%
+ \pgfutil@namelet{\string\color@pgffillcolor}{pgf@fillcolor@global}%
+ %
+}%
+
+\def\pgf@arrows@color@setup{%
+ \ifx\pgf@arrows@stroke@color\pgfutil@empty\else\pgfsetstrokecolor{\pgf@arrows@stroke@color}\fi%
+ \ifx\pgf@arrows@fill@color\pgfutil@empty%
+ \ifx\pgf@strokecolor@global\pgf@fillcolor@global
+ \else
+ \pgf@arrows@color@setup@restore@std@colors
+ \pgfsetfillcolor{pgfstrokecolor}%
+ \fi%
+ \else%
+ \pgf@arrows@color@setup@restore@std@colors
+ \pgfsetfillcolor{\pgf@arrows@fill@color}%
+ \fi%
+}
+
+\def\pgf@arrow@drawer@shift#1#2#3{% tip end, back end, line end, sep
+ \pgf@xb#2\pgftransformxshift{-\pgf@xb}%
+ \pgf@xc#1%
+ \advance\pgf@xc by\pgfarrowsep%
+ \advance\pgf@xc by-\pgf@xb%
+}
+
+\def\pgf@arrows@rigid@hull{%
+ \ifpgf@relevantforpicturesize%
+ % Do bb update:
+ \expandafter\let\expandafter\pgf@temp\csname pgf@ar@hull@\pgf@arrow@id\endcsname%
+ \ifx\pgf@temp\pgfutil@empty\else%
+ \let\pgf@arrow@hull@point\pgf@arrow@hull@point@first%
+ \pgf@temp%
+ \pgf@arrow@update@bb%
+ \fi%
+ \fi
+}
+
+
+% Convex hull stuff:
+
+\def\pgf@arrow@hull@point@first#1#2{%
+% {\pgfsys@beginscope\pgfpathcircle{\pgfqpoint{#1}{#2}}{0.5pt}\pgfusepathqfill\pgfsys@endscope}%
+ \pgf@x#1\pgf@y#2%
+ \pgf@xa\pgf@pt@aa\pgf@x%
+ \advance\pgf@xa by\pgf@pt@ba\pgf@y%
+ \pgf@ya\pgf@pt@ab\pgf@x%
+ \advance\pgf@ya by\pgf@pt@bb\pgf@y%
+ \pgf@xb\pgf@xa\pgf@yb\pgf@ya%
+ \let\pgf@arrow@hull@point\pgf@arrow@hull@point@other%
+}
+\def\pgf@arrow@hull@point@other#1#2{%
+% {\pgfsys@beginscope\pgfpathcircle{\pgfqpoint{#1}{#2}}{0.5pt}\pgfusepathqfill\pgfsys@endscope}%
+ \pgfutil@tempdima#1\pgfutil@tempdimb#2%
+ \pgf@x\pgf@pt@aa\pgfutil@tempdima%
+ \advance\pgf@x by\pgf@pt@ba\pgfutil@tempdimb%
+ \pgf@y\pgf@pt@ab\pgfutil@tempdima%
+ \advance\pgf@y by\pgf@pt@bb\pgfutil@tempdimb%
+ \ifdim\pgf@x<\pgf@xa\pgf@xa\pgf@x\else\ifdim\pgf@x>\pgf@xb\pgf@xb\pgf@x\fi\fi%
+ \ifdim\pgf@y<\pgf@ya\pgf@ya\pgf@y\else\ifdim\pgf@y>\pgf@yb\pgf@yb\pgf@y\fi\fi%
+}
+
+\def\pgf@arrow@update@bb{%
+ \advance\pgf@xa by\pgf@pt@x%
+ \advance\pgf@ya by\pgf@pt@y%
+ \advance\pgf@xb by\pgf@pt@x%
+ \advance\pgf@yb by\pgf@pt@y%
+ \ifdim\pgf@picmaxx=-16000pt\relax%
+ \global\pgf@picminx\pgf@xa%
+ \global\pgf@picmaxx\pgf@xb%
+ \global\pgf@picminy\pgf@ya%
+ \global\pgf@picmaxy\pgf@yb%
+ \else%
+ \ifdim\pgf@xa<\pgf@picminx\global\pgf@picminx\pgf@xa\fi%
+ \ifdim\pgf@ya<\pgf@picminy\global\pgf@picminy\pgf@ya\fi%
+ \ifdim\pgf@xb>\pgf@picmaxx\global\pgf@picmaxx\pgf@xb\fi%
+ \ifdim\pgf@yb>\pgf@picmaxy\global\pgf@picmaxy\pgf@yb\fi%
+ \fi%
+}
+
+
+
+% Sets arrows
+%
+% #1 = An arrow specification of the form
+% <start spec>-<end spec>. This will call \pgfsetstartarrow{start
+% spec} and \pgfsetendarrow{end spec}.
+%
+% Alternatively, it may be of the form [options]. In this case,
+% the arrow options are set for the local scope and all arrows in
+% the current scope will have these options set.
+%
+% Example:
+%
+% \pgfsetarrows{-to}
+
+\def\pgfsetarrows#1{\pgf@arrows#1\pgf@stop}
+\def\pgf@arrows{\pgfutil@ifnextchar[\pgf@arrows@test@opt\pgf@arrows@}%}
+\def\pgf@arrows@#1-#2\pgf@stop{%
+ \pgfsetarrowsstart{#1}%
+ \pgfsetarrowsend{#2}%
+}
+\def\pgf@arrows@test@opt[{%
+ \pgfutil@ifnextchar-{\pgf@arrows@[}%} go back to normal reading for compat. reasons.
+ \pgf@arrows@test@opt@%
+}
+\def\pgf@arrows@test@opt@#1]{%
+ \pgfutil@ifnextchar\pgf@stop{%
+ \let\pgf@arrows@options\pgf@arrows@options@scope%
+ \pgfkeys{/pgf/arrow keys/.cd,#1}%
+ \let\pgf@arrows@options@scope\pgf@arrows@options%
+ % Ok, setup the options
+ \pgfutil@gobble%
+ }{%
+ \pgf@arrows@[#1]% Oops: go back to normal mode
+ }%
+}
+
+\let\pgf@arrows@options@scope\pgfutil@empty
+
+
+
+
+%
+% Predefined arrows:
+%
+
+
+% A dot is used to indicate the end of the line:
+
+\pgfdeclarearrow{
+ name = .,
+ drawing code =
+}
+
+
+% An underscore adds a space as in >_> or >_ >. However, it will be
+% faster to say ">[sep] >" or ">[sep=2pt] >".
+
+\pgfdeclarearrow{
+ name = _,
+ defaults = {sep},
+ drawing code =
+}
+
+
+
+% Default shorthands:
+
+\pgfdeclarearrow{ name = To, means = } % forward declaration
+\pgfdeclarearrow{ name = Bar, means = } % forward declaration
+\pgfkeys{
+ <-> /.tip = {To},
+ >-< /.tip = {>[reversed]},
+ | /.tip = {Bar}
+}
+
+
+
+% Compatibility with old arrow system:
+
+\pgfkeys {}
+
+\def\pgf@arrows@direct@def#1#2{\expandafter\pgf@arrows@direct@def@\expandafter{\csname pgf@ar@means@#2\endcsname}{#1}}
+\def\pgf@arrows@direct@def@#1#2{\expandafter\def\csname pgf@arrows@direct@name@#2\endcsname{\pgf@arrow@handle@shorthand@empty{#1}}}
+\pgf@arrows@direct@def{start@[}{]}
+\pgf@arrows@direct@def{start@]}{[}
+\pgf@arrows@direct@def{start@spaced [}{spaced ]}
+\pgf@arrows@direct@def{start@spaced ]}{spaced [}
+\pgf@arrows@direct@def{end@[}{[}
+\pgf@arrows@direct@def{end@]}{]}
+\pgf@arrows@direct@def{end@spaced [}{spaced [}
+\pgf@arrows@direct@def{end@spaced ]}{spaced ]}
+
+\def\pgfsetarrowoptions#1#2{\expandafter\def\csname pgf@arrow@compat@opt@#1\endcsname{#2}}
+\def\pgfgetarrowoptions#1{\csname pgf@arrow@compat@opt@#1\endcsname}
+\def\pgfarrowsdeclare#1#2#3#4{%
+ \pgfdeclarearrow{ name ={#1}-{#2}, setup code ={#3}, drawing code={#4}, parameters/.expand once={\csname pgf@arrow@compat@opt@#2\endcsname}}%
+ \expandafter\def\csname pgf@arrow@compat@opt@#2\endcsname{0}}
+\def\pgfarrowsleftextend#1{\pgfmathsetlength\pgf@xa{#1}\pgfarrowssetbackend{\pgf@xa}}
+\def\pgfarrowsrightextend#1{\pgfmathsetlength\pgf@xb{#1}\pgfarrowssettipend{\pgf@xb}}
+\def\pgfarrowsdeclarealias#1#2#3#4{\pgfdeclarearrow{ name ={#1}-{#2}, means ={#4} } }
+\def\pgfarrowsdeclarereversed#1#2#3#4{\pgfdeclarearrow{ name ={#1}-{#2}, means={{#4}[reversed]}}}
+\def\pgfarrowsdeclarecombine{\pgfutil@ifnextchar*{\pgfarrowsdeclarecombine@star}{\pgf@@arrowsdeclarecombine}}
+\def\pgf@@arrowsdeclarecombine{\pgfutil@ifnextchar[{\pgf@arrowsdeclarecombine}{\pgf@arrowsdeclarecombine[0pt]}}
+\def\pgf@arrowsdeclarecombine[#1]#2#3#4#5#6#7{\def\pgf@@temp{#1}\ifx\pgf@@temp\pgf@linewidthtext\def\pgf@@temp{+0pt 1}\fi%
+ \pgfdeclarearrow{name ={#2}-{#3}, means={#5[sep/.expand once=\pgf@@temp]#6}}}
+\def\pgf@linewidth@text{\pgflinewidth}
+\def\pgfarrowsdeclarecombine@star*{\pgfutil@ifnextchar[{\pgf@arrowsdeclarecombine@star}{\pgf@arrowsdeclarecombine@star[0pt]}}
+\def\pgf@arrowsdeclarecombine@star[#1]#2#3#4#5#6#7{\def\pgf@@temp{#1}\ifx\pgf@@temp\pgf@linewidthtext\def\pgf@@temp{+0pt 1}\fi%
+ \pgfdeclarearrow{name ={#2}-{#3}, means={#5[sep/.expand once=\pgf@@temp].#6}}}
+\def\pgfarrowsdeclaredouble{\pgfutil@ifnextchar[{\pgf@arrowsdeclaredouble}{\pgf@arrowsdeclaredouble[0pt]}}
+\def\pgf@arrowsdeclaredouble[#1]#2#3#4#5{\pgfarrowsdeclarecombine[#1]{#2}{#3}{#4}{#5}{#4}{#5}}
+\def\pgfarrowsdeclaretriple{\pgfutil@ifnextchar[{\pgf@arrowsdeclaretriple}{\pgf@arrowsdeclaretriple[0pt]}}
+\def\pgf@arrowsdeclaretriple[#1]#2#3#4#5{ \pgfarrowsdeclarecombine[#1]{pgf@trip@#2}{pgf@trip@#3}{#4}{#5}{#4}{#5}%
+ \pgfarrowsdeclarecombine[#1]{#2}{#3}{pgf@trip@#2}{pgf@trip@#3}{#4}{#5}}
+\def\pgf@linewidthtext{\pgflinewidth}
+
+\pgfarrowsdeclare{stealth}{stealth}
+{
+ \pgfutil@tempdima=0.28pt%
+ \pgfutil@tempdimb=\pgflinewidth%
+ \ifdim\pgfinnerlinewidth>0pt%
+ \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
+ \fi%
+ \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
+ \pgfarrowsleftextend{+-3\pgfutil@tempdima}
+ \pgfarrowsrightextend{+5\pgfutil@tempdima}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \pgfutil@tempdimb=\pgflinewidth%
+ \ifdim\pgfinnerlinewidth>0pt%
+ \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
+ \fi%
+ \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
+ \pgfpathmoveto{\pgfqpoint{5\pgfutil@tempdima}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpointorigin}
+ \pgfpathlineto{\pgfqpoint{-3\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfusepathqfill
+}
+\pgfarrowsdeclarereversed{stealth reversed}{stealth reversed}{stealth}{stealth}
+\pgfarrowsdeclare{to}{to}
+{
+ \pgfutil@tempdima=-0.84pt%
+ \advance\pgfutil@tempdima by-1.3\pgflinewidth%
+ \pgfutil@tempdimb=0.21pt%
+ \advance\pgfutil@tempdimb by.625\pgflinewidth%
+ \pgfarrowsleftextend{+\pgfutil@tempdima}
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetlinewidth{0.8\pgflinewidth}
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-2.75\pgfutil@tempdima}{2.5\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{0.25\pgfutil@tempdima}}
+ {\pgfqpoint{0.75\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfqpoint{0pt}{-0.25\pgfutil@tempdima}}
+ {\pgfqpoint{-2.75\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}
+ {\pgfqpoint{-3\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}
+\pgfkeys{To /.tip = to}
+\pgfarrowsdeclare{to reversed}{to reversed}
+{
+ \pgfutil@tempdima=-0.21pt%
+ \advance\pgfutil@tempdima by-0.475\pgflinewidth%
+ \pgfutil@tempdimb=0.98pt%
+ \advance\pgfutil@tempdimb by1.45\pgflinewidth%
+ \pgfarrowsleftextend{+\pgfutil@tempdima}
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetlinewidth{+0.8\pgflinewidth}
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{3.5\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{3.25\pgfutil@tempdima}{2.5\pgfutil@tempdima}}
+ {\pgfqpoint{0.5\pgfutil@tempdima}{0.25\pgfutil@tempdima}}
+ {\pgfqpoint{-0.25\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{0.5\pgfutil@tempdima}{-0.25\pgfutil@tempdima}}
+ {\pgfqpoint{3.25\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}
+ {\pgfqpoint{3.5\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}
+\pgfarrowsdeclare{latex}{latex}
+{
+ \pgfutil@tempdima=0.28pt%
+ \pgfutil@tempdimb=\pgflinewidth%
+ \ifdim\pgfinnerlinewidth>0pt%
+ \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
+ \fi%
+ \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
+ \pgfarrowsleftextend{+-1\pgfutil@tempdima}
+ \pgfarrowsrightextend{+9\pgfutil@tempdima}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \pgfutil@tempdimb=\pgflinewidth%
+ \ifdim\pgfinnerlinewidth>0pt%
+ \pgfmathsetlength\pgfutil@tempdimb{.6\pgflinewidth-.4*\pgfinnerlinewidth}%
+ \fi%
+ \advance\pgfutil@tempdima by.3\pgfutil@tempdimb%
+ \pgfpathmoveto{\pgfqpoint{9\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfqpoint{6.3333\pgfutil@tempdima}{.5\pgfutil@tempdima}}
+ {\pgfqpoint{2\pgfutil@tempdima}{2\pgfutil@tempdima}}
+ {\pgfqpoint{-1\pgfutil@tempdima}{3.75\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-1\pgfutil@tempdima}{-3.75\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{2\pgfutil@tempdima}{-2\pgfutil@tempdima}}
+ {\pgfqpoint{6.3333\pgfutil@tempdima}{-.5\pgfutil@tempdima}}
+ {\pgfqpoint{9\pgfutil@tempdima}{0pt}}
+ \pgfusepathqfill
+}
+\pgfarrowsdeclarereversed{latex reversed}{latex reversed}{latex}{latex}
+\pgfarrowsdeclare{@bar}{@bar}
+{
+ \pgfarrowsleftextend{+-0.25\pgflinewidth}
+ \pgfarrowsrightextend{+.75\pgflinewidth}
+}
+{
+ \pgfutil@tempdima=2pt%
+ \advance\pgfutil@tempdima by1.5\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetrectcap
+ \pgfpathmoveto{\pgfqpoint{0.25\pgflinewidth}{-\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.25\pgflinewidth}{\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}
+\pgfkeys{Bar /.tip = @bar}
+\pgfarrowsdeclare{space}{space}
+{
+ \pgfutil@tempdima=0.88pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfarrowsleftextend{0pt}
+ \pgfarrowsrightextend{\pgfutil@tempdima}
+}
+{}
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcoreexternal.code.tex b/graphics/pgf/base/tex/pgfcoreexternal.code.tex
new file mode 100644
index 0000000000..9ec63ff7c6
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoreexternal.code.tex
@@ -0,0 +1,542 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoreexternal.code.tex}
+
+
+
+\newif\ifpgfexternal@aux@in@dpth
+\newif\ifpgfexternal@info
+
+\pgfkeys{
+ /pgf/images/include external/.code={\pgfimage{#1}},
+ /pgf/images/aux in dpth/.is if=pgfexternal@aux@in@dpth,
+ /pgf/images/aux in dpth/.default=true,
+ /pgf/images/trim external/.code n args={4}{%
+ \def\pgf@external@kern@left{#1}%
+ \def\pgf@external@kern@bottom{#2}%
+ \def\pgf@external@kern@right{#3}%
+ \def\pgf@external@kern@top{#4}%
+ \ifx\pgf@external@kern@left\pgfutil@empty\def\pgf@external@kern@left{0sp}\fi%
+ \ifx\pgf@external@kern@bottom\pgfutil@empty\def\pgf@external@kern@bottom{0sp}\fi%
+ \ifx\pgf@external@kern@right\pgfutil@empty\def\pgf@external@kern@right{0sp}\fi%
+ \ifx\pgf@external@kern@top\pgfutil@empty\def\pgf@external@kern@top{0sp}\fi%
+ },
+ /pgf/images/trim external={1truein}{1truein}{1truein}{1truein},
+ /pgf/images/external info/.is if=pgfexternal@info,
+ /pgf/images/external info/.default=true,
+}
+
+% The external read/write mechanism is used as follows:
+%
+% In your document, you put a number or all of your pgfpicture (or
+% tikzpicture) environments inside a pair of \beginpgfexternal and
+% \endpgfexternal. The \beginpgfexternal gets one parameter called the
+% graphics name.
+%
+% Once this is done, the next step is to declare the names of your
+% graphics in the document at the beginning using the
+% \pgfdeclaregraphicname command.
+%
+% Now, when you typeset your document, each time a \beginpgfexternal
+% command is encountered, it will be checked whether the corresponding
+% graphics file exists. If this is the case, it will be included and
+% the code between \beginpgfexternal and \endpgfexternal is
+% ignored. Otherwise, the code is executed normally.
+%
+% Things change when you run tex on your file with the \jobname set to
+% the name of a declared graphics name. In this case, only your
+% graphic will be typeset, the rest of the document will be "thrown away".
+% To be more precise, everything is gobbled up to the beginning
+% of the first \beginpgfexternal with the given graphics name. Then,
+% the content of the "environment" is put in a box (this "environment"
+% need not contain a graphics, it may contain anything that can be put
+% in a box). Then a single page is output whose size is exactly the
+% size of the picture.
+%
+% So, once you have run tex repeatedly, each time with the jobname set
+% to each of the graphics, you can then run tex on the whole document
+% and this will cause all graphics to be included rather than begin
+% typeset.
+%
+% Finally, once all the graphics have been created, you can also say
+% \input pgfexternal.tex instead of including pgf/TikZ.
+
+
+\newif\ifpgfexternalreadmainaux
+\pgfexternalreadmainauxtrue
+
+% Tells pgf which jobname is the name of the real file
+%
+% #1 = name
+%
+% Description:
+%
+% This command is used to tell pgf that the file named #1 should be
+% typeset normally. If \jobname is not equal to #1, only
+% the graphic called \jobname will be typeset.
+%
+% Example:
+%
+% \pgfrealjobname{survey}
+%
+% Note that afterwards, \jobname will be set to the argument. In our
+% example, \jobname will be 'survey'. This is to accomplish
+% compatibility with aux-file generation.
+
+\def\pgfrealjobname#1{%
+ \global\let\pgfactualjobname=\jobname
+ \edef\pgf@tempa{\expandafter\string\csname #1\endcsname}%
+ \edef\pgf@tempb{\expandafter\string\csname\jobname\endcsname}%
+ \ifx\pgf@tempa\pgf@tempb%
+ \else%
+ \pgf@external@grabshipouttrue%
+ \pgfexternal@nofiles% see also \pgf@external@init@aux@in@dpth
+ \ifpgfexternalreadmainaux
+ % and reset the jobname. This should allow to handle any
+ % \label/\ref constructions which are stored in \jobname.aux (and
+ % which won't be found otherwise)
+ \gdef\jobname{#1}%
+ \fi
+ \ifpgfexternal@aux@in@dpth
+ \csname newwrite\endcsname\w@pgfexternal@auxout
+ \fi
+ \pgfexternal@geometry@compatibility
+ \fi%
+ \gdef\pgfrealjobname##1{}% avoid multiple calls.
+}
+
+\def\pgfexternal@geometry@compatibility{%
+ % check if \usepackage{geometry} is loaded:
+ \pgfutil@ifundefined{geometry}{%
+ }{%
+ % The geometry package hooks into \begin{document}, evaluates
+ % its driver -- and generates \special instructions to set the
+ % paper size.
+ %
+ % Unfortunately, this confuses dvips utterly - and perhaps
+ % other drivers as well.
+ %
+ % Thus, if we currently about to generate some external
+ % graphics, we WANT to disable geometry (it has no purpose in
+ % this context anyway).
+ %
+ % This here works well:
+ \pgf@typeout{Package TikZ externalization: calling \string\geometry{driver=none} during externalization.^^J}%
+ \geometry{driver=none}%
+ }%
+}%
+
+\def\pgfexternal@nofiles{%
+ % replace \relax. The \nofiles macros does
+ % \let\makeglossary=\relax
+ % but the glossary.sty calls \renewcommand\makeglossary (which
+ % will fail if \makeglossary=\relax). Stupid, but it works.
+ \let\pgfexternal@nofiles@=\relax
+ \def\relax{\relax}%
+ %
+ % suppress generation of LaTeX .aux, .toc etc files.
+ % generation of these files is not thread-safe.
+ % the \csname \endcsname yields \relax if \nofiles doesn't exist.
+ \csname nofiles\endcsname
+ %
+ \let\relax=\pgfexternal@nofiles@
+}%
+
+\newif\ifpgf@external@grabshipout
+\newbox\pgfexternal@startupbox
+
+\pgfutil@ifundefined{AtBeginDocument}{}{%
+ \AtBeginDocument{%
+ \ifpgf@external@grabshipout%
+ \global\let\pgfexternal@originalshipout=\shipout%
+ \global\def\shipout{\setbox\pgfpic=}%
+ \maxdeadcycles=10000%
+ % Ok, gather everything we have seen up to now in a box. This box
+ % will contain any specials that have been used.
+ {%
+ \output{\global\setbox\pgfexternal@startupbox=\vbox{\csname @begindvi\endcsname\unvbox255}}%
+ \hbox{}\eject%
+ }%
+ \fi%
+ }
+}%
+
+\pgfutil@ifundefined{AtEndDocument}{}{%
+ \AtEndDocument{%
+ \ifpgf@external@grabshipout
+ \pgfutil@ifundefined{pgfexternal@did@a@shipout}{%
+ \pgfexternal@error@no@shipout
+ }{}%
+ \fi
+ }%
+}
+
+% This will be overwritten by the tikz external lib if it is loaded.
+\def\pgfexternal@error@no@shipout{%
+ \pgferror{Sorry, image externalization failed: the resulting image was EMPTY. I tried to externalize '\pgfactualjobname'. Perhaps there was a typo somewhere? Please check that your document contains '\string\beginpgfgraphicnamed{\pgfactualjobname} ... \string\endpgfgraphicnamed'}%
+}%
+
+
+% "Environment" for an external graphic.
+%
+% #1 = graphic name
+%
+% Example:
+%
+% \beginpgfgraphicnamed{main-graphic2}
+% \begin{tikzpicture}
+% ...
+% \end{tikzpicture}
+% \endpgfgraphicnamed
+
+\def\pgf@externalbegin#1{%
+ % First, check whether we wish to grab this graphic:
+ \let\pgf@next=\pgf@external@normal%
+ \ifpgf@external@grabshipout%
+ \edef\pgf@tempa{\expandafter\string\csname #1\endcsname}%
+ \edef\pgf@tempb{\expandafter\string\csname\pgfactualjobname\endcsname}%
+ \ifx\pgf@tempa\pgf@tempb%
+ \let\pgf@next=\pgf@external@grab%
+ \fi%
+ \fi%
+ \pgf@next{#1}%
+}
+
+
+\AtBeginDocument{
+ \let\beginpgfgraphicnamed=\pgf@externalbegin% overwrite definition of pgfexternal.tex if necessary
+ \let\endpgfgraphicnamed=\unskip
+}
+
+
+% Normal operation: Include an external graphic instead of the
+% picture, if such an external picture exists.
+\def\pgf@external@normal#1{%
+ \let\pgf@filename=\pgfutil@empty%
+ \expandafter\pgf@findfile\pgfsys@imagesuffixlist:+{#1}%
+ \ifx\pgf@filename\pgfutil@empty%
+ % Ok, no such image... Just typeset the picture normally.
+ \let\pgf@next=\relax%
+ \else%
+ \let\pgf@next=\pgf@replacepicturebygraphic%
+ \fi%
+ \pgf@next%
+}
+
+\long\def\pgf@replacepicturebygraphic#1\endpgfgraphicnamed{%
+ \expandafter\pgfincludeexternalgraphics\expandafter{\pgf@filename}\unskip
+}
+
+% This is almost the same as \includegraphics{#1}, but it checks
+% whether '#1.dpth' exists. In such case, it restores the boxes depth
+% stored in #1.dpth.
+%
+% Furthermore, the .dpth file may contain .aux related information
+% collected for the external graphics (references). They start after
+% the first line (if any).
+\def\pgfincludeexternalgraphics#1{%
+ \begingroup
+ \pgfexternalreaddpth{#1}%
+ \pgfkeysifdefined{/pgf/images/include external/#1/.@cmd}{%
+ \pgfkeysgetvalue{/pgf/images/include external/#1/.@cmd}\pgf@tempa
+ \pgfkeyslet{/pgf/images/include external/.@cmd}\pgf@tempa
+ }{}%
+ \setbox1=\hbox{\pgfkeysvalueof{/pgf/images/include external/.@cmd}{#1}\pgfeov}%
+ \ifdim\pgfexternaltrimleft=0sp \else \kern\pgfexternaltrimleft\relax \fi
+ \ifdim\pgfexternaldepth=0pt
+ \box1
+ \else
+ \dimen0=\pgfexternaldepth\relax
+ \hbox{\lower\dimen0 \box1 }%
+ \fi
+ \ifdim\pgfexternaltrimright=0sp \else \kern\pgfexternaltrimright\relax \fi
+ \endgroup
+}
+
+% Reads the .dpth file which contains meta data of the external
+% picture.
+%
+% This command handles the following stuff:
+% - it defines \pgfexternaldepth . The macro contains the contents of
+% a line which does not start with a control sequence (for example a
+% line containing '50pt')
+% - it defines \pgfexternaltrimleft and \pgfexternaltrimright
+% - it checks if the .dpth file contains content stored by means of
+% \pgfexternalstorecommand. If so, the argument of
+% \pgfexternalstorecommand will be restored.
+% - anything else will be appended to the main .aux file, assuming that
+% it contains \label or \ref information (only if the LaTeX switch
+% \if@filesw is \iftrue).
+%
+%
+% #1: the image file name (such that #1.dpth exists)
+\def\pgfexternalreaddpth#1{%
+ % no \begingroup. Handle that manually:
+ \edef\pgfexternalreaddpth@restore{%
+ \noexpand\endlinechar=\the\endlinechar\space
+ \noexpand\catcode`\noexpand\@=\the\catcode`\@\space
+ }%
+ %
+ \def\pgfexternaldepth{0sp}%
+ \def\pgfexternaltrimleft{0sp}%
+ \def\pgfexternaltrimright{0sp}%
+ \endlinechar=-1 % suppress white space at end
+ \catcode`\@=11
+ \openin\r@pgf@reada=#1.dpth
+ \pgfincludeexternalgraphics@read@dpth
+ %
+ \pgfexternalreaddpth@restore
+}%
+%
+% The .dpth consists of 0-N lines, where each is either a single
+% dimension (the box' depth) or something which belongs to the .aux
+% file (such lines will always start with a macro).
+\def\pgfincludeexternalgraphics@read@dpth{%
+ \ifeof\r@pgf@reada
+ \closein\r@pgf@reada
+ \else
+ \read\r@pgf@reada to\pgfincludeexternalgraphics@auxline
+ \ifx\pgfincludeexternalgraphics@auxline\pgfutil@empty
+ \else
+ \expandafter\pgfincludeexternalgraphics@read@dpth@line\pgfincludeexternalgraphics@auxline\pgfincludeexternalgraphics@read@dpth@line@EOI
+ \fi
+ \expandafter\pgfincludeexternalgraphics@read@dpth
+ \fi
+}%
+
+\def\pgfexternal@restore#1{#1}%
+
+\long\def\pgfincludeexternalgraphics@read@dpth@line@getfirst#1#2\pgfincludeexternalgraphics@read@dpth@line@EOI{%
+ \def\pgf@first{#1}%
+}%
+\long\def\pgfincludeexternalgraphics@read@dpth@line#1\pgfincludeexternalgraphics@read@dpth@line@EOI{%
+ \pgfincludeexternalgraphics@read@dpth@line@getfirst#1\pgfincludeexternalgraphics@read@dpth@line@EOI
+ \expandafter\ifcat\expandafter\noexpand\pgf@first\relax
+ % Ah -- the first token is a control sequence. It belongs to
+ % the .aux file.
+ %
+ \expandafter\ifx\pgf@first\pgfexternal@restore
+ % if the first line in the .dpth file starts with the
+ % magic string \pgfexternal@restore, the complete line
+ % will be executed as-is. Example:
+ % \pgfexternal@restore{\def\somevalue{1}}
+ #1%
+ \else
+ % do NOT execute #1! many LaTeX commands don't support it (\label for example)
+ \pgfutil@ifundefined{if@filesw}{%
+ % sorry, .aux file support only for latex
+ }{%
+ % append to main .aux file (for forward references)
+ \if@filesw
+ {%
+ \toks0={#1}%
+ % believe it or not, but the
+ % \def\dpthimport{...}\dpthimport *makes* a
+ % difference! In ensures any occurring `##' characters are properly expanded to `#'.
+ \immediate\write\@auxout{%
+ \noexpand\def\noexpand\dpthimport{\the\toks0}\noexpand\dpthimport}%
+ }%
+ \fi
+ }%
+ \fi
+ \else% it is the depth (which is simply a number for backwards compatibility)
+ \def\pgfexternaldepth{#1}%
+ \fi
+}%
+
+% Stores '#1' (expanded!) into the .dpth file of the currently
+% exported image.
+%
+% This command has only an effect if an image is being exported.
+%
+% The stored contents will be read in the context where
+% /pgf/images/include external is active (i.e. by
+% \pgfexternalreaddpth).
+%
+\def\pgfexternalstorecommand#1{%
+}%
+\def\pgfexternalstorecommand@isexporting#1{%
+ \immediate\write\w@pgfexternal@auxout{\noexpand\pgfexternal@restore{#1}}%
+}%
+
+
+
+% Grab operation: If jobname matches the graphic name, typeset this
+% picture normal.
+% REMARK:
+% this method is also invoked from within the tikz external library.
+\def\pgf@external@grab#1{%
+ \def\pgf@filename{#1}%
+ \ifpgfexternal@aux@in@dpth
+ \begingroup
+ \pgf@external@init@aux@in@dpth
+ \let\G@refundefinedtrue=\pgf@external@grab@refundefinedtrue
+ \fi
+ \gdef\pgf@trimleft@final{0sp}%
+ \gdef\pgf@trimright@final{0sp}%
+ \setbox\pgfpic=\hbox\bgroup\bgroup%
+ \let\endpgfgraphicnamed=\pgf@externalend%
+}
+
+{\catcode`\^=12 \gdef\pgfexternal@hat{^}}
+
+\expandafter\let\expandafter\pgf@external@grab@refundefinedtrue@orig\csname G@refundefinedtrue\endcsname
+
+\def\pgf@external@grab@refundefinedtrue{%
+ \pgf@external@grab@refundefinedtrue@orig
+ \begingroup
+ \def\n{\pgfexternal@hat\pgfexternal@hat J}%
+ \pgfexternalstorecommand{%
+ \pgf@external@grab@refundefinedtrue@code
+ \noexpand\immediate\noexpand\write16{\pgf@external@grab@refundefinedtrue@warning}%
+ \noexpand\G@refundefinedtrue
+ }%
+ \endgroup
+}%
+
+% A hook. will be overwritten by \usetikzlibrary{external}
+\def\pgf@external@grab@refundefinedtrue@code{}
+
+\def\pgf@external@grab@refundefinedtrue@warning{%
+ LaTeX Warning: External picture `\pgfactualjobname' contains undefined references\noexpand\on@line.\n
+}%
+
+\let\pgf@external@@protected@write@orig=\protected@write
+\long\def\pgf@external@@protected@write@immediate#1#2#3{%
+ \begingroup
+ \let\pgf@write@=\write
+ \def\write{\noexpand\immediate\pgf@write@}%
+ \pgf@external@@protected@write@orig{#1}{#2}{#3}%
+ \endgroup
+}%
+
+\def\pgf@external@init@aux@in@dpth{%
+ \let\pgfexternalstorecommand=\pgfexternalstorecommand@isexporting
+ %
+ % tell LaTeX to write aux files...
+ \csname @fileswtrue\endcsname
+ % ... but redirect output to the .dpth file!
+ \immediate\openout\w@pgfexternal@auxout=\pgf@filename.dpth
+ \let\@auxout=\w@pgfexternal@auxout
+ % ... and disable the correct page numbers. I can't get that
+ % (because the correct page number is only available in the
+ % shipout routine). Use immediate output:
+ \let\protected@write=\pgf@external@@protected@write@immediate
+}%
+
+\def\pgf@externalend@storeshifts#1{%
+ \immediate\write#1{\the\dp\pgfpic}% store the depth simply as number for backw. compat.
+ \ifx\pgf@trimleft@final\pgfutil@empty\else
+ \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternaltrimleft{\pgf@trimleft@final}}}%
+ \fi
+ \ifx\pgf@trimright@final\pgfutil@empty\else
+ \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternaltrimright{\pgf@trimright@final}}}%
+ \fi
+ \ifpgfexternal@info
+ \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternalwidth{\the\wd\pgfpic}}}%
+ \immediate\write#1{\noexpand\pgfexternal@restore{\noexpand\def\noexpand\pgfexternalheight{\the\dimen0}}}%
+ \fi
+}
+% REMARK:
+% this method is also invoked from within the tikz external library.
+\def\pgf@externalend{%
+ \unskip\egroup\egroup%
+ {%
+ \def\pgf@external@trim{0}%
+ \def\pgf@external@store@dpth{0}%
+ %
+ \ifpgf@trim@lowlevel
+ \gdef\pgf@trimleft@final{}%
+ \gdef\pgf@trimright@final{}%
+ \else
+ \ifdim\pgf@trimleft@final=0sp \gdef\pgf@trimleft@final{} \else\def\pgf@external@trim{1}\fi
+ \ifdim\pgf@trimright@final=0sp \gdef\pgf@trimright@final{} \else\def\pgf@external@trim{1}\fi
+ \if1\pgf@external@trim
+ % UNDO the trimming! export to pdf doesn't supported trimmed
+ % bounding boxes (has to do with the mediabox/trimbox etc).
+ % I'll keep the bounding box intact and store the trim information
+ % into the .dpth file.
+ \setbox\pgfpic=\hbox{%
+ \ifx\pgf@trimleft@final\pgfutil@empty\else\kern-\pgf@trimleft@final\fi
+ \box\pgfpic
+ \ifx\pgf@trimright@final\pgfutil@empty\else\kern-\pgf@trimright@final\fi
+ }%
+ \def\pgf@external@store@dpth{1}%
+ \fi
+ \fi
+ %
+ \parindent0pt % leave the space
+% \leftmargin0pt%
+% \rightmargin0pt%
+ \hoffset=0pt % reset to default
+ \voffset=0pt
+ \dimen0\ht\pgfpic%
+ \advance\dimen0\dp\pgfpic%
+ \ifdim\dp\pgfpic=0pt\relax
+ \else% store the picture's depth. Otherwise, it would be lost.
+ \def\pgf@external@store@dpth{1}%
+ \fi
+ \ifpgfexternal@info
+ \def\pgf@external@store@dpth{1}%
+ \fi
+ %
+ \if1\pgf@external@store@dpth
+ \ifpgfexternal@aux@in@dpth
+ \pgf@externalend@storeshifts\@auxout
+ \immediate\closeout\@auxout
+ \else
+ \immediate\openout\pgf@plotwrite=\pgf@filename.dpth
+ \pgf@externalend@storeshifts\pgf@plotwrite
+ \immediate\closeout\pgf@plotwrite
+ \fi
+ \fi
+ \pgfsys@prepare@papersize{\the\wd\pgfpic}{\the\dimen0}%
+ %
+ \setbox0=\vbox{%
+ % I admit that I don't know why there is this kerning:
+ \kern -\pgf@external@kern@top\relax%
+ \hbox{%
+ \kern -\pgf@external@kern@left\relax%
+ \hbox to0pt{%
+ \wd\pgfexternal@startupbox=0pt %
+ \ht\pgfexternal@startupbox=0pt %
+ \dp\pgfexternal@startupbox=0pt %
+ \box\pgfexternal@startupbox%
+ \pgfsys@atbegindocument\hss}%
+ \box\pgfpic%
+ \kern\pgf@external@kern@right\relax%
+ }%
+ \kern\pgf@external@kern@bottom\relax%
+ }%
+ %
+ % compatibility with eso-pic package: \nointerlineskip is not
+ % allowed here, but the eso-pic package uses \nointerlineskip in
+ % its shipout routine.
+ \let\pgfexternal@nointerlineskip@orig=\nointerlineskip
+ \let\nointerlineskip=\pgfexternal@nointerlineskip
+ %
+ \pgfexternal@originalshipout\box0 %
+ \gdef\pgfexternal@did@a@shipout{1}%
+ }%
+ \ifpgfexternal@aux@in@dpth
+ \endgroup
+ \fi
+}
+
+\def\pgfexternal@nointerlineskip{%
+ \ifvmode
+ \pgfexternal@nointerlineskip@orig
+ \else
+ \relax% \nointerlineskip in horizontal mode not allowed. Silently ignore the error message.
+ \fi
+}%
+
+\endinput
+% vi: tabstop=4 shiftwidth=2 expandtab
diff --git a/graphics/pgf/base/tex/pgfcoregraphicstate.code.tex b/graphics/pgf/base/tex/pgfcoregraphicstate.code.tex
new file mode 100644
index 0000000000..7b11d45d63
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoregraphicstate.code.tex
@@ -0,0 +1,280 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoregraphicstate.code.tex}
+
+% Globals
+
+\newdimen\pgflinewidth
+
+
+% Set the line width to #1.
+%
+% #1 = new line width.
+%
+% Example:
+%
+% \pgfsetlinewidth{3pt}
+
+\def\pgfsetlinewidth#1{%
+ \pgfmathsetlength\pgflinewidth{#1}%
+ \global\pgflinewidth=\pgflinewidth%
+ \pgfsys@setlinewidth{\the\pgflinewidth}%
+ \ignorespaces}
+
+
+% Set the inner line width to #1.
+%
+% #1 = new inner line width.
+%
+% Description:
+%
+% The inner line width is the width of a second line that is drawn on
+% top of the main stroked line. If the inner line width is 0pt, no
+% inner line is drawn. The main use of inner lines is for creating
+% "double" lines.
+%
+% Inner lines are not drawn when a path is used for clipping.
+%
+% The inner line width is local to the current TeX group, it is not
+% part of the graphic state.
+%
+% Example:
+%
+% \pgfsetinnerlinewidth{1pt}
+
+\def\pgfsetinnerlinewidth#1{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgfinnerlinewidth{\the\pgf@x}%
+}
+\def\pgfinnerlinewidth{0pt}
+
+
+% Set the inner line color to #1.
+%
+% #1 = color for the inner line
+%
+% Example:
+%
+% \pgfsetinnerlinecolor{green} % yikes!
+
+\def\pgfsetinnerstrokecolor#1{\def\pgfinnerstrokecolor{#1}}
+\def\pgfinnerstrokecolor{white}
+
+
+% Set the miter limit to #1.
+%
+% #1 = new miter limit factor.
+%
+% Example:
+%
+% \pgfsetmiterlimit{3}
+
+\def\pgfsetmiterlimit#1{%
+ \ifdim#1pt<1pt\pgferror{miter limit cannot be less than 1}\fi%
+ \pgfsys@setmiterlimit{#1}%
+ \ignorespaces}
+
+
+% Set the dash pattern to #1 with phase #2/
+%
+% #1 = a row of numbers of length of ``on'' and ``off'' points.
+% #2 = a phase
+%
+% Example:
+%
+% \pgfsetdash{} {0pt} % solid line
+% \pgfsetdash{{.1cm}} {0pt} % long dashes
+% \pgfsetdash{{1pt}{1ex}}{0pt} % dotted
+
+\def\pgfsetdash#1#2{%
+ \def\pgf@temp{}%
+ \def\pgf@next{\pgf@strip}%
+ \pgf@strip#1{pgf@stop}%
+ \pgfmathsetlength\pgf@x{#2}%
+ \pgfsys@setdash{\pgf@temp}{\the\pgf@x}%
+ \ignorespaces}
+
+\def\pgf@strip#1{%
+ \def\pgf@@temp{#1}%
+ \ifx\pgf@@temp\pgf@stop%
+ \let\pgf@next=\relax%
+ \else%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \edef\pgf@temp{\the\pgf@x}%
+ \else%
+ \edef\pgf@temp{\pgf@temp,\the\pgf@x}%
+ \fi%
+ \fi\pgf@next}
+
+\def\pgf@stop{pgf@stop}
+
+
+% Set color of strokes. This will overrule the normal color.
+%
+% Example:
+%
+% \pgfsetstrokecolor{red}
+
+\def\pgfsetstrokecolor#1{%
+ \pgfutil@colorlet{pgfstrokecolor}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfstrokecolor}}%
+ \expandafter\let\expandafter\pgf@temp\csname\string\color@pgfstrokecolor\endcsname
+ % for arrow tips:
+ \global\let\pgf@strokecolor@global=\pgf@temp
+ \expandafter\pgf@setstrokecolor\pgf@temp%
+}
+\def\pgf@setstrokecolor#1#2#3#4#5{%
+ \expandafter\ifx\csname pgfsys@color@#4@stroke\endcsname\relax%
+ \pgferror{Unsupported color model `#4'. Sorry}%
+ \else%
+ \edef\pgf@colmarshal{\expandafter\noexpand\csname pgfsys@color@#4@stroke\endcsname}%
+ \pgf@uncomma#5,,%
+ \pgf@colmarshal%
+ \fi}
+
+\def\pgf@uncomma#1,{%
+ \def\pgf@coltest{#1}%
+ \ifx\pgf@coltest\pgfutil@empty%
+ \let\pgf@colnext=\relax%
+ \else%
+ \expandafter\def\expandafter\pgf@colmarshal\expandafter{\pgf@colmarshal{#1}}%
+ \let\pgf@colnext=\pgf@uncomma%
+ \fi%
+ \pgf@colnext%
+}
+
+
+% Set color of fills. This will overrule the normal color.
+%
+% Example:
+%
+% \pgfsetfillcolor{gray}
+
+\def\pgfsetfillcolor#1{%
+ \pgfutil@colorlet{pgffillcolor}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgffillcolor}}%
+ \expandafter\let\expandafter\pgf@temp\csname\string\color@pgffillcolor\endcsname
+ % for arrow tips:
+ \global\let\pgf@fillcolor@global=\pgf@temp
+ \expandafter\pgf@setfillcolor\pgf@temp
+}
+\def\pgf@setfillcolor#1#2#3#4#5{%
+ \expandafter\ifx\csname pgfsys@color@#4@fill\endcsname\relax%
+ \pgferror{Unsupported color model `#4'. Sorry}%
+ \else%
+ \edef\pgf@colmarshal{\expandafter\noexpand\csname pgfsys@color@#4@fill\endcsname}%
+ \pgf@uncomma#5,,%
+ \pgf@colmarshal%
+ \fi}
+
+
+
+% Sets both the stroke and fill color.
+%
+% Example:
+%
+% \pgfsetcolor{blue}
+
+\def\pgfsetcolor#1{%
+ \pgfutil@colorlet{pgfstrokecolor}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfstrokecolor}}%
+ \expandafter\let\expandafter\pgf@temp\csname\string\color@pgfstrokecolor\endcsname
+ % for arrow tips:
+ \global\let\pgf@strokecolor@global=\pgf@temp
+ \global\let\pgf@fillcolor@global=\pgf@temp
+ \expandafter\pgf@setcolor\pgf@temp%
+}
+\def\pgf@setcolor#1#2#3#4#5{%
+ \expandafter\ifx\csname pgfsys@color@#4\endcsname\relax%
+ \pgferror{Unsupported color model `#4'. Sorry}%
+ \else%
+ \edef\pgf@colmarshal{\expandafter\noexpand\csname pgfsys@color@#4\endcsname}%
+ \pgf@uncomma#5,,%
+ \pgf@colmarshal%
+ \fi}
+
+% Code for ensuring the stroke/fill colors are correctly reset.
+\def\XC@bcolor{\pgfsys@color@reset}
+
+% Set a butt line cap.
+%
+% Example:
+%
+% \pgfsetbuttcap
+
+\def\pgfsetbuttcap{\pgfsys@buttcap\ignorespaces}
+
+
+% Set a round line cap.
+%
+% Example:
+%
+% \pgfsetroundcap
+
+\def\pgfsetroundcap{\pgfsys@roundcap\ignorespaces}
+
+
+% Set a rectangular line cap.
+%
+% Example:
+%
+% \pgfsetrectcap
+
+\def\pgfsetrectcap{\pgfsys@rectcap\ignorespaces}
+
+
+% Set a miter line join.
+%
+% Example:
+%
+% \pgfsetmiterjoin
+
+\def\pgfsetmiterjoin{\pgfsys@miterjoin\ignorespaces}
+
+
+% Set a bevel line join.
+%
+% Example:
+%
+% \pgfsetbeveljoin
+
+\def\pgfsetbeveljoin{\pgfsys@beveljoin\ignorespaces}
+
+
+% Set a round line join.
+%
+% Example:
+%
+% \pgfsetroundjoin
+
+\def\pgfsetroundjoin{\pgfsys@roundjoin\ignorespaces}
+
+
+% Sets the even-odd rule for filling and clipping.
+%
+% Example:
+%
+% \pgfseteorule
+
+\def\pgfseteorule{\pgfsys@eoruletrue\ignorespaces}
+
+
+% Sets the non-zero winding number rule for filling and clipping.
+%
+% Example:
+%
+% \pgfsetnonzerorule
+
+\def\pgfsetnonzerorule{\pgfsys@eorulefalse\ignorespaces}
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcoreimage.code.tex b/graphics/pgf/base/tex/pgfcoreimage.code.tex
new file mode 100644
index 0000000000..710ece1fa8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoreimage.code.tex
@@ -0,0 +1,244 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoreimage.code.tex}
+
+
+
+% Declare an image
+%
+% #1 = optional argument: width, height, page specification
+% #2 = name of the image for later use
+% #4 = filename without extension, automatic extensions are .pdf,
+% .jpg, and .png for PDF and .ps, .eps, .epsi for postscript.
+%
+% Description:
+%
+% This command declares an image file for later use. Even if the image
+% is used several times in the document, in PDF it will only be stored
+% once.
+%
+% Example:
+%
+% \pgfdeclareimage[width=2cm,page=2]{myimage}{imagefilename}
+
+\def\pgfdeclareimage{\pgfutil@ifnextchar[{\pgf@declareimage}{\pgf@declareimage[]}}
+\def\pgf@declareimage[#1]#2#3{%
+ \pgfqkeys{/pgf/images}{height=,width=,page=,interpolate=false,mask=,#1}%
+ % Try to find the file
+ \gdef\pgf@filename{}%
+ % If page= parameter is not empty, try that file first:
+ \ifx\pgf@imagepage\pgfutil@empty%
+ \else%
+ \expandafter\pgf@findfile\pgfsys@imagesuffixlist:+{#3.page\pgf@imagepage}%
+ \fi%
+ \ifx\pgf@filename\pgfutil@empty%
+ \expandafter\pgf@findfile\pgfsys@imagesuffixlist:+{#3}%
+ \else%
+ \pgfkeys{/pgf/images/page=}% make page empty
+ \fi%
+ \ifx\pgf@filename\pgfutil@empty%
+ \pgfwarning%
+ {File "#3" not found when defining image "#2".
+ Tried all extensions in "\pgfsys@imagesuffixlist"}%
+ \pgf@declaredraftimage{#2}{#3}%
+ \else%
+ \ifpgf@draftmode%
+ \pgf@declaredraftimage{#2}{#3}%
+ \else%
+ \pgfsys@defineimage%
+ \fi%
+ \fi%
+ \expandafter\global\expandafter\let\csname pgf@image@#2!\endcsname=\pgf@image%
+}
+
+
+\pgfkeys{
+ /pgf/images/draft/.is if=pgf@draftmode,
+ /pgf/images/draft/.default=true}
+\pgfkeys{/pgf/images/width/.estore in=\pgf@imagewidth}
+\pgfkeys{/pgf/images/height/.estore in=\pgf@imageheight}
+\pgfkeys{/pgf/images/page/.estore in=\pgf@imagepage}
+\pgfkeys{/pgf/images/interpolate/.cd,.code=\edef\pgf@imageinterpolate{#1},.default=true}
+\let\pgf@imageinterpolate\pgfutil@empty
+\pgfkeys{/pgf/images/mask/.code=%
+ {%
+ \edef\pgf@imagemask{#1}%
+ \ifx\pgf@imagemask\pgfutil@empty%
+ \else%
+ \pgfutil@ifundefined{pgf@mask@#1}%
+ {\pgferror{Undefined mask "#1".}%
+ \edef\pgf@imagemask{}}%
+ {\edef\pgf@imagemask{\csname pgf@mask@#1\endcsname}%
+ }%
+ \fi%
+ }}
+
+
+\def\pgf@findfile#1:#2+#3{%
+ \pgfutil@IfFileExists{#3#1}%
+ {\xdef\pgf@filename{#3#1}}%
+ {\def\pgf@mightbeempty{#2}%
+ \ifx\pgf@mightbeempty\pgfutil@empty\else%
+ \pgf@findfile#2+{#3}%
+ \fi}}
+
+% #1: image name
+% #2: file name
+\def\pgf@declaredraftimage#1#2{%
+ \ifx\pgf@imagewidth\pgfutil@empty%
+ \pgfwarning{Missing width for image "#1" ("#2") in draft mode. Using 1cm instead}%
+ \edef\pgf@imagewidth{1cm}%
+ \fi%
+ \ifx\pgf@imageheight\pgfutil@empty%
+ \pgfwarning{Missing height for image "#1" ("#2") in draft mode. Using 1cm instead}%
+ \edef\pgf@imageheight{1cm}%
+ \fi%
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepagetext{ page \pgf@imagepage}\fi%
+ \edef\pgf@image{%
+ \hbox to \pgf@imagewidth{%
+ \vrule\kern-0.4pt%
+ \vbox to \pgf@imageheight{%
+ \hrule\vfil%
+ \hbox to \pgf@imagewidth{\hskip-10cm\hfil\noexpand\pgfutil@font@tiny#2\pgf@imagepage\hfil\hskip-10cm}%
+ \vfil\hrule}%
+ \kern-0.4pt\vrule}%
+ }%
+}
+
+
+
+% Declare a soft mask
+%
+% #1 = optional argument: matte specification. default matte is
+% white.
+% #2 = name of the mask for later use
+% #3 = filename without extension, automatic extensions are .pdf,
+% .jpg, and .png for PDF. Postscript is not supported.
+%
+% Description:
+%
+% This command declares a soft mask for later masking an image. The
+% declared mask should be used together with an image of exactly the
+% same height/width if matte is defined. Matte should be the
+% preblended background color (see pdf spec for details).
+%
+% Example:
+%
+% \pgfdeclaremask[matte=white]{maskname}{maskfilename}
+% \pgfdeclareimage[mask=maskname]{image}{imagefilename}
+
+\def\pgfdeclaremask{\pgfutil@ifnextchar[\pgf@declaremask{\pgf@declaremask[]}}
+\def\pgf@declaremask[#1]#2#3{%
+ \pgfqkeys{/pgf/images/mask}{matte={1 1 1},#1}% defaults
+ \def\pgf@mask{}%
+ % Try to find the file
+ \gdef\pgf@filename{}%
+ \expandafter\pgf@findfile\pgfsys@imagesuffixlist:+{#3}%
+ \ifx\pgf@filename\pgfutil@empty%
+ \pgfwarning%
+ {File "#3" not found when defining mask "#2".
+ Tried all extensions in "\pgfsys@imagesuffixlist"}%
+ \else%
+ \pgfsys@definemask{#2}%
+ \fi%
+ \expandafter\global\expandafter\let\csname pgf@mask@#2\endcsname=\pgf@mask%
+}
+
+\pgfkeys{/pgf/images/mask/matte/.cd,.estore in=\pgf@maskmatte,.value required}
+
+
+
+% Create an alias name for an image
+%
+% #1 = name of the alias
+% #2 = name of the original
+%
+% Example:
+%
+% \pgfdeclareimage{image}{1cm}{1cm}{filename
+% \pgfaliasimage{alias}{image}
+% \pgfuseimage{alias}
+
+\def\pgfaliasimage#1#2{%
+ \expandafter\global\expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@image@#2!\endcsname%
+ \expandafter\global\expandafter\let\csname pgf@image@#1!\endcsname=\pgf@temp%
+ }
+
+
+% Use an image
+%
+% #1 = name of a previously declared image
+%
+% Example:
+%
+% \pgfputat{\pgforigin}{\pgfbox[left,base]{\pgfuseimage{myimage}}}
+
+\def\pgfuseimage#1{%
+ \def\pgf@imagename{pgf@image@#1}%
+ \pgf@tryextensions{\pgf@imagename}{\pgfalternateextension}%
+ \expandafter\pgfutil@ifundefined\expandafter{\pgf@imagename}%
+ {\pgferror{Undefined image "#1"}}%
+ {{\leavevmode\csname\pgf@imagename\endcsname}}}
+
+\def\pgf@tryextensions#1#2{%
+ \edef\pgf@args{[#2!]}\expandafter\pgf@@tryextensions\pgf@args{#1}}
+\def\pgf@@tryextensions[#1!#2]#3{%
+ \expandafter\pgfutil@ifundefined\expandafter{#3#1!#2}%
+ {\def\pgf@temp{#2}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \edef#3{#3!}%
+ \else%
+ \pgf@@tryextensions[#2]{#3}%
+ \fi}%
+ {\edef#3{#3#1!#2}}}
+
+
+% Alternate image
+%
+% Description:
+%
+% When an image is used, pgf first attempts to use the image with the
+% alternate extension added. If this fails, the original image is
+% used. If the alternate extension contains ``!'', then the text up to
+% the ! is successively removed and the remainder is tried as an
+% alternate extension.
+%
+% Example:
+%
+% \def\pgfalternateextension{20!white}
+
+\def\pgfalternateextension{}
+
+
+
+% Directly insert an image
+%
+% #1 = optional argument: width, height, page specification
+% #2 = file name
+%
+% Description:
+%
+% Directly inserts an image without declaration. You can, however,
+% still access this image using the name pgflastimage. By using
+% pgfaliasimage, you can also save this image for later.
+%
+% Example:
+%
+% \pgfimage[height=2cm]{filename}
+
+\def\pgfimage{\pgfutil@ifnextchar[\pgf@imagecom{\pgf@imagecom[]}}
+\def\pgf@imagecom[#1]#2{%
+ \pgfdeclareimage[#1]{pgflastimage}{#2}%
+ \pgfuseimage{pgflastimage}}
+
+
+\input pgfcoreexternal.code.tex
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorelayers.code.tex b/graphics/pgf/base/tex/pgfcorelayers.code.tex
new file mode 100644
index 0000000000..1c7c01d1ea
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorelayers.code.tex
@@ -0,0 +1,210 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorelayers.code.tex}
+
+
+% Creates a new pgf layer
+%
+% #1 = layer name
+%
+% Declares a new layer for pgf.
+%
+% Example:
+%
+% \pgfdeclarelayer{background}
+
+\def\pgfdeclarelayer#1{%
+ \pgfutil@ifundefined{pgf@layerbox@#1}{%
+ \expandafter\expandafter\csname pgf@newbox\endcsname\csname pgf@layerbox@#1\endcsname%
+ \expandafter\expandafter\csname pgf@newbox\endcsname\csname pgf@layerboxsaved@#1\endcsname%
+ }{}%
+}
+\let\pgf@newbox=\newbox % avoid plain TeX outer problem
+
+% Sets the layers that compose the picture
+%
+% #1 = List of layers
+%
+% Description:
+%
+% Sets the list of layers that make up the picture. The layers will be
+% put on top of each other in the order given.
+%
+% This command can also be given inside of a picture in which case it
+% applies only to that very picture.
+%
+% Example:
+%
+% \pgfsetlayers{background,main}
+
+\def\pgfsetlayers#1{%
+ \let\pgf@layerlist\pgfutil@empty%
+ \pgf@dosetlayer#1,,\relax%
+}
+
+\def\pgf@dosetlayer#1,#2,\relax{%
+ \ifx\pgf@layerlist\pgfutil@empty%
+ \edef\pgf@layerlist{\pgfutil@trimspaces{#1}}%
+ \else
+ \edef\pgf@layerlist{\pgf@layerlist,\pgfutil@trimspaces{#1}}%
+ \fi
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \else%
+ \pgf@dosetlayer#2,\relax%
+ \fi%
+}
+
+\pgfsetlayers{main}
+
+% Adds code to a layer
+%
+% #1 = layer name
+%
+% Note:
+%
+% You cannot add anything to the ``main'' layer using this command.
+%
+% Example:
+%
+% \begin{pgfonlayer}{background}
+% \fill[red] (0,0) -- (1,1);
+% \end{pgfonlayer}
+
+\def\pgfonlayer@name{main}
+
+\def\pgfonlayer#1{%
+ \pgfutil@ifundefined{pgf@layerbox@#1}{%
+ \pgferror{Sorry, the requested layer '#1' could not be found. Maybe you misspelled it?}%
+ \bgroup
+ \begingroup
+ }{%
+ \begingroup
+ \edef\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfonlayer@name
+ % we are already on this layer.
+ \def\pgf@temp{%
+ \bgroup
+ \begingroup
+ }%
+ \else
+ \let\pgfonlayer@name=\pgf@temp
+ \pgfonlayer@assert@is@active
+ \def\pgf@temp{%
+ \expandafter\global\expandafter%
+ \setbox\csname pgf@layerbox@#1\endcsname=\hbox to 0pt%
+ \bgroup%
+ \expandafter\box\csname pgf@layerbox@#1\endcsname%
+ \begingroup%
+ }%
+ \fi
+ \pgfsetlinewidth{0.4pt}% always reset the line width
+ \pgf@temp
+ }%
+}
+\def\endpgfonlayer{%
+ \endgroup%
+ \hss
+ \egroup%
+ \endgroup
+}
+
+\let\startpgfonlayer=\pgfonlayer
+\let\stoppgfonlayer=\endpgfonlayer
+
+\def\pgfdiscardlayername{discard}
+
+\def\pgfonlayer@assert@is@active{%
+ \ifx\pgfonlayer@name\pgfdiscardlayername
+ % this special layer name can be used as /dev/null without
+ % warning.
+ \else
+ \begingroup
+ \def\pgfonlayer@isactive{0}%
+ \expandafter\pgf@assert@layer@is@active@loop\pgf@layerlist,,\relax%
+ \if0\pgfonlayer@isactive
+ \pgfonlayer@assert@fail
+ \fi
+ \endgroup
+ \fi
+}%
+\def\pgfonlayer@assert@fail{%
+ \pgferror{Sorry, the requested layer '\pgfonlayer@name' is not
+ part of the layer list. Please verify that you provided
+ \string\pgfsetlayers\space and that '\pgfonlayer@name' is part of this list}%
+}%
+\def\pgf@assert@layer@is@active@loop#1,#2,\relax{%
+ \edef\pgf@test{#1}%
+ \ifx\pgf@test\pgfonlayer@name
+ \def\pgfonlayer@isactive{1}%
+ \else
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \else%
+ \pgf@assert@layer@is@active@loop#2,\relax%
+ \fi%
+ \fi
+}
+
+% Hooks into the scoping:
+
+\def\pgf@insertlayers{%
+ \expandafter\pgf@dolayer\pgf@layerlist,,\relax%
+}
+\def\pgf@maintext{main}%
+\def\pgf@dolayer#1,#2,\relax{%
+ \def\pgf@test{#1}%
+ \ifx\pgf@test\pgf@maintext%
+ \box\pgf@layerbox@main%
+ \else%
+ \pgfsys@beginscope%
+ \expandafter\box\csname pgf@layerbox@#1\endcsname%
+ \pgfsys@endscope%
+ \fi%
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \else%
+ \pgf@dolayer#2,\relax%
+ \fi%
+}
+
+\def\pgf@savelayers{%
+ \expandafter\pgf@dosavelayer\pgf@layerlist,,\relax%
+}
+\def\pgf@dosavelayer#1,#2,\relax{%
+ \def\pgf@test{#1}%
+ \ifx\pgf@test\pgf@maintext%
+ \else%
+ \setbox\csname pgf@layerboxsaved@#1\endcsname=\box\csname pgf@layerbox@#1\endcsname%
+ \fi%
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \else%
+ \pgf@dosavelayer#2,\relax%
+ \fi%
+}
+
+\def\pgf@restorelayers{%
+ \expandafter\pgf@dorestorelayer\pgf@layerlist,,\relax%
+}
+\def\pgf@dorestorelayer#1,#2,\relax{%
+ \def\pgf@test{#1}%
+ \ifx\pgf@test\pgf@maintext%
+ \else%
+ \global\setbox\csname pgf@layerbox@#1\endcsname=\box\csname pgf@layerboxsaved@#1\endcsname%
+ \fi%
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \else%
+ \pgf@dorestorelayer#2,\relax%
+ \fi%
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcoreobjects.code.tex b/graphics/pgf/base/tex/pgfcoreobjects.code.tex
new file mode 100644
index 0000000000..1cbdfa0dd2
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoreobjects.code.tex
@@ -0,0 +1,101 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoreobjects.code.tex}
+
+
+% Object reuse
+
+
+% Define a pgf object for reuse. Such objects will be stored
+% efficiently internally.
+%
+% #1 = name for later reuse
+% #2 = lower left corner point of bounding box
+% #3 = upper right left corner point of bounding box
+% #4 = pure pgf code (nothing too fancy!)
+%
+% Description:
+%
+% Used to define reusable objects. The object must be composed of
+% basic pgf graphic primitives. Nothing fancy can be used. The
+% created object will be stored as an xform object in pdf or as a
+% postscript procedure in postscript.
+%
+% Example:
+%
+% \pgfdefobject{myrect}{\pgfpoint{-1pt}{-1pt}}{\pgfpoint{11pt}{11pt}}
+% {\pgfpathqmoveto{0pt}{0pt}
+% \pgfpathqmoveto{10pt}{0pt}
+% \pgfpathqmoveto{10pt}{10pt}
+% \pgfpathqmoveto{0pt}{10pt}
+% \pgfpathclose
+% \pgfusepath{stroke}}
+%
+% \begin{pgfpicture}{0cm}{0cm}{1cm}{1cm}
+% \pgfuseobject{myrect}
+% \end{pgfpicture}
+
+\def\pgfdefobject#1#2#3#4{%
+ \pgfinterruptpath%
+ \pgf@relevantforpicturesizefalse%
+ \pgfsys@defobject{#1}{#2}{#3}{#4}%
+ \endpgfinterruptpath%
+ \ignorespaces%
+}
+
+
+% Use an object that was previously defined using pgfdefobject
+%
+% #1 = name of previously defined object
+%
+% Example:
+%
+% \pgfdefobject{myrect}{\pgfpoint{-1pt}{-1pt}}{\pgfpoint{11pt}{11pt}}
+% {\pgfqmoveto{0}{0}
+% \pgfqmoveto{10}{0}
+% \pgfqmoveto{10}{10}
+% \pgfqmoveto{0}{10}
+% \pgfclosestroke}
+%
+% \begin{pgfpicture}{0cm}{0cm}{1cm}{1cm}
+% \pgfuseobject{myrect}
+% \end{pgfpicture}
+
+\def\pgfuseobject#1{\pgfsys@beginscope\pgfsys@useobject{#1}{}\pgfsys@endscope}
+
+
+% Use an object that was previously defined using pgfdefobject, but
+% magnify the object by the current x and y register values
+%
+% #1 = name of previously defined object
+%
+% Example:
+%
+% \pgfdefobject{myrect}{\pgfpoint{-1pt}{-1pt}}{\pgfpoint{11pt}{11pt}}
+% {\pgfqmoveto{0}{0}
+% \pgfqmoveto{10}{0}
+% \pgfqmoveto{10}{10}
+% \pgfqmoveto{0}{10}
+% \pgfclosestroke}
+%
+% \begin{pgfpicture}{0cm}{0cm}{1cm}{1cm}
+% \pgf@x=2pt% Scale by factor two in x-direction
+% \pgf@y=2pt% Scale by factor two in y-direction
+% \pgfuseobjectmagnify{myrect}
+% \end{pgfpicture}
+
+\def\pgfuseobjectmagnify#1{%
+ \pgfsys@beginscope%
+ \pgfsys@useobject{#1}{\pgfsys@transformxyscale{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}}%
+ \pgfsys@endscope%
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorepathconstruct.code.tex b/graphics/pgf/base/tex/pgfcorepathconstruct.code.tex
new file mode 100644
index 0000000000..c5b9ee1e99
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorepathconstruct.code.tex
@@ -0,0 +1,1477 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorepathconstruct.code.tex}
+
+
+\newdimen\pgf@path@lastx
+\newdimen\pgf@path@lasty
+
+\let\pgfgetpath=\pgfsyssoftpath@getcurrentpath
+\let\pgfsetpath=\pgfsyssoftpath@setcurrentpath
+
+
+
+% Replace corners by arcs.
+%
+% #1 = in-size of arc
+% #2 = out-size of arc
+%
+% Description:
+%
+% This command influences path construction command like
+% \pgfpathlineto or \pgfpatharc. It will cause the corners at the end
+% of these commands to be replaced by little arcs. If the
+% corner is a 90 degrees corner and if #1=#2, a quarter-circle of
+% radius #1 is put in place of the corner. If #1 and #2 are different,
+% the quarter circle will instead by a quarter ellipse. If the angle
+% is different from 90 degrees, a deformed quarter circle will
+% result, which may or may not be desirable. For a ``perfect'' arc you
+% must use the \pgfpatharc command.
+%
+%
+% Example: One rounded corner.
+%
+% \pgfpathmoveto{\pgfpointxy{0}{0}}
+% \pgfsetcornersarced{4pt}{4pt}
+% \pgfpathlineto{\pgfpointxy{0}{1}}
+% \pgfpathlineto{\pgfpointxy{1}{1}}
+% \pgfstroke
+%
+% Example: A rounded rectangle
+%
+% \pgfsetcornersarced{4pt}{4pt}
+% \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
+% \pgfstroke
+%
+% Example: A rounded triangles
+%
+% \pgfsetcornersarced{4pt}{4pt}
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathlineto{\pgfpoint{1cm}{0cm}}
+% \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+% \pgfpathclose
+% \pgfstroke
+
+\newif\ifpgf@arccorners
+
+\def\pgfsetcornersarced#1{%
+ \pgf@process{#1}%
+ \edef\pgf@corner@arc{{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@arccornerstrue%
+ \ifdim\pgf@x=0pt%
+ \ifdim\pgf@y=0pt\relax%
+ \pgf@arccornersfalse%
+ \fi%
+ \fi%
+}
+
+\def\pgf@roundcornerifneeded{%
+ \ifpgf@arccorners\expandafter\pgfsyssoftpath@specialround\pgf@corner@arc\fi%
+}
+
+
+
+% The following protocol the passed sizes and all the corresponding
+% softpath commands. The nonlinear transformation (nlt) module
+% overwrites these commands.
+
+\def\pgf@lt@moveto#1#2{%
+ \pgf@protocolsizes{#1}{#2}%
+ \pgfsyssoftpath@moveto{\the#1}{\the#2}%
+}
+\def\pgf@lt@lineto#1#2{%
+ \pgf@protocolsizes{#1}{#2}%
+ \pgfsyssoftpath@lineto{\the#1}{\the#2}%
+}
+\def\pgf@lt@curveto#1#2#3#4#5#6{%
+ \pgf@protocolsizes{#1}{#2}%
+ \pgf@protocolsizes{#3}{#4}%
+ \pgf@protocolsizes{#5}{#6}%
+ \pgfsyssoftpath@curveto{\the#1}{\the#2}{\the#3}{\the#4}{\the#5}{\the#6}%
+}
+
+\let\pgf@lt@closepath\pgfsyssoftpath@closepath
+
+\let\pgf@nlt@moveto\pgf@lt@moveto
+\let\pgf@nlt@lineto\pgf@lt@lineto
+\let\pgf@nlt@curveto\pgf@lt@curveto
+\let\pgf@nlt@closepath\pgf@lt@closepath
+
+\let\pgf@nlt@list\pgfutil@empty % If non-empty, the nlt module is active
+
+
+% Move current point to #1.
+%
+% #1 = new current point
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfxy(0,0)}
+% \pgfpathlineto{\pgfxy(0,1)}
+% \pgfstroke
+
+\def\pgfpathmoveto#1{%
+ \pgfpointtransformed{#1}%
+ \pgf@nlt@moveto{\pgf@x}{\pgf@y}%
+ \global\pgf@path@lastx=\pgf@x%
+ \global\pgf@path@lasty=\pgf@y%
+}
+
+\def\pgf@protocolsizes#1#2{%
+ \ifpgf@relevantforpicturesize%
+ \ifdim#1<\pgf@picminx\global\pgf@picminx#1\fi%
+ \ifdim#1>\pgf@picmaxx\global\pgf@picmaxx#1\fi%
+ \ifdim#2<\pgf@picminy\global\pgf@picminy#2\fi%
+ \ifdim#2>\pgf@picmaxy\global\pgf@picmaxy#2\fi%
+ \ifpgf@size@hooked%
+ \let\pgf@size@hook@x#1\let\pgf@size@hook@y#2\pgf@path@size@hook%
+ \fi%
+ \fi%
+ \ifdim#1<\pgf@pathminx\global\pgf@pathminx#1\fi%
+ \ifdim#1>\pgf@pathmaxx\global\pgf@pathmaxx#1\fi%
+ \ifdim#2<\pgf@pathminy\global\pgf@pathminy#2\fi%
+ \ifdim#2>\pgf@pathmaxy\global\pgf@pathmaxy#2\fi%
+}
+\newif\ifpgf@size@hooked
+\let\pgf@path@size@hook=\pgfutil@empty%
+
+\def\pgf@resetpathsizes{%
+ \global\pgf@pathmaxx=-16000pt\relax%
+ \global\pgf@pathminx=16000pt\relax%
+ \global\pgf@pathmaxy=-16000pt\relax%
+ \global\pgf@pathminy=16000pt\relax%
+}
+
+\def\pgf@getpathsizes#1{%
+ \edef#1{{\the\pgf@pathmaxx}{\the\pgf@pathminx}{\the\pgf@pathmaxy}{\the\pgf@pathminy}}%
+}
+\def\pgf@setpathsizes#1{%
+ \expandafter\pgf@@setpathsizes#1%
+}
+\def\pgf@@setpathsizes#1#2#3#4{%
+ \global\pgf@pathmaxx=#1\relax%
+ \global\pgf@pathminx=#2\relax%
+ \global\pgf@pathmaxy=#3\relax%
+ \global\pgf@pathminy=#4\relax%
+}
+
+
+
+
+
+% Append a line from the current point to #1 to the current path.
+%
+% #1 = end of line
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfxy(0,0)}
+% \pgfpathlineto{\pgfxy(0,1)}
+% \pgfstroke
+
+\def\pgfpathlineto#1{%
+ \pgfpointtransformed{#1}%
+ \pgf@roundcornerifneeded%
+ \pgf@nlt@lineto{\pgf@x}{\pgf@y}%
+ \global\pgf@path@lastx=\pgf@x%
+ \global\pgf@path@lasty=\pgf@y%
+}
+
+
+
+% Close the current path.
+%
+% Example:
+%
+% % Draws two triangles
+% \pgfpathmoveto{\pgfxy(0,0)}
+% \pgfpathlineto{\pgfxy(0,1)}
+% \pgfpathlineto{\pgfxy(1,0)}
+% \pgfclosepath
+% \pgfpathmoveto{\pgfxy(2,0)}
+% \pgfpathlineto{\pgfxy(2,1)}
+% \pgfpathlineto{\pgfxy(3,0)}
+% \pgfpathclose
+% \pgfstroke
+
+\def\pgfpathclose{%
+ \pgf@roundcornerifneeded%
+ \pgf@nlt@closepath%
+}
+
+
+% Append a cubic bezier spline from the current point to #3 with control
+% points #1 and #2 to the current path.
+%
+% #1 = first control point
+% #2 = second control point
+% #3 = end point
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointxy{0}{0}}
+% \pgfpathcurveto{\pgfpointxy{0}{1}}{\pgfpointxy{1}{1}}{\pgfpointxy{1}{2}}
+% \pgfstroke
+
+\def\pgfpathcurveto#1#2#3{%
+ \pgfpointtransformed{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgfpointtransformed{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfpointtransformed{#1}%
+ \pgf@roundcornerifneeded%
+ \pgf@nlt@curveto{\pgf@x}{\pgf@y}{\pgf@xa}{\pgf@ya}{\pgf@xb}{\pgf@yb}%
+ \global\pgf@path@lastx=\pgf@xb%
+ \global\pgf@path@lasty=\pgf@yb%
+}
+
+
+
+% Append a quadratic bezier spline from the current point to #2 with
+% control point #1 to the current path.
+%
+% #1 = control point
+% #2 = end point
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointxy{0}{0}}
+% \pgfpathquadraticcurveto{\pgfpointxy{1}{1}}{\pgfpointxy{2}{0}}
+% \pgfstroke
+
+\def\pgfpathquadraticcurveto#1#2{%
+ \pgfpointtransformed{#2}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgfpointtransformed{#1}%
+ \pgf@xc=.6666666\pgf@x%
+ \pgf@yc=.6666666\pgf@y%
+ % compute second control point:
+ \pgf@xa=.33333333\pgf@xb%
+ \pgf@ya=.33333333\pgf@yb%
+ \advance\pgf@xa by\pgf@xc%
+ \advance\pgf@ya by\pgf@yc%
+ % compute first control point
+ \advance\pgf@xc by.3333333\pgf@path@lastx%
+ \advance\pgf@yc by.3333333\pgf@path@lasty%
+ \pgf@roundcornerifneeded%
+ \pgf@nlt@curveto{\pgf@xc}{\pgf@yc}{\pgf@xa}{\pgf@ya}{\pgf@xb}{\pgf@yb}%
+ \global\pgf@path@lastx=\pgf@xb%
+ \global\pgf@path@lasty=\pgf@yb%
+}
+
+
+
+
+% Append an arc to the current point, where the current point is at
+% angle #1 and the end is at angle #2. If #2 > #1, the arc is drawn
+% counter-clockwise, otherwise it is clockwise.
+%
+% #1 = angle of first point
+% #2 = angle of second point
+% #3 = radius or x-radius/y-radius
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfxy(0,0)}
+% \pgfpatharc{0}{90}{2cm}
+% \pgfstroke
+
+\def\pgfpatharc#1#2#3{%
+ {%
+ \pgfmathparse{#1}\let\pgf@temp@a=\pgfmathresult%
+ \pgfmathparse{#2}\let\pgf@temp@b=\pgfmathresult%
+ \pgfutil@in@{and }{#3}%
+ \ifpgfutil@in@%
+ \pgf@arc@get@radii#3\pgf@arc@stop%
+ \else
+ \pgf@arc@get@radii#3and #3\pgf@arc@stop%
+ \fi%
+ \pgf@arc@local@angle@a=\pgf@temp@a pt%
+ \pgf@arc@local@angle@b=\pgf@temp@b pt%
+ \loop%
+ \pgfutil@tempdima=\pgf@arc@local@angle@a%
+ \advance\pgfutil@tempdima by-\pgf@arc@local@angle@b\relax%
+ \ifdim\pgfutil@tempdima<0pt\relax%
+ \pgfutil@tempdima=-\pgfutil@tempdima\relax%
+ \fi%
+ \ifdim\pgfutil@tempdima>90pt\relax%
+ \ifdim\pgfutil@tempdima>115pt\relax%
+ \pgf@arc@temp=90pt% big skip
+ \else%
+ \pgf@arc@temp=60pt% smaller skip to ensure wide segments
+ % (important shortened end segments because
+ % of arrow tips)
+ \fi%
+ \ifdim\pgf@arc@local@angle@b>\pgf@arc@local@angle@a\relax%
+ {%
+ \pgf@arc@local@angle@b=\pgf@arc@local@angle@a\relax%
+ \advance\pgf@arc@local@angle@b by\pgf@arc@temp\relax%
+ \pgf@arc%
+ }
+ \advance\pgf@arc@local@angle@a by\pgf@arc@temp\relax%
+ \else
+ {%
+ \pgf@arc@local@angle@b=\pgf@arc@local@angle@a\relax%
+ \advance\pgf@arc@local@angle@b by-\pgf@arc@temp\relax%
+ \pgf@arc%
+ }%
+ \advance\pgf@arc@local@angle@a by-\pgf@arc@temp\relax%
+ \fi%
+ \repeat%
+ \pgf@roundcornerifneeded%
+ \pgf@arc%
+ }%
+}
+\dimendef\pgf@arc@local@angle@a=0
+\dimendef\pgf@arc@local@angle@b=1
+\dimendef\pgf@arc@temp=2
+
+\def\pgf@arc@get@radii#1and #2\pgf@arc@stop{%
+ \pgfmathparse{#1}\let\pgf@arc@radius@a=\pgfmathresult%
+ \pgfmathparse{#2}\let\pgf@arc@radius@b=\pgfmathresult%
+}
+
+
+\def\pgf@arc{%
+ {%
+ \pgfutil@tempdima=\pgf@arc@radius@a pt%
+ \pgfutil@tempdimb=\pgf@arc@radius@b pt%
+ %
+ \pgf@xa=\pgf@arc@local@angle@a\relax%
+ \pgf@xb=\pgf@arc@local@angle@b\relax%
+ \advance\pgf@xb by-\pgf@xa\relax%
+ \ifdim\pgf@xb<0pt\relax%
+ \pgf@xb=-\pgf@xb\relax%
+ \fi%
+ \ifdim\pgf@xb=90.0pt%
+ \def\pgfmathresult{0.55228475}%
+ \else%
+ \pgfmathparse{1.333333333*tan(.25*\pgf@sys@tonumber{\pgf@xb})}% many thanks to Ken Starks
+ \fi%
+ \pgfutil@tempdima=\pgfmathresult\pgfutil@tempdima%
+ \pgfutil@tempdimb=\pgfmathresult\pgfutil@tempdimb%
+ %.. controls +(\pgf@xa+90:\pgfutil@tempdima) and +(\pgf@xb-90:\pgfutil@tempdima) .. +(-(#1:#3)+(#2:#3))%
+ % store first support vector in xa/ya:
+ \pgf@xa=\pgf@arc@local@angle@a\relax%
+ \ifdim\pgf@arc@local@angle@b>\pgf@arc@local@angle@a\relax%
+ \advance\pgf@xa by 90pt\relax%
+ \else%
+ \advance\pgf@xa by -90pt\relax%
+ \fi%
+ \edef\pgf@arc@angle{\pgf@sys@tonumber{\pgf@xa}}%
+ \pgfpointtransformed{\pgfpointpolar{\pgf@arc@angle}{\pgfutil@tempdima and \pgfutil@tempdimb}}%
+ \advance\pgf@x by-\pgf@pt@x%
+ \advance\pgf@y by-\pgf@pt@y%
+ \pgf@xa=\pgf@path@lastx%
+ \pgf@ya=\pgf@path@lasty%
+ \advance\pgf@xa by \pgf@x%
+ \advance\pgf@ya by \pgf@y%
+ % store target in xb/yb:
+ \pgfpointtransformed{\pgfpointpolar{\pgf@sys@tonumber{\pgf@arc@local@angle@a}}{\pgf@arc@radius@a pt and \pgf@arc@radius@b pt}}%
+ \pgf@xb=\pgf@path@lastx%
+ \pgf@yb=\pgf@path@lasty%
+ \advance\pgf@xb by -\pgf@x%
+ \advance\pgf@yb by -\pgf@y%
+ \pgfpointtransformed{\pgfpointpolar{\pgf@sys@tonumber{\pgf@arc@local@angle@b}}{\pgf@arc@radius@a pt and \pgf@arc@radius@b pt}}%
+ \advance\pgf@xb by \pgf@x%
+ \advance\pgf@yb by \pgf@y%
+ % store second support xc/yc:
+ \ifdim\pgf@arc@local@angle@b>\pgf@arc@local@angle@a\relax%
+ \advance\pgf@arc@local@angle@b by -90pt\relax%
+ \else%
+ \advance\pgf@arc@local@angle@b by 90pt\relax%
+ \fi%
+ \pgfpointtransformed{\pgfpointpolar{\pgf@sys@tonumber{\pgf@arc@local@angle@b}}{\pgfutil@tempdima and \pgfutil@tempdimb}}%
+ \advance\pgf@x by-\pgf@pt@x%
+ \advance\pgf@y by-\pgf@pt@y%
+ \pgf@xc=\pgf@xb\relax%
+ \pgf@yc=\pgf@yb\relax%
+ \advance \pgf@xc by \pgf@x\relax%
+ \advance \pgf@yc by \pgf@y\relax%
+ \pgf@nlt@curveto{\pgf@xa}{\pgf@ya}{\pgf@xc}{\pgf@yc}{\pgf@xb}{\pgf@yb}%
+ \global\pgf@path@lastx=\pgf@xb%
+ \global\pgf@path@lasty=\pgf@yb%
+ }%
+}
+
+
+% Append an arc to the current point, where the arc is on an ellipse
+% given by two axis vectors.
+%
+% #1 = angle of first point
+% #2 = angle of second point
+% #3 = first axis
+% #4 = second axis
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfxy(0,0)}
+% \pgfpatharcaxes{0}{90}{\pgfpointxy{2}{0}}{\pgfpointxy{0}{2}}
+% \pgfstroke
+
+\def\pgfpatharcaxes#1#2#3#4{%
+ {%
+ \pgftransformtriangle{\pgfpointorigin}{#3}{#4}%
+ \pgfpatharc{#1}{#2}{1pt}%
+ }%
+}
+
+
+
+% Append an arc to the current point that ends at a given position.
+%
+% #1 = x-radius
+% #2 = y-radius
+% #3 = x-axis-rotation (in degrees)
+% #4 = large-arc-sweep-flag (0 or 1)
+% #5 = sweep-flag (0 or 1)
+% #6 = target point
+%
+% Description:
+%
+% This command implements an arc drawing where a given target
+% coordinate (#6) is given and the task is to draw an arc of an
+% ellipse with the given radii. The center point of the ellipse is not
+% give, but computed automatically.
+%
+% This kind of "endpoint parameterization" of an arc is exactly the
+% same as the one specified by the SVG-specification for the "A" and
+% "a" path commands. Please see the SVG-specification for details.
+%
+% Note that the problem is internally converted to drawing an arc
+% using \pgfpatharc. This means that there may be a heavy loss of
+% accuracy.
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpoint{1cm}{1cm}}
+% \pgfpatharcto{1cm}{1cm}{0}{0}{0}{\pgfpoint{0cm}{2cm}}
+
+\def\pgfpatharcto#1#2#3#4#5#6{%
+ {%
+ % The following code is based on the transformation described in svg
+ % 1.1 specification Section F.6.5
+ %
+ % Step 1: store the simple parameters (xa=x1 since TeX does not
+ % allow numbers in names)
+ %
+ \pgfmathsetmacro\pgf@arcto@rx{abs(#1)}%
+ \pgfmathsetmacro\pgf@arcto@ry{abs(#2)}%
+ \ifdim\pgf@arcto@rx pt=0pt% special rule: zero radius=straight line
+ \gdef\pgf@marshal{\pgfpathlineto{#6}}%
+ \else
+ \ifdim\pgf@arcto@ry pt=0pt% special rule: zero radius=straight line
+ \gdef\pgf@marshal{\pgfpathlineto{#6}}%
+ \else
+ \pgfmathsetmacro\pgf@arcto@phi{#3}%
+ \pgfmathsetmacro\pgf@arcto@fA{#4}%
+ \ifdim\pgf@arcto@fA pt=0pt
+ \else
+ \pgfmathsetmacro\pgf@arcto@fA{1.0} % Special rule: every non-zero value is 1.
+ \fi
+ \pgfmathsetmacro\pgf@arcto@fS{#5}%
+ \ifdim\pgf@arcto@fS pt=0pt
+ \else
+ \pgfmathsetmacro\pgf@arcto@fS{1.0} % Special rule: every non-zero value is 1.
+ \fi
+ \pgf@process{#6}
+ \edef\pgf@arcto@xb{\the\pgf@x}%
+ \edef\pgf@arcto@yb{\the\pgf@y}%
+ %
+ % Step 2: x1,y1 is more complicated to compute: It is given by lastx
+ % and lasty, but these are transformed coordinates, we need the
+ % untransformed ones. So, we inverse the transformation (arghh...)
+ %
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@path@lastx}{\pgf@path@lasty}}}
+ \edef\pgf@arcto@xa{\the\pgf@x}
+ \edef\pgf@arcto@ya{\the\pgf@y}
+ \edef\pgf@temp@a{\pgf@arcto@xa,\pgf@arcto@ya}
+ \edef\pgf@temp@b{\pgf@arcto@xb,\pgf@arcto@yb}
+ \ifx\pgf@temp@a\pgf@temp@b% special rule: skip!
+ \global\let\pgf@marshal\pgfutil@empty
+ \else
+ %
+ % Ok, now we got all the parameters setup. Now comes the
+ % computation...
+ %
+ %
+ % Step 3: Start with a new coordinate system and rotate everything
+ % by the negated phi.
+ %
+ \pgftransformreset
+ \pgftransformrotate{-\pgf@arcto@phi}
+ % Ok, using \pgfpointtransformed we now get transformed points...
+ %
+ % Step 4: Compute x1' and y1' (xaprime and yaprime)
+ %
+ \pgf@process{
+ \pgfpointtransformed{\pgfpointscale{.5}{\pgfpointdiff
+ {\pgfqpoint{\pgf@arcto@xb}{\pgf@arcto@yb}}
+ {\pgfqpoint{\pgf@arcto@xa}{\pgf@arcto@ya}}
+ }
+ }
+ }
+ \edef\pgf@arcto@xaprime{\pgf@sys@tonumber\pgf@x}
+ \edef\pgf@arcto@yaprime{\pgf@sys@tonumber\pgf@y}
+ %
+ % Compute Lambda
+ %
+ \pgfmathsetmacro\pgf@arcto@frac@x{\pgf@arcto@xaprime/\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@frac@y{\pgf@arcto@yaprime/\pgf@arcto@ry}
+ \pgfmathsetmacro\pgf@arcto@lambda{
+ \pgf@arcto@frac@x*\pgf@arcto@frac@x+\pgf@arcto@frac@y*\pgf@arcto@frac@y
+ }
+ \ifdim\pgf@arcto@lambda pt>1pt%
+ \pgfmathsetmacro\pgf@arcto@sqrt@lambda{sqrt(\pgf@arcto@lambda)}
+ \pgfmathsetmacro\pgf@arcto@rx{\pgf@arcto@sqrt@lambda*\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@ry{\pgf@arcto@sqrt@lambda*\pgf@arcto@ry}
+ \fi
+ %
+ % Do some scaling
+ %
+ \pgfmathsetmacro\pgf@arcto@xaprime@abs{abs(\pgf@arcto@xaprime)}
+ \pgfmathsetmacro\pgf@arcto@yaprime@abs{abs(\pgf@arcto@yaprime)}
+ \pgfmathmax@{\pgf@arcto@rx,\pgf@arcto@ry,\pgf@arcto@xaprime@abs,\pgf@arcto@yaprime@abs}
+ \pgfmathsetmacro\pgf@arcto@scaling{20/\pgfmathresult}
+ \pgfmathsetmacro\pgf@arcto@rx@scaled{\pgf@arcto@scaling*\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@ry@scaled{\pgf@arcto@scaling*\pgf@arcto@ry}
+ \pgfmathsetmacro\pgf@arcto@xaprime@scaled{\pgf@arcto@scaling*\pgf@arcto@xaprime}
+ \pgfmathsetmacro\pgf@arcto@yaprime@scaled{\pgf@arcto@scaling*\pgf@arcto@yaprime}
+ %
+ % Step 5: Now comes the messy computation of c1' and c2'.
+ %
+ \ifdim\pgf@arcto@rx pt>\pgf@arcto@ry pt%
+ \pgfmathsetmacro\pgf@arcto@rx@over@ry{\pgf@arcto@rx/\pgf@arcto@ry}
+ \pgfmathsetmacro\pgf@arcto@ry@over@rx{\pgf@arcto@ry/\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@temp{\pgf@arcto@ry@over@rx*\pgf@arcto@xaprime@scaled}
+ \pgfmathsetmacro\pgf@arcto@numerator{
+ \pgf@arcto@ry@scaled*\pgf@arcto@ry@scaled-
+ \pgf@arcto@yaprime@scaled*\pgf@arcto@yaprime@scaled-
+ \pgf@arcto@temp*\pgf@arcto@temp
+ }
+ \pgfmathsetmacro\pgf@arcto@denominator{
+ \pgf@arcto@yaprime@scaled*\pgf@arcto@yaprime@scaled+
+ \pgf@arcto@temp*\pgf@arcto@temp
+ }
+ \else
+ \pgfmathsetmacro\pgf@arcto@rx@over@ry{\pgf@arcto@rx/\pgf@arcto@ry}
+ \pgfmathsetmacro\pgf@arcto@ry@over@rx{\pgf@arcto@ry/\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@temp{\pgf@arcto@rx@over@ry*\pgf@arcto@yaprime@scaled}
+ \pgfmathsetmacro\pgf@arcto@numerator{
+ \pgf@arcto@rx@scaled*\pgf@arcto@rx@scaled-
+ \pgf@arcto@xaprime@scaled*\pgf@arcto@xaprime@scaled-
+ \pgf@arcto@temp*\pgf@arcto@temp
+ }
+ \pgfmathsetmacro\pgf@arcto@denominator{
+ \pgf@arcto@xaprime@scaled*\pgf@arcto@xaprime@scaled+
+ \pgf@arcto@temp*\pgf@arcto@temp
+ }
+ \fi
+ \pgfmathsetmacro\pgf@arcto@frac{
+ \pgf@arcto@numerator/\pgf@arcto@denominator
+ }
+ \ifdim\pgf@arcto@frac pt<0pt
+ \pgfmathsetmacro\pgf@arcto@factor{0}
+ \else
+ \pgfmathsetmacro\pgf@arcto@factor{sqrt(\pgf@arcto@frac)}
+ \fi
+ \ifx\pgf@arcto@fA\pgf@arcto@fS
+ \pgfmathsetmacro\pgf@arcto@factor{-\pgf@arcto@factor}
+ \fi
+ \pgfmathsetmacro\pgf@arcto@cxprime{
+ \pgf@arcto@factor*\pgf@arcto@rx@over@ry*\pgf@arcto@yaprime
+ }
+ \pgfmathsetmacro\pgf@arcto@cyprime{
+ -\pgf@arcto@factor*\pgf@arcto@ry@over@rx*\pgf@arcto@xaprime
+ }
+ %
+ % Step 6: Ok, now compute cx,cy
+ %
+ \pgftransformreset
+ \pgftransformrotate{\pgf@arcto@phi}
+ \pgf@process{
+ \pgfpointtransformed{\pgfqpoint{\pgf@arcto@cxprime pt}{\pgf@arcto@cyprime pt}}
+ }
+ \edef\pgf@arcto@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \pgf@process{\pgfpointadd{\pgf@arcto@temp}{
+ \pgfpointscale{.5}{
+ \pgfpointadd
+ {\pgfqpoint{\pgf@arcto@xa}{\pgf@arcto@ya}}
+ {\pgfqpoint{\pgf@arcto@xb}{\pgf@arcto@yb}} }
+ }
+ }
+ \edef\pgf@arcto@cx{\the\pgf@x}
+ \edef\pgf@arcto@cy{\the\pgf@y}
+ %
+ % Step 7: Compute start angle:
+ %
+ \pgfmathsetmacro\pgf@arcto@vec@x{(\pgf@arcto@xaprime-\pgf@arcto@cxprime)/\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@vec@y{(\pgf@arcto@yaprime-\pgf@arcto@cyprime)/\pgf@arcto@ry}
+ \pgfmathsetmacro\pgf@arcto@denominator{veclen(\pgf@arcto@vec@x,\pgf@arcto@vec@y)}
+ \pgfmathsetmacro\pgf@arcto@frac{\pgf@arcto@vec@x/\pgf@arcto@denominator}
+ \pgfmathsetmacro\pgf@arcto@theta@start{acos(\pgf@arcto@frac)}
+ \ifdim\pgf@arcto@vec@y pt<0pt
+ \pgfmathsetmacro\pgf@arcto@theta@start{-\pgf@arcto@theta@start}
+ \fi
+ %
+ % Step 8: Compute end angle:
+ %
+ \pgfmathsetmacro\pgf@arcto@vec@x{(-\pgf@arcto@xaprime-\pgf@arcto@cxprime)/\pgf@arcto@rx}
+ \pgfmathsetmacro\pgf@arcto@vec@y{(-\pgf@arcto@yaprime-\pgf@arcto@cyprime)/\pgf@arcto@ry}
+ \pgfmathsetmacro\pgf@arcto@denominator{veclen(\pgf@arcto@vec@x,\pgf@arcto@vec@y)}
+ \pgfmathsetmacro\pgf@arcto@frac{\pgf@arcto@vec@x/\pgf@arcto@denominator}
+ \pgfmathsetmacro\pgf@arcto@theta@end{acos(\pgf@arcto@frac)}
+ \ifdim\pgf@arcto@vec@y pt<0pt
+ \pgfmathsetmacro\pgf@arcto@theta@end{-\pgf@arcto@theta@end}
+ \fi
+ \pgfmathsetmacro\pgf@arcto@delta@theta{abs(\pgf@arcto@theta@start-\pgf@arcto@theta@end)}
+ \ifdim\pgf@arcto@fA pt=0pt%
+ \ifdim\pgf@arcto@delta@theta pt>180pt%
+ % Ok, we need to adjust the angle!
+ \ifdim\pgf@arcto@theta@end pt>\pgf@arcto@theta@start pt
+ \pgfmathsetmacro\pgf@arcto@theta@end{\pgf@arcto@theta@end-360}
+ \else
+ \pgfmathsetmacro\pgf@arcto@theta@end{\pgf@arcto@theta@end+360}
+ \fi
+ \fi
+ \else
+ \ifdim\pgf@arcto@delta@theta pt<180pt%
+ % Ok, we need to adjust the angle!
+ \ifdim\pgf@arcto@theta@end pt>\pgf@arcto@theta@start pt
+ \pgfmathsetmacro\pgf@arcto@theta@end{\pgf@arcto@theta@end-360}
+ \else
+ \pgfmathsetmacro\pgf@arcto@theta@end{\pgf@arcto@theta@end+360}
+ \fi
+ \fi
+ \fi
+ \xdef\pgf@marshal{\noexpand
+ \pgfpatharcaxes{\pgf@arcto@theta@start}{\pgf@arcto@theta@end}
+ {\noexpand\pgfpointpolar{\pgf@arcto@phi}{\pgf@arcto@rx}}
+ {\noexpand\pgfpointpolar{\pgf@arcto@phi+90}{\pgf@arcto@ry}}
+ }
+ \fi\fi\fi
+ }
+ \pgf@marshal
+}
+
+
+
+% the quality of arc approximation by means of Bezier splines is
+% controlled by a mesh width.
+%
+% The mesh width is provided in (full!) degrees. The smaller the mesh
+% width, the more precise the arc approximation.
+%
+% Use an empty value to disable spline approximation (uses a single
+% cubic polynomial for the complete arc).
+%
+% The value must be an integer!
+\def\pgfpatharctomaxstepsize{45}
+
+% A specialized arc operation for an arc on an (axis--parallel) ellipse.
+%
+% In contrast to \pgfpatharc, it explicitly interpolates start- and end points.
+%
+% In contrast to \pgfpatharcto, this routine is numerically stable and
+% quite fast since it relies on a lot of precomputed information.
+%
+% #1 center of ellipse
+% #2 angle of last path position inside of the ellipse
+% #3 end angle
+% #4 end point (a \pgfpoint)
+% #5 xradius
+% #6 yradius
+% #7 the ratio xradius/yradius of the ellipse
+% #8 the ratio yradius/xradius of the ellipse
+% Example:
+% \def\cx{1cm}% center x
+% \def\cy{1cm}% center y
+% \def\startangle{0}%
+% \def\endangle{45}%
+% \def\a{5cm}% xradius
+% \def\b{10cm}% yradius
+% \pgfmathparse{\a/\b}\let\abratio=\pgfmathresult
+% \pgfmathparse{\b/\a}\let\baratio=\pgfmathresult
+%
+% \pgfpathmoveto{\pgfpoint{\cx+\a*cos(\startangle)}{\cy+\b*sin(\startangle)}}%
+% \pgfpatharctoprecomputed
+% {\pgfpoint{\cx}{\cy}}
+% {\startangle}
+% {\endangle}
+% {\pgfpoint{\cx+\a*cos(\endangle)}{\cy+\b*sin(\endangle)}}%
+% {\a}
+% {\b}
+% {\abratio}
+% {\baratio}
+%
+\def\pgfpatharctoprecomputed#1#2#3#4#5#6#7#8{%
+ \begingroup
+ % Implementation idea:
+ %
+ % let
+ % m = center (#1)
+ % \gamma_0 = start angle
+ % \gamma_1 = end angle
+ % a = x radius
+ % b = y radius
+ %
+ % an axis parallel ellipse is parameterized by
+ % C(\gamma) = m + ( a cos(\gamma), b sin(\gamma) ), \gamma in [0,360].
+ %
+ % Now, consider the segment \gamma(t),
+ % \gamma:[0,1] -> [\gamma_0,\gamma_1],
+ % t -> \gamma_0 + t(\gamma_1 - \gamma_0)
+ % and
+ % C(\gamma(t)) which is defined on [0,1].
+ %
+ % I'd like to approximate the arc by one or more cubic bezier
+ % splines which interpolate through the last and first provided
+ % points.
+ %
+ % In general, a Bezier spline C:[0,1] -> \R of order n fulfills
+ % C'(0) = n ( P_1 - P_0 ),
+ % C'(1) = n ( P_n - P_{n-1} ).
+ % For n=3 and given P_0 and P_3, I can directly compute P_1 and P_2 once I know
+ % the derivatives at t=0 and t=1.
+ %
+ % The derivatives in our case are
+ % ( C \circ \gamma )'(t) = C'[\gamma(t)] * \gamma'(t)
+ % = ( -a pi/180 sin(\gamma(t)), b pi/180 cos(\gamma(t)) ) * (\gamma_1 - \gamma_0).
+ % The pi/180 comes into play since we are working with degrees.
+ %
+ % Expression (C\circ\gamma)'(0) using P_0 and (C \circ \gamma)'(1)
+ % using P_3 yields the expressions
+ % (C \circ \gamma)'(0) =
+ % pi/180 * (\gamma_1 - \gamma_0)* [ - a/b(P_0^y - my), b/a (P_0^x - mx) ]
+ % (C \circ \gamma)'(1) =
+ % pi/180 * (\gamma_1 - \gamma_0)* [ - a/b(P_3^y - my), b/a (P_3^x - mx) ]
+ %
+ % defining
+ % scaleA = a/b * pi / (3*180) * (\gamma_1 - \gamma_0)
+ % and
+ % scaleB = b/a * pi / (3*180) * (\gamma_1 - \gamma_0)
+ % yields the direct expressions for the intermediate bezier
+ % control points
+ %
+ % P_1 = [
+ % P_0^x - scaleA* ( P_0^y -my),
+ % P_0^y + scaleB* ( P_0^x -mx) ]
+ % and
+ % P_2 = [
+ % P_3^x + scaleA* ( P_3^y -my),
+ % P_3^y - scaleB* ( P_3^x -mx) ].
+ %
+ % This works fast, with few operations, if
+ % - a/b and b/a are known in advance
+ % - P_0 and P_3 are known in advance
+ % - \gamma_0 and \gamma_1 are known.
+ %
+ % It is also reliable if (\gamma_1 - \gamma_0) is small
+ %
+ \pgf@process{#1}%
+ \edef\pgfpath@center@x{\the\pgf@x}%
+ \edef\pgfpath@center@y{\the\pgf@y}%
+ \def\pgfpath@completearcend{#4}%
+ % compute scale (#3-#2) * pi/(3*180) = (#3 - #2) * pi/27 * 1/20
+ % splitting pi/(3*180) into two scales has higher TeX accuracy
+ \pgf@xa=#2pt
+ \pgf@xb=#3pt
+ \edef\pgfpath@startangle{#2pt}%
+ \edef\pgfpath@endangle{\pgf@sys@tonumber\pgf@xb}%
+ %
+ \pgf@ya=\pgf@xb
+ \advance\pgf@ya by-\pgf@xa
+ %
+ \ifx\pgfpatharctomaxstepsize\pgfutil@empty
+ \def\pgfpath@N{1}%
+ \pgf@xc=\pgf@ya
+ \else
+ \pgf@xc=\pgf@ya% compute N = floor((gamma_1 - gamma_0) / max) +1
+ \ifdim\pgf@xc<0pt
+ \multiply\pgf@xc by-1
+ \fi
+ \divide\pgf@xc by\pgfpatharctomaxstepsize\relax
+ \afterassignment\pgfutil@gobble@until@relax
+ \c@pgf@counta=\the\pgf@xc\relax
+ \advance\c@pgf@counta by1
+ \edef\pgfpath@N{\the\c@pgf@counta}%
+ %
+ \pgf@xc=\pgf@ya
+ \divide\pgf@xc by\c@pgf@counta
+ \fi
+ %
+ \edef\pgfpath@h{\pgf@sys@tonumber\pgf@xc}%
+ %
+%\message{pgfpathellipse: using N =\pgfpath@N\space spline points y0 = \pgfpath@startangle, y0+i*h, yN=\pgfpath@endangle, i=1,...,(\pgfpath@N-1), with h=\pgfpath@h\space mesh width (total arc angle \pgf@sys@tonumber\pgf@ya).}%
+ %
+ %
+ \pgf@xc=0.116355283466289\pgf@xc % pi/27
+ \divide\pgf@xc by20
+ \pgf@xa=#7\pgf@xc
+ \edef\pgfpath@scale@A{\pgf@sys@tonumber\pgf@xa}%
+ \pgf@xa=#8\pgf@xc
+ \edef\pgfpath@scale@B{\pgf@sys@tonumber\pgf@xa}%
+ %
+ % compute intermediate spline segments for
+ % i = 1,...,N-1
+ % this is a no-op for N=1.
+ \c@pgf@countd=1
+ \pgfutil@loop
+ \ifnum\c@pgf@countd<\pgfpath@N\relax
+ %
+ \pgf@xa=\pgfpath@startangle % compute \pgf@xa = y_0 + i*h
+ \pgf@xb=\pgfpath@h pt
+ \multiply\pgf@xb by\c@pgf@countd
+ \advance\pgf@xa by\pgf@xb
+ \edef\pgfpath@angle@i{\pgf@sys@tonumber\pgf@xa}%
+%\message{angle \the\c@pgf@countd: \pgfpath@angle@i...}%
+ %
+ \pgfpatharcofellipse@{%
+ \pgfpoint
+ {\pgfpath@center@x + #5*cos(\pgfpath@angle@i)}
+ {\pgfpath@center@y + #6*sin(\pgfpath@angle@i)}%
+ }%
+ %
+ \advance\c@pgf@countd by1
+ \pgfutil@repeat
+ %
+ % compute final spline segment. It only differs insofar as the
+ % final point is already known explicitly and should be
+ % interpolated without additional math error.
+%\message{angle \pgfpath@N: \pgfpath@endangle...}%
+ \pgfpatharcofellipse@{\pgfpath@completearcend}%
+ \endgroup
+}%
+\def\pgfpatharcofellipse@#1{%
+ \begingroup
+ \pgf@process{#1}%
+ \edef\pgfpath@endpt{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
+ %
+ \pgfpathcurveto{
+ \begingroup
+ \global\pgf@x=\pgf@path@lastx
+ \global\pgf@y=\pgf@path@lasty
+ \pgf@xa=\pgf@x \advance\pgf@xa by-\pgfpath@center@x
+ \pgf@ya=\pgf@y \advance\pgf@ya by-\pgfpath@center@y
+ \global\advance\pgf@x by-\pgfpath@scale@A\pgf@ya
+ \global\advance\pgf@y by \pgfpath@scale@B\pgf@xa
+ \endgroup
+ }{%
+ \begingroup
+ \pgfpath@endpt
+ \pgf@xa=\pgf@x \advance\pgf@xa by-\pgfpath@center@x
+ \pgf@ya=\pgf@y \advance\pgf@ya by-\pgfpath@center@y
+ \global\advance\pgf@x by \pgfpath@scale@A\pgf@ya
+ \global\advance\pgf@y by-\pgfpath@scale@B\pgf@xa
+ \endgroup
+ }{%
+ \pgfpath@endpt
+ }%
+ \endgroup
+}
+
+
+
+
+
+
+
+
+
+% Append an ellipse to the current path.
+%
+% #1 = center
+% #2 = first axis
+% #3 = second axis
+%
+% Example:
+%
+% % Add a circle of radius 3cm around the origin
+% \pgfpathellipse{\pgforigin}{\pgfxy(2,0)}{\pgfxy(0,1)}
+%
+% % Draw a non-filled circle of radius 1cm around the point (1,1)
+% \pgfpathellipse{\pgfxy(1,1)}{\pgfxy(1,1)}{\pgfxy(-2,2)}
+% \pgfstroke
+
+\def\pgfpathellipse#1#2#3{%
+ \pgfpointtransformed{#1}% store center in xc/yc
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfpointtransformed{#2}%
+ \pgf@xa=\pgf@x% store first axis in xa/ya
+ \pgf@ya=\pgf@y%
+ \advance\pgf@xa by-\pgf@pt@x%
+ \advance\pgf@ya by-\pgf@pt@y%
+ \pgfpointtransformed{#3}%
+ \pgf@xb=\pgf@x% store second axis in xb/yb
+ \pgf@yb=\pgf@y%
+ \advance\pgf@xb by-\pgf@pt@x%
+ \advance\pgf@yb by-\pgf@pt@y%
+ {%
+ \advance\pgf@xa by\pgf@xc%
+ \advance\pgf@ya by\pgf@yc%
+ \pgf@nlt@moveto{\pgf@xa}{\pgf@ya}%
+ }%
+ \pgf@x=0.55228475\pgf@xb% first arc
+ \pgf@y=0.55228475\pgf@yb%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \edef\pgf@temp{\pgf@xc\the\pgf@x\pgf@yc\the\pgf@y}%
+ \pgf@x=0.55228475\pgf@xa%
+ \pgf@y=0.55228475\pgf@ya%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ {%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \advance\pgf@xb by\pgf@xc%
+ \advance\pgf@yb by\pgf@yc%
+ \pgf@temp%
+ \pgf@nlt@curveto{\pgf@xc}{\pgf@yc}{\pgf@x}{\pgf@y}{\pgf@xb}{\pgf@yb}%
+ }%
+ \pgf@xa=-\pgf@xa% flip first axis
+ \pgf@ya=-\pgf@ya%
+ \pgf@x=0.55228475\pgf@xa% second arc
+ \pgf@y=0.55228475\pgf@ya%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \edef\pgf@temp{\pgf@xc\the\pgf@x\pgf@yc\the\pgf@y}%
+ \pgf@x=0.55228475\pgf@xb%
+ \pgf@y=0.55228475\pgf@yb%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ {%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \advance\pgf@xa by\pgf@xc%
+ \advance\pgf@ya by\pgf@yc%
+ \pgf@temp%
+ \pgf@nlt@curveto{\pgf@xc}{\pgf@yc}{\pgf@x}{\pgf@y}{\pgf@xa}{\pgf@ya}%
+ }%
+ \pgf@xb=-\pgf@xb% flip second axis
+ \pgf@yb=-\pgf@yb%
+ \pgf@x=0.55228475\pgf@xb% third arc
+ \pgf@y=0.55228475\pgf@yb%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \edef\pgf@temp{\pgf@xc\the\pgf@x\pgf@yc\the\pgf@y}%
+ \pgf@x=0.55228475\pgf@xa%
+ \pgf@y=0.55228475\pgf@ya%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ {%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \advance\pgf@xb by\pgf@xc%
+ \advance\pgf@yb by\pgf@yc%
+ \pgf@temp%
+ \pgf@nlt@curveto{\pgf@xc}{\pgf@yc}{\pgf@x}{\pgf@y}{\pgf@xb}{\pgf@yb}%
+ }%
+ \pgf@xa=-\pgf@xa% flip first axis once more
+ \pgf@ya=-\pgf@ya%
+ \pgf@x=0.55228475\pgf@xa% fourth arc
+ \pgf@y=0.55228475\pgf@ya%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \edef\pgf@temp{\pgf@xc\the\pgf@x\pgf@yc\the\pgf@y}%
+ \pgf@x=0.55228475\pgf@xb%
+ \pgf@y=0.55228475\pgf@yb%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ {%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \advance\pgf@xa by\pgf@xc%
+ \advance\pgf@ya by\pgf@yc%
+ \pgf@temp%
+ \pgf@nlt@curveto{\pgf@xc}{\pgf@yc}{\pgf@x}{\pgf@y}{\pgf@xa}{\pgf@ya}%
+ }%
+ \pgf@nlt@closepath%
+ \pgf@nlt@moveto{\pgf@xc}{\pgf@yc}%
+}
+
+
+
+% Append a circle to the current path
+%
+% #1 = center
+% #2 = radius
+%
+% Example:
+%
+% % Append a circle of radius 3cm around the point (1,1)
+% \pgfpathcircle{\pgxy(1,1)}{3cm}
+
+\def\pgfpathcircle#1#2{\pgfpathellipse{#1}{\pgfpoint{#2}{0pt}}{\pgfpoint{0pt}{#2}}}
+
+
+
+
+% Append a rectangle to the current path
+%
+% #1 = lower left corner point of rectangle
+% #2 = width and height vector
+%
+% Example:
+%
+% % A rectangle with corners (2,2) and (3,3)
+% \pgfpathrectangle{\pgfpointxy{2}{2}}{\pgfpointxy{1}{1}}
+
+\def\pgfpathrectangle{%
+ \let\pgfrect@next=\pgf@specialrect%
+ \ifpgf@pt@identity%
+ \ifpgf@arccorners%
+ \else%
+ \ifx\pgf@nlt@list\pgfutil@empty%
+ \let\pgfrect@next=\pgf@normalrect%
+ \fi%
+ \fi%
+ \fi%
+ \pgfrect@next%
+}
+
+\def\pgf@normalrect#1#2{%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfpointtransformed{#1}%
+ \pgfsyssoftpath@rect{\the\pgf@x}{\the\pgf@y}{\the\pgf@xa}{\the\pgf@ya}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \advance\pgf@x by\pgf@xa\relax%
+ \advance\pgf@y by\pgf@ya\relax%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+}
+
+\def\pgf@specialrect#1#2{%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#1}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \advance\pgf@xa by\pgf@xb%
+ \advance\pgf@ya by\pgf@yb%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
+ \pgfpathclose%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+}
+
+% Append a rectangle to the current path
+%
+% #1 = one corner of the rectangle
+% #2 = opposite corner of the rectangle
+%
+% Example:
+%
+% % A rectangle with corners (2,2) and (3,3)
+% \pgfpathrectanglecorners{\pgfpointxy{2}{2}}{\pgfpointxy{3}{3}}
+
+\def\pgfpathrectanglecorners#1#2{%
+ \pgf@process{#2}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{#1}%
+ \advance\pgf@xc by-\pgf@x%
+ \advance\pgf@yc by-\pgf@y%
+ \pgfpathrectangle{#1}{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+}
+
+
+% Append a grid to the current path.
+%
+% #1 = first corner point of grid
+% #2 = second corner point of grid
+%
+% Options:
+%
+% stepx = x-step dimension (default 1cm)
+% stepy = y-step dimension (default 1cm)
+% step = dimension vector
+%
+% Example:
+%
+% \pgfsetlinewidth{0.8pt}
+% \pgfgrid{\pgfxy(0,0)}{\pgfxy(3,2)}
+% \pgfsetlinewidth{0.4pt}
+% \pgfgrid[stepx=1cm,stepy=1cm]{\pgfxy(0,0)}{\pgfxy(3,2)}
+
+\pgfkeys{
+ /pgf/stepx/.initial=1cm,
+ /pgf/stepy/.initial=1cm,
+ /pgf/step/.code={\pgf@process{#1}\pgfkeysalso{/pgf/stepx/.expanded=\the\pgf@x,/pgf/stepy/.expanded=\the\pgf@y}},
+ /pgf/step/.value required
+}
+
+\def\pgfpathgrid{\pgfutil@ifnextchar[{\pgf@pathgrid}{\pgf@pathgrid[]}}
+\def\pgf@pathgrid[#1]#2#3{%
+ \pgfset{#1}%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/stepx}}%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/stepy}}%
+ \pgf@process{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ % Swap coordinates if one of them is smaller than the other:
+ \ifdim\pgf@xa>\pgf@xb%
+ \pgf@x=\pgf@xb%
+ \pgf@xb=\pgf@xa%
+ \pgf@xa=\pgf@x%
+ \fi%
+ \ifdim\pgf@ya>\pgf@yb%
+ \pgf@y=\pgf@yb%
+ \pgf@yb=\pgf@ya%
+ \pgf@ya=\pgf@y%
+ \fi%
+ \ifdim \pgf@yc > .01pt\relax% if to draw horizontal lines
+ \c@pgf@counta=\pgf@ya\relax%
+ \c@pgf@countb=\pgf@yc\relax%
+ \divide\c@pgf@counta by\c@pgf@countb\relax%
+ \pgfutil@tempdima=\c@pgf@counta\pgf@yc\relax%
+ \ifdim\pgfutil@tempdima<\pgf@ya%
+ \advance\pgfutil@tempdima by\pgf@yc%
+ \fi%
+ \pgfutil@tempdimb\pgf@x
+ \pgfutil@loop% horizontal lines
+ {%
+ \pgf@xa=\pgfutil@tempdimb%
+ \pgf@ya=\pgfutil@tempdima%
+ \pgf@pos@transform{\pgf@xa}{\pgf@ya}
+ \pgf@nlt@moveto{\pgf@xa}{\pgf@ya}%
+ \pgf@xa=\pgf@xb%
+ \pgf@ya=\pgfutil@tempdima%
+ \pgf@pos@transform{\pgf@xa}{\pgf@ya}
+ \pgf@nlt@lineto{\pgf@xa}{\pgf@ya}%
+ }%
+ \advance\pgfutil@tempdima by\pgf@yc%
+ \ifdim\pgfutil@tempdima<\pgf@yb%
+ \pgfutil@repeat%
+ \advance\pgfutil@tempdima by-0.01pt\relax%
+ \ifdim\pgfutil@tempdima<\pgf@yb%
+ {%
+ \pgf@xa=\pgfutil@tempdimb%
+ \pgf@ya=\pgfutil@tempdima%
+ \pgf@pos@transform{\pgf@xa}{\pgf@ya}
+ \pgf@nlt@moveto{\pgf@xa}{\pgf@ya}%
+ \pgf@xa=\pgf@xb%
+ \pgf@ya=\pgfutil@tempdima%
+ \pgf@pos@transform{\pgf@xa}{\pgf@ya}
+ \pgf@nlt@lineto{\pgf@xa}{\pgf@ya}%
+ }%
+ \fi%
+ \fi%
+ \ifdim \pgf@xc > .01pt\relax% if to draw vertical lines
+ \c@pgf@counta=\pgf@xa\relax%
+ \c@pgf@countb=\pgf@xc\relax%
+ \divide\c@pgf@counta by\c@pgf@countb\relax%
+ \pgfutil@tempdimb=\c@pgf@counta\pgf@xc\relax%
+ \ifdim\pgfutil@tempdimb<\pgf@xa%
+ \advance\pgfutil@tempdimb by\pgf@xc%
+ \fi%
+ \pgfutil@loop% vertical lines
+ {%
+ \pgf@xc=\pgfutil@tempdimb%
+ \pgf@yc=\pgf@ya%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}
+ \pgf@nlt@moveto{\pgf@xc}{\pgf@yc}%
+ \pgf@xc=\pgfutil@tempdimb%
+ \pgf@yc=\pgf@yb%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}
+ \pgf@nlt@lineto{\pgf@xc}{\pgf@yc}%
+ }%
+ \advance\pgfutil@tempdimb by\pgf@xc%
+ \ifdim\pgfutil@tempdimb<\pgf@xb%
+ \pgfutil@repeat%
+ \advance\pgfutil@tempdimb by-0.01pt\relax%
+ \ifdim\pgfutil@tempdimb<\pgf@xb%
+ {%
+ \pgf@xc=\pgfutil@tempdimb%
+ \pgf@yc=\pgf@ya%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}
+ \pgf@nlt@moveto{\pgf@xc}{\pgf@yc}%
+ \pgf@xc=\pgfutil@tempdimb%
+ \pgf@yc=\pgf@yb%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}
+ \pgf@nlt@lineto{\pgf@xc}{\pgf@yc}%
+ }%
+ \fi%
+ \fi%
+ \pgf@process{#3}%
+ \pgf@pos@transform{\pgf@x}{\pgf@y}%
+ \pgf@nlt@moveto{\pgf@x}{\pgf@y}%
+}
+
+
+
+% Append two half-parabolas to the path
+%
+% #1 = bend (relative to current point)
+% #2 = end point (relative to bend point)
+%
+% Description:
+%
+% This command appends a half-parabola that starts at the current point
+% and has its bend at #1+current point. Then, a second parabola is
+% appended that starts at #1+current point, where it also has its
+% minimum/maximum, and ends at #1+current point+#2, which becomes the
+% new current point.
+%
+% By setting #2 = (0,0) you draw only a half parabola that goes from the
+% current point to the bend; by setting #1 = (0,0)
+% you draw a half parabola that going to current point + #2 and has its
+% bend at the current point.
+%
+% Examples:
+%
+% % Half-parabola going ``up and right''
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathparabola{\pgfpointorigin}{\pgfpoint{2cm}{4cm}}
+%
+% % Half-parabola going ``down and right''
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathparabola{\pgfpoint{-2cm}{4cm}}}{\pgfpointorigin}
+%
+% % Full parabola
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathparabola{\pgfpoint{-2cm}{4cm}}{\pgfpoint{2cm}{4cm}}
+
+\def\pgfpathparabola#1#2{%
+ {%
+ \pgf@process{#2}% untransformed
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#1}% untransformed
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfutil@tempswatrue%
+ \ifdim\pgf@xb=0pt\relax%
+ \ifdim\pgf@yb=0pt\relax%
+ \pgfutil@tempswafalse%
+ \fi%
+ \fi%
+ {%
+ \ifpgfutil@tempswa%
+ \pgf@arccornersfalse
+ \else%
+ \fi%
+ \pgfutil@tempswatrue%
+ \ifdim\pgf@xc=0pt\relax%
+ \ifdim\pgf@yc=0pt\relax%
+ \pgfutil@tempswafalse%
+ \fi%
+ \fi%
+ \ifpgfutil@tempswa
+ {%
+ \pgf@pt@x=\pgf@path@lastx%
+ \pgf@pt@y=\pgf@path@lasty%
+ \pgfpathcurveto%
+ {\pgfqpoint{.1125\pgf@xc}{.225\pgf@yc}}% found by trial and error
+ {\pgfqpoint{.5\pgf@xc}{\pgf@yc}}% found by trial and error
+ {\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ }%
+ \fi%
+ }%
+ \ifpgfutil@tempswa%
+ \pgf@xc=\pgf@xb%
+ \pgf@yc=\pgf@yb%
+ {%
+ \pgf@pt@x=\pgf@path@lastx%
+ \pgf@pt@y=\pgf@path@lasty%
+ \pgfpathcurveto%
+ {\pgfqpoint{.5\pgf@xc}{0\pgf@yc}}% found by trial and error
+ {\pgfqpoint{.8875\pgf@xc}{.775\pgf@yc}}% found by trial and error
+ {\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ }%
+ \fi%
+ }%
+}
+
+
+
+
+% Append a sine curve between 0 and \pi/2 to the path.
+%
+% #1 = vector, describing the width and height of the curve
+%
+% Description:
+%
+% This command appends a sine curve in the interval 0 and \pi/2 to the
+% current path. The sine curve ends at currentpoint+#1.
+%
+% Examples:
+%
+% % One complete sine in the interval [0,\pi]
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathsine{\pgfpoint{1.57cm}{1cm}}
+% \pgfpathcosine{\pgfpoint{3.141cm}{0cm}}
+
+\def\pgfpathsine#1{%
+ {%
+ \pgf@process{#1}% untransformed
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@pt@x=\pgf@path@lastx% evil trickery to transform to the last point
+ \pgf@pt@y=\pgf@path@lasty%
+ \pgfpathcurveto%
+ {\pgfqpoint{.3260\pgf@xc}{.5120\pgf@yc}}%
+ {\pgfqpoint{.6380\pgf@xc}{\pgf@yc}}%
+ {\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ }%
+}
+
+% Append a cosine curve between 0 and \pi/2 to the path.
+%
+% #1 = vector, describing the width and height of the curve
+%
+% Examples:
+%
+% % One complete sine in the interval [0,\pi]
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathsine{\pgfpoint{1.57cm}{1cm}}
+% \pgfpathcosine{\pgfpoint{3.141cm}{0cm}}
+
+\def\pgfpathcosine#1{%
+ {%
+ \pgf@process{#1}% untransformed
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@pt@x=\pgf@path@lastx% evil trickery to transform to the last point
+ \pgf@pt@y=\pgf@path@lasty%
+ \pgfpathcurveto%
+ {\pgfqpoint{.3620\pgf@xc}{0pt}}%
+ {\pgfqpoint{.6740\pgf@xc}{.4880\pgf@yc}}%
+ {\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ }%
+}
+
+
+
+% Draw part of a curve between two specified times s and t.
+%
+% #1 - a start time s.
+% #2 - an end time t.
+% #3 - start point of the curve
+% #4 - first control
+% #5 - second control
+% #6 - end point of the curve
+%
+% There are two versions, \pgfpathcurvebetweentime and
+% \pgfpathcurvebetweentimecontinue. The latter does not insert a
+% moveto to the first point.
+%
+\def\pgfpathcurvebetweentime{\pgf@ignoremovetofalse\pgf@@pathcurvebetweentime}
+\def\pgfpathcurvebetweentimecontinue{\pgf@ignoremovetotrue\pgf@@pathcurvebetweentime}
+\newif\ifpgf@ignoremoveto
+
+\def\pgf@@pathcurvebetweentime#1#2#3#4#5#6{%
+ \pgfmathparse{#1}%
+ \let\pgf@time@s=\pgfmathresult%
+ \pgfmathparse{#2}%
+ \let\pgf@time@t=\pgfmathresult%
+ \ifdim\pgf@time@s pt>\pgf@time@t pt\relax%
+ \pgfmathsetmacro\pgf@time@s{1-#1}%
+ \pgfmathsetmacro\pgf@time@t{1-#2}%
+ \pgf@@@pathcurvebetweentime{\pgf@time@t}{#6}{#5}{#4}{#3}%
+ \else%
+ \pgf@@@pathcurvebetweentime{\pgf@time@t}{#3}{#4}{#5}{#6}%
+ \fi%
+}
+
+\def\pgf@@@pathcurvebetweentime#1#2#3#4#5{%
+ % Q1 = P1.
+ \pgf@process{#2}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ % Q2 = P1 + t*(P2-P1).
+ \pgf@process{%
+ \pgf@process{#3}%
+ \pgf@xa=#1\pgf@x%
+ \pgf@ya=#1\pgf@y%
+ \pgf@process{#2}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \advance\pgf@x by-#1\pgf@xb%
+ \advance\pgf@y by-#1\pgf@yb%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ }%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ % Q3 = Q2 + t*((P2 + t*(P3-P2)) - Q2).
+ \pgf@process{%
+ \pgf@process{#4}%
+ \pgf@xa=#1\pgf@x%
+ \pgf@ya=#1\pgf@y%
+ %
+ \pgf@process{#3}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xc by-#1\pgf@x%
+ \advance\pgf@yc by-#1\pgf@y%
+ %
+ \pgf@x=\pgf@xb%
+ \pgf@y=\pgf@yb%
+ \advance\pgf@x by#1\pgf@xa%
+ \advance\pgf@y by#1\pgf@ya%
+ \advance\pgf@x by-#1\pgf@xb%
+ \advance\pgf@y by-#1\pgf@yb%
+ \advance\pgf@x by#1\pgf@xc%
+ \advance\pgf@y by#1\pgf@yc%
+ }%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ % Q4 = (1-t)^3*P1 + 3*t(1-t)^2*P2 + 3*t^2(1-t)*P3 + t^3*P4.
+ \pgf@process{\pgfpointcurveattime{#1}{#2}{#3}{#4}{#5}}%
+ \ifx#1\pgf@time@t%
+ % First time round...
+ \pgfmathdivide@{\pgf@time@s}{\pgf@time@t}%
+ \pgfmathadd@{-\pgfmathresult}{1}%
+ \let\pgf@time@s=\pgfmathresult%
+ \edef\pgf@marshal{%
+ \noexpand\pgf@@@pathcurvebetweentime{\noexpand\pgf@time@s}%
+ {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ }%
+ \else%
+ % ...second time round.
+ \ifpgf@ignoremoveto%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ }%
+ \else%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpathmoveto{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ }%
+ \fi%
+ \fi%
+ \pgf@marshal%
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorepathprocessing.code.tex b/graphics/pgf/base/tex/pgfcorepathprocessing.code.tex
new file mode 100644
index 0000000000..0f52985c19
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorepathprocessing.code.tex
@@ -0,0 +1,563 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorepathprocessing.code.tex}
+
+
+% Split a path at the last subpath of a path
+%
+% #1 = a macro that stores a path
+%
+% Description:
+%
+% This command will split the path into two parts:
+%
+% \pgfprocessresultpathprefix
+% The part of the path before the last subpath.
+%
+% \pgfprocessresultpathsuffix
+% The last subpath on the path.
+%
+% #1 will always be equal to the contents of the two above macros
+% concatenated. Normally, your objective will be to modify the
+% \pgfprocessresultpathsuffix and then concatenate the result.
+
+\def\pgfprocesssplitpath#1{%
+ \let\pgfprocessresultpathprefix\pgfutil@empty%
+ \let\pgfprocessresultpathsuffix\pgfutil@empty%
+ \let\pgf@next\pgf@process@split%
+ \expandafter\pgf@process@split#1\pgfsyssoftpath@movetotoken{}{}\pgf@stop%
+}
+
+\def\pgf@process@split#1\pgfsyssoftpath@movetotoken#2#3#4{%
+ \ifx#4\pgf@stop% ok, end reached!
+ \expandafter\def\expandafter\pgfprocessresultpathsuffix\expandafter{\pgfprocessresultpathsuffix#1}%
+ \let\pgf@next\pgfutil@gobble%
+ \else%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgfprocessresultpathprefix%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathprefix\pgfprocessresultpathsuffix#1}%
+ \def\pgfprocessresultpathsuffix{\pgfsyssoftpath@movetotoken{#2}{#3}}%
+ \fi%
+ \pgf@next#4%
+}
+
+
+
+% Split a subpath at the end
+%
+% #1 = a macro that stores an open subpath that contains at least two
+% path commands (so, not just a moveto);
+%
+% Description:
+%
+% Splits the subpath into two parts:
+%
+% \pgfprocessresultsubpathsuffix
+% This macro contains the last two "relevant" path commands: The end
+% of the path command that led to the last path command and this
+% last path command. In essence, this macro contains everything you
+% "need to modify" if you wish to modify the end of the path.
+%
+% \pgfprocessresultsubpathprefix
+% Everything before the previous macro on the subpath.
+
+\def\pgfprocesssplitsubpath#1{%
+ % First, we need to find the end:
+ \let\pgf@tempa\pgfutil@emtpy%
+ \let\pgf@tempb\pgfutil@emtpy%
+ \let\pgf@tempc\pgfutil@emtpy%
+ \let\pgf@tempd\pgfutil@emtpy%
+ \let\pgfprocessresultsubpathprefix\pgfutil@empty%
+ \let\pgfprocessresultsubpathsuffix\pgfutil@empty%
+ \let\pgf@next\pgf@split@subpath%
+ \expandafter\pgf@split@subpath#1\pgf@stop%
+}
+
+\newif\ifpgf@split@move
+
+\def\pgf@split@subpath#1#2#3#4{%
+ \ifx#4\pgf@stop%
+ \expandafter\def\expandafter\pgfprocessresultsubpathsuffix\expandafter{\pgfprocessresultsubpathsuffix#1{#2}{#3}}%
+ \let\pgf@next\pgfutil@gobble%
+ \else%
+ \pgf@split@movetrue%
+ \ifx#1\pgfsyssoftpath@curvetosupportatoken%
+ \pgf@split@movefalse%
+ \else
+ \ifx#1\pgfsyssoftpath@curvetosupportbtoken%
+ \pgf@split@movefalse%
+ \fi%
+ \fi%
+ \ifpgf@split@move%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgfprocessresultsubpathprefix%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\pgfprocessresultsubpathprefix\pgfprocessresultsubpathsuffix}%
+ \def\pgfprocessresultsubpathsuffix{#1{#2}{#3}}%
+ \else%
+ \expandafter\def\expandafter\pgfprocessresultsubpathsuffix\expandafter{\pgfprocessresultsubpathsuffix#1{#2}{#3}}%
+ \fi%
+ \fi%
+ \pgf@next#4%
+}
+
+
+
+
+% Extract start and end vectors of a path
+%
+% #1 = a macro that stores a path
+%
+% Description:
+%
+% This command will extract the first and second coordinate on the
+% path as well as the last and second-last. These coordinates will be
+% put in the pgfpoint-macros \pgfpointfirstonpath,
+% \pgfpointsecondonpath, \pgfpointsecondlastonpath, and
+% \pgfpointlastonpath. If the path is empty, these macros are set to
+% \pgfpointorigin.
+%
+% Example:
+%
+% \pgfsyssoftpath@moveto{0}{0}
+% \pgfsyssoftpath@lineto{10}{10}
+% \pgfsyssoftpath@curveto{20}{20}{30}{30}{40}{40}
+% \pgfsyssoftpath@getcurrentpath\mypath
+% \pgfprocesspathextractpoints\mypath
+%
+% % \pgfpointfirstonpath is now \pgfpoint{0}{0}
+% % \pgfpointsecondonpath is now \pgfpoint{10bp}{10bp}
+% % \pgfpointsecondlastonpath is now \pgfpoint{30bp}{30bp}
+% % \pgfpointlastonpath is now \pgfpoint{40bp}{40bp}
+
+\def\pgfprocesspathextractpoints#1{%
+ \ifx#1\pgfutil@empty%
+ \let\pgfpointfirstonpath=\pgfpointorigin%
+ \let\pgfpointsecondonpath=\pgfpointorigin%
+ \let\pgfpointsecondlastonpath=\pgfpointorigin%
+ \let\pgfpointlastonpath=\pgfpointorigin%
+ \else%
+ \expandafter\pgf@extractprocessorfirst#1\pgf@stop%
+ \fi%
+}
+
+\def\pgf@extractprocessorfirst#1#2#3#4{%
+ \def\pgfpointfirstonpath{\pgfqpoint{#2}{#3}}%
+ \ifx#4\pgf@stop%
+ % pretty short path...
+ \let\pgfpointsecondonpath=\pgfpointfirstonpath%
+ \let\pgfpointsecondlastonpath=\pgfpointfirstonpath%
+ \let\pgfpointlastonpath=\pgfpointfirstonpath%
+ \let\next=\pgfutil@gobble%
+ \else
+ \let\next=\pgf@extractprocessorsecond%
+ \fi%
+ \next#4%
+}
+
+\def\pgf@extractprocessorsecond#1{%
+ \ifx#1\pgfsyssoftpath@movetotoken%
+ % Reset things...
+ \let\pgf@next=\pgf@extractprocessorfirst%
+ \else%
+ \let\pgf@next=\pgf@@extractprocessorsecond%
+ \fi%
+ \pgf@next#1%
+}
+\def\pgf@@extractprocessorsecond#1#2#3#4{%
+ \def\pgfpointsecondonpath{\pgfqpoint{#2}{#3}}%
+ \let\pgfpointsecondlastonpath=\pgfpointfirstonpath%
+ \let\pgfpointlastonpath=\pgfpointsecondonpath%
+ \ifx#4\pgf@stop%
+ % short path...
+ \let\next=\pgfutil@gobble%
+ \else
+ \let\next=\pgf@extractprocessorother%
+ \fi%
+ \next#4%
+}
+
+\def\pgf@extractprocessorother#1{%
+ \ifx#1\pgfsyssoftpath@movetotoken%
+ % Reset things...
+ \let\pgf@next=\pgf@extractprocessorfirst%
+ \else%
+ \let\pgf@next=\pgf@@extractprocessorother%
+ \fi%
+ \pgf@next#1%
+}
+\def\pgf@@extractprocessorother#1#2#3#4{%
+ \let\pgfpointsecondlastonpath=\pgfpointlastonpath%
+ \def\pgfpointlastonpath{\pgfqpoint{#2}{#3}}%
+ \ifx#4\pgf@stop%
+ % end!
+ \let\next=\pgfutil@gobble%
+ \fi%
+ \next#4%
+}
+
+
+
+% Check for closepath and rectangles
+%
+% #1 = a macro that stores a path
+% #2 = command to be executed when a closepath or a rectangle is encountered
+%
+% Example:
+%
+% \pgfsyssoftpath@moveto{0}{0}
+% \pgfsyssoftpath@lineto{10}{10}
+% \pgfsyssoftpath@curveto{20}{20}{30}{30}{40}{40}
+% \pgfsyssoftpath@getcurrentpath\mypath
+% \pgfprocesscheckclosed{\mypath}{\pgf@drawarrowsfalse}
+
+\def\pgfprocesscheckclosed#1#2{%
+ {%
+ \global\let\pgf@proc@todo=\relax%
+ \let\pgfsyssoftpath@movetotoken=\pgfutil@gobbletwo%
+ \let\pgfsyssoftpath@linetotoken=\pgfutil@gobbletwo%
+ \let\pgfsyssoftpath@curvetosupportatoken=\pgfutil@gobbletwo%
+ \let\pgfsyssoftpath@curvetosupportbtoken=\pgfutil@gobbletwo%
+ \let\pgfsyssoftpath@curvetotoken=\pgfutil@gobbletwo%
+ \def\pgfsyssoftpath@rectcornertoken{\gdef\pgf@proc@todo{#2}\pgfutil@gobbletwo}%
+ \def\pgfsyssoftpath@rectsizetoken{\gdef\pgf@proc@todo{#2}\pgfutil@gobbletwo}%
+ \def\pgfsyssoftpath@closepathtoken{\gdef\pgf@proc@todo{#2}\pgfutil@gobbletwo}%
+ #1%
+ }%
+ \pgf@proc@todo%
+}
+
+
+% Resolve specialround
+%
+% #1 = a macro that stores a path
+% #2 = a macro that stores the new path
+%
+% Description:
+%
+% Resolves all specialround tokens. When such a token is encountered,
+% the objective is to replace the next corner by a rounded corner.
+%
+
+\def\pgfprocessround#1#2{%
+ % first, check whether #1 contains \pgfsyssoftpath@specialroundtoken.
+ % if not, do quick assignment!
+ \expandafter\pgf@processroundcheck\expandafter#1\expandafter#2#1\pgfsyssoftpath@specialroundtoken\pgf@stop%
+}
+
+\def\pgf@processroundcheck#1#2#3\pgfsyssoftpath@specialroundtoken#4\pgf@stop{%
+ \def\pgf@test{#4}%
+ \ifx\pgf@test\pgfutil@empty%
+ % ok, nothing to be done!
+ \let#2=#1%
+ \else%
+ % very well...
+ \pgf@@processround#1#2%
+ \fi%
+}
+
+
+\def\pgf@@processround#1#2{%
+ \let\pgfprocess@newpath\pgfutil@empty%
+ \let\pgfprocess@moveto\pgfutil@empty%
+ \let\pgfprocess@firstto\pgfutil@empty%
+ \let\pgfprocess@segment\pgfutil@empty%
+ \pgf@xa=0pt%
+ \pgf@ya=0pt%
+ \expandafter\pgfprocess@round#1\pgf@stop{0pt}{0pt}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@newpath\expandafter{\pgfprocess@moveto}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@newpath\expandafter{\pgfprocess@segment}%
+ \let#2=\pgfprocess@newpath%
+}
+
+\def\pgfprocess@round#1#2#3{%
+ \ifx#1\pgf@stop%
+ \let\next=\relax%
+ \else%
+ \ifx#1\pgfsyssoftpath@specialroundtoken%
+ \def\pgfprocess@savex{#2}%
+ \def\pgfprocess@savey{#3}%
+ \let\next=\pgfprocess@specialround%
+ \ifdim#2=0pt%
+ \ifdim#3=0pt%
+ \let\next=\pgfprocess@round% skip!
+ \fi%
+ \fi%
+ \else%
+ \ifx\pgfprocess@firstto\pgfutil@empty%
+ \def\pgfprocess@firstto{{#2}{#3}}%
+ \fi%
+ \pgf@xa=#2%
+ \pgf@ya=#3%
+ \ifx#1\pgfsyssoftpath@movetotoken%
+ % ok, move old segment to newpath
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@newpath\expandafter{\pgfprocess@moveto}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@newpath\expandafter{\pgfprocess@segment}%
+ \def\pgfprocess@moveto{#1{#2}{#3}}%
+ \let\pgfprocess@firstto=\pgfutil@empty%
+ \let\pgfprocess@segment=\pgfutil@empty%
+ \else%
+ \pgfutil@g@addto@macro\pgfprocess@segment{#1{#2}{#3}}%
+ \fi%
+ \let\next=\pgfprocess@round%
+ \fi%
+ \fi%
+ \next%
+}
+
+\def\pgfprocess@specialround#1#2#3{%
+ \ifx\pgfprocess@firstto\pgfutil@empty%
+ \def\pgfprocess@firstto{{#2}{#3}}%
+ \fi%
+ \let\next=\pgfprocess@round% default: do nothing
+ \ifx#1\pgfsyssoftpath@linetotoken%
+ % Ok, round a lineto
+ \let\next=\pgfprocess@specialroundcope%
+ \else%
+ \ifx#1\pgfsyssoftpath@curvetosupportatoken%
+ % Ok, round a curveto.
+ \let\next=\pgfprocess@specialroundcurveto%
+ \else%
+ \ifx#1\pgfsyssoftpath@closepathtoken%
+ % Ok, round a closepath (this is tricky...)
+ \let\next=\pgfprocess@specialroundclose%
+ \fi%
+ \fi%
+ \fi%
+ \next#1{#2}{#3}%
+}%
+
+\def\pgfprocess@specialroundcope#1#2#3#4#5#6{%
+ \let\next=\pgfprocess@round% do nothing by default
+ \let\pgfprocess@continueafterrounding=\pgfprocess@round%
+ \ifx#4\pgfsyssoftpath@linetotoken%
+ % ok, let's get kicking...
+ \pgf@xc=#5%
+ \pgf@yc=#6%
+ \let\next=\pgfprocess@@specialround%
+ \else%
+ \ifx#4\pgfsyssoftpath@curvetosupportatoken%
+ \pgf@xc=#5%
+ \pgf@yc=#6%
+ \let\next=\pgfprocess@@specialround%
+ \else%
+ \ifx#4\pgfsyssoftpath@closepathtoken%
+ \pgf@xc=#5%
+ \pgf@yc=#6%
+ \let\next=\pgfprocess@@specialround%
+ \else
+ \ifx#4\pgfsyssoftpath@specialroundtoken%
+ \let\next=\pgfprocess@@findrightcoordinates%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \next#1{#2}{#3}#4{#5}{#6}%
+}
+
+\def\pgfprocess@@findrightcoordinates#1#2#3#4#5#6#7#8#9{%
+ \pgf@xc=#8%
+ \pgf@yc=#9%
+ \pgfprocess@@specialround#1{#2}{#3}#4{#5}{#6}#7{#8}{#9}%
+}
+
+\def\pgfprocess@@specialround#1#2#3{%
+ \pgfutil@g@addto@macro\pgfprocess@segment{#1}%
+ % calculate start coordinate of the curve
+ \pgf@xb=#2%
+ \pgf@yb=#3%
+ %
+ \edef\pgf@marshal%
+ {\noexpand\pgfpointlineatdistance{\pgfprocess@savex}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
+ {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}}%
+ \pgf@process{\pgf@marshal}%
+ \pgf@xa=\pgf@x% save start point of added curve
+ \pgf@ya=\pgf@y%
+ \edef\pgfprocess@addition{{\the\pgf@x}{\the\pgf@y}}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@segment\expandafter{\pgfprocess@addition}%
+ %
+ % now add curve
+ %
+ \edef\pgf@marshal%
+ {\noexpand\pgfpointlineatdistance{\pgfprocess@savey}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
+ {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}}%
+ \pgf@process{\pgf@marshal}%
+ \pgf@xc=\pgf@x% save end point of added curve
+ \pgf@yc=\pgf@y%
+ % calculate first support:
+ {%
+ \pgf@x=\pgf@xb%
+ \pgf@y=\pgf@yb%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \advance\pgf@xa by 0.5522847\pgf@x%
+ \advance\pgf@ya by 0.5522847\pgf@y%
+ \edef\pgfprocess@addition{\noexpand\pgfsyssoftpath@curvetosupportatoken{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@segment\expandafter{\pgfprocess@addition}%
+ }%
+ % calculate second support:
+ {%
+ \pgf@x=\pgf@xb%
+ \pgf@y=\pgf@yb%
+ \advance\pgf@x by-\pgf@xc%
+ \advance\pgf@y by-\pgf@yc%
+ \advance\pgf@xc by 0.5522847\pgf@x%
+ \advance\pgf@yc by 0.5522847\pgf@y%
+ \edef\pgfprocess@addition{\noexpand\pgfsyssoftpath@curvetosupportbtoken{\the\pgf@xc}{\the\pgf@yc}}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@segment\expandafter{\pgfprocess@addition}%
+ }%
+ % add end:
+ \edef\pgfprocess@addition{\noexpand\pgfsyssoftpath@curvetotoken{\the\pgf@xc}{\the\pgf@yc}}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfprocess@segment\expandafter{\pgfprocess@addition}%
+ %
+ % continue!
+ %
+ \pgf@xa=#2%
+ \pgf@ya=#3%
+ \pgfprocess@continueafterrounding%
+}
+
+\def\pgfprocess@specialroundcurveto#1#2#3#4#5#6{%
+ \pgfutil@g@addto@macro\pgfprocess@segment{#1{#2}{#3}#4{#5}{#6}}% supports
+ \pgf@xa=#5%
+ \pgf@ya=#6%
+ \pgfprocess@specialroundcope}
+
+\def\pgfprocess@specialroundclose{%
+ \let\next=\pgfprocess@round%
+ \ifx\pgfprocess@moveto\pgfutil@empty%
+ \else%
+ \ifx\pgfprocess@firstto\pgfutil@empty%
+ \else%
+ \expandafter\pgfprocess@@specialclosetarget\pgfprocess@firstto%
+ \let\pgfprocess@continueafterrounding=\pgfprocess@cleanupafterclose%
+ \edef\next{%
+ \noexpand\pgfprocess@@specialround%
+ \expandafter\expandafter\expandafter\noexpand\expandafter\pgfprocess@@specialclosemoveto\pgfprocess@moveto%
+ }%
+ \fi%
+ \fi%
+ \next%
+}
+
+\def\pgfprocess@@specialclosetarget#1#2{%
+ \pgf@xc=#1%
+ \pgf@yc=#2%
+}
+
+\def\pgfprocess@@specialclosemoveto#1#2#3{%
+ \pgfsyssoftpath@linetotoken{#2}{#3}%
+}
+
+
+\def\pgfprocess@cleanupafterclose#1#2#3{%
+ \edef\pgfprocess@moveto{\noexpand\pgfsyssoftpath@movetotoken{\the\pgf@xc}{\the\pgf@yc}}%
+ \edef\pgf@marshal{\noexpand\pgfprocess@round\noexpand\pgfsyssoftpath@closepathtoken{\the\pgf@xc}{\the\pgf@yc}}%
+ \pgf@marshal%
+}
+
+
+% Replace start and end coordinates of a path
+%
+% #1 = new start coordinate
+% #2 = new end coordinate
+%
+% Description:
+%
+% This command will replace the first and last coordinates on a path
+% by the given coordinates.
+%
+% Example:
+%
+% \pgfsyssoftpath@moveto{0}{0}
+% \pgfsyssoftpath@lineto{10}{10}
+% \pgfsyssoftpath@curveto{20}{20}{30}{10}{40}{0}
+% \pgfsyssoftpath@getcurrentpath\mypath
+% \pgfsetlinewidth{2pt}
+% \pgfusepath{stroke}
+% \pgfprocesspathextractpoints{\mypath}
+% \pgfprocesspathreplacestartandend{\mypath}
+% {\pgfpointlineatdistance{2pt}{\pgfpointfirstonpath}{\pgfpointsecondonpath}}%
+% {\pgfpointlineatdistance{2pt}{\pgfpointlastonpath}{\pgfpointsecondlastonpath}}%
+% \pgfsyssoftpath@setcurrentpath\mypath
+% \pgfsetlinewidth{1pt}
+% \color{red}
+% \pgfusepath{stroke}
+
+\def\pgfprocesspathreplacestartandend#1#2#3{%
+ \ifx#1\pgfutil@empty%
+ \else%
+ {%
+ % We (mis)use the current path to store (in a buffered manner) the
+ % rest path.
+ \pgfsyssoftpath@getcurrentpath\pgf@replace@origpath%
+ \let\pgf@prepath=\pgfutil@empty%
+ \pgf@process{#3}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#2}%
+ \expandafter\pgf@replaceprocessfirst#1\pgf@stop%
+ \pgfsyssoftpath@getcurrentpath\pgf@restpath%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\pgf@prepath%
+ \expandafter\pgf@newstart\pgf@restpath}%
+ % Restore current path
+ \pgfsyssoftpath@setcurrentpath\pgf@replace@origpath%
+ }%
+ \fi%
+}
+
+\def\pgf@replaceprocessfirst#1#2#3#4{%
+ \def\pgf@origstart{#1{#2}{#3}}%
+ \edef\pgf@newstart{\noexpand#1{\the\pgf@x}{\the\pgf@y}}%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ \ifx#4\pgf@stop%
+ \let\pgf@next=\pgfutil@gobble%
+ \else%
+ \let\pgf@next=\pgf@replaceprocessother%
+ \let\pgf@@next=\pgf@@replaceprocessother%
+ \fi%
+ \pgf@next#4%
+}
+
+\def\pgf@replaceprocessother#1{%
+ \ifx#1\pgfsyssoftpath@movetotoken%
+ \pgf@replace@handle@move%
+ \fi%
+ \pgf@@next#1%
+}
+\def\pgf@@replaceprocessother#1#2#3#4{%
+ \ifx#4\pgf@stop%
+ \edef\pgf@restpathaddition{{\noexpand#1{\the\pgf@xa}{\the\pgf@ya}}}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgf@restpathaddition%
+ \let\pgf@next=\pgfutil@gobble%
+ \else%
+ \pgfsyssoftpath@addtocurrentpath{#1{#2}{#3}}%
+ \fi%
+ \pgf@next#4%
+}
+
+\def\pgf@replace@handle@move{%
+ \pgfsyssoftpath@getcurrentpath\pgf@restpath%
+ % Arggghh! Must reset everything!
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgf@prepath%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\pgf@prepath%
+ \expandafter\pgf@origstart\pgf@restpath}%
+ % Redo first.
+ \let\pgf@@next=\pgf@replaceprocessfirst%
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorepathusage.code.tex b/graphics/pgf/base/tex/pgfcorepathusage.code.tex
new file mode 100644
index 0000000000..4ca277c992
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorepathusage.code.tex
@@ -0,0 +1,661 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorepathusage.code.tex}
+
+
+% Stroke/fill/clip/etc. the current path. Depending on the options,
+% the current path will be stroked/filled/clipped/etc. If no options
+% are given, the path is stroked. If multiple options are given, all
+% of them are performed (in a sensible order).
+%
+% #1 = action(s) to be applied to the current path. Valid actions are:
+% stroke - strokes the path.
+% draw - strokes the path and adds arrow tips.
+% tips - adds arrow tips.
+% fill - fills the path.
+% clip - clip the path.
+% discard - Discards the path. Same effect as having an empty
+% options list.
+%
+% Example:
+%
+% % Draws an edge.
+% \pgfpathmoveto{\pgfxy(0,0)}
+% \pgfpathlineto{\pgfxy(0,1)}
+% \pgfpathlineto{\pgfxy(1,0)}
+% \pgfusepath{stroke}
+
+\pgfkeys{
+ /pgf/stroke/.code=\let\pgf@up@stroke\pgf@up@stroke@text\pgf@up@path@neededtrue,
+ /pgf/draw/.code=\let\pgf@up@stroke\pgf@up@stroke@text\pgf@up@path@neededtrue,
+ /pgf/fill/.code=\let\pgf@up@fill\pgf@up@fill@text\pgf@up@path@neededtrue,
+ /pgf/clip/.code=\let\pgf@up@clip\pgf@up@clip@text\pgf@up@path@neededtrue,
+ /pgf/discard/.code=,
+ /pgf/use as bounding box/.code=\let\pgf@up@bb\pgf@do@up@bb,
+ /pgf/arrow keys/flex/.code=\pgferror{You need to say \string\usetikzlibrary{bending} for flexing and bending arrows},
+ /pgf/arrow keys/flex'/.code=\pgferror{You need to say \string\usetikzlibrary{bending} for flexing and bending arrows},
+ /pgf/arrow keys/bend/.code=\pgferror{You need to say \string\usetikzlibrary{bending} for flexing and bending arrows},
+ /pgf/arrow keys/quick/.code=\pgfarrowsaddtooptions{\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@quick},
+}
+
+\pgfkeys{
+ /pgf/.cd,
+ tips/.is choice,
+ tips/.default=true,
+ tips/proper/.code=\let\pgf@tips@mode\pgf@tips@mode@onproper,
+ tips/on proper draw/.code=\let\pgf@tips@mode\pgf@tips@mode@onproperdraw,
+ tips/true/.code=\let\pgf@tips@mode\pgf@tips@mode@true,
+ tips/on draw/.code=\let\pgf@tips@mode\pgf@tips@mode@ondraw,
+ tips/never/.code=\let\pgf@tips@mode\pgf@tips@mode@false,
+ tips/false/.code=\let\pgf@tips@mode\pgf@tips@mode@false,
+}
+\def\pgf@tips@mode@onproper{4}
+\def\pgf@tips@mode@onproperdraw{3}
+\def\pgf@tips@mode@true{2}
+\def\pgf@tips@mode@ondraw{1}
+\def\pgf@tips@mode@false{0}
+\let\pgf@tips@mode\pgf@tips@mode@ondraw
+
+
+% The following can only be set to "true" using the options in the
+% module "bending"
+\newif\ifpgf@precise@shortening
+\def\pgf@arrow@mode@is@quick{0}
+\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@quick
+
+\newif\ifpgf@up@path@needed
+\newif\ifpgf@up@draw@arrows
+\def\pgf@up@stroke@text{stroke}
+\def\pgf@up@fill@text{fill}
+\def\pgf@up@clip@text{clip}
+\def\pgf@do@up@bb{\pgf@relevantforpicturesizefalse}
+
+\def\pgfusepath#1{%
+ \pgf@up@path@neededfalse%
+ \pgf@up@draw@arrowsfalse%
+ \let\pgf@up@stroke\pgfutil@empty%
+ \let\pgf@up@fill\pgfutil@empty%
+ \let\pgf@up@clip\pgfutil@empty%
+ \let\pgf@up@bb\pgfutil@empty%
+ \pgfset{#1}%
+ \expandafter\def\expandafter\pgf@up@action\expandafter{\csname pgfsys@\pgf@up@fill\pgf@up@stroke\endcsname}%
+ \ifnum\pgf@tips@mode=2\relax%
+ \pgf@up@path@neededtrue%
+ \fi%
+ \ifnum\pgf@tips@mode=4\relax%
+ \pgf@up@path@neededtrue%
+ \fi%
+ \ifpgf@up@path@needed%
+ \else%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ \fi%
+ \ifx\pgf@up@stroke\pgfutil@empty%
+ \ifx\pgf@up@fill\pgfutil@empty%
+ \let\pgf@up@action=\pgfutil@empty%
+ \ifx\pgf@up@clip\pgfutil@empty%
+ \else%
+ % only clipping
+ \let\pgf@up@action=\pgfsys@discardpath%
+ \fi%
+ \fi%
+ \fi%
+ \pgfsyssoftpath@getcurrentpath\pgf@last@processed@path
+ \pgfprocessround{\pgf@last@processed@path}{\pgf@last@processed@path}% change the path
+ \pgfsyssoftpath@setcurrentpath\pgf@last@processed@path%
+ %
+ % Check whether the path is stroked. If so, add half the line width
+ % to the bounding box.
+ %
+ \ifpgf@relevantforpicturesize%
+ \ifx\pgf@up@stroke\pgfutil@empty%
+ \else%
+ \ifdim\pgf@picmaxx=-16000pt\relax%
+ \else%
+ \pgf@x=\pgf@pathminx\advance\pgf@x by-.5\pgflinewidth%
+ \ifdim\pgf@x<\pgf@picminx\global\pgf@picminx\pgf@x\fi%
+ \pgf@y=\pgf@pathminy\advance\pgf@y by-.5\pgflinewidth%
+ \ifdim\pgf@y<\pgf@picminy\global\pgf@picminy\pgf@y\fi%
+ \pgf@x=\pgf@pathmaxx\advance\pgf@x by.5\pgflinewidth%
+ \ifdim\pgf@x>\pgf@picmaxx\global\pgf@picmaxx\pgf@x\fi%
+ \pgf@y=\pgf@pathmaxy\advance\pgf@y by.5\pgflinewidth%
+ \ifdim\pgf@y>\pgf@picmaxy\global\pgf@picmaxy\pgf@y\fi%
+ \fi%
+ \fi%
+ \fi%
+ %
+ \ifx\pgf@up@clip\pgfutil@empty%
+ \ifx\pgf@up@stroke\pgfutil@empty%
+ \ifx\pgf@up@action\pgfutil@empty%
+ \ifnum\pgf@tips@mode=2\relax%
+ \pgf@up@draw@arrows@only%
+ \fi%
+ \ifnum\pgf@tips@mode=4\relax%
+ \pgf@up@draw@arrows@only%
+ \fi%
+ \else%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgf@up@action%
+ \fi%
+ \else%
+ \pgfgetpath\pgf@arrowpath%
+ \pgf@path@setup@tempswa%
+ \pgfprocesscheckclosed{\pgf@arrowpath}{\pgfutil@tempswafalse}%
+ \pgf@path@check@proper%
+ \ifpgfutil@tempswa%
+ \pgf@check@for@arrow@and@animation%
+ \pgf@prepare@end@of@path%
+ \begingroup%
+ \pgf@prepare@start@of@path%
+ \fi%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgf@up@action%
+ \ifdim\pgfinnerlinewidth>0pt\relax%
+ \pgf@stroke@inner@line%
+ \fi%
+ \ifpgfutil@tempswa%
+ \pgf@add@arrow@at@start%
+ \endgroup%
+ \pgf@add@arrow@at@end%
+ \fi%
+ \fi%
+ \else%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsys@clipnext%
+ \pgf@up@action%
+ \pgf@relevantforpicturesizefalse%
+ \fi%
+ \pgf@up@bb%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ \pgf@resetpathsizes%
+ \ignorespaces%
+}
+\def\pgf@path@setup@tempswa{%
+ \ifnum\pgf@tips@mode>0\relax
+ \pgfutil@tempswatrue%
+ \else
+ \pgfutil@tempswafalse%
+ \fi%
+}
+\def\pgf@up@draw@arrows@only{%
+ \pgfgetpath\pgf@arrowpath%
+ \pgfutil@tempswatrue%
+ \pgfprocesscheckclosed{\pgf@arrowpath}{\pgfutil@tempswafalse}%
+ \pgf@path@check@proper%
+ \ifpgfutil@tempswa%
+ \pgf@check@for@arrow@and@animation%
+ \pgf@prepare@end@of@path%
+ \begingroup%
+ \pgf@prepare@start@of@path%
+ \pgf@add@arrow@at@start%
+ \endgroup%
+ \pgf@add@arrow@at@end%
+ \fi%
+}
+
+\def\pgf@check@for@arrow@and@animation{\pgfsys@if@fresh@currentid{\pgf@check@for@arrow@and@animation@}{}}%
+\def\pgf@check@for@arrow@and@animation@{%
+ \expandafter\ifx\csname pgfsysanim@path@is@animated@\pgf@sys@id@current@id @\pgfsys@current@type\endcsname\pgfutil@empty%
+ % Ok, an animation is here!
+ \ifx\pgf@end@tip@sequence\pgfutil@empty%
+ \ifx\pgf@start@tip@sequence\pgfutil@empty%
+ \else%
+ \pgf@check@for@arrow@and@animation@error%
+ \fi%
+ \else%
+ \pgf@check@for@arrow@and@animation@error%
+ \fi%
+ \fi%
+}
+\def\pgf@check@for@arrow@and@animation@error{\pgferror{Animated path may not have normal arrow tips. Use a base path with arrow tips}}
+
+\def\pgf@path@check@proper{%
+ \ifpgfutil@tempswa%
+ \ifnum\pgf@tips@mode>2\relax%
+ \pgf@path@check@proper@%
+ \fi%
+ \fi%
+}
+
+\def\pgf@path@check@proper@{%
+ {%
+ \pgf@x0pt\pgf@y\pgf@x%
+ \pgfutil@tempswatrue%
+ \let\pgfsyssoftpath@movetotoken\pgf@path@proper@init%
+ \let\pgfsyssoftpath@linetotoken\pgf@path@proper@test%%
+ \let\pgfsyssoftpath@curvetosupportatoken\pgf@path@proper@test%
+ \let\pgfsyssoftpath@curvetosupportbtoken=\pgf@path@proper@test%
+ \let\pgfsyssoftpath@curvetotoken\pgf@path@proper@test%
+ \let\pgfsyssoftpath@rectcornertoken\pgf@path@proper@test%
+ \let\pgfsyssoftpath@rectsizetoken\pgf@path@proper@zero@test%
+ \let\pgfsyssoftpath@closepathtoken\pgf@path@proper@test%
+ % Execute the path:
+ \pgf@arrowpath%
+ \expandafter
+ }%
+ \ifpgfutil@tempswa\pgfutil@tempswafalse\else\pgfutil@tempswatrue\fi%
+}
+
+\def\pgf@path@proper@init#1#2{\pgfutil@tempswatrue\pgf@x#1\pgf@y#2}%
+\def\pgf@path@proper@test#1#2{%
+ \ifdim\pgf@x=#1\relax\else\pgfutil@tempswafalse\fi%
+ \ifdim\pgf@y=#2\relax\else\pgfutil@tempswafalse\fi}
+\def\pgf@path@proper@zero@test#1#2{%
+ \ifdim\pgf@x=0pt\relax\else\pgfutil@tempswafalse\fi%
+ \ifdim\pgf@y=0pt\relax\else\pgfutil@tempswafalse\fi}
+
+
+
+
+\def\pgf@stroke@inner@line{%
+ \let\pgf@temp@save=\pgf@strokecolor@global
+ \pgfsys@beginscope%
+ {%
+ \pgfsys@setlinewidth{\pgfinnerlinewidth}%
+ \pgfsetstrokecolor{\pgfinnerstrokecolor}%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsys@stroke%
+ }%
+ \pgfsys@endscope%
+ \global\let\pgf@strokecolor@global=\pgf@temp@save
+}
+
+\let\pgf@prepare@start@of@path\relax%
+
+
+
+
+% Shorten start/end of paths by a certain amount.
+%
+% #1 = amount by which paths should be shortened.
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathlineto{\pgfpoint{10pt}{0pt}
+%
+% % The following has the same effect:
+% \pgfsetshortenstart{1pt}
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathlineto{\pgfpoint{11pt}{0pt}
+
+\def\pgfsetshortenstart#1{\pgfmathsetlength\pgf@shorten@start@additional{#1}}
+\def\pgfsetshortenend#1{\pgfmathsetlength\pgf@shorten@end@additional{#1}}
+
+\newdimen\pgf@shorten@end@additional
+\newdimen\pgf@shorten@start@additional
+
+
+
+%
+%
+% Handling the end of a path
+%
+%
+% The "handling" consists of first testing whether we need to do
+% anything at all, namely because either an arrow tip should be drawn
+% at the end or because the path should be shortened at the end. If
+% so, we shorten the path if needed and, later on, add the arrow tip.
+%
+
+\newif\ifpgf@worry
+
+
+% Prepare the end of the path: Test whether anything must be done
+% (step 0) and, if so, split the path (step 1), extract the interesting points from
+% the path (step 2), prepare further computations (step 3), shorten
+% the path (step 4) if necessary, and add the arrow tip (step 4 in
+% macro \pgf@add@arrow@at@end, which is called later).
+
+\def\pgf@prepare@end@of@path{%
+ \let\pgfprocessresultpathsuffix\relax% flag that nothing has happened...
+ \let\pgfprocessresultsubpathsuffix\relax%
+ \pgfsyssoftpath@getcurrentpath\pgf@arrowpath%
+ %
+ % Step 0 start:
+ %
+ % Do we need to worry about the end?
+ %
+ \ifx\pgf@arrowpath\pgfutil@empty\else%
+ \pgf@worryfalse%
+ \ifx\pgf@end@tip@sequence\pgfutil@empty%
+ \else%
+ \pgf@worrytrue% Yes, worry if we have to draw an arrow
+ \fi%
+ \pgf@precise@shorteningfalse%
+ \pgf@arrow@compute@shortening\pgf@end@tip@sequence%
+ \advance\pgf@xa by\pgf@shorten@end@additional%
+ \advance\pgf@xb by\pgf@shorten@end@additional%
+ \ifdim\pgf@xa=0pt\relax\else\pgf@worrytrue\fi% Also, worry if shortening is requested
+ \edef\pgf@path@shortening@distance{\the\pgf@xa}%
+ \edef\pgf@arrow@tip@total@length{\the\pgf@xb}%
+ %
+ % Step 0 done.
+ %
+ \ifpgf@worry%
+ % Ok, need to "worry" about the end, either because we need to
+ % shorten it or to draw an arrow head.
+ %
+ % Step 1: Split
+ %
+ \pgfprocesssplitpath{\pgf@arrowpath}%
+ \pgfprocesssplitsubpath{\pgfprocessresultpathsuffix}%
+ %
+ % Step 2: extract
+ %
+ \expandafter\pgf@parse@end\pgfprocessresultsubpathsuffix\pgf@stop\pgf@stop\pgf@stop%
+ %
+ % Step 3: prep
+ %
+ \pgf@prep@end%
+ %
+ % Step 4: shorten
+ %
+ \ifdim\pgf@path@shortening@distance=0pt\else\pgf@do@shorten@end\fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@arrowpath%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathprefix\pgfprocessresultpathsuffix}%
+ \pgfsyssoftpath@setcurrentpath\pgf@arrowpath%
+ \fi%
+ \fi%
+}
+
+\def\pgf@parse@end#1#2#3#4#5#6{%
+ \ifx#4\pgf@stop% Only a moveto! -> do nothing!
+ \def\pgfpointlastonpath{\pgfqpoint{#2}{#3}}%
+ \let\pgf@next\relax%
+ \let\pgf@do@shorten@end\relax%
+ \let\pgf@do@draw@end\pgf@do@draw@straightend%
+ \let\pgf@prep@end\pgf@prep@movetoend%
+ \else\ifx#4\pgfsyssoftpath@curvetosupportatoken% A curve -> this will get complicated...
+ \def\pgfsubpathfourthlasttoken{#1}%
+ \def\pgfpointfourthlastonpath{\pgfqpoint{#2}{#3}}%
+ \def\pgfpointthirdlastonpath{\pgfqpoint{#5}{#6}}%
+ \ifpgf@precise@shortening%
+ \let\pgf@do@shorten@end\pgf@do@shorten@curvedend%
+ \let\pgf@do@draw@end\pgf@do@draw@curvedend%
+ \let\pgf@prep@end\pgf@prep@curveend%
+ \else%
+ \def\pgfsubpathstart{\noexpand#1{#2}{#3}\noexpand#4{#5}{#6}}%
+ \let\pgf@do@shorten@end\pgf@do@shorten@straightend%
+ \let\pgf@do@draw@end\pgf@do@draw@straightend%
+ \let\pgf@prep@end\pgf@prep@straightend%
+ \fi%
+ \let\pgf@next\pgf@parse@end@curve@cont%
+ \else% A straight line -> great!
+ \def\pgfsubpathstart{\noexpand#1{#2}{#3}\noexpand#4}%
+ \def\pgfpointsecondlastonpath{\pgfqpoint{#2}{#3}}%
+ \def\pgfpointlastonpath{\pgfqpoint{#5}{#6}}%
+ \let\pgfpointfourthlastonpath\relax%
+ \let\pgfpointthirdlastonpath\relax%
+ \let\pgf@next\pgf@parse@end@gobble@three%
+ \let\pgf@do@shorten@end\pgf@do@shorten@straightend%
+ \let\pgf@do@draw@end\pgf@do@draw@straightend%
+ \let\pgf@prep@end\pgf@prep@straightend%
+ \fi\fi%
+ \pgf@next% Needed for reading rest of path...
+}
+
+\def\pgf@parse@end@gobble@three#1#2#3{}%
+\def\pgf@parse@end@curve@cont#1#2#3#4#5#6#7#8#9{%
+ \def\pgfpointsecondlastonpath{\pgfqpoint{#2}{#3}}%
+ \def\pgfpointlastonpath{\pgfqpoint{#5}{#6}}%
+ \ifpgf@precise@shortening%
+ \else%
+ \expandafter\def\expandafter\pgfsubpathstart\expandafter{\pgfsubpathstart\noexpand#1{#2}{#3}\noexpand#4}%
+ \fi%
+}
+
+%
+% Preps
+%
+\def\pgf@prep@movetoend{%
+ \pgf@process{\pgfpointlastonpath}%
+ \pgf@xb\pgf@x
+ \pgf@yb\pgf@y
+ \pgf@xc\pgf@x
+ \pgf@yc\pgf@y
+}
+\def\pgf@prep@straightend{%
+ \let\pgf@ref\pgfpointsecondlastonpath
+ \ifx\pgfpointlastonpath\pgfpointsecondlastonpath% degenerate!
+ \ifx\pgfpointthirdlastonpath\relax% cannot help it: really a zero-length path
+ \else%
+ \ifx\pgfpointlastonpath\pgfpointthirdlastonpath% double degenerate!
+ \let\pgf@ref\pgfpointfourthlastonpath% Use third point for reference.
+ \else
+ \let\pgf@ref\pgfpointthirdlastonpath% Use third point for reference.
+ \fi%
+ \fi%
+ \fi%
+ \pgfpointlineatdistance{\pgf@path@shortening@distance}{\pgfpointlastonpath}{\pgf@ref}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+}
+
+
+%
+% Line shortening for straight lines:
+%
+\def\pgf@do@shorten@straightend{%
+ \edef\pgfprocessresultsubpathsuffix{\pgfsubpathstart{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgfprocessresultpathsuffix%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultsubpathprefix\pgfprocessresultsubpathsuffix}%
+}
+
+
+%
+% Draw an end arrow by calling an appropriate subfunction, if necessary
+%
+
+\def\pgf@add@arrow@at@end{%
+ \ifx\pgf@arrowpath\pgfutil@empty\else%
+ \ifx\pgf@end@tip@sequence\pgfutil@empty\else%
+ \pgf@do@draw@end%
+ \fi%
+ \fi%
+}
+
+%
+% Draw an end arrow at the end of a straight line
+%
+\def\pgf@do@draw@straightend{%
+ {%
+ \pgftransformreset%
+ \pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgf@arrow@draw@arrow\pgf@end@tip@sequence\pgf@arrow@tip@total@length%
+ }%
+}
+
+
+
+
+
+%
+%
+% Handling the start of a path
+%
+%
+% The "handling" is similar to the case for the start of the path. We
+% may be able to skip the splitting if that was done already for the
+% end. Otherwise, things are basically the same.
+%
+
+% Prepare the start of the path: Test whether anything must be done
+% (step 0) and, if so, split the path (step 1) if necessary, extract
+% the interesting points from the path (step 2), prepare computations
+% (step 3) needed for both shortening and tip adding, shorten the path
+% (step 4), and add the arrow tip (step 5 in macro
+% \pgf@add@arrow@at@start, which is called later).
+
+\def\pgf@prepare@start@of@path{%
+ %
+ % Step 0 start:
+ %
+ % Do we need to worry about the start?
+ %
+ \ifx\pgf@arrowpath\pgfutil@empty\else%
+ \pgf@worryfalse%
+ \ifx\pgf@start@tip@sequence\pgfutil@empty\else\pgf@worrytrue\fi% Yes, worry if we have to draw an arrow
+ \pgf@precise@shorteningfalse%
+ \pgf@arrow@compute@shortening\pgf@start@tip@sequence%
+ \advance\pgf@xa by\pgf@shorten@start@additional%
+ \advance\pgf@xb by\pgf@shorten@start@additional%
+ \ifdim\pgf@xa=0pt\relax\else\pgf@worrytrue\fi% Also, worry if shortening is requested
+ \edef\pgf@path@shortening@distance{\the\pgf@xa}%
+ \edef\pgf@arrow@tip@total@length{\the\pgf@xb}%
+ %
+ % Step 0 done.
+ %
+ \ifpgf@worry%
+ % Ok, need to "worry" about the start, either because we need to
+ % shorten it or to draw an arrow head.
+ %
+ % Step 1: Split
+ %
+ \ifx\pgfprocessresultpathsuffix\relax%
+ % Ok, still need to compute the split:
+ \pgfprocesssplitpath{\pgf@arrowpath}%
+ \fi%
+ %
+ % Step 2: extract
+ %
+ \expandafter\pgf@parse@start\pgfprocessresultpathsuffix\pgf@stop\pgf@stop\pgf@stop%
+ %
+ % Step 3: prep
+ %
+ \pgf@prep@start%
+ %
+ % Step 4: shorten
+ %
+ \ifdim\pgf@path@shortening@distance=0pt\else\pgf@do@shorten@start\fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@arrowpath%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathprefix\pgfprocessresultpathsuffix}%
+ \pgfsyssoftpath@setcurrentpath\pgf@arrowpath%
+ \fi%
+ \fi%
+}
+
+\def\pgf@parse@start#1#2#3#4#5#6{%
+ \def\pgfpointfirstonpath{\pgfqpoint{#2}{#3}}%
+ \def\pgfpointsecondonpath{\pgfqpoint{#5}{#6}}%
+ \let\pgfpointthirdonpath\relax%
+ \let\pgfpointfourthonpath\relax%
+ \def\pgfsubpathfirsttoken{\noexpand#1}%
+ \def\pgfsubpathsecondtoken{\noexpand#4}%
+ \ifx#4\pgf@stop% Only a moveto! -> do nothing!
+ \let\pgf@next\relax%
+ \let\pgf@do@shorten@start\relax%
+ \let\pgf@prep@start\pgf@prep@movetostart%
+ \let\pgf@do@draw@start\pgf@do@draw@straightstart%
+ \else\ifx#4\pgfsyssoftpath@curvetosupportatoken% A curve -> this will get complicated...
+ \ifpgf@precise@shortening%
+ \let\pgf@next\pgf@parse@start@curve@cont%
+ \let\pgf@do@shorten@start\pgf@do@shorten@curvedstart%
+ \let\pgf@do@draw@start\pgf@do@draw@curvedstart%
+ \let\pgf@prep@start\pgf@prep@curvedstart%
+ \else% can treat the end like a straight line...
+ \let\pgf@next\pgf@parse@start@curve@cont@straight%
+ \let\pgf@do@shorten@start\pgf@do@shorten@straightstart%
+ \let\pgf@do@draw@start\pgf@do@draw@straightstart%
+ \let\pgf@prep@start\pgf@prep@straightstart%
+ \fi%
+ \else% A straight line -> great!
+ \let\pgf@next\pgf@parse@start@till@stop%
+ \let\pgf@do@shorten@start\pgf@do@shorten@straightstart%
+ \let\pgf@do@draw@start\pgf@do@draw@straightstart%
+ \let\pgf@prep@start\pgf@prep@straightstart%
+ \fi\fi%
+ \pgf@next% Needed for reading rest of path...
+}
+
+\def\pgf@parse@start@till@stop#1\pgf@stop\pgf@stop\pgf@stop{\def\pgfsubpathend{#1}}%
+
+\def\pgf@parse@start@curve@cont#1#2#3#4#5#6#7\pgf@stop\pgf@stop\pgf@stop{%
+ \def\pgfpointthirdonpath{\pgfqpoint{#2}{#3}}%
+ \def\pgfpointfourthonpath{\pgfqpoint{#5}{#6}}%
+ \def\pgfsubpathend{#7}%
+}
+
+\def\pgf@parse@start@curve@cont@straight#1#2#3#4#5#6#7\pgf@stop\pgf@stop\pgf@stop{%
+ \def\pgfpointthirdonpath{\pgfqpoint{#2}{#3}}%
+ \def\pgfpointfourthonpath{\pgfqpoint{#5}{#6}}%
+ \def\pgfsubpathend{#1{#2}{#3}#4{#5}{#6}#7}%
+}
+
+%
+% Preps
+%
+\def\pgf@prep@movetostart{%
+ \pgf@process{\pgfpointfirstonpath}%
+ \pgf@xb\pgf@x
+ \pgf@yb\pgf@y
+ \pgf@xc\pgf@x
+ \pgf@yc\pgf@y
+}
+\def\pgf@prep@straightstart{%
+ \let\pgf@ref\pgfpointsecondonpath
+ \ifx\pgfpointfirstonpath\pgfpointsecondonpath% degenerate!
+ \ifx\pgfpointthirdonpath\relax% cannot help it: really a zero-length path
+ \else%
+ \ifx\pgfpointfirstonpath\pgfpointthirdonpath% double degenerate!
+ \let\pgf@ref\pgfpointfourthonpath% Use third point for reference.
+ \else
+ \let\pgf@ref\pgfpointthirdonpath% Use third point for reference.
+ \fi%
+ \fi%
+ \fi%
+ \pgfpointlineatdistance{\pgf@path@shortening@distance}{\pgfpointfirstonpath}{\pgf@ref}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+}
+
+%
+% Line shortening for straight lines:
+%
+\def\pgf@do@shorten@straightstart{%
+ \edef\pgfprocessresultpathsuffix{\pgfsubpathfirsttoken{\the\pgf@xa}{\the\pgf@ya}\pgfsubpathsecondtoken{\the\pgf@xc}{\the\pgf@yc}}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgfprocessresultpathsuffix%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathsuffix\pgfsubpathend}%
+}
+
+
+%
+% Draw a start arrow by calling an appropriate subfunction, if necessary
+%
+
+\def\pgf@add@arrow@at@start{%
+ \ifx\pgf@arrowpath\pgfutil@empty\else%
+ \ifx\pgf@start@tip@sequence\pgfutil@empty\else%
+ \pgf@do@draw@start%
+ \fi%
+ \fi%
+}
+
+%
+% Draw an start arrow at the start of a straight line
+%
+\def\pgf@do@draw@straightstart{%
+ {%
+ \pgftransformreset%
+ \pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgf@arrow@draw@arrow\pgf@start@tip@sequence\pgf@arrow@tip@total@length%
+ }%
+}
+
+
+
+\let\pgf@shorten@end=\pgfutil@empty
+\let\pgf@shorten@start=\pgfutil@empty
+
+
+\endinput%
diff --git a/graphics/pgf/base/tex/pgfcorepatterns.code.tex b/graphics/pgf/base/tex/pgfcorepatterns.code.tex
new file mode 100644
index 0000000000..cda5b1db3f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorepatterns.code.tex
@@ -0,0 +1,301 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorepatterns.code.tex}
+
+% Creates a new uncolored pattern
+%
+% [#1] = optional list of variables.
+% #2 = pattern name
+% #3 = lower left of bounding box
+% #4 = upper right of bounding box
+% #5 = step vector
+% #6 = pattern code
+%
+% Description:
+%
+% Declares a new uncolored pattern. An uncolored pattern is a pattern
+% that has no inherent color. When the pattern is used, a color for
+% the pattern must be supplied.
+%
+% See the pdf-manual for more details on uncolored patterns.
+%
+% Specifying a variable list makes the pattern ``mutable''.
+%
+% The bounding box must be a bounding box of the pattern cell.
+%
+% The step vector must provide the x- and y-step by which the cells
+% are spaced.
+%
+% The pattern code should be pgf code that can be protocolled.
+%
+% The transformation matrix will be reset prior to invoking the
+% pattern code.
+%
+% Example:
+%
+% \pgfdeclarepatternformonly{stars}{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
+% {\pgfpoint{1cm}{1cm}}{
+% \pgftransformshift{\pgfpoint{.5cm}{.5cm}}
+% \pgfpathmoveto{\pgfpointpolar{0}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{144}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{288}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{72}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{216}{4mm}}
+% \pgfpathclose%
+% \pgfusepath{stroke}
+% }
+%
+\def\pgfdeclarepatternformonly{%
+ \def\pgf@pattern@type{formonly}%
+ \pgfutil@ifnextchar[{\pgf@declarepattern@checkarg}{\pgf@declarepattern@checkarg[]}%
+}
+
+
+% Creates a new colored pattern
+%
+% [#1] = optional list of variables.
+% #2 = pattern name
+% #3 = lower left of bounding box
+% #4 = upper right of bounding box
+% #5 = step vector
+% #6 = pattern code
+%
+% Description:
+%
+% Declares a new colored pattern. Such patterns have a one or more
+% fixed inherent colors. See the pdf-manual for more details on
+% uncolored patterns.
+%
+% The parameters have the same effect as for uncolored patterns.
+%
+% Example:
+%
+% \pgfdeclarepatterninherentlycolored{red stars}{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}
+% {\pgfpoint{1cm}{1cm}}{
+% \pgfsetfillcolor{red}
+% \pgfsetstrokecolor{black}
+% \pgftransformshift{\pgfpoint{.5cm}{.5cm}}
+% \pgfpathmoveto{\pgfpointpolar{0}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{144}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{288}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{72}{4mm}}
+% \pgfpathlineto{\pgfpointpolar{216}{4mm}}
+% \pgfpathclose%
+% \pgfusepath{stroke,fill}
+% }
+%
+\def\pgfdeclarepatterninherentlycolored{%
+ \def\pgf@pattern@type{inherentlycolored}%
+ \pgfutil@ifnextchar[{\pgf@declarepattern@checkarg}{\pgf@declarepattern@checkarg[]}%
+}
+
+
+
+
+
+\def\pgf@declarepattern@checkarg[#1]{%
+ \def\pgf@pattern@tempvars{#1}%
+ \ifx\pgf@pattern@tempvars\pgfutil@empty%
+ \expandafter\let\expandafter\pgf@next\csname pgf@declarepattern\pgf@pattern@type\endcsname%
+ \else%
+ \expandafter\let\expandafter\pgf@next\csname pgf@declarepattern\pgf@pattern@type @mutable\endcsname%
+ \fi%
+ \pgf@next}
+
+\long\def\pgf@declarepatternformonly#1#2#3#4#5{\pgf@declarepattern{#1}{#2}{#3}{#4}{#5}{0}}
+
+\long\def\pgf@declarepatterninherentlycolored#1#2#3#4#5{\pgf@declarepattern{#1}{#2}{#3}{#4}{#5}{1}}
+
+\long\def\pgf@declarepatternformonly@mutable#1#2#3#4#5{%
+ \def\pgf@marshal{\pgf@declarepatternmutable{#1}}%
+ \expandafter\pgf@marshal\expandafter{\pgf@pattern@tempvars}{#2}{#3}{#4}{#5}{2}%
+}
+
+\long\def\pgf@declarepatterninherentlycolored@mutable#1#2#3#4#5#6{%
+ \def\pgf@marshal{\pgf@declarepatternmutable{#1}}%
+ \expandafter\pgf@marshal\expandafter{\pgf@pattern@tempvars}{#2}{#3}{#4}{#5}{3}%
+}
+
+\def\pgfsys@patternmatrix{{1.0}{0.0}{0.0}{1.0}{0.0pt}{0.0pt}}
+\def\pgf@declarepattern#1#2#3#4#5#6{%
+ \pgfutil@ifundefined{pgf@pattern@name@#1}{%
+ \pgfsysprotocol@getcurrentprotocol\pgf@pattern@temp%
+ {%
+ \pgfinterruptpath%
+ \pgfpicturetrue%
+ \pgf@relevantforpicturesizefalse%
+ \pgftransformreset%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsys@beginscope%
+ \pgfsetarrows{-}%
+ #5%
+ \pgfsys@endscope%
+ \pgfsysprotocol@getcurrentprotocol\pgf@pattern@code%
+ \global\let\pgf@pattern@code=\pgf@pattern@code%
+ \endpgfinterruptpath%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#4}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ % Now, build a name for the pattern
+ \pgfutil@tempcnta=\pgf@pattern@number%
+ \advance\pgfutil@tempcnta by1\relax%
+ \xdef\pgf@pattern@number{\the\pgfutil@tempcnta}%
+ \expandafter\xdef\csname pgf@pattern@name@#1\endcsname{\the\pgfutil@tempcnta}%
+ \expandafter\gdef\csname pgf@pattern@type@#1\endcsname{#6}%
+ \xdef\pgf@marshal{\noexpand\pgfsys@declarepattern
+ {\csname pgf@pattern@name@#1\endcsname}% name
+ {\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}% bbox
+ {\the\pgf@xc}{\the\pgf@yc}% x/y step
+ \pgfsys@patternmatrix% transformation matrix
+ {\pgf@pattern@code}{#6}}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgf@pattern@temp%
+ \expandafter\global\expandafter\let\csname pgf@pattern@instantiate@#1\endcsname=\pgf@marshal%
+ }
+ {%
+ \pgferror{Pattern `#1' already defined}%
+ }%
+}
+
+\def\pgf@pattern@number{0}%
+
+\def\pgf@declarepatternmutable#1#2#3#4#5#6#7{%
+ \pgfutil@ifundefined{pgf@pattern@name@#1}{%
+ \expandafter\gdef\csname pgf@pattern@name@#1\endcsname{#1}%
+ \expandafter\gdef\csname pgf@pattern@variables@#1\endcsname{#2}%
+ \expandafter\gdef\csname pgf@pattern@lowerleft@#1\endcsname{#3}%
+ \expandafter\gdef\csname pgf@pattern@upperright@#1\endcsname{#4}%
+ \expandafter\gdef\csname pgf@pattern@tilesize@#1\endcsname{#5}%
+ \expandafter\long\expandafter\gdef\csname pgf@pattern@code@#1\endcsname{#6}%
+ \expandafter\gdef\csname pgf@pattern@type@#1\endcsname{7}%
+ }{\pgferror{The pattern `#1' is already defined}}%
+}
+
+\def\pgf@ifpatternisinherentlycolored#1#2#3{%
+ \expandafter\ifodd\csname pgf@pattern@type@#1\endcsname\relax#2\else#3\fi%
+}
+
+\def\pgf@ifpatternismutable#1#2#3{%
+ \expandafter\ifnum\csname pgf@pattern@type@#1\endcsname>1\relax#2\else#3\fi%
+}
+
+\def\pgfpatternreleasename#1{\expandafter\let\csname pgf@pattern@name@#1\endcsname\relax}
+
+
+
+
+
+
+% Set an pattern as fill color
+%
+% #1 = Name of the pattern
+% #2 = Color to be used for the pattern. If the pattern is already
+% colored, this parameter is ignored.
+%
+% Description:
+%
+% Sets the pattern for subsequent filling operations.
+%
+% Example:
+%
+% \pgfsetfillpattern{stars}{red}
+%
+\def\pgfsetfillpattern#1#2{%
+ \pgfutil@ifundefined{pgf@pattern@name@#1}%
+ {%
+ \pgferror{Undefined pattern `#1'}%
+ }%
+ {%
+ \pgf@ifpatternismutable{#1}%
+ {%
+ % So, a mutable pattern. Check to see if the pattern
+ % has been used with the current variable values...
+ \let\pgf@pattern@tempvars\pgfutil@empty%
+ \expandafter\expandafter\expandafter\pgf@pattern@check@vars%
+ \csname pgf@pattern@variables@#1\endcsname,\pgf@stop,%
+ \edef\pgf@pattern@nametemp{pgf@pattern@#1@\pgf@pattern@tempvars}%
+ \expandafter\pgfutil@ifundefined\expandafter{\pgf@pattern@nametemp}%
+ {%
+ % ...Nope. So declare a new instance of the mutable pattern.
+ \pgf@ifpatternisinherentlycolored{#1}%
+ {\let\pgf@set@fillpattern@declare\pgfdeclarepatterninherentlycolored}%
+ {\let\pgf@set@fillpattern@declare\pgfdeclarepatternformonly}%
+ \pgf@set@fillpattern@declare%
+ {\pgf@pattern@nametemp}%
+ {\csname pgf@pattern@lowerleft@#1\endcsname}%
+ {\csname pgf@pattern@upperright@#1\endcsname}%
+ {\csname pgf@pattern@tilesize@#1\endcsname}%
+ {\csname pgf@pattern@code@#1\endcsname}%
+ }%
+ {%
+ % ...Yep. So do nothing.
+ }%
+ \expandafter\pgf@set@fillpattern\expandafter{\pgf@pattern@nametemp}{#2}%
+ \expandafter\gdef\csname\pgf@pattern@nametemp\endcsname{#1}%
+ }%
+ {%
+ % A non-mutable pattern.
+ \pgf@set@fillpattern{#1}{#2}%
+ }%
+ }%
+}
+
+
+\def\pgf@set@fillpattern#1#2{%
+ \pgfutil@ifundefined{pgf@pattern@name@#1}{%
+ \pgferror{Undefined pattern `#1'}}
+ {%
+ \csname pgf@pattern@instantiate@#1\endcsname%
+ \expandafter\global\expandafter\let\csname pgf@pattern@instantiate@#1\endcsname=\relax%
+ \pgf@ifpatternisinherentlycolored{#1}{%
+ \pgfsys@setpatterncolored{\csname pgf@pattern@name@#1\endcsname}%
+ }{%
+ \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@set@fill@patternuncolored\pgf@rgbcolor\relax{#1}%
+ }%
+ }%
+}
+
+\def\pgf@set@fill@patternuncolored#1,#2,#3\relax#4{%
+ \pgfsys@setpatternuncolored{\csname pgf@pattern@name@#4\endcsname}{#1}{#2}{#3}%
+}
+
+\def\pgf@pattern@check@vars#1,{%
+ \ifx#1\pgf@stop%
+ \let\pgf@next\relax%
+ \else%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\let\expandafter\pgf@pattern@char#1#1\pgfmath@%
+ \ifx\pgf@pattern@char/%
+ \edef\pgf@pattern@tempvar{(\pgfkeysvalueof{#1})}%
+ \else%
+ \expandafter\ifcat\pgf@pattern@char\relax%
+ \edef\pgf@pattern@tempvar{(\the#1)}%
+ \else%
+ \edef\pgf@pattern@tempvar{(#1)}%
+ \fi%
+ \fi%
+ \edef\pgf@pattern@tempvars{\pgf@pattern@tempvars\pgf@pattern@tempvar}%
+ \let\pgf@next\pgf@pattern@check@vars%
+ \fi%
+ \pgf@next%
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorepoints.code.tex b/graphics/pgf/base/tex/pgfcorepoints.code.tex
new file mode 100644
index 0000000000..028546dde8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorepoints.code.tex
@@ -0,0 +1,1212 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorepoints.code.tex}
+
+\newdimen\pgf@picminx
+\newdimen\pgf@picmaxx
+\newdimen\pgf@picminy
+\newdimen\pgf@picmaxy
+
+\newdimen\pgf@pathminx
+\newdimen\pgf@pathmaxx
+\newdimen\pgf@pathminy
+\newdimen\pgf@pathmaxy
+
+\newif\ifpgf@relevantforpicturesize
+
+\def\pgf@process#1{{#1\global\pgf@x=\pgf@x\global\pgf@y=\pgf@y}}
+
+% Save a point.
+%
+% #1 = macro for storing point.
+% #2 = code for point (should define x and y)
+%
+% Example:
+%
+% \pgfextract@process\mypoint{\pgf@x=10pt \pgf@y10pt}
+% \pgfextract@process\myarcpoint{\pgfpointpolar{30}{5cm and 2cm}}
+
+\def\pgfextract@process#1#2{%
+ \pgf@process{#2}%
+ \edef#1{\noexpand\global\pgf@x=\the\pgf@x\noexpand\relax\noexpand\global\pgf@y=\the\pgf@y\noexpand\relax}%
+}
+% This needed until old shapes code changed.
+\let\pgfsavepgf@process\pgfextract@process%
+
+
+% Return a point
+%
+% #1 = x-coordinate of the point
+% #2 = y-coordinate of the point
+%
+% x = #1
+% y = #2
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpoint{2pt+3cm}{3cm}}
+
+\def\pgfpoint#1#2{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgfmathsetlength\pgf@y{#2}\ignorespaces}
+
+
+% Quickly a point
+%
+% #1 = x-coordinate of the point (no calculations done)
+% #2 = y-coordinate of the point (no calculations done)
+%
+% x = #1
+% y = #2
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfqpoint{2pt}{3cm}}
+
+\def\pgfqpoint#1#2{\global\pgf@x=#1\relax\global\pgf@y=#2\relax}
+
+
+
+% Return the origin.
+%
+% x = 0
+% y = 0
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointorigin}
+
+\def\pgfpointorigin{\global\pgf@x=0pt \global\pgf@y=\pgf@x\ignorespaces}
+
+
+
+% Return a transformed point
+%
+% #1 = a point
+%
+% Description:
+%
+% This command applies pgf's current transformation matrix to the
+% given point. Normally, this is done automatically by commands like
+% lineto or moveto, but sometimes you may wish to access a transformed
+% point yourself. In the below example, this command is used for a low level
+% coordinate system shift.
+%
+% Example:
+%
+% \begin{pgflowleveltransformshiftscope}{\pgfpointtransformed{\pgfpointorigin}}
+% \pgfbox[center,center]{Hi!}
+% \end{pgflowleveltransformshiftscope}
+
+\def\pgfpointtransformed#1{%
+ \pgf@process{%
+ #1%
+ \pgf@pos@transform@glob%
+ }%
+}
+
+
+% Return the difference vector of two points.
+%
+% #1 = start of vector
+% #2 = end of vector
+%
+% x = x-component of difference
+% y = y-component of difference
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointdiff{\pgfpointxy{1}{1}}{\pgfpointxy{2}{3}}}
+
+\def\pgfpointdiff#1#2{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#2}%
+ \global\advance\pgf@x by-\pgf@xa\relax%
+ \global\advance\pgf@y by-\pgf@ya\relax\ignorespaces}
+
+% Add two vectors.
+%
+% #1 = first vector
+% #2 = second vector
+%
+% x = x-component of addition
+% y = y-component of addition
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointadd{\pgfpointxy{0}{1}}{\pgfpointxy{2}{3}}}
+
+\def\pgfpointadd#1#2{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#2}%
+ \global\advance\pgf@x by\pgf@xa%
+ \global\advance\pgf@y by\pgf@ya}
+
+
+
+% Multiply a vector by a factor.
+%
+% #1 = factor
+% #2 = vector
+%
+% Example:
+%
+% \pgfpointscale{2}{\pgfpointxy{0}{1}}
+
+\def\pgfpointscale#1#2{%
+ \pgf@process{#2}%
+ \pgfmathparse{#1}%
+ \global\pgf@x=\pgfmathresult\pgf@x%
+ \global\pgf@y=\pgfmathresult\pgf@y%
+}
+% A "quick" variant of \pgfpointscale which doesn't invoke the math parser for '#1'.
+% #1 must be a number without units, no registers are accepted.
+\def\pgfqpointscale#1#2{%
+ \pgf@process{#2}%
+ \global\pgf@x=#1\pgf@x%
+ \global\pgf@y=#1\pgf@y%
+}
+
+
+% The intersection of two lines
+%
+% #1 = point on first line
+% #2 = another point on first line
+% #3 = point on second line
+% #4 = another point on second line
+%
+% Returns the intersection of the two lines. If there is no
+% intersection or if the points #1 and #2 or the points #3 and #4 are
+% identical, the behaviour is not specified.
+%
+% Example:
+%
+% \pgfpointintersectionoflines{\pgfpointxy{0}{1}}{\pgfpointxy{1}{0}}{\pgfpointxy{2}{2}}{\pgfpointxy{3}{4}}
+
+\def\pgfpointintersectionoflines#1#2#3#4{%
+ {%
+ %
+ % Compute orthogonal vector to #1--#2
+ %
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#1}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \pgf@ya=-\pgf@ya%
+ % Normalise a bit
+ \c@pgf@counta=\pgf@xa%
+ \ifnum\c@pgf@counta<0\relax%
+ \c@pgf@counta=-\c@pgf@counta\relax%
+ \fi%
+ \c@pgf@countb=\pgf@ya%
+ \ifnum\c@pgf@countb<0\relax%
+ \c@pgf@countb=-\c@pgf@countb\relax%
+ \fi%
+ \advance\c@pgf@counta by\c@pgf@countb\relax%
+ \divide\c@pgf@counta by 65536\relax%
+ \ifnum\c@pgf@counta>0\relax%
+ \divide\pgf@xa by\c@pgf@counta\relax%
+ \divide\pgf@ya by\c@pgf@counta\relax%
+ \fi%
+ %
+ % Compute projection
+ %
+ \pgf@xc=\pgf@sys@tonumber{\pgf@ya}\pgf@x%
+ \advance\pgf@xc by\pgf@sys@tonumber{\pgf@xa}\pgf@y%
+ %
+ % The orthogonal vector is (\pgf@ya,\pgf@xa)
+ %
+ %
+ % Compute orthogonal vector to #3--#4
+ %
+ \pgf@process{#4}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#3}%
+ \advance\pgf@xb by-\pgf@x%
+ \advance\pgf@yb by-\pgf@y%
+ \pgf@yb=-\pgf@yb%
+ % Normalise a bit
+ \c@pgf@counta=\pgf@xb%
+ \ifnum\c@pgf@counta<0\relax%
+ \c@pgf@counta=-\c@pgf@counta\relax%
+ \fi%
+ \c@pgf@countb=\pgf@yb%
+ \ifnum\c@pgf@countb<0\relax%
+ \c@pgf@countb=-\c@pgf@countb\relax%
+ \fi%
+ \advance\c@pgf@counta by\c@pgf@countb\relax%
+ \divide\c@pgf@counta by 65536\relax%
+ \ifnum\c@pgf@counta>0\relax%
+ \divide\pgf@xb by\c@pgf@counta\relax%
+ \divide\pgf@yb by\c@pgf@counta\relax%
+ \fi%
+ %
+ % Compute projection
+ %
+ \pgf@yc=\pgf@sys@tonumber{\pgf@yb}\pgf@x%
+ \advance\pgf@yc by\pgf@sys@tonumber{\pgf@xb}\pgf@y%
+ %
+ % The orthogonal vector is (\pgf@yb,\pgf@xb)
+ %
+ % Setup transformation matrix (this is just to use the matrix
+ % inversion)
+ %
+ \pgfsettransform{{\pgf@sys@tonumber\pgf@ya}{\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@xb}{0pt}{0pt}}%
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{\pgfpoint{\pgf@xc}{\pgf@yc}}}%
+ }%
+}
+
+
+% The intersection of two circles
+%
+% #1 = center of first circle
+% #2 = center of second circle
+% #3 = radius of first circle
+% #4 = radius of second circle
+% #5 = solution number
+%
+% Returns the intersection of the two circles. If #5 is to "1", the
+% first intersection is returned, otherwise the second. If the circles
+% do not intersect, an error may occur.
+%
+% Example:
+%
+% \pgfpointintersectionofcircles{\pgfpointxy{0}{1}}{\pgfpointxy{1}{0}}{1cm}{1cm}{1}
+
+\def\pgfpointintersectionofcircles#1#2#3#4#5{%
+ {%
+ % Store first point in (xa,ya) and radius in xc.
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfmathsetlength{\pgf@xc}{#3}%
+ % Store second point in (xb,yb) and radius in yc.
+ \pgf@process{#2}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgfmathsetlength{\pgf@yc}{#4}%
+ %
+ % Ok, now make numbers smaller, in case they are too large
+ %
+ \c@pgf@counta=1\relax%
+ \loop%
+ \pgf@scale@downfalse%
+ \ifdim\pgf@xc>50pt\relax%
+ \pgf@scale@downtrue%
+ \fi%
+ \ifdim\pgf@yc>50pt\relax%
+ \pgf@scale@downtrue%
+ \fi%
+ \ifpgf@scale@down%
+ \multiply\c@pgf@counta by2\relax%
+ \divide\pgf@xa by2\relax%
+ \divide\pgf@ya by2\relax%
+ \divide\pgf@xb by2\relax%
+ \divide\pgf@yb by2\relax%
+ \divide\pgf@xc by2\relax%
+ \divide\pgf@yc by2\relax%
+ \repeat%
+ % The following code is taken from the Dr. Math internet forum:
+ %
+ % Let the centers be: (a,b), (c,d)
+ % Let the radii be: r, s
+ %
+ % e = c - a [difference in x coordinates]
+ % f = d - b [difference in y coordinates]
+ % p = sqrt(e^2 + f^2) [distance between centers]
+ % k = (p^2 + r^2 - s^2)/(2p) [distance from center 1 to line
+ % joining points of intersection]
+ % x = a + ek/p + (f/p)sqrt(r^2 - k^2)
+ % y = b + fk/p - (e/p)sqrt(r^2 - k^2)
+ % OR
+ % x = a + ek/p - (f/p)sqrt(r^2 - k^2)
+ % y = b + fk/p + (e/p)sqrt(r^2 - k^2)
+ %
+ % Since we are running low on registers, use
+ % \dimen0 for e
+ % \dimen1 for f
+ % \dimen2 for p
+ % \dimen3 for p^2
+ % \dimen4 for k
+ % \dimen5 for 1/p
+ % \dimen6 for sqrt(r^2 - k^2)
+ % \dimen7 for k^2
+ % \dimen8 for k/p
+ % \dimen9 for sqrt(r^2 - k^2)/p
+ % Also note that:
+ % \pgf@xa for a
+ % \pgf@ya for b
+ % \pgf@xb for c
+ % \pgf@yb for d
+ % \pgf@xc for r
+ % \pgf@yc for s
+ %
+ % Now:
+ % e = c - a
+ \dimen0=\pgf@xb%
+ \advance\dimen0 by-\pgf@xa%
+ % f = d - b
+ \dimen1=\pgf@yb%
+ \advance\dimen1 by-\pgf@ya%
+ % p^2 = e^2 + f^2
+ \pgf@x=\dimen0\relax%
+ \pgf@x=\pgf@sys@tonumber{\pgf@x}\pgf@x%
+ \dimen3=\pgf@x%
+ \pgf@x=\dimen1\relax%
+ \advance\dimen3 by\pgf@sys@tonumber{\pgf@x}\pgf@x%
+ % p = sqrt(p^2)
+ \pgfmathparse{sqrt(\the\dimen3)}%
+ \dimen2=\pgfmathresult pt%
+ % 1/p = 1/p
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \dimen5=\pgfmathresult pt%
+ % k = (p^2 + r^2 - s^2)/(2p)
+ \dimen4=\dimen3\relax%
+ \pgf@x=\pgf@xc%
+ \advance\dimen4 by\pgf@sys@tonumber{\pgf@x}\pgf@x\relax%
+ \pgf@x=\pgf@yc%
+ \advance\dimen4 by-\pgf@sys@tonumber{\pgf@x}\pgf@x\relax%
+ \dimen4=.5\dimen4%
+ \dimen4=\pgf@sys@tonumber{\dimen5}\dimen4%
+ % dimen7 is k^2
+ \dimen7=\pgf@sys@tonumber{\dimen4}\dimen4\relax%
+ % dimen6 is sqrt(r^2 - k^2)
+ \pgfmathparse{sqrt(\pgf@sys@tonumber{\pgf@xc}\pgf@xc-\the\dimen7)}%
+ \dimen6=\pgfmathresult pt%
+ % dimen8 is k/p
+ \dimen8=\pgf@sys@tonumber{\dimen4}\dimen5\relax%
+ % dimen9 is sqrt(r^2 - k^2)/p
+ \dimen9=\pgf@sys@tonumber{\dimen6}\dimen5\relax%
+ \ifnum#5=1\relax%
+ % x = a + ek/p + (f/p)sqrt(r^2 - k^2)
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by\pgf@sys@tonumber{\dimen0}\dimen8\relax%
+ \advance\pgf@x by\pgf@sys@tonumber{\dimen1}\dimen9\relax%
+ % y = b + fk/p - (e/p)sqrt(r^2 - k^2)
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by\pgf@sys@tonumber{\dimen1}\dimen8\relax%
+ %temp
+ \pgf@xb=\pgf@sys@tonumber{\dimen0}\dimen9%
+ \pgf@xb=-\pgf@xb%
+ \advance\pgf@y by\pgf@xb\relax%
+ \else%
+ % x = a + ek/p - (f/p)sqrt(r^2 - k^2)
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by\pgf@sys@tonumber{\dimen0}\dimen8\relax%
+ %temp
+ \pgf@xb=\pgf@sys@tonumber{\dimen1}\dimen9%
+ \pgf@xb=-\pgf@xb%
+ \advance\pgf@x by\pgf@xb\relax%
+ % y = b + fk/p + (e/p)sqrt(r^2 - k^2)
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by\pgf@sys@tonumber{\dimen1}\dimen8\relax%
+ \advance\pgf@y by\pgf@sys@tonumber{\dimen0}\dimen9\relax%
+ \fi%
+ \pgf@x=\c@pgf@counta\pgf@x%
+ \pgf@y=\c@pgf@counta\pgf@y%
+ \pgf@process{}% get results outside
+ }%
+}
+\newif\ifpgf@scale@down
+
+
+% Returns point on a line from #2 to #3 at time #1.
+%
+% #1 = a time, where 0 is the start and 1 is the end
+% #2 = start point
+% #3 = end point
+%
+% x = x-component of #1*start + (1-#1)*end
+% y = y-component of #1*start + (1-#1)*end
+% xa/ya = #1*start + (1-#1)*end
+% xb/yb = start point
+% xc/yc = end point
+%
+% Example:
+%
+% % Middle of (1,1) and (2,3)
+% \pgfpathmoveto{\pgfpointlineattime{0.5}{\pgfpointxy{0}{1}}{\pgfpointxy{2}{3}}}
+
+\def\pgfpointlineattime#1#2#3{%
+ \pgf@process{#3}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgf@xc\pgf@x%
+ \pgf@yc\pgf@y%
+ \pgf@process{#2}%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgfmathsetmacro\pgf@temp{#1}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \global\advance\pgf@x by\pgf@temp\pgf@xa%
+ \global\advance\pgf@y by\pgf@temp\pgf@ya%
+}
+
+
+% Move point #2 #1 many units in the direction of #3.
+%
+% #1 = a distance
+% #2 = start point
+% #3 = end point
+%
+% Description:
+%
+% Computes
+%
+% x/y = start + #1*(normalise(end-start))
+%
+% and additionally
+%
+% xa/ya = #1*(normalise(end-start))
+% xb/yb = start
+% xc/yc = end
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointlineatdistance{2pt}{\pgfpointxy{0}{1}}{\pgfpointxy{2}{3}}}
+% \pgfpathlineto{\pgfpointlineatdistance{3pt}{\pgfpointxy{2}{3}}{\pgfpointxy{0}{1}}}
+
+\def\pgfpointlineatdistance#1#2#3{%
+ \pgfmathsetlength\pgf@xa{#1}%
+ \pgf@process{#2}%
+ \pgf@xb\pgf@x% xb/yb = start point
+ \pgf@yb\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xc\pgf@x%
+ \pgf@yc\pgf@y%
+ \global\advance\pgf@x by-\pgf@xb\relax%
+ \global\advance\pgf@y by-\pgf@yb\relax%
+ \pgf@process{\pgfpointnormalised{}}% x/y = normalised vector
+ \pgf@ya=\pgf@xa\relax%
+ \pgf@xa=\pgf@sys@tonumber{\pgf@x}\pgf@xa%
+ \pgf@ya=\pgf@sys@tonumber{\pgf@y}\pgf@ya%
+ \global\pgf@x=\pgf@xb\relax%
+ \global\pgf@y=\pgf@yb\relax%
+ \global\advance\pgf@x by\pgf@xa\relax%
+ \global\advance\pgf@y by\pgf@ya\relax%
+}
+
+
+% Returns point on a curve from #2 to #5 with controls #3 and #4 at time #1.
+%
+% #1 = a time
+% #2 = start point
+% #3 = first control point
+% #4 = second control point
+% #5 = end point
+%
+% x = x-component of place on the curve at time t
+% y = y-component of place on the curve at time t
+%
+% Additionally, (\pgf@xa,\pgf@ya) and (\pgf@xb,\pgf@yb) will be on a
+% tangent to the point on the curve (this can be useful for computing
+% a label rotation). (\pgf@xc,\pgf@yc) will be equal to the end
+% point. \pgf@time@s will equal the value of #1 and \pgf@time@t will
+% equal 1-#1.
+%
+% Example:
+%
+% % Middle of (1,1) and (2,3)
+% \pgfpathmoveto{\pgfpointcurveattime{0.5}{\pgfpointxy{0}{1}}{\pgfpointxy{1}{1}}{\pgfpointxy{1}{1}}{\pgfpointxy{2}{3}}}
+
+\def\pgfpointcurveattime#1#2#3#4#5{%
+ \pgfmathparse{#1}%
+ \let\pgf@time@s=\pgfmathresult%
+ \global\pgf@x=\pgfmathresult pt%
+ \global\pgf@x=-\pgf@x%
+ \advance\pgf@x by 1pt%
+ \edef\pgf@time@t{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@process{#5}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{#4}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#2}%
+ % First iteration:
+ \global\pgf@x=\pgf@time@t\pgf@x\global\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \global\pgf@y=\pgf@time@t\pgf@y\global\advance\pgf@y by\pgf@time@s\pgf@ya%
+ \pgf@xa=\pgf@time@t\pgf@xa\advance\pgf@xa by\pgf@time@s\pgf@xb%
+ \pgf@ya=\pgf@time@t\pgf@ya\advance\pgf@ya by\pgf@time@s\pgf@yb%
+ \pgf@xb=\pgf@time@t\pgf@xb\advance\pgf@xb by\pgf@time@s\pgf@xc%
+ \pgf@yb=\pgf@time@t\pgf@yb\advance\pgf@yb by\pgf@time@s\pgf@yc%
+ % Second iteration:
+ \global\pgf@x=\pgf@time@t\pgf@x\global\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \global\pgf@y=\pgf@time@t\pgf@y\global\advance\pgf@y by\pgf@time@s\pgf@ya%
+ \pgf@xa=\pgf@time@t\pgf@xa\advance\pgf@xa by\pgf@time@s\pgf@xb%
+ \pgf@ya=\pgf@time@t\pgf@ya\advance\pgf@ya by\pgf@time@s\pgf@yb%
+ % Save x/y
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ % Third iteration:
+ \global\pgf@x=\pgf@time@t\pgf@x\global\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \global\pgf@y=\pgf@time@t\pgf@y\global\advance\pgf@y by\pgf@time@s\pgf@ya%
+}
+
+
+
+% Returns point on an arc at a certain "time"
+%
+% #1 = a time
+% #2 = center of a ellipse
+% #3 = 0-degree axis of the ellipse
+% #4 = 90-degree axis of the ellipse
+% #5 = start angle of an arc on the ellipse
+% #6 = end angle of an arc on the ellipse
+%
+% Result:
+%
+% \pgf@x = x-component of place on the arc at time t
+% \pgf@y = y-component of place on the arc at time t
+%
+% Additionally, (\pgf@xa,\pgf@ya) will be a tangent to the
+% point on the arc (this can be useful for computing a label rotation).
+%
+% Example:
+%
+% \pgfpointarcaxesattime{0.25}{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{0cm}}{\pgfpoint{0cm}{1cm}}{1cm}{30}{40}
+
+\def\pgfpointarcaxesattime#1#2#3#4#5#6{%
+ \pgfmathsetmacro\pgf@angle@start{#5}%
+ \pgfmathsetmacro\pgf@angle@end{#6}%
+ \pgfmathparse{#1}%
+ \global\pgf@x=\pgfmathresult pt%
+ \global\pgf@x=-\pgf@x%
+ \advance\pgf@x by 1pt%
+ \pgfmathsetmacro\pgf@angle@mid{\pgf@angle@end*\pgfmathresult+\pgf@angle@start*\pgf@sys@tonumber{\pgf@x}}%
+ \pgfmathcos@{\pgf@angle@mid}%
+ \let\pgf@angle@cos\pgfmathresult%
+ \pgfmathsin@{\pgf@angle@mid}%
+ \let\pgf@angle@sin\pgfmathresult%
+ \pgf@process{#3}%
+ \edef\pgf@angle@zero@axis{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \pgf@process{#4}%
+ \edef\pgf@angle@ninety@axis{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ % Compute tangent
+ \pgf@process{\pgfpointadd{\pgfpointscale{\pgf@angle@sin}{\pgf@angle@zero@axis}}%
+ {\pgfpointscale{-\pgf@angle@cos}{\pgf@angle@ninety@axis}}}%
+ \ifdim\pgf@angle@start pt>\pgf@angle@end pt%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \else%
+ \pgf@xa=-\pgf@x%
+ \pgf@ya=-\pgf@y%
+ \fi%
+ % Compute position
+ \pgf@process{\pgfpointadd{#2}{%
+ \pgfpointadd{\pgfpointscale{\pgf@angle@cos}{\pgf@angle@zero@axis}}%
+ {\pgfpointscale{\pgf@angle@sin}{\pgf@angle@ninety@axis}}}}%
+}
+
+
+
+% Internal registers
+\newdimen\pgf@xx
+\newdimen\pgf@xy
+\newdimen\pgf@yx
+\newdimen\pgf@yy
+\newdimen\pgf@zx
+\newdimen\pgf@zy
+
+
+
+% A polar coordinate
+%
+% #1 = a degree
+% #2 = a radius -- either a dimension or two dimensions separated by
+% " and ".
+%
+% x = (first dimension in #2) * cos(#1)
+% y = (second dimension in #2) * sin(#2)
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointpolar{30}{1cm}}
+% \pgfpathlineto{\pgfpointpolar{30}{1cm and 2cm}}
+
+\def\pgfpointpolar#1#2{%
+ \pgfutil@in@{and }{#2}%
+ \ifpgfutil@in@%
+ \pgf@polar@#2\@@%
+ \else%
+ \pgf@polar@#2 and #2\@@%
+ \fi%
+ \pgfmathparse{#1}%
+ \let\pgfpoint@angle=\pgfmathresult%
+ \pgfmathcos@{\pgfpoint@angle}%
+ \global\pgf@x=\pgfmathresult\pgf@x%
+ \pgfmathsin@{\pgfpoint@angle}%
+ \global\pgf@y=\pgfmathresult\pgf@y%
+}
+
+\def\pgf@polar@#1and #2\@@{%
+ \pgfmathsetlength{\pgf@y}{#2}%
+ \pgfmathsetlength{\pgf@x}{#1}%
+}
+
+% Quick version of the polar coordinate method
+
+\def\pgfqpointpolar#1#2{%
+ \global\pgf@x=#2%
+ \global\pgf@y=\pgf@x%
+ \pgfmathcos@{#1}%
+ \global\pgf@x=\pgfmathresult\pgf@x%
+ \pgfmathsin@{#1}%
+ \global\pgf@y=\pgfmathresult\pgf@y\relax%
+}
+
+
+
+
+% A polar coordinate in the xy plane.
+%
+% #1 = a degree
+% #2 = a radius given as a number or two radii
+%
+% result = (first dim in #2) * x-vector * cos(#1) +
+% (second dim in #2) * y-vector * sin(#1)
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointpolarxy{30}{2}}
+
+\def\pgfpointpolarxy#1#2{%
+ \pgfutil@in@{and }{#2}%
+ \ifpgfutil@in@%
+ \pgf@polarxy@#2\@@%
+ \else%
+ \pgf@polarxy@#2and #2\@@%
+ \fi%
+ \pgfmathparse{#1}%
+ \let\pgfpoint@angle=\pgfmathresult%
+ \pgfmathcos@{\pgfpoint@angle}%
+ \pgf@xa=\pgfmathresult\pgf@xa%
+ \pgfmathsin@{\pgfpoint@angle}%
+ \pgf@ya=\pgfmathresult\pgf@ya%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@xx%
+ \global\advance\pgf@x by \pgf@sys@tonumber{\pgf@ya}\pgf@yx%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xa}\pgf@xy%
+ \global\advance\pgf@y by \pgf@sys@tonumber{\pgf@ya}\pgf@yy}
+
+\def\pgf@polarxy@#1and #2\@@{%
+ \pgfmathsetlength{\pgf@xa}{#1}%
+ \pgfmathsetlength{\pgf@ya}{#2}%
+}
+
+
+
+% A cylindrical coordinate.
+%
+% #1 = a degree
+% #2 = a radius given as a number
+% #3 = a height given as a number
+%
+% result = #2*(x-vector * cos(#1) + y-vector * sin(#1)) + #3*z-vector
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointcylindrical{30}{2}{1}}
+
+\def\pgfpointcylindrical#1#2#3{%
+ \pgfpointpolarxy{#1}{#2}%
+ \pgfmathparse{#3}%
+ \global\advance\pgf@x by \pgfmathresult\pgf@zx%
+ \global\advance\pgf@y by \pgfmathresult\pgf@zy}
+
+
+% A spherical coordinate.
+%
+% #1 = a longitude
+% #2 = a latitude
+% #3 = a radius
+%
+% result = #3*(cos(#2)*(x-vector * cos(#1) + y-vector * sin(#1)) + sin(#2)*z-vector)
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointspherical{30}{30}{2}}
+
+\def\pgfpointspherical#1#2#3{%
+ \pgfmathparse{#1}%
+ \let\pgfpoint@angle=\pgfmathresult%
+ \pgfmathsin@{\pgfpoint@angle}%
+ \pgf@xb=\pgfmathresult\pgf@xx%
+ \pgf@yb=\pgfmathresult\pgf@xy%
+ \pgfmathcos@{\pgfpoint@angle}%
+ \advance\pgf@xb by \pgfmathresult\pgf@yx%
+ \advance\pgf@yb by \pgfmathresult\pgf@yy%
+ %
+ \pgfmathparse{#2}%
+ \let\pgfpoint@angle=\pgfmathresult%
+ \pgfmathcos@{\pgfpoint@angle}%
+ \pgf@xc=\pgfmathresult\pgf@xb%
+ \pgf@yc=\pgfmathresult\pgf@yb%
+ \pgfmathsin@{\pgfpoint@angle}%
+ \advance\pgf@xc by \pgfmathresult\pgf@zx%
+ \advance\pgf@yc by \pgfmathresult\pgf@zy%
+ \pgfmathparse{#3}%
+ \global\pgf@x=\pgfmathresult\pgf@xc%
+ \global\pgf@y=\pgfmathresult\pgf@yc\relax%
+}
+
+
+% Store the vector #1 * x-vec + #2 * y-vec
+%
+% #1 = a factor for the x-vector
+% #2 = a factor for the y-vector
+%
+% x = x-component of result vector
+% y = y-component of result vector
+%
+% Description:
+%
+% This command can be used to create a new coordinate system
+% without using the rotate/translate/scale commands. This
+% may be useful, if you do not want arrows and line width to
+% be scaled/transformed together with the coordinate system.
+%
+% Example:
+%
+% % Create a slanted rectangle
+%
+% \pgfsetxvec{\pgfpoint{1cm}{1cm}}
+% \pgfsetyvec{\pgfpoint{0cm}{1cm}}
+%
+% \pgfpathmoveto{\pgfpointxy{0}{0}}
+% \pgfpathlineto{\pgfpointxy{1}{0}}
+% \pgfpathlineto{\pgfpointxy{1}{1}}
+% \pgfpathlineto{\pgfpointxy{0}{1}}
+% \pgfclosestroke
+
+\def\pgfpointxy#1#2{%
+ \pgfmathparse{#1}%
+ \let\pgftemp@x=\pgfmathresult%
+ \pgfmathparse{#2}%
+ \let\pgftemp@y=\pgfmathresult%
+ \global\pgf@x=\pgftemp@x\pgf@xx%
+ \global\advance\pgf@x by \pgftemp@y\pgf@yx%
+ \global\pgf@y=\pgftemp@x\pgf@xy%
+ \global\advance\pgf@y by \pgftemp@y\pgf@yy}
+
+
+% "Quick" variant for \pgfpointxy.
+%
+% Only numbers without unit are allowed here.
+\def\pgfqpointxy#1#2{%
+ \global\pgf@x=#1\pgf@xx%
+ \global\advance\pgf@x by #2\pgf@yx%
+ \global\pgf@y=#1\pgf@xy%
+ \global\advance\pgf@y by #2\pgf@yy}
+
+% Store the vector #1 * x-vec + #2 * y-vec + #3 * z-vec
+%
+% #1 = a factor for the x-vector
+% #2 = a factor for the y-vector
+% #3 = a factor for the z-vector
+%
+% x = x-component of result vector
+% y = y-component of result vector
+%
+%
+% Description:
+%
+% This command allows you to use a 3d coordinate system.
+%
+%
+% Example:
+%
+% % Draw a cubus
+%
+% \pgfline{\pgfpointxyz{0}{0}{0}}{\pgfpointxyz{0}{0}{1}}
+% \pgfline{\pgfpointxyz{0}{1}{0}}{\pgfpointxyz{0}{1}{1}}
+% \pgfline{\pgfpointxyz{1}{0}{0}}{\pgfpointxyz{1}{0}{1}}
+% \pgfline{\pgfpointxyz{1}{1}{0}}{\pgfpointxyz{1}{1}{1}}
+% \pgfline{\pgfpointxyz{0}{0}{0}}{\pgfpointxyz{0}{1}{0}}
+% \pgfline{\pgfpointxyz{0}{0}{1}}{\pgfpointxyz{0}{1}{1}}
+% \pgfline{\pgfpointxyz{1}{0}{0}}{\pgfpointxyz{1}{1}{0}}
+% \pgfline{\pgfpointxyz{1}{0}{1}}{\pgfpointxyz{1}{1}{1}}
+% \pgfline{\pgfpointxyz{0}{0}{0}}{\pgfpointxyz{1}{0}{0}}
+% \pgfline{\pgfpointxyz{0}{0}{1}}{\pgfpointxyz{1}{0}{1}}
+% \pgfline{\pgfpointxyz{0}{1}{0}}{\pgfpointxyz{1}{1}{0}}
+% \pgfline{\pgfpointxyz{0}{1}{1}}{\pgfpointxyz{1}{1}{1}}
+
+\def\pgfpointxyz#1#2#3{%
+ \pgfmathparse{#1}%
+ \global\let\pgftemp@x=\pgfmathresult%
+ \pgfmathparse{#2}%
+ \global\let\pgftemp@y=\pgfmathresult%
+ \pgfmathparse{#3}%
+ \global\let\pgftemp@z=\pgfmathresult%
+ \global\pgf@x=\pgftemp@x\pgf@xx%
+ \global\advance\pgf@x by \pgftemp@y\pgf@yx%
+ \global\advance\pgf@x by \pgftemp@z\pgf@zx%
+ \global\pgf@y=\pgftemp@x\pgf@xy%
+ \global\advance\pgf@y by \pgftemp@y\pgf@yy%
+ \global\advance\pgf@y by \pgftemp@z\pgf@zy}
+
+% "Quick" variant for \pgfpointxyz.
+%
+% Only numbers without unit are allowed.
+\def\pgfqpointxyz#1#2#3{%
+ \global\pgf@x=#1\pgf@xx%
+ \global\advance\pgf@x by #2\pgf@yx%
+ \global\advance\pgf@x by #3\pgf@zx%
+ \global\pgf@y=#1\pgf@xy%
+ \global\advance\pgf@y by #2\pgf@yy%
+ \global\advance\pgf@y by #3\pgf@zy}
+
+
+
+% Set the x-vector
+%
+% #1 = a point the is the new x-vector
+%
+% Example:
+%
+% \pgfsetxvec{\pgfpoint{1cm}{0cm}}
+
+\def\pgfsetxvec#1{%
+ \pgf@process{#1}%
+ \pgf@xx=\pgf@x%
+ \pgf@xy=\pgf@y%
+ \ignorespaces}
+
+
+% Set the y-vector
+%
+% #1 = a point the is the new y-vector
+%
+% Example:
+%
+% \pgfsetyvec{\pgfpoint{0cm}{1cm}}
+
+\def\pgfsetyvec#1{%
+ \pgf@process{#1}%
+ \pgf@yx=\pgf@x%
+ \pgf@yy=\pgf@y%
+ \ignorespaces}
+
+
+% Set the z-vector
+%
+% #1 = a point the is the new z-vector
+%
+% Example:
+%
+% \pgfsetzvec{\pgfpoint{-0.385cm}{-0.385cm}}
+
+\def\pgfsetzvec#1{%
+ \pgf@process{#1}%
+ \pgf@zx=\pgf@x%
+ \pgf@zy=\pgf@y%
+ \ignorespaces}
+
+
+
+% Default values
+\pgfsetxvec{\pgfpoint{1cm}{0cm}}
+\pgfsetyvec{\pgfpoint{0cm}{1cm}}
+\pgfsetzvec{\pgfpoint{-0.385cm}{-0.385cm}}
+
+
+
+
+% Normalise a point.
+%
+% #1 = point with coordinates (a,b)
+%
+% x = a/\sqrt(a*a+b*b)
+% y = b/\sqrt(a*a+b*b)
+%
+% Example:
+%
+% \pgfpointnormalised{\pgfpointxy{2}{1}}
+
+\def\pgfpointnormalised#1{%
+ \pgf@process{#1}%
+ \pgfmathatantwo{\the\pgf@y}{\the\pgf@x}%
+ \let\pgf@tmp=\pgfmathresult%
+ \pgfmathcos@{\pgf@tmp}%
+ \pgf@x=\pgfmathresult pt\relax%
+ \pgfmathsin@{\pgf@tmp}%
+ \pgf@y=\pgfmathresult pt\relax%
+}
+
+
+
+
+
+% A point on a rectangle in a certain direction.
+%
+% #1 = a point pointing in some direction (length should be about 1pt,
+% but need not be exact)
+% #2 = upper right corner of a rectangle centered at the origin
+%
+% Returns the intersection of a line starting at the origin going in
+% the given direction and the rectangle's border.
+%
+% Example:
+%
+% \pgfpointborderrectangle{\pgfpointnormalised{\pgfpointxy{2}{1}}
+% {\pgfpoint{1cm}{2cm}}
+
+\def\pgfpointborderrectangle#1#2{%
+ \pgf@process{#2}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#1}%
+ % Ok, let's find out about the direction:
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \ifnum\pgf@xa<0\relax% move into first quadrant
+ \global\pgf@x=-\pgf@x%
+ \fi%
+ \ifnum\pgf@ya<0\relax%
+ \global\pgf@y=-\pgf@y%
+ \fi%
+ \pgf@xc=.125\pgf@x%
+ \pgf@yc=.125\pgf@y%
+ \c@pgf@counta=\pgf@xc%
+ \c@pgf@countb=\pgf@yc%
+ \ifnum\c@pgf@countb<\c@pgf@counta%
+ \ifnum\c@pgf@counta<255\relax%
+ \global\pgf@y=\pgf@yb\relax%
+ \global\pgf@x=0pt\relax%
+ \else%
+ \pgf@xc=8192pt%
+ \divide\pgf@xc by\c@pgf@counta% \pgf@xc = 1/\pgf@x
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xc}\pgf@y%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xb}\pgf@y%
+ \ifnum\pgf@y<\pgf@yb%
+ \global\pgf@x=\pgf@xb%
+ \else% rats, calculate intersection on upper side
+ \ifnum\c@pgf@countb<255\relax%
+ \global\pgf@x=\pgf@xb\relax%
+ \global\pgf@y=0pt\relax%
+ \else%
+ \pgf@yc=8192pt%
+ \divide\pgf@yc by\c@pgf@countb% \pgf@xc = 1/\pgf@x
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@yc}\pgf@x%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@yb}\pgf@x%
+ \global\pgf@y=\pgf@yb%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifnum\c@pgf@countb<255\relax%
+ \global\pgf@x=\pgf@xb\relax%
+ \global\pgf@y=0pt\relax%
+ \else%
+ \pgf@yc=8192pt%
+ \divide\pgf@yc by\c@pgf@countb% \pgf@xc = 1/\pgf@x
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@yc}\pgf@x%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@yb}\pgf@x%
+ \ifnum\pgf@x<\pgf@xb%
+ \global\pgf@y=\pgf@yb%
+ \else%
+ \ifnum\c@pgf@counta<255\relax%
+ \global\pgf@y=\pgf@yb\relax%
+ \global\pgf@x=0pt\relax%
+ \else%
+ \pgf@xc=8192pt%
+ \divide\pgf@xc by\c@pgf@counta% \pgf@xc = 1/\pgf@x
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xc}\pgf@y%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xb}\pgf@y%
+ \global\pgf@x=\pgf@xb%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\pgf@xa<0\relax\global\pgf@x=-\pgf@x\fi%
+ \ifnum\pgf@ya<0\relax\global\pgf@y=-\pgf@y\fi%
+}
+
+
+
+
+% An approximation to a point on an ellipse in a certain
+% direction. Will be exact only if the ellipse is a circle.
+%
+% #1 = a point pointing in some direction
+% #2 = upper right corner of a bounding box for the ellipse
+%
+% Returns the intersection of a line starting at the origin going in
+% the given direction and the ellipses border.
+%
+% Example:
+%
+% \pgfpointborderellipse{\pgfpointnormalised{\pgfpointxy{2}{1}}
+% {\pgfpoint{1cm}{2cm}}
+
+\def\pgfpointborderellipse#1#2{%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \ifdim\pgf@xa=\pgf@ya% circle. that's easy!
+ \pgf@process{\pgfpointnormalised{#1}}%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xa}\pgf@y%
+ \else%
+ \ifdim\pgf@xa<\pgf@ya%
+ % Ok, first, let's compute x/y:
+ \c@pgf@countb=\pgf@ya%
+ \divide\c@pgf@countb by65536\relax%
+ \global\divide\pgf@x by\c@pgf@countb%
+ \global\divide\pgf@y by\c@pgf@countb%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=8192pt%
+ \global\pgf@y=.125\pgf@y%
+ \c@pgf@countb=\pgf@y%
+ \divide\pgf@yc by\c@pgf@countb%
+ \pgf@process{#1}%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@yc}\pgf@y%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@xc}\pgf@y%
+ \pgf@process{\pgfpointnormalised{}}%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@ya}\pgf@y%
+ \else%
+ % Ok, now let's compute y/x:
+ \c@pgf@countb=\pgf@xa%
+ \divide\c@pgf@countb by65536\relax%
+ \global\divide\pgf@x by\c@pgf@countb%
+ \global\divide\pgf@y by\c@pgf@countb%
+ \pgf@yc=\pgf@y%
+ \pgf@xc=8192pt%
+ \global\pgf@x=.125\pgf@x%
+ \c@pgf@countb=\pgf@x%
+ \divide\pgf@xc by\c@pgf@countb%
+ \pgf@process{#1}%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@yc}\pgf@x%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@xc}\pgf@x%
+ \pgf@process{\pgfpointnormalised{}}%
+ \global\pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
+ \global\pgf@y=\pgf@sys@tonumber{\pgf@ya}\pgf@y%
+ \fi%
+ \fi%
+}
+
+
+
+
+
+% Extract the x-coordinate of a point to a dimensions
+%
+% #1 = a TeX dimension
+% #2 = a point
+%
+% Example:
+%
+% \newdimen\mydim
+% \pgfextractx{\mydim}{\pgfpoint{2cm}{4pt}}
+% % \mydim is now 2cm
+
+\def\pgfextractx#1#2{%
+ \pgf@process{#2}%
+ #1=\pgf@x\relax}
+
+
+% Extract the y-coordinate of a point to a dimensions
+%
+% #1 = a TeX dimension
+% #2 = a point
+%
+% Example:
+%
+% \newdimen\mydim
+% \pgfextracty{\mydim}{\pgfpoint{2cm}{4pt}}
+% % \mydim is now 4pt
+
+\def\pgfextracty#1#2{%
+ \pgf@process{#2}%
+ #1=\pgf@y\relax}
+
+
+% Stores the most recently used (x,y) coordinates into two macros, #1 and #2.
+\def\pgfgetlastxy#1#2{%
+ \edef#1{\the\pgf@x}%
+ \edef#2{\the\pgf@y}%
+}%
+
+
+\def\pgf@def#1#2#3{\expandafter\def\csname pgf@#1#2\endcsname{#3}}
+\pgf@def{cosfrac}{0}{1}
+\pgf@def{cosfrac}{1}{0.99995} \pgf@def{cosfrac}{2}{0.9998}
+\pgf@def{cosfrac}{3}{0.99955} \pgf@def{cosfrac}{4}{0.999201}
+\pgf@def{cosfrac}{5}{0.998752} \pgf@def{cosfrac}{6}{0.998205}
+\pgf@def{cosfrac}{7}{0.997559} \pgf@def{cosfrac}{8}{0.996815}
+\pgf@def{cosfrac}{9}{0.995974} \pgf@def{cosfrac}{10}{0.995037}
+\pgf@def{cosfrac}{11}{0.994004} \pgf@def{cosfrac}{12}{0.992877}
+\pgf@def{cosfrac}{13}{0.991656} \pgf@def{cosfrac}{14}{0.990342}
+\pgf@def{cosfrac}{15}{0.988936} \pgf@def{cosfrac}{16}{0.987441}
+\pgf@def{cosfrac}{17}{0.985856} \pgf@def{cosfrac}{18}{0.984183}
+\pgf@def{cosfrac}{19}{0.982424} \pgf@def{cosfrac}{20}{0.980581}
+\pgf@def{cosfrac}{21}{0.978653} \pgf@def{cosfrac}{22}{0.976644}
+\pgf@def{cosfrac}{23}{0.974555} \pgf@def{cosfrac}{24}{0.972387}
+\pgf@def{cosfrac}{25}{0.970143} \pgf@def{cosfrac}{26}{0.967823}
+\pgf@def{cosfrac}{27}{0.965429} \pgf@def{cosfrac}{28}{0.962964}
+\pgf@def{cosfrac}{29}{0.960429} \pgf@def{cosfrac}{30}{0.957826}
+\pgf@def{cosfrac}{31}{0.955157} \pgf@def{cosfrac}{32}{0.952424}
+\pgf@def{cosfrac}{33}{0.949629} \pgf@def{cosfrac}{34}{0.946773}
+\pgf@def{cosfrac}{35}{0.943858} \pgf@def{cosfrac}{36}{0.940887}
+\pgf@def{cosfrac}{37}{0.937862} \pgf@def{cosfrac}{38}{0.934784}
+\pgf@def{cosfrac}{39}{0.931655} \pgf@def{cosfrac}{40}{0.928477}
+\pgf@def{cosfrac}{41}{0.925252} \pgf@def{cosfrac}{42}{0.921982}
+\pgf@def{cosfrac}{43}{0.918669} \pgf@def{cosfrac}{44}{0.915315}
+\pgf@def{cosfrac}{45}{0.911922} \pgf@def{cosfrac}{46}{0.90849}
+\pgf@def{cosfrac}{47}{0.905024} \pgf@def{cosfrac}{48}{0.901523}
+\pgf@def{cosfrac}{49}{0.89799} \pgf@def{cosfrac}{50}{0.894427}
+\pgf@def{cosfrac}{51}{0.890835} \pgf@def{cosfrac}{52}{0.887217}
+\pgf@def{cosfrac}{53}{0.883573} \pgf@def{cosfrac}{54}{0.879905}
+\pgf@def{cosfrac}{55}{0.876216} \pgf@def{cosfrac}{56}{0.872506}
+\pgf@def{cosfrac}{57}{0.868777} \pgf@def{cosfrac}{58}{0.865031}
+\pgf@def{cosfrac}{59}{0.861269} \pgf@def{cosfrac}{60}{0.857493}
+\pgf@def{cosfrac}{61}{0.853704} \pgf@def{cosfrac}{62}{0.849903}
+\pgf@def{cosfrac}{63}{0.846092} \pgf@def{cosfrac}{64}{0.842271}
+\pgf@def{cosfrac}{65}{0.838444} \pgf@def{cosfrac}{66}{0.834609}
+\pgf@def{cosfrac}{67}{0.83077} \pgf@def{cosfrac}{68}{0.826927}
+\pgf@def{cosfrac}{69}{0.82308} \pgf@def{cosfrac}{70}{0.819232}
+\pgf@def{cosfrac}{71}{0.815383} \pgf@def{cosfrac}{72}{0.811534}
+\pgf@def{cosfrac}{73}{0.807687} \pgf@def{cosfrac}{74}{0.803842}
+\pgf@def{cosfrac}{75}{0.8} \pgf@def{cosfrac}{76}{0.796162}
+\pgf@def{cosfrac}{77}{0.792329} \pgf@def{cosfrac}{78}{0.788502}
+\pgf@def{cosfrac}{79}{0.784682} \pgf@def{cosfrac}{80}{0.780869}
+\pgf@def{cosfrac}{81}{0.777064} \pgf@def{cosfrac}{82}{0.773268}
+\pgf@def{cosfrac}{83}{0.769481} \pgf@def{cosfrac}{84}{0.765705}
+\pgf@def{cosfrac}{85}{0.761939} \pgf@def{cosfrac}{86}{0.758185}
+\pgf@def{cosfrac}{87}{0.754443} \pgf@def{cosfrac}{88}{0.750714}
+\pgf@def{cosfrac}{89}{0.746997} \pgf@def{cosfrac}{90}{0.743294}
+\pgf@def{cosfrac}{91}{0.739605} \pgf@def{cosfrac}{92}{0.735931}
+\pgf@def{cosfrac}{93}{0.732272} \pgf@def{cosfrac}{94}{0.728628}
+\pgf@def{cosfrac}{95}{0.724999} \pgf@def{cosfrac}{96}{0.721387}
+\pgf@def{cosfrac}{97}{0.717792} \pgf@def{cosfrac}{98}{0.714213}
+\pgf@def{cosfrac}{99}{0.710651} \pgf@def{cosfrac}{100}{0.707107}
+
+
+
+
+% Forward declarations for nonlinear stuff (have no effect till module
+% nonlineartransformations is loaded)
+
+\let\pgfpointtransformednonlinear\pgfpointtransformed
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorequick.code.tex b/graphics/pgf/base/tex/pgfcorequick.code.tex
new file mode 100644
index 0000000000..21e115846f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorequick.code.tex
@@ -0,0 +1,134 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorequick.code.tex}
+
+% Quick version of basic drawing commands. Most high-level commands
+% are not available if these commands are used.
+
+% Move current point to (#1,#2).
+%
+% #1 = x dimension of new current point
+% #2 = y dimension of new current point
+%
+% Example:
+%
+% \pgfpathqmoveto{0pt}{0pt}
+% \pgfpathqlineto{1pt}{1pt}
+% \pgfpathqcurveto{2pt}{1pt}{2pt}{2pt}{3pt}{2pt}
+% \pgfqstroke
+
+\def\pgfpathqmoveto#1#2{\pgfsyssoftpath@moveto{#1}{#2}}
+
+
+% Append a line to (#1,#2) to the current path.
+%
+% #1 = x dimension of target
+% #2 = y dimension of target
+%
+% Example:
+%
+% \pgfpathqmoveto{0pt}{0pt}
+% \pgfpathqlineto{1pt}{1pt}
+% \pgfpathqcurveto{2pt}{1pt}{2pt}{2pt}{3pt}{2pt}
+% \pgfqstroke
+
+\def\pgfpathqlineto#1#2{\pgfsyssoftpath@lineto{#1}{#2}}
+
+
+% Append a bezier spline to the current path.
+%
+% #1 = x dimension of first support point
+% #2 = y dimension of first support point
+% #3 = x dimension of second support point
+% #4 = y dimension of second support point
+% #5 = x dimension of target point
+% #6 = y dimension of target point
+%
+% Example:
+%
+% \pgfpathqmoveto{0pt}{0pt}
+% \pgfpathqlineto{1pt}{1pt}
+% \pgfpathqcurveto{2pt}{1pt}{2pt}{2pt}{3pt}{2pt}
+% \pgfqstroke
+
+\def\pgfpathqcurveto#1#2#3#4#5#6{\pgfsyssoftpath@curveto{#1}{#2}{#3}{#4}{#5}{#6}}
+
+
+
+
+% Append a circle of the given radius around the origin.
+%
+% #1 = radius
+%
+% Example:
+%
+% \pgfpathqcircle{10pt}
+% is quicker than
+% \pgfpathcircle{\pgforigin}{10pt}
+
+\def\pgfpathqcircle#1{%
+ {%
+ \pgf@x=#1%
+ \pgf@y=0.5522847\pgf@x%
+ \pgfsyssoftpath@moveto{\the\pgf@x}{0pt}%
+ \pgfsyssoftpath@curveto{\the\pgf@x}{\the\pgf@y}{\the\pgf@y}{\the\pgf@x}{0pt}{\the\pgf@x}%
+ \pgfsyssoftpath@curveto{-\the\pgf@y}{\the\pgf@x}{-\the\pgf@x}{\the\pgf@y}{-\the\pgf@x}{0pt}%
+ \pgfsyssoftpath@curveto{-\the\pgf@x}{-\the\pgf@y}{-\the\pgf@y}{-\the\pgf@x}{0pt}{-\the\pgf@x}%
+ \pgfsyssoftpath@curveto{\the\pgf@y}{-\the\pgf@x}{\the\pgf@x}{-\the\pgf@y}{\the\pgf@x}{0pt}%
+ \pgfsyssoftpath@closepath%
+ }%
+}
+
+
+
+% Stroke current path. No hooks called.
+%
+% Example:
+%
+% \pgfpathqmoveto{0cm}{0cm}
+% \pgfpathqlineto{1cm}{1cm}
+% \pgfpathqcurveto{2cm}{1cm}{2cm}{2cm}{3cm}{2cm}
+% \pgfqstroke
+
+\def\pgfusepathqstroke{%
+ \pgfsyssoftpath@flushcurrentpath%
+ \pgfsys@stroke%
+ \pgf@resetpathsizes%
+}
+
+
+% Quickly fill current path.
+
+\def\pgfusepathqfill{%
+ \pgfsyssoftpath@flushcurrentpath%
+ \pgfsys@fill%
+ \pgf@resetpathsizes%
+}
+
+
+% Quickly fill and stroke current path.
+
+\def\pgfusepathqfillstroke{%
+ \pgfsyssoftpath@flushcurrentpath%
+ \pgfsys@fillstroke%
+ \pgf@resetpathsizes%
+}
+
+% Quickly clip current path.
+
+\def\pgfusepathqclip{%
+ \pgfsyssoftpath@flushcurrentpath%
+ \pgfsys@clipnext%
+ \pgfsys@discardpath%
+ \pgf@resetpathsizes%
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorerdf.code.tex b/graphics/pgf/base/tex/pgfcorerdf.code.tex
new file mode 100644
index 0000000000..ae7e535171
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorerdf.code.tex
@@ -0,0 +1,228 @@
+% Copyright 2016 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorerdf.code.tex}
+
+
+
+%
+%
+% The Resource Description Framework (RDF) is a method of enriching
+% output files with semantic information. In PGF, you can use the
+% following commands to create RDF information that will be inserted
+% into the output, provided the output format allows this (SVG
+% does). You call any of these commands before an ID-scope and it will
+% attach the attribute(s) to this id scope.
+%
+%
+% Example:
+%
+% ...
+% \pgfrdftypeof{http://purl.org/dc/dcmitype/Image}
+% \pgfrdfresource{/paper/figures/1}
+% \pgfidscope
+% % This ID scope will be flagged as the resource "/paper/figures/1"
+% % and typeof "Image" from the Dublin Core.
+% ...
+% \endidscope
+
+
+
+
+
+% Adds the rdf attribute "about" with value #1 to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% The RDF-spec says: "a SafeCURIEorCURIEorIRI, used for stating what
+% the data is about (a 'subject' in RDF terminology);"
+
+\def\pgfrdfabout#1{\pgfsys@rdf@about{#1}}
+
+
+
+% Adds the rdf attribute content with value #1 to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% The RDF-spec says: "a CDATA string, for supplying machine-readable
+% content for a literal (a 'literal object', in RDF terminology);"
+
+\def\pgfrdfcontent#1{\pgfsys@rdf@content{#1}}
+
+
+
+% Adds the rdf attribute datatype with value #1 to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% The RDF-spec says: "a TERMorCURIEorAbsIRI representing a datatype,
+% to express the datatype of a literal;"
+
+\def\pgfrdfdatatype#1{\pgfsys@rdf@datatype{#1}}
+
+
+
+% Adds the rdf attribute href with value #1 to the next idscope
+% The RDF-spec says: "a traditionally navigable IRI for
+% expressing the partner resource of a relationship (a 'resource object', in RDF terminology);"
+
+\def\pgfrdfhref#1{\pgfsys@rdf@href{#1}}
+
+
+
+% Adds the rdf attribute inlist to the next idscope.
+%
+% Description:
+%
+% The RDF-spec says: "An attribute used to indicate that the object
+% associated with a rel or property attribute on the same element is
+% to be added to the list for that predicate. Presence of this
+% attribute causes a list to be created if it does not already exist."
+
+\def\pgfrdfinlist{\pgfsys@rdf@inlist}
+
+
+
+
+% Adds #1 to the list of the rdf prefix attribute to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% Can be called several times, in which case all values of #1 are
+% concatenated with whitespaces. The RDF-spec says: "a white space
+% separated list of prefix-name IRI pairs of the form NCName ':' ' '+
+% xsd:anyURI"
+
+\def\pgfrdfprefix#1{\pgfsys@rdf@prefix{#1}}
+
+
+
+
+% Adds #1 to the list of the rdf property attribute to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% Can be called repeatedly. The RDF-spec says: "a white space
+% separated list of TERMorCURIEorAbsIRIs, used for expressing
+% relationships between a subject and either a resource object if
+% given or some literal text (also a 'predicate');"
+
+\def\pgfrdfproperty#1{\pgfsys@rdf@property{#1}}
+
+
+
+% Adds #1 to the list of the rdf rel attribute to the next
+% next idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% Can be called repeatedly. The RDF-spec says: "a white space
+% separated list of TERMorCURIEorAbsIRIs, used for expressing
+% relationships between two resources ('predicates' in RDF
+% terminology);"
+
+\def\pgfrdfrel#1{\pgfsys@rdf@rel{#1}}
+
+
+% Adds the rdf attribute resource with value #1 to the next idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% The RDF-spec says: "a SafeCURIEorCURIEorIRI for expressing the
+% partner resource of a relationship that is not intended to be
+% navigable (e.g., a 'clickable' link) (also an 'object');"
+
+\def\pgfrdfresource#1{\pgfsys@rdf@resource{#1}}
+
+
+
+
+% Adds #1 to the list of the rdf rev attribute to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% Can be called repeatedly. The RDF-spec says: "a white space
+% separated list of TERMorCURIEorAbsIRIs, used for expressing reverse
+% relationships between two resources (also 'predicates');
+
+\def\pgfrdfrev#1{\pgfsys@rdf@rev{#1}}
+
+
+
+
+% Adds an rdf attribute src with value #1 to the next idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% The RDF-spec says: "an IRI for expressing the partner resource of a
+% relationship when the resource is embedded (also a 'resource object');"
+
+\def\pgfrdfsrc#1{\pgfsys@rdf@src{#1}}
+
+
+
+
+% Adds #1 to the list of the rdf typeof attribute to the next
+% idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% Can be called repeatedly. The RDF-spec says: "a white space
+% separated list of TERMorCURIEorAbsIRIs that indicate the RDF type(s)
+% to associate with a subject;"
+
+\def\pgfrdftypeof#1{\pgfsys@rdf@typeof{#1}}
+
+
+
+
+% Adds an rdf attribute vocab with value #1 to the next idscope.
+%
+% #1 = A URL
+%
+% Description:
+%
+% The RDF-spec says: "an IRI that defines the mapping to use when a
+% TERM is referenced in an attribute value. See General Use of Terms
+% in Attributes and the section on Vocabulary Expansion."
+
+\def\pgfrdfvocab#1{\pgfsys@rdf@vocab{#1}}
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcorescopes.code.tex b/graphics/pgf/base/tex/pgfcorescopes.code.tex
new file mode 100644
index 0000000000..3e292aa038
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcorescopes.code.tex
@@ -0,0 +1,771 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcorescopes.code.tex}
+
+% Globals
+
+\newbox\pgfpic
+\newbox\pgf@hbox
+
+\newbox\pgf@layerbox@main
+
+\newcount\pgf@picture@serial@count
+
+
+
+% This if decides whether the position of pictures on the page is
+% protocolled or not. Normally,
+% this is switched off as it works only with certain drivers and it
+% causes external files to be written. When switched on, the position
+% of pgfpictures are protocolled and can be referenced using
+% \pgfsys@getposition{XXX} where XXX is the value of \pgfpictureid
+% inside the picture.
+\newif\ifpgfrememberpicturepositiononpage
+
+
+
+
+% Scopes
+
+
+% Pgf scope environment. All changes of the graphic state are local to
+% the scope.
+%
+% Example:
+%
+% \begin{pgfscope}
+% \pgfsetlinewidth{3pt}
+% \pgfline{\pgfxy(0,0)}{\pgfxy(3,3)}
+% \end{pgfscope}
+
+\def\pgfscope{%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ \pgfsys@beginscope%
+ \pgf@resetpathsizes%
+ \edef\pgfscope@linewidth{\the\pgflinewidth}%
+ \let\pgfscope@stroke@color=\pgf@strokecolor@global%
+ \let\pgfscope@fill@color=\pgf@fillcolor@global%
+ \begingroup}
+\def\endpgfscope{%
+ \endgroup%
+ \global\pgflinewidth=\pgfscope@linewidth%
+ \global\let\pgf@strokecolor@global=\pgfscope@stroke@color%
+ \global\let\pgf@fillcolor@global=\pgfscope@fill@color%
+ \pgfsys@endscope}
+
+
+
+
+% Quickly insert a box can contain normal TeX text at the origin.
+%
+% #1 = box of width/height and depth 0pt
+%
+% Example:
+%
+% \pgfqbox{\mybox}
+
+\def\pgfqbox#1{%
+ \pgfsys@hbox#1%
+}
+
+
+% Insert a box that can contain normal TeX text at the origin, but
+% with the current coordinate transformation matrix synced with the
+% low-level transformation matrix.
+%
+% #1 = box of width/height and depth 0pt
+%
+% In essence, this command does the same as if you first said
+% \pgflowlevelsynccm and then \pgfqbox. However, pgf will use a
+% ``TeX-translation'' for the translation part of the transformation
+% cm. This will ensure that hyperlinks ``survive'' at least
+% translations.
+%
+% Example:
+%
+% \pgfqboxsynced{\mybox}
+
+\def\pgfqboxsynced#1{%
+ \pgfsys@hboxsynced#1%
+}
+
+
+% Puts some text in a box and inserts it with the current
+% transformations applied.
+%
+% #1 = List of optional positioning. Possible values are ``left'', ``right'',
+% ``top'', ``bottom'' and ``base''.
+% #2 = TeX text. May contain verbatims.
+%
+% Example:
+%
+% \pgftransformshift{\pgfpoint{1cm}{0cm}}
+% \pgftext{Hello World!}
+
+\def\pgftext{\pgfutil@ifnextchar[\pgf@text{\pgf@text[]}}%
+\def\pgf@text[#1]{%
+ \def\pgf@text@options{#1}%
+ \pgf@maketext\pgf@after@text}
+\def\pgf@after@text{%
+ {%
+ \def\pgf@text@hshift{center}%
+ \def\pgf@text@vshift{center}%
+ \expandafter\pgf@text@setkeys\expandafter{\pgf@text@options}%
+ \csname pgf@halign\pgf@text@hshift\endcsname%
+ \csname pgf@valign\pgf@text@vshift\endcsname%
+ %
+ \pgfapproximatenonlineartransformation%
+ % Protocol sizes:
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{0pt}{\dp\pgf@hbox}}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\wd\pgf@hbox}{\dp\pgf@hbox}}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{0pt}{\ht\pgf@hbox}}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\wd\pgf@hbox}{\ht\pgf@hbox}}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \pgfqboxsynced{\pgf@hbox}%
+ }%
+}
+\def\pgf@text@setkeys{\pgfqkeys{/pgf/text}}%
+
+\pgfkeys{/pgf/text/left/.code=\def\pgf@text@hshift{left}}
+\pgfkeys{/pgf/text/center/.code=}
+\pgfkeys{/pgf/text/right/.code=\def\pgf@text@hshift{right}}
+\pgfkeys{/pgf/text/top/.code=\def\pgf@text@vshift{top}}
+\pgfkeys{/pgf/text/bottom/.code=\def\pgf@text@vshift{bottom}}
+\pgfkeys{/pgf/text/base/.code=\def\pgf@text@vshift{base}}
+\pgfkeys{/pgf/text/at/.cd,.code=\pgftransformshift{#1},.value required}
+\pgfkeys{/pgf/text/x/.cd,.code=\pgftransformxshift{#1},.value required}
+\pgfkeys{/pgf/text/y/.cd,.code=\pgftransformyshift{#1},.value required}
+\pgfkeys{/pgf/text/rotate/.cd,.code=\pgftransformrotate{#1},.value required}
+
+\def\pgf@halignleft{}% do nothing
+\def\pgf@haligncenter{\pgftransformxshift{+-.5\wd\pgf@hbox}}
+\def\pgf@halignright{\pgftransformxshift{+-\wd\pgf@hbox}}%
+\def\pgf@valignbase{}% do nothing
+\def\pgf@valignbottom{\pgftransformyshift{+\dp\pgf@hbox}}%
+\def\pgf@valigncenter{\pgftransformyshift{+.5\dp\pgf@hbox}\pgftransformyshift{+-.5\ht\pgf@hbox}}%
+\def\pgf@valigntop{\pgftransformyshift{+-\ht\pgf@hbox}}%
+
+
+% Internal function for creating a hbox.
+\def\pgf@maketext#1{%
+ \def\pgf@@maketextafter{#1}%
+ \setbox\pgf@hbox=\hbox\bgroup%
+ \pgfinterruptpicture%
+ \bgroup%
+ \aftergroup\pgf@collectresetcolor%
+ \let\next=%
+}
+\def\pgf@collectresetcolor{%
+ \pgfutil@ifnextchar\reset@color%
+ {\reset@color\afterassignment\pgf@collectresetcolor\let\pgf@temp=}%
+ {\pgf@textdone}%
+}
+\def\pgf@textdone{%
+ \endpgfinterruptpicture%
+ \egroup%
+ \pgf@@maketextafter%
+}
+
+\long\def\pgf@makehbox#1{%
+ \setbox\pgf@hbox=\hbox{{%
+ \pgfinterruptpicture%
+ #1%
+ \endpgfinterruptpicture%
+ }}}
+
+
+
+% Picture environment
+%
+% Example:
+%
+% \begin{pgfpicture}
+% \pgfsetendarrow{\pgfarrowto}
+% \pgfpathmoveto{\pgfpointxy{-0.9}{0.2}}
+% \pgfpathlineto{\pgfpointxy{0.9}{0.4}}
+% \pgfusepath{stroke}
+% \end{pgfpicture}
+
+\def\pgfresetboundingbox{%
+ \global\pgf@picmaxx=-16000pt\relax%
+ \global\pgf@picminx=16000pt\relax%
+ \global\pgf@picmaxy=-16000pt\relax%
+ \global\pgf@picminy=16000pt\relax%
+}%
+
+\def\pgfpicture{%
+ \begingroup%
+ \pgfpicturetrue%
+ \global\advance\pgf@picture@serial@count by1\relax%
+ \edef\pgfpictureid{pgfid\the\pgf@picture@serial@count}%
+ \let\pgf@nodecallback=\pgfutil@gobble%
+ \pgf@picmaxx=-16000pt\relax%
+ \pgf@picminx=16000pt\relax%
+ \pgf@picmaxy=-16000pt\relax%
+ \pgf@picminy=16000pt\relax%
+ \pgf@relevantforpicturesizetrue%
+ \pgf@resetpathsizes%
+ \pgfutil@ifnextchar\bgroup\pgf@oldpicture\pgf@picture}
+\def\pgf@oldpicture#1#2#3#4{%
+ \pgfmathsetlength\pgf@picminx{#1}%
+ \pgfmathsetlength\pgf@picminy{#2}%
+ \pgfmathsetlength\pgf@picmaxx{#3}%
+ \pgfmathsetlength\pgf@picmaxy{#4}%
+ \pgf@relevantforpicturesizefalse%
+ \pgf@picture}
+
+\def\pgf@picture{%
+ \setbox\pgfpic\hbox to0pt\bgroup%
+ \begingroup%
+ \pgfsys@beginpicture%
+ \pgfsys@beginscope%
+ \begingroup%
+ \pgfsetcolor{.}%
+ \pgfsetlinewidth{0.4pt}%
+ \pgftransformreset%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ \begingroup%
+ \let\pgf@setlengthorig=\setlength%
+ \let\pgf@addtolengthorig=\addtolength%
+ \let\pgf@selectfontorig=\selectfont%
+ \let\setlength=\pgf@setlength%
+ \let\addtolength=\pgf@addtolength%
+ \let\selectfont=\pgf@selectfont%
+ \nullfont\spaceskip0pt\xspaceskip0pt%
+ \setbox\pgf@layerbox@main\hbox to0pt\bgroup%
+ \begingroup%
+ }
+\def\endpgfpicture{%
+ \ifpgfrememberpicturepositiononpage%
+ \hbox to0pt{\pgfsys@markposition{\pgfpictureid}}%
+ \fi%
+ % ok, now let's position the box
+ \ifdim\pgf@picmaxx=-16000pt\relax%
+ % empty picture. make size 0.
+ \global\pgf@picmaxx=0pt\relax%
+ \global\pgf@picminx=0pt\relax%
+ \global\pgf@picmaxy=0pt\relax%
+ \global\pgf@picminy=0pt\relax%
+ \fi%
+ % Shift baseline outside:
+ \pgf@relevantforpicturesizefalse%
+ \pgf@process{\pgf@baseline}%
+ \xdef\pgf@shift@baseline{\the\pgf@y}%
+ %
+ \pgf@process{\pgf@trimleft}%
+ \global\advance\pgf@x by-\pgf@picminx
+ % prepare \hskip\pgf@trimleft@final.
+ % note that \pgf@trimleft@final is also queried
+ % by the pgf image externalization.
+ \xdef\pgf@trimleft@final{-\the\pgf@x}%
+ %
+ \pgf@process{\pgf@trimright}%
+ \global\advance\pgf@x by-\pgf@picmaxx
+ % prepare \hskip\pgf@trimright@final.
+ % note that \pgf@trimright@final is also queried
+ % by the pgf image externalization.
+ \xdef\pgf@trimright@final{\the\pgf@x}%
+ %
+ \pgf@remember@layerlist@globally
+ \endgroup%
+ \hss%
+ \egroup%
+ \pgf@restore@layerlist@from@global
+ \pgf@insertlayers%
+ \endgroup%
+ \pgfsys@discardpath%
+ \endgroup%
+ \pgfsys@endscope%
+ \pgfsys@endpicture%
+ \endgroup%
+ \hss
+ \egroup%
+ \pgfsys@typesetpicturebox\pgfpic%
+ \endgroup%
+}
+
+\def\pgf@remember@layerlist@globally{%
+ \global\let\pgf@layerlist@=\pgf@layerlist
+}%
+\def\pgf@restore@layerlist@from@global{%
+ \let\pgf@layerlist=\pgf@layerlist@
+}%
+\def\pgf@insertlayers{%
+ \box\pgf@layerbox@main%
+}
+
+\def\pgf@selectfont{\pgf@selectfontorig\nullfont}
+
+\def\pgf@setlength#1#2{% these will be used only when \nullfont is active
+ \begingroup% keep font setting local
+ \pgfutil@selectfont% restore font
+ \pgf@setlengthorig#1{#2}% calculate dimension (possibly using calc)
+ \expandafter%
+ \endgroup%
+ \expandafter#1\expandafter=\the#1\relax}
+\def\pgf@addtolength#1#2{%
+ \begingroup% keep font setting local
+ \pgfutil@selectfont% restore font
+ \pgf@addtolengthorig#1{#2}% calculate dimension (possibly using calc)
+ \expandafter%
+ \endgroup%
+ \expandafter#1\expandafter=\the#1\relax}
+
+
+% Sets the baseline at the y-coordinate of a given point
+%
+% #1 = point
+%
+% Sets the baseline of the picture to the y-coordinate of a given
+% point. However, the point will be evaluated *at the end of the
+% picture*.
+%
+% Example:
+%
+% \pgfsetbaselinepointlater{\pgfpointanchor{mynode}{base}}
+
+\def\pgfsetbaselinepointlater#1{\def\pgf@baseline{#1}}
+
+
+% Sets the baseline at the y-coordinate of a given point, now
+%
+% #1 = point
+%
+% Sets the baseline of the picture to the y-coordinate of a given
+% point.
+%
+% Example:
+%
+% \pgfsetbaselinepointnow{\pgfpoint{1cm}{2pt}}
+
+\def\pgfsetbaselinepointnow#1{%
+ \pgf@process{#1}%
+ \edef\pgf@setter@baseline{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfsetbaselinepointlater{\pgf@setter@baseline}%
+}
+
+\def\pgf@default@text{default}%
+
+% Sets the baseline
+%
+% #1 = baseline
+%
+% Sets the baseline of the picture. Default is the lower border, which
+% is the same as \pgf@picminy
+%
+% Example:
+%
+% \pgfsetbaseline{1cm+2pt}
+% \pgfsetbaseline{default}% resets to default value
+
+\def\pgfsetbaseline#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@default@text
+ \pgfsetbaseline{\pgf@picminy}%
+ \else
+ \pgfsetbaselinepointlater{\pgfpoint{0pt}{#1}}%
+ \fi
+}
+\pgfsetbaseline{\pgf@picminy}
+
+% controls how the image externalization implements trim:
+\newif\ifpgf@trim@lowlevel
+\pgfkeys{
+ /pgf/trim lowlevel/.is if=pgf@trim@lowlevel,
+ /pgf/trim lowlevel/.default=true,
+}
+
+% Same as the y-baseline for horizontal alignment.
+% The effect is different, though: it is some kind of trimming which
+% leaves the bounding box intact.
+\def\pgfsettrimleftpointlater#1{\def\pgf@trimleft{#1}}
+\def\pgfsettrimleftpointnow#1{%
+ \pgf@process{#1}%
+ \edef\pgf@setter@baseline{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfsettrimleftpointlater{\pgf@setter@baseline}%
+}
+% \pgfsettrimleft{<x coord>}
+% or
+% \pgfsettrimleft{default}
+\def\pgfsettrimleft#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@default@text
+ \pgfsettrimleft{\pgf@picminx}
+ \else
+ \pgfsettrimleftpointlater{\pgfpoint{#1}{0pt}}%
+ \fi
+}
+\pgfsettrimleft{\pgf@picminx}
+
+\def\pgfsettrimrightpointlater#1{\def\pgf@trimright{#1}}
+\def\pgfsettrimrightpointnow#1{%
+ \pgf@process{#1}%
+ \edef\pgf@setter@baseline{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfsettrimrightpointlater{\pgf@setter@baseline}%
+}
+% \pgfsettrimright{<x coord>}
+% or
+% \pgfsettrimright{default}
+\def\pgfsettrimright#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@default@text
+ \pgfsettrimright{\pgf@picmaxx}%
+ \else
+ \pgfsettrimrightpointlater{\pgfpoint{#1}{0pt}}%
+ \fi
+}
+\pgfsettrimright{\pgf@picmaxx}
+
+
+% Interrupt path
+%
+% Description:
+%
+% The environment can be used to insert some drawing commands while
+% constructing a path. The drawing commands inside the environment
+% will not interfere with the path being constructed ``outside.''
+% However, you must ward against graphic state changes using a scope.
+%
+% Example: Draw two parallel lines
+%
+% \pgfmoveto{\pgfpoint{0cm}{0cm}}
+% \begin{pgfinterruptpath}
+% \pgfmoveto{\pgfpoint{1cm}{0cm}}
+% \pgfmoveto{\pgfpoint{1cm}{1cm}}
+% \pgfusepath{stroke}
+% \end{pgfinterruptpath}
+% \pgflineto{\pgfpoint{0cm}{1cm}}
+% \pgfusepath{stroke}
+
+\def\pgfinterruptpath
+{%
+ \begingroup%
+ % save all sorts of things...
+ \edef\pgf@interrupt@savex{\the\pgf@path@lastx}%
+ \edef\pgf@interrupt@savey{\the\pgf@path@lasty}%
+ \pgf@getpathsizes\pgf@interrupt@pathsizes%
+ \pgfsyssoftpath@getcurrentpath\pgf@interrupt@path%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ \edef\pgfscope@linewidth{\the\pgflinewidth}%
+ \let\pgf@interrupt@lastmoveto=\pgfsyssoftpath@lastmoveto%
+ \begingroup%
+}
+\def\endpgfinterruptpath
+{%
+ \endgroup%
+ \global\pgflinewidth=\pgfscope@linewidth%
+ \pgfsyssoftpath@setcurrentpath\pgf@interrupt@path%
+ \pgf@setpathsizes\pgf@interrupt@pathsizes%
+ \global\pgf@path@lastx\pgf@interrupt@savex%
+ \global\pgf@path@lasty\pgf@interrupt@savey%
+ \global\let\pgfsyssoftpath@lastmoveto\pgf@interrupt@lastmoveto%
+ \endgroup%
+}
+
+
+
+% Interrupt bounding box
+%
+% Description:
+%
+% The environment can be used to temporarily setup a new bounding box
+% computation. The bounding box will be made empty at the beginning of
+% the environment and will be reset to its old value after the
+% environment.
+%
+% Example:
+%
+% \begin{pgfinterruptboundinbox}
+% \pgfmoveto{\pgfpoint{1cm}{0cm}}
+% \pgfmoveto{\pgfpoint{1cm}{1cm}}
+% \pgfusepath{stroke}
+% \end{pgfinterruptboundinbox}
+
+\def\pgfinterruptboundingbox
+{%
+ \begingroup%
+ \edef\pgf@interrupt@savemaxx{\the\pgf@picmaxx}%
+ \edef\pgf@interrupt@saveminx{\the\pgf@picminx}%
+ \edef\pgf@interrupt@savemaxy{\the\pgf@picmaxy}%
+ \edef\pgf@interrupt@saveminy{\the\pgf@picminy}%
+ \pgf@picmaxx=-16000pt\relax%
+ \pgf@picminx=16000pt\relax%
+ \pgf@picmaxy=-16000pt\relax%
+ \pgf@picminy=16000pt\relax%
+ \pgf@size@hookedfalse%
+ \let\pgf@path@size@hook=\pgfutil@empty%
+}
+\def\endpgfinterruptboundingbox
+{%
+ \global\pgf@picmaxx=\pgf@interrupt@savemaxx%
+ \global\pgf@picmaxy=\pgf@interrupt@savemaxy%
+ \global\pgf@picminx=\pgf@interrupt@saveminx%
+ \global\pgf@picminy=\pgf@interrupt@saveminy%
+ \endgroup%
+}
+
+
+
+
+% Creates an id scope.
+%
+% Description:
+%
+% An id scope is not (conceptually) a graphic scope, but a scope that
+% has a unique name or "id". This id can be used as a reference point
+% for instance for a hyperlink or for an animation (currently, only
+% SVG supports ids, all other drivers ignore id scopes).
+%
+% Prior to using \pgfidscope, call \pgfuseid to install an
+% id (and possibly \pgfusetype). The scope will then get this id and,
+% likely, a graphic scope is installed. If \pgfuseid has not been
+% called or if you try to call \pgfidscope again for the same id,
+% nothing happens (except for a \TeX\ group being established).
+
+\def\pgfidscope{\pgfsys@begin@idscope}
+\def\endpgfidscope{\pgfsys@end@idscope}
+
+\let\startpgfidscope\pgfidscope
+\let\stoppgfidscope\pgfendidscope
+
+
+
+
+% Use an id on the next graphic object
+%
+% #1 = a name
+%
+% The next scope or path can be the target of an animation command or
+% a hyperlink.
+
+\def\pgfuseid#1{%
+ \edef\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgf@lookup@id{#1}%
+ \pgfsys@use@id{\pgf@next@id}%
+ \expandafter\xdef\csname pgf@id@names@#1\endcsname{{\pgf@next@id}{}}%
+ \fi%
+}
+
+\def\pgf@lookup@id#1{%
+ \expandafter\let\expandafter\pgf@id@name\csname pgf@id@names@#1\endcsname%
+ \ifx\pgf@id@name\relax%
+ \let\pgf@prev@id\pgfutil@empty%
+ \let\pgf@next@id\pgfutil@empty%
+ \else%
+ \expandafter\pgf@id@parse\pgf@id@name%
+ \fi%
+ \ifx\pgf@next@id\pgfutil@empty%
+ \pgfsys@new@id\pgf@next@id%
+ \expandafter\xdef\csname pgf@id@names@#1\endcsname{{\pgf@prev@id}{\pgf@next@id}}%
+ \fi%
+}
+\def\pgf@id@parse#1#2{%
+ \def\pgf@prev@id{#1}%
+ \def\pgf@next@id{#2}%
+}
+
+
+
+% Clear the current id
+%
+% Description:
+%
+% Sets the current id to be empty so that it cannot be referenced.
+
+\def\pgfclearid{%
+ \pgfsys@clear@id%
+}
+
+
+% Get the id that will be given to a name upon the next use
+%
+% #1 = a macro
+% #2 = a name
+%
+% Description:
+%
+% #1 will get the id that will be used by \pgfuseid next time for the
+% given name.
+
+\def\pgfidrefnextuse#1#2{%
+ \edef\pgf@temp{#2}\ifx\pgf@temp\pgfutil@empty\pgferror{Missing name reference for ``\string#1''}\fi%
+ \pgf@lookup@id{#2}%
+ \let#1\pgf@next@id%
+}
+
+
+% Get the id was last used
+%
+% #1 = a macro
+% #2 = a name
+%
+% Description:
+%
+% #1 will get the id that was last used by \pgfuseid for #2.
+
+\def\pgfidrefprevuse#1#2{%
+ \edef\pgf@temp{#2}\ifx\pgf@temp\pgfutil@empty\pgferror{Missing name reference for ``\string#1''}\fi%
+ \pgf@lookup@id{#2}%
+ \let#1\pgf@prev@id%
+}
+
+
+% Use a type
+%
+% #1 = an id type; when starting with a dot, it is added to the
+% current type.
+%
+% The next scope or path can be the target of an animation command or
+% a hyperlink.
+
+\def\pgfusetype#1{%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@ifnextchar\expandafter.\expandafter\pgf@id@use@type@add\expandafter\pgf@id@use@type@replace\pgf@temp\pgf@stop
+}
+\def\pgf@id@use@type@add.#1\pgf@stop{\pgfsys@append@type{#1}}
+\def\pgf@id@use@type@replace#1\pgf@stop{\pgfsys@use@type{#1}}
+
+% Push the current type on a global stack
+%
+% Description:
+%
+% The current type is pushed onto a global type stack. It can be
+% restored using \pgfpoptype.
+
+\def\pgfpushtype{\pgfsys@push@type}
+
+
+% Pop a type from the type stack
+%
+% Description:
+%
+% Restores the most current value from the type stack.
+
+\def\pgfpoptype{\pgfsys@pop@type}
+
+
+
+
+% Alias an id locally or globally
+%
+% #1 = the alias name
+% #2 = a existing id name
+%
+% Description:
+%
+% Creates an alias of a name
+
+\def\pgfaliasid#1#2{%
+ \expandafter\let\expandafter\pgf@temp\csname pgf@id@names@#2\endcsname%
+ \expandafter\let\csname pgf@id@names@#1\endcsname\pgf@temp%
+}
+\def\pgfgaliasid#1#2{%
+ \expandafter\let\expandafter\pgf@temp\csname pgf@id@names@#2\endcsname%
+ \expandafter\global\expandafter\let\csname pgf@id@names@#1\endcsname\pgf@temp%
+}
+
+
+% Check whether a name has been forward-referenced
+%
+% #1 = a name
+% #2 = what to do, when has been forward-referenced
+% #3 = what to do otherwise
+%
+% Description:
+%
+% Depending on whether #1 has been forward-referenced, #2 or #3 will be executed.
+
+\def\pgfifidreferenced#1#2#3{%
+ \expandafter\let\expandafter\pgf@id@name\csname pgf@id@names@#1\endcsname%
+ \ifx\pgf@id@name\relax%
+ #3%
+ \else
+ \expandafter\pgf@id@parse\pgf@id@name%
+ \ifx\pgf@next@id\pgfutil@empty%
+ #3%
+ \else%
+ #2%
+ \fi%
+ \fi%
+}
+
+
+% Interrupts a picture
+%
+% Description:
+%
+% This environment interrupts a picture and temporarily returns to
+% normal TeX mode. All sorts of things are saved and restored by this
+% environment.
+%
+% WARNING: Using this environment in conjunction with low level
+% transformations can *strongly* upset the typesetting. Typically, the
+% contents of this environment should have size/height/depth 0pt in
+% the end.
+%
+% WARNING: This environment should only be used inside typesetting a
+% box and this box must in turn be inserted using \pgfqbox.
+%
+% Example: Draw two parallel lines
+%
+% \pgfmoveto{\pgfpoint{0cm}{0cm}}
+% \setbox\mybox=\hbox{
+% \begin{pgfinterruptpicture}
+% This is normal text.
+% \begin{pgfpicture} % a subpicture
+% \pgfmoveto{\pgfpoint{1cm}{0cm}}
+% \pgfmoveto{\pgfpoint{1cm}{1cm}}
+% \pgfusepath{stroke}
+% \end{pgfpicture}
+% More text.
+% \end{pgfinterruptpicture}
+% }
+% \ht\mybox=0pt
+% \wd\mybox=0pt
+% \dp\mybox=0pt
+% \pgfqbox{\mybox}%
+% \pgfpathlineto{\pgfpoint{0cm}{1cm}}
+% \pgfusepath{stroke}
+
+\def\pgfinterruptpicture
+{%
+ \begingroup%
+ \csname tikz@inside@picturefalse\endcsname%
+ \pgfinterruptboundingbox%
+ \pgftransformreset%
+ \pgfinterruptpath%
+ \ifx\pgf@selectfontorig\@undefined%
+ \else%
+ \let\setlength\pgf@setlengthorig%
+ \let\addtolength\pgf@addtolengthorig%
+ \let\selectfont\pgf@selectfontorig%
+ \fi%
+ \pgfutil@selectfont%
+ \pgfpicturefalse%
+ \let\pgf@positionnodelater@macro\relax%
+ \pgf@savelayers%
+}
+\def\endpgfinterruptpicture
+{%
+ \pgf@restorelayers%
+ \endpgfinterruptpath%
+ \endpgfinterruptboundingbox%
+ \endgroup%
+}
+
+\let\pgf@savelayers=\relax
+\let\pgf@restorelayers=\relax
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcoreshade.code.tex b/graphics/pgf/base/tex/pgfcoreshade.code.tex
new file mode 100644
index 0000000000..67f11b2bc3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoreshade.code.tex
@@ -0,0 +1,974 @@
+% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoreshade.code.tex}
+
+%
+% Parsing functions
+%
+\newdimen\pgf@max
+\newcount\pgf@sys@shading@range@num
+\def\pgf@parsefunc#1{%
+ \edef\temp{{#1}}%
+ \expandafter\pgf@convertstring\temp%
+ \edef\temp{{\pgf@conv}}%
+ \expandafter\pgf@@parsefunc\temp}
+\def\pgf@@parsefunc#1{%
+ \let\pgf@bounds=\pgfutil@empty%
+ \let\pgf@funcs=\pgfutil@empty%
+ \let\pgf@psfuncs=\pgfutil@empty%
+ \let\pgf@encode=\pgfutil@empty%
+ \let\pgf@sys@shading@ranges=\pgfutil@empty%
+ \pgf@sys@shading@range@num=0\relax%
+ \csname pgf@parsefirst\pgf@shading@model\endcsname[#1; ]%
+ \csname pgf@parselastdom\pgf@shading@model\endcsname[#1; ]%
+ \csname pgf@parsemid\pgf@shading@model\endcsname[#1; ]%
+ \ifx\pgf@bounds\pgfutil@empty%
+ \edef\pgf@pdfparseddomain{0 1}%
+ \edef\pgf@pdfparsedfunction{\pgf@singlefunc\space}%
+ \else%
+ \edef\pgf@pdfparseddomain{\pgf@doma\space\pgf@domb}%
+ \edef\pgf@pdfparsedfunction{%
+ << /FunctionType 3 /Domain [\pgf@doma\space\pgf@domb] /Functions
+ [\pgf@funcs\space] /Bounds [\pgf@bounds] /Encode [0 1 \pgf@encode]
+ >> }% <<
+ \fi%
+ \xdef\pgf@psfuncs{\pgf@psfuncs}%
+ }
+\def\pgf@parsefirstrgb[rgb(#1)=(#2,#3,#4)#5]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getrgbtuplewithmixin{#2}{#3}{#4}%
+ \edef\pgf@sys@shading@start@rgb{\pgf@sys@rgb}%
+ \let\pgf@sys@prevcolor=\pgf@sys@shading@start@rgb%
+ \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
+ \edef\pgf@prevcolor{\pgf@rgb}%
+ \edef\pgf@firstcolor{\pgf@rgb}}
+\def\pgf@parselastdomrgb[rgb(#1)=(#2,#3,#4); {%
+ \pgfutil@ifnextchar]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
+ \pgf@max=\pgf@x\relax%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getrgbtuplewithmixin{#2}{#3}{#4}%
+ \edef\pgf@sys@shading@end@rgb{\pgf@sys@rgb}%
+ \pgfutil@gobble}{\pgf@parselastdomrgb[}}
+\def\pgf@parsemidrgb[rgb(#1)=(#2,#3,#4); {\pgf@parserestrgb[}
+\def\pgf@parserestrgb[rgb(#1)=(#2,#3,#4); {%
+ \advance\pgf@sys@shading@range@num by1\relax%
+ \pgfutil@ifnextchar]{%
+ \pgf@getrgbtuplewithmixin{#2}{#3}{#4}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@rgb] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@rgb] /N 1 >> }% <<
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@rgb\space \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{{\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@rgb}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@rgb%
+ \pgfutil@gobble}{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgf@getrgbtuplewithmixin{#2}{#3}{#4}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{{\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@rgb}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@rgb%
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@rgb\space \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@encode{\pgf@encode\space0 1}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@rgb] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@rgb] /N 1 >> }% <<
+ \edef\pgf@prevcolor{\pgf@rgb}%
+ \pgf@parserestrgb[}}
+
+\def\pgf@getrgbtuplewithmixin#1#2#3{%
+ \pgfutil@definecolor{pgfshadetemp}{rgb}{#1,#2,#3}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
+ \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}%
+ \expandafter\pgf@getrgb@@\pgf@rgbcolor!}
+\def\pgf@getrgb@@#1,#2,#3!{%
+ \def\pgf@rgb{#1 #2 #3}%
+ \def\pgf@sys@rgb{{#1}{#2}{#3}}%
+}
+
+\def\pgf@parsefirstcmyk[cmyk(#1)=(#2,#3,#4,#5)#6]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@sys@shading@start@cmyk{\pgf@sys@cmyk}%
+ \let\pgf@sys@prevcolor=\pgf@sys@shading@start@cmyk%
+ \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
+ \edef\pgf@prevcolor{\pgf@cmyk}%
+ \edef\pgf@firstcolor{\pgf@cmyk}}
+\def\pgf@parselastdomcmyk[cmyk(#1)=(#2,#3,#4,#5); {%
+ \pgfutil@ifnextchar]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
+ \pgf@max=\pgf@x\relax%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@sys@shading@end@cmyk{\pgf@sys@cmyk}%
+ \pgfutil@gobble}{\pgf@parselastdomcmyk[}}
+\def\pgf@parsemidcmyk[cmyk(#1)=(#2,#3,#4,#5); {\pgf@parserestcmyk[}
+\def\pgf@parserestcmyk[cmyk(#1)=(#2,#3,#4,#5); {%
+ \advance\pgf@sys@shading@range@num by1\relax%
+ \pgfutil@ifnextchar]{%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@psfuncs{\pgf@prevx\space
+ \pgf@cmyk\space \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@cmyk}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@cmyk%
+ \pgfutil@gobble}{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@cmyk}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@cmyk%
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@cmyk\space
+ \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@encode{\pgf@encode\space0 1}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
+ \edef\pgf@prevcolor{\pgf@cmyk}%
+ \pgf@parserestcmyk[}}
+
+\def\pgf@getcmyktuplewithmixin#1#2#3#4{%
+ \pgfutil@definecolor{pgfshadetemp}{cmyk}{#1,#2,#3,#4}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
+ \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
+ \expandafter\pgf@getcmyk@@\pgf@cmykcolor!}
+\def\pgf@getcmyk@@#1,#2,#3,#4!{%
+ \def\pgf@cmyk{#1 #2 #3 #4}%
+ \def\pgf@sys@cmyk{{#1}{#2}{#3}{#4}}%
+}
+
+\def\pgf@parsefirstgray[gray(#1)=(#2)#3]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@sys@shading@start@gray{\pgf@sys@gray}%
+ \let\pgf@sys@prevcolor=\pgf@sys@shading@start@gray%
+ \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
+ \edef\pgf@prevcolor{\pgf@gray}%
+ \edef\pgf@firstcolor{\pgf@gray}}
+\def\pgf@parselastdomgray[gray(#1)=(#2); {%
+ \pgfutil@ifnextchar]{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
+ \pgf@max=\pgf@x\relax%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@sys@shading@end@gray{\pgf@sys@gray}%
+ \pgfutil@gobble}{\pgf@parselastdomgray[}}
+\def\pgf@parsemidgray[gray(#1)=(#2); {\pgf@parserestgray[}
+\def\pgf@parserestgray[gray(#1)=(#2); {%
+ \advance\pgf@sys@shading@range@num by1\relax%
+ \pgfutil@ifnextchar]{%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@gray\space
+ \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgfmathsetlength\pgf@x{#1}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@gray}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@gray%
+ \pgfutil@gobble}{%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgf@getgraytuplewithmixin{#2}%
+ \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
+ {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@gray}}}%
+ \edef\pgf@sys@prevpos{\the\pgf@x}%
+ \let\pgf@sys@prevcolor=\pgf@sys@gray%
+ \edef\pgf@psfuncs{\pgf@prevx\space \pgf@gray\space
+ \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
+ \pgf@sys@bp@correct\pgf@x%
+ \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
+ \edef\pgf@encode{\pgf@encode\space0 1}%
+ \edef\pgf@singlefunc{\space%
+ << /FunctionType 2 /Domain [0 1] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@funcs{\pgf@funcs\space%
+ << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
+ [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
+ \edef\pgf@prevcolor{\pgf@gray}%
+ \pgf@parserestgray[}}
+
+\def\pgf@getgraytuplewithmixin#1{%
+ \pgfutil@definecolor{pgfshadetemp}{gray}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
+ \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{gray}{\pgf@graycolor}%
+ \expandafter\pgf@getgray@@\pgf@graycolor!}
+\def\pgf@getgray@@#1!{%
+ \def\pgf@gray{#1}%
+ \def\pgf@sys@gray{{#1}}%
+}
+
+% Normalized a <color specification> argument for shadings into a
+% series of color specifications in the current xcolor color model and write
+% the result into \pgf@conv.
+%
+% Example:
+% \pgf@convertstring{rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); cmyk(4cm)=(1,0,0,0); gray(1cm)=(3); color(2cm)=(green); }
+% ->
+% \pgf@conv = macro:->'rgb(0cm)=(1,0,0); rgb(2cm)=(0,1,0); rgb(4cm)=(0,1,1); rgb(1cm)=(3,3,3); rgb(2cm)=(0,1,0); '
+\def\pgf@convertstring#1{%
+ \def\pgf@conv{}%
+ \pgf@convert#1]%
+ }
+\def\pgf@convert{%
+ \pgfutil@ifnextchar]{\pgfutil@gobble}%done!
+ {%
+ \pgfutil@ifnextchar;{\pgf@grabsemicolor}%
+ {%
+ \pgfutil@ifnextchar c{\pgf@gobblec}%
+ {%
+ \pgfutil@ifnextchar g{\pgf@grabgray}%
+ {%
+ \pgfutil@ifnextchar o{\pgf@grabcolor}%
+ {%
+ \pgfutil@ifnextchar m{\pgf@grabcmyk}%
+ {%
+ \pgfutil@ifnextchar r{\pgf@grabrgb}%
+ {\pgferror{Illformed shading
+ specification}\pgf@convert}%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}
+\def\pgf@savecolor#1{%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor
+ {\pgf@shading@model}{\pgf@color}%
+ \expandafter\pgf@convget@\expandafter{\pgf@color}{#1}%
+}
+\def\pgf@grabsemicolor;{%
+ \edef\pgf@conv{\pgf@conv; }\pgf@convert}
+\def\pgf@gobblec c{\pgf@convert}
+\def\pgf@grabrgb rgb(#1)=(#2,#3,#4){%
+ \pgfutil@definecolor{pgf@tempcol}{rgb}{#2,#3,#4}%
+ \pgf@savecolor{#1}%
+}
+\def\pgf@grabcmyk myk(#1)=(#2,#3,#4,#5){%
+ \pgfutil@definecolor{pgf@tempcol}{cmyk}{#2,#3,#4,#5}%
+ \pgf@savecolor{#1}%
+}
+\def\pgf@grabgray gray(#1)=(#2){%
+ \pgfutil@definecolor{pgf@tempcol}{gray}{#2}%
+ \pgf@savecolor{#1}%
+}
+\def\pgf@grabcolor olor(#1)=(#2){%
+ \pgfutil@colorlet{pgf@tempcol}{#2}%
+ \pgf@savecolor{#1}%
+}
+\def\pgf@convget@#1#2{%
+ \edef\pgf@conv{\pgf@conv \pgf@shading@model(#2)=(#1)}\pgf@convert}
+
+
+\newcount\pgf@shadingcount
+\pgf@shadingcount=0
+{
+ \catcode`\/=0
+ \catcode`\\=12
+ /gdef/pgf@shadingnum{\/the/pgf@shadingcount\}
+}
+
+% Set up shading properties based on the current xcolor color model. This is
+% called when shadings are declared and used. \ifpgfshadingmodelrgb,
+% \ifpgfshadingmodelcmyk, and \ifpgfshadingmodelgray are set so that the type
+% 4 function in functional shadings can be converted to the current color
+% model. See \pgffuncshading*to* macros.
+
+\newif\ifpgfshadingmodelrgb
+\newif\ifpgfshadingmodelcmyk
+\newif\ifpgfshadingmodelgray
+\def\pgf@setup@shading@model{%
+ \pgfshadingmodelrgbtrue
+ \pgfshadingmodelcmykfalse
+ \pgfshadingmodelgrayfalse
+ \XC@sdef\pgf@mod@test{\XC@tgt@mod{natural}}%
+ \def\pgf@shading@device{/DeviceRGB}%
+ \def\pgf@shading@ps@device{setrgbcolor}%
+ \def\pgf@shading@functional@range{0 1 0 1 0 1}%
+ \def\pgf@shading@model{rgb}%
+ \ifx\pgf@mod@test\XC@mod@cmyk
+ \def\pgf@shading@device{/DeviceCMYK}%
+ \def\pgf@shading@ps@device{setcmykcolor}%
+ \def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
+ \def\pgf@shading@model{cmyk}%
+ \pgfshadingmodelrgbfalse
+ \pgfshadingmodelcmyktrue
+ \fi
+ \ifx\pgf@mod@test\XC@mod@gray
+ \def\pgf@shading@device{/DeviceGray}%
+ \def\pgf@shading@ps@device{setgray}%
+ \def\pgf@shading@functional@range{0 1}%
+ \def\pgf@shading@model{gray}%
+ \pgfshadingmodelrgbfalse
+ \pgfshadingmodelgraytrue
+ \fi
+ \edef\pgf@sys@driver@dvisvgm{pgfsys-dvisvgm.def}%
+ \ifx\pgfsysdriver\pgf@sys@driver@dvisvgm
+ \def\pgf@shading@model{rgb}%
+ \fi
+ \edef\pgf@sys@driver@texforht{pgfsys-tex4ht.def}%
+ \ifx\pgfsysdriver\pgf@sys@driver@texforht
+ \def\pgf@shading@model{rgb}%
+ \fi
+}
+
+
+% Declares a horizontal shading for later use. The shading is a
+% horizontal bar that changes its color.
+%
+% #1 = optional dependencies
+% #2 = name of the shading for later use
+% #3 = height of the shading
+% #4 = color specification in the following format: A list of colors
+% that the bar should have at certain points. If the bar should
+% be red at 1cm, this is specified as
+% "rgb(1cm)=(1,0,0)". Multiple specifications are separated by a
+% semicolon and a space. At least two specifications must be
+% given. The specified positions must be given in increasing
+% order.
+%
+% Description:
+%
+% The optional dependencies have the following effect: If present, it
+% should consist of a list of colors, separated by commas. Each time
+% the shading is used, these colors will be reevaluated. It will be
+% checked whether the colors still have their "original meaning". If
+% the colors have changed, a new shading will be created internally to
+% reflect the changed color's values.
+%
+% Example:
+%
+% \pgfdeclarehorizontalshading{redtogreentoblue}{1cm}{%
+% rgb(0cm)=(1,0,0); % red
+% rgb(1cm)=(0,1,0); % green
+% rgb(2cm)=(0,0,1)}
+%
+% \begin{document}
+% The following bar is 2cm long: \pgfuseshading{redtogreentoblue}.
+% \end{document}
+
+\def\pgfdeclarehorizontalshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declarehorizontalshading{\pgf@declarehorizontalshading[]}}
+\def\pgf@declarehorizontalshading[#1]#2#3#4{%
+ \expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
+ \expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname\pgfutil@empty
+ \pgfsys@horishading{#2}{#3}{#4}%
+ \else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
+ \expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfsys@horishading}%
+ \expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}}%
+ \expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
+ \fi}
+
+
+% Declares a vertical shading for later use.
+%
+% #1 = optional dependencies
+% #2 = name of the shading for later use
+% #3 = height of the shading
+% #4 = color specification
+%
+% Example:
+%
+% \pgfdeclareverticalshading{redtogreentoblue}{1cm}{%
+% rgb(0cm)=(1,0,0); % red
+% rgb(1cm)=(0,1,0); % green
+% rgb(2cm)=(0,0,1)}
+%
+% \begin{document}
+% The following bar is 2cm high: \pgfuseshading{redtogreentoblue}.
+% \end{document}
+
+\def\pgfdeclareverticalshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declareverticalshading{\pgf@declareverticalshading[]}}
+\def\pgf@declareverticalshading[#1]#2#3#4{%
+ \expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
+ \expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty
+ \pgfsys@vertshading{#2}{#3}{#4}%
+ \else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
+ \expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfsys@vertshading}%
+ \expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}}%
+ \expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
+ \fi}
+
+
+% Declares a radial shading for later use.
+%
+% #1 = optional dependencies
+% #2 = name of the shading for later use
+% #3 = center of inner circle
+% #4 = color specification
+%
+% Description:
+%
+% A radial shading creates a smooth color transition between two
+% circles. The center of the inner circle is at the give position. Its
+% radius is the start of the color specification. The
+% center of the outer circle is at the center of the whole shading,
+% whose radius is the end of the color specification. For example,
+% suppose the color specification is "rgb(1cm)=(1,1,1); rgb(2cm)=(0,0,0)".
+% Then the shading would be 4cm times 4cm large. The inner circle would
+% have diameter 1cm and the outer circle would have diameter 2cm. The
+% outer circle would be centered in the middle of the shading, whereas
+% the outer circle would be centered at the given position.
+%
+% Example:
+%
+% \pgfdeclareradialshading{redtogreentoblue}{\pgfpoint{2cm}{2cm}}{%
+% rgb(10pt)=(1,0,0); % red
+% rgb(2cm)=(0,1,0); % green
+% rgb(3cm)=(0,0,1)}
+%
+% \begin{document}
+% The following ball has diameter 3cm: \pgfuseshading{redtogreentoblue}.
+% \end{document}
+
+\def\pgfdeclareradialshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declareradialshading{\pgf@declareradialshading[]}}
+\def\pgf@declareradialshading[#1]#2#3#4{%
+ \expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
+ \expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty
+ \pgfsys@radialshading{#2}{#3}{#4}%
+ \else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
+ \expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfsys@radialshading}%
+ \expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}}%
+ \expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
+ \fi}
+
+
+
+
+% Declares a functional shading for later use.
+%
+% #1 = optional dependencies
+% #2 = name of the shading for later use
+% #3 = lower left corner of the shading as a pgfpoint.
+% #4 = upper right corner of the shading as a pgfpoint.
+% #5 = Preparation code
+% #6 = a PDF type 4 function (restricted Postscript function), see the
+% PDF-specification 1.7, section 3.9.4
+%
+% Description:
+%
+% This command creates a so-called functional shading. For such a
+% shading the color of each point is calculated by calling a function
+% for each point that gets the coordinates as input and yields the
+% color as an output. Note that the function is evaluated by the
+% *renderer*, not by PGF or TeX or someone else at compile-time. This
+% means that the evaluation of this function has to be done *extremely
+% quickly* and the function should be *very simple*. For this reason,
+% only a very restricted set of operations are possible in the
+% function (see 3.9.4 of the PDF-spec 1.7). Also functions should be
+% kept small. Any errors in the function will only be noticed by the
+% renderer.
+%
+% The function gets the coordinates of a point as input (as bp). This
+% input consists of the top two elements of an otherwise empty
+% (virtual, PostScript) stack. The function should then replace these
+% two values by one value representing the gray color of the point for a
+% grayscale shading, three values, representing the red, green, and blue color
+% of the point for an RGB shading, or four values, representing the cyan,
+% magenta, yellow, and black color of the point for a CMYK shading. The
+% numbers should be real values, not integers since Apple's PDF renderer is
+% broken in this regard (use cvr at the end if necessary).
+%
+% Conceptually, the function will be evaluated once for each point of
+% the rectangle (#3) to (#4). A renderer may choose to evaluate the
+% function at less points, but, in principle, the function will be
+% evaluated for each pixel independently.
+%
+% Because of the rather difficult PostScript syntax, use this macro
+% only *if you know what you are doing* (or if you are adventurous, of
+% course).
+%
+% As for other shadings, the optional dependencies argument is used to
+% determine whether a shading needs to be recalculated when a color
+% has changed.
+%
+% The code #5 is executed each time a shading is
+% (re)calculated. Typically, it will contain code to extract
+% coordinates from colors (see below).
+%
+% Inside the PostScript function #6 you cannot use colors
+% directly. Rather, you must push the color components on the
+% stack. For this, it is useful to call \pgfshadecolortorgb,
+% \pgfshadecolortocmyk, or \pgfshadecolortogray in the startup
+% code #4. The macro takes a color name as input and stores the color's
+% component real numbers between 0.0 and 1.0 separated
+% by spaces (which is exactly what you need if you want to push it on
+% a stack) in a macro.
+%
+% Example:
+%
+%\pgfdeclarefunctionalshading{twospots}{\pgfpointorigin}{\pgfpoint{200bp}{200bp}}{}{
+% 2 copy
+% 90 sub dup mul exch
+% 80 sub dup mul add sqrt
+% dup mul neg 1.0005 exch exp 1.0 exch sub
+% 3 1 roll
+% 120 sub dup mul exch
+% 100 sub dup mul add sqrt
+% dup mul neg 1.002 exch exp 1.0 exch sub
+% 1.0
+%}
+%
+% \pgfdeclarefunctionalshading[mycol]{sweep}{\pgfpointorigin}{\pgfpoint{100bp}{100bp}}
+% {\pgfshadecolortorgb{mycol}{\myrgb}}{
+% add 150 div % not very useful...
+% dup
+% \myrgb % push mycol
+% 5 4 roll % multiply all components by calculated value
+% mul
+% 3 1 roll
+% 3 index
+% mul
+% 3 1 roll
+% 4 3 roll
+% mul
+% 3 1 roll
+% }
+%
+% \begin{document}
+% Have a look at this: \pgfuseshading{twospots}.
+% Here is \colorlet{mycol}{green!50}\pgfuseshading{sweep} in green
+% and in \colorlet{mycol}{red!50!blue}\pgfuseshading{sweep} in red/blue.
+% \end{document}
+
+\def\pgfdeclarefunctionalshading{%
+ \pgf@setup@shading@model
+ \pgfutil@ifnextchar[%
+ \pgf@declarefunctionalshading{\pgf@declarefunctionalshading[]}}
+\def\pgf@declarefunctionalshading[#1]#2#3#4#5#6{%
+ \expandafter\def\csname pgf@deps@pgfshading#2!\endcsname{#1}%
+ \expandafter\ifx\csname pgf@deps@pgfshading#2!\endcsname\pgfutil@empty%
+ \global\expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty
+ \pgfshade@functionaldo{#2}{#3}{#4}{#5}{#6}%
+ \else%
+ \global\advance\pgf@shadingcount 1\relax
+ \global\expandafter\edef\csname pgf@num@pgfshading#2!\endcsname{\pgf@shadingnum}%
+ \expandafter\def\csname pgf@func@pgfshading#2!\endcsname{\pgfshade@functionaldo}%
+ \expandafter\def\csname pgf@args@pgfshading#2!\endcsname{{#3}{#4}{#5}{#6}}%
+ \expandafter\let\csname @pgfshading#2!\endcsname=\pgfutil@empty%
+ \fi}
+\def\pgfshade@functionaldo#1#2#3#4#5{%
+ \begingroup
+ #4%
+ \pgfsys@functionalshading{#1}{#2}{#3}{#5}%
+ \expandafter\pgfmath@smuggleone\csname @pgfshading#1!\endcsname
+ \endgroup
+}
+
+\def\pgfshadecolortorgb#1#2{%
+ \pgfutil@colorlet{pgf@tempcol}{#1}%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}%
+ \expandafter\pgfshading@rgb\pgf@rgbcolor\relax%
+ \edef#2{\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space\pgf@sys@tonumber{\pgf@xc}\space}%
+ \c@pgf@counta\escapechar%
+ \escapechar-1\relax%
+ \expandafter\edef\csname\string#2red\endcsname{\pgf@sys@tonumber{\pgf@xa}\space}%
+ \expandafter\edef\csname\string#2green\endcsname{\pgf@sys@tonumber{\pgf@xb}\space}%
+ \expandafter\edef\csname\string#2blue\endcsname{\pgf@sys@tonumber{\pgf@xc}\space}%
+ \escapechar\c@pgf@counta%
+}
+\def\pgfshading@rgb#1,#2,#3\relax{%
+ \pgf@xa=#1pt%
+ \pgf@xb=#2pt%
+ \pgf@xc=#3pt%
+}
+
+\def\pgfshadecolortocmyk#1#2{%
+ \pgfutil@colorlet{pgf@tempcol}{#1}%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
+ \expandafter\pgfshading@cmyk\pgf@cmykcolor\relax%
+ \edef#2{\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space
+ \pgf@sys@tonumber{\pgf@xc}\space\pgf@sys@tonumber{\pgf@xd}\space}%
+ \c@pgf@counta\escapechar%
+ \escapechar-1\relax%
+ \expandafter\edef\csname\string#2cyan\endcsname{%
+ \pgf@sys@tonumber{\pgf@xa}\space}%
+ \expandafter\edef\csname\string#2magenta\endcsname{%
+ \pgf@sys@tonumber{\pgf@xb}\space}%
+ \expandafter\edef\csname\string#2yellow\endcsname{%
+ \pgf@sys@tonumber{\pgf@xc}\space}%
+ \expandafter\edef\csname\string#2black\endcsname{%
+ \pgf@sys@tonumber{\pgf@xd}\space}%
+ \escapechar\c@pgf@counta
+}
+\def\pgfshading@cmyk#1,#2,#3,#4\relax{%
+ \pgf@xa=#1pt%
+ \pgf@xb=#2pt%
+ \pgf@xc=#3pt%
+ \pgf@xd=#4pt%
+}
+
+\def\pgfshadecolortogray#1#2{%
+ \pgfutil@colorlet{pgf@tempcol}{#1}%
+ \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{gray}{\pgf@graycolor}%
+ \expandafter\pgfshading@gray\pgf@graycolor\relax
+ \edef#2{\pgf@sys@tonumber{\pgf@xa}\space}%
+ \c@pgf@counta\escapechar
+ \escapechar-1\relax
+ \expandafter\edef\csname\string#2gray\endcsname{%
+ \pgf@sys@tonumber{\pgf@xa}\space}%
+ \escapechar\c@pgf@counta
+}
+\def\pgfshading@gray#1\relax{%
+ \pgf@xa=#1pt%
+}
+
+% Functions to convert between color models in the type 4 PostScript data of
+% functional shadings.
+
+\def\pgffuncshadingrgbtocmyk{%
+ 1.0 exch sub 3 1 roll
+ 1.0 exch sub 3 1 roll
+ 1.0 exch sub 3 1 roll
+ 3 copy
+ 2 copy gt { exch } if pop
+ 2 copy gt { exch } if pop
+ dup 3 1 roll sub
+ 0.0 2 copy lt { exch } if pop
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ dup 3 1 roll sub
+ 0.0 2 copy lt { exch } if pop
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ dup 3 1 roll sub
+ 0.0 2 copy lt { exch } if pop
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+}
+
+\def\pgffuncshadingrgbtogray{%
+ 0.11 mul exch 0.59 mul add exch 0.3 mul add
+}
+
+\def\pgffuncshadingcmyktorgb{%
+ % covert to CMY
+ dup 3 1 roll add
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ dup 3 1 roll add
+ 1.0 2 copy gt { exch } if pop
+ 4 1 roll
+ add
+ 1.0 2 copy gt { exch } if pop
+ 3 1 roll
+ % covert to RGB
+ 1.0 exch sub
+ 3 1 roll
+ 1.0 exch sub
+ 3 1 roll
+ 1.0 exch sub
+ 3 1 roll
+}
+
+\def\pgffuncshadingcmyktogray{%
+ exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add
+ 1.0 2 copy gt { exch } if pop
+ 1.0 exch sub
+}
+
+\def\pgffuncshadinggraytorgb{%
+ dup dup
+}
+
+\def\pgffuncshadinggraytocmyk{%
+ 0.0 0.0 0.0
+ 4 3 roll
+}
+
+% Inserts a box into the text that contains a previously defined
+% shading.
+%
+% #1 = Name of a shading
+%
+% Example:
+%
+% \pgfuseshading{redtogreentoblue}
+
+\def\pgfuseshading#1{%
+ \edef\pgf@shadingname{@pgfshading#1}%
+ \pgf@tryextensions{\pgf@shadingname}{\pgfalternateextension}%
+ \expandafter\pgfutil@ifundefined\expandafter{\pgf@shadingname}%
+ {\pgferror{Undefined shading "#1"}}%
+ {%
+ \edef\pgf@shade@adds{\csname pgf@num\pgf@shadingname\endcsname}%
+ \pgfutil@ifundefined{pgf@deps\pgf@shadingname}%
+ {}%
+ {%
+ \pgf@setup@shading@model
+ \begingroup
+ \pgfutil@globalcolorsfalse
+ \edef\@list{\csname pgf@deps\pgf@shadingname\endcsname}%
+ \pgfutil@for\@temp:=\@list\do{%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{\@temp}}%
+ \pgfutil@extractcolorspec{\@temp}{\pgf@tempcolor}%
+ \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{\pgf@shading@model}{\pgf@color}%
+ \edef\pgf@shade@adds{\pgf@shade@adds,\pgf@color}%
+ }%
+ \pgfmath@smuggleone\pgf@shade@adds
+ \endgroup
+ }%
+ \expandafter\pgf@strip@shadename\pgf@shadingname!!%
+ \edef\pgf@shadingxname{@pgfshading\pgf@basename\pgf@shade@adds!}%
+ \pgfutil@ifundefined{\pgf@shadingxname}%
+ {%
+ \begingroup
+ \edef\@temp{\expandafter\noexpand\csname pgf@func\pgf@shadingname\endcsname}%
+ \edef\@args{{\pgf@basename\pgf@shade@adds}}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\@@args
+ \expandafter\expandafter\expandafter{\csname pgf@args\pgf@shadingname\endcsname}%
+ \expandafter\expandafter\expandafter\@temp\expandafter\@args\@@args
+ \expandafter\pgfmath@smuggleone\csname\pgf@shadingxname\endcsname
+ \endgroup
+ }%
+ {}%
+ \pgf@invokeshading{\csname\pgf@shadingxname\endcsname}%
+ }%
+}
+
+\def\pgf@strip@shadename @pgfshading#1!!!{\def\pgf@basename{#1}}
+
+\def\pgf@invokeshading#1{%
+ \ifpgfpicture%
+ \pgfsys@shadinginsidepgfpicture{#1}%
+ \else%
+ \pgfsys@shadingoutsidepgfpicture{#1}%
+ \fi%
+}
+
+
+% Create an alias name for a shading
+%
+% #1 = name of the alias
+% #2 = name of the original
+%
+% Example:
+%
+% \pgfaliasshading{shading!25}{shadingshaded}
+
+\def\pgfaliasshading#1#2{%
+ \expandafter\let\expandafter\pgf@temp\expandafter=\csname @pgfshading#2!\endcsname%
+ \expandafter\let\csname @pgfshading#1!\endcsname=\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@num@pgfshading#2!\endcsname%
+ \expandafter\let\csname pgf@num@pgfshading#1!\endcsname=\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@deps@pgfshading#2!\endcsname%
+ \expandafter\let\csname pgf@deps@pgfshading#1!\endcsname=\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@func@pgfshading#2!\endcsname%
+ \expandafter\let\csname pgf@func@pgfshading#1!\endcsname=\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\expandafter=\csname pgf@args@pgfshading#2!\endcsname%
+ \expandafter\let\csname pgf@args@pgfshading#1!\endcsname=\pgf@temp%
+}
+
+
+
+
+% Shades the current path, but does not discard it.
+%
+% #1 - a shading (see below)
+% #2 - an angle
+%
+% Description:
+%
+% \pgfshadepath ``tries'' to fill the
+% current path with a shading. The shading's original size should
+% completely cover the area between (0,0) and (100bp,100bp). The
+% shading will be rotated by #2 and then rescaled so that it
+% completely covers the path. Then the path will be used (locally) for
+% clipping and the shading is drawn.
+%
+% In addition to the rotation, any transformation set by the
+%\pgfsetadditionalshadetransform will also be applied.
+%
+% After all this, the path can still be used for the normal
+% stroking/clipping operations.
+%
+% The shading is rotated around its middle. If no rotation occurs, the
+% lower left corner of the path will lie on (25bp, 25bp), the upper
+% right corner on (75bp, 75bp).
+%
+% Example:
+%
+% \pgfdeclareverticalshading{myshading}{100bp}{color(0pt)=(red); color(100bp)=(green)}
+%
+% \pgfpathmoveto{\pgforigin}
+% \pgfpathlineto{\pgfxy(1,0)}
+% \pgfpathlineto{\pgfxy(1,1)}
+% \pgfshadepath{myshading}{0}
+% \pgfusepath{stroke}
+
+\def\pgfshadepath#1#2{%
+ \ifdim\pgf@pathminx=16000pt%
+ \pgfwarning{No path specified that can be filled}%
+ \else%
+ \begingroup%
+ % Calculate center:
+ \pgf@xb=.5\pgf@pathmaxx%
+ \advance\pgf@xb by.5\pgf@pathminx%
+ \pgf@yb=.5\pgf@pathmaxy%
+ \advance\pgf@yb by.5\pgf@pathminy%
+ % Calculate rotation:
+ \pgfmathparse{#2}%
+ \let\pgfshade@angle=\pgfmathresult
+ \pgfmathsin@\pgfshade@angle
+ \let\pgfshade@sin=\pgfmathresult
+ \pgfmathcos@\pgfshade@angle
+ \let\pgfshade@cos=\pgfmathresult
+ % width and height of the bounding box
+ \pgf@xa=\pgf@pathmaxx
+ \advance\pgf@xa by-\pgf@pathminx
+ \pgf@ya=\pgf@pathmaxy
+ \advance\pgf@ya by-\pgf@pathminy
+ % Calculate scaling:
+ % xscale = 1pt/50bp * (w*|cos(a)|+h*|sin(a)|)/(|cos(a)|+|sin(a)|)
+ % yscale = 1pt/50bp * (w*|sin(a)|+h*|cos(a)|)/(|cos(a)|+|sin(a)|)
+ % 1pt/50bp = .01992528
+ \pgfmathabs@\pgfshade@sin
+ \let\pgfshade@abssin=\pgfmathresult
+ \pgfmathabs@\pgfshade@cos
+ \let\pgfshade@abscos=\pgfmathresult
+ \pgf@xc=\pgfshade@abscos\pgf@xa
+ \advance\pgf@xc by\pgfshade@abssin\pgf@ya
+ \pgf@yc=\pgfshade@abssin\pgf@xa
+ \advance\pgf@yc by\pgfshade@abscos\pgf@ya
+ \pgfmathadd@\pgfshade@abscos\pgfshade@abssin
+ \pgfmathdivide@{.01992528}{\pgfmathresult}%
+ \pgf@xc=\pgfmathresult\pgf@xc
+ \pgf@yc=\pgfmathresult\pgf@yc
+ \ifdim\pgf@xc<0.0001pt
+ \ifdim\pgf@xc>-0.0001pt
+ \pgf@no@shadetrue
+ \fi
+ \fi
+ \ifdim\pgf@yc<0.0001pt
+ \ifdim\pgf@yc>-0.0001pt
+ \pgf@no@shadetrue
+ \fi
+ \fi
+ \ifpgf@no@shade\else
+ \pgfsys@beginscope
+ \pgfsyssoftpath@invokecurrentpath
+ \pgfsys@clipnext
+ \pgfsys@discardpath
+ % Compute new transformation matrix:
+ % shift
+ \pgfsys@transformcm{1}{0}{0}{1}{\the\pgf@xb}{\the\pgf@yb}%
+ % rotation
+ \pgf@x=\pgfshade@sin pt%
+ \pgf@xa=-\pgf@x%
+ \pgfsys@transformcm{\pgfshade@cos}{\pgfshade@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgfshade@cos}{0pt}{0pt}%
+ % scaling
+ \pgfsys@transformcm{\pgf@sys@tonumber{\pgf@xc}}{0}{0}{\pgf@sys@tonumber{\pgf@yc}}{0pt}{0pt}%
+ % This will actually be the first transformation of the shading.
+ % Should it be applied first so that it becomes the last one?
+ \ifx\pgf@shade@extra@transform\pgfutil@empty%
+ \else%
+ \pgflowlevel{\pgf@shade@extra@transform}%
+ \fi%
+ \pgfuseshading{#1}%
+ \pgfsys@endscope%
+ \fi%
+ \endgroup%
+ \fi%
+}
+
+\newif\ifpgf@no@shade
+
+% Additionally transform shade paths
+%
+% #1 = Transformation code that is used in addition to the normal
+% shading transformation.
+%
+% Example:
+%
+% \pgfsetadditionalshadetransform{\pgftransformrotate{30}}
+
+\def\pgfsetadditionalshadetransform#1{\def\pgf@shade@extra@transform{#1}}
+\let\pgf@shade@extra@transform=\pgfutil@empty
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcoretransformations.code.tex b/graphics/pgf/base/tex/pgfcoretransformations.code.tex
new file mode 100644
index 0000000000..961c657e8c
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoretransformations.code.tex
@@ -0,0 +1,819 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoretransformations.code.tex}
+
+
+% Position transformations
+
+\newdimen\pgf@pt@x
+\newdimen\pgf@pt@y
+
+\newdimen\pgf@pt@temp
+
+\newif\ifpgf@pt@identity
+\pgf@pt@identitytrue
+
+\def\pgf@pt@aa{1.0} \def\pgf@pt@ab{0.0}
+\def\pgf@pt@ba{0.0} \def\pgf@pt@bb{1.0}
+
+
+
+% Store the current transformation matrix in a macro.
+%
+% #1 = macro name
+%
+% Example:
+%
+% \pgfgettransform\mytransform
+
+\def\pgfgettransform#1{%
+ \edef#1{{\pgf@pt@aa}{\pgf@pt@ab}{\pgf@pt@ba}{\pgf@pt@bb}{\the\pgf@pt@x}{\the\pgf@pt@y}}%
+}
+
+% Store the current transformation matrix in a set of macros, one for
+% each single entry.
+%
+% #1-#4 are macro which store the matrix entries (0,0), (0,1), (1,0),
+% (1,1) (in this order). It is the same order as for \pgftransformcm.
+%
+% #5 is a macro which will be filled with the x shift and
+% #6 is a macro which will be filled with the y shift.
+%
+% Example:
+% \pgfgettransform\aa\ab\ba\bb\shiftx\shifty
+%
+% ->
+%
+% \pgftransformcm\aa\ab\ba\bb{\pgfqpoint{\shiftx}{\shifty}}
+%
+% or
+%
+% \pgfsettransformentries\aa\ab\ba\bb\shiftx\shifty
+\def\pgfgettransformentries#1#2#3#4#5#6{%
+ \edef#1{\pgf@pt@aa}%
+ \edef#2{\pgf@pt@ab}% attention: this is (1,0), i.e. the point which is usually labelled 'ba'!
+ \edef#3{\pgf@pt@ba}% attention: this is (0,1), i.e. the point which is usually labelled 'ab'!
+ \edef#4{\pgf@pt@bb}%
+ \edef#5{\the\pgf@pt@x}%
+ \edef#6{\the\pgf@pt@y}%
+}%
+\def\pgfsettransformentries#1#2#3#4#5#6{%
+ \pgfsettransform{{#1}{#2}{#3}{#4}{#5}{#6}}%
+}%
+
+% Restore the current transformation matrix from a macro.
+%
+% #1 = macro name, previously used with \pgfgettransform
+%
+% Example:
+%
+% \pgfsettransform\mytransform
+
+\def\pgfsettransform#1{%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgf@settransform\pgf@temp%
+}
+\def\pgf@settransform#1#2#3#4#5#6{%
+ \def\pgf@pt@aa{#1}%
+ \def\pgf@pt@ab{#2}%
+ \def\pgf@pt@ba{#3}%
+ \def\pgf@pt@bb{#4}%
+ \pgf@pt@x=#5%
+ \pgf@pt@y=#6%
+ \edef\pgf@idtest{#1,#2,#3,#4}%
+ \ifx\pgf@idtest\pgf@idmatrixtext%
+ \pgf@pt@identitytrue%
+ \else%
+ \pgf@pt@identityfalse%
+ \fi%
+}
+
+\def\pgf@idmatrixtext{1.0,0.0,0.0,1.0}
+\def\pgf@zerozerotext{0.0,0.0}
+\def\pgf@one@text{1.0}
+\def\pgf@zero@text{0.0}
+
+% Transformation command
+%
+% #1 = x dimension
+% #2 = y dimension
+%
+% Description:
+%
+% Applies the pgfs transformation matrix to the point (#1,#2). The
+% result is once more stored in the point.
+%
+%
+% Example:
+%
+% \pgf@pos@transform{\pgf@x}{\pgf@y}
+
+\def\pgf@pos@transform#1#2{%
+ \ifpgf@pt@identity%
+ \else%
+ \pgf@pt@temp=#1%
+ #1=\pgf@pt@aa#1%
+ \advance#1 by\pgf@pt@ba#2%
+ #2=\pgf@pt@bb#2%
+ \advance#2 by\pgf@pt@ab\pgf@pt@temp%
+ \fi%
+ \advance#1 by\pgf@pt@x%
+ \advance#2 by\pgf@pt@y%
+}
+\def\pgf@pos@transform@glob{%
+ \ifpgf@pt@identity%
+ \else%
+ \pgf@pt@temp=\pgf@x%
+ \global\pgf@x=\pgf@pt@aa\pgf@x%
+ \global\advance\pgf@x by\pgf@pt@ba\pgf@y%
+ \global\pgf@y=\pgf@pt@bb\pgf@y%
+ \global\advance\pgf@y by\pgf@pt@ab\pgf@pt@temp%
+ \fi%
+ \global\advance\pgf@x by\pgf@pt@x%
+ \global\advance\pgf@y by\pgf@pt@y%
+}
+
+
+% Invert the current transformation matrix
+%
+% Description:
+%
+% This command replaces the current transformation matrix by its
+% inverse. The inversion is not very exact if the matrix is nearly
+% singular.
+%
+% Example:
+%
+% \pgftransforminvert
+
+\def\pgftransforminvert{%
+ % First, invert the shift. That's easy
+ \pgf@pt@x=-\pgf@pt@x
+ \pgf@pt@y=-\pgf@pt@y
+ \ifpgf@pt@identity%
+ \else%
+ % Sigh. Have to calculate the inverse of the matrix.
+ % Perhaps we are lucky and ba and bb are zero?
+ \edef\pgf@zerotest{\pgf@pt@ab,\pgf@pt@ba}%
+ \ifx\pgf@zerotest\pgf@zerozerotext%
+ % Ha! Just invert aa and bb
+ \pgfmathreciprocal@{\pgf@pt@aa}%
+ \let\pgf@pt@aa\pgfmathresult%
+ \pgfmathreciprocal@{\pgf@pt@bb}%
+ \let\pgf@pt@bb\pgfmathresult%
+ \else%
+ % Start with determinant
+ % Matrix = (aa ab
+ % ba bb)
+ {%
+ \pgfutil@tempdima=\pgf@pt@aa pt%
+ \pgfutil@tempdima=\pgf@pt@bb\pgfutil@tempdima% aa * bb
+ \pgfutil@tempdimb=\pgf@pt@ba pt%
+ \pgfutil@tempdimb=\pgf@pt@ab\pgfutil@tempdimb% ba * ab
+ \advance\pgfutil@tempdima by -\pgfutil@tempdimb% aa*bb - ba*ab
+ % Invert
+ \pgfmathreciprocal@{\pgf@sys@tonumber{\pgfutil@tempdima}}%
+ \pgfutil@tempdima=\pgfmathresult pt%
+ \pgf@x=\pgf@pt@bb\pgfutil@tempdima% bb/(det A)
+ \xdef\pgf@new@pt@aa{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@x=\pgf@pt@aa\pgfutil@tempdima% aa/(det A)
+ \xdef\pgf@new@pt@bb{\pgf@sys@tonumber{\pgf@x}}%
+ \pgfutil@tempdima=-\pgfutil@tempdima%
+ \pgf@x=\pgf@pt@ba\pgfutil@tempdima% -ba/(det A)
+ \xdef\pgf@new@pt@ba{\pgf@sys@tonumber{\pgf@x}}%
+ \pgf@x=\pgf@pt@ab\pgfutil@tempdima% -ab/(det A)
+ \xdef\pgf@new@pt@ab{\pgf@sys@tonumber{\pgf@x}}%
+ }%
+ \let\pgf@pt@aa\pgf@new@pt@aa%
+ \let\pgf@pt@ab\pgf@new@pt@ab%
+ \let\pgf@pt@ba\pgf@new@pt@ba%
+ \let\pgf@pt@bb\pgf@new@pt@bb%
+ \fi%
+ \pgf@pt@temp=\pgf@pt@x%
+ \pgf@pt@x=\pgf@pt@aa\pgf@pt@x%
+ \advance\pgf@pt@x by\pgf@pt@ba\pgf@pt@y%
+ \pgf@pt@y=\pgf@pt@bb\pgf@pt@y%
+ \advance\pgf@pt@y by\pgf@pt@ab\pgf@pt@temp%
+ \fi%
+}
+
+
+
+
+% PGF-Level concatenation of the transformation matrix with a given
+% matrix.
+%
+% #1 - #5 = a concatenation matrix (see pdf spec). Entry #5 is a
+% translation point.
+%
+% Description:
+%
+% All coordinates given to subsequent path construction commands will
+% be transformed additionally by the given transformation matrix. If
+% the command is followed by a 6th argument, the transformation is
+% only applied to this argument.
+%
+%
+% Example:
+%
+% \pgftransformcm{1}{0}{0}{1}{\pgfpoint{100pt}{0pt}} % 100pt to the right.
+%
+% \pgftransformcm{2}{0}{0}{2}{\pgfpointorigin} % double in size
+% \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+% \pgfpathlineto{\pgflineto{1cm}{1cm}} % actually 2cm/2cm
+
+\def\pgftransformcm#1#2#3#4#5{%
+ \edef\pgf@marshal{\noexpand\pgf@transformcm{#1}{#2}{#3}{#4}}%
+ \pgf@marshal{#5}%
+}
+\def\pgf@transformcm#1#2#3#4#5{%
+ {%
+ \pgf@process{#5}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ %
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgfmathsetlength\pgf@y{#2}%
+ %
+ \pgf@xa=\pgf@pt@aa\pgf@x%
+ \advance\pgf@xa by \pgf@pt@ba\pgf@y%
+ %
+ \pgf@ya=\pgf@pt@ab\pgf@x%
+ \advance\pgf@ya by \pgf@pt@bb\pgf@y%
+ %
+ \pgfmathsetlength\pgf@x{#3}%
+ \pgfmathsetlength\pgf@y{#4}%
+ %
+ \pgf@xb=\pgf@pt@aa\pgf@x%
+ \advance\pgf@xb by \pgf@pt@ba\pgf@y%
+ %
+ \pgf@yb=\pgf@pt@ab\pgf@x%
+ \advance\pgf@yb by \pgf@pt@bb\pgf@y%
+ %
+ \pgf@x=\pgf@pt@aa\pgf@xc%
+ \advance\pgf@x by\pgf@pt@ba\pgf@yc%
+ \advance\pgf@x by\pgf@pt@x%
+ %
+ \pgf@y=\pgf@pt@ab\pgf@xc%
+ \advance\pgf@y by\pgf@pt@bb\pgf@yc%
+ \advance\pgf@y by\pgf@pt@y%
+ %
+ \global\pgf@x=\pgf@x%
+ \global\pgf@y=\pgf@y%
+ \xdef\pgf@tempaa{\pgf@sys@tonumber{\pgf@xa}}%
+ \xdef\pgf@tempab{\pgf@sys@tonumber{\pgf@ya}}%
+ \xdef\pgf@tempba{\pgf@sys@tonumber{\pgf@xb}}%
+ \xdef\pgf@tempbb{\pgf@sys@tonumber{\pgf@yb}}%
+ }%
+ \pgf@pt@x=\pgf@x%
+ \pgf@pt@y=\pgf@y%
+ \let\pgf@pt@aa=\pgf@tempaa%
+ \let\pgf@pt@ba=\pgf@tempba%
+ \let\pgf@pt@ab=\pgf@tempab%
+ \let\pgf@pt@bb=\pgf@tempbb%
+ \edef\pgf@idtest{\pgf@pt@aa,\pgf@pt@ba,\pgf@pt@ab,\pgf@pt@bb}%
+ \ifx\pgf@idtest\pgf@idmatrixtext%
+ \pgf@pt@identitytrue%
+ \else%
+ \pgf@pt@identityfalse%
+ \fi%
+}
+
+
+
+% Transformation into a given triangle. The three corners of the
+% triangle are called "origin", "x" and "y" are given. After this
+% transformation has been applied, the canvas origin is at "origin",
+% the vector (1pt,0pt) lies at "x" and the vector (0pt,1pt) lies at
+% "y".
+%
+% #1 = origin
+% #2 = x
+% #3 = y
+%
+% Example:
+%
+% \pgftransformtriangle{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}{\pgfpoint{-1cm}{1cm}}
+
+\def\pgftransformtriangle#1#2#3{%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{#1}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \advance\pgf@xb by-\pgf@x%
+ \advance\pgf@yb by-\pgf@y%
+ \pgftransformcm%
+ {\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@ya}%
+ {\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@yb}%
+ {\pgfpoint{\pgf@x}{\pgf@y}}%
+}
+
+
+
+% Undo all transformations
+%
+% Example:
+%
+% \pgftansformreset
+
+\def\pgftransformreset{%
+ \pgf@pt@x=0pt%
+ \pgf@pt@y=0pt%
+ \let\pgf@pt@aa\pgf@one@text%
+ \let\pgf@pt@ba\pgf@zero@text%
+ \let\pgf@pt@ab\pgf@zero@text%
+ \let\pgf@pt@bb\pgf@one@text%
+ \pgf@pt@identitytrue%
+}
+
+
+% Undo all slanting/rotation, but not translations
+%
+% Example:
+%
+% \pgftansformreset
+
+\def\pgftransformresetnontranslations{%
+ \let\pgf@pt@aa\pgf@one@text%
+ \let\pgf@pt@ba\pgf@zero@text%
+ \let\pgf@pt@ab\pgf@zero@text%
+ \let\pgf@pt@bb\pgf@one@text%
+ \pgf@pt@identitytrue%
+}
+
+
+
+
+% Shifting command and environment
+%
+% #1 = vector by which all subsequent points should be moved.
+%
+% Example:
+%
+% \pgftansformshift{\pgfpoint{1cm}{1cm}}
+
+\def\pgftransformshift#1{\pgftransformcm{1}{0}{0}{1}{#1}}
+\def\pgftransformxshift#1{\pgftransformcm{1}{0}{0}{1}{\pgfpoint{#1}{+0pt}}}
+\def\pgftransformyshift#1{\pgftransformcm{1}{0}{0}{1}{\pgfpoint{+0pt}{#1}}}
+
+
+
+
+% Scaling commands
+%
+% #1 = scaling for all subsequent points.
+%
+% Example:
+%
+% \pgftransformscale{2}
+% \pgftransformxscale{2}
+% \pgftransformyscale{2}
+
+\def\pgftransformscale#1{\pgftransformcm{#1}{0}{0}{#1}{\pgfpointorigin}}
+\def\pgftransformxscale#1{\pgftransformcm{#1}{0}{0}{1.0}{\pgfpointorigin}}
+\def\pgftransformyscale#1{\pgftransformcm{1.0}{0}{0}{#1}{\pgfpointorigin}}
+
+
+
+% Slanting commands
+%
+% #1 = slanting in x-direction. 1 means 45 degrees.
+%
+% Example:
+%
+% \pgftransformxslant{2}
+% \pgftransformyslant{2}
+
+\def\pgftransformxslant#1{\pgftransformcm{1.0}{0}{#1}{1.0}{\pgfpointorigin}}
+\def\pgftransformyslant#1{\pgftransformcm{1.0}{#1}{0}{1.0}{\pgfpointorigin}}
+
+
+
+% Rotation commands
+%
+% #1 = degrees for the rotation
+%
+% Example:
+%
+% \pgftransformrotate{30}
+
+\def\pgftransformrotate#1{%
+ \pgfmathparse{#1}%
+ \let\pgftransform@angle=\pgfmathresult%
+ \pgfmathsin@{\pgftransform@angle}%
+ \let\pgftransform@sin=\pgfmathresult%
+ \pgfmathcos@{\pgftransform@angle}%
+ \let\pgftransform@cos=\pgfmathresult%
+ \pgf@x=\pgftransform@sin pt%
+ \pgf@xa=-\pgf@x%
+ \pgftransformcm{\pgftransform@cos}{\pgftransform@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgftransform@cos}{\pgfpointorigin}%
+}
+
+
+
+% The following if's have the following effect:
+%
+% \ifpgfslopedattime decides whether the coordinate system of an
+% xxxattime transformation command should be rotated such that text
+% drawn on the line should be tangent to the line
+%
+% \ifpgfallowupsidedowattime decides whether the transformation should
+% be done in such a way that the text is always ``upright,'' that is,
+% text drawn in this coordinate system is never upside-down.
+%
+% \ifpgfresetnontranslationattime decides whether the coordinate
+% system of an xxxattime transformation command should be reset
+% (concerning the non-translations) before a possible rotation is
+% applied. This is useful, for example, if the main coordinate system
+% is scaled by, say, a factor of 2 and you do not want that to apply
+% to the text, but you do want the rotation to apply.
+
+\newif\ifpgfslopedattime
+\newif\ifpgfallowupsidedownattime
+\newif\ifpgfresetnontranslationattime
+
+
+% Transform to the coordinate system of a point on a line
+%
+% #1 = a time fraction of line where to put the label, where 0 means start,
+% 1 means end, and for example 0.5 means the middle.
+% #2 = start of line
+% #3 = end of line
+%
+% Example:
+%
+% {
+% \pgftransformlineattime{.5}{\pgfxy(0,0)}{\pgfxy(3,2)}
+% \pgftext{Hi!}
+% }
+%
+% {
+% \pgftransformlineattime{.75}{\pgfxy(0,0)}{\pgfxy(3,2)}
+% \pgftransformresetnontranslations
+% \pgftext{Hi!}
+% }
+%
+\def\pgftransformlineattime#1#2#3{%
+ \pgf@process{#2}%
+ \pgf@xb=\pgf@x% xb/yb = start point
+ \pgf@yb=\pgf@y%
+ \pgf@process{#3}%
+ \pgf@xc=\pgf@x% xc/yc = end point
+ \pgf@yc=\pgf@y%
+ \pgftransformshift{\pgfpointlineattime{#1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}%
+ \ifpgfresetnontranslationattime%
+ \pgftransformresetnontranslations%
+ \fi%
+ \ifpgfslopedattime%
+ \advance\pgf@xc by-\pgf@xb%
+ \advance\pgf@yc by-\pgf@yb%
+ \ifpgfallowupsidedownattime%
+ \else%
+ \ifdim\pgf@xc<0pt%
+ \pgf@xc=-\pgf@xc%
+ \pgf@yc=-\pgf@yc%
+ \fi%
+ \fi%
+ \pgf@x=\pgf@xc%
+ \pgf@y=\pgf@yc%
+ \pgfpointnormalised{}% x/y = normalised vector
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm%
+ {\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
+ {\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
+ \fi%
+}
+
+
+% Transform to the coordinate system of a point on an arc
+%
+% #1 = a time fraction of line where to put the label, where 0 means start,
+% 1 means end, and for example 0.5 means the middle.
+% #2 = center of an ellipse
+% #3 = 0-degree axis of the ellipse
+% #4 = 90-degree axis of the ellipse
+% #4 = start angle of the arc on this ellipse
+% #5 = end angle of the arc on this ellipse
+%
+% Example:
+%
+% {
+% \pgftransformlineattime{.5}{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{0cm}}{\pgfpoint{0cm}{1cm}}{30}{40}
+% \pgftext{Hi!}
+% }
+
+\def\pgftransformarcaxesattime#1#2#3#4#5#6{%
+ \pgfpointarcaxesattime{#1}{#2}{#3}{#4}{#5}{#6}%
+ \pgftransformshift{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \ifpgfresetnontranslationattime%
+ \pgftransformresetnontranslations%
+ \fi%
+ \ifpgfslopedattime%
+ \pgf@x=\pgf@xa%
+ \pgf@y=\pgf@ya%
+ \pgf@process{\pgfpointnormalised{}}%
+ \ifpgfallowupsidedownattime%
+ \else%
+ \ifdim\pgf@x<0pt%
+ \pgf@x=-\pgf@x%
+ \pgf@y=-\pgf@y%
+ \fi%
+ \fi%
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm%
+ {\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
+ {\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
+ \fi%
+}
+
+
+
+
+% Transform to the coordinate system of a point on a curve
+%
+% #1 = a time fraction of line where to put the label, where 0 means start,
+% 1 means end, and for example 0.5 means the middle.
+% #2 = start of line
+% #3 = first control
+% #4 = second control
+% #5 = end of line
+%
+% Example:
+%
+% {
+% \pgftransformcurveattime{.5}{\pgfxy(0,0)}{\pgfxy(3,2)}
+% \pgftext{Hi!}
+% }
+%
+% {
+% \pgftransformcurveattime{.75}{\pgfxy(0,0)}{\pgfxy(3,2)}
+% \pgftransformresetnontranslations
+% \pgftext{Hi!}
+% }
+%
+\def\pgftransformcurveattime#1#2#3#4#5{%
+ \pgfpointcurveattime{#1}{#2}{#3}{#4}{#5}%
+ \pgftransformshift{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \ifpgfresetnontranslationattime%
+ \pgftransformresetnontranslations%
+ \fi%
+ \ifpgfslopedattime%
+ \pgf@x=\pgf@xa%
+ \pgf@y=\pgf@ya%
+ \advance\pgf@x by-\pgf@xb%
+ \advance\pgf@y by-\pgf@yb%
+ \ifpgfallowupsidedownattime%
+ \else%
+ \ifdim\pgf@x<0pt%
+ \pgf@x=-\pgf@x%
+ \pgf@y=-\pgf@y%
+ \fi%
+ \fi%
+ \pgfpointnormalised{}% x/y = normalised vector
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm%
+ {\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
+ {\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
+ \fi%
+}
+
+
+
+
+
+% Transform to the coordinate system of an arrow at the end of the
+% line going from point #1 to point #2 with the correct rotation.
+%
+% #1 = a start point an (invisible) line
+% #2 = an end point an (invisible) line
+%
+% Example:
+%
+% \pgftransformarrow{\pgfpointorigin}{\pgfpoint{1cm}{0cm}}
+
+\def\pgftransformarrow#1#2{%
+ \pgf@process{#2}%
+ \pgftransformshift{}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#1}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \pgf@x=\pgf@xa%
+ \pgf@y=\pgf@ya%
+ \pgfpointnormalised{}%
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm%
+ {\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
+ {\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfqpoint{0pt}{0pt}}%
+}
+
+
+
+
+% Computes transformations adjustments for the current transformation
+% matrix
+%
+% Description:
+%
+% This command is used when you install a transformation matrix that
+% scales everything by a certain factor, but you still wish to draw
+% something with "an absolute size". Suppose for instance that you
+% install a transformation matrix that scales everything by a factor
+% of 4 and you now wish to draw a horizontal line of length 1cm. Then,
+% if you do not reset the transformation matrix, you can draw a line
+% of logical length 2.5mm, which will then get scaled to a line of
+% 1cm.
+%
+% Things get more difficult in case you scale things only, say,
+% vertically. In this case, the adjustment necessary for horizontal
+% lines is different from the one needed for vertical lines.
+%
+% This function computes the necessary scaling factors and puts them
+% in the macros \pgfhorizontaltransformationadjustment and
+% \pgfverticaltransformationadjustment.
+%
+% Note that the "right" way to draw a line of absolute length 1cm in a
+% transformed coordinate system is to first compute the start point
+% and to then reset the transformation matrix. The transformation
+% adjustments computed here are important only in situations where you
+% cannot do this, for instance when an "outer xsep" must be set.
+
+\def\pgftransformationadjustments{%
+ \ifpgf@pt@identity%
+ \let\pgfhorizontaltransformationadjustment\pgf@one@text%
+ \let\pgfverticaltransformationadjustment\pgf@one@text%
+ \else%
+ {%
+ \pgf@pt@x0pt%
+ \pgf@pt@y0pt%
+ \pgfpointtransformed{\pgfqpoint{1pt}{0pt}}%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \global\let\pgf@temp@hori\pgfmathresult
+ \pgfpointtransformed{\pgfqpoint{0pt}{1pt}}%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \global\let\pgf@temp@vert\pgfmathresult
+ \xdef\pgf@marshal@b{\def\noexpand\pgfverticaltransformationadjustment{\pgfmathresult}}
+ }%
+ \let\pgfhorizontaltransformationadjustment\pgf@temp@hori%
+ \let\pgfverticaltransformationadjustment\pgf@temp@vert%
+ \fi%
+}
+
+\let\pgfhorizontaltransformationadjustment\pgf@one@text
+\let\pgfverticaltransformationadjustment\pgf@one@text
+
+
+% Low-level transformations
+
+% Causes the current high-level transformation command to be applied
+% to the low-level.
+%
+% Description:
+%
+% All subsequent drawing will be transformed additionally by the
+% current high-level transformation. Thus, the high-level
+% transformation becomes the low-level transformation. The high-level
+% transformation is reset at this point.
+
+\def\pgflowlevelsynccm{%
+ \pgfsys@transformcm%
+ {\pgf@pt@aa}{\pgf@pt@ab}%
+ {\pgf@pt@ba}{\pgf@pt@bb}%
+ {\pgf@pt@x}{\pgf@pt@y}%
+ \pgftransformreset%
+ \pgf@relevantforpicturesizefalse%
+}
+
+
+
+% Causes a transformation command to be applied to the ``lowlevel''
+% transformation matrix.
+%
+% #1 - a high-level transformation command
+%
+% Description:
+%
+% All subsequent drawing will be transformed additionally by the given
+% transformation matrix. Note that PGF will no longer be able to
+% ``keep track'' of the coordinates. Also, transformations are applied
+% to *everything*, including line thickness and line endings. Most
+% often, this is not desirable.
+%
+% Example:
+%
+% \pgflowlevel{\pgftransformcm{1}{0}{0}{1}{\pgfpoint{100pt}{0pt}}} % 100bp to the right.
+%
+% \begin{pgflowlevelscope}{\pgftransformcm{2}{0}{0}{2}{\pgfpointorigin}} % double in size
+% \pgfmoveto{\pgfpoint{0cm}{0cm}}
+% \pgflineto{\pgflineto{1cm}{1cm}} % actually 2cm/2cm
+% \end{pgflowlevelscope}
+
+\def\pgflowlevel#1{%
+ {%
+ \pgftransformreset%
+ #1%
+ \pgflowlevelsynccm%
+ }%
+ \pgf@relevantforpicturesizefalse%
+}
+
+\def\pgflowlevelscope#1{\pgfscope\pgflowlevel{#1}}
+\def\endpgflowlevelscope{\endpgfscope}
+
+\long\def\pgflowlevelobj#1#2{\pgfscope{\pgflowlevel{#1}#2}\endpgfscope}
+
+
+
+% View boxes
+
+% Establishes a view box scope
+%
+% #1 and #2 = two opposite corners of the source rectangle
+% #3 and #4 = two opposite corners of the target rectangle
+% #5 = "meet" or "slice"
+%
+% Description:
+%
+% Inside the viewbox scope, the source rectangle will be translated
+% and scaled so that it becomes centered on the target rectangle and
+% will, for "meet", be as large as possible so that it fits inside the
+% target and, for "slice", be as small as possible so that it
+% encompasses the target.
+
+\def\pgfviewboxscope#1#2#3#4#5{%
+ {% Compute rectangle corners
+ \pgf@process{#1}%
+ \pgf@pos@transform@glob
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#2}%
+ \pgf@pos@transform@glob
+ \ifdim\pgf@x<\pgf@xa%
+ \pgf@xb\pgf@x%
+ \pgf@xc\pgf@xa%
+ \else%
+ \pgf@xb\pgf@xa%
+ \pgf@xc\pgf@x%
+ \fi%
+ \ifdim\pgf@y<\pgf@ya%
+ \pgf@yb\pgf@y%
+ \pgf@yc\pgf@ya%
+ \else%
+ \pgf@yb\pgf@ya%
+ \pgf@yc\pgf@y%
+ \fi%
+ \pgf@process{#3}%
+ \pgf@pos@transform@glob
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{#4}%
+ \pgf@pos@transform@glob
+ \ifdim\pgf@x<\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x
+ \pgf@x\pgf@xa%
+ \pgf@xa\pgfutil@tempdima%
+ \fi%
+ \ifdim\pgf@y<\pgf@ya%
+ \else%
+ \pgfutil@tempdima\pgf@y
+ \pgf@y\pgf@ya%
+ \pgf@ya\pgfutil@tempdima%
+ \fi%
+ \pgfusetype{.view}%
+ \edef\pgf@marshal{\expandafter\noexpand\csname pgfsys@viewbox#5\endcsname{\the\pgf@x}{\the\pgf@y}{\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}{\the\pgf@xc}{\the\pgf@yc}}%
+ \pgf@marshal%
+ }%
+ \pgf@relevantforpicturesizefalse%
+}
+
+\def\endpgfviewboxscope{\pgfsys@endviewbox}
+
+\let\startpgfviewboxscope=\pgfviewboxscope
+\let\stoppgfviewboxscope=\endpgfviewboxscope
+
+% Forward declarations for nonlinear stuff (have no effect till module
+% nonlineartransformations is loaded)
+
+\let\pgfapproximatenonlineartranslation\relax
+\let\pgfapproximatenonlineartransformation\relax
+\def\pgftransformnonlinear#1{\pgferror{You need to say
+ \string\usepgfmodule{nonlineartransformations} to use nonlinear transformations}}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfcoretransparency.code.tex b/graphics/pgf/base/tex/pgfcoretransparency.code.tex
new file mode 100644
index 0000000000..181450ac27
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfcoretransparency.code.tex
@@ -0,0 +1,311 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfcoretransparency.code.tex}
+
+
+% Sets the opacity of stroking operations.
+%
+% #1 = opacity, where 1 means fully opaque and 0 means fully
+% transparent.
+%
+% Example:
+%
+% \pgfsetstrokeopacity{0.5}
+
+\def\pgfsetstrokeopacity#1{%
+ \pgfmathparse{#1}%
+ \expandafter\pgfsys@stroke@opacity\expandafter{\pgfmathresult}}
+
+
+% Sets the opacity of stroking operations.
+%
+% #1 = opacity, where 1 means fully opaque and 0 means fully
+% transparent.
+%
+% Example:
+%
+% \pgfsetfillopacity{0.5}
+
+\def\pgfsetfillopacity#1{%
+ \pgfmathparse{#1}%
+ \expandafter\pgfsys@fill@opacity\expandafter{\pgfmathresult}}
+
+
+
+% Sets the current blend mode. See Section 7.2.4 of the PDF
+% Specification 1.7 for an introduction to blend modes in general.
+%
+% #1 = One of the following modes, see also section 7.2.4 of the
+% PDF Specification 1.7. (The PGF names, which are all lowercase with
+% spaces as usual, must be mapped to the PDF or SVG by the drivers.)
+%
+% normal
+% multiply
+% screen
+% overlay
+% darken
+% lighten
+% color dodge
+% color burn
+% hard light
+% soft light
+% difference
+% exclusion
+% saturation
+% color
+% hue
+% luminosity
+%
+% Example:
+%
+% \pgfsetblendmode{multiply}
+
+\def\pgfsetblendmode#1{\pgfsys@blend@mode{#1}}
+
+
+% Declares a new fading based on the contents of a box.
+%
+% #1 = name of the fading
+% #2 = content of a TeX box that specifies the fading
+%
+% Description:
+%
+% This command declares a new fading based on the contents of
+% the TeX box. The mask can later be used to mask other graphics.
+%
+% The box is used to determine where the mask is opaque: At the
+% beginning, the mask is completely transparent. Wherever the box
+% contains something (like text or a picture or whatever), the
+% luminosity of the text/graphic is used to determine how opaque the
+% point will be. The greater the luminosity, the more opaque. The net
+% effect is that white corresponds to "completely opaque" and black to
+% "completely transparent". This is rather counterintuitive. Because
+% of this, the special color "pgftransparent" is defined, which is the
+% same as black. By setting the color to, say,
+% \color{pgftransparent!10} you get something that is 10% transparent
+% and \color{pgftransparent!90} gives you 90% transparency.
+%
+% By default, the drawing color is set to opaque.
+%
+% Example:
+%
+% \pgfdeclarefading{mymask}{
+% \fontsize{200}{200}\bfseries
+% Ti\emph{k}Z
+% }
+% \pgfdeclarefading{myothermask}{
+% \tikz \shade [left color=transparent,right color=transparent!0]
+% (0,0) rectangle (5,5);
+% }
+
+\def\pgfdeclarefading#1#2{%
+ \setbox\pgfutil@tempboxa=\hbox{{\pgfsys@beginscope\pgfutil@color{white}\ignorespaces#2\pgfsys@endscope}}%
+ \pgfsys@fadingfrombox{#1}\pgfutil@tempboxa%
+}
+
+\pgfutil@colorlet{pgftransparent}{black}
+
+
+% Use a previously declared fading.
+%
+% #1 = name of the fading
+% #2 = transformation code
+%
+% Description:
+%
+% The command should be used *inside* a pgfpicture to install a
+% fading. The fading is a part of the graphic state. (This command
+% works much like \pgfsetstrokeopacity).
+%
+% The mask will be centered on the origin. The transformation code #2 is
+% applied to the mask (but not the contents of the actual picture).
+
+\def\pgfsetfading#1#2{%
+ {%
+ \pgftransformreset%
+ #2%
+ \pgfgettransform{\pgftrans@temp}%
+ \edef\pgf@marshal{\noexpand\pgfsys@usefading{#1}\pgftrans@temp}%
+ \pgf@marshal%
+ }%
+}
+
+
+
+% Use a previously declared fading scaled for the current path.
+%
+% #1 - an fading
+% #2 - extra transformations
+%
+% Description:
+%
+% This command works a bit like \pgfshadepath. "Works a bit like"
+% means the following: The masks's original size should
+% completely cover the area between (0,0) and (100bp,100bp). The
+% mask is then rescaled so that it completely covers the path. Then
+% the additional transformation #2 is applied. Finally, the mask is
+% made part of the graphic state (as with \pgfsetfading). The path
+% used for computation purposes only -- it is not drawn or otherwise
+% used.
+%
+% If no transformations occur, the lower left corner of the path will
+% lie on (25bp, 25bp), the upper right corner on (75bp, 75bp).
+%
+% If the path was empty, the fading will be used at its natural size,
+% centered on the origin.
+%
+% Example:
+%
+% \pgfdeclarefading{fade right}
+% {\tikz[left color=transparent!0,right color=transparent!100]
+% (0,0) rectangle (100bp,100bp);}
+%
+% \pgfpathmoveto{\pgforigin}
+% \pgfpathlineto{\pgfxy(1,0)}
+% \pgfpathlineto{\pgfxy(1,1)}
+% \pgfsetfadingforcurrentpath{fade right}{}
+% \pgfusepath{fill}
+
+\def\pgfsetfadingforcurrentpath#1#2{%
+ \ifdim\pgf@pathminx=16000pt%
+ % Path was empty -> use natural size
+ \pgfsetfading{#1}{#2}%
+ \else%
+ \pgfsetfading{#1}{%
+ % Calculate center:
+ \pgf@xb=.5\pgf@pathmaxx%
+ \advance\pgf@xb by.5\pgf@pathminx%
+ \pgf@yb=.5\pgf@pathmaxy%
+ \advance\pgf@yb by.5\pgf@pathminy%
+ % Calculate scaling:
+ \pgf@xc=\pgf@pathmaxx%
+ \advance\pgf@xc by-\pgf@pathminx%
+ \ifdim\pgf@xc<0.1pt\pgf@xc=0.1pt\fi%
+ \pgf@yc=\pgf@pathmaxy%
+ \advance\pgf@yc by-\pgf@pathminy%
+ \ifdim\pgf@yc<0.1pt\pgf@yc=0.1pt\fi%
+ \pgf@xc=.02\pgf@xc%
+ \pgf@yc=.02\pgf@yc%
+ % Compute new transformation matrix:
+ \pgftransformcm{1}{0}{0}{1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgftransformcm{\pgf@sys@tonumber{\pgf@xc}}{0}{0}{\pgf@sys@tonumber{\pgf@yc}}{\pgfpointorigin}%
+ #2%
+ }%
+ \fi%
+}
+
+
+
+
+% Use a previously declared fading scaled for the current path.
+%
+% #1 - an fading
+% #2 - extra transformations
+%
+% Description:
+%
+% This command works like \pgfsetfadingforcurrentpath, only it takes
+% the current line width into account: Before the path is considered,
+% it is enlarged by half the line width in all directions.
+
+\def\pgfsetfadingforcurrentpathstroked#1#2{%
+ \ifdim\pgf@pathminx=16000pt%
+ % Path was empty -> use natural size
+ \pgfsetfading{#1}{#2}%
+ \else%
+ \pgfsetfading{#1}{%
+ % Calculate center:
+ \pgf@xb=.5\pgf@pathmaxx%
+ \advance\pgf@xb by.5\pgf@pathminx%
+ \pgf@yb=.5\pgf@pathmaxy%
+ \advance\pgf@yb by.5\pgf@pathminy%
+ % Calculate scaling:
+ \pgf@xc=\pgf@pathmaxx%
+ \advance\pgf@xc by-\pgf@pathminx%
+ \advance\pgf@xc by\pgflinewidth%
+ \ifdim\pgf@xc<0.1pt\pgf@xc=0.1pt\fi%
+ \pgf@yc=\pgf@pathmaxy%
+ \advance\pgf@yc by-\pgf@pathminy%
+ \advance\pgf@yc by\pgflinewidth%
+ \ifdim\pgf@yc<0.1pt\pgf@yc=0.1pt\fi%
+ \pgf@xc=.02\pgf@xc%
+ \pgf@yc=.02\pgf@yc%
+ % Compute new transformation matrix:
+ \pgftransformcm{1}{0}{0}{1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgftransformcm{\pgf@sys@tonumber{\pgf@xc}}{0}{0}{\pgf@sys@tonumber{\pgf@yc}}{\pgfpointorigin}%
+ #2%
+ }%
+ \fi%
+}
+
+
+
+% Group things in a a transparency group
+%
+% Description:
+%
+% This takes groups pgf commands inside a pgfpicture in a transparency
+% group. This means that any transparency settings apply to commands a
+% whole. For instance, if a box contains two overlapping black
+% circles and you draw them normally with 50% transparency, then the
+% overlap will be darker than the rest. By comparison, if the circles
+% are part of a transparency group, the overlap will get the same
+% color as the rest.
+%
+%
+
+\def\pgftransparencygroup{%
+ \pgfutil@ifnextchar[{\pgftransparencygroup@}{\pgftransparencygroup@[]}%
+}
+\def\pgftransparencygroup@[#1]{%
+ \begingroup%
+ \pgfkeys{/pgf/transparency group options/.cd,%
+ isolated=false,
+ knockout=false,
+ #1}%
+ \setbox\pgfutil@tempboxa=\hbox\bgroup%
+}
+\pgfkeys{
+ /pgf/transparency group options/.cd,
+ isolated/.is if=pgfsys@transparency@group@isolated,
+ knockout/.is if=pgfsys@transparency@group@knockout
+}
+
+\def\endpgftransparencygroup{%
+ \egroup%
+ % Now compute the correct position. This is a bit tricky...
+ \ifdim\pgf@picminx=16000pt%
+ % Nothing needs to be done
+ \else%
+ % Safety margin to avoid clipping:
+ \advance\pgf@picminx by-1cm%
+ \advance\pgf@picmaxx by1cm%
+ \advance\pgf@picminy by-1cm%
+ \advance\pgf@picmaxy by1cm%
+ % Ok, set the box size to current picture size.
+ \setbox\pgfutil@tempboxa=\hbox{%
+ \vrule width0pt height\pgf@picmaxy depth-\pgf@picminy%
+ \hskip-\pgf@picminx%
+ \box\pgfutil@tempboxa%
+ \hskip\pgf@picmaxx%
+ }%
+ \pgfsys@transparencygroupfrombox\pgfutil@tempboxa%
+ \wd\pgfutil@tempboxa=0pt%
+ \ht\pgfutil@tempboxa=0pt%
+ \dp\pgfutil@tempboxa=0pt%
+ \hskip\pgf@picminx\box\pgfutil@tempboxa\hskip-\pgf@picminx%
+ \fi%
+ \endgroup%
+}
+
+\let\startpgftransparencygroup=\pgftransparencygroup
+\let\stoppgftransparencygroup=\endpgftransparencygroup
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfexternal.tex b/graphics/pgf/base/tex/pgfexternal.tex
new file mode 100644
index 0000000000..7be11f8f0e
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfexternal.tex
@@ -0,0 +1,32 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+%
+% In addition to the above licenses, this particular file may also be
+% directly inlined into other documents and this copyright notice may
+% be removed. Additionally, when you inline this file, you may modify
+% it as needed and you may remove comments.
+%
+% This file is intended to be distributed or even inlined into a file
+% when a document needs to be typeset on a system that does not have
+% pgf/TikZ installed.
+
+% "environment" for reading an external graphic. Note that there are
+% no (!) braces around the "name" of the environment
+%
+% #1 = name of the graphics file
+%
+% Example:
+%
+% \beginpgfgraphicnamed{mygraph}
+% \begin{tikzpicture}
+% ...
+% \end{tikzpicture}
+% \endpgfgraphicnamed
+
+\long\def\beginpgfgraphicnamed#1#2\endpgfgraphicnamed{\includegraphics{#1}}
diff --git a/graphics/pgf/base/tex/pgfexternalwithdepth.tex b/graphics/pgf/base/tex/pgfexternalwithdepth.tex
new file mode 100644
index 0000000000..f2b08b2a9e
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfexternalwithdepth.tex
@@ -0,0 +1,43 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+%
+% In addition to the above licenses, this particular file may also be
+% directly inlined into other documents and this copyright notice may
+% be removed. Additionally, when you inline this file, you may modify
+% it as needed and you may remove comments.
+%
+% This file is intended to be distributed or even inlined into a file
+% when a document needs to be typeset on a system that does not have
+% pgf/TikZ installed.
+
+% "environment" for reading an external graphic. Note that there are
+% no (!) braces around the "name" of the environment
+%
+% #1 = name of the graphics file
+%
+% Example:
+%
+% \beginpgfgraphicnamed{mygraph}
+% \begin{tikzpicture}
+% ...
+% \end{tikzpicture}
+% \endpgfgraphicnamed
+
+\long\def\beginpgfgraphicnamed#1#2\endpgfgraphicnamed{%
+ \begingroup
+ \setbox1=\hbox{\includegraphics{#1}}%
+ \openin1=#1.dpth
+ \ifeof1 \box1
+ \else
+ \read1 to\pgfincludeexternalgraphicsdp \closein1
+ \dimen0=\pgfincludeexternalgraphicsdp\relax
+ \hbox{\lower\dimen0 \box1 }%
+ \fi
+ \endgroup
+}
diff --git a/graphics/pgf/base/tex/pgffor.code.tex b/graphics/pgf/base/tex/pgffor.code.tex
new file mode 100644
index 0000000000..4e351c902b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgffor.code.tex
@@ -0,0 +1,763 @@
+% Copyright 2008 by Till Tantau and 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.
+
+\ProvidesPackageRCS{pgffor.code.tex}
+
+% pgfmath is needed
+\input pgfmath.code.tex
+
+\newdimen\pgffor@iter
+\newdimen\pgffor@skip
+\newif\ifpgffor@continue
+
+
+\def\pgffor@reset@hooks{%
+ \let\pgffor@beginhook=\relax%
+ \let\pgffor@endhook=\relax%
+ \let\pgffor@afterhook=\relax%
+}
+\pgffor@reset@hooks
+
+
+% Stack emulation
+%
+\newtoks\pgffor@stack
+\pgffor@stack={{}{}{}}
+
+\def\pgffor@stackpush#1{%
+ \def\pgffor@stacktemp{#1}%
+ \expandafter\expandafter\expandafter\pgffor@stack\expandafter\expandafter\expandafter=%
+ \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
+ {\expandafter\pgffor@stacktemp\expandafter}\the\pgffor@stack}%
+}
+
+\def\pgffor@stackpop{\expandafter\pgffor@@stackpop\the\pgffor@stack\pgffor@stackstop}
+\def\pgffor@@stackpop#1#2\pgffor@stackstop{\pgffor@stack{#2}#1}
+
+\def\pgffor@emptyvalues{, \pgffor@stop,}%
+
+\def\pgffor@foreach{%
+ \pgffor@atbeginforeach%
+ \let\pgffor@assign@before@code=\pgfutil@empty%
+ \let\pgffor@assign@after@code=\pgfutil@empty%
+ \let\pgffor@assign@once@code=\pgfutil@empty%
+ \let\pgffor@remember@code=\pgfutil@empty%
+ \let\pgffor@remember@once@code=\pgfutil@empty%
+ \pgffor@alphabeticsequencefalse%
+ \pgffor@contextfalse%
+ %
+ \let\pgffor@var=\pgfutil@empty
+ %
+ \pgffor@vars%
+}
+
+\let\foreach=\pgffor@foreach
+
+\def\pgffor@vars{%
+ \pgfutil@ifnextchar i{\pgffor@@vars@end}{%
+ \pgfutil@ifnextchar[{\pgffor@@vars@opt}{%]
+ \pgfutil@ifnextchar/{\pgffor@@vars@slash@gobble}{%
+ \pgffor@@vars}}}}%
+
+\def\pgffor@@vars@end in{\pgfutil@ifnextchar\bgroup{\pgffor@normal@list}{\pgffor@macro@list}}
+\def\pgffor@@vars@opt[#1]{\pgfkeys{/pgf/foreach/.cd,#1}\pgffor@vars}
+\def\pgffor@@vars#1{\pgffor@var@add#1\pgffor@stop\pgffor@vars}
+\def\pgffor@@vars@slash@gobble/{\pgffor@@vars}
+
+\def\pgffor@var@add#1#2\pgffor@stop{%
+ \ifx\pgffor@var\pgfutil@empty%
+ \def\pgffor@var{#1}%
+ \def\pgffor@mainvar{#1}%
+ \else%
+ \expandafter\def\expandafter\pgffor@var\expandafter{\pgffor@var/#1}%
+ \fi%
+}
+
+\def\pgffor@macro@list#1{%
+ \expandafter\pgffor@normal@list\expandafter{#1}}
+\def\pgffor@normal@list#1{%
+ \def\pgffor@values{#1, \pgffor@stop,}%
+ \ifx\pgffor@values\pgffor@emptyvalues
+ \def\pgffor@values{\pgffor@stop,}%
+ \fi%
+ \let\pgffor@body=\pgfutil@empty%
+ \global\pgffor@continuetrue%
+ \pgffor@collectbody}
+\def\pgffor@collectbody{%
+ \pgfutil@ifnextchar\foreach{\pgffor@collectforeach}{%
+ \pgfutil@ifnextchar\bgroup{\pgffor@collectargument}{\pgffor@collectsemicolon}}%
+}
+
+\def\pgffor@collectforeach\foreach#1in{%
+ \pgfutil@ifnextchar\bgroup{\pgffor@collectforeach@normal{#1}}{\pgffor@collectforeach@macro{#1}}}
+\def\pgffor@collectforeach@macro#1#2{%
+ \expandafter\long\expandafter\def\expandafter\pgffor@body\expandafter{\pgffor@body\foreach#1in#2}%
+ \pgffor@collectbody%
+}
+\def\pgffor@collectforeach@normal#1#2{%
+ \expandafter\long\expandafter\def\expandafter\pgffor@body\expandafter{\pgffor@body\foreach#1in{#2}}%
+ \pgffor@collectbody%
+}
+\long\def\pgffor@collectargument#1{%
+ \expandafter\pgfutil@in@\expandafter\foreach\expandafter{\pgffor@body}%
+ \ifpgfutil@in@%
+ \expandafter\long\expandafter\def\expandafter\pgffor@body\expandafter%
+ {\pgffor@body{#1}}%
+ \else%
+ \expandafter\long\expandafter\def\expandafter\pgffor@body\expandafter%
+ {\pgffor@body#1}%
+ \fi%
+ \pgffor@iterate%
+}
+
+\def\pgffor@collectsemicolon{%
+ \let\pgffor@next=\pgffor@collectnormalsemicolon%
+ \ifnum\the\catcode`\;=\active\relax%
+ \let\pgffor@next=\pgffor@collectactivesemicolon%
+ \fi%
+ \pgffor@next%
+}
+
+\def\pgffor@collectnormalsemicolon#1;{%
+ \expandafter\long\expandafter\def\expandafter\pgffor@body\expandafter{\pgffor@body#1;}%
+ \pgffor@iterate%
+}
+
+{
+ \catcode`\;=\active
+
+ \gdef\pgffor@collectactivesemicolon#1;{%
+ \expandafter\long\expandafter\def\expandafter\pgffor@body\expandafter{\pgffor@body#1;}%
+ \pgffor@iterate%
+ }
+}
+
+\def\pgffor@iterate{%
+ % Must do all of these in case the internal stack is used.
+ \let\pgffor@last=\pgfutil@empty%
+ \let\pgffor@prevlast=\pgfutil@empty%
+ \let\pgffor@dotsend=\pgfutil@empty%
+ \let\pgffor@dots@pre=\pgfutil@empty%
+ \let\pgffor@dots@post=\pgfutil@empty%
+ %
+ \expandafter\pgffor@scan\pgffor@values}
+
+\def\pgffor@stop{\pgffor@stop}%
+\def\pgffor@dots{...}%
+
+\def\pgffor@scan{\pgfutil@ifnextchar({\pgffor@scanround}{\pgffor@scanone}}
+\def\pgffor@scanround(#1)#2,{\def\pgffor@value{(#1)#2}\pgffor@scanned}
+\def\pgffor@scanone#1,{\def\pgffor@value{#1}\pgffor@scanned}
+
+
+% Check for dots.
+\newif\ifpgffor@dots@in@
+\def\pgffor@dots@in@#1...#2#3\pgffor@stop{%
+ \ifx\pgffor@dots@@#2%
+ \pgffor@dots@in@false%
+ \else%
+ \pgffor@dots@in@true%
+ \fi%
+}
+
+\def\pgffor@dots@@{\pgffor@dots@@}
+
+\def\pgffor@scanned{%
+ \ifx\pgffor@value\pgffor@stop%
+ \let\pgffor@next=\pgffor@after% Done!
+ \else%
+ % Check for dots. Quicker than \pgfutil@in@ and not suceptable
+ % to false-positives when a token sequence ends in a single full-stop.
+ \expandafter\pgffor@dots@in@\pgffor@value\pgffor@dots@...\pgffor@dots@@\pgffor@stop%
+ \ifpgffor@dots@in@%
+ \let\pgffor@next=\pgffor@handledots%
+ \else%
+ \let\pgffor@next=\pgffor@handlevalue%
+ \fi%
+ \ifpgffor@continue%
+ \else%
+ \let\pgffor@next=\pgffor@scan% Done!
+ \fi%
+ \fi%
+ \pgffor@next}
+
+
+\def\pgffor@after{%
+ \global\pgffor@continuetrue%
+ \pgffor@atendforeach%
+ \pgffor@afterhook}
+
+\def\pgffor@handlevalue{%
+ \let\pgffor@prevlast=\pgffor@last%
+ \let\pgffor@last=\pgffor@value%
+ \pgffor@invokebody%
+ \pgffor@scan%
+}
+
+
+\def\pgffor@invokebody{%
+ \pgffor@begingroup%
+ \expandafter\pgfutil@in@\expandafter/\expandafter{\pgffor@var}%
+ \ifpgfutil@in@%
+ \expandafter\def\expandafter\pgffor@valuerest\expandafter{\pgffor@value//\relax}%
+ \expandafter\pgffor@multiassign\pgffor@var/\pgffor@stop/\pgffor@stop/\relax%
+ \else%
+ \expandafter\expandafter\expandafter\def\expandafter\pgffor@var\expandafter{\pgffor@value}%
+ \fi%
+ % Execute assign once code.
+ \ifx\pgffor@assign@once@code\pgfutil@empty%
+ \else%
+ \pgffor@assign@once@code%
+ \fi%
+ % Execute assign before code.
+ \ifx\pgffor@assign@before@code\pgfutil@empty%
+ \else%
+ \pgffor@assign@before@code%
+ \fi%
+ %
+ \expandafter\expandafter\expandafter\pgffor@reset@hooks\expandafter\pgffor@beginhook\expandafter\pgffor@body\pgffor@endhook%
+ % Execute assign after code.
+ \ifx\pgffor@assign@after@code\pgfutil@empty%
+ \else%
+ \pgffor@assign@after@code%
+ \fi%
+ %
+ \pgffor@endgroup%
+}
+
+
+\def\pgffor@multiassign#1/#2/\relax{%
+ \def\pgffor@currentvar{#1}%
+ \def\pgffor@rest{#2}%
+ \ifx\pgffor@currentvar\pgffor@stop%
+ \let\pgffor@next=\relax%
+ \else%
+ \let\pgffor@next=\pgffor@multiassignrest%
+ \fi%
+ \pgffor@next%
+}
+
+\def\pgffor@multiassignrest{\expandafter\pgffor@multiassignfinal\pgffor@valuerest}
+\def\pgffor@multiassignfinal#1/#2/\relax{%
+ \def\pgffor@temp{#1}%
+ \ifx\pgffor@currentvar\pgffor@mainvar%
+ \ifpgffor@alphabeticsequence%
+ \pgffor@makealphabetic\pgffor@temp%
+ \fi%
+ \fi%
+ \def\pgffor@test{#2}%
+ \ifx\pgffor@test\pgfutil@empty%
+ \expandafter\def\expandafter\pgffor@valuerest\expandafter{\pgffor@temp//\relax}% repeat
+ \else%
+ \def\pgffor@valuerest{#2/\relax}%
+ \fi%
+ \expandafter\expandafter\expandafter\def\expandafter\pgffor@currentvar\expandafter{\pgffor@temp}%
+ %
+ \expandafter\pgffor@multiassign\pgffor@rest/\relax%
+}
+
+\def\pgffor@gobblespaces#1{\pgfutil@ifnextchar x{#1}{#1}}
+
+\def\pgffor@handledots{%
+ \pgffor@gobblespaces{\expandafter\pgffor@@handledots\pgffor@value\pgffor@@stop}%
+}
+
+\newif\ifpgffor@context
+
+\def\pgffor@@handledots#1...#2\pgffor@@stop{%
+ % Define the context if any.
+ \def\pgffor@dots@pre{#1}%
+ \def\pgffor@dots@post{#2}%
+ \def\pgffor@dots@stripcontext#1##1#2\pgffor@@stop{\def\pgffor@dotsvalue{##1}}%
+ \pgffor@contexttrue%
+ \ifx\pgffor@dots@pre\pgfutil@empty%
+ \ifx\pgffor@dots@post\pgfutil@empty%
+ \pgffor@contextfalse%
+ \def\pgffor@dots@stripcontext##1\pgffor@@stop{\def\pgffor@dotsvalue{##1}}%
+ \fi%
+ \fi%
+ \pgffor@gobblespaces{\pgffor@dotsscanend}%
+}
+
+\def\pgffor@dots@value@process#1{%
+ \expandafter\pgffor@dots@stripcontext#1\pgffor@@stop%
+ \expandafter\pgffor@dots@charcheck\pgffor@dotsvalue\pgffor@@stop%
+ \ifpgffor@alphabeticsequence
+ \else
+ \ifpgffor@assign@parse
+ \begingroup
+ \pgfkeys{/pgf/fpu/false/.try}%
+ \pgfmathparse{\pgffor@dotsvalue}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+ \let\pgffor@dotsvalue=\pgfmathresult
+ \fi
+ \fi
+ \let#1=\pgffor@dotsvalue%
+}
+
+\def\pgffor@dotsscanend#1,{%
+ \pgffor@alphabeticsequencefalse%
+ % Strip context and check for a character sequence.
+ \def\pgffor@dotsend{#1}%
+ \pgffor@dots@value@process{\pgffor@dotsend}%
+ %
+ \pgffor@dots@value@process{\pgffor@last}%
+ %
+ % calculate skip%
+ \ifx\pgffor@prevlast\pgfutil@empty%
+ \ifdim\pgffor@dotsend pt>\pgffor@last pt%
+ \pgffor@skip=1pt%
+ \else%
+ \pgffor@skip=-1pt%
+ \fi%
+ \else%
+ \pgffor@dots@value@process{\pgffor@prevlast}%
+ \pgffor@skip=\pgffor@last pt%
+ \pgffor@iter=\pgffor@prevlast pt%
+ \advance\pgffor@skip by-\pgffor@iter%
+ \fi%
+ \pgffor@iter=\pgffor@last pt%
+ % do loop
+ \pgffor@loop%
+}
+
+\def\pgffor@loop{%
+ \advance\pgffor@iter by\pgffor@skip%
+ \let\pgffor@next=\pgffor@doloop%
+ \ifdim\pgffor@skip<0pt%
+ \ifdim\pgffor@iter<\pgffor@dotsend pt%
+ \let\pgffor@next=\pgffor@endloop%
+ \fi%
+ \else%
+ \ifdim\pgffor@iter>\pgffor@dotsend pt%
+ \let\pgffor@next=\pgffor@endloop%
+ \fi%
+ \fi%
+ \ifpgffor@continue%
+ \else%
+ \let\pgffor@next=\pgffor@endloop% Done!
+ \fi%
+ \pgffor@next%
+}
+
+\def\pgffor@endloop{%
+ \pgffor@alphabeticsequencefalse%
+ \pgffor@scan%
+}
+
+{\catcode`\p=12\catcode`\t=12\gdef\Pgffor@geT#1pt{#1}}
+
+\def\pgffor@doloop{%
+ \pgffor@begingroup
+ \edef\pgffor@temp{\expandafter\Pgffor@geT\the\pgffor@iter}%
+ \edef\pgffor@incheck{{.0/}{\pgffor@temp/}}%
+ \expandafter\pgfutil@in@\pgffor@incheck%
+ \ifpgfutil@in@%
+ \expandafter\pgffor@strip\pgffor@temp%
+ \fi%
+ \expandafter\pgfutil@in@\expandafter/\expandafter{\pgffor@var}%
+ \ifpgfutil@in@%
+ \expandafter\def\expandafter\pgffor@valuerest\expandafter{\pgffor@temp//\relax}%
+ \expandafter\pgffor@multiassign\pgffor@var/\pgffor@stop/\pgffor@stop/\relax%
+ \else%
+ % Convert to alphabetic sequence, if necessary.
+ \ifpgffor@alphabeticsequence%
+ \pgffor@makealphabetic\pgffor@temp%
+ \expandafter\let\pgffor@var=\pgffor@temp%
+ \else%
+ \expandafter\expandafter\expandafter\def\expandafter\pgffor@var\expandafter{\pgffor@temp}%
+ \fi%
+ \fi%
+ % Insert any context, if any.
+ \ifpgffor@context%
+ \let\pgffor@temp=\pgffor@dots@pre%
+ \expandafter\pgfutil@append@macrotomacro\expandafter%
+ {\expandafter\pgffor@temp\expandafter}\expandafter{\pgffor@var}%
+ \expandafter\pgfutil@append@macrotomacro\expandafter%
+ {\expandafter\pgffor@temp\expandafter}\expandafter{\pgffor@dots@post}%
+ \expandafter\let\pgffor@var=\pgffor@temp%
+ \fi%
+ % Perform assignments before loop body.
+ \ifx\pgffor@assign@before@code\pgfutil@empty%
+ \else%
+ \pgffor@assign@before@code%
+ \fi%
+ %
+ \expandafter\expandafter\expandafter\pgffor@reset@hooks\expandafter\pgffor@beginhook\expandafter\pgffor@body\pgffor@endhook%
+ %
+ % Perform assignments after loop body.
+ \ifx\pgffor@assign@after@code\pgfutil@empty%
+ \else%
+ \pgffor@assign@after@code%
+ \fi%
+ \pgffor@endgroup%
+ \pgffor@loop%
+}
+
+\def\pgffor@strip#1.0{\def\pgffor@temp{#1}}
+
+\def\breakforeach{\global\pgffor@continuefalse}
+
+\def\pgffor@gobbletil@pgffor@@stop#1\pgffor@@stop{}
+
+
+\newif\ifpgffor@registeriscount
+
+\def\pgffor@ifcsregister#1{%
+ \expandafter\pgffor@@ifcsregister\meaning#1\pgffor@stop}
+
+\def\pgffor@@ifcsregister#1#2#3#4#5\pgffor@stop{%
+ \if#1m% It is an ordinary (m)acro.
+ \pgffor@registeriscountfalse%
+ \let\pgffor@csnext=\pgfutil@secondoftwo%
+ \else%
+ \if#1u% It is (u)ndefined.
+ \let\pgffor@csnext=\pgfutil@secondoftwo%
+ \pgffor@registeriscountfalse%
+ \else%
+ \let\pgffor@csnext=\pgfutil@firstoftwo%
+ \if#4u% It is a co(u)nt
+ \pgffor@registeriscounttrue%
+ \else% Assume it is a dimen or skip (bad assumption in the general case).
+ \pgffor@registeriscountfalse%
+ \let\pgffor@csnext=\pgfutil@firstoftwo%
+ \fi%
+ \fi%
+ \fi%
+ \pgffor@csnext}
+
+\newif\ifpgffor@alphabeticsequence
+
+%
+\def\pgffor@dots@charcheck#1\pgffor@@stop{%
+ \edef\pgffor@dots@charcheck@temp{#1}%
+ \expandafter\expandafter\expandafter\pgffor@@dotscharcheck\expandafter\meaning\pgffor@dots@charcheck@temp\pgffor@@stop%
+}
+\def\pgffor@@dotscharcheck#1#2\pgffor@@stop{%
+ \if#1t%
+ \afterassignment\pgffor@gobbletil@pgffor@@stop%
+ \expandafter\chardef\expandafter\pgffor@char\expandafter=\expandafter`\pgffor@dots@charcheck@temp\relax\pgffor@@stop%
+ \edef\pgffor@char{\the\pgffor@char}%
+ \ifnum\pgffor@char>64\relax% From A-Z?
+ \ifnum\pgffor@char<91\relax%
+ \let\pgffor@dotsvalue=\pgffor@char%
+ \pgffor@alphabeticsequencetrue%
+ \else%
+ \ifnum\pgffor@char>96\relax% From a-z?
+ \ifnum\pgffor@char<123\relax%
+ \let\pgffor@dotsvalue=\pgffor@char%
+ \pgffor@alphabeticsequencetrue%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+}
+
+\def\pgffor@makealphabetic#1{%
+ % Convert the number in the macro passed as #1 to a-z or A-Z.
+ \pgfutil@tempcnta=#1\relax%
+ \ifnum\pgfutil@tempcnta>95\relax%
+ \advance\pgfutil@tempcnta by-96\relax%
+ \edef#1{\pgffor@alpha\pgfutil@tempcnta}%
+ \else%
+ \advance\pgfutil@tempcnta by-64 %
+ \edef#1{\pgffor@Alpha\pgfutil@tempcnta}%
+ \fi%
+}
+
+\def\pgffor@Alpha#1{%
+ \ifcase#1\relax\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M%
+ \or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else?\fi%
+}
+
+\def\pgffor@alpha#1{%
+ \ifcase#1\relax\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
+ \or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else?\fi%
+}
+
+\newtoks\pgffor@toks
+
+\def\pgffor@addcstotoks#1{%
+ \expandafter\def\expandafter\pgffor@tokstemp\expandafter{\expandafter\def\expandafter#1\expandafter{#1}}%
+ \pgffor@@addcstotoks}
+
+\def\pgffor@addregtotoks#1{%
+ \expandafter\def\expandafter\pgffor@tokstemp\expandafter{\expandafter#1\expandafter=\the#1}%
+ \pgffor@@addcstotoks}
+
+\def\pgffor@addiftotoks#1{%
+ \begingroup%
+ \escapechar=-1\relax%
+ \expandafter\pgffor@@addiftotoks\string#1\pgffor@stop}
+\def\pgffor@@addiftotoks#1#2#3#4\pgffor@stop{%
+ \endgroup
+ \csname if#3#4\endcsname%
+ \expandafter\def\expandafter\pgffor@tokstemp\expandafter{\csname#3#4true\endcsname}%
+ \else%
+ \expandafter\def\expandafter\pgffor@tokstemp\expandafter{\csname#3#4false\endcsname}%
+ \fi%
+ \pgffor@@addcstotoks%
+}
+
+\def\pgffor@@addcstotoks{%
+ \expandafter\expandafter\expandafter\pgffor@toks\expandafter\expandafter\expandafter=%
+ \expandafter\expandafter\expandafter{\expandafter\pgffor@tokstemp\the\pgffor@toks}%
+}
+
+% Set up the pgffor scopes.
+
+\def\pgffor@atbeginforeach{%
+ \begingroup%
+}
+
+\def\pgffor@atendforeach{%
+ \global\edef\pgffor@remember@expanded{\pgffor@remember@code}%
+ \ifx\pgffor@remember@expanded\pgfutil@empty%
+ \else%
+ \pgffor@remember@expanded%
+ \global\let\pgffor@remember@expanded=\pgfutil@empty%
+ \fi%
+ \endgroup%
+}
+\def\pgffor@default@begingroup{%
+ \begingroup%
+}
+
+\let\pgffor@remember@once@expanded=\pgfutil@empty
+\let\pgffor@remember@expanded=\pgfutil@empty
+
+\def\pgffor@default@endgroup{%
+ \ifx\pgffor@remember@once@code\pgfutil@empty
+ \else
+ \xdef\pgffor@remember@once@expanded{\pgffor@remember@once@code}%
+ \fi
+ \ifx\pgffor@remember@code\pgfutil@empty
+ \else
+ \xdef\pgffor@remember@expanded{\pgffor@remember@code}%
+ \fi
+ \endgroup
+ %
+ \ifx\pgffor@remember@once@expanded\pgfutil@empty
+ \else
+ \pgffor@remember@once@expanded%
+ % \let\pgffor@assign@once@code=\pgfutil@empty % Not needed anymore? (CJ)
+ \global\let\pgffor@remember@once@expanded=\pgfutil@empty
+ \fi
+ \ifx\pgffor@assign@once@code\pgfutil@empty
+ \else
+ \global\let\pgffor@assign@once@code=\pgfutil@empty
+ \fi
+ %
+ \ifx\pgffor@remember@expanded\pgfutil@empty
+ \else
+ \pgffor@remember@expanded%
+ \global\let\pgffor@remember@expanded=\pgfutil@empty
+ \fi
+}
+
+\let\pgffor@begingroup=\pgffor@default@begingroup
+\let\pgffor@endgroup=\pgffor@default@endgroup
+
+
+\def\pgffor@stack@begingroup{%
+ \pgffor@toks={}%
+ \pgffor@addcstotoks{\pgffor@mainvar}%
+ \pgffor@addcstotoks{\pgffor@var}%
+ \pgffor@addcstotoks{\pgffor@body}%
+ %
+ \pgffor@addcstotoks{\pgffor@last}%
+ \pgffor@addcstotoks{\pgffor@prevlast}%
+ \pgffor@addcstotoks{\pgffor@dotsend}%
+ %
+ \pgffor@addcstotoks{\pgffor@assign@before@code}%
+ \pgffor@addcstotoks{\pgffor@assign@after@code}%
+ \pgffor@addcstotoks{\pgffor@remember@code}%
+ \pgffor@addcstotoks{\pgffor@remember@once@code}%
+ \pgffor@addcstotoks{\pgffor@dots@pre}%
+ \pgffor@addcstotoks{\pgffor@dots@post}%
+ %
+ \pgffor@addregtotoks{\pgffor@iter}%
+ \pgffor@addregtotoks{\pgffor@skip}%
+ %
+ \pgffor@addiftotoks{\ifpgffor@alphabeticsequence}%
+ \pgffor@addiftotoks{\ifpgffor@context}%
+ \expandafter\pgffor@stackpush\expandafter{\the\pgffor@toks}%
+}
+
+\def\pgffor@stack@endgroup{\pgffor@stackpop}
+
+% Keys stuff.
+
+\newif\ifpgffor@assign@evaluate
+\newif\ifpgffor@assign@once
+\newif\ifpgffor@assign@parse
+
+\pgfkeys{/pgf/foreach/.cd,
+ var/.code=\pgffor@var@add#1\pgffor@stop,
+ scope iterations/.code={
+ \csname if#1\endcsname%
+ \let\pgffor@begingroup=\pgffor@default@begingroup%
+ \let\pgffor@endgroup=\pgffor@default@endgroup%
+ \else%
+ \let\pgffor@begingroup=\pgffor@stack@begingroup%
+ \let\pgffor@endgroup=\pgffor@stack@endgroup%
+ \fi%
+ },
+ evaluate/.code=\pgffor@assign@evaluatetrue\pgffor@assign@oncefalse\pgffor@assign@parse{#1},%
+ assign/.code=\pgffor@assign@evaluatefalse\pgffor@assign@oncefalse\pgffor@assign@parse{#1},%
+ evaluate once/.code=\pgffor@assign@evaluatetrue\pgffor@assign@oncetrue\pgffor@assign@parse{#1},%
+ assign once/.code=\pgffor@assign@evaluatefalse\pgffor@assign@oncetrue\pgffor@assign@parse{#1},%
+ remember/.code=\pgffor@remember@parse{#1},%
+ count/.code=\pgffor@count@parse#1\pgffor@stop,
+ parse/.is if=pgffor@assign@parse,
+ parse/.default=false,
+}
+
+\def\pgffor@assign@parse#1{%
+ \pgfutil@in@;{#1}%
+ \ifpgfutil@in@%
+ \else%
+ \pgfutil@in@={#1}%
+ \fi%
+ \ifpgfutil@in@%
+ \pgffor@assign@@parse#1;\pgffor@stop;%
+ \else%
+ \pgffor@assign@parse@old#1\pgffor@stop%%
+ \fi%
+}
+
+\def\pgffor@stop{\pgffor@stop}
+\def\pgffor@assign@@parse#1;{%
+ \def\pgffor@test{#1}%
+ \ifx\pgffor@test\pgffor@stop%
+ \let\pgffor@next=\relax%
+ \else%
+ \let\pgffor@next=\pgffor@assign@@parse%
+ \ifx\pgffor@test\pgfutil@empty%
+ \else%
+ \pgfutil@in@={#1}%
+ \ifpgfutil@in@%
+ \pgffor@assign@@@parse#1\pgffor@stop%
+ \else%
+ \pgffor@assign@@@parse#1=#1\pgffor@stop%
+ \fi%
+ \fi%
+ \fi%
+ \pgffor@next}
+
+\def\pgffor@assign@@@parse#1=#2\pgffor@stop{%
+ \ifpgffor@assign@evaluate%
+ \ifpgffor@assign@once%
+ \pgfutil@append@tomacro{\pgffor@assign@once@code}{\pgfmathparse{#2}\let#1=\pgfmathresult}%
+ \pgfutil@append@tomacro{\pgffor@remember@once@code}{\noexpand\def\noexpand#1{#2}}%
+ \else
+ \pgfutil@append@tomacro{\pgffor@assign@before@code}{\pgfmathparse{#2}\let#1=\pgfmathresult}%
+ \fi%
+ \else%
+ \ifpgffor@assign@once%
+ \pgfutil@append@tomacro{\pgffor@assign@once@code}{\def#1{#2}}%
+ \pgfutil@append@tomacro{\pgffor@remember@once@code}{\noexpand\def\noexpand#1{#2}}%
+ \else
+ \pgfutil@append@tomacro{\pgffor@assign@before@code}{\def#1{#2}}%
+ \fi%
+ \fi%
+}
+
+\def\pgffor@assign@parse@old#1#2\pgffor@stop{%
+ \pgffor@assign@@parse@old#2\pgffor@stop as#1using #1\pgffor@@stop}
+
+\def\pgffor@assign@@parse@old#1as#2#3\pgffor@@stop{%
+ \pgffor@assign@@@parse@old{#2}#1#3\pgffor@stop\pgffor@@stop}
+
+\def\pgffor@assign@@@parse@old#1#2using #3\pgffor@stop#4\pgffor@@stop{%
+ \pgffor@assign@@@parse#1=#3\pgffor@stop}
+
+
+
+\def\pgffor@remember@parse#1{%
+ \pgfutil@in@ a{#1}% This matches the 'a' in 'as' or 'initially'.
+ \ifpgfutil@in@%
+ \pgffor@remember@parse@old#1\pgffor@stop%
+ \else%
+ \pgffor@remember@@parse#1;\pgffor@stop;%
+ \fi%
+}
+
+\def\pgffor@remember@@parse#1;{%
+ \def\pgffor@test{#1}%
+ \ifx\pgffor@test\pgffor@stop%
+ \let\pgffor@next=\relax%
+ \else%
+ \let\pgffor@next=\pgffor@remember@@parse%
+ \ifx\pgffor@test\pgfutil@empty%
+ \else%
+ \pgfutil@in@={#1}%
+ \ifpgfutil@in@%
+ \pgffor@remember@@@parse#1\pgffor@stop%
+ \else%
+ \pgffor@ifcsregister{#1}{%
+ \pgfutil@append@tomacro{\pgffor@remember@code}{\noexpand#1=\the#1\noexpand\relax}%
+ }%
+ {%
+ \pgfutil@append@tomacro{\pgffor@remember@code}{\noexpand\def\noexpand#1{#1}}%
+ }%
+ \fi%
+ \fi%
+ \fi%
+ \pgffor@next%
+}
+
+\def\pgffor@remember@@@parse#1=#2\pgffor@stop{%
+ \pgffor@ifcsregister{#2}{%
+ \pgfutil@append@tomacro{\pgffor@assign@after@code}{\expandafter\def\expandafter#1\expandafter{\the#2}}%
+ \pgfutil@append@tomacro{\pgffor@remember@code}{\noexpand\def\noexpand#1{#1}}%
+ }%
+ {%
+ \pgfutil@append@tomacro{\pgffor@assign@after@code}{\expandafter\def\expandafter#1\expandafter{#2}}%
+ \pgfutil@append@tomacro{\pgffor@remember@code}{\noexpand\def\noexpand#1{#1}}%
+ }%
+}
+
+\def\pgffor@remember@parse@old#1#2\pgffor@stop{%
+ \pgffor@remember@@parse@old#1#2\pgffor@stop as#1(initially )\pgffor@@stop}
+
+\def\pgffor@remember@@parse@old#1#2as#3#4\pgffor@@stop{%
+ \pgffor@remember@@@parse@old{#1}{#3}#2#4\pgffor@stop\pgffor@@stop}
+
+\def\pgffor@remember@@@parse@old#1#2#3(initially #4)#5\pgffor@stop#6\pgffor@@stop{%
+ \pgfutil@append@tomacro{\pgffor@assign@after@code}{\edef#2{#1}}%
+ \pgfutil@append@tomacro{\pgffor@remember@code}{\noexpand\def\noexpand#2{#2}}%
+ \def\pgffor@test{#4}%
+ \ifx\pgffor@test\pgfutil@empty%
+ \else%
+ \pgfutil@append@tomacro{\pgffor@assign@once@code}{\def#2{#4}}%
+ \fi%
+}
+
+\def\pgffor@count@parse#1#2\pgffor@stop{%
+ \pgffor@count@@parse#1#2\pgffor@stop from 1\pgffor@stop\pgffor@@stop}
+
+\def\pgffor@count@@parse#1#2from#3\pgffor@stop#4\pgffor@@stop{%
+ \pgfutil@append@tomacro\pgffor@remember@code{\noexpand\def\noexpand#1{#1}}%
+ \pgfutil@append@tomacro\pgffor@assign@before@code{\pgfmathparse{int(#1+1)}\let#1=\pgfmathresult}%
+ \pgfmathparse{int(#3-1)}\let#1=\pgfmathresult%
+}
+
+
+\def\pgfutil@append@macrotomacro#1#2{%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ #1\expandafter\expandafter\expandafter{\expandafter#1#2}}
+
+\def\pgfutil@append@tomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgffor.sty b/graphics/pgf/base/tex/pgffor.sty
new file mode 100644
index 0000000000..c0de8c134a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgffor.sty
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+\RequirePackage{pgfkeys}
+\RequirePackage{pgfmath}
+
+\input{pgffor.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgffor.tex b/graphics/pgf/base/tex/pgffor.tex
new file mode 100644
index 0000000000..15d6ea3421
--- /dev/null
+++ b/graphics/pgf/base/tex/pgffor.tex
@@ -0,0 +1,19 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\edef\pgfforatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfrcs.tex
+\input pgfkeys.code.tex
+\input pgffor.code.tex
+
+\catcode`\@=\pgfforatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfheaps.sty b/graphics/pgf/base/tex/pgfheaps.sty
new file mode 100644
index 0000000000..ed5a95c153
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfheaps.sty
@@ -0,0 +1,107 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfheaps.sty}
+
+\RequirePackage{pgf}
+
+\PackageWarning{pgfheaps}{This package is obsolete.}
+
+\ProcessOptions
+
+%
+% Package for drawing heap diagrams.
+%
+
+\newdimen\pgf@heapx
+\newdimen\pgf@heapy
+
+
+
+
+% Construct the path of a heap.
+%
+% #1 = Position of heap label.
+% #2 = Position of left base
+% #3 = Position of right base
+%
+% Example:
+%
+% \pgfheappath{\pgfxy(1,0)}{\pgfxy(-1,0)}{\pgfxy(1,0)}
+% \pgffill
+
+\def\pgfheappath#1#2#3{%
+ \pgfdiff{#2}{#3}%
+ \pgf@heapx=-.25\pgf@x%
+ \pgf@heapy=-.25\pgf@y%
+ \pgfmoveto{#2}%
+ \pgfbezier%
+ {\pgfpartway{0.5}{#2}{\pgfrelative{#1}{\pgfpoint{\pgf@heapx}{\pgf@heapy}}}}%
+ {\pgfrelative{#1}{\pgfpoint{\pgf@heapx}{\pgf@heapy}}}%
+ {#1}%
+ \pgf@heapx=-\pgf@heapx%
+ \pgf@heapy=-\pgf@heapy%
+ \pgfbezier%
+ {\pgfrelative{#1}{\pgfpoint{\pgf@heapx}{\pgf@heapy}}}%
+ {\pgfpartway{0.5}{#3}{\pgfrelative{#1}{\pgfpoint{\pgf@heapx}{\pgf@heapy}}}}%
+ {#3}%
+ \ignorespaces}
+
+
+% Draw a heap label.
+%
+% #1 = Position of heap label.
+% #2 = Label text.
+%
+% Example:
+%
+% \pgfheaplabel{\pgfxy(1,0)}{Class P}
+
+\def\pgfheaplabel#1#2{%
+ \setbox\pgf@hbox=\hbox{\pgfinterruptpicture#2\endpgfinterruptpicture}%
+ \pgf@heapy=\ht\pgf@hbox%
+ \pgfputat{\pgfrelative{#1}{\pgfpoint{0pt}{-2\pgf@heapy}}}{\pgfbox[center,base]{#2}}%
+ \ignorespaces}
+
+
+% Draw a labeled heap.
+%
+% #1 = Position of heap label.
+% #2 = Position of left base
+% #3 = Position of right base
+% #4 = Label text.
+%
+% Example:
+%
+% \pgfheaplabeled{\pgfxy(1,0)}{\pgfxy(-1,0)}{\pgfxy(1,0)}{Class P}
+
+\def\pgfheaplabeled#1#2#3#4{%
+ \pgfheaplabel{#1}{#4}%
+ \pgfheappath{#1}{#2}{#3}%
+ \pgfstroke%
+ \ignorespaces}
+
+
+
+% Draw a labeled heap.
+%
+% #1 = Height of the label
+% #2 = Left and right extension of the base.
+% #3 = Label text.
+%
+% Example:
+%
+% \pgfheaplabeledcentered{1cm}{1cm}{Class P}
+
+\def\pgfheaplabeledcentered#1#2#3{%
+ \pgfheaplabeled{\pgfpoint{0pt}{#1}}{\pgfpoint{-#2}{0pt}}{\pgfpoint{#2}{0pt}}{#3}\ignorespaces}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfint.code.tex b/graphics/pgf/base/tex/pgfint.code.tex
new file mode 100644
index 0000000000..8921ee5fbd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfint.code.tex
@@ -0,0 +1,126 @@
+% Copyright 2019 by Henri Menke
+%
+% 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.
+
+
+% Guard against reading twice
+\ifx\pgfintloaded\pgfutil@undefined
+ \let\pgfintloaded=\relax
+\else
+ \expandafter\endinput
+\fi
+
+% This module is pretty much a rip-off of the LaTeX3 l3int module for integer
+% calculations. Since PGF supports e-TeX now, we can make use of those
+% extended facilities.
+
+% In contrast to l3int we will just admit that integers are regular TeX \count
+% register and will not implement an extra "integer datatype".
+
+% Evaluate an integer expression using \numexpr
+\def\pgfinteval#1{\number\numexpr#1\relax}
+
+% Get the absolute value of an integer by stripping off a leading minus sign
+\def\pgfintabs#1{\number\expandafter\pgfint@abs\number\numexpr#1\relax}
+\def\pgfint@abs#1{\ifx-#1\else\expandafter#1\fi}
+
+% Minimum and maximum
+\def\pgfintmax#1#2{%
+ \number\expandafter\pgfint@minmax
+ \number\numexpr#1\expandafter;%
+ \number\numexpr#2;%
+ >
+}
+\def\pgfintmin#1#2{%
+ \number\expandafter\pgfint@minmax
+ \number\numexpr#1\expandafter;%
+ \number\numexpr#2;%
+ <
+}
+\def\pgfint@minmax#1;#2;#3{%
+ \ifnum#1#3#2
+ #1%
+ \else
+ #2%
+ \fi
+}
+
+% \numexpr has the annoying property to round divisions rather than truncating
+% (as you would expect for integer arithmetic). Therefore we need a truncating
+% division function.
+\def\pgfintdivtruncate#1#2{%
+ \number\numexpr\expandafter\pgfint@divtruncate
+ \number\numexpr#1\expandafter;%
+ \number\numexpr#2;%
+ \relax
+}
+\def\pgfint@divtruncate#1#2;#3#4;{%
+ \ifx0#1
+ 0%
+ \else
+ (#1#2%
+ \ifx-#1 +\else-\fi
+ (\ifx-#3 -\fi#3#4-1)/2%
+ )%
+ \fi
+ /#3#4%
+}
+
+% \pgfintdivtruncate always truncates the result which leads to a rounding
+% towards zero. Donald Knuth defines in TAoCP, Vol 1, 3rd Ed, Section 1.2.4
+% that the modulo operation is
+%
+% x mod y = x - y * floor(x/y)
+%
+% In contrast to truncated division, floored division always rounds towards
+% -inf, i.e. floor(1/2) = 0 and floor(-1/2) = -1. This is also how integer
+% division is done in Lua.
+\def\pgfintdivfloor#1#2{%
+ \number\numexpr\expandafter\pgfint@divfloor
+ \number\numexpr#1\expandafter;%
+ \number\numexpr#2;%
+ \relax
+}
+\def\pgfint@divfloor#1#2;#3#4;{%
+ \ifx0#1
+ 0%
+ \else
+ \ifnum
+ 0\ifx-#1\ifx#3-\else1\fi\fi
+ 0\ifx-#3\ifx#1-\else1\fi\fi
+ >0
+ \pgfint@@divfloor#1#2;#3#4;-+%
+ \else
+ \pgfint@@divfloor#1#2;#3#4;+-%
+ \fi
+ \fi
+ /#3#4%
+}
+\def\pgfint@@divfloor#1#2;#3#4;#5#6{%
+ (#1#2%
+ \ifx-#1 #5\else#6\fi
+ (\ifx-#3 -\fi#3#4#61)/2%
+ )%
+}
+
+% Round
+\def\pgfintdivround#1#2{\number\numexpr(#1)/(#2)\relax}
+
+% Modulo
+\def\pgfintmod#1#2{%
+ \number\numexpr\expandafter\pgfint@mod%
+ \number\numexpr#1\expandafter;%
+ \number\numexpr#2;%
+ \relax
+}
+\def\pgfint@mod#1;#2;{#1-(\pgfint@divfloor#1;#2;)*#2}
+
+% Setter function so we don't always have to write \pgfinteval
+\def\pgfintset#1#2{#1 \numexpr#2\relax}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfkeys.code.tex b/graphics/pgf/base/tex/pgfkeys.code.tex
new file mode 100644
index 0000000000..2f17652628
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfkeys.code.tex
@@ -0,0 +1,1125 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+
+% The files pgfkeys.code.tex and pgfkeysfiltered.code.tex are
+% perfectly self-contained, except that the catcode of @
+% should be made a letter.
+
+
+% Guard against reading twice
+\ifx\pgfkeysloaded\undefined
+ \let\pgfkeysloaded=\relax
+\else
+ \expandafter\endinput
+\fi
+
+% The purpose of this file is to provide a general settings engine that
+% works with all TeX formats and has no save-stack impact
+
+\def\pgfkeys@empty{}
+
+% This is useful:
+
+\ifx\PackageError\undefined
+ \def\pgfkeys@error#1{\errmessage{Package pgfkeys Error: #1}}%
+\else
+ \def\pgfkeys@error#1{\PackageError{pgfkeys}{#1}{}}%
+\fi
+
+\ifx\eTeXrevision\undefined%
+ \pgfkeys@error{PGF requires etex in extended mode}%
+ \csname @@end\expandafter\endcsname\expandafter\end%
+\fi
+
+\ifnum\eTeXversion<2
+ \pgfkeys@error{PGF requires etex version 2}%
+ \csname @@end\expandafter\endcsname\expandafter\end%
+\fi
+
+\expandafter\let\expandafter\pgfkeys@ifcsname\csname ifcsname\endcsname%
+
+% Set a key to a value
+%
+% #1 = key
+% #2 = tokens
+%
+% Description:
+%
+% This command sets the key to the given tokens. The tokens are stored as
+% is and can even contain things like #9.
+%
+% Keys are organized hierarchically using something similar to Unix
+% paths. Thus, a typically key might be called "/tikz/length" or
+% "/tikz/length dimension/.@cmd". Some keys starting with a dot are
+% special, so they should not be used as normal key names (they are
+% similar to Unix files starting with a dot -- you can use them, but
+% be careful).
+%
+% Keys are always local to the current TeX group.
+%
+% Example:
+%
+% \pgfkeyssetvalue{/tikz/length}{2cm-3cm}
+% \pgfkeyssetvalue{/algo/swap}{{#2}{#1}}
+
+\long\def\pgfkeyssetvalue#1#2{%
+ \pgfkeys@temptoks{#2}\expandafter\edef\csname pgfk@#1\endcsname{\the\pgfkeys@temptoks}%
+}
+
+\long\def\pgfkeyssetevalue#1#2{%
+ \pgfkeys@temptoks={#2}%
+ \pgfkeys@temptoks=\scantokens\expandafter{\expandafter{\the\pgfkeys@temptoks}}%
+ \expandafter\edef\csname pgfk@#1\expandafter\endcsname\expandafter{\the\pgfkeys@temptoks}%
+}
+
+% Add text to a key at the end
+%
+% #1 = key
+% #2 = a value to be added at the beginning
+% #3 = a value to be added at the end
+%
+% Description:
+%
+% This command adds #2 to the definition of the key. The key should
+% have been set previously using \pgfkeyssetvalue.
+%
+% Example:
+%
+% \pgfkeysaddvalue{/tikz/length}{}{-3cm}
+
+\long\def\pgfkeysaddvalue#1#2#3{%
+ {%
+ \toks0{#2}%
+ \pgfkeysifdefined{#1}
+ {\pgfkeys@temptoks\expandafter\expandafter\expandafter{\csname pgfk@#1\endcsname}}%
+ {\pgfkeys@temptoks{}}%
+ \toks1{#3}%
+ \xdef\pgfkeys@global@temp{\the\toks0 \the\pgfkeys@temptoks \the\toks1}% believe or don't: the spaces are important
+ }%
+ \pgfkeyslet{#1}\pgfkeys@global@temp%
+}
+
+
+
+% Makes a key equal a given code
+%
+% #1 = key
+% #2 = a code name
+%
+% Description:
+%
+% This command executes a \let command so that a key gets the same
+% value as the parameter #2.
+%
+% Keys are always local to the current TeX group.
+%
+% Example:
+%
+% \pgfkeyslet{/algo/swap}{\myswap}
+
+\def\pgfkeyslet#1#2{%
+ \expandafter\let\csname pgfk@#1\endcsname#2%
+}
+
+
+% Retrieve the code stored in a key into a code
+%
+% #1 = key
+% #2 = code
+%
+% Description:
+%
+% This command will set #2 to "point" to the value stored in the key.
+%
+% Example:
+%
+% \pgfkeysgetvalue{/tikz/swap}{\myswap}
+
+\def\pgfkeysgetvalue#1#2{\expandafter\let\expandafter#2\csname pgfk@#1\endcsname}
+
+
+
+% Retrieve the value stored in a key
+%
+% #1 = key
+%
+% Description:
+%
+% This command will expand to the value stored in the key. The key
+% should previously have been set using \pgfkeyasetkey or \pgfkeyslet.
+%
+% Example:
+%
+% The length is \pgfkeysvalue{/tikz/length}.
+
+\def\pgfkeysvalueof#1{\csname pgfk@#1\endcsname}
+
+
+
+% If for testing whether a key exists
+%
+% #1 = key
+% #2 = if-case
+% #3 = else-case
+%
+% Description:
+%
+% This if will be executed if the key exists. In eTeX mode this works
+% like a normal if, in normal TeX mode you need to provide an \else.
+%
+% Example:
+%
+% \pgfkeysifdefined{/tikz/length}{key exists}{does not exist}
+
+\long\def\pgfkeysifdefined#1#2#3{\pgfkeys@ifcsname pgfk@#1\endcsname#2\else#3\fi}
+
+% Tests whether a key is assignable. For standard keys which just
+% store their value, this is identical to \pgfkeysifdefined.
+%
+% But \pgfkeysifassignable is true for command keys as well (but not
+% for handled keys).
+\long\def\pgfkeysifassignable#1#2#3{%
+ \pgfkeysifdefined{#1}%
+ {#2}
+ {\pgfkeysifdefined{#1/.@cmd}%
+ {#2}%
+ {#3}}%
+}%
+
+
+
+% Execute settings
+%
+% #1 = list of settings
+%
+% Description:
+%
+% The list of settings should contain comma-separated settings. Each
+% setting has the following form:
+%
+% /path/key=value
+%
+% The parts "/path/" and "=value" are optional. When the path is not
+% specified, the value of the token register "\pgfkeypath" is used. If
+% "=value" is missing, the value of the setting "/path/key/.@def" is used
+% instead. If this key is set to "\pgfvaluerequired", the key
+% "/errors/value required/.@cmd" is executed. This error handler,
+% like all other error handlers, will get the current key as its first
+% parameter (unexpanded) and the current value as its second value
+% (also unexpanded).
+%
+% Any spaces at the beginning and at the end and around the
+% equals-sign are removed. The key with the complete path is set to
+% the code \pgfcurrentkey.
+%
+% The setting is then processed according to the following rules:
+%
+% 1) If the key /path/key/.@cmd" is present, its code is executed
+% with the value computed above, followed by \pgfeov (end of
+% value). So, to handle
+%
+% "/stuff/height= 1.5 ,"
+%
+% /stuff/height/.@cmd should be set to some code, that can
+% handle the parameter
+%
+% "1.5\pgfeov"
+%
+% For instance, saying
+%
+% \pgfkeys{/stuff/height/.@cmd}{#1\pgfeov}{\def\myheight{#1}}
+%
+% will do nicely.
+%
+% 2) Otherwise, if the key /path/key is present, this key is
+% set to the value computed above.
+%
+% 3) Otherwise, if the key /handlers/key/.@cmd is present, it is executed
+% with the same parameters as in 1). Additionally, the
+% token register \pgfcurrentkeypath will be set to "/path/" and the
+% macro \pgfcurrentkeywithoutpath to "key". So, in the above
+% example if neither "/stuff/height/.@cmd" nor
+% "/stuff/height" is present, but "/handlers/height" is,
+% then "/handlers/height" is executed with the parameters:
+%
+% "1.5\pgfeov"
+%
+% and \pgfcurrentkey is set to "/stuff/height" and \pgfcurrentkeypath
+% is set to "/stuff/" and \pgfcurrentkeywithoutpath to "height".
+%
+% 4) Otherwise, if the key "/path/.unknown/.@cmd" is present, its code is
+% executed with the same parameters as in 3).
+%
+% 5) Otherwise, the key "/handlers/.unknown/.@cmd" is executed with the same
+% parameters as in 1).
+%
+% After all settings have been processed, the value of the token
+% register \pgfdefaultkeypath is set to its original value. Thus, any local
+% change of this token register has no effect outside the call.
+%
+% Example:
+%
+% \pgfkeys{/tikz/.is family}
+% \pgfkeys{/tikz/line width/.cd,
+% .def=\pgfsetlinewidth{##1},
+% .set default=.4pt}
+% \pgfkeys{tikz,line width=1pt}
+
+\newtoks\pgfkeys@pathtoks
+\def\pgfkeyscurrentpath{\the\pgfkeys@pathtoks}
+\newtoks\pgfkeys@temptoks
+
+\def\pgfkeys@root{/}
+\let\pgfkeysdefaultpath\pgfkeys@root
+
+\def\pgfkeys{\expandafter\pgfkeys@@set\expandafter{\pgfkeysdefaultpath}}%
+\long\def\pgfkeys@@set#1#2{%
+ \let\pgfkeysdefaultpath\pgfkeys@root%
+ \pgfkeys@parse#2,\pgfkeys@mainstop%
+ \def\pgfkeysdefaultpath{#1}}
+
+\def\pgfkeys@parse{\futurelet\pgfkeys@possiblerelax\pgfkeys@parse@main}
+\def\pgfkeys@parse@main{%
+ \ifx\pgfkeys@possiblerelax\pgfkeys@mainstop%
+ \expandafter\pgfkeys@cleanup%
+ \else%
+ \expandafter\pgfkeys@normal%
+ \fi%
+}
+\newif\ifpgfkeys@syntax@handlers
+\def\pgfkeys@normal{%
+ \ifpgfkeys@syntax@handlers%
+ \expandafter\pgfkeys@syntax@handlers%
+ \else%
+ \expandafter\pgfkeys@@normal%
+ \fi%
+}
+\def\pgfkeys@syntax@handlers{\pgf@keys@utilifnextchar\relax\pgfkeys@syntax@@handlers\pgfkeys@syntax@@handlers}%get rid of spaces
+\def\pgfkeys@syntax@@handlers{\futurelet\pgfkeys@first@char\pgfkeys@syntax@handlers@test}
+\def\pgfkeys@syntax@handlers@test{%
+ \pgfkeysgetvalue{/handlers/first char syntax/\meaning\pgfkeys@first@char}\pgfkeys@the@handler%
+ \ifx\pgfkeys@the@handler\relax%
+ \expandafter\pgfkeys@@normal%
+ \else%
+ \expandafter\pgfkeys@use@handler%
+ \fi%
+}
+\long\def\pgfkeys@use@handler#1,{%
+ \pgfkeys@the@handler{#1}%
+ \pgfkeys@parse%
+}
+
+\long\def\pgfkeys@@normal#1,{%
+ \pgfkeys@unpack#1=\pgfkeysnovalue=\pgfkeys@stop%
+ \pgfkeys@parse%
+}
+\def\pgfkeys@cleanup\pgfkeys@mainstop{}
+
+\def\pgfkeys@mainstop{\pgfkeys@mainstop} % equals only itself
+\def\pgfkeys@novalue{}
+\def\pgfkeysnovalue{\pgfkeys@novalue} % equals only itself
+\def\pgfkeysnovalue@text{\pgfkeysnovalue}
+\def\pgfkeysvaluerequired{\pgfkeysvaluerequired} % equals only itself
+
+\long\def\pgfkeys@unpack#1=#2=#3\pgfkeys@stop{%
+ \pgfkeys@spdef\pgfkeyscurrentkey{#1}%
+ \edef\pgfkeyscurrentkey{\pgfkeyscurrentkey}%
+ \ifx\pgfkeyscurrentkey\pgfkeys@empty%
+ % Skip
+ \else%
+ \pgfkeys@add@path@as@needed%
+ \pgfkeys@spdef\pgfkeyscurrentvalue{#2}%
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% Hmm... no value
+ \pgfkeysifdefined{\pgfkeyscurrentkey/.@def}%
+ {\pgfkeysgetvalue{\pgfkeyscurrentkey/.@def}{\pgfkeyscurrentvalue}}
+ {}% no default, so leave it
+ \fi%
+ \ifx\pgfkeyscurrentvalue\pgfkeysvaluerequired%
+ \def\pgf@marshal{\pgfkeysvalueof{/errors/value required/.@cmd}}%
+ \expandafter\pgf@marshal\expandafter{\pgfkeyscurrentkey}{}\pgfeov%
+ \else%
+ \pgfkeys@case@one%
+ \fi%
+ \fi}
+
+\def\pgfkeys@case@one{%
+ \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}%
+ {\pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov}
+ {\pgfkeys@case@two}%
+}
+
+\def\pgfkeys@case@two{%
+ \pgfkeysifdefined{\pgfkeyscurrentkey}%
+ {\pgfkeys@case@two@extern}%
+ {\pgfkeys@case@three}%
+}
+
+\def\pgfkeys@case@two@extern{%
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text%
+ \pgfkeysvalueof{\pgfkeyscurrentkey}%
+ \else%
+ \pgfkeyslet{\pgfkeyscurrentkey}\pgfkeyscurrentvalue%
+ \fi%
+}
+
+
+% either handled key or unknown.
+%
+% This macro will be replaced by the /handler config/handle only existing
+% configuration, see below.
+\def\pgfkeys@case@three{%
+ \pgfkeys@split@path%
+ \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}%
+ {\pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov}
+ {\pgfkeys@unknown}%
+}
+\let\pgfkeys@case@three@handleall=\pgfkeys@case@three
+\def\pgfkeys@case@three@handle@restricted{%
+ \pgfkeys@split@path%
+ \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{%
+ \pgfkeys@ifexecutehandler{%
+ \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov
+ }{%
+ % this here is necessary: /my search path/key/.code
+ % won't be called, so \pgfkeyscurrentpath == '/my search path/key'
+ % -> it should be one directory higher! We want to invoke the
+ % .unknown handler in
+ % '/my search path'
+ %
+ % Idea:
+ % set
+ % - path := '/my search path'
+ % - name := 'key/.code'
+ % - key = '/my search path/key/.code'
+ \let\pgfkeys@temp=\pgfkeyscurrentkey
+ \let\pgfkeys@tempb=\pgfkeyscurrentname
+ \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}%
+ \pgfkeys@split@path%
+ \let\pgfkeyscurrentkey=\pgfkeys@temp
+ \edef\pgfkeyscurrentname{\pgfkeyscurrentname/\pgfkeys@tempb}%
+ \pgfkeys@unknown
+ }%
+ }{%
+ \pgfkeys@unknown
+ }%
+}
+
+% this macro is to implement the |handle only existing| key in key filtering:
+% #1: the code to invoke IF the key handler shall be executed
+% #2: the code to invoke if it shall not run.
+\def\pgfkeys@ifexecutehandler#1#2{#1}%
+\let\pgfkeys@ifexecutehandler@handleall=\pgfkeys@ifexecutehandler
+\def\pgfkeys@ifexecutehandler@handleonlyexisting#1#2{%
+ \pgfkeys@ifcsname pgfk@excpt@\pgfkeyscurrentname\endcsname%
+ #1% ok, this particular key handler is known and should be processed in any case (for example .try)
+ \else
+ % implement the 'only existing' feature here:
+ \pgfkeysifdefined{\pgfkeyscurrentpath}{#1}{%
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}{#1}{#2}%
+ }{}%
+ \fi%
+}%
+\def\pgfkeys@ifexecutehandler@handlefullorexisting#1#2{%
+ \ifpgfkeysaddeddefaultpath
+ \pgfkeys@ifcsname pgfk@excpt@\pgfkeyscurrentname\endcsname%
+ #1% ok, this particular key handler is known and be processed in any case (for example .try)
+ \else
+ % implement the 'only existing' feature here:
+ \pgfkeysifdefined{\pgfkeyscurrentpath}{%
+ #1%
+ }{%
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}{%
+ #1%
+ }{%
+ #2%
+ }%
+ }%
+ \fi%
+ \else
+ #1% ok, always true if the USER explicitly provided the full key path.
+ \fi
+}%
+\def\pgfkeysaddhandleonlyexistingexception#1{\expandafter\def\csname pgfk@excpt@#1\endcsname{1}}%
+
+\def\pgfkeys@unknown{%
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.unknown/.@cmd}%
+ {%
+ \pgfkeysgetvalue{\pgfkeyscurrentpath/.unknown/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov}
+ {%
+ \pgfkeysgetvalue{/handlers/.unknown/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov%
+ }%
+}
+
+
+\long\def\pgfkey@argumentisspace#1{%
+ \long\def\pgfkeys@spdef##1##2{%
+ \futurelet\pgfkeys@possiblespace\pgfkeys@sp@a##2\pgfkeys@stop\pgfkeys@stop#1\pgfkeys@stop\relax##1}%
+ \def\pgfkeys@sp@a{%
+ \ifx\pgfkeys@possiblespace\pgfkeys@sptoken%
+ \expandafter\pgfkeys@sp@b%
+ \else%
+ \expandafter\pgfkeys@sp@b\expandafter#1%
+ \fi}%
+ \long\def\pgfkeys@sp@b#1##1 \pgfkeys@stop{\pgfkeys@sp@c##1}%
+}
+\pgfkey@argumentisspace{ }
+\long\def\pgfkeys@sp@c#1\pgfkeys@stop#2\relax#3{\pgfkeys@temptoks{#1}\edef#3{\the\pgfkeys@temptoks}}
+{\def\:{\global\let\pgfkeys@sptoken= } \: }
+
+
+
+\def\pgfkeys@add@path@as@needed{% Should add the path if the
+ % \pgfkeyscurrentkey does not start with /
+ \expandafter\futurelet\expandafter\pgfkeys@possibleslash\expandafter\pgfkeys@check@slash\pgfkeyscurrentkey\relax%
+}
+\newif\ifpgfkeysaddeddefaultpath
+\def\pgfkeys@check@slash{%
+ \ifx\pgfkeys@possibleslash/%
+ \expandafter\pgfkeys@nevermind%
+ \else%
+ \expandafter\pgfkeys@addpath%
+ \fi%
+}
+
+\def\pgfkeys@nevermind#1\relax{%
+ \pgfkeysaddeddefaultpathfalse
+ \let\pgfkeyscurrentkeyRAW\pgfkeyscurrentkey
+}
+\def\pgfkeys@addpath#1\relax{%
+ \pgfkeysaddeddefaultpathtrue
+ \def\pgfkeyscurrentkeyRAW{#1}%
+ \edef\pgfkeyscurrentkey{\pgfkeysdefaultpath#1}%
+}
+
+
+\def\pgfkeys@split@path{% Should assign the two codes
+ % \pgfkeyscurrentname and \pgfcurrentlkeypath
+ \pgfkeys@pathtoks{}%
+ \expandafter\pgfkeys@splitter\pgfkeyscurrentkey//%
+}
+\def\pgfkeys@splitter#1/#2/{%
+ \def\pgfkeys@temp{#2}%
+ \ifx\pgfkeys@temp\pgfkeys@empty%
+ % Ah. done
+ \def\pgfkeyscurrentname{#1}%
+ \expandafter\pgfkeys@gobbletoslash%
+ \else%
+ \expandafter\pgfkeys@pathtoks\expandafter{\the\pgfkeys@pathtoks#1/}%
+ \fi%
+ \pgfkeys@splitter#2/%
+}
+\def\pgfkeys@gobbletoslash\pgfkeys@splitter/{%
+ \if\relax\detokenize\expandafter{\the\pgfkeys@pathtoks}\relax\else
+ \expandafter\pgfkeys@remove@slash\the\pgfkeys@pathtoks\relax
+ \fi
+}%
+\def\pgfkeys@remove@slash#1/\relax{\pgfkeys@pathtoks{#1}}
+
+
+
+% Quickly set keys
+%
+% #1 = default path
+% #2 = key-value pairs
+%
+% Description:
+%
+% This command starts the execution with the default path set to
+% #1. This command should only be used when speed is important (like
+% in a heavily used macro like \tikzset). Normally, keys should be
+% used to set the path. Note that if #1 equals /, then \pgfkeys will
+% actually be quicker!
+%
+% Example:
+%
+% \pgfqkeys{/tikz}{myother length/.code=\def\myotherlength{#1}\pgfkeysalso{length=#1}}
+
+\def\pgfqkeys{\expandafter\pgfkeys@@qset\expandafter{\pgfkeysdefaultpath}}%
+\long\def\pgfkeys@@qset#1#2#3{\def\pgfkeysdefaultpath{#2/}\pgfkeys@parse#3,\pgfkeys@mainstop\def\pgfkeysdefaultpath{#1}}
+
+
+% Sets keys while setting keys
+%
+% #1 = key-value pairs
+%
+% Description:
+%
+% This code may only be called inside the code that is executed for a
+% key. The #1 should be a list of settings pairs. They will be executed
+% as if they had been given as the argument to the \pgfkeys command.
+%
+% Example:
+%
+% \pgfkeys{tikz,myother length/.code=\def\myotherlength{#1}\pgfkeysalso{length=#1}}
+
+\long\def\pgfkeysalso#1{\pgfkeys@parse#1,\pgfkeys@mainstop}
+
+
+
+% Quickly sets keys while setting keys
+%
+% #1 = default path
+% #2 = key-value pairs
+%
+% Description:
+%
+% This command executes #2 with the default path set to #1. This
+% command will cause chaos if used incorrectly. The only safe
+% place to use it instead of \pgfkeys is at the beginning of a TeX group.
+%
+% Example:
+%
+% \begingroup
+% \pgfqkeysalso{/tikz}{myother length/.code=\def\myotherlength{#1}\pgfkeysalso{length=#1}}
+
+\long\def\pgfqkeysalso#1#2{\def\pgfkeysdefaultpath{#1/}\pgfkeys@parse#2,\pgfkeys@mainstop}
+
+
+
+
+% Now setup the default handlers and keys:
+
+% Define a key macro with one argument (\def or \edef)
+%
+% #1 = key
+% #2 = code
+%
+% Description:
+%
+% This command will setup things so the key/.@cmd contains a macro
+% that takes one parameter and has #2 as its code.
+%
+% Example:
+%
+% \pgfkeysdef{/my key}{\show#1}
+
+\long\def\pgfkeysdef#1#2{%
+ \long\def\pgfkeys@temp##1\pgfeov{#2}%
+ \pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}%
+ \pgfkeyssetvalue{#1/.@body}{#2}%
+}
+\long\def\pgfkeysedef#1#2{%
+ \long\edef\pgfkeys@temp##1\pgfeov{#2}%
+ \pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}%
+ \pgfkeyssetevalue{#1/.@body}{#2}%
+}
+
+
+% Define a key macro with multiple arguments (\def or \edef)
+%
+% #1 = key
+% #2 = argument pattern
+% #2 = code
+%
+% Description:
+%
+% This command will setup things so the key/.@cmd contains a macro
+% that takes #2 as its parameter pattern and has #3 as its code.
+%
+% Example:
+%
+% \pgfkeysdefargs{/swap}{#1#2}{#2#1}
+
+\long\def\pgfkeysdefargs#1#2#3{%
+ \long\def\pgfkeys@temp#2\pgfeov{#3}%
+ \pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}%
+ \pgfkeyssetvalue{#1/.@args}{#2\pgfeov}%
+ \pgfkeyssetvalue{#1/.@body}{#3}%
+}
+
+\long\def\pgfkeysedefargs#1#2#3{%
+ \long\edef\pgfkeys@temp#2\pgfeov{#3}%
+ \pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}%
+ \pgfkeyssetvalue{#1/.@args}{#2\pgfeov}%
+ \pgfkeyssetevalue{#1/.@body}{#3}%
+}
+
+% Like \pgfkeysdefargs, but `#2' is an integer denoting the expected
+% *number* of arguments.
+%
+% There is a subtle difference between the 'args' command, when it
+% comes to spaces:
+% a key defined with defargs{#1#2} must not have spaces between the
+% arguments when it is used.
+%
+% See this:
+%
+%--------------------------------------------------
+% % defnargs:
+% \pgfkeysdefnargs{/a}{2}{1=`#1', 2=`#2'}
+% \pgfkeys{
+% /a=
+% {1}
+% {2}
+% }
+% ->defnargs: 1=`1', 2=`2'
+%
+% defargs:
+% \pgfkeysdefargs{/b}{#1#2}{1=`#1', 2=`#2'}
+% \pgfkeys{
+% /b=
+% {1}
+% {2}
+% }
+% ->defargs: 1=`1', 2=` 2' (note the space!)
+%
+% defargs:
+% \pgfkeysdefargs{/b}{#1#2}{1=`#1', 2=`#2'}
+% \pgfkeys{
+% /b=
+% {1}%
+% {2}
+% }
+% ->defargs: 1=`1', 2=`2'
+% --------------------------------------------------
+\long\def\pgfkeysdefnargs#1#2#3{\pgfkeysdefnargs@{#1}{#2}{#3}{\def}{\pgfkeyssetvalue}}%
+\long\def\pgfkeysedefnargs#1#2#3{\pgfkeysdefnargs@{#1}{#2}{#3}{\edef}{\pgfkeyssetevalue}}%
+\long\def\pgfkeysdefnargs@#1#2#3#4#5{%
+ \ifcase#2\relax
+ \pgfkeyssetvalue{#1/.@args}{}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3##4}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7##8}%
+ \or
+ \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7##8##9}%
+ \else
+ \pgfkeys@error{\string\pgfkeysdefnargs: expected <= 9 arguments, got #2}%
+ \fi
+ \pgfkeysgetvalue{#1/.@args}\pgfkeys@tempargs
+ \def\pgfkeys@temp{\expandafter\long\expandafter#4\csname pgfk@#1/.@@body\endcsname}%
+ \expandafter\pgfkeys@temp\pgfkeys@tempargs{#3}%
+ % eliminate the \pgfeov at the end such that TeX gobbles spaces
+ % by using
+ % \pgfkeysdef{#1}{\pgfkeysvalueof{#1/.@@body}##1}
+ % (with expansion of '#1'):
+ \edef\pgfkeys@tempargs{\noexpand\pgfkeysvalueof{#1/.@@body}}%
+ \def\pgfkeys@temp{\pgfkeysdef{#1}}%
+ \expandafter\pgfkeys@temp\expandafter{\pgfkeys@tempargs##1}%
+ #5{#1/.@body}{#3}%
+}
+
+% Defining a key command
+
+\pgfkeysdef{/handlers/.code}{\pgfkeysdef{\pgfkeyscurrentpath}{#1}}
+\pgfkeysdef{/handlers/.code 2 args}{\pgfkeysdefargs{\pgfkeyscurrentpath}{##1##2}{#1}}
+\pgfkeysdef{/handlers/.ecode}{\pgfkeysedef{\pgfkeyscurrentpath}{#1}}
+\pgfkeysdef{/handlers/.ecode 2 args}{\pgfkeysedefargs{\pgfkeyscurrentpath}{##1##2}{#1}}
+\pgfkeysdefnargs{/handlers/.code args}{2}{\pgfkeysdefargs{\pgfkeyscurrentpath}{#1}{#2}}
+\pgfkeysdefnargs{/handlers/.ecode args}{2}{\pgfkeysedefargs{\pgfkeyscurrentpath}{#1}{#2}}
+\pgfkeysdefnargs{/handlers/.code n args}{2}{\pgfkeysdefnargs{\pgfkeyscurrentpath}{#1}{#2}}
+\pgfkeysdefnargs{/handlers/.ecode n args}{2}{\pgfkeysedefnargs{\pgfkeyscurrentpath}{#1}{#2}}
+
+% Adding to a key command
+
+\pgfkeys{/handlers/.add code/.code 2 args=%
+ % Find out, whether with args or not.
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@args}%
+ {% Yes, so add to body and reuse args
+ \pgfkeysaddvalue{\pgfkeyscurrentpath/.@body}{#1}{#2}%
+ % Redefine code
+ {%
+ \pgfkeysgetvalue{\pgfkeyscurrentpath/.@args}{\pgfkeys@tempargs}%
+ \pgfkeysgetvalue{\pgfkeyscurrentpath/.@body}{\pgfkeys@tempbody}%
+ \def\pgfkeys@marshal{\expandafter\gdef\expandafter\pgfkeys@global@temp\pgfkeys@tempargs}%
+ \expandafter\pgfkeys@marshal\expandafter{\pgfkeys@tempbody}%
+ }%
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@@body}{%
+ % support for \pgfkeysndefargs:
+ \pgfkeyslet{\pgfkeyscurrentpath/.@@body}{\pgfkeys@global@temp}%
+ }{%
+ % support for \pgfkeysdefargs:
+ \pgfkeyslet{\pgfkeyscurrentpath/.@cmd}{\pgfkeys@global@temp}%
+ }%
+ }%
+ {%
+ % No, so single argument (simple \pgfkeysdef). Redefine accordingly.
+ \edef\pgf@expanded@path{\pgfkeyscurrentpath}%
+ {%
+ \toks0{#1}%
+ \pgfkeysifdefined{\pgf@expanded@path/.@cmd}%
+ {\expandafter\expandafter\expandafter\pgfkeys@temptoks\expandafter\expandafter\expandafter{\csname pgfk@\pgf@expanded@path/.@body\endcsname}}%
+ {\expandafter\pgfkeys@temptoks\expandafter{\expandafter\pgfkeyssetvalue\expandafter{\pgf@expanded@path}{##1}}}%
+ \toks1{#2}%
+ \xdef\pgfkeys@global@temp{\the\toks0 \the\pgfkeys@temptoks \the\toks1 }%
+ }%
+ \def\pgf@temp{\pgfkeyssetvalue{\pgf@expanded@path/.@body}}%
+ \expandafter\pgf@temp\expandafter{\pgfkeys@global@temp}%
+ \expandafter\long\expandafter\def\expandafter\pgfkeys@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}%
+ \pgfkeyslet{\pgf@expanded@path/.@cmd}\pgfkeys@temp%
+ }%
+}
+\pgfkeys{/handlers/.prefix code/.code=\pgfkeys{\pgfkeyscurrentpath/.add code={#1}{}}}%
+\pgfkeys{/handlers/.append code/.code=\pgfkeys{\pgfkeyscurrentpath/.add code={}{#1}}}%
+
+
+% Defining a style
+
+\pgfkeys{/handlers/.style/.code=\pgfkeys{\pgfkeyscurrentpath/.code=\pgfkeysalso{#1}}}
+\pgfkeys{/handlers/.estyle/.code=\pgfkeys{\pgfkeyscurrentpath/.ecode=\noexpand\pgfkeysalso{#1}}}
+\pgfkeys{/handlers/.style args/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.code args={#1}{\pgfkeysalso{#2}}}}
+\pgfkeys{/handlers/.estyle args/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.ecode args={#1}{\noexpand\pgfkeysalso{#2}}}}
+\pgfkeys{/handlers/.style 2 args/.code=\pgfkeys{\pgfkeyscurrentpath/.code 2 args=\pgfkeysalso{#1}}}
+\pgfkeys{/handlers/.style n args/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.code n args={#1}{\pgfkeysalso{#2}}}}
+
+% Adding to a style
+
+\pgfkeys{/handlers/.add style/.code 2 args=\pgfkeys{\pgfkeyscurrentpath/.add code={\pgfkeysalso{#1}}{\pgfkeysalso{#2}}}}%
+\pgfkeys{/handlers/.prefix style/.code=\pgfkeys{\pgfkeyscurrentpath/.add code={\pgfkeysalso{#1}}{}}}%
+\pgfkeys{/handlers/.append style/.code=\pgfkeys{\pgfkeyscurrentpath/.add code={}{\pgfkeysalso{#1}}}}%
+
+
+% Defining a value
+
+\pgfkeys{/handlers/.initial/.code=\pgfkeyssetvalue{\pgfkeyscurrentpath}{#1}}
+\pgfkeys{/handlers/.add/.code 2 args=\pgfkeysaddvalue{\pgfkeyscurrentpath}{#1}{#2}}
+\pgfkeys{/handlers/.prefix/.code=\pgfkeysaddvalue{\pgfkeyscurrentpath}{#1}{}}
+\pgfkeys{/handlers/.append/.code=\pgfkeysaddvalue{\pgfkeyscurrentpath}{}{#1}}
+\pgfkeys{/handlers/.get/.code=\pgfkeysgetvalue{\pgfkeyscurrentpath}{#1}}
+\pgfkeys{/handlers/.link/.code=\pgfkeyssetvalue{\pgfkeyscurrentpath}{\pgfkeysvalueof{#1}}}
+
+
+% Defining a default
+
+\pgfkeys{/handlers/.default/.code=\pgfkeyssetvalue{\pgfkeyscurrentpath/.@def}{#1}}
+\pgfkeys{/handlers/.value required/.code=\pgfkeyssetvalue{\pgfkeyscurrentpath/.@def}{\pgfkeysvaluerequired}}
+\pgfkeys{/handlers/.value forbidden/.code=\pgfkeys{\pgfkeyscurrentpath/.add code=%
+{%
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text%
+ \else%
+ \def\pgf@marshal{\pgfkeysvalueof{/errors/value forbidden/.@cmd}}%
+ \expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkey\expandafter}\expandafter{\pgfkeyscurrentvalue}\pgfeov%
+ \fi%
+}{}}}
+
+
+% High-level cmds
+
+\pgfkeys{/handlers/.store in/.code=\pgfkeysalso{\pgfkeyscurrentpath/.code=\def#1{##1}}}
+\pgfkeys{/handlers/.estore in/.code=\pgfkeysalso{\pgfkeyscurrentpath/.code=\edef#1{##1}}}
+
+\pgfkeys{/handlers/.is if/.code=\pgfkeysalso{%
+ \pgfkeyscurrentpath/.code=\pgfkeys@handle@boolean{#1}{##1},
+ \pgfkeyscurrentpath/.default=true%
+ }%
+}
+\def\pgfkeys@handle@boolean#1#2{%
+ \pgfkeys@ifcsname#1#2\endcsname%
+ \csname#1#2\endcsname%
+ \else%
+ \def\pgf@marshal{\pgfkeysvalueof{/errors/boolean expected/.@cmd}}%
+ \expandafter\pgf@marshal\expandafter{\pgfkeyscurrentkey}{#2}\pgfeov%
+ \fi
+}
+
+\pgfkeys{/handlers/.is choice/.code=%
+ \pgfkeys{%
+ \pgfkeyscurrentpath/.cd,%
+ .code=\def\pgfkeys@was@choice{##1}\expandafter\pgfkeysalso\expandafter{\pgfkeyscurrentkey/##1},
+ .unknown/.code={%
+ \def\pgf@marshal{\pgfkeysvalueof{/errors/unknown choice value/.@cmd}}%
+ {\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@pathtoks\expandafter}\expandafter{\pgfkeys@was@choice}\pgfeov}%
+ }%
+ }%
+}
+
+
+% Repeatedly setting a key
+
+\pgfkeys{/handlers/.list/.code=%
+ {%
+ \ifx\foreach\@undefined%
+ \pgfkeys@error{You need to load the pgffor package to use the .list key syntax.}%
+ \fi%
+ % Use foreach to unfold the list
+ \def\pgf@keys@temp{}%
+ \foreach \pgf@keys@key in{#1}%
+ {\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\pgf@keys@temp%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@keys@temp\expandafter{\pgf@keys@key}}}%
+ \edef\pgf@keys@list@path{\pgfkeyscurrentpath}%
+ \expandafter\expandafter\expandafter\pgf@keys@do@list%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@keys@list@path\expandafter}\pgf@keys@temp\pgf@stop%
+ }%
+}
+\def\pgf@keys@do@list#1{\pgf@keys@utilifnextchar\bgroup{\pgf@keys@do@list@item{#1}}\pgf@keys@gobble}
+\def\pgf@keys@do@list@item#1#2{\pgfkeysalso{#1={#2}}\pgf@keys@do@list{#1}}
+
+
+% Forwarding
+
+\pgfkeys{/handlers/.forward to/.code=%
+ \pgfkeys{\pgfkeyscurrentpath/.add code={}{\pgfkeys{#1={##1}}}}
+}
+
+
+% Inspection handlers
+
+\pgfkeys{/handlers/.show value/.code=\pgfkeysgetvalue{\pgfkeyscurrentpath}{\pgfkeysshower}\show\pgfkeysshower} % inspect the value
+\pgfkeys{/handlers/.show code/.code=\pgfkeysgetvalue{\pgfkeyscurrentpath/.@cmd}{\pgfkeysshower}\show\pgfkeysshower} % inspect the body of the command
+
+
+% First char syntax handlers
+\pgfkeys{/handlers/first char syntax/.is if=pgfkeys@syntax@handlers}
+
+% Path handling
+
+% Prepares the .unknown handler used by '.search also'.
+% It will be stored into \pgfkeys@global@temp.
+\def\pgfkeys@searchalso@prepare@unknown@handler#1{%
+ \global\def\pgfkeys@global@temp##1\pgfeov{}%
+ \pgfkeys@searchalso@parse#1,\pgfkeys@mainstop
+ {%
+ \toks0=\expandafter{\pgfkeys@global@temp##1\pgfeov}%
+ \toks1={\pgfkeysalso{/handlers/.unknown/.@cmd/.expand once=\pgfkeys@searchalso@temp@value}}%
+ \xdef\pgfkeys@global@temp{%
+ \noexpand\def\noexpand\pgfkeys@searchalso@temp@value{####1}%
+ \noexpand\ifpgfkeysaddeddefaultpath
+ \noexpand\pgfkeyssuccessfalse
+ \noexpand\let\noexpand\pgfkeys@searchalso@name=\noexpand\pgfkeyscurrentkeyRAW
+ \the\toks0 % one or more /.try things; one for each path. The last element won't have a /.try
+ %\noexpand\ifpgfkeyssuccess
+ %\noexpand\else
+ % \the\toks1 % invoke /handlers/.unknown handler
+ %\noexpand\fi
+ \noexpand\else
+ \the\toks1 % invoke /handlers/.unknown handler
+ \noexpand\fi
+ }%
+ \expandafter\gdef\expandafter\pgfkeys@global@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}%
+ }%
+}%
+
+\def\pgfkeys@searchalso@parse{\futurelet\pgfkeys@possiblerelax\pgfkeys@searchalso@parse@main}
+\def\pgfkeys@searchalso@parse@main{%
+ \ifx\pgfkeys@possiblerelax\pgfkeys@mainstop%
+ \expandafter\pgfkeys@cleanup%
+ \else%
+ \expandafter\pgfkeys@searchalso@appendentry%
+ \fi%
+}
+\def\pgfkeys@searchalso@appendentry#1,#2{%
+ \def\pgfkeys@searchalso@nexttok{#2}%
+ \pgfkeys@spdef\pgfkeys@temp{#1}%
+ {%
+ \toks0=\expandafter{\pgfkeys@global@temp##1\pgfeov}%
+ \toks1=\expandafter{\pgfkeys@temp}%
+ \xdef\pgfkeys@global@temp{%
+ \the\toks0 % the space is important!
+ \noexpand\ifpgfkeyssuccess\noexpand\else
+ \noexpand\pgfqkeys{\the\toks1 }{\noexpand\pgfkeys@searchalso@name
+ \ifx\pgfkeys@searchalso@nexttok\pgfkeys@mainstop\else/.try\fi /.expand once=\noexpand\pgfkeys@searchalso@temp@value}%
+ \noexpand\fi}%
+ \expandafter\gdef\expandafter\pgfkeys@global@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}%
+ }%
+ \pgfkeys@searchalso@parse#2%
+}
+\pgfkeys{%
+ /handlers/.is family/.code=\pgfkeys{\pgfkeyscurrentpath/.ecode=\edef\noexpand\pgfkeysdefaultpath{\pgfkeyscurrentpath/}},%
+ /handlers/.cd/.code=\edef\pgfkeysdefaultpath{\pgfkeyscurrentpath/},%
+ /handlers/.search also/.code={%
+ \pgfkeys@searchalso@prepare@unknown@handler{#1}%
+%\message{I prepared the '\pgfkeyscurrentpath/.unknown' handler \meaning\pgfkeys@global@temp\space for '#1'.}%
+ \pgfkeyslet{\pgfkeyscurrentpath/.unknown/.@cmd}{\pgfkeys@global@temp}%
+ }
+}%
+
+
+% Value expansion
+
+\pgfkeys{/handlers/.expand once/.code=\expandafter\pgfkeys@exp@call\expandafter{#1}}
+\pgfkeys{/handlers/.expand two once/.code 2 args=\expandafter\expandafter\expandafter\pgfkeys@exp@call\expandafter\expandafter\expandafter{\expandafter#1\expandafter}\expandafter{#2}}
+\pgfkeys{/handlers/.expand twice/.code=\expandafter\expandafter\expandafter\pgfkeys@exp@call\expandafter\expandafter\expandafter{#1}}
+\pgfkeys{/handlers/.expanded/.code=\edef\pgfkeys@temp{#1}\expandafter\pgfkeys@exp@call\expandafter{\pgfkeys@temp}}
+
+\long\def\pgfkeys@exp@call#1{\pgfkeysalso{\pgfkeyscurrentpath={#1}}}
+
+% Try to set a key and do nothing if not define
+
+\newif\ifpgfkeyssuccess
+\pgfkeys{/handlers/.try/.code=\pgfkeys@try}
+\pgfkeys{/handlers/.retry/.code=\ifpgfkeyssuccess\else\pgfkeys@try\fi}
+\def\pgfkeys@try{%
+ \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% make sure that \pgfkeys@code doesn't know about 'try'. Important for .is choice
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% Hmm... no value
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@def}%
+ {\pgfkeysgetvalue{\pgfkeyscurrentpath/.@def}{\pgfkeyscurrentvalue}}
+ {}% no default, so leave it
+ \fi%
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}%
+ {%
+ \pgfkeysgetvalue{\pgfkeyscurrentpath/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov%
+ \pgfkeyssuccesstrue%
+ }%
+ {%
+ \pgfkeysifdefined{\pgfkeyscurrentpath}%
+ {%
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text%
+ \pgfkeysvalueof{\pgfkeyscurrentpath}%
+ \else%
+ \pgfkeyslet{\pgfkeyscurrentpath}\pgfkeyscurrentvalue%
+ \fi%
+ \pgfkeyssuccesstrue%
+ }%
+ {%
+ \pgfkeys@split@path%
+ \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{%
+ % in the standard configuration, this check here is redundant
+ % because pgfkeys@ifexecutehandler === true.
+ % It is only interesting for 'handle only existing'.
+ \pgfkeys@ifexecutehandler{%
+ \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov
+ \pgfkeyssuccesstrue%
+ }{%
+ \pgfkeyssuccessfalse
+ }%
+ }{%
+ \pgfkeyssuccessfalse
+ }%
+ }%
+ }%
+}
+
+% Utilities
+
+\pgfkeys{/utils/exec/.code=#1} % simply execute the given code directly.
+
+
+% Errors
+
+\pgfkeys{
+ /errors/boolean expected/.code 2 args=%
+ {
+ \toks1={#1}
+ \toks2={#2}
+ \pgfkeys@error{%
+ Boolean parameter of key '\the\toks1' must be 'true' or 'false', not
+ '\the\toks2'. I am going to ignore it%
+ }
+ },
+ /errors/value required/.code 2 args=%
+ {
+ \toks1={#1}
+ \pgfkeys@error{%
+ The key '\the\toks1' requires a value. I am going to ignore this
+ key%
+ }
+ },
+ /errors/value forbidden/.code 2 args=%
+ {
+ \toks1={#1}
+ \toks2={#2}
+ \pgfkeys@error{%
+ You may not specify a value for the key '\the\toks1'. I am going to ignore
+ the value '\the\toks2' that you provided%
+ }
+ },
+ /errors/unknown choice value/.code 2 args=%
+ {
+ \toks1={#1}
+ \toks2={#2}
+ \pgfkeys@error{%
+ Choice '\the\toks2' unknown in choice key '\the\toks1'. I am
+ going to ignore this key%
+ }
+ },
+ /errors/unknown key/.code 2 args=%
+ {
+ \toks1={#1}
+ \toks2={#2}
+ \def\pgf@temp{#2}%
+ \pgfkeys@error{%
+ I do not know the key '\the\toks1'\ifx\pgf@temp\pgfkeysnovalue@text\space\else, to which you passed
+ '\the\toks2', \fi and I am going to ignore it. Perhaps you
+ misspelled it%
+ }
+ }
+}
+
+\pgfkeys{/handlers/.unknown/.code=%
+ {%
+ \def\pgf@marshal{\pgfkeysvalueof{/errors/unknown key/.@cmd}}%
+ {\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkey\expandafter}\expandafter{\pgfkeyscurrentvalue}\pgfeov}%
+ }%
+}
+
+\pgfkeys{
+ /handler config/.is choice,
+ /handler config/all/.code={%
+ \let\pgfkeys@case@three=\pgfkeys@case@three@handleall
+ \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handleall
+ },
+ /handler config/only existing/.code={%
+ \let\pgfkeys@case@three=\pgfkeys@case@three@handle@restricted
+ \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handleonlyexisting
+ },
+ /handler config/full or existing/.code={%
+ \let\pgfkeys@case@three=\pgfkeys@case@three@handle@restricted
+ \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handlefullorexisting
+ },
+ /handler config/only existing/add exception/.code={\pgfkeysaddhandleonlyexistingexception{#1}},
+}%
+\pgfkeysaddhandleonlyexistingexception{.cd}%
+\pgfkeysaddhandleonlyexistingexception{.try}%
+\pgfkeysaddhandleonlyexistingexception{.retry}%
+\pgfkeysaddhandleonlyexistingexception{.lastretry}%
+\pgfkeysaddhandleonlyexistingexception{.unknown}%
+\pgfkeysaddhandleonlyexistingexception{.expand once}%
+\pgfkeysaddhandleonlyexistingexception{.expand two once}%
+\pgfkeysaddhandleonlyexistingexception{.expand twice}%
+\pgfkeysaddhandleonlyexistingexception{.expanded}%
+
+
+% Utilities for self-containment
+\def\pgf@keys@gobble#1{}
+\long\def\pgf@keys@utilifnextchar#1#2#3{%
+ \let\pgf@keys@utilreserved@d=#1%
+ \def\pgf@keys@utilreserved@a{#2}%
+ \def\pgf@keys@utilreserved@b{#3}%
+ \futurelet\pgf@keys@utillet@token\pgf@keys@utilifnch}
+\def\pgf@keys@utilifnch{%
+ \ifx\pgf@keys@utillet@token\pgf@keys@utilsptoken
+ \let\pgf@keys@utilreserved@c\pgf@keys@utilxifnch
+ \else
+ \ifx\pgf@keys@utillet@token\pgf@keys@utilreserved@d
+ \let\pgf@keys@utilreserved@c\pgf@keys@utilreserved@a
+ \else
+ \let\pgf@keys@utilreserved@c\pgf@keys@utilreserved@b
+ \fi
+ \fi
+ \pgf@keys@utilreserved@c}
+{%
+ \def\:{\global\let\pgf@keys@utilsptoken= } \:
+ \def\:{\pgf@keys@utilxifnch} \expandafter\gdef\: {\futurelet\pgf@keys@utillet@token\pgf@keys@utilifnch}
+}
+
+
+\input pgfkeysfiltered.code.tex
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfkeys.sty b/graphics/pgf/base/tex/pgfkeys.sty
new file mode 100644
index 0000000000..cca9775837
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfkeys.sty
@@ -0,0 +1,12 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+\input{pgfkeys.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfkeys.tex b/graphics/pgf/base/tex/pgfkeys.tex
new file mode 100644
index 0000000000..9a34286258
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfkeys.tex
@@ -0,0 +1,18 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+\edef\pgfkeysatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfrcs.tex
+\input pgfkeys.code.tex
+
+\catcode`\@=\pgfkeysatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfkeysfiltered.code.tex b/graphics/pgf/base/tex/pgfkeysfiltered.code.tex
new file mode 100644
index 0000000000..ef70baf021
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfkeysfiltered.code.tex
@@ -0,0 +1,1015 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% 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.
+%
+% This file contains additions to pgfkeys.code.tex (loaded
+% automatically at the end of pgfkeys.code.tex)
+%
+% Improvements:
+%
+% - option filtering
+% you provide
+% - a boolean predicate
+% - a "filter handler" which will be invoked for non-matching options,
+% - a key=value list as usual.
+% The filter sets only matching options and invokes the handler for
+% unmatching ones.
+%
+% - Fast family support as in xkeyval.
+% - A key like /my tree/my option can be associated with /my family
+% - You can efficiently set keys which belong to a set of "active"
+% families.
+% Remaining options can be collected into a macro.
+
+% WARNING:
+% this file overwrites
+% \pgfkeys@addpath
+% \pgfkeys@nevermind
+%
+% all other features are 'additive'
+
+
+% these implementations will be switched dynamically with their
+% filtered versions (in \pgfkeys@install@filter@and@invoke)
+\let\pgfkeys@orig@case@one=\pgfkeys@case@one
+\let\pgfkeys@orig@@set=\pgfkeys@@set
+\let\pgfkeys@orig@@qset=\pgfkeys@@qset
+\let\pgfkeys@orig@try=\pgfkeys@try
+\let\pgfkeys@orig@unknown=\pgfkeys@unknown
+
+\newif\ifpgfkeysfilteringisactive
+\newif\ifpgfkeysfiltercontinue
+\let\pgfkeys@key@predicate=\pgfkeys@empty
+\let\pgfkeys@filtered@handler=\pgfkeys@empty
+\newtoks\pgfkeys@tmptoks
+
+% Performs 'filtered' key settings.
+%
+% For every option for which the path prefixing has already been done,
+% the current key filter predicate will be invoked. If the predicate
+% returns true, pgfkeys will process this key in the normal manner.
+% If not, a key filter handler will be invoked.
+%
+% The *predicate* and *handler* semantics are as follows:
+% PRECONDITION:
+% 1. The variables
+% \pgfkeyscurrentkey (full path including name)
+% \pgfkeyscurrentkeyRAW (the current key as it has been
+% found in the key=value list
+% without path modification)
+% \pgfkeyscurrentvalue
+% are all set. If the current key is a handler variable,
+% \pgfkeyscurrentname
+% and
+% \pgfkeyscurrentpath
+% are also set.
+% 2. The type of option has already been checked, that means
+% case (1) whether '.@cmd' exists
+% case (2) whether the key as such has its value
+% case (3) it is a handler like '.code', '.cd' or whatever.
+% case (0) it is unknown.
+% The actual case number (0-3) will be provided as contents
+% of the macro
+% \pgfkeyscasenumber.
+% It is always a one-character token, so it may be compared
+% with both, \ifnum or \if.
+% Please note that unknown options will be processed with
+% the usual '.unknown' handlers unless the key filter takes
+% control over unknown options as well.
+%
+% POSTCONDITION:
+% the predicate sets
+% \pgfkeysfiltercontinuetrue
+% or
+% \pgfkeysfiltercontinuefalse
+% (the boolean \ifpgfkeysfiltercontinue).
+% Depending on this 'if', option processing will be continued or
+% skipped.
+%
+% The handler can do anything with the option, for example collect
+% unmatched ones.
+%
+% ATTENTION: \pgfkeysfiltered can't be nested (yet). Use the
+% \pgfkeyspredicateAND if you need multiple predicates at once.
+% Nesting would produce unexpected results because the current filter
+% state can't be stored/restored without TeX-groups, therefor it is
+% disabled.
+%
+% ATTENTION: you can't filter error messages.
+%
+% REMARK: In case (3), the macros \pgfkeyscurrentpath and
+% \pgfkeyscurrentname have already been computed, you do not need to
+% invoke \pgfkeyssplitpath. In any other case, neither path nor name
+% are required for the options processing - if you need them for
+% predicates/handlers, you need to compute them by hand.
+%
+%
+% Example:
+% \def\unmatched{}
+% \pgfkeys{/pgf/key filters/is descendant of/.install key filter=/my group}
+% \pgfkeys{/pgf/key filter handlers/append filtered to/.install key filter handler=\unmatched}
+% \pgfkeysfiltered%
+% {/my group/option 1=value 1,/tikz/option 2=value 2}
+% ->
+% will set '/my group/option 1' as usual, but '/tikz/option 2' will not
+% be set. Instead, it will be appended to '\unmatched' such that
+% \unmatched = {/tikz/option 2=value2}
+% after the operation.
+%
+% Arguments:
+% #1: key-value list.
+\def\pgfkeysfiltered{%
+ % produce
+ % '{<default path>}'
+ % each expanded exactly one time into the register:
+ \expandafter\pgfkeysfiltered@@install\expandafter{\pgfkeysdefaultpath}%
+}
+
+% #1: old value of default path.
+% #2: key-value-list.
+\long\def\pgfkeysfiltered@@install#1#2{%
+ \pgfkeys@install@filter@and@invoke{%
+ \let\pgfkeysdefaultpath\pgfkeys@root%
+ \pgfkeys@parse#2,\pgfkeys@mainstop%
+ \def\pgfkeysdefaultpath{#1}%
+ }%
+}
+
+% Assuming that macro #1 contains a key=value list, this command
+% performs an \pgfkeysalso command for the content of macro #1.
+%
+% It can be used in conjunction with
+% - \pgfkeysfiltered and
+% - \pgfkeysappendfilterednamestomacro:
+% the first pass fill only process options matching the filter, then,
+% a \pgfkeysalsofrom can be used at a later time to set the remaining
+% options.
+%
+% Example:
+% \pgfkeys{/my group/.cd,/utils/exec=\pgfkeysalsofrom\filtered}
+\long\def\pgfkeysalsofrom#1{%
+ \expandafter\pgfkeysalso\expandafter{#1}%
+}
+
+% The same as \pgfkeysalsofrom, but it invokes \pgfkeysalsofiltered.
+\long\def\pgfkeysalsofilteredfrom#1{%
+ \expandafter\pgfkeysalsofiltered\expandafter{#1}%
+}
+
+% #1 = options
+\long\def\pgfkeysalsofiltered#1{%
+ \pgfkeys@install@filter@and@invoke{\pgfkeysalso{#1}}%
+}%
+
+% The same like \pgfkeysfiltered, but with quick search path setting.
+%
+% #1: default path
+% #2: key-value-pairs
+\long\def\pgfqkeysfiltered#1{%
+ \expandafter\pgfqkeysfiltered@@install\expandafter{\pgfkeysdefaultpath}{#1}%
+}
+
+% #1: old value of default path.
+% #2: default path
+% #3: key-value-list.
+\long\def\pgfqkeysfiltered@@install#1#2#3{%
+ \pgfkeys@install@filter@and@invoke{%
+ \def\pgfkeysdefaultpath{#2/}\pgfkeys@parse#3,\pgfkeys@mainstop\def\pgfkeysdefaultpath{#1}%
+ }%
+}
+
+% Family management
+%
+% The family code provides the following features:
+% 1. every key can be associated with 0 or 1 'family'.
+% 2. Families are a loose association which are independent of the key
+% hierarchy.
+% For example, /my tree/key1 can belong to family /tikz.
+%
+% 3. It is possible to "activate" or "deactivate" single families.
+% Furthermore, it is possible to set only keys which belong to
+% active families (using \pgfkeysfiltered).
+% 4. Runtime complexities:
+% If you have N options and you only want to process K active
+% families, the runtime is O( N + K ):
+% - activate every family O(K)
+% - use \pgfkeyshasactivefamily as filter predicate O(N)
+% - deactivate every family O(K)
+
+
+% Activates family #1.
+%
+% #1 maybe a macro.
+\def\pgfkeysactivatefamily#1{%
+ \pgfkeysiffamilydefined
+ {#1}%
+ {\csname pgfk@#1/familyactivetrue\endcsname}%
+ {\pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov}%
+%\message{[ACTIVATING FAMILY #1]}%
+}
+
+% Deactivates family #1.
+%
+% #1 maybe a macro.
+\def\pgfkeysdeactivatefamily#1{%
+ \pgfkeysiffamilydefined
+ {#1}%
+ {\csname pgfk@#1/familyactivefalse\endcsname}%
+ {\pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov}%
+%\message{[DEACTIVATING FAMILY #1]}%
+}
+
+% Activates all families in the comma separated list #1.
+%
+% It will also generate code for deactivation of all those families
+% into the command #2.
+%
+% #1: a comma-separated list of fully qualified family names.
+% #2: a command which will be filled with a deactivate-all command.
+\def\pgfkeysactivatefamilies#1#2{%
+ \pgfkeyssavekeyfilterstateto\pgfkeys@cur@state
+ \expandafter\pgfkeysactivatefamilies@impl\expandafter{\pgfkeys@cur@state}{#1}{#2}%
+}
+% #1: commands needed to restore the old filtering state
+% #2: family name list
+% #3: macro name for de-activate command
+\def\pgfkeysactivatefamilies@impl#1#2#3{%
+ \pgfkeysinstallkeyfilter{/pgf/key filters/false}{}%
+ \let#3=\pgfkeys@empty%
+ \def\pgfkeys@filtered@handler{\pgfkeys@family@activate@handler{#3}}%
+ \pgfkeysalsofiltered{#2}%
+ #1%
+}
+
+\def\pgfkeys@family@activate@handler#1{%
+ \pgfkeysactivatefamily{\pgfkeyscurrentkey}%
+ % produce
+ % <old list> '\pgfkeysdeactivatefamily{' <current key> '}'
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter#1\expandafter\pgfkeysdeactivatefamily\expandafter{\pgfkeyscurrentkey}}%
+ \edef#1{\the\pgfkeys@tmptoks}%
+}
+
+% If for testing whether a family exists.
+%
+% #1 = fully qualified family name
+% #2 = if-case
+% #3 = else-case
+%
+% Description:
+%
+% If the family exists, #2 will be executed. Otherwise, #3 will be
+% called.
+\long\def\pgfkeysiffamilydefined#1#2#3{\pgfkeys@ifcsname ifpgfk@#1/familyactive\endcsname#2\else#3\fi}
+
+% Sets the TeX boolean
+% \ifpgfkeysfiltercontinue := ( family #1 is active )
+%
+% Argument:
+% #1 the family name. Maybe a macro.
+\def\pgfkeysisfamilyactive#1{%
+ \pgfkeysiffamilydefined{#1}{%
+ \expandafter\let\expandafter\ifpgfkeysfiltercontinue\csname ifpgfk@#1/familyactive\endcsname
+ }{%
+ \pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov%
+ \expandafter\expandafter\expandafter\let\csname ifpgfkeysfiltercontinue\endcsname\csname iffalse\endcsname
+ }%
+}%
+
+% Retrieve the family of full key #1 into macro #2.
+%
+% Will set the TeX boolean \ifpgfkeyssuccess to whether the full key
+% really has a family.
+%
+% The family for any key is stored in the sub-key #1/family.
+%
+% Parameters:
+% #1: the full key name for which the family is requested. Maybe a
+% macro.
+% #2: a macro name which will be filled with the result.
+\def\pgfkeysgetfamily#1#2{%
+ \pgfkeysifdefined{#1/family}{\pgfkeysgetvalue{#1/family}{#2}\pgfkeyssuccesstrue}{\pgfkeyssuccessfalse}%
+}
+
+% Equivalent to \pgfkeys{#1/.belongs to family=#2}
+\def\pgfkeyssetfamily#1#2{%
+ \pgfkeysiffamilydefined{#2}{%
+ \pgfkeyssetvalue{#1/family}{#2}%
+ }{%
+ \pgfkeysalso{/errors/family unknown=#2}%
+ }%
+}%
+
+
+% Sets \ifpgfkeysfiltercontinue to true iff the current key belongs to
+% the /errors tree.
+\long\def\pgfkeys@cur@is@descendant@of@errors{%
+ \expandafter\pgfkeys@cur@is@descendant@of@errors@impl\pgfkeyscurrentkey/errors\pgf@@eov
+}%
+\long\def\pgfkeys@cur@is@descendant@of@errors@impl#1/errors#2\pgf@@eov{%
+ \def\pgfkeyspred@TMP{#1}%
+ \ifx\pgfkeyspred@TMP\pgfkeys@empty
+%\message{[SPECIAL CHECK] '\pgfkeyscurrentkey' is descendant of '/errors': TRUE.}%
+ \pgfkeysfiltercontinuetrue
+ \else
+%\message{[SPECIAL CHECK] '\pgfkeyscurrentkey' is descendant of '/errors': FALSE.}%
+ \pgfkeysfiltercontinuefalse
+ \fi
+}%
+
+% \pgfkeysinterruptkeyfilter
+% ...
+% \endpgfkeysinterruptkeyfilter
+% temporarily interrupts key filtering and enables it in
+% \endpgfkeysinterruptkeyfilter.
+%
+% If key filtering it not active, this has no effect at all.
+%
+% REMARK:
+% \pgfkeysinterruptkeyfilter...\endpgfkeysinterruptkeyfilter does NOT
+% introduce a \TeX-group.
+\def\pgfkeysinterruptkeyfilter{%
+ \ifpgfkeysfilteringisactive
+ \let\pgfkeys@case@one=\pgfkeys@orig@case@one
+ \let\pgfkeys@try=\pgfkeys@orig@try
+ \let\pgfkeys@unknown=\pgfkeys@orig@unknown
+ \fi
+}
+
+\def\endpgfkeysinterruptkeyfilter{%
+ \ifpgfkeysfilteringisactive
+ \let\pgfkeys@case@one=\pgfkeys@case@one@filtered
+ \let\pgfkeys@try=\pgfkeys@try@filtered
+ \let\pgfkeys@unknown=\pgfkeys@unknown@filtered
+ \fi
+}
+
+% Activates families #1, calls \pgfkeysfiltered and deactivates the
+% families afterwards.
+%
+% REMARK: you need to install a family-based key filter predicate
+% manually to benefit from the activated families!
+%
+% #1: comma separated family list
+% #2: key-value pairs
+%
+% @see \pgfkeysactivatefamiliesandfilteroptions
+\def\pgfkeysactivatefamiliesandfilteroptions#1#2{%
+ \pgfkeysactivatefamilies{#1}{\pgfkeys@family@deactivation}%
+ \pgfkeysfiltered{#2}%
+ \pgfkeys@family@deactivation
+}
+
+% The "quick" variant of \pgfkeysactivatefamiliesandfilteroptions: it
+% also assigns a default path.
+%
+% #1: comma separated family list
+% #2: default path
+% #3: key-value pairs
+\def\pgfqkeysactivatefamiliesandfilteroptions#1#2#3{%
+ \pgfkeysactivatefamilies{#1}{\pgfkeys@family@deactivation}%
+ \pgfqkeysfiltered{#2}{#3}%
+ \pgfkeys@family@deactivation
+}
+
+% Public version of split path:
+\def\pgfkeyssplitpath{\pgfkeys@split@path}%
+
+
+% The same as \pgfkeysactivatefamiliesandfilteroptions but just for
+% ONE family.
+%
+% #1: family (maybe a macro)
+% #2: key-value pairs
+\def\pgfkeysactivatesinglefamilyandfilteroptions#1#2{%
+ \pgfkeysactivatefamily{#1}%
+ \pgfkeysfiltered{#2}%
+ \pgfkeysdeactivatefamily{#1}%
+}
+
+% The "quick" variant of \pgfkeysactivatesinglefamilyandfilteroptions
+%
+% #1: family (maybe a macro)
+% #2: default path
+% #3: key-value pairs
+\def\pgfqkeysactivatesinglefamilyandfilteroptions#1#2#3{%
+ \pgfkeysactivatefamily{#1}%
+ \pgfqkeysfiltered{#2}{#3}%
+ \pgfkeysdeactivatefamily{#1}%
+}
+
+% Installs the key filter '#1' with argument '#2'.
+% This is equivalent to
+% \pgfkeys{#1/.install key filter=#2}
+%
+% The current values of the key filter handler is stored into the public
+% macros
+% \pgfkeyscurrentkeyfilter
+% and
+% \pgfkeyscurrentkeyfilterargs
+%
+% #1: a full key name; may be a macro
+% #2: optional arguments for the key. If the key expects more than one
+% argument, supply '{{first}{second}}'
+\def\pgfkeysinstallkeyfilter#1#2{%
+ \pgfkeysifdefined{#1/.@cmd}{%
+ \edef\pgfkeyscurrentkeyfilter{#1}%
+ \def\pgfkeyscurrentkeyfilterargs{#2}%
+ \pgfkeysgetvalue{#1/.@cmd}{\pgfkeys@key@predicate@}%
+ \def\pgfkeys@key@predicate{\pgfkeys@key@predicate@#2\pgfeov}%
+ }{%
+ \pgfkeysvalueof{/errors/no such key filter/.@cmd}{#1}{#2}\pgfeov%
+ }%
+}
+
+% Installs the key filter handler '#1' with argument '#2'.
+% This is equivalent to
+% \pgfkeys{#1/.install key filter handler=#2}
+%
+% The current values of the key filter handler is stored into the public
+% macros
+% \pgfkeyscurrentkeyfilterhandler
+% and
+% \pgfkeyscurrentkeyfilterhandlerargs
+%
+% #1: a full key name; may be a macro
+% #2: optional arguments for the handler. If the handler expects more than one
+% argument, supply '{{first}{second}}'
+\def\pgfkeysinstallkeyfilterhandler#1#2{%
+ \pgfkeysifdefined{#1/.@cmd}{%
+ \edef\pgfkeyscurrentkeyfilterhandler{#1}%
+ \def\pgfkeyscurrentkeyfilterhandlerargs{#2}%
+ \pgfkeysgetvalue{#1/.@cmd}{\pgfkeys@filtered@handler@}%
+ \def\pgfkeys@filtered@handler{\pgfkeys@filtered@handler@#2\pgfeov}%
+ }{%
+ \pgfkeysvalueof{/errors/no such key filter handler/.@cmd}{#1}{#2}\pgfeov%
+ }%
+}
+
+% Creates a macro which contains commands to re-activate the current
+% key filter and key filter handler. It can be used to temporarily
+% switch the key filter.
+\def\pgfkeyssavekeyfilterstateto#1{%
+ % produce the string
+ % \pgfkeysinstallkeyfilter{...}{...}
+ % \pgfkeysinstallkeyfilterhandler{...}{...}
+ % where each argument is expanded once
+ % FIXME: Do the same with less overhead!
+ \pgfkeys@tmptoks={\pgfkeysinstallkeyfilter}%
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilter}}%
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterargs}\pgfkeysinstallkeyfilterhandler}%
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterhandler}}%
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterhandlerargs}}%
+ \edef#1{%
+ \the\pgfkeys@tmptoks
+ }%
+}
+
+
+\pgfkeys{%
+ /errors/family unknown/.code=\pgfkeys@error{%
+ Sorry, I do not know family '#1' and can't work with any assoicated family handling. Perhaps you misspelled it?},
+ /errors/no such key filter/.code 2 args=\pgfkeys@error{Sorry, there is no such key filter '#1'.},
+ /errors/no such key filter handler/.code 2 args=\pgfkeys@error{Sorry, there is no such key filter handler '#1'.},
+ % HANDLERS:
+ %
+ % .is family should
+ % 1. '.cd' into the families' path,
+ % 2. define booleans to activate/deactive the family
+ % (see \pgfkeysisfamilyactive)
+ % 3. make sure that \pgfkeyshasactivefamily returns true for
+ % the family itself.
+ /handlers/.is family/.append code={%
+ %\newif is an \outer macro in plain tex, so this here is not portable:
+ %\expandafter\newif\csname if\pgfkeyscurrentpath/familyactive\endcsname
+ \edef\pgfkeyspred@TMP{pgfk@\pgfkeyscurrentpath/familyactive}%
+ \expandafter\pgfkeys@non@outer@newif\expandafter{\pgfkeyspred@TMP}%
+ \edef\pgfkeyspred@TMP{\pgfkeyscurrentpath/.belongs to family=\pgfkeyscurrentpath}%
+ \expandafter\pgfkeysalso\expandafter{\pgfkeyspred@TMP}%
+ },%
+ /handlers/.activate family/.code=\pgfkeysactivatefamily{\pgfkeyscurrentpath},
+ /handlers/.deactivate family/.code=\pgfkeysdeactivatefamily{\pgfkeyscurrentpath},
+ /handlers/.belongs to family/.code={\pgfkeyssetfamily{\pgfkeyscurrentpath}{#1}},%
+ %
+ %
+ % An addition to the '.try' and '.retry' handlers:
+ %
+ % It is the same as '.retry', but if the option is still unknown, the
+ % usual handlers for unknown keys will be invoked.
+ /handlers/.lastretry/.code={%
+ \ifpgfkeyssuccess\else
+ \pgfkeys@try
+ \ifpgfkeyssuccess\else
+ \pgfkeys@split@path%
+ \pgfkeys@unknown
+ \fi
+ \fi
+ },
+ %
+ %
+ /handlers/.install key filter/.code={%
+ \pgfkeysinstallkeyfilter{\pgfkeyscurrentpath}{#1}%
+ },%
+ /handlers/.install key filter handler/.code={%
+ \pgfkeysinstallkeyfilterhandler{\pgfkeyscurrentpath}{#1}%
+ },%
+ %
+ %
+ % KEY FILTER HANDLERS:
+ %
+ /pgf/key filter handlers/append filtered to/.code={%
+ % Produce
+ % <orig key> '={' <value> '}'
+ % where both, the key and the value are expanded just ONCE:
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkeyRAW\expandafter=\expandafter{\pgfkeyscurrentvalue}}%
+ \ifx#1\pgfkeys@empty
+ \else
+ % Produce <old list> ',' <orig key> '={' <value> '}'
+ \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter#1\expandafter,\the\pgfkeys@tmptoks}%
+ \fi
+ \edef#1{\the\pgfkeys@tmptoks}%
+ },%
+ /pgf/key filter handlers/ignore/.code={},
+ /pgf/key filter handlers/ignore/.install key filter handler,
+ /pgf/key filter handlers/log/.code={%
+ \pgf@typeout{LOG: the option '\pgfkeyscurrentkey' (was originally '\pgfkeyscurrentkeyRAW') (case \pgfkeyscasenumber) has not been processed due to pgfkeysfiltered.}%
+ },
+ %
+ %
+ % KEY FILTER PREDICATES:
+ %
+ % Returns true if the currently processed key belongs to an active family.
+ % A family is active if it has been activated before.
+ /pgf/key filters/active families/.code={%
+ \if\pgfkeyscasenumber0%
+ % unknown options shall be processed with the
+ % unknown-handlers.
+ \pgfkeysfiltercontinuetrue
+ \else
+ \if\pgfkeyscasenumber3%
+ \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP
+ \else
+ \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP
+ \fi
+ \ifpgfkeyssuccess
+ \pgfkeysisfamilyactive{\pgfkeyspred@TMP}%
+ \else% Ok, it does not belong to any family.
+ \pgfkeysfiltercontinuefalse
+ \fi
+ \fi
+ },%
+ %
+ %
+ %
+ % This filter works as follows:
+ % 1. if the current key belongs to a family:
+ % return whether its family is active,
+ % 2. if the current key does NOT belong to a family:
+ % return the result of criterion '#1',
+ % 3. the current key is unknown:
+ % return the result of criterion '#2'.
+ %
+ % Arguments:
+ % #1: the predicate which will be invoked in case 2.
+ % It will be invoked with the current case number as argument.
+ % #2: the predicate which will be invoked in case 3 with
+ % the current case number as argument.
+ /pgf/key filters/active families or no family/.code 2 args={%
+ \if\pgfkeyscasenumber0%
+ \pgfkeysevalkeyfilterwith{#2}%
+ \else
+ \if\pgfkeyscasenumber3%
+ \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP
+ \else
+ \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP
+ \fi
+ \ifpgfkeyssuccess
+ \pgfkeysisfamilyactive{\pgfkeyspred@TMP}%
+ \else% Ok, it does not belong to any family.
+ \pgfkeysevalkeyfilterwith{#1}%
+ \fi
+ \fi
+ },
+ /pgf/key filters/active families or no family DEBUG/.code 2 args={%
+ \if\pgfkeyscasenumber0%
+ \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) invoking unknown handler '#2']}%
+ \pgfkeysevalkeyfilterwith{#2}%
+ \else
+ \if\pgfkeyscasenumber3%
+ \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP
+ \else
+ \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP
+ \fi
+ \ifpgfkeyssuccess
+ \pgfkeysisfamilyactive{\pgfkeyspred@TMP}%
+ \ifpgfkeysfiltercontinue
+ \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) family is ACTIVE]}%
+ \else
+ \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) family is NOT active.]}%
+ \fi
+ \else% Ok, it does not belong to any family.
+ \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) invoking has-no-family-handler '#1']}%
+ \pgfkeysevalkeyfilterwith{#1}%
+ \fi
+ \fi
+ },
+ %
+ % A (faster) shortcut for
+ % /pgf/key filters/active families or no family=
+ % {/pgf/keys filters/false}
+ % {/pgf/keys filters/false}
+ /pgf/key filters/active families and known/.code={%
+ \if\pgfkeyscasenumber0%
+ \pgfkeysfiltercontinuefalse
+ \else
+ \if\pgfkeyscasenumber3%
+ \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP
+ \else
+ \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP
+ \fi
+ \ifpgfkeyssuccess
+ \pgfkeysisfamilyactive{\pgfkeyspred@TMP}%
+ \else% Ok, it does not belong to any family.
+ \pgfkeysfiltercontinuefalse
+ \fi
+ \fi
+ },
+ % A (faster) shortcut for
+ % /pgf/key filters/active families or no family=
+ % {/pgf/key filters/is descendant of=#1}% for keys without family
+ % {/pgf/keys filters/false}
+ /pgf/key filters/active families or descendants of/.code={%
+ \if\pgfkeyscasenumber0%
+ \pgfkeysfiltercontinuefalse
+ \else
+ \if\pgfkeyscasenumber3%
+ \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP
+ \else
+ \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP
+ \fi
+ \ifpgfkeyssuccess
+ \pgfkeysisfamilyactive{\pgfkeyspred@TMP}%
+ \else% Ok, it does not belong to any family.
+ % the 'is descendant of' implementation has been
+ % COPY PASTED here:
+ %
+ % string prefix comparison:
+ \def\pgfkeysisdescendantof@impl##1#1##2\pgf@@eov{%
+ \def\pgfkeyspred@TMP{##1}%
+ \ifx\pgfkeyspred@TMP\pgfkeys@empty
+ \pgfkeysfiltercontinuetrue
+ \else
+ \pgfkeysfiltercontinuefalse
+ \fi
+ }%
+ \expandafter\pgfkeysisdescendantof@impl\pgfkeyscurrentkey#1\pgf@@eov
+ \fi
+ \fi
+ },
+ %
+ % Processes only options which are children of #1.
+ % Example:
+ % is descendant of/.install key filter=/foo
+ % will be true for
+ % /foo/bar/x=y
+ % /foo/.cd
+ % /foo/bar/.style=...
+ % but not for
+ % /bar/foo/...
+ /pgf/key filters/is descendant of/.code={%
+ \if\pgfkeyscasenumber0%
+%\message{'\pgfkeyscurrentkey' (case \pgfkeyscasenumber) is UNKNOWN. Calling unknown handler.}%
+ % unknown options shall be processed with the
+ % unknown-handlers.
+ \pgfkeysfiltercontinuetrue
+ \else
+ % string prefix comparison:
+ % [ note : this has been COPY-PASTED to
+ % |active families or descendants of| ]
+ \def\pgfkeysisdescendantof@impl##1#1##2\pgf@@eov{%
+ \def\pgfkeyspred@TMP{##1}%
+ \ifx\pgfkeyspred@TMP\pgfkeys@empty
+%\message{'\pgfkeyscurrentkey' (case \pgfkeyscasenumber) is descendant of '#1': TRUE.}%
+ \pgfkeysfiltercontinuetrue
+ \else
+%\message{'\pgfkeyscurrentkey' (case \pgfkeyscasenumber) is descendant of '#1': FALSE.}%
+ \pgfkeysfiltercontinuefalse
+ \fi
+ }%
+ \expandafter\pgfkeysisdescendantof@impl\pgfkeyscurrentkey#1\pgf@@eov
+ \fi
+ },%
+ %
+ %
+ %
+ % Returns true if the currently processed full key equals #2.
+ /pgf/key filters/equals/.code={%
+ \if\pgfkeyscasenumber0%
+ % Unknown option:
+ \pgfkeysfiltercontinuetrue
+ \else
+ \def\pgfkeyspred@TMP{#1}%
+ \ifx\pgfkeyscurrentkey\pgfkeyspred@TMP
+ \pgfkeysfiltercontinuetrue
+ \else
+ \pgfkeysfiltercontinuefalse
+ \fi
+ \fi
+ },%
+ %
+ %
+ % Argument #1 can be any other (evaluated) filter predicate, its logical return
+ % value will be inverted.
+ % Example:
+ % not/.install key filter={is descendant of=/tikz}
+ % will install a key filter which evaluates 'is descendant of' with argument
+ % '/tikz' and returns the logical negation of the result.
+ %
+ /pgf/key filters/not/.code={%
+ \pgfkeysevalkeyfilterwith{#1}%
+ \ifpgfkeysfiltercontinue
+ \pgfkeysfiltercontinuefalse
+ \else
+ \pgfkeysfiltercontinuetrue
+ \fi
+ },%
+ /pgf/key filters/and/.code 2 args={%
+ \pgfkeysevalkeyfilterwith{#1}%
+ \ifpgfkeysfiltercontinue
+ \pgfkeysevalkeyfilterwith{#2}%
+ \fi
+ },%
+ /pgf/key filters/or/.code 2 args={%
+ \pgfkeysevalkeyfilterwith{#1}%
+ \ifpgfkeysfiltercontinue
+ \else
+ \pgfkeysevalkeyfilterwith{#2}%
+ \fi
+ },%
+ /pgf/key filters/true/.code={\pgfkeysfiltercontinuetrue},%
+ /pgf/key filters/true/.install key filter,
+ /pgf/key filters/false/.code={%
+ \pgfkeysfiltercontinuefalse
+ },%
+ %
+ % Returns false if the current key is unknown, which avoids calling
+ % the unknown handlers.
+ /pgf/key filters/defined/.code={%
+ \if\pgfkeyscasenumber0%
+ \pgfkeysfiltercontinuefalse
+ \else
+ \pgfkeysfiltercontinuetrue
+ \fi
+ },
+}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Private IMPLEMENTATION
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% This command does THE SAME work as \pgfkeys@case@one,
+% but it applies filtering whenever it identified the type of an
+% option.
+\def\pgfkeys@case@one@filtered{%
+ \pgfkeys@cur@is@descendant@of@errors
+ \ifpgfkeysfiltercontinue
+ \pgfkeys@orig@case@one
+ \else
+ \pgfkeysfiltercontinuetrue
+ \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}{%
+ % CASE ONE: a command option
+ \def\pgfkeyscasenumber{1}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+%\message{PROCESSING KEY \pgfkeyscurrentkey!}%
+ \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov
+ \else
+%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}%
+ \pgfkeys@filtered@handler%
+ \fi
+ }{%
+ % CASE TWO: a normal value option
+ \pgfkeysifdefined{\pgfkeyscurrentkey}{%
+ \def\pgfkeyscasenumber{2}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+%\message{PROCESSING KEY \pgfkeyscurrentkey!}%
+ \pgfkeys@case@two@extern
+ \else
+%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}%
+ \pgfkeys@filtered@handler%
+ \fi
+ }{%
+ \pgfkeys@split@path
+ % CASE THREE: a handler
+ \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{%
+ \pgfkeys@ifexecutehandler{%
+ \def\pgfkeyscasenumber{3}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+%\message{PROCESSING KEY \pgfkeyscurrentkey!}%
+ \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov
+ \else
+%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}%
+ \pgfkeys@filtered@handler%
+ \fi
+ }{%
+ \pgfkeys@unknown
+ }%
+ }{%
+ \pgfkeys@unknown
+ }%
+ }%
+ }%
+ \fi
+}%
+
+\def\pgfkeys@unknown@filtered{%
+ % CASE ZERO: an unknown option.
+ \def\pgfkeyscasenumber{0}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+%\message{PROCESSING KEY \pgfkeyscurrentkey!}%
+ % start normal 'unknown' handlers:
+ \pgfkeys@orig@unknown
+ \else
+%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}%
+ \pgfkeys@filtered@handler%
+ \fi
+}
+
+% Does the same as \pgfkeys@try, but it also invokes the key filters.
+\def\pgfkeys@try@filtered{%
+ \ifpgfkeysfiltercontinue
+ \pgfkeys@orig@try
+ \else
+ \pgfkeysfiltercontinuetrue
+ \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% make sure that \pgfkeys@code doesn't know about 'try'. Important for .is choice
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% Hmm... no value
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@def}%
+ {\pgfkeysgetvalue{\pgfkeyscurrentpath/.@def}{\pgfkeyscurrentvalue}}
+ {}% no default, so leave it
+ \fi%
+ \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}%
+ {%
+ % CASE ONE: a command option
+ \def\pgfkeyscasenumber{1}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+ \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov%
+ \else
+ \pgfkeys@filtered@handler%
+ \fi
+ \pgfkeyssuccesstrue%
+ }%
+ {%
+ \pgfkeysifdefined{\pgfkeyscurrentpath}%
+ {% CASE TWO: a normal value option
+ \def\pgfkeyscasenumber{2}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+ \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text%
+ \pgfkeysvalueof{\pgfkeyscurrentpath}%
+ \else%
+ \pgfkeyslet{\pgfkeyscurrentpath}\pgfkeyscurrentvalue%
+ \fi%
+ \else
+ \pgfkeys@filtered@handler%
+ \fi
+ \pgfkeyssuccesstrue%
+ }%
+ {%
+ \pgfkeys@split@path%
+ \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{%
+ % CASE THREE: a handled key
+ %
+ % in the standard configuration, this check here is redundant
+ % because pgfkeys@ifexecutehandler === true.
+ % It is only interesting for 'handle only existing'.
+ \pgfkeys@ifexecutehandler{%
+ \def\pgfkeyscasenumber{3}%
+ \pgfkeys@key@predicate%
+ \ifpgfkeysfiltercontinue
+%\message{PROCESSING KEY \pgfkeyscurrentkey!}%
+ \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov
+ \else
+%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}%
+ \pgfkeys@filtered@handler%
+ \fi
+ \pgfkeyssuccesstrue%
+ }{%
+ \pgfkeyssuccessfalse
+ }%
+ }{%
+ \pgfkeyssuccessfalse
+ }%
+ }%
+ }%
+ \fi
+}
+
+
+% #1 the code to invoke after init and before cleanup
+\long\def\pgfkeys@install@filter@and@invoke#1{%
+ \ifpgfkeysfilteringisactive
+ \pgfkeys@error{Sorry, nested calls to key filtering routines are not allowed. (reason: It is not possible to properly restore the previous filtering state after returning from the nested call)}%
+ \fi
+ \pgfkeysfilteringisactivetrue
+ \let\pgfkeys@case@one=\pgfkeys@case@one@filtered
+ \let\pgfkeys@try=\pgfkeys@try@filtered
+ \let\pgfkeys@unknown=\pgfkeys@unknown@filtered
+ #1%
+ \let\pgfkeys@case@one=\pgfkeys@orig@case@one
+ \let\pgfkeys@try=\pgfkeys@orig@try
+ \let\pgfkeys@unknown=\pgfkeys@orig@unknown
+ \pgfkeysfilteringisactivefalse
+}
+
+
+%--------------------------------------------------
+% \def\pgfkeys@eval@key@filter@subroutine@case@one{%
+% \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}{%
+% \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}%
+% \let\pgfkeyspred@TMP=\pgfkeyscurrentvalue
+% \pgfkeys@eval@key@filter@subroutine@restorestate
+% \expandafter\pgfkeys@code\pgfkeyspred@TMP\pgfeov
+% }{%
+% \pgfkeysvalueof{/errors/no such key filter/.@cmd}\pgfkeyscurrentkey\pgfkeyscurrentvalue\pgfeov%
+% }%
+% }
+% % THIS VERSION IS TOO SLOW. See below.
+% \def\pgfkeysevalkeyfilterwith#1{%
+% \edef\pgfkeys@eval@key@filter@subroutine@restorestate{%
+% \noexpand\def\noexpand\pgfkeyscurrentkey{\pgfkeyscurrentkey}%
+% \noexpand\def\noexpand\pgfkeyscurrentkeyRAW{\pgfkeyscurrentkeyRAW}%
+% \noexpand\def\noexpand\pgfkeyscurrentname{\pgfkeyscurrentname}%
+% \noexpand\def\noexpand\pgfkeyscurrentvalue{\pgfkeyscurrentvalue}%
+% \noexpand\pgfkeys@pathtoks={\pgfkeyscurrentpath}%
+% }%
+% \pgfkeysinterruptkeyfilter
+% \let\pgfkeys@case@one=\pgfkeys@eval@key@filter@subroutine@case@one
+% \pgfkeysalso{#1}%
+% \endpgfkeysinterruptkeyfilter% this here also restored \pgfkeys@case@one.
+% \pgfkeys@eval@key@filter@subroutine@restorestate
+% }%
+%--------------------------------------------------
+
+
+% Evaluates a key filter '#1'. Example:
+% \pgfkeysevalkeyfilterwith{/pgf/key filters/equals=/tikz}
+%
+% \pgfkeysevalkeyfilterwith works only if key filtering is
+% active.
+%
+% The argument '#1' MUST be a FULL KEY.
+%
+% The implementation employs a subset of the \pgfkeysalso code.
+\long\def\pgfkeysevalkeyfilterwith#1{%
+ \pgfkeys@eval@key@filter@subroutine@unpack#1=\pgfkeysnovalue=\pgfkeys@stop
+}%
+\long\def\pgfkeys@eval@key@filter@subroutine@unpack#1=#2=#3\pgfkeys@stop{%
+ \pgfkeys@spdef\pgfkeyspred@TMP{#1}%
+ \edef\pgfkeyspred@TMP{\pgfkeyspred@TMP}%
+ \pgfkeys@spdef\pgfkeyspred@TMPB{#2}% TMPB=value
+ \ifx\pgfkeyspred@TMPB\pgfkeysnovalue@text% Hmm... no value
+ \pgfkeysifdefined{\pgfkeyspred@TMP/.@def}%
+ {\pgfkeysgetvalue{\pgfkeyspred@TMP/.@def}{\pgfkeyspred@TMPB}}
+ {}% no default, so leave it
+ \fi%
+ \ifx\pgfkeyspred@TMPB\pgfkeysvaluerequired%
+ \pgfkeysvalueof{/errors/value required/.@cmd}\pgfkeyspred@TMP\pgfkeyspred@TMPB\pgfeov%
+ \else%
+ \pgfkeysifdefined{\pgfkeyspred@TMP/.@cmd}{%
+ \pgfkeysgetvalue{\pgfkeyspred@TMP/.@cmd}{\pgfkeys@code}%
+ \expandafter\pgfkeys@code\pgfkeyspred@TMPB\pgfeov
+ }{%
+ \pgfkeysvalueof{/errors/no such key filter/.@cmd}\pgfkeyspred@TMP\pgfkeyspred@TMPB\pgfeov%
+ }%
+ \fi%
+}
+
+
+\def\pgfkeys@non@outer@newif@#1#2{%
+ \expandafter\edef\csname #2true\endcsname{\noexpand\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\edef\csname #2false\endcsname{\noexpand\let\noexpand#1=\noexpand\iffalse}%
+ \csname #2false\endcsname
+}%
+
+% For latex and context, this here has the same effect as a \newif
+% applied to 'if#1'. For plain tex, it has also the same effect, but
+% it is not an \outer macro as the plain-tex \newif.
+\def\pgfkeys@non@outer@newif#1{%
+ \expandafter\pgfkeys@non@outer@newif@\csname if#1\endcsname{#1}%
+}
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryarrows.code.tex b/graphics/pgf/base/tex/pgflibraryarrows.code.tex
new file mode 100644
index 0000000000..92d2f1e686
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryarrows.code.tex
@@ -0,0 +1,936 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryarrows.code.tex}
+
+
+% A square bracket shaped arrow
+
+\pgfarrowsdeclare{square bracket}{square bracket}
+{
+ \pgfutil@tempdima=1pt%
+ \advance\pgfutil@tempdima by1.25\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdima}
+ \pgfarrowsrightextend{+.5\pgflinewidth}
+}
+{
+ \pgfutil@tempdima=2pt%
+ \advance\pgfutil@tempdima by1.5\pgflinewidth%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \advance\pgfutil@tempdimb by\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfsetbuttcap
+ \pgfpathmoveto{\pgfqpoint{-.5\pgfutil@tempdimb}{-1\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-1\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-.5\pgfutil@tempdimb}{\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}%
+\pgfdeclarearrow{name=[-], means=square bracket}%
+
+\pgfarrowsdeclarereversed{]}{[}{[}{]}%
+
+
+% A round bracket shaped arrow
+
+\pgfarrowsdeclare{(}{)}
+{
+ \pgfutil@tempdima=2pt%
+ \advance\pgfutil@tempdima by1.5\pgflinewidth%
+ \pgfutil@tempdimb=0.0625\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+ \pgfutil@tempdimb=0.5\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=2pt%
+ \advance\pgfutil@tempdima by1.5\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfqpoint{-.5\pgfutil@tempdima}{-1\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{.25\pgfutil@tempdima}{-.5\pgfutil@tempdima}}
+ {\pgfqpoint{.25\pgfutil@tempdima}{.5\pgfutil@tempdima}}
+ {\pgfqpoint{-.5\pgfutil@tempdima}{\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}%
+
+\pgfarrowsdeclarereversed{)}{(}{(}{)}%
+
+
+
+
+% A pointed bracket shaped arrow
+
+\pgfarrowsdeclare{angle 90}{angle 90}
+{
+ \pgfutil@tempdima=0.3pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfutil@tempdimb=5.5\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=.5\pgfutil@tempdima\advance\pgfutil@tempdimb by0.707\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.3pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfqpoint{-5.5\pgfutil@tempdima}{-6\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-5.5\pgfutil@tempdima}{6\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}%
+
+\pgfarrowsdeclarereversed{angle 90 reversed}{angle 90 reversed}{angle 90}{angle 90}%
+
+
+\pgfarrowsdeclare{angle 60}{angle 60}
+{
+ \pgfutil@tempdima=0.3pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfutil@tempdimb=7.29\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=.5\pgfutil@tempdima\advance\pgfutil@tempdimb by\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.3pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{150}{9\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{-150}{9\pgfutil@tempdima}}}
+ \pgfusepathqstroke
+}%
+
+\pgfarrowsdeclarereversed{angle 60 reversed}{angle 60 reversed}{angle 60}{angle 60}%
+
+
+
+\pgfarrowsdeclare{angle 45}{angle 45}
+{
+ \pgfutil@tempdima=0.3pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfutil@tempdimb=8.705\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=.5\pgfutil@tempdima\advance\pgfutil@tempdimb by1.28\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.3pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{157}{10\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{-157}{10\pgfutil@tempdima}}}
+ \pgfusepathqstroke
+}%
+
+\pgfarrowsdeclarereversed{angle 45 reversed}{angle 45 reversed}{angle 45}{angle 45}%
+
+
+
+% A dot shaped arrow
+
+\pgfarrowsdeclare{*}{*}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfutil@tempdimb=7.5\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=1.5\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfpathcircle{\pgfqpoint{-3\pgfutil@tempdima}{0pt}}{+4.5\pgfutil@tempdima}
+ \pgfusepathqfillstroke
+}%
+
+
+% An open dot shaped arrow
+
+\pgfarrowsdeclare{o}{o}
+{
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfutil@tempdimb=9\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfpathcircle{\pgfqpoint{4.5\pgfutil@tempdima}{0bp}}{4.5\pgfutil@tempdima}
+ \pgfusepathqstroke
+}%
+
+
+
+% A diamond shaped arrow
+
+\pgfarrowsdeclare{diamond}{diamond}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.275\pgflinewidth%
+ \pgfutil@tempdimb=13\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=1\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.275\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{1\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-6\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-13\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-6\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\pgfarrowsdeclare{open diamond}{open diamond}%{{-.5bp}{14.5bp}}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.275\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=14\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.275\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{14\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{7\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{7\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+% A square shaped arrow
+\newdimen\arrowsize
+\pgfarrowsdeclare{square}{square}
+{
+ \arrowsize=0.4pt
+ \advance\arrowsize by.275\pgflinewidth%
+ \pgfarrowsleftextend{-7\arrowsize-.5\pgflinewidth}
+ \advance\arrowsize by.5\pgflinewidth
+ \pgfarrowsrightextend{+\arrowsize}
+}
+{
+ \arrowsize=0.4pt
+ \advance\arrowsize by.275\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{1\arrowsize}{4\arrowsize}}
+ \pgfpathlineto{\pgfqpoint{-7\arrowsize}{4\arrowsize}}
+ \pgfpathlineto{\pgfqpoint{-7\arrowsize}{-4\arrowsize}}
+ \pgfpathlineto{\pgfqpoint{1\arrowsize}{-4\arrowsize}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+% A open square shaped arrow
+
+\pgfarrowsdeclare{open square}{open square}%{{-.5bp}{8.5bp}}
+{
+ \arrowsize=0.4pt
+ \advance\arrowsize by.275\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \advance\arrowsize by7\arrowsize
+ \advance\arrowsize by.5\pgflinewidth
+ \pgfarrowsrightextend{+\arrowsize}
+}
+{
+ \arrowsize=0.4pt
+ \advance\arrowsize by.275\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{8\arrowsize}{4\arrowsize}}
+ \pgfpathlineto{\pgfqpoint{0\arrowsize}{4\arrowsize}}
+ \pgfpathlineto{\pgfqpoint{0\arrowsize}{-4\arrowsize}}
+ \pgfpathlineto{\pgfqpoint{8\arrowsize}{-4\arrowsize}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+
+% A triangle shaped arrow
+
+\pgfarrowsdeclare{triangle 90}{triangle 90}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfutil@tempdimb=5.5\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=.5\pgfutil@tempdima\advance\pgfutil@tempdimb by0.707\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfqpoint{-5.5\pgfutil@tempdima}{-6\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-5.5\pgfutil@tempdima}{6\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\pgfarrowsdeclarereversed{triangle 90 reversed}{triangle 90 reversed}{triangle 90}{triangle 90}%
+
+
+\pgfarrowsdeclare{triangle 60}{triangle 60}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfutil@tempdimb=7.29\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=.5\pgfutil@tempdima\advance\pgfutil@tempdimb by\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{150}{9\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{-150}{9\pgfutil@tempdima}}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\pgfarrowsdeclarereversed{triangle 60 reversed}{triangle 60 reversed}{triangle 60}{triangle 60}%
+
+
+
+
+\pgfarrowsdeclare{triangle 45}{triangle 45}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfutil@tempdimb=8.705\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=.5\pgfutil@tempdima\advance\pgfutil@tempdimb by1.28\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{157}{10\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{0.5\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{-157}{10\pgfutil@tempdima}}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\pgfarrowsdeclarereversed{triangle 45 reversed}{triangle 45 reversed}{triangle 45}{triangle 45}%
+
+
+
+
+\pgfarrowsdeclare{open triangle 90}{open triangle 90}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=6\pgfutil@tempdima\advance\pgfutil@tempdimb by0.707\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfqpoint{0\pgfutil@tempdima}{-6\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{6\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0\pgfutil@tempdima}{6\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+\pgfarrowsdeclare{open triangle 90 reversed}{open triangle 90 reversed}%
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfarrowsleftextend{+-.707\pgflinewidth}
+ \pgfutil@tempdimb=6\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfqpoint{6\pgfutil@tempdima}{-6\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{6\pgfutil@tempdima}{6\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+
+\pgfarrowsdeclare{open triangle 60}{open triangle 60}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=7.794\pgfutil@tempdima\advance\pgfutil@tempdimb by\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{7.794\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{150}{9\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfqpoint{7.794\pgfutil@tempdima}{0pt}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{7.794\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{-150}{9\pgfutil@tempdima}}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+
+\pgfarrowsdeclare{open triangle 60 reversed}{open triangle 60 reversed}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgflinewidth}
+ \pgfutil@tempdimb=7.794\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfqpointpolar{30}{9\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpointorigin}
+ \pgfpathlineto{\pgfqpointpolar{-30}{9\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+
+\pgfarrowsdeclare{open triangle 45}{open triangle 45}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=9.205\pgfutil@tempdima\advance\pgfutil@tempdimb by1.28\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{9.205\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{157}{10\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfqpoint{9.205\pgfutil@tempdima}{0pt}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{9.205\pgfutil@tempdima}{0pt}}{\pgfqpointpolar{-157}{10\pgfutil@tempdima}}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+
+\pgfarrowsdeclare{open triangle 45 reversed}{open triangle 45 reversed}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfarrowsleftextend{+-1.28\pgflinewidth}
+ \pgfutil@tempdimb=9.205\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.5pt%
+ \advance\pgfutil@tempdima by.25\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetmiterjoin
+ \pgfpathmoveto{\pgfqpointpolar{23}{10\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpointorigin}
+ \pgfpathlineto{\pgfqpointpolar{-23}{10\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+
+% A less fleshy variant of LaTeX's ordinal arrow type
+
+\pgfarrowsdeclare{latex'}{latex'}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfarrowsleftextend{+-4\pgfutil@tempdima}
+ \pgfarrowsrightextend{+6\pgfutil@tempdima}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfpathmoveto{\pgfqpoint{6\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{3.5\pgfutil@tempdima}{.5\pgfutil@tempdima}}
+ {\pgfqpoint{-1\pgfutil@tempdima}{1.5\pgfutil@tempdima}}
+ {\pgfqpoint{-4\pgfutil@tempdima}{3.75\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-1.5\pgfutil@tempdima}{1\pgfutil@tempdima}}
+ {\pgfqpoint{-1.5\pgfutil@tempdima}{-1\pgfutil@tempdima}}
+ {\pgfqpoint{-4\pgfutil@tempdima}{-3.75\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-1\pgfutil@tempdima}{-1.5\pgfutil@tempdima}}
+ {\pgfqpoint{3.5\pgfutil@tempdima}{-.5\pgfutil@tempdima}}
+ {\pgfqpoint{6\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfill
+}%
+
+\pgfarrowsdeclarereversed{latex' reversed}{latex' reversed}{latex'}{latex'}%
+
+
+% A rounded variant of the stealth arrow
+
+\pgfarrowsdeclare{stealth'}{stealth'}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfutil@tempdimb=6\pgfutil@tempdima\advance\pgfutil@tempdimb by.5\pgflinewidth%
+ \pgfarrowsleftextend{+-\pgfutil@tempdimb}
+ \pgfutil@tempdimb=2\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{2\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-.5\pgfutil@tempdima}{.5\pgfutil@tempdima}}
+ {\pgfqpoint{-3\pgfutil@tempdima}{1.5\pgfutil@tempdima}}
+ {\pgfqpoint{-6\pgfutil@tempdima}{3.25\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-3\pgfutil@tempdima}{1\pgfutil@tempdima}}
+ {\pgfqpoint{-3\pgfutil@tempdima}{-1\pgfutil@tempdima}}
+ {\pgfqpoint{-6\pgfutil@tempdima}{-3.25\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-3\pgfutil@tempdima}{-1.5\pgfutil@tempdima}}
+ {\pgfqpoint{-.5\pgfutil@tempdima}{-.5\pgfutil@tempdima}}
+ {\pgfqpoint{2\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\pgfarrowsdeclarereversed{stealth' reversed}{stealth' reversed}{stealth'}{stealth'}%
+
+
+
+% The two half of the $\to$ arrow
+
+\pgfarrowsdeclare{left to}{left to}
+{
+ \pgfutil@tempdima=-0.84pt%
+ \advance\pgfutil@tempdima by-1.3\pgflinewidth%
+ \pgfutil@tempdimb=0.21pt%
+ \advance\pgfutil@tempdimb by.625\pgflinewidth%
+ \pgfarrowsleftextend{+\pgfutil@tempdima}
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetlinewidth{0.8\pgflinewidth}
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{-3\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-2.75\pgfutil@tempdima}{2.5\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{0.25\pgfutil@tempdima}}
+ {\pgfqpoint{0.75\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfqpoint{0.55\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ {\pgfqpoint{0.5\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ {\pgfqpoint{0.5\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-0.125\pgflinewidth}}
+ \pgfusepathqstroke
+}%
+
+
+\pgfarrowsdeclare{right to}{right to}
+{
+ \pgfutil@tempdima=-0.84pt%
+ \advance\pgfutil@tempdima by-1.3\pgflinewidth%
+ \pgfutil@tempdimb=0.21pt%
+ \advance\pgfutil@tempdimb by.625\pgflinewidth%
+ \pgfarrowsleftextend{+\pgfutil@tempdima}
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetlinewidth{0.8\pgflinewidth}
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{-3\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-2.75\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{-0.25\pgfutil@tempdima}}
+ {\pgfqpoint{0.75\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfqpoint{0.55\pgfutil@tempdima}{0.125\pgflinewidth}}
+ {\pgfqpoint{0.5\pgfutil@tempdima}{0.125\pgflinewidth}}
+ {\pgfqpoint{0.5\pgfutil@tempdima}{0.125\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{0pt}{0.125\pgflinewidth}}
+ \pgfusepathqstroke
+}%
+
+
+
+% The halfs of the $\to$ arrow reversed
+
+\pgfarrowsdeclare{left to reversed}{left to reversed}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfarrowsleftextend{+-.1\pgflinewidth}
+ \pgfutil@tempdimb=3.75\pgfutil@tempdima\advance\pgfutil@tempdimb by0.9\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfsetbuttcap
+ \pgfpathmoveto{\pgfqpoint{0.5\pgflinewidth}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-0.1\pgflinewidth}{0pt}}
+ \pgfusepathqstroke
+ \pgfsetroundcap
+ \pgfsetlinewidth{.8\pgflinewidth}
+ {\pgftransformxshift{0.625\pgflinewidth}
+ \pgfpathmoveto{\pgfqpoint{3.75\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.5\pgfutil@tempdima}{2.5\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{0.25\pgfutil@tempdima}}{\pgfqpoint{0pt}{0.125\pgflinewidth}}
+ \pgfpathmoveto{\pgfqpoint{3.75\pgfutil@tempdima}{4\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.5\pgfutil@tempdima}{2.5\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{0.25\pgfutil@tempdima}}{\pgfqpoint{0pt}{-0.125\pgflinewidth}}
+ }
+ \pgfusepathqstroke%
+}%
+
+\pgfarrowsdeclare{right to reversed}{right to reversed}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfarrowsleftextend{+-.1\pgflinewidth}
+ \pgfutil@tempdimb=3.75\pgfutil@tempdima\advance\pgfutil@tempdimb by0.9\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.28pt%
+ \advance\pgfutil@tempdima by.3\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfsetbuttcap
+ \pgfpathmoveto{\pgfqpoint{0.5\pgflinewidth}{0pt}}
+ \pgfpathlineto{\pgfqpoint{-0.1\pgflinewidth}{0pt}}
+ \pgfusepathqstroke
+ \pgfsetroundcap
+ \pgfsetlinewidth{.8\pgflinewidth}
+ {\pgftransformxshift{0.625\pgflinewidth}
+ \pgfpathmoveto{\pgfqpoint{3.75\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.5\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{-0.25\pgfutil@tempdima}}{\pgfqpoint{0pt}{-0.125\pgflinewidth}}
+ \pgfpathmoveto{\pgfqpoint{3.75\pgfutil@tempdima}{-4\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.5\pgfutil@tempdima}{-2.5\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{-0.25\pgfutil@tempdima}}{\pgfqpoint{0pt}{0.125\pgflinewidth}}
+ }
+ \pgfusepathqstroke%
+}%
+
+
+
+% A left hook
+
+\pgfarrowsdeclare{left hook}{left hook}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=3.75\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfqpoint{0\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.75\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{2.415\pgfutil@tempdima}{0\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{1.665\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{3\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.75\pgfutil@tempdima}{4.665\pgfutil@tempdima}}{\pgfqpoint{2.415\pgfutil@tempdima}{6\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{6\pgfutil@tempdima}}
+ \pgfusepathqstroke%
+}%
+
+\pgfarrowsdeclarereversed{left hook reversed}{left hook reversed}{left hook}{left hook}%
+
+
+
+% A right hook
+
+\pgfarrowsdeclare{right hook}{right hook}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=3.75\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfqpoint{0\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.75\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{2.415\pgfutil@tempdima}{0\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{-1.665\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{-3\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.75\pgfutil@tempdima}{-4.665\pgfutil@tempdima}}{\pgfqpoint{2.415\pgfutil@tempdima}{-6\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{-6\pgfutil@tempdima}}
+ \pgfusepathqstroke%
+}%
+
+\pgfarrowsdeclarereversed{right hook reversed}{right hook reversed}{right hook}{right hook}%
+
+
+% Hooks in both directions
+
+\pgfarrowsdeclare{hooks}{hooks}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfarrowsleftextend{+-.5\pgflinewidth}
+ \pgfutil@tempdimb=3.75\pgfutil@tempdima\advance\pgfutil@tempdimb by0.5\pgflinewidth%
+ \pgfarrowsrightextend{+\pgfutil@tempdimb}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.2\pgflinewidth%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfqpoint{0\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.75\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{2.415\pgfutil@tempdima}{0\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{1.665\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{3\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.75\pgfutil@tempdima}{4.665\pgfutil@tempdima}}{\pgfqpoint{2.415\pgfutil@tempdima}{6\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{6\pgfutil@tempdima}}
+ \pgfpathmoveto{\pgfqpoint{0.75\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{2.415\pgfutil@tempdima}{0\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{-1.665\pgfutil@tempdima}}{\pgfqpoint{3.75\pgfutil@tempdima}{-3\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfqpoint{3.75\pgfutil@tempdima}{-4.665\pgfutil@tempdima}}{\pgfqpoint{2.415\pgfutil@tempdima}{-6\pgfutil@tempdima}}{\pgfqpoint{0.75\pgfutil@tempdima}{-6\pgfutil@tempdima}}
+ \pgfusepathqstroke%
+}%
+
+\pgfarrowsdeclarereversed{hooks reversed}{hooks reversed}{hooks}{hooks}%
+
+
+% An arrow that looks like a serif of the computer modern font
+
+\pgfarrowsdeclare{serif cm}{serif cm}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.45\pgflinewidth%
+ \pgfarrowsleftextend{+-.75\pgfutil@tempdima}
+ \pgfarrowsrightextend{+.04\pgflinewidth}
+}
+{
+ \pgfutil@tempdima=0.4pt%
+ \advance\pgfutil@tempdima by.45\pgflinewidth%
+ \pgftransformxshift{.04\pgflinewidth}
+ \pgfpathmoveto{\pgfqpoint{-.75\pgfutil@tempdima}{.5\pgflinewidth}}
+ \pgfpathcurveto
+ {\pgfqpoint{-.375\pgfutil@tempdima}{.5\pgflinewidth}}
+ {\pgfqpoint{-.375\pgfutil@tempdima}{.7\pgflinewidth}}
+ {\pgfqpoint{-.375\pgfutil@tempdima}{1.95\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1.95\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-.04\pgflinewidth}{.5\pgfutil@tempdima}}
+ {\pgfqpoint{-.04\pgflinewidth}{-.5\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{-1.95\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-.375\pgfutil@tempdima}{-1.95\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfqpoint{-.375\pgfutil@tempdima}{-.7\pgflinewidth}}
+ {\pgfqpoint{-.375\pgfutil@tempdima}{-.5\pgflinewidth}}
+ {\pgfqpoint{-.75\pgfutil@tempdima}{-.5\pgflinewidth}}
+ \pgfpathclose
+ \pgfusepathqfill
+}%
+
+
+
+% Round cap
+
+\pgfarrowsdeclare{round cap}{round cap}
+{\pgfarrowsleftextend{+0pt}\pgfarrowsrightextend{+\pgflinewidth}}
+{
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfqpoint{0.5\pgflinewidth}{0pt}}
+ \pgfusepathqstroke
+}%
+
+
+% Butt cap
+
+\pgfarrowsdeclare{butt cap}{butt cap}
+{\pgfarrowsleftextend{+-.1\pgflinewidth}\pgfarrowsrightextend{+.5\pgflinewidth}}
+{
+ \pgfsetdash{}{+0pt}
+ \pgfsetbuttcap
+ \pgfpathmoveto{\pgfqpoint{-.1\pgflinewidth}{0pt}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgflinewidth}{0pt}}
+ \pgfusepathqstroke
+}%
+
+
+
+% 90 degrees cap
+
+\pgfarrowsdeclare{triangle 90 cap}{triangle 90 cap}
+{\pgfarrowsleftextend{+-.1\pgflinewidth}\pgfarrowsrightextend{+\pgflinewidth}}
+{
+ \pgfpathmoveto{\pgfqpoint{-.1\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgflinewidth}{.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{\pgflinewidth}{0pt}}
+ \pgfpathlineto{\pgfqpoint{.5\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{-.1\pgflinewidth}{-0.5\pgflinewidth}}
+ \pgfpathclose
+ \pgfusepathqfill
+}%
+
+
+% reversed 90 degrees cap
+
+\pgfarrowsdeclare{triangle 90 cap reversed}{triangle 90 cap reversed}
+{\pgfarrowsleftextend{+-.1\pgflinewidth}\pgfarrowsrightextend{+\pgflinewidth}}
+{
+ \pgfpathmoveto{\pgfqpoint{1\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{-.1\pgflinewidth}{.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{-.1\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathclose
+ \pgfusepathqfill
+}%
+
+
+
+% fast
+
+\pgfarrowsdeclare{fast cap}{fast cap}
+{\pgfarrowsleftextend{+-.1\pgflinewidth}\pgfarrowsrightextend{+2\pgflinewidth}}
+{
+ \pgfpathmoveto{\pgfqpoint{-.1\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgflinewidth}{.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{-.1\pgflinewidth}{-0.5\pgflinewidth}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfqpoint{1\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1.5\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{2\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1.5\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1\pgflinewidth}{-0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1.5\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathclose
+ \pgfusepathqfill
+}%
+
+
+\pgfarrowsdeclare{fast cap reversed}{fast cap reversed}
+{\pgfarrowsleftextend{+-.1\pgflinewidth}\pgfarrowsrightextend{+2\pgflinewidth}}
+{
+ \pgfpathmoveto{\pgfqpoint{-.1\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1\pgflinewidth}{.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{-.1\pgflinewidth}{-0.5\pgflinewidth}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfqpoint{1.5\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{2\pgflinewidth}{0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1.5\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{2\pgflinewidth}{-.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1.5\pgflinewidth}{-0.5\pgflinewidth}}
+ \pgfpathlineto{\pgfqpoint{1\pgflinewidth}{0\pgflinewidth}}
+ \pgfpathclose
+ \pgfusepathqfill
+}%
+
+
+
+
+
+% Mathematical arrows
+
+
+% The arrow tip of an \implies arrow, to be used with an inner line.
+%
+% Example:
+%
+% \pgfsetarrow{-implies}
+% \pgfsetlinewidth{1.8pt}
+% \pgfsetinnerlinewidth{1pt}
+
+\pgfarrowsdeclare{implies}{implies}
+{
+ \pgfmathsetlength{\pgfutil@tempdima}{.25\pgflinewidth+.25*\pgfinnerlinewidth}%
+ \pgfmathsetlength{\pgfutil@tempdimb}{.5\pgflinewidth-.5*\pgfinnerlinewidth}%
+ \pgfarrowsrightextend{2.06\pgfutil@tempdima+.5\pgfutil@tempdimb}
+ \pgfarrowsleftextend{-1.36\pgfutil@tempdima-.5\pgfutil@tempdimb}
+}
+{
+ \pgfmathsetlength{\pgfutil@tempdima}{.25\pgflinewidth+.25*\pgfinnerlinewidth}%
+ \pgfmathsetlength{\pgfutil@tempdimb}{.5\pgflinewidth-.5*\pgfinnerlinewidth}%
+ \pgftransformxshift{.06\pgfutil@tempdima}
+ \pgfsetlinewidth{\pgfutil@tempdimb}
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfpoint{-1.4\pgfutil@tempdima}{2.65\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfpoint{-0.75\pgfutil@tempdima}{1.25\pgfutil@tempdima}}
+ {\pgfpoint{1\pgfutil@tempdima}{0.05\pgfutil@tempdima}}
+ {\pgfpoint{2\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfpoint{1\pgfutil@tempdima}{-0.05\pgfutil@tempdima}}
+ {\pgfpoint{-.75\pgfutil@tempdima}{-1.25\pgfutil@tempdima}}
+ {\pgfpoint{-1.4\pgfutil@tempdima}{-2.65\pgfutil@tempdima}}
+ \pgfusepathqstroke
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryarrows.meta.code.tex b/graphics/pgf/base/tex/pgflibraryarrows.meta.code.tex
new file mode 100644
index 0000000000..af509c1af6
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryarrows.meta.code.tex
@@ -0,0 +1,1607 @@
+% Copyright 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryarrows.meta.code.tex}
+
+
+
+%
+%
+% Meta keys
+%
+%
+
+
+\newdimen\pgfarrowinset
+\newdimen\pgfarrowlength
+\newdimen\pgfarrowwidth
+\newdimen\pgfarrowlinewidth
+\newif\ifpgfarrowroundcap
+\newif\ifpgfarrowroundjoin
+
+\pgfarrowsaddtolengthscalelist\pgfarrowlength
+\pgfarrowsaddtolengthscalelist\pgfarrowinset
+\pgfarrowsaddtowidthscalelist\pgfarrowwidth
+
+
+\pgfkeys{
+ /pgf/arrow keys/.cd,
+ length/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters\pgfarrowlength\pgf@x}%
+ },
+ inset/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{\expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters\pgfarrowinset\pgf@x}%
+ },
+ inset'/.code={
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{\expandafter\pgfarrowslengthdependent\pgfarrowstheparameters\pgfarrowinset}%
+ },
+ line width/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{\expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters\pgfarrowlinewidth\pgf@x}%
+ },
+ line width'/.code={
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{\expandafter\pgfarrowslengthdependent\pgfarrowstheparameters\pgfarrowlinewidth}%
+ },
+ width/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{\expandafter\pgfarrowslinewidthdependent\pgfarrowstheparameters\pgfarrowwidth\pgf@x}%
+ },
+ width'/.code={%
+ \pgfarrowsthreeparameters{#1}%
+ \expandafter\pgfarrowsaddtolateoptions\expandafter{\expandafter\pgfarrowslengthdependent\pgfarrowstheparameters\pgfarrowwidth}%
+ },
+ angle/.code={%
+ \pgfarrowsfourparameters{#1}%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\pgfarrows@angle@setup\pgfarrowstheparameters}%
+ },
+ angle'/.code={
+ \pgfarrowsaddtolateoptions{\pgfarrows@angle@setup@prime{#1}}%
+ },
+ %
+ line cap/.is choice,
+ line cap/butt/.code=\pgfarrowsaddtooptions{\pgfarrowroundcapfalse},
+ line cap/round/.code=\pgfarrowsaddtooptions{\pgfarrowroundcaptrue},
+ line join/.is choice,
+ line join/miter/.code=\pgfarrowsaddtooptions{\pgfarrowroundjoinfalse},
+ line join/round/.code=\pgfarrowsaddtooptions{\pgfarrowroundjointrue},
+ round/.style={line cap=round,line join=round},
+ sharp/.style={line cap=butt,line join=miter},
+}%
+%
+%
+% Classification of arrow tips:
+%
+%
+% Barbs
+% -----
+%
+% These arrow tips consisting of stroked lines starting at the tip,
+% typically going backward. They cannot be filled, only stroked
+%
+% A special case are the arrows mimicking the tip at the end of a
+% \rightarrow command.
+%
+%
+% Geometric
+% ---------
+%
+% The arrow tips have a geometric form like a triangle or a
+% "stealth" fighter or a kite. They can be filled and/or stroked.
+%
+%
+% Caps
+% ----
+%
+% These arrow tips have their width fixed to the line width and
+% provide different ways of adding a "cap" to the end of a line. This
+% allows one to use more than just the standard "round cap", "butt
+% cap" and "rect cap" and, additionally, one can one kind of cap at
+% one end and another at the other end.
+%
+%
+% Other
+% -----
+%
+% Special purpose arrow tips.
+%
+
+
+
+%
+%
+% Barbs arrow tips
+%
+%
+
+
+% An Straight Barb yields a simple angle
+
+\pgfdeclarearrow{
+ name = Straight Barb,
+ defaults = {
+ length = +1.5pt 2,
+ width' = +0pt 2,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ % Compute front miter length:
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowlength}{\pgf@sys@tonumber\pgfarrowwidth}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x4\pgf@x%
+ \advance\pgf@x by1pt%
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@xc\pgfmathresult\pgfarrowlinewidth% xc is front miter
+ \pgf@xc.5\pgf@xc
+ \pgf@xa\pgf@temp@quot\pgfarrowlinewidth% xa is extra harpoon miter
+ % Set ends
+ \ifpgfarrowroundjoin
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by\pgf@xc\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi}
+ \fi
+ \pgfarrowssetvisualbackend{\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}
+ \pgfarrowssetbackend{-.5\pgfarrowlinewidth}
+ % harpoon miter correction
+ \ifpgfarrowreversed
+ \pgfarrowssetlineend{\pgfarrowlength\ifpgfarrowharpoon\advance\pgf@x by.5\pgfarrowlinewidth\fi}
+ \else
+ \pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}
+ \fi
+ % The hull:
+ \ifpgfarrowroundjoin
+ \pgfarrowshullpoint{\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else0pt\fi}%
+ \else%
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{\pgfarrowlength\advance\pgf@x by\pgf@xc\advance\pgf@x by\pgf@xa}{-.5\pgfarrowlinewidth}%
+ \else
+ \pgfarrowshullpoint{\pgfarrowlength\advance\pgf@x by\pgf@xc\advance\pgf@x by\pgf@xa}{0pt}%
+ \fi%
+ \fi
+ \pgfarrowsupperhullpoint{.5\pgfarrowlinewidth}{.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}%
+ \pgfarrowsupperhullpoint{-.5\pgfarrowlinewidth}{.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}%
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{-.5\pgfarrowlinewidth}{-.5\pgfarrowlinewidth}%
+ \fi
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \pgfpathmoveto{\pgfqpoint{0pt}{.5\pgfarrowwidth}}
+ \pgfpathlineto{\pgfqpoint{\pgfarrowlength}{0pt}}
+ \ifpgfarrowharpoon
+ \pgfpathlineto{\pgfqpoint{\pgfarrowlength\advance\pgf@x by\ifpgfarrowreversed\else-\fi\pgfarrowlinewidth}{0pt}}
+ \else
+ \pgfpathlineto{\pgfqpoint{0pt}{-.5\pgfarrowwidth}}
+ \fi
+ \pgfusepathqstroke
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowroundjoin j\fi%
+ \ifpgfarrowroundcap c\fi%
+ },
+}%
+%
+%
+% Hooks are barbs that consist of an arc going forward from the line
+% end and curving back by a given angle specified using the |arc|
+% key.
+
+\pgfkeys{
+ /pgf/arrow keys/.cd,
+ arc/.code={%
+ \pgfmathparse{#1}%
+ \expandafter\pgfarrowsaddtooptions\expandafter{\expandafter\def\expandafter\pgfarrowarc\expandafter{\pgfmathresult}}
+ }
+}%
+
+\def\pgfarrowarc{180}%
+
+\pgfdeclarearrow{
+ name = Hooks,
+ defaults = {
+ length = +0.75pt 1.25,
+ width' = +0pt 4 -1,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{.5\pgfarrowlength}{-.5\pgfarrowlinewidth}
+ \pgfarrowshullpoint{\pgfarrowlength}{-.5\pgfarrowlinewidth\advance\pgf@y by.125\pgfarrowwidth}
+ \fi
+ \ifdim\pgfarrowarc pt<90.1pt
+ \pgfarrowsupperhullpoint{0pt}{.25\pgfarrowwidth\ifpgfarrowroundcap\else\advance\pgf@y by-.25\pgfarrowlinewidth\fi}
+ \pgfarrowsupperhullpoint{\pgfarrowlength}{.25\pgfarrowwidth\ifpgfarrowroundcap\else\advance\pgf@y by-.25\pgfarrowlinewidth\fi}
+ \else%
+ \pgfarrowsupperhullpoint{\pgfarrowlength}{.375\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{.5\pgfarrowlength}{.5\pgfarrowwidth}
+ \ifdim\pgfarrowarc pt>180pt
+ \pgfarrowsupperhullpoint{-.5\pgfarrowlength}{.5\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{-\pgfarrowlength}{.375\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{-\pgfarrowlength}{.25\pgfarrowwidth}
+ \else
+ \pgfarrowsupperhullpoint{\ifpgfarrowroundcap-.5\pgfarrowlinewidth\else0pt\fi}{.25\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{\ifpgfarrowroundcap-.5\pgfarrowlinewidth\else0pt\fi}{.5\pgfarrowwidth}
+ \fi
+ \fi
+ % Adjust width and length: Take line thickness into account:
+ \advance\pgfarrowlength by-.5\pgfarrowlinewidth
+ \advance\pgfarrowwidth by-\pgfarrowlinewidth
+ \ifpgfarrowreversed
+ \ifpgfarrowroundjoin
+ \pgfarrowssetbackend{-.5\pgfarrowlinewidth}
+ \fi
+ \fi
+ % There are four different intervals for the values of
+ % \pgfarrowsarc that give rise to four different settings of tip
+ % ends and so on:
+ %
+ % Case 1: 0 <= Angle < 90
+ %
+ \ifdim\pgfarrowarc pt<90pt%
+ % Tip end is given by sin(pgfarrowarc)*length
+ \pgfmathsin@{\pgfarrowarc}
+ \pgfarrowssettipend{\pgfmathresult\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}%
+ \else\ifdim\pgfarrowarc pt<180pt%
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}%
+ \ifpgfarrowroundcap\pgfarrowssetbackend{-.5\pgfarrowlinewidth}\fi%
+ \else\ifdim\pgfarrowarc pt<270pt%
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}%
+ \ifdim\pgfarrowarc pt>180pt
+ % Back end is given by sin(pgfarrowarc)*length
+ \pgfmathsin@{\pgfarrowarc}
+ \pgfarrowssetbackend{\pgfmathresult\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}%
+ \else
+ \ifpgfarrowroundcap\pgfarrowssetbackend{-.5\pgfarrowlinewidth}\fi%
+ \fi%
+ \else%
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by.5\pgfarrowlinewidth}%
+ \pgfarrowssetbackend{-\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}%
+ \fi\fi\fi%
+ \ifpgfarrowreversed
+ \pgfarrowssetlineend{.5\pgfarrowlinewidth}
+ \else%
+ \ifpgfarrowharpoon
+ \pgfarrowssetlineend{0pt}
+ \else
+ \pgfarrowssetlineend{.25\pgfarrowlinewidth}
+ \fi
+ \fi
+ % Adjust arc:
+ \pgf@x\pgfarrowarc pt%
+ \advance\pgf@x by-90pt%
+ \edef\pgfarrowarc{\pgf@sys@tonumber\pgf@x}%
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ \pgfarrowssave\pgfarrowarc
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ {%
+ \pgftransformxscale{+\pgfarrowlength}
+ \pgftransformyscale{+.25\pgfarrowwidth}
+ \pgfpathmoveto{\pgfpointpolar{+\pgfarrowarc}{+1pt}\advance\pgf@y by1pt}
+ \pgfpatharc{\pgfarrowarc}{+-90}{+1pt}
+ \ifpgfarrowharpoon
+ \else
+ \pgfpatharc{+90}{+-\pgfarrowarc}{+1pt}
+ \fi
+ }
+ \ifpgfarrowharpoon\ifpgfarrowreversed
+ \pgfpathlineto{\pgfqpoint{\pgflinewidth}{0pt}}
+ \fi\fi
+ \pgfusepathqstroke
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \pgfarrowarc,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowroundjoin j\fi%
+ \ifpgfarrowroundcap c\fi%
+ },
+}%
+
+
+\pgfdeclarearrow{
+ name = Arc Barb,
+ defaults = {
+ length = +1.5pt 2,
+ width' = +0pt 2,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ % Adjust arc:
+ \pgf@x\pgfarrowarc pt%
+ \pgf@x.5\pgf@x%
+ \edef\pgfarrowarc{\pgf@sys@tonumber\pgf@x}%
+ % The tips:
+ \pgfarrowssettipend{\pgfarrowlength}
+ \pgfarrowssetvisualbackend{\pgfarrowlength}
+ \pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}
+ % The hull:
+ \pgfarrowsupperhullpoint{\pgfarrowlength}{.25\pgfarrowwidth}
+ \ifpgfarrowharpoon\pgfarrowshullpoint{\pgfarrowlength}{-.5\pgflinewidth}\fi
+ \pgfmathsincos@{\pgfarrowarc}%
+ \pgf@xa.5\pgfarrowwidth%
+ \pgfarrowsupperhullpoint{\pgfmathresultx\pgfarrowlength}{\pgfmathresulty\pgf@xa}
+ \ifdim\pgfarrowarc pt>60pt
+ \pgfarrowsupperhullpoint{.5\pgfarrowlength}{\ifdim\pgfarrowarc pt<90pt\pgfmathresulty\pgf@xa\else.5\pgfarrowwidth\fi}
+ \fi
+ \ifdim\pgfarrowarc pt>90pt
+ \ifdim\pgfarrowarc pt<120pt
+ \pgfarrowsupperhullpoint{\pgfmathresultx\pgfarrowlength}{.5\pgfarrowwidth}
+ \else
+ \pgfarrowsupperhullpoint{-.5\pgfarrowlength}{.5\pgfarrowwidth}
+ \ifdim\pgfarrowarc pt>150pt
+ \pgfarrowsupperhullpoint{-\pgfarrowlength}{.25\pgfarrowwidth}
+ \fi
+ \fi
+ \fi
+ \pgfutil@tempswafalse
+ \ifdim\pgfarrowarc pt<90pt
+ \pgfutil@tempswatrue
+ \fi
+ \ifpgfarrowharpoon
+ \pgfutil@tempswatrue
+ \fi
+ \ifpgfutil@tempswa
+ \pgf@xa.5\pgfarrowwidth\advance\pgf@xa by-\pgfarrowlinewidth%
+ \pgf@ya\pgfarrowlength\advance\pgf@ya by-\pgfarrowlinewidth%
+ \pgfarrowsupperhullpoint{\pgfmathresultx\pgf@ya}{\pgfmathresulty\pgf@xa}
+ \fi
+ % Compute back end
+ \ifpgfarrowroundcap
+ \pgf@y\pgfarrowlength
+ \advance\pgf@y by-.5\pgfarrowlinewidth
+ \pgf@x\pgfmathresultx\pgf@y%
+ \else
+ \ifdim\pgfarrowarc pt<90pt
+ \pgf@y\pgfarrowlength
+ \advance\pgf@y by-\pgfarrowlinewidth
+ \pgf@x\pgfmathresultx\pgf@y%
+ \else
+ \pgf@x\pgfmathresultx\pgfarrowlength%
+ \fi
+ \fi
+ \pgfarrowssetbackend{\pgf@x\ifpgfarrowroundcap\advance\pgf@x by-.5\pgfarrowlinewidth\fi}
+ % Adjust width and length: Take line thickness into account:
+ \advance\pgfarrowlength by-.5\pgfarrowlinewidth
+ \advance\pgfarrowwidth by-\pgfarrowlinewidth
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ \pgfarrowssave\pgfarrowarc
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ {%
+ \pgftransformxscale{+\pgfarrowlength}
+ \pgftransformyscale{+.5\pgfarrowwidth}
+ \pgfpathmoveto{\pgfpointpolar{+\pgfarrowarc}{+1pt}}
+ \ifpgfarrowharpoon
+ \pgfpatharc{+\pgfarrowarc}{0pt}{+1pt}
+ \else
+ \pgfpatharc{+\pgfarrowarc}{+-\pgfarrowarc}{+1pt}
+ \fi
+ }
+ \ifpgfarrowharpoon
+ \pgfpathlineto{\pgfqpoint{\pgfarrowlength\advance\pgf@x by\ifpgfarrowreversed\else-\fi.5\pgflinewidth}{0pt}}
+ \fi
+ \pgfusepathqstroke
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \pgfarrowarc,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowroundcap c\fi%
+ \ifpgfarrowroundjoin j\fi%
+ },
+}%
+
+
+
+% Tee Barb are barb arrows heads that look like a T
+
+\pgfdeclarearrow{
+ name = Tee Barb,
+ defaults = {
+ length = +1.5pt 2,
+ width = +3pt 4,
+ inset' = +0pt .5,
+ line width = +0pt 1 1,
+ },
+ bending mode=polar,
+ setup code = {
+ % Two useful numbers...
+ \pgfutil@tempswafalse%
+ \pgfutil@tempswbfalse%
+ \pgfutil@tempdima\pgfarrowlength\advance\pgfutil@tempdima by-\pgfarrowinset\ifdim\pgfutil@tempdima<.5\pgfarrowlinewidth\pgfutil@tempdima.5\pgfarrowlinewidth\pgfutil@tempswatrue\fi%
+ \pgfutil@tempdimb-\pgfarrowinset\ifdim\pgfutil@tempdimb>-.5\pgfarrowlinewidth\pgfutil@tempdimb-.5\pgfarrowlinewidth\pgfutil@tempswbtrue\fi
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfarrowwidth
+ \pgfarrowssavethe\pgfutil@tempdima
+ \pgfarrowssavethe\pgfutil@tempdimb
+ % Infos:
+ \pgfarrowssettipend{\pgfutil@tempdima\ifpgfarrowroundcap\ifpgfutil@tempswa\else\advance\pgf@x by.5\pgfarrowlinewidth\fi\fi}
+ \pgfarrowssetvisualbackend{.5\pgfarrowlinewidth}
+ \pgfarrowssetbackend{\pgfutil@tempdimb\ifpgfarrowroundcap\ifpgfutil@tempswb\else\advance\pgf@x by-.5\pgfarrowlinewidth\fi\fi}
+ \pgfarrowssetlineend{\ifpgfarrowreversed\else-\fi.25\pgfarrowlinewidth}%
+ % The hull:
+ \pgfarrowsupperhullpoint{\pgfutil@tempdima\ifpgfarrowroundcap\ifpgfutil@tempswa\else\advance\pgf@x by.5\pgfarrowlinewidth\fi\fi}{.5\pgfarrowwidth}%
+ \pgfarrowsupperhullpoint{\pgfutil@tempdimb\ifpgfarrowroundcap\ifpgfutil@tempswb\else\advance\pgf@x by-.5\pgfarrowlinewidth\fi\fi}{.5\pgfarrowwidth}%
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{.5\pgfarrowlinewidth}{-.5\pgfarrowlinewidth}%
+ \fi
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \pgf@yc\pgflinewidth% save...
+ \ifdim\pgflinewidth=\pgfarrowlinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \pgf@x\pgfutil@tempdima\advance\pgf@x by-.5\pgfarrowlinewidth%
+ \pgf@y\pgfutil@tempdimb\advance\pgf@y by.5\pgfarrowlinewidth%
+ % Case 1: No bar atop the I:
+ \ifdim\pgf@x=\pgf@y%
+ \pgfpathmoveto{\pgfqpoint{0pt}{.5\pgfarrowwidth}}
+ \pgfpathlineto{\pgfqpoint{0pt}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else-.5\pgfarrowwidth\fi}}
+ \else
+ % Case 2: Bar, but only in one direction:
+ \ifdim\pgfutil@tempdima=.5\pgfarrowlinewidth%
+ \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdimb}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \pgfpathlineto{\pgfqpoint{0pt}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \ifpgfarrowharpoon%
+ \pgfpathlineto{\pgfqpoint{0pt}{-.5\pgf@yc}}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{0pt}{-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}}
+ \pgfpathlineto{\pgfqpoint{\pgfutil@tempdimb}{-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}}
+ \fi
+ \else% Case 3: Complete I:
+ \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdimb}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \pgfpathlineto{\pgfqpoint{\pgfutil@tempdima}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \pgfpathmoveto{\pgfqpoint{0pt}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \ifpgfarrowharpoon%
+ \pgfpathlineto{\pgfqpoint{0pt}{-.5\pgf@yc}}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{0pt}{-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}}
+ \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdimb}{-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}}
+ \pgfpathlineto{\pgfqpoint{\pgfutil@tempdima}{-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth}}
+ \fi
+ \fi
+ \fi
+ \pgfusepathqstroke
+ },
+ parameters = {
+ \the\pgfarrowwidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowinset,%
+ \the\pgfarrowlinewidth,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowroundjoin j\fi%
+ \ifpgfarrowroundcap c\fi%
+ },
+}%
+
+
+% Math barbs that resemble \rightarrow in different fonts:
+
+
+
+% The original default arrow head used in TikZ. It is modeled on an
+% old version of the \rightarrow head of the *old* Computer Modern
+% fonts.
+
+\pgfdeclarearrow{
+ name = Classical TikZ Rightarrow,
+ defaults = {
+ length = +1.05pt 1.925,
+ width' = +0pt 1.9237,
+ line width = 0pt 0.8 1,
+ round
+ },
+ setup code =
+ {
+ \ifpgfarrowharpoon\pgfarrowroundjointrue\fi
+ % inner length:
+ \pgfutil@tempdima\pgfarrowlength
+ \advance\pgfutil@tempdima by-\pgfarrowlinewidth
+ \pgfutil@tempdimb\pgfarrowwidth
+ \advance\pgfutil@tempdimb by-\pgfarrowlinewidth
+ \ifpgfarrowroundjoin%
+ \else%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfutil@tempdima}{\pgf@sys@tonumber\pgfutil@tempdimb}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x40.96\pgf@x%
+ \advance\pgf@x by1pt% \pgflinewidth^2 + (6.4 \pgftempdim@a / \pgfutil@tempdimb) \pgflinewidth^2
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@xc\pgfmathresult\pgfarrowlinewidth% xc is front miter
+ \pgf@xc.5\pgf@xc
+ \fi%
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfutil@tempdima
+ \pgfarrowssavethe\pgfutil@tempdimb
+ % The extend:
+ \pgfarrowssettipend{\pgfutil@tempdima\ifpgfarrowroundjoin\advance\pgf@x by.5\pgfarrowlinewidth\else\advance\pgf@x by\pgf@xc\fi}%
+ \pgfarrowssetvisualbackend{\pgfutil@tempdima\advance\pgf@x by.5\pgfarrowlinewidth}%
+ \ifpgfarrowreversed%
+ \ifpgfarrowharpoon%
+ % A reversed arrow needs a slightly different line end:
+ \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by.5\pgflinewidth}%
+ \else%
+ % A reversed arrow needs a slightly different line end:
+ \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by-.25\pgflinewidth}%
+ \fi%
+ \else%
+ \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by-.6\pgflinewidth}%
+ \fi%
+ \pgfarrowssetbackend{-.5\pgfarrowlinewidth}%
+ % The hull:
+ % Tip:
+ \pgfarrowshullpoint{\pgfutil@tempdima\ifpgfarrowroundjoin\advance\pgf@x by.5\pgfarrowlinewidth\else\advance\pgf@x by\pgf@xc\fi}{.5\pgfarrowlinewidth}%
+ \pgfarrowshullpoint{\pgfutil@tempdima\ifpgfarrowroundjoin\advance\pgf@x by.5\pgfarrowlinewidth\else\advance\pgf@x by\pgf@xc\fi}{-.5\pgfarrowlinewidth}%
+ % Upper end:
+ \pgfarrowsupperhullpoint{.5\pgfarrowlinewidth}{.5\pgfutil@tempdimb\advance\pgf@y by.5\pgfarrowlinewidth}%
+ \pgfarrowsupperhullpoint{-.5\pgfarrowlinewidth}{.5\pgfutil@tempdimb\advance\pgf@y by.5\pgfarrowlinewidth}%
+ % Lower end:
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{\pgfutil@tempdima\advance\pgf@x by-\pgflinewidth}{-.5\pgflinewidth}%
+ \pgfarrowshullpoint{-.5\pgfarrowlinewidth}{.5\pgfutil@tempdimb\advance\pgf@y by-.5\pgflinewidth}%
+ \fi
+ },
+ drawing code =
+ {
+ \pgfsetdash{}{+0pt}
+ \edef\pgf@orig@linewidth{\the\pgflinewidth}
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \ifpgfarrowharpoon\pgfarrowroundjointrue\fi
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \pgfpathmoveto
+ {\pgfqpoint{0pt}{.5\pgfutil@tempdimb}}
+ \ifpgfarrowharpoon
+ \pgf@arrows@old@tikz@harpoon
+ \else
+ \pgfpathcurveto
+ {\pgfqpoint{0.066666\pgfutil@tempdima}{0.3125\pgfutil@tempdimb}}
+ {\pgfqpoint{.8\pgfutil@tempdima}{0.03125\pgfutil@tempdimb}}
+ {\pgfqpoint{\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfqpoint{.8\pgfutil@tempdima}{-.03125\pgfutil@tempdimb}}
+ {\pgfqpoint{0.066666\pgfutil@tempdima}{-.3125\pgfutil@tempdimb}}
+ {\pgfqpoint{0pt}{-.5\pgfutil@tempdimb}}
+ \pgfsetlinewidth{+\pgfarrowlinewidth}
+ \pgfusepathqstroke
+ \fi
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowroundjoin j\fi%
+ \ifpgfarrowroundcap c\fi%
+ },
+}%
+
+\def\pgf@arrows@old@tikz@harpoon{
+ \ifpgfarrowreversed
+ \pgf@arrows@old@tikz@harpoon@reversed
+ \else
+ \pgfpathcurveto
+ {\pgfqpoint{0.066666\pgfutil@tempdima}{0.3125\pgfutil@tempdimb}}
+ {\pgfqpoint{.8\pgfutil@tempdima}{0.03125\pgfutil@tempdimb}}
+ {\pgfqpoint{\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfqpoint{0.95\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ {\pgfqpoint{0.933333\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ {\pgfqpoint{0.933333\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ \pgfpathlineto
+ {\pgfqpoint{0.8\pgfutil@tempdima\advance\pgf@x by-.5\pgflinewidth}{-0.125\pgflinewidth}}
+ \pgfusepathqstroke
+ \fi
+}%
+\def\pgf@arrows@old@tikz@harpoon@reversed{
+ \pgfpathcurveto
+ {\pgfqpoint{0.066666\pgfutil@tempdima}{0.3125\pgfutil@tempdimb}}
+ {\pgfqpoint{.8\pgfutil@tempdima}{0.03125\pgfutil@tempdimb}}
+ {\pgfqpoint{\pgfutil@tempdima}{0.125\pgflinewidth}}
+ \pgfpathmoveto
+ {\pgfqpoint{0pt}{.5\pgfutil@tempdimb}}
+ \pgfpathcurveto
+ {\pgfqpoint{0.066666\pgfutil@tempdima}{0.3125\pgfutil@tempdimb}}
+ {\pgfqpoint{.8\pgfutil@tempdima}{0.03125\pgfutil@tempdimb}}
+ {\pgfqpoint{\pgfutil@tempdima}{-0.125\pgflinewidth}}
+ \pgfusepathqstroke
+ \pgfsetlinewidth{+\pgf@orig@linewidth}
+ \pgfsetroundcap
+ \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdima\advance\pgf@x by0.6\pgflinewidth}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgfutil@tempdima}{0pt}}
+ \pgfusepathqstroke
+}%
+
+
+% An approximation to the new (past 1992) Computer Modern math arrow
+% heads. This would be a better version of "to", so consider saying
+% to/.tips=Computer Modern Rightarrow
+
+\pgfdeclarearrow{
+ name = Computer Modern Rightarrow,
+ defaults = {
+ length = +1.6pt 2.2, % 0pt 5.2
+ width' = +0pt 2.096774,
+ line width = 0pt 1 1,
+ round
+ },
+ setup code =
+ {
+ % inner length:
+ \pgfutil@tempdima\pgfarrowlength
+ \advance\pgfutil@tempdima by-\pgfarrowlinewidth
+ \pgfutil@tempdimb\pgfarrowwidth
+ \advance\pgfutil@tempdimb by-\pgfarrowlinewidth
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfutil@tempdima
+ \pgfarrowssavethe\pgfutil@tempdimb
+ % Front miter:
+ \ifpgfarrowroundjoin%
+ \else%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfutil@tempdima}{\pgf@sys@tonumber\pgfutil@tempdimb}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x49.44662\pgf@x%
+ \advance\pgf@x by1pt% \pgfarrowlinewidth^2 + (0.41019/0.0583333 \pgftempdim@a / \pgfutil@tempdimb) \pgfarrowlinewidth^2
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@xc\pgfmathresult\pgfarrowlinewidth% xc is front miter
+ \pgf@xc.5\pgf@xc
+ \pgf@xa\pgf@temp@quot\pgfarrowlinewidth% xa is extra harpoon miter
+ \pgf@xa3.51591\pgf@xa% xa is extra harpoon miter
+ \fi%
+ % The extend:
+ \pgfarrowssettipend{\ifpgfarrowroundjoin.5\pgfarrowlinewidth\else\pgf@xc\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi\fi}%
+ \pgfarrowssetvisualbackend{.5\pgfarrowlinewidth}%
+ \ifpgfarrowreversed%
+ \ifpgfarrowharpoon%
+ \pgfarrowssetlineend{.5\pgfarrowlinewidth}%
+ \else%
+ \pgfarrowssetlineend{-.5\pgfarrowlinewidth}%
+ \fi%
+ \else%
+ \pgfarrowssetlineend{-.5\pgfarrowlinewidth}%
+ \fi%
+ \pgfarrowssetbackend{-\pgfutil@tempdima\advance\pgf@x by-.5\pgfarrowlinewidth}%
+ % The hull:
+ % Tip:
+ \pgfarrowshullpoint{\ifpgfarrowroundjoin.5\pgfarrowlinewidth\else\pgf@xc\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi\fi}{.5\pgfarrowlinewidth}%
+ \pgfarrowshullpoint{\ifpgfarrowroundjoin.5\pgfarrowlinewidth\else\pgf@xc\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi\fi}{-.5\pgfarrowlinewidth}%
+ % Upper end:
+ \pgfarrowsupperhullpoint{-\pgfutil@tempdima\advance\pgf@x by.5\pgfarrowlinewidth}{.5\pgfutil@tempdimb\advance\pgf@y by.5\pgfarrowlinewidth}%
+ \pgfarrowsupperhullpoint{-\pgfutil@tempdima\advance\pgf@x by-.5\pgfarrowlinewidth}{.5\pgfutil@tempdimb\advance\pgf@y by.5\pgfarrowlinewidth}%
+ % Lower end:
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{-\pgfarrowlinewidth}{-.5\pgfarrowlinewidth}%
+ \pgfarrowshullpoint{-\pgfutil@tempdima\advance\pgf@x by-.5\pgfarrowlinewidth}{.5\pgfutil@tempdimb\advance\pgf@y by-.5\pgfarrowlinewidth}%
+ \fi
+ },
+ drawing code =
+ {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \pgfpathmoveto
+ {\pgfqpoint{-\pgfutil@tempdima}{.5\pgfutil@tempdimb}}
+ \pgfpathcurveto
+ {\pgfqpoint{-0.81731\pgfutil@tempdima}{.2\pgfutil@tempdimb}}
+ {\pgfqpoint{-0.41019\pgfutil@tempdima}{0.05833333\pgfutil@tempdimb}}
+ {\pgfpointorigin}
+ \ifpgfarrowharpoon
+ \pgfpathlineto
+ {\pgfqpoint{\ifpgfarrowreversed.5\else-\fi\pgfarrowlinewidth}{0pt}}
+ \else
+ \pgfpathcurveto
+ {\pgfqpoint{-0.41019\pgfutil@tempdima}{-0.05833333\pgfutil@tempdimb}}
+ {\pgfqpoint{-0.81731\pgfutil@tempdima}{-.2\pgfutil@tempdimb}}
+ {\pgfqpoint{-\pgfutil@tempdima}{-.5\pgfutil@tempdimb}}
+ \fi
+ \pgfusepathqstroke
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowharpoon h\fi
+ \ifpgfarrowharpoon r\fi
+ \ifpgfarrowroundjoin j\fi%
+ \ifpgfarrowroundcap c\fi%
+ },
+}%
+
+
+
+% The arrow tip of an \implies arrow, to be used with an inner
+% line. Cannot be configured otherwise.
+
+\pgfdeclarearrow{
+ name = Implies,
+ setup code = {
+ \pgf@xa\pgfinnerlinewidth
+ \pgfutil@tempdima.25\pgflinewidth
+ \advance\pgfutil@tempdima by.25\pgf@xa%
+ \pgfutil@tempdimb.5\pgflinewidth
+ \advance\pgfutil@tempdimb by-.5\pgf@xa%
+ \pgfarrowssettipend{2.06\pgfutil@tempdima\advance\pgf@x by.5\pgfutil@tempdimb}
+ \pgfarrowssetbackend{-1.36\pgfutil@tempdima\advance\pgf@x by.5\pgfutil@tempdimb}
+ \pgfarrowsupperhullpoint{-1.4\pgfutil@tempdima}{2.8\pgfutil@tempdima}
+ \pgfarrowsupperhullpoint{2\pgfutil@tempdima}{.5\pgfutil@tempdimb}
+ \pgfarrowssavethe\pgfutil@tempdima
+ \pgfarrowssavethe\pgfutil@tempdimb
+ },
+ drawing code = {
+ \pgftransformxshift{.06\pgfutil@tempdima}
+ \pgfsetlinewidth{\pgfutil@tempdimb}
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundcap
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfpoint{-1.4\pgfutil@tempdima}{2.65\pgfutil@tempdima}}
+ \pgfpathcurveto
+ {\pgfpoint{-0.75\pgfutil@tempdima}{1.25\pgfutil@tempdima}}
+ {\pgfpoint{1\pgfutil@tempdima}{0.05\pgfutil@tempdima}}
+ {\pgfpoint{2\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto
+ {\pgfpoint{1\pgfutil@tempdima}{-0.05\pgfutil@tempdima}}
+ {\pgfpoint{-.75\pgfutil@tempdima}{-1.25\pgfutil@tempdima}}
+ {\pgfpoint{-1.4\pgfutil@tempdima}{-2.65\pgfutil@tempdima}}
+ \pgfusepathqstroke
+ },
+ parameters = {\the\pgfarrowlength}
+}%
+
+
+
+
+%
+%
+% Geometric arrow tips
+%
+%
+
+
+% Generic "latex-like" arrow tip. This is the basic arrow tip used in
+% latex's picture environment. You can configure its length and width.
+
+\pgfdeclarearrow{
+ name = Latex,
+ defaults = {
+ length = +3pt 4.5 .8,% +2.8pt 3 0.8,
+ width' = +0pt .75,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ % Cap the line width at 1/4th distance from inset to tip
+ \pgf@x.2\pgfarrowlength
+ \ifdim\pgf@x<\pgfarrowlinewidth
+ \pgfarrowlinewidth\pgf@x
+ \fi
+ \pgfarrowssavethe\pgfarrowlinewidth%
+ % Compute front miter length:
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowlength}{\pgf@sys@tonumber\pgfarrowwidth}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x9\pgf@x%
+ \advance\pgf@x by1pt%
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@xc\pgfmathresult\pgfarrowlinewidth%
+ \pgf@xa\pgf@temp@quot\pgfarrowlinewidth
+ % Inner length (pgfutil@tempdima) is now arrowlength - front miter
+ % - 0.5 linewidth (back thickness)
+ \pgfutil@tempdima\pgfarrowlength%
+ \advance\pgfutil@tempdima by-.5\pgf@xc%
+ \advance\pgfutil@tempdima by-.5\pgfarrowlinewidth%
+ % harpoon miter correction
+ \pgfarrowssetbackend{-.5\pgfarrowlinewidth}
+ \ifpgfarrowreversed
+ \ifdim\pgfinnerlinewidth>0pt
+ \pgfarrowssetlineend{0pt}
+ \else
+ \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by-.5\pgflinewidth}
+ \fi
+ \else
+ \pgfarrowssetlineend{0pt}
+ \fi
+ \ifpgfarrowroundjoin
+ \pgfarrowssettipend{\pgfutil@tempdima\advance\pgf@x by.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth\ifpgfarrowharpoon\advance\pgf@x by1.5\pgf@xa\fi}
+ \fi
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfutil@tempdima
+ % Now, compute back tip miter limit:
+ \pgf@process{\pgfpointnormalised{\pgfqpoint{.3\pgfarrowlength}{.2333333\pgfarrowwidth}}}%
+ \advance\pgf@y by1pt%
+ \pgf@yc\pgf@y\pgf@xc\pgf@x%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@yc}{\pgf@sys@tonumber\pgf@xc}%
+ \pgfutil@tempdimb\pgfmathresult\pgfarrowlinewidth%
+ \pgfutil@tempdimb-.5\pgfutil@tempdimb%
+ \advance\pgfutil@tempdimb by.5\pgfarrowwidth%
+ \pgfarrowssavethe\pgfutil@tempdimb%
+ % The hull:
+ \pgfarrowshullpoint{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth\ifpgfarrowroundjoin\else\ifpgfarrowharpoon\advance\pgf@x by1.5\pgf@xa\fi\fi}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else0pt\fi}%
+ \pgfarrowshullpoint{-.5\pgfarrowlinewidth}{.5\pgfarrowwidth\ifpgfarrowharpoon\advance\pgf@y by-.5\pgfarrowlinewidth\fi}%
+ \pgfarrowshullpoint{-.5\pgfarrowlinewidth}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else-.5\pgfarrowwidth\fi}%
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \pgfpathmoveto {\pgfqpoint{\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto {\pgfqpoint{.877192\pgfutil@tempdima}{.077922\pgfutil@tempdimb}}
+ {\pgfqpoint{.337381\pgfutil@tempdima}{.519480\pgfutil@tempdimb}}
+ {\pgfqpoint{0pt}{\pgfutil@tempdimb}}
+ \ifpgfarrowharpoon
+ \pgfpathlineto {\pgfpointorigin}
+ \else
+ \pgfpathlineto {\pgfqpoint{0pt}{-\pgfutil@tempdimb}}
+ \pgfpathcurveto {\pgfqpoint{.337381\pgfutil@tempdima}{-.519480\pgfutil@tempdimb}}
+ {\pgfqpoint{.877192\pgfutil@tempdima}{-.077922\pgfutil@tempdimb}}
+ {\pgfqpoint{\pgfutil@tempdima}{0pt}}
+ \fi
+ \pgfpathclose
+ \ifpgfarrowopen\pgfusepathqstroke\else\ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi\fi
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi%
+ },
+}%
+
+
+
+% A basic stealth-fighter-like pointed arrow
+
+\pgfdeclarearrow{
+ name = Stealth,
+ defaults = {
+ length = +3pt 4.5 .8,
+ width' = +0pt .75,
+ inset' = +0pt 0.325,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ % Cap the line width at 1/4th distance from inset to tip
+ \pgf@x\pgfarrowlength
+ \advance\pgf@x by-\pgfarrowinset
+ \pgf@x.25\pgf@x
+ \ifdim\pgf@x<\pgfarrowlinewidth
+ \pgfarrowlinewidth\pgf@x
+ \fi
+ % Compute front miter length:
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowlength}{\pgf@sys@tonumber\pgfarrowwidth}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x4\pgf@x%
+ \advance\pgf@x by1pt%
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@xc\pgfmathresult\pgfarrowlinewidth% xc is front miter
+ \pgf@xc.5\pgf@xc
+ \pgf@xa\pgf@temp@quot\pgfarrowlinewidth% xa is extra harpoon miter
+ % Compute back miter length:
+ \pgf@ya.5\pgfarrowwidth%
+ \csname pgfmathatan2@\endcsname{\pgfmath@tonumber\pgfarrowlength}{\pgfmath@tonumber\pgf@ya}%
+ \pgf@yb\pgfmathresult pt%
+ \csname pgfmathatan2@\endcsname{\pgfmath@tonumber\pgfarrowinset}{\pgfmath@tonumber\pgf@ya}%
+ \pgf@ya\pgfmathresult pt%
+ \advance\pgf@yb by-\pgf@ya%
+ \pgf@yb.5\pgf@yb% half angle in yb
+ \pgfmathtan@{\pgf@sys@tonumber\pgf@yb}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@yc\pgfmathresult\pgfarrowlinewidth%
+ \pgf@yc.5\pgf@yc%
+ \advance\pgf@ya by\pgf@yb%
+ \pgfmathsincos@{\pgf@sys@tonumber\pgf@ya}%
+ \pgf@ya\pgfmathresulty\pgf@yc% ya is the back miter
+ \pgf@yb\pgfmathresultx\pgf@yc% yb is the top miter
+ \ifdim\pgfarrowinset=0pt%
+ \pgf@ya.5\pgfarrowlinewidth% easy: back miter is half linewidth
+ \fi
+ % Compute inset miter length:
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowinset}{\pgf@sys@tonumber\pgfarrowwidth}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x4\pgf@x%
+ \advance\pgf@x by1pt%
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@yc\pgfmathresult\pgfarrowlinewidth% yc is inset miter
+ \pgf@yc.5\pgf@yc%
+ % Inner length (pgfutil@tempdima) is now arrowlength - front miter - back miter
+ \pgfutil@tempdima\pgfarrowlength%
+ \advance\pgfutil@tempdima by-\pgf@xc%
+ \advance\pgfutil@tempdima by-\pgf@ya%
+ \pgfutil@tempdimb.5\pgfarrowwidth%
+ \advance\pgfutil@tempdimb by-\pgf@yb%
+ % harpoon miter correction
+ \ifpgfarrowroundjoin
+ \pgfarrowssetbackend{\pgf@ya\advance\pgf@x by-.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssetbackend{0pt}
+ \fi
+ \ifpgfarrowharpoon
+ \pgfarrowssetlineend{\pgfarrowinset\advance\pgf@x
+ by\pgf@yc\advance\pgf@x by.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssetlineend{\pgfarrowinset\advance\pgf@x by\pgf@yc\advance\pgf@x by-.25\pgfarrowlinewidth}
+ \ifpgfarrowreversed
+ \ifdim\pgfinnerlinewidth>0pt
+ \pgfarrowssetlineend{\pgfarrowinset}
+ \else
+ \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by\pgf@ya\advance\pgf@x by-.25\pgfarrowlinewidth}
+ \fi
+ \fi
+ \fi
+ \ifpgfarrowroundjoin
+ \pgfarrowssettipend{\pgfutil@tempdima\advance\pgf@x by\pgf@ya\advance\pgf@x by.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssettipend{\pgfarrowlength\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi}
+ \fi
+ % The hull:
+ \pgfarrowshullpoint{\pgfarrowlength\ifpgfarrowroundjoin\else\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi\fi}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else0pt\fi}%
+ \pgfarrowsupperhullpoint{0pt}{.5\pgfarrowwidth}%
+ \pgfarrowshullpoint{\pgfarrowinset}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else 0pt\fi}%
+ % Adjust inset
+ \pgfarrowssetvisualbackend{\pgfarrowinset}
+ \advance\pgfarrowinset by\pgf@yc%
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfutil@tempdima
+ \pgfarrowssavethe\pgfutil@tempdimb
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgf@ya
+ \pgfarrowssavethe\pgfarrowinset
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdima\advance\pgf@x by\pgf@ya}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgf@ya}{\pgfutil@tempdimb}}
+ \pgfpathlineto{\pgfqpoint{\pgfarrowinset}{0pt}}
+ \ifpgfarrowharpoon \else
+ \pgfpathlineto{\pgfqpoint{\pgf@ya}{-\pgfutil@tempdimb}}
+ \fi
+ \pgfpathclose
+ \ifpgfarrowopen\pgfusepathqstroke\else\ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi\fi
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \the\pgfarrowinset,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi%
+ },
+}%
+
+
+
+% A Kite is like a Stealth, only the inset counts in the other direction
+
+\pgfdeclarearrow{
+ name = Kite,
+ defaults = {
+ length = +3.6pt +5.4,
+ width' = +0pt +0.5,
+ inset' = +0pt 0.25,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ % Cap the line width at 1/4th of the length
+ \pgf@x.4\pgfarrowlength
+ \ifdim\pgf@x<\pgfarrowlinewidth
+ \pgfarrowlinewidth\pgf@x
+ \fi
+ \pgf@x.4\pgfarrowwidth
+ \ifdim\pgf@x<\pgfarrowlinewidth
+ \pgfarrowlinewidth\pgf@x
+ \fi
+ % Compute front miter length:
+ \pgf@xa\pgfarrowlength%
+ \advance\pgf@xa by-\pgfarrowinset%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgfarrowwidth}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x4\pgf@x%
+ \advance\pgf@x by1pt%
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@xc\pgfmathresult\pgfarrowlinewidth% xc is front miter
+ \pgf@xc.5\pgf@xc
+ \pgf@xa\pgf@temp@quot\pgfarrowlinewidth% xa is extra harpoon miter
+ % Compute back miter length:
+ \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowinset}{\pgf@sys@tonumber\pgfarrowwidth}%
+ \let\pgf@temp@quot\pgfmathresult%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@x4\pgf@x%
+ \advance\pgf@x by1pt%
+ \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@yc\pgfmathresult\pgfarrowlinewidth% yc is back miter
+ \pgf@yc.5\pgf@yc
+ \pgf@ya\pgf@temp@quot\pgfarrowlinewidth% ya is extra harpoon miter
+ % Compute top miter length:
+ {%
+ \pgfutil@tempdimb.5\pgfarrowwidth%
+ \pgfutil@tempdima\pgfarrowlength\advance\pgfutil@tempdima by-\pgfarrowinset%
+ \csname pgfmathatan2@\endcsname{\pgfmath@tonumber\pgfutil@tempdima}{\pgfmath@tonumber\pgfutil@tempdimb}%
+ \pgf@yb\pgfmathresult pt%
+ \csname pgfmathatan2@\endcsname{\pgfmath@tonumber\pgfarrowinset}{\pgfmath@tonumber\pgfutil@tempdimb}%
+ \pgf@ya\pgfmathresult pt%
+ \advance\pgf@yb by\pgf@ya%
+ \pgf@yb.5\pgf@yb% half angle in yb
+ \ifdim\pgf@yb=45pt%
+ \def\pgfmathresult{1.414213}%
+ \else%
+ \pgfmathsin@{\pgf@sys@tonumber\pgf@yb}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \fi%
+ \pgf@yc\pgfmathresult\pgfarrowlinewidth%
+ \pgf@yc.5\pgf@yc%
+ \pgf@ya-\pgf@ya%
+ \advance\pgf@ya by-90pt%
+ \advance\pgf@ya by\pgf@yb%
+ \pgfmathsincos@{\pgf@sys@tonumber\pgf@ya}%
+ \pgf@xb\pgfmathresultx\pgf@yc% ya is the back miter
+ \pgf@yb\pgfmathresulty\pgf@yc% yb is the top miter
+ \expandafter\expandafter\expandafter%
+ }\expandafter\expandafter\expandafter\pgf@xb\expandafter\the\expandafter\pgf@xb\expandafter\pgf@yb\the\pgf@yb%
+ % Inner length (pgfutil@tempdima) is now arrowlength - front miter - back miter
+ \pgfutil@tempdima\pgfarrowlength%
+ \advance\pgfutil@tempdima by-\pgf@xc%
+ \pgfutil@tempdimb.5\pgfarrowwidth%
+ \advance\pgfutil@tempdimb by\pgf@yb%
+ % Set back end
+ \ifpgfarrowroundjoin
+ \pgfarrowssetbackend{\pgf@ya\advance\pgf@x by-.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssetbackend{0pt}
+ \fi
+ % harpoon miter correction
+ \ifpgfarrowreversed
+ \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by-\pgflinewidth\advance\pgf@x by\pgfarrowlinewidth}
+ \else
+ \pgfarrowssetlineend{\pgf@yc\advance\pgf@x by\pgflinewidth\advance\pgf@x by-\pgfarrowlinewidth}
+ \fi
+ \ifpgfarrowroundjoin
+ \pgfarrowssettipend{\pgfutil@tempdima\advance\pgf@x by.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssettipend{\pgfarrowlength\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi}
+ \fi
+ % The hull:
+ \pgfarrowshullpoint{\pgfarrowlength\ifpgfarrowroundjoin\else\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi\fi}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else0pt\fi}%
+ \pgfarrowsupperhullpoint{\pgfarrowinset}{.5\pgfarrowwidth}%
+ \pgfarrowshullpoint{0pt}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else0pt\fi}%
+ % Adjust the inset:
+ \advance\pgfarrowinset by\pgf@xb%
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfutil@tempdima
+ \pgfarrowssavethe\pgfutil@tempdimb
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgf@yc
+ \pgfarrowssavethe\pgfarrowinset
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{\pgfarrowlinewidth}\fi
+ \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdima}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgfarrowinset}{\pgfutil@tempdimb}}
+ \pgfpathlineto{\pgfqpoint{\pgf@yc}{0pt}}
+ \ifpgfarrowharpoon \else
+ \pgfpathlineto{\pgfqpoint{\pgfarrowinset}{-\pgfutil@tempdimb}}
+ \fi
+ \pgfpathclose
+ \ifpgfarrowopen\pgfusepathqstroke\else\ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi\fi
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \the\pgfarrowinset,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi%
+ },
+}%
+
+
+
+
+% A simple rectangle shape
+
+\pgfdeclarearrow{
+ name = Square,
+ defaults = {
+ length = +2.12132pt +2.828427,
+ width' = +0pt +1,
+ line width = +0pt +1 +1,
+ },
+ setup code = {
+ % Cap the line width at 1/2th of the length
+ \pgf@x.5\pgfarrowlength
+ \ifdim\pgf@x<\pgfarrowlinewidth
+ \pgfarrowlinewidth\pgf@x
+ \fi
+ \ifpgfarrowreversed
+ \pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssetlineend{.5\pgfarrowlinewidth}
+ \fi
+ \pgfarrowssettipend{\pgfarrowlength}
+ % The hull:
+ \pgfarrowshullpoint{\pgfarrowlength}{.5\pgfarrowwidth}
+ \pgfarrowshullpoint{0pt}{.5\pgfarrowwidth}
+ \pgfarrowshullpoint{\pgfarrowlength}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else-.5\pgfarrowwidth\fi}
+ \pgfarrowshullpoint{0pt}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else-.5\pgfarrowwidth\fi}
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \pgfpathmoveto{\pgfqpoint{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgfarrowlinewidth}{.5\pgfarrowwidth\advance\pgf@y by-.5\pgfarrowlinewidth}}
+ \pgfpathlineto{\pgfqpoint{.5\pgfarrowlinewidth}{\ifpgfarrowharpoon0pt\else-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth\fi}}
+ \pgfpathlineto{\pgfqpoint{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}{\ifpgfarrowharpoon0pt\else-.5\pgfarrowwidth\advance\pgf@y by.5\pgfarrowlinewidth\fi}}
+ \pgfpathclose
+ \ifpgfarrowopen\pgfusepathqstroke\else\ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi\fi
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi%
+ },
+}%
+
+
+% A simple rectangle shape
+
+\pgfdeclarearrow{
+ name = Circle,
+ defaults = {
+ length = +2.39365pt +3.191538,
+ width' = +0pt 1,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ % Cap the line width at 1/2th of the length
+ \pgf@x.5\pgfarrowlength
+ \ifdim\pgf@x<\pgfarrowlinewidth
+ \pgfarrowlinewidth\pgf@x
+ \fi
+ \ifpgfarrowreversed
+ \pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by-.5\pgfarrowlinewidth}
+ \else
+ \pgfarrowssetlineend{.5\pgfarrowlinewidth}
+ \fi
+ \pgfarrowssettipend{\pgfarrowlength}
+ % The hull:
+ \pgfarrowsupperhullpoint{\pgfarrowlength}{.25\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{.75\pgfarrowlength}{.5\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{.25\pgfarrowlength}{.5\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{0pt}{.25\pgfarrowwidth}
+ \ifpgfarrowharpoon%
+ \pgfarrowshullpoint{0pt}{-.5\pgfarrowlinewidth}
+ \pgfarrowshullpoint{\pgfarrowlength}{-.5\pgfarrowlinewidth}
+ \fi%
+ % The following are needed in the code:
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ \ifpgfarrowharpoon
+ \pgfpathmoveto{\pgfqpoint{\pgfarrowlength\advance\pgf@x
+ by-.5\pgfarrowlinewidth}{0pt}}
+ {%
+ \pgf@xa.5\pgfarrowlength
+ \advance\pgf@xa by-.5\pgfarrowlinewidth
+ \pgftransformxscale{+\the\pgf@xa}
+ \pgf@xa.5\pgfarrowwidth
+ \advance\pgf@xa by-.5\pgfarrowlinewidth
+ \pgftransformyscale{+\the\pgf@xa}
+ \pgfpatharc{0}{180}{1pt}
+ }
+ \pgfpathclose
+ \else%
+ \pgfpathellipse{\pgfqpoint{.5\pgfarrowlength}{0pt}}{\pgfqpoint{.5\pgfarrowlength\advance\pgf@x
+ by-.5\pgfarrowlinewidth}{0pt}}{\pgfqpoint{0pt}{.5\pgfarrowwidth\advance\pgf@y
+ by-.5\pgfarrowlinewidth}}
+ \fi
+ \ifpgfarrowopen\pgfusepathqstroke\else\ifdim\pgfarrowlinewidth>0pt\pgfusepathqfillstroke\else\pgfusepathqfill\fi\fi
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowopen o\fi%
+ \ifpgfarrowroundjoin j\fi%
+ },
+}%
+
+% Round cap
+
+\pgfdeclarearrow{
+ name = Round Cap,
+ defaults = {
+ length = +0pt .5
+ },
+ setup code = {
+ \ifpgfarrowreversed
+ \pgfarrowssettipend{\pgfarrowlength}
+ \pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by.5\pgflinewidth}
+ \else
+ \pgfarrowssettipend{\pgfarrowlength}
+ \pgfarrowssetlineend{-.5\pgflinewidth}
+ \fi
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowsupperhullpoint{0pt}{.5\pgflinewidth}
+ \pgfarrowsupperhullpoint{\pgfarrowlength}{.5\pgflinewidth}
+ },
+ drawing code = {
+ \ifpgfarrowreversed
+ \pgftransformxscale{-1}
+ \pgftransformxshift{-\pgfarrowlength}
+ \fi
+ \pgfutil@tempdima.5\pgflinewidth
+ \pgfpathmoveto {\pgfqpoint{-0.75\pgflinewidth}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \ifpgfarrowreversed
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{\pgfutil@tempdima}}
+ \begingroup
+ \pgftransformxshift{\pgfarrowlength}
+ \pgftransformxscale{-1}
+ \fi
+ \pgfpathcurveto {\pgfqpoint{0.55228475\pgfarrowlength}{\pgfutil@tempdima}}
+ {\pgfqpoint{\pgfarrowlength}{0.55228475\pgfutil@tempdima}}
+ {\pgfqpoint{\pgfarrowlength}{0pt}}
+ \pgfpathcurveto {\pgfqpoint{\pgfarrowlength}{-0.55228475\pgfutil@tempdima}}
+ {\pgfqpoint{0.55228475\pgfarrowlength}{-\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{-\pgfutil@tempdima}}
+ \ifpgfarrowreversed
+ \endgroup
+ \fi
+ \pgfpathlineto {\pgfqpoint{-.75\pgflinewidth}{-\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ parameters = {\the\pgfarrowlength}
+}%
+
+
+
+\pgfdeclarearrow{
+ name = Butt Cap,
+ defaults = {
+ length = +0pt .5
+ },
+ setup code = {
+ \pgfarrowssettipend{\pgfarrowlength}
+ \pgfarrowssetlineend{-.5\pgflinewidth}
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowsupperhullpoint{0pt}{.5\pgflinewidth}
+ \pgfarrowsupperhullpoint{\pgfarrowlength}{.5\pgflinewidth}
+ },
+ drawing code = {
+ \pgfutil@tempdima.5\pgflinewidth
+ \pgfpathmoveto {\pgfqpoint{-0.75\pgflinewidth}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{-\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{-.75\pgflinewidth}{-\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ parameters = {\the\pgfarrowlength}
+}%
+
+
+
+\pgfkeys{
+ /pgf/arrow keys/.cd,
+ cap angle/.code={%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgf@x.5\pgf@x
+ \pgfmathtan@{\pgf@sys@tonumber\pgf@x}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@x\pgfmathresult pt%
+ \pgf@x.5\pgf@x%
+ \edef\pgf@marshal{\noexpand\pgfarrowsaddtooptions{\noexpand\pgfarrowslinewidthdependent{+0pt}{\pgf@sys@tonumber\pgf@x}{0}\pgfarrowlength\pgf@x}}
+ \pgf@marshal
+ }
+}%
+
+
+\pgfdeclarearrow{
+ name = Triangle Cap,
+ defaults = {
+ length = +0pt .5
+ },
+ setup code = {
+ \ifpgfarrowreversed
+ \pgfarrowssettipend{\pgfarrowlength}
+ \pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by.5\pgflinewidth}
+ \else
+ \pgfarrowssettipend{\pgfarrowlength}
+ \pgfarrowssetlineend{-.5\pgflinewidth}
+ \fi
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowsupperhullpoint{0pt}{.5\pgflinewidth}
+ \pgfarrowshullpoint{\pgfarrowlength}{0pt}
+ },
+ drawing code = {
+ \ifpgfarrowreversed
+ \pgftransformxscale{-1}
+ \pgftransformxshift{-\pgfarrowlength}
+ \fi
+ \pgfutil@tempdima.5\pgflinewidth
+ \pgfpathmoveto {\pgfqpoint{-0.75\pgflinewidth}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \ifpgfarrowreversed
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{\pgfutil@tempdima}}
+ \begingroup
+ \pgftransformxshift{\pgfarrowlength}
+ \pgftransformxscale{-1}
+ \fi
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{0pt}}
+ \ifpgfarrowreversed
+ \endgroup
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{-\pgfutil@tempdima}}
+ \fi
+ \pgfpathlineto {\pgfqpoint{0pt}{-\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{-.75\pgflinewidth}{-\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ parameters = {\the\pgfarrowlength}
+}%
+
+
+
+\pgfdeclarearrow{
+ name = Fast Triangle,
+ defaults = {
+ length = +0pt .5,
+ inset = +0pt .5,
+ },
+ setup code = {
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by\pgfarrowinset}
+ \ifpgfarrowreversed\pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by\pgfarrowinset}\fi
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowinset
+ \pgfarrowsupperhullpoint{0pt}{.5\pgflinewidth}
+ \pgfarrowsupperhullpoint{\pgfarrowinset}{.5\pgflinewidth}
+ \pgfarrowshullpoint{\pgfarrowlength\advance\pgf@x by\pgfarrowinset}{0pt}
+ },
+ drawing code = {
+ \pgfutil@tempdima.5\pgflinewidth
+ \pgfpathmoveto {\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowinset}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowinset\advance\pgf@x by\pgfarrowlength}{0pt}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowinset}{-\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{0pt}{-\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowlength}{0pt}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ parameters = {\the\pgfarrowlength,\the\pgfarrowinset}
+}%
+
+
+\pgfdeclarearrow{
+ name = Fast Round,
+ defaults = {
+ length = +0pt .5,
+ inset = +0pt .5,
+ },
+ setup code = {
+ \pgfarrowssettipend{\pgfarrowlength\advance\pgf@x by\pgfarrowinset}
+ \ifpgfarrowreversed\pgfarrowssetlineend{\pgfarrowlength\advance\pgf@x by\pgfarrowinset}\fi
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowinset
+ \pgfarrowsupperhullpoint{0pt}{.5\pgflinewidth}
+ \pgfarrowsupperhullpoint{\pgfarrowlength\advance\pgf@x by\pgfarrowinset}{.5\pgflinewidth}
+ },
+ drawing code = {
+ \pgfutil@tempdima.5\pgflinewidth
+ \pgfpathmoveto {\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \pgfpathlineto {\pgfqpoint{\pgfarrowinset}{\pgfutil@tempdima}}
+ {
+ \pgftransformxshift{\pgfarrowinset}
+ \pgfpathcurveto{\pgfqpoint{0.55228475\pgfarrowlength}{\pgfutil@tempdima}}
+ {\pgfqpoint{\pgfarrowlength}{0.55228475\pgfutil@tempdima}}
+ {\pgfqpoint{\pgfarrowlength}{0pt}}
+ \pgfpathcurveto{\pgfqpoint{\pgfarrowlength}{-0.55228475\pgfutil@tempdima}}
+ {\pgfqpoint{0.55228475\pgfarrowlength}{-\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{-\pgfutil@tempdima}}
+ }
+ \pgfpathlineto {\pgfqpoint{0pt}{-\pgfutil@tempdima}}
+ \pgfpathcurveto {\pgfqpoint{0.55228475\pgfarrowlength}{-\pgfutil@tempdima}}
+ {\pgfqpoint{\pgfarrowlength}{-0.55228475\pgfutil@tempdima}}
+ {\pgfqpoint{\pgfarrowlength}{0pt}}
+ \pgfpathcurveto {\pgfqpoint{\pgfarrowlength}{0.55228475\pgfutil@tempdima}}
+ {\pgfqpoint{0.55228475\pgfarrowlength}{\pgfutil@tempdima}}
+ {\pgfqpoint{0pt}{\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfill
+ },
+ parameters = {\the\pgfarrowlength,\the\pgfarrowinset}
+}%
+
+
+
+
+%
+%
+% Other arrow tips.
+%
+%
+
+
+\pgfkeys{
+ /pgf/arrow keys/.cd,
+ n/.code={%
+ \pgfmathparse{#1}%
+ \expandafter\pgf@lib@meta@strip@dot\pgfmathresult.\relax%
+ }
+}%
+\def\pgf@lib@meta@strip@dot#1.#2\relax{%
+ \pgfarrowsaddtooptions{\def\pgfarrown{#1}}%
+}%
+
+\def\pgfarrown{4}%
+
+\pgfdeclarearrow{
+ name = Rays,
+ defaults = {
+ length = +3pt 4,
+ width' = +0pt 1,
+ line width = +0pt 1 1,
+ },
+ setup code = {
+ \pgfmathdivide@{360}{\pgfarrown}%
+ \let\pgfarrow@inc\pgfmathresult%
+ % Compute tips:
+ \pgf@xa\pgfarrow@inc pt%
+ \ifodd\pgfarrown\pgf@ya.25\pgf@xa\else\pgf@ya.5\pgf@xa\fi%
+ \pgfmathsincos@{\pgf@sys@tonumber\pgf@ya}%
+ \pgf@x.5\pgfarrowlength%
+ \pgf@xa\pgfmathresultx\pgf@x%
+ \ifpgfarrowroundcap
+ \advance\pgf@xa by.5\pgfarrowlinewidth
+ \else
+ \pgf@process{\pgfpointnormalised{\pgfqpoint{\pgfmathresultx\pgfarrowlength}{\pgfmathresulty\pgfarrowwidth}}}%
+ \pgf@x.5\pgfarrowlinewidth%
+ \advance\pgf@xa by\pgf@sys@tonumber{\pgf@y}\pgf@x%
+ \fi%
+ \pgfarrowssettipend{\pgf@xa}
+ \pgfarrowssetbackend{-\pgf@xa}
+ % Hull is always 8-point hull, except for tip
+ % The following are needed in the code:
+ \pgfarrowsupperhullpoint{\pgf@xa}{.25\pgfarrowwidth}
+ \pgfarrowsupperhullpoint{.25\pgfarrowlength}{.5\pgfarrowwidth\ifpgfarrowroundcap\advance\pgf@y by.5\pgfarrowlinewidth\fi}
+ \pgfarrowsupperhullpoint{-.25\pgfarrowlength}{.5\pgfarrowwidth\ifpgfarrowroundcap\advance\pgf@y by.5\pgfarrowlinewidth\fi}
+ \pgfarrowsupperhullpoint{-\pgf@xa}{.25\pgfarrowwidth}
+ \ifpgfarrowharpoon
+ \pgfarrowshullpoint{-.5\pgfarrowlength\ifpgfarrowroundcap\advance\pgf@x by-.5\pgfarrowlinewidth\fi}{-.5\pgfarrowlinewidth}
+ \pgfarrowshullpoint{.5\pgfarrowlength\ifpgfarrowroundcap\advance\pgf@x by.5\pgfarrowlinewidth\fi}{-.5\pgfarrowlinewidth}
+ \fi
+ \pgfarrowssavethe\pgfarrowlinewidth
+ \pgfarrowssavethe\pgfarrowlength
+ \pgfarrowssavethe\pgfarrowwidth
+ \pgfarrowssave\pgfarrow@inc
+ \pgfarrowssave\pgfarrown
+ },
+ drawing code = {
+ \pgfsetdash{}{+0pt}
+ \ifpgfarrowroundcap\pgfsetroundcap\else\pgfsetbuttcap\fi
+ \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{+\pgfarrowlinewidth}\fi
+ {%
+ \pgfgettransform\pgf@temp@trans
+ \pgftransformxscale{+.5\pgfarrowlength}
+ \pgftransformyscale{+.5\pgfarrowwidth}
+ \pgf@xa\pgfarrow@inc pt%
+ \ifodd\pgfarrown\pgf@ya.25\pgf@xa\else\pgf@ya.5\pgf@xa\fi%
+ \ifpgfarrowharpoon\pgf@yb180pt\else\pgf@yb360pt\fi
+ \pgfutil@loop%
+ \ifdim\pgf@ya<\pgf@yb%
+ \pgfpathmoveto{\pgfpointpolar{+\pgf@ya}{+1pt}}
+ \pgfpathlineto{\pgfpointorigin}
+ \ifpgfarrowharpoon\ifdim\pgf@ya>\pgf@xa\else{\pgfsettransform\pgf@temp@trans\pgfpathlineto{\pgfqpoint{-.5\pgflinewidth}{0pt}}}\fi\fi
+ \advance\pgf@ya by\pgf@xa\relax%
+ \pgfutil@repeat%
+ }
+ \pgfusepathqstroke
+ },
+ parameters = {
+ \the\pgfarrowlinewidth,%
+ \the\pgfarrowlength,%
+ \the\pgfarrowwidth,%
+ \pgfarrown,%
+ \ifpgfarrowharpoon h\fi%
+ \ifpgfarrowroundcap c\fi%
+ }
+}%
+
+
+
+% Shorthands and Aliases:
+
+\pgfkeys{
+ LaTeX /.tip = {Latex},
+ Triangle /.tip = {Stealth[inset=+0pt, angle=+60:+2.7pt +3.6]},
+ Rectangle /.tip = {Square[length=+3pt +4.5,width'=+0pt +.5]},
+ Ellipse /.tip = {Circle[length=+3.3pt +4.95, width'=+0pt +0.5]},
+ Diamond /.tip = {Kite[inset'=+0pt .5]},
+ Turned Square /.tip = {Kite[length=+3pt 4,width'= +0pt 1,inset'= +0pt 0.5]},
+ To /.tip = {Computer Modern Rightarrow},
+ Bar /.tip = {Tee Barb[length=+0pt]},
+ Bracket /.tip = {Tee Barb[inset'=+0pt +1,length=+0.75pt +1]},
+ Parenthesis /.tip = {Arc Barb[arc=+120,length=+1.725pt +2.3]}
+}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryarrows.spaced.code.tex b/graphics/pgf/base/tex/pgflibraryarrows.spaced.code.tex
new file mode 100644
index 0000000000..166ed87533
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryarrows.spaced.code.tex
@@ -0,0 +1,92 @@
+% Copyright 2012 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryarrows.spaced.code.tex}
+
+
+\usepgflibrary{arrows}%
+
+
+% This library offers "spaced" versions of existing arrows, where a
+% bit of additional space is inserted at the tip. This often looks
+% better than the normal arrow.
+%
+% These arrows are called "spaced whatever" where "whatever" is the
+% original name of the arrow.
+
+
+\pgfarrowsdeclarecombine*{spaced to}{spaced to}{to}{to}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced to reversed}{spaced to reversed}{to reversed}{to reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced implies}{spaced implies}{implies}{implies}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced latex}{spaced latex}{latex}{latex}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced latex reversed}{spaced latex reversed}{latex reversed}{latex reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced latex'}{spaced latex'}{latex'}{latex'}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced latex' reversed}{spaced latex' reversed}{latex' reversed}{latex' reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced stealth}{spaced stealth}{stealth}{stealth}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced stealth reversed}{spaced stealth reversed}{stealth reversed}{stealth reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced stealth'}{spaced stealth'}{stealth'}{stealth'}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced stealth' reversed}{spaced stealth' reversed}{stealth' reversed}{stealth' reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 90}{spaced triangle 90}{triangle 90}{triangle 90}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 90 reversed}{spaced triangle 90 reversed}{triangle 90 reversed}{triangle 90 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 60}{spaced triangle 60}{triangle 60}{triangle 60}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 60 reversed}{spaced triangle 60 reversed}{triangle 60 reversed}{triangle 60 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 45}{spaced triangle 45}{triangle 45}{triangle 45}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 45 reversed}{spaced triangle 45 reversed}{triangle 45 reversed}{triangle 45 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open triangle 90}{spaced open triangle 90}{open triangle 90}{open triangle 90}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open triangle 90 reversed}{spaced open triangle 90 reversed}{open triangle 90 reversed}{open triangle 90 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open triangle 60}{spaced open triangle 60}{open triangle 60}{open triangle 60}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open triangle 60 reversed}{spaced open triangle 60 reversed}{open triangle 60 reversed}{open triangle 60 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open triangle 45}{spaced open triangle 45}{open triangle 45}{open triangle 45}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open triangle 45 reversed}{spaced open triangle 45 reversed}{open triangle 45 reversed}{open triangle 45 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced angle 90}{spaced angle 90}{angle 90}{angle 90}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced angle 90 reversed}{spaced angle 90 reversed}{angle 90 reversed}{angle 90 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced angle 60}{spaced angle 60}{angle 60}{angle 60}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced angle 60 reversed}{spaced angle 60 reversed}{angle 60 reversed}{angle 60 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced angle 45}{spaced angle 45}{angle 45}{angle 45}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced angle 45 reversed}{spaced angle 45 reversed}{angle 45 reversed}{angle 45 reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced hooks}{spaced hooks}{hooks}{hooks}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced hooks reversed}{spaced hooks reversed}{hooks reversed}{hooks reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced o}{spaced o}{o}{o}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced *}{spaced *}{*}{*}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced diamond}{spaced diamond}{diamond}{diamond}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open diamond}{spaced open diamond}{open diamond}{open diamond}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced square}{spaced square}{square}{square}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced open square}{spaced open square}{open square}{open square}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced serif cm}{spaced serif cm}{serif cm}{serif cm}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced left to}{spaced left to}{left to}{left to}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced left to reversed}{spaced left to reversed}{left to reversed}{left to reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced right to}{spaced right to}{right to}{right to}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced right to reversed}{spaced right to reversed}{right to reversed}{right to reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced left hook}{spaced left hook}{left hook}{left hook}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced left hook reversed}{spaced left hook reversed}{left hook reversed}{left hook reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced right hook}{spaced right hook}{right hook}{right hook}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced right hook reversed}{spaced right hook reversed}{right hook reversed}{right hook reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced round cap}{spaced round cap}{round cap}{round cap}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced butt cap}{spaced butt cap}{butt cap}{butt cap}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 90 cap}{spaced triangle 90 cap}{triangle 90 cap}{triangle 90 cap}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced triangle 90 cap reversed}{spaced triangle 90 cap reversed}{triangle 90 cap reversed}{triangle 90 cap reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced fast cap}{spaced fast cap}{fast cap}{fast cap}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced fast cap reversed}{spaced fast cap reversed}{fast cap reversed}{fast cap reversed}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced (}{spaced )}{(}{)}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced )}{spaced (}{)}{(}{space}{space}%
+\pgfarrowsdeclarecombine*{spaced |}{spaced |}{|}{|}{space}{space}%
+
+\pgfdeclarearrow{
+ name = spaced [-spaced ],
+ means = square bracket[].space
+}%
+
+\pgfdeclarearrow{
+ name = spaced ]-spaced [,
+ means = square bracket[reversed].space
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryarrows.sty b/graphics/pgf/base/tex/pgflibraryarrows.sty
new file mode 100644
index 0000000000..875bbf0264
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryarrows.sty
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{arrows} instead}
+
+\RequirePackage{pgfcore}
+
+\input{pgflibraryarrows.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryautomata.sty b/graphics/pgf/base/tex/pgflibraryautomata.sty
new file mode 100644
index 0000000000..29d6655da3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryautomata.sty
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{automata} instead}
+
+\RequirePackage{pgfcore}
+
+\input{pgflibrarytikzautomata.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarycurvilinear.code.tex b/graphics/pgf/base/tex/pgflibrarycurvilinear.code.tex
new file mode 100644
index 0000000000..941704d176
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarycurvilinear.code.tex
@@ -0,0 +1,379 @@
+% Copyright 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarycurvilinear.code.tex}
+
+%
+% This file defines commands for computing points in curvilinear
+% coordinate systems.
+%
+
+
+%
+% Curvilinear coordinate systems defined in terms of a Bezier curve.
+%
+% For the following coordinate systems, you must first provide a
+% Bezier curve (using, as always, four points), which will be set for
+% the current scope. When the curve is "installed" some expensive
+% precomputations are done; subsequent calls to
+% \pgfpointcurvilinearxxx based on this Bezier curve will be
+% relatively quick.
+%
+
+
+
+% Install a Bezier curve
+%
+% #1 = start point
+% #2 = first control point
+% #3 = second control point
+% #4 = end point
+%
+% Description:
+%
+% Subsequent calls to functions like
+% \pgfpointcurvilinearbezierorthogonal will be relative to the curve
+% installed using this command. The main job of this macro is a
+% precomputation for computing length along the curve.
+% All lengths along the Bezier curve are approximated using a lookup table
+% of four time/length points. For this, an approximate time for length
+% 1pt is computed first, and then the length for twice this time, four
+% times this time, and eight times this time are approximated. A
+% distance-to-time conversion is then done by a linear interpolation
+% of distance-to-time for these four points. Note that all of these
+% computations are not particularly precise, but a compromise trading
+% speed against precision. Also note that the results will only be
+% best near the start of the curve and may be far off near the end if
+% that end is degenerate (second control point very near to end
+% point).
+%
+% Example:
+%
+% \pgfsetcurvilinearbeziercurve
+% {\pgfpoint{0mm}{10mm}}
+% {\pgfpoint{5.5mm}{10mm}}
+% {\pgfpoint{10mm}{5.5mm}}
+% {\pgfpoint{10mm}{0mm}} % nearly a quarter circle
+% \pgfpointcurvilinearbezierorthogonal{5mm}{5mm}
+% % should be 5mm along the circle, put at
+% % distance 15mm from the origin (5mm from the circle line).
+
+\def\pgfsetcurvilinearbeziercurve#1#2#3#4{%
+ \pgf@process{#1}%
+ \edef\pgf@curvilinear@line@a{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@xa=-\pgf@x%
+ \pgf@ya=-\pgf@y%
+ \pgf@process{#2}%
+ \edef\pgf@curvilinear@line@b{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@xb=-\pgf@x%
+ \pgf@yb=-\pgf@y%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@lenab\pgfmathresult%
+ \pgf@process{#3}%
+ \edef\pgf@curvilinear@line@c{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@xc=-\pgf@x%
+ \pgf@yc=-\pgf@y%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@lenbc\pgfmathresult%
+ \pgf@process{#4}%
+ \edef\pgf@curvilinear@line@d{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@lencd\pgfmathresult
+ %
+ \pgf@x=\pgf@curvilinear@lenab pt%
+ \advance\pgf@x by\pgf@curvilinear@lenbc pt%
+ \advance\pgf@x by\pgf@curvilinear@lencd pt%
+ \pgfmathreciprocal@{\pgf@sys@tonumber\pgf@x}%
+ \pgf@curvilinear@time@a\pgfmathresult pt%
+ \pgf@process{\pgfpointcurveattime{\pgf@curvilinear@time@a}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}%
+ \pgf@xb=-\pgf@x%
+ \pgf@yb=-\pgf@y%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgf@curvilinear@length@a\pgfmathresult pt%
+ \ifdim\pgf@curvilinear@length@a>1pt\relax%
+ % Ok, too large, let us make this smaller
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@curvilinear@time@a}{\pgf@sys@tonumber\pgf@curvilinear@length@a}%
+ \pgf@curvilinear@time@a\pgfmathresult pt%
+ \pgf@process{\pgfpointcurveattime{\pgf@curvilinear@time@a}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}
+ \pgf@xb=-\pgf@x%
+ \pgf@yb=-\pgf@y%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgf@curvilinear@length@a\pgfmathresult pt%
+ \fi%
+ % Compute three positions:
+ \pgf@process{\pgfpointcurveattime{2\pgf@curvilinear@time@a}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}
+ \pgf@xa=-\pgf@x%
+ \pgf@ya=-\pgf@y%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgf@curvilinear@length@b\pgfmathresult pt%
+ \advance\pgf@curvilinear@length@b by\pgf@curvilinear@length@a%
+ \pgf@process{\pgfpointcurveattime{4\pgf@curvilinear@time@a}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}
+ \pgf@xb=-\pgf@x%
+ \pgf@yb=-\pgf@y%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgf@curvilinear@length@c\pgfmathresult pt%
+ \advance\pgf@curvilinear@length@c by\pgf@curvilinear@length@b%
+ \pgf@process{\pgfpointcurveattime{8\pgf@curvilinear@time@a}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ \pgf@curvilinear@length@d\pgfmathresult pt%
+ \advance\pgf@curvilinear@length@d by\pgf@curvilinear@length@c%
+ \let\pgf@curvilinear@comp@a\pgf@curvilinear@comp@a@initial%
+ \let\pgf@curvilinear@comp@b\pgf@curvilinear@comp@b@initial%
+ \let\pgf@curvilinear@comp@c\pgf@curvilinear@comp@c@initial%
+ \let\pgf@curvilinear@comp@d\pgf@curvilinear@comp@d@initial%
+ \let\pgf@curvilinear@comp@e\pgf@curvilinear@comp@e@initial%
+ \let\pgf@curvilinear@point\pgf@curvilinear@curve@point%
+}%
+\newdimen\pgf@curvilinear@time@a
+\newdimen\pgf@curvilinear@length@a
+\newdimen\pgf@curvilinear@length@b
+\newdimen\pgf@curvilinear@length@c
+\newdimen\pgf@curvilinear@length@d
+
+
+\def\pgf@curvilinear@comp@a@initial{%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@curvilinear@time@a}{\pgf@sys@tonumber\pgf@curvilinear@length@a}%
+ \let\pgf@curvilinear@quot@a\pgfmathresult%
+ \let\pgf@curvilinear@comp@a\pgf@curvilinear@comp@a@cont%
+ \pgf@curvilinear@comp@a@cont%
+}%
+\def\pgf@curvilinear@comp@a@cont{%
+ \pgf@x\pgf@curvilinear@quot@a\pgf@x%
+}%
+
+\def\pgf@curvilinear@comp@b@initial{%
+ \pgf@y=\pgf@curvilinear@length@b%
+ \advance\pgf@y by-\pgf@curvilinear@length@a%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@curvilinear@time@a}{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@quot@b\pgfmathresult%
+ \pgf@y\pgfmathresult\pgf@curvilinear@length@a%
+ \pgf@y-\pgf@y%
+ \advance\pgf@y by\pgf@curvilinear@time@a%
+ \edef\pgf@curvilinear@correct@b{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@comp@b\pgf@curvilinear@comp@b@cont%
+ \pgf@curvilinear@comp@b@cont%
+}%
+\def\pgf@curvilinear@comp@b@cont{%
+ \pgf@x\pgf@curvilinear@quot@b\pgf@x%
+ \advance\pgf@x by\pgf@curvilinear@correct@b pt%
+}%
+
+\def\pgf@curvilinear@comp@c@initial{%
+ \pgf@y=\pgf@curvilinear@length@c%
+ \advance\pgf@y by-\pgf@curvilinear@length@b%
+ \pgf@y.5\pgf@y%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@curvilinear@time@a}{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@quot@c\pgfmathresult%
+ \pgf@y\pgf@curvilinear@quot@c\pgf@curvilinear@length@b%
+ \pgf@y-\pgf@y%
+ \advance\pgf@y by2\pgf@curvilinear@time@a%
+ \edef\pgf@curvilinear@correct@c{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@comp@c\pgf@curvilinear@comp@c@cont%
+ \pgf@curvilinear@comp@c@cont%
+}%
+\def\pgf@curvilinear@comp@c@cont{%
+ \pgf@x\pgf@curvilinear@quot@c\pgf@x%
+ \advance\pgf@x by\pgf@curvilinear@correct@c pt%
+}%
+
+\def\pgf@curvilinear@comp@d@initial{%
+ \pgf@y=\pgf@curvilinear@length@d%
+ \advance\pgf@y by-\pgf@curvilinear@length@c%
+ \pgf@y.25\pgf@y%
+ \pgfmathdivide@{\pgf@sys@tonumber\pgf@curvilinear@time@a}{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@quot@d\pgfmathresult%
+ \pgf@y\pgf@curvilinear@quot@d\pgf@curvilinear@length@c%
+ \pgf@y-\pgf@y%
+ \advance\pgf@y by4\pgf@curvilinear@time@a%
+ \edef\pgf@curvilinear@correct@d{\pgf@sys@tonumber\pgf@y}%
+ \let\pgf@curvilinear@comp@d\pgf@curvilinear@comp@d@cont%
+ \pgf@curvilinear@comp@d@cont%
+}%
+\def\pgf@curvilinear@comp@d@cont{%
+ \pgf@x\pgf@curvilinear@quot@d\pgf@x%
+ \advance\pgf@x by\pgf@curvilinear@correct@d pt%
+}%
+
+\def\pgf@curvilinear@comp@e@initial{%
+ \pgfmathmultiply@{8}{\pgf@sys@tonumber\pgf@curvilinear@time@a}%
+ \expandafter\pgfmathdivide@\expandafter{\pgfmathresult}{\pgf@sys@tonumber\pgf@curvilinear@length@d}%
+ \let\pgf@curvilinear@quot@e\pgfmathresult%
+ \let\pgf@curvilinear@comp@e\pgf@curvilinear@comp@e@cont%
+ \pgf@curvilinear@comp@e@cont%
+}%
+\def\pgf@curvilinear@comp@e@cont{%
+ \pgf@x\pgf@curvilinear@quot@e\pgf@x%
+}%
+
+
+% Convert a distance into a time
+%
+% #1 = a distance
+%
+% Description:
+%
+% After having called \pgfsetcurvilinearbeziercurve, you can use this
+% macro to convert a distance into a time along the curve set in that
+% command. The result will be stored in \pgf@x. It will only be
+% reasonably precise for small nonnegative #1 (in particular, #1
+% should not be more than about half the length of the curve).
+
+\def\pgfcurvilineardistancetotime#1{%
+ \pgfmathsetlength{\pgf@x}{#1}%
+ \ifdim\pgf@x<\pgf@curvilinear@length@c\relax%
+ \ifdim\pgf@x<\pgf@curvilinear@length@a\relax%
+ \pgf@curvilinear@comp@a%
+ \else\ifdim\pgf@x<\pgf@curvilinear@length@b\relax%
+ \pgf@curvilinear@comp@b%
+ \else%
+ \pgf@curvilinear@comp@c%
+ \fi\fi%
+ \else\ifdim\pgf@x<\pgf@curvilinear@length@d\relax%
+ \pgf@curvilinear@comp@d%
+ \else%
+ \pgf@curvilinear@comp@e%
+ \fi\fi%
+}%
+
+
+
+% Compute a "Bezier-orthogonal" point for use in a nonlinear transformation.
+%
+% #1 = x
+% #2 = y
+%
+% Description:
+%
+% In this coordinate system, the x-axis "goes along" the Bezier curve
+% installed using \pgfsetcurvilinearbeziercurve
+% and the y-axis is always perpendicular to the (Bezier) curve at the
+% given x-coordinate. Formally, given a pair (x,y), let B(x) be the point on
+% the Bezier curve B at distance x from the start of the curve. Let
+% T(x) be the tangent of B at B(x) and let P(x) be the (normalized)
+% vector perpendicular to T(x). Then (x,y) would be mapped to B(x) +
+% y*P(x). As an example, if B is a circle, then the corresponding
+% curvilinear coordinate system is (essentially, except for an offset in
+% the y value) the polar coordinate system.
+%
+% In addition to setting \pgf@x and \pgf@y, \pgf@xa/ya will be set to
+% a tangent along the curve at the given point and \pgf@xb/yb to a
+% tangent orthogonal to the curve.
+
+\def\pgfpointcurvilinearbezierorthogonal#1#2{%
+ \pgfmathsetmacro\pgf@curvilinear@yfactor{#2}%
+ \pgfcurvilineardistancetotime{#1}%
+ \pgfpointcurveattime{\pgf@x}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}
+ \pgf@xc\pgf@x% save
+ \pgf@yc\pgf@y% save
+ % compute normal:
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \ifdim\pgf@xb<0.0001pt\ifdim\pgf@xb>-0.0001pt\ifdim\pgf@yb<0.0001pt\ifdim\pgf@yb>-0.0001pt\pgf@diff@curvi@ac\fi\fi\fi\fi
+ \pgf@process{\pgfpointnormalised{\pgf@x=\pgf@yb\pgf@y=-\pgf@xb}}
+ \pgf@x\pgf@curvilinear@yfactor\pgf@x%
+ \pgf@y\pgf@curvilinear@yfactor\pgf@y%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+}%
+
+\def\pgf@diff@curvi@ac{%
+ \pgf@curvilinear@line@a%
+ \pgf@xa\pgf@x\pgf@ya\pgf@y%
+ \pgf@curvilinear@line@c%
+ \pgf@xb\pgf@x\pgf@yb\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \ifdim\pgf@xb<0.0001pt\ifdim\pgf@xb>-0.0001pt\ifdim\pgf@yb<0.0001pt\ifdim\pgf@yb>-0.0001pt% still degenerate!
+ \pgf@curvilinear@line@d%
+ \pgf@xb\pgf@x\pgf@yb\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \fi\fi\fi\fi%
+ \pgf@xb-\pgf@xb%
+ \pgf@yb-\pgf@yb%
+}%
+
+
+
+% Compute a "Bezier-polar" point.
+%
+% #1 = x
+% #2 = y
+%
+% Description:
+%
+% Let (r:d) be the point (x,y) in polar coordinates, that is, r is the
+% angle and d the distance of (x,y) to the origin. The point returned
+% by \pgfpointcurvilinearbezierpolar is now defined as follows: First,
+% we compute that point at distance d along the Bezier curve B. Let
+% B(d) be this point. Then, we rotate this point around the start of
+% the curve (B(0)) by r degrees.
+%
+% As an example, consider a triangle with one tip at the origin and
+% the other tips as (4cm,3cm) and (4cm,-3cm). Then this triangle would be
+% transformed as follows: We take the first 5cm of the Bezier curve
+% and rotate it by roughly 37 degrees to the left and by 37 degrees to
+% the right.
+%
+% Note that this command is pretty expensive.
+
+\def\pgfpointcurvilinearbezierpolar#1#2{%
+ \pgfmathsetlength\pgfutil@tempdima{#1}%
+ \pgfmathsetlength\pgfutil@tempdimb{#2}%
+ % Compute angle:
+ \pgfpointnormalised{\pgfqpoint{\pgfutil@tempdima}{\pgfutil@tempdimb}}%
+ \ifdim\pgfutil@tempdimb=0pt\relax\ifdim\pgfutil@tempdima=0pt\pgf@x1pt\pgf@y0pt\fi\fi%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ \fi%
+ \pgf@ya=-\pgf@y%
+ \pgfsettransformentries%
+ {\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ {\pgf@sys@tonumber\pgf@ya}{\pgf@sys@tonumber\pgf@x}{0pt}{0pt}%
+ \pgftransformshift{\pgfpointscale{-1}{\pgf@curvilinear@line@a}}%
+ \pgfmathveclen@{\pgf@sys@tonumber\pgfutil@tempdima}{\pgf@sys@tonumber\pgfutil@tempdimb}%
+ \ifdim\pgfutil@tempdima<0pt%
+ \edef\pgfmathresult{-\pgfmathresult}%
+ \fi%
+ \pgfcurvilineardistancetotime{\pgfmathresult}%
+ % Now, transform:
+ \pgf@process{%
+ \pgfpointadd{%
+ \pgfpointtransformed{%
+ \pgfpointcurveattime%
+ {\pgf@x}%
+ {\pgf@curvilinear@line@a}%
+ {\pgf@curvilinear@line@b}%
+ {\pgf@curvilinear@line@c}%
+ {\pgf@curvilinear@line@d}%
+ }%
+ }%
+ \pgf@curvilinear@line@a%
+ }%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydatavisualization.barcharts.code.tex b/graphics/pgf/base/tex/pgflibrarydatavisualization.barcharts.code.tex
new file mode 100644
index 0000000000..da124ee840
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydatavisualization.barcharts.code.tex
@@ -0,0 +1,135 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarydatavisualization.barcharts.code.tex}
+
+\usepgfmodule{datavisualization}%
+
+
+%
+% This file defines additional data visualization classes.
+%
+
+
+\pgfooclass{candle stick visualizer}
+{%
+ \attribute attribute;%
+ \attribute offset;%
+ \attribute use path rise=\pgfsetfillcolor{white}\pgfusepath{fill,stroke};%
+ \attribute use path fall=\pgfsetfillcolor{black}\pgfusepath{fill,stroke};%
+ \attribute use path wick=\pgfusepath{stroke};%
+
+ \method candle stick visualizer(#1) {
+ \pgfooeset{attribute}{#1}
+ \pgfoothis.set stick width(4pt)
+ }%
+
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,visualize,visualize datapoint signal)
+ }%
+
+ \method set stick width(#1) {
+ \pgfmathparse{#1}
+ \pgfmathdivide{\pgfmathresult}{2}
+ \let\pgf@dv@lib@w=\pgfmathresult
+ % Compute the normalized vector:
+ \pgfkeyssetvalue{/data point/\pgfoovalueof{attribute}}{1}
+ \pgfcanvaspositionofdatapoint%
+ \pgfsettocanvasposition\pgf@dv@lib@lower%
+ \pgfkeyssetvalue{/data point/\pgfoovalueof{attribute}}{10}
+ \pgfcanvaspositionofdatapoint%
+ \pgfsettocanvasposition\pgf@dv@lib@upper%
+ \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@dv@lib@upper}{\pgf@dv@lib@lower}}}%
+ % Rotate by 90 degrees
+ \pgf@xa=\pgf@x%
+ \pgf@x=-\pgf@dv@lib@w\pgf@y%
+ \pgf@y=\pgf@dv@lib@w\pgf@xa%
+ \edef\pgf@dv@lib@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfoolet{offset}\pgf@dv@lib@temp
+ }%
+
+ \method set use path rise(#1) {
+ \pgfooset{use path rise}{#1}
+ }%
+
+ \method set use path fall(#1) {
+ \pgfooset{use path fall}{#1}
+ }%
+
+ \method visualize() {
+ {
+ \pgfooget{attribute}\pgf@lib@attribute%
+ \pgfkeysgetvalue{/data point/\pgf@lib@attribute/low}\pgf@lib@low
+ \pgfkeysgetvalue{/data point/\pgf@lib@attribute/high}\pgf@lib@high
+ \pgfkeysgetvalue{/data point/\pgf@lib@attribute/entry}\pgf@lib@entry
+ \pgfkeysgetvalue{/data point/\pgf@lib@attribute/exit}\pgf@lib@exit
+ \ifx\pgf@lib@low\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@low\relax\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@high\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@high\relax\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@entry\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@entry\relax\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@exit\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
+ \ifx\pgf@lib@exit\relax\pgf@dv@lib@cs@skiptrue\fi
+ \ifpgf@dv@lib@cs@skip%
+ \else%
+ \begin{pgfscope}
+ % Ok, compute low point
+ \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@low
+ \pgfcanvaspositionofdatapoint%
+ \pgfsettocanvasposition\pgf@dv@lib@lowpoint%
+ % Ok, compute hight point
+ \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@high
+ \pgfcanvaspositionofdatapoint%
+ \pgfsettocanvasposition\pgf@dv@lib@highpoint%
+ % Compute entry and exit
+ \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@entry
+ \pgfcanvaspositionofdatapoint%
+ \pgfsettocanvasposition\pgf@dv@lib@entrypoint%
+ \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@exit
+ \pgfcanvaspositionofdatapoint%
+ \pgfsettocanvasposition\pgf@dv@lib@exitpoint%
+ \ifdim\pgf@lib@entry pt<\pgf@lib@exit pt\relax%
+ \pgf@dv@lib@risetrue%
+ \fi%
+ \ifpgf@dv@lib@rise
+ \let\pgf@dv@lib@a=\pgf@dv@lib@entrypoint
+ \let\pgf@dv@lib@b=\pgf@dv@lib@exitpoint
+ \else
+ \let\pgf@dv@lib@a=\pgf@dv@lib@exitpoint
+ \let\pgf@dv@lib@b=\pgf@dv@lib@entrypoint
+ \fi
+ % Start drawing...
+ \pgfpathmoveto{\pgf@dv@lib@lowpoint}
+ \pgfpathlineto{\pgf@dv@lib@a}
+ \pgfpathmoveto{\pgf@dv@lib@highpoint}
+ \pgfpathlineto{\pgf@dv@lib@b}
+ \pgfoovalueof{use path wick}
+ \pgfpathmoveto{\pgfpointadd{\pgf@dv@lib@a}{\pgfoovalueof{offset}}}
+ \pgfpathlineto{\pgfpointadd{\pgf@dv@lib@b}{\pgfoovalueof{offset}}}
+ \pgfpathlineto{\pgfpointadd{\pgf@dv@lib@b}{\pgfpointscale{-1}{\pgfoovalueof{offset}}}}
+ \pgfpathlineto{\pgfpointadd{\pgf@dv@lib@a}{\pgfpointscale{-1}{\pgfoovalueof{offset}}}}
+ \pgfpathclose
+ \ifpgf@dv@lib@rise
+ \pgfoovalueof{use path rise}
+ \else
+ \pgfoovalueof{use path fall}
+ \fi
+ \end{pgfscope}%
+ \fi
+ }
+ }%
+
+ \newif\ifpgf@dv@lib@cs@skip
+ \newif\ifpgf@dv@lib@rise
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydatavisualization.formats.functions.code.tex b/graphics/pgf/base/tex/pgflibrarydatavisualization.formats.functions.code.tex
new file mode 100644
index 0000000000..540901936f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydatavisualization.formats.functions.code.tex
@@ -0,0 +1,209 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarydatavisualization.formats.functions.code.tex}
+
+\usepgfmodule{datavisualization}%
+
+
+
+
+% Function evaluator
+%
+% (This uses TeX evaluation and is slow. *You have been warned*.)
+%
+% Description:
+%
+% The data contains the description of variables and functions.
+%
+% The format for the variables is
+%
+% var <name> : interval "["<start>:<end>"]" [ step <steps> | samples <samples>];
+%
+% (The first two [ and ] are "real", the second pair means "optional",
+% see the examples.)
+%
+%
+% The format for the functions is
+%
+% func <name> = <body>;
+%
+% Additionally, the variables and functions stored in the keys
+% /pgf/data/vars and /pgf/data/funcs will also be used, the format for
+% them is the same as above.
+%
+% The <name> is always the name of a (data point) attribute. Inside
+% the <body> it can be accessed using the \value macro, which is
+% defined locally, here.
+%
+% Newlines are not important, everything is gathered into a single
+% line, the semicolons are used to detect the beginnings and ends of
+% declarations.
+%
+% With everything setup in this way, for each variable, the variable
+% ranges through the values between start and end, either with the
+% given step or the given number of samples. If neither is given, the
+% current value of /pgf/data visualization/samples is used. If there
+% are multiple variables, they all range over their respective
+% intervals independently. Thus, "var x = [0,1]; var y = [0:1];",
+% assuming samples=25, gives you 625 data points.
+%
+% As the variables range over their respective values, the functions
+% are evaluated using the function stored in /pgf/data/evaluator. By
+% default this is set to \pgfmathparse, but
+% you can use a different parser, if you like.
+%
+% Example:
+%
+% data [format=function] {
+%
+% % This is a parametric plot with the parameter called t.
+% var t : interval [0:360] samples 60;
+%
+% % Let's draw a circle:
+% func x = sin(\value t);
+% func y = cos(\value t);
+% }
+%
+% data [format=function] {
+%
+% % This a surface plot data...
+% var x : interval [0:1];
+% var y : interval [0:1];
+%
+% % Let's draw a circle:
+% func height = \value x*\value x + \value y*\value y;
+% }
+
+\pgfdeclaredataformat{function}
+{ % no catcode code
+}
+{ % Startup
+ % Init collectors
+ \let\value=\relax% avoid expansion
+ \pgfkeysgetvalue{/pgf/data/vars}\pgf@lib@dv@collector
+}
+{% Line arguments
+ #1%
+}
+{ % Line action
+ \edef\pgf@lib@dv@collector{\pgf@lib@dv@collector\space #1}%
+}
+{% Ignore empty lines
+}
+{%
+ \edef\pgf@lib@dv@collector{\pgf@lib@dv@collector\space \pgfkeysvalueof{/pgf/data/funcs}}%
+ \let\pgf@lib@dv@parsed\pgfutil@empty%
+ % launch parser on the result
+ \expandafter\pgf@lib@dv@func@parse \pgf@lib@dv@collector\pgf@stop%
+ \let\value\pgf@lib@dv@getval
+ \pgf@lib@dv@parsed\pgfdatapoint\pgfutil@gobble\pgf@stop%
+}%
+
+\pgfkeys{
+ /pgf/data/vars/.initial=,
+ /pgf/data/funcs/.initial=,
+ /pgf/data/evaluator/.initial=\pgfmathparse,
+ /pgf/data/samples/.initial=25}%
+
+\def\pgf@lib@dv@getval#1{\pgfkeysvalueof{/data point/#1}}%
+
+\def\pgf@lib@dv@func@parse{%
+ \pgfutil@ifnextchar\pgf@stop{% done
+ \pgfutil@gobble%
+ }
+ {%
+ \pgfutil@ifnextchar v{% variable
+ \pgf@lib@dv@var%
+ }{%
+ \pgf@lib@dv@func%
+ }%
+ }%
+}%
+
+\def\pgf@lib@dv@func func #1 =#2;{%
+ \expandafter\def\expandafter\pgf@lib@dv@parsed\expandafter{\pgf@lib@dv@parsed\pgf@lib@dv@eval@func{#1}{#2}}
+ \pgf@lib@dv@func@parse%
+}%
+\def\pgf@lib@dv@var var #1 :{\pgfutil@ifnextchar\bgroup{\pgf@lib@dv@var@group{#1}}{\pgf@lib@dv@var@int{#1}}}%
+\def\pgf@lib@dv@var@group#1#2;{%
+ \expandafter\def\expandafter\pgf@lib@dv@parsed\expandafter{\pgf@lib@dv@parsed\pgf@lib@dv@group@var{#1}{#2}}%
+ \pgf@lib@dv@func@parse%
+}%
+\def\pgf@lib@dv@var@int#1#2[#3:#4]{%
+ \pgfutil@ifnextchar s{%
+ \pgf@lib@dv@samplesorsteps{#1}{#3}{#4}%
+ }{%
+ \expandafter\def\expandafter\pgf@lib@dv@parsed\expandafter{%
+ \pgf@lib@dv@parsed\pgf@lib@dv@samples@var{#1}{#3}{#4}{\pgfkeysvalueof{/pgf/data/samples}}}%
+ \expandafter\pgf@lib@dv@func@parse\pgfutil@gobble%
+ }
+}%
+\def\pgf@lib@dv@samplesorsteps#1#2#3s{%
+ \pgfutil@ifnextchar t{% step
+ \pgf@lib@dv@step{#1}{#2}{#3}%
+ }{% sample
+ \pgf@lib@dv@samples{#1}{#2}{#3}%
+ }%
+}%
+\def\pgf@lib@dv@step#1#2#3tep#4;{%
+ \expandafter\def\expandafter\pgf@lib@dv@parsed\expandafter{\pgf@lib@dv@parsed\pgf@lib@dv@step@var{#1}{#2}{#3}{#4}}%
+ \pgf@lib@dv@func@parse%
+}%
+\def\pgf@lib@dv@samples#1#2#3amples#4;{%
+ \expandafter\def\expandafter\pgf@lib@dv@parsed\expandafter{\pgf@lib@dv@parsed\pgf@lib@dv@samples@var{#1}{#2}{#3}{#4}}%
+ \pgf@lib@dv@func@parse%
+}%
+
+%
+% Executer...
+%
+\def\pgf@lib@dv@samples@var#1#2#3#4{%
+ \pgfmathparse{#3}%
+ \let\pgf@lib@dv@temp=\pgfmathresult%
+ \pgfmathparse{#2}%
+ \pgfmathparse{\pgf@lib@dv@temp-\pgfmathresult}%
+ \pgfmathparse{\pgfmathresult/(#4-1)}%
+ \let\pgf@lib@dv@temp=\pgfmathresult%
+ \pgf@lib@dv@step@var{#1}{#2}{#3}{\pgf@lib@dv@temp}%
+}%
+
+\def\pgf@lib@dv@step@var#1#2#3#4#5\pgf@stop{%
+ {%
+ \def\pgf@loop@body{#5}%
+ \pgfmathparse{#2}%
+ \pgfkeyslet{/data point/#1}{\pgfmathresult}%
+ \pgfmathparse{#3}%
+ \let\pgf@loop@end\pgfmathresult%
+ \pgfmathparse{#4}%
+ \let\pgf@loop@step\pgfmathresult%
+ \pgfmathloop%
+ \pgfmathlessthan{\pgf@loop@end}{\pgfkeysvalueof{/data point/#1}}
+ \ifdim\pgfmathresult pt<1pt\relax%
+ \pgf@loop@body\pgf@stop%
+ \pgfmathparse{\pgfkeysvalueof{/data point/#1}+\pgf@loop@step}%
+ \pgfkeyslet{/data point/#1}{\pgfmathresult}%
+ \repeatpgfmathloop%%
+ }%
+}%
+
+\def\pgf@lib@dv@group@var#1#2#3\pgf@stop{%
+ \foreach \pgf@lib@dv@iterator in {#2} {%
+ \pgfkeyslet{/data point/#1}{\pgf@lib@dv@iterator}%
+ #3\pgf@stop%
+ }%
+}%
+
+\def\pgf@lib@dv@eval@func#1#2{%
+ \pgfkeysvalueof{/pgf/data/evaluator}{#2}%
+ \pgfkeyslet{/data point/#1}{\pgfmathresult}%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydatavisualization.polar.code.tex b/graphics/pgf/base/tex/pgflibrarydatavisualization.polar.code.tex
new file mode 100644
index 0000000000..f56ebe3e7f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydatavisualization.polar.code.tex
@@ -0,0 +1,198 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarydatavisualization.polar.code.tex}
+
+\usepgfmodule{datavisualization}%
+
+% This file defines code for doing plots involving polar
+% coordinates. This includes not only standard polar plots, but also
+% pie charts.
+
+
+
+\pgfooclass{polar transformer}
+{%
+ % Class polar mapper
+ %
+ % A polar mapper is used to transform attributes given as (2d) polar
+ % coordinates to canvas coordinates. Note that no special ranges
+ % can be specified and that the angle must be given in degrees. You
+ % can, however, use a standard mapper to change these things.
+
+ \attribute angle;%
+ % The attribute from which the angle is read.
+
+ \attribute radius;%
+ % The attribute from which the radius is read.
+
+ \attribute unit vector 0 degrees;%
+ % The unit vector 0 degrees
+
+ \attribute unit vector 90 degrees;%
+ % The unit vector 90 degrees
+
+
+
+ % Constructor
+ %
+ % #1 = angle attribute. Example: rotation.
+ % #2 = radius attribute. Example: height.
+ % #3 = unit vector 0 degrees
+ % #4 = unit vector 90 degrees
+ %
+ \method polar transformer(#1,#2,#3,#4) {
+ \pgfooset{angle}{#1}
+ \pgfooset{radius}{#2}
+ \pgfooset{unit vector 0 degrees}{#3}
+ \pgfooset{unit vector 90 degrees}{#4}
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,transform,transform datapoint signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,path,path signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,direction,direction signal)
+ }%
+
+ % Getters
+ \method get angle attribute(#1) {
+ \pgfooget{angle}{#1}
+ }%
+
+ \method get radius attribute(#1) {
+ \pgfooget{radius}{#1}
+ }%
+
+
+ % Slot
+ %
+ % This slot should be connected to the transform datapoint
+ % signal. When this signal is emitted, the coordinate system will be
+ % shifted according to the current value of the attribute.
+ \method transform() {
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}/const}\pgf@dv@angle%
+ \ifx\pgf@dv@angle\relax
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}}\pgf@dv@angle%
+ \fi
+ \ifx\pgf@dv@angle\relax\else%
+ \ifx\pgf@dv@angle\pgfutil@empty\else%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}/const}\pgf@dv@radius%
+ \ifx\pgf@dv@radius\relax
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}}\pgf@dv@radius%
+ \fi
+ \ifx\pgf@dv@radius\pgfutil@empty\else%
+ \ifx\pgf@dv@radius\relax\else%
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@dv@angle}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@angle}{\pgf@dv@val}%
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@dv@radius}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@radius}{\pgf@dv@val}%
+ \pgfmathsincos{\pgf@dv@angle}%
+ \pgfmathmultiply{\pgfmathresultx}{\pgf@dv@radius}%
+ \let\pgf@dv@polar@temp=\pgfmathresult
+ \pgftransformshift{\pgfpointscale{\pgf@dv@polar@temp}{\pgfoovalueof{unit vector 0 degrees}}}%
+ \pgfmathmultiply{\pgfmathresulty}{\pgf@dv@radius}%
+ \let\pgf@dv@polar@temp=\pgfmathresult
+ \pgftransformshift{\pgfpointscale{\pgf@dv@polar@temp}{\pgfoovalueof{unit vector 90 degrees}}}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ }%
+
+
+
+ % Reaction to the path signal
+ %
+ % Here is what we do: When a pgfdvpathmoveto is done, the radius and
+ % the angle are recorded. When a pgfdvpathlineto is done, the saved
+ % radius and angle are compared with the new angle and radius. If,
+ % and only if, the radius is the same, but the angle is different,
+ % the lineto is caught and replaced by an arc from the previous
+ % position to the new position.
+
+ \attribute prev angle;%
+ \attribute prev radius;%
+
+ \method path(#1) {%
+ \ifpgfdvhandled%
+ \else%
+ \ifx#1\pgfdvpathlinetotoken
+ % Ok, let us have a look...
+ \pgfooget{prev radius}\pgf@dv@prev@rad
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}}\pgf@dv@current@rad
+ \ifx\pgf@dv@current@rad\relax
+ \else
+ \ifx\pgf@dv@current@rad\pgf@dv@prev@rad%
+ \pgfooget{prev angle}\pgf@dv@prev@angle
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}}\pgf@dv@current@angle
+ \ifx\pgf@dv@current@angle\relax
+ \else
+ \ifx\pgf@dv@current@angle\pgf@dv@prev@angle%
+ % do nothing
+ \else%
+ % Do arc:
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@dv@prev@angle}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@prev@angle}{\pgf@dv@val}%
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@dv@prev@rad}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@prev@rad}{\pgf@dv@val}%
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@dv@current@angle}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@current@angle}{\pgf@dv@val}%
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@dv@current@rad}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@current@rad}{\pgf@dv@val}%
+ \pgfpatharcaxes{\pgf@dv@prev@angle}{\pgf@dv@current@angle}
+ {\pgfpointscale{\pgf@dv@current@rad}{\pgfoovalueof{unit vector 0 degrees}}}
+ {\pgfpointscale{\pgf@dv@current@rad}{\pgfoovalueof{unit vector 90 degrees}}}%
+ \pgfdvhandledtrue%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ % No matter what, record the current position
+ \pgfooeset{prev angle}{\pgfkeysvalueof{/data point/\pgfoovalueof{angle}}}
+ \pgfooeset{prev radius}{\pgfkeysvalueof{/data point/\pgfoovalueof{radius}}}
+ }%
+
+ % Method
+ %
+ % React to direction signals. See pgfpointdvdirection for an
+ % explanation
+ %
+ \method direction(#1) {%
+ \ifx#1\pgfdvdirectionfromtoken
+ % Record from angle and radius
+ \xdef\pgf@dv@polar@from@angle{\pgfkeysvalueof{/data point/\pgfoovalueof{angle}}}
+ \xdef\pgf@dv@polar@from@radius{\pgfkeysvalueof{/data point/\pgfoovalueof{radius}}}
+ \else\ifx#1\pgfdvdirectiontotoken%
+ % Record to angle and radius
+ \xdef\pgf@dv@polar@to@angle{\pgfkeysvalueof{/data point/\pgfoovalueof{angle}}}
+ \xdef\pgf@dv@polar@to@radius{\pgfkeysvalueof{/data point/\pgfoovalueof{radius}}}
+ \else%
+ \ifx\pgf@dv@polar@from@radius\pgf@dv@polar@to@radius%
+ \pgfdvmathenter{\pgf@dv@a}{\pgf@dv@polar@from@angle}%
+ \pgfdvmathenter{\pgf@dv@b}{\pgf@dv@polar@to@angle}%
+ \pgfdvmathifless{\pgf@dv@a}{\pgf@dv@b}{\def\pgf@dv@temp@sign{+}}{\def\pgf@dv@temp@sign{-}}%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}}\pgf@temp%
+ \ifx\pgf@temp\relax%
+ \else%
+ \pgfdvmathenter{\pgf@dv@val}{\pgf@temp}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@polar@angle}{\pgf@dv@val}%
+ \pgf@process{\pgfpointpolar{\pgf@dv@polar@angle\pgf@dv@temp@sign90}{1pt}}%
+ \pgfdvhandledtrue%
+ \fi%
+ \fi%
+ \fi\fi%
+ }%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.footprints.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.footprints.code.tex
new file mode 100644
index 0000000000..369a0ecbd0
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.footprints.code.tex
@@ -0,0 +1,230 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+
+% Parameters
+\pgfset{
+ % Length of a footprint:
+ /pgf/decoration/foot length/.initial=10pt,
+ % Distance between two footprints on the same side of the path
+ /pgf/decoration/stride length/.initial=30pt,
+ % Double distance between footprint and input path
+ /pgf/decoration/foot sep/.initial=4pt,
+ % Rotate feet by this much
+ /pgf/decoration/foot angle/.initial=10,
+ % What animal?
+ /pgf/decoration/foot of/.initial=human,
+}%
+
+
+
+\pgfdeclaredecoration{footprints}{left}
+{%
+ \state{left}[width=\pgfkeysvalueof{/pgf/decoration/stride length}/2,next state=right]
+ {
+ \pgftransformyshift{\pgfkeysvalueof{/pgf/decoration/foot sep}/2}
+ \pgfmathparse{\pgfkeysvalueof{/pgf/decoration/foot length}}
+ \pgftransformscale{\pgfmathresult}
+ \pgftransformrotate{\pgfkeysvalueof{/pgf/decoration/foot angle}}
+ \csname pgf@lib@foot@of@\pgfkeysvalueof{/pgf/decoration/foot of}\endcsname
+ }%
+ \state{right}[width=\pgfkeysvalueof{/pgf/decoration/stride length}/2,next state=left]
+ {
+ \pgftransformyscale{-1}
+ \pgftransformyshift{\pgfkeysvalueof{/pgf/decoration/foot sep}/2}
+ \pgfmathparse{\pgfkeysvalueof{/pgf/decoration/foot length}}
+ \pgftransformscale{\pgfmathresult}
+ \pgftransformrotate{\pgfkeysvalueof{/pgf/decoration/foot angle}}
+ \csname pgf@lib@foot@of@\pgfkeysvalueof{/pgf/decoration/foot of}\endcsname
+ }%
+}%
+
+
+
+% Actual footprints.
+%
+% A footprint must be name \pgf@lib@foot@of@XXX, be a left foot and
+% should fill a rectangle of (0,0) rectangle (1pt,1pt) (more or less)
+% and point right.
+%
+
+
+\def\pgf@lib@foot@of@gnome{
+ % Coordinates from a Gnome logo on wikimedia commons. LGPL
+ % license... Unknown author.
+ %
+ % Flip and rotate
+ \pgftransformcm{0}{-1}{-1}{0}{\pgfqpoint{1pt}{0.8pt}}
+ \pgftransformscale{0.83333}
+ \pgfpathmoveto{\pgfqpoint{.86068pt}{0pt}}
+ \pgfpathcurveto{\pgfqpoint{.61466pt}{0pt}}{\pgfqpoint{.56851pt}{.35041pt}}{\pgfqpoint{.70691pt}{.35041pt}}
+ \pgfpathcurveto{\pgfqpoint{.84529pt}{.35041pt}}{\pgfqpoint{1.10671pt}{0pt}}{\pgfqpoint{.86068pt}{0pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.45217pt}{.30699pt}}
+ \pgfpathcurveto{\pgfqpoint{.52586pt}{.31149pt}}{\pgfqpoint{.60671pt}{.02577pt}}{\pgfqpoint{.46821pt}{.04374pt}}
+ \pgfpathcurveto{\pgfqpoint{.32976pt}{.06171pt}}{\pgfqpoint{.37845pt}{.30249pt}}{\pgfqpoint{.45217pt}{.30699pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.11445pt}{.48453pt}}
+ \pgfpathcurveto{\pgfqpoint{.16686pt}{.46146pt}}{\pgfqpoint{.1212pt}{.23581pt}}{\pgfqpoint{.03208pt}{.29735pt}}
+ \pgfpathcurveto{\pgfqpoint{-.057pt}{.3589pt}}{\pgfqpoint{.06204pt}{.50759pt}}{\pgfqpoint{.11445pt}{.48453pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.26212pt}{.36642pt}}
+ \pgfpathcurveto{\pgfqpoint{.32451pt}{.3537pt}}{\pgfqpoint{.32793pt}{.09778pt}}{\pgfqpoint{.21667pt}{.14369pt}}
+ \pgfpathcurveto{\pgfqpoint{.10539pt}{.18961pt}}{\pgfqpoint{.19978pt}{.37916pt}}{\pgfqpoint{.26212pt}{.36642pt}}
+ \pgfpathlineto{\pgfqpoint{.26212pt}{.36642pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.58791pt}{.93913pt}}
+ \pgfpathcurveto{\pgfqpoint{.59898pt}{1.02367pt}}{\pgfqpoint{.52589pt}{1.06542pt}}{\pgfqpoint{.45431pt}{1.01092pt}}
+ \pgfpathcurveto{\pgfqpoint{.22644pt}{.83743pt}}{\pgfqpoint{.8316pt}{.75088pt}}{\pgfqpoint{.79171pt}{.51386pt}}
+ \pgfpathcurveto{\pgfqpoint{.7586pt}{.31712pt}}{\pgfqpoint{.15495pt}{.37769pt}}{\pgfqpoint{.08621pt}{.68553pt}}
+ \pgfpathcurveto{\pgfqpoint{.03968pt}{.89374pt}}{\pgfqpoint{.27774pt}{1.1826pt}}{\pgfqpoint{.52614pt}{1.1826pt}}
+ \pgfpathcurveto{\pgfqpoint{.64834pt}{1.1826pt}}{\pgfqpoint{.78929pt}{1.07226pt}}{\pgfqpoint{.81566pt}{.93248pt}}
+ \pgfpathcurveto{\pgfqpoint{.8358pt}{.82589pt}}{\pgfqpoint{.57867pt}{.8686pt}}{\pgfqpoint{.58791pt}{.93913pt}}
+ \pgfpathlineto{\pgfqpoint{.58791pt}{.93913pt}}
+ \pgfpathclose
+}%
+
+
+
+\def\pgf@lib@foot@of@bird{
+ % Coordinates derived from vector image created by Mark Wibrow.
+ %
+ \pgftransformcm{0}{.11}{.11}{0}{\pgfqpoint{.37pt}{.52pt}}
+ \pgfpathmoveto{\pgfqpoint{-.886pt}{1.652pt}}
+ \pgfpathcurveto{\pgfqpoint{-.4632pt}{2.669pt}}{\pgfqpoint{-.5092pt}{4.3712pt}}{\pgfqpoint{-.4512pt}{5.6734pt}}
+ \pgfpathcurveto{\pgfqpoint{-.4374pt}{5.9842pt}}{\pgfqpoint{-.3182pt}{6.0686pt}}{\pgfqpoint{-.2484pt}{5.644pt}}
+ \pgfpathcurveto{\pgfqpoint{-.0534pt}{4.459pt}}{\pgfqpoint{.087pt}{3.0132pt}}{\pgfqpoint{.5206pt}{1.8464pt}}
+ \pgfpathcurveto{\pgfqpoint{.714pt}{1.326pt}}{\pgfqpoint{.692pt}{1.416pt}}{\pgfqpoint{1.0864pt}{1.759pt}}
+ \pgfpathcurveto{\pgfqpoint{1.7662pt}{2.3504pt}}{\pgfqpoint{2.665pt}{3.1756pt}}{\pgfqpoint{3.2028pt}{4.02pt}}
+ \pgfpathcurveto{\pgfqpoint{3.4708pt}{4.4408pt}}{\pgfqpoint{3.4258pt}{4.0814pt}}{\pgfqpoint{3.3366pt}{3.8708pt}}
+ \pgfpathcurveto{\pgfqpoint{2.9068pt}{2.8562pt}}{\pgfqpoint{.8502pt}{.645pt}}{\pgfqpoint{.4808pt}{-.0864pt}}
+ \pgfpathcurveto{\pgfqpoint{.0808pt}{-.8788pt}}{\pgfqpoint{.1664pt}{-2.1246pt}}{\pgfqpoint{.0024pt}{-2.7868pt}}
+ \pgfpathcurveto{\pgfqpoint{-.172pt}{-3.4908pt}}{\pgfqpoint{-.2726pt}{-3.704pt}}{\pgfqpoint{-.3812pt}{-2.9558pt}}
+ \pgfpathcurveto{\pgfqpoint{-.5316pt}{-1.9202pt}}{\pgfqpoint{-.88pt}{-.256pt}}{\pgfqpoint{-1.332pt}{.128pt}}
+ \pgfpathcurveto{\pgfqpoint{-1.716pt}{.4542pt}}{\pgfqpoint{-3.7928pt}{2.3136pt}}{\pgfqpoint{-4.5044pt}{3.3524pt}}
+ \pgfpathcurveto{\pgfqpoint{-4.7618pt}{3.728pt}}{\pgfqpoint{-4.709pt}{3.7864pt}}{\pgfqpoint{-4.4212pt}{3.5818pt}}
+ \pgfpathcurveto{\pgfqpoint{-3.4844pt}{2.9162pt}}{\pgfqpoint{-2.6164pt}{1.654pt}}{\pgfqpoint{-1.454pt}{1.3886pt}}
+ \pgfpathcurveto{\pgfqpoint{-1.0876pt}{1.305pt}}{\pgfqpoint{-1.0296pt}{1.3066pt}}{\pgfqpoint{-.886pt}{1.652pt}}
+ \pgfpathclose
+}%
+
+
+\expandafter\def\csname pgf@lib@foot@of@felis silvestris\endcsname{
+ % Coordinates derived from vector image created by Mark Wibrow, based
+ % on the forefoot of `felis silvestris' shown in
+ % Pearson, B. and Burton, J. A. (1980), `Wild Animals', Collins, 155.
+ %
+ \pgftransformcm{0}{.1}{.1}{0}{\pgfqpoint{.48pt}{.5pt}}
+ \pgfpathmoveto{\pgfqpoint{2.7312pt}{-1.992pt}}
+ \pgfpathcurveto{\pgfqpoint{1.8716pt}{-1.4226pt}}{\pgfqpoint{2.1404pt}{.0436pt}}{\pgfqpoint{.9202pt}{.0436pt}}
+ \pgfpathcurveto{\pgfqpoint{-.1146pt}{.0436pt}}{\pgfqpoint{-.7386pt}{.0178pt}}{\pgfqpoint{-1.319pt}{-1.0288pt}}
+ \pgfpathcurveto{\pgfqpoint{-1.7922pt}{-1.8822pt}}{\pgfqpoint{-2.072pt}{-1.5488pt}}{\pgfqpoint{-2.9638pt}{-1.968pt}}
+ \pgfpathcurveto{\pgfqpoint{-3.9244pt}{-2.4198pt}}{\pgfqpoint{-4.4394pt}{-3.348pt}}{\pgfqpoint{-4.1136pt}{-4.041pt}}
+ \pgfpathcurveto{\pgfqpoint{-3.3862pt}{-5.5882pt}}{\pgfqpoint{-1.6156pt}{-3.83pt}}{\pgfqpoint{-1.1684pt}{-4.312pt}}
+ \pgfpathcurveto{\pgfqpoint{-.5806pt}{-4.9454pt}}{\pgfqpoint{.5032pt}{-4.8822pt}}{\pgfqpoint{1.1748pt}{-4.2878pt}}
+ \pgfpathcurveto{\pgfqpoint{1.5822pt}{-3.9272pt}}{\pgfqpoint{2.6524pt}{-5.0652pt}}{\pgfqpoint{3.3506pt}{-4.1066pt}}
+ \pgfpathcurveto{\pgfqpoint{3.839pt}{-3.4356pt}}{\pgfqpoint{3.1192pt}{-2.249pt}}{\pgfqpoint{2.7312pt}{-1.992pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{5.0576pt}{.4996pt}}
+ \pgfpathcurveto{\pgfqpoint{4.6056pt}{.6536pt}}{\pgfqpoint{4.0596pt}{.2516pt}}{\pgfqpoint{3.8382pt}{-.398pt}}
+ \pgfpathcurveto{\pgfqpoint{3.6168pt}{-1.0478pt}}{\pgfqpoint{3.8038pt}{-1.6996pt}}{\pgfqpoint{4.2558pt}{-1.8536pt}}
+ \pgfpathcurveto{\pgfqpoint{4.7078pt}{-2.0076pt}}{\pgfqpoint{5.2538pt}{-1.6056pt}}{\pgfqpoint{5.4752pt}{-.9558pt}}
+ \pgfpathcurveto{\pgfqpoint{5.6966pt}{-.3062pt}}{\pgfqpoint{5.5096pt}{.3456pt}}{\pgfqpoint{5.0576pt}{.4996pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{3.1212pt}{3.5542pt}}
+ \pgfpathcurveto{\pgfqpoint{2.5874pt}{3.6726pt}}{\pgfqpoint{1.975pt}{3.1756pt}}{\pgfqpoint{1.7538pt}{2.4442pt}}
+ \pgfpathcurveto{\pgfqpoint{1.5324pt}{1.7128pt}}{\pgfqpoint{1.7858pt}{1.0238pt}}{\pgfqpoint{2.3196pt}{.9052pt}}
+ \pgfpathcurveto{\pgfqpoint{2.8534pt}{.7868pt}}{\pgfqpoint{3.4658pt}{1.2838pt}}{\pgfqpoint{3.6872pt}{2.0152pt}}
+ \pgfpathcurveto{\pgfqpoint{3.9084pt}{2.7466pt}}{\pgfqpoint{3.655pt}{3.4358pt}}{\pgfqpoint{3.1212pt}{3.5542pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{-.6182pt}{5.0456pt}}
+ \pgfpathcurveto{\pgfqpoint{-1.2132pt}{5.0456pt}}{\pgfqpoint{-1.6956pt}{4.3104pt}}{\pgfqpoint{-1.6956pt}{3.4038pt}}
+ \pgfpathcurveto{\pgfqpoint{-1.6956pt}{2.4972pt}}{\pgfqpoint{-1.2132pt}{1.7618pt}}{\pgfqpoint{-.6182pt}{1.7618pt}}
+ \pgfpathcurveto{\pgfqpoint{-.0232pt}{1.7618pt}}{\pgfqpoint{.4592pt}{2.4972pt}}{\pgfqpoint{.4592pt}{3.4038pt}}
+ \pgfpathcurveto{\pgfqpoint{.4592pt}{4.3104pt}}{\pgfqpoint{-.0232pt}{5.0456pt}}{\pgfqpoint{-.6182pt}{5.0456pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{-4.1176pt}{1.8248pt}}
+ \pgfpathcurveto{\pgfqpoint{-4.6334pt}{1.7534pt}}{\pgfqpoint{-4.9806pt}{1.0312pt}}{\pgfqpoint{-4.8928pt}{.212pt}}
+ \pgfpathcurveto{\pgfqpoint{-4.8052pt}{-.6072pt}}{\pgfqpoint{-4.3158pt}{-1.2136pt}}{\pgfqpoint{-3.8pt}{-1.1422pt}}
+ \pgfpathcurveto{\pgfqpoint{-3.2842pt}{-1.0708pt}}{\pgfqpoint{-2.9372pt}{-.3486pt}}{\pgfqpoint{-3.0248pt}{.4706pt}}
+ \pgfpathcurveto{\pgfqpoint{-3.1126pt}{1.2898pt}}{\pgfqpoint{-3.6018pt}{1.8962pt}}{\pgfqpoint{-4.1176pt}{1.8248pt}}
+ \pgfpathclose
+}%
+
+
+
+\def\pgf@lib@foot@of@human{%
+ % Coordinates derived from vector image created by Mark Wibrow.
+ \pgftransformcm{0}{.5}{.5}{0}{\pgfqpoint{.48pt}{.2pt}}
+ %
+ % Draw main part of foot.
+ %
+ \pgfpathmoveto{\pgfqpoint{.20175pt}{-.72633pt}}
+ \pgfpathcurveto{\pgfqpoint{.16314pt}{-.88194pt}}{\pgfqpoint{.07386pt}{-1.0167pt}}{\pgfqpoint{-.08385pt}{-1.0167pt}}
+ \pgfpathcurveto{\pgfqpoint{-.24153pt}{-1.0167pt}}{\pgfqpoint{-.36942pt}{-.84897pt}}{\pgfqpoint{-.36942pt}{-.72633pt}}
+ \pgfpathcurveto{\pgfqpoint{-.36942pt}{-.60372pt}}{\pgfqpoint{-.32505pt}{-.54825pt}}{\pgfqpoint{-.27633pt}{-.51192pt}}
+ \pgfpathcurveto{\pgfqpoint{-.23937pt}{-.48435pt}}{\pgfqpoint{-.17031pt}{-.46539pt}}{\pgfqpoint{-.10611pt}{-.40323pt}}
+ \pgfpathcurveto{\pgfqpoint{-.04191pt}{-.3411pt}}{\pgfqpoint{.00495pt}{-.27783pt}}{\pgfqpoint{.00495pt}{-.14787pt}}
+ \pgfpathcurveto{\pgfqpoint{.00495pt}{-.01794pt}}{\pgfqpoint{-.08526pt}{.12648pt}}{\pgfqpoint{-.22194pt}{.22467pt}}
+ \pgfpathcurveto{\pgfqpoint{-.35862pt}{.32286pt}}{\pgfqpoint{-.40863pt}{.50226pt}}{\pgfqpoint{-.32703pt}{.5979pt}}
+ \pgfpathcurveto{\pgfqpoint{-.24543pt}{.69354pt}}{\pgfqpoint{-.00564pt}{.66543pt}}{\pgfqpoint{.17172pt}{.53484pt}}
+ \pgfpathcurveto{\pgfqpoint{.34908pt}{.40422pt}}{\pgfqpoint{.39363pt}{.27192pt}}{\pgfqpoint{.37416pt}{.10971pt}}
+ \pgfpathcurveto{\pgfqpoint{.35472pt}{-.0525pt}}{\pgfqpoint{.26736pt}{-.46203pt}}{\pgfqpoint{.20175pt}{-.72633pt}}
+ \pgfpathclose
+ %
+ % Draw toe.s
+ %
+ \pgfpathmoveto{\pgfqpoint{-.27138pt}{1.01451pt}}
+ \pgfpathcurveto{\pgfqpoint{-.21198pt}{1.01451pt}}{\pgfqpoint{-.1638pt}{.94509pt}}{\pgfqpoint{-.1638pt}{.8595pt}}
+ \pgfpathcurveto{\pgfqpoint{-.1638pt}{.77388pt}}{\pgfqpoint{-.21198pt}{.70446pt}}{\pgfqpoint{-.27138pt}{.70446pt}}
+ \pgfpathcurveto{\pgfqpoint{-.33078pt}{.70446pt}}{\pgfqpoint{-.37896pt}{.77388pt}}{\pgfqpoint{-.37896pt}{.8595pt}}
+ \pgfpathcurveto{\pgfqpoint{-.37896pt}{.94509pt}}{\pgfqpoint{-.33078pt}{1.01451pt}}{\pgfqpoint{-.27138pt}{1.01451pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{-.05769pt}{.90573pt}}
+ \pgfpathcurveto{\pgfqpoint{-.01659pt}{.90573pt}}{\pgfqpoint{.01674pt}{.86445pt}}{\pgfqpoint{.01674pt}{.81354pt}}
+ \pgfpathcurveto{\pgfqpoint{.01674pt}{.7626pt}}{\pgfqpoint{-.01659pt}{.72132pt}}{\pgfqpoint{-.05769pt}{.72132pt}}
+ \pgfpathcurveto{\pgfqpoint{-.09879pt}{.72132pt}}{\pgfqpoint{-.13209pt}{.7626pt}}{\pgfqpoint{-.13209pt}{.81354pt}}
+ \pgfpathcurveto{\pgfqpoint{-.13209pt}{.86445pt}}{\pgfqpoint{-.09879pt}{.90573pt}}{\pgfqpoint{-.05769pt}{.90573pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.10497pt}{.81636pt}}
+ \pgfpathcurveto{\pgfqpoint{.14214pt}{.81096pt}}{\pgfqpoint{.16722pt}{.77193pt}}{\pgfqpoint{.16104pt}{.72918pt}}
+ \pgfpathcurveto{\pgfqpoint{.15483pt}{.68646pt}}{\pgfqpoint{.11964pt}{.65619pt}}{\pgfqpoint{.08247pt}{.66159pt}}
+ \pgfpathcurveto{\pgfqpoint{.0453pt}{.66699pt}}{\pgfqpoint{.02019pt}{.70602pt}}{\pgfqpoint{.0264pt}{.74874pt}}
+ \pgfpathcurveto{\pgfqpoint{.03261pt}{.79149pt}}{\pgfqpoint{.0678pt}{.82176pt}}{\pgfqpoint{.10497pt}{.81636pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.24054pt}{.70842pt}}
+ \pgfpathcurveto{\pgfqpoint{.27513pt}{.70842pt}}{\pgfqpoint{.30318pt}{.67686pt}}{\pgfqpoint{.30318pt}{.63795pt}}
+ \pgfpathcurveto{\pgfqpoint{.30318pt}{.59904pt}}{\pgfqpoint{.27513pt}{.56751pt}}{\pgfqpoint{.24054pt}{.56751pt}}
+ \pgfpathcurveto{\pgfqpoint{.20598pt}{.56751pt}}{\pgfqpoint{.17793pt}{.59904pt}}{\pgfqpoint{.17793pt}{.63795pt}}
+ \pgfpathcurveto{\pgfqpoint{.17793pt}{.67686pt}}{\pgfqpoint{.20598pt}{.70842pt}}{\pgfqpoint{.24054pt}{.70842pt}}
+ \pgfpathclose
+ %
+ \pgfpathmoveto{\pgfqpoint{.35973pt}{.57501pt}}
+ \pgfpathcurveto{\pgfqpoint{.3918pt}{.57501pt}}{\pgfqpoint{.41781pt}{.54852pt}}{\pgfqpoint{.41781pt}{.51585pt}}
+ \pgfpathcurveto{\pgfqpoint{.41781pt}{.48318pt}}{\pgfqpoint{.3918pt}{.45669pt}}{\pgfqpoint{.35973pt}{.45669pt}}
+ \pgfpathcurveto{\pgfqpoint{.32769pt}{.45669pt}}{\pgfqpoint{.30168pt}{.48318pt}}{\pgfqpoint{.30168pt}{.51585pt}}
+ \pgfpathcurveto{\pgfqpoint{.30168pt}{.54852pt}}{\pgfqpoint{.32769pt}{.57501pt}}{\pgfqpoint{.35973pt}{.57501pt}}
+ \pgfpathclose
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.fractals.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.fractals.code.tex
new file mode 100644
index 0000000000..2327c77029
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.fractals.code.tex
@@ -0,0 +1,65 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+
+
+\pgfdeclaredecoration{Koch curve type 1}{init}
+{%
+ \state{init}[width=\pgfdecoratedinputsegmentremainingdistance]
+ {
+ \pgfpathlineto{\pgfpoint{.33333\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{.33333\pgfdecoratedinputsegmentremainingdistance}{.33333\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.66666\pgfdecoratedinputsegmentremainingdistance}{.33333\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.66666\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ }%
+}%
+
+\pgfdeclaredecoration{Koch curve type 2}{init}
+{%
+ \state{init}[width=\pgfdecoratedinputsegmentremainingdistance]
+ {
+ \pgfpathlineto{\pgfpoint{.25\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{.25\pgfdecoratedinputsegmentremainingdistance}{.25\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.5\pgfdecoratedinputsegmentremainingdistance}{.25\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.5\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{.5\pgfdecoratedinputsegmentremainingdistance}{-.25\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.75\pgfdecoratedinputsegmentremainingdistance}{-.25\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.75\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ }%
+}%
+
+\pgfdeclaredecoration{Koch snowflake}{init}
+{%
+ \state{init}[width=\pgfdecoratedinputsegmentremainingdistance]
+ {
+ \pgfpathlineto{\pgfpoint{.3333\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{.5\pgfdecoratedinputsegmentremainingdistance}{0.2886751347\pgfdecoratedinputsegmentremainingdistance}}
+ \pgfpathlineto{\pgfpoint{.6666\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ }%
+}%
+
+
+\pgfdeclaredecoration{Cantor set}{init}
+{%
+ \state{init}[width=\pgfdecoratedinputsegmentremainingdistance]
+ {
+ \pgfpathlineto{\pgfpoint{.3333\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathmoveto{\pgfpoint{.6666\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ }%
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.markings.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.markings.code.tex
new file mode 100644
index 0000000000..6a17dbe3c0
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.markings.code.tex
@@ -0,0 +1,178 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+
+% A marking decoration is used to add markings (which are just pgf
+% scopes, essentially) at certain positions of a path.
+
+\pgfkeys{
+ /pgf/decoration/reset marks/.code=\let\pgf@lib@dec@mark@marks\pgfutil@empty,
+ /pgf/decoration/mark/.code=\pgf@lib@dec@parsemark#1\pgf@lib@dec@stop,
+}%
+
+\let\pgf@lib@dec@mark@marks=\pgfutil@empty
+
+\def\pgf@lib@dec@parsemark{\pgfutil@ifnextchar b{\pgf@lib@dec@parsebetween}{\pgf@lib@dec@parseat}}%
+\def\pgf@lib@dec@parseat at position#1with#2\pgf@lib@dec@stop{%
+ \expandafter\def\expandafter\pgf@lib@dec@mark@marks\expandafter{\pgf@lib@dec@mark@marks%
+ \pgf@lib@dec@domark{#1}{#2}%
+ }%
+}%
+\def\pgf@lib@dec@parsebetween between positions#1and#2step#3with#4\pgf@lib@dec@stop{%
+ \expandafter\def\expandafter\pgf@lib@dec@mark@marks\expandafter{\pgf@lib@dec@mark@marks%
+ \pgf@lib@dec@dobetweenmark{#1}{#2}{#3}{#4}%
+ }%
+}%
+
+\def\pgf@lib@dec@arrowhead#1#2{%
+ \pgftransformxscale{#1}
+ \pgfarrowdraw{#2}%
+}%
+
+\def\pgf@lib@dec@doarrowhead#1{%
+ \pgf@lib@dec@arrowhead{1}{#1}%
+}%
+\def\pgf@lib@dec@doarrowheadrev#1{%
+ \pgf@lib@dec@arrowhead{-1}{#1}%
+}%
+
+
+\pgfdeclaredecoration{markings}{init}
+{%
+ \state{init}
+ [
+ width=0pt,
+ persistent precomputation={%
+ \pgfkeys{/pgf/decoration/mark info/sequence number/.initial=0}%
+ \pgfkeys{/pgf/decoration/mark info/distance from start/.initial=}%
+ },
+ next state=pre
+ ]
+ {}%
+
+ \state{pre}
+ [
+ width=0pt,
+ persistent precomputation={%
+ \def\pgf@lib@dec@computed@width{0pt}%
+ \pgf@lib@dec@mark@marks\pgf@lib@dec@mark@last%
+ \let\arrow=\pgf@lib@dec@doarrowhead%
+ \let\arrowreversed=\pgf@lib@dec@doarrowheadrev%
+ },
+ next state=skipper
+ ]
+ {}%
+
+ \state{skipper}[width=\pgf@lib@dec@computed@width-\pgfdecoratedcompleteddistance-1sp,
+ next state=\pgf@lib@dec@next@state]{}%
+
+ \state{main}
+ [
+ width=1sp,
+ next state=pre,
+ persistent precomputation={%
+ \pgfutil@tempcnta=\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}\relax%
+ \advance\pgfutil@tempcnta by1\relax%
+ \pgfkeys{/pgf/decoration/mark info/sequence number/.expanded=\the\pgfutil@tempcnta}%
+ \pgfkeys{/pgf/decoration/mark info/distance from start/.expanded=\pgf@lib@dec@computed@width}%
+ }%
+ ]
+ {%
+ \pgfinterruptpath%
+ \pgfscope%
+ \let\pgf@lib@dec@mark@marks=\pgfutil@empty%
+ \pgf@lib@dec@computed@action%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ \ifx\pgf@lib@mark@node\pgfutil@empty%
+ \else%
+ \pgf@lib@mark@connect@node%
+ \fi%
+ }%
+
+ \state{final}[width=\pgfdecoratedremainingdistance]{
+ \ifx\pgf@lib@mark@node\pgfutil@empty%
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ \else%
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ \fi%
+ }%
+}%
+
+\def\pgf@lib@dec@domark#1#2#3\pgf@lib@dec@mark@last{%
+ \def\pgf@lib@dec@mark@marks{#3}%
+ \pgf@lib@dec@parsenum{#1}%
+ \def\pgf@lib@dec@computed@action{#2}%
+ \def\pgf@lib@dec@next@state{main}%
+}%
+
+
+\def\pgf@lib@dec@dobetweenmark#1#2#3#4#5\pgf@lib@dec@mark@last{%
+ \pgf@lib@dec@parsenum{#1}%
+ \let\pgf@lib@dec@mark@start=\pgf@lib@dec@computed@width%
+ \pgf@lib@dec@parsenum{#2}%
+ \let\pgf@lib@dec@mark@end=\pgf@lib@dec@computed@width%
+ \ifdim\pgf@lib@dec@mark@end<\pgf@lib@dec@mark@start\relax%
+ % Skip!
+ #5\pgf@lib@dec@mark@last%
+ \else%
+ %
+ \pgf@lib@dec@parsenum{#3}%
+ \pgfmathparse{\pgf@lib@dec@mark@start+\pgf@lib@dec@computed@width}%
+ % Update entry in mark list
+ \edef\pgf@temp{\noexpand\pgf@lib@dec@dobetweenmark{\pgfmathresult pt}{\pgf@lib@dec@mark@end}{\pgf@lib@dec@computed@width}}%
+ \expandafter\def\expandafter\pgf@lib@dec@mark@marks\expandafter{\pgf@temp{#4}#5}%
+ \let\pgf@lib@dec@computed@width\pgf@lib@dec@mark@start%
+ \def\pgf@lib@dec@computed@action{#4}%
+ \def\pgf@lib@dec@next@state{main}%
+ \fi%
+}%
+
+
+\def\pgf@lib@dec@parsenum#1{%
+ \pgfmathparse{#1}%
+ \ifpgfmathunitsdeclared%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathparse{\pgfdecoratedpathlength\pgfmathresult pt}%
+ \else%
+ \pgfmathparse{\pgfmathresult pt}%
+ \fi%
+ \else%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathparse{\pgfdecoratedpathlength\pgfmathresult*\pgfdecoratedpathlength}%
+ \else%
+ \pgfmathparse{\pgfmathresult*\pgfdecoratedpathlength}%
+ \fi%
+ \fi%
+ \edef\pgf@lib@dec@computed@width{\pgfmathresult pt}%
+}%
+
+\def\pgf@lib@dec@mark@last{%
+ \def\pgf@lib@dec@next@state{final}%
+}%
+
+
+%
+% If you set the mark connection node inside a mark picture, the
+% output path will contain a line to this node
+%
+
+\pgfkeys{/pgf/decoration/mark connection node/.store in=\pgf@lib@mark@node,
+ /pgf/decoration/mark connection node=}%
+\def\pgf@lib@mark@connect@node{%
+ % Line to "left" end of the node
+ \pgfpathlineto{\pgfpointshapeborder{\pgf@lib@mark@node}{\pgfqpoint{-1pt}{0pt}}}
+ % Move to "right" end of the node
+ \pgfpathmoveto{\pgfpointshapeborder{\pgf@lib@mark@node}{\pgfqpoint{1pt}{0pt}}}
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.pathmorphing.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.pathmorphing.code.tex
new file mode 100644
index 0000000000..72ed4ca6b6
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.pathmorphing.code.tex
@@ -0,0 +1,294 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+
+%
+% These decorations "morph" paths. That means that the
+% original characteristic of the path is kept and the number of
+% subpaths remains the same -- only, the lines are slightly offset or
+% changed by the decoration. For instance a line might be turned into
+% a squiggly line or a snaking line or a bumping line.
+%
+
+
+%
+%
+% Kind 1: Path morphing straight line decorations
+%
+%
+
+
+% zigzag decoration.
+%
+\pgfdeclaredecoration{zigzag}{up from center}{%
+ \state{up from center}[width=+.5\pgfdecorationsegmentlength, next state=big down]
+ {
+ \pgfpathlineto{\pgfqpoint{.25\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ }%
+ \state{big down}[switch if less than=+.5\pgfdecorationsegmentlength to center finish,
+ width=+.5\pgfdecorationsegmentlength,
+ next state=big up]
+ {
+ \pgfpathlineto{\pgfqpoint{.25\pgfdecorationsegmentlength}{-\pgfdecorationsegmentamplitude}}
+ }%
+ \state{big up}[switch if less than=+.5\pgfdecorationsegmentlength to center finish,
+ width=+.5\pgfdecorationsegmentlength,
+ next state=big down]
+ {
+ \pgfpathlineto{\pgfqpoint{.25\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ }%
+ \state{center finish}[width=0pt, next state=final]{
+ \pgfpathlineto{\pgfpointorigin}
+ }%
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+
+% saw decoration
+%
+% Parameters: \pgfdecorationsegmentamplitude, \pgfdecorationsegmentlength
+
+\pgfdeclaredecoration{saw}{initial}
+{%
+ \state{initial}[auto end on length=+\pgfdecorationsegmentlength,
+ auto corner on length=+\pgfdecorationsegmentlength,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathlineto{\pgfqpoint{\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ \pgfpathlineto{\pgfqpoint{\pgfdecorationsegmentlength}{0pt}}
+ }%
+ \state{final}
+ {}%
+}%
+
+
+
+
+% random steps decoration
+%
+% A decoration that consists of random steps heading towards the target
+%
+% Parameters: \pgfdecorationsegmentamplitude, \pgfdecorationsegmentlength
+
+\pgfdeclaredecoration{random steps}{start}
+{%
+ \state{start}[width=+0pt,next state=step,persistent precomputation=\pgfdecoratepathhascornerstrue]{}%
+ \state{step}[auto end on length=1.5\pgfdecorationsegmentlength,
+ auto corner on length=1.5\pgfdecorationsegmentlength,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathlineto{
+ \pgfpointadd
+ {\pgfpoint{\pgfdecorationsegmentlength}{0pt}}
+ {\pgfpoint{rand*\pgfdecorationsegmentamplitude}{rand*\pgfdecorationsegmentamplitude}}
+ }
+ }%
+ \state{final}
+ {}%
+}%
+
+
+
+% Meta-decoration line zigzag
+
+\pgfdeclaremetadecoration{straight zigzag}{line to}{%
+ \state{line to}[width=\pgfmetadecorationsegmentlength, next state=zigzag]
+ {
+ \decoration{curveto}
+ }%
+ \state{zigzag}[width=\pgfmetadecorationsegmentlength, next state=line to]
+ {
+ \decoration{zigzag}
+ }%
+ \state{final}
+ {
+ \decoration{curveto}
+ }%
+}%
+
+
+
+
+
+%
+%
+% Kind 2: Path morphing curved decorations
+%
+%
+
+
+
+% bent decoration
+%
+% A decoration that looks like someone bent the line a bit.
+%
+% Parameters: \pgfdecorationsegmentamplitude, \pgfdecorationsegmentaspect
+
+\pgfdeclaredecoration{bent}{bent}
+{%
+ \state{bent}[width=+\pgfdecoratedinputsegmentremainingdistance]
+ {
+ \pgfpathcurveto
+ {\pgfqpoint{\pgfdecorationsegmentaspect\pgfdecoratedinputsegmentremainingdistance}{\pgfdecorationsegmentamplitude}}
+ {\pgfpointadd{\pgfqpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ {\pgfqpoint{-\pgfdecorationsegmentaspect\pgfdecoratedinputsegmentremainingdistance}{\pgfdecorationsegmentamplitude}}}
+ {\pgfqpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ }%
+ \state{final}
+ {}%
+}%
+
+
+
+% decoration snake
+%
+% This decoration produces a hopefully optically pleasing squiggly snake.
+%
+% Parameters: \pgfdecorationsegmentamplitude, \pgfdecorationsegmentlength
+
+\pgfdeclaredecoration{snake}{initial}
+{%
+ \state{initial}[switch if less than=+.625\pgfdecorationsegmentlength to final,
+ width=+.3125\pgfdecorationsegmentlength,
+ next state=down]
+ {
+ \pgfpathcurveto
+ {\pgfqpoint{.125\pgfdecorationsegmentlength}{0pt}}
+ {\pgfqpoint{.1875\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.3125\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ }%
+ \state{down}[switch if less than=+.8125\pgfdecorationsegmentlength to end down,
+ width=+.5\pgfdecorationsegmentlength,
+ next state=up]
+ {
+ \pgfpathcosine{\pgfqpoint{.25\pgfdecorationsegmentlength}{-1\pgfdecorationsegmentamplitude}}
+ \pgfpathsine{\pgfqpoint{.25\pgfdecorationsegmentlength}{-1\pgfdecorationsegmentamplitude}}
+ }%
+ \state{up}[switch if less than=+.8125\pgfdecorationsegmentlength to end up,
+ width=+.5\pgfdecorationsegmentlength,
+ next state=down]
+ {
+ \pgfpathcosine{\pgfqpoint{.25\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ \pgfpathsine{\pgfqpoint{.25\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ }%
+ \state{end down}[width=+.3125\pgfdecorationsegmentlength,
+ next state=final]
+ {
+ \pgfpathcurveto
+ {\pgfqpoint{.125\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.1875\pgfdecorationsegmentlength}{0pt}}
+ {\pgfqpoint{.3125\pgfdecorationsegmentlength}{0pt}}
+ }%
+ \state{end up}[width=+.3125\pgfdecorationsegmentlength,
+ next state=final]
+ {
+ \pgfpathcurveto
+ {\pgfqpoint{.125\pgfdecorationsegmentlength}{-\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.1875\pgfdecorationsegmentlength}{0pt}}
+ {\pgfqpoint{.3125\pgfdecorationsegmentlength}{0pt}}
+ }%
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+% coil decoration
+%
+% Parameters: \pgfdecorationsegmentamplitude, \pgfdecorationsegmentlength,
+
+\pgfdeclaredecoration{coil}{coil}
+{%
+ \state{coil}[switch if less than=%
+ 1.5\pgfdecorationsegmentlength+%
+ \pgfdecorationsegmentaspect\pgfdecorationsegmentamplitude+%
+ \pgfdecorationsegmentaspect\pgfdecorationsegmentamplitude to last,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathcurveto
+ {\pgfpoint@oncoil{0 }{ 0.555}{1}}
+ {\pgfpoint@oncoil{0.445}{ 1 }{2}}
+ {\pgfpoint@oncoil{1 }{ 1 }{3}}
+ \pgfpathcurveto
+ {\pgfpoint@oncoil{1.555}{ 1 }{4}}
+ {\pgfpoint@oncoil{2 }{ 0.555}{5}}
+ {\pgfpoint@oncoil{2 }{ 0 }{6}}
+ \pgfpathcurveto
+ {\pgfpoint@oncoil{2 }{-0.555}{7}}
+ {\pgfpoint@oncoil{1.555}{-1 }{8}}
+ {\pgfpoint@oncoil{1 }{-1 }{9}}
+ \pgfpathcurveto
+ {\pgfpoint@oncoil{0.445}{-1 }{10}}
+ {\pgfpoint@oncoil{0 }{-0.555}{11}}
+ {\pgfpoint@oncoil{0 }{ 0 }{12}}
+ }%
+ \state{last}[width=.5\pgfdecorationsegmentlength+%
+ \pgfdecorationsegmentaspect\pgfdecorationsegmentamplitude+%
+ \pgfdecorationsegmentaspect\pgfdecorationsegmentamplitude,next state=final]
+ {
+ \pgfpathcurveto
+ {\pgfpoint@oncoil{0 }{ 0.555}{1}}
+ {\pgfpoint@oncoil{0.445}{ 1 }{2}}
+ {\pgfpoint@oncoil{1 }{ 1 }{3}}
+ \pgfpathcurveto
+ {\pgfpoint@oncoil{1.555}{ 1 }{4}}
+ {\pgfpoint@oncoil{2 }{ 0.555}{5}}
+ {\pgfpoint@oncoil{2 }{ 0 }{6}}
+ }%
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+\def\pgfpoint@oncoil#1#2#3{%
+ \pgf@x=#1\pgfdecorationsegmentamplitude%
+ \pgf@x=\pgfdecorationsegmentaspect\pgf@x%
+ \pgf@y=#2\pgfdecorationsegmentamplitude%
+ \pgf@xa=0.083333333333\pgfdecorationsegmentlength%
+ \advance\pgf@x by#3\pgf@xa%
+}%
+
+
+% bumps decoration
+%
+% Parameters: \pgfdecorationsegmentamplitude, \pgfdecorationsegmentlength
+
+\pgfdeclaredecoration{bumps}{initial}
+{%
+ \state{initial}[auto end on length=+.51\pgfdecorationsegmentlength,
+ auto corner on length=+.51\pgfdecorationsegmentlength,
+ width=+.5\pgfdecorationsegmentlength]
+ {
+ \pgfpathcurveto
+ {\pgfqpoint{0pt}{.555\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{0.11125\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.25\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ \pgfpathcurveto
+ {\pgfqpoint{.38875\pgfdecorationsegmentlength}{\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.5\pgfdecorationsegmentlength}{.5\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.5\pgfdecorationsegmentlength}{0\pgfdecorationsegmentamplitude}}
+ }%
+ \state{final}
+ {
+ \pgfpathlineto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.pathreplacing.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.pathreplacing.code.tex
new file mode 100644
index 0000000000..10f8371c47
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.pathreplacing.code.tex
@@ -0,0 +1,240 @@
+% Copyright 2008 by Mark Wibrow and Till Tantau
+%
+% 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.
+
+\usepgfmodule{decorations}%
+
+
+%
+% Path replacing decorations
+%
+% These decorations change the path by replacing it by another path.
+% For instance, a line in the path might be replaced by small
+% ticks or unconnected curves or crosses. Applying a chopping
+% decoration to a path means that the path can no longer be used for
+% filling in the original manner.
+%
+
+
+
+%
+%
+% Kind 1: Path chopping with open subpaths
+%
+%
+
+
+% ticks decoration
+%
+% Parameters: \pgfdecorationsegmentlength, \pgfdecorationsegmentamplitude
+
+\pgfdeclaredecoration{ticks}{ticks}
+{%
+ \state{ticks}[width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfdecorationsegmentamplitude}}
+ }%
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfdecorationsegmentamplitude}}
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+% expanding waves decoration
+%
+% Parameters: \pgfdecorationsegmentangle, \pgfdecorationsegmentlength
+
+\pgfdeclaredecoration{expanding waves}{initial}
+{%
+ \state{initial}[width=+\pgfdecorationsegmentlength,next state=wave]
+ {}%
+
+ \state{wave}[switch if less than=+\pgfdecorationsegmentlength to last,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathmoveto{
+ \pgfpointadd
+ {\pgfqpoint{-\pgfdecoratedcompleteddistance}{0pt}}%
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{+\pgfdecoratedcompleteddistance}}}%
+ \pgfpatharc{\pgfdecorationsegmentangle}{-\pgfdecorationsegmentangle}{+\pgfdecoratedcompleteddistance}%
+ }%
+ \state{last}[width=+0pt,next state=final]
+ {
+ \pgfpathmoveto{
+ \pgfpointadd
+ {\pgfqpoint{-\pgfdecoratedcompleteddistance}{0pt}}%
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{+\pgfdecoratedcompleteddistance}}}%
+ \pgfpatharc{\pgfdecorationsegmentangle}{-\pgfdecorationsegmentangle}{+\pgfdecoratedcompleteddistance}%
+ }%
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+% waves decoration
+
+\pgfdeclaredecoration{waves}{wave}
+{%
+ \state{wave}[width=\pgfdecorationsegmentlength]
+ {
+ \pgftransformxshift{+\pgfdecorationsegmentlength}
+ \pgfpathmoveto{
+ \pgfpointadd
+ {\pgfqpoint{-\pgfkeysvalueof{/pgf/decoration/start radius}}{0pt}}%
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}}}%
+ \pgfpatharc{\pgfdecorationsegmentangle}{-\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}%
+ }%
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+% border decoration
+%
+% Parameters: \pgfdecorationsegmentlength, \pgfdecorationsegmentamplitude, \pgfdecorationsegmentangle
+
+\pgfdeclaredecoration{border}{tick}
+{%
+ \state{tick}[switch if less than=+\pgfdecorationsegmentlength to last,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpointpolar{\pgfdecorationsegmentangle}{+\pgfdecorationsegmentamplitude}}
+ }%
+ \state{last}[width=+\pgfdecorationsegmentamplitude,next state=final]
+ {
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathlineto{\pgfpointpolar{\pgfdecorationsegmentangle}{+\pgfdecorationsegmentamplitude}}
+ }%
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+
+
+
+% brace decorations
+%
+% Parameters: \pgfdecorationsegmentamplitude
+
+\pgfdeclaredecoration{brace}{brace}
+{%
+ \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
+ {
+ \pgf@yc=\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance
+ \ifdim2\pgfdecorationsegmentamplitude>\pgf@yc
+ \pgf@yc=0.5\pgf@yc
+ \else
+ \pgf@yc=\pgfdecorationsegmentamplitude
+ \fi
+ \pgf@xc=\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance
+ \advance\pgf@xc-\pgfdecoratedremainingdistance
+ \ifdim-2\pgfdecorationsegmentamplitude<\pgf@xc
+ \pgf@xc=-0.5\pgf@xc
+ \else
+ \pgf@xc=\pgfdecorationsegmentamplitude
+ \fi
+ \pgfpathmoveto{\pgfpointorigin}
+ \pgfpathcurveto
+ {\pgfqpoint{.15\pgf@yc}{.3\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.5\pgf@yc}{.5\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{\pgf@yc}{.5\pgfdecorationsegmentamplitude}}
+ {
+ \pgftransformxshift{+\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance}
+ \pgfpathlineto{\pgfqpoint{-\pgf@yc}{.5\pgfdecorationsegmentamplitude}}
+ \pgfpathcurveto
+ {\pgfqpoint{-.5\pgf@yc}{.5\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{-.15\pgf@yc}{.7\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{0\pgf@yc}{1\pgfdecorationsegmentamplitude}}
+ \pgfpathcurveto
+ {\pgfqpoint{.15\pgf@xc}{.7\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{.5\pgf@xc}{.5\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{\pgf@xc}{.5\pgfdecorationsegmentamplitude}}
+ }
+ {
+ \pgftransformxshift{+\pgfdecoratedremainingdistance}
+ \pgfpathlineto{\pgfqpoint{-\pgf@xc}{.5\pgfdecorationsegmentamplitude}}
+ \pgfpathcurveto
+ {\pgfqpoint{-.5\pgf@xc}{.5\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{-.15\pgf@xc}{.3\pgfdecorationsegmentamplitude}}
+ {\pgfqpoint{0pt}{0pt}}
+ }
+ }%
+ \state{final}
+ {}%
+}%
+
+
+
+
+% show path construction decoration
+%
+\pgfdeclaredecoration{show path construction}{check for moveto}{%
+ \state{check for moveto}[width=0pt, next state=segment,
+ persistent precomputation={%
+ \begingroup%
+ \pgf@lib@decoraions@installinputsegmentpoints%
+ \ifx\pgfdecorationpreviousinputsegment\pgfdecorationinputsegmentmoveto%
+ \pgfdecoratedinputsegmentmovetocode%
+ \fi%
+ \endgroup%
+ }]{}%
+ \state{segment}[width=\pgfdecoratedinputsegmentremainingdistance, next state=check for moveto,
+ persistent precomputation={%
+ \begingroup%
+ \pgf@lib@decoraions@installinputsegmentpoints%
+ \csname pgfdecoratedinputsegment\pgfdecorationcurrentinputsegment code\endcsname%
+ \endgroup%
+ }]{}%
+ \state{final}{%
+ \egroup%
+ \begingroup%
+ \pgf@lib@decoraions@installinputsegmentpoints%
+ \csname pgfdecoratedinputsegment\pgfdecorationcurrentinputsegment code\endcsname%
+ \endgroup%
+ \bgroup%
+ }%
+}%
+
+\pgfkeys{
+ /pgf/decoration/.cd,
+ moveto code/.code=\def\pgfdecoratedinputsegmentmovetocode{#1},
+ lineto code/.code=\def\pgfdecoratedinputsegmentlinetocode{#1},
+ curveto code/.code=\def\pgfdecoratedinputsegmentcurvetocode{#1},
+ closepath code/.code=\def\pgfdecoratedinputsegmentclosepathcode{#1}
+}%
+
+\let\pgfdecoratedinputsegmentmovetocode\pgfutil@empty%
+\let\pgfdecoratedinputsegmentlinetocode\pgfutil@empty%
+\let\pgfdecoratedinputsegmentcurvetocode\pgfutil@empty%
+\let\pgfdecoratedinputsegmentclosepathcode\pgfutil@empty%
+
+\def\pgf@lib@decoraions@installinputsegmentpoints{%
+ \let\pgfpointdecoratedinputsegmentfirst\pgf@decorate@inputsegment@first%
+ \let\pgfpointdecoratedinputsegmentlast\pgf@decorate@inputsegment@last%
+ \let\pgfpointdecoratedinputsegmentsupporta\pgf@decorate@inputsegment@supporta%
+ \let\pgfpointdecoratedinputsegmentsupportb\pgf@decorate@inputsegment@supportb%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.shapes.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.shapes.code.tex
new file mode 100644
index 0000000000..08781d04fb
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.shapes.code.tex
@@ -0,0 +1,468 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+
+% Options for shape decorations
+
+\pgfkeys{
+ /pgf/decoration/.cd,
+ shape/.initial=circle,
+ anchor/.initial=center,
+ shape start width/.initial=2.5pt,
+ shape start height/.initial=2.5pt,
+ shape end width/.initial=2.5pt,
+ shape end height/.initial=2.5pt,
+ shape sep/.store in=\pgf@lib@shapedecoration@sep,
+ shape sloped/.is if=pgfshapedecorationsloped,
+ shape scaled/.is if=pgfshapedecorationscaled,
+ shape evenly spread/.store in=\pgf@lib@shapedecoration@spread,
+ shape start size/.style={%
+ shape start width=#1,
+ shape start height=#1%
+ },%
+ shape end size/.style={%
+ shape end width=#1,
+ shape end height=#1%
+ },%
+ shape size/.style={%
+ shape start size=#1,
+ shape end size=#1%
+ },%
+ shape width/.style={%
+ shape start width=#1,
+ shape end width=#1
+ },
+ shape height/.style={%
+ shape start height=#1,
+ shape end height=#1
+ }
+}%
+
+\def\pgf@lib@shapedecoration@sep{.25cm, between centers}%
+\newif\ifpgfshapedecorationsloped
+\pgfshapedecorationslopedtrue
+\newif\ifpgfshapedecorationscaled
+\let\pgf@lib@shapedecoration@spread\pgfutil@empty%
+
+
+
+% triangle decoration
+
+\pgfdeclaredecoration{triangles}{init}
+{%
+ \state{init}[width=+0pt,next state=triangle,persistent precomputation={
+ \pgfmathparse{\pgfkeysvalueof{/pgf/decoration/shape start width}}
+ \edef\pgf@lib@dec@ssw{\pgfmathresult pt}
+ \pgfmathparse{\pgfkeysvalueof{/pgf/decoration/shape start height}/2}
+ \edef\pgf@lib@dec@ssh{\pgfmathresult pt}
+ }]{}%
+ \state{triangle}[switch if less than=+\pgfdecorationsegmentlength to last,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgf@lib@dec@ssh}}
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@dec@ssw}{0pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgf@lib@dec@ssh}}
+ \pgfpathclose
+ }%
+ \state{last}[switch if less than=\pgf@lib@dec@ssw to skip,
+ width=\pgfdecoratedremainingdistance,next state=final]
+ {
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgf@lib@dec@ssh}}
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@dec@ssw}{0pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgf@lib@dec@ssh}}
+ \pgfpathclose
+ }%
+ \state{skip}[width=\pgfdecoratedremainingdistance]
+ {}%
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+
+% crosses decoration
+
+\pgfdeclaredecoration{crosses}{init}
+{%
+ \state{init}[width=+0pt,next state=crosses,persistent precomputation={
+ \pgfmathparse{\pgfkeysvalueof{/pgf/decoration/shape start width}/2}
+ \edef\pgf@lib@dec@ssw{\pgfmathresult pt}
+ \pgfmathparse{\pgfkeysvalueof{/pgf/decoration/shape start height}/2}
+ \edef\pgf@lib@dec@ssh{\pgfmathresult pt}
+ }]{}%
+ \state{crosses}[switch if less than=+\pgfdecorationsegmentlength to last,
+ width=+\pgfdecorationsegmentlength]
+ {
+ \pgfpathmoveto{\pgfqpoint{-\pgf@lib@dec@ssw}{\pgf@lib@dec@ssh}}
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@dec@ssw}{-\pgf@lib@dec@ssh}}
+ \pgfpathmoveto{\pgfqpoint{-\pgf@lib@dec@ssw}{-\pgf@lib@dec@ssh}}
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@dec@ssw}{\pgf@lib@dec@ssh}}
+ }%
+ \state{last}[width=+\pgfdecoratedremainingdistance]
+ {
+ \pgfpathmoveto{\pgfqpoint{-\pgf@lib@dec@ssw}{\pgf@lib@dec@ssh}}
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@dec@ssw}{-\pgf@lib@dec@ssh}}
+ \pgfpathmoveto{\pgfqpoint{-\pgf@lib@dec@ssw}{-\pgf@lib@dec@ssh}}
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@dec@ssw}{\pgf@lib@dec@ssh}}
+ }%
+ \state{final}{
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}
+ }%
+}%
+
+
+
+
+
+
+% The shape background decoration
+%
+% The shape background decoration adds repeated instances of
+% the background path of a specified shape along the path. The shape
+% must have been declared by \pgfdeclareshape. If a shape has
+% specialized keys (e.g. the number of points on a star, or the apex
+% angle the isosceles triangle), these can be specified in the usual manner.
+%
+% The separation between shapes in the path can be specified and can
+% be between the center of the shape or the border of the shape.
+%
+% The height and width of the shape can be independently or
+% simultaneously scaled (linearly) along the path. It is also
+% possible to prevent the shapes being sloped parallel to the
+% path.
+
+% internal if
+\newif\ifpgf@lib@shapedecoration@betweenborders
+
+\edef\pgf@lib@shapedecoration@initialise{0pt}%
+
+\pgfdeclaredecoration{shape backgrounds}{initialise}
+{%
+ \state{initialise}
+ [
+ width=+\pgf@lib@shapedecoration@initialise,
+ next state=shape,
+ persistent precomputation=
+ {
+ %
+ % \egroup ends the group started by the automaton before executing
+ % a decoration state. This prevents the need for (most) \global variables.
+ %
+ %
+ % Check the shape exists.
+ %
+ \pgfutil@ifundefined{pgf@sh@bg@\pgfkeysvalueof{/pgf/decoration/shape}}{%
+ \pgferror{I do not know the shape `\pgfkeysvalueof{/pgf/decoration/shape}',
+ so I cannot use it in a decoration. Check if its library been loaded or if you
+ simply mistyped the name}}{}%
+ %
+ % Calculate a `default' path size.
+ %
+ \pgfinterruptpath%
+ \pgfinterruptboundingbox%
+ \pgftransformreset%
+ \pgf@relevantforpicturesizetrue%
+ %
+ % This size of this shape is unimportant, but it should
+ % be just large/small enough to avoid huge errors when
+ % calculating the scaling factors later on.
+ %
+ \pgfkeys{/pgf/inner sep=50pt, /pgf/minimum size=1pt}% Arbitrary lengths.
+ \setbox\pgfnodeparttextbox\hbox{}% Assume shape does nothing special if box is empty.
+ \let\pgf@sh@savedmacros\pgfutil@empty%
+ \let\pgf@sh@savedpoints\pgfutil@empty%
+ \csname pgf@sh@s@\pgfkeysvalueof{/pgf/decoration/shape}\endcsname%
+ \pgf@sh@savedpoints%
+ \pgf@sh@savedmacros%
+ %
+ % Save the macros and points.
+ %
+ \expandafter\gdef\expandafter\pgf@lib@shapedecoration@points\expandafter{\pgf@sh@savedpoints}%
+ \expandafter\gdef\expandafter\pgf@lib@shapedecoration@macros\expandafter{\pgf@sh@savedmacros}%
+ \csname pgf@sh@bg@\pgfkeysvalueof{/pgf/decoration/shape}\endcsname%
+ %
+ % Save the dimensions of the shape path.
+ %
+ \pgf@x\pgf@picmaxx%
+ \pgf@y\pgf@picmaxy%
+ \advance\pgf@x-\pgf@picminx%
+ \advance\pgf@y-\pgf@picminy%
+ \xdef\pgf@lib@shapedecoration@shapepathsize{%
+ \noexpand\pgf@x\the\pgf@x%
+ \noexpand\pgf@y\the\pgf@y%
+ }%
+ \endpgfinterruptboundingbox%
+ \endpgfinterruptpath%
+ %
+ \edef\pgf@lib@shapedecoration@beforeshape{0pt}%
+ \edef\pgf@lib@shapedecoration@aftershape{0pt}%
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/decoration/shape start width}}%
+ \edef\pgf@lib@shapedecoration@startwidth{\the\pgf@x}%
+ \edef\pgf@lib@shapedecoration@width{\the\pgf@x}%
+ \pgf@x-\pgf@x%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/decoration/shape end width}}%
+ \edef\pgf@lib@shapedecoration@widthchange{\the\pgf@x}%
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/decoration/shape start height}}%
+ \edef\pgf@lib@shapedecoration@initialheight{\the\pgf@y}%
+ \edef\pgf@lib@shapedecoration@height{\the\pgf@y}%
+ \pgf@y-\pgf@y%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/decoration/shape end height}}%
+ \edef\pgf@lib@shapedecoration@heightchange{\the\pgf@y}%
+ %
+ % Calculate the sep.
+ %
+ \ifx\pgf@lib@shapedecoration@spread\pgfutil@empty%
+ %
+ % Not spreading, so easy:
+ %
+ \def\pgf@lib@shapedecoration@borderstext{between borders}%
+ \afterassignment\pgf@lib@shapedecoration@setkeyword%
+ \expandafter\pgf@x\pgf@lib@shapedecoration@sep,\pgf@stop%
+ \edef\pgf@lib@shapedecoration@sep{\the\pgf@x}%
+ \else%
+ %
+ % Spreading (a bit of a nuiscence actually).
+ %
+ \def\pgf@lib@shapedecoration@borderstext{by borders}%
+ \afterassignment\pgf@lib@shapedecoration@setkeyword%
+ \expandafter\c@pgf@counta\pgf@lib@shapedecoration@spread,\pgf@stop%
+ \ifpgf@lib@shapedecoration@betweenborders%
+ %
+ % Ok. The required sep between borders is:
+ %
+ % (r -(n-1)((a+b)/2))/(n-1)
+ %
+ % r = decoration length (here, the remaining distance)
+ % a = initial width
+ % b = end width
+ % n = the number of shapes
+ %
+ \ifnum\c@pgf@counta>1\relax%
+ \advance\c@pgf@counta-1\relax%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/decoration/shape start width}}%
+ \ifpgfshapedecorationscaled%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/decoration/shape end width}}%
+ \else%
+ \advance\pgf@x\pgf@x%
+ \fi%
+ \pgf@x.5\pgf@x% (a+b)/2
+ \multiply\pgf@x-\c@pgf@counta% -(n-1)((a+b)/2)
+ \advance\pgf@x\pgfdecoratedremainingdistance%
+ \divide\pgf@x\c@pgf@counta%
+ \pgf@x.9999\pgf@x% Hackery to control some native TeX inaccuracies.
+ %
+ % Unfortunately if the shape is scaled, and evenly spread by borders,
+ % it is necessary to do something a bit different to control for
+ % (most) inaccuracies.
+ %
+ \ifpgfshapedecorationscaled%
+ \pgf@xa\pgf@lib@shapedecoration@widthchange\relax%
+ \divide\pgf@xa\c@pgf@counta%
+ \edef\pgf@lib@shapedecoration@specialwidth{\the\pgf@xa}%
+ \fi%
+ \else%
+ \pgf@lib@shapedecoration@betweenbordersfalse%
+ \pgf@x\pgfdecoratedremainingdistance%
+ \ifnum\c@pgf@counta=1\relax%
+ \pgf@y.5\pgf@x%
+ \edef\pgf@lib@shapedecoration@initialise{\the\pgf@y}%
+ \else%
+ \advance\pgf@x5pt\relax% An arbitrary value >0pt.
+ \edef\pgf@lib@shapedecoration@initialise{\the\pgf@x}%
+ \fi%
+ \fi%
+ \else%
+ %
+ % Between centers.
+ %
+ \pgf@x\pgfdecoratedremainingdistance%
+ \ifnum\c@pgf@counta>1\relax%
+ \advance\c@pgf@counta-1\relax%
+ \divide\pgf@x\c@pgf@counta\relax%
+ \else%
+ \ifnum\c@pgf@counta=1\relax%
+ \pgf@y.5\pgf@x%
+ \edef\pgf@lib@shapedecoration@initialise{\the\pgf@y}%
+ \else%
+ \advance\pgf@x5pt\relax% An arbitrary value >0pt.
+ \edef\pgf@lib@shapedecoration@initialise{\the\pgf@x}%
+ \fi%
+ \fi%
+ \fi%
+ \edef\pgf@lib@shapedecoration@sep{\the\pgf@x}%
+ \fi%
+ }]
+ {}%
+ \state{before shape}
+ [
+ width=\pgf@lib@shapedecoration@beforeshape-1sp,
+ next state=shape,
+ persistent precomputation=
+ {
+ \ifpgfshapedecorationscaled%
+ \ifpgf@lib@shapedecoration@betweenborders%
+ \ifx\pgf@lib@shapedecoration@spread\pgfutil@empty%
+ %
+ % Not so straightforward. The required ratio is given by
+ %
+ % R = (c+W/2)/(c+r-.5*w)
+ %
+ % c = completed distance
+ % r = remaining distance
+ % W = initial width
+ % w = the change in width (i.e., end - start)
+ %
+ \pgf@x\pgfdecoratedcompleteddistance%
+ \advance\pgf@x\pgfdecoratedremainingdistance%
+ \pgf@xa\pgf@lib@shapedecoration@startwidth\relax%
+ \pgf@xa.5\pgf@xa%
+ \advance\pgf@xa\pgfdecoratedcompleteddistance% c+W/2
+ %
+ \pgf@xb\pgf@lib@shapedecoration@widthchange\relax%
+ \pgf@xb-.5\pgf@xb%
+ \advance\pgf@xb\pgf@x% c+r-.5*w
+ %
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@xb}}%
+ \fi%
+ \else%
+ %
+ % Easy peasy. The required ratio is
+ %
+ % R = c / (c+r)
+ %
+ \pgf@y\pgfdecoratedcompleteddistance%
+ \advance\pgf@y\pgfdecoratedremainingdistance%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgfdecoratedcompleteddistance}}{\pgfmath@tonumber{\pgf@y}}%
+ \fi%
+ %
+ % Get the new width.
+ %
+ \ifx\pgf@lib@shapedecoration@spread\pgfutil@empty%
+ \pgf@x\pgf@lib@shapedecoration@widthchange\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \advance\pgf@x\pgf@lib@shapedecoration@startwidth\relax%
+ \else%
+ \ifpgf@lib@shapedecoration@betweenborders%
+ %
+ % Special case when decoration is scaled, and evenly spread by borders.
+ %
+ \pgf@x\pgf@lib@shapedecoration@width\relax%
+ \advance\pgf@x\pgf@lib@shapedecoration@specialwidth\relax%
+ \pgf@xa\pgf@x%
+ \advance\pgf@xa-\pgf@lib@shapedecoration@startwidth\relax%
+ \pgf@xb\pgf@lib@shapedecoration@widthchange\relax%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@xb}}%
+ \else%
+ \pgf@x\pgf@lib@shapedecoration@widthchange\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \advance\pgf@x\pgf@lib@shapedecoration@startwidth\relax%
+ \fi%
+ \fi%
+ \edef\pgf@lib@shapedecoration@width{\the\pgf@x}%
+ %
+ % New height = R*h + H
+ %
+ \pgf@y\pgf@lib@shapedecoration@heightchange\relax%
+ \pgf@y\pgfmathresult\pgf@y%
+ \advance\pgf@y\pgf@lib@shapedecoration@initialheight\relax%
+ \edef\pgf@lib@shapedecoration@height{\the\pgf@y}%
+ \fi%
+ %
+ \ifpgf@lib@shapedecoration@betweenborders%
+ \pgf@x\pgf@lib@shapedecoration@width\relax%
+ \pgf@x.5\pgf@x%
+ \edef\pgf@lib@shapedecoration@beforeshape{\the\pgf@x}%
+ \else%
+ \def\pgf@lib@shapedecoration@beforeshape{0pt}%
+ \fi%
+ }]
+ {}%
+ \state{shape}[width=+0sp,next state=after shape]
+ {
+ \ifpgfshapedecorationsloped%
+ \else%
+ \pgftransformrotate{-\pgfdecoratedangle}%
+ \fi%
+ %
+ % Scale the path when it is actually drawn.
+ %
+ \pgf@lib@shapedecoration@shapepathsize%
+ \pgfutil@tempdima\pgf@x%
+ \pgfutil@tempdimb\pgf@y%
+ \pgf@xa\pgf@lib@shapedecoration@width\relax%
+ \pgf@xb\pgfutil@tempdima%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@xb}}%
+ \expandafter\pgftransformxscale\expandafter{\pgfmathresult}%
+ %
+ \pgf@ya\pgf@lib@shapedecoration@height\relax%
+ \pgf@yb\pgfutil@tempdimb%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@yb}}%
+ \expandafter\pgftransformyscale\expandafter{\pgfmathresult}%
+ %
+ % Move to the center anchor.
+ %
+ \pgf@lib@shapedecoration@points%
+ \pgf@lib@shapedecoration@macros%
+ \pgftransformshift{%
+ \pgf@sh@reanchor{\pgfkeysvalueof{/pgf/decoration/shape}}{\pgfkeysvalueof{/pgf/decoration/anchor}}%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ %
+ % And draw the shape path.
+ %
+ \csname pgf@sh@bg@\pgfkeysvalueof{/pgf/decoration/shape}\endcsname%
+ }%
+ \state{after shape}
+ [
+ width=\pgf@lib@shapedecoration@aftershape-1sp,
+ next state=sep,
+ persistent precomputation=
+ {
+ \ifpgf@lib@shapedecoration@betweenborders%
+ \pgf@x\pgf@lib@shapedecoration@width\relax%
+ \pgf@x.5\pgf@x%
+ \edef\pgf@lib@shapedecoration@aftershape{\the\pgf@x}%
+ \else%
+ \edef\pgf@lib@shapedecoration@aftershape{0pt}%
+ \fi%
+ }
+ ]
+ {}%
+ \state{sep}[width=\pgf@lib@shapedecoration@sep,next state=before shape,
+ persistent precomputation=\def\pgf@lib@shapedecoration@beforeshape{0pt}]
+ {}%
+ \state{final}
+ {
+ \pgfpathmoveto{\pgfpointdecoratedpathlast}%
+ }%
+}%
+
+\def\pgf@lib@shapedecoration@setkeyword,{%
+ \pgfutil@ifnextchar\pgf@stop{\def\pgf@temp{}\pgf@lib@@@shapedecoration@setkeyword}{\pgf@lib@@shapedecoration@setkeyword}%
+}%
+\def\pgf@lib@@shapedecoration@setkeyword#1,{\def\pgf@temp{#1}\pgf@lib@@@shapedecoration@setkeyword}%
+\def\pgf@lib@@@shapedecoration@setkeyword\pgf@stop{%
+ \ifx\pgf@temp\pgf@lib@shapedecoration@borderstext%
+ \pgf@lib@shapedecoration@betweenborderstrue%
+ \else%
+ \pgf@lib@shapedecoration@betweenbordersfalse%
+ \fi%
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarydecorations.text.code.tex b/graphics/pgf/base/tex/pgflibrarydecorations.text.code.tex
new file mode 100644
index 0000000000..4d31c46fcf
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarydecorations.text.code.tex
@@ -0,0 +1,357 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+
+% Options for text decorations
+
+\pgfkeys{
+ /pgf/decoration/.cd,
+ text/.store in=\pgfdecorationtext,%
+ text color/.store in=\pgf@lib@decorationtextcolor,%
+ text format delimiters/.code={\expandafter\pgfsetdecoratetextformatdelimiters#1},
+ text align/.code={\pgfkeys{/pgf/decoration/text align/.cd,#1}},
+ text align/.cd,
+ align/.initial=left,
+ left/.style={/pgf/decoration/text align/align=left},
+ right/.style={/pgf/decoration/text align/align=right},
+ center/.style={/pgf/decoration/text align/align=center},
+ left indent/.initial=0pt,
+ right indent/.initial=0pt,
+ fit to path/.is if=pgf@lib@dec@text@fit,
+ fit to path stretching spaces/.default=true,
+ fit to path stretching spaces/.code={%
+ \csname pgf@lib@dec@text@fit#1\endcsname%
+ \csname pgf@lib@dec@text@stretch@spaces#1\endcsname%
+ }%
+}%
+
+\newif\ifpgf@lib@dec@text@scan@space
+\newif\ifpgf@lib@dec@text@stretch@spaces
+\newif\ifpgf@lib@dec@text@fit
+
+\def\pgf@lib@decorationtextcolor{black}%
+
+\def\pgf@lib@dec@text@left@text{left}%
+\def\pgf@lib@dec@text@right@text{right}%
+\def\pgf@lib@dec@text@right@center{center}%
+
+% Decorates a path with a text. The path is removed during this
+% process
+
+\pgfdeclaredecoration{text along path}{initial}{%
+ \state{initial}[
+ width=+0pt, next state=left indent,
+ persistent precomputation={%
+ \edef\pgf@lib@dec@text@indent@left{\pgfkeysvalueof{/pgf/decoration/text align/left indent}}%
+ \edef\pgf@lib@dec@text@indent@right{\pgfkeysvalueof{/pgf/decoration/text align/right indent}}%
+ \edef\pgf@lib@dec@text@align{\pgfkeysvalueof{/pgf/decoration/text align/align}}%
+ \pgfdecoratedremainingdistance=\pgfdecoratedpathlength%
+ \advance\pgfdecoratedremainingdistance by-\pgf@lib@dec@text@indent@right\relax%
+ \edef\pgfdecoratedpathlength{\the\pgfdecoratedremainingdistance}%
+ \pgf@lib@dec@text@getwidth%
+ \pgf@x=\pgf@lib@dec@text@width\relax%
+ \pgf@y=\pgfdecoratedremainingdistance%
+ \ifpgf@lib@dec@text@fit%
+ \advance\pgf@y by-\pgf@lib@dec@text@indent@left\relax%
+ \advance\pgf@y by-\pgf@x%
+ \ifpgf@lib@dec@text@stretch@spaces%
+ \def\pgf@lib@dec@text@character@shift{0pt}%
+ \divide\pgf@y by\pgf@lib@dec@space@count\relax%
+ \edef\pgf@lib@dec@text@space@shift{\the\pgf@y}%
+ \else%
+ \c@pgf@counta=\pgf@lib@dec@character@count\relax%
+ \advance\c@pgf@counta by-1\relax%
+ \divide\pgf@y by\c@pgf@counta\relax%
+ \edef\pgf@lib@dec@text@character@shift{\the\pgf@y}%
+ \def\pgf@lib@dec@text@space@shift{0pt}%
+ \fi%
+ \ifdim\pgf@y<0pt\relax%
+ \pgf@lib@dec@text@fitfalse%
+ \pgf@lib@dec@text@stretch@spacesfalse%
+ \def\pgf@lib@dec@text@character@shift{0pt}%
+ \def\pgf@lib@dec@text@space@shift{0pt}%
+ \fi%
+ \else%
+ \def\pgf@lib@dec@text@character@shift{0pt}%
+ \def\pgf@lib@dec@text@space@shift{0pt}%
+ \ifx\pgf@lib@dec@text@align\pgf@lib@dec@text@left@text%
+ \else%
+ \ifx\pgf@lib@dec@text@align\pgf@lib@dec@text@right@text%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgf@lib@dec@text@indent@left{\the\pgf@y}%
+ \else%
+ \advance\pgf@y by-\pgf@x%
+ \advance\pgf@y by-\pgf@lib@dec@text@indent@left\relax%
+ \pgf@y=0.5\pgf@y%
+ \advance\pgf@y by\pgf@lib@dec@text@indent@left\relax%
+ \edef\pgf@lib@dec@text@indent@left{\the\pgf@y}%
+ \fi%
+ \fi%
+ \fi%
+ \let\pgfdecorationrestoftext=\pgfdecorationtext%
+ }]{}%
+\state{left indent}[width=+\pgf@lib@dec@text@indent@left, next state=scan]{}%
+%
+\state{scan}[
+ width=+0pt,
+ next state=before typeset,
+ persistent precomputation={
+ \pgf@lib@dec@text@scanchar%
+ \ifvoid\pgf@lib@dec@text@box%
+ \setbox\pgf@lib@dec@text@box\hbox{}%
+ \wd\pgf@lib@dec@text@box16383pt\relax%
+ \fi%
+}]{}%
+%
+\state{before typeset}[width=+.5\wd\pgf@lib@dec@text@box, next state=typeset]{}%
+%
+\state{typeset}[width=+0pt, next state=after typeset]
+{%
+ \pgftransformxshift{+-.5\wd\pgf@lib@dec@text@box}%
+ \setbox\pgf@hbox\hbox{\copy\pgf@lib@dec@text@box}%
+ \pgfqboxsynced\pgf@hbox%
+}%
+\state{after typeset}[width=+.5\wd\pgf@lib@dec@text@box, next state=shift,
+ persistent precomputation={%
+ \ifpgf@lib@dec@text@fit%
+ \ifpgf@lib@dec@text@stretch@spaces%
+ \ifpgf@lib@dec@text@scan@space%
+ \let\pgf@lib@dec@text@shift=\pgf@lib@dec@text@space@shift%
+ \else%
+ \def\pgf@lib@dec@text@shift{0pt}%
+ \fi%
+ \else%
+ \let\pgf@lib@dec@text@shift=\pgf@lib@dec@text@character@shift%
+ \fi%
+ \else%
+ \def\pgf@lib@dec@text@shift{0pt}%
+ \fi%
+ }]{}%
+\state{shift}[width=+\pgf@lib@dec@text@shift, next state=scan]{}%
+\state{final}{}%
+}%
+
+
+% \pgfsetdecoratetextformatdelimiters
+%
+% Set the delimiters for formatting in the text decoration.
+% NB: Catcodes for delimiters should be 11 or 12.
+%
+% Examples:
+%
+% \pgfsetdecoratetextformatdelimiters{|}{}% 2nd argument can be empty.
+%
+% \def\pgfdecoratetext{A big |\color{red}|red|| apple.}
+%
+% \pgfsetdecoratetextformatdelimiters{[}{]}
+%
+% \def\pgfdecoratetext{The [\it]very[+\color{green}]green[] sprouts.}
+%
+\def\pgfsetdecoratetextformatdelimiters#1#2{%
+ \def\pgf@lib@dec@text@formatchar{#1}%
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \def\pgf@lib@dec@text@collectformat##1#1{%
+ \pgf@lib@dec@text@@collectformat##1\pgf@stop}%
+ \else%
+ \def\pgf@lib@dec@text@collectformat##1#2{%
+ \pgf@lib@dec@text@@collectformat##1\pgf@stop}%
+ \fi%
+}%
+
+\pgfsetdecoratetextformatdelimiters{|}{}%
+
+\newbox\pgf@lib@dec@text@box
+\newif\ifpgf@lib@decorate@textmathmode
+
+\let\pgfdecorationtext=\pgfutil@empty
+\let\pgfdecorationrestoftext=\pgfutil@empty%
+\let\pgf@lib@dec@text@format=\pgfutil@empty
+
+\def\pgf@lib@dec@text@scanchar{%
+ \pgf@lib@dec@text@scan@spacefalse%
+ \ifx\pgfdecorationrestoftext\pgfutil@empty%
+ \let\pgf@lib@dec@text@char\pgfutil@empty%
+ \setbox\pgf@lib@dec@text@box\box\pgfutil@voidb@x%
+ \let\pgf@next\relax%
+ \else\ifx\pgfdecorationrestoftext\pgf@lib@dec@mathshift%
+ \ifpgf@lib@decorate@textmathmode%
+ \pgf@lib@decorate@textmathmodefalse%
+ \fi%
+ \let\pgf@lib@dec@text@char\pgfutil@empty%
+ \setbox\pgf@lib@dec@text@box\box\pgfutil@voidb@x%
+ \let\pgf@next\relax%
+ \else
+ \let\pgf@next\pgf@lib@dec@text@@scanchar%
+ \fi\fi%
+ \pgf@next}%
+
+\def\pgf@lib@dec@text@@scanchar{%
+ \expandafter\pgf@lib@dec@text@@@scanchar\pgfdecorationrestoftext\pgf@stop}%
+
+\def\pgf@lib@dec@text@@@scanchar{%
+ \futurelet\pgf@lib@dec@lettoken%
+ \pgf@lib@dec@text@@@@scanchar}%
+
+\def\pgf@lib@dec@text@@@@scanchar{%
+ \ifx\pgf@lib@dec@lettoken\pgfutil@sptoken%
+ \let\pgf@next\pgf@lib@dec@text@insertspace%
+ \else%
+ \let\pgf@next\pgf@lib@dec@text@@@@@scanchar%
+ \fi%
+ \pgf@next}%
+
+\def\pgf@lib@dec@text@@@@@scanchar{%
+ \pgfutil@ifnextchar\bgroup{\pgf@lib@dec@text@collectgroup}%
+ {\pgf@lib@dec@text@@@@@@scanchar}}%
+
+\def\pgf@lib@dec@text@collectgroup#1{%
+ \def\pgf@lib@dec@text@char{#1}%
+ \pgf@lib@dec@text@collectrestoftext}%
+
+\def\pgf@lib@dec@text@@@@@@scanchar#1{%
+ \ifx#1\pgf@stop%
+ \pgf@lib@dec@text@box\box\pgfutil@voidb@x%
+ \let\pgf@next\pgf@lib@dec@text@endoftext%
+ \else%
+ \def\pgf@lib@dec@text@char{#1}%
+ \ifx#1\space%
+ \let\pgf@next\pgf@lib@dec@text@collectrestoftext%
+ \else%
+ \ifx#1\ %
+ \let\pgf@next\pgf@lib@dec@text@collectrestoftext%
+ \else%
+ \ifx\pgf@lib@dec@text@char\pgf@lib@dec@text@formatchar%
+ \let\pgf@next\pgf@lib@dec@text@collectformat%
+ \else%
+ \expandafter\ifcat\noexpand#1\relax%
+ \let\pgf@next\pgf@lib@dec@text@expandcs%
+ \else%
+ \ifnum\catcode`#1=3\relax%
+ \ifpgf@lib@decorate@textmathmode%
+ \pgf@lib@decorate@textmathmodefalse%
+ \else%
+ \pgf@lib@decorate@textmathmodetrue%
+ \fi%
+ \let\pgf@next\pgf@lib@dec@text@@@scanchar%
+ \else%
+ \let\pgf@next\pgf@lib@dec@text@collectrestoftext%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgf@next%
+}%
+
+\def\pgf@lib@dec@text@@collectformat{%
+ \pgfutil@ifnextchar+{\pgf@lib@dec@text@addtoformat}{\pgf@lib@dec@text@setformat}}%
+
+\def\pgf@lib@dec@text@setformat#1\pgf@stop{%
+ \def\pgf@lib@dec@text@format{#1}%
+ \pgf@lib@dec@text@@@scanchar%
+}%
+
+\def\pgf@lib@dec@text@addtoformat+#1\pgf@stop{%
+ \expandafter\def\expandafter\pgf@lib@dec@text@format\expandafter{\pgf@lib@dec@text@format#1}%
+ \pgf@lib@dec@text@@@scanchar%
+}%
+
+\def\pgf@lib@dec@text@insertspace{%
+ \pgf@lib@dec@text@scan@spacetrue%
+ \pgfutil@ifnextchar\bgroup{\pgf@lib@dec@text@@insertspacegrp}%
+ {\pgf@lib@dec@text@@insertspace}}%
+
+\def\pgf@lib@dec@text@@insertspacegrp#1{%
+ \pgf@lib@dec@text@@@@@@scanchar\space{#1}}%
+
+\def\pgf@lib@dec@text@@insertspace#1{%
+ \pgf@lib@dec@text@@@@@@scanchar\space#1}%
+
+\def\pgf@lib@dec@text@expandcs{%
+ \expandafter\expandafter\expandafter\pgf@lib@dec@text@@@@@scanchar%
+ \pgf@lib@dec@text@char}%
+
+\def\pgf@lib@dec@text@endoftext{%
+ \let\pgfdecorationrestoftext\pgfutil@empty%
+ \let\pgf@lib@dec@text@char\pgfutil@empty%
+}%
+\def\pgf@lib@dec@text@collectrestoftext{%
+ \pgf@lib@dec@text@dobox%
+ \futurelet\pgf@lib@dec@text@lettoken%
+ \pgf@lib@dec@text@@collectrestoftext}%
+
+\def\pgf@lib@dec@text@@collectrestoftext{%
+ \ifx\bgroup\pgf@lib@dec@text@lettoken%
+ \let\pgf@next\pgf@lib@dec@text@@@collectrestoftextgrp%
+ \else%
+ \let\pgf@next\pgf@lib@dec@text@@@collectrestoftext%
+ \fi%
+ \pgf@next}%
+
+\def\pgf@lib@dec@text@@@collectrestoftextgrp#1#2\pgf@stop{\def\pgfdecorationrestoftext{{#1}#2}%
+}%
+
+\def\pgf@lib@dec@text@@@collectrestoftext#1\pgf@stop{\def\pgfdecorationrestoftext{#1}}%
+
+{%
+ \catcode`\$3 %
+ \gdef\pgf@lib@dec@mathshift{$}%
+ \catcode`\$9 $% For editors with annoying syntax highlighting.
+}%
+
+\def\pgf@lib@dec@text@dobox{%
+ \setbox\pgf@lib@dec@text@box\hbox{%
+ \pgfinterruptpicture%
+ \begingroup%
+ \pgfsetcolor{\pgf@lib@decorationtextcolor}%
+ \ifpgf@lib@decorate@textmathmode\pgf@lib@dec@mathshift\fi%
+ \pgf@lib@dec@text@format\relax%
+ \pgf@lib@dec@text@char%
+ \ifpgf@lib@decorate@textmathmode\pgf@lib@dec@mathshift\fi%
+ \endgroup%
+ \endpgfinterruptpicture%
+ }%
+}%
+
+\def\pgf@lib@dec@text@getwidth{%
+ \begingroup%
+ \let\c@pgf@lib@dec@characters=\c@pgf@counta%
+ \let\c@pgf@lib@dec@spaces=\c@pgf@countb%
+ \let\pgfdecorationrestoftext=\pgfdecorationtext%
+ \c@pgf@lib@dec@spaces=0\relax%
+ \c@pgf@lib@dec@characters=0\relax%
+ \pgfmathloop%
+ \pgf@lib@dec@text@scanchar%
+ \ifvoid\pgf@lib@dec@text@box%
+ \else%
+ \setbox\pgf@hbox=\hbox{{%
+ \unhbox\pgf@hbox%
+ \unhbox\pgf@lib@dec@text@box%
+ }}%
+ \advance\c@pgf@lib@dec@characters by1\relax%
+ \ifpgf@lib@dec@text@scan@space%
+ \advance\c@pgf@lib@dec@spaces by1\relax%
+ \fi%
+ \repeatpgfmathloop%
+ \global\pgf@x=\the\wd\pgf@hbox%
+ \xdef\pgf@lib@dec@temp{\the\c@pgf@lib@dec@characters}%
+ \xdef\pgf@lib@dec@@temp{\the\c@pgf@lib@dec@spaces}%
+ \endgroup%
+ \edef\pgf@lib@dec@text@width{\the\pgf@x}%
+ \let\pgf@lib@dec@character@count=\pgf@lib@dec@temp%
+ \let\pgf@lib@dec@space@count=\pgf@lib@dec@@temp%
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryfadings.code.tex b/graphics/pgf/base/tex/pgflibraryfadings.code.tex
new file mode 100644
index 0000000000..8d25f73b37
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryfadings.code.tex
@@ -0,0 +1,57 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryfadings.code.tex}
+
+
+% Axial fadings
+
+\pgfdeclarehorizontalshading{pgf@lib@fade@east}{100bp}
+{color(0bp)=(pgftransparent!0); color(25bp)=(pgftransparent!0);
+ color(75bp)=(pgftransparent!100); color(100bp)=(pgftransparent!100)}%
+
+\pgfdeclarehorizontalshading{pgf@lib@fade@west}{100bp}
+{color(0bp)=(pgftransparent!100); color(25bp)=(pgftransparent!100);
+ color(75bp)=(pgftransparent!0); color(100bp)=(pgftransparent!0)}%
+
+\pgfdeclareverticalshading{pgf@lib@fade@north}{100bp}
+{color(0bp)=(pgftransparent!0); color(25bp)=(pgftransparent!0);
+ color(75bp)=(pgftransparent!100); color(100bp)=(pgftransparent!100)}%
+
+\pgfdeclareverticalshading{pgf@lib@fade@south}{100bp}
+{color(0bp)=(pgftransparent!100); color(25bp)=(pgftransparent!100);
+ color(75bp)=(pgftransparent!0); color(100bp)=(pgftransparent!0)}%
+
+\pgfdeclarefading{east}{\pgfuseshading{pgf@lib@fade@east}}%
+\pgfdeclarefading{west}{\pgfuseshading{pgf@lib@fade@west}}%
+\pgfdeclarefading{north}{\pgfuseshading{pgf@lib@fade@north}}%
+\pgfdeclarefading{south}{\pgfuseshading{pgf@lib@fade@south}}%
+
+
+% Circular fadings
+
+\pgfdeclareradialshading{tikz@lib@fade@circle@10}{\pgfpointorigin}{
+ color(0pt)=(pgftransparent!0); color(22.5bp)=(pgftransparent!0);
+ color(25bp)=(pgftransparent!100); color(50bp)=(pgftransparent!100)}%
+\pgfdeclarefading{circle with fuzzy edge 10 percent}{\pgfuseshading{tikz@lib@fade@circle@10}}%
+
+\pgfdeclareradialshading{tikz@lib@fade@circle@15}{\pgfpointorigin}{
+ color(0pt)=(pgftransparent!0); color(21.25bp)=(pgftransparent!0);
+ color(25bp)=(pgftransparent!100); color(50bp)=(pgftransparent!100)}%
+\pgfdeclarefading{circle with fuzzy edge 15 percent}{\pgfuseshading{tikz@lib@fade@circle@15}}%
+
+\pgfdeclareradialshading{tikz@lib@fade@circle@20}{\pgfpointorigin}{
+ color(0pt)=(pgftransparent!0); color(20bp)=(pgftransparent!0);
+ color(25bp)=(pgftransparent!100); color(50bp)=(pgftransparent!100)}%
+\pgfdeclarefading{circle with fuzzy edge 20 percent}{\pgfuseshading{tikz@lib@fade@circle@20}}%
+
+\pgfdeclareradialshading{tikz@lib@fade@fuzzy@15}{\pgfpointorigin}{
+ color(0pt)=(pgftransparent!100); color(21.25bp)=(pgftransparent!100); color(23.125bp)=(pgftransparent!0);
+ color(25bp)=(pgftransparent!100); color(50bp)=(pgftransparent!100)}%
+\pgfdeclarefading{fuzzy ring 15 percent}{\pgfuseshading{tikz@lib@fade@fuzzy@15}}%
diff --git a/graphics/pgf/base/tex/pgflibraryfixedpointarithmetic.code.tex b/graphics/pgf/base/tex/pgflibraryfixedpointarithmetic.code.tex
new file mode 100644
index 0000000000..b860192f45
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryfixedpointarithmetic.code.tex
@@ -0,0 +1,656 @@
+% Copyright 2006 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+
+\pgfkeys{/pgf/.cd,
+ fixed point arithmetic/.code={%
+ \pgfmathfp@plots@install%
+ \pgfmathfp@parser@install%
+ \let\pgfmathparse=\pgfmathfpparse%
+ \pgfkeys{/pgf/fixed point/.cd, #1}%
+ },%
+ fixed point/.cd,
+ scale results/.code={%
+ \pgfmathfpparse{#1}%
+ \let\pgfmathfpscale=\pgfmathresult%
+ }%
+}%
+
+\def\pgfmathfpscale{1}%
+
+\def\pgfmathfpparse{%
+ \begingroup%
+ \let\pgfmathpostparse=\relax%
+ \pgfmath@catcodes%
+ \pgfmath@quickparsefalse%
+ \pgfmathfpparse@}%
+
+\def\pgfmathfpparse@#1{%
+ \edef\pgfmathfp@expression{#1}%
+ \expandafter\pgfmathfpparse@@\pgfmathfp@expression\pgfmathfp@}%
+
+\def\pgfmathfp@char@asterisk{*}%
+\def\pgfmathfpparse@@#1#2\pgfmathfp@{%
+ \def\pgfmathfp@test{#1}%
+ \ifx\pgfmathfp@test\pgfmathfp@char@asterisk%
+ \edef\pgfmathfp@expression{\pgfmathfpscale#1#2}%
+ \else%
+ \edef\pgfmathfp@expression{#1#2}%
+ \fi%
+ \expandafter\pgfmathparse@\expandafter{\pgfmathfp@expression}%
+ % \endgroup provided by \pgfpathmarse@end
+}%
+
+% Crude handling of file plots
+%
+\pgfkeys{/pgf/fixed point/.cd,
+ scale file plot x/.code=\pgfmathfpparse{#1}\edef\pgfmathfpplotscalex{\pgfmathresult*},
+ scale file plot y/.code=\pgfmathfpparse{#1}\edef\pgfmathfpplotscaley{\pgfmathresult*},
+ scale file plot z/.code=\pgfmathfpparse{#1}\edef\pgfmathfpplotscalez{\pgfmathresult*},
+}%
+
+\def\pgfmathfp@plots@install{%
+ \let\pgfmathfpplotscalex=\pgfutil@empty
+ \let\pgfmathfpplotscaley=\pgfutil@empty
+ \let\pgfmathfpplotscalez=\pgfutil@empty
+ \let\pgf@parsexyline=\pgfmathfp@parsexyline%
+ \let\pgf@parsexyzline=\pgfmathfp@parsexyzline%
+}%
+
+\def\pgfmathfp@parsexyline#1 #2 #3\pgf@stop{%
+ \edef\pgfmathfp@marshal{%
+ \noexpand\pgfplotstreampoint{\noexpand\pgfpointxy{\pgfmathfpplotscalex#1}{\pgfmathfpplotscaley#2}}%
+ }%
+ \pgfmathfp@marshal%
+}%
+
+\def\pgfmathfp@parsexyzline#1 #2 #3 #4\pgf@stop{%
+ \edef\pgfmathfp@marshal{%
+ \noexpand\pgfplotstreampoint{%
+ \noexpand\pgfpointxyz{\pgfmathfpplotscalex#1}{\pgfmathfpplotscaley#2}{\pgfmathfpplotscalez#3}%
+ }%
+ }%
+ \pgfmathfp@marshal%
+}%
+
+%
+\def\pgfmathfp@parser@install{%
+ %
+ \expandafter\ifx\csname FP@version\endcsname\relax%
+ \pgferror{You need to say `\string\usepackage{fp}' to use %
+ fixed point arithmetic}%
+ \else%
+ %
+ % Don't want messages.
+ %
+ \FPmessagesfalse%
+ \FPdebugfalse%
+ %
+ % Install float commands...
+ %
+ \let\pgfmathadd@=\pgfmathfpadd@%
+ \let\pgfmathsubtract@=\pgfmathfpsubtract@%
+ \let\pgfmathmultiply@=\pgfmathfpmultiply@%
+ \let\pgfmathdivide@=\pgfmathfpdivide@%
+ \let\pgfmathabs@=\pgfmathfpabs@%
+ \let\pgfmathneg@=\pgfmathfpneg@%
+ \let\pgfmathround@=\pgfmathfpround@%
+ \let\pgfmathfloor@=\pgfmathfpfloor@%
+ \let\pgfmathceil@=\pgfmathfpceil@%
+ \let\pgfmathmod@=\pgfmathfpmod@%
+ \let\pgfmathmax@=\pgfmathfpmax@%
+ \let\pgfmathmin@=\pgfmathfpmin@%
+ \let\pgfmathsin@=\pgfmathfpsin@%
+ \let\pgfmathcos@=\pgfmathfpcos@%
+ \let\pgfmathtan@=\pgfmathfptan@%
+ \let\pgfmathdeg@=\pgfmathfpdeg@%
+ \let\pgfmathrad@=\pgfmathfprad@%
+ \let\pgfmathatan@=\pgfmathfpatan@%
+ \let\pgfmathasin@=\pgfmathfpasin@%
+ \let\pgfmathacos@=\pgfmathfpacos@%
+ \let\pgfmathcot@=\pgfmathfpcot@%
+ \let\pgfmathsec@=\pgfmathfpsec@%
+ \let\pgfmathcosec@=\pgfmathfpcosec@%
+ \let\pgfmathpow@=\pgfmathfppow@%
+ \let\pgfmathexp@=\pgfmathfpexp@%
+ \let\pgfmathln@=\pgfmathfpln@%
+ \let\pgfmathsqrt@=\pgfmathfpsqrt@%
+ \let\pgfmath@pi=\pgfmathfppi@%
+ \let\pgfmathveclen@=\pgfmathfpveclen@%
+ \let\pgfmathe@=\pgfmathfpe@%
+ %
+ \let\pgfmathlessthan@=\pgfmathfplessthan@%
+ \let\pgfmathgreaterthan@=\pgfmathfpgreaterthan@%
+ \let\pgfmathequalto@=\pgfmathfpequalto@%
+ %
+ \let\pgfmathrnd=\pgfmathfprnd%
+ \let\pgfmathrand=\pgfmathfprand%
+ \let\pgfmathsetseed=\pgfmathfpsetseed%
+ %
+ \let\pgfmathscientific=\pgfmathfpscientific%
+ \fi%
+}%
+
+\def\pgfmathfpe@{let\pgfmathresult=\FPe}%
+\def\pgfmathfppi@{let\pgfmathresult=\FPpi}%
+
+
+% Scientific notation.
+
+\def\pgfmathfpscientific#1#2{%
+ \begingroup%
+ \FPpow\pgfmathresult{10}{#2}\unskip% Needed.
+ \FPmul\pgfmathresult{#1}{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% Comparison stuff...
+
+% lessthan
+%
+\def\pgfmathfplessthan#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfplessthan@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfplessthan@#1#2{%
+ \begingroup%
+ \FPiflt{#1}{#2}%
+ \def\pgfmathresult{1.0}%
+ \else%
+ \def\pgfmathresult{0.0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% greaterthan
+%
+\def\pgfmathfpgreaterthan#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpgreaterthan@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpgreaterthan@#1#2{%
+ \begingroup%
+ \FPifgt{#1}{#2}%
+ \def\pgfmathresult{1.0}%
+ \else%
+ \def\pgfmathresult{0.0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% equalto
+%
+\def\pgfmathfpequalto#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpequalto@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpequalto@#1#2{%
+ \begingroup%
+ \FPifeq{#1}{#2}%
+ \def\pgfmathresult{1.0}%
+ \else%
+ \def\pgfmathresult{0.0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+
+% Basic arithmetic stuff...
+
+% add
+%
+\def\pgfmathfpadd#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpadd@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpadd@#1#2{%
+ \begingroup%
+ \FPadd\pgfmathresult{#1}{#2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% subtract
+%
+\def\pgfmathfpsubtract#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpsubtract@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpsubtract@#1#2{%
+ \begingroup%
+ \FPsub\pgfmathresult{#1}{#2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% multiply
+%
+\def\pgfmathfpmultiply#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpmultiply@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpmultiply@#1#2{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{#2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% divide
+%
+\def\pgfmathfpdivide#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpdivide@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpdivide@#1#2{%
+ \begingroup%
+ \FPdiv\pgfmathresult{#1}{#2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% abs
+%
+\def\pgfmathfpabs#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpabs@{\pgfmathresult}%
+}%
+\def\pgfmathfpabs@#1{%
+ \begingroup%
+ \FPabs\pgfmathresult{#1}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% neg
+%
+\def\pgfmathfpneg#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpneg@{\pgfmathresult}%
+}%
+\def\pgfmathfpneg@#1{%
+ \begingroup%
+ \FPneg\pgfmathresult{#1}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup%
+}%
+
+% round
+%
+\def\pgfmathfpround#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpround@{\pgfmathresult}%
+}%
+\def\pgfmathfpround@#1{%
+ \begingroup%
+ \FPround\pgfmathresult{#1}{0}%
+ \edef\pgfmathresult{\pgfmathresult.0}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% floor
+%
+\def\pgfmathfpfloor#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpfloor@{\pgfmathresult}%
+}%
+\def\pgfmathfpfloor@#1{%
+ \begingroup%
+ \FPtrunc\pgfmathresult{#1}{0}%
+ \FPifneg{#1}%
+ \FPsub\pgfmathresult{\pgfmathresult}{1}%
+ \fi%
+ \edef\pgfmathresult{\pgfmathresult.0}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% ceil
+%
+\def\pgfmathfpceil#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpceil@{\pgfmathresult}%
+}%
+\def\pgfmathfpceil@#1{%
+ \begingroup%
+ \FPtrunc\pgfmathresult{#1}{0}%
+ \FPifpos{#1}%
+ \FPadd\pgfmathresult{\pgfmathresult}{1}%
+ \fi%
+ \edef\pgfmathresult{\pgfmathresult.0}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% mod
+%
+\def\pgfmathfpmod#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpmod@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpmod@#1#2{%
+ \begingroup%
+ \FPdiv\pgfmathresult{#1}{#2}%
+ \FPtrunc\pgfmathresult{\pgfmathresult}{0}%
+ \FPmul\pgfmathresult{\pgfmathresult}{#2}%
+ \FPsub\pgfmathresult{#1}{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% max
+%
+\def\pgfmathfpmax#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpmax@@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpmax@#1{%
+ \pgfmathfpmax@@#1%
+}%
+\def\pgfmathfpmax@@#1#2{%
+ \begingroup%
+ \FPifgt{#1}{#2}%
+ \def\pgfmathresult{#1}%
+ \else%
+ \def\pgfmathresult{#2}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% min
+%
+\def\pgfmathfpmin#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpmin@@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpmin@#1{%
+ \pgfmathfpmin@@#1%
+}%
+\def\pgfmathfpmin@@#1#2{%
+ \begingroup%
+ \FPiflt{#1}{#2}%
+ \def\pgfmathresult{#1}%
+ \else%
+ \def\pgfmathresult{#2}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% Functions...
+
+% pow
+%
+\def\pgfmathfppow#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfppow@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfppow@#1#2{%
+ \begingroup%
+ \FPpow\pgfmathresult{#1}{#2}\unskip%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% exp
+%
+\def\pgfmathfpexp#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpexp@{\pgfmathresult}%
+}%
+\def\pgfmathfpexp@#1{%
+ \begingroup%
+ \FPexp\pgfmathresult{#1}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% ln
+%
+\def\pgfmathfpln#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpln@{\pgfmathresult}%
+}%
+\def\pgfmathfpln@#1{%
+ \begingroup%
+ \FPln\pgfmathresult{#1}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% sqrt
+%
+\def\pgfmathfpsqrt#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpsqrt@{\pgfmathresult}%
+}%
+\def\pgfmathfpsqrt@#1{%
+ \begingroup%
+ \FProot\pgfmathresult{#1}{2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% veclen
+%
+\def\pgfmathfpveclen#1#2{%
+ \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpveclen@{\pgfmathresult}{\pgfmath@result}%
+}%
+\def\pgfmathfpveclen@#1#2{%
+ \begingroup%
+ \FPmul\pgfmath@result{#1}{#1}%
+ \FPmul\pgfmath@@result{#2}{#2}%
+ \FPadd\pgfmathresult{\pgfmath@result}{\pgfmath@@result}%
+ \FProot\pgfmathresult{\pgfmathresult}{2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% Trigonometric stuff...
+
+% sin
+%
+\def\pgfmathfpsin#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpsin@{\pgfmathresult}%
+}%
+\def\pgfmathfpsin@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.017453292519943295}%
+ \FPsin\pgfmathresult{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% cos
+%
+\def\pgfmathfpcos#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpcos@{\pgfmathresult}%
+}%
+\def\pgfmathfpcos@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.017453292519943295}%
+ \FPcos\pgfmathresult{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% tan
+%
+\def\pgfmathfptan#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfptan@{\pgfmathresult}%
+}%
+\def\pgfmathfptan@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.017453292519943295}%
+ \FPtan\pgfmathresult{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% acos
+%
+\def\pgfmathfpacos#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpacos@{\pgfmathresult}%
+}%
+\def\pgfmathfpacos@#1{%
+ \begingroup%
+ \FParccos\pgfmathresult{#1}%
+ \FPmul\pgfmathresult{\pgfmathresult}{57.295779513082320885}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% asin
+%
+\def\pgfmathfpasin#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpasin@{\pgfmathresult}%
+}%
+\def\pgfmathfpasin@#1{%
+ \begingroup%
+ \FParcsin\pgfmathresult{#1}%
+ \FPmul\pgfmathresult{\pgfmathresult}{57.295779513082320885}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% atan
+%
+\def\pgfmathfpatan#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpatan@{\pgfmathresult}%
+}%
+\def\pgfmathfpatan@#1{%
+ \begingroup%
+ \FParctan\pgfmathresult{#1}%
+ \FPmul\pgfmathresult{\pgfmathresult}{57.295779513082320885}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% cot
+%
+\def\pgfmathfpcot#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpcot@{\pgfmathresult}%
+}%
+\def\pgfmathfpcot@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.017453292519943295}%
+ \FPcot\pgfmathresult{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% sec
+%
+\def\pgfmathfpsec#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpsec@{\pgfmathresult}%
+}%
+\def\pgfmathfpsec@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.017453292519943295}%
+ \FPcos\pgfmathresult{\pgfmathresult}%
+ \FPdiv\pgfmathresult{1}{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% cosec
+%
+\def\pgfmathfpcosec#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpcosec@{\pgfmathresult}%
+}%
+\def\pgfmathfpcosec@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.017453292519943295}%
+ \FPsin\pgfmathresult{\pgfmathresult}%
+ \FPdiv\pgfmathresult{1}{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% deg
+%
+\def\pgfmathfpdeg#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfpdeg@{\pgfmathresult}%
+}%
+\def\pgfmathfpdeg@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{57.295779513082320885}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% rad
+%
+\def\pgfmathfprad#1{%
+ \pgfmathfpparse{#1}%
+ \pgfmathfprad@{\pgfmathresult}%
+}%
+\def\pgfmathfprad@#1{%
+ \begingroup%
+ \FPmul\pgfmathresult{#1}{0.01745329251994325}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% Random stuff...
+
+\def\pgfmathfpsetseed#1{%
+ \pgfmathfpparse{#1}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \FPseed\pgfmathresult\relax\pgfmath@%
+}%
+
+% rnd
+%
+\def\pgfmathfprnd{%
+ \begingroup%
+ \FPrandom\pgfmathresult%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+
+% rand
+%
+\def\pgfmathfprand{%
+ \begingroup%
+ \FPrandom\pgfmathresult%
+ \FPmul\pgfmathresult{2}{\pgfmathresult}%
+ \FPsub\pgfmathresult{\pgfmathresult}{1}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
diff --git a/graphics/pgf/base/tex/pgflibraryfpu.code.tex b/graphics/pgf/base/tex/pgflibraryfpu.code.tex
new file mode 100644
index 0000000000..cb20507fa0
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryfpu.code.tex
@@ -0,0 +1,2347 @@
+% Copyright 2008/2009 by Christian Feuersaenger
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU General Public License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\newif\ifpgfmathfloatparseactive
+\newif\ifpgfmathfloat@scaleactive
+
+% public macro which invokes '#1' if the fpu is installed and ready and '#2'
+% otherwise.
+\def\pgflibraryfpuifactive#1#2{%
+ \ifpgfmathfloatparseactive
+ #1%
+ \else
+ #2%
+ \fi
+}%
+
+\pgfqkeys{/pgf}{
+ % enable the FPU parser if it is not yet active
+ %
+ % It will be deactivated after the current TeX group
+ fpu/.is choice,
+ fpu/true/.code={%
+ \ifpgfmathfloatparseactive
+ \else
+ \pgfutil@ifundefined{pgfmathdeclarefunction}{%
+ % Ohoh - we are running on a TeX distribution with
+ % PGF 2.00 which doesn't have the new math engine.
+ % I can provide special treatment here, provided that
+ % all float commands are still able to run (that means
+ % more information needs to be copied from the pgf cvs
+ % to pgf 2.00 - for example pgfmathfloat.code.tex).
+ %
+ % I employ this to work with pgfplots and pgf 2.00
+ % using all new features.
+ \pgfmathfloat@parser@install@pgf@two@null@null%
+ }{%
+ \pgfmathfloat@parser@install%
+ }%
+ \pgfmathfloatparseactivetrue
+ % improve compatibility with Marks FP library:
+ \pgfkeysalso{/pgf/fixed point arithmetic/.prefix style={/pgf/fpu=false}}%
+ \fi
+ },%
+ fpu/false/.code={%
+ \ifpgfmathfloatparseactive
+ \pgfmathfloat@uninstall%
+ \pgfmathfloatparseactivefalse
+ \fi
+ },%
+ fpu/.default=true,
+ % Use this to introduce a result scaling.
+ % Every expression in which the prefix '*' occurs
+ % will be multiplied with the result and converted to fixed point
+ % representation.
+ fpu/scale results/.code={%
+ \ifpgfmathfloatparseactive
+ \pgfmathparse{#1}%
+ \else
+ \pgfmathfloatparsenumber{#1}%
+ \fi
+ \let\pgfmathfloatscale=\pgfmathresult%
+ },%
+ % determines the output format of each complete expression parsing
+ % process. If 'scale results' is active, 'fixed' is assumed
+ % automatically.
+ fpu/output format/.is choice,
+ fpu/output format/float/.code= {%
+ \def\pgfmathfloatparse@output@choice{Y}%
+ \let\pgfmathfloatparse@output=\relax
+ },
+ fpu/output format/sci/.code= {%
+ \def\pgfmathfloatparse@output@choice{S}%
+ \def\pgfmathfloatparse@output{\pgfmathfloattosci@{\pgfmathresult}}%
+ },
+ fpu/output format/fixed/.code= {%
+ \def\pgfmathfloatparse@output@choice{F}%
+ \def\pgfmathfloatparse@output{\pgfmathfloattofixed@{\pgfmathresult}}%
+ },
+ fpu/output format/float,
+ fpu/rel thresh/.code={%
+ \pgfmathfloatparsenumber{#1}%
+ \let\pgfmathfloat@relthresh=\pgfmathresult
+ },
+ fpu/rel thresh=1e-4,
+}%
+
+\pgfmathfloatcreate{1}{1.0}{0}\let\pgfmathfloatscale=\pgfmathresult
+
+\let\pgfmathfloatone=\pgfmathresult
+
+% This is the replacement parser invocation.
+% It does two things which are different to \pgfmathparse:
+% 1. it disables any dimension dependent scalings,
+% 2. it implements the 'scale results' feature.
+\def\pgfmathfloatparse{%
+ \begingroup%
+ % disable any dimension-dependant scalings:
+ \let\pgfmathpostparse=\relax%
+ \pgfmath@catcodes%
+ \pgfmath@quickparsefalse%
+ \pgfmathfloatparse@}%
+
+% for pgf 2.00 :
+\def\pgfmathfloatparse@pgf@two@null@null{%
+ \pgfmath@quickparsefalse%
+ \pgfmathfloatparse@}%
+
+\def\pgfmathfloatparse@#1{%
+ \edef\pgfmathfloat@expression{#1}%
+ \expandafter\pgfmathfloatparse@@\pgfmathfloat@expression\pgfmathfloat@
+ \ifpgfmathfloat@scaleactive
+ \expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfmathfloatscale}
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \else
+ \pgfmathfloatparse@output
+ \fi
+}%
+
+\def\pgfmathfloat@char@asterisk{*}%
+\def\pgfmathfloatparse@@#1#2\pgfmathfloat@{%
+ \def\pgfmathfloat@test{#1}%
+ \ifx\pgfmathfloat@test\pgfmathfloat@char@asterisk%
+ \def\pgfmathfloat@expression{#2}%
+ \pgfmathfloat@scaleactivetrue
+ \fi%
+ \expandafter\pgfmathparse@\expandafter{\pgfmathfloat@expression}%
+ % \endgroup provided by \pgfpathmarse@end
+}%
+
+% Crude handling of file plots
+%
+\pgfkeys{/pgf/fpu/.cd,
+ scale file plot x/.code=\pgfmathfloatparse{#1}\edef\pgfmathfloatplotscalex{\pgfmathresult*},
+ scale file plot y/.code=\pgfmathfloatparse{#1}\edef\pgfmathfloatplotscaley{\pgfmathresult*},
+ scale file plot z/.code=\pgfmathfloatparse{#1}\edef\pgfmathfloatplotscalez{\pgfmathresult*}
+}%
+
+\def\pgfmathfloat@uninstall@appendcmd#1{%
+ \expandafter\gdef\expandafter\pgfmathfloat@uninstall\expandafter{\pgfmathfloat@uninstall #1}%
+}%
+
+% If the uninstall command is already assembled, it will skip the
+% uninstall assemblation.
+\def\pgfmathfloat@plots@checkuninstallcmd{%
+ \pgfutil@ifundefined{pgfmathfloat@uninstall}{%
+ \global\let\pgfmathfloat@uninstall=\pgfutil@empty
+ }{%
+ % We already HAVE an uninstall command (prepared globally).
+ % So: don't waste time assembling one!
+ \def\pgfmathfloat@uninstall@appendcmd##1{}%
+ \def\pgfmathfloat@prepareuninstallcmd##1{}%
+ }%
+}%
+
+% This assembles an uninstall command globally ON FIRST USAGE.
+% See \pgfmathfloat@plots@checkuninstallcmd
+\def\pgfmathfloat@prepareuninstallcmd#1{%
+ % and store backup information (globally - I don't want to do that
+ % all the time when the FPU is used!):
+ \expandafter\global\expandafter\let\csname pgfmathfloat@backup@\string#1\endcsname=#1%
+ \expandafter\gdef\expandafter\pgfmathfloat@uninstall\expandafter{\pgfmathfloat@uninstall
+ \expandafter\let\expandafter#1\csname pgfmathfloat@backup@\string#1\endcsname%
+ }%
+}%
+
+\def\pgfmathfloat@install#1=#2{%
+ \pgfmathfloat@prepareuninstallcmd{#1}%
+ \let#1=#2%
+}%
+\def\pgfmathfloat@install@csname#1#2{%
+ \expandafter\pgfmathfloat@prepareuninstallcmd\csname #1\endcsname%
+ \pgfutil@namelet{#1}{#2}%
+}%
+\def\pgfmathfloat@install@unimplemented#1{%
+ \expandafter\pgfmathfloat@prepareuninstallcmd\csname pgfmath#1@\endcsname%
+ \expandafter\def\csname pgfmath#1@\endcsname##1{\pgfmathfloat@notimplemented{#1}}%
+}%
+\def\pgfmathfloat@plots@install{%
+ \let\pgfmathfloatplotscalex=\pgfutil@empty
+ \let\pgfmathfloatplotscaley=\pgfutil@empty
+ \let\pgfmathfloatplotscalez=\pgfutil@empty
+ \pgfmathfloat@install\pgf@parsexyline=\pgfmathfloat@parsexyline%
+ \pgfmathfloat@install\pgf@parsexyzline=\pgfmathfloat@parsexyzline%
+}%
+\def\pgfmathfloat@parsexyline#1 #2 #3\pgf@stop{%
+ \edef\pgfmathfloat@marshal{%
+ \noexpand\pgfplotstreampoint{\noexpand\pgfpointxy{\pgfmathfloatplotscalex#1}{\pgfmathfloatplotscaley#2}}%
+ }%
+ \pgfmathfloat@marshal%
+}%
+\def\pgfmathfloat@parsexyzline#1 #2 #3 #4\pgf@stop{%
+ \edef\pgfmathfloat@marshal{%
+ \noexpand\pgfplotstreampoint{%
+ \noexpand\pgfpointxyz{\pgfmathfloatplotscalex#1}{\pgfmathfloatplotscaley#2}{\pgfmathfloatplotscalez#3}%
+ }%
+ }%
+ \pgfmathfloat@marshal%
+}%
+
+%
+\def\pgfmathfloat@parser@install@functions{%
+ % Install float commands...
+ %
+ \pgfmathfloat@install\pgfmathadd@=\pgfmathfloatadd@%
+ \pgfmathfloat@install\pgfmathsubtract@=\pgfmathfloatsubtract@%
+ \pgfmathfloat@install\pgfmathneg@=\pgfmathfloatneg@%
+ \pgfmathfloat@install\pgfmathmultiply@=\pgfmathfloatmultiply@%
+ \pgfmathfloat@install\pgfmathdivide@=\pgfmathfloatdivide@%
+ \pgfmathfloat@install\pgfmathabs@=\pgfmathfloatabs@%
+ \pgfmathfloat@install\pgfmathsign@=\pgfmathfloatsign@%
+ \pgfmathfloat@install\pgfmathround@=\pgfmathfloatround@%
+ \pgfmathfloat@install\pgfmathfloor@=\pgfmathfloatfloor@%
+ \pgfmathfloat@install\pgfmathceil@=\pgfmathfloatceil@
+ \pgfmathfloat@install\pgfmathint@=\pgfmathfloatint@
+ \pgfmathfloat@install\pgfmathmod@=\pgfmathfloatmod@%
+ \pgfmathfloat@install\pgfmathmax@=\pgfmathfloatmax@%
+ \pgfmathfloat@install\pgfmathmin@=\pgfmathfloatmin@%
+ \pgfmathfloat@install\pgfmathsin@=\pgfmathfloatsin@%
+ \pgfmathfloat@install\pgfmathcos@=\pgfmathfloatcos@%
+ \pgfmathfloat@install\pgfmathtan@=\pgfmathfloattan@%
+ \pgfmathfloat@install\pgfmathdeg@=\pgfmathfloatdeg@%
+ \pgfmathfloat@install\pgfmathrad@=\pgfmathfloatrad@%
+ \pgfmathfloat@install\pgfmathatan@=\pgfmathfloatatan@%
+ \pgfmathfloat@install\pgfmathasin@=\pgfmathfloatasin@%
+ \pgfmathfloat@install\pgfmathacos@=\pgfmathfloatacos@%
+ \pgfmathfloat@install\pgfmathcot@=\pgfmathfloatcot@%
+ \pgfmathfloat@install\pgfmathsec@=\pgfmathfloatsec@%
+ \pgfmathfloat@install\pgfmathcosec@=\pgfmathfloatcosec@%
+ \pgfmathfloat@install\pgfmathexp@=\pgfmathfloatexp@%
+ \pgfmathfloat@install\pgfmathln@=\pgfmathfloatln@%
+ \pgfmathfloat@install@csname{pgfmathlog10@}{pgfmathfloatlog10@}%
+ \pgfmathfloat@install@csname{pgfmathlog2@}{pgfmathfloatlog2@}%
+ \pgfmathfloat@install\pgfmathsqrt@=\pgfmathfloatsqrt@%
+ \pgfmathfloat@install\pgfmath@pi=\pgfmathfloatpi@%
+ \pgfmathfloat@install\pgfmathpi=\pgfmathfloatpi@%
+ \pgfmathfloat@install\pgfmathe@=\pgfmathfloate@%
+ \pgfmathfloat@install\pgfmathe=\pgfmathfloate@%
+ \pgfmathfloat@install\pgfmathlessthan@=\pgfmathfloatlessthan@%
+ \pgfmathfloat@install\pgfmathnotless@=\pgfmathfloatnotless@%
+ \pgfmathfloat@install\pgfmathnotgreater@=\pgfmathfloatnotgreater@%
+ \pgfmathfloat@install\pgfmathless@=\pgfmathfloatlessthan@%
+ \pgfmathfloat@install\pgfmathgreaterthan@=\pgfmathfloatgreaterthan@%
+ \pgfmathfloat@install\pgfmathgreater@=\pgfmathfloatgreaterthan@%
+ \pgfmathfloat@install\pgfmathifthenelse@=\pgfmathfloatifthenelse@%
+ \pgfmathfloat@install\pgfmathequal@=\pgfmathfloatequal@%
+ \pgfmathfloat@install\pgfmathequalto@=\pgfmathfloatequal@%
+ \pgfmathfloat@install\pgfmathnotequal@=\pgfmathfloatnotequal@%
+ \pgfmathfloat@install\pgfmathnotequalto@=\pgfmathfloatnotequal@%
+ \pgfmathfloat@install\pgfmathpow@=\pgfmathfloatpow@
+ \pgfmathfloat@install\pgfmathrand@=\pgfmathfloatrand@
+ \pgfmathfloat@install\pgfmathrand=\pgfmathfloatrand@
+ \pgfmathfloat@install\pgfmathrnd@=\pgfmathfloatrnd@
+ \pgfmathfloat@install\pgfmathrnd=\pgfmathfloatrnd@
+ \pgfmathfloat@install\pgfmathtrue@=\pgfmathfloattrue@
+ \pgfmathfloat@install\pgfmathfalse@=\pgfmathfloatfalse@
+ \pgfmathfloat@install\pgfmathnot@=\pgfmathfloatnot@
+ \pgfmathfloat@install\pgfmathhex@=\pgfmathfloathex@
+ \pgfmathfloat@install\pgfmathHex@=\pgfmathfloatHex@
+ \pgfmathfloat@install\pgfmathoct@=\pgfmathfloatoct@
+ \pgfmathfloat@install\pgfmathbin@=\pgfmathfloatbin@
+ \pgfmathfloat@install\pgfmathand@=\pgfmathfloatand@
+ \pgfmathfloat@install\pgfmathor@=\pgfmathfloator@
+ \pgfmathfloat@install\pgfmathfactorial@=\pgfmathfloatfactorial@
+ \pgfmathfloat@install\pgfmathveclen@=\pgfmathfloatveclen@
+ \pgfmathfloat@install\pgfmathcosh@=\pgfmathfloatcosh@
+ \pgfmathfloat@install\pgfmathsinh@=\pgfmathfloatsinh@
+ \pgfmathfloat@install\pgfmathtanh@=\pgfmathfloattanh@
+ \pgfmathfloat@install\pgfmath@iftrue=\pgfmathfloat@iftrue%
+ \expandafter\pgfmathfloat@install\csname pgfmathatan2@\endcsname=\pgfmathfloatatantwo@
+ \pgfmathfloat@install@unimplemented{isprime}%
+ \pgfmathfloat@install@unimplemented{iseven}%
+ \pgfmathfloat@install@unimplemented{isodd}%
+ \pgfmathfloat@install@unimplemented{gcd}%
+ \pgfmathfloat@install@unimplemented{frac}%
+ \pgfmathfloat@install@unimplemented{random}%
+ \pgfmathfloat@install@unimplemented{setseed}%
+ \pgfmathfloat@install@unimplemented{Mod}%
+ \pgfmathfloat@install@unimplemented{div}%
+ \pgfmathfloat@install@unimplemented{real}%
+% \pgfmathfloat@install@unimplemented{height}%
+ %
+ %
+ \pgfmathfloat@install\pgfmathscientific=\pgfmathfloatscientific%
+}%
+
+\def\pgfmathfloat@iftrue{%
+ \if Y\pgfmathfloatparse@output@choice
+ \let\pgfmathfloat@@iftrue@v=\pgfmathfloatone
+ \let\pgfmathfloat@@iftrue@next=\pgfmathfloat@iftrue@
+ \else
+ \if S\pgfmathfloatparse@output@choice
+ \def\pgfmathfloat@@iftrue@v{1.0e0}%
+ \let\pgfmathfloat@@iftrue@next=\pgfmathfloat@iftrue@
+ \else
+ \def\pgfmath@next{\pgfutilifstartswith{1.0}}%
+ \expandafter\pgfmath@next\expandafter{\pgfmathresult}{%
+ \ifdim\pgfmathresult pt=1.0pt %
+ \let\pgfmathfloat@@iftrue@next=\pgfutil@firstoftwo
+ \else
+ \let\pgfmathfloat@@iftrue@next=\pgfutil@secondoftwo
+ \fi
+ }{%
+ \let\pgfmathfloat@@iftrue@next=\pgfutil@secondoftwo
+ }%
+ \fi
+ \fi
+ \pgfmathfloat@@iftrue@next%
+}%
+\def\pgfmathfloat@iftrue@{%
+ \ifx\pgfmathresult\pgfmathfloat@@iftrue@v
+ \let\pgfmath@next=\pgfutil@firstoftwo
+ \else
+ \let\pgfmath@next=\pgfutil@secondoftwo
+ \fi
+ \pgfmath@next%
+}%
+
+\def\pgfmathfloat@parser@install{%
+ \pgfmathfloat@plots@checkuninstallcmd
+ \pgfmathfloat@plots@install%
+ \pgfmathfloat@parser@install@functions
+ %
+ %
+ %
+ % The following methods actually enable the parser to work with
+ % the internal floating point number representation.
+ %
+ % The idea is as follows:
+ % 1. Every operand must be given in internal float representation.
+ % 2. The internal float repr can be distinguished by a normal
+ % number. This is accomplished by introducing a new "exponent"
+ % token.
+ % 3. The stack-push-operation checks whether the argument is a
+ % float. If not, it is parsed properly before pushing it.
+ \pgfmath@tokens@make{exponent}{\pgfmathfloat@POSTFLAGSCHAR}%
+ \pgfmathfloat@uninstall@appendcmd{%
+ \expandafter\let\csname pgfmath@token@exponent@\pgfmathfloat@POSTFLAGSCHAR\endcsname=\relax
+ }%
+ \let\pgfmath@basic@parse@exponent=\pgfmath@parse@exponent%
+ \let\pgfmath@basic@stack@push@operand=\pgfmath@stack@push@operand
+ \pgfmathfloat@install\pgfmath@stack@push@operand=\pgfmathfloat@stack@push@operand
+ \pgfmathfloat@install\pgfmath@parse@operand@quote=\pgfmathfloat@parse@operand@quote
+ \pgfmathfloat@install\pgfmath@parse@exponent=\pgfmathfloat@parse@float@or@exponent
+ %
+ \pgfmathfloat@install\pgfmathparse=\pgfmathfloatparse%
+ %\pgfmathfloat@install\pgfmathparse@trynumber@token=\pgfmathfloat@parse@trynumber@token
+ \pgfmathfloat@install\pgfmathparse@expression@is@number=\pgfmathfloat@parse@expression@is@number
+}%
+
+% This here might bring speed improvements... if implemented
+% correctly.
+% However, this heuristics might fail in cases like "1+1" vs "1e+1" ...
+%\def\pgfmathfloat@parse@trynumber@token{numericfpu}
+%\pgfmath@tokens@make{numericfpu}{eE+-Y.0123456789}
+
+\def\pgfmathfloat@parse@expression@is@number{%
+ \pgfmathfloatparsenumber{\pgfmath@expression}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup
+ \ignorespaces
+}%
+
+\def\pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG#1{%
+ \edef\pgfmathfloat@loc@TMPa{%
+ \noexpand\def\expandafter\noexpand\csname pgfmath@parsefunction@#1\endcsname{%
+ \noexpand\let\noexpand\pgfmath@parsepostgroup\expandafter\noexpand\csname pgfmath@parsefunction@#1@\endcsname%
+ \noexpand\expandafter\noexpand\pgfmath@parse@}%
+ \noexpand\def\expandafter\noexpand\csname pgfmath@parsefunction@#1@\endcsname{%
+ \noexpand\expandafter\expandafter\noexpand\csname pgfmath#1@\endcsname\noexpand\expandafter{\noexpand\pgfmathresult}%
+ \noexpand\pgfmath@postfunction%
+ }%
+ }%
+ \pgfmathfloat@loc@TMPa
+}%
+\def\pgfmathfloat@parser@install@pgf@two@null@null{%
+ \pgfmathfloat@plots@checkuninstallcmd
+ \pgfmathfloat@plots@install%
+ \pgfmathfloat@parser@install@functions
+ \let\pgfmathrand@=\pgfmath@basic@rand@
+ \let\pgfmathrnd@=\pgfmath@basic@rnd@
+ \pgfmathfloat@install\pgfmathmax@=\pgfmathfloatmaxtwo%
+ \pgfmathfloat@install\pgfmathmin@=\pgfmathfloatmintwo%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{factorial}%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{hex}%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{bin}%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{oct}%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{tanh}%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{sinh}%
+ \pgfmathfloat@defineadapter@for@pgf@two@null@null@ONEARG{cosh}%
+ %
+ % The following methods actually enable the parser to work with
+ % the internal floating point number representation.
+ %
+ % The idea is as follows:
+ % 1. Every operand must be given in internal float representation.
+ % 2. The internal float repr can be distinguished by a normal
+ % number. This is accomplished by introducing a new "exponent"
+ % token.
+ % 3. The stack-push-operation checks whether the argument is a
+ % float. If not, it is parsed properly before pushing it.
+ \let\pgfmath@basic@parsedecimalpoint=\pgfmath@parsedecimalpoint%
+ \let\pgfmath@basic@stack@push@operand=\pgfmath@stackpushoperand
+ \pgfmathfloat@install\pgfmath@stackpushoperand=\pgfmathfloat@stack@push@operand
+ \pgfmathfloat@install\pgfmath@parsedecimalpoint=\pgfmathfloat@parsedecimalpoint@pgf@two@null@null
+ \pgfmathfloat@install\pgfmath@endparse=\pgfmathfloat@endparse@pgf@two@null@null
+ \pgfmathfloat@install\pgfmath@endparsegroup=\pgfmathfloat@endparsegroup@pgf@two@null@null
+ \pgfmathfloat@install\pgfmath@postfunction=\pgfmathfloat@postfunction@pgf@two@null@null
+ \pgfmathfloat@install\pgfmath@@parseoperandgroup=\pgfmathfloat@@parseoperandgroup
+ %
+ \pgfmathfloat@install\pgfmathparse=\pgfmathfloatparse@pgf@two@null@null%
+}%
+
+\pgfutil@ifundefined{pgfmathdeclarefunction}{%
+ % BACKWARDS COMPATIBILITY: We have PGF 2.00 :
+ \def\pgfmathdeclarepseudoconstant#1#2{%
+ \begingroup
+ \toks0=\expandafter{\csname pgfmath#1@\endcsname}%
+ \toks1={\pgfmath@postfunction}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 }%
+ \xdef\pgfmathfloat@glob@TMPb{\the\toks0 }%
+ \endgroup
+ \expandafter\let\csname pgfmath@parsefunction@#1\endcsname=\pgfmathfloat@glob@TMP
+ \expandafter\let\csname pgfmath#1\endcsname=\pgfmathfloat@glob@TMPb
+ \expandafter\def\csname pgfmath#1@\endcsname{#2}%
+ }%
+ \let\pgfmathredeclarepseudoconstant=\pgfmathdeclarepseudoconstant
+}{%
+ \pgfutil@ifundefined{pgfmathdeclarepseudoconstant}{%
+ \def\pgfmathdeclarepseudoconstant#1#2{\pgfmathdeclarefunction*{#1}{0}{#2}}
+ }{}%
+}%
+
+\pgfmathdeclarepseudoconstant{inf}{\def\pgfmathresult{inf}}%
+\pgfmathdeclarepseudoconstant{INF}{\def\pgfmathresult{inf}}%
+\pgfmathdeclarepseudoconstant{Inf}{\def\pgfmathresult{inf}}%
+\pgfmathdeclarepseudoconstant{infty}{\def\pgfmathresult{inf}}%
+\pgfmathdeclarepseudoconstant{nan}{\def\pgfmathresult{nan}}%
+\pgfmathdeclarepseudoconstant{NaN}{\def\pgfmathresult{nan}}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Hacks to the basic level pgf math engine:
+%
+% WARNING: These methods rely heavily on the internal float representation!
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% for pgf2.00 :
+\def\pgfmathfloat@parsedecimalpoint@pgf@two@null@null#1{%
+ \expandafter\ifx\pgfmathfloat@POSTFLAGSCHAR#1% check whether it is a float
+ \let\pgfmath@next=\pgfmathfloat@return@float@pgf@two@null@null%
+ \else
+ \def\pgfmath@next{\pgfmath@basic@parsedecimalpoint#1}%
+ \fi
+ \pgfmath@next
+}%
+% for pgf2.00:
+\def\pgfmathfloat@return@float@pgf@two@null@null#1]{%
+ \edef\pgfmathresult{\the\c@pgfmath@parsecounta\pgfmathfloat@POSTFLAGSCHAR#1]}%
+ \let\pgfmath@resulttemp=\pgfmathresult
+ \pgfmath@parseoperator%
+}%
+% for pgf2.00:
+\def\pgfmathfloat@endparse@pgf@two@null@null#1\pgfmath@empty{%
+ \pgfmath@processalloperations%
+ \pgfmath@stackpop{\pgfmathresult}%
+ % delete the final unit scalings
+ \pgfmath@smuggleone{\pgfmathresult}%
+ \endgroup%
+ \ignorespaces%
+}%
+% for pgf2.00:
+\def\pgfmathfloat@endparsegroup@pgf@two@null@null{%
+ \pgfmath@processalloperations%
+ \pgfmath@stackpop{\pgfmathresult}%
+ % eliminated register usage here...
+ \pgfmath@smuggleone{\pgfmathresult}%
+ \endgroup%
+ \pgfmath@parsepostgroup%
+}%
+% for pgf2.00:
+\def\pgfmathfloat@postfunction@pgf@two@null@null{%
+ \let\pgfmath@parsepostgroup\pgfmath@parseoperator%
+ \ifnum\pgfmath@sign1<0
+ \pgfmathfloatneg@{\pgfmathresult}%
+ \let\pgfmath@sign\pgfutil@empty
+ \fi
+ \pgfmath@parseoperator}%
+% for pgf2.00:
+\def\pgfmathfloat@@parseoperandgroup{%
+ \let\pgfmath@postparsegroup\pgfmath@parseoperator%
+ \ifnum\pgfmath@sign1<0
+ \pgfmathfloatneg@{\pgfmathresult}%
+ \let\pgfmath@sign\pgfutil@empty
+ \fi
+ \pgfmath@parseoperator%
+}%
+
+
+
+
+
+
+% PRECONDITION:
+% either
+% <number>e
+% ^
+% -> read the exponent.
+% or
+% <sign>\pgfmathfloat@POSTFLAGSCHAR
+% ^
+% -> we have a parsed floating point number -> read it.
+\def\pgfmathfloat@parse@float@or@exponent{%
+ \if\pgfmath@token \pgfmathfloat@POSTFLAGSCHAR%
+ % Ok, we actually HAVE a pre-parsed floating point number!
+ % Return it.
+ \expandafter\pgfmathfloat@return@float\expandafter\pgfmath@token@next
+ \else
+ % We have a standard number in scientific format. Parse it.
+ \expandafter\pgfmath@basic@parse@exponent
+ \fi
+}%
+\def\pgfmathfloat@return@float#1]{%
+ \edef\pgfmathresult{\pgfmath@number \pgfmathfloat@POSTFLAGSCHAR#1]}%
+ \expandafter\pgfmath@basic@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}%
+
+\def\pgfmathfloat@parse@operand@quote#1"{%
+ \edef\pgfmathresult{\pgfmath@fpu@stringmarker #1}%
+ \expandafter\pgfmath@basic@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+\def\pgfmath@fpu@stringmarker{@@str@@:}%
+
+% This extends the functionality of the basic level operand stack: it
+% assures every element on the stack is a float.
+\def\pgfmathfloat@stack@push@operand#1{%
+ \pgfutil@ifnextchar\bgroup{%
+ \let\pgfmathfloat@stack@push@operand@list@=\pgfutil@empty
+ \pgfmathfloat@stack@push@operand@list
+ }{%
+ \pgfmathfloat@stack@push@operand@single
+ }%
+ #1\relax
+}%
+
+\def\pgfmathfloat@stack@push@operand@single#1\relax{%
+ \expandafter\pgfutil@in@\pgfmathfloat@POSTFLAGSCHAR{#1}%
+ \ifpgfutil@in@
+ \pgfmath@basic@stack@push@operand{#1}%
+ \else
+ \expandafter\pgfutil@in@\expandafter{\pgfmath@fpu@stringmarker}{#1}%
+ \ifpgfutil@in@
+ \pgfmathfloat@stack@push@operand@single@str#1\relax
+ \else
+ \pgfmathfloatparsenumber{#1}%
+ \expandafter\pgfmath@basic@stack@push@operand\expandafter{\pgfmathresult}%
+ \fi
+ \fi
+}%
+
+\expandafter\def\expandafter\pgfmathfloat@stack@push@operand@single@str\pgfmath@fpu@stringmarker #1\relax{%
+ \pgfmath@basic@stack@push@operand{#1}%
+}%
+
+\def\pgfmathfloat@stack@push@operand@GOBBLE#1\relax{}%
+\def\pgfmathfloat@stack@push@operand@list#1{%
+ \expandafter\pgfutil@in@ \pgfmathfloat@POSTFLAGSCHAR{#1}%
+ \ifpgfutil@in@
+ \expandafter\def\expandafter\pgfmathfloat@stack@push@operand@list@\expandafter{%
+ \pgfmathfloat@stack@push@operand@list@{#1}%
+ }%
+ \else
+ \pgfmathfloatparsenumber{#1}%
+ \begingroup
+ \toks0=\expandafter{\pgfmathfloat@stack@push@operand@list@}%
+ \toks1=\expandafter{\pgfmathresult}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 {\the\toks1}}%
+ \endgroup
+ \let\pgfmathfloat@stack@push@operand@list@=\pgfmathfloat@glob@TMP
+ \fi
+ \pgfutil@ifnextchar\relax{%
+ \expandafter\pgfmath@basic@stack@push@operand\expandafter{\pgfmathfloat@stack@push@operand@list@}%
+ \pgfmathfloat@stack@push@operand@GOBBLE
+ }{%
+ \pgfmathfloat@stack@push@operand@list
+ }%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% --- END --- Hacks to the basic level pgf math engine
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Here starts the implementation of the floating point
+% routines.
+%
+% They can be used even if the FPU parser is not active.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Remember the basic math commands. They will be invoked as subroutines in floating point routines.
+\let\pgfmath@basic@add@=\pgfmathadd@
+\let\pgfmath@basic@subtract@=\pgfmathsubtract@
+\let\pgfmath@basic@multiply@=\pgfmathmultiply@
+\let\pgfmath@basic@divide@=\pgfmathdivide@
+\let\pgfmath@basic@reciprocal@=\pgfmathreciprocal@
+\let\pgfmath@basic@abs@=\pgfmathabs@
+\let\pgfmath@basic@round@=\pgfmathround@
+\let\pgfmath@basic@rand@=\pgfmathrand@
+\let\pgfmath@basic@rnd@=\pgfmathrnd@
+\let\pgfmath@basic@setseed@=\pgfmathsetseed@
+\let\pgfmath@basic@random@=\pgfmathrandom@
+\let\pgfmath@basic@floor@=\pgfmathfloor@
+\let\pgfmath@basic@ceil@=\pgfmathceil@
+\let\pgfmath@basic@mod@=\pgfmathmod@
+\let\pgfmath@basic@max@=\pgfmathmax@
+\let\pgfmath@basic@min@=\pgfmathmin@
+\let\pgfmath@basic@sin@=\pgfmathsin@
+\let\pgfmath@basic@cos@=\pgfmathcos@
+\let\pgfmath@basic@tan@=\pgfmathtan@
+\let\pgfmath@basic@deg@=\pgfmathdeg@
+\let\pgfmath@basic@rad@=\pgfmathrad@
+\let\pgfmath@basic@atan@=\pgfmathatan@
+\let\pgfmath@basic@asin@=\pgfmathasin@
+\let\pgfmath@basic@acos@=\pgfmathacos@
+\let\pgfmath@basic@cot@=\pgfmathcot@
+\let\pgfmath@basic@sec@=\pgfmathsec@
+\let\pgfmath@basic@cosec@=\pgfmathcosec@
+\let\pgfmath@basic@pow@=\pgfmathpow@
+\let\pgfmath@basic@exp@=\pgfmathexp@
+\let\pgfmath@basic@ln@=\pgfmathln@
+\let\pgfmath@basic@sqrt@=\pgfmathsqrt@
+\let\pgfmath@basic@@pi=\pgfmath@pi
+\let\pgfmath@basic@veclen@=\pgfmathveclen@
+\let\pgfmath@basic@e@=\pgfmathe@
+\let\pgfmath@basic@lessthan@=\pgfmathlessthan@
+\let\pgfmath@basic@greaterthan@=\pgfmathgreaterthan@
+\let\pgfmath@basic@equalto@=\pgfmathequalto@
+\let\pgfmath@basic@equal@=\pgfmathequal@
+\let\pgfmath@basic@true@=\pgfmathtrue@
+\let\pgfmath@basic@false@=\pgfmathfalse@
+
+\def\pgfmathfloatscientific#1#2{%
+ \edef\pgfmathresult{#1e#2}%
+ \expandafter\pgfmathfloatparsenumber\expandafter{\pgfmathresult}%
+}%
+% Compares #1 with #2 and sets \pgfmathresult either to 1.0 or 0.0.
+%
+% It also sets the boolean \ifpgfmathfloatcomparison (globally).
+\def\pgfmathfloatlessthan@#1#2{%
+%\def\pgfmathfloatlessthan#1#2#3\and#4#5#6{%
+ \global\pgfmathfloatcomparisonfalse
+ \begingroup
+ \edef\pgfmathfloat@loc@TMPa{#1}%
+ \edef\pgfmathfloat@loc@TMPb{#2}%
+ \expandafter\pgfmathfloat@decompose\pgfmathfloat@loc@TMPa\relax\pgfmathfloat@a@S\pgfmathfloat@a@M\pgfmathfloat@a@E
+ \expandafter\pgfmathfloat@decompose\pgfmathfloat@loc@TMPb\relax\pgfmathfloat@b@S\pgfmathfloat@b@M\pgfmathfloat@b@E
+ \ifcase\pgfmathfloat@a@S
+ % x = 0 -> (x<y <=> y >0)
+ \ifcase\pgfmathfloat@b@S
+ % y = 0
+ \or% y > 0
+ \global\pgfmathfloatcomparisontrue
+ \or% y < 0
+ \or% y = nan
+ \or% y = + infty
+ \global\pgfmathfloatcomparisontrue
+ \or% y = -infty
+ \fi
+ \or
+ % x > 0 -> (x<y <=> ( y > 0 && |x| < |y|) )
+ \ifcase\pgfmathfloat@b@S
+ % y = 0
+ \or% y>0:
+ \pgfmathfloatlessthan@positive
+ \or% y < 0
+ \or% y = nan
+ \or% y = + infty
+ \global\pgfmathfloatcomparisontrue
+ \or% y = -infty
+ \fi
+ \or
+ % x < 0 -> (x<y <=> (y >= 0 || |x| > |y|) )
+ \ifcase\pgfmathfloat@b@S
+ % y = 0
+ \global\pgfmathfloatcomparisontrue
+ \or%y > 0
+ \global\pgfmathfloatcomparisontrue
+ \or% 'y<0':
+ \pgfmathfloatgreaterthan@positive
+ \or% y = nan
+ \or% y = + infty
+ \global\pgfmathfloatcomparisontrue
+ \or% y = -infty
+ \fi
+ \or
+ % x = nan.
+ \or
+ % x = +infty
+ \or
+ % x = -infty
+ \ifnum\pgfmathfloat@b@S=3
+ \else
+ \global\pgfmathfloatcomparisontrue
+ \fi
+ \fi
+ \endgroup
+ \ifpgfmathfloatcomparison
+ \def\pgfmathresult{1.0}%
+ \else
+ \def\pgfmathresult{0.0}%
+ \fi
+}%
+\let\pgfmathfloatlessthan=\pgfmathfloatlessthan@
+\let\pgfmathfloatless@=\pgfmathfloatlessthan@
+
+% ! (#1 < #2) <=> (#1 >= #2)
+\def\pgfmathfloatnotless@#1#2{%
+ \pgfmathfloatless@{#1}{#2}%
+ \ifpgfmathfloatcomparison
+ \def\pgfmathresult{0.0}%
+ \else
+ \def\pgfmathresult{1.0}%
+ \fi
+}%
+% ! (#1 > #2) <=> (#1 <= #2)
+\def\pgfmathfloatnotgreater@#1#2{%
+ \pgfmathfloatless@{#2}{#1}%
+ \ifpgfmathfloatcomparison
+ \def\pgfmathresult{0.0}%
+ \else
+ \def\pgfmathresult{1.0}%
+ \fi
+}%
+
+% compares \pgfmathfloat@a@[SME] < \pgfmathfloat@b@[SME]
+\def\pgfmathfloatlessthan@positive{%
+ \ifnum\pgfmathfloat@a@E<\pgfmathfloat@b@E
+ \global\pgfmathfloatcomparisontrue
+ \else
+ \ifnum\pgfmathfloat@a@E=\pgfmathfloat@b@E
+ \ifdim\pgfmathfloat@a@M<\pgfmathfloat@b@M
+ \global\pgfmathfloatcomparisontrue
+ \fi
+ \fi
+ \fi
+}%
+
+% compares \pgfmathfloat@a@[SME] > \pgfmathfloat@b@[SME]
+\def\pgfmathfloatgreaterthan@positive{%
+ \ifnum\pgfmathfloat@a@E>\pgfmathfloat@b@E
+ \global\pgfmathfloatcomparisontrue
+ \else
+ \ifnum\pgfmathfloat@a@E=\pgfmathfloat@b@E
+ \ifdim\pgfmathfloat@a@M>\pgfmathfloat@b@M
+ \global\pgfmathfloatcomparisontrue
+ \fi
+ \fi
+ \fi
+}%
+
+
+\def\pgfmathfloatgreaterthan@#1#2{\pgfmathfloatlessthan@{#2}{#1}}%
+\let\pgfmathfloatgreaterthan=\pgfmathfloatgreaterthan@
+\let\pgfmathfloatgreater@=\pgfmathfloatgreaterthan@
+
+\def\pgfmathfloatmax@#1{%
+ \begingroup
+ \pgfmathfloatcreate{2}{1.0}{2147483644}%
+ \let\pgfmathmaxsofar=\pgfmathresult
+ \pgfmathfloatmax@@#1{}%
+}%
+\def\pgfmathfloatmax@@#1{%
+ \def\pgfmath@temp{#1}%
+ \ifx\pgfmath@temp\pgfmath@empty%
+ \expandafter\pgfmathfloatmax@@@%
+ \else%
+ \pgfmathfloatlessthan{\pgfmathmaxsofar}{#1}%
+ \ifpgfmathfloatcomparison
+ \edef\pgfmathmaxsofar{#1}%
+ \fi
+ \expandafter\pgfmathfloatmax@@%
+ \fi%
+}%
+\def\pgfmathfloatmax@@@{%
+ \let\pgfmathresult=\pgfmathmaxsofar
+ \pgfmath@smuggleone{\pgfmathresult}%
+ \endgroup
+}%
+\def\pgfmathfloatmin@#1{%
+ \begingroup
+ \pgfmathfloatcreate{1}{1.0}{2147483644}%
+ \let\pgfmathminsofar=\pgfmathresult
+ \pgfmathfloatmin@@#1{}%
+}%
+\def\pgfmathfloatmin@@#1{%
+ \def\pgfmath@temp{#1}%
+ \ifx\pgfmath@temp\pgfmath@empty%
+ \expandafter\pgfmathfloatmin@@@%
+ \else%
+ \pgfmathfloatlessthan{#1}{\pgfmathminsofar}%
+ \ifpgfmathfloatcomparison
+ \edef\pgfmathminsofar{#1}%
+ \fi
+ \expandafter\pgfmathfloatmin@@%
+ \fi%
+}%
+\def\pgfmathfloatmin@@@{%
+ \let\pgfmathresult=\pgfmathminsofar
+ \pgfmath@smuggleone{\pgfmathresult}%
+ \endgroup
+}%
+
+\def\pgfmathfloatmaxtwo#1#2{%
+ \pgfmathfloatlessthan{#1}{#2}%
+ \ifpgfmathfloatcomparison
+ \edef\pgfmathresult{#2}%
+ \else
+ \edef\pgfmathresult{#1}%
+ \fi
+}%
+\let\pgfmathfloatmax=\pgfmathfloatmaxtwo
+
+\def\pgfmathfloatmintwo#1#2{%
+ \pgfmathfloatlessthan{#1}{#2}%
+ \ifpgfmathfloatcomparison
+ \edef\pgfmathresult{#1}%
+ \else
+ \edef\pgfmathresult{#2}%
+ \fi
+}%
+\let\pgfmathfloatmin=\pgfmathfloatmintwo
+
+% Renormalizes #1 to extended precision mantissa, meaning
+% 100 <= m < 1000
+% instead of 1 <= m < 10.
+%
+% The 'extended precision' means we have higher accuracy when we apply pgfmath operations to mantissas.
+%
+% The input argument is expected to be a normalized floating point number; the output argument is a non-normalized floating point number (well, normalized to extended precision).
+%
+% The operation is supposed to be very fast.
+%
+% @see \pgfmathfloatsetextprecision
+%
+% There is a routine for internal usage,
+% \pgfmathfloattoextentedprecision@a. It also provides exponent and
+% sign of #1 in output arguments and may be used to increase speed.
+\def\pgfmathfloattoextentedprecision#1{%
+ \begingroup
+ \pgfmathfloattoextentedprecision@a{#1}%
+ \pgfmathfloatcreate{\pgfmathfloat@a@S}{\pgfmathresult}{\pgfmathfloat@a@E}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+\def\pgfmathfloattoextentedprecision@@zero#1\pgfmathfloat@EOI{%
+ \edef\pgfmathresult{#1}%
+}%
+\def\pgfmathfloattoextentedprecision@@one#1.#2#3\pgfmathfloat@EOI{%
+ \edef\pgfmathresult{#1#2.#3}%
+}%
+\def\pgfmathfloattoextentedprecision@@two#1.#2#3#4\pgfmathfloat@EOI{%
+ \edef\pgfmathresult{#1#2#3.#4}%
+}%
+\def\pgfmathfloattoextentedprecision@@three#1.#2#3#4#5\pgfmathfloat@EOI{%
+ \edef\pgfmathresult{#1#2#3#4.#5}%
+}%
+
+% Sets extended precision to 10^#1.
+%
+% The different choices are
+%
+% - 0: normalization 0 <= m < 1 (disable extended precision)
+% - 1: normalization 10 <= m < 100
+% - 2: normalization 100 <= m < 1000 (default)
+% - 3: normalization 1000 <= m < 10000
+%
+% #1 is the exponent, #1 = 0,1,2 or 3.
+%
+% This setting applies to \pgfmathfloattoextentedprecision and friends.
+\def\pgfmathfloatsetextprecision#1{%
+ \ifcase#1\relax
+ \let\pgfmathfloattoextentedprecision@@=\pgfmathfloattoextentedprecision@@zero
+ \def\pgfmathfloatextprec@shift{0}%
+ \or
+ \let\pgfmathfloattoextentedprecision@@=\pgfmathfloattoextentedprecision@@one
+ \def\pgfmathfloatextprec@shift{1}%
+ \or
+ \let\pgfmathfloattoextentedprecision@@=\pgfmathfloattoextentedprecision@@two
+ \def\pgfmathfloatextprec@shift{2}%
+ \else
+ \let\pgfmathfloattoextentedprecision@@=\pgfmathfloattoextentedprecision@@three
+ \def\pgfmathfloatextprec@shift{3}%
+ \fi
+}%
+\pgfmathfloatsetextprecision{2}%
+
+% Does the "hard" work for \pgfmathfloattoextentedprecision. It
+% provides additional outputs.
+%
+% INPUT:
+% #1 normalized floating point number. Maybe a macro (it will be expanded ONCE)
+%
+% OUTPUT:
+% - \pgfmathresult : the mantissa in extended precision
+% - \pgfmathfloat@a@S : the sign of #1
+% - \pgfmathfloat@a@E : the exponent of #1, adjusted for extended precision
+% - \pgfmathfloat@a@Mtok : undefined (its contents will be destroyed.
+%
+\def\pgfmathfloattoextentedprecision@a#1{%
+ \edef\pgfmathresult{#1}%
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifnum\pgfmathfloat@a@S<3
+ \advance\pgfmathfloat@a@E by-\pgfmathfloatextprec@shift\relax% compensate for shift
+ \expandafter\pgfmathfloattoextentedprecision@@\the\pgfmathfloat@a@Mtok 000\pgfmathfloat@EOI
+ \fi
+}%
+
+
+% Similar to \pgfmathfloattoextentedprecision@a, this one here fills the '@b' registers.
+\def\pgfmathfloattoextentedprecision@b#1{%
+ \edef\pgfmathresult{#1}%
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@b@S\pgfmathfloat@a@Mtok\pgfmathfloat@b@E
+ \ifnum\pgfmathfloat@b@S<3
+ \advance\pgfmathfloat@b@E by-\pgfmathfloatextprec@shift\relax
+ \expandafter\pgfmathfloattoextentedprecision@@\the\pgfmathfloat@a@Mtok 00\pgfmathfloat@EOI
+ \fi
+}%
+
+% Addition of two floating point numbers using 8 significant digits.
+\def\pgfmathfloatadd@#1#2{%
+ \begingroup
+ %
+ % renormalize argument to 100 <= m < 1000 for extended accuracy:
+ \pgfmathfloattoextentedprecision@a{#1}%
+ \let\pgfmathfloat@arga=\pgfmathresult
+ %
+ \pgfmathfloattoextentedprecision@b{#2}%
+ \let\pgfmathfloat@argb=\pgfmathresult
+ %
+ \pgfmathfloatcomparisontrue% re-use this boolean here to handle special cases.
+ \ifcase\pgfmathfloat@a@S
+ \edef\pgfmathresult{#2}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \or
+ \edef\pgfmathfloat@arga{-\pgfmathfloat@arga}%
+ \else
+ \pgfmathfloatcomparisonfalse
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{0.0}{0}%
+ \fi
+ \ifcase\pgfmathfloat@b@S
+ \edef\pgfmathresult{#1}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \or
+ \edef\pgfmathfloat@argb{-\pgfmathfloat@argb}%
+ \else
+ \pgfmathfloatcomparisonfalse
+ \pgfmathfloatcreate{\the\pgfmathfloat@b@S}{0.0}{0}%
+ \fi
+ \ifpgfmathfloatcomparison
+ % Shift lesser mantisse to fit the larger one:
+ \ifnum\pgfmathfloat@a@E<\pgfmathfloat@b@E
+ \pgfmathfloatadd@shift{\pgfmathfloat@arga}{\pgfmathfloat@a@E}{\pgfmathfloat@b@E}%
+ \else
+ \pgfmathfloatadd@shift{\pgfmathfloat@argb}{\pgfmathfloat@b@E}{\pgfmathfloat@a@E}%
+ \fi
+ % add them!
+ \pgfmath@basic@add@{\pgfmathfloat@arga}{\pgfmathfloat@argb}%
+ % renormalize sum. This is the only part were an expensive routine comes into play:
+ \edef\pgfmathresult{\pgfmathresult e\the\pgfmathfloat@a@E}%
+ \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+% #1= floating point number
+% #2= TeX code to execute if #1 == 0
+% #3= TeX code to execute if #1 != 0
+\def\pgfmathfloatifzero#1#2#3{%
+ \pgfmathfloatgetflagstomacro{#1}\pgfmathfloat@loc@TMPa
+ \if\pgfmathfloat@loc@TMPa0 #2\else#3\fi
+}%
+
+\def\pgfmathfloatiffinite#1#2#3{%
+ \pgfmathfloatgetflagstomacro{#1}\pgfmathfloatiffinite@
+ \ifnum\pgfmathfloatiffinite@>2 #3\else #2\fi
+}%
+
+\def\pgfmathfloatifthenelse@#1#2#3{%
+ \pgfmathfloatifflags{#1}{0}{%
+ \edef\pgfmathresult{#3}%%
+ }{%
+ \edef\pgfmathresult{#2}%
+ }%
+}%
+\def\pgfmathfloatequal@#1#2{%
+ \pgfmathfloatifapproxequalrel{#1}{#2}{%
+ \def\pgfmathresult{1}%
+ \pgfmathfloatcomparisontrue
+ }{%
+ \def\pgfmathresult{0}%
+ \pgfmathfloatcomparisonfalse
+ }%
+}%
+\let\pgfmathfloatequalto@=\pgfmathfloatequal@
+
+\def\pgfmathfloatnotequal@#1#2{%
+ \pgfmathfloatifapproxequalrel{#1}{#2}{%
+ \def\pgfmathresult{0}%
+ \pgfmathfloatcomparisonfalse
+ }{%
+ \def\pgfmathresult{1}%
+ \pgfmathfloatcomparisontrue
+ }%
+}%
+\let\pgfmathfloatnotequalto@=\pgfmathfloatnotequal@
+
+% Computes the relative error between #1 and #2 (assuming #2 != 0) and
+% invokes #3 if the relative error is below `/pgf/fpu/rel thresh' and
+% #4 if that is not the case.
+\long\def\pgfmathfloatifapproxequalrel#1#2#3#4{%
+ \begingroup
+ \pgfmathfloatparsenumber{#1}%
+ \let\pgfmathfloatarga=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}%
+ \let\pgfmathfloatargb=\pgfmathresult
+ \pgfmathfloatrelerror@\pgfmathfloatarga\pgfmathfloatargb
+ \let\pgfmathfloatarga=\pgfmathresult
+ \pgfmathfloatlessthan@\pgfmathfloatarga\pgfmathfloat@relthresh
+ \ifpgfmathfloatcomparison
+ \def\pgfmathfloat@loc@TMPa{#3}%
+ \else
+ \def\pgfmathfloat@loc@TMPa{#4}%
+ \fi
+ \expandafter\endgroup
+ \pgfmathfloat@loc@TMPa
+}%
+
+% Invokes code '#3' if the flags of the floating point number '#1'
+% match the flag provided in '#2'.
+%
+% \pgfmathfloatcreate{1}{1.0}{2}
+% \pgfmathfloatifflags{\pgfmathresult}{0}{It's zero!}{It's not zero!}%
+% \pgfmathfloatifflags{\pgfmathresult}{1}{It's positive!}{It's not positive!}%
+% \pgfmathfloatifflags{\pgfmathresult}{2}{It's negative!}{It's not negative!}%
+% or, equivalently
+% \pgfmathfloatifflags{\pgfmathresult}{+}{It's positive!}{It's not positive!}%
+% \pgfmathfloatifflags{\pgfmathresult}{-}{It's negative!}{It's not negative!}%
+% it also supports #2=u which means 'unbounded'
+\def\pgfmathfloatifflags#1#2#3#4{%
+ \if#2-%
+ \pgfmathfloatifflags{#1}{2}{#3}{#4}%
+ \else
+ \if#2+%
+ \pgfmathfloatifflags{#1}{1}{#3}{#4}%
+ \else
+ \pgfmathfloatgetflagstomacro{#1}\pgfmathfloat@loc@TMPa
+ \if#2u%
+ \ifnum\pgfmathfloat@loc@TMPa>2
+ #3\relax
+ \else
+ #4\relax
+ \fi
+ \else
+ \if\pgfmathfloat@loc@TMPa#2%
+ #3\relax
+ \else
+ #4\relax
+ \fi
+ \fi
+ \fi
+ \fi
+}%
+
+% #1=mantissa which needs to be shifted (with smaller exponent)
+% #2=smaller exponent
+% #3=larger exponent
+%
+% ATTENTION: this helper method DESTROYS contents of \pgfmathfloat@a@S.
+\def\pgfmathfloatadd@shift#1#2#3{%
+ \pgf@xa=#1 pt%
+ \pgfmathfloat@a@S=#3\relax
+ \advance\pgfmathfloat@a@S by-#2\relax
+ \ifcase\pgfmathfloat@a@S
+ \or
+ \divide\pgf@xa by10\relax
+ \or
+ \divide\pgf@xa by100\relax
+ \or
+ \divide\pgf@xa by1000\relax
+ \or
+ \divide\pgf@xa by10000\relax
+ \or
+ \divide\pgf@xa by10000\relax
+ \divide\pgf@xa by10\relax
+ \or
+ \divide\pgf@xa by10000\relax
+ \divide\pgf@xa by100\relax
+ \or
+ \divide\pgf@xa by10000\relax
+ \divide\pgf@xa by1000\relax
+ \or
+ \divide\pgf@xa by10000\relax
+ \divide\pgf@xa by10000\relax
+ \else
+ \pgf@xa=0pt%
+ \fi
+ #2=#3\relax
+ \edef#1{\pgf@sys@tonumber\pgf@xa}%
+}%
+
+\let\pgfmathfloatadd=\pgfmathfloatadd@
+
+
+% Subtracts two floating point numbers.
+\def\pgfmathfloatsubtract@#1#2{%
+ \begingroup
+ \edef\pgfmathresult{#2}%
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@b@S\pgfmathfloat@a@Mtok\pgfmathfloat@b@E
+ \ifcase\pgfmathfloat@b@S
+ \edef\pgfmathresult{#1}%
+ \or
+ \pgfmathfloatcreate{2}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@b@E}%
+ \let\pgfmathfloatsub@arg=\pgfmathresult
+ \pgfmathfloatadd@{#1}{\pgfmathfloatsub@arg}%
+ \or
+ \pgfmathfloatcreate{1}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@b@E}%
+ \let\pgfmathfloatsub@arg=\pgfmathresult
+ \pgfmathfloatadd@{#1}{\pgfmathfloatsub@arg}%
+ \else
+ \pgfmathfloatcreate{\the\pgfmathfloat@b@S}{0.0}{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+\let\pgfmathfloatsubtract=\pgfmathfloatsubtract@
+
+% Scales a floating point number #1 with a fixed point number #2 using pgfmathmultiply.
+%
+% Use this method if #2 is small number.
+\def\pgfmathfloatmultiplyfixed@#1#2{%
+ \begingroup
+ %
+ % renormalize argument to 100 <= m < 1000 for extended accuracy:
+ \pgfmathfloattoextentedprecision@a{#1}%
+ \let\pgfmathfloat@arga=\pgfmathresult
+ %
+ \pgfmathfloatcomparisontrue% re-use this boolean here to handle special cases.
+ \ifcase\pgfmathfloat@a@S
+ \edef\pgfmathresult{#1}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \or
+ \edef\pgfmathfloat@arga{-\pgfmathfloat@arga}%
+ \else
+ \pgfmathfloatcomparisonfalse
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{0.0}{0}%
+ \fi
+ \ifpgfmathfloatcomparison
+ \pgfmath@basic@multiply@{\pgfmathfloat@arga}{#2}%
+ % renormalize product. This is the only part were an expensive routine comes into play:
+ \edef\pgfmathresult{\pgfmathresult e\the\pgfmathfloat@a@E}%
+ \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+\let\pgfmathfloatmultiplyfixed=\pgfmathfloatmultiplyfixed@
+
+
+\def\pgfmathfloatmultiply@#1#2{%
+ \begingroup
+ \pgfmathfloatsetextprecision{1}%
+ \pgfmathfloattoextentedprecision@a{#1}%
+ \let\pgfmathfloat@arga=\pgfmathresult
+ %
+ \pgfmathfloattoextentedprecision@b{#2}%
+ \let\pgfmathfloat@argb=\pgfmathresult
+ %
+ \pgfmathfloatcomparisontrue% re-use this boolean here to handle special cases.
+ \ifcase\pgfmathfloat@a@S
+ % 0
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or% +
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \def\pgfmathresult@S{1}%
+ \or
+ \def\pgfmathresult@S{2}%
+ \else
+ \expandafter\pgfmathfloatcreate\the\pgfmathfloat@b@S{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \or% -
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \def\pgfmathresult@S{2}%
+ \or
+ \def\pgfmathresult@S{1}%
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \or% nan
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or% +infty
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \or% -infty
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \fi
+ \ifpgfmathfloatcomparison
+ \pgfmath@basic@multiply@{\pgfmathfloat@arga}{\pgfmathfloat@argb}%
+ \advance\pgfmathfloat@a@E by\pgfmathfloat@b@E
+ % renormalize sum. This is the only part were an expensive routine comes into play:
+ \edef\pgfmathresult{\pgfmathresult e\the\pgfmathfloat@a@E}%
+ \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}%
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \pgfmathfloatcreate{\pgfmathresult@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatmultiply=\pgfmathfloatmultiply@
+
+% Defines \pgfmathresult to be #1 / #2 for two floating point numbers.
+%
+% It employs the basic math engine internally to divide mantissas.
+\def\pgfmathfloatdivide@#1#2{%
+ \begingroup
+ \pgfmathfloatsetextprecision{1}% is not too important, I think. After all, 0.1 <= #1/#2 < 10 or so due to normalization (no matter, which)
+ \edef\pgfmathfloat@arga{#1}%
+ \pgfmathfloattoextentedprecision@a{\pgfmathfloat@arga}%
+ \let\pgfmathfloat@arga=\pgfmathresult
+ %
+ \edef\pgfmathfloat@argb{#2}%
+ \pgfmathfloattoextentedprecision@b{\pgfmathfloat@argb}%
+ \let\pgfmathfloat@argb=\pgfmathresult
+ %
+ \pgfmathfloatcomparisontrue% re-use this boolean here to handle special cases.
+ \ifcase\pgfmathfloat@a@S
+ % 0
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or% +
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \def\pgfmathresult@S{1}%
+ \or
+ \def\pgfmathresult@S{2}%
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \else
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \or% -
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \def\pgfmathresult@S{2}%
+ \or
+ \def\pgfmathresult@S{1}%
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \else
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \or% nan
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or% +infty
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}% what is inf/inf ?
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}% or inf/-inf ?
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \or% -infty
+ \ifcase\pgfmathfloat@b@S
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{5}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \or
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \pgfmathfloatcomparisonfalse
+ \fi
+ \fi
+ \ifpgfmathfloatcomparison
+ \pgfmath@basic@divide@{\pgfmathfloat@arga}{\pgfmathfloat@argb}%
+ \advance\pgfmathfloat@a@E by-\pgfmathfloat@b@E
+ % renormalize. This is the only part were an expensive float routine comes into play:
+ \edef\pgfmathresult{\pgfmathresult e\the\pgfmathfloat@a@E}%
+ \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}%
+ % And re-insert the proper sign:
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \pgfmathfloatcreate{\pgfmathresult@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatdivide=\pgfmathfloatdivide@
+
+\def\pgfmathfloatreciprocal@#1{%
+ \begingroup
+ % FIXME optimize
+ \edef\pgfmathfloat@loc@TMPa{#1}%
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \pgfmathfloatdivide@{\pgfmathresult}{\pgfmathfloat@loc@TMPa}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+% Computes sqrt(#1) in floating point arithmetics.
+%
+% It employs sqrt( m * 10^e ) = sqrt(m) * sqrt(10^e).
+\def\pgfmathfloatsqrt@#1{%
+ \begingroup
+ \pgfmathfloatsetextprecision{3}%
+ \edef\pgfmathfloat@arga{#1}%
+ \pgfmathfloattoextentedprecision@a{\pgfmathfloat@arga}%
+ \let\pgfmathfloat@arga=\pgfmathresult
+ %
+ \ifcase\pgfmathfloat@a@S
+ % 0
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \or% +
+ \pgfmath@basic@sqrt@{\pgfmathfloat@arga}%
+ \ifodd\pgfmathfloat@a@E
+ \ifnum\pgfmathfloat@a@E>0
+ \expandafter\pgfmath@basic@multiply@\expandafter{\pgfmathresult}{3.16227766}% * sqrt(10)
+ \else
+ \expandafter\pgfmath@basic@multiply@\expandafter{\pgfmathresult}{0.316227766}% * sqrt(0.1)
+ \fi
+ \fi
+ \divide\pgfmathfloat@a@E by2 % sqrt(10^e) = 10^{e/2} (see above for odd e)
+ % renormalize sum. This is the only part were an expensive routine comes into play:
+ \edef\pgfmathfloat@arga{\pgfmathresult e\the\pgfmathfloat@a@E}%
+ \pgfmathfloatqparsenumber{\pgfmathfloat@arga}%
+ \or% -
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \or% nan
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \or% +infty
+ \pgfmathfloatcreate{4}{0.0}{0}%
+ \or% -infty
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatsqrt=\pgfmathfloatsqrt@
+
+% Returns the integer part of the floating point number #1.
+%
+% The result is returned as floating point as well.
+%
+% This operation is not limited to TeX's range of count registers (it
+% works symbolly)
+%
+% @see \pgfmathfloattoint
+% POSTCONDITION: \pgfmathresult contains the result and
+% \pgfmathfloatintwasnoop=1 if there was nothing to do
+% \pgfmathfloatintwasnoop=0 if there where non-zero digits after the period
+% \pgfmathfloatintwasnoop=2 if there where digits after the period. The digits will be stored in \pgfmathfloatintremainder in this case.
+\def\pgfmathfloatint@#1{%
+ \begingroup
+ \edef\pgfmathfloatint@input{#1}%
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathfloatint@input\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \gdef\pgfmathfloatintwasnoop{1}%
+ \gdef\pgfmathfloatintremainder{}%
+ \ifcase\pgfmathfloat@a@S
+ % 0: nothing to do.
+ \or% +
+ \expandafter\pgfmathfloatint@@\the\pgfmathfloat@a@Mtok\pgfmathfloat@EOI
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \or% -
+ \expandafter\pgfmathfloatint@@\the\pgfmathfloat@a@Mtok\pgfmathfloat@EOI
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \else
+ % nothing to do
+ \fi
+ %\message{ XXXXX int(\pgfmathfloatint@input) = \pgfmathresult -> was no op = \pgfmathfloatintwasnoop\space (remainder \pgfmathfloatintremainder)^^J}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\def\pgfmathfloatint@@#1.{%
+ \ifnum\pgfmathfloat@a@E<0
+ \pgfmathfloat@a@S=0
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0
+ \gdef\pgfmathfloatintwasnoop{0}%
+ \expandafter\pgfmathfloatint@@loop@gobble
+ \else
+ \pgfmathfloat@a@Mtok={#1.}%
+ \pgfmathfloat@b@E=\pgfmathfloat@a@E
+ \expandafter\pgfmathfloatint@@loop
+ \fi
+}%
+\def\pgfmathfloatint@@loop#1{%
+ \def\pgfmathfloatint@@loop@{#1}%
+ \ifx\pgfmathfloatint@@loop@\pgfmathfloat@EOI
+ \gdef\pgfmathfloatintwasnoop{1}%
+ \let\pgfmathfloatint@@loop@next=\relax
+ \else
+ \ifnum\pgfmathfloat@b@E=0
+ \def\pgfmathfloatint@@loop@next{\pgfmathfloatint@@loop@gobble#1}%
+ \else
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok#1}%
+ \advance\pgfmathfloat@b@E by-1
+ \let\pgfmathfloatint@@loop@next=\pgfmathfloatint@@loop
+ \fi
+ \fi
+ \pgfmathfloatint@@loop@next
+}%
+\def\pgfmathfloatint@@loop@gobble#1\pgfmathfloat@EOI{%
+ \if0\pgfmathfloatintwasnoop
+ \else
+ \gdef\pgfmathfloatintwasnoop{2}%
+ \gdef\pgfmathfloatintremainder{#1}%
+ \fi
+}%
+\let\pgfmathfloatint=\pgfmathfloatint@
+
+\def\pgfmathfloatfloor#1{%
+ \edef\pgfmath@orig{#1}%
+ \pgfmathfloatint@{#1}%
+ \pgfmathfloatifflags{\pgfmath@orig}{2}{%
+ \let\pgfmath@trunc=\pgfmathresult
+ \ifcase\pgfmathfloatintwasnoop\relax
+ % ah - we stripped something! Round DOWN
+ \pgfmathfloatcreate{2}{1.0}{0}% -1
+ \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfmath@trunc}%
+ \or
+ % was no-op
+ \let\pgfmathresult=\pgfmath@trunc
+ \else
+ % ok, we have to inspect the remainder:
+ \pgfmathfloatparsenumber{0.\pgfmathfloatintremainder}%
+ \pgfmathfloatifflags{\pgfmathresult}{1}{%
+ % ah - we stripped a non-zero remainder! Round DOWN
+ \pgfmathfloatcreate{2}{1.0}{0}% -1
+ \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfmath@trunc}%
+ }{%
+ % was no-op
+ \let\pgfmathresult=\pgfmath@trunc
+ }%
+ \fi
+ }{}%
+}%
+\let\pgfmathfloatfloor@=\pgfmathfloatfloor
+
+\def\pgfmathfloatceil#1{%
+ \edef\pgfmath@orig{#1}%
+ \pgfmathfloatint@{#1}%
+ \pgfmathfloatifflags{\pgfmath@orig}{1}{%
+ \let\pgfmath@trunc=\pgfmathresult
+ \ifcase\pgfmathfloatintwasnoop\relax
+ % ah - we stripped something! Round UP
+ \pgfmathfloatcreate{1}{1.0}{0}% +1
+ \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfmath@trunc}%
+ \or
+ % was no-op
+ \let\pgfmathresult=\pgfmath@trunc
+ \else
+ % ok, we have to inspect the remainder:
+ \pgfmathfloatparsenumber{0.\pgfmathfloatintremainder}%
+ \pgfmathfloatifflags{\pgfmathresult}{1}{%
+ % ah - we stripped a non-zero remainder! Round UP
+ \pgfmathfloatcreate{1}{1.0}{0}% +1
+ \expandafter\pgfmathfloatadd@\expandafter{\pgfmathresult}{\pgfmath@trunc}%
+ }{%
+ % was no-op
+ \let\pgfmathresult=\pgfmath@trunc
+ }%
+ \fi
+ }{}%
+}%
+\let\pgfmathfloatceil@=\pgfmathfloatceil
+
+\def\pgfmathfloat@notimplemented#1{%
+ \pgfmath@error{Sorry, the operation '#1' has not yet been implemented in the floating point unit}{}%
+ \pgfmathfloatcreate{0}{0.0}{0}%
+}%
+
+% Divides or multiplies the input number by 10^#4 using an arithmetic
+% left/right shift.
+%
+% Input:
+% #1 a normalised floating point number.
+% #2 a positive or negative integer number denoting the shift.
+%
+% Example:
+% \pgfmathfloatshift{11e3}{4}%
+% -> pgfmathresult = 11e7
+\def\pgfmathfloatshift@#1#2{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \advance\pgfmathfloat@a@E by#2\relax
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatshift=\pgfmathfloatshift@
+
+% Defines \pgfmathresult to be |#1|, the absolute value of the
+% normalized floating point number #1.
+\def\pgfmathfloatabs@#1{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S
+ % 0: do nothing.
+ \or
+ % +: ok, is positive.
+ \or
+ % -: multiply with -1:
+ \pgfmathfloat@a@S=1
+ \or
+ % nan: do nothing.
+ \or
+ % +infty: ok.
+ \or
+ % -infty: multiply with -1:
+ \pgfmathfloat@a@S=4
+ \fi
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+%
+% Defines \pgfmathresult to be sign(#1)
+\def\pgfmathfloatsign@#1{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S
+ % 0:
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \or
+ % +: ok, is positive.
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \or
+ % -:
+ \pgfmathfloatcreate{2}{1.0}{0}%
+ \or
+ % nan: do nothing.
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \or
+ % +infty:.
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \or
+ % -infty:
+ \pgfmathfloatcreate{2}{1.0}{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatsign=\pgfmathfloatsign@
+
+% Computes the absolute error |#1 - #2| into \pgfmathresult.
+\def\pgfmathfloatabserror@#1#2{%
+ \pgfmathfloatsubtract@{#1}{#2}%
+ \pgfmathfloatabs@{\pgfmathresult}%
+}%
+\let\pgfmathfloatabserror=\pgfmathfloatabserror@
+
+% Computes the relative error |#1 - #2|/|#2| into \pgfmathresult,
+% assuming #2 != 0.
+\def\pgfmathfloatrelerror@#1#2{%
+ \pgfmathfloatsubtract@{#1}{#2}%
+ \let\pgfmathfloat@subtract=\pgfmathresult
+ \pgfmathfloatifflags{#2}{0}{%
+ \let\pgfmathresult=\pgfmathfloat@subtract
+ }{%
+ \pgfmathfloatdivide@{\pgfmathfloat@subtract}{#2}%
+ }%
+ \pgfmathfloatabs@{\pgfmathresult}%
+}%
+\let\pgfmathfloatrelerror=\pgfmathfloatrelerror@
+
+% Computes \pgfmathresult = #1 mod #2 using truncated division.
+%
+\def\pgfmathfloatmod@#1#2{%
+ \begingroup
+ \pgfmathfloattoint{#1}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloattoint{#2}%
+ \let\pgfmathfloat@loc@TMPb=\pgfmathresult
+ \c@pgfmath@counta=\pgfmathfloat@loc@TMPa\relax
+ \divide\c@pgfmath@counta by\pgfmathfloat@loc@TMPb\relax
+ \expandafter\pgfmathfloatparsenumber\expandafter{\the\c@pgfmath@counta}%
+ %
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloatmultiply@{\pgfmathfloat@loc@TMPa}{#2}%
+ \let\pgfmathfloat@loc@TMPb=\pgfmathresult
+ \pgfmathfloatsubtract@{#1}{\pgfmathfloat@loc@TMPb}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatmod=\pgfmathfloatmod@
+
+
+% A modification of \pgfmathfloatmod@ where #3 = 1/#2 is already
+% known. This may be faster.
+\def\pgfmathfloatmodknowsinverse@#1#2#3{%
+ \pgfmathfloatmod@{#1}{#2}%
+ %--------------------------------------------------
+ % \begingroup
+ % % FIXME : is this function correct? \pgfmathfloatmod had a
+ % % rounding flaw...
+ % \pgfmathfloatmultiply@{#1}{#3}%
+ % \pgfmathfloatint@{\pgfmathresult}%
+ % \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ % \pgfmathfloatmultiply@{\pgfmathfloat@loc@TMPa}{#2}%
+ % \let\pgfmathfloat@loc@TMPb=\pgfmathresult
+ % \pgfmathfloatsubtract@{#1}{\pgfmathfloat@loc@TMPb}%
+ % \pgfmath@smuggleone\pgfmathresult
+ % \endgroup
+ %--------------------------------------------------
+}%
+\let\pgfmathfloatmodknowsinverse=\pgfmathfloatmodknowsinverse@
+
+\def\pgfmathfloatpi@{%
+ \pgfmathfloatcreate{1}{3.14159265358979}{0}%
+}%
+\let\pgfmathfloatpi=\pgfmathfloatpi@
+
+\def\pgfmathfloate@{%
+ \pgfmathfloatcreate{1}{2.71828182845905}{0}%
+}%
+\let\pgfmathfloate=\pgfmathfloate@
+
+% Converts #1 from radians to degrees.
+\def\pgfmathfloatdeg@#1{%
+ \expandafter\ifx\csname pgfmfltdeg@factor\endcsname\relax
+ % Lazy evaluation:
+ \pgfmathfloatcreate{1}{5.72957795130823}{1}%
+ \global\let\pgfmfltdeg@factor=\pgfmathresult
+ \fi
+ \pgfmathfloatmultiply@{#1}\pgfmfltdeg@factor%
+}%
+\let\pgfmathfloatdeg=\pgfmathfloatdeg@
+
+% Converts #1 from degree to radians.
+\def\pgfmathfloatrad@#1{%
+ \expandafter\ifx\csname pgfmfltrad@factor\endcsname\relax
+ % Lazy evaluation:
+ \pgfmathfloatcreate{1}{1.74532925199433}{-2}%
+ \global\let\pgfmfltrad@factor=\pgfmathresult
+ \fi
+ \pgfmathfloatmultiply@{#1}\pgfmfltrad@factor%
+}%
+\let\pgfmathfloatrad=\pgfmathfloatrad@
+
+% Computes #1(#2) where #1 is a trigonometric function, i.e.
+% #1(#2) = #1( #2 + r*360 )
+%
+% #1 is a one-argument macro which assigns \pgfmathresult.
+\def\pgfmathfloatTRIG@#1#2{%
+ \if0\pgfmath@trig@format@choice
+ % trig format=deg
+ \expandafter\ifx\csname pgfmathfloatTRIG@NUM\endcsname\relax%
+ % Lazy evaluation:
+ \pgfmathfloatcreate{1}{3.6}{2}%
+ \global\let\pgfmathfloatTRIG@NUM=\pgfmathresult
+ \pgfmathfloatcreate{1}{2.77777777777778}{-3}%
+ \global\let\pgfmathfloatTRIG@NUM@INV=\pgfmathresult
+ \fi
+ \pgfmathfloatmodknowsinverse@{#2}{\pgfmathfloatTRIG@NUM}{\pgfmathfloatTRIG@NUM@INV}%
+ \else
+ % trig format=rad
+ \expandafter\ifx\csname pgfmathfloatTRIG@rad@NUM\endcsname\relax%
+ % Lazy evaluation:
+ \pgfmathfloatcreate{1}{6.28318530717959}{0}%
+ \global\let\pgfmathfloatTRIG@rad@NUM=\pgfmathresult
+ \pgfmathfloatcreate{1}{1.59154943091895}{-1}%
+ \global\let\pgfmathfloatTRIG@rad@NUM@INV=\pgfmathresult
+ \fi
+ \pgfmathfloatmodknowsinverse@{#2}{\pgfmathfloatTRIG@rad@NUM}{\pgfmathfloatTRIG@rad@NUM@INV}%
+ \fi
+ \pgfmathfloattofixed@{\pgfmathresult}%
+ \expandafter#1\expandafter{\pgfmathresult}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+}%
+
+\def\pgfmathfloatsin@#1{\pgfmathfloatTRIG@\pgfmath@basic@sin@{#1}}%
+\let\pgfmathfloatsin=\pgfmathfloatsin@
+\def\pgfmathfloatcos@#1{\pgfmathfloatTRIG@\pgfmath@basic@cos@{#1}}%
+\let\pgfmathfloatcos=\pgfmathfloatcos@
+\def\pgfmathfloattan@#1{%
+ % compute sin(#1) / cos(#1)
+ \begingroup
+ \pgfmathfloatcos@{#1}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloatsin@{#1}%
+ \expandafter\pgfmathfloatdivide@\expandafter{\pgfmathresult}{\pgfmathfloat@loc@TMPa}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloattan=\pgfmathfloattan@
+
+\def\pgfmathfloatcot@#1{%
+ % compute cos(#1) / sin(#1)
+ \begingroup
+ \pgfmathfloatsin@{#1}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloatcos@{#1}%
+ \expandafter\pgfmathfloatdivide@\expandafter{\pgfmathresult}{\pgfmathfloat@loc@TMPa}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatcot=\pgfmathfloatcot@
+
+\def\pgfmathfloatatan@#1{%
+ \begingroup
+ \expandafter\ifx\csname pgfmathfloatatan@TMP\endcsname\relax%
+ \pgfmathfloatcreate{1}{1.6}{4}%
+ \global\let\pgfmathfloatatan@TMP=\pgfmathresult
+ \pgfmathfloatcreate{2}{1.6}{4}%
+ \global\let\pgfmathfloatatan@TMPB=\pgfmathresult
+ \fi
+ \pgfmathfloatgreaterthan@{#1}{\pgfmathfloatatan@TMP}%
+ \ifpgfmathfloatcomparison
+ \pgfmathiftrigonometricusesdeg{%
+ \pgfmathfloatcreate{1}{9.0}{1}%
+ }{%
+ \pgfmathfloatcreate{1}{1.570796326794}{0}%
+ }%
+ \else
+ \pgfmathfloatlessthan{#1}{\pgfmathfloatatan@TMPB}%
+ \ifpgfmathfloatcomparison
+ \pgfmathiftrigonometricusesdeg{%
+ \pgfmathfloatcreate{2}{9.0}{1}%
+ }{%
+ \pgfmathfloatcreate{2}{1.570796326794}{0}%
+ }%
+ \else
+ \pgfmathfloattofixed@{#1}%
+ \expandafter\pgfmath@basic@atan@\expandafter{\pgfmathresult}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ \fi
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloatatan=\pgfmathfloatatan@
+
+\def\pgfmathfloatatantwo#1#2{%
+ % Note: first parameter is y (!), second is x (!)
+ \begingroup%
+ \let\pgfmath@trig@format@choice@@=\pgfmath@trig@format@choice
+ \def\pgfmath@trig@format@choice{0}%
+ %
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \expandafter\pgfmathfloat@decompose#2\relax\pgfmathfloat@b@S\pgfmathfloat@b@M\pgfmathfloat@b@E
+ \ifnum\pgfmathfloat@a@S=0
+ % ok, #1 = 0. Substitute by 1e-16 such that the next \ifnum catches it:
+ \pgfmathfloat@a@E=-16 %
+ \fi
+ %
+ \ifnum\pgfmathfloat@a@E<-3 %
+ \ifnum\pgfmathfloat@b@S=2 %
+ % #2 < 0
+ \pgfmathfloatcreate{1}{1.8}{2}% +180
+ \else
+ \ifnum\pgfmathfloat@b@S=1 %
+ % #2 >0
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \else
+ % + or - 90, just use the sign of #1:
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{9.0}{1}%
+ \fi
+ \fi
+ \else%
+ \pgfmathfloatabs@{#1}\let\pgfmath@tempa\pgfmathresult%
+ \pgfmathfloatabs@{#2}\let\pgfmath@tempb\pgfmathresult%
+ \pgfmathfloatgreaterthan@{\pgfmath@tempa}{\pgfmath@tempb}%
+ \ifpgfmathfloatcomparison
+ \pgfmathfloatdivide@{#2}{\pgfmath@tempa}%
+ \expandafter\pgfmathfloatatan@\expandafter{\pgfmathresult}%
+ \let\pgfmath@tempa=\pgfmathresult
+ \pgfmathfloatcreate{1}{9.0}{1}%
+ \let\pgfmath@tempb=\pgfmathresult
+ \pgfmathfloatsubtract@{\pgfmath@tempb}{\pgfmath@tempa}%
+ \else%
+ \pgfmathfloatdivide@{\pgfmath@tempa}{#2}%
+ \expandafter\pgfmathfloatatan@\expandafter{\pgfmathresult}%
+ \expandafter\pgfmathfloatifflags\expandafter{\pgfmathresult}{2}{%
+ \let\pgfmath@tempa=\pgfmathresult
+ \pgfmathfloatcreate{1}{1.8}{2}%
+ \let\pgfmath@tempb=\pgfmathresult
+ \pgfmathfloatadd@{\pgfmath@tempa}{\pgfmath@tempb}%
+ }{}%
+ \fi%
+ %
+ \pgfmathfloatifflags{#1}{-}{%
+ % #1 < 0:
+ \pgfmathfloatmultiplyfixed@{\pgfmathresult}{-1}%
+ }{}%
+ \fi%
+ \if1\pgfmath@trig@format@choice@@
+ % trig format=rad
+ \pgfmathfloat@scale@deg@to@rad\pgfmathresult
+ \fi
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}%
+\let\pgfmathfloatatantwo@=\pgfmathfloatatantwo
+\expandafter\let\csname pgfmathfloatatan2\endcsname=\pgfmathfloatatantwo
+\expandafter\let\csname pgfmathfloatatan2@\endcsname=\pgfmathfloatatantwo@
+
+\def\pgfmathfloat@scale@deg@to@rad#1{%
+ \edef\pgfmathfloat@loc@TMPb{#1}%
+ \pgfmathfloatcreate{1}{1.74532925199433}{-2}% = pi / 180
+ \pgfmathfloatmultiply@{\pgfmathresult}{\pgfmathfloat@loc@TMPb}%
+}%
+
+\def\pgfmathfloatsec@#1{\pgfmathfloatTRIG@\pgfmath@basic@cos@{#1}\pgfmathfloatreciprocal@{\pgfmathresult}}%
+\let\pgfmathfloatsec=\pgfmathfloatsec@
+\def\pgfmathfloatcosec@#1{\pgfmathfloatTRIG@\pgfmath@basic@sin@{#1}\pgfmathfloatreciprocal@{\pgfmathresult}}%
+\let\pgfmathfloatcosec=\pgfmathfloatcosec@
+
+% Expands #2 using \edef and invokes #1 with the resulting string.
+%
+% DEPRECATED
+% Example:
+% \pgfmath@y=7.9pt
+% \pgfmathlog@invoke@expanded\pgfmathexp@{{\pgf@sys@tonumber{\pgfmath@y}}}%
+% will invoke
+% \pgfmathexp@{7.9}
+\def\pgfmathlog@invoke@expanded#1#2{%
+ \edef\pgfmath@resulttemp{#2}%
+ \expandafter#1\pgfmath@resulttemp
+}%
+
+\def\pgfmathfloatln@#1{%
+ \pgfmathlog@float{#1}%
+ \ifx\pgfmathresult\pgfutil@empty
+ \pgfmathfloatcreate{3}{0.0}{0}%
+ \else
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ \fi
+}%
+\let\pgfmathfloatln=\pgfmathfloatln@
+
+\expandafter\def\csname pgfmathfloatlog10@\endcsname#1{%
+ \pgfmathfloatln@{#1}%
+ \let\pgfmathfloat@log@e=\pgfmathresult
+ \pgfmathfloatcreate{1}{4.34294481903252}{-1}% 1/ln(10)
+ \pgfmathfloatmultiply@{\pgfmathresult}{\pgfmathfloat@log@e}%
+}%
+\pgfutil@namelet{pgfmathfloatlog10}{pgfmathfloatlog10@}%
+
+\expandafter\def\csname pgfmathfloatlog2@\endcsname#1{%
+ \pgfmathfloatln@{#1}%
+ \let\pgfmathfloat@log@e=\pgfmathresult
+ \pgfmathfloatcreate{1}{1.44269504088896}{0}% 1/ln(2)
+ \pgfmathfloatmultiply@{\pgfmathresult}{\pgfmathfloat@log@e}%
+}%
+\pgfutil@namelet{pgfmathfloatlog2}{pgfmathfloatlog2@}%
+
+\expandafter\let\expandafter\pgfmathfloatlogtwo\csname pgfmathfloatlog2\endcsname
+\expandafter\let\expandafter\pgfmathfloatlogtwo@\csname pgfmathfloatlog2@\endcsname
+\expandafter\let\expandafter\pgfmathfloatlogten\csname pgfmathfloatlog10\endcsname
+\expandafter\let\expandafter\pgfmathfloatlogten@\csname pgfmathfloatlog10@\endcsname
+
+% Computes log(x) into \pgfmathresult.
+%
+% This allows numbers such at 10000000 or 5.23e-10 to be represented
+% properly, although TeX-registers would produce overflow/underflow
+% errors in these cases.
+%
+% The natural logarithm is computed using log(X*10^Y) = log(X) + log(10)*Y
+%
+% FIXME This routine is only kept for backwards compatibility!
+% It does not work as expected because
+% 1. it calls \pgfmathfloatparsenumber
+% 2. it returns the result as fixed point number
+% Use \pgfmathln@ instead!
+\def\pgfmathlog@#1{%
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathlog@float{\pgfmathresult}%
+}%
+\let\pgfmathlog=\pgfmathlog@
+\def\pgfmathlog@float#1{%
+ \begingroup%
+ % compute #1 = M*10^E with normalised mantissa M = [+-]*[1-9].XXXXX
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifnum\pgfmathfloat@a@S=1
+ % Now, compute log(#1) = log(M) + E*log(10)
+ \expandafter\pgfmath@basic@ln@\expandafter{\the\pgfmathfloat@a@Mtok}%
+ \pgfmathfloat@b@M=\pgfmathresult pt%
+ \pgfmathfloat@a@M=2.302585pt% = log(10)
+ \multiply\pgfmathfloat@a@M by\pgfmathfloat@a@E\relax
+ \advance\pgfmathfloat@b@M by\pgfmathfloat@a@M
+ \edef\pgfmathresult{\pgf@sys@tonumber{\pgfmathfloat@b@M}}%
+ \else
+ \let\pgfmathresult=\pgfutil@empty%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup%
+}%
+
+
+% Computes exp(#1) in floating point.
+%
+% The algorithm employs the identity
+% exp(x) = exp(x - log(10^k) + log(10^k)
+% = 10^k exp( x - k*log 10 )
+% with k chosen such that exp( x - k*log10) can be computed with the
+% basic level math engine.
+%
+% The precision (relative error) is between 10^{-4} and 10^{-6}. For
+% #1 = 700, it is even 10^{-3}. I will need to improve that someday.
+\def\pgfmathfloatexp@#1{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S
+ % #1 = 0:
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \or% #1 > 0
+ \pgfmathfloatexp@@{#1}%
+ \or% #1 < 0
+ \pgfmathfloatexp@@{#1}%
+ \else
+ \edef\pgfmathresult{#1}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\def\pgfmathfloatexp@@#1{%
+ % Employ the identity
+ % exp(x) = exp(x - log(10^k) + log(10^k)) = 10^k exp( x - k *log(10))
+ %
+ % I'd like to have x - k*log(10) <= 1
+ % => compute k := int( (x - 1) * 1/log(10) )
+ % that should suffice since \pgfmathexp@ should be
+ % accurate enough for those numbers.
+ %
+ % please note that we can do all this in TeX registers.
+ % exp(700) is almost the maximum of double precision
+ % anyway, and exp(16000) is certainly the largest we will
+ % ever need.
+ \pgfmathfloattofixed@{#1}%
+ \pgf@xa=\pgfmathresult pt
+ \pgf@xa=0.434294481\pgf@xa\relax
+ \edef\pgfmathfloat@loc@TMPa{\pgf@sys@tonumber{\pgf@xa}}%
+ \expandafter\pgfmathfloatexp@@toint\pgfmathfloat@loc@TMPa\relax
+ \pgf@xa=2.302585092pt
+ \multiply\pgf@xa by-\pgfmathfloat@k\relax
+ \advance\pgf@xa by\pgfmathresult pt
+ \edef\pgfmathfloat@loc@TMPa{\pgf@sys@tonumber{\pgf@xa}}%
+%\message{computing exp(\pgfmathresult) = 10^\pgfmathfloat@k * exp(\pgfmathfloat@loc@TMPa)...}%
+ \pgfmath@basic@exp@{\pgfmathfloat@loc@TMPa}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloatparsenumber{\pgfmathfloat@loc@TMPa}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloatshift@{\pgfmathfloat@loc@TMPa}{\pgfmathfloat@k}%
+}%
+% determine 'k'. This is a heuristics. The exponential series
+% converges best for |x| <= 1. However, the fixed point arithmetics
+% for tex results in best results for large |x|. Well, I'll need to
+% tune this here.
+\def\pgfmathfloatexp@@toint#1.#2\relax{%
+ \c@pgf@counta=#1\relax
+ \ifnum\c@pgf@counta<0
+\advance\c@pgf@counta by-1 % FIXME . this is a test for optimizations.
+ \c@pgf@countb=#2\relax
+ \ifnum\c@pgf@countb>0
+ \advance\c@pgf@counta by-1
+ \fi
+ \fi
+ \edef\pgfmathfloat@k{\the\c@pgf@counta}%
+}%
+\let\pgfmathfloatexp=\pgfmathfloatexp@
+
+\def\pgfmathfloatround@#1{%
+ \begingroup
+ \pgfkeysvalueof{/pgf/number format/precision/.@cmd}0\pgfeov
+ \pgfmathfloattofixed{#1}%
+ \pgfmathroundto{\pgfmathresult}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+
+\def\pgfmathfloatneg@#1{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S\relax
+ % 0:
+ \edef\pgfmathresult{#1}%
+ \or
+ % +:
+ \pgfmathfloatcreate{2}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \or
+ % -:
+ \pgfmathfloatcreate{1}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \or
+ % nan:
+ \edef\pgfmathresult{#1}%
+ \or
+ % +infty:
+ \pgfmathfloatcreate{5}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \or
+ % -infty:
+ \pgfmathfloatcreate{4}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+
+\def\pgfmathfloatpow@#1#2{%
+ \begingroup%
+ \expandafter\pgfmathfloat@decompose@tok#2\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S\relax
+ % #1 ^ 0 = 1
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \or
+ % #2 > 0
+ \pgfmathfloatpow@@{#1}{#2}%
+ \or
+ % #2 < 0
+ \pgfmathfloatpow@@{#1}{#2}%
+ \or
+ % #2 = nan
+ \edef\pgfmathresult{#2}%
+ \or
+ % #2 = inf
+ \edef\pgfmathresult{#2}%
+ \or
+ % #2 = -inf
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+% computes #1^#2
+% PRECONDITIONS
+% - #2 is positive.
+\def\pgfmathfloatpow@@#1#2{%
+ \pgfmathfloattofixed@{#2}%
+ \afterassignment\pgfmath@x%
+ \expandafter\c@pgfmath@counta\pgfmathresult pt\relax%
+ \ifdim\pgfmath@x=0pt %
+ % loop "manually"; we have an integer exponent!
+ \ifnum\c@pgfmath@counta<0
+ \pgfmathfloatreciprocal@{#1}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \c@pgfmath@counta=-\c@pgfmath@counta
+ \else
+ \edef\pgfmathfloat@loc@TMPa{#1}%
+ \fi
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \let\pgfmathfloat@loc@TMPb=\pgfmathresult
+ \pgfmathloop
+ \ifnum\c@pgfmath@counta>0\relax%
+ \ifodd\c@pgfmath@counta%
+ \pgfmathfloatmultiply@{\pgfmathfloat@loc@TMPb}{\pgfmathfloat@loc@TMPa}%
+ \let\pgfmathfloat@loc@TMPb=\pgfmathresult
+ \fi
+ \ifnum\c@pgfmath@counta>1\relax%
+ \pgfmathfloatmultiply@{\pgfmathfloat@loc@TMPa}{\pgfmathfloat@loc@TMPa}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \fi%
+ \divide\c@pgfmath@counta by2\relax%
+ \repeatpgfmathloop%
+ \else
+ \pgfmathfloatgetflags{#1}\c@pgfmath@counta
+ \ifnum0=\c@pgfmath@counta
+ % ah: 0^x
+ \pgfmathfloatgetflags{#2}\c@pgfmath@counta
+ \ifnum0=\c@pgfmath@counta
+ % ah: 0^0
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \else
+ % ah: 0^x with x!=0:
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \fi
+ \else
+ % employ #1^#2 = exp( #2 * ln(#1) )
+ \pgfmathfloatln@{#1}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \edef\pgfmathfloat@loc@TMPb{#2}%
+ \pgfmathfloatmultiply@{\pgfmathfloat@loc@TMPa}{\pgfmathfloat@loc@TMPb}%
+ \pgfmathfloatexp@{\pgfmathresult}%
+ \fi
+ \fi
+}%
+
+\def\pgfmathfloat@definemethodfrombasic@NOARG#1{%
+ \pgfutil@ifundefined{pgfmath@basic@#1@}{%
+ \pgfutil@namelet{pgfmath@basic@#1@}{pgfmath#1@}%
+ }{}%
+ \edef\pgfmathfloat@glob@TMP{%
+ \expandafter\noexpand\csname pgfmath@basic@#1@\endcsname
+ \noexpand\pgfmathfloatparsenumber{\noexpand\pgfmathresult}%
+ }%
+ \expandafter\let\csname pgfmathfloat#1@\endcsname=\pgfmathfloat@glob@TMP%
+ \expandafter\let\csname pgfmathfloat#1\endcsname=\pgfmathfloat@glob@TMP%
+}%
+\def\pgfmathfloat@definemethodfrombasic@ONEARG#1{%
+ \pgfutil@ifundefined{pgfmath@basic@#1@}{%
+ \pgfutil@namelet{pgfmath@basic@#1@}{pgfmath#1@}%
+ }{}%
+ \edef\pgfmathfloat@glob@TMP##1{%
+ \noexpand\pgfmathfloattofixed{##1}%
+ \noexpand\expandafter
+ \expandafter\noexpand\csname pgfmath@basic@#1@\endcsname\noexpand\expandafter%
+ {\noexpand\pgfmathresult}%
+ \noexpand\pgfmathfloatparsenumber{\noexpand\pgfmathresult}%
+ }%
+ \expandafter\let\csname pgfmathfloat#1@\endcsname=\pgfmathfloat@glob@TMP%
+ \expandafter\let\csname pgfmathfloat#1\endcsname=\pgfmathfloat@glob@TMP%
+}%
+\def\pgfmathfloat@definemethodfrombasic@TWOARGS#1{%
+ \pgfutil@ifundefined{pgfmath@basic@#1@}{%
+ \pgfutil@namelet{pgfmath@basic@#1@}{pgfmath#1@}%
+ }{}%
+ \edef\pgfmathfloat@glob@TMP##1##2{%
+ \noexpand\pgfmathfloattofixed{##2}%
+ \noexpand\let\noexpand\pgfmathfloat@loc@TMPa=\noexpand\pgfmathresult
+ \noexpand\pgfmathfloattofixed{##1}%
+ \noexpand\expandafter
+ \expandafter\noexpand\csname pgfmath@basic@#1@\endcsname\noexpand\expandafter%
+ {\noexpand\pgfmathresult}{\noexpand\pgfmathfloat@loc@TMPa}%
+ \noexpand\pgfmathfloatparsenumber{\noexpand\pgfmathresult}%
+ }%
+ \expandafter\let\csname pgfmathfloat#1@\endcsname=\pgfmathfloat@glob@TMP%
+ \expandafter\let\csname pgfmathfloat#1\endcsname=\pgfmathfloat@glob@TMP%
+}%
+\pgfmathfloat@definemethodfrombasic@NOARG{rand}%
+\pgfmathfloat@definemethodfrombasic@NOARG{rnd}%
+\pgfmathfloat@definemethodfrombasic@NOARG{false}%
+\pgfmathfloat@definemethodfrombasic@NOARG{true}%
+% arcsin, arccos
+\pgfmathfloat@definemethodfrombasic@ONEARG{asin}%
+\pgfmathfloat@definemethodfrombasic@ONEARG{acos}%
+\pgfmathfloat@definemethodfrombasic@ONEARG{not}%
+\pgfmathfloat@definemethodfrombasic@ONEARG{hex}%
+\pgfmathfloat@definemethodfrombasic@ONEARG{Hex}%
+\pgfmathfloat@definemethodfrombasic@ONEARG{oct}%
+\pgfmathfloat@definemethodfrombasic@ONEARG{bin}%
+\pgfmathfloat@definemethodfrombasic@TWOARGS{and}%
+\pgfmathfloat@definemethodfrombasic@TWOARGS{or}%
+
+\pgfutil@ifundefined{pgfmathdeclarefunction}{%
+ % special treatment: \pgfmathrand@ was not properly defined for pgf 2.00:
+ \let\pgfmath@basic@rand=\pgfmathrand
+ \let\pgfmath@basic@rand@=\pgfmathrand@
+ \def\pgfmathfloatrand@{%
+ \pgfmath@basic@rand
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ }%
+ \let\pgfmathfloatrand=\pgfmathfloatrand@%
+ %
+ % special treatment: \pgfmathrnd@ was not properly defined for pgf 2.00:
+ \let\pgfmath@basic@rnd=\pgfmathrnd
+ \let\pgfmath@basic@rnd@=\pgfmathrnd@
+ \def\pgfmathfloatrnd@{%
+ \pgfmath@basic@rnd
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ }%
+ \let\pgfmathfloatrnd=\pgfmathfloatrnd@%
+}{}%
+
+% Implements the factorial of '#1'.
+% This does only work if '#1 < 2^32'.
+\def\pgfmathfloatfactorial@#1{%
+ \begingroup
+ \pgfmathfloattofixed{#1}%
+ % collect integer part into a 32 bit register:
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgfmath@counta\pgfmathresult\relax\pgfmath@%
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathloop
+ \ifnum\c@pgfmath@counta<2 %
+ \else
+ \expandafter\pgfmathfloatparsenumber\expandafter{\the\c@pgfmath@counta}%
+ \expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfmathfloat@loc@TMPa}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \advance\c@pgfmath@counta by-1\relax%
+ \repeatpgfmathloop
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+% Implements the vector length of a 2D vector.
+%
+% ATTENTION: this does NOT use the improved code of the basic layer!
+% It simply computed sqrt( #1^2 + #2^2 )!
+\def\pgfmathfloatveclen@#1#2{%
+ \begingroup
+ \edef\pgfmathfloat@@a{#1}%
+ \pgfmathfloatmultiply@{\pgfmathfloat@@a}{\pgfmathfloat@@a}%
+ \let\pgfmathfloat@@a=\pgfmathresult
+ %
+ \edef\pgfmathfloat@@b{#2}%
+ \pgfmathfloatmultiply@{\pgfmathfloat@@b}{\pgfmathfloat@@b}%
+ \let\pgfmathfloat@@b=\pgfmathresult
+ %
+ \pgfmathfloatadd@{\pgfmathfloat@@a}{\pgfmathfloat@@b}%
+ \pgfmathfloatsqrt@{\pgfmathresult}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+\def\pgfmathfloatcosh@#1{%
+ \begingroup
+ \pgfmathfloatexp@{#1}%
+ \let\pgfmathfloat@@a=\pgfmathresult
+ %
+ \pgfmathfloatneg@{#1}%
+ \pgfmathfloatexp@{\pgfmathresult}%
+ %
+ \pgfmathfloatadd@{\pgfmathresult}{\pgfmathfloat@@a}%
+ \expandafter\pgfmathfloatmultiplyfixed@\expandafter{\pgfmathresult}{0.5}%
+ %
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\def\pgfmathfloatsinh@#1{%
+ \begingroup
+ \pgfmathfloatexp@{#1}%
+ \let\pgfmathfloat@@a=\pgfmathresult
+ %
+ \pgfmathfloatneg@{#1}%
+ \pgfmathfloatexp@{\pgfmathresult}%
+ %
+ \pgfmathfloatsubtract@{\pgfmathfloat@@a}{\pgfmathresult}%
+ \expandafter\pgfmathfloatmultiplyfixed@\expandafter{\pgfmathresult}{0.5}%
+ %
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\def\pgfmathfloattanh@#1{%
+ \begingroup
+ \pgfmathfloatsinh@{#1}%
+ \let\pgfmathfloat@@a=\pgfmathresult
+ %
+ \pgfmathfloatcosh@{#1}%
+ \let\pgfmathfloat@@b=\pgfmathresult
+ %
+ \pgfmathfloatdivide@{\pgfmathfloat@@a}{\pgfmathfloat@@b}%
+ %
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarygraphdrawing.circular.code.tex b/graphics/pgf/base/tex/pgflibrarygraphdrawing.circular.code.tex
new file mode 100644
index 0000000000..cdcd7a54cb
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarygraphdrawing.circular.code.tex
@@ -0,0 +1,16 @@
+% Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+% Copyright 2011 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarygraphdrawing.circular.code.tex}
+
+
+\usegdlibrary{circular}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarygraphdrawing.code.tex b/graphics/pgf/base/tex/pgflibrarygraphdrawing.code.tex
new file mode 100644
index 0000000000..385c970595
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarygraphdrawing.code.tex
@@ -0,0 +1,1165 @@
+% Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+% Copyright 2011 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarygraphdrawing.code.tex}
+
+
+
+% check if luatex is running
+
+\ifx\directlua\relax%
+ \pgferror{You need to run LuaTeX to use the graph drawing library}
+ \expandafter\endinput
+\fi
+\ifx\directlua\undefined%
+ \pgferror{You need to run LuaTeX to use the graph drawing library}
+ \expandafter\endinput
+\fi
+
+
+
+
+%
+% All graph drawing keys normally live in the following namespace:
+% /graph drawing.
+%
+
+\def\pgfgdset{\pgfqkeys{/graph drawing}}%
+
+
+% Setup a key
+%
+% #1 = key
+%
+% Description:
+%
+% An internal macro that sets up #1 as a graph drawing key.
+
+\def\pgfgd@callbackkey#1{%
+ \pgf@gd@setup@forwards{#1}%
+ \pgfutil@g@addto@macro\pgf@gd@forwards@list{\pgf@gd@setup@forwards{#1}}%
+}%
+\def\pgf@gd@setup@forwards#1{%
+ \let\pgf@temp\pgfutil@empty
+ \foreach \pgf@gd@path in \pgf@gd@forwarding@list {%
+ \ifx\pgf@gd@path\pgfutil@empty\else%
+ \expandafter\pgfutil@g@addto@macro%
+ \expandafter\pgf@temp\expandafter{%
+ \expandafter\pgfkeys\expandafter{\pgf@gd@path#1/.forward to=/graph drawing/#1}}%
+ \fi%
+ }%
+ \pgf@temp
+}%
+
+\let\pgf@gd@forwards@list\pgfutil@empty
+
+
+% Append to the forwarding list:
+%
+% #1 = paths to append to the forwarding list
+%
+% Description:
+%
+% Append the paths in #1 (with trailing slashes) to the forwarding
+% list.
+%
+% If algorithms have already been declared, forwarding will also be
+% setup for them (using a bit of magic...).
+
+\def\pgfgdappendtoforwardinglist#1{%
+ \let\pgf@gd@forwarding@list@orig\pgf@gd@forwarding@list
+ \def\pgf@gd@forwarding@list{#1}%
+ \pgf@gd@forwards@list%
+ \expandafter\def\expandafter\pgf@gd@forwarding@list\expandafter{\pgf@gd@forwarding@list@orig,#1}%
+}%
+\let\pgf@gd@forwarding@list\pgfutil@empty
+
+
+
+%
+%
+% Callbacks
+%
+% The following macros are called *from* the binding layer. You do not
+% call them from the pgf layer.
+%
+%
+
+
+% Callback for declaring a graph parameter key
+%
+% #1 = Parameter key
+% #2 = Parameter type
+%
+% Description:
+%
+% When a graph drawing algorithm starts working, a set of options,
+% called "graph drawing parameters" in the following, can influence the
+% way the algorithm works. For instance, an graph drawing parameter
+% might be the average distance between vertices which the algorithm
+% should take into account. Another example might be the fact the
+% certain nodes are special nodes and that a certain edge should have
+% a large label.
+%
+% These graph drawing parameters are different from "usual" pgf
+% options: An algorithmic parameter influenced the way the algorithm
+% works, while usual options normally only influence how the result
+% looks like. For instance, the fact that a node is red is not an
+% graph drawing parameter (usually, at least), while the shape of a node
+% might be an graph drawing parameter.
+%
+% Graph drawing parameters are declared by the algorithmic layer
+% (since only this layer "knows" which parameters there are). The
+% binding to TeX will call the \pgfgddeclareparameter function
+% internally.
+%
+% Specifying the set of graph drawing parameters for a given graph or
+% node or edge works as follows: When the graph drawing engine is
+% started for a graph (using \pgfgdbeginscope), a snapshot is taken of
+% all graph drawing parameters currently setup at this
+% point. Similarly, when a node is created inside such a scope, a
+% snapshot is taken of the set of all graph drawing parameters in
+% force at this point is taken and stored together with the
+% node. Finally, when an edge is created, a snapshot of the setting of
+% the graph drawing parameters is taken.
+
+\def\pgfgdcallbackdeclareparameter#1#2{%
+ \pgfkeysdef{/graph drawing/#1}{\pgf@gd@handle@parameter{#1}{#2}{##1}}%
+ \pgfgd@callbackkey{#1}%
+}%
+\def\pgf@gd@handle@parameter#1#2#3{%
+ \def\pgf@temp{#3}%
+ \ifx\pgf@temp\pgfkeysnovalue@text%
+ \let\pgfgdresult\pgfgd@niltext%
+ \else%
+ \pgfkeys{/graph drawing/conversions/#2={#3}}%
+ \fi%
+ \advance\pgf@gd@parameter@stack@height by1\relax%
+ \pgf@gd@parameter@stack@height\directlua{%
+ local new, main = pgf.gd.interface.InterfaceToDisplay.pushOption('\pgfutil@luaescapestring{#1}',\pgfgdresult,\the\pgf@gd@parameter@stack@height)
+ tex.print(new..'\pgfutil@luaescapestring{\relax}')
+ if main then
+ tex.print('\pgfutil@luaescapestring{\noexpand\pgfgdtriggerrequest}')
+ end}%
+}%
+\newcount\pgf@gd@parameter@stack@height
+
+\def\pgfgdtriggerrequest{\pgfgdset{@request scope and layout}}%
+
+
+% Conversions are used to adapt the syntactic description of a
+% parameter on the TikZ layer to the one expected by Lua. The set of
+% permissible conversions is described in
+% InterfaceToAlgorithms.declareParameter.
+
+\pgfgdset{
+ conversions/string/.code=\def\pgfgdresult{'\pgfutil@luaescapestring{\detokenize{#1}}'},
+ conversions/raw/.code=\def\pgfgdresult{#1},
+ conversions/nil/.code=\let\pgfgdresult\pgfgd@niltext,
+ conversions/boolean/.code=\def\pgf@test{#1}\ifx\pgf@test\pgf@truetext\def\pgfgdresult{true}\else\ifx\pgf@test\pgfkeysnovalue@text\def\pgfgdresult{true}\else\def\pgfgdresult{false}\fi\fi,
+ conversions/number/.code=\pgfmathparse{#1}\let\pgfgdresult\pgfmathresult,
+ conversions/length/.code=\pgfmathparse{#1}\let\pgfgdresult\pgfmathresult,
+ conversions/time/.code=\pgfparsetime{#1}\let\pgfgdresult\pgftimeresult,
+ conversions/direction/.code=\pgf@lib@gd@grow@dir{#1}\let\pgfgdresult\pgfmathresult,
+ conversions/canvas coordinate/.code args={(#1pt,#2pt)}{\edef\pgfgdresult{pgf.gd.model.Coordinate.new(#1,#2)}},
+ % deprecated, will be removed:
+ conversions/coordinate/.code args={(#1pt,#2pt)}{\edef\pgfgdresult{{#1,#2}}}
+}%
+\def\pgf@truetext{true}%
+\def\pgfgd@niltext{nil}%
+
+\def\pgf@lib@gd@grow@dir#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@gd@lib@active@bar%
+ \def\pgfmathresult{-90}
+ \else%
+ \ifcsname pgf@orient@direction@#1\endcsname%
+ \expandafter\let\expandafter\pgfmathresult\csname pgf@orient@direction@#1\endcsname%
+ \else
+ \pgfmathparse{#1}%
+ \fi
+ \fi
+}%
+
+\def\pgf@orient@direction@down{-90}%
+\def\pgf@orient@direction@up{90}%
+\def\pgf@orient@direction@left{180}%
+\def\pgf@orient@direction@right{0}%
+
+\def\pgf@orient@direction@south{-90}%
+\def\pgf@orient@direction@north{90}%
+\def\pgf@orient@direction@west{180}%
+\def\pgf@orient@direction@east{0}%
+
+\expandafter\def\csname pgf@orient@direction@north east\endcsname{45}%
+\expandafter\def\csname pgf@orient@direction@north west\endcsname{135}%
+\expandafter\def\csname pgf@orient@direction@south east\endcsname{-45}%
+\expandafter\def\csname pgf@orient@direction@south west\endcsname{-135}%
+
+\expandafter\def\csname pgf@orient@direction@-\endcsname{0}%
+\expandafter\def\csname pgf@orient@direction@|\endcsname{-90}%
+
+{%
+ \catcode`\|=13
+ \gdef\pgf@gd@lib@active@bar{|}%
+}%
+
+
+
+
+
+% Callback for starting the rendering of a collection kind
+%
+% #1 = Kind
+% #2 = Layer
+%
+% Description:
+%
+% Executes /graph drawing/#1/begin rendering/.try
+%
+
+\def\pgfgdcallbackrendercollectionkindstart#1#2{%
+ \ifnum#2<0\relax
+ \setbox\pgf@gd@prekind@box=\hbox\bgroup%
+ \unhbox\pgf@gd@prekind@box%
+ \else%
+ \setbox\pgf@gd@postkind@box=\hbox\bgroup%
+ \unhbox\pgf@gd@postkind@box%
+ \fi%
+ \pgfgdset{/graph drawing/#1/begin rendering/.try}%
+}%
+
+% Callback for ending the rendering of a collection kind
+%
+% #1 = Kind
+% #2 = Layer
+%
+% Description:
+%
+% Executes /graph drawing/#1/end rendering/.try
+%
+
+\def\pgfgdcallbackrendercollectionkindstop#1#2{%
+ \pgfgdset{/graph drawing/#1/end rendering/.try}%
+ \egroup % close box
+}%
+
+
+
+% Callback for rendering a collection
+%
+% #1 = Kind
+% #2 = Options
+%
+% Description:
+%
+% Executes /graph drawing/#1/render/.try={#2}
+%
+
+\def\pgfgdcallbackrendercollection#1#2{
+ \pgfgdset{/graph drawing/#1/render/.try={#2}}
+}%
+
+
+
+
+
+% Graph events
+%
+% Although a graph consists of nodes and edges, during the
+% construction of the graph a lot of information concerning the
+% structure of the graph is often available. For instance, as we
+% specify a graph using the child-syntax, we do not only which edges
+% are present, but we can implicitly specify an ordering on the
+% nodes. Even more, there is even information available concerning
+% nodes that are not present at all: A child[missing] is not present
+% as a node or an edge, but a tree drawing algorithm will want to know
+% about this child nevertheless.
+%
+% In order to communicate such information to the graph drawing
+% engine, "events" are used. As a graph is created, in addition to
+% nodes and edges, "events" may happen. The events come in a
+% sequential order and they are stored together with the graph. For
+% each node and each edge, its index in the event sequence is
+% stored, that is, it is stored how many events happened before the
+% node or edge was created.
+%
+% Internally, an event consists of a name and, possibly, some
+% parameters. When the parameter is created on the tikz level, it will
+% be a string that is passed down to Lua. Internally created events
+% will also have parameters that are objects.
+%
+% Two events are a bit special since they get special internal
+% support: The begin and end events. The first signals that some kind
+% of group has started; which is closed by the corresponding end
+% event. The "kind" of group is indicated by the parameter of the
+% begin event.
+%
+%
+%
+% Standard events are:
+%
+% For each node entered into a graph, a "node" event is automatically
+% created internally with the parameter being the node. However, you
+% can also create this event yourself. In this case, the parameter
+% will be a string and will mean that the node is "virtual" or
+% "missing", but space should be reserved for it, if possible (this is
+% use, for instance, by certain tree layouts).
+%
+% For each edge entered into a graph, an "edge" event is automatically
+% created, with the edge as the parameter. Again, an event with a
+% string parameter corresponds to a "non-existing" node.
+%
+%
+% Standard event groups are:
+%
+%
+% The "descendants" event group include a set of nodes that, at least
+% inside the specification, are descendants of the last node
+%
+% begin descendants
+% ...
+% end
+%
+%
+% The "array" event group collects together some nodes in an array of
+% nodes. This can be used, for instance, to specify matrices.
+%
+% begin array
+% ...
+% end
+
+
+
+% Create a new event
+%
+% #1 = event name (should be a valid lua identifier name)
+% #2 = parameter (some text)
+%
+% Description:
+%
+% Adds a new event to the event sequence of the graph
+
+\def\pgfgdevent#1#2{%
+ \directlua{pgf.gd.interface.InterfaceToDisplay.createEvent('\pgfutil@luaescapestring{#1}', '\pgfutil@luaescapestring{#2}')}%
+}%
+
+
+% Start an event group
+%
+% #1 = kind of event group
+%
+% Description:
+%
+% Creates a begin event with #1 as the parameter of the begin
+% event.
+
+\def\pgfgdbegineventgroup#1{%
+ \pgfgdevent{begin}{#1}%
+}%
+
+% End an event group
+%
+% Description:
+%
+% Creates an end event.
+
+\def\pgfgdendeventgroup{%
+ \pgfgdevent{end}{}%
+}%
+
+
+% Creates an event group for the current TeX group
+%
+% #1 = event group name
+%
+% Description:
+%
+% Issues a begin event for #1 and, using \aftergroup, adds an end
+% event at the end of the current tex group.
+
+\def\pgfgdeventgroup#1{%
+ \pgfgdbegineventgroup{#1}%
+ \aftergroup\pgfgdendeventgroup%
+}%
+
+
+
+
+
+%
+% Nodes
+%
+
+
+
+%
+% Callback method for \pgfpositionnodelater
+%
+% This function is called by \pgfnode whenever a node has been newly
+% created inside a graph drawing scope. It will create a new vertex on
+% the Lua layer.
+%
+\def\pgf@gd@positionnode@callback{%
+ {%
+ % evaluate coordinates
+ \pgfmathsetmacro{\pgf@gd@node@minx}{\pgfpositionnodelaterminx}%
+ \pgfmathsetmacro{\pgf@gd@node@miny}{\pgfpositionnodelaterminy}%
+ \pgfmathsetmacro{\pgf@gd@node@maxx}{\pgfpositionnodelatermaxx}%
+ \pgfmathsetmacro{\pgf@gd@node@maxy}{\pgfpositionnodelatermaxy}%
+ % Assemble the Path object:
+ \directlua{pgf.temp = require 'pgf.gd.model.Path'.new ()}%
+ \let\pgfsyssoftpath@movetotoken\pgf@gd@movetotoken%
+ \let\pgfsyssoftpath@linetotoken\pgf@gd@linetotoken%
+ \let\pgfsyssoftpath@rectcornertoken\pgf@gd@rectcornertoken%
+ \let\pgfsyssoftpath@curvetosupportatoken\pgf@gd@curvetosupportatoken%
+ \let\pgfsyssoftpath@closepathtoken\pgf@gd@closepathtoken%
+ \pgfpositionnodelaterpath%
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ %
+ {%
+ \pgf@process{\pgfpointanchor{\pgfpositionnodelatername}{center}}
+ \pgfsettransform{\csname pgf@sh@nt@\pgfpositionnodelatername\endcsname}%
+ \pgf@pos@transform{\pgf@x}{\pgf@y}%
+ \global\pgf@x=\pgf@x%
+ \global\pgf@y=\pgf@y%
+ }%
+ % call lua system library to create a lua node object
+ \directlua{
+ pgf.gd.interface.InterfaceToDisplay.createVertex(
+ string.sub('\pgfutil@luaescapestring{\pgfpositionnodelatername}',30), % strip "not yet positionedPGFINTERNAL"
+ '\pgfutil@luaescapestring{\csname pgf@sh@ns@\pgfpositionnodelatername\endcsname}',
+ pgf.temp:pad((\pgf@sys@tonumber\pgf@xa+\pgf@sys@tonumber\pgf@ya)/2), % Padded path
+ \the\pgf@gd@parameter@stack@height, % Stack height
+ {% Binding info
+ x_min = \pgf@gd@node@minx,
+ y_min = \pgf@gd@node@miny,
+ x_max = \pgf@gd@node@maxx,
+ y_max = \pgf@gd@node@maxy,
+ tex_box_number = \pgfpositionnodelaterbox
+ },
+ {% Anchors
+ center = require 'pgf.gd.model.Coordinate'.new(\pgf@sys@tonumber\pgf@x,\pgf@sys@tonumber\pgf@y)
+ }
+ )
+ pgf.temp = nil
+ }
+ }%
+}%
+
+
+\def\pgf@gd@movetotoken#1#2{\directlua{pgf.temp:appendMoveto(\Pgf@geT#1,\Pgf@geT#2)}}%
+\def\pgf@gd@linetotoken#1#2{\directlua{pgf.temp:appendLineto(\Pgf@geT#1,\Pgf@geT#2)}}%
+\def\pgf@gd@rectcornertoken#1#2#3#4#5{%
+ \directlua{%
+ local x,y,dx,dy=\Pgf@geT#1,\Pgf@geT#2,\Pgf@geT#4,\Pgf@geT#5
+ pgf.temp:appendMoveto(x,y)
+ pgf.temp:appendLineto(x,y+dy)
+ pgf.temp:appendLineto(x+dx,y+dy)
+ pgf.temp:appendLineto(x+dx,y)
+ pgf.temp:appendClosepath()%
+ }%
+}%
+\def\pgf@gd@curvetosupportatoken#1#2#3#4#5#6#7#8{\directlua{pgf.temp:appendCurveto(\Pgf@geT#1,\Pgf@geT#2,\Pgf@geT#4,\Pgf@geT#5,\Pgf@geT#7,\Pgf@geT#8)}}%
+\def\pgf@gd@closepathtoken#1#2{\directlua{pgf.temp:appendClosepath()}}%
+
+
+% Set options for an already existing node
+%
+% #1 = node name
+%
+% These node parameters of #1 will be updated with the current values
+% of the node parameters. The node #1 must previously have been passed
+% to the gd engine. If some of the options have already been set for
+% the node, these settings will be overruled.
+
+\def\pgfgdsetlatenodeoption#1{%
+ \directlua{
+ pgf.gd.interface.InterfaceToDisplay.addToVertexOptions('\pgfutil@luaescapestring{#1}',\the\pgf@gd@parameter@stack@height)
+ }
+}%
+
+
+
+%
+% A callback for rendering (finally positioning) a node
+%
+% #1 = name of the node
+% #2 = x min of the bounding box
+% #3 = x max of the bounding box
+% #4 = y min of the bounding box
+% #5 = y max of the bounding box
+% #6 = desired x pos of the node
+% #7 = desired y pos of the node
+% #8 = box register number of the TeX node
+% #9 = animation code
+%
+% This callback will be called by the engine for every original node
+% when it finally needs to placed at a final position.
+
+\def\pgfgdcallbackrendernode#1#2#3#4#5#6#7#8#9{%
+ {%
+ \def\pgfpositionnodelatername{#1}
+ \def\pgfpositionnodelaterminx{#2}
+ \def\pgfpositionnodelatermaxx{#3}
+ \def\pgfpositionnodelaterminy{#4}
+ \def\pgfpositionnodelatermaxy{#5}
+ \directlua{pgf.gd.interface.InterfaceCore.binding:retrieveBox(#8,\pgfpositionnodelaterbox)}
+ \def\pgf@temp{#9}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \pgfpositionnodenow{\pgfqpoint{#6}{#7}}%
+ \else%
+ \pgfset{every graphdrawing animation/.try}%
+ \pgfset{every graphdrawing node animation/.try}%
+ #9%
+ \pgfuseid{pgf@gd}%
+ \pgfidscope%
+ \pgfpositionnodenow{\pgfqpoint{#6}{#7}}%
+ \endpgfidscope%
+ \fi%
+ }%
+}%
+
+\ifx\pgfanimateattribute\pgfutil@undefined
+ \def\pgfanimateattribute#1#2{\tikzerror{You need to say \string\usetikzlibrary{animations} for animated graphs}}%
+\fi
+
+
+% Adds an edge to the graph
+%
+% #1 = first node
+% #2 = second node
+% #3 = edge direction
+% #4 = edge options (will be executed in a protected environment)
+% #5 = aux stuff (curtesy for TikZ -- edge nodes)
+%
+% Description:
+%
+% Creating an edge means that you tell the graph drawing algorithm
+% that #1 and #2 are connected. The "kind" of connection is indicated
+% by #3, which may be one of the following:
+%
+% -> = a directed edge (also known as an arc) from #1 to #2
+% -- = an undirected edge between #1 and #2
+% <- = a directed edge from #2 to #1, but with the "additional hint"
+% that this is a "backward" edge. A graph drawing algorithm may
+% or may not take this hint into account
+% <-> = a bi-directed edge between #1 and #2.
+%
+%
+% The parameters #4 and #5 are a bit more tricky. When an edge between
+% two vertices of a graph is created via \pgfgdedge, nothing is
+% actually done immediately. After all, without knowing the final
+% positions of the nodes #1 and #2, there is no way of
+% creating the actual drawing commands for the edge. Thus, the actual
+% drawing of the edge is done only when the graph drawing algorithm is
+% done (namely in the macro \pgfgdcallbackedge, see later).
+%
+% Because of this "delayed" drawing of edges, options that influence
+% the edge must be retained until the moment when the edge is actually
+% drawn. Parameters #4 and #5 store such options.
+%
+% Let us start with #4. This parameter should be set to a list of
+% key-value pairs like
+%
+% /tikz/.cd, color=red, very thick, this edge must be vertical
+%
+% Some of these options may be of interest to the graph drawing
+% algorithm (like the last option) while others will
+% only be important during the drawing of edge (like the first
+% option). The options that are important for the graph drawing
+% algorithm must be passed to the algorithm via setting keys that have
+% been declared using the handler .edge parameter (see
+% above).
+%
+% The tricky part is that options that are of interest to the graph
+% drawing algorithm must be executed *before* the algorithm starts,
+% but the options as a whole are usually only executed during the
+% drawing of the edges, which is *after* the algorithm has finished.
+%
+% To overcome this problem, the following happens:
+%
+% The options in #4 are executed "tentatively" inside
+% \pgfgdedge. However, this execution is done in a "heavily guarded
+% sandbox" where all effects of the options (like changing the
+% color or the line width) do not propagate beyond the sandbox. Only
+% the changes of the graph drawing edge parameters leave the
+% sandbox. These parameters are then passed down to the graph drawing
+% engine.
+%
+% Later, when the edge is drawn using \pgfgdcallbackedge, the options #4
+% are available once more and then they are executed normally.
+%
+% Note that when the options in #4 are executed, no path is
+% preset. Thus, you typically need to start it with, say, /tikz/.cd.
+%
+%
+% The text in #5 is some "auxiliary" text that is simply stored away
+% and later directly to \pgfgdcallbackedge. This is a curtesy to TikZ,
+% which can use it to store its node labels.
+%
+% Example:
+%
+% \pgfgdedge{A}{B}{->}{red}{}
+%
+\def\pgfgdedge#1#2#3#4#5{%
+ % Ok, setup sandbox
+ \begingroup%
+ \setbox0=\hbox{{%
+ \pgfinterruptpath%
+ \pgfgdprepareedge%
+ \pgfkeys{#4}%
+ % create edge in Lua
+ \toks0={#4}%
+ \toks1={#5}%
+ \directlua{
+ pgf.gd.interface.InterfaceToDisplay.createEdge(
+ '\pgfutil@luaescapestring{#1}','\pgfutil@luaescapestring{#2}','\pgfutil@luaescapestring{#3}',
+ \the\pgf@gd@parameter@stack@height,
+ { pgf_options = '\pgfutil@luaescapestring{\the\toks0}',
+ pgf_edge_nodes = '\pgfutil@luaescapestring{\the\toks1}',
+ })
+ }%
+ \endpgfinterruptpath%
+ }}%
+ \endgroup%
+}%
+
+\let\pgfgdprepareedge=\pgfutil@empty
+\def\pgfgdaddprepareedgehook#1{\expandafter\def\expandafter\pgfgdprepareedge\expandafter{\pgfgdprepareedge#1}}%
+
+
+\newif\ifpgf@gd@nodes@behind@edges
+
+
+
+% Define a callback for rendering edges
+%
+% #1 = macro name
+%
+% Descriptions:
+%
+% This is a callback from the graph drawing engine. At the end of the
+% creation of a graph, when the nodes have been positioned, this macro
+% is called once for each edge. The macro should take the following
+% parameters:
+%
+% #1 = from node, optionally followed by "." and the tail anchor
+% #2 = to node, optionally followed by "." and the head anchor
+% #3 = direction (<-, --, ->, or <->)
+% #4 = original options
+% #5 = aux text (typically edge nodes)
+% #6 = algorithm-generated options
+% #7 = bend information
+% #8 = animations
+%
+% The first five parameters are the original values that were passed
+% down to the \pgfgdedge command.
+%
+% #6 contains options that have been "computed by the algorithm". For
+% instance, an algorithm might have determined, say, flow capacities
+% for edges and it might now wish to communicate this information back
+% to the upper layers. These options should be executed with the path
+% /graph drawing.
+%
+% #7 contains algorithmically-computed information concerning how the
+% edge should bend. This will be a text like
+% "--(10pt,20pt)--(30pt,40pt)" in tikz-syntax, using the path
+% operations "--", "..controls" and "--cycle".
+%
+% By default, a simple line is drawn between the nodes. Usually, you
+% will wish to install a more "fancy" callback, here.
+
+\def\pgfgdsetedgecallback#1{\let\pgfgdcallbackedge=#1}%
+
+\def\pgfgddefaultedgecallback#1#2#3#4#5#6#7#8{%
+ {%
+ \def\pgf@temp{#8}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgfset{every graphdrawing animation/.try}%
+ \pgfset{every graphdrawing edge animation/.try}%
+ #8%
+ \pgfuseid{pgf@gd}%
+ \pgfidscope%
+ \fi%
+ \pgfscope
+ \pgfpathmoveto{
+ \pgfutil@in@.{#1}%
+ \ifpgfutil@in@
+ \pgf@gd@unravel#1\relax%
+ \else
+ \pgfpointshapeborder{#1}{\pgfpointanchor{#2}{center}}
+ \fi
+ }
+ \pgfpathlineto{
+ \pgfutil@in@.{#2}%
+ \ifpgfutil@in@
+ \pgf@gd@unravel#2\relax%
+ \else
+ \pgfpointshapeborder{#2}{\pgfpointanchor{#1}{center}}
+ \fi
+ }
+ \pgfusepath{stroke}
+ \endpgfscope
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \endpgfidscope%
+ \fi%
+ }
+}%
+
+\pgfgdsetedgecallback{\pgfgddefaultedgecallback}%
+
+\def\pgf@gd@unravel#1.#2\relax{%
+ \pgfpointanchor{#1}{#2}%
+}%
+
+
+
+
+% Callbacks: Called before the shipout of nodes and edges starts
+%
+% First, the general begin shipout is called. Then, the node shipout
+% starts, the nodes are created, and then the end of the node shipout
+% is signaled. Next, the edge shipout starts and ends. Finally, the
+% end shipout is called.
+
+\def\pgfgdcallbackbeginshipout{%
+ \pgfscope%
+ \catcode`\@=11\relax%
+ \setbox\pgf@gd@prekind@box=\box\pgfutil@voidb@x%
+ \setbox\pgf@gd@postkind@box=\box\pgfutil@voidb@x%
+}%
+\def\pgfgdcallbackendshipout{%
+ \box\pgf@gd@prekind@box%
+ \ifpgf@gd@nodes@behind@edges%
+ \box\pgf@gd@node@box%
+ \box\pgf@gd@edge@box%
+ \else%
+ \box\pgf@gd@edge@box%
+ \box\pgf@gd@node@box%
+ \fi%
+ \box\pgf@gd@postkind@box%
+ \endpgfscope
+}%
+
+\newbox\pgf@gd@node@box
+\newbox\pgf@gd@edge@box
+\newbox\pgf@gd@prekind@box
+\newbox\pgf@gd@postkind@box
+
+\def\pgfgdcallbackbeginnodeshipout{%
+ \setbox\pgf@gd@node@box=\hbox\bgroup%
+}%
+\def\pgfgdcallbackendnodeshipout{%
+ \egroup%
+}%
+
+\def\pgfgdcallbackbeginedgeshipout{%
+ \setbox\pgf@gd@edge@box=\hbox\bgroup%
+}%
+
+\def\pgfgdcallbackendedgeshipout{%
+ \egroup
+}%
+
+
+
+
+% Generate a node
+%
+% This callback is called from the engine whenever an algorithm
+% generates a new node internally.
+%
+% #1 = name of the node
+% #2 = shape of the node
+% #3 = options generated by the algorithm in key-value syntax. The set
+% of generated options is algorithm-dependent.
+% #4 = text
+%
+% This is an internal function and will be called by the binding layer
+
+\def\pgfgdcallbackcreatevertex#1#2#3#4{%
+ {
+ \pgfkeys{#3}
+ \pgfnode{#2}{\pgfkeysvalueof{/graph drawing/generated
+ node/anchor}}{#4}{#1}{\pgfkeysvalueof{/graph drawing/generated
+ node/use path}}
+ }
+}%
+
+\pgfkeys{
+ /graph drawing/generated node/anchor/.initial=center,
+ /graph drawing/generated node/use path/.initial=\pgfusepath{}
+}%
+
+
+
+%
+% Sublayouts
+%
+% Description: For a general introduction to (sub)layouts, see
+% Section~\ref{section-gd-sublayouts} in the manual.
+%
+
+\def\pgfgdbeginlayout{
+ \begingroup
+ \pgfgdlayoutscopeactivetrue
+ \advance\pgf@gd@parameter@stack@height by1\relax%
+ \directlua{pgf.gd.interface.InterfaceToDisplay.pushLayout(\the\pgf@gd@parameter@stack@height)}
+}%
+
+\def\pgfgdendlayout{
+ \endgroup%
+}%
+
+
+
+
+% Creates a subgraph node
+%
+% #1 = name
+% #2 = node options
+% #3 = node text
+%
+% Description:
+%
+% A subgraph node is a node that "surrounds" the nodes of a
+% subgraph. The special property of a subgraph node opposed to a
+% normal node is that it is created only after the subgraph has been
+% laid out. However, the difference to a collection like "hyper" is
+% that the node is available immediately as a normal node in the sense
+% that you can connect edges to it.
+%
+% What happens internally is that subgraph nodes get "registered"
+% immediately both on the pgf level and on the lua level, but the
+% actual node is only created inside the layout pipeline using a
+% callback. The actual node creation happens when the innermost layout
+% in which the subgraph node is declared has finished.
+%
+% When you create a subgraph node using this macro, you also start a
+% collection (of an internal kind) that stores the subgraph. All
+% following nodes in the current TeX scope will become part of this
+% collection.
+%
+% See |InterfaceToDisplay.pushSubgraphVertex| for details.
+
+\def\pgfgdsubgraphnode#1#2#3{%
+ \advance\pgf@gd@parameter@stack@height by1\relax%
+ {%
+ % create edge in Lua
+ \toks0={#2}%
+ \toks1={#3}%
+ \directlua{pgf.gd.interface.InterfaceToDisplay.pushSubgraphVertex%
+ ('\pgfutil@luaescapestring{#1}',\the\pgf@gd@parameter@stack@height,
+ {
+ shape = 'rectangle', % typically overwritten by the pgf_options:
+ pgf_options = '\pgfutil@luaescapestring{\the\toks0}',
+ text = '\pgfutil@luaescapestring{\the\toks1}',
+ })
+ }%
+ }
+}%
+
+\def\pgfgdsubgraphnodecontents#1{% helper function
+ \hbox to \pgfkeysvalueof{/graph drawing/subgraph bounding box width}{%
+ \vrule width0pt height\pgfkeysvalueof{/graph drawing/subgraph bounding box height}\hfil}%
+}%
+
+\pgfgdset{
+ subgraph point cloud/.initial=,
+ subgraph bounding box width/.initial=,
+ subgraph bounding box height/.initial=,
+}%
+
+
+%
+% Requests
+%
+% Description:
+%
+% This key is used to ``request'' a graph drawing scope and a
+% layout. The objective of this key is to make it easier for users and
+% algorithm designers to control the slightly involved
+% back-and-forth-calling between the different layers.
+%
+% This key does the following: When called inside a pgfpicture
+% (otherwise, the call is "illegal"), it will call a call-back with
+% two parameters. This callback will get passed some code that should
+% be executed at the beginning of ``the next scope'' and some code
+% that should be executed at the end of that scope.
+%
+% The code passed to the callbacks will have a different effect,
+% depending on whether we are currently inside a layout scope or not
+% (if no graph drawing scope is open, we are
+% not inside a layout). If we are not inside a layout scope (or if the
+% layout scope has been interrupted), the code will issue a
+% \pgfgdbeginscope command in the opening code and a corresponding
+% scope ending command in the closing code. Next, the two code pieces
+% always contain \pgfgdbeginlayout and \pgfgdendlayout.
+%
+% Note that the "@request scope and layout" key will not immediately
+% trigger a layout scope to be created; rather, the TikZ callback will
+% call it only at the beginning of the scope, which will be after
+% other options in the current list of options have been parsed. So,
+% when you write \graph [binary tree layout, significant sep=2em] ...,
+% the "significant sep" option has an effect despite being given
+% *after* the "@request scope and layout" key since the actual opening
+% of the scope happens only before the "..." part is parsed.
+
+\pgfgdset{@request scope and layout/.code=\pgfgd@requestcallback{\pgfgdbeginrequest}{\pgfgdendrequest}}%
+
+\def\pgfgd@requestcallback#1#2{%
+ #1\def\pgf@gd@after@request{#2\egroup}\bgroup\aftergroup\pgf@gd@after@request%
+}% Default for basic layer
+
+\def\pgfgdbeginrequest{%
+ \ifpgfgdlayoutscopeactive%
+ \else%
+ \expandafter\pgfgdbeginscope%
+ \fi%
+ \pgfgdbeginlayout%
+}%
+\def\pgfgdendrequest{%
+ \pgfgdendlayout%
+ \ifpgfgdlayoutscopeactive%
+ \else%
+ \expandafter\pgfgdendscope%
+ \fi%
+}%
+\newif\ifpgfgdlayoutscopeactive
+
+
+% Set the request callback
+%
+% #1 = A macro
+%
+% Description:
+%
+% Sets the request callback as described in the "@request scope and
+% layout" key.
+
+\def\pgfgdsetrequestcallback#1{\let\pgfgd@requestcallback#1}%
+
+
+
+
+%
+% An if that is true exactly if we are inside a graph drawing scope
+%
+
+\newif\ifpgfgdgraphdrawingscopeactive
+
+
+% Begins a new graph drawing scope
+%
+% Description:
+%
+% Inside a graph drawing scope, all pgf nodes that are newly created
+% are automatically passed to the graph drawing engine. In contrast,
+% edges have to be indicated explicitly using the macro \pgfgdedge
+% (this is because it is somewhat unclear what, exactly, should count
+% as an edge). Naturally, users typically will not call \pgfgdedge
+% explicitly, but have styles and keys invoke it internally.
+%
+% Usage:
+%
+% \pgfgdset{algorithm=somealgorithm}
+% \pgfgdbeginscope
+% \pgfnode{rectangle}{center}{A}{A}{}
+% \pgfnode{rectangle}{center}{B}{B}{}
+% \pgfnode{rectangle}{center}{C}{C}{}
+% \pgfgdedge{A}{B}{->}{}{}
+% \pgfgdedge{B}{C}{->}{}{}
+% \pgfgdedge{C}{A}{->}{}{}
+% \pgfgdendscope
+%
+% Naturally, users will typically use TikZ's somewhat simpler syntax: '
+%
+% \tikz \graph [some algorithm] { A -> B -> C -> A };
+
+\def\pgfgdbeginscope{%
+ \begingroup % Protecting scope
+ % get options
+ \directlua{
+ pgf.gd.interface.InterfaceToDisplay.beginGraphDrawingScope(\the\pgf@gd@parameter@stack@height)
+ }%
+ \begingroup % Inner scope, the actual nodes will be inserted after
+ % this scope has been closed
+ % Indicate that we are now inside a graph drawing scope
+ \pgfgdgraphdrawingscopeactivetrue
+ % Switch on late positioning
+ \pgfpositionnodelater{\pgf@gd@positionnode@callback}
+ % Switch on late edges
+ \pgfgd@latecallback%
+ % Kill transformations (will be added by the position now
+ % macros)
+ \pgftransformreset
+}%
+
+
+
+% The following is used to ensure that if we need to resume the graph
+% drawing (through co-routines), we pass control back to TeX
+% first. Otherwise, new text input levels are created and there may be
+% only 15 of these...
+\newif\ifpgfgdresumecoroutine
+
+
+% Ends a graph drawing scope
+%
+% Description:
+%
+% This macro invokes the selected graph drawing algorithm and
+% ships out all nodes within this scope
+%
+% See \pgfgdbeginscope
+
+\def\pgfgdendscope{%
+ \pgfgdresumecoroutinefalse%
+ \directlua{
+ pgf.gd.interface.InterfaceToDisplay.runGraphDrawingAlgorithm()
+ }%
+ \pgfutil@loop%
+ \ifpgfgdresumecoroutine%
+ \pgfgdresumecoroutinefalse%
+ \directlua{
+ pgf.gd.interface.InterfaceToDisplay.resumeGraphDrawingCoroutine()
+ }%
+ \pgfutil@repeat%
+ \endgroup%
+ % Late positioning has ended
+ \directlua{pgf.gd.interface.InterfaceToDisplay.renderGraph()}%
+ \directlua{pgf.gd.interface.InterfaceToDisplay.endGraphDrawingScope()}%
+ \endgroup%
+}%
+
+
+
+
+
+
+% Hook into graph specification
+%
+% #1 = code
+%
+% Description:
+%
+% Allows you to specify code that should be active while the graph
+% drawing engine collects the information concerning the graph, but
+% which should no longer be active when the graph is rendered.
+
+\def\pgfgdaddspecificationhook#1{
+ \expandafter\def\expandafter\pgfgd@latecallback\expandafter{\pgfgd@latecallback#1}
+}%
+\let\pgfgd@latecallback\pgfutil@empty
+
+
+
+
+
+
+
+
+% Loading further libraries
+
+% Include a graph drawing library file.
+%
+% #1 = List of names of library file.
+%
+% Description:
+%
+% This command includes a list of graph drawing library files. For
+% each file X in the list, the file pgf.gd.X.lua is included using
+% |require|.
+%
+% For the convenience of Context users, both round and square brackets
+% are possible for the argument.
+%
+%
+% Example:
+%
+% \usegdlibrary{trees}
+% \usegdlibrary[force,circular]
+
+\def\usegdlibrary{\pgfutil@ifnextchar[{\use@gdlibrary}{\use@@gdlibrary}}%}%
+\def\use@gdlibrary[#1]{\use@@gdlibrary{#1}}%
+\def\use@@gdlibrary#1{%
+ \edef\pgf@list{#1}%
+ \pgfutil@for\pgf@temp:=\pgf@list\do{%
+ \expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}%
+ \ifx\pgf@temp\pgfutil@empty
+ \else
+ \directlua{if not pgf_lookup_and_require('\pgf@temp') then
+ tex.print('\pgfutil@luaescapestring{\noexpand\pgferror{Graph drawing library '\pgf@temp' not found}}')
+ end}
+ \fi
+ }
+}%
+
+% LaTeX uses kpathsea for file lookup while ConTeXt uses its
+% resolvers. Luckily, kpathsea is still accessible in ConTeXt in a
+% subtable kpse.original which we use if kpse.find_file is nil.
+{%
+\catcode`\%=11
+\directlua{
+ function pgf_lookup_and_require(name)
+ local sep = package.config:sub(1,1)
+ local function lookup(name)
+ local sub = name:gsub('%.',sep)
+ local find_file = context and
+ resolvers.findfile or
+ kpse.find_file
+ if find_file(sub, 'lua') then
+ require(name)
+ elseif find_file(sub, 'clua') then
+ collectgarbage('stop')
+ require(name)
+ collectgarbage('restart')
+ else
+ return false
+ end
+ return true
+ end
+ return
+ lookup('pgf.gd.' .. name .. '.library') or
+ lookup('pgf.gd.' .. name) or
+ lookup(name .. '.library') or
+ lookup(name)
+ end
+}
+}%
+
+
+%
+% Ok, fire up the system by creating the binding!
+%
+\directlua{
+ require 'pgf.gd.interface.InterfaceToDisplay'
+ pgf.gd.interface.InterfaceToDisplay.bind(require 'pgf.gd.bindings.BindingToPGF')
+}%
+
+
+
+%
+% Special setup for keys that are declared by the above libraries, but
+% that have a special meaning on the display layer.
+%
+
+\pgfkeys{/graph drawing/nodes behind edges/.append code=\csname pgf@gd@nodes@behind@edges#1\endcsname}%
+\pgfkeys{/graph drawing/nodes behind edges/.default=true}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarygraphdrawing.examples.code.tex b/graphics/pgf/base/tex/pgflibrarygraphdrawing.examples.code.tex
new file mode 100644
index 0000000000..90ebe0f15a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarygraphdrawing.examples.code.tex
@@ -0,0 +1,17 @@
+% Copyright 2012 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarygraphdrawing.examples.code.tex}
+
+\usepgflibrary{graphdrawing}%
+
+\usegdlibrary{examples}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarygraphdrawing.force.code.tex b/graphics/pgf/base/tex/pgflibrarygraphdrawing.force.code.tex
new file mode 100644
index 0000000000..2ffad53001
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarygraphdrawing.force.code.tex
@@ -0,0 +1,136 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarygraphdrawing.force.code.tex}
+
+
+
+\usepgflibrary{graphdrawing}%
+
+\usegdlibrary{force}%
+
+\endinput
+
+
+
+%
+% Definition of spring algorithms as well as options to configure them.
+%
+
+\pgfgdset{
+ force based/.cd,
+ %
+ iterations/.graph parameter=number,
+ iterations/.parameter initial=500,
+ %
+ cooling factor/.graph parameter=number,
+ cooling factor/.parameter initial=0.95,
+ %
+ initial step dimension/.graph parameter=number,
+ initial step dimension/.parameter initial=0,
+ %
+ convergence tolerance/.graph parameter=number,
+ convergence tolerance/.parameter initial=0.01,
+ %
+ spring constant/.graph parameter=number,
+ spring constant/.parameter initial=0.01,
+ %
+ approximate electric forces/.graph parameter=boolean,
+ approximate electric forces/.parameter initial=false,
+ approximate electric forces/.default=true,
+ %
+ electric force order/.graph parameter=number,
+ electric force order/.parameter initial=1,
+ %
+ % Parameters related to the multilevel approach where the input graph
+ % is iteratively coarsened into graphs with fewer nodes, until either
+ % the number of nodes is small enough or the number of nodes in the
+ % could not be reduced by at least a user-defined ratio.
+ %
+ coarsen/.graph parameter=boolean,
+ coarsen/.parameter initial=true,
+ coarsen/.default=true,
+ %
+ coarsening/.code=\pgfkeys{
+ /graph drawing/force based/coarsening/.cd,
+ #1
+ },
+ %
+ coarsening/downsize ratio/.graph parameter=number,
+ coarsening/downsize ratio/.parameter initial=0.25,
+ %
+ coarsening/minimum graph size/.graph parameter=number,
+ coarsening/minimum graph size/.parameter initial=2,
+ %
+ coarsening/collapse independent edges/.graph parameter=boolean,
+ coarsening/collapse independent edges/.parameter initial=true,
+ coarsening/collapse independent edges/.default=true,
+ %
+ coarsening/connect independent nodes/.graph parameter=boolean,
+ coarsening/connect independent nodes/.parameter initial=false,
+ coarsening/connect independent nodes/.default=true,
+ %
+ % Node parameters for spring algorithms.
+ %
+ %
+ % Edge parameters for spring algorithms.
+ %
+}%
+
+\pgfgddeclareforwardedkeys{/graph drawing}{
+ %
+ electric charge/.node parameter=number,
+ electric charge/.parameter initial=1,
+}
+
+
+%
+% Spring algorithm based on the paper
+%
+% "Efficient, High-Quality Force-Directed Graph Drawing"
+% Yifan Hu, 2006
+%
+\pgfgddeclarealgorithmkey
+ {spring layout}
+ {force based}
+ {
+ algorithm=pgf.gd.force.SpringHu2006
+ }
+
+
+%
+% Spring-electrical algorithm based on the paper
+%
+% "Efficient, High-Quality Force-Directed Graph Drawing"
+% Yifan Hu, 2006
+%
+\pgfgddeclarealgorithmkey
+ {spring electrical layout}
+ {force based}
+ {
+ algorithm=pgf.gd.force.SpringElectricalHu2006,
+ force based/spring constant=0.2,
+ }
+
+
+
+%
+% Spring-electrical algorithm based on the paper
+%
+% "A Multilevel Algorithm for Force-Directed Graph Drawing"
+% C. Walshaw, 2000
+%
+\pgfgddeclarealgorithmkey
+ {spring electrical layout'}
+ {force based}
+ {
+ algorithm=pgf.gd.force.SpringElectricalWalshaw2000,
+ force based/spring constant=0.01,
+ force based/convergence tolerance=0.001,
+ }
diff --git a/graphics/pgf/base/tex/pgflibrarygraphdrawing.layered.code.tex b/graphics/pgf/base/tex/pgflibrarygraphdrawing.layered.code.tex
new file mode 100644
index 0000000000..940c8236cf
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarygraphdrawing.layered.code.tex
@@ -0,0 +1,17 @@
+% Copyright 2011 by Jannis Pohlmann
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarygraphdrawing.layered.code.tex}
+
+\usepgflibrary{graphdrawing}%
+
+\usegdlibrary{layered}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarygraphdrawing.trees.code.tex b/graphics/pgf/base/tex/pgflibrarygraphdrawing.trees.code.tex
new file mode 100644
index 0000000000..87ff6eee23
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarygraphdrawing.trees.code.tex
@@ -0,0 +1,19 @@
+% Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+% Copyright 2011 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarygraphdrawing.trees.code.tex}
+
+
+\usepgflibrary{graphdrawing}%
+\usepgflibrary{graphdrawing.layered}%
+
+\usegdlibrary{trees}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryintersections.code.tex b/graphics/pgf/base/tex/pgflibraryintersections.code.tex
new file mode 100644
index 0000000000..6bed3e4721
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryintersections.code.tex
@@ -0,0 +1,1165 @@
+% Copyright 2008 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+% Note: at the time of this writing, the library has quadratic runtime.
+% Experimentally, it performed well while computing ~12 intersections of two
+% plots, each with 600 samples. It failed when the number of samples exceeded 700.
+
+\usepgflibrary{fpu}%
+
+\newcount\pgf@intersect@solutions
+
+\newif\ifpgf@intersect@sort
+\newif\ifpgf@intersect@sort@by@second@path
+
+\def\pgfintersectionsortbyfirstpath{%
+ \pgf@intersect@sorttrue%
+ \pgf@intersect@sort@by@second@pathfalse%
+}%
+
+\def\pgfintersectionsortbysecondpath{%
+ \pgf@intersect@sorttrue%
+ \pgf@intersect@sort@by@second@pathtrue%
+}%
+
+% #1: the index. It starts at 1 and ends with \pgfintersectionsolutions (inclusive).
+% Invalid values will implicitly result in the origin.
+\def\pgfpointintersectionsolution#1{%
+ \ifnum#1<1\relax%
+ \pgfpoint@intersect@solution@orgin%
+ \else%
+ \ifnum#1>\pgfintersectionsolutions\relax%
+ \pgfpoint@intersect@solution@orgin%
+ \else%
+ \csname pgfpoint@intersect@solution@#1\endcsname%
+ \fi%
+ \fi%
+}%
+
+% Gets the segment indices of solution #1.
+%
+% #1: the solution index (i.e. the same argument as in \pgfpointintersectionsolution)
+% #2: [output] a macro name which will contain the segment index of the first path which contains the solution
+% #3: [output] a macro name which will contain the segment index of the second path which contains the solution
+%
+% Example: \pgfintersectiongetsolutionsegmentindices{0}{\first}{\second}%
+%
+% -> \first may be 0 if point #0 is in the 0'th segment
+% -> \second may be 42 if point #0 is in the 42'th segment
+%
+% The "segment index" is actually close to the "time" of the solution.
+% If a solution is at "time" 42.2, it will have segment index 42.
+\def\pgfintersectiongetsolutionsegmentindices#1#2#3{%
+ \ifnum#1<1\relax%
+ \let#2=\pgfutil@empty
+ \let#3=\pgfutil@empty
+ \else%
+ \ifnum#1>\pgfintersectionsolutions\relax%
+ \let#2=\pgfutil@empty
+ \let#3=\pgfutil@empty
+ \else%
+ \def\pgf@temp##1##2##3##4{%
+ \edef#2{##1}%
+ \edef#3{##2}%
+ }%
+ \expandafter\let\expandafter\pgf@tempb\csname pgf@intersect@solution@props@#1\endcsname
+ \expandafter\pgf@temp\pgf@tempb
+ \fi%
+ \fi%
+}%
+
+% Gets the time indices of solution #1.
+%
+% #1: the solution index (i.e. the same argument as in \pgfpointintersectionsolution)
+% #2: [output] a macro name which will contain the time of the first path which contains the solution
+% It will never be empty.
+% #3: [output] a macro name which will contain the time of the second path which contains the solution
+% It will never be empty.
+%
+% Example: \pgfintersectiongetsolutiontimes{0}{\first}{\second}%
+%
+% -> \first may be 0.5 if point #0 is in just in the middle of the path
+% -> \second may be 42.8 if point #0 is in the 42'th segment (compare
+% \pgfintersectiongetsolutionsegmentindices) and is at 80% of the
+% 42'th segment
+%
+% Note that the precise time inside of a segment may be unavailable
+% (currently, it is only computed for curveto paths and not
+% necessarily for lineto). If the precise time is unavailable, this
+% call will return the value of
+% \pgfintersectiongetsolutionsegmentindices (which is a
+% "coarse-grained" time).
+\def\pgfintersectiongetsolutiontimes#1#2#3{%
+ \ifnum#1<1\relax%
+ \let#2=\pgfutil@empty
+ \let#3=\pgfutil@empty
+ \else%
+ \ifnum#1>\pgfintersectionsolutions\relax%
+ \let#2=\pgfutil@empty
+ \let#3=\pgfutil@empty
+ \else%
+ \def\pgf@temp##1##2##3##4{%
+ \edef#2{##3}%
+ \edef#3{##4}%
+ %
+ % check for fallback to segment indices:
+ \ifx#2\pgfutil@empty \edef#2{##1}\fi
+ \ifx#3\pgfutil@empty \edef#3{##2}\fi
+ }%
+ \expandafter\let\expandafter\pgf@tempb\csname pgf@intersect@solution@props@#1\endcsname
+ \expandafter\pgf@temp\pgf@tempb
+ \fi%
+ \fi%
+}%
+
+\def\pgfpoint@intersect@solution@orgin{%
+ \begingroup%
+ \pgftransforminvert%
+ \pgfpointorigin%
+ \pgf@pos@transform@glob
+ \global\pgf@x=\pgf@x%
+ \global\pgf@y=\pgf@y%
+ \endgroup%
+}%
+
+% #1 code which assigns the first path using \pgfsetpath.
+% #2 code which assigns the second path using \pgfsetpath.
+%
+% On output, the points, their properties, and the number of points are set.
+% Use \pgfintersectionsolutions which expands to the number of intersections
+\long\def\pgfintersectionofpaths#1#2{%
+ \begingroup%
+ \pgfinterruptpath%
+ #1%
+ \pgfgetpath\pgf@intersect@path@a%
+ \global\let\pgf@intersect@path@temp=\pgf@intersect@path@a%
+ \endpgfinterruptpath%
+ \endgroup%
+ \let\pgf@intersect@path@a=\pgf@intersect@path@temp%
+ %
+ \begingroup%
+ \pgfinterruptpath%
+ #2%
+ \pgfgetpath\pgf@intersect@path@b%
+ \global\let\pgf@intersect@path@temp=\pgf@intersect@path@b%
+ \endpgfinterruptpath%
+ \endgroup%
+ \let\pgf@intersect@path@b=\pgf@intersect@path@temp%
+ %
+ \pgf@intersect@solutions=0\relax%
+ \pgf@intersect@path@reset@a
+ %
+ \ifpgf@intersect@sort@by@second@path%
+ \let\pgf@intersect@temp=\pgf@intersect@path@a%
+ \let\pgf@intersect@path@a=\pgf@intersect@path@b%
+ \let\pgf@intersect@path@b=\pgf@intersect@temp%
+ \fi%
+ %
+ \pgfprocessround\pgf@intersect@path@a\pgf@intersect@path@a%
+ \pgfprocessround\pgf@intersect@path@b\pgf@intersect@path@b%
+ %
+ \let\pgf@intersect@token@after=\pgf@intersect@path@process@a%
+ \expandafter\pgf@intersectionofpaths\pgf@intersect@path@a\pgf@stop%
+ \edef\pgfintersectionsolutions{\the\pgf@intersect@solutions}%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgfintersectionsolutions\relax%
+ \else%
+ \pgfutil@namelet{pgfpoint@intersect@solution@\pgfmathcounter}%
+ {pgfpoint@g@intersect@solution@\pgfmathcounter}%
+ \edef\pgf@marshal{\noexpand\pgf@intersection@set@properties{\csname pgfpoint@g@intersect@solution@\pgfmathcounter @props\endcsname}}%
+ \pgf@marshal
+ \ifpgf@intersect@sort%
+ \pgfutil@namelet{pgf@intersect@solution@\pgfmathcounter @time@a}%
+ {pgf@g@intersect@solution@\pgfmathcounter @time@a}%
+ \fi%
+ \repeatpgfmathloop%
+ \ifpgf@intersect@sort%
+ \pgfintersectionsolutionsortbytime%
+ \fi%
+}%
+
+\def\pgf@intersection@set@properties#1{%
+ \pgfutil@namedef{pgf@intersect@solution@props@\pgfmathcounter}{#1}%
+}%
+
+% #1 a global name prefix to store properties.
+\def\pgf@intersection@store@properties#1{%
+ % we store the time offsets as well and make them available programmatically:
+ % note that \pgf@intersect@time@a and \pgf@intersect@time@b may be empty.
+ %
+ % However, \pgf@intersect@time@offset and
+ % \pgf@intersect@time@offset@b are *always* valid. In fact,they
+ % resemble a part of the time: it holds
+ % 0 <= \pgf@intersect@time@a < 1
+ % and \pgf@intersect@time@offset > 0.
+ %
+ % If we have an intersection in segment 42 of path A,
+ % \pgf@intersect@time@offset will be 42. The time inside of that
+ % segment is given as number in the interval [0,1]. If it is 0.3,
+ % the total time will be 42.3 and that number will be stored as
+ % \pgf@intersect@time@a.
+ %
+ \expandafter\xdef\csname #1@props\endcsname{{\pgf@intersect@time@offset}{\pgf@intersect@time@offset@b}{\pgf@intersect@time@a}{\pgf@intersect@time@b}}%
+}%
+
+\def\pgf@intersectionofpaths#1{%
+ \ifx#1\pgf@stop%
+ \let\pgf@intersect@next=\relax%
+ \else%
+ \ifx#1\pgfsyssoftpath@movetotoken%
+ \let\pgf@intersect@next=\pgf@intersect@token@moveto%
+ \else%
+ \ifx#1\pgfsyssoftpath@linetotoken%
+ \let\pgf@intersect@next=\pgf@intersect@token@lineto%
+ \else%
+ \ifx#1\pgfsyssoftpath@closepathtoken%
+ \let\pgf@intersect@next=\pgf@intersect@token@lineto%
+ \else%
+ \ifx#1\pgfsyssoftpath@curvetosupportatoken%
+ \let\pgf@intersect@next=\pgf@intersect@token@curveto%
+ \else%
+ \ifx#1\pgfsyssoftpath@rectcornertoken%
+ \let\pgf@intersect@next=\pgf@intersect@token@rect%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgf@intersect@next}%
+
+\def\pgf@intersect@token@moveto#1#2{%
+ \def\pgfpoint@intersect@start{\pgfqpoint{#1}{#2}}%
+ \pgf@intersectionofpaths%
+}%
+
+\def\pgf@intersect@token@lineto#1#2{%
+ \def\pgfpoint@intersect@end{\pgfqpoint{#1}{#2}}%
+ \def\pgf@intersect@type{line}%
+ \pgf@intersect@token@after%
+}%
+\def\pgf@intersect@token@curveto#1#2\pgfsyssoftpath@curvetosupportbtoken#3#4\pgfsyssoftpath@curvetotoken#5#6{%
+ \def\pgfpoint@intersect@firstsupport{\pgfqpoint{#1}{#2}}%
+ \def\pgfpoint@intersect@secondsupport{\pgfqpoint{#3}{#4}}%
+ \def\pgfpoint@intersect@end{\pgfqpoint{#5}{#6}}%
+ \def\pgf@intersect@type{curve}%
+ \pgf@intersect@token@after%
+}%
+
+\def\pgf@intersect@token@rect#1#2\pgfsyssoftpath@rectsizetoken#3#4{%
+ \pgf@xa=#1\relax%
+ \advance\pgf@xa by#3\relax%
+ \pgf@ya=#2\relax%
+ \advance\pgf@ya by#4\relax%
+ \edef\pgf@marshal{%
+ \noexpand\pgfsyssoftpath@movetotoken{#1}{#2}%
+ \noexpand\pgfsyssoftpath@linetotoken{#1}{\the\pgf@ya}%
+ \noexpand\pgfsyssoftpath@linetotoken{\the\pgf@xa}{\the\pgf@ya}%
+ \noexpand\pgfsyssoftpath@linetotoken{\the\pgf@xa}{#2}%
+ \noexpand\pgfsyssoftpath@closepathtoken{#1}{#2}%
+ }%
+ \expandafter\pgf@intersectionofpaths\pgf@marshal%
+}%
+
+\def\pgf@intersect@path@process@a{%
+ \pgf@intersect@path@getpoints@a%
+ \let\pgf@intersect@token@after=\pgf@intersect@path@process@b%
+ \pgf@intersect@path@reset@b
+ \expandafter\pgf@intersectionofpaths\pgf@intersect@path@b\pgf@stop%
+ \let\pgfpoint@intersect@start=\pgfpoint@intersect@end@a%
+ \let\pgf@intersect@token@after=\pgf@intersect@path@process@a%
+ \c@pgf@counta=\pgf@intersect@time@offset\relax%
+ \advance\c@pgf@counta by1\relax%
+ \edef\pgf@intersect@time@offset{\the\c@pgf@counta}%
+ \pgf@intersectionofpaths%
+}%
+
+\def\pgf@intersect@path@reset@a{%
+ \def\pgf@intersect@time@offset{0}%
+ \def\pgf@intersect@time@a{}%
+}%
+
+\def\pgf@intersect@path@reset@b{%
+ \def\pgf@intersect@time@offset@b{0}%
+ \def\pgf@intersect@time@b{}%
+}%
+
+\def\pgf@intersect@path@getpoints@a{%
+ \let\pgfpoint@intersect@start@a=\pgfpoint@intersect@start%
+ \let\pgfpoint@intersect@end@a=\pgfpoint@intersect@end%
+ \let\pgfpoint@intersect@firstsupport@a=\pgfpoint@intersect@firstsupport%
+ \let\pgfpoint@intersect@secondsupport@a=\pgfpoint@intersect@secondsupport%
+ \let\pgf@intersect@type@a=\pgf@intersect@type%
+}%
+
+\def\pgf@intersect@path@process@b{%
+ \pgf@intersect@path@getpoints@b%
+ \csname pgf@intersect@\pgf@intersect@type@a @and@\pgf@intersect@type@b\endcsname%
+ \let\pgfpoint@intersect@start=\pgfpoint@intersect@end@b%
+ \c@pgf@counta=\pgf@intersect@time@offset@b\relax%
+ \advance\c@pgf@counta by1\relax%
+ \edef\pgf@intersect@time@offset@b{\the\c@pgf@counta}%
+ \pgf@intersectionofpaths}%
+
+\def\pgf@intersect@path@getpoints@b{%
+ \let\pgfpoint@intersect@start@b=\pgfpoint@intersect@start%
+ \let\pgfpoint@intersect@end@b=\pgfpoint@intersect@end%
+ \let\pgfpoint@intersect@firstsupport@b=\pgfpoint@intersect@firstsupport%
+ \let\pgfpoint@intersect@secondsupport@b=\pgfpoint@intersect@secondsupport%
+ \let\pgf@intersect@type@b=\pgf@intersect@type%
+}%
+
+\def\pgf@intersect@line@and@line{%
+ \pgf@intersectionoflines{\pgfpoint@intersect@start@a}{\pgfpoint@intersect@end@a}%
+ {\pgfpoint@intersect@start@b}{\pgfpoint@intersect@end@b}%
+}%
+
+\def\pgf@intersect@line@and@curve{%
+ \pgf@intersectionoflineandcurve%
+ {\pgf@process{\pgfpoint@intersect@start@a}}{\pgf@process{\pgfpoint@intersect@end@a}}%
+ {\pgf@process{\pgfpoint@intersect@start@b}}{\pgf@process{\pgfpoint@intersect@firstsupport@b}}%
+ {\pgf@process{\pgfpoint@intersect@secondsupport@b}}{\pgf@process{\pgfpoint@intersect@end@b}}%
+}%
+
+\def\pgf@intersect@curve@and@line{%
+ \pgf@intersectionofcurveandline%
+ {\pgf@process{\pgfpoint@intersect@start@a}}{\pgf@process{\pgfpoint@intersect@firstsupport@a}}%
+ {\pgf@process{\pgfpoint@intersect@secondsupport@a}}{\pgf@process{\pgfpoint@intersect@end@a}}%
+ {\pgf@process{\pgfpoint@intersect@start@b}}{\pgf@process{\pgfpoint@intersect@end@b}}%
+}%
+
+\def\pgf@intersect@curve@and@curve{%
+ \pgf@intersectionofcurves%
+ {\pgf@process{\pgfpoint@intersect@start@a}}{\pgf@process{\pgfpoint@intersect@firstsupport@a}}%
+ {\pgf@process{\pgfpoint@intersect@secondsupport@a}}{\pgf@process{\pgfpoint@intersect@end@a}}%
+ {\pgf@process{\pgfpoint@intersect@start@b}}{\pgf@process{\pgfpoint@intersect@firstsupport@b}}%
+ {\pgf@process{\pgfpoint@intersect@secondsupport@b}}{\pgf@process{\pgfpoint@intersect@end@b}}%
+}%
+
+
+\def\pgfintersectionoflines#1#2#3#4{%
+ \pgf@intersect@solutions=0\relax%
+ \pgf@intersectionoflines{#1}{#2}{#3}{#4}%
+}%
+
+\def\pgf@intersectionoflines#1#2#3#4{%
+ \pgf@iflinesintersect{#1}{#2}{#3}{#4}%
+ {%
+ \pgfextract@process\pgf@intersect@solution@candidate{%
+ % pgf@x and pgf@y are already assigned by \pgf@iflinesintersect
+ }%
+ \pgf@ifsolution@duplicate{\pgf@intersect@solution@candidate}{%
+ % ah - we a duplicate. Apparently, we have a hit on an
+ % endpoint.
+ }{%
+ \global\advance\pgf@intersect@solutions by1\relax%
+ \expandafter\global\expandafter\let\csname pgfpoint@g@intersect@solution@\the\pgf@intersect@solutions\endcsname=\pgf@intersect@solution@candidate
+ \ifpgf@intersect@sort%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\pgfpointdiff{\pgfpoint@intersect@start@a}{\pgfpoint@intersect@end@a}}%
+ \edef\pgf@marshal{%
+ \noexpand\pgfmathveclen@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@ya}}%
+ }%
+ \pgf@marshal%
+ \let\pgf@intersect@length@a=\pgfmathresult%
+ \pgf@process{\pgfpointdiff{\pgfpoint@intersect@start@a}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}%
+ \edef\pgf@marshal{%
+ \noexpand\pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ }%
+ \pgf@marshal%
+ \pgfmathdivide@{\pgfmathresult}{\pgf@intersect@length@a}%
+ \pgf@x=\pgfmathresult pt\relax%
+ \advance\pgf@x by\pgf@intersect@time@offset pt\relax%
+ \edef\pgf@intersect@time@a{\pgfmath@tonumber{\pgf@x}}%
+ \expandafter\global\expandafter\let\csname pgf@g@intersect@solution@\the\pgf@intersect@solutions @time@a\endcsname=
+ \pgf@intersect@time@a
+ \else
+ \let\pgf@intersect@time@a=\pgfutil@empty
+ \fi%
+ \let\pgf@intersect@time@b=\pgfutil@empty
+ \pgf@intersection@store@properties{pgfpoint@g@intersect@solution@\the\pgf@intersect@solutions}%
+ }%
+ %
+ }{%
+ }%
+}%
+
+% Test if two lines L1 and L2 intersect.
+%
+% #1 - first point P1 on L1.
+% #2 - second point P2 on L1.
+% #3 - first point P3 on L2.
+% #2 - second point P4 on L2.
+% #5 - code executed if intersection occurs.
+% #6 - code executed if intersection does no occur.
+%
+% Let L1 be represented by P1+(P2-P1)s where 0<=s<=1
+% Let L2 be represented by P3+(P4-P3)t where 0<=t<=1
+%
+% Then L1 and L2 intersect at
+%
+% s = |x2-x1 x3-x1| / |x4-x3 x2-x1|
+% |y2-y1 y3-y1| |y4-y3 y2-y1|
+%
+% t = |x4-x3 x3-x1| / |x4-x3 x2-x1|
+% |y4-y3 y3-y1| |y4-y3 y2-y1|
+%
+% with 0<=s,t<=1
+%
+% s and t do not need to be calculated:
+%
+% Let s = A / C and t = B / C
+%
+% Then 0<=s<=1 if !(C=0) && ((A=0) || ((A>0) && !(C<A)) || ((A<0) && !(C>A)))
+% 0<=t<=1 if !(C=0) && ((B=0) || ((B>0) && !(C<B)) || ((B<0) && !(C>B)))
+%
+\newif\ifpgf@s
+\newif\ifpgf@t
+\def\pgfiflinesintersect#1#2#3#4{%
+ \begingroup%
+ \pgf@iflinesintersect{\pgf@process{#1}}{\pgf@process{#2}}{\pgf@process{#3}}{\pgf@process{#4}}%
+ {\aftergroup\pgfutil@firstoftwo}{\aftergroup\pgfutil@secondoftwo}%
+ \endgroup%
+}%
+
+% queried by pgfplots. Do not delete, only increase.
+\def\pgf@intersections@version{2}%
+
+% #1,#2: line 1
+% #3,#4: line 2
+\def\pgf@iflinesintersect#1#2#3#4{%
+ % first: check bounding boxes -- but somewhat increased such that we do not
+ % exclude "visible" hits due to rounding issues (i.e. use an upper bound):
+ \pgf@intersect@boundingbox@reset%
+ \pgf@intersect@boundingbox@update{#1}%
+ \pgf@intersect@boundingbox@update{#2}%
+ \pgf@intersect@boundingbox@assign@b%
+ %
+ \pgf@intersect@boundingbox@reset%
+ \pgf@intersect@boundingbox@update{#3}%
+ \pgf@intersect@boundingbox@update{#4}%
+ \pgf@intersect@boundingbox@assign@a%
+ %
+ \pgf@intersect@boundingbox@a%
+ \pgf@intersect@boundingbox@b%
+ %
+ \pgf@intersect@boundingbox@ifoverlap@upperbound{%
+ \pgf@iflinesintersect@{#1}{#2}{#3}{#4}%
+ }{%
+ \let\pgf@intersect@next=\pgfutil@secondoftwo%
+ }%
+ \pgf@intersect@next%
+}%
+
+% a helper routine which simply defines \pgf@intersect@next.
+%
+% In principle, this routine is capable of computing the entire intersection... but we only invoke it after checking for bounding box overlaps. This has two reasons:
+% 1. robustness. almost-parallel lines could cause "dimension too large" when solving the linear equation system
+% XXX : I still needed to replace the linear solver by one using the FPU. Perhaps I do not need the BB check anymore?
+% 2. performance. I hope it is faster to first check for BB (but this is not sure in TeX)
+%
+% #1,#2: line 1
+% #3,#4: line 2
+\def\pgf@iflinesintersect@#1#2#3#4{%
+ % we have two lines of sorts
+ % l_1(s) := #1 + s * (#2 - #1), 0<= s <= 1
+ % and
+ % l_2(t) := #3 + t * (#4 - #3), 0<= t <= 1
+ % ->
+ % set up LGS
+ % ( #2 - #1 ) *s + (#3-#4) * t = #3-#1
+ % we have a hit if 0<= s,t <= 1 .
+ #1\relax%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ #2\relax%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ #3\relax%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ #4\relax%
+ %
+ % will be overwritten, remember it:
+ \edef\pgf@intersect@A{%
+ \pgf@xa=\the\pgf@xa\space
+ \pgf@ya=\the\pgf@ya\space
+ }%
+ %
+ % B := (2-1)
+ \advance\pgf@xb by-\pgf@xa
+ \advance\pgf@yb by-\pgf@ya
+ %
+ % A := (3-1)
+ \advance\pgf@xa by-\pgf@xc
+ \advance\pgf@ya by-\pgf@yc
+ \pgf@xa=-\pgf@xa
+ \pgf@ya=-\pgf@ya
+ %
+ % C := (3-4)
+ \advance\pgf@xc by-\pgf@x
+ \advance\pgf@yc by-\pgf@y
+ %
+ \begingroup
+ % compute the |.|_1 norm of each of lines. We need to compute
+ % tolerance factors in order to decide if we have an intersection.
+ % line 1: compute |#2 - #1|_1 :
+ \ifdim\pgf@xb<0sp \pgf@xb=-\pgf@xb\fi
+ \ifdim\pgf@yb<0sp \pgf@yb=-\pgf@yb\fi
+ \advance\pgf@xb by\pgf@yb
+ \xdef\pgf@intersect@len@a{\pgf@sys@tonumber\pgf@xb}%
+ %
+ % line 2: compute |#3 - #4|_1 :
+ \ifdim\pgf@xc<0sp \pgf@xc=-\pgf@xc\fi
+ \ifdim\pgf@yc<0sp \pgf@yc=-\pgf@yc\fi
+ \advance\pgf@xc by\pgf@yc
+ \xdef\pgf@intersect@len@b{\pgf@sys@tonumber\pgf@xc}%
+ \endgroup
+ %
+ \edef\pgf@marshal{%
+ \noexpand\pgfutilsolvetwotwoleqfloat{%
+ {\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xc}%
+ {\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@yc}%
+ }{%
+ {\pgf@sys@tonumber\pgf@xa}%
+ {\pgf@sys@tonumber\pgf@ya}%
+ }%
+ }%
+ \pgf@marshal
+ %
+ \let\pgf@intersect@next=\pgfutil@secondoftwo%
+ \ifx\pgfmathresult\pgfutil@empty
+ % matrix was singular.
+ \else
+ \def\pgf@marshal##1##2{%
+ \global\pgf@x=##1pt %
+ \global\pgf@y=##2pt %
+ }%
+ \expandafter\pgf@marshal\pgfmathresult
+ %
+ \def\pgf@marshal{XXXX}% this should never be read
+ % FIRST: check line 1:
+ \ifdim\pgf@x<0sp
+ % let it count as hit if
+ % || l_1(s) - l_1(0) || < eps
+ % <=> |s| * ||#2 - #1|| < eps
+ % and, since s< 0 here:
+ % <=> -s * ||#2 - #1|| < eps
+ \pgf@xa=-\pgf@intersect@len@a\pgf@x
+ \ifdim\pgf@xa<\pgfintersectiontolerance\relax
+ % close enough to first endpoint of line 1:
+ \def\pgf@marshal{1}%
+ \else
+ \def\pgf@marshal{0}%
+ \fi
+ \else
+ \ifdim\pgf@x>1pt
+ % let it count as hit if
+ % || l_1(s) - l_1(1) || < eps
+ % <=> |s-1| * ||#2 - #1|| < eps
+ % and, since s > 1 here:
+ % <=> s * ||#2 - #1|| - ||#2 - #1|| < eps
+ \pgf@xa=\pgf@intersect@len@a\pgf@x
+ \advance\pgf@xa by-\pgf@intersect@len@a pt %
+ \ifdim\pgf@xa<\pgfintersectiontolerance\relax
+ % close enough to second endpoint of line 1:
+ \def\pgf@marshal{1}%
+ \else
+ \def\pgf@marshal{0}%
+ \fi
+ \else
+ % 0<= s <= 1: we have an intersection within line 1.
+ \def\pgf@marshal{1}%
+ \fi
+ \fi
+ %
+ % SECOND: check line 2:
+ \if1\pgf@marshal
+ \ifdim\pgf@y<0sp
+ % see remarks for line 1. same applies here.
+ \pgf@xa=-\pgf@intersect@len@b\pgf@y
+ \ifdim\pgf@xa<\pgfintersectiontolerance\relax
+ % close enough to first endpoint of line 2:
+ \def\pgf@marshal{1}%
+ \else
+ \def\pgf@marshal{0}%
+ \fi
+ \else
+ \ifdim\pgf@y>1pt
+ % see remarks for line 1. same applies here.
+ \pgf@xa=\pgf@intersect@len@b\pgf@y
+ \advance\pgf@xa by-\pgf@intersect@len@b pt %
+ \ifdim\pgf@xa<\pgfintersectiontolerance\relax
+ % close enough to second endpoint of line 2:
+ \def\pgf@marshal{1}%
+ \else
+ \def\pgf@marshal{0}%
+ \fi
+ \else
+ % 0<= t <= 1: we have an intersection within line 2.
+ \def\pgf@marshal{1}%
+ \fi
+ \fi
+ \fi
+ %
+ \if1\pgf@marshal
+ % Ok, compute the intersection point and return it:
+ % we use (x,y) = A + s * (B-A)
+ % keep in mind that (s,t) == (\pgf@x,\pgf@y)
+ \pgf@intersect@A
+ \pgf@yc=\pgf@x
+ \global\pgf@x=\pgf@sys@tonumber\pgf@xb\pgf@yc
+ \global\pgf@y=\pgf@sys@tonumber\pgf@yb\pgf@yc
+ \global\advance\pgf@x by \pgf@xa
+ \global\advance\pgf@y by \pgf@ya
+ \let\pgf@intersect@next=\pgfutil@firstoftwo%
+ \fi
+ \fi
+}%
+
+
+
+
+\def\pgfintersectionoflineandcurve#1#2#3#4#5#6{%
+ \pgf@intersect@solutions=0\relax%
+ \pgf@intersectionoflineandcurve{#1}{#2}{#3}{#4}{#5}{#6}%
+}%
+
+\def\pgf@intersectionoflineandcurve#1#2#3#4#5#6{%
+ \pgf@intersectionofcurves%
+ {\pgf@process{#1}}%
+ {%
+ \pgf@process{%
+ \pgfpointadd{#1\relax\pgf@x=0.666666\pgf@x\pgf@y=0.666666\pgf@y}%
+ {#2\relax\pgf@x=0.333333\pgf@x\pgf@y=0.333333\pgf@y}%
+ }%
+ }%
+ {%
+ \pgf@process{%
+ \pgfpointadd{#1\relax\pgf@x=0.333333\pgf@x\pgf@y=0.333333\pgf@y}%
+ {#2\relax\pgf@x=0.666666\pgf@x\pgf@y=0.666666\pgf@y}%
+ }%
+ }%
+ {\pgf@process{#2}}%
+ {\pgf@process{#3}}%
+ {\pgf@process{#4}}%
+ {\pgf@process{#5}}%
+ {\pgf@process{#6}}%
+}%
+
+\def\pgf@intersectionofcurveandline#1#2#3#4#5#6{%
+ \pgf@intersectionofcurves%
+ {\pgf@process{#1}}%
+ {\pgf@process{#2}}%
+ {\pgf@process{#3}}%
+ {\pgf@process{#4}}%
+ {\pgf@process{#5}}%
+ {%
+ \pgf@process{%
+ \pgfpointadd{#5\relax\pgf@x=0.666666\pgf@x\pgf@y=0.666666\pgf@y}%
+ {#6\relax\pgf@x=0.333333\pgf@x\pgf@y=0.333333\pgf@y}%
+ }%
+ }%
+ {%
+ \pgf@process{%
+ \pgfpointadd{#5\relax\pgf@x=0.333333\pgf@x\pgf@y=0.333333\pgf@y}%
+ {#6\relax\pgf@x=0.666666\pgf@x\pgf@y=0.666666\pgf@y}%
+ }%
+ }%
+ {\pgf@process{#6}}%
+}%
+
+
+
+
+\def\pgfintersectiontolerance{0.1pt}%
+\def\pgfintersectiontoleranceupperbound{1pt}%
+\def\pgfintersectiontolerancefactor{0.1}%
+
+
+
+% Find the intersections of two bezier curves.
+%
+% #1 - #4 = curve 1.
+% #5 - #8 = curve 2.
+% #9 = the solution number.
+%
+% There is no guarantee of ordering of solutions. If there are
+% no solutions, the origin is returned.
+%
+\def\pgfpointintersectionofcurves#1#2#3#4#5#6#7#8#9{%
+ \pgf@intersect@solutions=0\relax%
+ \pgf@intersectionofcurves%
+ {\pgf@process{#1}}{\pgf@process{#2}}{\pgf@process{#3}}{\pgf@process{#4}}%
+ {\pgf@process{#5}}{\pgf@process{#6}}{\pgf@process{#7}}{\pgf@process{#8}}%
+ \pgfpointintersectionsolution{#9}%
+}%
+
+% Return any intersection points of two curves C1 and C2.
+% No order can be guaranteed for the solutions.
+%
+% #1, #2, #3, #4 - the points on C1
+% #5, #6, #7, #8 - the points on C2
+%
+% Returns:
+%
+% \pgf@intersect@solutions - the number of solutions.
+% \pgfpointintersectionsolution{<S>} - the point for solution S.
+%
+% (Sort of) use:
+%
+% intersection(C1,C2)
+% S = {};
+% intersection'(C1,C2);
+% return S;
+%
+% intersection'(C1,C2)
+% B1 = boundingbox(C1);
+% B2 = boundingbox(C2);
+% if intersect(B1,B2)
+% if (B1.width < q) and (B1.height < q) and
+% (B2.width < q) and (B2.height < q)
+% S = S + {average_of_all_points(B1,B2)}; \\ is there a better choice?
+% else
+% Q = subdivideLeft(C1);
+% R = subdivideRight(C1);
+% intersection'(C2,Q);
+% intersection'(C2,R);
+%
+% where q is a small value (tolerance).
+%
+\def\pgfintersectionofcurves#1#2#3#4#5#6#7#8{%
+ \pgf@intersect@solutions=0\relax%
+ \pgf@intersectionofcurves%
+ {\pgf@process{#1}}{\pgf@process{#2}}{\pgf@process{#3}}{\pgf@process{#4}}%
+ {\pgf@process{#5}}{\pgf@process{#6}}{\pgf@process{#7}}{\pgf@process{#8}}%
+}%
+\def\pgf@intersectionofcurves#1#2#3#4#5#6#7#8{%
+ \begingroup%
+ \dimendef\pgf@time@a=2\relax%
+ \dimendef\pgf@time@aa=4\relax%
+ \dimendef\pgf@time@b=6\relax%
+ \dimendef\pgf@time@bb=8\relax%
+ \pgf@time@a=0pt\relax%
+ \pgf@time@aa=1pt\relax%
+ \pgf@time@b=0pt\relax%
+ \pgf@time@bb=1pt\relax%
+ \let\pgf@intersect@subdivide@curve=\pgf@intersect@subdivide@curve@b%
+ \let\pgf@curve@subdivde@after=\pgf@@intersectionofcurves%
+ \pgf@@intersectionofcurves{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ \endgroup%
+}%
+
+\def\pgf@intersect@boundingbox@assign@a{%
+ \edef\pgf@intersect@boundingbox@a{%
+ % lower left:
+ \noexpand\pgf@xb=\the\pgf@xa\space%
+ \noexpand\pgf@yb=\the\pgf@ya\space%
+ % upper right:
+ \noexpand\pgf@xc=\the\pgf@xb\space%
+ \noexpand\pgf@yc=\the\pgf@yb\space%
+ }%
+}%
+\def\pgf@intersect@boundingbox@assign@b{%
+ \edef\pgf@intersect@boundingbox@b{%
+ % lower left:
+ \noexpand\global\noexpand\pgf@x=\the\pgf@xa\space%
+ \noexpand\global\noexpand\pgf@y=\the\pgf@ya\space%
+ % upper right:
+ \noexpand\pgf@xa=\the\pgf@xb\space%
+ \noexpand\pgf@ya=\the\pgf@yb\space%
+ }%
+}%
+
+% see \pgf@intersect@boundingbox@assign@a and \pgf@intersect@boundingbox@assign@b for the naming conventions
+\def\pgf@intersect@boundingbox@ifoverlap{%
+ \def\pgf@intersect@next{\pgfutil@secondoftwo}%
+ %
+ \ifdim\pgf@xa<\pgf@xb%
+ \else%
+ \ifdim\pgf@x>\pgf@xc%
+ \else%
+ \ifdim\pgf@ya<\pgf@yb%
+ \else%
+ \ifdim\pgf@y>\pgf@yc%
+ \else%
+ \def\pgf@intersect@next{\pgfutil@firstoftwo}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgf@intersect@next
+}%
+\def\pgf@intersect@boundingbox@ifoverlap@upperbound{%
+ \begingroup
+ \def\pgf@intersect@next{\pgfutil@secondoftwo}%
+ %
+ \advance\pgf@xa by+\pgfintersectiontolerance\relax
+ \ifdim\pgf@xa<\pgf@xb%
+ \else%
+ \global\advance\pgf@x by-\pgfintersectiontolerance\relax
+ \ifdim\pgf@x>\pgf@xc%
+ \else%
+ \advance\pgf@ya by\pgfintersectiontolerance\relax
+ \ifdim\pgf@ya<\pgf@yb%
+ \else%
+ \global\advance\pgf@y by-\pgfintersectiontolerance\relax
+ \ifdim\pgf@y>\pgf@yc%
+ \else%
+ \def\pgf@intersect@next{\pgfutil@firstoftwo}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \expandafter
+ \endgroup
+ \pgf@intersect@next
+}%
+\def\pgf@intersect@boundingbox@ifoverlap@UNUSED{%
+ \let\pgf@intersect@next=\pgfutil@secondoftwo%
+ \ifdim\pgf@xa<\pgf@xb%
+ \else%
+ \ifdim\pgf@x>\pgf@xc%
+ \else%
+ \ifdim\pgf@ya<\pgf@yb%
+ \else%
+ \ifdim\pgf@y>\pgf@yc%
+ \else%
+ \let\pgf@intersect@next=\pgfutil@firstoftwo%
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgf@intersect@next
+}%
+\def\pgf@@intersectionofcurves#1#2#3#4#5#6#7#8{%
+ \pgf@intersect@boundingbox@reset%
+ \pgf@intersect@boundingbox@update{#1}%
+ \pgf@intersect@boundingbox@update{#2}%
+ \pgf@intersect@boundingbox@update{#3}%
+ \pgf@intersect@boundingbox@update{#4}%
+ \pgf@intersect@boundingbox@assign@b%
+ %
+ \pgf@intersect@boundingbox@reset%
+ \pgf@intersect@boundingbox@update{#5}%
+ \pgf@intersect@boundingbox@update{#6}%
+ \pgf@intersect@boundingbox@update{#7}%
+ \pgf@intersect@boundingbox@update{#8}%
+ \pgf@intersect@boundingbox@assign@a%
+ %
+ \pgf@intersect@boundingbox@a%
+ \pgf@intersect@boundingbox@b%
+ %
+ \pgf@intersect@boundingbox@ifoverlap{%
+ \pgf@@@intersectionofcurves{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ }{%
+ % no overlap -- no intersection.
+ }%
+}%
+
+\def\pgf@@@intersectionofcurves#1#2#3#4#5#6#7#8{%
+ % compute DIFFERENCE vectors:
+ \advance\pgf@xc by-\pgf@xb%
+ \advance\pgf@yc by-\pgf@yb%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \let\pgf@intersect@subdivde=\relax%
+ % check if both difference vectors are point wise
+ % less than tolerance (i.e. |v|_infty < eps ).
+ % That means that both bounding boxes are "small enough"
+ \ifdim\pgf@xc<\pgfintersectiontolerance\relax%
+ \ifdim\pgf@xa<\pgfintersectiontolerance\relax%
+ \ifdim\pgf@yc<\pgfintersectiontolerance\relax%
+ \ifdim\pgf@ya<\pgfintersectiontolerance\relax%
+ \pgfextract@process\pgf@intersect@solution@candidate{%
+ % set (x,y) = mean(the 4 points of the two bounding boxes):
+ \pgf@intersect@boundingbox@a%
+ \pgf@intersect@boundingbox@b%
+ \pgf@x=0.25\pgf@x%
+ \advance\pgf@x by0.25\pgf@xa%
+ \advance\pgf@x by0.25\pgf@xb%
+ \advance\pgf@x by0.25\pgf@xc%
+ \pgf@y=0.25\pgf@y%
+ \advance\pgf@y by0.25\pgf@ya%
+ \advance\pgf@y by0.25\pgf@yb%
+ \advance\pgf@y by0.25\pgf@yc%
+ }%
+ % We must avoid duplicate solutions.
+ \let\pgf@intersect@subdivde=\pgf@stop%
+ \pgf@ifsolution@duplicate\pgf@intersect@solution@candidate{}%
+ {%
+ \global\advance\pgf@intersect@solutions by1\relax%
+ \begingroup
+ \advance\pgf@time@a by\pgf@time@aa%
+ \divide\pgf@time@a by2\relax%
+ \advance\pgf@time@a by\pgf@intersect@time@offset pt\relax%
+ \edef\pgf@intersect@time@a{\pgfmath@tonumber{\pgf@time@a}}%
+ %
+ \advance\pgf@time@b by\pgf@time@bb%
+ \divide\pgf@time@b by2\relax%
+ \advance\pgf@time@b by\pgf@intersect@time@offset@b pt\relax%
+ \edef\pgf@intersect@time@b{\pgfmath@tonumber{\pgf@time@b}}%
+ %
+ \pgf@intersection@store@properties{pgfpoint@g@intersect@solution@\the\pgf@intersect@solutions}%
+ \expandafter\global\expandafter\let%
+ \csname pgfpoint@g@intersect@solution@\the\pgf@intersect@solutions\endcsname=%
+ \pgf@intersect@solution@candidate%
+ \ifpgf@intersect@sort%
+ \expandafter\xdef%
+ \csname pgf@g@intersect@solution@\the\pgf@intersect@solutions @time@a\endcsname%
+ {\pgf@intersect@time@a}%
+ \fi%
+ \endgroup
+ }%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@intersect@subdivde\pgf@stop%
+ \else%
+ \pgf@intersect@subdivide@curve{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ \fi%
+}%
+
+\def\pgf@intersect@subdivide@curve@b#1#2#3#4#5#6#7#8{%
+ \begingroup%
+ \advance\pgf@time@bb by\pgf@time@b\relax%
+ \divide\pgf@time@bb by2\relax%
+ \let\pgf@intersect@subdivide@curve=\pgf@intersect@subdivide@curve@a%
+ \pgf@curve@subdivide@left{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
+ \endgroup%
+ \begingroup%
+ \advance\pgf@time@b by\pgf@time@bb\relax%
+ \divide\pgf@time@b by2\relax%
+ \let\pgf@intersect@subdivide@curve=\pgf@intersect@subdivide@curve@a%
+ \pgf@curve@subdivide@right{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
+ \endgroup%
+}%
+
+\def\pgf@intersect@subdivide@curve@a#1#2#3#4#5#6#7#8{%
+ \begingroup%
+ \advance\pgf@time@aa by\pgf@time@a\relax%
+ \divide\pgf@time@aa by2\relax%
+ \let\pgf@intersect@subdivide@curve=\pgf@intersect@subdivide@curve@b%
+ \pgf@curve@subdivide@left{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
+ \endgroup%
+ \begingroup%
+ \advance\pgf@time@a by\pgf@time@aa\relax%
+ \divide\pgf@time@a by2\relax%
+ \let\pgf@intersect@subdivide@curve=\pgf@intersect@subdivide@curve@b%
+ \pgf@curve@subdivide@right{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
+ \endgroup%
+}%
+
+\def\pgf@intersect@boundingbox@reset{%
+ \pgf@xa=16000pt\relax%
+ \pgf@ya=16000pt\relax%
+ \pgf@xb=-16000pt\relax%
+ \pgf@yb=-16000pt\relax%
+}%
+
+\def\pgf@intersect@boundingbox@update#1{%
+ #1\relax%
+ \ifdim\pgf@x<\pgf@xa\pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya\pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@x>\pgf@xb\pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y>\pgf@yb\pgf@yb=\pgf@y\fi%
+}%
+
+% The following subroutines are part of a conversion from pgfbasic
+% math to FPU. This transition is necessary due to the restricted
+% accuracy of pgfbasic. In order to limit the error rate of the
+% transition pgfbasic -> FPU, I chose to
+% keep the old "pattern" of sorts \advance\pgf@xa by0.5\pgf@y etc and
+% simply adapt to some FPU call.
+%
+% The following routines constitute the "adapter":
+
+\def\pgf@float@adapter@setxy{%
+ \pgfmathfloatparsenumber{\pgf@sys@tonumber\pgf@x}\let\pgf@fpu@x=\pgfmathresult
+ \pgfmathfloatparsenumber{\pgf@sys@tonumber\pgf@y}\let\pgf@fpu@y=\pgfmathresult
+}%
+\def\pgf@float@adapter@mult#1=#2*#3{%
+ \pgfmathfloatmultiplyfixed@{#3}{#2}%
+ \let#1=\pgfmathresult
+}%
+\def\pgf@float@adapter@advance#1by#2*#3{%
+ \pgfmathfloatmultiplyfixed@{#3}{#2}%
+ \let\pgfutil@temp=\pgfmathresult
+ \pgfmathfloatadd@{#1}{\pgfutil@temp}%
+ \let#1=\pgfmathresult
+}%
+
+\def\pgf@float@adapter@tostring#1{%
+ \pgfmathfloattofixed{#1}\edef#1{\pgfmathresult pt }%
+}%
+
+\def\pgf@curve@subdivide@left#1#2#3#4{%
+ %
+ % The left curve (from t=0 to t=.5)
+ %
+ \begingroup
+ #1\relax%
+ \pgfutil@tempdima=\pgf@x%
+ \pgfutil@tempdimb=\pgf@y%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@mult\pgf@fpu@xa=.5*\pgf@fpu@x \pgf@float@adapter@mult\pgf@fpu@ya=.5*\pgf@fpu@y%
+ \pgf@float@adapter@mult\pgf@fpu@xb=.25*\pgf@fpu@x \pgf@float@adapter@mult\pgf@fpu@yb=.25*\pgf@fpu@y%
+ \pgf@float@adapter@mult\pgf@fpu@xc=.125*\pgf@fpu@x\pgf@float@adapter@mult\pgf@fpu@yc=.125*\pgf@fpu@y%
+ #2\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@advance\pgf@fpu@xa by.5*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@ya by.5*\pgf@fpu@y%
+ \pgf@float@adapter@advance\pgf@fpu@xb by.5*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@yb by.5*\pgf@fpu@y%
+ \pgf@float@adapter@advance\pgf@fpu@xc by.375*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@yc by.375*\pgf@fpu@y%
+ #3\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@advance\pgf@fpu@xb by.25*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@yb by.25*\pgf@fpu@y%
+ \pgf@float@adapter@advance\pgf@fpu@xc by.375*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@yc by.375*\pgf@fpu@y%
+ #4\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@advance\pgf@fpu@xc by.125*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@yc by.125*\pgf@fpu@y%
+ %
+ \pgf@float@adapter@tostring\pgf@fpu@xa
+ \pgf@float@adapter@tostring\pgf@fpu@ya
+ \pgf@float@adapter@tostring\pgf@fpu@xb
+ \pgf@float@adapter@tostring\pgf@fpu@yb
+ \pgf@float@adapter@tostring\pgf@fpu@xc
+ \pgf@float@adapter@tostring\pgf@fpu@yc
+ \edef\pgf@marshal{%
+ \noexpand\pgf@curve@subdivde@after%
+ {\noexpand\pgf@x=\the\pgfutil@tempdima\noexpand\pgf@y=\the\pgfutil@tempdimb}%
+ {\noexpand\pgf@x=\pgf@fpu@xa\noexpand\pgf@y=\pgf@fpu@ya}%
+ {\noexpand\pgf@x=\pgf@fpu@xb\noexpand\pgf@y=\pgf@fpu@yb}%
+ {\noexpand\pgf@x=\pgf@fpu@xc\noexpand\pgf@y=\pgf@fpu@yc}%
+ }%
+ \expandafter
+ \endgroup
+ \pgf@marshal%
+}%
+
+\def\pgf@curve@subdivide@right#1#2#3#4{%
+ %
+ % The right curve (from t=0.5 to t=1)
+ %
+ \begingroup
+ #1\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@mult\pgf@float@tmpa=.125*\pgf@fpu@x\pgf@float@adapter@mult\pgf@float@tmpb=.125*\pgf@fpu@y%
+ #2\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@advance\pgf@float@tmpa by.375*\pgf@fpu@x\pgf@float@adapter@advance\pgf@float@tmpb by.375*\pgf@fpu@y%
+ \pgf@float@adapter@mult\pgf@fpu@xa=.25*\pgf@fpu@x\pgf@float@adapter@mult\pgf@fpu@ya=.25*\pgf@fpu@y%
+ #3\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@advance\pgf@float@tmpa by.375*\pgf@fpu@x\pgf@float@adapter@advance\pgf@float@tmpb by.375*\pgf@fpu@y%
+ \pgf@float@adapter@advance\pgf@fpu@xa by.5*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@ya by.5*\pgf@fpu@y%
+ \pgf@float@adapter@mult\pgf@fpu@xb=.5*\pgf@fpu@x\pgf@float@adapter@mult\pgf@fpu@yb=.5*\pgf@fpu@y%
+ #4\relax%
+ \pgf@float@adapter@setxy
+ \pgf@float@adapter@advance\pgf@float@tmpa by.125*\pgf@fpu@x\pgf@float@adapter@advance\pgf@float@tmpb by.125*\pgf@fpu@y%
+ \pgf@float@adapter@advance\pgf@fpu@xa by.25*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@ya by.25*\pgf@fpu@y%
+ \pgf@float@adapter@advance\pgf@fpu@xb by.5*\pgf@fpu@x\pgf@float@adapter@advance\pgf@fpu@yb by.5*\pgf@fpu@y%
+ \let\pgf@fpu@xc=\pgf@fpu@x\let\pgf@fpu@yc=\pgf@fpu@y%
+ %
+ \pgf@float@adapter@tostring\pgf@float@tmpa
+ \pgf@float@adapter@tostring\pgf@float@tmpb
+ \pgf@float@adapter@tostring\pgf@fpu@xa
+ \pgf@float@adapter@tostring\pgf@fpu@ya
+ \pgf@float@adapter@tostring\pgf@fpu@xb
+ \pgf@float@adapter@tostring\pgf@fpu@yb
+ \pgf@float@adapter@tostring\pgf@fpu@xc
+ \pgf@float@adapter@tostring\pgf@fpu@yc
+ \edef\pgf@marshal{%
+ \noexpand\pgf@curve@subdivde@after%
+ {\noexpand\pgf@x=\pgf@float@tmpa\noexpand\pgf@y=\pgf@float@tmpb}%
+ {\noexpand\pgf@x=\pgf@fpu@xa\noexpand\pgf@y=\pgf@fpu@ya}%
+ {\noexpand\pgf@x=\pgf@fpu@xb\noexpand\pgf@y=\pgf@fpu@yb}%
+ {\noexpand\pgf@x=\pgf@fpu@xc\noexpand\pgf@y=\pgf@fpu@yc}%
+ }%
+ \expandafter
+ \endgroup
+ \pgf@marshal%
+}%
+
+
+% A solution S1 is considered a duplicate of S2, if
+%
+% |x1 - x2|f < q and |y1 - y2|f < q
+%
+% where q is a small value (tolerance).
+%
+% #1 - the solution.
+%
+\def\pgf@ifsolution@duplicate#1{%
+ #1%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \let\pgf@intersect@next=\pgfutil@secondoftwo%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@intersect@solutions\relax%
+ \else%
+ \pgf@ifsolution@duplicate@{\pgfmathcounter}%
+ \repeatpgfmathloop%
+ \pgf@intersect@next%
+}%
+
+\def\pgf@ifsolution@duplicate@#1{%
+ \pgf@process{\csname pgfpoint@g@intersect@solution@#1\endcsname}%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \ifdim\pgf@x<0pt\relax\pgf@x=-\pgf@x\fi%
+ \ifdim\pgf@y<0pt\relax\pgf@y=-\pgf@y\fi%
+ %
+ \pgf@x=\pgfintersectiontolerancefactor\pgf@x%
+ \pgf@y=\pgfintersectiontolerancefactor\pgf@y%
+ \ifdim\pgf@x<\pgfintersectiontolerance\relax%
+ \ifdim\pgf@y<\pgfintersectiontolerance\relax%
+ \let\pgf@intersect@next=\pgfutil@firstoftwo%
+ \fi%
+ \fi%
+}%
+
+\newif\ifpgf@intersect@solutions@sortfinish
+
+% Sort solutions according to their time index.
+%
+\def\pgfintersectionsolutionsortbytime{%
+ \pgf@intersect@solutions@sortfinishtrue%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter<\pgfintersectionsolutions\relax%
+ \pgfutil@tempcnta=\pgfmathcounter%
+ \advance\pgfutil@tempcnta by1\relax%
+ \ifdim\csname pgf@intersect@solution@\pgfmathcounter @time@a\endcsname pt>%
+ \csname pgf@intersect@solution@\the\pgfutil@tempcnta @time@a\endcsname pt\relax%
+ \pgf@intersect@solutions@sortfinishfalse%
+ %
+ \pgfintersectionsolutionsortbytime@swap{pgfpoint@intersect@solution@\pgfmathcounter}%
+ {pgfpoint@intersect@solution@\the\pgfutil@tempcnta}%
+ %
+ \pgfintersectionsolutionsortbytime@swap{pgf@intersect@solution@\pgfmathcounter @time@a}%
+ {pgf@intersect@solution@\the\pgfutil@tempcnta @time@a}%
+ %
+ \pgfintersectionsolutionsortbytime@swap{pgf@intersect@solution@props@\pgfmathcounter}%
+ {pgf@intersect@solution@props@\the\pgfutil@tempcnta}%
+ \fi%
+ \repeatpgfmathloop%
+ \ifpgf@intersect@solutions@sortfinish%
+ \else%
+ \expandafter\pgfintersectionsolutionsortbytime%
+ \fi%
+}%
+
+\def\pgfintersectionsolutionsortbytime@swap#1#2{%
+ \pgfutil@namelet{pgf@intersect@temp}{#1}%
+ \pgfutil@namelet{#1}{#2}%
+ \pgfutil@namelet{#2}{pgf@intersect@temp}%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarylindenmayersystems.code.tex b/graphics/pgf/base/tex/pgflibrarylindenmayersystems.code.tex
new file mode 100644
index 0000000000..bec0c855cd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarylindenmayersystems.code.tex
@@ -0,0 +1,229 @@
+% Copyright 2008 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.
+
+\newdimen\pgflsystemstep
+\newcount\c@pgf@lsystem@iteration
+
+\newif\ifpgf@lsystem@randomize@step
+\newif\ifpgf@lsystem@randomize@angle
+
+\pgfkeys{/pgf/lindenmayer system/.cd,%
+ step/.code={\pgfmathsetlength\pgflsystemstep{#1}},%
+ randomize step percent/.code={%
+ \pgfmathparse{#1}%
+ \let\pgflsystemrandomizesteppercent=\pgfmathresult%
+ \ifdim\pgfmathresult pt=0pt\relax%
+ \pgf@lsystem@randomize@stepfalse%
+ \else%
+ \pgf@lsystem@randomize@steptrue%
+ \fi%
+ },%
+ left angle/.code={\pgfmathparse{#1}\let\pgflsystemleftangle=\pgfmathresult},%
+ right angle/.code={\pgfmathparse{#1}\let\pgflsystemrightangle=\pgfmathresult},%
+ angle/.style={/pgf/lindenmayer system/left angle=#1, /pgf/lindenmayer system/right angle=#1},%
+ randomize angle percent/.code={%
+ \pgfmathparse{#1}%
+ \let\pgflsystemrandomizeanglepercent=\pgfmathresult%
+ \ifdim\pgfmathresult pt=0pt\relax%
+ \pgf@lsystem@randomize@anglefalse%
+ \else%
+ \pgf@lsystem@randomize@angletrue%
+ \fi%
+ }%
+}%
+
+\pgfkeys{/pgf/lindenmayer system/.cd,
+ step=5pt,%
+ randomize step percent=0,%
+ angle=90,%
+ randomize angle percent=0%
+}%
+
+\long\def\pgfdeclarelindenmayersystem#1#2{%
+ \pgfutil@ifundefined{pgf@lsystem@#1}%
+ {%
+ \begingroup%
+ \edef\pgf@lsystem@name{#1}%
+ \expandafter\global\expandafter\let\csname pgf@lsystem@#1\endcsname=\pgf@lsystem@name%
+ \let\symbol=\pgf@lsystem@symbol%
+ \let\rule=\pgf@lsystem@rule%
+ #2%
+ \endgroup%
+ }%
+ {\pgferror{Lindenmayer system `#1' is already defined}}%
+}%
+
+\def\pgf@lsystem@symbol#1#2{%
+ \expandafter\gdef\csname pgf@lsystem@\pgf@lsystem@name @symbol@#1\endcsname{#2}%
+}%
+
+\def\pgf@lsystem@rule#1{\expandafter\pgf@lsystem@rule@#1\pgf@stop}%
+\def\pgf@lsystem@rule@#1{\def\pgf@lsystem@rule@head{#1}\pgf@lsystem@rule@@}%
+\def\pgf@lsystem@rule@@#1->{% Now some `fooling around' to deal with unwanted spaces.
+ \let\pgf@lsystem@rule@body=\pgfutil@empty%
+ \pgfutil@ifnextchar x{\pgf@lsystem@rule@@@}{\pgf@lsystem@rule@@@}}%
+\def\pgf@lsystem@rule@@@#1{%
+ \ifx#1\pgf@stop%
+ \expandafter\global\expandafter\let%
+ \csname pgf@lsystem@\pgf@lsystem@name @rule@\pgf@lsystem@rule@head\endcsname=\pgf@lsystem@rule@body%
+ \else%
+ \edef\pgf@lsystem@rule@body{\pgf@lsystem@rule@body#1}%
+ \expandafter\pgf@lsystem@rule@@@%
+ \fi%
+}%
+
+\def\pgflindenmayersystem#1#2#3{%
+ \begingroup%
+ \edef\pgf@lsystem@name{#1}%
+ \edef\pgf@lsystem@axiom{#2}%
+ \pgfmathtruncatemacro\pgf@lsystem@order{#3}%
+ %
+ \let\pgf@lsystem@current@symbol=\relax%
+ %
+ \c@pgf@lsystem@iteration=0\relax%
+ %
+ \ifnum\pgf@lsystem@order=0\relax%
+ \expandafter\pgf@lsystem@draw\pgf@lsystem@axiom\pgf@stop
+ \let\pgf@lsystem@next=\pgf@lsystem@end%
+ \else%
+ \let\pgf@lsystem@next=\pgf@lsystem@run%
+ \fi%
+ \expandafter\pgf@lsystem@next\pgf@lsystem@axiom\pgf@lsystem@stop%
+}%
+
+\def\pgf@lsystem@run#1{%
+ \ifx#1\pgf@lsystem@stop%
+ \def\pgf@lsystem@token{\pgf@lsystem@stop}%
+ \let\pgf@lsystem@next=\pgf@lsystem@end%
+ \else%
+ \ifx#1\pgf@stop%
+ \advance\c@pgf@lsystem@iteration by-1\relax%
+ \let\pgf@system@token=\pgfutil@empty%
+ \let\pgf@lsystem@next=\pgf@lsystem@run%
+ \else%
+ % Does #1 appear on the RHS of a rule...?
+ \expandafter\let\expandafter\pgf@lsystem@token\expandafter=%
+ \csname pgf@lsystem@\pgf@lsystem@name @rule@#1\endcsname%
+ \ifx\pgf@lsystem@token\relax%
+ % ...nope. So draw it straight away.
+ \pgf@lsystem@draw#1\pgf@stop%
+ \let\pgf@lsystem@token=\pgfutil@empty%
+ \else%
+ % ...yep. So, if the order has been reached draw the LHS
+ % immediately. Otherwise add the LHS to the token stream
+ % and continue.
+ \advance\c@pgf@lsystem@iteration by1\relax%
+ \ifnum\c@pgf@lsystem@iteration=\pgf@lsystem@order%
+ \expandafter\pgf@lsystem@draw\pgf@lsystem@token \pgf@stop%
+ \advance\c@pgf@lsystem@iteration by-1\relax%
+ \let\pgf@lsystem@token=\pgfutil@empty%
+ \else%
+ \expandafter\def\expandafter\pgf@lsystem@token\expandafter{\pgf@lsystem@token \pgf@stop}%
+ \fi%
+ \fi%
+ \let\pgf@lsystem@next=\pgf@lsystem@run%
+ \fi%
+ \fi%
+ \expandafter\pgf@lsystem@next\pgf@lsystem@token}%
+
+\def\pgf@lsystem@end#1\pgf@lsystem@stop{\endgroup}%
+
+\def\pgf@lsystem@draw#1{%
+ \ifx#1\pgf@stop%
+ \let\pgf@lsystem@next=\relax%
+ \else%
+ \expandafter\let\expandafter\pgf@lsystem@current@symbol\expandafter=%
+ \csname pgf@lsystem@\pgf@lsystem@name @symbol@#1\endcsname%
+ \ifx\pgf@lsystem@current@symbol\relax% Try a default symbol.
+ \expandafter\let\expandafter\pgf@lsystem@current@symbol\expandafter=%
+ \csname pgf@lsystem@symbol@default@#1\endcsname%
+ \fi%
+ \let\pgf@lsystem@next=\pgf@lsystem@@draw%
+ \fi%
+ \pgf@lsystem@next}%
+
+\def\pgf@lsystem@@draw{%
+ \edef\pgflsystemcurrentstep{\the\pgflsystemstep}%
+ \let\pgflsystemcurrentrightangle=\pgflsystemrightangle%
+ \let\pgflsystemcurrentrightangle=\pgflsystemleftangle%
+ \pgf@lsystem@current@symbol%
+ \pgf@lsystem@draw}%
+
+\expandafter\def\csname
+pgf@lsystem@symbol@default@F\endcsname{\pgflsystemdrawforward}%
+\expandafter\def\csname
+pgf@lsystem@symbol@default@f\endcsname{\pgflsystemmoveforward}%
+\expandafter\def\csname
+pgf@lsystem@symbol@default@+\endcsname{\pgflsystemturnleft}%
+\expandafter\def\csname
+pgf@lsystem@symbol@default@-\endcsname{\pgflsystemturnright}%
+\expandafter\def\csname
+pgf@lsystem@symbol@default@[\endcsname{\pgflsystemsavestate}%
+\expandafter\def\csname
+pgf@lsystem@symbol@default@]\endcsname{\pgflsystemrestorestate}%
+
+\def\pgflsystemradonmizestep{%
+ \ifpgf@lsystem@randomize@step%
+ \pgfmathrand%
+ \pgf@x=\pgflsystemrandomizesteppercent pt\relax%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \divide\pgf@x by20\relax%
+ \advance\pgf@x by\pgflsystemstep\relax%
+ \edef\pgflsystemcurrentstep{\the\pgf@x}%
+ \else%
+ \edef\pgflsystemcurrentstep{\the\pgflsystemstep}%
+ \fi%
+}%
+
+\def\pgflsystemdrawforward{%
+ \pgflsystemradonmizestep
+ \pgftransformxshift{+\pgflsystemcurrentstep}%
+ \pgfpathlineto{\pgfpointorigin}}%
+
+\def\pgflsystemmoveforward{%
+ \pgflsystemradonmizestep
+ \pgftransformxshift{+\pgflsystemcurrentstep}%
+ \pgfpathmoveto{\pgfpointorigin}}%
+
+\def\pgflsystemranomizerightangle{%
+ \ifpgf@lsystem@randomize@angle%
+ \pgf@x=\pgflsystemrandomizeanglepercent pt\relax%
+ \divide\pgf@x by20\relax%
+ \pgfmathrand%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \advance\pgf@x by\pgflsystemrightangle pt\relax%
+ \edef\pgflsystemcurrentrightangle{\pgfmath@tonumber{\pgf@x}}%
+ \else%
+ \let\pgflsystemcurrentrightangle=\pgflsystemrightangle%
+ \fi%
+}%
+
+\def\pgflsystemranomizeleftangle{%
+ \ifpgf@lsystem@randomize@angle%
+ \pgf@x=\pgflsystemrandomizeanglepercent pt\relax%
+ \divide\pgf@x by20\relax%
+ \pgfmathrand%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \advance\pgf@x by\pgflsystemleftangle pt\relax%
+ \edef\pgflsystemcurrentleftangle{\pgfmath@tonumber{\pgf@x}}%
+ \else%
+ \let\pgflsystemcurrentleftangle=\pgflsystemleftangle%
+ \fi%
+}%
+
+\def\pgflsystemturnright{%
+ \pgflsystemranomizerightangle
+ \pgftransformrotate{-\pgflsystemcurrentrightangle}}%
+
+\def\pgflsystemturnleft{%
+ \pgflsystemranomizeleftangle
+ \pgftransformrotate{\pgflsystemcurrentleftangle}}%
+
+\def\pgflsystemsavestate{\begingroup}%
+\def\pgflsystemrestorestate{\endgroup\pgfpathmoveto{\pgfpointorigin}}%
diff --git a/graphics/pgf/base/tex/pgflibraryluamath.code.tex b/graphics/pgf/base/tex/pgflibraryluamath.code.tex
new file mode 100644
index 0000000000..7a94b6f8fd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryluamath.code.tex
@@ -0,0 +1,558 @@
+% Copyright 2011 by Christophe Jorssen and Mark Wibrow
+% Copyright 2014 by Christian Feuersänger
+%
+% 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.
+%
+% $Id$
+%
+%
+% This is a library for a LUA math parser and LUA math operations.
+% Advantage compared to its TeX pendant: it is FASTER and has HIGHER
+% ACCURACY.
+% Disadvantage: any function declared by means of
+% \pgfmathdeclarefunction is NOT automatically transported to the LUA
+% side (at the time of this writing).
+% LUA functions need to be defined by means of LUA code
+%
+% function pgfluamathfunctions.myoperation(a,b)
+% return a*2*b
+% end
+%
+% this will automatically set up 'myoperation' for use in
+% \pgfluamathparse{myoperation(4,2)}
+%
+% The library has TWO use-cases which are more or less distinct: one
+% is to use LUA for all math function, but not for math expression
+% parsing -- this was still under control of the TeX math parser.
+% This approach works like the 'fpu' library.
+%
+% The second approach is to use LUA to parse all math expressions -
+% but if someone calls \pgfmathadd@{1}{2}, it would use the TeX
+% command. This approach is relatively lightweight because it does not
+% need to substitute all \pgfmath* macros.
+%
+% One can mix both modes.
+
+% *******************************************************************
+% Some luatex stuff. Should be put elsewhere (e.g. in
+% pgfutil-luatex-engine).
+
+\edef\pgfliblua@oldcatcodedoublequote{\the\catcode`\"}%
+\catcode`\"=12
+
+% We assume luatex version > 0.39:
+% - \directlua <general text> will work
+% - \directlua is the only luatex primitive that we can assume
+% accessible without being prefixed by the format via
+% tex.enableprimitives.
+% Ideas taken from the ifluatex package (Heiko Oberdiek)
+\let\pgfutil@ifluatex\iffalse
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname directlua\endcsname\relax
+\else
+ \expandafter\let\csname pgfutil@ifluatex\expandafter\endcsname
+ \csname iftrue\endcsname
+\fi
+
+\pgfutil@ifluatex
+ \let\pgfutil@directlua\directlua
+ \pgfutil@directlua{%
+ tex.enableprimitives('pgfutil@',{'luaescapestring'})}%
+\else
+ \def\pgfutil@directlua#1{}%
+ \def\pgfutil@luaescapestring#1{}%
+\fi
+
+\pgfutil@directlua{%
+ pgfluamathfunctions = require("pgf.luamath.functions")
+ pgfluamathparser = require("pgf.luamath.parser")}%
+
+
+% Patch some configuration macros such that the modifications are
+% available in LUA as well:
+\pgfkeys{
+ /pgf/trig format/deg/.add code={}{\directlua{pgfluamathfunctions.setTrigFormat("deg")}\aftergroup\pgfmath@settrigformat},
+ /pgf/trig format/rad/.add code={}{\directlua{pgfluamathfunctions.setTrigFormat("rad")}\aftergroup\pgfmath@settrigformat},
+}%
+% ... and reactivate the key:
+\pgfmathiftrigonometricusesdeg{%
+ \pgfkeys{/pgf/trig format/deg}%
+}{%
+ \pgfkeys{/pgf/trig format/rad}%
+}%
+
+% re-activates the current trig format. This is important after a TeX
+% group has been closed.
+\def\pgfmath@settrigformat{%
+ \pgfmathiftrigonometricusesdeg{%
+ \directlua{pgfluamathfunctions.setTrigFormat("deg")}%
+ }{%
+ \directlua{pgfluamathfunctions.setTrigFormat("rad")}%
+ }%
+}%
+
+\let\pgfmathsetseed@pgfbasic = \pgfmathsetseed
+\def\pgfmathsetseed#1{%
+ \pgfmathsetseed@pgfbasic{#1}%
+ \directlua{pgfluamathfunctions.setRandomSeed(pgfluamathfunctions.tonumber("\pgfmathresult"))}%
+}%
+
+% Patch 'declare function' such that it communicates the function
+% directly to LUA.
+\let\pgfmathnotifynewdeclarefunction@orig=\pgfmathnotifynewdeclarefunction
+\def\pgfmathnotifynewdeclarefunction#1#2#3{%
+ \pgfmathnotifynewdeclarefunction@orig{#1}{#2}{#3}%
+ %
+ % we have to check if '#3' contains control sequences.
+ % this is highly tricky as it may contain '#1'...
+ \begingroup
+ \toks0={#3}%
+ \xdef\pgf@marshal@glob{\the\toks0 }%
+ \endgroup
+ \pgfutil@command@to@string\pgf@marshal@glob\pgf@marshal
+ \expandafter\pgfutilifcontainsmacro\expandafter{\pgf@marshal}{%
+ \def\pgf@temp{1}%
+ }{%
+ \def\pgf@temp{0}%
+ }%
+ \if1\pgf@temp
+ % let lua produce an error when evaluating this function -- we cannot possibly expand the macro to its current state:
+ \directlua{pgfluamathparser.pushLocalExpressionFunction(%
+ "\pgfutil@luaescapestring{#1}",%
+ #2,%
+ "functionMustBeEvaluatedInTeX")}%
+ \else
+ \directlua{pgfluamathparser.pushLocalExpressionFunction(%
+ "\pgfutil@luaescapestring{#1}",%
+ #2,%
+ "\pgfutil@luaescapestring{#3}")}%
+ \fi
+ %
+ % ensure that the local function is removed at the end of the
+ % scope. To this end, we maintain a stack on the LUA side.
+ \aftergroup\pgfluamathparse@pop@local@function
+}%
+
+\def\pgfluamathparse@pop@local@function{%
+ \directlua{pgfluamathparser.popLocalExpressionFunction()}%
+}%
+
+% End of luatex stuff
+% *******************************************************************
+
+% Loading part: based on fpu library
+
+
+% if LUA failed to evaluate the expression, it will be evaluated in
+% TeX as fallback. This boolean defines if the error message shall be
+% shown or suppressed. The default is to suppress it and show any
+% resulting TeX errors.
+%
+% If LUA fails \pgfmathresult will be empty.
+%
+% This is actually only for debugging; it will be set implicitly when
+% activating/deactivating TeX fallback.
+\newif\ifpgfluamathshowerrormessage
+
+% Defines what happens if LUA failed to evaluate the expression: if
+% this is true, the TeX parser will be invoked as fallback.
+%
+% This happens
+% - for \chardef'ed boxes for which LUA lacks evaluation capabilities
+% - if the expression includes some function which is unavailable in
+% LUA (defined only in TeX)
+% - some special cases which simply haven't been added to the LUA
+% parser (yet).
+% At the time of this writing, this includes
+% -- arrays created via '{}' and indexed with '[]'
+% -- strings with "<str>"
+% -- 'scalar' function
+% -- hex/octal/binary input
+\newif\ifpgfluamathenableTeXfallback
+
+\newif\ifpgfluamathcomputationactive
+\newif\ifpgfluamathparseractive
+
+\def\pgfluamath@makecomputationactive{%
+ \ifpgfluamathcomputationactive
+ \else
+ \pgfluamath@checkuninstallcmd%
+ \pgfluamath@install%
+ \pgfluamathcomputationactivetrue
+ \fi}%
+
+\def\pgfluamath@makecomputationinactive{%
+ \ifpgfluamathcomputationactive
+ \pgfluamath@uninstall%
+ \pgfluamathcomputationactivefalse
+ \fi}%
+
+\let\pgfluamath@pgfmathparse\pgfmathparse
+\def\pgfluamath@makeparseractive{%
+ \ifpgfluamathparseractive
+ \else
+ \let\pgfluamath@pgfmathparse\pgfmathparse
+ \let\pgfmathparse\pgfluamathparse
+ \let\pgfmath@iftrue=\pgfmathluamath@iftrue
+ \pgfluamathparseractivetrue
+ \fi}%
+
+\let\pgfmath@iftrue@basic=\pgfmath@iftrue
+
+\def\pgfluamath@makeparserinactive{%
+ \ifpgfluamathparseractive
+ \let\pgfmathparse\pgfluamath@pgfmathparse
+ \let\pgfmath@iftrue=\pgfmath@iftrue@basic
+ \pgfluamathparseractivefalse
+ \fi}%
+
+\pgfqkeys{/pgf}{%
+ % Enable lua-side computation of \pgfmathresult
+ % (will be deactivated after the current TeX group)
+ luamath/.is choice,
+ luamath/only computation/.code={%
+ \pgfutil@ifluatex
+ \pgfluamath@makecomputationactive
+ \pgfluamath@makeparserinactive
+ \else
+ \pgfmath@error{Sorry, you need the luaTeX engine to use the
+ luamath library}%
+ \fi},
+ luamath/parser and computation/.code={%
+ \pgfutil@ifluatex
+ \pgfluamath@makecomputationactive
+ \pgfluamath@makeparseractive
+ \else
+ \pgfmath@error{Sorry, you need the luaTeX engine to use the
+ luamath library}%
+ \fi},
+ luamath/off/.code={%
+ \pgfluamath@makecomputationinactive
+ \pgfluamath@makeparserinactive},
+ luamath/.default=only computation,
+ %
+ % activates ONLY the parser. This is fast and does not replace the
+ % \pgfmath* functions.
+ % @see |parser and computation| which also allows to write
+ % \pgfmathadd{1}{2} to call LUA
+ luamath/parser/.code={%
+ \pgfutil@ifluatex
+ \pgfluamath@makeparseractive
+ \else
+ \pgfmath@error{Sorry, you need the luaTeX engine to use the
+ luamath library}%
+ \fi
+ },
+ luamath/output format/.is choice,
+ luamath/output format/fixed/.code= {\def\pgfluamath@outputformat@choice{0}},
+ % returns results for use in the FPU
+ luamath/output format/float/.code= {\def\pgfluamath@outputformat@choice{1}},
+ luamath/output format/fixed,
+ % this is merely useful for debugging purposes, I guess.
+ luamath/show error message/.is if=pgfluamathshowerrormessage,
+ luamath/enable TeX fallback/.is choice,
+ luamath/enable TeX fallback/true/.code={\pgfluamathenableTeXfallbacktrue\pgfluamathshowerrormessagefalse},
+ luamath/enable TeX fallback/false/.code={\pgfluamathenableTeXfallbackfalse\pgfluamathshowerrormessagetrue},
+ luamath/enable TeX fallback/.default=true,
+ luamath/enable TeX fallback=true,
+}%
+
+\def\pgfluamath@uninstall@appendcmd#1{%
+ \expandafter\gdef\expandafter\pgfluamath@uninstall\expandafter{%
+ \pgfluamath@uninstall #1}}%
+
+% If the uninstall command is already assembled, it will skip the
+% uninstall assemblation.
+\def\pgfluamath@checkuninstallcmd{%
+ \pgfutil@ifundefined{pgfluamath@uninstall}{%
+ \global\let\pgfluamath@uninstall=\pgfutil@empty
+ }{%
+ % We already HAVE an uninstall command (prepared globally).
+ % So: don't waste time assembling one!
+ \def\pgfluamath@uninstall@appendcmd##1{}%
+ \def\pgfluamath@prepareuninstallcmd##1{}%
+ }%
+}%
+
+% This assembles an uninstall command globally ON FIRST USAGE.
+% See \pgfmathfloat@plots@checkuninstallcmd
+\def\pgfluamath@prepareuninstallcmd#1{%
+ \expandafter\global\expandafter\let
+ \csname pgfluamath@backup@\string#1\endcsname=#1%
+ \expandafter\gdef\expandafter\pgfluamath@uninstall\expandafter{%
+ \pgfluamath@uninstall
+ \expandafter\let\expandafter#1\csname pgfluamath@backup@\string#1\endcsname}%
+}%
+
+\def\pgfluamath@install@function#1=#2{%
+ \pgfluamath@prepareuninstallcmd{#1}%
+ \let#1=#2%
+}%
+
+\def\pgfluamath@install{%
+ \pgfluamath@install@function\pgfmathadd@=\pgfluamathadd@%
+ \pgfluamath@install@function\pgfmathsubtract@=\pgfluamathsubtract@%
+ \pgfluamath@install@function\pgfmathneg@=\pgfluamathneg@%
+ \pgfluamath@install@function\pgfmathmultiply@=\pgfluamathmultiply@%
+ \pgfluamath@install@function\pgfmath@iftrue=\pgfmathluamath@iftrue%
+ \pgfluamath@install@function\pgfmathdivide@=\pgfluamathdivide@%
+ % \pgfluamath@install@function\pgfmathdiv@=\pgfluamathdiv@%
+ \pgfluamath@install@function\pgfmathfactorial@=\pgfluamathfactorial@%
+ \pgfluamath@install@function\pgfmathsqrt@=\pgfluamathsqrt@%
+ % \pgfluamath@install@function\pgfmathpow@=\pgfluamathpow@%
+ \pgfluamath@install@function\pgfmathe@=\pgfluamathe@%
+ \pgfluamath@install@function\pgfmathexp@=\pgfluamathexp@%
+ \pgfluamath@install@function\pgfmathln@=\pgfluamathln@%
+ \pgfluamath@install@function\pgfmathlogten@=\pgfluamathlogten@%
+ % \pgfluamath@install@function\pgfmathlogtwo@=\pgfluamathlogtwo@%
+ \pgfluamath@install@function\pgfmathabs@=\pgfluamathabs@%
+ \pgfluamath@install@function\pgfmathmod@=\pgfluamathmod@%
+ \pgfluamath@install@function\pgfmathMod@=\pgfluamathMod@%
+ \pgfluamath@install@function\pgfmathround@=\pgfluamathround@%
+ \pgfluamath@install@function\pgfmathfloor@=\pgfluamathfloor@%
+ \pgfluamath@install@function\pgfmathceil@=\pgfluamathceil@%
+ % \pgfluamath@install@function\pgfmathint@=\pgfluamathint@%
+ % \pgfluamath@install@function\pgfmathfrac@=\pgfluamathfrac@%
+ % \pgfluamath@install@function\pgfmathreal@=\pgfluamathreal@%
+ \pgfluamath@install@function\pgfmathgcd@=\pgfluamathgcd@%
+ \pgfluamath@install@function\pgfmathisprime@=\pgfluamathisprime@%
+ \pgfluamath@install@function\pgfmathpi@=\pgfluamathpi@%
+ \pgfluamath@install@function\pgfmathrad@=\pgfluamathrad@%
+ \pgfluamath@install@function\pgfmathdeg@=\pgfluamathdeg@%
+ \pgfluamath@install@function\pgfmathsin@=\pgfluamathsin@%
+ \pgfluamath@install@function\pgfmathcos@=\pgfluamathcos@%
+ \pgfluamath@install@function\pgfmathtan@=\pgfluamathtan@%
+ \pgfluamath@install@function\pgfmathsec@=\pgfluamathsec@%
+ \pgfluamath@install@function\pgfmathcosec@=\pgfluamathcosec@%
+ \pgfluamath@install@function\pgfmathcot@=\pgfluamathcot@%
+ \pgfluamath@install@function\pgfmathasin@=\pgfluamathasin@%
+ \pgfluamath@install@function\pgfmathacos@=\pgfluamathacos@%
+ \pgfluamath@install@function\pgfmathatan@=\pgfluamathatan@%
+ \pgfluamath@install@function\pgfmathatantwo@=\pgfluamathatantwo@%
+ \pgfluamath@install@function\pgfmathmax@=\pgfluamathmax@%
+ \pgfluamath@install@function\pgfmathmin@=\pgfluamathmin@%
+ % \pgfluamath@install@function\pgfmath@pi=\pgfluamathpi@%
+ % \pgfluamath@install@function\pgfmathpi=\pgfluamathpi@%
+ % \pgfluamath@install@function\pgfmathe@=\pgfluamathe@%
+ % \pgfluamath@install@function\pgfmathe=\pgfluamathe@%
+ % \pgfluamath@install@function\pgfmathlessthan@=\pgfluamathlessthan@%
+ % \pgfluamath@install@function\pgfmathless@=\pgfluamathlessthan@%
+ % \pgfluamath@install@function\pgfmathgreaterthan@=\pgfluamathgreaterthan@%
+ % \pgfluamath@install@function\pgfmathgreater@=\pgfluamathgreaterthan@%
+ % \pgfluamath@install@function\pgfmathpow@=\pgfluamathpow@
+ \pgfluamath@install@function\pgfmathrand@=\pgfluamathrand@
+ \pgfluamath@install@function\pgfmathrand=\pgfluamathrand@
+ \pgfluamath@install@function\pgfmathrnd@=\pgfluamathrnd@
+ \pgfluamath@install@function\pgfmathrnd=\pgfluamathrnd@
+ % \pgfluamath@install@function\pgfmathtrue@=\pgfluamathtrue@
+ % \pgfluamath@install@function\pgfmathfalse@=\pgfluamathfalse@
+ % \pgfluamath@install@function\pgfmathnot@=\pgfluamathnot@
+ % \pgfluamath@install@function\pgfmathhex@=\pgfluamathhex@
+ % \pgfluamath@install@function\pgfmathHex@=\pgfluamathHex@
+ % \pgfluamath@install@function\pgfmathoct@=\pgfluamathoct@
+ % \pgfluamath@install@function\pgfmathbin@=\pgfluamathbin@
+ % \pgfluamath@install@function\pgfmathand@=\pgfluamathand@
+ % \pgfluamath@install@function\pgfmathor@=\pgfluamathor@
+ % \pgfluamath@install@function\pgfmathfactorial@=\pgfluamathfactorial@
+ % \pgfluamath@install@function\pgfmathveclen@=\pgfluamathveclen@
+ % \pgfluamath@install@function\pgfmathcosh@=\pgfluamathcosh@
+ % \pgfluamath@install@function\pgfmathsinh@=\pgfluamathsinh@
+ % \pgfluamath@install@function\pgfmathtanh@=\pgfluamathtanh@
+ % \pgfluamath@install@function@unimplemented{ceil}%
+ % \pgfluamath@install@function@unimplemented{frac}%
+ % \pgfluamath@install@function@unimplemented{log2}%
+ % \pgfluamath@install@function@unimplemented{log10}%
+ % \pgfluamath@install@function@unimplemented{equalto}%
+ % \pgfluamath@install@function@unimplemented{random}%
+ % \pgfluamath@install@function@unimplemented{setseed}%
+ % \pgfluamath@install@function@unimplemented{Mod}%
+ % \pgfluamath@install@function@unimplemented{real}%
+ % \pgfluamath@install@function@unimplemented{notequal}%
+ \pgfluamath@install@function\pgfmathreciprocal=\pgfluamathreciprocal%
+ \pgfluamath@install@function\pgfpointnormalised=\pgfluamathpointnormalised
+}%
+
+\def\pgfluamathgetresult#1{%
+ \edef\pgfmathresult{\pgfutil@directlua{tex.print(-1,#1)}}}%
+
+\def\pgfmathluamath@iftrue{%
+ \if 0\pgfluamath@outputformat@choice
+ \let\pgfmathluamath@@iftrue@v=\pgfluamathone
+ \else
+ \let\pgfmathluamath@@iftrue@v=\pgfluamathfloatone
+ \fi
+ \pgfmathluamath@iftrue@
+}%
+\def\pgfluamathone{1.0}%
+\def\pgfluamathfloatone{1Y1.0e+00]}%
+\def\pgfmathluamath@iftrue@#1#2{%
+ \ifx\pgfmathresult\pgfmathluamath@@iftrue@v
+ \def\pgfmath@next{#1}%
+ \else
+ \def\pgfmath@next{#2}%
+ \fi
+ \pgfmath@next
+}%
+
+\def\pgfluamathpi@{%
+ \pgfluamathgetresult{pgfluamathfunctions.pi()}}%
+\def\pgfluamathe@{%
+ \pgfluamathgetresult{pgfluamathfunctions.e()}}%
+\def\pgfluamathadd@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.add(#1,#2)}}%
+\def\pgfluamathsubtract@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.subtract(#1,#2)}}%
+\def\pgfluamathneg@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.neg(#1)}}%
+\def\pgfluamathmultiply@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.multiply(#1,#2)}}%
+\def\pgfluamathdivide@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.divide(#1,#2)}}%
+\def\pgfluamathabs@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.abs(#1)}}%
+\def\pgfluamathround@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.round(#1)}}%
+\def\pgfluamathfloor@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.floor(#1)}}%
+\def\pgfluamathceil@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.ceil(#1)}}%
+\def\pgfluamathgcd@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.gcd(#1,#2)}}%
+\def\pgfluamathisprime@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.isprime(#1)}}%
+\def\pgfluamathmax@#1{%
+ \pgfluamathgetresult{%
+ math.max(pgfluamathfunctions.split_braces_to_explist("#1"))}}%
+\def\pgfluamathmin@#1{%
+ \pgfluamathgetresult{%
+ math.min(pgfluamathfunctions.split_braces_to_explist("#1"))}}%
+\def\pgfluamathsin@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.Sin(#1)}}%
+\def\pgfluamathcos@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.Cos(#1)}}%
+\def\pgfluamathtan@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.Tan(#1)}}%
+\def\pgfluamathmod@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.mod(#1,#2)}}%
+\def\pgfluamathMod@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.Mod(#1,#2)}}%
+\def\pgfluamathrad@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.rad(#1)}}%
+\def\pgfluamathdeg@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.deg(#1)}}%
+\def\pgfluamathatan@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.aTan(#1)}}%
+\def\pgfluamathatantwo@#1#2{%
+ \pgfluamathgetresult{pgfluamathfunctions.aTan2(#1,#2)}}%
+\def\pgfluamathasin@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.aSin(#1)}}%
+\def\pgfluamathacos@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.aCos(#1)}}%
+\def\pgfluamathcot@#1{%
+ \pgfluamathgetresult{1/pgfluamathfunctions.Tan(#1)}}%
+\def\pgfluamathsec@#1{%
+ \pgfluamathgetresult{1/pgfluamathfunctions.Cos(#1)}}%
+\def\pgfluamathcosec@#1{%
+ \pgfluamathgetresult{1/pgfluamathfunctions.Sin(#1)}}%
+\def\pgfluamathexp@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.exp(#1)}}%
+\def\pgfluamathln@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.log(#1)}}%
+\def\pgfluamathlogten@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.log10(#1)}}%
+\def\pgfluamathsqrt@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.sqrt(#1)}}%
+\def\pgfluamathrnd@{%
+ \pgfluamathgetresult{pgfluamathfunctions.rnd()}}%
+\def\pgfluamathrand@{%
+ \pgfluamathgetresult{pgfluamathfunctions.rand(-1,1)}}%
+\def\pgfluamathfactorial@#1{%
+ \pgfluamathgetresult{pgfluamathfunctions.factorial(#1)}}%
+\def\pgfluamathreciprocal#1{%
+ \pgfluamathgetresult{1/#1}}%
+% \pgfluamath@install@function\pgfmath@pi=\pgfluamathpi@%
+% \pgfluamath@install@function\pgfmathpi=\pgfluamathpi@%
+% \pgfluamath@install@function\pgfmathe@=\pgfluamathe@%
+% \pgfluamath@install@function\pgfmathe=\pgfluamathe@%
+% \pgfluamath@install@function\pgfmathlessthan@=\pgfluamathlessthan@%
+% \pgfluamath@install@function\pgfmathless@=\pgfluamathlessthan@%
+% \pgfluamath@install@function\pgfmathgreaterthan@=\pgfluamathgreaterthan@%
+% \pgfluamath@install@function\pgfmathgreater@=\pgfluamathgreaterthan@%
+% \pgfluamath@install@function\pgfmathpow@=\pgfluamathpow@
+% \pgfluamath@install@function\pgfmathrand@=\pgfluamathrand@
+% \pgfluamath@install@function\pgfmathrand=\pgfluamathrand@
+% \pgfluamath@install@function\pgfmathrnd@=\pgfluamathrnd@
+% \pgfluamath@install@function\pgfmathrnd=\pgfluamathrnd@
+% \pgfluamath@install@function\pgfmathtrue@=\pgfluamathtrue@
+% \pgfluamath@install@function\pgfmathfalse@=\pgfluamathfalse@
+% \pgfluamath@install@function\pgfmathnot@=\pgfluamathnot@
+% \pgfluamath@install@function\pgfmathhex@=\pgfluamathhex@
+% \pgfluamath@install@function\pgfmathHex@=\pgfluamathHex@
+% \pgfluamath@install@function\pgfmathoct@=\pgfluamathoct@
+% \pgfluamath@install@function\pgfmathbin@=\pgfluamathbin@
+% \pgfluamath@install@function\pgfmathand@=\pgfluamathand@
+% \pgfluamath@install@function\pgfmathor@=\pgfluamathor@
+% \pgfluamath@install@function\pgfmathfactorial@=\pgfluamathfactorial@
+% \pgfluamath@install@function\pgfmathveclen@=\pgfluamathveclen@
+% \pgfluamath@install@function\pgfmathcosh@=\pgfluamathcosh@
+% \pgfluamath@install@function\pgfmathsinh@=\pgfluamathsinh@
+% \pgfluamath@install@function\pgfmathtanh@=\pgfluamathtanh@
+
+\def\pgfluamathpointnormalised#1{%
+ \pgf@process{#1}%
+ \pgfutil@directlua{%
+ pgfluamathfunctions.pointnormalised(%
+ \pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})}%
+ \ignorespaces}%
+
+% Parser
+
+\newif\ifpgfluamathunitsdeclared
+
+% true if and only if LUA failed to evaluate the expression and the
+% expression was evaluated by means of the TeX parser as fallback.
+%
+% This happens
+% - for \chardef'ed boxes for which LUA lacks evaluation capabilities
+% - if the expression includes some function which is unavailable in
+% LUA (defined only in TeX)
+% - some special cases which simply haven't been added to the LUA
+% parser (yet).
+% At the time of this writing, this includes
+% -- arrays created via '{}' and indexed with '[]'
+% -- strings with "<str>"
+% -- 'scalar' function
+% -- hex/octal/binary input
+\newif\ifpgfluamathusedTeXfallback
+
+% Parses the math expression and defines \pgfmathresult and
+% \ifpgfmathunitsdeclared to contain the result.
+%
+% If \ifpgfluamathparseractive then the result is also assigned to
+% \pgfmathresult. Furthermore, if the expression cannot be evaluated (because LUA does not support
+% it), it will be evaluated by mean of TeX as fallback.
+%
+% @see \ifpgfluamathusedTeXfallback
+% @see \ifpgfluamathshowerrormessage
+\def\pgfluamathparse#1{%
+ \pgfluamathusedTeXfallbackfalse
+ \pgfutil@directlua{pgfluamathparser.texCallParser(
+ "\pgfutil@luaescapestring{#1}",
+ \pgfluamath@outputformat@choice,
+ \ifpgfluamathshowerrormessage true\else false\fi)%
+ }%
+ \ifx\pgfmathresult\pgfutil@empty
+ \ifpgfluamathenableTeXfallback
+ \pgfluamathusedTeXfallbacktrue
+ \pgfluamath@pgfmathparse{#1}%
+ \fi
+ \fi
+}%
+
+\catcode`\"=\pgfliblua@oldcatcodedoublequote
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarypatterns.code.tex b/graphics/pgf/base/tex/pgflibrarypatterns.code.tex
new file mode 100644
index 0000000000..908d749003
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarypatterns.code.tex
@@ -0,0 +1,264 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarypatterns.code.tex}
+
+
+% Lines in different directions
+
+\pgfdeclarepatternformonly{horizontal lines}{\pgfpointorigin}{\pgfqpoint{100pt}{1pt}}{\pgfqpoint{100pt}{3pt}}%
+{%
+ \pgfsetlinewidth{0.4pt}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{0.5pt}}%
+ \pgfpathlineto{\pgfqpoint{100pt}{0.5pt}}%
+ \pgfusepath{stroke}%
+}%
+
+\pgfdeclarepatternformonly{vertical lines}{\pgfpointorigin}{\pgfqpoint{1pt}{100pt}}{\pgfqpoint{3pt}{100pt}}%
+{%
+ \pgfsetlinewidth{0.4pt}%
+ \pgfpathmoveto{\pgfqpoint{0.5pt}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0.5pt}{100pt}}%
+ \pgfusepath{stroke}%
+}%
+
+\pgfdeclarepatternformonly{north east lines}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{4pt}{4pt}}{\pgfqpoint{3pt}{3pt}}%
+{%
+ \pgfsetlinewidth{0.4pt}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{3.1pt}{3.1pt}}%
+ \pgfusepath{stroke}%
+}%
+
+\pgfdeclarepatternformonly{north west lines}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{4pt}{4pt}}{\pgfqpoint{3pt}{3pt}}%
+{%
+ \pgfsetlinewidth{0.4pt}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{3pt}}%
+ \pgfpathlineto{\pgfqpoint{3.1pt}{-0.1pt}}%
+ \pgfusepath{stroke}%
+}%
+
+% Crossed lines in different directions
+
+\pgfdeclarepatternformonly{grid}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{4pt}{4pt}}{\pgfqpoint{3pt}{3pt}}%
+{%
+ \pgfsetlinewidth{0.4pt}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{3.1pt}}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{3.1pt}{0pt}}%
+ \pgfusepath{stroke}%
+}%
+
+\pgfdeclarepatternformonly{crosshatch}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{4pt}{4pt}}{\pgfqpoint{3pt}{3pt}}%
+{%
+ \pgfsetlinewidth{0.4pt}%
+ \pgfpathmoveto{\pgfqpoint{3.1pt}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{3.1pt}}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{3.1pt}{3.1pt}}%
+ \pgfusepath{stroke}%
+}%
+
+
+% Dotted regions
+
+\pgfdeclarepatternformonly{dots}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{1pt}{1pt}}{\pgfqpoint{3pt}{3pt}}%
+{%
+ \pgfpathcircle{\pgfqpoint{0pt}{0pt}}{.5pt}%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatternformonly{crosshatch dots}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{2.5pt}{2.5pt}}{\pgfqpoint{3pt}{3pt}}%
+{%
+ \pgfpathcircle{\pgfqpoint{0pt}{0pt}}{.5pt}%
+ \pgfpathcircle{\pgfqpoint{1.5pt}{1.5pt}}{.5pt}%
+ \pgfusepath{fill}%
+}%
+
+
+
+
+% Star shaped patterns
+
+\pgfdeclarepatternformonly{fivepointed stars}{\pgfpointorigin}{\pgfqpoint{3mm}{3mm}}{\pgfqpoint{3mm}{3mm}}%
+{%
+ \pgftransformshift{\pgfqpoint{1mm}{1mm}}%
+ \pgfpathmoveto{\pgfqpointpolar{18}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{162}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{306}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{90}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{234}{1mm}}%
+ \pgfpathclose%%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatternformonly{sixpointed stars}{\pgfpointorigin}{\pgfqpoint{3mm}{3mm}}{\pgfqpoint{3mm}{3mm}}%
+{%
+ \pgftransformshift{\pgfqpoint{1mm}{1mm}}%
+ \pgfpathmoveto{\pgfqpointpolar{30}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{150}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{270}{1mm}}%
+ \pgfpathclose%
+ \pgfpathmoveto{\pgfqpointpolar{-30}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{-270}{1mm}}%
+ \pgfpathlineto{\pgfqpointpolar{-150}{1mm}}%
+ \pgfpathclose%
+ \pgfsetnonzerorule%
+ \pgfusepath{fill}%
+}%
+
+
+
+% Bricks
+
+\pgfdeclarepatternformonly{bricks}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{5mm}{5mm}}{\pgfqpoint{4mm}{4mm}}%
+{%
+ \pgfsetlinewidth{0.8pt}%
+ \pgfpathmoveto{\pgfqpoint{0mm}{1mm}}%
+ \pgfpathlineto{\pgfqpoint{4mm}{1mm}}%
+ \pgfpathmoveto{\pgfqpoint{0mm}{3mm}}%
+ \pgfpathlineto{\pgfqpoint{4mm}{3mm}}%
+ \pgfpathmoveto{\pgfqpoint{1mm}{0mm}}%
+ \pgfpathlineto{\pgfqpoint{1mm}{1mm}}%
+ \pgfpathmoveto{\pgfqpoint{3mm}{1mm}}%
+ \pgfpathlineto{\pgfqpoint{3mm}{3mm}}%
+ \pgfpathmoveto{\pgfqpoint{1mm}{3mm}}%
+ \pgfpathlineto{\pgfqpoint{1mm}{4mm}}%
+ \pgfusepath{stroke}%
+}%
+
+
+% Checkerboards
+
+\pgfdeclarepatternformonly{checkerboard}{\pgfpointorigin}{\pgfqpoint{4mm}{4mm}}{\pgfqpoint{4mm}{4mm}}%
+{%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfqpoint{2mm}{2mm}}%
+ \pgfpathrectangle{\pgfqpoint{2mm}{2mm}}{\pgfqpoint{2mm}{2mm}}%
+ \pgfusepath{fill}%
+}%
+
+
+
+% Backgrounds
+
+\pgfdeclarepatterninherentlycolored{checkerboard light gray}
+{\pgfpointorigin}{\pgfqpoint{4mm}{4mm}}{\pgfqpoint{4mm}{4mm}}%
+{%
+% \pgfsetfillcolor{black!10}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfqpoint{4.1mm}{4.1mm}}% make
+ % slightly larger to ensure that tiles
+ % are really solid
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{black!20}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfqpoint{2mm}{2mm}}%
+ \pgfpathrectangle{\pgfqpoint{2mm}{2mm}}{\pgfqpoint{2mm}{2mm}}%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatterninherentlycolored{horizontal lines light gray}
+{\pgfpointorigin}{\pgfpoint{100pt}{4pt}}
+{\pgfpoint{100pt}{4pt}}
+{%
+ \pgfsetfillcolor{black!10}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{black!15}%
+ \pgfpathrectangle{\pgfpoint{0pt}{2pt}}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatterninherentlycolored{horizontal lines gray}
+{\pgfpointorigin}{\pgfpoint{100pt}{4pt}}
+{\pgfpoint{100pt}{4pt}}
+{%
+ \pgfsetfillcolor{black!30}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{black!35}%
+ \pgfpathrectangle{\pgfpoint{0pt}{2pt}}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatterninherentlycolored{horizontal lines dark gray}
+{\pgfpointorigin}{\pgfpoint{100pt}{4pt}}
+{\pgfpoint{100pt}{4pt}}
+{%
+ \pgfsetfillcolor{black!90}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{black!85}%
+ \pgfpathrectangle{\pgfpoint{0pt}{2pt}}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatterninherentlycolored{horizontal lines light blue}
+{\pgfpointorigin}{\pgfpoint{100pt}{4pt}}
+{\pgfpoint{100pt}{4pt}}
+{%
+ \pgfsetfillcolor{blue!10}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{blue!15}%
+ \pgfpathrectangle{\pgfpoint{0pt}{2pt}}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+}%
+
+\pgfdeclarepatterninherentlycolored{horizontal lines dark blue}
+{\pgfpointorigin}{\pgfpoint{100pt}{4pt}}
+{\pgfpoint{100pt}{4pt}}
+{%
+ \pgfsetfillcolor{blue!90}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{blue!85}%
+ \pgfpathrectangle{\pgfpoint{0pt}{2pt}}{\pgfpoint{100pt}{2.5pt}}%
+ \pgfusepath{fill}%
+}%
+
+
+\pgfdeclarepatterninherentlycolored{crosshatch dots gray}
+{\pgfpointorigin}{\pgfpoint{8pt}{8pt}}
+{\pgfpoint{8pt}{8pt}}
+{%
+ \pgfsetfillcolor{black!20}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{8pt}{8pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{black!10}%
+ \pgfpathcircle{\pgfpoint{2pt}{1.75pt}}{1pt}%
+ \pgfpathcircle{\pgfpoint{6pt}{5.75pt}}{1pt}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{black!70}%
+ \pgfpathcircle{\pgfpoint{2pt}{2.25pt}}{1pt}%
+ \pgfpathcircle{\pgfpoint{6pt}{6.25pt}}{1pt}%
+ \pgfusepath{fill}%
+}%
+
+\pgfutil@definecolor{pgf@lightsteelblue}{rgb}{0.6875,0.765625,0.8671875}%
+\pgfutil@colorlet{pgf@darklightsteelblue}{black!50!pgf@lightsteelblue}%
+
+\pgfdeclarepatterninherentlycolored{crosshatch dots light steel blue}
+{\pgfpointorigin}{\pgfpoint{8pt}{8pt}}
+{\pgfpoint{8pt}{8pt}}
+{%
+ \pgfsetfillcolor{pgf@lightsteelblue}%
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{8pt}{8pt}}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{pgf@darklightsteelblue!10}%
+ \pgfpathcircle{\pgfpoint{2pt}{1.75pt}}{1pt}%
+ \pgfpathcircle{\pgfpoint{6pt}{5.75pt}}{1pt}%
+ \pgfusepath{fill}%
+ \pgfsetfillcolor{pgf@darklightsteelblue!70}%
+ \pgfpathcircle{\pgfpoint{2pt}{2.25pt}}{1pt}%
+ \pgfpathcircle{\pgfpoint{6pt}{6.25pt}}{1pt}%
+ \pgfusepath{fill}%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarypatterns.meta.code.tex b/graphics/pgf/base/tex/pgflibrarypatterns.meta.code.tex
new file mode 100644
index 0000000000..479992ad37
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarypatterns.meta.code.tex
@@ -0,0 +1,281 @@
+% Copyright 2015 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{%
+ \def\pgf@pat@onlinename{#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}%
+}%
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/graphics/pgf/base/tex/pgflibraryplothandlers.code.tex b/graphics/pgf/base/tex/pgflibraryplothandlers.code.tex
new file mode 100644
index 0000000000..3f0fc8d268
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryplothandlers.code.tex
@@ -0,0 +1,1114 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryplothandlers.code.tex}
+
+
+% This handler converts each plot stream command into a curveto
+% command, except for the first, which is converted to the previously
+% specified action.
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfsetlinetofirstplotpoint
+% \pgfplothandlercurveto
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlercurveto}{}{%
+ point macro=\pgf@plot@curveto@handler@initial,
+ jump macro=\pgf@plot@smooth@next@moveto,
+ end macro=\pgf@plot@curveto@handler@finish
+}%
+
+\def\pgf@plot@smooth@next@moveto{%
+ \pgf@plot@curveto@handler@finish%
+ \global\pgf@plot@startedfalse%
+ \global\let\pgf@plotstreampoint\pgf@plot@curveto@handler@initial%
+}%
+
+\def\pgf@plot@curveto@handler@initial#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@plot@first@action{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@curveto@first{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \global\let\pgf@plot@curveto@first@support=\pgf@plot@curveto@first%
+ \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@second%
+}%
+
+\def\pgf@plot@curveto@handler@second#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@curveto@second{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@third%
+ \global\pgf@plot@startedtrue%
+}%
+
+\def\pgf@plot@curveto@handler@third#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@curveto@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % compute difference vector:
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgf@plot@curveto@first}
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ % compute support directions:
+ \pgf@xa=\pgf@plottension\pgf@xa%
+ \pgf@ya=\pgf@plottension\pgf@ya%
+ % first marshal:
+ \pgf@process{\pgf@plot@curveto@second}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \advance\pgf@xc by\pgf@xa%
+ \advance\pgf@yc by\pgf@ya%
+ \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@curveto@first@support}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@curveto@second}}%
+ {\pgf@marshal}%
+ % Prepare next:
+ \global\let\pgf@plot@curveto@first=\pgf@plot@curveto@second%
+ \global\let\pgf@plot@curveto@second=\pgf@plot@curveto@current%
+ \xdef\pgf@plot@curveto@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+}%
+
+\def\pgf@plot@curveto@handler@finish{%
+ \ifpgf@plot@started%
+ \pgfpathcurveto{\pgf@plot@curveto@first@support}{\pgf@plot@curveto@second}{\pgf@plot@curveto@second}%
+ \fi%
+}%
+
+
+% This commands sets the tension for smoothing of plots.
+%
+% #1 = tension of curves. A value of 1 will yield a circle when the
+% control points are at quarters of a circle. A smaller value
+% will result in a tighter curve. Default is 0.5.
+%
+% Example:
+%
+% \pgfsetplottension{0.2}
+
+\def\pgfsetplottension#1{%
+ \pgf@x=#1pt\relax%
+ \pgf@x=0.2775\pgf@x\relax%
+ \edef\pgf@plottension{\pgf@sys@tonumber\pgf@x}}%
+\pgfsetplottension{0.5}%
+
+
+% This handler converts the plot stream command into a curveto
+% command that is closed using a closepath.
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfplothandlerclosedcurve
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerclosedcurve}{}{%
+ point macro=\pgf@plot@closedcurve@handler@initial,
+ end macro=\pgf@plot@closedcurve@handler@finish,
+ jump macro=\pgf@plot@closedsmooth@next@moveto
+}%
+
+\def\pgf@plot@closedsmooth@next@moveto{%
+ \pgf@plot@closedcurve@handler@finish%
+ \global\pgf@plot@startedfalse%
+ \global\let\pgf@plotstreampoint\pgf@plot@closedcurve@handler@initial%
+}%
+
+\def\pgf@plot@closedcurve@handler@initial#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \xdef\pgf@plot@closedcurve@initial{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@second%
+ \global\pgf@plot@startedfalse%
+}%
+
+\def\pgf@plot@closedcurve@handler@second#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@closedcurve@after@initial{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ {\pgfpathmoveto{}}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@third%
+}%
+
+\def\pgf@plot@closedcurve@handler@third#1{%
+ \global\pgf@plot@startedtrue%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % compute difference vector:
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgf@plot@closedcurve@initial}
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ % compute support directions:
+ \pgf@xa=\pgf@plottension\pgf@xa%
+ \pgf@ya=\pgf@plottension\pgf@ya%
+ % first marshal:
+ \pgf@process{\pgf@plot@closedcurve@after@initial}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \advance\pgf@xc by\pgf@xa%
+ \advance\pgf@yc by\pgf@ya%
+ \global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@after@initial%
+ \global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current%
+ \xdef\pgf@plot@closedcurve@after@initial@presupport{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
+ \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@fourth%
+}%
+
+\def\pgf@plot@closedcurve@handler@fourth#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % compute difference vector:
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgf@plot@closedcurve@first}
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ % compute support directions:
+ \pgf@xa=\pgf@plottension\pgf@xa%
+ \pgf@ya=\pgf@plottension\pgf@ya%
+ % first marshal:
+ \pgf@process{\pgf@plot@closedcurve@second}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \advance\pgf@xc by\pgf@xa%
+ \advance\pgf@yc by\pgf@ya%
+ \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}%
+ {\pgf@marshal}%
+ % Prepare next:
+ \global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@second%
+ \global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current%
+ \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+}%
+
+\def\pgf@plot@closedcurve@handler@finish{%
+ \ifpgf@plot@started
+ %
+ % first, draw line from 2nd last to last:
+ %
+ \pgf@process{\pgf@plot@closedcurve@initial}%
+ % compute difference vector:
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgf@plot@closedcurve@first}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ % compute support directions:
+ \pgf@xa=\pgf@plottension\pgf@xa%
+ \pgf@ya=\pgf@plottension\pgf@ya%
+ % first marshal:
+ \pgf@process{\pgf@plot@closedcurve@second}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \advance\pgf@xc by\pgf@xa%
+ \advance\pgf@yc by\pgf@ya%
+ \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}%
+ {\pgf@marshal}%
+ \xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ %
+ % second, draw line from last point to start:
+ %
+ \pgf@process{\pgf@plot@closedcurve@after@initial}%
+ % compute difference vector:
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgf@plot@closedcurve@second}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ % compute support directions:
+ \pgf@xa=\pgf@plottension\pgf@xa%
+ \pgf@ya=\pgf@plottension\pgf@ya%
+ % first marshal:
+ \pgf@process{\pgf@plot@closedcurve@initial}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \advance\pgf@xc by\pgf@xa%
+ \advance\pgf@yc by\pgf@ya%
+ \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@initial}}%
+ {\pgf@marshal}%
+ %
+ % third, draw line from first to second point:
+ %
+ \edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ {\noexpand\pgf@plot@closedcurve@after@initial@presupport}{\noexpand\pgf@plot@closedcurve@after@initial}}%
+ {\pgf@marshal}%
+ \pgfpathclose%
+ \fi%
+}%
+
+
+
+
+
+% This handler converts each point in a stream into a line from the
+% $y$-axis to the given points coordinate, resulting in a
+% ``comb.''
+%
+% Example:
+%
+% \pgfplothandlerxcomb
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerxcomb}{}{%
+ start macro=\pgfplotxzerolevelstreamstart,
+ point macro=\pgf@plot@xcomb@handler,
+ end macro=\pgfplotxzerolevelstreamend,
+}%
+
+\def\pgf@plot@xcomb@handler#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \begingroup
+ \pgfplotxzerolevelstreamnext
+ \endgroup
+ \pgf@yb=\pgf@x
+ \pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+}%
+
+
+% This handler converts each point in a stream into a line from the
+% $x$-axis straight up to the given points coordinate, resulting in a
+% ``comb.''
+%
+% Example:
+%
+% \pgfplothandlerycomb
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerycomb}{}{%
+ start macro=\pgfplotyzerolevelstreamstart,
+ point macro=\pgf@plot@ycomb@handler,
+ end macro=\pgfplotyzerolevelstreamend
+}%
+
+\def\pgf@plot@ycomb@handler#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \begingroup
+ \pgfplotyzerolevelstreamnext
+ \endgroup
+ \pgf@yb=\pgf@x
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+}%
+
+% PGF Bar or comb plots usually draw something from zero to the current plot's coordinate.
+%
+% The 'zero' offset can be changed using an input stream.
+%
+% There are two such streams which can be configured independently.
+% The first one returns "zeros" for coordinate x, the second one
+% returns "zeros" for coordinate y.
+%
+% \pgfplotxzerolevelstreamstart
+% \pgfplotxzerolevelstreamnext % assigns \pgf@x globally
+% \pgfplotxzerolevelstreamnext
+% \pgfplotxzerolevelstreamnext
+% \pgfplotxzerolevelstreamend
+%
+% and
+% \pgfplotyzerolevelstreamstart
+% \pgfplotyzerolevelstreamnext % assigns \pgf@x globally
+% \pgfplotyzerolevelstreamend
+%
+\def\pgfplotxzerolevelstreamstart{\pgf@plotxzerolevelstreamstart}%
+\def\pgfplotxzerolevelstreamend{\pgf@plotxzerolevelstreamend}%
+\def\pgfplotxzerolevelstreamnext{\pgf@plotxzerolevelstreamnext}
+\def\pgfplotyzerolevelstreamstart{\pgf@plotyzerolevelstreamstart}%
+\def\pgfplotyzerolevelstreamend{\pgf@plotyzerolevelstreamend}%
+\def\pgfplotyzerolevelstreamnext{\pgf@plotyzerolevelstreamnext}%
+
+% This zero level stream always returns '#1' (a dimension).
+\def\pgfplotxzerolevelstreamconstant#1{%
+ \edef\pgfplotxzerolevelstreamconstant@val{#1}%
+ \def\pgf@plotxzerolevelstreamstart{%
+ \global\let\pgf@plotxzerolevelstreamend=\relax
+ \gdef\pgf@plotxzerolevelstreamnext{\global\pgf@x=\pgfplotxzerolevelstreamconstant@val\relax}%
+ }%
+}%
+\pgfplotxzerolevelstreamconstant{0pt}%
+
+% This zero level stream always returns '#1'.
+\def\pgfplotyzerolevelstreamconstant#1{%
+ \edef\pgfplotyzerolevelstreamconstant@val{#1}%
+ \def\pgf@plotyzerolevelstreamstart{%
+ \global\let\pgf@plotyzerolevelstreamend=\relax
+ \gdef\pgf@plotyzerolevelstreamnext{\global\pgf@x=\pgfplotyzerolevelstreamconstant@val\relax}%
+ }%
+}%
+\pgfplotyzerolevelstreamconstant{0pt}%
+
+\def\pgfplotbarwidth{\pgfkeysvalueof{/pgf/bar width}}%
+\def\pgfplotbarshift{\pgfkeysvalueof{/pgf/bar shift}}%
+
+\pgfqkeys{/pgf}{%
+ bar width/.initial=10pt,
+ bar shift/.initial=0pt,
+ bar interval width/.initial=1,
+ bar interval shift/.initial=0.5,
+ %
+ % hook which is executed right before a new bar is begun.
+ at begin bar/.initial=,
+ % hook which is executed right after a bar path has been finished.
+ % In this context, the bar's path has not been used.
+ at end bar/.initial=,
+}%
+
+% This handler places a rectangle at each point in the plot stream, a
+% rectangle which touches the x-axis at one end and the current point
+% at the other end:
+% --(X)--
+% | |
+% | |
+% | |
+% --(0)--
+% Example:
+%
+% \pgfplothandlerybar
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerybar}{}{%
+ start={
+ \pgfmathparse{\pgfplotbarwidth}%
+ \xdef\pgfplotbarwidth@{\pgfmathresult pt}%
+ \pgfmathparse{\pgfplotbarshift}%
+ \xdef\pgfplotbarshift@{\pgfmathresult pt}%
+ \pgfplotyzerolevelstreamstart
+ },
+ end macro=\pgfplotyzerolevelstreamend,
+ point macro=\pgf@plot@ybar@handler
+}%
+
+\def\pgf@plot@ybar@handler#1{%
+ \pgfkeysvalueof{/pgf/at begin bar}%
+ \pgf@process{#1}%
+ \pgf@ya=\pgf@y
+ \expandafter\pgf@xb\pgfplotbarwidth@\relax
+ \pgf@xc=\pgf@x
+ \advance\pgf@xc by-.5\pgf@xb
+ \advance\pgf@xc by\pgfplotbarshift@\relax
+ \begingroup
+ \pgfplotyzerolevelstreamnext
+ \endgroup
+ \pgf@yb=\pgf@x
+ \advance\pgf@ya by-\pgf@yb
+ \pgfpathrectangle
+ {\pgfqpoint{\pgf@xc}{\pgf@yb}}%
+ {\pgfqpoint{\pgf@xb}{\pgf@ya}}%
+ \pgfkeysvalueof{/pgf/at end bar}%
+}%
+
+% This handler places a rectangle at each point in the plot stream, a
+% rectangle which touches the y-axis at one end and the current point
+% at the other end:
+% ---------
+% | |
+% (0) (X)
+% | |
+% ---------
+% Example:
+%
+% \pgfplothandlerxbar
+% \pgfplotxyfile{mytable}
+\pgfdeclareplothandler{\pgfplothandlerxbar}{}{%
+ start={
+ \pgfmathparse{\pgfplotbarwidth}%
+ \xdef\pgfplotbarwidth@{\pgfmathresult pt}%
+ \pgfmathparse{\pgfplotbarshift}%
+ \xdef\pgfplotbarshift@{\pgfmathresult pt}%
+ \pgfplotxzerolevelstreamstart
+ },
+ end macro=\pgfplotxzerolevelstreamend,
+ point macro=\pgf@plot@xbar@handler
+}%
+
+\def\pgf@plot@xbar@handler#1{%
+ \pgfkeysvalueof{/pgf/at begin bar}%
+ \pgf@process{#1}%
+ \pgf@ya=\pgf@x
+ \expandafter\pgf@xb\pgfplotbarwidth@\relax
+ \pgf@xc=\pgf@y
+ \advance\pgf@xc by-.5\pgf@xb
+ \advance\pgf@xc by\pgfplotbarshift@\relax
+ \begingroup
+ \pgfplotxzerolevelstreamnext
+ \endgroup
+ \pgf@yb=\pgf@x
+ \advance\pgf@ya by-\pgf@yb
+ \pgfpathrectangle
+ {\pgfqpoint{\pgf@yb}{\pgf@xc}}%
+ {\pgfqpoint{\pgf@ya}{\pgf@xb}}%
+ \pgfkeysvalueof{/pgf/at end bar}%
+}%
+
+% This handler is a variant of \pgfplothandlerybar which works with
+% intervals instead of points.
+%
+% Bars are drawn between successive input coordinates and the width is
+% determined relatively to the interval length.
+%
+% It looks like this:
+%
+% |---| |-----|
+% | | | |
+% | | | |
+% | | | |
+% (X)------(X)-----------(X)
+%
+% where (X) denotes the x-axis offsets of input coordinates.
+%
+% In more detail, if (x_i,y_i) and (x_{i+1},y_{i+1}) denote successive
+% input coordinates, the bar will be placed above the
+% interval [x_i,x_{i+1}], centered at
+%
+% x_i + \pgfkeysvalueof{/pgf/bar interval shift} * (x_{i+1} - x_i)
+%
+% with width
+%
+% \pgfkeysvalueof{/pgf/bar interval width} * (x_{i+1} - x_i).
+%
+% If you have N+1 input points, you will get N bars (one for each
+% interval). The y_i value of the last bar will be ignored.
+%
+% Example:
+%
+% \pgfplothandlerybarinterval
+% \pgfplotxyfile{mytable}
+\pgfdeclareplothandler{\pgfplothandlerybarinterval}{}{%
+ start={
+ \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}%
+ \xdef\pgfplotbarintervalwidth@{\pgfmathresult}%
+ \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}%
+ \xdef\pgfplotbarintervalshift@{\pgfmathresult}%
+ \pgfplotyzerolevelstreamstart
+ },
+ end macro=\pgfplotyzerolevelstreamend,
+ point macro=\pgf@plot@ybarinterval@handler@first
+}%
+
+\def\pgf@plot@ybarinterval@handler@first#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}%
+ \xdef\pgf@plot@barinterval@bar{\the\pgf@y}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@ybarinterval@handler%
+}%
+\def\pgf@plot@ybarinterval@handler#1{%
+ \pgfkeysvalueof{/pgf/at begin bar}%
+ \pgf@process{#1}%
+ \pgf@ya=\pgf@plot@barinterval@bar
+ \xdef\pgf@plot@barinterval@bar{\the\pgf@y}%
+ \pgf@xc=\pgf@plot@barinterval@intervalstart\relax
+ \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}%
+ \pgf@xb=\pgf@x
+ \advance\pgf@xb by-\pgf@xc
+ \advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb
+ \pgf@xb=\pgfplotbarintervalwidth@\pgf@xb
+ \advance\pgf@xc by-.5\pgf@xb% center
+ \begingroup
+ \pgfplotyzerolevelstreamnext
+ \endgroup
+ \pgf@yb=\pgf@x
+ \advance\pgf@ya by-\pgf@yb
+ \pgfpathrectangle
+ {\pgfqpoint{\pgf@xc}{\pgf@yb}}%
+ {\pgfqpoint{\pgf@xb}{\pgf@ya}}%
+ \pgfkeysvalueof{/pgf/at end bar}%
+}%
+
+% Like \pgfplothandlerybarinterval but for xbar.
+\pgfdeclareplothandler{\pgfplothandlerxbarinterval}{}{%
+ start={
+ \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}%
+ \xdef\pgfplotbarintervalwidth@{\pgfmathresult}%
+ \pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}%
+ \xdef\pgfplotbarintervalshift@{\pgfmathresult}%
+ \pgfplotxzerolevelstreamstart
+ },
+ end macro=\pgfplotxzerolevelstreamend,
+ point macro=\pgf@plot@xbarinterval@handler@first
+}%
+
+\def\pgf@plot@xbarinterval@handler@first#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}%
+ \xdef\pgf@plot@barinterval@bar{\the\pgf@x}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@xbarinterval@handler%
+}%
+\def\pgf@plot@xbarinterval@handler#1{%
+ \pgfkeysvalueof{/pgf/at begin bar}%
+ \pgf@process{#1}%
+ \pgf@ya=\pgf@plot@barinterval@bar
+ \xdef\pgf@plot@barinterval@bar{\the\pgf@x}%
+ \pgf@xc=\pgf@plot@barinterval@intervalstart\relax
+ \xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}%
+ \pgf@xb=\pgf@y
+ \advance\pgf@xb by-\pgf@xc
+ \advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb
+ \pgf@xb=\pgfplotbarintervalwidth@\pgf@xb
+ \advance\pgf@xc by-.5\pgf@xb% center
+ \begingroup
+ \pgfplotxzerolevelstreamnext
+ \endgroup
+ \pgf@yb=\pgf@x
+ \advance\pgf@ya by-\pgf@yb
+ \pgfpathrectangle
+ {\pgfqpoint{\pgf@yb}{\pgf@xc}}%
+ {\pgfqpoint{\pgf@ya}{\pgf@xb}}%
+ \pgfkeysvalueof{/pgf/at end bar}%
+}%
+
+
+% This handler is very similar to \pgfplothandlerlineto, but it
+% produces CONSTANT connected pieces of the form
+%
+% x
+% |
+% x--- |
+% | x----
+% x-|
+%
+% Example:
+%
+% \pgfplothandlerconstantlineto
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerconstantlineto}{}{%
+ point macro=\pgf@plot@const@line@handler
+}%
+
+\def\pgf@plot@const@line@handler#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@y}%
+ \pgf@plot@first@action{}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@const@line@handler@@%
+}%
+\def\pgf@plot@const@line@handler@@#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \pgf@yb\pgf@plot@const@line@handler@last\relax
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}%
+}%
+
+% A variant of \pgfplothandlerconstantlineto which places its mark on
+% the right line ends.
+%
+% |---x
+% ---x |
+% |--x
+% x
+%
+% Example:
+%
+% \pgfplothandlerconstantlinetomarkright
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerconstantlinetomarkright}{}{%
+ point macro=\pgf@plot@const@line@mark@right@handler
+}%
+
+\def\pgf@plot@const@line@mark@right@handler#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@x}%
+ \pgf@plot@first@action{}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@right@handler@@%
+}%
+\def\pgf@plot@const@line@mark@right@handler@@#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \pgf@yb\pgf@plot@const@line@handler@last\relax
+ \pgfpathlineto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}%
+}%
+
+% A variant of \pgfplothandlerconstantlineto which places its mark on
+% the middle of the line segment.
+%
+% ----x
+% |
+% --x--- |
+% | |--x----
+% x--
+%
+% Example:
+%
+% \pgfplothandlerconstantlinetomarkmid
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerconstantlinetomarkmid}{}{%
+ point macro=\pgf@plot@const@line@mark@mid@handler
+}%
+
+\def\pgf@plot@const@line@mark@mid@handler#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
+ \pgf@plot@first@action{}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@mid@handler@@%
+}%
+\def\pgf@plot@const@line@mark@mid@handler@@#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \pgf@plot@const@line@handler@last
+ \pgf@xc=.5\pgf@xa
+ \advance\pgf@xc by.5\pgf@x
+ \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@y}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
+}%
+
+% This handler is in fact a variant of \pgfplothandlerconstantlineto,
+% but it does not draw vertical lines. It produces a sequence of
+% line-to and move-to operations such that plot marks are placed at
+% each right end:
+%
+% ---x
+% ---x
+% ---x
+% --x
+%
+% Example:
+%
+% \pgfplothandlerjumpmarkright
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerjumpmarkright}{}{%
+ point macro=\pgf@plot@jumpmarkright@handler
+}%
+
+\def\pgf@plot@jumpmarkright@handler#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@x}%
+ \pgf@plot@first@action{}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkright@handler@@%
+}%
+\def\pgf@plot@jumpmarkright@handler@@#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \pgf@yb\pgf@plot@const@line@handler@last\relax
+ \pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}%
+}%
+
+% This handler is in fact a variant of \pgfplothandlerconstantlineto,
+% but it does not draw vertical lines. It produces a sequence of
+% line-to and move-to operations such that plot marks are placed at
+% each left end:
+%
+% x---
+% x---
+% x---
+% x--
+%
+% Example:
+%
+% \pgfplothandlerjumpmarkleft
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerjumpmarkleft}{}{%
+ point macro=\pgf@plot@jumpmarkleft@handler
+}%
+\def\pgf@plot@jumpmarkleft@handler#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@y}%
+ \pgf@plot@first@action{}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkleft@handler@@%
+}%
+\def\pgf@plot@jumpmarkleft@handler@@#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \pgf@yb\pgf@plot@const@line@handler@last\relax
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}%
+}%
+
+% This handler is in fact a variant of
+% \pgfplothandlerconstantlinetomarkmid,
+% but it does not draw vertical lines. It produces a sequence of
+% line-to and move-to operations such that plot marks are placed like
+%
+% ----x
+%
+% --x--
+% --x----
+% x--
+%
+% Example:
+%
+% \pgfplothandlerjumpmarkmid
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerjumpmarkmid}{}{%
+ point macro=\pgf@plot@jump@mark@mid@handler
+}%
+
+\def\pgf@plot@jump@mark@mid@handler#1{%
+ \pgf@process{#1}%
+ \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
+ \pgf@plot@first@action{}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@jump@mark@mid@handler@@%
+}%
+\def\pgf@plot@jump@mark@mid@handler@@#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x
+ \pgf@ya=\pgf@y
+ \pgf@plot@const@line@handler@last
+ \pgf@xc=.5\pgf@xa
+ \advance\pgf@xc by.5\pgf@x
+ \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@y}}%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xc}{\pgf@ya}}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
+}%
+
+
+% This handler converts each point in a stream into a line from the
+% origin to the point's coordinate, resulting in a ``star''.
+%
+% Example:
+%
+% \pgfplothandlerpolarcomb
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerpolarcomb}{}{%
+ point macro=\pgf@plot@polarcomb@handler
+}%
+
+\def\pgf@plot@polarcomb@handler#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfpathmoveto{\pgfpointorigin}%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+}%
+
+
+
+
+% This handler draws a given mark at each point.
+%
+% #1 = some code to be executed at each point (with the coordinate
+% system translated to that point).
+% Typically, this code will be \pgfuseplotmark{whatever}.
+%
+% Example:
+%
+% \pgfplothandlermark{\pgfuseplotmark{*}}
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlermark}{#1}{%
+ start={
+ \def\pgf@plot@mark{%
+ \ifnum\pgf@plot@mark@count<\pgf@plot@mark@repeat\relax%
+ \else%
+ \global\pgf@plot@mark@count=0\relax%
+ #1%
+ \fi%
+ }%
+ \global\pgf@plot@mark@count=\pgf@plot@mark@repeat\relax%
+ \global\advance\pgf@plot@mark@count by-\pgf@plot@mark@phase\relax%
+ },
+ point macro=\pgf@plot@mark@handler
+}%
+
+\newcount\pgf@plot@mark@count
+\def\pgf@plot@mark@phase{0}%
+
+\def\pgf@plot@mark@handler#1{%
+ \global\advance\pgf@plot@mark@count by1\relax%
+ {\pgftransformshift{#1}\pgf@plot@mark}%
+}%
+
+
+% Set the repeat count for marks. For example, if 3 is given as a
+% value, only every third point will get a mark.
+%
+% #1 = repeat count
+%
+% Example:
+%
+% \pgfsetplotmarkrepeat{2}
+
+\def\pgfsetplotmarkrepeat#1{\def\pgf@plot@mark@repeat{#1}}%
+\pgfsetplotmarkrepeat{1}%
+
+
+% Set the phase for marks. For example, if 3 is the repeat and 3 is
+% the phase, already the first point will be marked.
+%
+% #1 = the index of the first point that should be marked.
+%
+% Example:
+%
+% \pgfsetplotmarkphase{3}
+
+\def\pgfsetplotmarkphase#1{\def\pgf@plot@mark@phase{#1}}%
+\pgfsetplotmarkphase{1}%
+
+
+
+% This handler draws a given mark at those points whose number is
+% given in the (pgffor-like) list.
+%
+% #1 = some code to be executed at each point (with the coordinate
+% system translated to that point).
+% Typically, this code will be \pgfuseplotmark{whatever}.
+% #2 = list of positions like "1,2,4,...,9,10"
+%
+% Example:
+%
+% \pgfplothandlermarklisted{\pgfuseplotmark{*}}{1,2,4,...,9}
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlermarklisted}{#1#2}{%
+ start={
+ \let\pgf@plot@mark@list=\pgfutil@empty%
+ \edef\pgf@marshal{\noexpand\foreach\noexpand\pgf@temp in{#2}}
+ \pgf@marshal{\xdef\pgf@plot@mark@list{\pgf@plot@mark@list(\pgf@temp)}}%
+ \def\pgf@plot@mark{%
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{(\the\pgf@plot@mark@count)}{\pgf@plot@mark@list}}%
+ \pgf@marshal%
+ \ifpgfutil@in@#1\fi%
+ }%
+ \global\pgf@plot@mark@count=\pgf@plot@mark@repeat\relax%
+ \global\advance\pgf@plot@mark@count by-\pgf@plot@mark@phase\relax%
+ },
+ point macro=\pgf@plot@mark@handler
+}%
+
+% \def\pgfplothandlermarklisted#1#2{%
+% \let\pgf@plot@mark@list=\pgfutil@empty%
+% \edef\pgf@marshal{\noexpand\foreach\noexpand\pgf@temp in{#2}}
+% \pgf@marshal{\xdef\pgf@plot@mark@list{\pgf@plot@mark@list(\pgf@temp)}}%
+% \pgf@plothandlermark{%
+% \edef\pgf@marshal{\noexpand\pgfutil@in@{(\the\pgf@plot@mark@count)}{\pgf@plot@mark@list}}%
+% \pgf@marshal%
+% \ifpgfutil@in@#1\fi}%
+% }%
+
+
+% Define a new plot mark for use with \pgfplotmark.
+%
+% #1 = a plot mark mnemonic
+% #2 = code for drawing the mark
+%
+% Example:
+%
+% \pgfdeclareplotmark{*}{\pgfpathcircle{\pgfpointorigin}{2pt}\pgfusepathqfill}
+
+\def\pgfdeclareplotmark#1#2{\expandafter\def\csname pgf@plot@mark@#1\endcsname{#2}}%
+
+
+% Set the size of plot marks. For circles, this will be the radius,
+% for other shapes it should be about half the width/height.
+%
+% Example:
+%
+% \pgfsetplotmarksize{1pt}
+
+\def\pgfsetplotmarksize#1{\pgfmathsetlength\pgfplotmarksize{#1}}%
+
+\newdimen\pgfplotmarksize
+\pgfplotmarksize=2pt
+
+
+% Insert a plot mark's code at the origin.
+%
+% #1 = plot mark mnemonic
+%
+% Example:
+%
+% \pgfuseplotmark{*}
+
+\def\pgfuseplotmark#1{\csname pgf@plot@mark@#1\endcsname}%
+
+
+% A stroke-filled circle mark
+
+\pgfdeclareplotmark{*}
+{%
+ \pgfpathellipse{\pgfpointorigin}{\pgfqpoint{\pgfplotmarksize}{0sp}}{\pgfqpoint{0sp}{\pgfplotmarksize}}%
+ \pgfusepathqfillstroke
+}%
+
+
+% A plus-sign like mark
+
+\pgfdeclareplotmark{+}
+{%
+ \pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+
+% An x-shaped mark
+
+\pgfdeclareplotmark{x}
+{%
+ \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+% See pgflibraryplotmarks for more plot marks
+
+
+
+
+% This handler turns creates a series of straight line segments
+% between consecutive points, but leaving /pgf/gap around stream point
+% space.
+%
+% Example:
+%
+% \pgfplothandlergaplineto
+% \pgfplotxyfile{mytable}
+
+\pgfkeys{/pgf/gap around stream point/.initial=1.5pt}%
+
+\pgfdeclareplothandler{\pgfplothandlergaplineto}{}{%
+ point macro=\pgf@plot@gap@lineto@handler@initial,
+ jump macro=\pgf@plot@gap@next@moveto
+}%
+
+\def\pgf@plot@gap@next@moveto{%
+ \global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler@initial%
+}%
+
+\def\pgf@plot@gap@lineto@handler@initial#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \xdef\pgf@plot@gap@lineto@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler%
+}%
+
+\def\pgf@plot@gap@lineto@handler#1{%
+ % Ok, compute normalized line vector
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \xdef\pgf@plot@gap@lineto@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@lineto@last}{\pgf@plot@gap@lineto@next}}}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
+ around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@lineto@last}}%
+ \pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
+ around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@lineto@next}}%
+ \global\let\pgf@plot@gap@lineto@last=\pgf@plot@gap@lineto@next%
+}%
+
+
+
+
+% This handler works like \pgfplothandlergaplineto, only the last
+% point is connected to the first point, creating a closed curve
+% space.
+%
+% Example:
+%
+% \pgfplothandlergapcycle
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlergapcycle}{}{%
+ point macro=\pgf@plot@gap@cycle@handler@initial,
+ jump macro=\pgf@plot@gapcycle@next@moveto,
+ end macro=\pgf@plot@gap@cycle@handler@finish,
+ start={\global\let\pgf@plot@gap@cycle@first\relax}
+}%
+
+\def\pgf@plot@gapcycle@next@moveto{%
+ \pgf@plot@gap@cycle@handler@finish%
+ \global\let\pgf@plot@gap@cycle@first=\relax%
+ \global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler@initial%
+}%
+
+\def\pgf@plot@gap@cycle@handler@initial#1{%
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \xdef\pgf@plot@gap@cycle@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \global\let\pgf@plot@gap@cycle@first=\pgf@plot@gap@cycle@last%
+ \global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler%
+}%
+
+\def\pgf@plot@gap@cycle@handler#1{%
+ % Ok, compute normalized line vector
+ \pgf@process{#1}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \xdef\pgf@plot@gap@cycle@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@cycle@last}{\pgf@plot@gap@cycle@next}}}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
+ around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@cycle@last}}%
+ \pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
+ around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@cycle@next}}%
+ \global\let\pgf@plot@gap@cycle@last=\pgf@plot@gap@cycle@next%
+}%
+
+\def\pgf@plot@gap@cycle@handler@finish{%
+ \ifx\pgf@plot@gap@cycle@first\relax%
+ \else
+ \pgf@plot@gap@cycle@handler{\pgf@plot@gap@cycle@first}%
+ \fi
+}%
+
+
+
+\endinput
+
+% Local Variables:
+% tab-width: 2
+% End:
diff --git a/graphics/pgf/base/tex/pgflibraryplothandlers.sty b/graphics/pgf/base/tex/pgflibraryplothandlers.sty
new file mode 100644
index 0000000000..1510046e7d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryplothandlers.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{plothandlers} instead}
+
+\RequirePackage{pgfcore}
+
+\input{pgflibraryplothandlers.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryplotmarks.code.tex b/graphics/pgf/base/tex/pgflibraryplotmarks.code.tex
new file mode 100644
index 0000000000..24bc7b8de7
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryplotmarks.code.tex
@@ -0,0 +1,453 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryplotmarks.code.tex}
+
+
+% A stroked circle mark
+
+\pgfdeclareplotmark{o}
+{%
+ \pgfpathellipse{\pgfpointorigin}{\pgfqpoint{\pgfplotmarksize}{0sp}}{\pgfqpoint{0sp}{\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+
+% A Mercedes-line star
+
+\pgfdeclareplotmark{Mercedes star}
+{%
+ \pgfpathmoveto{\pgfqpointpolar{90}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfpointorigin}%
+ \pgfpathmoveto{\pgfqpointpolar{-30}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfpointorigin}%
+ \pgfpathmoveto{\pgfqpointpolar{-150}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfpointorigin}%
+ \pgfusepathqstroke
+}%
+
+\pgfdeclareplotmark{Mercedes star flipped}
+{%
+ \pgfpathmoveto{\pgfqpointpolar{-90}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfpointorigin}%
+ \pgfpathmoveto{\pgfqpointpolar{30}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfpointorigin}%
+ \pgfpathmoveto{\pgfqpointpolar{150}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfpointorigin}%
+ \pgfusepathqstroke
+}%
+
+
+
+
+% A six-pointed star mark
+
+\pgfdeclareplotmark{asterisk}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpointpolar{30}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{210}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpointpolar{-30}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-210}{\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+
+% A five-pointed star mark
+
+\pgfdeclareplotmark{star}
+{%
+ \pgfpathmoveto{\pgfpointorigin}\pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfpointorigin}\pgfpathlineto{\pgfqpointpolar{18}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfpointorigin}\pgfpathlineto{\pgfqpointpolar{-54}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfpointorigin}\pgfpathlineto{\pgfqpointpolar{234}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfpointorigin}\pgfpathlineto{\pgfqpointpolar{162}{\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+
+% An 10-pointed star mark
+
+\pgfdeclareplotmark{10-pointed star}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfplotmarksize}}\pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpointpolar{18}{-\pgfplotmarksize}}\pgfpathlineto{\pgfqpointpolar{18}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpointpolar{-54}{-\pgfplotmarksize}}\pgfpathlineto{\pgfqpointpolar{-54}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpointpolar{234}{-\pgfplotmarksize}}\pgfpathlineto{\pgfqpointpolar{234}{\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpointpolar{162}{-\pgfplotmarksize}}\pgfpathlineto{\pgfqpointpolar{162}{\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+
+% An \oplus mark
+
+\pgfdeclareplotmark{oplus}
+{%
+ \pgfpathcircle{\pgfpointorigin}{\pgfplotmarksize}%
+ \pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+\pgfdeclareplotmark{oplus*}
+{%
+ \pgfpathcircle{\pgfpointorigin}{\pgfplotmarksize}%
+ \pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfusepathqfillstroke
+}%
+
+
+% An \otimes mark
+
+\pgfdeclareplotmark{otimes}
+{%
+ \pgfpathcircle{\pgfpointorigin}{\pgfplotmarksize}%
+ \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+\pgfdeclareplotmark{otimes*}
+{%
+ \pgfpathcircle{\pgfpointorigin}{\pgfplotmarksize}%
+ \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
+ \pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
+ \pgfusepathqfillstroke
+}%
+
+
+% A vertical bar mark
+
+\pgfdeclareplotmark{|}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+
+
+% A horizontal bar mark
+
+\pgfdeclareplotmark{-}
+{%
+ \pgfpathmoveto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfusepathqstroke
+}%
+
+
+% A square stroked mark
+
+\pgfdeclareplotmark{square}
+{%
+ \pgfpathrectangle{\pgfqpoint{-\pgfplotmarksize}{-\pgfplotmarksize}}{\pgfqpoint{2\pgfplotmarksize}{2\pgfplotmarksize}}%
+ \pgfusepathqstroke
+}%
+
+% A square stroked-filled mark
+
+\pgfdeclareplotmark{square*}
+{%
+ \pgfpathrectangle{\pgfqpoint{-\pgfplotmarksize}{-\pgfplotmarksize}}{\pgfqpoint{2\pgfplotmarksize}{2\pgfplotmarksize}}%
+ \pgfusepathqfillstroke
+}%
+
+
+% A triangle mark
+
+\pgfdeclareplotmark{triangle}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-30}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-150}{\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+% A stroke-filled triangle mark
+
+\pgfdeclareplotmark{triangle*}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-30}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-150}{\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+
+
+% A diamond-shaped mark
+
+\pgfdeclareplotmark{diamond}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.75\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-.75\pgfplotmarksize}{0pt}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+% A stroke-filled diamond-shaped mark
+
+\pgfdeclareplotmark{diamond*}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.75\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-.75\pgfplotmarksize}{0pt}}%
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+
+
+% A pentagon-shaped mark
+
+\pgfdeclareplotmark{pentagon}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{18}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-54}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{234}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{162}{\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+% A stroke-filled pentagon-shaped mark
+
+\pgfdeclareplotmark{pentagon*}
+{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{18}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{-54}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{234}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpointpolar{162}{\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\newif\ifpgfmarktext@usetikznode
+\pgfkeys{
+ /pgf/text mark/.initial=p,
+ /pgf/text mark style/.initial=,
+ /pgf/text mark as node/.is if=pgfmarktext@usetikznode,
+ /pgf/text mark as node/.default=true,
+ %
+ % backw. compat: the extra search path confuses the '.unknown'
+ % handlers, so this here is deprecated:
+ /pgf/text mark/style/.style={/pgf/text mark style={#1}},%
+ /pgf/text mark/as node/.style={/pgf/text mark as node=#1},%
+}%
+
+\pgfdeclareplotmark{text}
+{
+ \pgfkeysgetvalue{/pgf/text mark style}\pgfmarktext@style
+ \pgfkeysgetvalue{/pgf/text mark}\pgfmarktext@
+ \ifpgfmarktext@usetikznode
+ \expandafter\node\expandafter[\pgfmarktext@style]{\pgfmarktext@};
+ \else
+ \expandafter\pgftext\expandafter[\pgfmarktext@style]{\pgfmarktext@}%
+ \fi
+}%
+
+\pgfkeysdef{/pgf/mark color}{\def\pgf@mark@color{#1}}%
+\let\pgf@mark@color\pgfutil@empty
+
+\def\pgf@set@mark@color{%
+ \ifx\pgf@mark@color\pgfutil@empty
+ \pgfsys@color@rgb@fill{1}{1}{1}%
+ \else
+ \pgfsetfillcolor{\pgf@mark@color}%
+ \fi
+}%
+\def\pgf@mark@color@none{none}%
+
+% A half-down-filled and half-up-filled-white diamond-shaped mark
+% (the shape can be rotated by "mark options = {rotate = 90}")
+% created by Tomek
+
+\pgfdeclareplotmark{halfcircle}{%
+ \ifx\pgf@mark@color@none\pgf@mark@color
+ \else
+ \pgfscope
+ \pgf@set@mark@color
+ \pgfpathmoveto
+ {\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpatharc{180}{360}{\pgfplotmarksize}%
+ \pgfusepathqfill
+ \endpgfscope%
+ \fi
+ \pgfpathmoveto
+ {\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto
+ {\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathcircle{\pgfpointorigin}%
+ {\pgfplotmarksize}%
+ \pgfusepathqstroke
+}%
+\pgfdeclareplotmark{halfcircle*}{%
+ \pgfpathmoveto
+ {\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpatharc{0}{180}{\pgfplotmarksize}%
+ \pgfpathclose
+ \pgfusepathqfill
+ \ifx\pgf@mark@color@none\pgf@mark@color
+ \else
+ \pgfscope
+ \pgf@set@mark@color
+ \pgfpathmoveto
+ {\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpatharc{180}{360}{\pgfplotmarksize}%
+ \pgfusepathqfill
+ \endpgfscope%
+ \fi
+ \pgfpathcircle{\pgfpointorigin}%
+ {\pgfplotmarksize}%
+ \pgfusepathqstroke
+}%
+
+% A half-down-filled and half-up-filled-white diamond-shaped mark
+% created by Magnus Tewes
+
+\pgfdeclareplotmark{halfdiamond*}{%
+ \pgfpathmoveto{\pgfqpoint{-.75\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{.75\pgfplotmarksize}{0pt}}%
+ \pgfusepathqfill
+ \ifx\pgf@mark@color@none\pgf@mark@color
+ \else
+ \pgfscope
+ \pgf@set@mark@color
+ \pgfpathmoveto{\pgfqpoint{.75\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-.75\pgfplotmarksize}{0pt}}%
+ \pgfusepathqfill
+ \endpgfscope
+ \fi
+ \pgfpathmoveto{\pgfqpoint{.75\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-.75\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+% A half-down-filled and half-up-filled-white tilted-squared-shaped mark
+% created by Magnus Tewes
+
+\pgfdeclareplotmark{halfsquare*}{%
+ \pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfusepathqfill
+ \ifx\pgf@mark@color@none\pgf@mark@color
+ \else
+ \pgfscope
+ \pgf@set@mark@color
+ \pgfpathmoveto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfusepathqfill
+ \endpgfscope
+ \fi
+ \pgfpathmoveto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+% A half-right-filled and half-up-filled-white tilted-squared-shaped mark
+% created by Magnus Tewes
+
+\pgfdeclareplotmark{halfsquare right*}{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfusepathqfill
+ \ifx\pgf@mark@color@none\pgf@mark@color
+ \else
+ \pgfscope
+ \pgf@set@mark@color
+ \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfusepathqfill
+ \endpgfscope
+ \fi
+ \pgfpathmoveto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+% A half-left-filled and half-up-filled-white tilted-squared-shaped mark
+% created by Magnus Tewes
+
+\pgfdeclareplotmark{halfsquare left*}{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfusepathqfill
+ \ifx\pgf@mark@color@none\pgf@mark@color
+ \else
+ \pgfscope
+ \pgf@set@mark@color
+ \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfusepathqfill
+ \endpgfscope
+ \fi
+ \pgfpathmoveto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
+ \pgfpathlineto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqstroke
+}%
+
+
+% A stroke-filled heart-shaped mark
+% created by Magnus Tewes
+\pgfdeclareplotmark{heart}{%
+ \pgfpathmoveto{\pgfqpoint{0pt}{-1.75\pgfplotmarksize}}%
+ \pgfpathcurveto{\pgfqpoint{0pt}{-1.75\pgfplotmarksize}}{\pgfqpoint{0pt}{-1.66\pgfplotmarksize}}{\pgfqpoint{-.5\pgfplotmarksize}{-1.165\pgfplotmarksize}}%
+ \pgfpathcurveto{\pgfqpoint{-.5\pgfplotmarksize}{-1.165\pgfplotmarksize}}{\pgfqpoint{-\pgfplotmarksize}{-.75\pgfplotmarksize}}{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
+ \pgfpathcurveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}{\pgfqpoint{-\pgfplotmarksize}{.5825\pgfplotmarksize}}{\pgfqpoint{-.5825\pgfplotmarksize}{.5825\pgfplotmarksize}}%
+ \pgfpathcurveto{\pgfqpoint{-.5825\pgfplotmarksize}{.5825\pgfplotmarksize}}{\pgfqpoint{0pt}{.5825\pgfplotmarksize}}{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathcurveto{\pgfqpoint{0pt}{0pt}}{\pgfqpoint{0pt}{.5825\pgfplotmarksize}}{\pgfqpoint{.5825\pgfplotmarksize}{.5825\pgfplotmarksize}}%
+ \pgfpathcurveto{\pgfqpoint{.5825\pgfplotmarksize}{.5825\pgfplotmarksize}}{\pgfqpoint{\pgfplotmarksize}{.5825\pgfplotmarksize}}{\pgfqpoint{\pgfplotmarksize}{0pt}}%
+ \pgfpathcurveto{\pgfqpoint{\pgfplotmarksize}{0pt}}{\pgfqpoint{\pgfplotmarksize}{-.75\pgfplotmarksize}}{\pgfqpoint{.5\pgfplotmarksize}{-1.165\pgfplotmarksize}}%
+ \pgfpathcurveto{\pgfqpoint{.5\pgfplotmarksize}{-1.165\pgfplotmarksize}}{\pgfqpoint{0pt}{-1.66\pgfplotmarksize}}{\pgfqpoint{0pt}{-1.75\pgfplotmarksize}}%
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryplotmarks.sty b/graphics/pgf/base/tex/pgflibraryplotmarks.sty
new file mode 100644
index 0000000000..2f1ca05e07
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryplotmarks.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{plotmarks} instead}
+
+\RequirePackage{pgfcore}
+
+\input{pgflibraryplotmarks.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryprofiler.code.tex b/graphics/pgf/base/tex/pgflibraryprofiler.code.tex
new file mode 100644
index 0000000000..fe98a5f3f2
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryprofiler.code.tex
@@ -0,0 +1,530 @@
+%--------------------------------------------
+%
+% TeX profiling library
+%
+% Copyright 2010 by Christian Feuersänger.
+%
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+%
+%--------------------------------------------
+
+\pgfutil@ifundefined{pdfelapsedtime}{%
+ % Ok, \pdfelapsedtime is not defined.
+ % Maybe we run luatex?
+ \pgfutil@ifluatex
+ % Yes. So we emulate the primitive by a macro.
+ % (see http://tex.stackexchange.com/q/32507/8425)
+ \def\pgfutil@pdfelapsedtime{%
+ \numexpr\pgfutil@directlua{%
+ tex.print(math.floor((os.clock())*65536+0.5))}\relax}
+ \else
+ % Raise an error
+ \pgferror{%
+ Library 'profiler' can only be used with pdftex Rev. >= 1.671
+ because it needs the \string\pdfelapsedtime\space command or
+ with luatex}%
+ \global\let\pgfutil@pdfelapsedtime=\c@pgf@counta
+ \fi}{%
+ % We run pdftex. That's ok.
+ \let\pgfutil@pdfelapsedtime\pdfelapsedtime}%
+
+
+% Defines a new profiler entry named `#1'.
+%
+% This allocates a set of counters.
+\def\pgfprofilenew#1{%
+ \pgfutil@ifundefined{c@pgfprofile@elapsedtotal@#1}{%
+ \expandafter\gdef\csname c@pgfprofile@elapsedtotal@#1\endcsname{0}%
+ \expandafter\gdef\csname c@pgfprofile@elapsedself@#1\endcsname{0}%
+ \expandafter\gdef\csname c@pgfprofile@numinvocations@#1\endcsname{0}%
+ \expandafter\gdef\csname c@pgfprofile@subtractforself@#1\endcsname{0}%
+ \expandafter\gdef\csname c@pgfprofile@semaphor@#1\endcsname{0}%
+ \expandafter\gdef\csname c@pgfprofile@elapsed@at@start@#1\endcsname{0}%
+ \pgfprofile@all@registered@list@add{#1}%
+ }{%
+ % it is already defined and registered. Shouldn't hurt, might
+ % even be a good feature.
+ }%
+}%
+
+\def\pgfprofile@TeX@DIALECT@toenvironment@begin#1{\csname #1\endcsname}%
+\def\pgfprofile@TeX@DIALECT@toenvironment@end#1{\csname end#1\endcsname}%
+
+\def\pgfprofile@@to@pgfretval#1{%
+ \expandafter\let\expandafter\pgfretval#1%
+}%
+
+% Defines a new profiler entry for the environment `#1'.
+%
+% This calls \pgfprofilenew and handles the begin/end of the
+% environment automatically.
+%
+% #1 the environment name (a string)
+%
+% Optionally in square brackets: the profiler entry name
+% \pgfprofilenewforenvironment{<environment name>}
+% \pgfprofilenewforenvironment[<profiler entry name>]{<environment name>}
+\def\pgfprofilenewforenvironment{\pgfutil@ifnextchar[{\pgfprofilenewforenvironment@}{\pgfprofilenewforenvironment@[]}}%
+\def\pgfprofilenewforenvironment@[#1]#2{%
+ \expandafter\pgfprofile@@to@pgfretval\pgfprofile@TeX@DIALECT@toenvironment@begin{#2}%
+ \ifx\pgfretval\relax
+ \pgferror{\string\pgfprofilenewforenvironment{#2} doesn't work: the environment `#2' is (not yet?) known or not known in this context}{}%
+ \else
+ \expandafter\global\expandafter\let\csname pgfprofile@orig@begin@#2\endcsname=\pgfretval
+ \expandafter\pgfprofile@@to@pgfretval\pgfprofile@TeX@DIALECT@toenvironment@end{#2}%
+ \expandafter\global\expandafter\let\csname pgfprofile@orig@end@#2\endcsname=\pgfretval
+ %
+ \def\pgfprofile@temp{#1}%
+ \ifx\pgfprofile@temp\pgfutil@empty
+ \pgfprofilenewforenvironment@@{\pgfprofileenv #2}{#2}%
+ \else
+ \pgfprofilenewforenvironment@@{#1}{#2}%
+ \fi
+ \fi
+}%
+\def\pgfprofilenewforenvironment@@#1#2{%
+ \pgfprofilenew{#1}%
+ \expandafter\expandafter\expandafter\gdef\pgfprofile@TeX@DIALECT@toenvironment@begin{#2}{%
+ \pgfprofilestart{#1}%
+ \csname pgfprofile@orig@begin@#2\endcsname
+ }%
+ \expandafter\expandafter\expandafter\gdef\pgfprofile@TeX@DIALECT@toenvironment@end{#2}{%
+ \csname pgfprofile@orig@end@#2\endcsname
+ \pgfprofileend{#1}%
+ }%
+}%
+
+
+\def\pgfprofilecs{<CS>}%
+\def\pgfprofileenv{<ENV>}%
+
+% Defines a new profiler entry for the control sequence '#1'.
+%
+% This calls \pgfprofilenew and enhances the control sequence with
+% support for timings.
+%
+% #1: the control sequence (with backslash!)
+% #2: the number of arguments (see below).
+%
+% The following commands are supported:
+% - commands which take one (optional) argument in square brackets,
+% - commands which take one (optional) argument in square brackets
+% followed by one optional argument which has to be delimited with
+% curly braces (use an empty argument for '#2' in this case),
+% - commands which take one (optional) argument in square brackets
+% and *exactly* #2 arguments afterwards.
+\def\pgfprofilenewforcommand{\pgfutil@ifnextchar[{\pgfprofilenewforcommand@}{\pgfprofilenewforcommand@[]}}%
+\def\pgfprofilenewforcommand@[#1]#2#3{%
+ \def\pgfprofile@temp{#3}%
+ \ifx\pgfprofile@temp\pgfutil@empty
+ \pgfprofilenewforcommandpattern[#1]{#2}{<autocheck>}{}%
+ \else
+ \ifcase#3\relax
+ \pgfprofilenewforcommandpattern[#1]{#2}{}{}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1}{{##1}}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1##2}{{##1}{##2}}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1##2##3}{{##1}{##2}{##3}}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1##2##3##4}{{##1}{##2}{##3}{##4}}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1##2##3##4##5}{{##1}{##2}{##3}{##4}{##5}}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1##2##3##4##5##6}{{##1}{##2}{##3}{##4}{##5}{##6}}%
+ \or
+ \pgfprofilenewforcommandpattern[#1]{#2}{##1##2##3##4##5##6##7}{{##1}{##2}{##3}{##4}{##5}{##6}{##7}}%
+ \else
+ \pgferror{library 'profiler' can't replace control sequences with '#3' arguments automatically, sorry.}{}%
+ \fi
+ \fi
+}%
+
+% \pgfprofilenewforcommandpattern[<profile entry name>]{<\CS>}{<definition pattern>}{<invocation pattern>}
+%
+% example:
+% \pgfprofilenewforcommandpattern{\pgfqkeys}{##1##2}{{##1}{##2}}
+%
+% \def\mymacro##1\to##2\in##3{ .... }
+% \pgfprofilenewforcommandpattern{\mymacro}{##1\to##2\in##3}{{##1}\to{##2}\in{##3}}
+\def\pgfprofilenewforcommandpattern{\pgfutil@ifnextchar[{\pgfprofilenewforcommandpattern@}{\pgfprofilenewforcommandpattern@[]}}%
+\def\pgfprofilenewforcommandpattern@[#1]#2#3#4{%
+ \def\pgfprofile@known{1}%
+ \ifx#2\undefined
+ \def\pgfprofile@known{0}%
+ \else
+ \ifx#2\relax
+ \def\pgfprofile@known{0}%
+ \fi
+ \fi
+ \if\pgfprofile@known0%
+ \pgferror{\string\pgfprofilenewforcommandpattern{\string#2} doesn't work: the command `\string#2' is (not yet?) known or not known in this context}%
+ \else
+ \begingroup
+ \pgfprofile@cs@to@name{#2}%
+ \let\pgfprofilenew@cmdname=\pgfretval
+ %
+ \def\pgfprofile@temp{#1}%
+ \ifx\pgfprofile@temp\pgfutil@empty
+ \edef\pgfprofilenew@profilerentryname{\pgfprofilecs\pgfprofilenew@cmdname}%
+ \else
+ \edef\pgfprofilenew@profilerentryname{#1}%
+ \fi
+ \expandafter\global\expandafter\let\csname pgfprofile@name@for@\pgfprofilenew@cmdname\endcsname=\pgfprofilenew@profilerentryname
+ \pgfprofilenew{\pgfprofilenew@profilerentryname}%
+ \expandafter\gdef\csname b@pgfprofile@show@\pgfprofilenew@profilerentryname\endcsname{0}%
+ %
+ \expandafter\global\expandafter\let\csname pgfprofile@orig@\pgfprofilenew@cmdname\endcsname=#2%
+ \toks0={#3}%
+ \edef\pgfprofile@temp{\the\toks0}%%
+ \def\pgfprofile@tempb{<autocheck>}%
+ \ifx\pgfprofile@temp\pgfprofile@tempb
+ \expandafter\global\expandafter\let\csname pgfprofile@repl@\pgfprofilenew@cmdname\endcsname=\pgfprofileinvokecommand@uptoonearg
+ \else
+ \expandafter\gdef\csname pgfprofile@repl@\pgfprofilenew@cmdname\endcsname#3{%
+ \pgfprofile@invokeorig{#4}%
+ }%
+ \fi
+ \xdef#2{\noexpand\pgfprofileinvokecommand{\pgfprofilenew@cmdname}}%
+ \endgroup
+ \fi
+}%
+
+\def\pgfprofileshowinvocationsfor#1{%
+ \pgfutil@ifundefined{b@pgfprofile@show@#1}{%
+ \pgferror{\string\pgfprofileshowinvocationsfor{#1} doesn't work: the argument is no profiler entry}%
+ }{%
+ \expandafter\gdef\csname b@pgfprofile@show@#1\endcsname{1}%
+ \expandafter\gdef\csname b@pgfprofile@show@edef@#1\endcsname{0}%
+ }%
+}%
+\def\pgfprofileshowinvocationsexpandedfor#1{%
+ \pgfutil@ifundefined{b@pgfprofile@show@#1}{%
+ \pgferror{\string\pgfprofileshowinvocationsfor{#1} doesn't work: the argument is no profiler entry}%
+ }{%
+ \expandafter\gdef\csname b@pgfprofile@show@#1\endcsname{1}%
+ \expandafter\gdef\csname b@pgfprofile@show@edef@#1\endcsname{1}%
+ }%
+}%
+
+\def\pgfprofile@no@optional@arg@text{<noarg>}%
+\def\pgfprofileinvokecommand#1{%
+ \pgfutil@ifnextchar[{\pgfprofileinvokecommand@{#1}}{\pgfprofileinvokecommand@{#1}[<noarg>]}%
+}%
+\def\pgfprofileinvokecommand@#1[#2]{%
+ \def\pgfprofileinvokecommand@cs{#1}%
+ \def\pgfprofileinvokecommand@optarg{#2}%
+ \edef\pgfprofileinvokecommand@profilerentryname{\csname pgfprofile@name@for@#1\endcsname}%
+ \csname pgfprofile@repl@#1\endcsname%
+}%
+
+% #1 contains ALL arguments, including any braces.
+\def\pgfprofile@invokeorig#1{%
+ % re-insert the control sequence name and the optional argument:
+ % this wasn't possible directly.
+ \begingroup
+ \toks1=\expandafter{\pgfprofileinvokecommand@optarg}%
+ \toks2={#1}%
+ \toks3=\expandafter{\csname pgfprofile@orig@\pgfprofileinvokecommand@cs\endcsname}%
+ %
+ \ifx\pgfprofileinvokecommand@optarg\pgfprofile@no@optional@arg@text
+ % no [] argument after original command:
+ \xdef\pgfprofile@invokeorig@doitfinally{\the\toks3 \the\toks2 }%%
+ \else
+ \xdef\pgfprofile@invokeorig@doitfinally{\the\toks3[\the\toks1]\the\toks2 }%
+ \fi
+ \if1\csname b@pgfprofile@show@\pgfprofileinvokecommand@profilerentryname\endcsname
+ \pgfprofile@orig@show
+ \fi
+ \endgroup
+ \edef\pgfprofile@temp{{\pgfprofileinvokecommand@cs}{\pgfprofileinvokecommand@profilerentryname}}%
+ \expandafter\pgfprofile@invokeorig@\pgfprofile@temp%
+}%
+\def\pgfprofile@orig@show{%
+ \toks4=\expandafter{\csname\pgfprofileinvokecommand@cs\endcsname}%
+ \ifx\pgfprofileinvokecommand@optarg\pgfprofile@no@optional@arg@text
+ \def\pgfprofile@orig@show@args{\the\toks2 }%
+ \else
+ \def\pgfprofile@orig@show@args{[\the\toks1] \the\toks2 }%
+ \fi
+ \if1\csname b@pgfprofile@show@edef@\pgfprofileinvokecommand@profilerentryname\endcsname
+ \edef\pgfprofile@orig@show@args{\pgfprofile@orig@show@args}%
+ \edef\pgfprofile@orig@show@args{\pgfprofile@orig@show@args}%
+ \fi
+ \pgf@typeout{pgflibraryprofiler: calling
+ \#\csname c@pgfprofile@numinvocations@\pgfprofileinvokecommand@profilerentryname\endcsname\space
+ (\the\toks4 \pgfprofile@orig@show@args)}%
+}%
+
+% #1: control sequence name (without backslash)
+% #2: profiler entry name
+\def\pgfprofile@invokeorig@#1#2{%
+ % this check should avoid save stack impact
+ \pgfprofileifisrunning{#2}{%
+ \pgfprofile@invokeorig@doitfinally%
+ }{%
+ \pgfprofilestart{#2}%
+ \pgfprofile@invokeorig@doitfinally%
+ \pgfprofileend{#2}%
+ }%
+}%
+
+
+\def\pgfprofileinvokecommand@uptoonearg{%
+ \pgfutil@ifnextchar\bgroup{\pgfprofileinvokecommand@onearg}{\pgfprofileinvokecommand@noarg}%
+}%
+\def\pgfprofileinvokecommand@onearg#1{%
+ \pgfprofile@invokeorig{{#1}}%
+}%
+\def\pgfprofileinvokecommand@noarg{%
+ \pgfprofile@invokeorig{}%
+}%
+
+
+
+% Starts / Resumes timing of the profiler entry named `#1'.
+%
+% The timing will continue until \pgfprofileend{#1} is called.
+%
+% Nested calls of \pgfprofilestart{#1} (with the same argument) will
+% result in the same result as if just one \pgfprofilestart command
+% has been issued.
+\def\pgfprofilestart#1{%
+ \pgfprofileifisrunning{#1}{%
+ \relax
+ }{%
+ \expandafter\xdef\csname c@pgfprofile@elapsed@at@start@#1\endcsname{\the\pgfutil@pdfelapsedtime}%
+ \expandafter\gdef\csname c@pgfprofile@subtractforself@#1\endcsname{0}%
+ \pgfprofile@advance{c@pgfprofile@numinvocations@#1}{1}%
+ \pgfprofilestackpush{#1}%
+ }%
+ \pgfprofile@advance{c@pgfprofile@semaphor@#1}{1}%
+}%
+
+% Stops / Interrupts timing of the profiler entry named `#1'.
+\def\pgfprofileend#1{%
+ \pgfprofile@advance{c@pgfprofile@semaphor@#1}{-1}%
+ \pgfprofileifisrunning{#1}{%
+ \relax
+ }{%
+ \begingroup
+ \c@pgf@countb=\pgfutil@pdfelapsedtime\relax
+ \advance\c@pgf@countb by-\csname c@pgfprofile@elapsed@at@start@#1\endcsname\relax
+ %
+ \pgfprofilestackpop\pgfretval
+ \edef\pgfprofile@temp{#1}%
+ \ifx\pgfprofile@temp\pgfretval
+ \else
+ \pgf@typeout{pgflibraryprofiler WARNING: possible error in self time computation...}%
+ \fi
+ \pgfprofilestackifempty{%
+ \relax
+ }{%
+ \pgfprofilestacktop\pgfretval
+ \pgfprofile@advance{c@pgfprofile@subtractforself@\pgfretval}{\c@pgf@countb}%
+ }%
+ %
+ \pgfprofile@advance{c@pgfprofile@elapsedtotal@#1}{\c@pgf@countb}%
+ \advance\c@pgf@countb by-\csname c@pgfprofile@subtractforself@#1\endcsname\relax
+ \pgfprofile@advance{c@pgfprofile@elapsedself@#1}{\c@pgf@countb}%
+ \endgroup
+ }%
+}%
+
+% invokes '#2' if '#1' is currently running and '#3' if not.
+\def\pgfprofileifisrunning#1#2#3{%
+ \ifnum\csname c@pgfprofile@semaphor@#1\endcsname=0 \def\pgfprofileifisrunning@next{#3}\else \def\pgfprofileifisrunning@next{#2}\fi
+ \pgfprofileifisrunning@next
+}%
+
+% Sets the profiler entry whose total time is used to compute all
+% other relative times.
+\def\pgfprofilesetrel#1{\edef\pgfprofile@rel{#1}}%
+
+% Stops all running timings and postprocesses them.
+\def\pgfprofilepostprocess{%
+ \begingroup
+ %
+ % prepare files.
+ \c@pgf@countb=\time
+ \divide\c@pgf@countb by60
+ \c@pgf@countd=\c@pgf@countb
+ \multiply\c@pgf@countd by60
+ \c@pgf@countc=\time
+ \advance\c@pgf@countc by-\c@pgf@countd
+ \immediate\openout\w@pgf@writea=\jobname.profiler.\the\year-\pgfprofiletotwodigitstr\month-\pgfprofiletotwodigitstr\day_\pgfprofiletotwodigitstr\c@pgf@countb h_\pgfprofiletotwodigitstr\c@pgf@countc m.dat
+ \immediate\write\w@pgf@writea{%
+ \pgfprofile@percent relative values are measured against the totaltime of `\pgfprofile@rel'.%
+ }%
+ \pgf@typeout{pgflibraryprofiler: relative values are measured against the totaltime of `\pgfprofile@rel'.}%
+ \immediate\write\w@pgf@writea{%
+ profilerentry\pgfprofile@TAB
+ totaltime[s]\pgfprofile@TAB
+ totaltime[percent]\pgfprofile@TAB
+ selftime[s]\pgfprofile@TAB
+ selftime[percent]\pgfprofile@TAB
+ numinvocations\pgfprofile@TAB}%
+ %
+ %
+ % compute main time and prepare computation of relative times:
+ \pgfprofileifisrunning{\pgfprofile@rel}{%
+ \pgfprofileend{\pgfprofile@rel}%
+ }{}%
+ \pgf@xa=\csname c@pgfprofile@elapsedtotal@\pgfprofile@rel\endcsname sp
+ \edef\pgfprofiletotaltime{\pgf@sys@tonumber\pgf@xa}%
+ \pgfmathreciprocal@{\pgfprofiletotaltime}%
+ \let\pgfprofiletotaltime@inv=\pgfmathresult
+ %
+ % postprocess each of them:
+ \pgfprofile@all@registered@list@foreach{%
+ \pgfprofileifisrunning{##1}{%
+ \pgfprofileend{##1}%
+ }{}%
+ \pgfprofilepostprocess@single{##1}%
+ }%
+ \immediate\write\w@pgf@writea{%
+ \pgfprofile@percent\space vim: ts=40 nowrap nostartofline
+ }%
+ \immediate\closeout\w@pgf@writea
+ \endgroup
+}%
+
+{%
+\catcode`\[=1 %
+\catcode`\]=2 %
+\catcode`\{=12 %
+\catcode`\}=12 %
+\catcode`\^^I=12
+\gdef\pgfprofile@lbrace[{]%
+\gdef\pgfprofile@rbrace[}]%
+\gdef\pgfprofile@TAB[^^I]%
+]
+{
+\catcode`\%=12 \gdef\pgfprofile@percent{%}}
+
+\def\pgfprofilepostprocess@single#1{%
+ \begingroup
+ \pgf@xa=\csname c@pgfprofile@elapsedtotal@#1\endcsname sp
+ \pgf@xb=\csname c@pgfprofile@elapsedself@#1\endcsname sp
+ \pgf@ya=\pgfprofiletotaltime@inv\pgf@xa
+ \pgf@yb=\pgfprofiletotaltime@inv\pgf@xb
+ \multiply\pgf@ya by100
+ \multiply\pgf@yb by100
+ \edef\pgfprofilecur@total{\pgf@sys@tonumber\pgf@xa}%
+ \edef\pgfprofilecur@self{\pgf@sys@tonumber\pgf@xb}%
+ \edef\pgfprofilecur@total@rel{\pgf@sys@tonumber\pgf@ya}%
+ \edef\pgfprofilecur@self@rel{\pgf@sys@tonumber\pgf@yb}%
+ \pgf@typeout{
+ pgflibraryprofiler(#1)
+ \pgfprofile@lbrace
+ total time=\pgfprofilecur@total sec; (\pgfprofilecur@total@rel\pgfprofile@percent)
+ self time=\pgfprofilecur@self sec; (\pgfprofilecur@self@rel\pgfprofile@percent)
+ invocations=\csname c@pgfprofile@numinvocations@#1\endcsname;
+ \pgfprofile@rbrace
+ }%
+ \immediate\write\w@pgf@writea{%
+ #1\pgfprofile@TAB
+ \pgfprofilecur@total\pgfprofile@TAB
+ \pgfprofilecur@total@rel\pgfprofile@TAB
+ \pgfprofilecur@self\pgfprofile@TAB
+ \pgfprofilecur@self@rel\pgfprofile@TAB
+ \csname c@pgfprofile@numinvocations@#1\endcsname\pgfprofile@TAB
+ }%
+ \endgroup
+}%
+% Invokes '#2' for each element of the command separated list '#1'.
+% the current list element is available as '#1' inside of '#2'.
+\long\def\pgfprofileforeachentryinCSV#1#2{%
+ \long\def\pgfprofileinvokeforeach@@##1{#2}%
+ \pgfprofileforeachentryinCSVisterminated@loop#1,\pgfeov
+}%
+\long\def\pgfprofileforeachentryinCSVisterminated@loop{%
+ \pgfutil@ifnextchar\pgfeov{\pgfutil@gobble}{\pgfprofileforeachentryinCSV@next}%
+}%
+\long\def\pgfprofileforeachentryinCSV@next#1,{%
+ \pgfprofileinvokeforeach@@{#1}%
+ \pgfprofileforeachentryinCSVisterminated@loop%
+}%
+
+\xdef\pgfprofile@all@registered@list{}%
+\xdef\pgfprofile@currently@running@list{}%
+
+\def\pgfprofile@all@registered@list@add#1{%
+ \ifx\pgfprofile@all@registered@list\pgfutil@empty
+ \xdef\pgfprofile@all@registered@list{#1}%
+ \else
+ \xdef\pgfprofile@all@registered@list{\pgfprofile@all@registered@list,#1}%
+ \fi
+}%
+
+\def\pgfprofile@all@registered@list@foreach#1{%
+ \expandafter\pgfprofileforeachentryinCSV\expandafter{\pgfprofile@all@registered@list}{#1}%
+}%
+
+\def\pgfprofile@advance#1#2{%
+ \begingroup
+ \c@pgf@counta=\csname #1\endcsname\relax
+ \advance\c@pgf@counta by#2\relax
+ \expandafter\xdef\csname #1\endcsname{\the\c@pgf@counta}%
+ \endgroup
+}%
+
+\def\pgfprofile@cs@to@name@#1#2\relax{\def\pgfretval{#2}}
+
+% defines '\pgfretval' to be the control sequences name of '#1' *without* the backslash.
+\def\pgfprofile@cs@to@name#1{%
+ \expandafter\pgfprofile@cs@to@name@\string#1\relax
+}%
+
+\newcount\c@pgfprofile@stacktop
+
+\c@pgfprofile@stacktop=-1
+\def\pgfprofilestackpush#1{%
+ \global\advance\c@pgfprofile@stacktop by1
+ \expandafter\xdef\csname pgfprofile@stack@\the\c@pgfprofile@stacktop\endcsname{#1}%
+}%
+% pops the current stack top to macro #1
+\def\pgfprofilestackpop#1{%
+ \pgfprofilestacktop#1%
+ \global\advance\c@pgfprofile@stacktop by-1
+}%
+% returns the stack's top to macro #1
+\def\pgfprofilestacktop#1{%
+ \expandafter\let\expandafter#1\csname pgfprofile@stack@\the\c@pgfprofile@stacktop\endcsname
+}%
+\def\pgfprofilestackifempty#1#2{%
+ \ifnum\c@pgfprofile@stacktop<0 #1\else #2\fi
+}%
+
+
+\def\pgfprofiletotwodigitstr#1{\ifnum#1<10 0\the#1\else\the#1\fi}%
+
+\pgfprofilenew{main job}%
+\pgfprofilestart{main job}%
+\expandafter\xdef\csname c@pgfprofile@elapsed@at@start@main job\endcsname{0}%
+\pgfprofilesetrel{main job}%
+
+\pgfutil@ifundefined{AtEndDocument}{%
+ % no latex. ok.
+}{%
+ % do latex specific stuff:
+ \pgfprofilenew{preamble}
+ \pgfprofilestart{preamble}
+ \expandafter\xdef\csname c@pgfprofile@elapsed@at@start@preamble\endcsname{0}%
+ \AtBeginDocument{\pgfprofileend{preamble}}%
+ %
+ \AtEndDocument{\pgfprofilepostprocess}%
+}%
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshadings.code.tex b/graphics/pgf/base/tex/pgflibraryshadings.code.tex
new file mode 100644
index 0000000000..02c2f8c194
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshadings.code.tex
@@ -0,0 +1,444 @@
+% Copyright 2008 by Till Tantau and others
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryshadings.code.tex}
+
+
+%
+% An hsv color wheel. Initial code graciously donated by Ken Starks.
+%
+
+\pgfdeclarefunctionalshading[black]{color wheel white center}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}
+{}
+{ % x y
+ 2 copy % ... x y x y
+ 2 copy abs exch abs add 0.0001 ge
+ {atan 360.0 div} % ... x y heading; heading being in
+ %the interval [0, 1.0]
+ { pop } % silently deal with error: return
+ % arbitrary heading of zero for origin
+ ifelse % because we will use it for 'Hue'
+ 3 1 roll % ... heading x y
+ dup mul % ... heading x y*y
+ exch dup mul % ... heading y*y x*x
+ add sqrt % ... heading ra_pt (distance from origin in points)
+ 25.0 div % scale it means a ra of 25bp
+ dup 1.0 ge % BOOLEAN. ready to clamp to interval [0, 1.0]
+ { pop 1.0 }{} ifelse % We shall use the scaled ra as 'Saturation'
+ %2.5 mul 0.25 sub % now, Ra in [0.1, 0.5] --> Saturation
+ % in [0.0, 1.0]. Saturation varies between the two radii
+ 1.0 % ... H S V ( with 'Value' set to literal constant of 1.0 )
+ % C version to use as model:
+ % H' = H * 6
+ % i = floor(H')
+ % f = H' - i
+ % P = V * (1.0 - S)
+ % Q = V * (1.0 - (S*f))
+ % T = V * (1.0 - (S * (1.0 - f)))
+ 3 2 roll 6.0 mul dup 4 1 roll % H' S V H'
+ floor cvr % H' S V i
+ dup 5 1 roll % i H' S V i
+ 3 index sub neg % i H' S V f
+ 1.0 3 index sub % i H' S V f (1.0 - S )
+ 2 index mul % i H' S V f P
+ 6 1 roll % P i H' S V f
+ dup 3 index mul neg 1.0 add % P i H' S V f ( 1.0 - (f*S))
+ 2 index mul % P i H' S V f Q
+ 7 1 roll % Q P i H' S V f
+ neg 1.0 add % Q P i H' S V (1.0 - f)
+ 2 index mul neg 1.0 add % Q P i H' S V (1.0 - S * (1.0 - f))
+ 1 index mul % Q P i H' S V T
+ 7 2 roll % V T Q P i H' S
+ pop pop % V T Q P i
+ %%%
+ % end of BLOCK B. The rest is just stack manipulation
+ dup 0.5 le % TEST II [ i == 0 ]
+ { % BLOCK C [ take stack to V T P ]
+ pop exch pop
+ }
+ { dup 1.5 le % TEST III [ i == 1 ]
+ { % BLOCK D [ take stack to Q V P ]
+ pop exch 4 1 roll exch pop
+ }
+ { dup 2.5 le % TEST IV [ i == 2 ]
+ { % BLOCK E [ take stack to P V T ]
+ pop 4 1 roll pop
+ }
+ { dup 3.5 le % TEST V [ i == 3 ]
+ { % BLOCK F [ take stack to P Q V ]
+ pop exch 4 2 roll pop
+ }
+ { dup 4.5 le % TEST VI [ i == 4 ]
+ { % BLOCK G [ take stack to T P V ]
+ pop exch pop 3 -1 roll
+ }
+ { % BLOCK H [ take stack to V P Q ]
+ pop 3 1 roll exch pop
+ }
+ ifelse
+ }
+ ifelse % for V
+ }
+ ifelse % for IV
+ }
+ ifelse % for III
+ }
+ ifelse % for II
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+\pgfdeclarefunctionalshading[black]{color wheel black center}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}
+{}
+{ % x y
+ 2 copy % ... x y x y
+ 2 copy abs exch abs add 0.0001 ge
+ {atan 360.0 div} % ... x y heading; heading being in
+ %the interval [0, 1.0]
+ { pop } % silently deal with error: return
+ % arbitrary heading of zero for origin
+ ifelse % because we will use it for 'Hue'
+ 3 1 roll % ... heading x y
+ dup mul % ... heading x y*y
+ exch dup mul % ... heading y*y x*x
+ add sqrt % ... heading ra_pt (distance from origin in points)
+ 25.0 div % scale it means a ra of 25bp
+ dup 1.0 ge % BOOLEAN. ready to clamp to interval [0, 1.0]
+ { pop 1.0 }{} ifelse % We shall use the scaled ra as 'Saturation'
+ %2.5 mul 0.25 sub % now, Ra in [0.1, 0.5] --> Saturation
+ % in [0.0, 1.0]. Saturation varies between the two radii
+ 1.0 exch % ... H S V ( with 'Value' set to literal constant of 1.0 )
+ % C version to use as model:
+ % H' = H * 6
+ % i = floor(H')
+ % f = H' - i
+ % P = V * (1.0 - S)
+ % Q = V * (1.0 - (S*f))
+ % T = V * (1.0 - (S * (1.0 - f)))
+ 3 2 roll 6.0 mul dup 4 1 roll % H' S V H'
+ floor cvr % H' S V i
+ dup 5 1 roll % i H' S V i
+ 3 index sub neg % i H' S V f
+ 1.0 3 index sub % i H' S V f (1.0 - S )
+ 2 index mul % i H' S V f P
+ 6 1 roll % P i H' S V f
+ dup 3 index mul neg 1.0 add % P i H' S V f ( 1.0 - (f*S))
+ 2 index mul % P i H' S V f Q
+ 7 1 roll % Q P i H' S V f
+ neg 1.0 add % Q P i H' S V (1.0 - f)
+ 2 index mul neg 1.0 add % Q P i H' S V (1.0 - S * (1.0 - f))
+ 1 index mul % Q P i H' S V T
+ 7 2 roll % V T Q P i H' S
+ pop pop % V T Q P i
+ %%%
+ % end of BLOCK B. The rest is just stack manipulation
+ dup 0.5 le % TEST II [ i == 0 ]
+ { % BLOCK C [ take stack to V T P ]
+ pop exch pop
+ }
+ { dup 1.5 le % TEST III [ i == 1 ]
+ { % BLOCK D [ take stack to Q V P ]
+ pop exch 4 1 roll exch pop
+ }
+ { dup 2.5 le % TEST IV [ i == 2 ]
+ { % BLOCK E [ take stack to P V T ]
+ pop 4 1 roll pop
+ }
+ { dup 3.5 le % TEST V [ i == 3 ]
+ { % BLOCK F [ take stack to P Q V ]
+ pop exch 4 2 roll pop
+ }
+ { dup 4.5 le % TEST VI [ i == 4 ]
+ { % BLOCK G [ take stack to T P V ]
+ pop exch pop 3 -1 roll
+ }
+ { % BLOCK H [ take stack to V P Q ]
+ pop 3 1 roll exch pop
+ }
+ ifelse
+ }
+ ifelse % for V
+ }
+ ifelse % for IV
+ }
+ ifelse % for III
+ }
+ ifelse % for II
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+\pgfdeclarefunctionalshading[black]{color wheel}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}
+{}
+{ % x y
+ 2 copy abs exch abs add 0.0001 ge
+ {atan 360.0 div} % ... x y heading; heading being in
+ %the interval [0, 1.0]
+ { pop } % silently deal with error: return
+ % arbitrary heading of zero for origin
+ ifelse % because we will use it for 'Hue'
+ 1.0 1.0 % ... H S V
+ % C version to use as model:
+ % H' = H * 6
+ % i = floor(H')
+ % f = H' - i
+ % P = V * (1.0 - S)
+ % Q = V * (1.0 - (S*f))
+ % T = V * (1.0 - (S * (1.0 - f)))
+ 3 2 roll 6.0 mul dup 4 1 roll % H' S V H'
+ floor cvr % H' S V i
+ dup 5 1 roll % i H' S V i
+ 3 index sub neg % i H' S V f
+ 1.0 3 index sub % i H' S V f (1.0 - S )
+ 2 index mul % i H' S V f P
+ 6 1 roll % P i H' S V f
+ dup 3 index mul neg 1.0 add % P i H' S V f ( 1.0 - (f*S))
+ 2 index mul % P i H' S V f Q
+ 7 1 roll % Q P i H' S V f
+ neg 1.0 add % Q P i H' S V (1.0 - f)
+ 2 index mul neg 1.0 add % Q P i H' S V (1.0 - S * (1.0 - f))
+ 1 index mul % Q P i H' S V T
+ 7 2 roll % V T Q P i H' S
+ pop pop % V T Q P i
+ %%%
+ % end of BLOCK B. The rest is just stack manipulation
+ dup 0.5 le % TEST II [ i == 0 ]
+ { % BLOCK C [ take stack to V T P ]
+ pop exch pop
+ }
+ { dup 1.5 le % TEST III [ i == 1 ]
+ { % BLOCK D [ take stack to Q V P ]
+ pop exch 4 1 roll exch pop
+ }
+ { dup 2.5 le % TEST IV [ i == 2 ]
+ { % BLOCK E [ take stack to P V T ]
+ pop 4 1 roll pop
+ }
+ { dup 3.5 le % TEST V [ i == 3 ]
+ { % BLOCK F [ take stack to P Q V ]
+ pop exch 4 2 roll pop
+ }
+ { dup 4.5 le % TEST VI [ i == 4 ]
+ { % BLOCK G [ take stack to T P V ]
+ pop exch pop 3 -1 roll
+ }
+ { % BLOCK H [ take stack to V P Q ]
+ pop 3 1 roll exch pop
+ }
+ ifelse
+ }
+ ifelse % for V
+ }
+ ifelse % for IV
+ }
+ ifelse % for III
+ }
+ ifelse % for II
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+
+%
+% A bilinear interpolation.
+%
+
+\colorlet{lower left}{white}%
+\colorlet{lower right}{white}%
+\colorlet{upper left}{white}%
+\colorlet{upper right}{white}%
+
+\pgfdeclarefunctionalshading[lower left,lower right,upper left,upper right]{bilinear interpolation}
+{\pgfpointorigin}
+{\pgfpoint{100bp}{100bp}}
+{
+ \pgfshadecolortorgb{lower left}{\pgf@lib@shadings@ll}\pgfshadecolortorgb{lower right}{\pgf@lib@shadings@lr}
+ \pgfshadecolortorgb{upper right}{\pgf@lib@shadings@ur}\pgfshadecolortorgb{upper left}{\pgf@lib@shadings@ul}
+}{
+ 25 sub 50 div exch 25 sub 50 div 2 copy % Calculate y/100 x/100.
+% 100 div exch 100 div 2 copy % Calculate y/100 x/100.
+ neg 1 add exch neg 1 add % Calculate 1-y/100 1-x/100.
+ 3 1 roll 2 copy exch 5 2 roll 6 copy 6 copy % Set up stack.
+ \pgf@lib@shadings@llred mul exch \pgf@lib@shadings@lrred mul add mul % Process red component.
+ 4 1 roll
+ \pgf@lib@shadings@urred mul exch \pgf@lib@shadings@ulred mul add mul
+ add
+ 13 1 roll
+ \pgf@lib@shadings@llgreen mul exch \pgf@lib@shadings@lrgreen mul add mul % Process green component.
+ 4 1 roll
+ \pgf@lib@shadings@urgreen mul exch \pgf@lib@shadings@ulgreen mul add mul
+ add
+ 7 1 roll
+ \pgf@lib@shadings@llblue mul exch \pgf@lib@shadings@lrblue mul add mul % Process blue component.
+ 4 1 roll
+ \pgf@lib@shadings@urblue mul exch \pgf@lib@shadings@ulblue mul add mul
+ add
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
+
+
+%
+% A Mandelbrot set shading. Just for fun...
+%
+
+\pgfdeclarefunctionalshading[black]{Mandelbrot set}
+{\pgfpoint{-50bp}{-50bp}}
+{\pgfpoint{50bp}{50bp}}{}
+{
+ 12.5 div exch 12.5 div exch
+ 1 index 1 index
+ % Stack: c_r c_i z_r z_i
+ % Formula: z' = z^2 + c = (z_r + i z_i)^2 + c_r + i c_i
+ % = (z_r^2 - z_i^2 + c_r) + i (2 z_r z_i + c_i)
+ %
+ % First iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Second iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Third iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Fourth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Check for break (to avoid too large numbers)
+ 1 index dup mul 1 index dup mul add
+ 4 lt {
+ % Fifth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Sixth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Seventh iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Check for break (to avoid too large numbers)
+ 1 index dup mul 1 index dup mul add
+ 4 lt {
+ % Eighth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Ninth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ % Tenth iteration
+ % 1. Compute z_r^2 -z_i^2 + c_r
+ 1 index dup mul % z_r^2
+ 1 index dup mul % z_i^2
+ sub % z_r^2 - z_i^2
+ 4 index add % z_r^2 -z_i^2 + c_r
+ % 2. Compute 2 z_r z_i + c_i
+ 3 1 roll
+ mul 2 mul % 2 z_r z_i
+ 2 index add % 2 z_r z_i + c_i
+ } { pop pop 1000.0 1000.0 } ifelse
+ } { pop pop 1000.0 1000.0 } ifelse
+ % Compute distance
+ dup mul exch
+ dup mul
+ add sqrt
+ dup 4 1 roll
+ 2 gt { pop pop 2.0 exch div 1.0 exch sub dup dup} {pop pop pop 0.0 0.0 0.0} ifelse
+ \ifpgfshadingmodelcmyk
+ \pgffuncshadingrgbtocmyk
+ \fi
+ \ifpgfshadingmodelgray
+ \pgffuncshadingrgbtogray
+ \fi
+}%
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.arrows.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.arrows.code.tex
new file mode 100644
index 0000000000..0859687f9d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.arrows.code.tex
@@ -0,0 +1,2361 @@
+% Copyright 2007 by Till Tantau and 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.
+
+\ProvidesFileRCS{pgflibraryshapes.arrows.code.tex}
+
+
+% keys for shape single arrow
+%
+% /pgf/single arrow tip angle
+% /pgf/single arrow head extend
+% /pgf/single arrow head indent
+
+\pgfkeys{/pgf/.cd,
+ single arrow tip angle/.initial=90,
+ single arrow head extend/.initial=.25cm,
+ single arrow head indent/.initial=0cm,
+}%
+
+% Shape single arrow
+%
+%
+\pgfdeclareshape{single arrow}{%
+ \savedmacro\getsinglearrowpoints{%
+ %
+ % Get the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \edef\xoutersep{\the\pgf@x}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\youtersep{\the\pgf@y}%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa.5\wd\pgfnodeparttextbox%
+ \advance\pgf@xa.5\pgflinewidth%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya.5\dp\pgfnodeparttextbox%
+ \advance\pgf@ya.5\pgflinewidth%
+ \ifpgfshapeborderusesincircle%
+ \ifdim\pgf@xa<\pgf@ya%
+ \pgf@xa\pgf@ya%
+ \fi%
+ \pgf@xa1.41421\pgf@xa%
+ \pgf@ya\pgf@xa%
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \ifdim\xoutersep>\youtersep\relax%
+ \let\youtersep\xoutersep%
+ \else%
+ \let\xoutersep\youtersep%
+ \fi%
+ \else%
+ %
+ % Round the rotation.
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \pgfmathmod@{\rotate}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@x\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \pgf@ya\pgf@x%
+ \let\pgfmathresult\xoutersep%
+ \let\xoutersep\youtersep%
+ \let\youtersep\pgfmathresult%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@x\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \pgf@ya\pgf@x%
+ \let\pgfmathresult\xoutersep%
+ \let\xoutersep\youtersep%
+ \let\youtersep\pgfmathresult%
+ \fi%
+ \fi%
+ \fi%
+ \addtosavedmacro\rotate%
+ %
+ % Get some useful trig stuff.
+ %
+ \pgfmathdivide{\pgfkeysvalueof{/pgf/single arrow tip angle}}{2}%
+ \let\halftipangle\pgfmathresult%
+ \pgfmathcosec@{\halftipangle}%
+ \let\cosechalftipangle\pgfmathresult%
+ \pgfmathcos@{\halftipangle}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfutil@tempdima\cosechalftipangle\pgfutil@tempdima%
+ \edef\cothalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \let\sechalftipangle\pgfmathresult%
+ \pgfmathsin@{\halftipangle}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfutil@tempdima\sechalftipangle\pgfutil@tempdima%
+ \edef\tanhalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ %
+ % Get the single arrow head extend, and adjust for minimum width.
+ %
+ \pgf@xb\pgf@ya%
+ \pgf@xb\cothalftipangle\pgf@xb%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/single arrow head extend}}%
+ \pgf@yc\pgf@xc%
+ \advance\pgf@xc\pgf@ya%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@xc<.5\pgfutil@tempdimb%
+ \pgfutil@tempdimb.5\pgfutil@tempdimb%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgfutil@tempdimb}}{\pgfmath@tonumber{\pgf@xc}}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ \pgf@xc\pgfmathresult\pgf@xc%
+ \pgf@yc\pgfmathresult\pgf@yc%
+ \pgf@xb\pgfmathresult\pgf@xb%
+ \fi%
+ %
+ % Now calculate the height of the arrow and adjust for minimum height.
+ %
+ \advance\pgf@xc-\pgf@ya%
+ \pgf@xc\cothalftipangle\pgf@xc%
+ \pgf@xa2.0\pgf@xa%
+ \advance\pgf@xa\pgf@xb%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@xa<\pgfutil@tempdimb%
+ \pgf@xa\pgfutil@tempdimb%
+ \fi%
+ \advance\pgf@xa-\pgf@xb%
+ \pgf@xa.5\pgf@xa%
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/single arrow head indent}}%
+ %
+ % Now:
+ %
+ % xa - .5 * width of the node minus xb.
+ % ya - .5 * height of the node contents.
+ % xb - distance from the end of the node contents to the arrow tip.
+ % xc - distance from the end of the node contents to the back end of the arrow head.
+ % yc - distance from the top of the node contents to the top end of the arrow head.
+ %
+ \pgfsavepgf@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \pgfsavepgf@process\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \pgfsavepgf@process\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ % As the arrow is symmetrical it can be described by only four points:
+ %
+ \pgfsavepgf@process\arrowtip{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x\pgf@xb%
+ \pgf@y0pt\relax%
+ }%
+ \pgfsavepgf@process\beforearrowtip{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x-\pgf@xc%
+ \pgf@y\pgf@ya%
+ \advance\pgf@y\pgf@yc%
+ }%
+ \pgfsavepgf@process\beforearrowhead{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x-\pgf@xc%
+ \advance\pgf@x\pgfutil@tempdima%
+ \pgf@y\pgf@ya%
+ }%
+ \pgfsavepgf@process\afterarrowtail{%
+ \pgf@x-\pgf@xa%
+ \pgf@y\pgf@ya%
+ }%
+ %
+ % Calculate the anchor point at the arrow tip...
+ %
+ \pgfsavepgf@process\arrowtipanchor{%
+ \pgfpointadd{\centerpoint}{\arrowtip}%
+ \pgf@xa\xoutersep\relax%
+ \advance\pgf@x\cosechalftipangle\pgf@xa%
+ }%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \edef\externalradius{\the\pgf@x}%
+ \addtosavedmacro\externalradius%
+ %
+ % ...and the rest of the points.
+ %
+ \pgfmathanglebetweenlines{\beforearrowtip}{\beforearrowhead}{\beforearrowtip}{\arrowtip}%
+ \pgf@xa\xoutersep\relax%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima180pt\relax%
+ \advance\pgfutil@tempdima-\halftipangle pt\relax%
+ %
+ \pgfsavepgf@process\beforearrowtipanchor{%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowtip}}%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ }%
+ \pgfmathanglebetweenpoints{\beforearrowhead}{\beforearrowtip}%
+ \pgfutil@tempdima-\pgfmathresult pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgf@xa\xoutersep\relax%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfsavepgf@process\beforearrowheadanchor{%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowhead}}%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ }%
+ \pgfsavepgf@process\afterarrowtailanchor{%
+ \pgfpointadd{\centerpoint}{\afterarrowtail}%
+ \advance\pgf@x-\xoutersep\relax%
+ \advance\pgf@y\youtersep\relax%
+ }%
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\beforearrowtipanchor}%
+ \let\center@angle@beforearrowtip\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\beforearrowheadanchor}%
+ \let\center@angle@beforearrowhead\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\afterarrowtailanchor}%
+ \let\center@angle@afterarrowtail\pgfmathresult%
+ \addtosavedmacro\center@angle@beforearrowtip%
+ \addtosavedmacro\center@angle@beforearrowhead%
+ \addtosavedmacro\center@angle@afterarrowtail%
+ %
+ \pgfmathanglebetweenpoints{\midpoint}{\beforearrowtipanchor}%
+ \let\mid@angle@beforearrowtip\pgfmathresult%
+ \pgfmathanglebetweenpoints{\midpoint}{\beforearrowheadanchor}%
+ \let\mid@angle@beforearrowhead\pgfmathresult%
+ \pgfmathanglebetweenpoints{\midpoint}{\afterarrowtailanchor}%
+ \let\mid@angle@afterarrowtail\pgfmathresult%
+ \addtosavedmacro\mid@angle@beforearrowtip%
+ \addtosavedmacro\mid@angle@beforearrowhead%
+ \addtosavedmacro\mid@angle@afterarrowtail%
+ %
+ \pgfmathanglebetweenpoints{\basepoint}{\beforearrowtipanchor}%
+ \let\base@angle@beforearrowtip\pgfmathresult%
+ \pgfmathanglebetweenpoints{\basepoint}{\beforearrowheadanchor}%
+ \let\base@angle@beforearrowhead\pgfmathresult%
+ \pgfmathanglebetweenpoints{\basepoint}{\afterarrowtailanchor}%
+ \let\base@angle@afterarrowtail\pgfmathresult%
+ \addtosavedmacro\base@angle@beforearrowtip%
+ \addtosavedmacro\base@angle@beforearrowhead%
+ \addtosavedmacro\base@angle@afterarrowtail%
+ %
+ \addtosavedmacro\arrowtipanchor%
+ \addtosavedmacro\beforearrowtipanchor%
+ \addtosavedmacro\beforearrowheadanchor%
+ \addtosavedmacro\afterarrowtailanchor%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \getsinglearrowpoints%
+ \let\pgf@singlearrow@referencepoint\midpoint%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{mid west}{%
+ \getsinglearrowpoints%
+ \let\pgf@singlearrow@referencepoint\midpoint%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \getsinglearrowpoints%
+ \let\pgf@singlearrow@referencepoint\basepoint%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{base west}{%
+ \getsinglearrowpoints%
+ \let\pgf@singlearrow@referencepoint\basepoint%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north west}{%
+ \getsinglearrowpoints%
+ \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{before head}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{\beforearrowheadanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{before tip}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{\beforearrowtipanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{tip}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{\arrowtipanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{after tip}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{after head}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{before tail}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{after tail}{%
+ \getsinglearrowpoints%
+ \pgfmathrotatepointaround{\afterarrowtailanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{tail}{%
+ \getsinglearrowpoints%
+ \pgfpointlineattime{0.5}{%
+ \pgfmathrotatepointaround{\afterarrowtailanchor}{\centerpoint}{\rotate}%
+ }%
+ {%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ }%
+ \backgroundpath{%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgftransformrotate{\rotate}%
+ \pgfpathmoveto{\arrowtip}%
+ \pgfpathlineto{\beforearrowtip}%
+ \pgfpathlineto{\beforearrowhead}%
+ \pgfpathlineto{\afterarrowtail}%
+ \pgfpathlineto{\afterarrowtail\pgf@y-\pgf@y}%
+ \pgfpathlineto{\beforearrowhead\pgf@y-\pgf@y}%
+ \pgfpathlineto{\beforearrowtip\pgf@y-\pgf@y}%
+ }%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ \pgfsavepgf@process\externalpoint{}%
+ \getsinglearrowpoints%
+ \pgfutil@ifundefined{pgf@singlearrow@referencepoint}{\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@singlearrow@referencepoint}%
+ \pgfsavepgf@process\externalpoint{%
+ \externalpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \referencepoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya}%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ \pgf@x\externalangle pt\relax%
+ \ifx\referencepoint\midpoint%
+ \pgf@xa\mid@angle@beforearrowtip pt\relax%
+ \pgf@xb\mid@angle@beforearrowhead pt\relax%
+ \pgf@xc\mid@angle@afterarrowtail pt\relax%
+ \else%
+ \ifx\referencepoint\basepoint%
+ \pgf@xa\base@angle@beforearrowtip pt\relax%
+ \pgf@xb\base@angle@beforearrowhead pt\relax%
+ \pgf@xc\base@angle@afterarrowtail pt\relax%
+ \else%
+ \pgf@xa\center@angle@beforearrowtip pt\relax%
+ \pgf@xb\center@angle@beforearrowhead pt\relax%
+ \pgf@xc\center@angle@afterarrowtail pt\relax%
+ \fi%
+ \fi%
+ \ifdim\pgf@x<\pgf@xa%
+ \let\firstpoint\arrowtipanchor%
+ \let\secondpoint\beforearrowtipanchor%
+ \else%
+ \ifdim\pgf@x<\pgf@xb%
+ \ifdim\pgf@xb<\pgf@xa%
+ \let\firstpoint\arrowtipanchor%
+ \let\secondpoint\beforearrowtipanchor%
+ \else%
+ \let\firstpoint\beforearrowheadanchor%
+ \let\secondpoint\beforearrowtipanchor%
+ \fi%
+ \else%
+ \ifdim\pgf@x<\pgf@xc%
+ \let\firstpoint\beforearrowheadanchor%
+ \let\secondpoint\afterarrowtailanchor%
+ \else%
+ \pgf@xc-\pgf@xc%
+ \advance\pgf@xc360pt\relax%
+ \ifdim\pgf@x<\pgf@xc%
+ \let\firstpoint\afterarrowtailanchor%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \else%
+ \pgf@xa-\pgf@xa%
+ \advance\pgf@xa360pt\relax%
+ \pgf@xb-\pgf@xb%
+ \advance\pgf@xb360pt\relax%
+ \ifdim\pgf@x<\pgf@xa%
+ \ifdim\pgf@x<\pgf@xb%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \else%
+ \ifdim\pgf@xb<\pgf@xa%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \else%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \fi%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \fi%
+ \else%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}%
+ }%
+ \let\secondpoint\arrowtipanchor%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfmathrotatepointaround{\firstpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfmathrotatepointaround{\secondpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+}%
+
+
+
+
+
+
+
+% keys for shape double arrow
+%
+% /pgf/double arrow tip angle
+% /pgf/double arrow head sep
+
+\pgfkeys{/pgf/.cd,
+ double arrow tip angle/.initial=90,
+ double arrow head extend/.initial=.25cm,
+ double arrow head indent/.initial=0cm,
+}%
+
+% Shape double arrow
+%
+%
+\pgfdeclareshape{double arrow}{%
+ \savedmacro\getdoublearrowpoints{%
+ %
+ % Get the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \edef\xoutersep{\the\pgf@x}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\youtersep{\the\pgf@y}%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa.5\wd\pgfnodeparttextbox%
+ \advance\pgf@xa.5\pgflinewidth%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya.5\dp\pgfnodeparttextbox%
+ \advance\pgf@ya.5\pgflinewidth%
+ \ifpgfshapeborderusesincircle%
+ \ifdim\pgf@xa<\pgf@ya%
+ \pgf@xa\pgf@ya%
+ \fi%
+ \pgf@xa1.41421\pgf@xa%
+ \pgf@ya\pgf@xa%
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \ifdim\xoutersep>\youtersep\relax%
+ \let\youtersep\xoutersep%
+ \else%
+ \let\xoutersep\youtersep%
+ \fi%
+ \else%
+ %
+ % Round the rotation.
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}
+ \pgfmathmod@{\rotate}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@x\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \pgf@ya\pgf@x%
+ \let\pgfmathresult\xoutersep%
+ \let\xoutersep\youtersep%
+ \let\youtersep\pgfmathresult%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@x\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \pgf@ya\pgf@x%
+ \let\pgfmathresult\xoutersep%
+ \let\xoutersep\youtersep%
+ \let\youtersep\pgfmathresult%
+ \fi%
+ \fi%
+ \fi%
+ \addtosavedmacro\rotate%
+ %
+ % Get some useful trig stuff.
+ %
+ \pgfmathdivide{\pgfkeysvalueof{/pgf/double arrow tip angle}}{2}%
+ \let\halftipangle\pgfmathresult%
+ \pgfmathcosec@{\halftipangle}%
+ \let\cosechalftipangle\pgfmathresult%
+ \pgfmathcos@{\halftipangle}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfutil@tempdima\cosechalftipangle\pgfutil@tempdima%
+ \edef\cothalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \let\sechalftipangle\pgfmathresult%
+ \pgfmathsin@{\halftipangle}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfutil@tempdima\sechalftipangle\pgfutil@tempdima%
+ \edef\tanhalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ %
+ % Get the double arrow head extend, and adjust for minimum width.
+ %
+ \pgf@xb\pgf@ya%
+ \pgf@xb\cothalftipangle\pgf@xb%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/double arrow head extend}}%
+ \pgf@yc\pgf@xc%
+ \advance\pgf@xc\pgf@ya%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@xc<.5\pgfutil@tempdimb%
+ \pgfutil@tempdimb.5\pgfutil@tempdimb%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgfutil@tempdimb}}{\pgfmath@tonumber{\pgf@xc}}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ \pgf@xc\pgfmathresult\pgf@xc%
+ \pgf@yc\pgfmathresult\pgf@yc%
+ \pgf@xb\pgfmathresult\pgf@xb%
+ \fi%
+ %
+ % Now calculate the height of the arrow and adjust for minimum height.
+ %
+ \advance\pgf@xc-\pgf@ya%
+ \pgf@xc\cothalftipangle\pgf@xc%
+ \advance\pgf@xa\pgf@xb%
+ \pgf@xa2.0\pgf@xa%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@xa<\pgfutil@tempdimb%
+ \pgf@xa\pgfutil@tempdimb%
+ \fi%
+ \pgf@xa.5\pgf@xa%
+ \advance\pgf@xa-\pgf@xb%
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/double arrow head indent}}%
+ %
+ % Now:
+ %
+ % xa - .5 * width of the node minus xb.
+ % ya - .5 * height of the node contents.
+ % xb - distance from the end of the node contents to the arrow tip.
+ % xc - distance from the end of the node contents to the back end of the arrow head.
+ % yc - distance from the top of the node contents to the top end of the arrow head.
+ %
+ \pgfsavepgf@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \pgfsavepgf@process\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \pgfsavepgf@process\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ % As the arrow is symmetrical it can be described by only 3 points:
+ %
+ \pgfsavepgf@process\arrowtip{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x\pgf@xb%
+ \pgf@y0pt\relax%
+ }%
+ \pgfsavepgf@process\beforearrowtip{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x-\pgf@xc%
+ \pgf@y\pgf@ya%
+ \advance\pgf@y\pgf@yc%
+ }%
+ \pgfsavepgf@process\beforearrowhead{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x-\pgf@xc%
+ \advance\pgf@x\pgfutil@tempdima%
+ \pgf@y\pgf@ya%
+ }%
+ %
+ % Calculate the anchor point at the arrow tip.
+ %
+ \pgfsavepgf@process\arrowtipanchor{%
+ \pgfpointadd{\centerpoint}{\arrowtip}%
+ \pgf@xa\xoutersep\relax%
+ \advance\pgf@x\cosechalftipangle\pgf@xa%
+ }%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \edef\externalradius{\the\pgf@x}%
+ \addtosavedmacro\externalradius%
+ %
+ %
+ \pgfmathanglebetweenlines{\beforearrowtip}{\beforearrowhead}{\beforearrowtip}{\arrowtip}%
+ \pgf@xa\xoutersep\relax%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima180pt\relax%
+ \advance\pgfutil@tempdima-\halftipangle pt\relax%
+ \pgfsavepgf@process\beforearrowtipanchor{%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowtip}}%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ }%
+ \pgfmathanglebetweenpoints{\beforearrowhead}{\beforearrowtip}%
+ \pgfutil@tempdima-\pgfmathresult pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgf@xa\xoutersep\relax%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfsavepgf@process\beforearrowheadanchor{%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowhead}}%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ }%
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\beforearrowtipanchor}%
+ \let\center@angle@beforearrowtip\pgfmathresult%
+ \addtosavedmacro\center@angle@beforearrowtip%
+ %
+ \pgfmathanglebetweenpoints{\midpoint}{\beforearrowtipanchor}%
+ \let\mid@angle@beforearrowtip\pgfmathresult%
+ \addtosavedmacro\mid@angle@beforearrowtip%
+ %
+ \pgfmathanglebetweenpoints{\basepoint}{\beforearrowtipanchor}%
+ \let\base@angle@beforearrowtip\pgfmathresult%
+ \addtosavedmacro\base@angle@beforearrowtip%
+ %
+ \addtosavedmacro\arrowtipanchor%
+ \addtosavedmacro\beforearrowtipanchor%
+ \addtosavedmacro\beforearrowheadanchor%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \getdoublearrowpoints%
+ \let\pgf@singlearrow@referencepoint\midpoint%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{mid west}{%
+ \getdoublearrowpoints%
+ \let\pgf@singlearrow@referencepoint\midpoint%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \getdoublearrowpoints%
+ \let\pgf@singlearrow@referencepoint\basepoint%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{base west}{%
+ \getdoublearrowpoints%
+ \let\pgf@singlearrow@referencepoint\basepoint%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north west}{%
+ \getdoublearrowpoints%
+ \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{before head 1}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{\beforearrowheadanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{before tip 1}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{\beforearrowtipanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{tip 1}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{\arrowtipanchor}{\centerpoint}{\rotate}%
+ }%
+ \anchor{after tip 1}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{after head 1}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{before head 2}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{before tip 2}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{tip 2}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
+ \pgf@x-\pgf@x%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{after tip 2}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@x-\pgf@x%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{after head 2}{%
+ \getdoublearrowpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@x-\pgf@x%
+ }{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \backgroundpath{%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgftransformrotate{\rotate}%
+ \pgfpathmoveto{\arrowtip}%
+ \pgfpathlineto{\beforearrowtip}%
+ \pgfpathlineto{\beforearrowhead}%
+ \pgfpathlineto{\beforearrowhead\pgf@x-\pgf@x}%
+ \pgfpathlineto{\beforearrowtip\pgf@x-\pgf@x}%
+ \pgfpathlineto{\arrowtip\pgf@x-\pgf@x}%
+ \pgfpathlineto{\beforearrowtip\pgf@x-\pgf@x\pgf@y-\pgf@y}%
+ \pgfpathlineto{\beforearrowhead\pgf@x-\pgf@x\pgf@y-\pgf@y}%
+ \pgfpathlineto{\beforearrowhead\pgf@y-\pgf@y}%
+ \pgfpathlineto{\beforearrowtip\pgf@y-\pgf@y}%
+ }%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ \pgfsavepgf@process\externalpoint{}%
+ \getdoublearrowpoints%
+ \pgfutil@ifundefined{pgf@singlearrow@referencepoint}{\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@singlearrow@referencepoint}%
+ \pgfsavepgf@process\externalpoint{%
+ \externalpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \referencepoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya}%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ \pgf@x\externalangle pt\relax%
+ \ifx\referencepoint\midpoint%
+ \pgf@xa\mid@angle@beforearrowtip pt\relax%
+ \else%
+ \ifx\referencepoint\basepoint%
+ \pgf@xa\base@angle@beforearrowtip pt\relax%
+ \else%
+ \pgf@xa\center@angle@beforearrowtip pt\relax%
+ \fi%
+ \fi%
+ \ifdim\pgf@x<180pt\relax%
+ \ifdim\pgf@x<\pgf@xa%
+ \let\firstpoint\arrowtipanchor%
+ \let\secondpoint\beforearrowtipanchor%
+ \else%
+ \pgf@xa-\pgf@xa%
+ \advance\pgf@xa180pt\relax%
+ \ifdim\pgf@x<\pgf@xa%
+ \let\firstpoint\beforearrowheadanchor%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@x-\pgf@x
+ }{\centerpoint}}%
+ \else%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@x-\pgf@x
+ }{\centerpoint}}%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ \fi%
+ \fi%
+ \else%
+ \pgf@xa-\pgf@xa%
+ \advance\pgf@xa360pt\relax%
+ \ifdim\pgf@x<\pgf@xa%
+ \pgf@xa-\pgf@xa%
+ \advance\pgf@xa540pt\relax%
+ \ifdim\pgf@x<\pgf@xa%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
+ \pgf@x-\pgf@x%
+ }{\centerpoint}}%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ \else%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
+ \pgf@y-\pgf@y%
+ }{\centerpoint}}%
+ \fi%
+ \else%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfpointadd{%
+ \pgfpointdiff{\beforearrowtipanchor}{\centerpoint}%
+ \pgf@x-\pgf@x%
+ }{\centerpoint}}%
+ \let\secondpoint\arrowtipanchor%
+ \fi%
+ \fi%
+ \pgfsavepgf@process\firstpoint{%
+ \pgfmathrotatepointaround{\firstpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfsavepgf@process\secondpoint{%
+ \pgfmathrotatepointaround{\secondpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+}%
+
+
+
+
+%
+% Internal macros for the arrow box/shape.
+%
+\def\pgf@lib@arrowbox@parsearrowlength#1#2#3{%
+ \edef\pgf@lib@temp{#3}%
+ \edef\pgf@lib@marshal{%
+ \noexpand\pgfutil@in@{none}{\pgf@lib@temp}%
+ }%
+ \pgf@lib@marshal%
+ \ifpgfutil@in@%
+ #10pt\relax%
+ \else%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter#1\pgf@lib@temp\relax\pgfmath@%
+ %
+ \edef\pgf@lib@marshal{%
+ \noexpand\pgfutil@in@{from center}{\pgf@lib@temp}%
+ }%
+ \pgf@lib@marshal%
+ \ifpgfutil@in@%
+ \else%
+ \ifdim#1>0pt\relax%
+ \advance#1#2\relax%
+ \fi%
+ \fi%
+ \fi}%
+
+\def\pgf@lib@arrowbox@parsearrows#1{%
+ \pgfkeys{/pgf/.cd,%
+ arrow box west arrow=0pt,
+ arrow box east arrow=0pt,
+ arrow box south arrow=0pt,
+ arrow box north arrow=0pt
+ }%
+ \def\pgf@lib@arrowbox@extend{0pt}%
+ \edef\pgf@lib@temp{#1}%
+ \expandafter\pgf@lib@arrowbox@@parsearrows\pgf@lib@temp,\pgf@lib@arrowbox@parsearrows,
+}%
+
+
+\def\pgf@lib@arrowbox@@parsearrows#1,{%
+ \ifx\pgf@lib@arrowbox@parsearrows#1%
+ \let\pgflib@next\relax%
+ \else%
+ \pgfutil@in@:{#1}%
+ \ifpgfutil@in@%
+ \pgf@lib@arrowbox@getextend#1\pgf@lib%
+ \else%
+ \def\pgf@lib@arrowbox@direction{#1}%
+ \fi%
+ \edef\pgf@marshal{%
+ \noexpand\pgfkeys{/pgf/arrow box \pgf@lib@arrowbox@direction\space arrow=\pgf@lib@arrowbox@extend}%
+ }%
+ \pgf@marshal%
+ \let\pgflib@next\pgf@lib@arrowbox@@@parsearrows%
+ \fi%
+ \pgflib@next%
+}%
+\def\pgf@lib@arrowbox@@@parsearrows{%
+ \pgfutil@ifnextchar x{\relax\pgf@lib@arrowbox@@parsearrows}{\relax\pgf@lib@arrowbox@@parsearrows}%
+}%
+
+\def\pgf@lib@arrowbox@getextend#1:#2\pgf@lib{%
+ \def\pgf@lib@arrowbox@direction{#1}%
+ \def\pgf@lib@arrowbox@extend{#2}%
+}%
+
+%
+% /pgf/arrow box north arrow
+% /pgf/arrow box south arrow
+% /pgf/arrow box west arrow
+% /pgf/arrow box east arrow
+% /pgf/arrow box arrows
+% /pgf/arrow box shaft width
+% /pgf/arrow box head extend
+% /pgf/arrow box head indent
+% /pgf/arrow box tip angle
+%
+\pgfkeys{/pgf/.cd,
+ arrow box west arrow/.initial=.5cm,
+ arrow box east arrow/.initial=.5cm,
+ arrow box south arrow/.initial=.5cm,
+ arrow box north arrow/.initial=.5cm,
+ arrow box shaft width/.initial=.125cm,
+ arrow box head extend/.initial=.125cm,
+ arrow box head indent/.initial=0cm,
+ arrow box tip angle/.initial=90,
+}%
+
+%
+% arrow box/Shape.
+%
+\pgfdeclareshape{arrow box}{%
+ \saveddimen\shaftwidth{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box shaft width}}%
+ }%
+ %
+ % Calculate far the arrows extend from the center of the node.
+ %
+ \savedmacro\arrowboxpoints{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ %
+ \edef\halfboxwidth{\the\pgf@x}%
+ \edef\halfboxheight{\the\pgf@y}%
+ \pgfextract@process\arrowboxcorner{}%
+ \addtosavedmacro\arrowboxcorner%
+ %
+ \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxwidth}%
+ {\pgfkeysvalueof{/pgf/arrow box west arrow}}%
+ \edef\westextend{\the\pgf@x}%
+ \addtosavedmacro\westextend%
+ %
+ \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxwidth}%
+ {\pgfkeysvalueof{/pgf/arrow box east arrow}}%
+ \edef\eastextend{\the\pgf@x}%
+ \addtosavedmacro\eastextend%
+ %
+ \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxheight}%
+ {\pgfkeysvalueof{/pgf/arrow box north arrow}}%
+ \edef\northextend{\the\pgf@x}%
+ \addtosavedmacro\northextend%
+ %
+ \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxheight}%
+ {\pgfkeysvalueof{/pgf/arrow box south arrow}}%
+ \edef\southextend{\the\pgf@x}%
+ \addtosavedmacro\southextend%
+ }%
+ \saveddimen\arrowheadextend{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box head extend}}%
+ }%
+ \saveddimen\arrowheadindent{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box head indent}}%
+ }%
+ %
+ % Calculate the `miter' angle for the outer sep at the arrow tip.
+ %
+ \savedmacro\arrowtipmiterangle{%
+ \pgfmathparse{\pgfkeysvalueof{/pgf/arrow box tip angle}}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\arrowtipmiterangle\pgfmathresult%
+ }%
+ %
+ % Calculate the `miter' angle for the outer sep at the point just
+ % before the arrow tip.
+ %
+ \savedmacro\arrowheadangles{%
+ %
+ % Calculate the `miter' angle and its cosecant at the arrow tip...
+ %
+ \pgfmathparse{\pgfkeysvalueof{/pgf/arrow box tip angle}}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\arrowtipmiterangle\pgfmathresult%
+ \addtosavedmacro\arrowtipmiterangle%
+ \pgfmathcosec@{\arrowtipmiterangle}%
+ \let\cosecarrowtipmiterangle\pgfmathresult%
+ \addtosavedmacro\cosecarrowtipmiterangle%
+ %
+ % ...before the arrow head...
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box head extend}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/arrow box head indent}}%
+ \ifdim\pgf@y=0pt\relax%
+ \def\pgfmathresult{90}%
+ \else%
+ \ifdim\pgf@y<0pt\relax%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgfmathatan@{\pgfmathresult}%
+ \pgfmathadd@{\pgfmathresult}{180}%
+ \else%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgfmathatan@{\pgfmathresult}%
+ \fi%
+ \fi%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\beforearrowheadmiterangle\pgfmathresult%
+ \addtosavedmacro\beforearrowheadmiterangle%
+ \pgfmathcosec@{\beforearrowheadmiterangle}%
+ \let\cosecbeforearrowheadmiterangle\pgfmathresult%
+ \addtosavedmacro\cosecbeforearrowheadmiterangle%
+ %
+ % ...and before the arrow tip.
+ %
+ \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima90pt\relax%
+ \pgfutil@tempdimb\beforearrowheadmiterangle pt\relax%
+ \pgfutil@tempdimb2.0\pgfutil@tempdimb%
+ \advance\pgfutil@tempdimb-90pt\relax%
+ \advance\pgfutil@tempdima\pgfutil@tempdimb%
+ \divide\pgfutil@tempdima2\relax%
+ \edef\beforearrowtipmiterangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \addtosavedmacro\beforearrowtipmiterangle%
+ \pgfmathcosec@{\beforearrowtipmiterangle}%
+ \let\cosecbeforearrowtipmiterangle\pgfmathresult%
+ \addtosavedmacro\cosecbeforearrowtipmiterangle%
+ }%
+ \saveddimen\outerxsep{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ }%
+ \saveddimen\outerysep{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer ysep}}%
+ }%
+ %
+ % Calculate the (path) point immediately prior to an arrow tip.
+ %
+ \savedanchor\beforearrowtip{%
+ \pgfmathparse{\pgfkeysvalueof{/pgf/arrow box tip angle}}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfmathcot@{\pgfmathresult}%
+ \let\cothalfangle\pgfmathresult%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/arrow box shaft width}}%
+ \pgf@y.5\pgf@y%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/arrow box head extend}}%
+ \pgf@y\pgf@y%
+ \pgf@x\cothalfangle\pgf@y%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \let\pgf@lib@shapes@arrowbox@referencepoint\midpoint%
+ \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{\eastextend}{0pt}};
+ \else%
+ \arrowboxcorner%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \advance\pgf@x\pgf@xa%
+ \fi%
+ }%
+ \anchor{mid west}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \let\pgf@lib@shapes@arrowbox@referencepoint\midpoint%
+ \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{-\westextend}{0pt}};
+ \else%
+ \arrowboxcorner%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \advance\pgf@x-\pgf@xa%
+ \fi%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \let\pgf@lib@shapes@arrowbox@referencepoint\basepoint%
+ \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{\eastextend}{0pt}};
+ \else%
+ \arrowboxcorner%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \advance\pgf@x\pgf@xa%
+ \fi%
+ }%
+ \anchor{base west}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \let\pgf@lib@shapes@arrowbox@referencepoint\basepoint%
+ \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{-\westextend}{0pt}};
+ \else%
+ \arrowboxcorner%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \advance\pgf@x-\pgf@xa%
+ \fi%
+ }%
+ \anchor{north}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \csname pgf@anchor@arrow box@north arrow tip\endcsname%
+ \else%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner}%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y\pgf@ya%
+ \fi%
+ }%
+ \anchor{south}{%
+ \arrowboxpoints%
+ \ifdim\southextend>0pt\relax%
+ \csname pgf@anchor@arrow box@south arrow tip\endcsname%
+ \else%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@y-\pgf@y}%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y\pgf@ya%
+ \fi%
+ }%
+ \anchor{east}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \csname pgf@anchor@arrow box@east arrow tip\endcsname%
+ \else%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner}%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \pgf@x\pgf@xa%
+ \fi%
+ }%
+ \anchor{west}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \csname pgf@anchor@arrow box@west arrow tip\endcsname%
+ \else%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@x-\pgf@x}%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \pgf@x\pgf@xa%
+ \fi%
+ }%
+ \anchor{north east}{%
+ \arrowboxpoints%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner}%
+ }%
+ \anchor{north west}{%
+ \arrowboxpoints%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@x-\pgf@x}%
+ }%
+ \anchor{south west}{%
+ \arrowboxpoints%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@x-\pgf@x\pgf@y-\pgf@y}%
+ }%
+ \anchor{south east}{%
+ \arrowboxpoints%
+ \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@y-\pgf@y}%
+ }%
+ \anchor{before east arrow}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ \advance\pgf@y\outerysep\relax%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{before east arrow head}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ \advance\pgf@x\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{before east arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ }%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{east arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \centerpoint%
+ \advance\pgf@x\eastextend\relax%
+ \pgf@xa\outerxsep\relax%
+ \pgfmathcosec@{\arrowtipmiterangle}%
+ \advance\pgf@x\pgfmathresult\pgf@xa%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{after east arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ }%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{after east arrow head}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ \advance\pgf@x\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{after east arrow}{%
+ \arrowboxpoints%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ \advance\pgf@y\outerysep\relax%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ %
+ \anchor{before west arrow}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@x-\pgf@x%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ \advance\pgf@y\outerysep\relax%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ \anchor{before west arrow head}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\westextend\relax%
+ \advance\pgf@x\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ \anchor{before west arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\westextend\relax%
+ }%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ \anchor{west arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \centerpoint%
+ \advance\pgf@x-\westextend\relax%
+ \pgf@xa\outerxsep\relax%
+ \pgfmathcosec@{\arrowtipmiterangle}%
+ \advance\pgf@x-\pgfmathresult\pgf@xa%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ \anchor{after west arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\westextend\relax%
+ }%
+ \pgf@x-\pgf@x%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ \anchor{after west arrow head}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\westextend\relax%
+ \advance\pgf@x\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \pgf@x-\pgf@x%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ \anchor{after west arrow}{%
+ \arrowboxpoints%
+ \ifdim\westextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ \advance\pgf@y\outerysep\relax%
+ \pgf@x-\pgf@x%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@west\endcsname%
+ \fi%
+ }%
+ %
+ \anchor{before north arrow}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@x-\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ \advance\pgf@x-\outerxsep\relax%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ \anchor{before north arrow head}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima270pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \advance\pgf@y\arrowheadindent\relax%
+ \pgf@x-\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ \anchor{before north arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-90pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y-\pgf@xa%
+ \advance\pgf@y\northextend\relax%
+ }%
+ \pgf@x-\pgf@x%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ \anchor{north arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \centerpoint%
+ \advance\pgf@y\northextend\relax%
+ \pgf@ya\outerysep\relax%
+ \pgfmathcosec@{\arrowtipmiterangle}%
+ \advance\pgf@y\pgfmathresult\pgf@ya%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ \anchor{after north arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-90pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y-\pgf@xa%
+ \advance\pgf@y\northextend\relax%
+ }%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ \anchor{after north arrow head}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima270pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \advance\pgf@y\arrowheadindent\relax%
+ \pgf@x-\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ \pgf@x-\pgf@x%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ \anchor{after north arrow}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ \advance\pgf@x\outerxsep\relax%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@north\endcsname%
+ \fi%
+ }%
+ %
+ \anchor{before south arrow}{%
+ \arrowboxpoints%
+ \ifdim\southextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ \advance\pgf@x\outerxsep\relax%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@south\endcsname%
+ \fi%
+ }%
+ \anchor{before south arrow head}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima270pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \advance\pgf@y\arrowheadindent\relax%
+ \pgf@x-\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@south\endcsname%
+ \fi%
+ }%
+ \anchor{before south arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-90pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y-\pgf@xa%
+ \advance\pgf@y\northextend\relax%
+ }%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@south\endcsname%
+ \fi%
+ }%
+ \anchor{south arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\southextend>0pt\relax%
+ \centerpoint%
+ \advance\pgf@y-\southextend\relax%
+ \pgf@ya\outerysep\relax%
+ \pgfmathcosec@{\arrowtipmiterangle}%
+ \advance\pgf@y-\pgfmathresult\pgf@ya%
+ \else%
+ \csname pgf@anchor@arrow box@east\endcsname%
+ \fi%
+ }%
+ \anchor{after south arrow tip}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima\arrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
+ \advance\pgfutil@tempdima-90pt\relax%
+ \pgfutil@tempdimb\outerxsep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y-\pgf@xa%
+ \advance\pgf@y\northextend\relax%
+ }%
+ \pgf@x-\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@south\endcsname%
+ \fi%
+ }%
+ \anchor{after south arrow head}{%
+ \arrowboxpoints%
+ \ifdim\northextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointadd{%
+ \arrowheadangles%
+ \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
+ \advance\pgfutil@tempdima270pt\relax%
+ \pgfutil@tempdimb\outerysep\relax%
+ \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \beforearrowtip%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \advance\pgf@y\arrowheadindent\relax%
+ \pgf@x-\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@south\endcsname%
+ \fi%
+ }%
+ \anchor{after south arrow}{%
+ \arrowboxpoints%
+ \ifdim\southextend>0pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \arrowboxcorner%
+ \pgf@x-\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ \advance\pgf@x-\outerxsep\relax%
+ \pgf@y-\pgf@y%
+ }%
+ \else%
+ \csname pgf@anchor@arrow box@south\endcsname%
+ \fi%
+ }%
+ %
+ \backgroundpath{%
+ \arrowboxpoints%
+ \pgfextract@process\arrowboxcorner{%
+ \arrowboxcorner%
+ \pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
+ }%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\arrowboxcorner}%
+ \ifdim\eastextend>0pt\relax%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ \advance\pgf@x\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ }%
+ \pgfpathlineto{%
+ \pgf@x\eastextend\relax%
+ \pgf@y0pt\relax%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ \pgf@y-\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@x-\pgf@x%
+ \advance\pgf@x\eastextend\relax%
+ \advance\pgf@x\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y-.5\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y-.5\pgf@y%
+ }%
+ \fi%
+ \pgfpathlineto{\arrowboxcorner\pgf@y-\pgf@y}%
+ \ifdim\southextend>0pt\relax%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@y\pgf@x%
+ \advance\pgf@y-\southextend\relax%
+ \advance\pgf@y-\arrowheadindent\relax%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@xa\pgf@y%
+ \pgf@y\pgf@x%
+ \advance\pgf@y-\southextend\relax%
+ \pgf@x\pgf@xa%
+ }%
+ \pgfpathlineto{%
+ \pgf@x0pt\relax%
+ \pgf@y-\southextend\relax%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@xa\pgf@y%
+ \pgf@y\pgf@x%
+ \advance\pgf@y-\southextend\relax%
+ \pgf@x-\pgf@xa%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@y\pgf@x%
+ \advance\pgf@y-\southextend\relax%
+ \advance\pgf@y-\arrowheadindent\relax%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x-.5\pgf@x%
+ }%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x-.5\pgf@x%
+ \pgf@y-\pgf@y%
+ }%
+ \fi%
+ \pgfpathlineto{\arrowboxcorner\pgf@x-\pgf@x\pgf@y-\pgf@y}%
+ \ifdim\westextend>0pt\relax%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@x-\pgf@x
+ \pgf@y\shaftwidth\relax%
+ \pgf@y-.5\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \advance\pgf@x-\westextend\relax%
+ \advance\pgf@x-\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y-.5\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \advance\pgf@x-\westextend\relax%
+ \pgf@y-\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \pgf@x-\westextend\relax%
+ \pgf@y0pt\relax%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \advance\pgf@x-\westextend\relax%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \advance\pgf@x-\westextend\relax%
+ \advance\pgf@x-\arrowheadindent\relax%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@x-\pgf@x%
+ \pgf@y\shaftwidth\relax%
+ \pgf@y.5\pgf@y%
+ }%
+ \fi%
+ \pgfpathlineto{\arrowboxcorner\pgf@x-\pgf@x}%
+ \ifdim\northextend>0pt\relax%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x-.5\pgf@x%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \advance\pgf@y\arrowheadindent\relax%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x-.5\pgf@x%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@xa\pgf@y%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \pgf@x-\pgf@xa%
+ }%
+ \pgfpathlineto{%
+ \pgf@x0pt\relax%
+ \pgf@y\northextend\relax%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@xa\pgf@y%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \pgf@x\pgf@xa%
+ }%
+ \pgfpathlineto{%
+ \beforearrowtip%
+ \pgf@y-\pgf@x%
+ \advance\pgf@y\northextend\relax%
+ \advance\pgf@y\arrowheadindent\relax%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ \pgfpathlineto{%
+ \arrowboxcorner%
+ \pgf@x\shaftwidth\relax%
+ \pgf@x.5\pgf@x%
+ }%
+ \fi%
+ \pgfpathclose%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \pgfutil@ifundefined{pgf@lib@shapes@arrowbox@referencepoint}%
+ {\let\referencepoint\centerpoint}{\let\referencepoint\pgf@lib@shapes@arrowbox@referencepoint}%
+ \pgfextract@process\externalpoint{%
+ \pgfpointadd{\referencepoint}{\externalpoint}%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@north\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@north east\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before east arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{east arrow tip}%
+ \def\secondpoint{before east arrow tip}%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before east arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{before east arrow head}%
+ \def\secondpoint{before east arrow}%
+ \else%
+ \def\firstpoint{before east arrow}%
+ \def\secondpoint{north east}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after north arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after north arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{north east}%
+ \def\secondpoint{after north arrow}%
+ \else%
+ \def\firstpoint{after north arrow}%
+ \def\secondpoint{after north arrow head}%
+ \fi%
+ \else%
+ \def\firstpoint{after north arrow tip}%
+ \def\secondpoint{north arrow tip}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before north arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{north arrow tip}%
+ \def\secondpoint{before north arrow tip}%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before north arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{before north head}%
+ \def\secondpoint{before north arrow}%
+ \else%
+ \def\firstpoint{before north arrow}%
+ \def\secondpoint{north west}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after west arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after west arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{north west}%
+ \def\secondpoint{after west arrow}%
+ \else%
+ \def\firstpoint{after west arrow}%
+ \def\secondpoint{after west arrow head}%
+ \fi%
+ \else%
+ \def\firstpoint{after west arrow tip}%
+ \def\secondpoint{west arrow tip}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@south arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@south west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before west arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{west arrow tip}%
+ \def\secondpoint{before west arrow tip}%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before west arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{before west arrow head}%
+ \def\secondpoint{before west arrow}%
+ \else%
+ \def\firstpoint{before west arrow}%
+ \def\secondpoint{south west}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after south arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after south arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{south west}%
+ \def\secondpoint{after south arrow}%
+ \else%
+ \def\firstpoint{after south arrow}%
+ \def\secondpoint{after south arrow head}%
+ \fi%
+ \else%
+ \def\firstpoint{after south arrow tip}%
+ \def\secondpoint{south arrow tip}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@south east\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before south arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{south arrow tip}%
+ \def\secondpoint{before south arrow tip}%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@before south arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{before south arrow head}%
+ \def\secondpoint{before south arrow}%
+ \else%
+ \def\firstpoint{before south arrow}%
+ \def\secondpoint{south east}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after east arrow tip\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}%
+ {\csname pgf@anchor@arrow box@after east arrow\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \def\firstpoint{south east}%
+ \def\secondpoint{after east arrow}%
+ \else%
+ \def\firstpoint{after east arrow}%
+ \def\secondpoint{after east arrow head}%
+ \fi%
+ \else%
+ \def\firstpoint{after east arrow tip}%
+ \def\secondpoint{east arrow tip}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
+ {\csname pgf@anchor@arrow box@\firstpoint\endcsname}%
+ {\csname pgf@anchor@arrow box@\secondpoint\endcsname}%
+ }%
+}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.callouts.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.callouts.code.tex
new file mode 100644
index 0000000000..4cf4b1346b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.callouts.code.tex
@@ -0,0 +1,951 @@
+% Copyright 2007 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.
+
+\usepgflibrary{shapes.symbols}%
+
+% Keys for callouts
+%
+% Common to all callouts:
+% /pgf/callout absolute pointer
+% /pgf/callout relative pointer
+%
+% ellipse callout only:
+% /pgf/callout pointer arc
+%
+% rectangle callout only:
+% /pgf/callout pointer width
+%
+% cloud callout only:
+% /pgf/callout pointer start size
+% /pgf/callout pointer end size
+% /pgf/callout pointer segments
+%
+\newif\ifpgf@lib@callout@absolutepointer
+\pgfkeys{/pgf/.cd,
+ callout pointer arc/.initial=15,
+ callout pointer width/.initial=.25cm,
+ callout pointer start size/.initial=.2 of callout,
+ callout pointer end size/.initial=.1 of callout,
+ callout pointer segments/.initial=2,
+ callout absolute pointer/.code={\pgf@lib@callout@makeabsolutepointer{#1}},
+ callout relative pointer/.code={\pgf@lib@callout@makerelativepointer{#1}},
+ callout pointer shorten/.initial=0cm,
+}%
+
+
+
+\def\pgf@lib@callout@makeabsolutepointer#1{%
+ \pgf@lib@callout@absolutepointertrue%
+ {%
+ \pgftransformshift{#1}%
+ \pgfmultipartnode{coordinate}{center}{pgf@lib@callout@pointer}{}%
+ }%
+}%
+
+\def\pgf@lib@callout@makerelativepointer#1{%
+ \pgf@lib@callout@absolutepointerfalse%
+ \def\pgf@lib@callout@relativepointer{#1}%
+}%
+\pgfkeys{/pgf/callout relative pointer=\pgfpointpolar{300}{.5cm}}%
+
+
+% Shape ellipse callout
+%
+%
+\pgfdeclareshape{ellipse callout}{%
+ \savedmacro\ellipsecalloutpoints{%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x>\pgf@y%
+ \edef\outersep{\the\pgf@x}%
+ \else%
+ \edef\outersep{\the\pgf@y}%
+ \fi%
+ \addtosavedmacro\outersep%
+ %
+ % Calculate the node dimensions...
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@x1.4142136\pgf@x%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \pgf@y1.4142136\pgf@y%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ %
+ % ...without outer sep...
+ %
+ \edef\xpathradius{\the\pgf@x}%
+ \edef\ypathradius{\the\pgf@y}%
+ %
+ % ...and width outer sep.
+ %
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \edef\xradius{\the\pgf@x}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\yradius{\the\pgf@y}%
+ %
+ \addtosavedmacro\xradius%
+ \addtosavedmacro\xpathradius%
+ \addtosavedmacro\yradius%
+ \addtosavedmacro\ypathradius%
+ %
+ \pgfmathsetmacro\pointerarc{\pgfkeysvalueof{/pgf/callout pointer arc}}%
+ \addtosavedmacro\pointerarc%
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ %
+ % Get the relative pointer.
+ %
+ \ifpgf@lib@callout@absolutepointer%
+ \else%
+ \pgfextract@process\calloutpointer{%
+ \pgfextract@process\borderpoint{%
+ \expandafter\pgfpointborderellipse\expandafter{\pgf@lib@callout@relativepointer}{\pgfqpoint{\xpathradius}{\ypathradius}}%
+ }%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
+ \let\pointerangle\pgfmathresult%
+ \expandafter\pgf@process\expandafter{\pgf@lib@callout@relativepointer}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \edef\pointerradius{\pgfmathresult pt}%
+ \pgfpointadd{\borderpoint}{\pgfqpointpolar{\pointerangle}{\pointerradius}}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ \addtosavedmacro\calloutpointer%
+ \pgf@lib@callouts@shortenpointer%
+ \pgf@lib@ellipsecallout@getpoints%
+ \addtosavedmacro\calloutpointeranchor%
+ \addtosavedmacro\beforecalloutangle%
+ \addtosavedmacro\aftercalloutangle%
+ \fi%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \ellipsecalloutpoints%
+ \pgfmathpointintersectionoflineandarc{\midpoint\advance\pgf@x\xradius}{\midpoint}%
+ {\centerpoint}{270}{450}{\xradius and \yradius}%
+ }%
+ \anchor{mid west}{%
+ \ellipsecalloutpoints%
+ \pgfmathpointintersectionoflineandarc{\midpoint\advance\pgf@x-\xradius}{\midpoint}%
+ {\centerpoint}{90}{270}{\xradius and \yradius}%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \ellipsecalloutpoints%
+ \pgfmathpointintersectionoflineandarc{\basepoint\advance\pgf@x\xradius}{\basepoint}%
+ {\centerpoint}{270}{450}{\xradius and \yradius}%
+ }%
+ \anchor{base west}{%
+ \ellipsecalloutpoints%
+ \pgfmathpointintersectionoflineandarc{\basepoint\advance\pgf@x-\xradius}{\basepoint}%
+ {\centerpoint}{90}{270}{\xradius and \yradius}%
+ }%
+ \anchor{north}{%
+ \ellipsecalloutpoints%
+ \centerpoint%
+ \advance\pgf@y\yradius\relax%
+ }%
+ \anchor{south}{%
+ \ellipsecalloutpoints%
+ \centerpoint%
+ \advance\pgf@y-\yradius\relax%
+ }%
+ \anchor{east}{%
+ \ellipsecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x\xradius\relax%
+ }%
+ \anchor{west}{%
+ \ellipsecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x-\xradius\relax%
+ }%
+ \anchor{north west}{%
+ \ellipsecalloutpoints%
+ \pgf@xa\xradius\relax%
+ \pgf@ya\yradius\relax%
+ \centerpoint%
+ \advance\pgf@y0.7071067\pgf@ya%
+ \advance\pgf@x-0.7071067\pgf@xa%
+ }%
+ \anchor{north east}{%
+ \ellipsecalloutpoints%
+ \pgf@xa\xradius\relax%
+ \pgf@ya\yradius\relax%
+ \centerpoint%
+ \advance\pgf@y0.7071067\pgf@ya%
+ \advance\pgf@x0.7071067\pgf@xa%
+ }%
+ \anchor{south west}{%
+ \ellipsecalloutpoints%
+ \pgf@xa\xradius\relax%
+ \pgf@ya\yradius\relax%
+ \centerpoint%
+ \advance\pgf@y-0.7071067\pgf@ya%
+ \advance\pgf@x-0.7071067\pgf@xa%
+ }%
+ \anchor{south east}{%
+ \ellipsecalloutpoints%
+ \pgf@xa\xradius\relax%
+ \pgf@ya\yradius\relax%
+ \centerpoint%
+ \advance\pgf@y-0.7071067\pgf@ya%
+ \advance\pgf@x0.7071067\pgf@xa%
+ }%
+ \anchor{pointer}{%
+ \ellipsecalloutpoints%
+ \calloutpointeranchor%
+ }%
+ \backgroundpath{%
+ \ellipsecalloutpoints%
+ \ifpgf@lib@callout@absolutepointer%
+ \pgfextract@process\calloutpointer{%
+ \pgfpointanchor{pgf@lib@callout@pointer}{center}%
+ }%
+ \pgf@lib@callouts@shortenpointer%
+ \pgf@lib@ellipsecallout@getpoints%
+ \calloutpointeranchor%
+ \ifx\pgf@node@name\pgfutil@empty%
+ \else%
+ \edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@node@name\noexpand\endcsname}%
+ \edef\pgf@sh@@@temp{%
+ \noexpand\def\noexpand\calloutpointeranchor{%
+ \noexpand\pgf@x\the\pgf@x%
+ \noexpand\pgf@y\the\pgf@y%
+ }%
+ }%
+ \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}
+ \fi%
+ \fi%
+ \pgfpathmoveto{\calloutpointer}%
+ \pgfpathlineto{\aftercalloutpointer}%
+ \ifdim\aftercalloutangle pt<\beforecalloutangle pt\relax%
+ \pgfpatharc{\aftercalloutangle}{\beforecalloutangle}{\xpathradius and \ypathradius}%
+ \else%
+ \pgfpatharc{\aftercalloutangle}{360}{\xpathradius and \ypathradius}%
+ \pgfpatharc{0}{\beforecalloutangle}{\xpathradius and \ypathradius}%
+ \fi%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \ellipsecalloutpoints%
+ \pgfpointadd{\pgfpointborderellipse{\externalpoint}{\pgfpoint{\xradius}{\yradius}}%
+ }{\centerpoint}%
+ }%
+}%
+
+% Internal macro for calculating the points for the
+% ellipse callout pointer.
+%
+% The following must be set up:
+%
+% \centerpoint - the center of the ellipse.
+% \calloutpointer - the location of the callout point.
+% \pointerarc - the width of the pointer.
+% \xpathradius - the x radius of the ellipse.
+% \ypathradius - the y radius of the ellipse.
+%
+\def\pgf@lib@ellipsecallout@getpoints{%
+ \pgfextract@process\borderpoint{%
+ \pgfpointborderellipse{%
+ \centerpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \calloutpointer%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@y-\pgf@ya%
+ }{\pgfqpoint{\xpathradius}{\ypathradius}}%
+ }%
+ \pgfmathangleonellipse{\borderpoint}{\xpathradius and \ypathradius}%
+ \pgfutil@tempdima\pointerarc pt\relax%
+ \pgfutil@tempdimb\pgfmathresult pt\relax%
+ \advance\pgfutil@tempdimb-.5\pgfutil@tempdima%
+ \ifdim\pgfutil@tempdimb<0pt\relax%
+ \advance\pgfutil@tempdimb360pt\relax%
+ \fi%
+ \edef\beforecalloutangle{\pgfmath@tonumber{\pgfutil@tempdimb}}%
+ \advance\pgfutil@tempdimb\pgfutil@tempdima%
+ \ifdim\pgfutil@tempdimb<360pt\relax%
+ \else%
+ \advance\pgfutil@tempdimb-360pt\relax%
+ \fi%
+ \edef\aftercalloutangle{\pgfmath@tonumber{\pgfutil@tempdimb}}%
+ %
+ \pgfextract@process\beforecalloutpointer{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{\beforecalloutangle}{\xpathradius and \ypathradius}%
+ }%
+ }%
+ \pgfextract@process\aftercalloutpointer{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{\aftercalloutangle}{\xpathradius and \ypathradius}%
+ }%
+ }%
+ %
+ % Calculate the pointer anchor.
+ %
+ \pgf@lib@callouts@pointeranchor%
+}%
+
+
+% If the callout pointer is very pointed and stroked, the anchor will be
+% miles away from the end of the pointer which will (typically) be
+% bevelled.
+% Using outer sep=0pt is one solution, however, another is provided
+% using this special key:
+%
+% /pgf/callout pointer anchor aspect
+%
+% which takes a value from 0 (ignore any outer sep) to 1 (use
+% the full outer sep).
+
+\pgfkeys{/pgf/callout pointer anchor aspect/.initial=1}%
+
+% Internal macro for calculating the anchor for the callout pointer.
+%
+% Requires the following to be set up (points are anti-clockwise)
+%
+% \beforecalloutpointer - point on the border before the callout pointer
+% \calloutpointer
+% \aftercalloutpointer - point on the border after the callout pointer
+% \outersep - the largest of the outer xsep or ysep.
+%
+\def\pgf@lib@callouts@pointeranchor{%
+ \pgfutil@tempdimb\outersep\relax%
+ %
+ \pgfmathanglebetweenlines{\calloutpointer}{\aftercalloutpointer}{\calloutpointer}{\beforecalloutpointer}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
+ \pgfmathanglebetweenpoints{\calloutpointer}{\aftercalloutpointer}%
+ \advance\pgfutil@tempdima\pgfmathresult pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ %
+ \pgfextract@process\calloutpointeranchor{%
+ \pgfpointadd{%
+ \pgfmathparse{\pgfkeysvalueof{/pgf/callout pointer anchor aspect}}%
+ \pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ }{%
+ \calloutpointer%
+ }%
+ }%
+}%
+
+\def\pgf@lib@callouts@shortenpointer{%
+ \pgfextract@process\calloutpointer{%
+ \pgfmathanglebetweenpoints{\calloutpointer}{\centerpoint}%
+ \let\angle\pgfmathresult%
+ \pgfmathsin@{\angle}%
+ \let\sinpointerangle\pgfmathresult%
+ \pgfmathcos@{\angle}%
+ \let\cospointerangle\pgfmathresult%
+ \pgfpointadd{\calloutpointer}{%
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/callout pointer shorten}}%
+ \pgf@x\cospointerangle\pgfutil@tempdima%
+ \pgf@y\sinpointerangle\pgfutil@tempdima%
+ }%
+ }%
+}%
+
+
+\pgfdeclareshape{rectangle callout}{%
+ \savedmacro\rectanglecalloutpoints{%
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \edef\xtemp{\the\pgf@x}%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \edef\ytemp{\the\pgf@y}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ %
+ \edef\xlength{\the\pgf@x}%
+ \edef\ylength{\the\pgf@y}%
+ \addtosavedmacro\xlength%
+ \addtosavedmacro\ylength%
+ %
+ \pgfmathsetlengthmacro\pointerwidth{\pgfkeysvalueof{/pgf/callout pointer width}}%
+ \addtosavedmacro\pointerwidth%
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ %
+ % Process the relative callout pointer.
+ %
+ \ifpgf@lib@callout@absolutepointer%
+ \else%
+ \pgfextract@process\calloutpointer{%
+ \pgfextract@process\borderpoint{%
+ \expandafter\pgfpointborderrectangle\expandafter{\pgf@lib@callout@relativepointer}%
+ {\pgfqpoint{\xtemp}{\ytemp}}%
+ }%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
+ \let\pointerangle\pgfmathresult%
+ \expandafter\pgf@process\expandafter{\pgf@lib@callout@relativepointer}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \edef\pointerradius{\pgfmathresult pt}%
+ \pgfpointadd{\borderpoint}{\pgfqpointpolar{\pointerangle}{\pointerradius}}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgf@lib@callouts@shortenpointer%
+ \addtosavedmacro\calloutpointer%
+ \pgf@lib@rectanglecallout@pointer%
+ \addtosavedmacro\calloutpointeranchor%
+ \addtosavedmacro\beforecalloutpointer%
+ \addtosavedmacro\aftercalloutpointer%
+ \addtosavedmacro\firstpoint%
+ \addtosavedmacro\secondpoint%
+ \addtosavedmacro\thirdpoint%
+ \addtosavedmacro\fourthpoint%
+ \fi%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5em}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \rectanglecalloutpoints%
+ \midpoint%
+ \advance\pgf@x\xlength\relax%
+ }%
+ \anchor{mid west}{%
+ \rectanglecalloutpoints%
+ \midpoint%
+ \advance\pgf@x-\xlength\relax%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \rectanglecalloutpoints%
+ \basepoint%
+ \advance\pgf@x\xlength\relax%
+ }%
+ \anchor{base west}{%
+ \rectanglecalloutpoints%
+ \basepoint%
+ \advance\pgf@x-\xlength\relax%
+ }%
+ \anchor{north}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@y\ylength\relax%
+ }%
+ \anchor{south}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@y-\ylength\relax%
+ }%
+ \anchor{east}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x\xlength\relax%
+ }%
+ \anchor{west}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x-\xlength\relax%
+ }%
+ \anchor{north east}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x\xlength\relax%
+ \advance\pgf@y\ylength\relax%
+ }%
+ \anchor{south west}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x-\xlength\relax%
+ \advance\pgf@y-\ylength\relax%
+ }%
+ \anchor{south east}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x\xlength\relax%
+ \advance\pgf@y-\ylength\relax%
+ }%
+ \anchor{north west}{%
+ \rectanglecalloutpoints%
+ \centerpoint%
+ \advance\pgf@x-\xlength\relax%
+ \advance\pgf@y\ylength\relax%
+ }%
+ \anchor{pointer}{%
+ \rectanglecalloutpoints%
+ \calloutpointeranchor%
+ }%
+ \backgroundpath{%
+ \rectanglecalloutpoints%
+ \pgf@x\xlength\relax%
+ \pgf@y\ylength\relax%
+ \pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\xtemp{\the\pgf@x}%
+ \edef\ytemp{\the\pgf@y}%
+ %
+ % The absolute pointer must be calculated here because the
+ % anchor of the shape (which is calculated after the saved
+ % macros and points) affects how the pointer joins the
+ % main rectangle.
+ %
+ \ifpgf@lib@callout@absolutepointer%
+ \pgfextract@process\calloutpointer{%
+ \pgfpointanchor{pgf@lib@callout@pointer}{center}%
+ }%
+ \pgf@lib@callouts@shortenpointer%
+ \pgfmathsetlengthmacro\pointerwidth{\pgfkeysvalueof{/pgf/callout pointer width}}%
+ \pgf@lib@rectanglecallout@pointer%
+ %
+ % \pgf@node@name = the shape name (from \pgfmultipartnode)
+ %
+ \ifx\pgf@node@name\pgfutil@empty%
+ \else%
+ %
+ % Now hack an extra saved anchor \calloutpointeranchor,
+ % with the new anchor for the callout pointer.
+ %
+ \edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@node@name\noexpand\endcsname}%
+ \edef\pgf@sh@@@temp{%
+ \noexpand\def\noexpand\calloutpointeranchor{%
+ \noexpand\pgf@x\the\pgf@x%
+ \noexpand\pgf@y\the\pgf@y%
+ }%
+ }%
+ \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}%
+ \fi%
+ \fi%
+ {%
+ \pgfsetcornersarced{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathmoveto{\beforecalloutpointer}%
+ }%
+ \pgfpathlineto{\calloutpointer}%
+ {%
+ \pgfsetcornersarced{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathlineto{\aftercalloutpointer}%
+ }%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathlineto{\firstpoint}%
+ \pgfpathlineto{\secondpoint}%
+ \pgfpathlineto{\thirdpoint}%
+ \pgfpathlineto{\fourthpoint}%
+ {%
+ \pgfsetcornersarced{\pgfqpoint{0pt}{0pt}}%
+ \pgfpathclose%
+ }%
+ }
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \rectanglecalloutpoints%
+ \pgfpointadd{\centerpoint}%
+ {%
+ \pgfpointborderrectangle{\pgfpointadd{\centerpoint}{\externalpoint}}%
+ {\pgfqpoint{\xlength}{\ylength}}%
+ }%
+ }%
+}%
+
+
+
+% \pgf@lib@rectanglecallout@pointer
+%
+% Internal macro for calculations relating to the rectangle callout.
+%
+% Requires the following to be set up:
+%
+% \calloutpointer - the location of the callout point.
+% \xtemp - the half width of the rectangle
+% \ytemp - the half height of the rectangle
+% \pointerwidth - the width of the pointer.
+%
+\def\pgf@lib@rectanglecallout@pointer{%
+ %
+ % Ensure that the pointer never connects to the main shape
+ % too near to a corner. This is done for two reasons:
+ % 1. It can look ugly.
+ % 2. If the corners are rounded, a mess can result.
+ %
+ \pgfextract@process\borderpoint{%
+ \pgfpointborderrectangle{%
+ \centerpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \calloutpointer%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@y-\pgf@ya%
+ }{\pgfqpoint{\xtemp}{\ytemp}}%
+ }%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
+ \let\borderangle\pgfmathresult%
+ %
+ \pgfutil@tempdima\pointerwidth\relax%
+ \pgf@xa\xtemp\relax%
+ \advance\pgf@xa-\pgfutil@tempdima%
+ \pgf@ya\ytemp\relax%
+ \advance\pgf@ya-\pgfutil@tempdima%
+ %
+ \pgf@process{%
+ \pgfutil@ifundefined{pgf@corner@arc}{\pgfpointorigin}{%
+ \expandafter\pgfqpoint\pgf@corner@arc}%
+ }%
+ \advance\pgf@xa-\pgf@x%
+ \advance\pgf@ya-\pgf@y%
+ %
+ \borderpoint%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ %
+ \pgf@xc0pt\relax%
+ \pgf@yc0pt\relax%
+ %
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{\xtemp}{\ytemp}}%
+ \ifdim\borderangle pt<\pgfmathresult pt\relax%
+ \pgf@yc.5\pgfutil@tempdima%
+ \ifdim\pgf@yb>\pgf@ya%
+ \pgf@yb\pgf@ya%
+ \fi%
+ %
+ % Establish the order for drawing the rectangle corners.
+ %
+ \edef\firstpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
+ \edef\secondpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
+ \edef\thirdpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
+ \edef\fourthpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
+ \else%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{-\xtemp}{\ytemp}}%
+ \ifdim\borderangle pt<\pgfmathresult pt\relax%
+ \pgf@xc-.5\pgfutil@tempdima%
+ \ifdim\pgf@xb>\pgf@xa%
+ \pgf@xb\pgf@xa%
+ \else%
+ \ifdim\pgf@xb<-\pgf@xa%
+ \pgf@xb-\pgf@xa%
+ \fi%
+ \fi%
+ \edef\firstpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
+ \edef\secondpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
+ \edef\thirdpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
+ \edef\fourthpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
+ \else%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{-\xtemp}{-\ytemp}}%
+ \ifdim\borderangle pt<\pgfmathresult pt\relax%
+ \pgf@yc-.5\pgfutil@tempdima%
+ \ifdim\pgf@yb>\pgf@ya%
+ \pgf@yb\pgf@ya%
+ \else%
+ \ifdim\pgf@yb<-\pgf@ya%
+ \pgf@yb-\pgf@ya%
+ \fi%
+ \fi%
+ \edef\firstpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
+ \edef\secondpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
+ \edef\thirdpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
+ \edef\fourthpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
+ \else%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfqpoint{\xtemp}{-\ytemp}}%
+ \ifdim\borderangle pt<\pgfmathresult pt\relax%
+ \pgf@xc.5\pgfutil@tempdima%
+ \ifdim\pgf@xb>\pgf@xa%
+ \pgf@xb\pgf@xa%
+ \else%
+ \ifdim\pgf@xb<-\pgf@xa%
+ \pgf@xb-\pgf@xa%
+ \fi%
+ \fi%
+ \edef\firstpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
+ \edef\secondpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
+ \edef\thirdpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
+ \edef\fourthpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
+ \else%
+ \pgf@yc.5\pgfutil@tempdima%
+ \ifdim\pgf@yb<-\pgf@ya%
+ \pgf@yb-\pgf@ya%
+ \fi%
+ \edef\firstpoint{\noexpand\pgfqpoint{\xtemp}{\ytemp}}%
+ \edef\secondpoint{\noexpand\pgfqpoint{-\xtemp}{\ytemp}}%
+ \edef\thirdpoint{\noexpand\pgfqpoint{-\xtemp}{-\ytemp}}%
+ \edef\fourthpoint{\noexpand\pgfqpoint{\xtemp}{-\ytemp}}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfextract@process\beforecalloutpointer{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ \advance\pgf@x-\pgf@xc%
+ \advance\pgf@y-\pgf@yc%
+ }%
+ \pgfextract@process\aftercalloutpointer{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ \advance\pgf@x\pgf@xc%
+ \advance\pgf@y\pgf@yc%
+ }%
+ %
+ % Now calculate the pointer anchor.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x>\pgf@y%
+ \edef\outersep{\the\pgf@x}%
+ \else%
+ \edef\outersep{\the\pgf@y}%
+ \fi%
+ \pgf@lib@callouts@pointeranchor%
+}%
+
+
+% Internal macro for parsing the size of
+% the cloud callout pointer.
+%
+% \pgf@x and \pgf@y should be set up as the
+% width and height of the main shape.
+%
+% \pgf@xa and \pgf@ya are returned appropriately.
+%
+\def\pgf@lib@callout@setpointersize#1{%
+ \edef\pgf@lib@callout@temp{#1}%
+ \edef\pgf@marshall{\noexpand\pgfutil@in@{of callout}{\pgf@lib@callout@temp}}%
+ \pgf@marshall%
+ \ifpgfutil@in@%
+ \expandafter\pgf@xa\expandafter\pgf@lib@callout@setpointerrelativesize%
+ \pgf@lib@callout@temp\pgf@lib@stop\pgf@x%
+ \expandafter\pgf@ya\expandafter\pgf@lib@callout@setpointerrelativesize%
+ \pgf@lib@callout@temp\pgf@lib@stop\pgf@y%
+ \else%
+ \edef\pgf@marshall{\noexpand\pgfutil@in@{and}{\pgf@lib@callout@temp}}%
+ \pgf@marshall%
+ \ifpgfutil@in@%
+ \expandafter\pgf@lib@callout@setpointerbothsizes\pgf@lib@callout@temp\pgf@lib@stop%
+ \else%
+ \pgfmathsetlength\pgf@xa{#1}%
+ \pgfmathsetlength\pgf@ya{#1}%
+ \fi%
+ \fi%
+}%
+\def\pgf@lib@callout@setpointerrelativesize#1of callout#2\pgf@lib@stop{#1}%
+\def\pgf@lib@callout@setpointerbothsizes#1and#2\pgf@lib@stop{%
+ \pgfmathsetlength\pgf@xa{#2}%
+ \pgfmathsetlength\pgf@ya{#2}%
+}%
+
+% Shape: cloud callout.
+%
+\pgfdeclareshape{cloud callout}{%
+ \savedanchor\calloutpointer{%
+ \pgfutil@ifundefined{pgf@sh@s@cloud}{%
+ \pgferror{I cannot find the cloud shape. Please load the `symbol shapes' library}}{}%
+ \pgf@sh@s@cloud%
+ \pgf@sh@savedmacros%
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \ifpgf@lib@callout@absolutepointer%
+ \else%
+ \pgfextract@process\calloutpointer{%
+ \pgfextract@process\borderpoint{%
+ \expandafter\pgfpointborderellipse\expandafter{\pgf@lib@callout@relativepointer}%
+ {\pgfqpoint{\xouterradius}{\youterradius}}%
+ }%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\borderpoint}%
+ \let\pointerangle\pgfmathresult%
+ \expandafter\pgf@process\expandafter{\pgf@lib@callout@relativepointer}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \edef\pointerradius{\pgfmathresult pt}%
+ \pgfpointadd{\borderpoint}{\pgfqpointpolar{\pointerangle}{\pointerradius}}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgf@lib@callouts@shortenpointer%
+ \fi%
+ }%
+ \anchor{pointer}{%
+ \calloutpointer%
+ }%
+ \inheritsavedanchors[from=cloud]%
+ \inheritanchor[from=cloud]{center}%
+ \inheritanchor[from=cloud]{base}%
+ \inheritanchor[from=cloud]{mid}%
+ \inheritanchor[from=cloud]{north}%
+ \inheritanchor[from=cloud]{south}%
+ \inheritanchor[from=cloud]{east}%
+ \inheritanchor[from=cloud]{west}%
+ \inheritanchor[from=cloud]{north east}%
+ \inheritanchor[from=cloud]{south west}%
+ \inheritanchor[from=cloud]{south east}%
+ \inheritanchor[from=cloud]{north west}%
+ \inheritanchorborder[from=cloud]%
+ \backgroundpath{%
+ \pgf@sh@bg@cloud%
+ \ifpgf@lib@callout@absolutepointer%
+ \pgfextract@process\calloutpointer{%
+ \pgfpointanchor{pgf@lib@callout@pointer}{center}%
+ }%
+ \ifx\pgf@node@name\pgfutil@empty%
+ \else%
+ \edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@node@name\noexpand\endcsname}%
+ \edef\pgf@sh@@@temp{%
+ \noexpand\def\noexpand\calloutpointeranchor{%
+ \noexpand\pgf@x\the\pgf@x%
+ \noexpand\pgf@y\the\pgf@y%
+ }%
+ }%
+ \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}
+ \fi%
+ \fi%
+ %
+ \pgfextract@process\borderpoint{%
+ \pgfpointadd{%
+ \pgfpointborderellipse{\pgfpointdiff{\centerpoint}{\calloutpointer}}%
+ {\pgfqpoint{\xouterradius}{\youterradius}}%
+ }{\centerpoint}%
+ }%
+ \pgf@lib@callouts@shortenpointer%
+ \pgfmathanglebetweenpoints{\calloutpointer}{\centerpoint}%
+ \let\angle\pgfmathresult%
+ \pgfmathsin@{\angle}%
+ \let\sinpointerangle\pgfmathresult%
+ \pgfmathcos@{\angle}%
+ \let\cospointerangle\pgfmathresult%
+ %
+ \pgf@x\xouterradius\relax%
+ \pgf@x2.0\pgf@x%
+ \pgf@y\yinnerradius\relax%
+ \pgf@y2.0\pgf@y%
+ \pgf@lib@callout@setpointersize{\pgfkeysvalueof{/pgf/callout pointer start size}}%
+ \pgf@xb\pgf@xa%
+ \pgf@yb\pgf@ya%
+ \pgf@lib@callout@setpointersize{\pgfkeysvalueof{/pgf/callout pointer end size}}%
+ \advance\pgf@xb-\pgf@xa%
+ \advance\pgf@yb-\pgf@ya%
+ %
+ \pgfmathsetcount\c@pgf@counta{\pgfkeysvalueof{/pgf/callout pointer segments}}%
+ \divide\pgf@xb\c@pgf@counta%
+ \divide\pgf@yb\c@pgf@counta%
+ %
+ \pgf@process{\pgfpointdiff{\borderpoint}{\calloutpointer}}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ %
+ \pgfutil@tempdimb0pt\relax%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\c@pgf@counta%
+ \else%
+ {%
+ \pgf@xa.5\pgf@xa%
+ \pgf@ya.5\pgf@ya%
+ \edef\tempxradius{\the\pgf@xa}%
+ \edef\tempyradius{\the\pgf@ya}%
+ \pgfpathellipse%
+ {%
+ \calloutpointer%
+ \advance\pgf@x\cospointerangle\pgfutil@tempdimb%
+ \advance\pgf@y\sinpointerangle\pgfutil@tempdimb%
+ }%
+ {\pgfqpoint{\tempxradius}{0pt}}{\pgfqpoint{0pt}{\tempyradius}}%
+ }%
+ \advance\pgf@xa\pgf@xb%
+ \advance\pgf@ya\pgf@yb%
+ \advance\pgfutil@tempdimb\pgfutil@tempdima%
+ \repeatpgfmathloop%
+ }%
+ %
+ % Hack the puff anchors for the callout.
+ %
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@cloud callout\endcsname{%
+ \c@pgf@counta\puffs\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \pgfutil@ifundefined{pgf@anchor@cloud callout@puff\space\the\c@pgf@counta}{%
+ \expandafter\xdef\csname pgf@anchor@cloud callout@puff\space\the\c@pgf@counta\endcsname{%
+ \noexpand\pgf@sh@@cloudpuffanchor{\the\c@pgf@counta}%
+ }%
+ }{\c@pgf@counta0\relax}%
+ \advance\c@pgf@counta-1\relax%
+ \repeatpgfmathloop%
+ }%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.code.tex
new file mode 100644
index 0000000000..ee41b301ab
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.code.tex
@@ -0,0 +1,21 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryshapes.code.tex}
+
+% Only the following are loaded by default and only for historical
+% reasons.
+
+\usepgflibrary{shapes.geometric}%
+\usepgflibrary{shapes.misc}%
+\usepgflibrary{shapes.symbols}%
+
+% Further libraries should be included directly
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.gates.ee.IEC.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.gates.ee.IEC.code.tex
new file mode 100644
index 0000000000..62b1a26029
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.gates.ee.IEC.code.tex
@@ -0,0 +1,679 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+
+%
+% Resistor shape based on a zig-zag-line
+%
+
+\pgfdeclareshape{var resistor IEC}
+{%
+ \inheritsavedanchors[from=rectangle ee]%
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % Middle line
+ \pgf@yc=.5\pgf@ya
+ \advance\pgf@yc by.5\pgf@yb
+ % Height
+ \pgf@xc=-.5\pgf@ya
+ \advance\pgf@xc by.5\pgf@yb
+ % Start point
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yc}}
+ % Lines
+ \advance\pgf@xb by.1pt%
+ \pgfutil@loop%
+ \advance\pgf@xa by4\pgf@xc\relax%
+ \ifdim\pgf@xa<\pgf@xb%
+ \advance\pgf@xa by-3\pgf@xc%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
+ \advance\pgf@xa by2\pgf@xc%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \advance\pgf@xa by\pgf@xc%
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yc}}%
+ \pgfutil@repeat%
+ \advance\pgf@xb by-.1pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}%
+ }%
+}%
+
+
+
+%
+% Inductor shape based on a bumpy line
+%
+
+\pgfdeclareshape{inductor IEC}
+{%
+ \savedanchor\northeast{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by .5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by\pgf@yb%
+ }%
+ \savedanchor\southwest{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=-\pgf@xa%
+ \advance\pgf@x by -.5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgf@y=-\pgf@ya%
+ }%
+
+ \anchor{center}{\pgfpointorigin}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+
+ \anchorborder{%
+ \ifdim\pgf@y<0pt%
+ % tricky... simpilfy to the origin...
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\southwest}%
+ \advance\pgf@y by-0.5pt%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
+ \else%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
+ \fi%
+ }%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xa=-\pgf@x \pgf@ya=0pt
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % Height
+ \pgf@xc=\pgf@yb%
+ % Start point
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
+ % Lines
+ \advance\pgf@xb by.1pt%
+ \pgfutil@loop%
+ \advance\pgf@xa by2\pgf@xc\relax%
+ \ifdim\pgf@xa<\pgf@xb%
+ \pgfpatharc{180}{0}{\pgf@xc}%
+ \pgfutil@repeat%
+ \advance\pgf@xb by-.1pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{0pt}}%
+ }%
+}%
+
+
+
+
+%
+% Simple capacitor, consisting of two parallel lines
+%
+
+\pgfdeclareshape{capacitor IEC}
+{%
+ \inheritsavedanchors[from=rectangle ee]%
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }%
+}%
+
+
+
+
+%
+% Simple ground, consisting of three lines, getting smaller
+%
+
+\pgfdeclareshape{ground IEC}
+{%
+ \inheritsavedanchors[from=rectangle ee]%
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % First line, simple
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ % Advance to middle
+ \pgfmathsetlength\pgf@xa{.5\pgf@xa+.5\pgf@xb}
+ % Make smaller
+ \pgfmathsetlength\pgf@yc{.16666\pgf@yb-.16666\pgf@ya}
+ \advance\pgf@ya by\pgf@yc
+ \advance\pgf@yb by-\pgf@yc
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ % Make even smaller
+ \advance\pgf@ya by\pgf@yc
+ \advance\pgf@yb by-\pgf@yc
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }%
+}%
+
+
+
+%
+% Battery, consisting of two parallel lines, one smaller than
+% the other
+%
+
+\pgfdeclareshape{battery IEC}
+{%
+ \inheritsavedanchors[from=rectangle ee]%
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % First line, simple
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ % Make smaller
+ \pgfmathsetlength\pgf@yc{.25\pgf@yb-.25\pgf@ya}
+ \advance\pgf@ya by\pgf@yc
+ \advance\pgf@yb by-\pgf@yc
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }%
+}%
+
+
+%
+% Special diodes
+%
+
+
+\pgfdeclareshape{breakdown diode IEC}
+{%
+ \inheritsavedanchors[from=rectangle ee]%
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgf@xc=.5\pgf@xa \advance\pgf@xc by.5\pgf@xb
+ \pgf@yc=.5\pgf@ya
+ \advance\pgf@yc by .5\pgf@yb
+ % Triangles:
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@yc}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@yc}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ \pgfpathclose
+ }%
+
+
+ \beforebackgroundpath{
+ {
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgf@yc=.5\pgf@ya
+ \advance\pgf@yc by.5\pgf@yb
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yc}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}
+ \pgfusepathqstroke
+ \pgf@xc=.5\pgf@xa
+ \advance\pgf@xc by.5\pgf@xb
+ \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}
+ \pgf@yc=.5\pgf@yb
+ \advance\pgf@yc by-.5\pgf@ya
+ \pgftransformscale{\pgf@sys@tonumber{\pgf@yc}}
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfpathlineto{\pgfqpoint{.5pt}{1pt}}
+ \pgfusepathqstroke
+ }
+ }%
+}%
+
+
+
+
+
+
+% Generic shapes
+%
+% When these shapes are used, you can set a key derived form the
+% shapes name to some code that will be executed as the before
+% background path. This means that the basic shape is fixed, but
+% things like a special line inside the shape or at the border can be
+% added without having to define a whole new shape.
+
+
+\pgfdeclareshape{generic circle IEC}
+{%
+ % This shape is a generic circle, to which you can add something to
+ % the before background path using the key
+ % /pgf/generic circle IEC/before background
+ % When this key is invoked, the transformation matrix will have been
+ % setup such that the circle's center is at the origin and that the
+ % position \pgfpoint{1pt}{0pt} lies exactly on the top of the circle
+ % (and, there, on the middle of the line).
+
+ \inheritsavedanchors[from=circle ee]%
+ \inheritanchorborder[from=circle ee]%
+ \inheritanchor[from=circle ee]{north}%
+ \inheritanchor[from=circle ee]{north west}%
+ \inheritanchor[from=circle ee]{north east}%
+ \inheritanchor[from=circle ee]{center}%
+ \inheritanchor[from=circle ee]{west}%
+ \inheritanchor[from=circle ee]{east}%
+ \inheritanchor[from=circle ee]{south}%
+ \inheritanchor[from=circle ee]{south west}%
+ \inheritanchor[from=circle ee]{south east}%
+ \inheritanchor[from=circle ee]{input}%
+ \inheritanchor[from=circle ee]{output}%
+ \inheritbackgroundpath[from=circle ee]%
+
+ \beforebackgroundpath{
+ {
+ \centerpoint%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgftransformshift{}
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgftransformscale{\pgf@sys@tonumber{\pgfutil@tempdima}}
+ \pgfkeysvalueof{/pgf/generic circle IEC/before background}
+ }
+ }%
+}%
+
+
+
+%
+% Generic diode, based on a rectangle
+%
+
+\pgfdeclareshape{generic diode IEC}
+{%
+ % This shape is a generic diode, to which you can add something to
+ % the before background path using the key
+ % /pgf/generic diode IEC/before background
+ % When this key is invoked, the transformation matrix will have been
+ % setup such that the center is at the tip of the diode. The
+ % position \pgfpoint{1pt}{0pt} lies exactly on the top of the
+ % (suggested) line before the diode.
+
+ \inheritsavedanchors[from=rectangle ee]%
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % Move tip back a little bit
+ \advance\pgf@xb by-.5\pgflinewidth
+ % Triangle triangle:
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgf@yc=.5\pgf@ya
+ \advance\pgf@yc by .5\pgf@yb
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}
+ \pgfpathclose
+ }%
+
+
+ \beforebackgroundpath{
+ {
+ \pgf@process{\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgf@yc=.5\pgf@ya
+ \advance\pgf@yc by.5\pgf@yb
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yc}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yc}}
+ \pgfusepathqstroke
+ \pgftransformshift{\pgfqpoint{\pgf@xb}{\pgf@yc}}
+ \pgf@yc=.5\pgf@yb
+ \advance\pgf@yc by-.5\pgf@ya
+ \pgftransformscale{\pgf@sys@tonumber{\pgf@yc}}
+ \pgfkeysvalueof{/pgf/generic diode IEC/before background}
+ }
+ }%
+}%
+
+
+\pgfkeys{
+ /pgf/generic circle IEC/before background/.initial=,
+ /pgf/generic diode IEC/before background/.initial=,
+}%
+
+
+
+
+
+%
+% Contacts
+%
+
+\pgfdeclareshape{make contact IEC}
+{%
+ \savedanchor\northeast{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by .5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by\pgf@yb%
+ }%
+ \savedanchor\southwest{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=-.5\pgf@xa%
+ \advance\pgf@x by -.5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgf@y=-\pgf@ya%
+ }%
+
+ \anchor{center}{\pgfpointorigin}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+
+ \anchorborder{%
+ \ifdim\pgf@y<0pt%
+ % tricky... simplify to the origin...
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\southwest}%
+ \advance\pgf@y by-0.5pt%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
+ \else%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
+ \fi%
+ }%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xa=-\pgf@x \pgf@ya=0pt
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % Start point
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }%
+}%
+
+
+
+%
+% Contacts
+%
+
+\pgfdeclareshape{var make contact IEC}
+{%
+ \savedanchor\northeast{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by .5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by\pgf@yb%
+ }%
+ \savedanchor\southwest{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=-.5\pgf@xa%
+ \advance\pgf@x by -.5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgf@y=-\pgf@ya%
+ \pgf@xc=0.083333\pgf@x%
+ \advance\pgf@y by\pgf@xc%
+ }%
+
+ \anchor{center}{\pgfpointorigin}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+
+ \anchorborder{%
+ \ifdim\pgf@y<0pt%
+ % tricky... simplify to the origin...
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\southwest}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
+ \else%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
+ \fi%
+ }%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\northeast}{
+ \pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xa=-\pgf@x \pgf@ya=0pt
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgf@xc=\pgf@xa
+ \pgfutil@tempdima=2\pgf@xb%
+ \pgfutil@tempdima=0.083333\pgfutil@tempdima%
+ \advance\pgf@xa by \pgfutil@tempdima
+ % Circle
+ {\pgfpathcircle{\pgfqpoint{\pgf@xa}{0pt}}{\pgfutil@tempdima}}
+ % Height
+ % Start point
+ \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgfqpoint{\pgf@xa}{0pt}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}}}
+ \pgf@xc=\pgf@x
+ \pgf@yc=\pgf@y
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xa}{0pt}}{%
+ \pgfpointscale{\pgfutil@tempdima}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }%
+}%
+
+
+
+\pgfdeclareshape{break contact IEC}
+{%
+ \savedanchor\northeast{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by .5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by\pgf@yb%
+ }%
+ \savedanchor\southwest{%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x=-.5\pgf@xa%
+ \advance\pgf@x by -.5\pgf@xb%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgf@y=-\pgf@ya%
+ }%
+
+ \anchor{center}{\pgfpointorigin}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+
+ \anchorborder{%
+ \ifdim\pgf@y<0pt%
+ % tricky... simplify to the origin...
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\southwest}%
+ \advance\pgf@y by-0.5pt%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\pgfqpoint{-\pgf@xa}{-\pgf@ya}}}%
+ \else%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{\pgfpointborderrectangle{\pgfqpoint{\pgf@xc}{\the\pgf@yc}}{\northeast}}%
+ \fi%
+ }%
+
+ \backgroundpath{
+ \pgf@process{\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ \pgf@xa=-\pgf@x \pgf@ya=0pt
+ \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ % Start point
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ % Break point
+ \pgf@xc=.2\pgf@xb
+ \advance\pgf@xc by-.2\pgf@xa
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{0pt}}
+ \advance\pgf@xb by-\pgf@xc
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }%
+}%
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.gates.ee.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.gates.ee.code.tex
new file mode 100644
index 0000000000..4cfa4eed7d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.gates.ee.code.tex
@@ -0,0 +1,170 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+
+
+%
+% Base shapes
+%
+% These shapes are identical to the shapes without "ee", only an "input"
+% and an "output" anchor have been added at the left and right end.
+
+\pgfdeclareshape{rectangle ee}
+{%
+ \inheritsavedanchors[from=rectangle]%
+ \inheritanchorborder[from=rectangle]%
+ \inheritanchor[from=rectangle]{north}%
+ \inheritanchor[from=rectangle]{north west}%
+ \inheritanchor[from=rectangle]{north east}%
+ \inheritanchor[from=rectangle]{center}%
+ \inheritanchor[from=rectangle]{west}%
+ \inheritanchor[from=rectangle]{east}%
+ \inheritanchor[from=rectangle]{mid}%
+ \inheritanchor[from=rectangle]{mid west}%
+ \inheritanchor[from=rectangle]{mid east}%
+ \inheritanchor[from=rectangle]{base}%
+ \inheritanchor[from=rectangle]{base west}%
+ \inheritanchor[from=rectangle]{base east}%
+ \inheritanchor[from=rectangle]{south}%
+ \inheritanchor[from=rectangle]{south west}%
+ \inheritanchor[from=rectangle]{south east}%
+ \inheritbackgroundpath[from=rectangle]%
+ % New:
+ \anchor{input}{
+ \pgf@process{\northeast}%
+ \pgf@ya=.5\pgf@y%
+ \pgf@process{\southwest}%
+ \pgf@y=.5\pgf@y%
+ \advance\pgf@y by \pgf@ya%
+ }%
+ \anchor{output}{%
+ \pgf@process{\southwest}%
+ \pgf@ya=.5\pgf@y%
+ \pgf@process{\northeast}%
+ \pgf@y=.5\pgf@y%
+ \advance\pgf@y by \pgf@ya%
+ }%
+}%
+
+\pgfdeclareshape{circle ee}
+{%
+ \inheritsavedanchors[from=circle]%
+ \inheritanchorborder[from=circle]%
+ \inheritanchor[from=circle]{north}%
+ \inheritanchor[from=circle]{north west}%
+ \inheritanchor[from=circle]{north east}%
+ \inheritanchor[from=circle]{center}%
+ \inheritanchor[from=circle]{west}%
+ \inheritanchor[from=circle]{east}%
+ \inheritanchor[from=circle]{mid}%
+ \inheritanchor[from=circle]{mid west}%
+ \inheritanchor[from=circle]{mid east}%
+ \inheritanchor[from=circle]{base}%
+ \inheritanchor[from=circle]{base west}%
+ \inheritanchor[from=circle]{base east}%
+ \inheritanchor[from=circle]{south}%
+ \inheritanchor[from=circle]{south west}%
+ \inheritanchor[from=circle]{south east}%
+ \inheritbackgroundpath[from=circle]%
+ % New:
+ \anchor{input}{\centerpoint\advance\pgf@x by-\radius}%
+ \anchor{output}{\centerpoint\advance\pgf@x by\radius}%
+}%
+
+
+
+%
+% Current direction indicator. This shape uses the current setting of
+% the current direction arrow tip for the arrow. The shape is a
+% rectangle around the arrow tip.
+%
+
+\pgfdeclareshape{direction ee}
+{%
+ \savedanchor\northeast{
+ \pgf@x=0pt%
+ % Height is given by minimum height/2
+ \pgfmathsetlength{\pgf@y}{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y=.5\pgf@y
+ }%
+ \savedanchor\southwest{
+ % Left border is given by left extend
+ \pgfarrowtotallength{\pgfkeysvalueof{/pgf/direction ee arrow}}%
+ \pgf@x=-\pgf@x%
+ % Height is given by minimum height/2
+ \pgfmathsetlength{\pgf@y}{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y=-.5\pgf@y
+ }%
+
+ \inheritanchor[from=rectangle ee]{center}%
+ \inheritanchor[from=rectangle ee]{north}%
+ \inheritanchor[from=rectangle ee]{south}%
+ \inheritanchor[from=rectangle ee]{east}%
+ \inheritanchor[from=rectangle ee]{west}%
+ \inheritanchor[from=rectangle ee]{north east}%
+ \inheritanchor[from=rectangle ee]{north west}%
+ \inheritanchor[from=rectangle ee]{south east}%
+ \inheritanchor[from=rectangle ee]{south west}%
+ \inheritanchor[from=rectangle ee]{input}%
+ \inheritanchor[from=rectangle ee]{output}%
+ \inheritanchorborder[from=rectangle ee]%
+ \nodeparts{}% no text
+
+ \behindbackgroundpath{
+ \pgf@process{\southwest}
+ \pgf@xa=\pgf@x
+ \pgf@process{\northeast}
+ \pgf@xb=\pgf@x
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{0pt}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{0pt}}
+ \pgfusepathqstroke
+ }%
+
+ \beforebackgroundpath{
+ {
+ \pgfsys@beginscope
+ \pgfarrowdraw{\pgfkeysvalueof{/pgf/direction ee arrow}}%
+ \pgfsys@endscope
+ }
+ }%
+}%
+
+\pgfkeys{
+ /pgf/direction ee arrow/.initial=direction ee,
+}%
+
+
+
+% Special arrow for ee directions:
+
+\pgfarrowsdeclare{direction ee}{direction ee}
+{%
+ \pgfmathsetlength\pgfutil@tempdima{\pgfgetarrowoptions{direction ee}}%
+ \pgfutil@tempdima=.5\pgfutil@tempdima
+ \pgfarrowsleftextend{+-\pgfutil@tempdima}
+ \pgfarrowsrightextend{+\pgfutil@tempdima}
+}
+{
+ \pgfmathsetlength\pgfutil@tempdima{\pgfgetarrowoptions{direction ee}}%
+ \pgfsetdash{}{+0pt}
+ \pgfsetroundjoin
+ \pgfpathmoveto{\pgfqpoint{-0.5\pgfutil@tempdima}{0.38268343237\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{0.5\pgfutil@tempdima}{0\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfqpoint{-0.5\pgfutil@tempdima}{-0.38268343237\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepathqfillstroke
+}%
+
+\pgfsetarrowoptions{direction ee}{4pt}%
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.IEC.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.IEC.code.tex
new file mode 100644
index 0000000000..9b964996d7
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.IEC.code.tex
@@ -0,0 +1,733 @@
+% Copyright 2008 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.
+
+\usepgflibrary{shapes.gates.logic}%
+
+\pgfkeys{/pgf/.cd,
+ and gate IEC symbol/.initial=$\char`\&$,
+ nand gate IEC symbol/.initial=$\char`\&$,
+ or gate IEC symbol/.initial=$\geq1$,
+ nor gate IEC symbol/.initial=$\geq1$,
+ xor gate IEC symbol/.initial={$=1$},
+ xnor gate IEC symbol/.initial={$=1$},
+ not gate IEC symbol/.initial=1,
+ buffer gate IEC symbol/.initial=1,
+ logic gate IEC symbol align/.initial=top,
+ logic gate IEC symbol color/.initial=% no value
+}%
+
+\pgfkeys{/pgf/logic gate IEC symbol align/.cd,
+ top/.code=\pgftransformyshift{\innerhalfheight},
+ bottom/.code=\pgftransformyshift{-\innerhalfheight},
+ left/.code=\pgftransformxshift{-\innerhalfwidth},
+ right/.code=\pgftransformxshift{\innerhalfwidth},
+}%
+
+\def\pgf@lib@sh@logicgates@IEC@foregroundpath#1{%
+ \dimensions%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \edef\pgf@lib@sh@temp{\pgfkeysvalueof{/pgf/logic gate IEC symbol align}}%
+ \edef\pgf@lib@sh@@temp{/pgf/logic gate IEC symbol align/.cd, \pgf@lib@sh@temp}%
+ \expandafter\pgfkeys\expandafter{\pgf@lib@sh@@temp}%
+ \expandafter\pgftext\expandafter[\pgf@lib@sh@temp]{%
+ \pgfkeysgetvalue{/pgf/logic gate IEC symbol color}{\pgf@lib@sh@temp}%
+ \ifx\pgf@lib@sh@temp\pgfutil@empty%
+ \else%
+ \expandafter\color\expandafter{\pgf@lib@sh@temp}%
+ \fi%
+ \pgfkeysvalueof{/pgf/#1 gate IEC symbol}%
+ }%
+ }%
+}%
+
+
+\def\pgf@lib@sh@logicgates@dimensions@IEC#1{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ % Adjust for the width of the gate symbol.
+ %
+ \setbox\pgf@hbox\hbox{{\pgfkeysvalueof{/pgf/#1 gate IEC symbol}}}% add braces as color-aftergroup-fix TT
+ \pgf@xa.5\wd\pgf@hbox%
+ \pgf@ya.5\ht\pgf@hbox%
+ \advance\pgf@ya.5\dp\pgf@hbox%
+ \ifdim\pgf@x<\pgf@xa%
+ \pgf@x\pgf@xa%
+ \fi%
+ \ifdim\pgf@y<\pgf@ya%
+ \pgf@y\pgf@ya%
+ \fi%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ %
+ % Adjust for minimum height and width.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ %
+ % Adjust the height for the number of inputs.
+ %
+ \c@pgf@counta\pgf@lib@sh@logicgate@numinputs%
+ \advance\c@pgf@counta1\relax%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \pgf@yb2.0\pgf@yb%
+ \advance\pgf@yb\pgflinewidth%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/logic gate input sep}}%
+ \edef\inputsep{\the\pgf@yc}%
+ \addtosavedmacro\inputsep%
+ \ifdim\pgf@yb<\pgf@yc%
+ \pgf@yb\pgf@yc%
+ \fi%
+ \multiply\pgf@yb\c@pgf@counta%
+ \ifdim\pgf@y<.5\pgf@yb%
+ \pgf@y.5\pgf@yb%
+ \fi%
+ %
+ \pgf@xa\pgf@x%
+ \pgfmathaddtolength\pgf@xa{-\pgfkeysvalueof{/pgf/inner xsep}}%
+ \edef\innerhalfwidth{\the\pgf@xa}%
+ \addtosavedmacro\innerhalfwidth%
+ %
+ \pgf@ya\pgf@y%
+ \pgfmathaddtolength\pgf@ya{-\pgfkeysvalueof{/pgf/inner ysep}}%
+ \edef\innerhalfheight{\the\pgf@ya}%
+ \addtosavedmacro\innerhalfheight%
+ %
+ % Take into account the outer sep.
+ %
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ %
+ \edef\halfwidth{\the\pgf@x}%
+ \edef\halfheight{\the\pgf@y}%
+ \addtosavedmacro\halfwidth%
+ \addtosavedmacro\halfheight%
+}%
+
+\def\pgf@lib@sh@logicgate@IEC@inputanchor#1{%
+ \dimensions%
+ \centerpoint%
+ \advance\pgf@x-\halfwidth%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
+ \advance\pgf@x-\invertedradius%
+ \advance\pgf@x-\outerinvertedradius%
+ \fi%
+ %
+ \pgfutil@tempdima\halfheight%
+ \multiply\pgfutil@tempdima2\relax%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \multiply\pgfutil@tempdima#1\relax%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y-\pgfutil@tempdima%
+}%
+
+
+
+% Shape and gate IEC
+%
+\pgfdeclareshape{and gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@and gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@and gate IEC@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@and gate IEC@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An and gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{and}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid west}{%
+ \dimensions%
+ \midpoint%
+ \advance\pgf@x-\halfwidth}%
+ \anchor{mid east}{%
+ \dimensions%
+ \midpoint%
+ \advance\pgf@x\halfwidth}%
+ \anchor{base}{\basepoint}%
+ \anchor{base west}{%
+ \dimensions%
+ \basepoint%
+ \advance\pgf@x-\halfwidth}%
+ \anchor{base east}{%
+ \dimensions%
+ \basepoint%
+ \advance\pgf@x\halfwidth}%
+ \anchor{north}{\dimensions\centerpoint\advance\pgf@y\halfheight}%
+ \anchor{south}{\dimensions\centerpoint\advance\pgf@y-\halfheight}%
+ \anchor{east}{\dimensions\centerpoint\advance\pgf@x\halfwidth}%
+ \anchor{west}{\dimensions\centerpoint\advance\pgf@x-\halfwidth}%
+ \anchor{north east}{\dimensions\centerpoint\advance\pgf@x\halfwidth\advance\pgf@y\halfheight}%
+ \anchor{north west}{\dimensions\centerpoint\advance\pgf@x-\halfwidth\advance\pgf@y\halfheight}%
+ \anchor{south east}{\dimensions\centerpoint\advance\pgf@x\halfwidth\advance\pgf@y-\halfheight}%
+ \anchor{south west}{\dimensions\centerpoint\advance\pgf@x-\halfwidth\advance\pgf@y-\halfheight}%
+ \anchor{output}{\dimensions\centerpoint\advance\pgf@x\halfwidth}%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \pgfmathaddtolength\pgf@xc{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@yc{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathrectangle{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
+ {%
+ \pgf@xc2.0\pgf@xc%
+ \pgf@yc2.0\pgf@yc%
+ \pgfqpoint{\pgf@xc}{\pgf@yc}%
+ }%
+ \pgfpathclose%
+ %
+ % Draw inputs.
+ %
+ \pgf@xc-\halfwidth%
+ \advance\pgf@xc-\invertedradius%
+ \pgf@yc\halfheight%
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ }%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{and}}%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \dimensions%
+ \pgfpointadd{\centerpoint}{\pgfpointborderrectangle{\externalpoint}{\pgfqpoint{\halfwidth}{\halfheight}}}%
+ }%
+}%
+
+
+
+
+
+% Shape nand gate IEC
+%
+\pgfdeclareshape{nand gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nand gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@nand gate IEC@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@nand gate IEC@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{A nand gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{nand}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \anchor{output}{%
+ \csname pgf@anchor@and gate IEC@east\endcsname%
+ \advance\pgf@x\invertedradius%
+ \advance\pgf@x\outerinvertedradius%
+ }%
+ \backgroundpath{%
+ \csname pgf@sh@bg@and gate IEC\endcsname%
+ \pgfpathcircle{%
+ \centerpoint%
+ \advance\pgf@x\halfwidth%
+ \advance\pgf@x\invertedradius%
+ }{+\invertedradius}%
+ }%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{nand}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+
+
+
+
+% Shape or gate IEC
+%
+\pgfdeclareshape{or gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@or gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@or gate IEC@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@or gate IEC@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An or gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{or}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \inheritanchor[from=and gate IEC]{output}%
+ \inheritbackgroundpath[from=and gate IEC]%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{or}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+
+
+
+
+% Shape nor gate IEC
+%
+\pgfdeclareshape{nor gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nor gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@nor gate IEC@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@nor gate IEC@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{A nor gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{nor}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \inheritanchor[from=nand gate IEC]{output}%%
+ \inheritbackgroundpath[from=nand gate IEC]%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{nor}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+
+
+
+
+% Shape xor gate IEC
+%
+\pgfdeclareshape{xor gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xor gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{2}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@xor gate IEC@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@xor gate IEC@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An xor gate must have two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{xor}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \inheritanchor[from=and gate IEC]{output}%
+ \inheritbackgroundpath[from=and gate IEC]%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{xor}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+
+
+
+% Shape xnor gate IEC
+%
+
+\pgfdeclareshape{xnor gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xnor gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@xnor gate IEC@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@xnor gate IEC@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{A xnor gate must have two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{xnor}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \inheritanchor[from=nand gate IEC]{output}%
+ \inheritbackgroundpath[from=nand gate IEC]%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{xnor}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+
+
+
+% Shape buffer gate IEC
+%
+\pgfdeclareshape{buffer gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@buffer gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1}% Maximum 1 input.
+ %
+ \expandafter\gdef\csname pgf@anchor@buffer gate IEC@input\endcsname{%
+ \pgf@lib@sh@logicgate@IEC@inputanchor{1}%
+ }%
+ \ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
+ \pgferror{A buffer gate must have one inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{xor}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \inheritanchor[from=and gate IEC]{output}%
+ \inheritbackgroundpath[from=and gate IEC]%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{buffer}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+
+
+
+
+% Shape not gate IEC
+%
+\pgfdeclareshape{not gate IEC}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@not gate IEC\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1}%
+ %
+ \pgfutil@ifundefined{pgf@anchor@not gate IEC@input}{%
+ \expandafter\gdef\csname pgf@anchor@not gate IEC@input\endcsname{%
+ \pgf@lib@sh@logicgate@IEC@inputanchor{1}%
+ }}{}%
+ \ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
+ \pgferror{A not gate must have one input}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{%
+ \pgf@lib@sh@logicgates@dimensions@IEC{not}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=and gate IEC]{center}%
+ \inheritanchor[from=and gate IEC]{mid}%
+ \inheritanchor[from=and gate IEC]{mid west}%
+ \inheritanchor[from=and gate IEC]{mid east}%
+ \inheritanchor[from=and gate IEC]{base}%
+ \inheritanchor[from=and gate IEC]{base west}%
+ \inheritanchor[from=and gate IEC]{base east}%
+ \inheritanchor[from=and gate IEC]{north}%
+ \inheritanchor[from=and gate IEC]{south}%
+ \inheritanchor[from=and gate IEC]{east}%
+ \inheritanchor[from=and gate IEC]{west}%
+ \inheritanchor[from=and gate IEC]{north east}%
+ \inheritanchor[from=and gate IEC]{north west}%
+ \inheritanchor[from=and gate IEC]{south east}%
+ \inheritanchor[from=and gate IEC]{south west}%
+ \inheritanchor[from=nand gate IEC]{output}%
+ \inheritbackgroundpath[from=nand gate IEC]%
+ \foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{not}}%
+ \inheritanchorborder[from=and gate IEC]%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.US.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.US.code.tex
new file mode 100644
index 0000000000..3a496324f8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.US.code.tex
@@ -0,0 +1,2525 @@
+% Copyright 2008 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.
+
+\usepgflibrary{shapes.gates.logic}%
+
+
+\newif\ifpgfgateanchorsuseboundingrectangle%
+
+
+% Keys for US/CDH logic gates.
+%
+\pgfkeys{
+ /pgf/logic gate anchors use bounding box/.is if=pgfgateanchorsuseboundingrectangle,%
+}%
+
+% An internal macro for calculating internal dimensions of
+% the US + CDH gates (excluding and gate US and nand gate US).
+%
+\def\pgf@lib@sh@logicgates@dimensions@orUS{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ % Adjust the height for the number of inputs.
+ %
+ \c@pgf@counta\pgf@lib@sh@logicgate@numinputs%
+ \advance\c@pgf@counta1\relax%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@ya\pgflinewidth%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/logic gate input sep}}%
+ \pgf@yb.5\pgf@yb%
+ \ifdim\pgf@ya<\pgf@yb%
+ \pgf@ya\pgf@yb%
+ \fi%
+ \multiply\pgf@ya\c@pgf@counta%
+ \ifdim\pgf@y<\pgf@ya%
+ \pgf@y\pgf@ya%
+ \fi%
+ %
+ \ifdim\pgf@x>\pgf@y%
+ \pgf@y\pgf@x%
+ \else%
+ \pgf@x\pgf@y%
+ \fi%
+ %
+ % Adjust for minimum height and width.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \pgf@xb\pgf@x%
+ \advance\pgf@xb1.732051\pgf@y% 2y*cos(30)
+ \ifdim\pgf@xb<\pgf@xa%
+ \pgf@xb\pgf@xa%
+ \pgf@x0.366025\pgf@xb% xb / (1 + 2*cos(30))
+ \fi%
+ %
+ \ifdim\pgf@x>\pgf@y%
+ \pgf@y\pgf@x%
+ \else%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\halfside{\the\pgf@x}%
+ \addtosavedmacro\halfside%
+ %
+ % Take into account the outer sep.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\outerxsep{\the\pgf@xa}%
+ \edef\outerysep{\the\pgf@ya}%
+ \addtosavedmacro\outerxsep%
+ \addtosavedmacro\outerysep%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ %
+ \edef\halfwidth{\the\pgf@x}%
+ \edef\halfheight{\the\pgf@y}%
+ \addtosavedmacro\halfwidth%
+ \addtosavedmacro\halfheight%
+ %
+ \pgfextract@process\tipanchor{%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@y-\pgf@ya%
+ \pgf@x-.16666\pgf@x%
+ \pgf@yb2.0\pgf@y%
+ \advance\pgf@x.866025\pgf@yb%
+ \advance\pgf@x1.154701\pgf@xa%
+ \pgf@y0pt%
+ }%
+ \addtosavedmacro\tipanchor%
+}%
+
+
+% An internal macro for calculating internal dimensions of
+% the and gate US and nand gate US.
+%
+\def\pgf@lib@sh@logicgates@dimensions@andUS{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ % Adjust the height for the number of inputs.
+ %
+ \c@pgf@counta\pgf@lib@sh@logicgate@numinputs%
+ \advance\c@pgf@counta1\relax%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@ya\pgflinewidth%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/logic gate input sep}}%
+ \pgf@yb.5\pgf@yb%
+ \ifdim\pgf@ya<\pgf@yb%
+ \pgf@ya\pgf@yb%
+ \fi%
+ \multiply\pgf@ya\c@pgf@counta%
+ \ifdim\pgf@y<\pgf@ya%
+ \pgf@y\pgf@ya%
+ \fi%
+ %
+ \ifdim\pgf@x>\pgf@y%
+ \pgf@y\pgf@x%
+ \else%
+ \pgf@x\pgf@y%
+ \fi%
+ %
+ % Adjust for minimum height and width.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \pgf@xb2.5\pgf@x%
+ \ifdim\pgf@xb<\pgf@xa%
+ \pgf@xb\pgf@xa%
+ \pgf@x0.4\pgf@xb%
+ \fi%
+ %
+ \ifdim\pgf@x>\pgf@y%
+ \pgf@y\pgf@x%
+ \else%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\halfside{\the\pgf@x}%
+ \addtosavedmacro\halfside%
+ %
+ % Take into account the outer sep.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\outerxsep{\the\pgf@xa}%
+ \edef\outerysep{\the\pgf@ya}%
+ \addtosavedmacro\outerxsep%
+ \addtosavedmacro\outerysep%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ %
+ \edef\halfwidth{\the\pgf@x}%
+ \edef\halfheight{\the\pgf@y}%
+ \addtosavedmacro\halfwidth%
+ \addtosavedmacro\halfheight%
+ %
+}%
+
+
+% Internal macro for calculation input anchors. Used by
+% both and gates and nand gates, and also the not gate and buffer.
+%
+\def\pgf@lib@sh@logicgate@AND@inputanchor#1{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-.166666\pgf@xa%
+ \advance\pgf@x-\halfwidth%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
+ \advance\pgf@x-\invertedradius%
+ \advance\pgf@x-\outerinvertedradius%
+ \fi%
+ %
+ \pgfutil@tempdima\halfside%
+ \multiply\pgfutil@tempdima2\relax%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \multiply\pgfutil@tempdima#1\relax%
+ \advance\pgf@y\halfside%
+ \advance\pgf@y-\pgfutil@tempdima%
+}%
+
+
+
+
+% Shape and gate US
+%
+\pgfdeclareshape{and gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@and gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@and gate US@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@and gate US@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An and gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@andUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \csname pgf@anchor@and gate US@east\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{mid west}{%
+ \csname pgf@anchor@and gate US@west\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \csname pgf@anchor@and gate US@east\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base west}{%
+ \csname pgf@anchor@and gate US@west\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \anchor{east}{%
+ \dimensions%
+ \pgf@xa\halfwidth%
+ \pgf@xb\pgf@xa%
+ \advance\pgf@xb-\outerxsep%
+ \centerpoint%
+ \advance\pgf@x.333333\pgf@xb%
+ \advance\pgf@x\pgf@xa%
+ }%
+ \anchor{output}{\csname pgf@anchor@and gate US@east\endcsname}%
+ \anchor{north east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@nand gate US@east\endcsname%
+ \advance\pgf@y\halfheight%
+ \else
+ \pgf@xa\halfwidth%
+ \pgf@ya\halfheight%
+ \pgf@xb\pgf@xa%
+ \advance\pgf@xb-\outerxsep%
+ \centerpoint%
+ \advance\pgf@x.333333\pgf@xb%
+ \advance\pgf@x.707106\pgf@xa%
+ \advance\pgf@y.707106\pgf@ya%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@nand gate US@east\endcsname%
+ \advance\pgf@y-\halfheight%
+ \else
+ \pgf@xa\halfwidth%
+ \pgf@ya\halfheight%
+ \pgf@xb\pgf@xa%
+ \advance\pgf@xb-\outerxsep%
+ \centerpoint%
+ \advance\pgf@x.333333\pgf@xb%
+ \advance\pgf@x.707106\pgf@xa%
+ \advance\pgf@y-.707106\pgf@ya%
+ \fi%
+ }%
+ \anchor{north}{%
+ \dimensions%
+ \centerpoint%
+ \advance\pgf@y\halfheight%
+ }%
+ \anchor{south}{%
+ \dimensions%
+ \centerpoint%
+ \advance\pgf@y-\halfheight%
+ }%
+ \anchor{south west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@y-\halfheight%
+ }%
+ \anchor{north west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@y\halfheight%
+ }%
+ \anchor{west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ }%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ \pgf@xb.333333\pgf@xc%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yc}}%
+ {%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
+ \pgfpathclose%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@xa\halfside%
+ \pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-.5\pgflinewidth%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \dimensions%
+ \pgf@xb\halfside%
+ \pgf@xc1.66666\pgf@xb%
+ \advance\pgf@xc\outerxsep%
+ \pgf@yc\halfheight%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@and gate US@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y\pgf@yc}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@x.333333\pgf@xb%
+ }%
+ {0}{90}{+\halfwidth and +\halfheight}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y\pgf@yc}%
+ {\centerpoint\advance\pgf@x-\pgf@xc\advance\pgf@y\pgf@yc}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y-\pgf@yc}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@x.333333\pgf@xb%
+ }%
+ {270}{360}{+\halfwidth and +\halfheight}%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@and gate US@south west\endcsname}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y-\pgf@yc}%
+ {\csname pgf@anchor@and gate US@south west\endcsname}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@and gate US@north west\endcsname}%
+ {\csname pgf@anchor@and gate US@south west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+
+
+
+% Shape nand gate US
+%
+\pgfdeclareshape{nand gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nand gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@nand gate US@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@nand gate US@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{A nand gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@andUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \inheritanchor[from=and gate US]{mid}%
+ \inheritanchor[from=and gate US]{mid east}%
+ \inheritanchor[from=and gate US]{mid west}%
+ \inheritanchor[from=and gate US]{base}%
+ \inheritanchor[from=and gate US]{base east}%
+ \inheritanchor[from=and gate US]{base west}%
+ \anchor{output}{%
+ \dimensions
+ \pgfpointadd{\centerpoint}{%
+ \pgf@xa\halfside%
+ \pgf@x1.33333\pgf@xa%
+ \advance\pgf@x\invertedradius%
+ \advance\pgf@x\outerinvertedradius%
+ \advance\pgf@x\outerxsep%
+ \pgf@y0pt%
+ }%
+ }%
+ \inheritanchor[from=and gate US]{east}%
+ \inheritanchor[from=and gate US]{north east}%
+ \inheritanchor[from=and gate US]{south east}%
+ \inheritanchor[from=and gate US]{north}%
+ \inheritanchor[from=and gate US]{south}%
+ \inheritanchor[from=and gate US]{south west}%
+ \inheritanchor[from=and gate US]{north west}%
+ \inheritanchor[from=and gate US]{west}%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ \pgf@xb.333333\pgf@xc%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yc}}%
+ {%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
+ \pgfpathclose%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@xa\halfside%
+ \pgf@x-1.166666\pgf@xa%
+ \advance\pgf@x-.5\pgflinewidth%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Draw the output inverter.
+ %
+ {%
+ \pgfpathcircle{%
+ \pgf@x1.33333\pgf@xc%
+ \advance\pgf@x\outerinvertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ }%
+ }%
+ \inheritanchorborder[from=and gate US]%
+}%
+
+
+% Internal macro for calculation input anchors. Used by
+% or, nor xnor gates (US).
+%
+\def\pgf@lib@sh@logicgate@OR@inputanchor#1{%
+ \dimensions%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ %
+ \pgfutil@tempdima\halfside%
+ \multiply\pgfutil@tempdima2\relax%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \multiply\pgfutil@tempdima#1\relax%
+ \pgf@yc\pgf@ya%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ %
+ \pgf@xb\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@xc-1.166666\pgf@ya%
+ \advance\pgf@xc-.866025\pgf@xb%
+ \advance\pgf@xc\pgfmathresult\pgf@yb%
+ \advance\pgf@xc\halflinewidth%
+ \advance\pgf@xc-\outerxsep%
+ %
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
+ \advance\pgf@xc-\invertedradius%
+ \advance\pgf@xc-\outerinvertedradius%
+ \fi%
+ %
+ \centerpoint%
+ \advance\pgf@x\pgf@xc%
+ \advance\pgf@y\pgf@yc%
+}%
+
+
+% Shape or gate US
+%
+\pgfdeclareshape{or gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@or gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@or gate US@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@or gate US@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@OR@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An or gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\halflinewidth{%
+ \pgf@x.5\pgflinewidth%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \csname pgf@anchor@or gate US@east\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{mid west}{%
+ \csname pgf@anchor@or gate US@north west\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \csname pgf@anchor@or gate US@east\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base west}{%
+ \csname pgf@anchor@or gate US@north west\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \anchor{east}{%
+ \dimensions%
+ \pgfpointadd{\centerpoint}{\tipanchor}%
+ }%
+ \anchor{output}{\csname pgf@anchor@or gate US@east\endcsname}%
+ \anchor{north east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\halfheight%
+ \else%
+ \centerpoint%
+ \pgf@xa\halfwidth%
+ \pgf@ya\halfheight%
+ \pgf@xb\halfside%
+ \advance\pgf@x-.166666\pgf@xb%
+ \advance\pgf@xa\pgf@xb%
+ \advance\pgf@x.5\pgf@xa%
+ \advance\pgf@y-\pgf@xb%
+ \advance\pgf@ya\pgf@xb%
+ \advance\pgf@y.866025\pgf@ya%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y-\halfheight%
+ \else
+ \centerpoint%
+ \pgf@xa\halfwidth%
+ \pgf@ya\halfheight%
+ \pgf@xb\halfside%
+ \advance\pgf@x-.166666\pgf@xb%
+ \advance\pgf@xa\pgf@xb%
+ \advance\pgf@x.5\pgf@xa%
+ \advance\pgf@y\pgf@xb%
+ \advance\pgf@ya\pgf@xb%
+ \advance\pgf@y-.866025\pgf@ya%
+ \fi%
+ }%
+ \anchor{north}{%
+ \dimensions%
+ \centerpoint%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@y\halfheight%
+ \else%
+ \pgf@ya\halfheight%
+ \advance\pgf@y.993043\pgf@ya%
+ \fi%
+ }%
+ \anchor{south}{%
+ \dimensions%
+ \centerpoint%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@y-\halfheight%
+ \else%
+ \pgf@ya\halfheight%
+ \advance\pgf@y-.993043\pgf@ya%
+ \fi%
+ }%
+ \anchor{south west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x-1.732050\pgf@xa%
+ \advance\pgf@y-\halfheight%
+ }%
+ \anchor{north west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x-1.732050\pgf@xa%
+ \advance\pgf@y\halfheight%
+ }%
+ \anchor{west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \else%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@x0.267949\pgf@xa%
+ \fi%
+ }%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \pgfpatharc{-30}{0}{+\pgf@yc}%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \pgfpatharc{0}{30}{+\pgf@yc}%
+ }%
+ \pgfpathclose%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ \pgf@xa\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
+ \let\sineangle\pgfmathresult%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@x-1.166666\pgf@ya%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x\pgfmathresult\pgf@yb%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \dimensions%
+ \pgf@xc\halfside%
+ %
+ \pgf@xc-.166666\pgf@xc%
+ \ifdim\pgf@xa<\pgf@xc%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@or gate US@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@or gate US@north\endcsname%
+ }%
+ {\csname pgf@anchor@or gate US@north west\endcsname}%
+ \else%
+ \pgfmathsubtract@{360}{\pgfmathresult}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@or gate US@south\endcsname%
+ }%
+ {\csname pgf@anchor@or gate US@south west\endcsname}%
+ \else%
+ \ifdim\pgf@ya>\pgf@yb%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \advance\pgf@yc-\outerxsep%
+ \pgfextract@process\point{%
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.166666\pgf@xa%
+ \pgf@xa2.0\pgf@xa%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ }%
+ {0}{90}{+\pgf@yc}%
+ }%
+ \else%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \advance\pgf@yc-\outerxsep%
+ \pgfextract@process\point{%
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.166666\pgf@xa%
+ \pgf@xa2.0\pgf@xa%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ }%
+ {270}{360}{+\pgf@yc}%
+ }%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgf@y=0pt\relax%
+ \csname pgf@anchor@and gate US@east\endcsname%
+ \else%
+ \pgf@xc\halfwidth%
+ \advance\pgf@xc\halfside%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \pgf@xb\halfside%
+ \pgf@xb-.166666\pgf@xb%
+ \ifdim\pgf@ya<0pt%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@y\halfside%
+ \advance\pgf@x\pgf@xb%
+ }%
+ {270}{330}{+\pgf@yc}%
+ \else%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@y-\halfside%
+ \advance\pgf@x\pgf@xb%
+ }%
+ {30}{90}{+\pgf@xc and +\pgf@yc}%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+
+
+% Shape nor gate US
+%
+\pgfdeclareshape{nor gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nor gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@nor gate US@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@nor gate US@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@OR@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{A nor gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\halflinewidth{%
+ \pgf@x.5\pgflinewidth%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \inheritanchor[from=or gate US]{center}%
+ \inheritanchor[from=or gate US]{mid}%
+ \inheritanchor[from=or gate US]{mid east}%
+ \inheritanchor[from=or gate US]{mid west}%
+ \inheritanchor[from=or gate US]{base}%
+ \inheritanchor[from=or gate US]{base east}%
+ \inheritanchor[from=or gate US]{base west}%
+ \inheritanchor[from=or gate US]{east}%
+ \inheritanchor[from=or gate US]{north east}%
+ \inheritanchor[from=or gate US]{south east}%
+ \inheritanchor[from=or gate US]{north}%
+ \inheritanchor[from=or gate US]{south}%
+ \inheritanchor[from=or gate US]{south west}%
+ \inheritanchor[from=or gate US]{north west}%
+ \inheritanchor[from=or gate US]{west}%
+ \anchor{output}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xc\halfside%
+ \pgf@yc\pgf@xc%
+ \advance\pgf@x-.166666\pgf@xc%
+ \pgf@yc2.0\pgf@yc%
+ \advance\pgf@x.866025\pgf@yc%
+ \advance\pgf@x\outerinvertedradius%
+ \advance\pgf@x\invertedradius%
+ \advance\pgf@x\outerxsep%
+ }%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \pgfpatharc{-30}{0}{+\pgf@yc}%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \pgfpatharc{0}{30}{+\pgf@yc}%
+ }%
+ \pgfpathclose%
+ % Draw the output inverter.
+ %
+ {%
+ \pgfpathcircle{%
+ \pgf@x-.166666\pgf@xc%
+ \pgf@yc2.0\pgf@yc%
+ \advance\pgf@x.866025\pgf@yc%
+ \advance\pgf@x\outerinvertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ \pgf@xa\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
+ \let\sineangle\pgfmathresult%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@x-1.166666\pgf@ya%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x\pgfmathresult\pgf@yb%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ }%
+ \inheritanchorborder[from=or gate US]%
+}%
+
+
+
+% Internal macro for calculation input anchors. Used by
+% xor and xnor gates (US).
+%
+\def\pgf@lib@sh@logicgate@XOR@inputanchor#1{%
+ \dimensions%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ %
+ \pgfutil@tempdima\halfside%
+ \multiply\pgfutil@tempdima2\relax%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \multiply\pgfutil@tempdima#1\relax%
+ \pgf@yc\pgf@ya%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ %
+ \pgf@xb\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@xc-1.166666\pgf@ya%
+ \advance\pgf@xc-.866025\pgf@xb%
+ \advance\pgf@xc\pgfmathresult\pgf@yb%
+ \advance\pgf@xc\halflinewidth%
+ \advance\pgf@xc-\outerxsep%
+ %
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
+ \advance\pgf@xc-\invertedradius%
+ \advance\pgf@xc-\outerinvertedradius%
+ \fi%
+ %
+ \centerpoint%
+ \advance\pgf@x\pgf@xc%
+ \advance\pgf@y\pgf@yc%
+ \pgf@xa\halfside%
+ \advance\pgf@x-.333333\pgf@xa%
+}%
+
+
+
+
+
+% Shape xor gate US
+%
+\pgfdeclareshape{xor gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xor gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{2}%
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@xor gate US@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@xor gate US@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@XOR@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An xor gate must have at two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\halflinewidth{%
+ \pgf@x.5\pgflinewidth%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \inheritanchor[from=or gate US]{mid east}%
+ \anchor{mid west}{%
+ \csname pgf@anchor@xor gate US@north west\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base}{\basepoint}%
+ \inheritanchor[from=or gate US]{base east}%
+ \anchor{base west}{%
+ \csname pgf@anchor@xor gate US@north west\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \inheritanchor[from=or gate US]{base}%
+ \inheritanchor[from=or gate US]{output}%
+ \inheritanchor[from=or gate US]{east}%
+ \inheritanchor[from=or gate US]{north east}%
+ \inheritanchor[from=or gate US]{south east}%
+ \inheritanchor[from=or gate US]{north}%
+ \inheritanchor[from=or gate US]{south}%
+ \anchor{south west}{%
+ \dimensions%
+ \pgf@xa\halfside%
+ \pgf@xa-3.232051\pgf@xa% (7/6 + 2*cos(30) + 1/3) * x
+ \pgf@xb\halfside%
+ \pgf@xb2.0\pgf@xb%
+ \advance\pgf@xb-\halflinewidth%
+ \advance\pgf@xa.866025\pgf@xb%
+ \pgf@ya.5\pgf@xb%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@y-\halfheight%
+ \else%
+ \advance\pgf@y-\pgf@ya%
+ \fi%
+ }%
+ \anchor{north west}{%
+ \dimensions%
+ \pgf@xa\halfside%
+ \pgf@xa-3.232051\pgf@xa% (7/6 + 2*cos(30) + 1/3) * x
+ \pgf@xb\halfside%
+ \pgf@xb2.0\pgf@xb%
+ \advance\pgf@xb-\halflinewidth%
+ \advance\pgf@xa.866025\pgf@xb%
+ \pgf@ya.5\pgf@xb%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@y\halfheight%
+ \else%
+ \advance\pgf@y\pgf@ya%
+ \fi%
+ }%
+ \anchor{west}{%
+ \dimensions%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ %
+ \pgf@xb\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{0}{\pgfmath@tonumber{\pgf@yb}}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@xc-1.166666\pgf@ya%
+ \advance\pgf@xc-.866025\pgf@xb%
+ \advance\pgf@xc\pgfmathresult\pgf@yb%
+ \advance\pgf@xc\halflinewidth%
+ \advance\pgf@xc-\outerxsep%
+ %
+ \centerpoint%
+ \advance\pgf@x\pgf@xc%
+ \pgf@xa\halfside%
+ \advance\pgf@x-.333333\pgf@xa%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \pgf@xa2.0\pgf@xa%
+ \advance\pgf@x-0.133974\pgf@xa%
+ \fi%
+ }%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ {%
+ \pgf@yc2.66666\pgf@yc%
+ \pgfpatharc{-22}{0}{+1.166666\pgf@yc and +\pgf@yc}%
+ }
+ {%
+ \pgf@yc2.66666\pgf@yc%
+ \pgfpatharc{0}{22}{+1.166666\pgf@yc and +\pgf@yc}%
+ }%
+ \pgfpathclose%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ \pgf@xa\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@x-1.5\pgf@ya%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x\pgfmathresult\pgf@yb%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Now, some fooling around to stop the `tail' being filled.
+ % Technically it still is, but it isn't visible.
+ %
+ \pgf@xc\halfside%
+ \pgf@yc\halfside%
+ \pgfpathmoveto{\pgfqpoint{-1.5\pgf@xc}{-\pgf@yc}}%
+ \pgf@yc2.0\pgf@yc%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter<61\relax%
+ {%
+ \pgfextract@process\point{%
+ \pgfpointadd{%
+ \pgf@x\halfside%
+ \pgf@x-3.232051\pgf@x% (7/6 + 2*cos(30) + 1/3) * x
+ \pgf@y0pt%
+ }{%
+ \pgfpointpolar{\pgfmathcounter-30}{+\pgf@yc}%
+ }%
+ }%
+ \pgfpathlineto{\point}%
+ \pgfpathmoveto{\point}%
+ }
+ \repeatpgfmathloop%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \dimensions%
+ \pgf@xc\halfside%
+ %
+ \pgf@xc-.166666\pgf@xc%
+ \ifdim\pgf@xa<\pgf@xc%
+ \pgfmathanglebetweenpoints{\centerpoint}%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@xor gate US@north west\endcsname%
+ }%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@xor gate US@north\endcsname%
+ }%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@xor gate US@north west\endcsname%
+ }%
+ \else%
+ \pgfmathsubtract@{360}{\pgfmathresult}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@xor gate US@south\endcsname%
+ }%
+ {%
+ \pgfgateanchorsuseboundingrectangletrue%
+ \csname pgf@anchor@xor gate US@south west\endcsname%
+ }%
+ \else%
+ \ifdim\pgf@ya>\pgf@yb%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \advance\pgf@yc-\outerxsep%
+ \pgf@process{%
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.166666\pgf@xa%
+ \pgf@xa2.0\pgf@xa%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@x-.166666\pgf@xa%
+ }%
+ {0}{90}{+\pgf@yc}%
+ }%
+ \else%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \advance\pgf@yc-\outerxsep%
+ \pgf@process{%
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.166666\pgf@xa%
+ \pgf@xa2.0\pgf@xa%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@x-.166666\pgf@xa%
+ }%
+ {270}{360}{+\pgf@yc}%
+ }%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgf@y=0pt\relax%
+ \csname pgf@anchor@and gate US@east\endcsname%
+ \else%
+ \pgf@xc\halfwidth%
+ \advance\pgf@xc\halfside%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \pgf@xb\halfside%
+ \pgf@xb-.166666\pgf@xb%
+ \ifdim\pgf@ya<0pt%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@y\halfside%
+ \advance\pgf@x\pgf@xb%
+ }%
+ {270}{330}{+\pgf@yc}%
+ \else%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@y-\halfside%
+ \advance\pgf@x\pgf@xb%
+ }%
+ {30}{90}{+\pgf@xc and +\pgf@yc}%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+
+
+% Shape xnor gate US
+%
+\pgfdeclareshape{xnor gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xnor gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{2}%
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@xnor gate US@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@xnor gate US@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@XOR@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An xnor gate must have two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\halflinewidth{%
+ \pgf@x.5\pgflinewidth%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \inheritanchor[from=xor gate US]{mid east}%
+ \inheritanchor[from=xor gate US]{mid west}%
+ \anchor{base}{\basepoint}%%
+ \inheritanchor[from=xor gate US]{base east}%
+ \inheritanchor[from=xor gate US]{base west}%
+ \inheritanchor[from=xor gate US]{base}%
+ \inheritanchor[from=nor gate US]{output}%
+ \inheritanchor[from=xor gate US]{east}%
+ \inheritanchor[from=xor gate US]{north east}%
+ \inheritanchor[from=xor gate US]{south east}%
+ \inheritanchor[from=xor gate US]{north}%
+ \inheritanchor[from=xor gate US]{south}%
+ \inheritanchor[from=xor gate US]{south west}%
+ \inheritanchor[from=xor gate US]{north west}%
+ \inheritanchor[from=xor gate US]{west}%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ {%
+ \pgf@yc2.66666\pgf@yc%
+ \pgfpatharc{-22}{0}{+1.166666\pgf@yc and +\pgf@yc}%
+ }
+ {%
+ \pgf@yc2.66666\pgf@yc%
+ \pgfpatharc{0}{22}{+1.166666\pgf@yc and +\pgf@yc}%
+ }%
+ \pgfpathclose%
+ %
+ % Draw the output inverter.
+ %
+ {%
+ \pgfpathcircle{%
+ \pgf@x-.166666\pgf@xc%
+ \pgf@yc2.0\pgf@yc%
+ \advance\pgf@x.866025\pgf@yc%
+ \advance\pgf@x\outerinvertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@ya\halfside%
+ \pgf@yb2.0\pgf@ya%
+ \pgf@xa\pgf@yb%
+ \advance\pgf@yb-\halflinewidth%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ %
+ \pgf@x-1.5\pgf@ya%
+ \advance\pgf@x-.866025\pgf@xa%
+ \advance\pgf@x\pgfmathresult\pgf@yb%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Now, some fooling around to stop the `tail' being filled.
+ %
+ \pgf@xc\halfside%
+ \pgf@yc\halfside%
+ \pgfpathmoveto{\pgfqpoint{-1.5\pgf@xc}{-\pgf@yc}}%
+ \pgf@yc2.0\pgf@yc%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter<61\relax%
+ {%
+ \pgfextract@process\point{%
+ \pgfpointadd{%
+ \pgf@x\halfside%
+ \pgf@x-3.232051\pgf@x% (7/6 + 2*cos(30) + 1/3) * x
+ \pgf@y0pt%
+ }{%
+ \pgfpointpolar{\pgfmathcounter-30}{+\pgf@yc}%
+ }%
+ }%
+ \pgfpathlineto{\point}%
+ \pgfpathmoveto{\point}%
+ }
+ \repeatpgfmathloop%
+ }%
+ }%
+ \inheritanchorborder[from=xor gate US]%
+}%
+
+
+
+
+
+
+% Shape not gate US
+%
+\pgfdeclareshape{not gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@not gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1}%
+ \ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
+ \pgferror{A not gate must have one input}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\halflinewidth{%
+ \pgf@x.5\pgflinewidth%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \midpoint%
+ \pgfutil@tempdima\pgf@y%
+ \csname pgf@anchor@not gate US@east\endcsname%
+ \pgf@y\pgfutil@tempdima%
+ }%
+ \anchor{mid west}{%
+ \dimensions%
+ \pgf@xc\halfside%
+ \pgf@xc-.833333\pgf@xc%
+ \advance\pgf@xc-\outerxsep%
+ \midpoint%
+ \advance\pgf@x\pgf@xc%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \basepoint%
+ \pgfutil@tempdima\pgf@y%
+ \csname pgf@anchor@not gate US@east\endcsname%
+ \pgf@y\pgfutil@tempdima%
+ }%
+ \anchor{base west}{%
+ \dimensions%
+ \pgf@xc\halfside%
+ \pgf@xc-.833333\pgf@xc%
+ \advance\pgf@xc-\outerxsep%
+ \basepoint%
+ \advance\pgf@x\pgf@xc%
+ }%
+ \inheritanchor[from=and gate US]{base}%
+ \anchor{output}{%
+ \dimensions%
+ \pgf@xc\halfside%
+ \centerpoint%
+ \advance\pgf@x-.166666\pgf@xc%
+ \pgf@xc2.0\pgf@xc%
+ \advance\pgf@x.866025\pgf@xc%
+ \advance\pgf@x\invertedradius%
+ \advance\pgf@x\outerinvertedradius%
+ \advance\pgf@x\outerxsep%
+ }%
+ \anchor{east}{%
+ \dimensions%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ }%
+ \anchor{north}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@north west\endcsname%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y\pgf@ya%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y1pt}%
+ {\csname pgf@anchor@not gate US@north west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{south}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@south west\endcsname%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y\pgf@ya%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y-1pt}%
+ {\csname pgf@anchor@not gate US@south west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@south west\endcsname%
+ \pgf@ya\pgf@y%
+ \pgf@process{%
+ \dimensions%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ }%
+ \pgf@y\pgf@ya%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y-1pt}%
+ {\csname pgf@anchor@not gate US@south west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{north east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@north west\endcsname%
+ \pgf@ya\pgf@y%
+ \pgf@process{%
+ \dimensions%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ }%
+ \pgf@y\pgf@ya%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y1pt}%
+ {\csname pgf@anchor@not gate US@north west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{south west}{%
+ \dimensions%
+ \pgf@xa\halfside%
+ \centerpoint%
+ \advance\pgf@x-.833333\pgf@xa
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@y-1.166666\pgf@xa%
+ \pgf@ya\outerysep%
+ \advance\pgf@y-1.565\pgf@ya% Selected by trial and error.
+ }%
+ \anchor{north west}{%
+ \dimensions%
+ \pgf@xa\halfside%
+ \centerpoint%
+ \advance\pgf@x-.833333\pgf@xa
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@y1.166666\pgf@xa%
+ \pgf@ya\outerysep%
+ \advance\pgf@y1.565\pgf@ya% Selected by trial and error.
+ }%
+ \anchor{input}{%
+ \dimensions%
+ \pgf@lib@sh@logicgate@AND@inputanchor{1}%
+ \pgf@xc\halfside%
+ \advance\pgf@x.333333\pgf@xc%
+ }%
+ \anchor{west}{%
+ \dimensions%
+ \pgf@xc\halfside%
+ \pgf@xc-.833333\pgf@xc%
+ \advance\pgf@xc-\outerxsep%
+ \centerpoint%
+ \advance\pgf@x\pgf@xc%
+ }%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\tipanchor}%
+ \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{1.166666\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{-1.166666\pgf@yc}}%
+ \pgfpathlineto{\tipanchor}%
+ %
+ % Draw the output inverter.
+ %
+ {%
+ \pgfpathcircle{%
+ \pgf@x-.166666\pgf@xc%
+ \pgf@yc2.0\pgf@yc%
+ \advance\pgf@x.866025\pgf@yc%
+ \advance\pgf@x\outerinvertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ %
+ % Draw the input.
+ %
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-1\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@xa\halfside%
+ \pgf@x-.833333\pgf@xa%
+ \advance\pgf@x-.5\pgflinewidth%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ }%
+ }%
+ \anchorborder{%
+ \pgf@lib@gates@not@buffer@border{not gate US}
+ }%
+}%
+
+\def\pgf@lib@gates@not@buffer@border#1{
+ \pgfextract@process\externalpoint{}%
+ \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \ifx\pgfmathresult\pgf@lib@zero@text%
+ \csname pgf@anchor@#1@output\endcsname%
+ \else%
+ \ifx\pgfmathresult\pgf@lib@onehundredeighty@text%
+ \csname pgf@anchor@#1@input\endcsname%
+ \else%
+ \let\externalangle\pgfmathresult%
+ \dimensions%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@not gate US@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\csname pgf@anchor@not gate US@north west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@not gate US@south west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@not gate US@north west\endcsname}%
+ {\csname pgf@anchor@not gate US@south west\endcsname}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\csname pgf@anchor@not gate US@south west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+
+\def\pgf@lib@zero@text{0.0}%
+\def\pgf@lib@onehundredeighty@text{180.0}%
+
+
+
+
+% Shape buffer gate US.
+%
+\pgfdeclareshape{buffer gate US}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@buffer gate US\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1}%
+ \ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
+ \pgferror{A buffer gate must have one input}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\halflinewidth{%
+ \pgf@x.5\pgflinewidth%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \midpoint%
+ \pgfutil@tempdima\pgf@y%
+ \csname pgf@anchor@buffer gate US@east\endcsname%
+ \pgf@y\pgfutil@tempdima%
+ }%
+ \anchor{mid west}{%
+ \dimensions%
+ \pgf@xc\halfside%
+ \pgf@xc-.833333\pgf@xc%
+ \advance\pgf@xc-\outerxsep%
+ \midpoint%
+ \advance\pgf@x\pgf@xc%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \basepoint%
+ \pgfutil@tempdima\pgf@y%
+ \csname pgf@anchor@buffer gate US@east\endcsname%
+ \pgf@y\pgfutil@tempdima%
+ }%
+ \inheritanchor[from=not gate US]{base west}%
+ \inheritanchor[from=and gate US]{base}%
+ \anchor{output}{\csname pgf@anchor@buffer gate US@east\endcsname}%
+ \anchor{east}{%
+ \dimensions%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \anchor{north}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@north west\endcsname%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y\pgf@ya%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y1pt}%
+ {\csname pgf@anchor@buffer gate US@north west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{south}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@south west\endcsname%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y\pgf@ya%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y-1pt}%
+ {\csname pgf@anchor@not gate US@south west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@south west\endcsname%
+ \pgfutil@tempdima\pgf@y%
+ \csname pgf@anchor@buffer gate US@east\endcsname%
+ \pgf@y\pgfutil@tempdima%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y-1pt}%
+ {\csname pgf@anchor@buffer gate US@south west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xc\outerxsep%
+ \advance\pgf@x2.350943\pgf@xc%
+ }%
+ }%
+ \fi%
+ }%
+ \anchor{north east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \csname pgf@anchor@not gate US@north west\endcsname%
+ \pgfutil@tempdima\pgf@y%
+ \csname pgf@anchor@buffer gate US@east\endcsname%
+ \pgf@y\pgfutil@tempdima%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y1pt}%
+ {\csname pgf@anchor@buffer gate US@north west\endcsname}%
+ {%
+ \pgfpointadd{\centerpoint}{%
+ \tipanchor%
+ \pgf@xa\outerxsep%
+ \advance\pgf@x2.350943\pgf@xa%
+ }%
+ }%
+ \fi%
+ }%
+ \inheritanchor[from=not gate US]{south west}%
+ \inheritanchor[from=not gate US]{north west}%
+ \inheritanchor[from=not gate US]{input}%
+ \inheritanchor[from=not gate US]{west}%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\tipanchor}%
+ \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{1.166666\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{-1.166666\pgf@yc}}%
+ \pgfpathclose%
+ %
+ % Draw the input.
+ %
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-1\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@xa\halfside%
+ \pgf@x-.833333\pgf@xa%
+ \advance\pgf@x-.5\pgflinewidth%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ }%
+ }%
+ \anchorborder{%
+ \pgf@lib@gates@not@buffer@border{buffer gate US}
+ }%
+}%
+
+
+
+
+
+\pgfdeclareshape{and gate CDH}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@and gate CDH\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@and gate CDH@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@and gate CDH@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{An and gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \csname pgf@anchor@and gate CDH@east\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{mid west}{%
+ \csname pgf@anchor@and gate CDH@west\endcsname%
+ \pgf@xa\pgf@x%
+ \midpoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \csname pgf@anchor@and gate CDH@east\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \anchor{base west}{%
+ \csname pgf@anchor@and gate CDH@west\endcsname%
+ \pgf@xa\pgf@x%
+ \basepoint%
+ \pgf@x\pgf@xa}%
+ \anchor{east}{%
+ \dimensions%
+ \pgfpointadd{\centerpoint}{\tipanchor}%
+ }%
+ \anchor{output}{\csname pgf@anchor@and gate CDH@east\endcsname}%
+ \anchor{north east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\halfheight%
+ \else%
+ \centerpoint%
+ \pgf@xa\halfwidth%
+ \pgf@ya\halfheight%
+ \pgf@xb\halfside%
+ \advance\pgf@x-.166666\pgf@xb%
+ \advance\pgf@xa\pgf@xb%
+ \advance\pgf@x.5\pgf@xa%
+ \advance\pgf@y-\pgf@xb%
+ \advance\pgf@ya\pgf@xb%
+ \advance\pgf@y.866025\pgf@ya%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \dimensions%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \tipanchor%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y-\halfheight%
+ \else
+ \centerpoint%
+ \pgf@xa\halfwidth%
+ \pgf@ya\halfheight%
+ \pgf@xb\halfside%
+ \advance\pgf@x-.166666\pgf@xb%
+ \advance\pgf@xa\pgf@xb%
+ \advance\pgf@x.5\pgf@xa%
+ \advance\pgf@y\pgf@xb%
+ \advance\pgf@ya\pgf@xb%
+ \advance\pgf@y-.866025\pgf@ya%
+ \fi%
+ }%
+ \anchor{north}{%
+ \dimensions%
+ \centerpoint%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@y\halfheight%
+ \else%
+ \pgf@ya\halfheight%
+ \advance\pgf@y.993043\pgf@ya%
+ \fi%
+ }%
+ \anchor{south}{%
+ \dimensions%
+ \centerpoint%
+ \ifpgfgateanchorsuseboundingrectangle%
+ \advance\pgf@y-\halfheight%
+ \else%
+ \pgf@ya\halfheight%
+ \advance\pgf@y-.993043\pgf@ya%
+ \fi%
+ }%
+ \anchor{south west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@y-\halfheight%
+ }%
+ \anchor{north west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ \advance\pgf@y\halfheight%
+ }%
+ \anchor{west}{%
+ \dimensions%
+ \centerpoint%
+ \pgf@xa\halfside%
+ \advance\pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-\outerxsep%
+ }%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
+ \pgfpathclose%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@xa\halfside%
+ \pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-.5\pgflinewidth%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \dimensions%
+ \pgf@xb\halfside%
+ %
+ \pgf@xb-.166666\pgf@xb%
+ \ifdim\pgf@xa<\pgf@xb%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderrectangle{\externalpoint}{%
+ \pgf@xc\halfside%
+ \pgf@xc.166666\pgf@xc%
+ \advance\pgf@xc\halfwidth%
+ \pgfqpoint{\pgf@xc}{\halfheight}%
+ }%
+ }%
+ \else%
+ \ifdim\pgf@y=0pt\relax%
+ \csname pgf@anchor@and gate CDH@east\endcsname%
+ \else%
+ \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
+ \pgf@xc\halfwidth%
+ \advance\pgf@xc\halfside%
+ \pgf@yc\halfheight%
+ \advance\pgf@yc\halfside%
+ \ifdim\pgf@ya<0pt%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@y\halfside%
+ \advance\pgf@x\pgf@xb%
+ }%
+ {270}{330}{+\pgf@yc}%
+ \else%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \advance\pgf@y-\halfside%
+ \advance\pgf@x\pgf@xb%
+ }%
+ {30}{90}{+\pgf@xc and +\pgf@yc}%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+\pgfdeclareshape{nand gate CDH}{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nand gate CDH\endcsname{%
+ \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@nand gate CDH@input \pgfmathcounter}{%
+ \expandafter\xdef\csname pgf@anchor@nand gate CDH@input \pgfmathcounter\endcsname{%
+ \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
+ }%
+ }{}%
+ \repeatpgfmathloop%
+ \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
+ \pgferror{A nand gate must have at least two inputs}%
+ \fi%
+ }%
+ \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
+ \saveddimen\invertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ }%
+ \saveddimen\outerinvertedradius{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
+ \advance\pgf@x.5\pgflinewidth%
+ }%
+ \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \inheritanchor[from=and gate CDH]{mid east}%
+ \inheritanchor[from=and gate CDH]{mid west}%
+ \anchor{base}{\basepoint}%%
+ \inheritanchor[from=and gate CDH]{base east}%
+ \inheritanchor[from=and gate CDH]{base west}%
+ \anchor{output}{%
+ \dimensions
+ \pgfpointadd{\centerpoint}{%
+ \pgf@xa\halfside%
+ \pgf@x-.166666\pgf@xa%
+ \pgf@xb2.0\pgf@xa%
+ \advance\pgf@x.866025\pgf@xb%
+ \advance\pgf@x\invertedradius%
+ \advance\pgf@x\outerinvertedradius%
+ \advance\pgf@x\outerxsep%
+ \pgf@y0pt%
+ }%
+ }%
+ \inheritanchor[from=and gate CDH]{east}%
+ \inheritanchor[from=and gate CDH]{north east}%
+ \inheritanchor[from=and gate CDH]{south east}%
+ \inheritanchor[from=and gate CDH]{north}%
+ \inheritanchor[from=and gate CDH]{south}%
+ \inheritanchor[from=and gate CDH]{south west}%
+ \inheritanchor[from=and gate CDH]{north west}%
+ \inheritanchor[from=and gate CDH]{west}%
+ \backgroundpath{%
+ \dimensions%
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ \advance\pgf@xc-\outerxsep%
+ \advance\pgf@yc-\outerysep%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ {%
+ \pgf@yc2.0\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
+ }%
+ \pgf@marshal%
+ }
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
+ \pgfpathclose%
+ %
+ % Draw the output inverter.
+ %
+ {%
+ \pgfpathcircle{%
+ \pgf@x-.166666\pgf@xc%
+ \pgf@yc2.0\pgf@yc%
+ \advance\pgf@x.866025\pgf@yc%
+ \advance\pgf@x\outerinvertedradius%
+ \pgf@y0pt%
+ }{+\invertedradius}%
+ }%
+ %
+ % Draw the inputs.
+ %
+ \pgfutil@tempdima2.0\pgf@yc%
+ \c@pgf@counta\numinputs%
+ \advance\c@pgf@counta1\relax%
+ \divide\pgfutil@tempdima\c@pgf@counta%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\numinputs%
+ \else%
+ \advance\pgf@yc-\pgfutil@tempdima%
+ \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
+ {%
+ \pgfpathcircle{%
+ \pgf@xa\halfside%
+ \pgf@x-1.16666\pgf@xa%
+ \advance\pgf@x-.5\pgflinewidth%
+ \advance\pgf@x-\invertedradius%
+ \pgf@y\pgf@yc%
+ }{+\invertedradius}%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ }%
+ \inheritanchorborder[from=and gate CDH]%
+}%
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.code.tex
new file mode 100644
index 0000000000..68005a6147
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.gates.logic.code.tex
@@ -0,0 +1,103 @@
+% Copyright 2008 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.
+
+
+% Common keys for all logic gates.
+%
+\pgfkeys{/pgf/.cd,%
+ logic gate input sep/.initial=0.125cm,
+ logic gate inputs/.initial={normal,normal},%
+ logic gate inverted radius/.initial=2pt,
+}%
+
+
+% Internal macro for parsing inputs.
+%
+\expandafter\ifx\csname pgf@lib@sh@logicgate@parseinputs\endcsname\relax%
+\def\pgf@lib@sh@logicgate@parseinputs#1{%
+ \edef\pgf@lib@sh@temp{\pgfkeysvalueof{/pgf/logic gate inputs}}%
+ \c@pgf@counta#1\relax%
+ \c@pgf@countb0\relax%
+ \expandafter\pgfutil@in@\expandafter,\expandafter{\pgf@lib@sh@temp}%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@next\pgf@lib@sh@logicgate@parseinputs@long%
+ \else%
+ \let\pgf@lib@sh@next\pgf@lib@sh@logicgate@parseinputs@short%
+ \fi%
+ \pgf@lib@sh@next%
+}%
+\def\pgf@lib@sh@itext{i}%
+\def\pgf@lib@sh@invertedtext{inverted}%
+\def\pgf@lib@sh@atchar{@}%
+\def\pgf@lib@sh@gobbletilat#1@{}%
+\def\pgf@lib@sh@gobbletilatcomma#1@,{}%
+%
+% The `short' version for input specification is an extension of
+% ideas due to Juergen Werber and Christoph Bartoschek.
+%
+\def\pgf@lib@sh@logicgate@parseinputs@short{%
+ \expandafter\pgf@lib@sh@logicgate@parseinputs@@short\pgf@lib@sh@temp @%
+}%
+\def\pgf@lib@sh@logicgate@parseinputs@@short#1{%
+ \def\pgf@lib@sh@tmp{#1}%
+ \ifx\pgf@lib@sh@tmp\pgf@lib@sh@atchar%
+ \edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
+ \let\pgf@lib@sh@next=\relax%
+ \else%
+ \ifnum\c@pgf@countb=\c@pgf@counta%
+ \edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
+ \let\pgf@lib@sh@next=\pgf@lib@sh@gobbletilat%
+ \else%
+ \advance\c@pgf@countb by1\relax%
+ \expandafter\ifx\pgf@lib@sh@itext#1%
+ \expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
+ \expandafter\def\csname input-\the\c@pgf@countb\endcsname{i}}%
+ \else%
+ \expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
+ \expandafter\def\csname input-\the\c@pgf@countb\endcsname{n}}%
+ \fi%
+ \let\pgf@lib@sh@next=\pgf@lib@sh@logicgate@parseinputs@@short%
+ \fi%
+ \fi%
+ \pgf@lib@sh@next%
+}%
+
+
+\def\pgf@lib@sh@logicgate@parseinputs@long{%
+ \expandafter\pgf@lib@sh@logicgate@parseinputs@@long\pgf@lib@sh@temp,@,%
+}%
+\def\pgf@lib@sh@logicgate@parseinputs@@long#1,{%
+ \def\pgf@lib@sh@tmp{#1}%
+ \ifx\pgf@lib@sh@tmp\pgf@lib@sh@atchar%
+ \edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
+ \let\pgf@lib@sh@next=\relax%
+ \else%
+ \ifnum\c@pgf@countb=\c@pgf@counta%
+ \edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
+ \let\pgf@lib@sh@next=\pgf@lib@sh@gobbletilatcomma%
+ \else%
+ \advance\c@pgf@countb by1\relax%
+ \def\pgf@lib@sh@temp{#1}%
+ \ifx\pgf@lib@sh@invertedtext\pgf@lib@sh@temp%
+ \expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
+ \expandafter\def\csname input-\the\c@pgf@countb\endcsname{i}}%
+ \else%
+ \expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
+ \expandafter\def\csname input-\the\c@pgf@countb\endcsname{n}}%
+ \fi%
+ \let\pgf@lib@sh@next=\pgf@lib@sh@logicgate@parseinputs@@@long%
+ \fi%
+ \fi%
+ \pgf@lib@sh@next%
+}%
+\def\pgf@lib@sh@logicgate@parseinputs@@@long{%
+ \pgfutil@ifnextchar x{\pgf@lib@sh@logicgate@parseinputs@@long}%
+ {\pgf@lib@sh@logicgate@parseinputs@@long}%
+}%
+\fi%
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.geometric.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.geometric.code.tex
new file mode 100644
index 0000000000..08ef867ff0
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.geometric.code.tex
@@ -0,0 +1,4417 @@
+% Copyright 2006 by Till Tantau and 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.
+
+\ProvidesFileRCS{pgflibraryshapes.geometric.code.tex}
+
+\pgfdeclareshape{ellipse}
+%
+% Draws a circle around the text
+%
+{%
+ \savedanchor\centerpoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgf@y=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\radius{%
+ %
+ % Calculate ``height radius''
+ %
+ \pgf@y=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by.5\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y by\pgf@yb%
+ %
+ % Calculate ``width radius''
+ %
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x by\pgf@xb%
+ %
+ % Adjust
+ %
+ \pgf@x=1.4142136\pgf@x%
+ \pgf@y=1.4142136\pgf@y%
+ %
+ % Adjust height, if necessary
+ %
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@yc%
+ \pgf@y=.5\pgf@yc%
+ \fi%
+ %
+ % Adjust width, if necessary
+ %
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<.5\pgf@xc%
+ \pgf@x=.5\pgf@xc%
+ \fi%
+ %
+ % Add outer sep
+ %
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \advance\pgf@x by\pgf@xb%
+ \advance\pgf@y by\pgf@yb%
+ }%
+
+ %
+ % Anchors
+ %
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base}{\centerpoint\pgf@y=0pt}%
+ \anchor{north}
+ {
+ \pgf@process{\radius}
+ \pgf@ya=\pgf@y%
+ \pgf@process{\centerpoint}
+ \advance\pgf@y by\pgf@ya
+ }%
+ \anchor{south}
+ {
+ \pgf@process{\radius}
+ \pgf@ya=\pgf@y%
+ \pgf@process{\centerpoint}
+ \advance\pgf@y by-\pgf@ya
+ }%
+ \anchor{west}
+ {
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by-\pgf@xa
+ }%
+ \anchor{mid west}
+ {%
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by-\pgf@xa%
+ \pgfmathsetlength\pgf@y{.5ex}
+ }%
+ \anchor{base west}
+ {%
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by-\pgf@xa%
+ \pgf@y=0pt
+ }%
+ \anchor{north west}
+ {
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by-0.707107\pgf@xa
+ \advance\pgf@y by0.707107\pgf@ya
+ }%
+ \anchor{south west}
+ {
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by-0.707107\pgf@xa
+ \advance\pgf@y by-0.707107\pgf@ya
+ }%
+ \anchor{east}
+ {%
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by\pgf@xa
+ }%
+ \anchor{mid east}
+ {%
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by\pgf@xa%
+ \pgfmathsetlength\pgf@y{.5ex}
+ }%
+ \anchor{base east}
+ {%
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by\pgf@xa%
+ \pgf@y=0pt
+ }%
+ \anchor{north east}
+ {
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by0.707107\pgf@xa
+ \advance\pgf@y by0.707107\pgf@ya
+ }%
+ \anchor{south east}
+ {
+ \pgf@process{\radius}
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\centerpoint}
+ \advance\pgf@x by0.707107\pgf@xa
+ \advance\pgf@y by-0.707107\pgf@ya
+ }%
+ \anchorborder{
+ \edef\pgf@marshal{%
+ \noexpand\pgfpointborderellipse
+ {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ {\noexpand\radius}%
+ }%
+ \pgf@marshal%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \centerpoint%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ }%
+
+ %
+ % Background path
+ %
+ \backgroundpath
+ {
+ \pgf@process{\radius}%
+ \pgfutil@tempdima=\pgf@x%
+ \pgfutil@tempdimb=\pgf@y%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \advance\pgfutil@tempdimb by-\pgf@yb%
+ \pgfpathellipse{\centerpoint}{\pgfqpoint{\pgfutil@tempdima}{0pt}}{\pgfqpoint{0pt}{\pgfutil@tempdimb}}%
+ }%
+}%
+
+
+
+
+% Set the recommended shape aspect ratio
+%
+% #1 = aspect ratio
+%
+% Example:
+%
+% \pgfsetshapeaspect{1.5}
+
+% Keys for shape aspect ratio.
+%
+% /pgf/aspect : recommended width/height quotient.
+%
+\pgfkeys{/pgf/.cd,
+ aspect/.code={\pgfsetshapeaspect{#1}},% this for tikz...
+ shape aspect/.initial=1,% but this is consistent with other pgfset stuff.
+ shape aspect/.code={%
+ \pgfkeys{/pgf/aspect=#1}%
+ \pgfkeyssetvalue{/pgf/shape aspect}{#1}
+ }%
+}%
+
+
+\def\pgfsetshapeaspect#1{%
+ \def\pgfshapeaspect{#1}%
+ % Invert
+ \pgfutil@tempdima=#1pt%
+ \pgfutil@tempdima=.125\pgfutil@tempdima%
+ \c@pgf@counta=\pgfutil@tempdima\relax% 8192*determinant
+ \pgfutil@tempdima=8192pt%
+ \divide\pgfutil@tempdima by\c@pgf@counta%
+ \edef\pgfshapeaspectinverse{\pgf@sys@tonumber{\pgfutil@tempdima}}%
+}%
+
+\pgfsetshapeaspect{1}%
+
+\pgfdeclareshape{diamond}
+{%
+ \savedanchor\outernortheast{%
+ %
+ % Calculate width and height of the inner rectangle
+ %
+ \pgf@xa=.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa by\pgf@xc%
+ \pgf@ya=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya by.5\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya by\pgf@yc%
+ %
+ % Calculate width and height of diamond
+ %
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by\pgfshapeaspect\pgf@ya%
+ \pgf@y=\pgfshapeaspectinverse\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ %
+ % Check against minimum height/width
+ %
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@xb=.5\pgf@xb%
+ \ifdim\pgf@x<\pgf@xb%
+ % yes, too small. Enlarge...
+ \pgf@x=\pgf@xb%
+ \fi%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@yb=.5\pgf@yb%
+ \ifdim\pgf@y<\pgf@yb%
+ % yes, too small. Enlarge...
+ \pgf@y=\pgf@yb%
+ \fi%
+ %
+ % Add outer border
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \advance\pgf@x by\pgf@xa%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \advance\pgf@y by\pgf@ya%
+ }%
+ \savedanchor\text{%
+ \pgf@x=-.5\wd\pgfnodeparttextbox%
+ \pgf@y=-.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by.5\dp\pgfnodeparttextbox%
+ }%
+
+ %
+ % Anchors
+ %
+ \anchor{text}{\text}%
+ \anchor{center}{\pgfpointorigin}%
+ \anchor{mid}{%
+ \pgf@process{\text}%
+ \pgf@x=0pt%
+ \pgfmathsetlength\pgf@ya{.5ex}%
+ \advance\pgf@y by\pgf@ya%
+ }%
+ \anchor{base}{\pgf@process{\text}\pgf@x=0pt}%
+ \anchor{north}{\pgf@process{\outernortheast}\pgf@x=0pt}%
+ \anchor{south}{\pgf@process{\outernortheast}\pgf@x=0pt\pgf@y=-\pgf@y}%
+ \anchor{west}{\pgf@process{\outernortheast}\pgf@x=-\pgf@x\pgf@y=0pt}%
+ \anchor{north west}{\pgf@process{\outernortheast}\pgf@x=-.5\pgf@x\pgf@y=.5\pgf@y}%
+ \anchor{south west}{\pgf@process{\outernortheast}\pgf@x=-.5\pgf@x\pgf@y=-.5\pgf@y}%
+ \anchor{east}{\pgf@process{\outernortheast}\pgf@y=0pt}%
+ \anchor{north east}{\pgf@process{\outernortheast}\pgf@x=.5\pgf@x\pgf@y=.5\pgf@y}%
+ \anchor{south east}{\pgf@process{\outernortheast}\pgf@x=.5\pgf@x\pgf@y=-.5\pgf@y}%
+ \anchorborder{%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\outernortheast}%
+ \ifdim\pgf@xa>0pt%
+ \else%
+ \pgf@x=-\pgf@x%
+ \fi%
+ \ifdim\pgf@ya>0pt%
+ \else%
+ \pgf@y=-\pgf@y%
+ \fi%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpointintersectionoflines
+ {\noexpand\pgfpointorigin}
+ {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}
+ {\noexpand\pgfqpoint{\the\pgf@x}{0pt}}
+ {\noexpand\pgfqpoint{0pt}{\the\pgf@y}}%
+ }%
+ \pgf@process{\pgf@marshal}%
+ }%
+
+ %
+ % Background path
+ %
+ \backgroundpath{
+ \pgf@process{\outernortheast}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \advance\pgf@xc by-1.414213\pgf@xa%
+ \advance\pgf@yc by-1.414213\pgf@ya%
+ \pgfpathmoveto{\pgfqpoint{\pgf@xc}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{\pgf@yc}}%
+ \pgfpathlineto{\pgfqpoint{-\pgf@xc}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{0pt}{-\pgf@yc}}%
+ \pgfpathclose%
+ }%
+}%
+
+
+
+
+
+
+\newif\ifpgf@lib@shapes@starouterradiususesratio
+\pgf@lib@shapes@starouterradiususesratiotrue
+
+% Keys for star shape
+%
+% /pgf/star points : Number of points on the star.
+% /pgf/star point height : The height of the outer star points.
+% /pgf/star point ratio : The ratio of the outer point and inner point radii.
+
+\pgfkeys{/pgf/.cd,
+ star points/.initial=5,
+ star point height/.initial=.5cm,
+ star point height/.code={%
+ \def\pgf@lib@temp{#1}%
+ \pgfkeyslet{/pgf/star point height}{\pgf@lib@temp}%
+ \pgf@lib@shapes@starouterradiususesratiofalse%
+ },
+ star point ratio/.initial=1.5,
+ star point ratio/.code={%
+ \def\pgf@lib@temp{#1}%
+ \pgfkeyslet{/pgf/star point ratio}{\pgf@lib@temp}%
+ \pgf@lib@shapes@starouterradiususesratiotrue%
+ },%
+ star rotate/.style={/pgf/shape border rotate=#1},% For compatibility with 1.18
+}%
+
+
+% Shape star.
+%
+\pgfdeclareshape{star}{%
+ \savedmacro\totalstarpoints{%
+ \pgfmathsetcounter{pgf@counta}{\pgfkeysvalueof{/pgf/star points}}%
+ \multiply\c@pgf@counta2\relax%
+ \edef\totalstarpoints{\the\c@pgf@counta}%
+ }%
+ \savedmacro\anglestep{%
+ \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/star points}}%
+ \let\anglestep\pgfmathresult%
+ }%
+ \savedmacro\calculateradii{%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ %
+ % Calculate the incircle radius.
+ %
+ \pgf@x1.41421\pgf@x%
+ \edef\innerradius{\the\pgf@x}%
+ %
+ % Calculate the circumcircle radius.
+ %
+ % Use the star point height or the star point ratio?
+ %
+ \ifpgf@lib@shapes@starouterradiususesratio%
+ \pgfmathparse{\pgfkeysvalueof{/pgf/star point ratio}}%
+ \expandafter\pgf@x\pgfmathresult\pgf@x%
+ \else%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/star point height}}%
+ \fi%
+ \pgf@xc\pgf@x%
+ %
+ % Accommodate the larger of the minimum height/width.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@ya>\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \fi%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \edef\outerradius{\the\pgf@x}%
+ %
+ % If the outer radius has been enlarged, adjust the inner radius...
+ %
+ \ifdim\pgf@x>\pgf@xc%
+ %
+ % ...using the star point ratio, or...
+ %
+ \ifpgf@lib@shapes@starouterradiususesratio%
+ \pgfmathreciprocal{\pgfkeysvalueof{/pgf/star point ratio}}%
+ \pgf@xa\pgfmathresult\pgf@x\relax%
+ \edef\innerradius{\the\pgf@xa}%
+ \else%
+ %
+ % The star point height.
+ %
+ \pgf@xa\pgf@x\relax%
+ \pgfmathaddtolength\pgf@xa{-\pgfkeysvalueof{/pgf/star point height}}%
+ \edef\innerradius{\the\pgf@xa}%
+ \fi%
+ \fi%
+ \edef\outerradius{\the\pgf@x}%
+ %
+ % Now calculate the anchor radii from the outer sep.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@ya>\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \fi
+ %
+ % Take into account the miter length...
+ %
+ \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/star points}}%
+ \let\angletofirstpoint\pgfmathresult%
+ \pgfmathmultiply@{\angletofirstpoint}{2}%
+ \let\angletosecondpoint\pgfmathresult%
+ %
+ % ...for the outer radius...
+ %
+ \pgfmathanglebetweenlines%
+ {\pgfqpointpolar{\angletofirstpoint}{\outerradius}}%
+ {\pgfqpointpolar{\angletosecondpoint}{\innerradius}}%
+ {\pgfqpointpolar{\angletofirstpoint}{\outerradius}}%
+ {\pgfqpointpolar{0}{\innerradius}}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\outerradius\relax%
+ \advance\pgf@x\pgfmathresult\pgf@xa%
+ \edef\anchorouterradius{\the\pgf@x}%
+ %
+ % ...and for the inner radius.
+ %
+ \pgfmathanglebetweenlines%
+ {\pgfqpointpolar{\angletofirstpoint}{\innerradius}}%
+ {\pgfqpointpolar{0}{\outerradius}}%
+ {\pgfqpointpolar{\angletofirstpoint}{\innerradius}}%
+ {\pgfqpointpolar{\angletosecondpoint}{\outerradius}}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\innerradius\relax%
+ \advance\pgf@x\pgfmathresult\pgf@xa%
+ \edef\anchorinnerradius{\the\pgf@x}%
+ %
+ % Save all radii.
+ %
+ \addtosavedmacro{\innerradius}%
+ \addtosavedmacro{\outerradius}%
+ \addtosavedmacro{\anchorinnerradius}%
+ \addtosavedmacro{\anchorouterradius}%
+ }%
+ \savedmacro\startangle{%
+ \pgfmathadd{90}{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \let\startangle\pgfmathresult%
+ }%
+ %
+ % Saved anchors.
+ %
+ \savedanchor{\centerpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor{\midpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ %
+ % Other anchors.
+ %
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base}{\centerpoint\pgf@y=0pt}%
+ \anchor{north}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{0pt}{\anchorouterradius}}}%
+ \anchor{south}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{0pt}{-\anchorouterradius}}}%
+ \anchor{east}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{0pt}}}%
+ \anchor{west}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{0pt}}}%
+ \anchor{north east}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{\anchorouterradius}}}%
+ \anchor{north west}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{\anchorouterradius}}}%
+ \anchor{south east}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{-\anchorouterradius}}}%
+ \anchor{south west}{%
+ \calculateradii%
+ \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{-\anchorouterradius}}}%
+ %
+ % Background path.
+ %
+ \backgroundpath{%
+ \calculateradii%
+ \let\angle\startangle%
+ \pgfpathmoveto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\startangle}{\outerradius}}}%
+ \pgfmathloop%
+ \pgfmathadd@{\angle}{\anglestep}%
+ \let\angle\pgfmathresult%
+ \ifnum\pgfmathcounter=\totalstarpoints%
+ \pgfpathclose%
+ \else%
+ \ifodd\pgfmathcounter
+ \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\innerradius}}}%
+ \else%
+ \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\outerradius}}}%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ %
+ % Define points on the anchor border.
+ %
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external
+ % point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ %
+ % Locate the appropriate sides on the star border...
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\startangle}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \pgfmathdivide@{\pgfmathresult}{\anglestep}%
+ \pgfmathfloor@{\pgfmathresult}%
+ \afterassignment\pgfmath@gobbletilpgfmath@
+ \c@pgf@counta\pgfmathresult\relax\pgfmath@
+ \pgfmathmultiply@{\pgfmathresult}{\anglestep}%
+ \pgfmathadd@{\pgfmathresult}{\startangle}%
+ \let\firstangle\pgfmathresult%
+ \pgfmathadd@{\pgfmathresult}{\anglestep}%
+ \let\secondangle\pgfmathresult%
+ \calculateradii%
+ %
+ % ...and thus, the point on the star border.
+ %
+ \ifodd\c@pgf@counta
+ \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}%
+ {%
+ \pgfpointadd{\centerpoint}%
+ {\pgfqpointpolar{+\firstangle}{+\anchorinnerradius}}%
+ }%
+ {%
+ \pgfpointadd{\centerpoint}%
+ {\pgfqpointpolar{+\secondangle}{+\anchorouterradius}}%
+ }%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}%
+ {%
+ \pgfpointadd{\centerpoint}%
+ {\pgfqpointpolar{+\firstangle}{+\anchorouterradius}}%
+ }%
+ {%
+ \pgfpointadd{\centerpoint}%
+ {\pgfqpointpolar{+\secondangle}{+\anchorinnerradius}}%
+ }%
+ \fi%
+ }%
+ %
+ % Some hackery. This is needed if a star is positioned using
+ % a `...point <n+1>' anchor, where n is the maximum number of
+ % points of any previously drawn star.
+ %
+ \pgfutil@g@addto@macro\pgf@sh@s@star{%
+ \c@pgf@counta\totalstarpoints\relax%
+ \divide\c@pgf@counta2\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \c@pgf@countb\c@pgf@counta\relax%
+ \advance\c@pgf@countb-1\relax%
+ \pgfutil@ifundefined{pgf@anchor@star@inner point\space\the\c@pgf@counta}{%
+ \expandafter\xdef\csname pgf@anchor@star@inner point\space\the\c@pgf@counta\endcsname{%
+ \noexpand\calculateradii%
+ \noexpand\pgfmathmultiply@{\the\c@pgf@countb}{\noexpand\anglestep}%
+ \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{2}%
+ \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\anglestep}%
+ \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}%
+ \noexpand\let\noexpand\angle\noexpand\pgfmathresult%
+ \noexpand\pgfpointadd{\noexpand\centerpoint}%
+ {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorinnerradius}}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@star@outer point\space\the\c@pgf@counta\endcsname{%
+ \noexpand\calculateradii%
+ \noexpand\pgfmathmultiply@{\the\c@pgf@countb}{\noexpand\anglestep}%
+ \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{2}%
+ \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}%
+ \noexpand\let\noexpand\angle\noexpand\pgfmathresult%
+ \noexpand\pgfpointadd{\noexpand\centerpoint}%
+ {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorouterradius}}%
+ }%
+ }{\c@pgf@counta0\relax}%
+ \advance\c@pgf@counta-1\relax%
+ \repeatpgfmathloop%
+ }%
+}%
+
+
+
+
+% Keys for shape regular polygon
+%
+% /pgf/regular polygon sides
+%
+\pgfkeys{/pgf/.cd,
+ regular polygon sides/.initial=5,
+ regular polygon rotate/.style={/pgf/shape border rotate=#1}% For compatibility with 1.18
+}%
+
+
+% Shape Regular Polygon.
+%
+\pgfdeclareshape{regular polygon}{%
+ \savedmacro\sides{%
+ \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}%
+ }%
+ \savedmacro\anglestep{%
+ \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/regular polygon sides}}%
+ \let\anglestep\pgfmathresult%
+ }%
+ \savedmacro\calculateradii{%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ %
+ % Calculate i, the incircle radius
+ %
+ \pgf@x1.41421\pgf@x%
+ %
+ % Calculate r, the polygon radius
+ %
+ % r = i / cos(360 / s / 2)
+ %
+ % (s = polygon sides)
+ %
+ \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/regular polygon sides}}%
+ \pgfmathsec@{\pgfmathresult}%
+ \pgf@x\pgfmathresult\pgf@x%
+ %
+ % Accommodate the minimum width/height.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@ya>\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \fi%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \edef\radius{\the\pgf@x}%
+ %
+ % Now calculate the anchor radius from the outer sep.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@ya>\pgf@xa%
+ \pgf@xa\pgf@ya%
+ \fi
+ %
+ % Take into account the miter length.
+ %
+ % m = o / sin (90 - (360 / s / 2))
+ %
+ % (o = outer sep, s = sides)
+ %
+ \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/regular polygon sides}}%
+ \pgfmathsubtract@{90}{\pgfmathresult}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \advance\pgf@x\pgfmathresult\pgf@xa%
+ \edef\anchorradius{\the\pgf@x}%
+ %
+ % Save both radii.
+ %
+ \addtosavedmacro{\radius}%
+ \addtosavedmacro{\anchorradius}%
+ }%
+ \savedmacro\startangle{%
+ \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/regular polygon sides}}%
+ \let\anglestep\pgfmathresult%
+ \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}%
+ \expandafter\ifodd\sides\relax%
+ \edef\pgfmathresult{90}%
+ \else%
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathsubtract@{90}{\pgfmathresult}%
+ \fi%
+ \pgfmathadd{\pgfmathresult}{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \let\startangle\pgfmathresult%
+ }%
+ %
+ % Saved anchors.
+ %
+ \savedanchor{\centerpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor{\midpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ % Other anchors.
+ %
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{base}{\centerpoint\pgf@y=0pt}%
+ \anchor{north}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{0pt}{\anchorradius}}}%
+ \anchor{south}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{0pt}{-\anchorradius}}}%
+ \anchor{east}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{0pt}}}%
+ \anchor{west}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{0pt}}}%
+ \anchor{north east}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{\anchorradius}}}%
+ \anchor{north west}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{\anchorradius}}}%
+ \anchor{south east}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{-\anchorradius}}}%
+ \anchor{south west}{%
+ \calculateradii%
+ \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{-\anchorradius}}}%
+ %
+ % Background path.
+ %
+ \backgroundpath{%
+ \calculateradii%
+ \pgfpathmoveto{%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{\startangle}{\radius}}%
+ }%
+ \let\angle\startangle%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter=\sides\relax%
+ \pgfpathclose%
+ \else%
+ \pgfmathadd@{\angle}{\anglestep}%
+ \let\angle\pgfmathresult%
+ \pgfpathlineto{%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\radius}}%
+ }%
+ \repeatpgfmathloop%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external
+ % point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ %
+ % Locate the appropriate sides on the polygon border...
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\startangle}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \pgfmathdivide@{\pgfmathresult}{\anglestep}%
+ \pgfmathfloor@{\pgfmathresult}%
+ \pgfmathmultiply@{\pgfmathresult}{\anglestep}%
+ \pgfmathadd@{\pgfmathresult}{\startangle}%
+ \let\firstangle\pgfmathresult%
+ \pgfmathadd@{\pgfmathresult}{\anglestep}%
+ \let\secondangle\pgfmathresult%
+ \calculateradii%
+ %
+ % ...and thus, the point on the polygon border.
+ %
+ \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}%
+ {%
+ \pgfpointadd{\centerpoint}%
+ {\pgfqpointpolar{+\firstangle}{+\anchorradius}}%
+ }%
+ {%
+ \pgfpointadd{\centerpoint}%
+ {\pgfqpointpolar{+\secondangle}{+\anchorradius}}%
+ }%
+ }%
+ %
+ % More hackery for when the rectangular polygon is positioned using
+ % a `corner <n+1>' or `side <n+1>' anchor, where n is the maximum
+ % number of sides of any previously drawn regular polygon.
+ %
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@regular polygon\endcsname{%
+ \c@pgf@counta\sides\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \pgfutil@ifundefined{pgf@anchor@regular polygon@corner\space\the\c@pgf@counta}{%
+ %
+ % ...(manually \xdef as \gdef is normally used by \anchor)...
+ %
+ \expandafter\xdef\csname pgf@anchor@regular polygon@corner\space\the\c@pgf@counta\endcsname{%
+ \noexpand\calculateradii%
+ \noexpand\pgfmathsubtract@{\the\c@pgf@counta}{1}%
+ \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{\noexpand\anglestep}%
+ \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}%
+ \noexpand\let\noexpand\angle\noexpand\pgfmathresult%
+ \noexpand\pgfpointadd{\noexpand\centerpoint}%
+ {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorradius}}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@regular polygon@side\space\the\c@pgf@counta\endcsname{%
+ \noexpand\calculateradii%
+ \noexpand\pgfmathsubtract@{\the\c@pgf@counta}{1}%
+ \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{\noexpand\anglestep}%
+ \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}%
+ \noexpand\let\noexpand\firstangle\noexpand\pgfmathresult%
+ \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\anglestep}%
+ \noexpand\let\noexpand\secondangle\noexpand\pgfmathresult%
+ \noexpand\pgfpointlineattime{0.5}%
+ {\noexpand\pgfpointadd{\noexpand\centerpoint}%
+ {\noexpand\pgfqpointpolar{\noexpand\firstangle}{\noexpand\anchorradius}}}%
+ {\noexpand\pgfpointadd{\noexpand\centerpoint}%
+ {\noexpand\pgfqpointpolar{\noexpand\secondangle}{\noexpand\anchorradius}}}%
+ }%
+ }{\c@pgf@counta0\relax}%
+ \advance\c@pgf@counta-1\relax%
+ \repeatpgfmathloop%
+ }%
+}%
+
+
+
+% Keys for shape trapezium
+%
+% /pgf/trapezium left angle : angle of the left side.
+% /pgf/trapezium right angle : angle of the right side.
+
+\pgfkeys{/pgf/.cd,
+ trapezium left angle/.initial=60,
+ trapezium right angle/.initial=60,
+ trapezium angle/.style={
+ /pgf/trapezium left angle=#1,
+ /pgf/trapezium right angle=#1
+ },%
+ trapezium stretches/.is if=pgf@lib@sh@trapeziumstretches,%
+ trapezium stretches body/.is if=pgf@lib@sh@trapeziumstretchesbody,%
+}%
+
+\newif\ifpgf@lib@sh@trapeziumstretchesbody
+\newif\ifpgf@lib@sh@trapeziumstretches
+
+
+% Shape trapezium.
+%
+\pgfdeclareshape{trapezium}{%
+ \savedmacro\installtrapeziumparameters{%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \ifpgfshapeborderusesincircle%
+ %
+ % Get the rotation (no rounding).
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ %
+ % Use the radius of the incircle if required...
+ %
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ \pgf@y\pgf@x%
+ \else%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmathmod{\pgfkeysvalueof{/pgf/trapezium left angle}}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\leftangle\pgfmathresult%
+ \ifdim\leftangle pt=0pt\relax%
+ \def\pgfmathresult{0}%
+ \else%
+ \pgfmathcot@{\leftangle}%
+ \fi%
+ \pgf@xa2\pgf@y%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \pgfmathmod{\pgfkeysvalueof{/pgf/trapezium right angle}}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\rightangle\pgfmathresult%
+ \ifdim\rightangle pt=0pt\relax%
+ \def\pgfmathresult{0}%
+ \else%
+ \pgfmathcot@{\rightangle}%
+ \fi%
+ \pgf@xb2\pgf@y%
+ \pgf@xb\pgfmathresult\pgf@xb%
+ %
+ % Take into account minimum height and width.
+ %
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \ifpgf@lib@sh@trapeziumstretches%
+ \pgf@y.5\pgf@ya%
+ \else%
+ \ifpgf@lib@sh@trapeziumstretchesbody%
+ \pgf@y.5\pgf@ya%
+ \else%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@y}}%
+ \pgf@yb.5\pgf@ya%
+ \pgf@yb\pgfmathresult\pgf@yb%
+ \pgf@y.5\pgf@ya%
+ \pgf@x\pgfmath@tonumber{\pgf@yb}\pgf@x%
+ \pgf@xa\pgfmath@tonumber{\pgf@yb}\pgf@xa%
+ \pgf@xb\pgfmath@tonumber{\pgf@yb}\pgf@xb%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@xc2\pgf@x%
+ \ifdim\pgf@xa<0pt\relax%
+ \advance\pgf@xc-\pgf@xa%
+ \else%
+ \advance\pgf@xc\pgf@xa%
+ \fi%
+ \ifdim\pgf@xb<0pt\relax%
+ \advance\pgf@xc-\pgf@xb%
+ \else%
+ \advance\pgf@xc\pgf@xb%
+ \fi%
+ \ifdim\pgf@xc<\pgf@ya%
+ \ifpgf@lib@sh@trapeziumstretchesbody%
+ \pgf@xc-\pgf@xc%
+ \advance\pgf@xc\pgf@ya%
+ \advance\pgf@x.5\pgf@xc%
+ \else%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xc}}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ \pgf@x\pgfmath@tonumber{\pgf@ya}\pgf@x%
+ \pgf@xa\pgfmath@tonumber{\pgf@ya}\pgf@xa%
+ \pgf@xb\pgfmath@tonumber{\pgf@ya}\pgf@xb%
+ \ifpgf@lib@sh@trapeziumstretches%
+ \else%
+ \pgf@y\pgfmath@tonumber{\pgf@ya}\pgf@y%
+ \fi%
+ \fi%
+ \fi%
+ \edef\halfheight{\the\pgf@y}%
+ \edef\halfwidth{\the\pgf@x}%
+ \edef\leftextension{\the\pgf@xa}%
+ \edef\rightextension{\the\pgf@xb}%
+ \pgf@xc2\pgf@x%
+ %
+ % Take the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % The \externalradius is a length that is
+ % guarenteed to produce a point outside the trapezium.
+ %
+ \advance\pgf@xc2.0\pgf@x%
+ \pgf@yc\halfheight\relax%
+ \multiply\pgf@yc2\relax%
+ \advance\pgf@yc2.0\pgf@x%
+ \ifdim\pgf@xc<\pgf@yc%
+ \edef\externalradius{\the\pgf@yc}%
+ \else%
+ \edef\externalradius{\the\pgf@xc}%
+ \fi%
+ %
+ % Calculate the centre base and mid poins of the node.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \pgfextract@process\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \pgfextract@process\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ % Calculate each point on the trapezium (without rotation).
+ %
+ \pgfextract@process\lowerleftpoint{%
+ \centerpoint%
+ \advance\pgf@x-\halfwidth\relax%
+ \ifdim\leftextension>0pt\relax%
+ \advance\pgf@x-\leftextension\relax%
+ \fi%
+ \advance\pgf@y-\halfheight\relax%
+ }%
+ \pgfextract@process\upperleftpoint{%
+ \centerpoint%
+ \advance\pgf@x-\halfwidth\relax%
+ \ifdim\leftextension<0pt\relax%
+ \advance\pgf@x\leftextension\relax%
+ \fi%
+ \advance\pgf@y\halfheight\relax%
+ }%
+ \pgfextract@process\upperrightpoint{%
+ \centerpoint%
+ \advance\pgf@x\halfwidth\relax%
+ \ifdim\rightextension<0pt\relax%
+ \advance\pgf@x-\rightextension\relax%
+ \fi%
+ \advance\pgf@y\halfheight\relax%
+ }%
+ \pgfextract@process\lowerrightpoint{%
+ \centerpoint%
+ \advance\pgf@x\halfwidth\relax%
+ \ifdim\rightextension>0pt\relax%
+ \advance\pgf@x\rightextension\relax%
+ \fi%
+ \advance\pgf@y-\halfheight\relax%
+ }%
+ %
+ % Now calculate the adjustment for the miter length at each corner
+ % of the trapezium. This ensures more accurate anchor positioning
+ % when the line width is particularly thick.
+ %
+ \pgfextract@process\lowerleftmiter{%
+ \pgfmathanglebetweenlines{\lowerleftpoint}{\lowerrightpoint}{\lowerleftpoint}{\upperleftpoint}%
+ \pgfmathmultiply@{\pgfmathresult}{.5}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@x-\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y-\outersep\relax%
+ }%
+ \pgfextract@process\upperleftmiter{%
+ \pgfmathanglebetweenlines{\upperleftpoint}{\lowerleftpoint}{\upperleftpoint}{\upperrightpoint}%
+ \pgfmathmultiply@{\pgfmathresult}{.5}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@x-\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y\outersep\relax%
+ }%
+ \pgfextract@process\upperrightmiter{%
+ \pgfmathanglebetweenlines{\upperrightpoint}{\upperleftpoint}{\upperrightpoint}{\lowerrightpoint}%
+ \pgfmathmultiply@{\pgfmathresult}{.5}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y\outersep\relax%
+ }%
+ \pgfextract@process\lowerrightmiter{%
+ \pgfmathanglebetweenlines{\lowerrightpoint}{\upperrightpoint}{\lowerrightpoint}{\lowerleftpoint}%
+ \pgfmathmultiply@{\pgfmathresult}{.5}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y-\outersep\relax%
+ }%
+ %
+ % Now calculate the corners for determining anchor border
+ % points, by adding the adjustment for the miter length.
+ %
+ \pgfextract@process\lowerleftborderpoint{%
+ \pgfpointadd{\lowerleftpoint}{\lowerleftmiter}%
+ }%
+ \pgfextract@process\upperleftborderpoint{%
+ \pgfpointadd{\upperleftpoint}{\upperleftmiter}%
+ }%
+ \pgfextract@process\upperrightborderpoint{%
+ \pgfpointadd{\upperrightpoint}{\upperrightmiter}%
+ }%
+ \pgfextract@process\lowerrightborderpoint{%
+ \pgfpointadd{\lowerrightpoint}{\lowerrightmiter}%
+ }%
+ %
+ % Calculate the angle from the centerpoint to each corner.
+ % Rotation is not important here (see \anchorborder code).
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\lowerleftborderpoint}%
+ \let\angletolowerleft\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\upperleftborderpoint}%
+ \let\angletoupperleft\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\upperrightborderpoint}%
+ \let\angletoupperright\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\lowerrightborderpoint}%
+ \let\angletolowerright\pgfmathresult%
+ %
+ % Do the same for the *inversely rotated* base point...
+ %
+ \pgfextract@process\rotatedbasepoint{%
+ \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lowerleftborderpoint}%
+ \let\baseangletolowerleft\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\upperleftborderpoint}%
+ \let\baseangletoupperleft\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\upperrightborderpoint}%
+ \let\baseangletoupperright\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lowerrightborderpoint}%
+ \let\baseangletolowerright\pgfmathresult%
+ %
+ % And the *inversely rotated* mid point...
+ %
+ \pgfextract@process\rotatedmidpoint{%
+ \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lowerleftborderpoint}%
+ \let\midangletolowerleft\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\upperleftborderpoint}%
+ \let\midangletoupperleft\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\upperrightborderpoint}%
+ \let\midangletoupperright\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lowerrightborderpoint}%
+ \let\midangletolowerright\pgfmathresult%
+ %
+ % Now rotate the border points around the centerpoint...
+ %
+ \pgfextract@process\lowerleftborderpoint{%
+ \pgfmathrotatepointaround%
+ {\lowerleftborderpoint}%
+ {\centerpoint}%
+ {\rotate}%
+ }%
+ \pgfextract@process\upperleftborderpoint{%
+ \pgfmathrotatepointaround%
+ {\upperleftborderpoint}%
+ {\centerpoint}%
+ {\rotate}%
+ }%
+ \pgfextract@process\upperrightborderpoint{%
+ \pgfmathrotatepointaround%
+ {\upperrightborderpoint}%
+ {\centerpoint}%
+ {\rotate}%
+ }%
+ \pgfextract@process\lowerrightborderpoint{%
+ \pgfmathrotatepointaround%
+ {\lowerrightborderpoint}%
+ {\centerpoint}%
+ {\rotate}%
+ }%
+ %
+ % ...and the points for drawing the border (i.e. no outer sep).
+ %
+ \pgfextract@process\lowerleftpoint{%
+ \pgfmathrotatepointaround{\lowerleftpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\upperleftpoint{%
+ \pgfmathrotatepointaround{\upperleftpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\upperrightpoint{%
+ \pgfmathrotatepointaround{\upperrightpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\lowerrightpoint{%
+ \pgfmathrotatepointaround{\lowerrightpoint}{\centerpoint}{\rotate}%
+ }%
+ %
+ % And finally, save all the relevant stuff.
+ %
+ \addtosavedmacro{\lowerleftpoint}%
+ \addtosavedmacro{\upperleftpoint}%
+ \addtosavedmacro{\upperrightpoint}%
+ \addtosavedmacro{\lowerrightpoint}%
+ %
+ \addtosavedmacro{\lowerleftborderpoint}%
+ \addtosavedmacro{\upperleftborderpoint}%
+ \addtosavedmacro{\upperrightborderpoint}%
+ \addtosavedmacro{\lowerrightborderpoint}%
+ %
+ \addtosavedmacro{\angletolowerleft}%
+ \addtosavedmacro{\angletoupperleft}%
+ \addtosavedmacro{\angletoupperright}%
+ \addtosavedmacro{\angletolowerright}%
+ %
+ \addtosavedmacro{\baseangletolowerleft}%
+ \addtosavedmacro{\baseangletoupperleft}%
+ \addtosavedmacro{\baseangletoupperright}%
+ \addtosavedmacro{\baseangletolowerright}%
+ %
+ \addtosavedmacro{\midangletolowerleft}%
+ \addtosavedmacro{\midangletoupperleft}%
+ \addtosavedmacro{\midangletoupperright}%
+ \addtosavedmacro{\midangletolowerright}%
+ %
+ \addtosavedmacro{\rotate}%
+ \addtosavedmacro{\externalradius}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \installtrapeziumparameters%
+ \let\pgf@trapeziumanchorborderreferencepoint\basepoint%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{base west}{%
+ \installtrapeziumparameters%
+ \let\pgf@trapeziumanchorborderreferencepoint\basepoint%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \installtrapeziumparameters%
+ \let\pgf@trapeziumanchorborderreferencepoint\midpoint%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{mid west}{%
+ \installtrapeziumparameters%
+ \let\pgf@trapeziumanchorborderreferencepoint\midpoint%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north west}{%
+ \installtrapeziumparameters%
+ \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{bottom left corner}{%
+ \installtrapeziumparameters%
+ \lowerleftborderpoint%
+ }%
+ \anchor{top left corner}{%
+ \installtrapeziumparameters%
+ \upperleftborderpoint%
+ }%
+ \anchor{top right corner}{%
+ \installtrapeziumparameters%
+ \upperrightborderpoint%
+ }%
+ \anchor{bottom right corner}{%
+ \installtrapeziumparameters%
+ \lowerrightborderpoint%
+ }%
+ \anchor{left side}{%
+ \installtrapeziumparameters%
+ \pgfpointlineattime{0.5}{\lowerleftborderpoint}{\upperleftborderpoint}%
+ }%
+ \anchor{right side}{%
+ \installtrapeziumparameters%
+ \pgfpointlineattime{0.5}{\lowerrightborderpoint}{\upperrightborderpoint}%
+ }%
+ \anchor{top side}{%
+ \installtrapeziumparameters%
+ \pgfpointlineattime{0.5}{\upperleftborderpoint}{\upperrightborderpoint}%
+ }%
+ \anchor{bottom side}{%
+ \installtrapeziumparameters%
+ \pgfpointlineattime{0.5}{\lowerleftborderpoint}{\lowerrightborderpoint}%
+ }%
+ \backgroundpath{%
+ \installtrapeziumparameters%
+ \pgfpathmoveto{\lowerleftpoint}%
+ \pgfpathlineto{\upperleftpoint}%
+ \pgfpathlineto{\upperrightpoint}%
+ \pgfpathlineto{\lowerrightpoint}%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % This allows anchors base east, base west, mid east and mid west,
+ % to redefine the `center' of the node to correctly calculate the
+ % border points.
+ %
+ \pgfutil@ifundefined{pgf@trapeziumanchorborderreferencepoint}%
+ {\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@trapeziumanchorborderreferencepoint}%
+ %
+ % Adjust the location of the external
+ % point relative to the reference point.
+ %
+ \referencepoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Install the required points and angles.
+ %
+ \installtrapeziumparameters%
+ %
+ % Get the angle of the external point to the \referencepoint.
+ %
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ %
+ % *Subtract* the rotation from the external angle. This is
+ % why the border point angles do not neeed to be rotated.
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ %
+ % Get the relevant angles for the reference point.
+ %
+ \let\externalangle\pgfmathresult%
+ \ifx\referencepoint\basepoint%
+ \let\angletoupperright\baseangletoupperright%
+ \let\angletoupperleft\baseangletoupperleft%
+ \let\angletolowerright\baseangletolowerright%
+ \let\angletolowerleft\baseangletolowerleft%
+ \else%
+ \ifx\referencepoint\midpoint%
+ \let\angletoupperright\midangletoupperright%
+ \let\angletoupperleft\midangletoupperleft%
+ \let\angletolowerright\midangletolowerright%
+ \let\angletolowerleft\midangletolowerleft%
+ \fi\fi%
+ %
+ % Find the line on the border...
+ %
+ \ifdim\externalangle pt<\angletoupperright pt\relax%
+ \let\firstpoint\upperrightborderpoint%
+ \let\secondpoint\lowerrightborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletoupperleft pt\relax%
+ \let\firstpoint\upperleftborderpoint%
+ \let\secondpoint\upperrightborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletolowerleft pt\relax%
+ \let\firstpoint\upperleftborderpoint%
+ \let\secondpoint\lowerleftborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletolowerright pt\relax%
+ \let\firstpoint\lowerleftborderpoint%
+ \let\secondpoint\lowerrightborderpoint%
+ \else%
+ \let\firstpoint\upperrightborderpoint%
+ \let\secondpoint\lowerrightborderpoint%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ %
+ % ...and thus the point on the border.
+ %
+ \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ }%
+}%
+
+
+
+
+% Shape semicircle.
+%
+\pgfdeclareshape{semicircle}{%
+ \savedmacro\installsemicircleparameters{%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x+.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y+.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y+.5\dp\pgfnodeparttextbox%
+ %
+ % Use the radius of the incircle if required...
+ %
+ \ifpgfshapeborderusesincircle%
+ %
+ % Get the rotation (no rounding).
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ \edef\halfheight{\the\pgf@x}%
+ \advance\pgf@x\pgf@x%
+ \else%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ \advance\pgf@y\pgf@y%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgf@x\pgfmathresult pt\relax%
+ \pgf@y.5\pgf@y%
+ \edef\halfheight{\the\pgf@y}%
+ \fi%
+ \edef\defaultradius{\the\pgf@x}%
+ %
+ % Take into account minimum height and width.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<\pgf@ya%
+ \pgf@x\pgf@ya%
+ \fi%
+ \edef\semicircleradius{\the\pgf@x}%
+ %
+ % Find the center/base/mid of the semi circle node.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y+-.5\dp\pgfnodeparttextbox%
+ }%
+ \pgfextract@process\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \pgfextract@process\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \pgfextract@process\semicirclecenterpoint{%
+ \centerpoint%
+ \pgf@ya\semicircleradius\relax%
+ \advance\pgf@ya-\defaultradius\relax%
+ %
+ % The point is adjusted to make the node contents
+ % appear more centered if the node is enlarged to
+ % some minimum size. The factor .4 just seems OK.
+ %
+ \pgf@ya.4\pgf@ya%
+ \advance\pgf@y-\pgf@ya%
+ \pgf@ya\halfheight\relax%
+ \advance\pgf@y-\pgf@ya%
+ }%
+ %
+ % Add the outer sep to the radius here.
+ %
+ \pgf@x\semicircleradius\relax%
+ \advance\pgf@x\outersep\relax%
+ \edef\semicircleradius{\the\pgf@x}%
+ \pgfpointdiff{\centerpoint}{\semicirclecenterpoint}%
+ \ifdim\pgf@y<0pt\pgf@y-\pgf@y\fi%
+ \edef\centerpointdiff{\the\pgf@y}%
+ %
+ % Calculate the start and end points on the border.
+ %
+ \pgfextract@process\arcstartborder{%
+ \semicirclecenterpoint%
+ \advance\pgf@x\semicircleradius\relax%
+ }%
+ \pgfextract@process\arcendborder{%
+ \semicirclecenterpoint%
+ \advance\pgf@x-\semicircleradius\relax%
+ }%
+ %
+ % Calculate the start and end *corner* points on the border.
+ % This is needed to accommodate the outer sep.
+ %
+ \pgfextract@process\arcstartcorner{%
+ \arcstartborder%
+ \advance\pgf@y-\outersep\relax%
+ }%
+ \pgfextract@process\arcendcorner{%
+ \arcendborder%
+ \advance\pgf@y-\outersep\relax%
+ }
+ %
+ % Now calculate all the relevant angles.
+ %
+ % For the center point.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcstartborder}%
+ \let\angletoarcstartborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcendborder}%
+ \let\angletoarcendborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcstartcorner}%
+ \let\angletoarcstartcorner\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcendcorner}%
+ \let\angletoarcendcorner\pgfmathresult%
+ %
+ % For the basepoint (rotated about the center point).
+ %
+ \pgfextract@process\rotatedbasepoint{%
+ \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcstartborder}%
+ \let\baseangletoarcstartborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcendborder}%
+ \let\baseangletoarcendborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcstartcorner}%
+ \let\baseangletoarcstartcorner\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcendcorner}%
+ \let\baseangletoarcendcorner\pgfmathresult%
+ %
+ % For the midpoint (rotated about the center point).
+ %
+ \pgfextract@process\rotatedmidpoint{%
+ \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcstartborder}%
+ \let\midangletoarcstartborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcendborder}%
+ \let\midangletoarcendborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcstartcorner}%
+ \let\midangletoarcstartcorner\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcendcorner}%
+ \let\midangletoarcendcorner\pgfmathresult%
+ %
+ % Now, rotate the semicircle points around the centerpoint.
+ %
+ \pgfextract@process\semicirclecenterpoint{%
+ \pgfmathrotatepointaround{\semicirclecenterpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcstartborder{%
+ \pgfmathrotatepointaround{\arcstartborder}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcendborder{%
+ \pgfmathrotatepointaround{\arcendborder}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcstartcorner{%
+ \pgfmathrotatepointaround{\arcstartcorner}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcendcorner{%
+ \pgfmathrotatepointaround{\arcendcorner}{\centerpoint}{\rotate}%
+ }%
+ %
+ % Calculate the distance between the base point and the (rotated) semicircle center.
+ %
+ \pgfpointdiff{\basepoint}{\semicirclecenterpoint}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \edef\basesemicirclecenterdiff{\pgfmathresult pt}%
+ %
+ % Calculate the distance between the base point and the (rotated) semicircle center.
+ %
+ \pgfpointdiff{\midpoint}{\semicirclecenterpoint}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \edef\midsemicirclecenterdiff{\pgfmathresult pt}%
+ %
+ % And save all the stuff.
+ %
+ \addtosavedmacro{\rotate}%
+ \addtosavedmacro{\outersep}%
+ \addtosavedmacro{\semicircleradius}%
+ %
+ \addtosavedmacro{\arcstartborder}%
+ \addtosavedmacro{\arcendborder}%
+ \addtosavedmacro{\arcstartcorner}%
+ \addtosavedmacro{\arcendcorner}%
+ \addtosavedmacro{\semicirclecenterpoint}%
+ %
+ \addtosavedmacro{\angletoarcstartborder}%
+ \addtosavedmacro{\angletoarcendborder}%
+ \addtosavedmacro{\angletoarcstartcorner}%
+ \addtosavedmacro{\angletoarcendcorner}%
+ %
+ \addtosavedmacro{\centerpointdiff}%
+ \addtosavedmacro{\basesemicirclecenterdiff}%
+ \addtosavedmacro{\midsemicirclecenterdiff}%
+ %
+ \addtosavedmacro{\baseangletoarcstartborder}%
+ \addtosavedmacro{\baseangletoarcendborder}%
+ \addtosavedmacro{\baseangletoarcstartcorner}%
+ \addtosavedmacro{\baseangletoarcendcorner}%
+ %
+ \addtosavedmacro{\midangletoarcstartborder}%
+ \addtosavedmacro{\midangletoarcendborder}%
+ \addtosavedmacro{\midangletoarcstartcorner}%
+ \addtosavedmacro{\midangletoarcendcorner}%
+ }%
+ \savedanchor{\centerpoint}{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{-.5\dp\pgfnodeparttextbox}%
+ }%
+ \savedanchor{\basepoint}{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor{\midpoint}{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{base west}{%
+ \installsemicircleparameters%
+ \let\pgf@semicirclereferencepoint\basepoint%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{-\semicircleradius}{0pt}}%
+ }%
+ \anchor{base east}{%
+ \installsemicircleparameters%
+ \let\pgf@semicirclereferencepoint\basepoint%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{\semicircleradius}{0pt}}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid west}{%
+ \installsemicircleparameters%
+ \let\pgf@semicirclereferencepoint\midpoint%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{-\semicircleradius}{0pt}}%
+ }%
+ \anchor{mid east}{%
+ \installsemicircleparameters%
+ \let\pgf@semicirclereferencepoint\midpoint%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{\semicircleradius}{0pt}}%
+ }%
+ \anchor{apex}{%
+ \installsemicircleparameters%
+ \pgfmathadd@{\rotate}{90}%
+ \let\angle\pgfmathresult%
+ \pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\angle}{\semicircleradius}}%
+ }%
+ \anchor{arc start}{%
+ \installsemicircleparameters%
+ \arcstartcorner%
+ }%
+ \anchor{arc end}{%
+ \installsemicircleparameters%
+ \arcendcorner%
+ }%
+ \anchor{chord center}{%
+ \installsemicircleparameters%
+ \pgfpointlineattime{0.5}{\arcstartcorner}{\arcendcorner}%
+ }%
+ \anchor{north}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{90}{\semicircleradius}}%
+ }%
+ \anchor{south}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{270}{\semicircleradius}}%
+ }%
+ \anchor{east}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{0}{\semicircleradius}}%
+ }%
+ \anchor{west}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{180}{\semicircleradius}}%
+ }%
+ \anchor{north west}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{135}{\semicircleradius}}%
+ }%
+ \anchor{south west}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{225}{\semicircleradius}}%
+ }%
+ \anchor{north east}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{45}{\semicircleradius}}%
+ }%
+ \anchor{south east}{%
+ \installsemicircleparameters%
+ \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{315}{\semicircleradius}}%
+ }%
+ \backgroundpath{%
+ \installsemicircleparameters%
+ \pgf@x\semicircleradius\relax%
+ \advance\pgf@x-\outersep\relax%
+ \edef\semicircleradius{\the\pgf@x}%
+ \pgfpathmoveto{\pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\rotate}{\semicircleradius}}}%
+ {%
+ \pgftransformrotate{\rotate}%
+ \pgfpatharc{0}{180}{\semicircleradius}%
+ \pgfpathclose%
+ }%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Check if a reference point has been defined (i.e. \midpoint or \basepoint).
+ %
+ \pgfutil@ifundefined{pgf@semicirclereferencepoint}%
+ {\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@semicirclereferencepoint}%
+ %
+ % Adjust the location of the external point relative to the reference point.
+ %
+ \referencepoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Install the required points and angles.
+ %
+ \installsemicircleparameters%
+ %
+ % Get the angle of the external point to the \referencepoint.
+ %
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ \let\externalangle\pgfmathresult%
+ %
+ % *Subtract* the rotation from the external angle.
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\angle\pgfmathresult%
+ \ifx\referencepoint\basepoint%
+ \let\angletoarcstartborder\baseangletoarcstartborder%
+ \let\angletoarcendborder\baseangletoarcendborder%
+ \let\angletoarcstartcorner\baseangletoarcstartcorner%
+ \let\angletoarcendcorner\baseangletoarcendcorner%
+ \let\centerpointdiff\basesemicirclecenterdiff%
+ \else%
+ \ifx\referencepoint\midpoint%
+ \let\angletoarcstartborder\midangletoarcstartborder%
+ \let\angletoarcendborder\midangletoarcendborder%
+ \let\angletoarcstartcorner\midangletoarcstartcorner%
+ \let\angletoarcendcorner\midangletoarcendcorner%
+ \let\centerpointdiff\midsemicirclecenterdiff%
+ \fi\fi%
+ %
+ % Determine if the line will cross the semicircle arc, or the chord.
+ %
+ \ifdim\angle pt>\angletoarcstartborder pt\relax%
+ \let\firstpoint\pgfutil@empty%
+ \let\secondpoint\pgfutil@empty%
+ \else%
+ \ifdim\angle pt>\angletoarcstartcorner pt\relax%
+ \let\firstpoint\arcstartcorner%
+ \let\secondpoint\arcstartborder%
+ \else%
+ \ifdim\angle pt>\angletoarcendcorner pt\relax%
+ \let\firstpoint\arcendcorner%
+ \let\secondpoint\arcstartcorner%
+ \else%
+ \ifdim\angle pt>\angletoarcendborder pt\relax%
+ \let\firstpoint\arcendborder%
+ \let\secondpoint\arcendcorner%
+ \else%
+ \let\firstpoint\pgfutil@empty%
+ \let\secondpoint\pgfutil@empty%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\firstpoint\pgfutil@empty
+ %
+ % Calculate the angle from the centre of the semicircle to the
+ % point on the semicircle arc which intersects the line from
+ % the external point to the reference point...
+ %
+ \pgfmathanglebetweenlines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\semicirclecenterpoint}{\referencepoint}%
+ \pgfmathsin@{\pgfmathresult}%
+ \let\sineangle\pgfmathresult%
+ \pgf@x\semicircleradius\relax%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}%
+ \let\reciprocalradius\pgfmathresult%
+ \pgf@x\centerpointdiff\relax%
+ \pgf@x\sineangle\pgf@x%
+ \pgf@x\reciprocalradius\pgf@x%
+ \pgfmathasin@{\pgfmath@tonumber{\pgf@x}}%
+ \pgf@x\pgfmathresult pt\relax%
+ \advance\pgf@x\externalangle pt\relax%
+ \edef\angle{\pgfmath@tonumber{\pgf@x}}%
+ %
+ % ...and thus the point on the border.
+ %
+ \pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\angle}{\semicircleradius}}%
+ \else%
+ %
+ % Calculate the the point where the semicircle chord intersects
+ % the line from the external point to the reference point.
+ %
+ \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ \fi%
+ }%
+}%
+
+
+% Keys for shape isosceles triangle
+%
+% /pgf/isosceles triangle apex angle : angle at the apex of the triangle.
+\pgfkeys{/pgf/.cd,
+ isosceles triangle apex angle/.initial=45,
+ isosceles triangle stretches/.is if=pgf@lib@sh@isosceslestrianglestretches
+}%
+\newif\ifpgf@lib@sh@isosceslestrianglestretches
+
+\pgfdeclareshape{isosceles triangle}{%
+ \savedmacro\trianglepoints{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/isosceles triangle apex angle}}%
+ \divide\pgf@x2\relax%
+ \edef\halfapexangle{\pgfmath@tonumber{\pgf@x}}%
+ \addtosavedmacro\halfapexangle%
+ %
+ \pgfmathtan@{\halfapexangle}%
+ \let\tanhalfapexangle\pgfmathresult%
+ %
+ \pgfmathcot@{\halfapexangle}%
+ \let\cothalfapexangle\pgfmathresult%
+ %
+ \pgfmathsin@{\halfapexangle}%
+ \let\sinhalfapexangle\pgfmathresult%
+ %
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \let\cosechalfapexangle\pgfmathresult%
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ \ifpgfshapeborderusesincircle%
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \else%
+ \pgf@y\pgf@x%
+ \fi%
+ \pgf@x1.414213\pgf@x%
+ \pgf@y1.414213\pgf@y%
+ %
+ \pgf@xa\pgf@x%
+ \advance\pgf@xa\cosechalfapexangle\pgf@x%
+ \pgf@ya\tanhalfapexangle\pgf@xa%
+ \else%
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \pgfmathsetcount\c@pgf@counta{+\pgfmathresult}%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \edef\rotate{\the\c@pgf@counta}%
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xa%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xa%
+ \fi%
+ \fi%
+ %
+ \pgf@xa2.0\pgf@x%
+ \pgf@ya\tanhalfapexangle\pgf@xa%
+ \advance\pgf@xa\cothalfapexangle\pgf@y%
+ \advance\pgf@ya\pgf@y%
+ \fi%
+ \addtosavedmacro\rotate%
+ \ifdim\pgf@xa=0pt\relax%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum height}}%
+ \fi%
+ % Adjust for minimum height and width.
+ %
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@ya<.5\pgf@yb%
+ \ifpgf@lib@sh@isosceslestrianglestretches%
+ \pgf@ya.5\pgf@yb%
+ %
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@xa}}%
+ \pgfmathatan@{\pgfmathresult}%
+ \let\halfapexangle\pgfmathresult%
+ %
+ \else%
+ \pgf@ya.5\pgf@yb%
+ \pgf@xa\cothalfapexangle\pgf@ya%
+ \fi%
+ \fi%
+ %
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@xa<\pgf@xb%
+ \ifpgf@lib@sh@isosceslestrianglestretches%
+ \pgf@xa\pgf@xb%
+ %
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@xa}}%
+ \pgfmathatan@{\pgfmathresult}%
+ \let\halfapexangle\pgfmathresult%
+ %
+ \else%
+ \pgf@xa\pgf@xb%
+ \pgf@ya\tanhalfapexangle\pgf@xa%
+ \fi%
+ \fi%
+ %
+ %
+ % Now find the ``offset height'' (h'). This is the distance from the
+ % center of the node contents to the base of the triangle.
+ %
+ \ifpgfshapeborderusesincircle%
+ %
+ % h' = H*sin(a/2) / (1+sin(a/2))
+ %
+ % where:
+ % H = the height of the triangle.
+ % a = the apex angle.
+ %
+ \pgf@xc\pgf@xa%
+ \pgfmathsin@{\halfapexangle}%
+ \pgf@xc\pgfmathresult\pgf@xc%
+ \pgf@yc1pt\relax%
+ \advance\pgf@yc\pgfmathresult pt\relax%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@xc}}{\pgfmath@tonumber{\pgf@yc}}
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \else%
+ %
+ % h' = 0.5*h + (0.5*(W-w)*cos(a/2) - h*sin(a/2))/(1+sin(a/2))
+ %
+ % where:
+ % h = the height of the node contents.
+ % w = the width of the node contents.
+ % W = the width of the triangle.
+ % a = the apex angle.
+ %
+ \pgf@xc\pgf@ya%
+ \advance\pgf@xc-\pgf@y%
+ \pgfmathcos@{\halfapexangle}%
+ \pgf@xc\pgfmathresult\pgf@xc%
+ \pgfmathsin@{\halfapexangle}%
+ \advance\pgf@xc-\pgfmathresult\pgf@x%
+ \advance\pgf@xc-\pgfmathresult\pgf@x%
+ \pgf@yc\pgfmathresult pt\relax%
+ \advance\pgf@yc1pt\relax%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@xc}}{\pgfmath@tonumber{\pgf@yc}}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \advance\pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\apex{%
+ \pgf@y0pt%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x-\pgfutil@tempdima%
+ }%
+ \addtosavedmacro\apex%
+ %
+ \pgfextract@process\lowerleft{%
+ \pgf@y\pgf@ya%
+ \pgf@x-\pgfutil@tempdima%
+ }%
+ \addtosavedmacro\lowerleft%
+ %
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \pgf@xb\pgf@yb%
+ \fi%
+ \pgfextract@process\apexanchor{%
+ \apex%
+ \advance\pgf@x\cosechalfapexangle\pgf@xb%
+ }%
+ \addtosavedmacro\apexanchor%
+ %
+ \pgf@yc-\halfapexangle pt\relax%
+ \advance\pgf@yc90pt\relax%
+ \divide\pgf@yc2\relax%
+ \pgfmathcot@{\pgfmath@tonumber{\pgf@yc}}%
+ \pgfextract@process\lowerleftanchor{%
+ \lowerleft%
+ \advance\pgf@y\pgfmathresult\pgf@xb%
+ \advance\pgf@x-\pgf@xb%
+ }%
+ \addtosavedmacro\lowerleftanchor%
+ %
+ \pgfextract@process\lowerrightanchor{%
+ \lowerleftanchor%
+ \pgf@y-\pgf@y%
+ }%
+ \addtosavedmacro\lowerrightanchor%
+ }%
+ \anchor{apex}{%
+ \trianglepoints%
+ \pgfpointadd{\centerpoint}{%
+ \pgfmathrotatepointaround{\apexanchor}{\pgfpointorigin}{\rotate}%
+ }%
+ }%
+ \anchor{left corner}{%
+ \trianglepoints%
+ \pgfpointadd{\centerpoint}{%
+ \pgfmathrotatepointaround{\lowerleftanchor}{\pgfpointorigin}{\rotate}%
+ }%
+ }%
+ \anchor{right corner}{%
+ \trianglepoints%
+ \pgfpointadd{\centerpoint}{%
+ \pgfmathrotatepointaround{\lowerrightanchor}{\pgfpointorigin}{\rotate}%
+ }%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid west}{%
+ \trianglepoints%
+ \let\pgf@isoscelestriangle@referencepoint\midpoint%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}%
+ }%
+ \anchor{mid east}{%
+ \trianglepoints%
+ \let\pgf@isoscelestriangle@referencepoint\midpoint%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base west}{%
+ \trianglepoints%
+ \let\pgf@isoscelestriangle@referencepoint\basepoint%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}%
+ }%
+ \anchor{base east}{%
+ \trianglepoints%
+ \let\pgf@isoscelestriangle@referencepoint\basepoint%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}%
+ }%
+ \anchor{north}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{0pt}{1pt}}%
+ }%
+ \anchor{south}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{0pt}{-1pt}}%
+ }%
+ \anchor{east}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}%
+ }%
+ \anchor{west}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{1pt}}%
+ }%
+ \anchor{south west}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{-1pt}}%
+ }%
+ \anchor{south east}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{-1pt}}%
+ }%
+ \anchor{north west}{%
+ \trianglepoints%
+ \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{1pt}}%
+ }%
+ \anchor{left side}{%
+ \trianglepoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{\pgfpointlineattime{0.5}{\lowerleftanchor}{\apexanchor}}{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{right side}{%
+ \trianglepoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{\pgfpointlineattime{0.5}{\lowerrightanchor}{\apexanchor}}{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{lower side}{%
+ \trianglepoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{\pgfpointlineattime{0.5}{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \backgroundpath{%
+ \trianglepoints%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgftransformrotate{\rotate}%
+ \pgfpathmoveto{\apex}%
+ \pgfpathlineto{\lowerleft}%
+ \pgfpathlineto{\lowerleft\pgf@y-\pgf@y}%
+ \pgfpathclose%
+ }%
+ }%
+ \anchorborder{%
+ \pgfutil@ifundefined{pgf@isoscelestriangle@referencepoint}{\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@isoscelestriangle@referencepoint}%
+ \pgfextract@process\externalpoint{%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \referencepoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \trianglepoints%
+ \pgfmathanglebetweenpoints{\referencepoint}{\externalpoint}%
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ %
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\lowerrightanchor}}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\lowerleftanchor}}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\apexanchor}}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \let\firstpoint\apexanchor%
+ \let\secondpoint\lowerleftanchor%
+ \else%
+ \let\firstpoint\apexanchor%
+ \let\secondpoint\lowerrightanchor%
+ \fi%
+ \else%
+ \let\firstpoint\lowerleftanchor%
+ \let\secondpoint\lowerrightanchor%
+ \fi%
+ \else%
+ \let\firstpoint\lowerrightanchor%
+ \let\secondpoint\apexanchor%
+ \fi%
+ \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
+ {\pgfmathrotatepointaround{\pgfpointadd{\centerpoint}{\firstpoint}}{\centerpoint}{\rotate}}%
+ {\pgfmathrotatepointaround{\pgfpointadd{\centerpoint}{\secondpoint}}{\centerpoint}{\rotate}}%
+ }%
+}%
+
+
+
+
+% Keys for shape kite
+%
+%
+\pgfkeys{/pgf/.cd,
+ kite upper vertex angle/.initial=120,
+ kite lower vertex angle/.initial=60,
+ kite vertex angles/.code={%
+ \pgfutil@in@{and}{#1}%
+ \ifpgfutil@in@%
+ \def\pgf@marshal##1and##2\@@{%
+ \pgfkeys{/pgf/kite upper vertex angle=##1}%
+ \pgfkeys{/pgf/kite lower vertex angle=##2}%
+ }%
+ \expandafter\pgf@marshal#1\@@%
+ \else%
+ \pgfkeys{/pgf/kite upper vertex angle=#1}%
+ \pgfkeys{/pgf/kite lower vertex angle=#1}%
+ \fi%
+ }%
+}%
+
+% Shape kite.
+%
+\pgfdeclareshape{kite}{%
+ \savedmacro\installkiteparameters{%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % Calculate the centre, base and mid points of the node.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \pgfextract@process\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \pgfextract@process\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ % Halve the vertex angles.
+ %
+ \pgfmathdivide{\pgfkeysvalueof{/pgf/kite upper vertex angle}}{2}%
+ \let\halfuppervertexangle\pgfmathresult%
+ \pgfmathdivide{\pgfkeysvalueof{/pgf/kite lower vertex angle}}{2}%
+ \let\halflowervertexangle\pgfmathresult%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \ifpgfshapeborderusesincircle%
+ %
+ % Get the rotation.
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ %
+ % Get the radius of the incircle.
+ %
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ %
+ % Get the distances from the upper and lower vertices
+ % to the center of the incircle.
+ %
+ \pgfmathsin@{\halfuppervertexangle}%
+ \let\sinehalfuppervertexangle\pgfmathresult%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \let\cosechalfuppervertexangle\pgfmathresult%
+ \pgf@ya\pgfmathresult\pgf@x%
+ \pgfmathsin@{\halflowervertexangle}%
+ \let\sinehalflowervertexangle\pgfmathresult%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@yb\pgfmathresult\pgf@x%
+ %
+ % Now calculate vertical offset (yc) between the center of
+ % the incircle, and the intersection of the kite diagonals.
+ %
+ % yc = x * cosec(a/2) - x * cot(a/2) * (sin(a/2) + sin(b/2)) * cosec(a/2 + b/2)
+ %
+ % where:
+ % x = the incircle radius.
+ % a = the upper vertex angle.
+ % b = the lower vertex angle.
+ %
+ \pgf@yc\pgf@x%
+ \pgfmathadd@{\halfuppervertexangle}{\halflowervertexangle}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@yc\pgfmathresult\pgf@yc%
+ \pgfmathadd@{\sinehalfuppervertexangle}{\sinehalflowervertexangle}%
+ \pgf@yc\pgfmathresult\pgf@yc%
+ \pgfmathcos@{\halfuppervertexangle}%
+ \pgf@yc\pgfmathresult\pgf@yc%
+ \pgf@yc-\cosechalfuppervertexangle\pgf@yc%
+ \advance\pgf@yc\cosechalfuppervertexangle\pgf@x%
+ \edef\deltay{\the\pgf@yc}%
+ %
+ % Now calculate the height of the kite...
+ %
+ \advance\pgf@ya-\pgf@yc%
+ %
+ % ...and the depth.
+ %
+ \advance\pgf@yb\pgf@yc%
+ %
+ % Get the half width of the widest part of the kite.
+ %
+ \pgfmathtan@{\halfuppervertexangle}%
+ \pgf@xa\pgfmathresult\pgf@ya%
+ \else%
+ \multiply\pgf@x2\relax%
+ \multiply\pgf@y2\relax%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ %
+ % The node contents (total height y) extends a distance ya into the
+ % upper isosceles triangle of the kite and a distance yb into the
+ % lower isosceles triangle. Thus, the following relationships hold:
+ %
+ % ya/yb = tan(b/2)/tan(a/2)
+ %
+ % and y = ya + yb
+ %
+ % so ya = y * sin(a/2 + b/2) / (cos(a/2) * sin(b/2))
+ %
+ % where:
+ % a = upper vertex angle.
+ % b = lower vertex angle.
+ %
+ \pgfmathadd@{\halfuppervertexangle}{\halflowervertexangle}%
+ \pgfmathsin@{\pgfmathresult}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@ya\pgfmathresult\pgf@y%
+ \pgfmathcos@{\halfuppervertexangle}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ \pgfmathsin@{\halflowervertexangle}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ \pgf@yb\pgf@y%
+ \advance\pgf@yb-\pgf@ya%
+ %
+ % The vertical offset between the center of the node, and
+ % the intersection of the kite diagonals is given by:
+ %
+ % yc = y/2 - ya
+ %
+ \pgf@yc.5\pgf@y%
+ \advance\pgf@yc-\pgf@ya%
+ \edef\deltay{\the\pgf@yc}%
+ %
+ % Get the half width of the widest part of the kite.
+ %
+ \pgfmathtan@{\halfuppervertexangle}%
+ \pgf@xa.5\pgf@x%
+ \advance\pgf@xa\pgfmathresult\pgf@ya%
+ %
+ % Now calculate the height of the kite...
+ %
+ \pgf@xb.5\pgf@x%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \advance\pgf@ya\pgfmathresult\pgf@xb%
+ %
+ % ...and the depth.
+ %
+ \pgfmathtan@{\halflowervertexangle}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \advance\pgf@yb\pgfmathresult\pgf@xb%
+ \fi%
+ %
+ % Take into account minimum height and width.
+ %
+ % ya is the kite height.
+ % yb is the kite depth.
+ % xa is the kite (half) width.
+ %
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/minimum height}}%
+ \pgf@y\pgf@ya%
+ \advance\pgf@y\pgf@yb%
+ \ifdim\pgf@y<\pgf@yc%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@y}}%
+ \pgf@yc\pgfmathresult\pgf@yc%
+ \pgf@xa\pgfmath@tonumber{\pgf@yc}\pgf@xa%
+ \pgf@ya\pgfmath@tonumber{\pgf@yc}\pgf@ya%
+ \pgf@yb\pgfmath@tonumber{\pgf@yc}\pgf@yb%
+ \fi%
+ \pgf@x2.0\pgf@xa%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<\pgf@xc%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}%
+ \pgf@xc\pgfmathresult\pgf@xc%
+ \pgf@xa\pgfmath@tonumber{\pgf@xc}\pgf@xa%
+ \pgf@ya\pgfmath@tonumber{\pgf@xc}\pgf@ya%
+ \pgf@yb\pgfmath@tonumber{\pgf@xc}\pgf@yb%
+ \fi%
+ \edef\kitehalfwidth{\the\pgf@xa}%
+ \edef\kiteheight{\the\pgf@ya}%
+ \edef\kitedepth{\the\pgf@yb}%
+ %
+ % Calculate the basic points on the kite (for the background path).
+ %
+ \pgfextract@process\toppoint{%
+ \centerpoint%
+ \advance\pgf@y\deltay\relax%
+ \advance\pgf@y\kiteheight%
+ }%
+ \pgfextract@process\bottompoint{%
+ \centerpoint%
+ \advance\pgf@y\deltay\relax%
+ \advance\pgf@y-\kitedepth%
+ }%
+ \pgfextract@process\leftpoint{%
+ \centerpoint%
+ \advance\pgf@y\deltay\relax%
+ \advance\pgf@x-\kitehalfwidth%
+ }%
+ \pgfextract@process\rightpoint{%
+ \centerpoint%
+ \advance\pgf@y\deltay\relax%
+ \advance\pgf@x\kitehalfwidth%
+ }%
+ %
+ % Now calculate the miter length. At the top...
+ %
+ \pgfmathsin@{\halfuppervertexangle}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@y\outersep\relax%
+ \pgf@y\pgfmathresult\pgf@y%
+ \edef\topmiter{\the\pgf@y}%
+ %
+ % ...at the bottom...
+ %
+ \pgfmathsin@{\halflowervertexangle}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@y\outersep\relax%
+ \pgf@y\pgfmathresult\pgf@y%
+ \edef\bottommiter{\the\pgf@y}%
+ %
+ % ...to the right...
+ %
+ \pgfmathsubtract@{180}{\halflowervertexangle}%
+ \pgfmathsubtract@{\pgfmathresult}{\halfuppervertexangle}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfmathsin@{\pgfmathresult}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \pgf@xa\outersep\relax%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \pgfmathsubtract@{\halfuppervertexangle}{\halflowervertexangle}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\angle\pgfmathresult%
+ \pgfextract@process\rightmiter{%
+ \pgfqpointpolar{\angle}{\the\pgf@xa}%
+ }%
+ %
+ % ...and to the left.
+ %
+ \pgfmathsubtract@{180}{\angle}%
+ \let\angle\pgfmathresult%
+ \pgfextract@process\leftmiter{%
+ \pgfqpointpolar{\angle}{\the\pgf@xa}%
+ }%
+ %
+ % Create the border points.
+ %
+ \pgfextract@process\topborderpoint{%
+ \toppoint%
+ \advance\pgf@y\topmiter\relax%
+ }%
+ \pgfextract@process\bottomborderpoint{%
+ \bottompoint%
+ \advance\pgf@y-\bottommiter\relax%
+ }%
+ \pgfextract@process\leftborderpoint{%
+ \leftpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \leftmiter%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfextract@process\rightborderpoint{%
+ \rightpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \rightmiter%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Get the angle from the \centerpoint to the *unrotated points*.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\topborderpoint}%
+ \let\angletotoppoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\leftborderpoint}%
+ \let\angletoleftpoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\bottomborderpoint}%
+ \let\angletobottompoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\rightborderpoint}%
+ \let\angletorightpoint\pgfmathresult%
+ %
+ % ...from the *inversely rotated* \basepoint...
+ %
+ \pgfextract@process\rotatedbasepoint{%
+ \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\topborderpoint}%
+ \let\baseangletotoppoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\leftborderpoint}%
+ \let\baseangletoleftpoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\bottomborderpoint}%
+ \let\baseangletobottompoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\rightborderpoint}%
+ \let\baseangletorightpoint\pgfmathresult%
+ %
+ % ...and from the *inversely rotated* \midpoint.
+ %
+ \pgfextract@process\rotatedmidpoint{%
+ \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\topborderpoint}%
+ \let\midangletotoppoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\leftborderpoint}%
+ \let\midangletoleftpoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\bottomborderpoint}%
+ \let\midangletobottompoint\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\rightborderpoint}%
+ \let\midangletorightpoint\pgfmathresult%
+ %
+ % Calculate a radius guaranteed to be outside the kite.
+ %
+ \pgfextractx\pgf@xa{\pgfpointdiff{\leftborderpoint}{\rightborderpoint}}%
+ \ifdim\pgf@xa<0pt\relax%
+ \pgf@xa-\pgf@xa%
+ \fi%
+ \pgfextracty\pgf@ya{\pgfpointdiff{\topborderpoint}{\bottomborderpoint}}%
+ \ifdim\pgf@ya<0pt\relax%
+ \pgf@ya-\pgf@ya%
+ \fi%
+ \ifdim\pgf@ya>\pgf@xa%
+ \edef\externalradius{\the\pgf@ya}%
+ \else%
+ \edef\externalradius{\the\pgf@xa}%
+ \fi%
+ %
+ % Now rotate the points...
+ %
+ \pgfextract@process\toppoint{%
+ \pgfmathrotatepointaround{\toppoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\bottompoint{%
+ \pgfmathrotatepointaround{\bottompoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\leftpoint{%
+ \pgfmathrotatepointaround{\leftpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\rightpoint{%
+ \pgfmathrotatepointaround{\rightpoint}{\centerpoint}{\rotate}%
+ }%
+ %
+ % ...and the border points.
+ %
+ \pgfextract@process\topborderpoint{%
+ \pgfmathrotatepointaround{\topborderpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\bottomborderpoint{%
+ \pgfmathrotatepointaround{\bottomborderpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\leftborderpoint{%
+ \pgfmathrotatepointaround{\leftborderpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\rightborderpoint{%
+ \pgfmathrotatepointaround{\rightborderpoint}{\centerpoint}{\rotate}%
+ }%
+ %
+ % Now save it all.
+ %
+ \addtosavedmacro{\rotate}%
+ \addtosavedmacro{\externalradius}%
+ %
+ \addtosavedmacro\toppoint%
+ \addtosavedmacro\bottompoint%
+ \addtosavedmacro\leftpoint%
+ \addtosavedmacro\rightpoint%
+ %
+ \addtosavedmacro\topborderpoint%
+ \addtosavedmacro\bottomborderpoint%
+ \addtosavedmacro\leftborderpoint%
+ \addtosavedmacro\rightborderpoint%
+ %
+ \addtosavedmacro\angletotoppoint%
+ \addtosavedmacro\angletobottompoint%
+ \addtosavedmacro\angletoleftpoint%
+ \addtosavedmacro\angletorightpoint%
+ %
+ \addtosavedmacro\baseangletotoppoint%
+ \addtosavedmacro\baseangletobottompoint%
+ \addtosavedmacro\baseangletoleftpoint%
+ \addtosavedmacro\baseangletorightpoint%
+ %
+ \addtosavedmacro\midangletotoppoint%
+ \addtosavedmacro\midangletobottompoint%
+ \addtosavedmacro\midangletoleftpoint%
+ \addtosavedmacro\midangletorightpoint%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{base west}{%
+ \installkiteparameters%
+ \let\pgf@kiteanchorborderreferencepoint\basepoint%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{base east}{%
+ \installkiteparameters%
+ \let\pgf@kiteanchorborderreferencepoint\basepoint%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid west}{%
+ \installkiteparameters%
+ \let\pgf@kiteanchorborderreferencepoint\midpoint%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{mid east}{%
+ \installkiteparameters%
+ \let\pgf@kiteanchorborderreferencepoint\midpoint%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{north}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north west}{%
+ \installkiteparameters%
+ \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{upper vertex}{%
+ \installkiteparameters%
+ \topborderpoint}%
+ \anchor{lower vertex}{%
+ \installkiteparameters%
+ \bottomborderpoint}%
+ \anchor{left vertex}{%
+ \installkiteparameters%
+ \leftborderpoint}%
+ \anchor{right vertex}{%
+ \installkiteparameters%
+ \rightborderpoint}%
+ \anchor{upper left side}{%
+ \installkiteparameters%
+ \pgfpointlineattime{0.5}{\topborderpoint}{\leftborderpoint}}%
+ \anchor{lower left side}{%
+ \installkiteparameters%
+ \pgfpointlineattime{0.5}{\bottomborderpoint}{\leftborderpoint}}%
+ \anchor{upper right side}{%
+ \installkiteparameters%
+ \pgfpointlineattime{0.5}{\topborderpoint}{\rightborderpoint}}%
+ \anchor{lower right side}{%
+ \installkiteparameters%
+ \pgfpointlineattime{0.5}{\bottomborderpoint}{\rightborderpoint}}%
+ \backgroundpath{%
+ \installkiteparameters%
+ \pgfpathmoveto{\toppoint}%
+ \pgfpathlineto{\leftpoint}%
+ \pgfpathlineto{\bottompoint}%
+ \pgfpathlineto{\rightpoint}%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % This allows anchors base east, base west, mid east and mid west,
+ % to redefine the `center' of the node to correctly calculate the
+ % border points.
+ %
+ \pgfutil@ifundefined{pgf@kiteanchorborderreferencepoint}%
+ {\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@kiteanchorborderreferencepoint}%
+ %
+ % Adjust the location of the external
+ % point relative to the reference point.
+ %
+ \referencepoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Install the required points and angles.
+ %
+ \installkiteparameters%
+ %
+ % Get the angle of the external point relative to \referencepoint.
+ %
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ %
+ % *Subtract* the rotation from the external angle.
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ \ifx\referencepoint\basepoint%
+ \let\angletotoppoint\baseangletotoppoint%
+ \let\angletobottompoint\baseangletobottompoint%
+ \let\angletoleftpoint\baseangletoleftpoint%
+ \let\angletorightpoint\baseangletorightpoint%
+ \else%
+ \ifx\referencepoint\midpoint%
+ \let\angletotoppoint\midangletotoppoint%
+ \let\angletobottompoint\midangletobottompoint%
+ \let\angletoleftpoint\midangletoleftpoint%
+ \let\angletorightpoint\midangletorightpoint%
+ \fi\fi%
+ %
+ % Depending on the rotation, the angle to \rightborderpoint
+ % may be smaller than the angle to \topborderpoint.
+ %
+ \ifdim\angletorightpoint pt<\angletotoppoint pt\relax%
+ \ifdim\externalangle pt<\angletorightpoint pt\relax%
+ \let\firstpoint\rightborderpoint%
+ \let\secondpoint\bottomborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletotoppoint pt\relax%
+ \let\firstpoint\rightborderpoint%
+ \let\secondpoint\topborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletoleftpoint pt\relax%
+ \let\firstpoint\topborderpoint%
+ \let\secondpoint\leftborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletobottompoint pt\relax%
+ \let\firstpoint\leftborderpoint%
+ \let\secondpoint\bottomborderpoint%
+ \else%
+ \let\firstpoint\rightborderpoint%
+ \let\secondpoint\bottomborderpoint%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\externalangle pt<\angletotoppoint pt\relax%
+ \let\firstpoint\rightborderpoint%
+ \let\secondpoint\topborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletoleftpoint pt\relax%
+ \let\firstpoint\leftborderpoint%
+ \let\secondpoint\topborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletobottompoint pt\relax%
+ \let\firstpoint\bottomborderpoint%
+ \let\secondpoint\leftborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletorightpoint pt\relax%
+ \let\firstpoint\rightborderpoint%
+ \let\secondpoint\bottomborderpoint%
+ \else%
+ \let\firstpoint\rightborderpoint%
+ \let\secondpoint\topborderpoint%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ }%
+}%
+
+
+
+
+% Keys for shape dart.
+%
+%
+
+\pgfkeys{/pgf/.cd,
+ dart tip angle/.initial=45,
+ dart tail angle/.initial=135,
+}%
+
+% Shape dart.
+%
+\pgfdeclareshape{dart}{%
+ \savedmacro\installdartparameters{%
+ %
+ % Get the halved angles (more useful).
+ %
+ \pgfmathdivide{\pgfkeysvalueof{/pgf/dart tip angle}}{2}%
+ \let\halftipangle\pgfmathresult%
+ \pgfmathdivide{\pgfkeysvalueof{/pgf/dart tail angle}}{2}%
+ \let\halftailangle\pgfmathresult%
+ %
+ % Calculate some common results.
+ %
+ \pgfmathcot@{\halftipangle}%
+ \let\cothalftipangle\pgfmathresult%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % Calculate the centre, base and mid points of the node.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \pgfextract@process\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \pgfextract@process\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ %
+ % Get the (halved) dimension of the node.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ % Get the length of the dart tip.
+ %
+ \ifpgfshapeborderusesincircle%
+ %
+ % Get the (unrounded) rotation.
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ %
+ % Get the radius of the incircle.
+ %
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ %
+ % Calculate the length of the dart tip.
+ %
+ \pgf@xa\cothalftipangle\pgf@x%
+ \advance\pgf@xa\pgf@x%
+ \else%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Flip the width and height of the node contents,
+ % according to the appropriate border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ %
+ % Calculate the length of the dart tip.
+ %
+ \pgf@xa\cothalftipangle\pgf@y%
+ \advance\pgf@xa2.0\pgf@x%
+ \fi%
+ %
+ % Get the (half) separation of the dart tails.
+ %
+ \pgfmathsubtract@{\halftailangle}{\halftipangle}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@ya\pgfmathresult\pgf@xa%
+ \pgfmathsin@{\halftipangle}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ \pgfmathcos@{\halftipangle}%
+ \pgf@ya\pgfmathresult\pgf@ya%
+ %
+ % Get the total length of the dart...
+ %
+ \pgf@xb\cothalftipangle\pgf@ya%
+ %
+ % and hence the length of the tails.
+ %
+ \pgf@xc-\pgf@xa%
+ \advance\pgf@xc\pgf@xb%
+ %
+ % Adjust for minimum height (length of the dart).
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@xb<\pgf@y%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xb}}%
+ \pgf@y\pgfmathresult\pgf@y%
+ \pgf@xa\pgfmath@tonumber{\pgf@y}\pgf@xa%
+ \pgf@xc\pgfmath@tonumber{\pgf@y}\pgf@xc%
+ \pgf@ya\pgfmath@tonumber{\pgf@y}\pgf@ya%
+ \pgf@x\pgfmath@tonumber{\pgf@y}\pgf@x%
+ \fi%
+ %
+ % Adjust for minimum width (tail separation length).
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@y.5\pgf@y%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@ya}}%
+ \pgf@ya\pgf@y%
+ \pgf@y\pgfmathresult\pgf@y%
+ \pgf@xa\pgfmath@tonumber{\pgf@y}\pgf@xa%
+ \pgf@xc\pgfmath@tonumber{\pgf@y}\pgf@xc%
+ \pgf@x\pgfmath@tonumber{\pgf@y}\pgf@x%
+ \fi%
+ \edef\dartlength{\the\pgf@xa}%
+ \edef\deltax{\the\pgf@x}%
+ \edef\taillength{\the\pgf@xc}%
+ \edef\halftailseparation{\the\pgf@ya}
+ %
+ % Create the basic points on the dart (for the background path).
+ %
+ \pgfextract@process\tippoint{%
+ \centerpoint%
+ \advance\pgf@x\dartlength\relax%
+ \advance\pgf@x-\deltax\relax%
+ }%
+ \pgfextract@process\tailcenterpoint{%
+ \centerpoint%
+ \advance\pgf@x-\deltax\relax%
+ }%
+ \pgfextract@process\lefttailpoint{%
+ \centerpoint%
+ \advance\pgf@x-\deltax\relax%
+ \advance\pgf@x-\taillength\relax%
+ \advance\pgf@y\halftailseparation\relax%
+ }%
+ \pgfextract@process\righttailpoint{%
+ \centerpoint%
+ \advance\pgf@x-\deltax\relax%
+ \advance\pgf@x-\taillength\relax%
+ \advance\pgf@y-\halftailseparation\relax%
+ }%
+ %
+ % Calculate the miter vectors. At the dart tip...
+ %
+ \pgfextract@process\tipmiter{%
+ \pgfmathcosec@{\halftipangle}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y0pt\relax%
+ }%
+ %
+ % ...at the tail center...
+ %
+ \pgfextract@process\tailcentermiter{%
+ \pgfmathcosec@{\halftailangle}%
+ \pgf@x-\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y0pt\relax%
+ }%
+ %
+ % ...at the left tail...
+ %
+ \pgfmathsubtract@{\halftailangle}{\halftipangle}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\angle\pgfmathresult%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgfmathadd@{\angle}{90}%
+ \pgfmathsubtract{\pgfmathresult}{\halftailangle}%
+ \pgfmathsincos@{\pgfmathresult}%
+ \pgf@ya\pgfmathresultx\pgf@x%
+ \pgf@xa\pgfmathresulty\pgf@x%
+ \pgfextract@process\lefttailmiter{%
+ \pgf@x-\pgf@xa%
+ \pgf@y\pgf@ya%
+ }%
+ %
+ % ...and the right tail.
+ %
+ \pgfextract@process\righttailmiter{%
+ \pgf@x-\pgf@xa%
+ \pgf@y-\pgf@ya%
+ }%
+ %
+ % Create the border points.
+ %
+ \pgfextract@process\tipborderpoint{%
+ \pgfpointadd{\tippoint}{\tipmiter}
+ }%
+ \pgfextract@process\tailcenterborderpoint{%
+ \pgfpointadd{\tailcenterpoint}{\tailcentermiter}%
+ }%
+ \pgfextract@process\lefttailborderpoint{%
+ \pgfpointadd{\lefttailpoint}{\lefttailmiter}%
+ }%
+ \pgfextract@process\righttailborderpoint{%
+ \pgfpointadd{\righttailpoint}{\righttailmiter}%
+ }%
+ %
+ % Calculate the angles between the centerpoint
+ % and the *unrotated* borderpoints.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\tipborderpoint}%
+ \let\angletotip\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\tailcenterborderpoint}%
+ \let\angletotailcenter\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\lefttailborderpoint}%
+ \let\angletolefttail\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\righttailborderpoint}%
+ \let\angletorighttail\pgfmathresult%
+ %
+ % Calculate the angles between the *inversely rotated*
+ % basepoint and the *unrotated* borderpoints.
+ %
+ \pgfextract@process\rotatedbasepoint{%
+ \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\tipborderpoint}%
+ \let\baseangletotip\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\tailcenterborderpoint}%
+ \let\baseangletotailcenter\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lefttailborderpoint}%
+ \let\baseangletolefttail\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedbasepoint}{\righttailborderpoint}%
+ \let\baseangletorighttail\pgfmathresult%
+ %
+ % Calculate the angles between the *inversely rotated*
+ % midpoint and the *unrotated* borderpoints.
+ %
+ \pgfextract@process\rotatedmidpoint{%
+ \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}%
+ }%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\tipborderpoint}%
+ \let\midangletotip\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\tailcenterborderpoint}%
+ \let\midangletotailcenter\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lefttailborderpoint}%
+ \let\midangletolefttail\pgfmathresult%
+ \pgfmathanglebetweenpoints{\rotatedmidpoint}{\righttailborderpoint}%
+ \let\midangletorighttail\pgfmathresult%
+ %
+ % Rotate the background path points.
+ %
+ \pgfextract@process\tippoint{%
+ \pgfmathrotatepointaround{\tippoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\tailcenterpoint{%
+ \pgfmathrotatepointaround{\tailcenterpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\lefttailpoint{%
+ \pgfmathrotatepointaround{\lefttailpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\righttailpoint{%
+ \pgfmathrotatepointaround{\righttailpoint}{\centerpoint}{\rotate}%
+ }%
+ %
+ % Calculate a radius guaranteed to be outside the dart.
+ %
+ \pgfextractx\pgf@xa{\pgfpointdiff{\lefttailborderpoint}{\tipborderpoint}}%
+ \pgfextracty\pgf@ya{\pgfpointdiff{\lefttailborderpoint}{\righttailborderpoint}}%
+ \ifdim\pgf@xa<0pt\relax%
+ \pgf@xa-\pgf@xa%
+ \fi%
+ \ifdim\pgf@ya<0pt\relax%
+ \pgf@ya-\pgf@ya%
+ \fi%
+ \ifdim\pgf@xa>\pgf@ya%
+ \edef\externalradius{\the\pgf@xa}%
+ \else%
+ \edef\externalradius{\the\pgf@ya}%
+ \fi%
+ %
+ % Rotate the border anchor points.
+ %
+ \pgfextract@process\tipborderpoint{%
+ \pgfmathrotatepointaround{\tipborderpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\tailcenterborderpoint{%
+ \pgfmathrotatepointaround{\tailcenterborderpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\lefttailborderpoint{%
+ \pgfmathrotatepointaround{\lefttailborderpoint}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\righttailborderpoint{%
+ \pgfmathrotatepointaround{\righttailborderpoint}{\centerpoint}{\rotate}%
+ }%
+ %
+ % Save everything.
+ %
+ \addtosavedmacro{\rotate}%
+ \addtosavedmacro{\externalradius}%
+ %
+ \addtosavedmacro{\tippoint}%
+ \addtosavedmacro{\tailcenterpoint}%
+ \addtosavedmacro{\lefttailpoint}%
+ \addtosavedmacro{\righttailpoint}%
+ %
+ \addtosavedmacro{\tipborderpoint}%
+ \addtosavedmacro{\tailcenterborderpoint}%
+ \addtosavedmacro{\lefttailborderpoint}%
+ \addtosavedmacro{\righttailborderpoint}%
+ %
+ \addtosavedmacro{\angletotip}%
+ \addtosavedmacro{\angletotailcenter}%
+ \addtosavedmacro{\angletolefttail}%
+ \addtosavedmacro{\angletorighttail}%
+ %
+ \addtosavedmacro{\baseangletotip}%
+ \addtosavedmacro{\baseangletotailcenter}%
+ \addtosavedmacro{\baseangletolefttail}%
+ \addtosavedmacro{\baseangletorighttail}%
+ %
+ \addtosavedmacro{\midangletotip}%
+ \addtosavedmacro{\midangletotailcenter}%
+ \addtosavedmacro{\midangletolefttail}%
+ \addtosavedmacro{\midangletorighttail}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{base west}{%
+ \installdartparameters%
+ \let\pgf@dartanchorborderreferencepoint\basepoint%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{base east}{%
+ \installdartparameters%
+ \let\pgf@dartanchorborderreferencepoint\basepoint%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid west}{%
+ \installdartparameters%
+ \let\pgf@dartanchorborderreferencepoint\midpoint%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{mid east}{%
+ \installdartparameters%
+ \let\pgf@dartanchorborderreferencepoint\midpoint%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{north}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north west}{%
+ \installdartparameters%
+ \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{tip}{%
+ \installdartparameters%
+ \tipborderpoint}%
+ \anchor{left tail}{%
+ \installdartparameters%
+ \lefttailborderpoint}%
+ \anchor{right tail}{%
+ \installdartparameters%
+ \righttailborderpoint}%
+ \anchor{tail center}{%
+ \installdartparameters%
+ \tailcenterborderpoint}%
+ \anchor{left side}{%
+ \installdartparameters%
+ \pgfpointlineattime{0.5}{\tipborderpoint}{\lefttailborderpoint}}%
+ \anchor{right side}{%
+ \installdartparameters%
+ \pgfpointlineattime{0.5}{\tipborderpoint}{\righttailborderpoint}}%
+ \backgroundpath{%
+ \installdartparameters%
+ \pgfpathmoveto{\tippoint}%
+ \pgfpathlineto{\lefttailpoint}%
+ \pgfpathlineto{\tailcenterpoint}%
+ \pgfpathlineto{\righttailpoint}%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % This allows anchors base east, base west, mid east and mid west,
+ % to redefine the `center' of the node to correctly calculate the
+ % border points.
+ %
+ \pgfutil@ifundefined{pgf@dartanchorborderreferencepoint}%
+ {\let\referencepoint\centerpoint}%
+ {\let\referencepoint\pgf@dartanchorborderreferencepoint}%
+ %
+ % Adjust the location of the external
+ % point relative to the reference point.
+ %
+ \referencepoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Install the required points and angles.
+ %
+ \installdartparameters%
+ %
+ % Get the angle of the external point relative to \referencepoint.
+ %
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ %
+ % *Subtract* the rotation from the external angle.
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ %
+ % Get the set of angles for the appropriate border point.
+ %
+ \ifx\referencepoint\basepoint%
+ \let\angletotip\baseangletotip%
+ \let\angletotailcenter\baseangletotailcenter%
+ \let\angletolefttail\baseangletolefttail%
+ \let\angletorighttail\baseangletorighttail%
+ \else%
+ \ifx\referencepoint\midpoint%
+ \let\angletotip\midangletotip%
+ \let\angletotailcenter\midangletotailcenter%
+ \let\angletolefttail\midangletolefttail%
+ \let\angletorighttail\midangletorighttail%
+ \fi\fi%
+ %
+ % Locate the appropriate line on the border...
+ %
+ \ifdim\externalangle pt<\angletotip pt\relax%
+ \let\firstpoint\tipborderpoint%
+ \let\secondpoint\righttailborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletolefttail pt\relax%
+ \let\firstpoint\lefttailborderpoint%
+ \let\secondpoint\tipborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletotailcenter pt\relax%
+ \let\firstpoint\lefttailborderpoint%
+ \let\secondpoint\tailcenterborderpoint%
+ \else%
+ \ifdim\externalangle pt<\angletorighttail pt\relax%
+ \let\firstpoint\righttailborderpoint%
+ \let\secondpoint\tailcenterborderpoint%
+ \else%
+ \let\firstpoint\tipborderpoint%
+ \let\secondpoint\righttailborderpoint%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ %
+ % ...and thus the point on the border.
+ %
+ \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ }%
+}%
+
+
+
+% Keys for shape circular sector:
+%
+% /pgf/circular sector angle : the angle at the center of the sector.
+%
+\pgfkeys{/pgf/circular sector angle/.initial=60}%
+
+% Shape circular sector
+%
+\pgfdeclareshape{circular sector}{%
+ \savedmacro\installcircularsectorparameters{%
+ %
+ % Define a \centerpoint, \basepoint and \midpoint.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % Half of the sector angle is more useful.
+ %
+ \pgfmathmod{\pgfkeysvalueof{/pgf/circular sector angle}}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\angle\pgfmathresult%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\halfangle\pgfmathresult%
+ %
+ % Get some useful trigonometric stuff.
+ %
+ \pgfmathsin@{\halfangle}%
+ \let\sinehalfangle\pgfmathresult%
+ \pgfmathreciprocal@{\pgfmathresult}%
+ \let\cosechalfangle\pgfmathresult%
+ \pgfmathabs@{\halfangle}%
+ \pgfmathcos@{\pgfmathresult}%
+ \let\coshalfangle\pgfmathresult%
+ \pgf@x\pgfmathresult pt\relax%
+ \pgf@x\cosechalfangle\pgf@x%
+ \edef\cothalfangle{\pgfmath@tonumber{\pgf@x}}%
+ %
+ % Calculate the miter length at the center,
+ % according to the outer sep.
+ %
+ \pgf@x\outersep\relax%
+ \pgf@x\cosechalfangle\pgf@x%
+ \edef\centermiter{\the\pgf@x}%
+ %
+ % Get the start and end angles of the arc.
+ %
+ \pgfmathsubtract@{180}{\halfangle}%
+ \let\startangle\pgfmathresult%
+ \pgfmathadd@{180}{\halfangle}%
+ \let\endangle\pgfmathresult%
+ %
+ % Get (half) the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ % Calculate the radius of the sector and the `center offset',
+ % which is the distance between the center of the node and the
+ % center of the sector.
+ %
+ \ifpgfshapeborderusesincircle%
+ %
+ % Get the rotation.
+ %
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ %
+ % Calculate the incircle radius.
+ %
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ \pgf@xa\cosechalfangle\pgf@x%
+ %
+ % xa is the radius, xb the offset.
+ %
+ \pgf@xb\pgf@xa%
+ \advance\pgf@xa\pgf@x%
+ \else%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % Swap the height and width for relevant angles.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ %
+ % xa is the radius, xb the offset.
+ %
+ \pgf@xa\cosechalfangle\pgf@y%
+ \pgf@xa\coshalfangle\pgf@xa%
+ \advance\pgf@xa\pgf@x%
+ \pgf@xb\pgf@xa%
+ \advance\pgf@xa\pgf@x%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgf@xa\pgfmathresult pt\relax%
+ \fi%
+ %
+ % Adjust for minimum height and width.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgf@x.5\pgf@x%
+ \pgfmathsec@{\halfangle}%
+ \pgf@xc\pgfmathresult\pgf@xb%
+ \ifdim\pgf@xc<0pt\relax%
+ \pgf@xc-\pgf@xc%
+ \fi%
+ \ifdim\pgf@xc<\pgf@x%
+ \pgfmathreciprocal{\pgfmath@tonumber{\pgf@xc}}%
+ \pgf@xc\pgfmathresult\pgf@x% Increase by ratio.
+ \pgf@xa\pgfmath@tonumber{\pgf@xc}\pgf@xa%
+ \pgf@xb\pgfmath@tonumber{\pgf@xc}\pgf@xb%
+ \fi%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@xa<\pgf@y%
+ \pgfmathreciprocal{\pgfmath@tonumber{\pgf@xa}}%
+ \pgf@xc\pgfmathresult\pgf@y% Increase by ratio.
+ \pgf@xa\pgf@y%
+ \pgf@xb\pgfmath@tonumber{\pgf@xc}\pgf@xb%
+ \fi%
+ \edef\centeroffset{\the\pgf@xb}%
+ \edef\radius{\the\pgf@xa}%
+ %
+ % Calculate the radius at sector border and the arc corners.
+ %
+ \advance\pgf@xa\outersep\relax%
+ \edef\borderradius{\the\pgf@xa}%
+ \pgf@x\outersep\relax%
+ \pgf@x\cosechalfangle\pgf@x%
+ \pgf@x\coshalfangle\pgf@x%
+ \advance\pgf@xa\pgf@x%
+ \edef\cornerradius{\the\pgf@xa}%
+ %
+ % Calculate the *unrotated* points for the background path.
+ %
+ \pgfextract@process\sectorcenter{%
+ \centerpoint%
+ \advance\pgf@x\centeroffset%
+ }%
+ \pgfextract@process\arcstart{%
+ \pgfqpointpolar{\startangle}{\radius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \sectorcenter%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Calculate the *unrotated* points for the anchor border.
+ %
+ \pgfextract@process\sectorcenterborder{%
+ \sectorcenter%
+ \advance\pgf@x\centermiter\relax%
+ }%
+ \pgfextract@process\arcstartborder{%
+ \pgfqpointpolar{\startangle}{\borderradius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \sectorcenter%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfextract@process\arcendborder{%
+ \pgfqpointpolar{\endangle}{\borderradius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \sectorcenter%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfextract@process\arcstartcorner{%
+ \pgfqpointpolar{\startangle}{\cornerradius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \sectorcenterborder%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfextract@process\arcendcorner{%
+ \pgfqpointpolar{\endangle}{\cornerradius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \sectorcenterborder%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Calculate the *unrotated* corner angles to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\sectorcenterborder}%
+ \let\angletosectorcenterborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcstartborder}%
+ \let\angletoarcstartborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcendborder}%
+ \let\angletoarcendborder\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcstartcorner}%
+ \let\angletoarcstartcorner\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcendcorner}%
+ \let\angletoarcendcorner\pgfmathresult%
+ %
+ % Rotate the background path points around the note center.
+ %
+ \pgfextract@process\sectorcenter{%
+ \pgfmathrotatepointaround{\sectorcenter}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcstart{%
+ \pgfmathrotatepointaround{\arcstart}{\centerpoint}{\rotate}%
+ }%
+ %
+ % Rotate the border points around the note center.
+ %
+ \pgfextract@process\sectorcenterborder{%
+ \pgfmathrotatepointaround{\sectorcenterborder}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcstartborder{%
+ \pgfmathrotatepointaround{\arcstartborder}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcendborder{%
+ \pgfmathrotatepointaround{\arcendborder}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcstartcorner{%
+ \pgfmathrotatepointaround{\arcstartcorner}{\centerpoint}{\rotate}%
+ }%
+ \pgfextract@process\arcendcorner{%
+ \pgfmathrotatepointaround{\arcendcorner}{\centerpoint}{\rotate}%
+ }%
+ %
+ % Add the rotation to the start and end angles.
+ %
+ \pgfmathadd@{\startangle}{\rotate}%
+ \let\startangle\pgfmathresult%
+ \pgfmathadd@{\endangle}{\rotate}%
+ \let\endangle\pgfmathresult%
+ %
+ % Save everything.
+ %
+ % NB \addtosavedmacro is currently experimental. May get changed.
+ %
+ \addtosavedmacro{\rotate}%
+ \addtosavedmacro{\centeroffset}%
+ %
+ \addtosavedmacro{\radius}%
+ \addtosavedmacro{\borderradius}%
+ \addtosavedmacro{\cornerradius}%
+ %
+ \addtosavedmacro{\endangle}%
+ \addtosavedmacro{\startangle}%
+ %
+ \addtosavedmacro{\sectorcenter}%
+ \addtosavedmacro{\arcstart}%
+ %
+ \addtosavedmacro{\sectorcenterborder}%
+ \addtosavedmacro{\arcstartborder}%
+ \addtosavedmacro{\arcendborder}%
+ \addtosavedmacro{\arcstartcorner}%
+ \addtosavedmacro{\arcendcorner}%
+ %
+ \addtosavedmacro{\angletosectorcenterborder}%
+ \addtosavedmacro{\angletoarcstartborder}%
+ \addtosavedmacro{\angletoarcendborder}%
+ \addtosavedmacro{\angletoarcstartcorner}%
+ \addtosavedmacro{\angletoarcendcorner}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{arc start}{%
+ \installcircularsectorparameters%
+ \arcstartcorner%
+ }%
+ \anchor{arc end}{%
+ \installcircularsectorparameters%
+ \arcendcorner%
+ }%
+ \anchor{sector center}{%
+ \installcircularsectorparameters%
+ \sectorcenterborder%
+ }%
+ \anchor{arc center}{%
+ \installcircularsectorparameters%
+ \pgfmathadd@{\rotate}{180}%
+ \let\angle\pgfmathresult%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpointpolar{\angle}{\cornerradius}}%
+ }%
+ \anchor{north}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{0pt}{\cornerradius}}%
+ }%
+ \anchor{south}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{0pt}{-\cornerradius}}%
+ }%
+ \anchor{east}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{0pt}}%
+ }%
+ \anchor{north west}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{\cornerradius}}%
+ }%
+ \anchor{south west}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{-\cornerradius}}%
+ }%
+ \anchor{north east}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{\cornerradius}}%
+ }%
+ \anchor{south east}{%
+ \installcircularsectorparameters%
+ \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{-\cornerradius}}%
+ }%
+ \backgroundpath{%
+ \installcircularsectorparameters%
+ \pgfpathmoveto{\sectorcenter}%
+ \pgfpathlineto{\arcstart}%
+ \ifdim\endangle pt>360pt\relax%
+ \ifdim\startangle pt>360pt\relax%
+ \pgfpatharc{\startangle}{\endangle}{\radius}%
+ \else%
+ \pgfpatharc{\startangle}{360}{\radius}%
+ \pgfpatharc{0}{\endangle}{\radius}%
+ \fi%
+ \else%
+ \pgfpatharc{\startangle}{\endangle}{\radius}%
+ \fi%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Install the required points and angles.
+ %
+ \installcircularsectorparameters%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ \let\externalangle\pgfmathresult%
+ %
+ % *Subtract* the rotation from the external angle.
+ %
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\angle\pgfmathresult%
+ %
+ % Determine if the line will cross the sector arc.
+ %
+ \ifdim\angle pt>\angletoarcendcorner pt\relax%
+ \let\firstpoint\arcendcorner%
+ \let\secondpoint\sectorcenterborder%
+ \else%
+ \ifdim\angle pt>\angletoarcendborder pt\relax%
+ \let\firstpoint\arcendborder%
+ \let\secondpoint\arcendcorner%
+ \else%
+ \ifdim\angle pt>\angletoarcstartborder pt\relax%
+ \let\firstpoint\pgfutil@empty%
+ \let\secondpoint\pgfutil@empty%
+ \else%
+ \ifdim\angle pt>\angletoarcstartcorner pt\relax%
+ \let\firstpoint\arcstartborder
+ \let\secondpoint\arcstartcorner
+ \else%
+ \let\firstpoint\sectorcenterborder%
+ \let\secondpoint\arcstartcorner%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\firstpoint\pgfutil@empty
+ %
+ % Calculate the angle from the centre of the semicircle to the
+ % point on the semicircle arc which intersects the line from
+ % the external point to the reference point...
+ %
+ \pgfmathanglebetweenlines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\sectorcenter}{\centerpoint}%
+ \pgfmathsin@{\pgfmathresult}%
+ \let\sineangle\pgfmathresult%
+ \pgf@x\borderradius\relax%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}%
+ \let\reciprocalradius\pgfmathresult%
+ \pgf@x\centeroffset\relax%
+ \pgf@x\sineangle\pgf@x%
+ \pgf@x\reciprocalradius\pgf@x%
+ \pgfmathasin@{\pgfmath@tonumber{\pgf@x}}%
+ \pgf@x\pgfmathresult pt\relax%
+ \advance\pgf@x\externalangle pt\relax%
+ \edef\angle{\pgfmath@tonumber{\pgf@x}}%
+ %
+ % ...and thus the point on the border.
+ %
+ \pgfpointadd{\sectorcenter}{\pgfqpointpolar{\angle}{\borderradius}}%
+ \else%
+ %
+ % Calculate the the point where the semicircle chord intersects
+ % the line from the external point to the reference point.
+ %
+ \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ \fi%
+ }%
+}%
+
+
+
+% Keys for shape cylinder
+%
+% /pgf/shape aspect : Ratio between the x and y radii of the cylinder end.
+% /pgf/cylinder uses custom fill : Use a custom fill for the cylinder.
+% /pgf/cylinder end fill : Custom color for the cylinder end.
+% /pgf/cylinder body fill : Custom color for the cylinder body.
+%
+
+\newif\ifpgfcylinderusescustomfill
+\pgfkeys{/pgf/.cd,
+ cylinder uses custom fill/.is if=pgfcylinderusescustomfill,
+ cylinder end fill/.initial=white,
+ cylinder body fill/.initial=white,
+}%
+
+
+\pgfdeclareshape{cylinder}{%
+ \savedmacro\getcylinderpoints{%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgf@x\pgf@xc%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgf@y\pgf@yc%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \ifpgfshapeborderusesincircle%
+ \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \else%
+ \pgf@y\pgf@x%
+ \fi%
+ \pgf@x1.414213\pgf@x%
+ \pgf@y1.414213\pgf@y%
+ \else%
+ \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \pgfmathsetcount\c@pgf@counta{+\pgfmathresult}%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \edef\rotate{\the\c@pgf@counta}%
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xa%
+ \pgf@yc\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xa\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xa%
+ \pgf@yc\pgf@xc%
+ \fi%
+ \fi%
+ \fi%
+ \addtosavedmacro\rotate%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfutil@tempdima\pgfshapeaspect\pgf@ya%
+ \pgfutil@tempdimb\pgf@ya%
+ %
+ % Adjust for minimum height.
+ %
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgfutil@tempdimb<.5\pgf@xc\relax%
+ \pgfutil@tempdimb.5\pgf@xc%
+ \pgf@ya\pgfutil@tempdimb%
+ \fi%
+ %
+ % Calculate how far the node contents can extend into the cylinder bottom.
+ %
+ \pgf@yb\pgfutil@tempdimb%
+ \advance\pgf@yb-\pgf@yc%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yb}}{\pgfmath@tonumber{\pgfutil@tempdimb}}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ \let\angle\pgfmathresult%
+ \pgf@xb\pgfmathresult\pgfutil@tempdima%
+ %
+ % Adjust for minimum width.
+ %
+ \pgf@x.5\pgflinewidth%
+ \advance\pgf@x2.0\pgf@xa%
+ \advance\pgf@x3.0\pgfutil@tempdima%
+ \advance\pgf@x-\pgf@xb%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<\pgf@xc%
+ \advance\pgf@xc-\pgf@x%
+ \advance\pgf@xa.5\pgf@xc%
+ \fi%
+ %
+ % Add the larger of the outer sep to the radii.
+ %
+ \pgf@x\pgfutil@tempdima\relax%
+ \pgf@y\pgfutil@tempdimb\relax%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xc>\pgf@yc%
+ \advance\pgf@x\pgf@xc%
+ \advance\pgf@y\pgf@xc%
+ \edef\outersep{\the\pgf@xc}%
+ \else%
+ \advance\pgf@x\pgf@yc%
+ \advance\pgf@y\pgf@yc%
+ \edef\outersep{\the\pgf@yc}%
+ \fi%
+ \edef\xradius{\the\pgf@x}%
+ \edef\yradius{\the\pgf@y}%
+ \addtosavedmacro\xradius%
+ \addtosavedmacro\yradius%
+ \addtosavedmacro\outersep%
+ %
+ \pgfextract@process\cylindercenter{%
+ \pgf@x\pgfutil@tempdima%
+ \advance\pgf@x.5\pgflinewidth%
+ \advance\pgf@x\pgf@xb%
+ \pgf@x.5\pgf@x%
+ \pgf@y0pt%
+ }%
+ \addtosavedmacro\cylindercenter%
+ %
+ \pgfextract@process\beforetop{%
+ \pgf@x\pgf@xa%
+ \advance\pgf@x\pgfutil@tempdima%
+ \advance\pgf@x.5\pgflinewidth%
+ \pgf@y\pgf@ya%
+ }%
+ \pgfextract@process\afterbottom{%
+ \pgf@x-\pgf@xa%
+ \advance\pgf@x\pgf@xb%
+ \pgf@y\pgf@ya%
+ }%
+ \addtosavedmacro\beforetop%
+ \addtosavedmacro\afterbottom%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgfextract@process\beforetopanchor{%
+ \beforetop%
+ \advance\pgf@y\pgf@yc%
+ }%
+ \pgfextract@process\afterbottomanchor{%
+ \afterbottom%
+ \advance\pgf@y\pgf@yc%
+ }%
+ \addtosavedmacro\beforetopanchor%
+ \addtosavedmacro\afterbottomanchor%
+ %
+ \beforetopanchor%
+ \advance\pgf@x\xradius\relax%
+ \ifdim\pgf@x>\pgf@y%
+ \edef\externalradius{\the\pgf@x}%
+ \else%
+ \edef\externalradius{\the\pgf@y}%
+ \fi%
+ \addtosavedmacro\externalradius%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{shape center}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{\pgfpointadd{\cylindercenter}{\centerpoint}}%
+ {\centerpoint}{\rotate}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \getcylinderpoints%
+ \let\pgf@cylinder@referencepoint\midpoint%
+ \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{mid west}{%
+ \getcylinderpoints%
+ \let\pgf@cylinder@referencepoint\midpoint%
+ \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \getcylinderpoints%
+ \let\pgf@cylinder@referencepoint\basepoint%
+ \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{base west}{%
+ \getcylinderpoints%
+ \let\pgf@cylinder@referencepoint\basepoint%
+ \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north east}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north west}{%
+ \getcylinderpoints%
+ \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{before top}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor}{\centerpoint}}{\centerpoint}{\rotate}%
+ }%
+ \anchor{top}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \beforetop%
+ \pgf@y0pt\relax%
+ \advance\pgf@x\xradius\relax%
+ }{\centerpoint}}{\centerpoint}{\rotate}%
+ }%
+ \anchor{after top}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}{\centerpoint}{\rotate}%
+ }%
+ \anchor{before bottom}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}{\centerpoint}{\rotate}%
+ }%
+ \anchor{bottom}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{%
+ \pgfpointadd{%
+ \afterbottom%
+ \pgf@y0pt\relax%
+ \advance\pgf@x-\xradius\relax%
+ }{\centerpoint}}{\centerpoint}{\rotate}%
+ }%
+ \anchor{after bottom}{%
+ \getcylinderpoints%
+ \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor}{\centerpoint}}{\centerpoint}{\rotate}%
+ }%
+ \backgroundpath{%
+ \getcylinderpoints%
+ {%
+ \pgf@x\xradius\relax%
+ \advance\pgf@x-\outersep\relax%
+ \edef\xradius{\the\pgf@x}%
+ \pgf@y\yradius\relax%
+ \advance\pgf@y-\outersep\relax%
+ \edef\yradius{\the\pgf@y}%
+ \pgftransformshift{\centerpoint}%
+ \pgftransformrotate{\rotate}%
+ \pgfpathmoveto{\afterbottom}%
+ \pgfpatharc{90}{270}{\xradius and \yradius}%
+ \pgfpathlineto{\beforetop\pgf@y-\pgf@y}%
+ \pgfpatharc{-90}{90}{\xradius and \yradius}%
+ \pgfpathclose%
+ \pgfpathmoveto{\beforetop}%
+ \pgfpatharc{90}{270}{\xradius and \yradius}%
+ }%
+ }%
+ \behindbackgroundpath{%
+ \ifpgfcylinderusescustomfill%
+ \getcylinderpoints%
+ \pgf@x\xradius\relax%
+ \advance\pgf@x-\outersep\relax%
+ \edef\xradius{\the\pgf@x}%
+ \pgf@y\yradius\relax%
+ \advance\pgf@y-\outersep\relax%
+ \edef\yradius{\the\pgf@y}%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgftransformrotate{\rotate}%
+ \pgfpathmoveto{\afterbottom}%
+ \pgfpatharc{90}{270}{\xradius and \yradius}%
+ \pgfpathlineto{\beforetop\pgf@y-\pgf@y}%
+ \pgfpatharc{270}{90}{\xradius and \yradius}%
+ \pgfpathclose%
+ \expandafter\pgfsetfillcolor\expandafter{\pgfkeysvalueof{/pgf/cylinder body fill}}%
+ \pgfusepath{fill}%
+ %
+ \pgfpathmoveto{\beforetop}%
+ \pgfpatharc{90}{-270}{\xradius and \yradius}%
+ \pgfpathclose
+ \expandafter\pgfsetfillcolor\expandafter{\pgfkeysvalueof{/pgf/cylinder end fill}}%
+ \pgfusepath{fill}%
+ }%
+ \fi%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \getcylinderpoints%
+ \pgfutil@ifundefined{pgf@cylinder@referencepoint}{\let\referencepoint\centerpoint}{%
+ \let\referencepoint\pgf@cylinder@referencepoint}%
+ \pgfextract@process\externalpoint{%
+ \externalpoint%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \referencepoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ %
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\afterbottomanchor}{\centerpoint}}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\beforetopanchor}{\centerpoint}}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathrotatepointaround{%
+ \pgfmathpointintersectionoflineandarc%
+ {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}%
+ {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}%
+ {%
+ \beforetop%
+ \pgf@xa\pgf@x%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ }%
+ {0}{90}{\xradius and \yradius}%
+ }{\centerpoint}{\rotate}%
+ \else%
+ \pgfpointintersectionoflines{%
+ \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor}{\centerpoint}}%
+ {\centerpoint}{\rotate}}{%
+ \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor}{\centerpoint}}%
+ {\centerpoint}{\rotate}}%
+ {\referencepoint}{\externalpoint}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}%
+ \ifdim\externalangle pt>\pgfmathresult pt\relax%
+ \pgfmathrotatepointaround{%
+ \pgfmathpointintersectionoflineandarc%
+ {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}%
+ {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}%
+ {%
+ \beforetop%
+ \pgf@xa\pgf@x%
+ \centerpoint
+ \advance\pgf@x\pgf@xa%
+ }%
+ {270}{360}{\xradius and \yradius}%
+ }{\centerpoint}{\rotate}%
+ \else%
+ \pgfpointintersectionoflines{%
+ \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}%
+ {\centerpoint}{\rotate}}{%
+ \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}%
+ {\centerpoint}{\rotate}}%
+ {\referencepoint}{\externalpoint}%
+ \fi%
+ \else%
+ \pgfmathrotatepointaround{%
+ \pgfmathpointintersectionoflineandarc%
+ {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}%
+ {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}%
+ {%
+ \afterbottom%
+ \pgf@xa\pgf@x%
+ \centerpoint
+ \advance\pgf@x\pgf@xa%
+ }%
+ {90}{270}{\xradius and \yradius}%
+ }{\centerpoint}{\rotate}%
+ \fi%
+ \fi%
+ }%
+}%
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.misc.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.misc.code.tex
new file mode 100644
index 0000000000..fe64c707c1
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.misc.code.tex
@@ -0,0 +1,1127 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibraryshapes.misc.code.tex}
+
+
+\pgfdeclareshape{cross out}
+{%
+ \inheritsavedanchors[from=rectangle]% % this is nearly a rectangle
+ \inheritanchorborder[from=rectangle]%
+ \inheritanchor[from=rectangle]{north}%
+ \inheritanchor[from=rectangle]{north west}%
+ \inheritanchor[from=rectangle]{north east}%
+ \inheritanchor[from=rectangle]{center}%
+ \inheritanchor[from=rectangle]{west}%
+ \inheritanchor[from=rectangle]{east}%
+ \inheritanchor[from=rectangle]{mid}%
+ \inheritanchor[from=rectangle]{mid west}%
+ \inheritanchor[from=rectangle]{mid east}%
+ \inheritanchor[from=rectangle]{base}%
+ \inheritanchor[from=rectangle]{base west}%
+ \inheritanchor[from=rectangle]{base east}%
+ \inheritanchor[from=rectangle]{south}%
+ \inheritanchor[from=rectangle]{south west}%
+ \inheritanchor[from=rectangle]{south east}%
+ \foregroundpath{
+ % store lower right in xa/ya and upper right in xb/yb
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
+ }%
+}%
+
+
+\pgfdeclareshape{strike out}
+{%
+ \inheritsavedanchors[from=rectangle]% % this is nearly a rectangle
+ \inheritanchorborder[from=rectangle]%
+ \inheritanchor[from=rectangle]{north}%
+ \inheritanchor[from=rectangle]{north west}%
+ \inheritanchor[from=rectangle]{north east}%
+ \inheritanchor[from=rectangle]{center}%
+ \inheritanchor[from=rectangle]{west}%
+ \inheritanchor[from=rectangle]{east}%
+ \inheritanchor[from=rectangle]{mid}%
+ \inheritanchor[from=rectangle]{mid west}%
+ \inheritanchor[from=rectangle]{mid east}%
+ \inheritanchor[from=rectangle]{base}%
+ \inheritanchor[from=rectangle]{base west}%
+ \inheritanchor[from=rectangle]{base east}%
+ \inheritanchor[from=rectangle]{south}%
+ \inheritanchor[from=rectangle]{south west}%
+ \inheritanchor[from=rectangle]{south east}%
+ \foregroundpath{
+ \pgfpathmoveto{\southwest}
+ \pgfpathlineto{\northeast}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
+ }%
+}%
+
+
+% Rounded rectangle
+
+
+\pgfkeys{/pgf/.cd,
+ rounded rectangle west arc/.initial=convex,
+ rounded rectangle east arc/.initial=convex,
+ rounded rectangle left arc/.style={/pgf/rounded rectangle west arc=#1},%
+ rounded rectangle right arc/.style={/pgf/rounded rectangle east arc=#1},%
+ rounded rectangle arc length/.initial=180%
+}%
+
+\def\pgf@lib@sh@misc@rr@text@concave{concave}%
+\def\pgf@lib@sh@misc@rr@text@convex{convex}%
+
+\pgfdeclareshape{rounded rectangle}{%
+ \savedmacro\westarc{%
+ \edef\westarc{\pgfkeysvalueof{/pgf/rounded rectangle west arc}}%
+ }%
+ \savedmacro\eastarc{%
+ \edef\eastarc{\pgfkeysvalueof{/pgf/rounded rectangle east arc}}%
+ }%
+ \savedmacro\roundedrectanglepoints{%
+ %
+ % Get half the arc angle, a.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/rounded rectangle arc length}}%
+ \pgf@x=.5\pgf@x%
+ \edef\halfarcangle{\pgfmath@tonumber{\pgf@x}}%
+ \addtosavedmacro\halfarcangle%
+ %
+ % Get the (half) node dimensions x & y.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \edef\innerxsep{\the\pgf@x}%
+ \pgf@xa=0.5\wd\pgfnodeparttextbox%
+ \edef\halftextwidth{\the\pgf@xa}%
+ \addtosavedmacro\halftextwidth%
+ \advance\pgf@x by\pgf@xa%
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \edef\innerysep{\the\pgf@y}%
+ \pgf@ya=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya by.5\dp\pgfnodeparttextbox%
+ \edef\halftextheight{\the\pgf@ya}%
+ \addtosavedmacro\halftextheight%
+ \advance\pgf@y by\pgf@ya%
+ %
+ % Adjust for minimum height
+ %
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<.5\pgf@yb%
+ \pgf@y=.5\pgf@yb%
+ \fi%
+ \edef\halfheight{\the\pgf@y}%
+ \addtosavedmacro\halfheight%
+ %
+ % Calculate the radius of the arc ends.
+ %
+ \pgfmathcosec@{\halfarcangle}%
+ \pgf@ya=\pgfmathresult\pgf@y%
+ \edef\radius{\the\pgf@ya}%
+ \addtosavedmacro\radius%
+ %
+ % Arc width = r - r*cos(a/2).
+ %
+ \pgfmathcos@{\halfarcangle}%
+ \pgf@xa=\pgf@ya%
+ \advance\pgf@xa by-\pgfmathresult\pgf@ya%
+ %
+ % When the node contents are pushed inside a convex arc,
+ % the resulting chord has a height r - r*cos(asin(0.5*h/r)).
+ %
+ \pgfmathdivide{\halftextheight}{\radius}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathcos@{\pgfmathresult}%
+ \pgf@xb=\pgf@ya%
+ \advance\pgf@xb by-\pgfmathresult\pgf@ya%
+ %
+ % Adjust for minimum width.
+ %
+ \edef\westarc{\pgfkeysvalueof{/pgf/rounded rectangle west arc}}%
+ \edef\eastarc{\pgfkeysvalueof{/pgf/rounded rectangle east arc}}%
+ %
+ \pgfutil@tempdima=2.0\pgf@x% x still holds the half width.
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@concave%
+ \advance\pgfutil@tempdima by\pgf@xa%
+ \else%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@convex%
+ \advance\pgfutil@tempdima by\pgf@xb%
+ \fi%
+ \fi%
+ %
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@concave%
+ \advance\pgfutil@tempdima by\pgf@xa%
+ \else%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \advance\pgfutil@tempdima by\pgf@xb%
+ \fi%
+ \fi%
+ %
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgfutil@tempdima<\pgfutil@tempdimb%
+ \advance\pgfutil@tempdimb by-\pgfutil@tempdima%
+ \divide\pgfutil@tempdimb by2\relax%
+ \edef\xoffset{\the\pgfutil@tempdimb}%
+ \else%
+ \let\xoffset=\innerxsep%
+ \fi%
+ %
+ % The node is made wider if convex arcs overlap.
+ %
+ \pgf@x=\halftextwidth\relax%
+ \advance\pgf@x by\xoffset\relax%
+ \pgf@xc=\pgf@ya%
+ \advance\pgf@xc by-\pgf@xb%
+ \ifdim\pgf@xc>\pgf@x\relax%
+ \advance\pgf@xc by-\pgf@x%
+ \advance\pgf@xc by\xoffset\relax%
+ \edef\xoffset{\the\pgf@xc}%
+ \fi%
+ \addtosavedmacro\xoffset%
+ %
+ \pgf@x=\halftextwidth\relax%
+ \advance\pgf@x by\xoffset\relax%
+ \edef\halfwidth{\the\pgf@x}%
+ \addtosavedmacro\halfwidth%
+ %
+ \edef\arcwidth{\the\pgf@xa}%
+ \addtosavedmacro\arcwidth%
+ %
+ \edef\chordwidth{\the\pgf@xb}%
+ \addtosavedmacro\chordwidth%
+ %
+ \pgfmathsetlengthmacro\outerxsep{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlengthmacro\outerysep{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \addtosavedmacro\outerxsep%
+ \addtosavedmacro\outerysep%
+ %
+ % calculate some horizontal adjustments made for the default miter
+ % drawn when an arc meets the north or south side of the node path.
+ %
+ \ifdim\halfarcangle pt=90pt\relax% Avoid division by zero.
+ \def\concavexshift{0pt}%
+ \else%
+ % For a concave arc: outer xsep * cosec((90-a/2)/2)*cos((90-a/2)/2).
+ \pgfmathsubtract@{90}{\halfarcangle}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\angletemp=\pgfmathresult%
+ \pgf@x=\outerxsep\relax%
+ \pgfmathcosec@{\angletemp}%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \pgfmathcos@{\angletemp}%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \edef\concavexshift{\the\pgf@x}%
+ \fi%
+ \addtosavedmacro\concavexshift%
+ %
+ \ifdim\halfarcangle pt=90pt\relax% Avoid division by zero.
+ \def\convexxshift{0pt}%
+ \else%
+ % For a convex arc: outer xsep * cosec((90+a/2)/2)*cos((90+a/2)/2).
+ \pgfmathadd@{90}{\halfarcangle}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\angletemp=\pgfmathresult%
+ \pgf@x=\outerxsep\relax%
+ \pgfmathcosec@{\angletemp}%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \pgfmathcos@{\angletemp}%
+ \pgf@x=\pgfmathresult\pgf@x%
+ \edef\convexxshift{\the\pgf@x}%
+ \fi%
+ \addtosavedmacro\convexxshift%
+ }%
+ \saveddimen\halflinewidth{\pgf@x.5\pgflinewidth}%
+ \savedanchor\centerpoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgf@y=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgf@y=0pt\relax%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid west}{%
+ \csname pgf@anchor@rounded rectangle@west\endcsname%
+ \pgf@xc=\pgf@x%
+ \midpoint%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{mid east}{%
+ \csname pgf@anchor@rounded rectangle@east\endcsname%
+ \pgf@xc=\pgf@x%
+ \midpoint%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base west}{%
+ \csname pgf@anchor@rounded rectangle@west\endcsname%
+ \pgf@xc=\pgf@x%
+ \basepoint%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{base east}{%
+ \csname pgf@anchor@rounded rectangle@east\endcsname%
+ \pgf@xc=\pgf@x%
+ \basepoint%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{north}{%
+ \roundedrectanglepoints%
+ \pgfpointadd{\centerpoint}{\pgfpoint{+0pt}{\halfheight+\outerysep}}%
+ }%
+ \anchor{south}{%
+ \roundedrectanglepoints%
+ \pgfpointadd{\centerpoint}{\pgfpoint{+0pt}{-\halfheight-\outerysep}}%
+ }%
+ \anchor{west}{%
+ \roundedrectanglepoints%
+ \pgfpointadd{\centerpoint}{%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@concave%
+ \pgfpoint{-\halfwidth-\arcwidth-\concavexshift}{+0pt}%
+ \else%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpoint{-\halfwidth-\chordwidth-\outerxsep}{+0pt}%
+ \else%
+ \pgfpoint{-\halfwidth-\outerxsep}{+0pt}%
+ \fi%
+ \fi%
+ }%
+ }%
+ \anchor{north west}{%
+ \roundedrectanglepoints%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpointadd{\centerpoint}{\pgfpoint{-\halfwidth-\chordwidth+\arcwidth-\convexxshift}{+0pt}}%
+ \else%
+ \csname pgf@anchor@rounded rectangle@west\endcsname%
+ \fi%
+ \pgf@xc=\pgf@x%
+ \csname pgf@anchor@rounded rectangle@north\endcsname%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{south west}{%
+ \roundedrectanglepoints%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpointadd{\centerpoint}{\pgfpoint{-\halfwidth-\chordwidth+\arcwidth-\convexxshift}{+0pt}}%
+ \else%
+ \csname pgf@anchor@rounded rectangle@west\endcsname%
+ \fi%
+ \pgf@xc=\pgf@x%
+ \csname pgf@anchor@rounded rectangle@south\endcsname%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{east}{%
+ \roundedrectanglepoints%
+ \pgfpointadd{\centerpoint}{%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@concave%
+ \pgfpoint{\halfwidth+\arcwidth+\concavexshift}{+0pt}%
+ \else%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpoint{\halfwidth+\chordwidth+\outerxsep}{+0pt}%
+ \else%
+ \pgfpoint{\halfwidth+\outerxsep}{+0pt}%
+ \fi%
+ \fi%
+ }%
+ }%
+ \anchor{north east}{%
+ \roundedrectanglepoints%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\halfwidth+\chordwidth-\arcwidth+\convexxshift}{+0pt}}%
+ \else%
+ \csname pgf@anchor@rounded rectangle@east\endcsname%
+ \fi%
+ \pgf@xc=\pgf@x%
+ \csname pgf@anchor@rounded rectangle@north\endcsname%
+ \pgf@x=\pgf@xc%
+ }%
+ \anchor{south east}{%
+ \roundedrectanglepoints%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\halfwidth+\chordwidth-\arcwidth+\convexxshift}{+0pt}}%
+ \else%
+ \csname pgf@anchor@rounded rectangle@east\endcsname%
+ \fi%
+ \pgf@xc=\pgf@x%
+ \csname pgf@anchor@rounded rectangle@south\endcsname%
+ \pgf@x=\pgf@xc%
+ }%
+ \backgroundpath{%
+ {%
+ \roundedrectanglepoints%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfpoint{0pt}{\halfheight}}%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@concave%
+ \pgfpathlineto{\pgfpoint{\halfwidth+\arcwidth}{+\halfheight}}%
+ \pgfpatharc{180-\halfarcangle}{180+\halfarcangle}{+\radius}%
+ \else%
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpathlineto{\pgfpoint{\halfwidth+\chordwidth-\arcwidth}{+\halfheight}}%
+ \pgfpatharc{+\halfarcangle}{+-\halfarcangle}{+\radius}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{\halfwidth}{\halfheight}}%
+ \pgfpathlineto{\pgfqpoint{\halfwidth}{-\halfheight}}%
+ \fi%
+ \fi%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@concave%
+ \pgfpathlineto{\pgfpoint{-\halfwidth-\arcwidth}{+-\halfheight}}%
+ \pgfpatharc{+-\halfarcangle}{+\halfarcangle}{+\radius}%
+ \else%
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfpathlineto{\pgfpoint{-\halfwidth-\chordwidth+\arcwidth}{+-\halfheight}}%
+ \pgfpatharc{180+\halfarcangle}{180-\halfarcangle}{+\radius}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{-\halfwidth}{-\halfheight}}%
+ \pgfpathlineto{\pgfqpoint{-\halfwidth}{\halfheight}}%
+ \fi%
+ \fi%
+ \pgfpathclose%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{%
+ \pgfextract@process\externalpoint{}%
+ \pgfpointadd{\centerpoint}{\externalpoint}%
+ }%
+ \roundedrectanglepoints%
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle=\pgfmathresult%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@rounded rectangle@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@rounded rectangle@north east\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ % Between north east and east.
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfextract@process\arccenter{%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\halfwidth+\chordwidth-\radius}{+0pt}}%
+ }%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {\arccenter}{0}{\halfarcangle}{\radius+\outerxsep and \radius+\outerysep}%
+ \else%
+ \pgfpointintersectionoflines%
+ {\csname pgf@anchor@rounded rectangle@north east\endcsname}%
+ {\csname pgf@anchor@rounded rectangle@south east\endcsname}%
+ {\externalpoint}{\centerpoint}%
+ \fi%
+ \else%
+ % Between north west and north east.
+ \pgfpointintersectionoflines%
+ {\csname pgf@anchor@rounded rectangle@north east\endcsname}%
+ {\csname pgf@anchor@rounded rectangle@north west\endcsname}%
+ {\externalpoint}{\centerpoint}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@rounded rectangle@south west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ % Between south west and north west.
+ \ifx\westarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfextract@process\arccenter{%
+ \pgfpointadd{\centerpoint}{\pgfpoint{-\halfwidth-\chordwidth+\radius}{+0pt}}%
+ }%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {\arccenter}{180-\halfarcangle}{180+\halfarcangle}{\radius+\outerxsep and \radius+\outerysep}%
+ \else%
+ \pgfpointintersectionoflines%
+ {\csname pgf@anchor@rounded rectangle@north west\endcsname}%
+ {\csname pgf@anchor@rounded rectangle@south west\endcsname}%
+ {\externalpoint}{\centerpoint}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@rounded rectangle@south east\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ % Between south east and south west.
+ \pgfpointintersectionoflines%
+ {\csname pgf@anchor@rounded rectangle@south east\endcsname}%
+ {\csname pgf@anchor@rounded rectangle@south west\endcsname}%
+ {\externalpoint}{\centerpoint}%
+ \else%
+ % Between east and south east.
+ \ifx\eastarc\pgf@lib@sh@misc@rr@text@convex%
+ \pgfextract@process\arccenter{%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\halfwidth+\chordwidth-\radius}{+0pt}}%
+ }%
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {\arccenter}{360-\halfarcangle}{360}{\radius+\outerxsep and \radius+\outerysep}%
+ \else%
+ \pgfpointintersectionoflines%
+ {\csname pgf@anchor@rounded rectangle@north east\endcsname}%
+ {\csname pgf@anchor@rounded rectangle@south east\endcsname}%
+ {\externalpoint}{\centerpoint}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+
+% Keys for chamfered rectangle
+%
+% /pgf/chamfered rectangle corners : specify the corners to chamfer.
+% /pgf/chamfered rectangle angle : set the angle of the chamfer.
+% /pgf/chamfered rectangle xsep : set the extent of the x chamferling.
+% /pgf/chamfered rectangle ysep : set the extent of the y chamferling.
+
+\pgfkeys{/pgf/chamfered rectangle corners/.store in=\pgf@lib@sh@misc@cr@corners}%
+\pgfkeys{/tikz/chamfered rectangle corners/.store in=\pgf@lib@sh@misc@cr@corners}%
+
+\def\pgf@lib@sh@misc@cr@chamferall{chamfer all}%
+\def\pgf@lib@sh@misc@cr@chamfer{chamfer}%
+\let\pgf@lib@sh@misc@cr@corners\pgf@lib@sh@misc@cr@chamferall
+
+
+\def\pgf@lib@sh@misc@cr@getcorners{%
+ \let\northeastcorner\pgfutil@empty%
+ \let\southeastcorner\pgfutil@empty%
+ \let\southwestcorner\pgfutil@empty%
+ \let\northwestcorner\pgfutil@empty%
+ \expandafter\pgfutil@in@\expandafter{\pgf@lib@sh@misc@cr@corners}{chamfer all}%
+ \ifpgfutil@in@%
+ \let\northeastcorner\pgf@lib@sh@misc@cr@round%
+ \let\southeastcorner\pgf@lib@sh@misc@cr@round%
+ \let\southwestcorner\pgf@lib@sh@misc@cr@round%
+ \let\northwestcorner\pgf@lib@sh@misc@cr@round%
+ \let\pgf@next\relax%
+ \else%
+ \let\pgf@next\pgf@lib@sh@misc@cr@parsecorners%
+ \fi%
+ \pgf@next}%
+
+\def\pgf@lib@sh@misc@cr@parsecorners{%
+ \expandafter\pgf@@chamferedrectangle@parsecorners\pgf@lib@sh@misc@cr@corners,\pgf@stop,%
+}%
+
+\def\pgf@@chamferedrectangle@parsecorners#1,{%
+ \ifx#1\pgf@stop%
+ \let\pgf@next\relax%
+ \else%
+ \pgfutil@in@{@#1@}{@north east@@top left@}%
+ \ifpgfutil@in@%
+ \let\northeastcorner\pgf@lib@sh@misc@cr@chamfer%
+ \else%
+ \pgfutil@in@{@#1@}{@south east@@bottom right@}%
+ \ifpgfutil@in@%
+ \let\southeastcorner\pgf@lib@sh@misc@cr@chamfer%
+ \else%
+ \pgfutil@in@{@#1@}{@south west@@bottom left@}%
+ \ifpgfutil@in@%
+ \let\southwestcorner\pgf@lib@sh@misc@cr@chamfer%
+ \else%
+ \pgfutil@in@{@#1@}{@north west@@top right@}%
+ \ifpgfutil@in@%
+ \let\northwestcorner\pgf@lib@sh@misc@cr@round%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \let\pgf@next\pgf@@@chamferedrectangle@parsecorners%
+ \fi%
+ \pgf@next%
+}%
+\def\pgf@@@chamferedrectangle@parsecorners{%
+ \pgfutil@ifnextchar x{\pgf@@chamferedrectangle@parsecorners}{\pgf@@chamferedrectangle@parsecorners}%
+}%
+
+\pgfkeys{/pgf/.cd,
+ chamfered rectangle angle/.initial=45,%
+ chamfered rectangle xsep/.initial=.666ex,%
+ chamfered rectangle ysep/.initial=.666ex%
+}%
+ \pgfkeys{/pgf/chamfered rectangle sep/.style={%
+ /pgf/chamfered rectangle xsep=#1,/pgf/chamfered rectangle ysep=#1}%
+}%
+
+
+
+
+% Shape chamfered rectangle.
+%
+%
+\pgfdeclareshape{chamfered rectangle}{%
+ \savedmacro\getchamferedrectanglepoints{%
+ \pgf@lib@sh@misc@cr@getcorners%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya.5\dp\pgfnodeparttextbox%
+ %
+ % Get chamfer stuff.
+ %
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/chamfered rectangle angle}}%
+ \ifdim\pgfutil@tempdima<89pt\relax%
+ \ifdim\pgfutil@tempdima<1pt\relax%
+ \pgfutil@tempdima1pt\relax%
+ \fi%
+ \else%
+ \pgfutil@tempdima89pt\relax%
+ \fi%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima90pt\relax%
+ \pgfmathtan@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \let\tanangle\pgfmathresult%
+ \pgfmathcot@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \let\cotangle\pgfmathresult%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/chamfered rectangle xsep}}%
+ \pgf@yc\tanangle\pgf@xb%
+ \ifdim\pgf@yc>\pgf@ya%
+ \pgf@yc\pgf@ya%
+ \pgf@xb\cotangle\pgf@yc%
+ \fi%
+ \pgfmathcot@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/chamfered rectangle ysep}}%
+ \pgf@xc\cotangle\pgf@yb%
+ \ifdim\pgf@xc>\pgf@xa%
+ \pgf@xc\pgf@xa%
+ \pgf@yb\tanangle\pgf@xc%
+ \fi%
+ %
+ % Check for minimum width and height%
+ %
+ \pgfutil@tempdima\pgf@xa%
+ \advance\pgfutil@tempdima\pgf@xb%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgfutil@tempdima<.5\pgfutil@tempdimb%
+ \pgf@xa.5\pgfutil@tempdimb%
+ \advance\pgf@xa-\pgf@xb%
+ \fi%
+ \pgfutil@tempdima\pgf@ya%
+ \advance\pgfutil@tempdima\pgf@yb%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgfutil@tempdima<.5\pgfutil@tempdimb%
+ \pgf@ya.5\pgfutil@tempdimb%
+ \advance\pgf@ya-\pgf@yb%
+ \fi%
+ %
+ % Define the background path points.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
+ }%
+ \pgfextract@process\beforenortheast{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@ya%
+ \advance\pgf@y-\pgf@yc%
+ }%
+ \pgfextract@process\northeast{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ \ifx\northeastcorner\pgfutil@empty%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\afternortheast{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@x-\pgf@xc%
+ \advance\pgf@y\pgf@ya%
+ \advance\pgf@y\pgf@yb%
+ }%
+ \pgfextract@process\northwest{%
+ \centerpoint%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ \ifx\northwestcorner\pgfutil@empty%
+ \advance\pgf@x-\pgf@xb%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\beforesouthwest{%
+ \centerpoint%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@x-\pgf@xb%
+ \advance\pgf@y-\pgf@ya%
+ \advance\pgf@y\pgf@yc%
+ }%
+ \pgfextract@process\southwest{%
+ \centerpoint%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@y-\pgf@ya%
+ \ifx\southwestcorner\pgfutil@empty%
+ \advance\pgf@x-\pgf@xb%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\aftersouthwest{%
+ \centerpoint%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@x\pgf@xc%
+ \advance\pgf@y-\pgf@ya%
+ \advance\pgf@y-\pgf@yb%
+ }%
+ \pgfextract@process\southeast{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y-\pgf@ya%
+ \ifx\southeastcorner\pgfutil@empty%
+ \advance\pgf@x\pgf@xb%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ }%
+ %
+ % Calculate the `miter' vectors.
+ %
+ \pgfmathanglebetweenlines{\beforenortheast}{\afternortheast}{\beforenortheast}%
+ {\beforesouthwest\pgf@ya\pgf@y\beforenortheast\pgf@y\pgf@ya}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \ifdim\pgfutil@tempdima>180pt\relax%
+ \advance\pgfutil@tempdima-180pt\relax%
+ \fi%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \ifdim\pgfutil@tempdima<90pt\relax%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
+ \pgfutil@tempdima0pt\relax%
+ \else%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima90pt\relax%
+ \fi%
+ \pgfextract@process\before@ne@anchor{%
+ \beforenortheast%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfextract@process\before@sw@anchor{%
+ \beforesouthwest%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfqpointpolar{-\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ \pgfmathanglebetweenlines{\afternortheast}{\aftersouthwest\pgf@xa\pgf@x\afternortheast\pgf@x\pgf@xa}%
+ {\afternortheast}{\beforenortheast}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \ifdim\pgfutil@tempdima>270pt\relax%
+ \advance\pgfutil@tempdima-270pt\relax%
+ \fi%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgfutil@tempdima<90pt\relax%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
+ \pgfutil@tempdima90pt\relax%
+ \else%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfutil@tempdimb\pgfmathresult\pgfutil@tempdimb%
+ \fi%
+ %
+ \pgfextract@process\after@ne@anchor{%
+ \afternortheast%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfutil@tempdima-\pgfutil@tempdima%
+ \advance\pgfutil@tempdima180pt\relax%
+ \pgfextract@process\after@sw@anchor{%
+ \aftersouthwest
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfqpointpolar{-\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \addtosavedmacro\before@ne@anchor%
+ \addtosavedmacro\after@ne@anchor%
+ \addtosavedmacro\before@sw@anchor%
+ \addtosavedmacro\after@sw@anchor%
+ \pgfextract@process\ne@anchor{%
+ \ifx\northeastcorner\pgfutil@empty%
+ \northeast%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \else%
+ \pgfpointlineattime{0.5}{\before@ne@anchor}{\after@ne@anchor}%
+ \fi%
+ }%
+ \pgfextract@process\nw@anchor{%
+ \ifx\northwestcorner\pgfutil@empty%
+ \northwest%
+ \pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \else%
+ \pgfpointlineattime{0.5}{%
+ \before@ne@anchor%
+ \pgf@ya\pgf@y
+ \before@sw@anchor%
+ \pgf@y\pgf@ya%
+ }{%
+ \after@ne@anchor%
+ \pgf@ya\pgf@y
+ \after@sw@anchor%
+ \pgf@y\pgf@ya%
+ }%
+ \fi%
+ }%
+ \pgfextract@process\sw@anchor{%
+ \ifx\southwestcorner\pgfutil@empty%
+ \southwest%
+ \pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
+ \else%
+ \pgfpointlineattime{0.5}{\before@sw@anchor}{\after@sw@anchor}%
+ \fi%
+ }%
+ \pgfextract@process\se@anchor{%
+ \ifx\southeastcorner\pgfutil@empty%
+ \southeast%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
+ \else%
+ \pgfpointlineattime{0.5}{%
+ \before@ne@anchor%
+ \pgf@xa\pgf@x
+ \before@sw@anchor%
+ \pgf@x\pgf@xa%
+ }{%
+ \after@ne@anchor%
+ \pgf@xa\pgf@x
+ \after@sw@anchor%
+ \pgf@x\pgf@xa%
+ }%
+ \fi%
+ }%
+ \addtosavedmacro\ne@anchor%
+ \addtosavedmacro\nw@anchor%
+ \addtosavedmacro\sw@anchor%
+ \addtosavedmacro\se@anchor%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \getchamferedrectanglepoints%
+ \midpoint%
+ \pgf@ya\pgf@y%
+ \pgf@process{%
+ \before@sw@anchor%
+ \pgf@ya\pgf@y%
+ \before@ne@anchor%
+ \pgf@y\pgf@ya%
+ }%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\midpoint}{\midpoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\after@sw@anchor\pgf@ya\pgf@y\after@ne@anchor\pgf@y\pgf@ya}%
+ \else%
+ \pgf@process{\before@ne@anchor}%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\midpoint}{\midpoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\midpoint}{\midpoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor}%
+ {\after@ne@anchor}%
+ \fi%
+ \fi%
+ }%
+ \anchor{mid west}{%
+ \getchamferedrectanglepoints%
+ \midpoint%
+ \pgf@ya\pgf@y%
+ \pgf@process{\before@sw@anchor}%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\midpoint}{\midpoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor}{\after@sw@anchor}%
+ \else%
+ \pgf@process{\before@ne@anchor\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\midpoint}{\midpoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\midpoint}{\midpoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\after@ne@anchor\pgf@ya\pgf@y\after@sw@anchor\pgf@y\pgf@ya}%
+ \fi%
+ \fi%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \getchamferedrectanglepoints%
+ \basepoint%
+ \pgf@ya\pgf@y%
+ \pgf@process{%
+ \before@sw@anchor%
+ \pgf@ya\pgf@y%
+ \before@ne@anchor%
+ \pgf@y\pgf@ya%
+ }%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\basepoint}{\basepoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\after@sw@anchor\pgf@ya\pgf@y\after@ne@anchor\pgf@y\pgf@ya}%
+ \else%
+ \pgf@process{\before@ne@anchor}%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\basepoint}{\basepoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\basepoint}{\basepoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor}%
+ {\after@ne@anchor}%
+ \fi%
+ \fi%
+ }%
+ \anchor{base west}{%
+ \getchamferedrectanglepoints%
+ \basepoint%
+ \pgf@ya\pgf@y%
+ \pgf@process{\before@sw@anchor}%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\basepoint}{\basepoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor}{\after@sw@anchor}%
+ \else%
+ \pgf@process{\before@ne@anchor\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ \ifdim\pgf@ya<\pgf@y%
+ \pgfpointintersectionoflines{\basepoint}{\basepoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@sw@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\basepoint}{\basepoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\before@ne@anchor\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ {\after@ne@anchor\pgf@ya\pgf@y\after@sw@anchor\pgf@y\pgf@ya}%
+ \fi%
+ \fi%
+ }%
+ \anchor{before north east}{\getchamferedrectanglepoints\before@ne@anchor}%
+ \anchor{north east}{\getchamferedrectanglepoints\ne@anchor}%
+ \anchor{after north east}{\getchamferedrectanglepoints\after@ne@anchor}%
+ \anchor{north}{%
+ \getchamferedrectanglepoints%
+ \centerpoint%
+ \pgf@xa\pgf@x%
+ \after@ne@anchor%
+ \pgf@x\pgf@xa}%
+ \anchor{before north west}{%
+ \getchamferedrectanglepoints%
+ \after@sw@anchor%
+ \pgf@xa\pgf@x%
+ \after@ne@anchor%
+ \pgf@x\pgf@xa}%
+ \anchor{north west}{\getchamferedrectanglepoints\nw@anchor}%
+ \anchor{after north west}{%
+ \getchamferedrectanglepoints%
+ \before@sw@anchor%
+ \pgf@xa\pgf@x%
+ \before@ne@anchor%
+ \pgf@x\pgf@xa}%
+ \anchor{west}{%
+ \getchamferedrectanglepoints%
+ \centerpoint%
+ \pgf@ya\pgf@y%
+ \before@sw@anchor%
+ \pgf@y\pgf@ya}%
+ \anchor{before south west}{\getchamferedrectanglepoints\before@sw@anchor}%
+ \anchor{south west}{\getchamferedrectanglepoints\sw@anchor}%
+ \anchor{after south west}{\getchamferedrectanglepoints\after@sw@anchor}%
+ \anchor{south}{%
+ \getchamferedrectanglepoints%
+ \centerpoint%
+ \pgf@xa\pgf@x%
+ \after@sw@anchor%
+ \pgf@x\pgf@xa}%
+ \anchor{before south east}{%
+ \getchamferedrectanglepoints%
+ \after@sw@anchor%
+ \pgf@ya\pgf@y%
+ \after@ne@anchor%
+ \pgf@y\pgf@ya}%
+ \anchor{south east}{\getchamferedrectanglepoints\se@anchor}%
+ \anchor{after south east}{%
+ \getchamferedrectanglepoints%
+ \before@sw@anchor%
+ \pgf@ya\pgf@y%
+ \before@ne@anchor%
+ \pgf@y\pgf@ya}%
+ \anchor{east}{%
+ \getchamferedrectanglepoints%
+ \centerpoint%
+ \pgf@ya\pgf@y%
+ \before@ne@anchor%
+ \pgf@y\pgf@ya}%
+ \backgroundpath{%
+ \pgfpathmoveto{\beforenortheast}%
+ \pgfpathlineto{\northeast}%
+ \pgfpathlineto{\afternortheast}%
+ \pgfpathlineto{\aftersouthwest\pgf@xa\pgf@x\afternortheast\pgf@x\pgf@xa}%
+ \pgfpathlineto{\northwest}%
+ \pgfpathlineto{\beforesouthwest\pgf@xa\pgf@x\beforenortheast\pgf@x\pgf@xa}%
+ \pgfpathlineto{\beforesouthwest}%
+ \pgfpathlineto{\southwest}%
+ \pgfpathlineto{\aftersouthwest}%
+ \pgfpathlineto{\aftersouthwest\pgf@ya\pgf@y\afternortheast\pgf@y\pgf@ya}%
+ \pgfpathlineto{\southeast}%
+ \pgfpathlineto{\beforesouthwest\pgf@ya\pgf@y\beforenortheast\pgf@y\pgf@ya}%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \getchamferedrectanglepoints%
+ \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\pgf@ya\pgf@y\before@sw@anchor\pgf@y\pgf@ya}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% west.
+ \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\pgf@xa\pgf@x\after@ne@anchor\pgf@x\pgf@xa}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% north.
+ \pgfmathanglebetweenpoints{\centerpoint}{\ne@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% north east.
+ \pgfmathanglebetweenpoints{\centerpoint}{\before@ne@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% before north east.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\centerpoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}{\before@ne@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\before@ne@anchor}{\ne@anchor}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\after@ne@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% after north east.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\ne@anchor}{\after@ne@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\after@ne@anchor}{\centerpoint\pgf@xa\pgf@x\after@ne@anchor\pgf@x\pgf@xa}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\nw@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% north west.
+ \pgfmathanglebetweenpoints{\centerpoint}{\after@sw@anchor\pgf@xa\pgf@x\after@ne@anchor\pgf@x\pgf@xa}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% before north west.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\centerpoint\pgf@xa\pgf@x\after@ne@anchor\pgf@x\pgf@xa}%
+ {\after@sw@anchor\pgf@xa\pgf@x\after@ne@anchor\pgf@x\pgf@xa}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\after@sw@anchor\pgf@xa\pgf@x\after@ne@anchor\pgf@x\pgf@xa}%
+ {\nw@anchor}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\before@sw@anchor\pgf@xa\pgf@x\before@ne@anchor\pgf@x\pgf@xa}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% after north west.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\nw@anchor}{\before@sw@anchor\pgf@xa\pgf@x\before@ne@anchor\pgf@x\pgf@xa}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\before@sw@anchor\pgf@xa\pgf@x\before@ne@anchor\pgf@x\pgf@xa}%
+ {\before@sw@anchor\pgf@xa\pgf@x\centerpoint\pgf@x\pgf@xa}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\pgf@xa\pgf@x\after@sw@anchor\pgf@x\pgf@xa}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% south.
+ \pgfmathanglebetweenpoints{\centerpoint}{\sw@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% south west.
+ \pgfmathanglebetweenpoints{\centerpoint}{\before@sw@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% before south west.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\before@sw@anchor\pgf@xa\pgf@x\centerpoint\pgf@x\pgf@xa}%
+ {\before@sw@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\before@sw@anchor}{\sw@anchor}%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\after@sw@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% after south west.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\sw@anchor}{\after@sw@anchor}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\after@sw@anchor}{\centerpoint\pgf@xa\pgf@x\after@sw@anchor\pgf@x\pgf@xa}%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\se@anchor}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% south east.
+ \pgfmathanglebetweenpoints{\centerpoint}{\after@ne@anchor\pgf@xa\pgf@x\after@sw@anchor\pgf@x\pgf@xa}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% before south east.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\after@ne@anchor\pgf@xa\pgf@x\after@sw@anchor\pgf@x\pgf@xa}%
+ {\centerpoint\pgf@xa\pgf@x\after@sw@anchor\pgf@x\pgf@xa}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\after@ne@anchor\pgf@xa\pgf@x\after@sw@anchor\pgf@x\pgf@xa}{\se@anchor}
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\before@ne@anchor\pgf@xa\pgf@x\before@sw@anchor\pgf@x\pgf@xa}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax% after south east.
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\se@anchor}{\before@ne@anchor\pgf@xa\pgf@x\before@sw@anchor\pgf@x\pgf@xa}%
+ \else%
+ \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
+ {\before@ne@anchor\pgf@xa\pgf@x\before@sw@anchor\pgf@x\pgf@xa}%
+ {\centerpoint\pgf@ya\pgf@y\before@ne@anchor\pgf@y\pgf@ya}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.multipart.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.multipart.code.tex
new file mode 100644
index 0000000000..2866923c52
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.multipart.code.tex
@@ -0,0 +1,1356 @@
+% Copyright 2007 by Till Tantau and 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.
+
+\ProvidesFileRCS{pgflibraryshapes.multipart.code.tex}
+
+\newbox\pgfnodepartlowerbox
+
+%
+% A circle that is split in the middle into an upper and a lower part.
+%
+% This node consists of two parts: The upper (main) part is shown in
+% the upper half of the circle. The second part is the (optional)
+% lower part.
+%
+% Parts: text, lower
+
+\pgfdeclareshape{circle split}
+{%
+ %
+ % Node parts
+ %
+ \nodeparts{text,lower}%
+
+ %
+ % Anchors
+ %
+ \savedanchor\centerpoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength{\pgf@y}{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgf@y=-\pgf@y%
+ \advance\pgf@y by-\dp\pgfnodeparttextbox%
+ \advance\pgf@y by-.5\pgflinewidth%
+ }%
+ \savedanchor\loweranchor{%
+ \pgf@x=-.5\wd\pgfnodepartlowerbox%
+ \advance\pgf@x by.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength{\pgf@y}{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgf@y=-2\pgf@y%
+ \advance\pgf@y by-\ht\pgfnodepartlowerbox%
+ \advance\pgf@y by-.5\pgflinewidth%
+ \advance\pgf@y by-\dp\pgfnodeparttextbox%
+ \advance\pgf@y by-.5\pgflinewidth%
+ }%
+
+ \saveddimen\radius{%
+ %
+ % Calculate ``height radius''
+ %
+ %\pgf@ya=.5\ht\pgfnodeparttextbox%
+% \advance\pgf@ya by.5\dp\pgfnodeparttextbox%
+% \advance\pgf@ya by.5\ht\pgfnodepartlowerbox%
+% \advance\pgf@ya by.5\dp\pgfnodepartlowerbox%
+% \advance\pgf@ya by.5\pgflinewidth%
+ %
+ % MW: Suggested correction for above calculation: Use the tallest box * 2.
+ %
+ \pgf@ya=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya by.5\dp\pgfnodeparttextbox%
+ \pgf@yb=.5\ht\pgfnodepartlowerbox%
+ \advance\pgf@yb by.5\dp\pgfnodepartlowerbox%
+ \ifdim\pgf@ya>\pgf@yb\relax%
+ \pgf@ya2.0\pgf@ya\relax%
+ \else%
+ \pgf@ya2.0\pgf@yb\relax%
+ \fi%
+ \advance\pgf@ya by.5\pgflinewidth%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya by2\pgf@yb%
+ %
+ % Calculate ``width radius''
+ %
+ \pgf@xa=.5\wd\pgfnodeparttextbox%
+ \ifdim\pgf@xa<.5\wd\pgfnodepartlowerbox%
+ \pgf@xa=.5\wd\pgfnodepartlowerbox%
+ \fi%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa by\pgf@xb%
+ %
+ % Calculate length of radius vector:
+ %
+ \pgf@process{\pgfpointnormalised{\pgfqpoint{\pgf@xa}{\pgf@ya}}}%
+ \ifdim\pgf@x>\pgf@y%
+ \c@pgf@counta=\pgf@x%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \divide\c@pgf@counta by 255\relax%
+ \pgf@xa=16\pgf@xa\relax%
+ \divide\pgf@xa by\c@pgf@counta%
+ \pgf@xa=16\pgf@xa\relax%
+ \fi%
+ \else%
+ \c@pgf@counta=\pgf@y%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \divide\c@pgf@counta by 255\relax%
+ \pgf@ya=16\pgf@ya\relax%
+ \divide\pgf@ya by\c@pgf@counta%
+ \pgf@xa=16\pgf@ya\relax%
+ \fi%
+ \fi%
+ \pgf@x=\pgf@xa%
+ %
+ % If necessary, adjust radius so that the size requirements are
+ % met:
+ %
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xb%
+ \pgf@x=.5\pgf@xb%
+ \fi%
+ \ifdim\pgf@x<.5\pgf@yb%
+ \pgf@x=.5\pgf@yb%
+ \fi%
+ %
+ % Now, add larger of outer separations.
+ %
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgf@x by\pgf@yb%
+ \else%
+ \advance\pgf@x by\pgf@xb%
+ \fi%
+ }%
+
+ %
+ % Anchors
+ %
+ \inheritanchorborder[from=circle]%
+ \inheritanchor[from=circle]{north}%
+ \inheritanchor[from=circle]{north west}%
+ \inheritanchor[from=circle]{north east}%
+ \inheritanchor[from=circle]{center}%
+ \inheritanchor[from=circle]{west}%
+ \inheritanchor[from=circle]{east}%
+ \inheritanchor[from=circle]{mid}%
+ \inheritanchor[from=circle]{mid west}%
+ \inheritanchor[from=circle]{mid east}%
+ \inheritanchor[from=circle]{base}%
+ \inheritanchor[from=circle]{base west}%
+ \inheritanchor[from=circle]{base east}%
+ \inheritanchor[from=circle]{south}%
+ \inheritanchor[from=circle]{south west}%
+ \inheritanchor[from=circle]{south east}%
+ \anchor{lower}{\loweranchor}%
+
+ %
+ % Background path
+ %
+ \inheritbackgroundpath[from=circle]%
+ \beforebackgroundpath{
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \advance\pgfutil@tempdima by-.5\pgflinewidth%
+ \pgfsetshortenstart{0pt}%
+ \pgfsetshortenend{0pt}%
+ \pgfsetarrows{-}%
+ \pgfpathmoveto{\pgfpointadd{\centerpoint}{\pgfqpoint{-1\pgfutil@tempdima}{0pt}}}%
+ \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpoint{\pgfutil@tempdima}{0pt}}}%
+ \pgfusepath{stroke}%
+ }%
+}%
+
+
+%
+% A circle that is split diagonally into an upper and a lower part.
+%
+% Parts: text, lower
+
+\pgfdeclareshape{circle solidus}{%
+ % Node parts
+ \nodeparts{text,lower}%
+ % Anchors
+ % solidus slants at 45 degrees
+ % text placement minimizes the required radius,
+ % this is achieved placing the "outer" corner
+ % of each box in the line orthogonal to the
+ % solidus which passes through circle center
+ \savedanchor\centerpoint{%
+ \pgf@x=0.5\wd\pgfnodeparttextbox%
+ \advance\pgf@x by0.5\dp\pgfnodeparttextbox%
+ \advance\pgf@x by0.5\ht\pgfnodeparttextbox%
+ \pgf@y=-\pgf@x%
+ \advance\pgf@y by\ht\pgfnodeparttextbox%
+ \advance\pgf@x by0.3536\pgflinewidth%
+ \advance\pgf@y by-0.3536\pgflinewidth%
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x by\pgf@xa%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y by-\pgf@ya%
+ }%
+ \savedanchor\loweranchor{%
+ \pgf@x=0.5\wd\pgfnodeparttextbox%
+ \advance\pgf@x by0.5\dp\pgfnodeparttextbox%
+ \advance\pgf@x by0.5\ht\pgfnodeparttextbox%
+ \pgf@y=-\pgf@x%
+ \advance\pgf@y by\ht\pgfnodeparttextbox%
+ \advance\pgf@x by0.5\ht\pgfnodepartlowerbox%
+ \advance\pgf@x by0.5\dp\pgfnodepartlowerbox%
+ \advance\pgf@x by-0.5\wd\pgfnodepartlowerbox%
+ \advance\pgf@y by-0.5\ht\pgfnodepartlowerbox%
+ \advance\pgf@y by0.5\dp\pgfnodepartlowerbox%
+ \advance\pgf@y by-0.5\wd\pgfnodepartlowerbox%
+ \advance\pgf@x by0.7071\pgflinewidth%
+ \advance\pgf@y by-0.7071\pgflinewidth%
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x by2\pgf@xa%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y by-2\pgf@ya%
+ }%
+ \saveddimen\radius{%
+ % "top" radius
+ \pgf@x=\ht\pgfnodeparttextbox%
+ \advance\pgf@x by\dp\pgfnodeparttextbox%
+ \advance\pgf@x by\wd\pgfnodeparttextbox%
+ % "bottom" radius
+ \pgf@y=\ht\pgfnodepartlowerbox%
+ \advance\pgf@y by\dp\pgfnodepartlowerbox%
+ \advance\pgf@y by\wd\pgfnodepartlowerbox%
+ % use the larger
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x=\pgf@y%
+ \fi%
+ \pgf@x=0.7071\pgf@x%
+ % add spacings
+ \advance\pgf@x by0.5\pgflinewidth%
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgfmathaddtolength{\pgf@x}{veclen(2\pgf@xa,2\pgf@ya)}%
+ % If necessary, adjust radius so that the size requirements are
+ % met:
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x=.5\pgf@xa%
+ \fi%
+ \ifdim\pgf@x<.5\pgf@ya%
+ \pgf@x=.5\pgf@ya%
+ \fi%
+ % Now, add larger of outer separations.
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xa<\pgf@ya%
+ \advance\pgf@x by\pgf@ya%
+ \else%
+ \advance\pgf@x by\pgf@xa%
+ \fi%
+ }%
+ % Anchors
+ \inheritanchorborder[from=circle]%
+ \inheritanchor[from=circle]{north}%
+ \inheritanchor[from=circle]{north west}%
+ \inheritanchor[from=circle]{north east}%
+ \inheritanchor[from=circle]{center}%
+ \inheritanchor[from=circle]{west}%
+ \inheritanchor[from=circle]{east}%
+ \inheritanchor[from=circle]{mid}%
+ \inheritanchor[from=circle]{mid west}%
+ \inheritanchor[from=circle]{mid east}%
+ \inheritanchor[from=circle]{base}%
+ \inheritanchor[from=circle]{base west}%
+ \inheritanchor[from=circle]{base east}%
+ \inheritanchor[from=circle]{south}%
+ \inheritanchor[from=circle]{south west}%
+ \inheritanchor[from=circle]{south east}%
+ \anchor{lower}{\loweranchor}%
+ % Background path
+ \inheritbackgroundpath[from=circle]%
+ \beforebackgroundpath{%
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xa}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@ya}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xa<\pgf@ya%
+ \advance\pgfutil@tempdima by-\pgf@ya%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xa%
+ \fi%
+ \advance\pgfutil@tempdima by-.5\pgflinewidth%
+ \pgfsetshortenstart{0pt}%
+ \pgfsetshortenend{0pt}%
+ \pgfsetarrows{-}%
+ % solidus slants at 45 degrees and its length is
+ % the golden section of the diameter
+ \pgfpathmoveto{\pgfpointadd{\centerpoint}{\pgfqpoint{-0.437\pgfutil@tempdima}{-0.437\pgfutil@tempdima}}}%
+ \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpoint{0.437\pgfutil@tempdima}{0.437\pgfutil@tempdima}}}%
+ \pgfusepath{stroke}%
+ }%
+}%
+
+
+\def\pgf@lib@sh@newbox{\csname newbox\endcsname}% Get round outer.
+
+\def\pgf@lib@sh@toalpha#1{%
+ \ifcase#1\relax%
+ \or one\or two\or three\or four\or five\or six\or seven\or eight\or nine\or ten%
+ \or eleven\or twelve\or thirteen\or fourteen\or fifteen%
+ \or sixteen\or seventeen\or eighteen\or nineteen\or twenty%
+ \else%
+ twenty%
+ \fi%
+}%
+
+
+\def\pgf@lib@sh@getalpha#1#2{\expandafter\edef\expandafter#1\expandafter{\pgf@lib@sh@toalpha{#2}}}%
+
+\newbox\pgfnodeparttwobox
+\newbox\pgfnodepartthreebox
+\newbox\pgfnodepartfourbox
+
+\let\pgfnodepartonebox=\pgfnodeparttextbox
+\let\pgfnodepartsecondbox=\pgfnodeparttwobox
+\let\pgfnodepartthirdbox=\pgfnodepartthreebox
+\let\pgfnodepartfourthbox=\pgfnodepartfourbox
+
+\def\pgf@lib@sh@allocateboxes#1{%
+ \c@pgf@counta=#1\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>4\relax%
+ \pgfutil@ifundefined{pgfnodepart\pgf@lib@sh@toalpha{\c@pgf@counta}box}%
+ {%
+ \expandafter\pgf@lib@sh@newbox\csname pgfnodepart\pgf@lib@sh@toalpha{\c@pgf@counta}box\endcsname%
+ }%
+ {}%
+ \advance\c@pgf@counta by-1\relax%
+ \repeatpgfmathloop%
+}%
+
+\def\pgf@lib@sh@rs@lefttext{left}%
+\def\pgf@lib@sh@rs@righttext{right}%
+\def\pgf@lib@sh@rs@centertext{center}%
+\def\pgf@lib@sh@rs@bottomtext{bottom}%
+\def\pgf@lib@sh@rs@toptext{top}%
+\def\pgf@lib@sh@rs@basetext{base}%
+\def\pgf@lib@sh@rs@nonetext{none}%
+
+
+\newif\ifpgfrectanglesplithorizontal
+\newif\ifpgfrectanglesplitdrawsplits\pgfrectanglesplitdrawsplitstrue
+\newif\ifpgfrectanglesplitignoreemptyparts
+\newif\ifpgfrectanglesplitusecustomfill
+
+\let\pgf@lib@sh@rs@every@emptypart=\pgfutil@empty
+\let\pgf@lib@sh@rs@every@part=\pgfutil@empty
+\def\pgf@lib@sh@rs@list@fill{none}%
+
+\pgfkeys{/pgf/.cd,
+ rectangle split parts/.initial=4,
+ rectangle split part align/.initial=center,
+ rectangle split horizontal/.is if=pgfrectanglesplithorizontal,
+ rectangle split ignore empty parts/.is if=pgfrectanglesplitignoreemptyparts,
+ rectangle split empty part width/.code={%
+ \pgfmathsetlength\pgf@x{#1}
+ \edef\pgf@lib@sh@rs@temp{\noexpand\vrule width\the\pgf@x height0ptdepth0pt\relax}%
+ \def\pgf@lib@sh@rs@@temp{\def\pgf@lib@sh@rs@every@emptypart}%
+ \expandafter\expandafter\expandafter\pgf@lib@sh@rs@@temp\expandafter\expandafter\expandafter{%
+ \expandafter\pgf@lib@sh@rs@every@emptypart\pgf@lib@sh@rs@temp}%
+ },%
+ rectangle split empty part width=1ex,
+ rectangle split empty part height/.code={%
+ \pgfmathsetlength\pgf@x{#1}
+ \edef\pgf@lib@sh@rs@temp{\noexpand\vrule width0ptheight\the\pgf@x depth0pt\relax}%
+ \def\pgf@lib@sh@rs@@temp{\def\pgf@lib@sh@rs@every@emptypart}%
+ \expandafter\expandafter\expandafter\pgf@lib@sh@rs@@temp\expandafter\expandafter\expandafter{%
+ \expandafter\pgf@lib@sh@rs@every@emptypart\pgf@lib@sh@rs@temp}%
+ },%
+ rectangle split empty part height=1ex,
+ rectangle split empty part depth/.code={%
+ \pgfmathsetlength\pgf@x{#1}
+ \edef\pgf@lib@sh@rs@temp{\noexpand\vrule width0ptheight0ptdepth\the\pgf@x\relax}%
+ \def\pgf@lib@sh@rs@@temp{\def\pgf@lib@sh@rs@every@emptypart}%
+ \expandafter\expandafter\expandafter\pgf@lib@sh@rs@@temp\expandafter\expandafter\expandafter{%
+ \expandafter\pgf@lib@sh@rs@every@emptypart\pgf@lib@sh@rs@temp}%
+ },%
+ rectangle split empty part depth=0ex,
+ rectangle split every empty part/.store in=\pgf@lib@sh@rs@every@emptypart,
+ rectangle split part fill/.code=\def\pgf@lib@sh@rs@list@fill{#1}\pgfrectanglesplitusecustomfilltrue,
+ rectangle split uses custom fill/.is if=pgfrectanglesplitusecustomfill,
+ rectangle split draw splits/.is if=pgfrectanglesplitdrawsplits,
+ rectangle split allocate boxes/.code=\pgf@lib@sh@allocateboxes{#1},
+}%
+
+
+\def\pgf@lib@sh@rs@process@list#1#2{%
+ \c@pgf@counta=1\relax%
+ \c@pgf@countb=#2\relax%
+ \edef\pgf@lib@sh@rs@temp{#1}%
+ \expandafter\pgf@lib@sh@rs@@process@list\pgf@lib@sh@rs@temp,\pgf@stop,
+}%
+
+\def\pgf@lib@sh@rs@@process@list{%
+ \pgfutil@ifnextchar x{\pgf@lib@sh@rs@@@process@list}%
+ {\pgf@lib@sh@rs@@@process@list}
+}%
+
+\def\pgf@lib@sh@rs@@@process@list#1,{%
+ \ifx#1\pgf@stop%
+ \let\pgf@next\pgf@lib@sh@rs@@@@process@list%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\c@pgf@counta}%
+ \def\pgf@lib@sh@rs@lastalign{#1}%
+ \pgfutil@namedef{pgf@lib@sh@rs@\pgf@lib@sh@toalpha{\c@pgf@counta}@item}{#1}%
+ \let\pgf@next\pgf@lib@sh@rs@@process@list%
+ \advance\c@pgf@counta by1\relax%
+ \fi%
+ \pgf@next}%
+
+\def\pgf@lib@sh@rs@@@@process@list{%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>\c@pgf@countb%
+ \else%
+ \expandafter\edef\csname pgf@lib@sh@rs@\pgf@lib@sh@toalpha{\c@pgf@counta}@item\endcsname%
+ {\pgf@lib@sh@rs@lastalign}%
+ \advance\c@pgf@counta by1\relax%
+ \repeatpgfmathloop%
+}%
+
+\pgf@lib@sh@allocateboxes{20}%
+
+\pgfdeclareshape{rectangle split}{%
+ \savedmacro\rectanglesplitparameters{%
+ \pgfmathsetcount\c@pgf@counta{\pgfkeysvalueof{/pgf/rectangle split parts}}%
+ \edef\parts{\the\c@pgf@counta}%
+ \addtosavedmacro\parts%
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \edef\innerxsep{\the\pgf@x}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \edef\innerysep{\the\pgf@y}%
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \edef\outerxsep{\the\pgf@x}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \edef\outerysep{\the\pgf@y}%
+ \addtosavedmacro\outerxsep%
+ \addtosavedmacro\outerysep%
+ %
+ \pgf@x=0pt\relax% Widest box.
+ \pgf@y=0pt\relax% Tallest box.
+ %
+ \pgfutil@tempdima=0pt\relax% Maximum box height.
+ \pgfutil@tempdimb=0pt\relax% Maximum box depth.
+ %
+ % Get the dimensions of the boxes...
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ %
+ \expandafter\let\expandafter\pgf@lib@sh@box\expandafter=%
+ \csname pgfnodepart\pgf@lib@sh@rs@number box\endcsname%
+ \pgf@xa=\wd\pgf@lib@sh@box%
+ \pgf@ya=\ht\pgf@lib@sh@box%
+ \pgf@yb=\dp\pgf@lib@sh@box%
+ %
+ % Test to see if the box is empty...
+ %
+ \expandafter\def\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname{\relax}%
+ \ifdim\pgf@xa=0pt\relax%
+ \ifdim\pgf@ya=0pt\relax%
+ \ifdim\pgf@yb=0pt\relax%
+ %
+ % ...It is. So...
+ %
+ \ifpgfrectanglesplitignoreemptyparts%
+ %
+ % ...flag this if we are ignoring parts...
+ %
+ \expandafter\let\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname=\pgfutil@empty%
+ \else%
+ %
+ % ...otherwise insert the code for every empty part.
+ %
+ \setbox\pgf@lib@sh@box=\hbox{{\pgf@lib@sh@rs@every@emptypart}}%
+ \pgf@xa=\wd\pgf@lib@sh@box%
+ \pgf@ya=\ht\pgf@lib@sh@box%
+ \pgf@yb=\dp\pgf@lib@sh@box%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \expandafter\edef\csname pgf@lib@sh@rs@width@\pgf@lib@sh@rs@number\endcsname{\the\pgf@xa}%
+ \expandafter\edef\csname pgf@lib@sh@rs@height@\pgf@lib@sh@rs@number\endcsname{\the\pgf@ya}%
+ \expandafter\edef\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@number\endcsname{\the\pgf@yb}%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname%
+ %
+ % ...saving the widest box...
+ %
+ \ifdim\pgf@xa>\pgf@x%
+ \pgf@x=\pgf@xa%
+ \fi%
+ %
+ % ...the maximum height and depth...
+ %
+ \ifdim\pgf@ya>\pgfutil@tempdima%
+ \pgfutil@tempdima=\pgf@ya%
+ \fi%
+ \ifdim\pgf@yb>\pgfutil@tempdimb%
+ \pgfutil@tempdimb=\pgf@yb%
+ \fi%
+ %
+ % ...and the tallest box.
+ %
+ \pgf@yc=\pgfutil@tempdima%
+ \advance\pgf@yc by\pgfutil@tempdimb%
+ \ifdim\pgf@yc>\pgf@y%
+ \pgf@y=\pgf@yc%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ \edef\pgf@lib@sh@rs@max@width{\the\pgf@x}%
+ \edef\pgf@lib@sh@rs@max@totalheight{\the\pgf@y}%
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}%
+ \advance\pgf@x by-\innerxsep\relax%
+ \advance\pgf@x by-\innerxsep\relax%
+ \pgf@xa=\pgf@x%
+ \advance\pgf@xa by-\pgf@lib@sh@rs@max@width\relax%
+ \ifdim\pgf@xa>0pt\relax%
+ \edef\pgf@lib@sh@rs@max@width{\the\pgf@x}%
+ \fi%
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}%
+ \advance\pgf@y by-\innerysep\relax%
+ \advance\pgf@y by-\innerysep\relax%
+ \pgf@ya=\pgf@y%
+ \advance\pgf@ya by-\pgf@lib@sh@rs@max@totalheight\relax%
+ \ifdim\pgf@ya>0pt\relax%
+ \edef\pgf@lib@sh@rs@max@totalheight{\the\pgf@y}%
+ \fi%
+ %
+ % Get the alignment of each node part box.
+ %
+ \pgf@lib@sh@rs@process@list{\pgfkeysvalueof{/pgf/rectangle split part align}}{\parts}%
+ %
+ % Are we splitting horizontally or vertically?
+ %
+ \ifpgfrectanglesplithorizontal%
+ %
+ % Calculate the origins of each node part box.
+ %
+ \pgf@x=0pt\relax%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ %
+ \expandafter\let\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname=\pgfutil@empty%
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \ifpgfrectanglesplitignoreemptyparts%
+ \expandafter\let\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname=%
+ \pgf@lib@sh@rs@lastanchor%
+ \fi%
+ \fi%
+ %
+ % Adjust for alignment.
+ %
+ \expandafter\ifx\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname%
+ \pgf@lib@sh@rs@bottomtext%
+ \pgf@y=\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@number\endcsname\relax%
+ \else%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname%
+ \pgf@lib@sh@rs@toptext%
+ \pgf@y=-\csname pgf@lib@sh@rs@height@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@y by\pgf@lib@sh@rs@max@totalheight\relax%
+ \else%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname%
+ \pgf@lib@sh@rs@basetext%
+ \pgf@y=\pgf@lib@sh@rs@max@totalheight\relax%
+ \advance\pgf@y by-\pgfutil@tempdima%
+ \advance\pgf@y by\pgfutil@tempdimb%
+ \divide\pgf@y by2\relax%
+ \else%
+ \pgf@y=\pgf@lib@sh@rs@max@totalheight\relax%
+ \advance\pgf@y by-\csname pgf@lib@sh@rs@height@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@y by\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@number\endcsname\relax%
+ \divide\pgf@y by2\relax%
+ \fi%
+ \fi%
+ \fi%
+ %
+ % Re-adjust as the first box is at the origin.
+ %
+ \ifnum\pgfmathcounter=1\relax%
+ \edef\pgf@lib@sh@rs@yoffset{\the\pgf@y}%
+ \pgf@y=0pt\relax%
+ \pgfextract@process\pgf@lib@sh@rs@anchor@one{}%
+ \addtosavedmacro\pgf@lib@sh@rs@anchor@one%
+ \let\pgf@lib@sh@rs@lastanchor=\pgf@lib@sh@rs@anchor@one%
+ \let\pgf@lib@sh@rs@lastnumber=\pgf@lib@sh@rs@number%
+ \else
+ \advance\pgf@y by-\pgf@lib@sh@rs@yoffset\relax%
+ \advance\pgf@x by\csname pgf@lib@sh@rs@width@\pgf@lib@sh@rs@lastnumber\endcsname\relax%
+ \advance\pgf@x by\innerxsep\relax%
+ \advance\pgf@x by\pgflinewidth%
+ \advance\pgf@x by\innerxsep\relax%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname{}%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@lastanchor\expandafter=%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \let\pgf@lib@sh@rs@lastnumber=\pgf@lib@sh@rs@number%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \fi%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Calculate some anchors.
+ %
+ \pgfextract@process\northeast{%
+ \pgf@lib@sh@rs@lastanchor%
+ \advance\pgf@x by\csname pgf@lib@sh@rs@width@\pgf@lib@sh@rs@lastnumber\endcsname\relax%
+ \advance\pgf@x by\innerxsep\relax%
+ \advance\pgf@x by\outerxsep\relax%
+ \pgf@y=\pgf@lib@sh@rs@max@totalheight\relax%
+ \advance\pgf@y by-\pgf@lib@sh@rs@yoffset\relax%
+ \advance\pgf@y by\innerysep\relax%
+ \advance\pgf@y by\outerysep\relax%
+ }%
+ \addtosavedmacro\northeast%
+ \pgfextract@process\southwest{%
+ \pgf@lib@sh@rs@anchor@one%
+ \advance\pgf@x by-\innerxsep\relax%
+ \advance\pgf@x by-\outerxsep\relax%
+ \pgf@y=-\pgf@lib@sh@rs@yoffset\relax%
+ \advance\pgf@y by-\innerysep\relax%
+ \advance\pgf@y by-\outerysep\relax%
+ }%
+ \addtosavedmacro\southwest%
+ %
+ \pgfextract@process\centerpoint{%
+ \pgfpointadd{\southwest}{\northeast}%
+ \divide\pgf@x by2\relax%
+ \divide\pgf@y by2\relax%
+ }%
+ \addtosavedmacro\centerpoint%
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ %
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \else%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \pgf@xa=\pgf@x%
+ \pgf@xb=\csname pgf@lib@sh@rs@width@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@xa by0.5\pgf@xb%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @south\endcsname{%
+ \southwest%
+ \pgf@x=\pgf@xa%
+ }%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @north\endcsname{%
+ \northeast%
+ \pgf@x=\pgf@xa%
+ }%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @north\endcsname%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @south\endcsname%
+ \ifnum\pgfmathcounter=\parts%
+ \else%
+ \advance\pgf@xa by0.5\pgf@xb%
+ \advance\pgf@xa by\innerxsep\relax%
+ \advance\pgf@xa by.5\pgflinewidth%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@south\endcsname{%
+ \southwest%
+ \pgf@x=\pgf@xa%
+ }%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@north\endcsname{%
+ \northeast%
+ \pgf@x=\pgf@xa%
+ }%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split\endcsname{%
+ \centerpoint%
+ \pgf@x=\pgf@xa%
+ }%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@north\endcsname%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@south\endcsname%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split\endcsname%
+ \fi%
+ \fi%
+ \repeatpgfmathloop%
+ \else%
+ %
+ % Calculate the origins of each node part box.
+ %
+ \pgf@y=0pt\relax%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ %
+ \expandafter\let\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname=\pgfutil@empty%
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \ifpgfrectanglesplitignoreemptyparts%
+ \expandafter\let\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname=%
+ \pgf@lib@sh@rs@lastanchor%
+ \fi%
+ \fi%
+ %
+ % Adjust for alignment.
+ %
+ \expandafter\ifx\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname%
+ \pgf@lib@sh@rs@lefttext%
+ \pgf@x=0pt\relax%
+ \else%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname%
+ \pgf@lib@sh@rs@righttext%
+ \pgf@x=-\csname pgf@lib@sh@rs@width@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@x by\pgf@lib@sh@rs@max@width\relax%
+ \else%
+ \pgf@x=-\csname pgf@lib@sh@rs@width@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@x by\pgf@lib@sh@rs@max@width\relax%
+ \divide\pgf@x by2\relax%
+ \fi%
+ \fi%
+ %
+ % Re-adjust as the first box is at the origin.
+ %
+ \ifnum\pgfmathcounter=1\relax%
+ \edef\pgf@lib@sh@rs@xoffset{\the\pgf@x}%
+ \pgf@x=0pt\relax%
+ \pgfextract@process\pgf@lib@sh@rs@anchor@one{}%
+ \addtosavedmacro\pgf@lib@sh@rs@anchor@one%
+ \let\pgf@lib@sh@rs@lastanchor=\pgf@lib@sh@rs@anchor@one%
+ \let\pgf@lib@sh@rs@lastnumber=\pgf@lib@sh@rs@number%
+ \else
+ \advance\pgf@x by-\pgf@lib@sh@rs@xoffset\relax%
+ \advance\pgf@y by-\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@lastnumber\endcsname\relax%
+ \advance\pgf@y by-\innerysep\relax%
+ \advance\pgf@y by-\pgflinewidth%
+ \advance\pgf@y by-\innerysep\relax%
+ \advance\pgf@y by-\csname pgf@lib@sh@rs@height@\pgf@lib@sh@rs@number\endcsname\relax%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname{}%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@lastanchor\expandafter=%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \let\pgf@lib@sh@rs@lastnumber=\pgf@lib@sh@rs@number%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \fi%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Calculate some anchors.
+ %
+ \pgfextract@process\northeast{%
+ \pgf@x=\pgf@lib@sh@rs@max@width\relax%
+ \advance\pgf@x by-\pgf@lib@sh@rs@xoffset\relax%
+ \advance\pgf@x by\innerxsep\relax%
+ \advance\pgf@x by\outerxsep\relax%
+ \pgf@y=\pgf@lib@sh@rs@height@one\relax%
+ \advance\pgf@y by\innerysep\relax%
+ \advance\pgf@y by\outerysep\relax%
+ \advance\pgf@y by.5\pgflinewidth%
+ }%
+ \addtosavedmacro\northeast%
+ \pgfextract@process\southwest{%
+ \pgf@lib@sh@rs@lastanchor%
+ \pgf@x=-\pgf@lib@sh@rs@xoffset\relax%
+ \advance\pgf@x by-\innerxsep\relax%
+ \advance\pgf@x by-\outerxsep\relax%
+ \advance\pgf@y by-\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@lastnumber\endcsname\relax%
+ \advance\pgf@y by-\innerysep\relax%
+ \advance\pgf@y by-\outerysep\relax%
+ \advance\pgf@y by-.5\pgflinewidth%
+ }%
+ \addtosavedmacro\southwest%
+ %
+ \pgfextract@process\centerpoint{%
+ \pgfpointadd{\southwest}{\northeast}%
+ \divide\pgf@x by2\relax%
+ \divide\pgf@y by2\relax%
+ }%
+ \addtosavedmacro\centerpoint%
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ %
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \else%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \pgf@ya=\csname pgf@lib@sh@rs@height@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@y by0.5\pgf@ya%
+ \pgf@ya=\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@y by-0.5\pgf@ya%
+ \pgf@ya=\pgf@y%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @west\endcsname{%
+ \southwest%
+ \pgf@y=\pgf@ya%
+ }%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @east\endcsname{%
+ \northeast%
+ \pgf@y=\pgf@ya%
+ }%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @east\endcsname%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @west\endcsname%
+ \ifnum\pgfmathcounter=\parts%
+ \else%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number\endcsname%
+ \pgf@ya=\pgf@y%
+ \advance\pgf@ya by-\csname pgf@lib@sh@rs@depth@\pgf@lib@sh@rs@number\endcsname\relax%
+ \advance\pgf@ya by-\innerysep\relax%
+ \advance\pgf@ya by-.5\pgflinewidth%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@west\endcsname{%
+ \southwest%
+ \pgf@y=\pgf@ya%
+ }%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@east\endcsname{%
+ \northeast%
+ \pgf@y=\pgf@ya%
+ }%
+ \expandafter\pgfextract@process\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split\endcsname{%
+ \centerpoint%
+ \pgf@y=\pgf@ya%
+ }%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@east\endcsname%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@west\endcsname%
+ \expandafter\addtosavedmacro\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split\endcsname%
+ \fi%
+ \fi%
+ \repeatpgfmathloop%
+ \fi%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x=0.5\wd\pgfnodeparttextbox%
+ \pgf@y=0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x=0.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \anchor{center}{%
+ \rectanglesplitparameters%
+ \centerpoint%
+ }%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \rectanglesplitparameters%
+ \northeast%
+ \pgf@y=0pt\relax%
+ }%
+ \anchor{base west}{%
+ \rectanglesplitparameters%
+ \southwest%
+ \pgf@y=0pt\relax%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \rectanglesplitparameters%
+ \northeast%
+ \pgf@xa=\pgf@x%
+ \midpoint%
+ \pgf@x=\pgf@xa%
+ }%
+ \anchor{mid west}{%
+ \rectanglesplitparameters%
+ \southwest%
+ \pgf@xa=\pgf@x%
+ \midpoint%
+ \pgf@x=\pgf@xa%
+ }%
+ \anchor{north}{%
+ \rectanglesplitparameters%
+ \centerpoint%
+ \pgf@xa=\pgf@x%
+ \northeast%
+ \pgf@x=\pgf@xa%
+ }%
+ \anchor{south}{%
+ \rectanglesplitparameters%
+ \centerpoint%
+ \pgf@xa=\pgf@x%
+ \southwest%
+ \pgf@x=\pgf@xa%
+ }%
+ \anchor{east}{%
+ \rectanglesplitparameters%
+ \centerpoint%
+ \pgf@ya=\pgf@y%
+ \northeast%
+ \pgf@y=\pgf@ya%
+ }%
+ \anchor{west}{%
+ \rectanglesplitparameters%
+ \centerpoint%
+ \pgf@ya=\pgf@y%
+ \southwest%
+ \pgf@y=\pgf@ya%
+ }%
+ \anchor{north east}{%
+ \rectanglesplitparameters%
+ \northeast%
+ }%
+ \anchor{north west}{%
+ \rectanglesplitparameters%
+ \northeast%
+ \pgf@ya=\pgf@y%
+ \southwest%
+ \pgf@y=\pgf@ya%
+ }%
+ \anchor{south west}{%
+ \rectanglesplitparameters%
+ \southwest%
+ }%
+ \anchor{south east}{%
+ \rectanglesplitparameters%
+ \southwest%
+ \pgf@ya=\pgf@y%
+ \northeast%
+ \pgf@y=\pgf@ya%
+ }%
+ \behindbackgroundpath{%
+ \ifpgfrectanglesplitusecustomfill%
+ \pgf@lib@sh@rs@process@list{\pgf@lib@sh@rs@list@fill}{\parts}%
+ {%
+ \ifpgfrectanglesplithorizontal%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@fill@bottomleft\expandafter=%
+ \csname pgf@anchor@rectangle split@south west\endcsname%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ \ifnum\pgfmathcounter=\parts%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@fill@topright\expandafter=%
+ \csname pgf@anchor@rectangle split@north east\endcsname%
+ \else%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@fill@topright\expandafter=%
+ \csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@number\space split north\endcsname%
+ \fi%
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \else%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname\pgf@lib@sh@rs@nonetext%
+ \else%
+ \pgfextract@process\pgf@lib@sh@rs@fill@bottomleft{%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \advance\pgf@y by\outerysep\relax%
+ \ifnum\pgfmathcounter=1\relax%
+ \advance\pgf@x by\outerxsep\relax%
+ \fi%
+ }%
+ \pgfextract@process\pgf@lib@sh@rs@fill@topright{%
+ \pgf@lib@sh@rs@fill@topright%
+ \advance\pgf@y by-\outerysep\relax%
+ \ifnum\pgfmathcounter=\parts\relax%
+ \advance\pgf@x by-\outerxsep\relax%
+ \fi%
+ }%
+ \ifnum\pgfmathcounter>1\relax%
+ \begingroup\pgfsetcornersarced{\pgfpointorigin}%
+ \fi%
+ \pgfpathmoveto{%
+ \pgf@lib@sh@rs@fill@topright%
+ \pgf@xa=\pgf@x%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \pgf@x=\pgf@xa%
+ }%
+ \pgfpathlineto{\pgf@lib@sh@rs@fill@bottomleft}%
+ \pgfpathlineto{%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \pgf@xa=\pgf@x%
+ \pgf@lib@sh@rs@fill@topright%
+ \pgf@x=\pgf@xa%
+ }%
+ \ifnum\pgfmathcounter>1\relax%
+ \endgroup%
+ \fi%
+ \ifnum\pgfmathcounter<\parts%
+ \begingroup\pgfsetcornersarced{\pgfpointorigin}%
+ \fi%
+ \pgfpathlineto{\pgf@lib@sh@rs@fill@topright}%
+ \pgfpathclose%
+ \ifnum\pgfmathcounter<\parts%
+ \endgroup%
+ \fi%
+ \pgfsetfillcolor{\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname}%
+ \pgfusepath{fill}%
+ \fi%
+ \fi%
+ \pgfextract@process\pgf@lib@sh@rs@fill@bottomleft{%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \pgf@ya=\pgf@y%
+ \pgf@lib@sh@rs@fill@topright%
+ \pgf@y=\pgf@ya%
+ \advance\pgf@y by-\outerysep%
+ }%
+ \repeatpgfmathloop%
+ \else%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@fill@topright\expandafter=%
+ \csname pgf@anchor@rectangle split@north east\endcsname%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ \ifnum\pgfmathcounter=\parts%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@fill@bottomleft\expandafter=%
+ \csname pgf@anchor@rectangle split@south west\endcsname%
+ \else%
+ \expandafter\let\expandafter\pgf@lib@sh@rs@fill@bottomleft\expandafter=%
+ \csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@number\space split west\endcsname%
+ \fi%
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \else%
+ \expandafter\ifx\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname\pgf@lib@sh@rs@nonetext%
+ \else%
+ \pgfextract@process\pgf@lib@sh@rs@fill@bottomleft{%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \advance\pgf@x by\outerxsep\relax%
+ \ifnum\parts=1\relax%
+ \advance\pgf@y by\outerysep\relax%
+ \else%
+ \ifnum\pgfmathcounter=\parts
+ \advance\pgf@y by\outerysep\relax%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\pgf@lib@sh@rs@fill@topright{%
+ \pgf@lib@sh@rs@fill@topright%
+ \advance\pgf@x by-\outerxsep\relax%
+ \ifnum\parts=1\relax%
+ \advance\pgf@y by-\outerysep\relax%
+ \else%
+ \ifnum\pgfmathcounter=1\relax%
+ \advance\pgf@y by-\outerysep\relax%
+ \fi%
+ \fi%
+ }%
+ \pgfpathmoveto{\pgf@lib@sh@rs@fill@bottomleft}%
+ \ifnum\pgfmathcounter>1\relax%
+ \begingroup\pgfsetcornersarced{\pgfpointorigin}%
+ \fi%
+ \pgfpathlineto{%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \pgf@xa=\pgf@x%
+ \pgf@lib@sh@rs@fill@topright%
+ \pgf@x=\pgf@xa%
+ }%
+ \pgfpathlineto{\pgf@lib@sh@rs@fill@topright}%
+ \ifnum\pgfmathcounter>1\relax%
+ \endgroup%%
+ \fi%
+ \ifnum\pgfmathcounter<\parts%
+ \begingroup\pgfsetcornersarced{\pgfpointorigin}%
+ \fi%
+ \pgfpathlineto{%
+ \pgf@lib@sh@rs@fill@topright%
+ \pgf@xa=\pgf@x%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \pgf@x=\pgf@xa%
+ }%
+ \pgfpathclose%
+ \ifnum\pgfmathcounter<\parts%
+ \endgroup%
+ \fi%
+ \pgfsetfillcolor{\csname pgf@lib@sh@rs@\pgf@lib@sh@rs@number @item\endcsname}%
+ \pgfusepath{fill}%
+ \fi%
+ \fi%
+ \pgfextract@process\pgf@lib@sh@rs@fill@topright{%
+ \pgf@lib@sh@rs@fill@topright%
+ \pgf@xa=\pgf@x%
+ \pgf@lib@sh@rs@fill@bottomleft%
+ \pgf@x=\pgf@xa%
+ \advance\pgf@x by\outerxsep\relax%
+ }%
+ \repeatpgfmathloop%
+ \fi%
+ }%
+ \fi%
+ }%
+ \backgroundpath{%
+ \begingroup%
+ \pgfextract@process\southwest{%
+ \southwest%
+ \advance\pgf@x by\outerxsep\relax%
+ \advance\pgf@y by\outerysep\relax%
+ }%
+ \pgfextract@process\northeast{%
+ \northeast%
+ \advance\pgf@x by-\outerxsep\relax%
+ \advance\pgf@y by-\outerysep\relax%
+ }%
+ \pgfpathrectangle{\southwest}{\pgfpointdiff{\southwest}{\northeast}}%
+ \endgroup%
+ \ifpgfrectanglesplitdrawsplits%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter=\parts%
+ \else%
+ \pgf@lib@sh@getalpha\pgf@lib@sh@rs@number{\pgfmathcounter}%
+ %
+ \expandafter\ifx\csname pgf@lib@sh@rs@empty@\pgf@lib@sh@rs@number\endcsname\pgfutil@empty%
+ \else%
+ \pgfpathmoveto{%
+ \ifpgfrectanglesplithorizontal%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@north\endcsname%
+ \advance\pgf@y by-\outerysep\relax%
+ \else%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@east\endcsname%
+ \advance\pgf@x by-\outerxsep\relax%
+ \fi%
+ }%
+ \pgfpathlineto{%
+ \ifpgfrectanglesplithorizontal%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@south\endcsname%
+ \advance\pgf@y by\outerysep\relax%
+ \else%
+ \csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@number @split@west\endcsname%
+ \advance\pgf@x by\outerxsep\relax%
+ \fi%
+ }%
+ \fi%
+ \repeatpgfmathloop%
+ \fi%
+ }%
+ \anchorborder{%
+ \pgfutil@tempdima\pgf@x%
+ \pgfutil@tempdimb\pgf@y%
+ \rectanglesplitparameters%
+ \pgfpointdiff{\southwest}{\northeast}%
+ \pgf@x.5\pgf@x%
+ \pgf@y.5\pgf@y%
+ \edef\pgf@marshall{%
+ \noexpand\pgfpointborderrectangle{%
+ \noexpand\pgfqpoint{\the\pgfutil@tempdima}{\the\pgfutil@tempdimb}%
+ }%
+ {%
+ \noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}%
+ }%
+ }%
+ \pgf@marshall%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Hackery to install the correct number of node parts.
+ %
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@rectangle split\endcsname{%
+ \let\pgf@lib@sh@rs@temp=\pgfutil@empty%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter=\parts%
+ \expandafter\edef\csname pgf@sh@boxes@rectangle split\endcsname%
+ {\pgf@lib@sh@rs@temp\pgf@lib@sh@toalpha{\pgfmathcounter}}%
+ \else%
+ \edef\pgf@lib@sh@rs@temp{\pgf@lib@sh@rs@temp\pgf@lib@sh@toalpha{\pgfmathcounter},}%
+ \repeatpgfmathloop%
+ }%
+}%
+
+\pgfutil@for\pgf@lib@sh@rs@temp:={one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty}\do{%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp}{\noexpand\pgf@lib@sh@rs@anchor@one}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space split\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split}%
+ {\noexpand\centerpoint}%
+ {\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space split north\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@north}%
+ {\noexpand\csname pgf@anchor@rectangle split@north\noexpand\endcsname}%
+ {\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@north\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space split south\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@south}%
+ {\noexpand\csname pgf@anchor@rectangle split@south\noexpand\endcsname}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@south\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space north\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @north}%
+ {\noexpand\csname pgf@anchor@rectangle split@north\noexpand\endcsname}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @north\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space south\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @south}%
+ {\noexpand\csname pgf@anchor@rectangle split@south\noexpand\endcsname}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @south\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space split east\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@east}%
+ {\noexpand\csname pgf@anchor@rectangle split@east\noexpand\endcsname}%
+ {\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@east\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space split west\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@west}%
+ {\noexpand\csname pgf@anchor@rectangle split@west\noexpand\endcsname}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @split@west\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space east\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @east}%
+ {\noexpand\csname pgf@anchor@rectangle split@east\noexpand\endcsname}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @east\noexpand\endcsname}%
+ }%
+ \expandafter\xdef\csname pgf@anchor@rectangle split@\pgf@lib@sh@rs@temp\space west\endcsname{%
+ \noexpand\rectanglesplitparameters%
+ \noexpand\pgfutil@ifundefined{pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @west}%
+ {\noexpand\csname pgf@anchor@rectangle split@west\noexpand\endcsname}%
+ {\noexpand\csname pgf@lib@sh@rs@anchor@\pgf@lib@sh@rs@temp @west\noexpand\endcsname}%
+ }%
+}%
+
+
+\pgfutil@namelet{pgf@anchor@rectangle split@text east}{pgf@anchor@rectangle split@one east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@text west}{pgf@anchor@rectangle split@one west}%
+\pgfutil@namelet{pgf@anchor@rectangle split@text split}{pgf@anchor@rectangle split@one split}%
+\pgfutil@namelet{pgf@anchor@rectangle split@text split east}{pgf@anchor@rectangle split@one split east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@text split west}{pgf@anchor@rectangle split@one split west}%
+
+\pgfutil@namelet{pgf@anchor@rectangle split@second}{pgf@anchor@rectangle split@two}%
+\pgfutil@namelet{pgf@anchor@rectangle split@second east}{pgf@anchor@rectangle split@two east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@second west}{pgf@anchor@rectangle split@two west}%
+\pgfutil@namelet{pgf@anchor@rectangle split@second split}{pgf@anchor@rectangle split@two split}%
+\pgfutil@namelet{pgf@anchor@rectangle split@second split east}{pgf@anchor@rectangle split@two split east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@second split west}{pgf@anchor@rectangle split@two split west}%
+
+\pgfutil@namelet{pgf@anchor@rectangle split@third}{pgf@anchor@rectangle split@three}%
+\pgfutil@namelet{pgf@anchor@rectangle split@third east}{pgf@anchor@rectangle split@three east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@third west}{pgf@anchor@rectangle split@three west}%
+\pgfutil@namelet{pgf@anchor@rectangle split@third split}{pgf@anchor@rectangle split@three split}%
+\pgfutil@namelet{pgf@anchor@rectangle split@third split east}{pgf@anchor@rectangle split@three split east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@third split west}{pgf@anchor@rectangle split@three split west}%
+
+\pgfutil@namelet{pgf@anchor@rectangle split@fourth}{pgf@anchor@rectangle split@four}%
+\pgfutil@namelet{pgf@anchor@rectangle split@fourth east}{pgf@anchor@rectangle split@four east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@fourth west}{pgf@anchor@rectangle split@four west}%
+\pgfutil@namelet{pgf@anchor@rectangle split@fourth split}{pgf@anchor@rectangle split@four split}%
+\pgfutil@namelet{pgf@anchor@rectangle split@fourth split east}{pgf@anchor@rectangle split@four split east}%
+\pgfutil@namelet{pgf@anchor@rectangle split@fourth split west}{pgf@anchor@rectangle split@four split west}%
+
+
+
+
+% Shape: ellipse split.
+%
+\pgfdeclareshape{ellipse split}{%
+ \nodeparts{text,lower}%
+ \savedanchor\radii{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgf@y2.0\pgf@y%
+ \advance\pgf@y.5\pgflinewidth%
+ \pgf@xa.5\wd\pgfnodeparttextbox%
+ \pgf@xb.5\wd\pgfnodepartlowerbox%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@xb\pgf@x%
+ \pgf@ya\ht\pgfnodeparttextbox%
+ \advance\pgf@ya\dp\pgfnodeparttextbox%
+ \pgf@yb\ht\pgfnodepartlowerbox%
+ \advance\pgf@yb\dp\pgfnodepartlowerbox%
+ \advance\pgf@ya\pgf@y%
+ \advance\pgf@yb\pgf@y%
+ \ifdim\pgf@xa>\pgf@xb%
+ \pgf@x1.414213\pgf@xa%
+ \else%
+ \pgf@x1.414213\pgf@xb%
+ \fi%
+ \ifdim\pgf@ya>\pgf@yb%
+ \pgf@y1.414213\pgf@ya%
+ \else%
+ \pgf@y1.414213\pgf@yb%
+ \fi%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ }%
+ \savedanchor\lower{%
+ \pgf@x-.5\wd\pgfnodepartlowerbox%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgf@y-2.0\pgf@y%
+ \advance\pgf@y-\pgflinewidth%
+ \advance\pgf@y-\dp\pgfnodeparttextbox%
+ \advance\pgf@y-\ht\pgfnodepartlowerbox%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{-\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y-\dp\pgfnodeparttextbox%
+ \advance\pgf@y-.5\pgflinewidth%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt\relax%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{lower}{\lower}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{\radii\pgf@xa\pgf@x\midpoint\advance\pgf@x\pgf@xa}%
+ \anchor{mid west}{\radii\pgf@xa\pgf@x\midpoint\advance\pgf@x-\pgf@xa}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{\radii\pgf@xa\pgf@x\basepoint\advance\pgf@x\pgf@xa}%
+ \anchor{base west}{\radii\pgf@xa\pgf@x\basepoint\advance\pgf@x-\pgf@xa}%
+ \anchor{north}{\pgfpointadd{\centerpoint}{\radii\pgf@x0pt}}%
+ \anchor{south}{\pgfpointadd{\centerpoint}{\radii\pgf@x0pt\pgf@y-\pgf@y}}%
+ \anchor{east}{\pgfpointadd{\centerpoint}{\radii\pgf@y0pt}}%
+ \anchor{west}{\pgfpointadd{\centerpoint}{\radii\pgf@x-\pgf@x\pgf@y0pt}}%
+ \anchor{north west}{\pgfpointadd{\centerpoint}{\radii\pgf@x-0.707106\pgf@x\pgf@y0.707106\pgf@y}}%
+ \anchor{south west}{\pgfpointadd{\centerpoint}{\radii\pgf@x-0.707106\pgf@x\pgf@y-0.707106\pgf@y}}%
+ \anchor{north east}{\pgfpointadd{\centerpoint}{\radii\pgf@x0.707106\pgf@x\pgf@y0.707106\pgf@y}}%
+ \anchor{south east}{\pgfpointadd{\centerpoint}{\radii\pgf@x0.707106\pgf@x\pgf@y-0.707106\pgf@y}}%
+ \backgroundpath{%
+ \radii%
+ \pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
+ \pgfutil@tempdima\pgf@x%
+ \pgfutil@tempdimb\pgf@y%
+ \pgfpathellipse{\centerpoint}{\pgfqpoint{\the\pgfutil@tempdima}{0pt}}{\pgfqpoint{0pt}{\the\pgfutil@tempdimb}}%
+ \pgfpathmoveto{\centerpoint\advance\pgf@x-\pgfutil@tempdima}%
+ \pgfpathlineto{\centerpoint\advance\pgf@x\pgfutil@tempdima}%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \radii%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpointadd{\noexpand\pgfpointborderellipse{\noexpand\externalpoint}%
+ {\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}}{\noexpand\centerpoint}%
+ }%
+ \pgf@marshal%
+ }%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.sty b/graphics/pgf/base/tex/pgflibraryshapes.sty
new file mode 100644
index 0000000000..c11f25ff00
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.sty
@@ -0,0 +1,18 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{shapes} instead}
+
+\RequirePackage{pgfcore}
+
+\input{pgflibraryshapes.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibraryshapes.symbols.code.tex b/graphics/pgf/base/tex/pgflibraryshapes.symbols.code.tex
new file mode 100644
index 0000000000..a6e925346d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibraryshapes.symbols.code.tex
@@ -0,0 +1,2775 @@
+% Copyright 2007 by Till Tantau and 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.
+
+\ProvidesFileRCS{pgflibraryshapes.symbols.code.tex}
+
+\pgfdeclareshape{forbidden sign}
+{%
+ \inheritsavedanchors[from=circle]% this is nearly a circle
+ \inheritanchorborder[from=circle]%
+ \inheritanchor[from=circle]{north}%
+ \inheritanchor[from=circle]{north west}%
+ \inheritanchor[from=circle]{north east}%
+ \inheritanchor[from=circle]{center}%
+ \inheritanchor[from=circle]{west}%
+ \inheritanchor[from=circle]{east}%
+ \inheritanchor[from=circle]{mid}%
+ \inheritanchor[from=circle]{mid west}%
+ \inheritanchor[from=circle]{mid east}%
+ \inheritanchor[from=circle]{base}%
+ \inheritanchor[from=circle]{base west}%
+ \inheritanchor[from=circle]{base east}%
+ \inheritanchor[from=circle]{south}%
+ \inheritanchor[from=circle]{south west}%
+ \inheritanchor[from=circle]{south east}%
+ \inheritbackgroundpath[from=circle]%
+ \foregroundpath{
+ \centerpoint%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{-0.707107\pgfutil@tempdima}{-0.707107\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0.707107\pgfutil@tempdima}{0.707107\pgfutil@tempdima}}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
+ }%
+}%
+
+
+\pgfdeclareshape{correct forbidden sign}
+{%
+ \inheritsavedanchors[from=circle]% this is nearly a circle
+ \inheritanchorborder[from=circle]%
+ \inheritanchor[from=circle]{north}%
+ \inheritanchor[from=circle]{north west}%
+ \inheritanchor[from=circle]{north east}%
+ \inheritanchor[from=circle]{center}%
+ \inheritanchor[from=circle]{west}%
+ \inheritanchor[from=circle]{east}%
+ \inheritanchor[from=circle]{mid}%
+ \inheritanchor[from=circle]{mid west}%
+ \inheritanchor[from=circle]{mid east}%
+ \inheritanchor[from=circle]{base}%
+ \inheritanchor[from=circle]{base west}%
+ \inheritanchor[from=circle]{base east}%
+ \inheritanchor[from=circle]{south}%
+ \inheritanchor[from=circle]{south west}%
+ \inheritanchor[from=circle]{south east}%
+ \inheritbackgroundpath[from=circle]%
+ \foregroundpath{
+ \centerpoint%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0.707107\pgfutil@tempdima}{-0.707107\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{-0.707107\pgfutil@tempdima}{0.707107\pgfutil@tempdima}}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
+ }%
+}%
+
+
+
+
+
+% Keys for starburst shape
+%
+% /pgf/starburst point height : The maximum height of the outer points.
+% /pgf/starburst points : The number of points.
+% /pgf/random starburst : The seed for the random number generator.
+%
+\pgfkeys{/pgf/random starburst/%
+ .code={%
+ \ifx\pgfkeysnovalue#1%
+ \pgfmathgeneratepseudorandomnumber%
+ \else%
+ \pgfmathtruncatemacro\pgfmathresult{#1}%
+ \fi%
+ \pgfkeyslet{/pgf/random starburst}{\pgfmathresult}%
+ }%
+}%
+\pgfkeys{/pgf/random starburst=100}%
+
+\pgfkeys{/pgf/starburst point height/.value required}%
+\pgfkeys{/pgf/starburst point height/.code={%
+ \pgfmathparse{#1}%
+ \edef\pgfmathresult{\pgfmathresult pt}%
+ \pgfkeyslet{/pgf/starburst point height}{\pgfmathresult}%
+ }%
+}%
+\pgfkeys{/pgf/starburst point height=.5cm}%
+
+\pgfkeys{/pgf/starburst points/.value required}%
+\pgfkeys{/pgf/starburst points/.code={%
+ \pgfmathtruncatemacro\pgfmathresult{#1}%
+ \pgfkeyslet{/pgf/starburst points}{\pgfmathresult}%
+ }%
+}%
+\pgfkeys{/pgf/starburst points=17}%
+
+\pgfdeclareshape{starburst}{%
+ \savedmacro\anglestep{%
+ \pgfmathdivide@{180}{\pgfkeysvalueof{/pgf/starburst points}}%
+ \let\anglestep\pgfmathresult%
+ }%
+ \savedmacro\calculatestarburstpoints{%
+ %
+ % Get the angle step.
+ %
+ \pgfmathdivide@{180}{\pgfkeysvalueof{/pgf/starburst points}}%
+ \let\anglestep\pgfmathresult%
+ %
+ % Get the total number of points.
+ %
+ \pgfmathsetcounter{pgf@counta}{\pgfkeysvalueof{/pgf/starburst points}}%
+ \multiply\c@pgf@counta2\relax%
+ \edef\totalpoints{\the\c@pgf@counta}%
+ \addtosavedmacro{\totalpoints}%
+ %
+ % Calculate the centerpoint.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
+ }%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{+\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{+\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ %
+ % Get the node dimensions.
+ %
+ \pgfmathsetlength\pgf@x{+\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathaddtolength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+\pgfkeysvalueof{/pgf/inner ysep}}%
+ \pgfmathaddtolength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+.5\dp\pgfnodeparttextbox}%
+ %
+ % Calculate the inner radii.
+ %
+ \ifpgfshapeborderusesincircle%
+ \pgfkeysgetvalue{/pgf/shape border rotate}{\rotate}%
+ %
+ % Use the incircle...
+ %
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgf@x1.41421\pgf@x%
+ \pgf@y\pgf@x%
+ \else%
+ %
+ % Get the rotation (with rounding).
+ %
+ \pgfkeysgetvalue{/pgf/shape border rotate}{\rotate}%
+ \pgfmathmod@{\rotate}{360}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
+ \advance\c@pgf@counta45\relax%
+ \divide\c@pgf@counta90\relax%
+ \multiply\c@pgf@counta90\relax%
+ \ifnum\c@pgf@counta<0\relax%
+ \advance\c@pgf@counta360\relax%
+ \fi%
+ %
+ % Calculate the width and height of the node
+ % contents, according to any border rotation.
+ %
+ \ifnum\c@pgf@counta=90\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \else%
+ \ifnum\c@pgf@counta=270\relax%
+ \pgf@xc\pgf@x%
+ \pgf@x\pgf@y%
+ \pgf@y\pgf@xc%
+ \fi%
+ \fi%
+ \edef\rotate{\the\c@pgf@counta}%
+ %
+ % ...or not.
+ %
+ \pgf@x=1.41421\pgf@x%
+ \pgf@y=1.41421\pgf@y%
+ \fi%
+ \addtosavedmacro{\rotate}%
+ %
+ % Adjust innerradius for minimum width and height.
+ %
+ \pgf@xa\pgf@x%
+ \pgfmathsetlength\pgf@xb{+\pgfkeysvalueof{/pgf/starburst point height}}%
+ \advance\pgf@xa\pgf@xb%
+ \pgfmathsetlength\pgf@xc{+\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@xa<.5\pgf@xc%
+ \pgf@x.5\pgf@xc%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ \pgf@ya\pgf@y%
+ \pgfmathsetlength\pgf@yb{+\pgfkeysvalueof{/pgf/starburst point height}}%
+ \advance\pgf@ya\pgf@yb%
+ \pgfmathsetlength\pgf@yc{+\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@ya<.5\pgf@yc%
+ \pgf@y.5\pgf@yc%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ \edef\xinnerradius{\the\pgf@x}%
+ \edef\yinnerradius{\the\pgf@y}%
+ \addtosavedmacro{\xinnerradius}%
+ \addtosavedmacro{\yinnerradius}%
+ %
+ % Calculate a radius outside the starburst.
+ %
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x\pgf@y%
+ \fi%
+ \pgfmathaddtolength\pgf@x{+\pgfkeysvalueof{/pgf/starburst point height}}%
+ \edef\externalradius{\the\pgf@x}%
+ \addtosavedmacro{\externalradius}%
+ %
+ % Set the seed for the random number generator.
+ %
+ \pgfmathsetseed{\pgfkeysvalueof{/pgf/random starburst}}%
+ %
+ % Now create the points on the shape and also
+ % the miter length and angle for each point.
+ %
+ \def\angle{90}% Start at the top.
+ %
+ % At point a, the miter length and angle are calculated for point b = a - 1.
+ %
+ \c@pgf@counta1\relax%
+ \c@pgf@countb0\relax%
+ %
+ % As 3 consecutive points are required to be defined for miter
+ % calculations, it is necessary to go over the first two points
+ % again.
+ %
+ \c@pgf@countc\totalpoints\relax%
+ \advance\c@pgf@countc2\relax%
+ \edef\looppoints{\the\c@pgf@countc}%
+ \let\secondpoint\pgfutil@empty%
+ \let\thirdpoint\pgfutil@empty%
+ \pgfmathloop%
+ %
+ % Cycle the point definitions.
+ %
+ \let\firstpoint\secondpoint%
+ \let\secondpoint\thirdpoint%
+ \ifnum\pgfmathcounter>\looppoints%
+ \else%
+ \ifnum\pgfmathcounter>\totalpoints%
+ \expandafter\let\expandafter\thirdpoint\csname point@\the\c@pgf@counta @\endcsname%
+ \else%
+ \ifodd\pgfmathcounter%
+ %
+ % An outer point.
+ %
+ \ifnum\pgfkeysvalueof{/pgf/random starburst}=0\relax%
+ \pgf@xa\pgfkeysvalueof{/pgf/starburst point height}\relax%
+ \else%
+ \pgf@x\pgfkeysvalueof{/pgf/starburst point height}\relax%
+ \pgf@xa.75\pgf@x%
+ \pgf@xb.25\pgf@x%
+ \pgfmathrnd%
+ \pgf@xa\pgfmathresult\pgf@xa%
+ \advance\pgf@xa\pgf@xb%
+ \fi%
+ \pgf@x\xinnerradius\relax%
+ \advance\pgf@x\pgf@xa%
+ \pgf@y\yinnerradius\relax%
+ \advance\pgf@y\pgf@xa%
+ \expandafter\pgfextract@process\csname point@\the\c@pgf@counta @\endcsname{%
+ \pgfpointpolar{\angle}{\the\pgf@x and \the\pgf@y}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \else%
+ %
+ % An inner point.
+ %
+ \expandafter\pgfextract@process\csname point@\the\c@pgf@counta @\endcsname{%
+ \pgfpointpolar{\angle}{\xinnerradius and \yinnerradius}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \fi%
+ %
+ % Add the points to the saved macro.
+ %
+ \expandafter\let\expandafter\thirdpoint\csname point@\the\c@pgf@counta @\endcsname%
+ \expandafter\addtosavedmacro\expandafter{\csname point@\the\c@pgf@counta @\endcsname}%
+ \fi%
+ %
+ % It is only possible to do the miter calculations if three points are defined.
+ %
+ \ifx\firstpoint\pgfutil@empty%
+ \else%
+ %
+ % Calculate the miter length...
+ %
+ \pgfmathanglebetweenlines{\secondpoint}{\thirdpoint}{\secondpoint}{\firstpoint}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\defaultmiterangle\pgfmathresult%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \edef\miterlength{\the\pgf@x}%
+ %
+ % ...the miter angle...
+ %
+ \pgfmathanglebetweenlines{\firstpoint}{\secondpoint}{\firstpoint}{\thirdpoint}%
+ \pgfmathadd@{\pgfmathresult}{\defaultmiterangle}%
+ \pgfmathsubtract@{180}{\pgfmathresult}%
+ \let\angletemp\pgfmathresult%
+ \pgfmathanglebetweenpoints{\firstpoint}{\thirdpoint}%
+ \pgfmathsubtract@{180}{\pgfmathresult}%
+ \pgfmathsubtract@{\angletemp}{\pgfmathresult}%
+ \edef\miterangle{\pgfmathresult}%
+ %
+ % ...and thus the border point.
+ %
+ \pgfextract@process\borderpoint{%
+ \secondpoint%
+ \pgf@xa\pgf@x
+ \pgf@ya\pgf@y%
+ \pgfpointpolar{\miterangle}{\miterlength}%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Get the angle from the centerpoint to the *unrotated* border points.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\borderpoint}%
+ \expandafter\edef\csname angletoborderpoint@\the\c@pgf@countb @\endcsname{\pgfmathresult}%
+ \expandafter\addtosavedmacro\expandafter{\csname angletoborderpoint@\the\c@pgf@countb @\endcsname}%
+ %
+ % Rotate the border points and save.
+ %
+ \expandafter\pgfextract@process\csname borderpoint@\the\c@pgf@countb @\endcsname{%
+ \pgfmathrotatepointaround{\borderpoint}{\centerpoint}{\rotate}%
+ }%
+ \expandafter\addtosavedmacro\expandafter{\csname borderpoint@\the\c@pgf@countb @\endcsname}%
+ %
+ % Now create the anchors.
+ %
+ \c@pgf@countc\c@pgf@countb%
+ \advance\c@pgf@countc1\relax%
+ \divide\c@pgf@countc2\relax%
+ \ifodd\c@pgf@countb\relax%
+ \pgfutil@ifundefined{pgf@anchor@starburst@outer point\space\the\c@pgf@countc}{%
+ \expandafter\xdef\csname pgf@anchor@starburst@outer point\space\the\c@pgf@countc\endcsname{%
+ \noexpand\calculatestarburstpoints%
+ \noexpand\csname borderpoint@\the\c@pgf@countb @\noexpand\endcsname%
+ }%
+ }{}%
+ \else%
+ \pgfutil@ifundefined{pgf@anchor@starburst@inner point\space\the\c@pgf@countc}{%
+ \expandafter\xdef\csname pgf@anchor@starburst@inner point\space\the\c@pgf@countc\endcsname{%
+ \noexpand\calculatestarburstpoints%
+ \noexpand\csname borderpoint@\the\c@pgf@countb @\noexpand\endcsname%
+ }%
+ }{}%
+ \fi%
+ \fi%
+ \pgfmathadd@{\angle}{\anglestep}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \let\angle\pgfmathresult%
+ \advance\c@pgf@counta1\relax%
+ \ifnum\c@pgf@counta>\totalpoints%
+ \c@pgf@counta1\relax%
+ \fi%
+ \advance\c@pgf@countb1\relax%
+ \ifnum\c@pgf@countb>\totalpoints%
+ \c@pgf@countb1\relax%
+ \fi%
+ \repeatpgfmathloop%
+ }%
+ \savedanchor\centerpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}%
+ \pgfmathaddtolength\pgf@y{+-.5\dp\pgfnodeparttextbox}%
+ }%
+ \savedanchor\midpoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}%
+ \pgf@y0pt\relax%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{north}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
+ }%
+ \anchor{south}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
+ }%
+ \anchor{east}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
+ }%
+ \anchor{north west}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
+ }%
+ \anchor{south west}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
+ }%
+ \anchor{north east}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
+ }%
+ \anchor{south east}{%
+ \calculatestarburstpoints%
+ \csname pgf@anchor@starburst@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
+ }%
+ \backgroundpath{%
+ \calculatestarburstpoints%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\totalpoints%
+ \else%
+ \ifnum\pgfmathcounter=1\relax%
+ \let\starburstaction\pgfpathmoveto%
+ \else%
+ \let\starburstaction\pgfpathlineto%
+ \fi%
+ \starburstaction{%
+ %\pgfmathrotatepointaround{\csname point@\pgfmathcounter @\endcsname}{\centerpoint}{\rotate}}%
+ \csname point@\pgfmathcounter @\endcsname}
+ \repeatpgfmathloop%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external
+ % point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Get the starburst points.
+ %
+ \calculatestarburstpoints%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ \pgfmathsubtract@{\pgfmathresult}{\rotate}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\externalangle\pgfmathresult%
+ %
+ % Locate the appropriate sides on the starburst border...
+ %
+ \ifdim\externalangle pt<90pt\relax%
+ \c@pgf@counta0\relax%
+ \c@pgf@countb\totalpoints\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \else%
+ \ifdim\csname angletoborderpoint@\the\c@pgf@countb @\endcsname pt>90pt\relax%
+ \c@pgf@counta\c@pgf@countb%
+ \else%
+ \ifdim\externalangle pt>\csname angletoborderpoint@\the\c@pgf@countb @\endcsname pt\relax%
+ \c@pgf@counta\c@pgf@countb%
+ \fi%
+ \fi%
+ \advance\c@pgf@countb-1\relax%
+ \repeatpgfmathloop%
+ \edef\first{\the\c@pgf@counta}%
+ \advance\c@pgf@counta1\relax%
+ \ifnum\c@pgf@counta>\totalpoints\relax%
+ \c@pgf@counta1\relax%
+ \fi%
+ \edef\second{\the\c@pgf@counta}%
+ \else%
+ \c@pgf@counta0\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \else%
+ \ifdim\csname angletoborderpoint@\pgfmathcounter @\endcsname pt<90pt\relax%
+ \c@pgf@counta\pgfmathcounter%
+ \else%
+ \ifdim\externalangle pt<\csname angletoborderpoint@\pgfmathcounter @\endcsname pt\relax%
+ \c@pgf@counta\pgfmathcounter%
+ \fi%
+ \fi%
+ \repeatpgfmathloop%
+ \edef\first{\the\c@pgf@counta}%
+ \advance\c@pgf@counta-1\relax%
+ \ifnum\c@pgf@counta=0\relax%
+ \c@pgf@counta\totalpoints\relax%
+ \fi%
+ \edef\second{\the\c@pgf@counta}%
+ \fi%
+ %
+ % ...and thus, the point on the star border.
+ %
+ \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\csname borderpoint@\first @\endcsname}{\csname borderpoint@\second @\endcsname}%
+ }%
+}%
+
+
+
+
+% Keys for shape cloud.
+%
+% /pgf/cloud puffs : the number of cloud puffs.
+% /pgf/cloud puff arc : the length of the cloud puff arc.
+
+\newif\ifpgfcloudanchorsuseellipse%
+\newif\ifpgfcloudignoresaspect%
+\pgfcloudignoresaspectfalse%
+\pgfkeys{/pgf/.cd,
+ cloud puffs/.initial=10,
+ cloud puff arc/.initial=150,
+ cloud ignores aspect/.is if=pgfcloudignoresaspect,
+ cloud anchors use ellipse/.is if=pgfcloudanchorsuseellipse,
+}%
+
+
+% If symbol library is loaded separately these need to be defined.
+%
+\pgfkeys{/pgf/.cd,
+ aspect/.code={\pgfsetshapeaspect{#1}},% this for tikz...
+ shape aspect/.initial=1,% but this is consistent with other pgfset stuff.
+ shape aspect/.code={%
+ \pgfkeys{/pgf/aspect=#1}%
+ \pgfkeyssetvalue{/pgf/shape aspect}{#1}
+ }%
+}%
+
+\def\pgfsetshapeaspect#1{%
+ \def\pgfshapeaspect{#1}%
+ % Invert
+ \pgfutil@tempdima=#1pt%
+ \pgfutil@tempdima=.125\pgfutil@tempdima%
+ \c@pgf@counta=\pgfutil@tempdima\relax% 8192*determinant
+ \pgfutil@tempdima=8192pt%
+ \divide\pgfutil@tempdima by\c@pgf@counta%
+ \edef\pgfshapeaspectinverse{\pgf@sys@tonumber{\pgfutil@tempdima}}%
+}%
+
+\pgfsetshapeaspect{1}%
+
+
+% Shape cloud.
+%
+\pgfdeclareshape{cloud}{%
+ \savedmacro\getradii{%
+ \pgfmathtruncatemacro\puffs{\pgfkeysvalueof{/pgf/cloud puffs}}%
+ \addtosavedmacro\puffs%
+ \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/cloud puffs}}%
+ \let\anglestep\pgfmathresult%
+ \addtosavedmacro\anglestep%
+ \pgfmathsetmacro\arc{\pgfkeysvalueof{/pgf/cloud puff arc}}%
+ \addtosavedmacro\arc%
+ %
+ % x radius.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@x1.4142135\pgf@x%
+ %
+ % y radius.
+ %
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ \pgf@y1.4142135\pgf@y%
+ %
+ % Adjust for shape aspect.
+ %
+ \ifpgfcloudignoresaspect%
+ \pgf@xc\pgf@x%
+ \pgf@yc\pgf@y%
+ \else%
+ \pgf@xc\pgfshapeaspect\pgf@y%
+ \ifdim\pgf@xc<\pgf@x%
+ \pgf@xc\pgf@x%
+ \fi%
+ \pgf@yc\pgfshapeaspectinverse\pgf@xc%
+ \ifdim\pgf@yc<\pgf@y%
+ \pgf@yc\pgf@y%
+ \pgf@xc\pgfshapeaspect\pgf@y%
+ \fi%
+ \fi%
+ %
+ \edef\xinnerradius{\the\pgf@xc}%
+ \edef\yinnerradius{\the\pgf@yc}%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x<\pgf@y%
+ \pgf@x\pgf@y%
+ \fi%
+ \edef\outersep{\the\pgf@x}%
+ \addtosavedmacro\outersep%
+ %
+ % For a given cloud, with puff arc length a, the quotient of the
+ % distance between the start and end point of a puffs circular arc
+ % and the radius of that arc, is constant:
+ %
+ % g = .5 * sec((180-a)/2)
+ %
+ \pgfmathsubtract{180}{\arc}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\tempangle\pgfmathresult%
+ \pgfmathsec@{\pgfmathresult}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\arcradiusquotient\pgfmathresult%
+ \addtosavedmacro\arcradiusquotient%
+ %
+ % In addition, the quotient of the distance between the start and
+ % end point of a puffs circular arc and the height of that arc
+ % (ignoring rotation), is also constant:
+ %
+ % h = .5 * (1-sin((180-a)/2))/cos((180-a)/2)
+ % = g * (1 - sin((180-a)/2))
+ \pgfmathsin@{\tempangle}%
+ \pgfmathsubtract@{1}{\pgfmathresult}%
+ \pgfmathmultiply@{\pgfmathresult}{\arcradiusquotient}%
+ \let\archeightquotient\pgfmathresult%
+ \addtosavedmacro\archeightquotient%
+ %
+ % Minimum size is applied to the circum-ellipse (i.e. the ellipse
+ % that passes through the extremities of each puff). Thus, the
+ % relationship between the radii of the elliptical incircle ("inellipse"?)
+ % of the cloud (x and y) and the radii of the circum-ellipse (X and Y),
+ % is given by
+ %
+ % X = 2(x*cos(p/2) + ky)
+ % Y = 2(y*cos(p/2) + kx)
+ %
+ % where:
+ % k = sin(p/2)*((1-cos(a/2))/sin(a/2))
+ % p = the angle between each puff (i.e. 360/<puffs>)
+ % a = the length of arc of the puff.
+ %
+ \pgfmathdivide{\arc}{2}%
+ \let\halfarcangle\pgfmathresult%
+ \pgfmathcos@{\pgfmathresult}%
+ \pgfmathsubtract@{1}{\pgfmathresult}%
+ \let\pgf@temp\pgfmathresult%
+ \pgfmathsin@{\halfarcangle}%
+ \pgfmathdivide@{\pgf@temp}{\pgfmathresult}%
+ \let\pgf@temp\pgfmathresult%
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathsin@{\pgfmathresult}%
+ \pgfmathmultiply@{\pgfmathresult}{\pgf@temp}%
+ \let\k\pgfmathresult%
+ %
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathcos@{\pgfmathresult}%
+ \let\coshalfanglestep\pgfmathresult%
+ %
+ % Calculate the actual radii of the circum-ellipse.
+ %
+ \pgf@x\xinnerradius\relax%
+ \pgf@y\yinnerradius\relax%
+ \pgf@xa\coshalfanglestep\pgf@x%
+ \advance\pgf@xa\k\pgf@y%
+ \pgf@ya\coshalfanglestep\pgf@y%
+ \advance\pgf@ya\k\pgf@x%
+ %
+ % Adjust for minimum height (Y').
+ %
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@ya<.5\pgf@yb%
+ \pgf@ya.5\pgf@yb%
+ \fi%
+ %
+ % Adjust for minimum width (X').
+ %
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@xa<.5\pgf@xb%
+ \pgf@xa.5\pgf@xb%
+ \fi%
+ %
+ \edef\xouterradius{\the\pgf@xa}%
+ \addtosavedmacro\xouterradius%
+ \edef\youterradius{\the\pgf@ya}%
+ \addtosavedmacro\youterradius%
+ %
+ % Now recalculate `in-ellipse' radii:
+ %
+ % x = (X'cos(p/2)-kY')/cos^2(p/2)-k^2,
+ % y = (Y'cos(p/2)-kX')/cos^2(p/2)-k^2,
+ %
+ \pgf@xc\k pt\relax%
+ \pgf@xc-\k\pgf@xc%
+ \pgf@yc\coshalfanglestep pt\relax%
+ \pgf@yc\coshalfanglestep\pgf@yc%
+ \advance\pgf@xc\pgf@yc\relax%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xc}}% cos^2(p/2)-k^2
+ %
+ \pgf@x\coshalfanglestep\pgf@xa%
+ \advance\pgf@x-\k\pgf@ya%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y\coshalfanglestep\pgf@ya%
+ \advance\pgf@y-\k\pgf@xa%
+ \pgf@y\pgfmathresult\pgf@y%
+ %
+ \edef\xinnerradius{\the\pgf@x}%
+ \edef\yinnerradius{\the\pgf@y}%
+ \addtosavedmacro\xinnerradius%
+ \addtosavedmacro\yinnerradius%
+ %
+ % Get some useful trig. constants.
+ %
+ \pgfmathdivide@{\arc}{4}%
+ \let\quarterarc\pgfmathresult%
+ \pgfmathsubtract@{180}{\arc}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\halfcomplementarc\pgfmathresult%
+ %
+ \addtosavedmacro\arc%
+ \addtosavedmacro\quarterarc%
+ \addtosavedmacro\halfcomplementarc%
+ %
+ \pgfmathsec@{\halfcomplementarc}% 1/cos((180-a)/2)
+ \let\sechalfcomplementarc\pgfmathresult%
+ \pgfmathsin@{\halfcomplementarc}% sin((180-a)/2)
+ \let\sinhalfcomplementarc\pgfmathresult%
+ %
+ \addtosavedmacro\sechalfcomplementarc%
+ \addtosavedmacro\sinhalfcomplementarc%
+ %
+ \pgfmathsin@{\quarterarc}% sin(a/4)
+ \let\sinquarterarc\pgfmathresult%
+ \pgfmathcos@{\quarterarc}% cos(a/4)
+ \let\cosquarterarc\pgfmathresult%
+ \pgfmathreciprocal@{\cosquarterarc}%
+ \pgfmathmultiply@{\pgfmathresult}{\sinquarterarc}% tan(a/4)
+ \let\tanquarterarc\pgfmathresult%
+ %
+ \addtosavedmacro\sinquarterarc%
+ \addtosavedmacro\cosquarterarc%
+ \addtosavedmacro\tanquarterarc%
+ %
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{north}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{0pt}{\youterradius}}%
+ }%
+ \anchor{south}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{0pt}{-\youterradius}}%
+ }%
+ \anchor{east}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{\xouterradius}{0pt}}%
+ }%
+ \anchor{west}{%
+ \getradii%
+ \csname pgf@anchor@cloud@border\endcsname{\pgfqpoint{-\xouterradius}{0pt}}%
+ }%
+ \anchor{north west}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x-0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ \anchor{north east}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ \anchor{south west}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x-0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y-0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ \anchor{south east}{%
+ \getradii%
+ \pgfextract@process\pgf@sh{%
+ \pgf@x\xouterradius\relax%
+ \pgf@x0.707106\pgf@x%
+ \pgf@y\youterradius\relax%
+ \pgf@y-0.707106\pgf@y%
+ }%
+ \csname pgf@anchor@cloud@border\endcsname{\pgf@sh}%
+ }%
+ %
+ % Each `puff' is a circular arc of length a, drawn using two a/2
+ % arcs (a < 180), approximated by Bezier curves.
+ % Due to TeX rounding errors, it is sometimes necessary to `force'
+ % the arc to end at a specific point. So...
+ %
+ % @article{riskus2006,
+ % author = {Aleskus Ri\v{s}kus},
+ % title = {Approximation of a cubic Bezier curve by circular arcs and vice versa},
+ % journal = {Information Technology and Control},
+ % year = {2006},
+ % volume = {35},
+ % number = {4}
+ % }
+ %
+ \backgroundpath{%
+ {%
+ \getradii%
+ %
+ % Get the start angle.
+ %
+ \pgfmathdivide@{\anglestep}{2}%
+ \pgfmathsubtract@{90}{\pgfmathresult}%
+ \let\angle\pgfmathresult%
+ %
+ % Calculate the first arc point.
+ %
+ \pgfextract@process\arcfirstpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ \pgfpathmoveto{\arcfirstpoint}%
+ \let\arcendpoint\arcfirstpoint%
+ %
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\puffs\relax%
+ \else
+ \let\arcstartpoint\arcendpoint%
+ %
+ % Make sure beginning and end of path are exactly the same.
+ %
+ \ifnum\pgfmathcounter=\puffs\relax%
+ \let\arcendpoint\arcfirstpoint%
+ \else%
+ \pgfmathadd@{\angle}{\anglestep}%
+ \let\angle\pgfmathresult%
+ \pgfextract@process\arcendpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ \fi%
+ %
+ % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
+ %
+ \pgf@sh@getcloudpuffparameters%
+ %
+ % Get the rotation for the Bezier curve.
+ %
+ \pgfmathsubtract@{90}{\quarterarc}%
+ \pgfmathadd@{\pgfmathresult}{\arcslope}%
+ \let\arcrotate\pgfmathresult%
+ \pgfmathsin@{\arcrotate}%
+ \let\sinarcrotate\pgfmathresult%
+ \pgfmathcos@{\arcrotate}%
+ \let\cosarcrotate\pgfmathresult%
+ %
+ % Calculate the amount by which to scale the control
+ % points, in order to approximate an a/2 arc with radius x.
+ %
+ \pgf@x\arcradius\relax%
+ \pgf@x\tanquarterarc\pgf@x% tan(a/4)
+ \edef\controlscale{\pgfmath@tonumber{\pgf@x}}%
+ %
+ % Get the first control point for the first arc (length a/2)...
+ %
+ \pgfextract@process\controlone{%
+ %
+ % k = 0.552284745 (a `magic' number)...
+ %
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% k * cos(a/2)
+ %
+ % ...scale the control points up...
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ % ...rotate...
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ % ...and shift.
+ %
+ \arcstartpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Get the midpoint of the 150� arc.
+ %
+ \pgfextract@process\arcmidpoint{%
+ \pgfextract@process\arcmidpoint{%
+ \pgf@x-\halfchordlength\relax%
+ \pgf@y\segmentheight\relax%
+ }%
+ \pgfpointadd{\arcstartpoint}{%
+ \pgfmathrotatepointaround{\arcmidpoint}{\pgfpointorigin}{\arcslope}%
+ }%
+ }%
+ %
+ % Get the second control point for the first arc (length a/2)...
+ %
+ \pgfextract@process\controltwo{%
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y-0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% -k * cos(a/2)
+ %
+ % ...scale, rotate and shift.
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ \arcmidpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ {%
+ \pgfsetcornersarced{\pgfpointorigin}%
+ \pgfpathcurveto{\controlone}{\controltwo}{\arcmidpoint}%
+ }%
+ %
+ % Do the same for the second arc...
+ %
+ \pgfmathadd@{\quarterarc}{90}%
+ \pgfmathadd@{\pgfmathresult}{\arcslope}%
+ \let\arcrotate\pgfmathresult%
+ \pgfmathsin@{\arcrotate}%
+ \let\sinarcrotate\pgfmathresult%
+ \pgfmathcos@{\arcrotate}%
+ \let\cosarcrotate\pgfmathresult%
+ %
+ % First control point for the second arc...
+ %
+ \pgfextract@process\controlone{%
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% k * cos(a/2)
+ %
+ % ...scale, rotate and shift.
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ \arcmidpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ %
+ % Second control point for the second arc.
+ %
+ \pgfextract@process\controltwo{%
+ \pgf@x0.55228475pt\relax%
+ \pgf@x\sinquarterarc\pgf@x% k * sin(a/2)
+ \pgf@y-0.55228475pt\relax%
+ \pgf@y\cosquarterarc\pgf@y% -k * cos(a/2)
+ %
+ % ...scale, rotate and shift.
+ %
+ \pgf@x\controlscale\pgf@x%
+ \pgf@y\controlscale\pgf@y%
+ %
+ \pgf@xa\cosarcrotate\pgf@x%
+ \advance\pgf@xa-\sinarcrotate\pgf@y%
+ \pgf@ya\cosarcrotate\pgf@y%
+ \advance\pgf@ya\sinarcrotate\pgf@x%
+ %
+ \arcendpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfpathcurveto{\controlone}{\controltwo}{\arcendpoint}%
+ \repeatpgfmathloop%
+ \pgfpathclose% Phew!
+ }%
+ }%
+ %
+ % Calculate a point on the border of the cloud. This is a two-stage process:
+ %
+ % 1. Locate the correct puff.
+ % 2. Locate the angle on the circular arc which forms the puff.
+ %
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Get the inner radii and trig. constants.
+ %
+ \getradii%
+ %
+ %
+ %
+ \ifpgfcloudanchorsuseellipse%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderellipse{%
+ \pgfpoint{\externalx}{\externaly}
+ }{%
+ \pgfpoint{\xouterradius}{\youterradius}
+ }%
+ }%
+ \else%
+ \pgfextract@process\externalpoint{%
+ \centerpoint%
+ \advance\pgf@x\externalx\relax%
+ \advance\pgf@y\externaly\relax%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ %
+ % 1. Locate the correct puff:
+ %
+ % Get end angle of the relevant puff arc.
+ %
+ \pgfmathdivide@{\anglestep}{2}%
+ \let\halfanglestep\pgfmathresult%
+ \pgfmathsubtract@{90}{\halfanglestep}%
+ \let\endangle\pgfmathresult%
+ \pgfmathloop%
+ \pgfmathsubtract@{\endangle}{\anglestep}%
+ \ifdim\pgfmathresult pt<-\anglestep pt\relax%
+ \else%
+ \let\endangle\pgfmathresult%
+ \repeatpgfmathloop%
+ \def\angle{0}%
+ \let\lastangle\angle%
+ \pgfmathloop%
+ \pgfmathadd@{\endangle}{\anglestep}%
+ \let\endangle\pgfmathresult%
+ %
+ % Calculate the `miter point'. This is the point between
+ % each puff, and takes into account the outer sep.
+ %
+ \pgfextract@process\miterpoint{%
+ %
+ \pgfextract@process\secondpoint{%
+ \pgfpointpolar{+\endangle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ %
+ \pgfmathadd@{\endangle}{\anglestep}%
+ \let\angletemp\pgfmathresult%
+ \pgfextract@process\thirdpoint{%
+ \pgfpointpolar{+\angletemp}{+\xinnerradius and +\yinnerradius}%
+ }%
+ %
+ \pgfmathsubtract@{\endangle}{\anglestep}%
+ \let\angletemp\pgfmathresult%
+ \pgfextract@process\firstpoint{%
+ \pgfpointpolar{+\angletemp}{+\xinnerradius and +\yinnerradius}%
+ }%
+ %
+ \pgfmathanglebetweenpoints{\firstpoint}{\secondpoint}%
+ \let\anglealpha\pgfmathresult%
+ \pgfmathanglebetweenpoints{\secondpoint}{\thirdpoint}%
+ \let\anglebeta\pgfmathresult%
+ %
+ \pgfmathsubtract@{\anglebeta}{\anglealpha}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \pgfmathadd@{\pgfmathresult}{\halfcomplementarc}%
+ \pgfmathcosec@{\pgfmathresult}%
+ \pgf@x\outersep\relax%
+ \pgf@x\pgfmathresult\pgf@x%
+ \edef\miterradius{\the\pgf@x}%
+ %
+ \pgfmathadd@{\anglealpha}{\anglebeta}%
+ \pgfmathsubtract@{\pgfmathresult}{180}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\miterangle\pgfmathresult%
+ \pgfpointadd{\secondpoint}{%
+ \pgfqpointpolar{\miterangle}{\miterradius}%
+ }%
+ }%
+ %
+ % Get the angle of the miter point...
+ %
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\miterpoint}%
+ \let\angle\pgfmathresult%
+ \ifdim\angle pt<\lastangle pt\relax% Guard against 360� = 0�
+ \pgfmathadd@{\angle}{360}%
+ \let\angle\pgfmathresult%
+ \fi%
+ \let\lastangle\angle%
+ %
+ % ...and see if it is greater than the external point.
+ %
+ \ifdim\externalangle pt>\angle pt\relax%
+ \repeatpgfmathloop%
+ %
+ % Get the start angle of the relevant arc and ensure angles are in the range.
+ %
+ \pgfmathmod@{\endangle}{360}%
+ \let\endangle\pgfmathresult%
+ \pgfmathsubtract@{\endangle}{\anglestep}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\startangle\pgfmathresult%
+ %
+ % Now, get the start and end points of the arc.
+ %
+ \pgfextract@process\arcstartpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\startangle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ \pgfextract@process\arcendpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\endangle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ %
+ % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
+ %
+ \pgf@sh@getcloudpuffparameters%
+ %
+ % Hackery, for when an arc straddles 0�.
+ %
+ \ifdim\endangle pt<\startangle pt\relax%
+ \pgfmathadd@{\externalangle}{180}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \let\x\pgfmathresult%
+ \else%
+ \let\x\externalangle%
+ \fi%
+ %
+ % 2. Locate the angle on the circular arc which forms the puff.
+ %
+ % Essentially a binary search to find the angle on the circular
+ % arc, which provides the nearest estimate to the border point.
+ %
+ \let\s\halfcomplementarc% The start of the arc.
+ \pgfmathadd@{\s}{\arc}%
+ \let\e\pgfmathresult% The end of the arc.
+ \pgfmathadd@{\e}{\s}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\n\pgfmathresult% The nearest estimate (default to middle of arc).
+ \def\m{360}% Measure of `nearness'.
+ \pgfmathloop%
+ \pgfmathadd@{\e}{\s}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\p\pgfmathresult% The point halfway between \s and \e.
+ \ifdim\p pt=\s pt\relax%
+ \else%
+ %
+ % Get the point on the circular arc.
+ %
+ \pgfmathadd@{\p}{\arcslope}%
+ \let\a\pgfmathresult%
+ \pgfextract@process\arcpoint{%
+ \pgfpointadd{\circlecenterpoint}{%
+ \pgfqpointpolar{\a}{\outerarcradius}%
+ }%
+ }%
+ %
+ % Find the angle between the node centre and the point on the arc.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\arcpoint}%
+ %
+ % Hackery, for when an arc straddles 0�.
+ %
+ \ifdim\endangle pt<\startangle pt\relax%
+ \pgfmathadd@{\pgfmathresult}{180}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \fi%
+ \let\q\pgfmathresult%
+ \ifdim\x pt=\q pt% Found it!
+ \pgfmathbreakloop% Breaks after current iteration is complete.
+ \else
+ \ifdim\x pt<\q pt\relax%
+ \let\e\p%
+ \else%
+ \let\s\p%
+ \fi%
+ \fi%
+ \pgfmathsubtract@{\x}{\q}%
+ \pgfmathabs@{\pgfmathresult}%
+ %
+ % Save the estimate if it is better than any previous estimate.
+ %
+ \ifdim\pgfmathresult pt<\m pt\relax%
+ \let\m\pgfmathresult%
+ \let\n\p%
+ \fi%
+ \repeatpgfmathloop%
+ %
+ % Use the nearest estimate as the anchor angle.
+ %
+ \pgfmathadd@{\n}{\arcslope}%
+ \let\anchorangle\pgfmathresult%
+ %
+ % Finally, the required point.
+ %
+ \pgfpointadd{\circlecenterpoint}{%
+ \pgfqpointpolar{\anchorangle}{\outerarcradius}%
+ }%
+ \fi%
+ }% Again, Phew!
+ %
+ % Now, a sneaky hack. This means an arbitrary `puff' anchors
+ % can be used for positioning the cloud shape. This is needed
+ % if a cloud is positioned using the `puff <n+1>' anchor, where
+ % n is the number of puffs of any previously drawn cloud.
+ %
+ \pgfutil@g@addto@macro\pgf@sh@s@cloud{%
+ \c@pgf@counta\puffs\relax%
+ \pgfmathloop%
+ \ifnum\c@pgf@counta>0\relax%
+ \pgfutil@ifundefined{pgf@anchor@cloud@puff\space\the\c@pgf@counta}{%
+ \expandafter\xdef\csname pgf@anchor@cloud@puff\space\the\c@pgf@counta\endcsname{%
+ \noexpand\pgf@sh@@cloudpuffanchor{\the\c@pgf@counta}%
+ }%
+ }{\c@pgf@counta0\relax}%
+ \advance\c@pgf@counta-1\relax%
+ \repeatpgfmathloop%
+ }%
+}%
+
+% \pgf@sh@@cloudpuffanchor
+%
+% Internal macro for calculating the anchors puff 1, puff 2, ... etc.
+%
+\def\pgf@sh@@cloudpuffanchor#1{%
+ \getradii%
+ \pgfmathdivide@{\anglestep}{2}%
+ \let\halfanglestep\pgfmathresult%
+ \c@pgf@counta#1\relax%
+ \advance\c@pgf@counta-1\relax%
+ \pgfmathmultiply@{\anglestep}{\the\c@pgf@counta}%
+ \pgfmathadd@{\pgfmathresult}{90}%
+ \pgfmathsubtract@{\pgfmathresult}{\halfanglestep}%
+ \let\angle\pgfmathresult%
+ %
+ % Calculate the first arc point.
+ %
+ \pgfextract@process\arcstartpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ %
+ \pgfmathadd@{\angle}{\anglestep}%
+ \let\angle\pgfmathresult%
+ \pgfextract@process\arcendpoint{%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointpolar{+\angle}{+\xinnerradius and +\yinnerradius}%
+ }%
+ }%
+ %
+ % Get some useful cloud parameters from \arcstartpoint and \arcendpoint.
+ %
+ \pgf@sh@getcloudpuffparameters%
+ %
+ % Calculate the point.
+ %
+ \pgfmathadd@{\arcslope}{90}%
+ \let\anchorangle\pgfmathresult%
+ \pgfpointadd{\circlecenterpoint}{%
+ \pgfqpointpolar{\anchorangle}{\outerarcradius}%
+ }%
+}%
+
+% \pgf@sh@cloudpuffparameters
+%
+% Internal macro to calculate some common arc parameters which
+% are required when calculating radii, drawing the background
+% path and calculating border anchors.
+%
+\def\pgf@sh@getcloudpuffparameters{%
+ %
+ % Calculate the angle to which the entire arc is sloped.
+ %
+ \pgfmathanglebetweenpoints{\arcendpoint}{\arcstartpoint}%
+ \let\arcslope\pgfmathresult%
+ %
+ % Calculate the chord length and arc radius.
+ %
+ \pgfpointdiff{\arcendpoint}{\arcstartpoint}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}
+ \pgf@x\pgfmathresult pt\relax%
+ \pgf@xa.5\pgf@x%
+ \edef\halfchordlength{\the\pgf@xa}%
+ \pgf@x\arcradiusquotient\pgf@x%
+ \edef\arcradius{\the\pgf@x}%
+ \pgf@xa\outersep\relax%
+ \advance\pgf@xa\pgf@x%
+ \edef\outerarcradius{\the\pgf@xa}%
+ %
+ % Calculate the height of the resulting segment.
+ %
+ \pgf@y-\sinhalfcomplementarc\pgf@x% sin((180-a)/2)
+ \advance\pgf@y\pgf@x%
+ \edef\segmentheight{\the\pgf@y}%
+ %
+ % Calculate the center of the circle of which the arc is a part.
+ %
+ \pgfextract@process\circlecenterpoint{%
+ \pgfextract@process\circlecenterpoint{%
+ \pgf@x-\halfchordlength\relax%
+ \pgf@y\segmentheight\relax%
+ \advance\pgf@y-\arcradius
+ }%
+ \pgfpointadd{\arcstartpoint}{%
+ \pgfmathrotatepointaround{\circlecenterpoint}{\pgfpointorigin}{\arcslope}%
+ }%
+ }%
+}%
+
+
+
+
+
+% Internal macros for signal shape.
+%
+\def\pgf@lib@sh@signal@nowhere{nowhere}%
+\def\pgf@lib@sh@signal@from{from}%
+\def\pgf@lib@sh@signal@to{to}%
+
+\def\pgf@lib@sh@signal@parsedirection#1#2{%
+ %
+ \let\pgf@lib@sh@signal@direction=#2%
+ \edef\pgf@lib@sh@temp{#1}%
+ \expandafter\pgf@lib@sh@signal@@parsedirection\pgf@lib@sh@temp\pgf@stop}%
+
+\def\pgf@lib@sh@signal@@parsedirection#1\pgf@stop{%
+ \pgfutil@in@{and}{#1}%
+ \ifpgfutil@in@%
+ \pgf@lib@sh@signal@@@parsedirection#1\pgf@lib%
+ \else%
+ \pgf@lib@sh@signal@@@parsedirection#1 and #1\pgf@lib%
+ \fi
+}%
+\def\pgf@lib@sh@signal@@@parsedirection#1 and #2\pgf@lib{%
+ \pgfutil@in@{nowhere}{#1}%
+ \ifpgfutil@in@
+ \else%
+ \pgf@lib@sh@signal@@@@parsedirection{#1}%
+ \pgf@lib@sh@signal@@@@parsedirection{#2}%
+ \fi%
+}%
+\def\pgf@lib@sh@signal@@@@parsedirection#1{%
+ \pgfutil@in@{ #1 }{ east right }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
+ \fi%
+ \pgfutil@in@{ #1 }{ left west }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
+ \fi%
+ \pgfutil@in@{ #1 }{ above up north }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
+ \fi%
+ \pgfutil@in@{ #1 }{ below down south }%
+ \ifpgfutil@in@%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@direction%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
+ \fi%
+}%
+
+
+% Keys for signal shape:
+%
+\pgfkeys{/pgf/.cd,
+ signal pointer angle/.initial=90,
+ signal to/.initial=east,
+ signal from/.initial=nowhere,
+}%
+
+\pgfdeclareshape{signal}{%
+ \savedmacro\installsignalparameters{%
+ %
+ \let\pgf@lib@sh@signal@north=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@south=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@east=\pgf@lib@sh@signal@nowhere%
+ \let\pgf@lib@sh@signal@west=\pgf@lib@sh@signal@nowhere%
+ %
+ \pgf@lib@sh@signal@parsedirection{\pgfkeysvalueof{/pgf/signal from}}{\pgf@lib@sh@signal@from}%
+ \pgf@lib@sh@signal@parsedirection{\pgfkeysvalueof{/pgf/signal to}}{\pgf@lib@sh@signal@to}%
+ %
+ % Define a centerpoint.
+ %
+ \pgfextract@process\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ %
+ % Get some useful trig. stuff
+ %
+ \pgfmathsetmacro\pointerangle{\pgfkeysvalueof{/pgf/signal pointer angle}}%
+ %
+ \pgfmathdivide@{\pointerangle}{2}%
+ \let\halfpointerangle=\pgfmathresult%
+ %
+ \pgfmathcosec@{\halfpointerangle}%
+ \let\cosechalfpointerangle=\pgfmathresult%
+ %
+ \pgfmathdivide@{\halfpointerangle}{2}%
+ \let\quarterpointerangle=\pgfmathresult%
+ %
+ \pgfmathcosec@{\quarterpointerangle}%
+ \let\cosecquarterpointerangle=\pgfmathresult%
+ %
+ \pgfmathsec@{\quarterpointerangle}%
+ \let\secquarterpointerangle=\pgfmathresult%
+ %
+ \pgfmathsubtract@{90}{\quarterpointerangle}%
+ \let\complementquarterpointerangle\pgfmathresult%
+ %
+ % Get the larger of the outer sep.
+ %
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@x>\pgf@y%
+ \pgf@y\pgf@x%
+ \fi%
+ \pgf@yc=\pgf@y%
+ %
+ % Calculate the miter due to the line width, at the pointer apex...
+ %
+ \pgf@x=\cosechalfpointerangle\pgf@y%
+ \edef\pointerapexmiter{\the\pgf@x}%
+ %
+ % ...at a corner by a `to' pointer (i.e. sticks out)...
+ %
+ \pgf@x=\secquarterpointerangle\pgf@y%
+ \edef\tocornermiter{\the\pgf@x}%
+ %
+ % ...at a corner by a `from' pointer (i.e. sticks in).
+ %
+ \pgf@x=\cosecquarterpointerangle\pgf@y
+ \edef\fromcornermiter{\the\pgf@x}%
+ %
+ % Get the (half) dimensions of the node.
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya.5\dp\pgfnodeparttextbox%
+ %
+ % Get the distance a pointer sticks out to the side...
+ %
+ \pgfmathsubtract@{90}{\halfpointerangle}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgf@xb=\pgfmathresult\pgf@ya%
+ %
+ % ...and up.
+ %
+ \pgf@yb=\pgfmathresult\pgf@xa%
+ %
+ % Adjust for minimum height.
+ %
+ \pgfutil@tempdima=2.0\pgf@ya%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@yb%
+ \fi%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgfutil@tempdima<\pgf@y%
+ \pgfutil@tempdima=\pgf@y%
+ %
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \fi%
+ \pgf@ya=0.5\pgfutil@tempdima%
+ \pgfmathsubtract@{90}{\halfpointerangle}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgf@xb=\pgfmathresult\pgf@ya%
+ \fi%
+ %
+ % Adjust for minimum width.
+ %
+ \pgfutil@tempdima=2.0\pgf@xa%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@xb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by\pgf@xb%
+ \fi%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgfutil@tempdima<\pgf@x%
+ \pgfutil@tempdima=\pgf@x%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgf@xa=0.5\pgfutil@tempdima%
+ \pgfmathsubtract@{90}{\halfpointerangle}%
+ \pgfmathtan@{\pgfmathresult}%
+ \pgf@yb=\pgfmathresult\pgf@xa%
+ \fi%
+ %
+ % So, define the points for the background path.
+ %
+ \pgfextract@process\north{%
+ \centerpoint%
+ \advance\pgf@y\pgf@ya%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@to%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\south{%
+ \centerpoint%
+ \advance\pgf@y-\pgf@ya%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ }%
+ \pgfextract@process\east{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
+ \advance\pgf@x\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\west{%
+ \centerpoint%
+ \advance\pgf@x-\pgf@xa%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\northeast{%
+ \centerpoint%
+ \advance\pgf@y\pgf@ya%
+ \advance\pgf@x\pgf@xa%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \advance\pgf@x\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\southeast{%
+ \centerpoint%
+ \advance\pgf@y-\pgf@ya%
+ \advance\pgf@x\pgf@xa%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \advance\pgf@x\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\southwest{%
+ \centerpoint%
+ \advance\pgf@y-\pgf@ya%
+ \advance\pgf@x-\pgf@xa%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \advance\pgf@y-\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ }%
+ \pgfextract@process\northwest{%
+ \centerpoint%
+ \advance\pgf@y\pgf@ya%
+ \advance\pgf@x-\pgf@xa%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \advance\pgf@y\pgf@yb%
+ \fi%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \advance\pgf@x-\pgf@xb%
+ \fi%
+ }%
+ \addtosavedmacro{\north}%
+ \addtosavedmacro{\south}%
+ \addtosavedmacro{\east}%
+ \addtosavedmacro{\west}%
+ \addtosavedmacro{\northeast}%
+ \addtosavedmacro{\southwest}%
+ \addtosavedmacro{\southeast}%
+ \addtosavedmacro{\northwest}%
+ %
+ % Calculate the `miter vectors' (i.e. +outer sep).
+ %
+ \pgfextract@process\northmiter{%
+ \pgf@x0pt%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@nowhere%
+ \pgf@y\pgf@yc%
+ \else%
+ \pgf@y\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\southmiter{%
+ \pgf@x0pt%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@nowhere%
+ \pgf@y-\pgf@yc%
+ \else%
+ \pgf@y-\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\eastmiter{%
+ \pgf@y0pt%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \pgf@x\pgf@yc%
+ \else%
+ \pgf@x\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\westmiter{%
+ \pgf@y0pt%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \pgf@x-\pgf@yc%
+ \else%
+ \pgf@x-\pointerapexmiter\relax%
+ \fi%
+ }%
+ \pgfextract@process\northeastmiter{%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \pgf@x\pgf@yc
+ \pgf@y\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{\quarterpointerangle}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{\complementquarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{\complementquarterpointerangle}{\fromcornermiter}%
+ \else%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{\quarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\southeastmiter{%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@nowhere%
+ \pgf@x\pgf@yc%
+ \pgf@y\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{-\quarterpointerangle}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@east\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{-\complementquarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \pgfqpointpolar{-\complementquarterpointerangle}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
+ \pgfqpointpolar{-\quarterpointerangle}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\southwestmiter{%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \pgf@x-\pgf@yc
+ \pgf@y-\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \pgfmathadd@{\quarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \pgfmathadd@{\complementquarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@from%
+ \pgfmathadd@{\complementquarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}%
+ \else%
+ \ifx\pgf@lib@sh@signal@south\pgf@lib@sh@signal@to%
+ \pgfmathadd@{\quarterpointerangle}{180}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \pgfextract@process\northwestmiter{%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@nowhere%
+ \pgf@x-\pgf@yc%
+ \pgf@y\pgf@yc%
+ \else
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@from%
+ \pgfmathsubtract@{180}{\quarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}
+ \else%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \pgfmathsubtract@{180}{\complementquarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgf@lib@sh@signal@north\pgf@lib@sh@signal@from%
+ \pgfmathsubtract@{180}{\complementquarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\fromcornermiter}%
+ \else%
+ \ifx\pgf@lib@sh@signal@west\pgf@lib@sh@signal@to%
+ \pgfmathsubtract@{180}{\quarterpointerangle}%
+ \expandafter\pgfqpointpolar\expandafter{\pgfmathresult}{\tocornermiter}%
+ \fi%
+ \fi%
+ }%
+ \addtosavedmacro{\northmiter}%
+ \addtosavedmacro{\southmiter}%
+ \addtosavedmacro{\eastmiter}%
+ \addtosavedmacro{\westmiter}%
+ \addtosavedmacro{\northeastmiter}%
+ \addtosavedmacro{\southeastmiter}%
+ \addtosavedmacro{\southwestmiter}%
+ \addtosavedmacro{\northwestmiter}%
+ %
+ % Now calculate the anchor points
+ %
+ \pgfextract@process\anchornorth{%
+ \pgfpointadd{\north}{\northmiter}%
+ }%
+ \pgfextract@process\anchorsouth{%
+ \pgfpointadd{\south}{\southmiter}%
+ }%
+ \pgfextract@process\anchoreast{%
+ \pgfpointadd{\east}{\eastmiter}%
+ }%
+ \pgfextract@process\anchorwest{%
+ \pgfpointadd{\west}{\westmiter}%
+ }%
+ \pgfextract@process\anchornortheast{%
+ \pgfpointadd{\northeast}{\northeastmiter}%
+ }%
+ \pgfextract@process\anchorsoutheast{%
+ \pgfpointadd{\southeast}{\southeastmiter}%
+ }%
+ \pgfextract@process\anchorsouthwest{%
+ \pgfpointadd{\southwest}{\southwestmiter}%
+ }%
+ \pgfextract@process\anchornorthwest{%
+ \pgfpointadd{\northwest}{\northwestmiter}%
+ }%
+ \addtosavedmacro{\anchornorth}%
+ \addtosavedmacro{\anchorsouth}%
+ \addtosavedmacro{\anchoreast}%
+ \addtosavedmacro{\anchorwest}%
+ \addtosavedmacro{\anchornortheast}%
+ \addtosavedmacro{\anchorsouthwest}%
+ \addtosavedmacro{\anchorsoutheast}%
+ \addtosavedmacro{\anchornorthwest}%
+ }%
+ \savedanchor\centerpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor\basepoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \savedanchor\midpoint{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+.5ex}%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{%
+ \installsignalparameters%
+ \anchoreast%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsoutheast%
+ \ifdim\pgf@xa>\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \basepoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \basepoint%
+ \let\firstpoint\anchoreast%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsoutheast%
+ \else%
+ \let\secondpoint\anchornortheast%
+ \fi%
+ \pgfpointintersectionoflines{\basepoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{base west}{%
+ \installsignalparameters%
+ \anchorwest%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsouthwest%
+ \ifdim\pgf@xa<\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \basepoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \basepoint%
+ \let\firstpoint\anchorwest%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsouthwest%
+ \else%
+ \let\secondpoint\anchornorthwest%
+ \fi%
+ \pgfpointintersectionoflines{\basepoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{%
+ \installsignalparameters%
+ \anchoreast%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsoutheast%
+ \ifdim\pgf@xa>\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \midpoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \midpoint%
+ \let\firstpoint\anchoreast%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsoutheast%
+ \else%
+ \let\secondpoint\anchornortheast%
+ \fi%
+ \pgfpointintersectionoflines{\midpoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{mid west}{%
+ \installsignalparameters%
+ \anchorwest%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \anchorsouthwest%
+ \ifdim\pgf@xa<\pgf@x%
+ \pgfutil@tempdima\pgf@xa%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \fi%
+ \pgfextract@process\externalpoint{%
+ \midpoint%
+ \pgf@x\pgfutil@tempdima%
+ }
+ \midpoint%
+ \let\firstpoint\anchorwest%
+ \ifdim\pgf@y<\pgf@ya%
+ \let\secondpoint\anchorsouthwest%
+ \else%
+ \let\secondpoint\anchornorthwest%
+ \fi%
+ \pgfpointintersectionoflines{\midpoint}{\externalpoint}%
+ {\firstpoint}{\secondpoint}%
+ }%
+ \anchor{north}{\installsignalparameters\anchornorth}%
+ \anchor{south}{\installsignalparameters\anchorsouth}%
+ \anchor{east}{\installsignalparameters\anchoreast}%
+ \anchor{west}{\installsignalparameters\anchorwest}%
+ \anchor{north east}{\installsignalparameters\anchornortheast}%
+ \anchor{south east}{\installsignalparameters\anchorsoutheast}%
+ \anchor{south west}{\installsignalparameters\anchorsouthwest}%
+ \anchor{north west}{\installsignalparameters\anchornorthwest}%
+ \backgroundpath{%
+ \installsignalparameters%
+ \pgfpathmoveto{\north}%
+ \pgfpathlineto{\northeast}%
+ \pgfpathlineto{\east}%
+ \pgfpathlineto{\southeast}%
+ \pgfpathlineto{\south}%
+ \pgfpathlineto{\southwest}%
+ \pgfpathlineto{\west}%
+ \pgfpathlineto{\northwest}%
+ \pgfpathclose%
+ }%
+ \anchorborder{%
+ %
+ % Save x and y.
+ %
+ \edef\externalx{\the\pgf@x}%
+ \edef\externaly{\the\pgf@y}%
+ %
+ % Adjust the location of the external
+ % point relative to \centerpoint.
+ %
+ \centerpoint%
+ \pgf@xa\externalx\relax%
+ \pgf@ya\externaly\relax%
+ \advance\pgf@xa\pgf@x%
+ \advance\pgf@ya\pgf@y%
+ \edef\externalx{\the\pgf@xa}%
+ \edef\externaly{\the\pgf@ya}%
+ %
+ % Get the shape parameters.
+ %
+ \installsignalparameters%
+ %
+ % Get the angle of the external point to the \centerpoint.
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ \let\externalangle\pgfmathresult%
+ %
+ %
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorwest}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchornorth}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchornortheast}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchoreast%
+ \let\secondpoint\anchornortheast%
+ \else%
+ \let\secondpoint\anchornortheast%
+ \let\firstpoint\anchornorth%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchornorthwest}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchornorth%
+ \let\secondpoint\anchornorthwest%
+ \else%
+ \let\secondpoint\anchornorthwest%
+ \let\firstpoint\anchorwest%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorsouth}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorsouthwest}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchorwest%
+ \let\secondpoint\anchorsouthwest%
+ \else%
+ \let\secondpoint\anchorsouthwest%
+ \let\firstpoint\anchorsouth%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\anchorsoutheast}%
+ \ifdim\externalangle pt<\pgfmathresult pt\relax%
+ \let\firstpoint\anchorsouth%
+ \let\secondpoint\anchorsoutheast%
+ \else%
+ \let\secondpoint\anchorsoutheast%
+ \let\firstpoint\anchoreast%
+ \fi%
+ \fi%
+ \fi%
+ %
+ % Now locate the point.
+ %
+ \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}%
+ {\firstpoint}{\secondpoint}%
+ }%
+}%
+
+
+
+
+
+
+% Keys for shape tape
+%
+% /pgf/tape bend top : Type of bend for north side.
+% /pgf/tape bend bottom : Type of bend for south side.
+% /pgf/tape bend height : The height of the bends.
+\pgfkeys{/pgf/.cd,
+ tape bend top/.initial=in and out,
+ tape bend bottom/.initial=in and out,
+ tape bend/.style={/pgf/tape bend top=#1, /pgf/tape bend bottom=#1},
+ tape bend height/.initial=5pt,
+}%
+
+\def\pgf@lib@sh@inandouttext{in and out}%
+\def\pgf@lib@sh@outandintext{out and in}%
+\def\pgf@lib@sh@nonetext{none}%
+
+\pgfdeclareshape{tape}{%
+ \savedmacro\tapedimensions{%
+ \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y.5\dp\pgfnodeparttextbox%
+ %
+ \pgfmathsetlengthmacro\outerxsep{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlengthmacro\outerysep{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \addtosavedmacro\outerxsep%
+ \addtosavedmacro\outerysep%
+ %
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/tape bend height}}%
+ \pgfutil@tempdima.5\pgfutil@tempdima%
+ \edef\halfbendheight{\the\pgfutil@tempdima}%
+ \addtosavedmacro\halfbendheight%
+ %
+ \pgfkeysgetvalue{/pgf/tape bend top}{\topbendstyle}%
+ \pgfkeysgetvalue{/pgf/tape bend bottom}{\bottombendstyle}%
+ \addtosavedmacro\topbendstyle%
+ \addtosavedmacro\bottombendstyle%
+ %
+ \ifx\topbendstyle\pgf@lib@sh@nonetext%
+ \else%
+ \advance\pgf@y\pgfutil@tempdima%
+ \fi%
+ \ifx\bottombendstyle\pgf@lib@sh@none%
+ \else%
+ \advance\pgf@y\pgfutil@tempdima%
+ \fi%
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xa%
+ \pgf@x.5\pgf@xa%
+ \fi%
+ \ifdim\pgf@y<.5\pgf@ya%
+ \pgf@y.5\pgf@ya%
+ \fi%
+ \ifx\topbendstyle\pgf@lib@sh@nonetext%
+ \else%
+ \advance\pgf@y-\pgfutil@tempdima%
+ \fi%
+ \ifx\bottombendstyle\pgf@lib@sh@nonetext%
+ \else%
+ \advance\pgf@y-\pgfutil@tempdima%
+ \fi%
+ %
+ \pgfutil@tempdima3.414213\pgfutil@tempdima% 1 / (1-sin(45))
+ \edef\bendyradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\bendyradius%
+ \advance\pgfutil@tempdima\outerysep%
+ \edef\outerbendyradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\outerbendyradius%
+ \advance\pgfutil@tempdima-\outerysep%
+ \advance\pgfutil@tempdima-\outerysep%
+ \edef\innerbendyradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\innerbendyradius%
+ %
+ \pgfutil@tempdima0.707106\pgf@x% cos(45)
+ \edef\bendxradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\bendxradius%
+ \advance\pgfutil@tempdima\outerxsep%
+ \edef\outerbendxradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\outerbendxradius%
+ \advance\pgfutil@tempdima-\outerxsep%
+ \advance\pgfutil@tempdima-\outerxsep%
+ \edef\innerbendxradius{\the\pgfutil@tempdima}%
+ \addtosavedmacro\innerbendxradius%
+ %
+ \edef\halfwidth{\the\pgf@x}%
+ \edef\halfheight{\the\pgf@y}%
+ \addtosavedmacro\halfwidth%
+ \addtosavedmacro\halfheight%
+ %
+ \advance\pgf@x\outerxsep%
+ \edef\outerhalfwidth{\the\pgf@x}%
+ \addtosavedmacro\outerhalfwidth%
+ %
+ \pgf@xc\bendxradius%
+ \pgf@yc\bendyradius%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@xc}}%
+ \pgfmathatan{\pgfmathresult}%
+ \pgf@xc\pgfmathresult pt\relax%
+ \pgf@xc.5\pgf@xc%
+ \edef\halfangle{\pgfmath@tonumber{\pgf@xc}}%
+ \addtosavedmacro\halfangle%
+ %
+ \pgf@xc45pt\relax%
+ \advance\pgf@xc-\halfangle pt%
+ \pgfmathcot@{\pgfmath@tonumber{\pgf@xc}}%
+ \let\cothalfanglein\pgfmathresult%
+ \addtosavedmacro\cothalfanglein%
+ %
+ \pgf@xc90pt\relax%
+ \advance\pgf@xc-\halfangle pt%
+ \pgfmathcot@{\pgfmath@tonumber{\pgf@xc}}%
+ \let\cothalfangleout\pgfmathresult%
+ \addtosavedmacro\cothalfangleout%
+ %
+ }%
+ \savedanchor{\centerpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y-.5\dp\pgfnodeparttextbox%
+ }%
+ \savedanchor{\midpoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@y{+0.5ex}%
+ }%
+ \savedanchor{\basepoint}{%
+ \pgf@x.5\wd\pgfnodeparttextbox%
+ \pgf@y0pt%
+ }%
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\midpoint}%
+ \anchor{mid east}{\tapedimensions\midpoint\advance\pgf@x\outerhalfwidth}%
+ \anchor{mid west}{\tapedimensions\midpoint\advance\pgf@x-\outerhalfwidth}%
+ \anchor{base}{\basepoint}%
+ \anchor{base east}{\tapedimensions\basepoint\advance\pgf@x\outerhalfwidth}%
+ \anchor{base west}{\tapedimensions\basepoint\advance\pgf@x-\outerhalfwidth}%
+ \anchor{north}{%
+ \csname pgf@anchor@tape@north east\endcsname%
+ \pgf@ya\pgf@y%
+ \csname pgf@anchor@tape@north west\endcsname%
+ \advance\pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y.5\pgf@ya%
+ }%
+ \anchor{south}{%
+ \csname pgf@anchor@tape@south east\endcsname%
+ \pgf@ya\pgf@y%
+ \csname pgf@anchor@tape@south west\endcsname%
+ \advance\pgf@ya\pgf@y%
+ \centerpoint%
+ \pgf@y.5\pgf@ya%
+ }%
+ \anchor{east}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x\outerhalfwidth%
+ }%
+ \anchor{west}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x-\outerhalfwidth%
+ }%
+ \anchor{north east}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x\outerhalfwidth%
+ \advance\pgf@y\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfangleout\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfanglein\pgf@yc%
+ \else%
+ \advance\pgf@y\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \anchor{north west}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x-\outerhalfwidth%
+ \advance\pgf@y\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfanglein\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y\halfbendheight%
+ \advance\pgf@y\cothalfangleout\pgf@yc%
+ \else%
+ \advance\pgf@y\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \anchor{south east}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x\outerhalfwidth%
+ \advance\pgf@y-\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfangleout\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfanglein\pgf@yc%
+ \else%
+ \advance\pgf@y-\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \anchor{south west}{%
+ \tapedimensions%
+ \centerpoint%
+ \advance\pgf@x-\outerhalfwidth%
+ \advance\pgf@y-\halfheight%
+ \pgf@yc\outerysep%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfanglein\pgf@yc%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \advance\pgf@y-\halfbendheight%
+ \advance\pgf@y-\cothalfangleout\pgf@yc%
+ \else%
+ \advance\pgf@y-\pgf@yc%
+ \fi%
+ \fi%
+ }%
+ \backgroundpath{%
+ \tapedimensions%
+ %
+ \pgf@xc\halfwidth%
+ \pgf@yc\halfheight%
+ %
+ \pgf@xc\bendxradius%
+ \pgf@yc\bendyradius%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfqpoint{-\halfwidth}{0pt}}%
+ \pgfpathlineto{\pgfqpoint{-\halfwidth}{\halfheight}}%
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ \pgfpathlineto{\pgf@x-\halfwidth\pgf@y\halfheight\advance\pgf@y\halfbendheight}%
+ \pgfpatharc{225}{315}{\bendxradius and \bendyradius}%
+ \pgfpatharc{135}{45}{\bendxradius and \bendyradius}%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ \pgfpathlineto{\pgf@x-\halfwidth\pgf@y\halfheight\advance\pgf@y\halfbendheight}%
+ \pgfpatharc{135}{45}{\bendxradius and \bendyradius}%
+ \pgfpatharc{225}{315}{\bendxradius and \bendyradius}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{\halfwidth}{\halfheight}}%
+ \fi%
+ \fi%
+ \pgfpathlineto{\pgfqpoint{\halfwidth}{-\halfheight}}%
+ \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
+ \pgfpathlineto{\pgf@x\halfwidth\pgf@y-\halfheight\advance\pgf@y-\halfbendheight}%
+ \pgfpatharc{45}{135}{\bendxradius and \bendyradius}%
+ \pgfpatharc{315}{225}{\bendxradius and \bendyradius}%
+ \else%
+ \ifx\bottombendstyle\pgf@lib@sh@outandintext%
+ \pgfpathlineto{\pgf@x\halfwidth\pgf@y-\halfheight\advance\pgf@y-\halfbendheight}%
+ \pgfpatharc{315}{225}{\bendxradius and \bendyradius}%
+ \pgfpatharc{45}{135}{\bendxradius and \bendyradius}%
+ \else%
+ \pgfpathlineto{\pgfqpoint{-\halfwidth}{-\halfheight}}%
+ \fi%
+ \fi%
+ \pgfpathclose%
+ }%
+ }%
+ \anchorborder{%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfextract@process\externalpoint{%
+ \centerpoint%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+ \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
+ \let\externalangle\pgfmathresult%
+ \tapedimensions%
+ %
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@north west\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt%
+ \ifdim\externalangle pt<90pt%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@north east\endcsname}%
+ \ifdim\externalangle pt<\pgfmathresult pt%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ \else%
+ % Between north and north east.
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@north west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ % Between north and north west.
+ \ifx\topbendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \ifx\topbendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y\halfheight%
+ \advance\pgf@y\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@north west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@south west\endcsname}%
+ \ifdim\externalangle pt>\pgfmathresult pt%
+ \ifdim\externalangle pt>270pt%
+ \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@tape@south east\endcsname}%
+ \ifdim\externalangle pt>\pgfmathresult pt%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north east\endcsname}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ \else%
+ % Between south and south east.
+ \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \ifx\bottombendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ {\csname pgf@anchor@tape@south west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ % Between south and south west.
+ \ifx\bottombendstyle\pgf@lib@sh@inandouttext%
+ % in and out.
+ \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y.707106\pgf@yc%
+ }%
+ {185}{355}{\outerbendxradius and \outerbendyradius}%
+ \else%
+ \ifx\bottombendstyle\pgf@lib@sh@outandintext%
+ % out and in.
+ \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
+ {%
+ \centerpoint%
+ \pgf@xc\halfwidth%
+ \advance\pgf@x-.5\pgf@xc%
+ \advance\pgf@y-\halfheight%
+ \advance\pgf@y-\halfbendheight%
+ \pgf@yc\bendyradius%
+ \advance\pgf@y-.707106\pgf@yc%
+ }%
+ {5}{175}{\innerbendxradius and \innerbendyradius}%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@south east\endcsname}%
+ {\csname pgf@anchor@tape@south west\endcsname}%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
+ {\csname pgf@anchor@tape@north west\endcsname}%
+ {\csname pgf@anchor@tape@south west\endcsname}%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+
+
+% Keys for magnifying glass shape
+%
+% /pgf/magnifying glass handle angle : The angle of handle
+% /pgf/magnifying glass handle aspect : The length of the handle as a multiple
+% of the radius of the circle
+%
+
+\pgfkeys{/pgf/.cd,
+ magnifying glass handle angle/.initial=-45,
+ magnifying glass handle aspect/.initial=1.5,
+}%
+
+\pgfdeclareshape{magnifying glass}
+{%
+ \inheritsavedanchors[from=circle]% this is nearly a circle
+ \inheritanchorborder[from=circle]%
+ \inheritanchor[from=circle]{north}%
+ \inheritanchor[from=circle]{north west}%
+ \inheritanchor[from=circle]{north east}%
+ \inheritanchor[from=circle]{center}%
+ \inheritanchor[from=circle]{west}%
+ \inheritanchor[from=circle]{east}%
+ \inheritanchor[from=circle]{mid}%
+ \inheritanchor[from=circle]{mid west}%
+ \inheritanchor[from=circle]{mid east}%
+ \inheritanchor[from=circle]{base}%
+ \inheritanchor[from=circle]{base west}%
+ \inheritanchor[from=circle]{base east}%
+ \inheritanchor[from=circle]{south}%
+ \inheritanchor[from=circle]{south west}%
+ \inheritanchor[from=circle]{south east}%
+ \inheritbackgroundpath[from=circle]%
+ \foregroundpath{
+ \centerpoint%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}
+ {\pgfpointpolar{\pgfkeysvalueof{/pgf/magnifying glass handle angle}}{\pgfutil@tempdima}}}
+ \pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}
+ {\pgfpointpolar{\pgfkeysvalueof{/pgf/magnifying glass handle angle}}{\pgfutil@tempdima+\pgfutil@tempdima*(\pgfkeysvalueof{/pgf/magnifying glass handle aspect})}}}
+ \pgfsetarrowsstart{}
+ \pgfsetarrowsend{}
+ }%
+}%
+
+
+\pgfkeys{%
+ /pgf/magnetic tape tail/.initial=0.15,
+ /pgf/magnetic tape tail extend/.initial=0cm,
+}%
+\pgfdeclareshape{magnetic tape}{%
+ \nodeparts{text}%
+ \savedmacro\installparameters{%
+ %
+ \pgf@x=0.5\wd\pgfnodeparttextbox%
+ \pgf@y=0.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by-0.5\dp\pgfnodeparttextbox%
+ \edef\centerpoint{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ %
+ \pgf@x=\wd\pgfnodeparttextbox%
+ \pgf@y=\ht\pgfnodeparttextbox%
+ \advance\pgf@y by\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@x by2.0\pgf@xa%
+ \advance\pgf@y by2.0\pgf@ya%
+ \ifdim\pgf@y>\pgf@x%
+ \pgf@x=\pgf@y%
+ \fi%
+ \pgf@x=1.414213\pgf@x%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<\pgf@xa%
+ \pgf@x=\pgf@xa%
+ \fi%
+ \ifdim\pgf@x<\pgf@ya%
+ \pgf@x=\pgf@ya%
+ \fi%
+ \pgf@x=0.5\pgf@x%
+ \edef\radius{\the\pgf@x}%
+ %
+ \pgfmathparse{max(\pgfkeysvalueof{/pgf/magnetic tape tail extend},0)}%
+ \edef\tailextend{\pgfmathresult pt}%
+ %
+ \pgfmathparse{min(max(\pgfkeysvalueof{/pgf/magnetic tape tail},0),1)}%
+ \pgf@xa=\pgfmathresult\pgf@x%
+ \edef\tailheight{\the\pgf@xa}%
+ %
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xa<\pgf@ya%
+ \pgf@xa=\pgf@ya%
+ \fi%
+ \edef\outersep{\the\pgf@xa}%
+ %
+ \pgfmathparse{\outersep+\radius}%
+ \edef\outerradius{\pgfmathresult pt}%
+ %
+ \pgfmathparse{(\radius-\tailheight)/\radius}%
+ \pgfmathasin@{\pgfmathresult}%
+ \pgfmathadd@{-\pgfmathresult}{360}%
+ \let\tailangle=\pgfmathresult%
+ %
+ \pgfmathparse{\outerradius/(\outerradius+\tailextend)}%
+ \pgfmathatan@{\pgfmathresult}%
+ \pgfmathadd@{-\pgfmathresult}{360}%
+ \let\tailbottomangle=\pgfmathresult%
+ %
+ \pgfmathparse{(\outerradius-\outersep-\tailheight-\outersep)/(\outerradius+\tailextend)}%
+ \pgfmathatan@{\pgfmathresult}%
+ \pgfmathadd@{-\pgfmathresult}{360}%
+ \let\tailtopangle=\pgfmathresult%
+ %
+ \addtosavedmacro\radius%
+ \addtosavedmacro\outerradius%
+ \addtosavedmacro\outersep%
+ \addtosavedmacro\tailheight%
+ \addtosavedmacro\tailextend
+ \addtosavedmacro\tailangle%
+ \addtosavedmacro\tailtopangle%
+ \addtosavedmacro\tailbottomangle%
+ \addtosavedmacro\centerpoint%
+ }%
+ \savedanchor{\base}{\pgfqpoint{0.5\wd\pgfnodeparttextbox}{0pt}}%
+ \savedanchor{\mid}{\pgfqpoint{0.5\wd\pgfnodeparttextbox}{0pt}\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{center}{\installparameters\centerpoint}% \addtosavedmacro\outerradius%
+ \anchor{base}{\base}%
+ \anchor{mid}{\mid}%
+ \anchor{base west}{\installparameters\pgfpointadd{\base}{\pgfqpoint{-\outerradius}{0pt}}}%
+ \anchor{base east}{\installparameters\pgfpointadd{\base}{\pgfqpoint{\outerradius}{0pt}}}%
+ \anchor{mid west}{\installparameters\pgfpointadd{\mid}{\pgfqpoint{-\outerradius}{0pt}}}%
+ \anchor{mid east}{\installparameters\pgfpointadd{\mid}{\pgfqpoint{\outerradius}{0pt}}}%
+ \anchor{north}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{0pt}{\outerradius}}}%
+ \anchor{north east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{45}{\outerradius}}}%
+ \anchor{south}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{0pt}{-\outerradius}}}%
+ \anchor{south east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{\outerradius}{-\outerradius}}}%
+ \anchor{east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{\outerradius}{0pt}}}%
+ \anchor{south west}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{225}{\outerradius}}}%
+ \anchor{west}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpoint{-\outerradius}{0pt}}}%
+ \anchor{north west}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfqpointpolar{135}{\outerradius}}}%
+ \anchor{tail east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\radius+\tailextend+\outersep}{-\outerradius+\outersep+\tailheight/2}}}%
+ \anchor{tail south east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\radius+\tailextend+\outersep}{-\outerradius}}}%
+ \anchor{tail north east}{\installparameters%
+ \pgfpointadd{\centerpoint}{\pgfpoint{\radius+\tailextend+\outersep}{-\outerradius+\outersep+\tailheight+\outersep}}}%
+ \backgroundpath{
+ %
+ \installparameters%
+ {%
+ \pgftransformshift{\centerpoint}%
+ \pgfpathmoveto{\pgfpointpolar{\tailangle}{\radius}}%
+ \pgfpatharc{\tailangle}{360}{\radius}%
+ \pgfpatharc{0}{270}{\radius}%
+ \pgfpathlineto{\pgfpoint{\radius+\tailextend}{-\radius}}%
+ \pgfpathlineto{\pgfpoint{\radius+\tailextend}{-\radius+\tailheight}}%
+ \pgfpathclose%
+ }%
+ }%
+ \anchorborder{%
+ \pgfextract@process\externalpoint{}%
+ \installparameters%
+ \pgfmathanglebetweenpoints{\pgfpointorigin}{\externalpoint}
+ \ifdim\pgfmathresult pt<270pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderellipse%
+ {\externalpoint}%
+ {\pgfqpoint{\outerradius}{\outerradius}}%
+ }%
+ \else%
+ \ifdim\pgfmathresult pt<\tailbottomangle pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointintersectionoflines%
+ {\externalpoint}{\pgfpointorigin}%
+ {\pgfqpoint{0pt}{-\outerradius}}{\pgfqpoint{\outerradius}{-\outerradius}}%
+ }%
+ \else%
+ \ifdim\pgfmathresult pt<\tailtopangle pt\relax%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointintersectionoflines%
+ {\externalpoint}{\pgfpointorigin}%
+ {\pgfqpoint{\outerradius}{\outerradius}}{\pgfqpoint{\outerradius}{-\outerradius}}%
+ }%
+ \else%
+ \pgfpointadd{\centerpoint}{%
+ \pgfpointborderellipse%
+ {\externalpoint}%
+ {\pgfqpoint{\outerradius}{\outerradius}}%
+ }%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+% Local Variables:
+% tab-width: 2
+% End:
diff --git a/graphics/pgf/base/tex/pgflibrarysnakes.code.tex b/graphics/pgf/base/tex/pgflibrarysnakes.code.tex
new file mode 100644
index 0000000000..f964dca275
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarysnakes.code.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarysnakes.code.tex}
+
+\pgfwarning{Snakes have been superseded by decorations. Use the decoration libraries instead of the snakes library}%
+
+\usepgflibrary{decorations.pathmorphing,decorations.pathreplacing,decorations.shapes}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarysnakes.sty b/graphics/pgf/base/tex/pgflibrarysnakes.sty
new file mode 100644
index 0000000000..5d0484f7c7
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarysnakes.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{snakes} instead}
+
+\RequirePackage{pgfcore}
+
+\input{pgflibrarysnakes.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarysvg.path.code.tex b/graphics/pgf/base/tex/pgflibrarysvg.path.code.tex
new file mode 100644
index 0000000000..208b42de70
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarysvg.path.code.tex
@@ -0,0 +1,829 @@
+% Copyright 2009 by Till Tantau
+% Copyright 2019 by Jonathan P. Spratte
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarysvg.path.code.tex}
+
+
+\usepgfmodule{parser}%
+
+
+% Scan an SVG-Path
+%
+% #1 = the path
+%
+% Description:
+%
+% This command takes a path in the compressed SVG-syntax. It then
+% issues a sequences of appropriate \pgfpath commands for this
+% path. For a description of the compressed svg path syntax, see a
+% book on svg.
+%
+% The notion of a pixel used by svg makes no sense in pgf (actually
+% it does not really make sense in svg either, but never mind), and
+% instead of pixels "pt" is used as the basic unit. Use coordinate
+% transformation to change this.
+%
+% Example:
+%
+% \pgfpathsvg{M10 20 L 30-20 0 1}
+%
+% % this has the same effect as
+%
+% \pgfpathmoveto{\pgfpoint{10pt}{20pt}}
+% \pgfpathlineto{\pgfpint{30pt}{-20pt}}
+% \pgfpathlineto{\pgfpint{0pt}{1pt}}
+%
+
+\def\pgfpathsvg#1{%
+ \let\pgf@lib@svg@finish@prev\relax%
+ {%
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@path@lastx}{\pgf@path@lasty}}}%
+ }%
+ \pgf@lib@svg@last@x\pgf@x%
+ \pgf@lib@svg@last@y\pgf@y%
+ \let\pgf@lib@svg@num=\pgfutil@empty%
+ \let\pgf@lib@svg@exp=\pgfutil@empty%
+ \pgfparserparse{svgpath}#1"%
+}%
+
+
+
+\newdimen\pgf@lib@svg@last@x
+\newdimen\pgf@lib@svg@last@y
+\newdimen\pgf@lib@svg@last@c@x
+\newdimen\pgf@lib@svg@last@c@y
+
+\newcount\pgf@lib@svg@count
+\newcount\pgf@lib@svg@max@num
+
+\newif\pgf@lib@svg@relative
+
+
+
+% For the smooth commands (S, s, T, t) we need to keep track of the
+% previous control points. This is done in the following two
+% variables. If they are empty, there was no previous control point of
+% the desired kind, in which case the specification prescribes that
+% the start point is used.
+
+\def\pgf@lib@svg@clear@bezier@quad{%
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty
+}%
+\pgf@lib@svg@clear@bezier@quad
+
+%
+% Here comes the DFA:
+%
+
+% Handle a moveto:
+
+\pgfparserdef{svgpath}{all}{the letter M}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@moveto}%
+}%
+
+\def\pgf@lib@svg@moveto{%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt%
+ \pgfpathmoveto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}%
+}%
+
+
+% Handle a relative moveto:
+
+\pgfparserdef{svgpath}{all}{the letter m}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@moveto@rel}%
+}%
+
+\def\pgf@lib@svg@moveto@rel{%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt%
+ \pgfpathmoveto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}%
+}%
+
+
+% Handle a lineto:
+
+\pgfparserdef{svgpath}{all}{the letter L}
+{%
+ \pgf@lib@svg@finish@prev%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}%
+}%
+
+\def\pgf@lib@svg@lineto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}%
+ \fi
+}%
+
+
+% Handle a relative lineto:
+
+\pgfparserdef{svgpath}{all}{the letter l}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}%
+}%
+
+\def\pgf@lib@svg@lineto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}%
+ \fi
+}%
+
+
+% Handle a closepath:
+
+\pgfparserdef{svgpath}{all}{the letter Z}
+{%
+ \pgf@lib@svg@closepath
+}%
+
+\pgfparserdef{svgpath}{all}{the letter z}
+{%
+ \pgf@lib@svg@closepath
+}%
+
+\def\pgf@lib@svg@closepath{%
+ \pgf@lib@svg@finish@prev
+ \pgfpathclose
+ \let\pgf@lib@svg@finish@prev=\relax
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgfparserswitch{initial}%
+}%
+
+
+% Ignore spaces if no other rules says differently:
+
+\pgfparserdef{svgpath}{all}{blank space \space}{}%
+
+
+
+
+% Handle a horizontal lineto:
+
+\pgfparserdef{svgpath}{all}{the letter H}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto}%
+}%
+
+\def\pgf@lib@svg@hlineto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto}%
+ \fi
+}%
+
+\pgfparserdef{svgpath}{all}{the letter h}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto@rel}%
+}%
+
+\def\pgf@lib@svg@hlineto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto@rel}%
+ \fi
+}%
+
+
+% Handle a horizontal lineto:
+
+\pgfparserdef{svgpath}{all}{the letter V}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto}%
+}%
+
+\def\pgf@lib@svg@vlineto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto}%
+ \fi
+}%
+
+\pgfparserdef{svgpath}{all}{the letter v}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto@rel}%
+}%
+
+\def\pgf@lib@svg@vlineto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ \pgf@lib@svg@clear@bezier@quad%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{0}pt%
+ \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto@rel}%
+ \fi
+}%
+
+
+
+
+% Handle a Bezier curve:
+
+\pgfparserdef{svgpath}{all}{the letter C}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto}%
+}%
+
+\def\pgf@lib@svg@curveto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \edef\pgf@lib@svg@bezier@last{%
+ \noexpand\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}%
+ % Draw curve
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{4}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{5}pt%
+ \pgfpathcurveto
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter c}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto@rel}%
+}%
+
+\def\pgf@lib@svg@curveto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ \edef\pgf@lib@svg@bezier@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % Draw curve
+ \pgfpathcurveto
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{4}pt}{\pgf@lib@svg@get@num{5}pt}}}%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{4}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{5}pt%
+ \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto@rel}%
+ \fi
+}%
+
+
+
+
+
+\pgfparserdef{svgpath}{all}{the letter S}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@smooth}%
+}%
+
+\def\pgf@lib@svg@curveto@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \ifx\pgf@lib@svg@bezier@last\pgfutil@empty%
+ \def\pgf@lib@svg@first@cp{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \else
+ \def\pgf@lib@svg@first@cp{%
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@bezier@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ }%
+ \fi
+ \pgfpathcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \edef\pgf@lib@svg@bezier@last{%
+ \noexpand\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ % Update
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{2}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{3}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@smooth}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter s}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@rel@smooth}%
+}%
+
+\def\pgf@lib@svg@curveto@rel@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \ifx\pgf@lib@svg@bezier@last\pgfutil@empty%
+ \def\pgf@lib@svg@first@cp{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ \else
+ \def\pgf@lib@svg@first@cp{%
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@bezier@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ }%
+ \fi
+ \pgfpathcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@quad@last=\pgfutil@empty%
+ \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ \edef\pgf@lib@svg@bezier@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % update
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{2}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{3}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@rel@smooth}%
+ \fi
+}%
+
+
+
+
+% Handle a quadratic curve:
+
+\pgfparserdef{svgpath}{all}{the letter Q}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto}%
+}%
+
+\def\pgf@lib@svg@quad@curveto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear bezier last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \edef\pgf@lib@svg@quad@last{%
+ \noexpand\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ % Draw curve
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{2}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{3}pt%
+ \pgfpathquadraticcurveto
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter q}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto@rel}%
+}%
+
+\def\pgf@lib@svg@quad@curveto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ \edef\pgf@lib@svg@quad@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ % Draw curve
+ \pgfpathquadraticcurveto
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}%
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{2}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{3}pt%
+ \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto@rel}%
+ \fi
+}%
+
+
+
+
+\pgfparserdef{svgpath}{all}{the letter T}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@smooth}%
+}%
+
+\def\pgf@lib@svg@quad@curveto@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \pgf@process{%
+ \ifx\pgf@lib@svg@quad@last\pgfutil@empty%
+ \pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}%
+ \else
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@quad@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ \fi
+ }%
+ \edef\pgf@lib@svg@first@cp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfpathquadraticcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \let\pgf@lib@svg@quad@last=\pgf@lib@svg@first@cp%
+ % Update
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@smooth}%
+ \fi
+}%
+
+
+\pgfparserdef{svgpath}{all}{the letter t}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@rel@smooth}%
+}%
+
+\def\pgf@lib@svg@quad@curveto@rel@smooth{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Draw curve
+ % Compute first control point
+ \pgf@process{%
+ \ifx\pgf@lib@svg@quad@last\pgfutil@empty%
+ \pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}%
+ \else
+ \pgfpointadd
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ {\pgfpointdiff
+ {\pgf@lib@svg@quad@last}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ }%
+ \fi
+ }%
+ \edef\pgf@lib@svg@first@cp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfpathquadraticcurveto
+ {\pgf@lib@svg@first@cp}%
+ {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}%
+ % Clear quadratic last point and save new last control point:
+ \let\pgf@lib@svg@bezier@last=\pgfutil@empty%
+ \let\pgf@lib@svg@quad@last=\pgf@lib@svg@first@cp%
+ % update
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt%
+ % Go on
+ \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@rel@smooth}%
+ \fi
+}%
+
+
+
+% Handle an arcto:
+
+\pgfparserdef{svgpath}{all}{the letter A}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto}%
+}%
+
+\def\pgf@lib@svg@arcto{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear bezier last point and save new last control point:
+ \pgf@lib@svg@clear@bezier@quad%
+ % Draw curve
+ \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{5}pt%
+ \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{6}pt%
+ \pgfpatharcto
+ {\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}%
+ {\pgf@lib@svg@get@num{2}}%
+ {\pgf@lib@svg@get@num{3}}%
+ {\pgf@lib@svg@get@num{4}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto}%
+ \fi
+}%
+
+\pgfparserdef{svgpath}{all}{the letter a}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto@rel}%
+}%
+
+\def\pgf@lib@svg@arcto@rel{%
+ \ifnum\pgf@lib@svg@count=0\relax% nothing read
+ \else%
+ % Clear bezier last point and save new last control point:
+ \pgf@lib@svg@clear@bezier@quad%
+ % Draw curve
+ \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{5}pt%
+ \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{6}pt%
+ \pgfpatharcto
+ {\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}%
+ {\pgf@lib@svg@get@num{2}}%
+ {\pgf@lib@svg@get@num{3}}%
+ {\pgf@lib@svg@get@num{4}}%
+ {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}%
+ % Go on
+ \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto@rel}%
+ \fi
+}%
+
+
+
+
+
+% Handle to end of the world
+
+\pgfparserdef{svgpath}{all}{the character "}
+{%
+ \pgf@lib@svg@finish@prev
+ \pgfparserswitch{final}%
+}%
+
+
+
+
+% Handle spacers for numbers
+
+\def\pgf@lib@svg@read@nums#1#2{% get #1 number symbols, then do #2
+ \pgf@lib@svg@count=0\relax
+ \pgf@lib@svg@max@num=#1\relax
+ \pgfparserswitch{num}%
+ \def\pgf@lib@svg@finish@prev{%
+ \ifx\pgf@lib@svg@num\pgfutil@empty%
+ \else%
+ \ifx\pgf@lib@svg@exp\pgfutil@empty
+ \else
+ \pgfmathfloatparsenumber{\pgf@lib@svg@num e\pgf@lib@svg@exp}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \let\pgf@lib@svg@num=\pgfmathresult
+ \fi
+ \expandafter\let\csname pgf@lib@svg@num@\the\pgf@lib@svg@count\endcsname=\pgf@lib@svg@num
+ \advance\pgf@lib@svg@count by1\relax%
+ \let\pgf@lib@svg@num=\pgfutil@empty%
+ \let\pgf@lib@svg@exp=\pgfutil@empty%
+ \fi
+ #2%
+ }%
+}%
+
+\def\pgf@lib@svg@get@num#1{\csname pgf@lib@svg@num@#1\endcsname}%
+
+
+\pgfparserdef{svgpath}{num}{the character ,}
+{%
+ \pgf@lib@svg@handle@spacer
+}%
+\pgfparserlet{svgpath}{after.}{the character ,}[num]{the character ,}
+\pgfparserlet{svgpath}{exp},[num],
+\pgfparserlet{svgpath}{exp sign},[num],
+
+\pgfparserdef{svgpath}{num}{\meaning\pgfutil@sptoken}
+{%
+ \pgf@lib@svg@handle@spacer
+}%
+\pgfparserlet{svgpath}{after.}{blank space}[num]{blank space}
+\pgfparserlet{svgpath}{exp}{blank space},
+\pgfparserlet{svgpath}{exp sign}{blank space},
+
+\pgfparserdef{svgpath}{num}{the character -}
+{%
+ \pgf@lib@svg@handle@spacer
+ \def\pgf@lib@svg@num{-}%
+}%
+\pgfparserlet{svgpath}{after.}{the character -}[num]{the character -}
+\pgfparserlet{svgpath}{exp}-[num]-
+\pgfparserdef{svgpath}{num}{the character +}
+{%
+ \pgf@lib@svg@handle@spacer
+ \def\pgf@lib@svg@num{+}%
+}
+\pgfparserlet{svgpath}{after.}{the character +}[num]{the character +}
+\pgfparserlet{svgpath}{exp}+[num]+
+
+\def\pgf@lib@svg@handle@spacer{%
+ \ifx\pgf@lib@svg@num\pgfutil@empty%
+ % ignore
+ \else
+ \ifx\pgf@lib@svg@exp\pgfutil@empty
+ \else
+ \pgfmathfloatparsenumber{\pgf@lib@svg@num e\pgf@lib@svg@exp}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \let\pgf@lib@svg@num=\pgfmathresult
+ \fi
+ \expandafter\let\csname pgf@lib@svg@num@\the\pgf@lib@svg@count\endcsname=\pgf@lib@svg@num
+ \advance\pgf@lib@svg@count by1\relax%
+ \ifnum\pgf@lib@svg@count=\pgf@lib@svg@max@num\relax%
+ \pgf@lib@svg@finish@prev%
+ \fi
+ \let\pgf@lib@svg@num=\pgfutil@empty%
+ \let\pgf@lib@svg@exp=\pgfutil@empty%
+ \pgfparserswitch{num}%
+ \fi
+}%
+
+
+% Handle digits
+
+\pgfparserdef{svgpath}{num}e
+ {%
+ \pgfparserswitch{exp sign}%
+ \let\pgf@lib@svg@exp=\pgfutil@empty
+ }
+\pgfparserlet{svgpath}{after.}e[num]e
+\pgfparserdef{svgpath}{exp sign}-
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp-}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}+
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp+}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}0
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp0}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}1
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp1}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}2
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp2}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}3
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp3}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}4
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp4}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}5
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp5}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}6
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp6}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}7
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp7}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}8
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp8}%
+ \pgfparserswitch{exp}%
+ }
+\pgfparserdef{svgpath}{exp sign}9
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp9}%
+ \pgfparserswitch{exp}%
+ }
+
+\pgfparserdef{svgpath}{exp}0
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp0}%
+ }
+\pgfparserdef{svgpath}{exp}1
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp1}%
+ }
+\pgfparserdef{svgpath}{exp}2
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp2}%
+ }
+\pgfparserdef{svgpath}{exp}3
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp3}%
+ }
+\pgfparserdef{svgpath}{exp}4
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp4}%
+ }
+\pgfparserdef{svgpath}{exp}5
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp5}%
+ }
+\pgfparserdef{svgpath}{exp}6
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp6}%
+ }
+\pgfparserdef{svgpath}{exp}7
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp7}%
+ }
+\pgfparserdef{svgpath}{exp}8
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp8}%
+ }
+\pgfparserdef{svgpath}{exp}9
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp9}%
+ }
+
+\pgfparserdef{svgpath}{num}{the character .}
+ {%
+ \expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num.}%
+ \pgfparserswitch{after.}%
+ }%
+\pgfparserdef{svgpath}{after.}{the character .}
+ {%
+ \pgf@lib@svg@handle@spacer
+ \def\pgf@lib@svg@num{.}%
+ \pgfparserswitch{after.}%
+ }%
+\pgfparserlet{svgpath}{exp}{the character .}[after.]{the character .}
+
+\pgfparserdef{svgpath}{all}{the character 0}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num0}}%
+
+\pgfparserdef{svgpath}{all}{the character 1}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num1}}%
+
+\pgfparserdef{svgpath}{all}{the character 2}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num2}}%
+
+\pgfparserdef{svgpath}{all}{the character 3}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num3}}%
+
+\pgfparserdef{svgpath}{all}{the character 4}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num4}}%
+
+\pgfparserdef{svgpath}{all}{the character 5}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num5}}%
+
+\pgfparserdef{svgpath}{all}{the character 6}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num6}}%
+
+\pgfparserdef{svgpath}{all}{the character 7}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num7}}%
+
+\pgfparserdef{svgpath}{all}{the character 8}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num8}}%
+
+\pgfparserdef{svgpath}{all}{the character 9}
+{\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num9}}%
diff --git a/graphics/pgf/base/tex/pgflibrarytikzbackgrounds.sty b/graphics/pgf/base/tex/pgflibrarytikzbackgrounds.sty
new file mode 100644
index 0000000000..584f81434f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarytikzbackgrounds.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{backgrounds} instead}
+
+\RequirePackage{tikz}
+
+\input{pgflibrarytikzbackgrounds.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarytikztrees.sty b/graphics/pgf/base/tex/pgflibrarytikztrees.sty
new file mode 100644
index 0000000000..00cea02b02
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarytikztrees.sty
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\PackageWarning{pgf}{This package is obsolete. Use \noexpand\usetikzlibrary{trees} instead}
+
+\RequirePackage{tikz}
+
+\input{tikzlibrarytrees.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgflibrarytimelines.code.tex b/graphics/pgf/base/tex/pgflibrarytimelines.code.tex
new file mode 100644
index 0000000000..dd9b38fdc4
--- /dev/null
+++ b/graphics/pgf/base/tex/pgflibrarytimelines.code.tex
@@ -0,0 +1,197 @@
+% Copyright 2015 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgflibrarytimelines.code.tex}
+
+
+% We need the animation module:
+
+\usepgfmodule{animations}%
+
+
+% Starts a fixed timeline
+%
+% Description:
+%
+% A (fixed) timeline defines for a specific number of seconds how a
+% different objects are animated. In contrast to a dynamic timeline,
+% the animation must be fixed beforehand, that is, in a fixed timeline
+% you can specify things like "be there after 2s and there after 4s
+% and be red after 5s" but not "be there after that other animation
+% has finished and then stay there until another animation has
+% finished or something has been clicked". Note that while a fixed
+% timeline describes a fixed sequence of animations, the starting
+% point of the timeline may depend for instance on when some button is
+% clicked; only when the timeline's animation gets started there is
+% nothing dynamic about it till its end (a timeline may be ended
+% prematurely, however).
+%
+% This command allows you to start a timeline. Once the timeline has
+% been started, you can call the following macro repeatedly:
+%
+% \pgftimelineentry{time}{object}{attribute}{value}
+%
+% The time is some time when the given attribute should have the given
+% value. The important thing is that the entries need not come in any
+% specific order; it is the job of the timeline library to sort them
+% into a sensible order.
+%
+% At the end of the timeline, you will have specified for a whole
+% bunch of objects and attributes their values at certain time
+% points. The macro \pgftimelineend will now call \pgfanimateattribute
+% for all attributes and objects mentioned in the timeline.
+%
+%
+% Internally, pgf keeps track of all objects in a timeline and all
+% attributes and sorts the times using a simple insertion sort (which
+% will be fastest when the times are given in increasing order as
+% happens most of the time).
+
+\def\pgftimelinebegin{%
+ \pgf@timeline@todo@saved=\pgf@timeline@todo%
+ \begingroup%
+ \advance\pgf@timeline@depth by1\relax%
+ \pgf@timeline@todo{}%
+}%
+
+\newcount\pgf@timeline@depth
+\newtoks\pgf@timeline@todo
+\newtoks\pgf@timeline@todo@saved
+
+
+% Ends a timeline
+%
+% Description:
+%
+% This command will scan \pgfanimateattribute for the objects and
+% attributes mentioned in the timeline.
+
+\def\pgftimelineend{%
+ \the\pgf@timeline@todo%
+ \endgroup%
+ \global\pgf@timeline@todo=\pgf@timeline@todo@saved%
+}%
+
+
+% Adds an entry to a timeline
+%
+% #1 = a time (evaluated using \pgfparsetime)
+% #2 = an object (a "whom" in the sense of pgfmoduleanimations, will
+% be expanded)
+% #3 = an attribute (in the sense of pgfmoduleanimations, will be expanded)
+% #4 = a value
+%
+% Description:
+%
+% Adds a new entry to the timeline. For a fixed #1, several calls to
+% this macro allow you to specify a key frame by specifying the
+% different values of the different attributes of the different
+% objects in the key frame.
+
+\def\pgftimelineentry#1#2#3#4{%
+ \begingroup%
+ \pgfparsetime{#1}%
+ \edef\pgf@timeline@whom{#2}%
+ \edef\pgf@timeline@attr{#3}%
+ \expandafter\let\expandafter\pgf@timeline@entry\csname pgf@tl@\pgf@timeline@whom @\pgf@timeline@attr @\the\pgf@timeline@depth\endcsname%
+ \ifx\pgf@timeline@entry\relax%
+ \edef\pgf@timeline@entry{\noexpand\pgf@timeline@setup{\pgf@timeline@whom}{\pgf@timeline@attr}}%
+ \fi%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@timeline@entry\expandafter\expandafter\expandafter%
+ {\expandafter\pgf@timeline@entry\expandafter\pgf@timeline@doentry\expandafter{\pgftimeresult}{#4}}%
+ \expandafter\global\expandafter\let\csname pgf@tl@\pgf@timeline@whom @\pgf@timeline@attr @\the\pgf@timeline@depth\endcsname\pgf@timeline@entry%
+ \global\pgf@timeline@todo\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgf@timeline@todo\expandafter\pgf@timeline@handle\csname pgf@tl@\pgf@timeline@whom @\pgf@timeline@attr @\the\pgf@timeline@depth\endcsname}%
+ \endgroup%
+}%
+
+
+\newtoks\pgf@timeline@sort@toks
+\countdef\pgf@timeline@sort@count=0\relax%
+\countdef\pgf@timeline@count@down=1\relax%
+\countdef\pgf@timeline@count@down@next=2\relax%
+
+% Handles one entry in a timeline
+
+\def\pgf@timeline@handle#1{%
+ \ifx#1\relax%
+ \else%
+ % Do an inserting sort. The time is kept in the dimension registers
+ % 1 to n, the value in the token registers 1 to n.
+ {%
+ \pgf@timeline@sort@count=1\relax%
+ #1% will start a group
+ % Now we collect the toks:
+ \pgf@timeline@count@down=1\relax%
+ \pgf@timeline@sort@toks{}%
+ \pgfutil@loop%
+ \ifnum\pgf@timeline@count@down<\pgf@timeline@sort@count\relax%
+ \edef\pgf@temp{\the\pgf@timeline@sort@toks\noexpand\pgf@timeline@donow{\the\dimen\pgf@timeline@count@down}{\the\toks\pgf@timeline@count@down}}%
+ \pgf@timeline@sort@toks\expandafter{\pgf@temp}%
+ \advance\pgf@timeline@count@down by1\relax%
+ \pgfutil@repeat%
+ % Do computations now
+ \pgf@timeline@compute@duration%
+ %
+ \edef\pgf@temp{\noexpand\pgf@timeline@call@attribute{\pgf@timeline@whom}{\pgf@timeline@attr}{\the\pgf@timeline@sort@toks}}
+ \expandafter%
+ \endgroup%
+ \pgf@temp%
+ }%
+ \global\let#1\relax% cleanup
+ \fi%
+}%
+
+\def\pgf@timeline@compute@duration{%
+ \advance\pgf@timeline@sort@count by-1\relax%
+ \pgfmathparse{\the\dimen\pgf@timeline@sort@count}%
+ \global\let\pgf@timeline@duration\pgfmathresult%
+}%
+
+
+\def\pgf@timeline@setup#1#2{%
+ \def\pgf@timeline@whom{#1}%
+ \def\pgf@timeline@attr{#2}%
+ \begingroup%
+}%
+
+\def\pgf@timeline@doentry#1#2{%
+ \dimen\pgf@timeline@sort@count=#1pt\relax%
+ \toks\pgf@timeline@sort@count{#2}%
+ \pgf@timeline@count@down\pgf@timeline@sort@count\relax%
+ \pgfutil@loop%
+ \ifnum\pgf@timeline@count@down>1\relax%
+ \pgf@timeline@count@down@next\pgf@timeline@count@down%
+ \advance\pgf@timeline@count@down@next by-1\relax%
+ \ifdim\dimen\pgf@timeline@count@down<\dimen\pgf@timeline@count@down@next\relax%
+ % Swap:
+ \toks0=\toks\pgf@timeline@count@down%
+ \dimen0=\dimen\pgf@timeline@count@down%
+ \toks\pgf@timeline@count@down=\toks\pgf@timeline@count@down@next%
+ \dimen\pgf@timeline@count@down=\dimen\pgf@timeline@count@down@next%
+ \toks\pgf@timeline@count@down@next=\toks0\relax%
+ \dimen\pgf@timeline@count@down@next=\dimen0\relax%
+ \pgf@timeline@count@down\pgf@timeline@count@down@next\relax%
+ \else%
+ \pgf@timeline@count@down1\relax%
+ \fi%
+ \pgfutil@repeat%
+ \advance\pgf@timeline@sort@count by1\relax%
+}%
+
+
+\def\pgf@timeline@call@attribute#1#2#3{%
+ \pgfanimateattributecode{#2}{\pgfkeys{/pgf/animation/whom={#1},/pgf/animation/duration=\pgf@timeline@duration}#3}%
+}%
+
+\def\pgf@timeline@donow#1#2{%
+ \pgfkeys{/pgf/animation/key time={#1/\pgf@timeline@duration}}%
+ \pgfkeys{/pgf/animation/value={#2}}%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmanual.code.tex b/graphics/pgf/base/tex/pgfmanual.code.tex
new file mode 100644
index 0000000000..fca9c791b8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmanual.code.tex
@@ -0,0 +1,64 @@
+% Copyright 2009 by Till Tantau and Christian Feuersänger
+%
+% 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.
+
+\input pgfmanual.prettyprinter.code.tex
+\input pgfmanual.pdflinks.code.tex
+
+% TODO for auto xrefs:
+% 1. check the already identified labels, preferably using
+% /pdflinks/show labels=true
+% and the image externalization debug mode (see pgfmanual-en-main.tex)
+% (to strip almost all images away)
+%
+% 2. Insert '\declareandlabel' in the document whenever something has been
+% defined in the text, so it should get a pdf anchor (see
+% pgfmanual.pdflinks.code.tex )
+%
+% 2.1 perhaps insert \pgfmanualpdflabel{<label>}{} where needed.
+%
+% 3. Verify that the |...| commands occurring in situations where catcodes can't
+% be changed (footnotes or macro arguments) work as expected.
+%
+% 4. Consider telling the pretty printer that several control sequences
+% have arguments which are options (see below for the predefined list).
+% This may apply to \pgfpageslogicalpageoptions or so.
+%
+% 5. @Christian: consider extensions of the parser such that it identifies path commands (at least partially)
+%
+%
+
+\def\pgfmanual@warning#1{\pgf@typeout{! Package pgfmanual Warning: #1}}%
+
+
+\pgfkeys{
+ % set this to 'false' to disable auto reference generation.
+ % However, a little bit runtime overhead will still remain
+ % (and the \pgfmanualpdflabel commands will still be used)
+ /pdflinks/codeexample links=true,
+ %
+ /codeexample/prettyprint/cs arguments/tikzset/.initial=1,
+ /codeexample/prettyprint/cs/tikzset/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualprettyprintpgfkeys{#2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/usetikzlibrary/.initial=1,
+ /codeexample/prettyprint/cs/usetikzlibrary/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualpdfref{#2}{#2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/usepgflibrary/.initial=1,
+ /codeexample/prettyprint/cs/usepgflibrary/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualpdfref{#2}{#2}\pgfmanualclosebrace},
+ %
+ %
+ %
+ % whenever an unqualified key is found, the following key prefix
+ % list is tried to find a match.
+ /pdflinks/search key prefixes in={/tikz/,/pgf/},
+ %
+ % the link prefix written to the pdf file:
+ /pdflinks/internal link prefix=pgf,
+ %
+ /pdflinks/warnings=false,
+ % for debugging:
+ /pdflinks/show labels=false,
+}%
diff --git a/graphics/pgf/base/tex/pgfmanual.pdflinks.code.tex b/graphics/pgf/base/tex/pgfmanual.pdflinks.code.tex
new file mode 100644
index 0000000000..a23b9ad686
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmanual.pdflinks.code.tex
@@ -0,0 +1,439 @@
+%--------------------------------------------
+%
+% Package pgfplots
+%
+% Provides a user-friendly interface to create function plots (normal
+% plots, semi-logplots and double-logplots).
+%
+% It is based on Till Tantau's PGF package.
+%
+% Copyright 2007/2008/2009 by Christian Feuersänger.
+%
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+%
+%--------------------------------------------
+
+% This file provides an interface to the
+% pgfmanual.prettyprint.code.tex thing -- it allows to
+% *generate pdf crossrefs inside of codeexamples automatically*
+% without any user input.
+%
+% Thus, you write
+% \begin{codeexample}[]
+% \begin{tikzpicture}[options]
+% \end{tikzpicture}
+% \end{codeexample}
+% and pdf cross references to the definitions of 'tikzpicture'
+% and any options will be generated automatically.
+%
+% Furthermore, pdf cross references will be generated for everything
+% within vertical bars, |....|.
+%
+%
+%
+%
+%
+% The only necessary thing is that \pgfmanualpdflabel has been called
+% for every (fully qualified) key, control sequence, environment or
+% whatever.
+
+\newif\ifpgfmanualpdfwarnings
+\pgfmanualpdfwarningstrue
+
+\newif\ifpgfmanualshowlabels
+
+% FIXME : \cleanedhypertarget/\cleanedhyperlink have been introduced
+% in http://pgf.cvs.sourceforge.net/viewvc/pgf/pgf/latex/pgf/doc/pgfmanual.pdflinks.code.tex?r1=1.15&r2=1.16
+% but they are not present on my (CFR) system... what problem did they
+% address/how can we satisfy this dependency?
+\pgfutil@IfUndefined{cleanedhypertarget}{\let\cleanedhypertarget=\hypertarget}{}
+\pgfutil@IfUndefined{cleanedhyperlink}{\let\cleanedhyperlink=\hyperlink}{}
+
+\pgfkeys{%
+ /codeexample/prettyprint/cs arguments/pgfkeys/.initial=1,
+ /codeexample/prettyprint/cs/pgfkeys/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualprettyprintpgfkeys{#2}\pgfmanualclosebrace},
+ %
+ /codeexample/prettyprint/autolinks/.style={%
+ /codeexample/prettyprint/key name/.code={\pgfmanualpdfref{##1}{##1}},
+ /codeexample/prettyprint/key name with handler/.code 2 args={\pgfmanualpdfref{##1}{##1}/\pgfmanualpdfref{/handlers/##2}{##2}},
+ /codeexample/prettyprint/key value display only/.code={\pgfmanualprettyprintcode{##1}},
+ /codeexample/prettyprint/cs/.code={\pgfmanualpdfref{##1}{##1}},
+ /codeexample/prettyprint/cs with args/.code 2 args={\pgfmanualpdfref{##1}{##1}\{\pgfmanualprettyprintcode{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/pgfkeys/.initial=1,
+ /codeexample/prettyprint/cs/pgfkeys/.code 2 args={\pgfmanualpdfref{##1}{##1}\{\pgfmanualprettyprintpgfkeys{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/begin/.initial=1,
+ /codeexample/prettyprint/cs/begin/.code 2 args={##1\{\pgfmanualpdfref{##2}{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/end/.initial=1,
+ /codeexample/prettyprint/cs/end/.code 2 args={##1\{\pgfmanualpdfref{##2}{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/word/.code={\begingroup\pgfkeyssetvalue{/pdflinks/search key prefixes in}{}\pgfmanualpdfref{##1}{##1}\endgroup},
+ /codeexample/prettyprint/point/.code={##1},%
+ /codeexample/prettyprint/point with cs/.code 2 args={(\pgfmanualpdfref{##1}{##1}:##2},%
+ },%
+ /codeexample/prettyprint/autolinks,
+}%
+
+\pgfkeys{
+ %
+ % Enables or disables the parsing of codeexamples.
+ /pdflinks/codeexample links/.is if=pgfmanualprettyenabled,
+ /pdflinks/codeexample links/.default=true,
+ %
+ % How to render a hyperlink
+ /pdflinks/render hyperlink/.code=#1,
+ %
+ % whenever an unqualified key is found, the following key prefix
+ % list is tried to find a match.
+ /pdflinks/search key prefixes in/.initial={/tikz/,/pgf/},
+ %
+ % Enables or disables warnings for failed auto links:
+ /pdflinks/warnings/.is if=pgfmanualpdfwarnings,
+ /pdflinks/warnings/.default=true,
+ %
+ % Shows the autogenerated labels. This is useful to check if the
+ % 'search key prefixes in' worked as it ought to.
+ /pdflinks/show labels/.is if=pgfmanualshowlabels,
+ /pdflinks/show labels/.default=true,
+ /pdflinks/show labels=false,
+ % will be invoked with '#1' set to the generated label.
+ /pdflinks/show labels code/.code={
+ \hbox to 0pt{%
+ \vbox to 0pt{\hsize=0pt
+ \vskip-\baselineskip
+ \hbox to \hsize{%
+ \hss
+ {\footnotesize\ttfamily\textcolor{red}{#1}}%
+ \hss
+ }%
+ \vss
+ }%
+ \vbox to 0pt{\hsize=0pt
+ \vss
+ \hbox to \hsize{%
+ \hss
+ {\footnotesize\ttfamily\textcolor{red}{$\vert$}}%
+ \hss
+ }%
+ }%
+ \vsize=0pt
+ }%
+ },
+ %
+ % the link prefix written to the pdf file:
+ /pdflinks/internal link prefix/.initial=pgf,
+}
+
+\begingroup
+ \catcode`\_=12
+ \gdef\pgfmanualpdf@underscore{_}%
+ \catcode`\ =13\relax\gdef\pgfmanualpdf@install@active@space{\def {\space}}%
+\endgroup
+
+\gdef\pgfmanualpdf@installreplacements{%
+ \def\marg##1{{##1}}%
+ \def\oarg##1{[##1]}%
+ \def\meta##1{meta(##1)}%
+ \def\x{x}%
+ \def\textbackslash{back/}%
+ \def\\{\textbackslash}%
+ \def\space{:}%
+ \edef\ {\space}%
+ \edef\SPACE{\` \relax}%
+ \ifnum\the\catcode`\ =13 %
+ \pgfmanualpdf@install@active@space
+ \fi
+ \edef\#{}%
+ \def\printanat{@}%
+ \def\protect{}%
+ \def\textasciicircum{o}%
+ \def\_{\pgfmanualpdf@underscore}%
+ \expandafter\edef\pgfmanual@verb@activebar{\pgfmanual@verb@bar}%
+}%
+
+% Defines a new pdf cross ref label for use with \pgfmanualpdfref.
+%
+% Usage:
+% \pgfmanualpdflabel{<label>}{<text>}
+% #1: the label.
+% The text #2 will be shown in the resulting pdf (if it is not empty).
+%
+% There is also support for catcode changes if <label> contains
+% something which shouldn't be written as-is into .aux files:
+% \pgfmanualpdflabel[\catcode`\|=12 ]{|-}{}
+% -> this will write
+% \begingroup \catcode `\|=12
+% <code to deal with the label |- >
+% \endgroup
+% into the .aux file.
+%
+\def\pgfmanualpdflabel{\pgfutil@ifnextchar[{\pgfmanualpdflabel@opt}{\pgfmanualpdflabel@opt[]}}%
+\def\pgfmanualpdflabel@opt[#1]#2#3{%
+ \begingroup
+ %
+ \def\pgfmanualpdf@catcode{#1}%
+ \pgfmanualpdf@catcode
+ %
+ \pgfmanualpdflabel@generate{#2}{#3}%
+ %
+ % this is pgfplots-specific: pgfplots supports generic styles which
+ % contain '\x' where '\x' iterates through 'x,y,z'.
+ \pgfutil@in@\x{#2}%
+ \ifpgfutil@in@
+ \def\x{y}%
+ \pgfmanualpdflabel@generate{#2}{#3}%
+ \def\x{z}%
+ \pgfmanualpdflabel@generate{#2}{#3}%
+ \fi
+ \endgroup
+}%
+\def\pgfmanualpdflabel@generate#1#2{%
+ \pgfmanual@handlespeciallabeltokens@in{#1}%
+ %
+ \def\pgfmanualpdflabel@generateone{0}%
+ \pgfutil@ifundefined{pgfd@lbl@\pgfmanualpdflabel@@}{%
+ % ok, no such label is known.
+ \def\pgfmanualpdflabel@generateone{1}%
+ }{%
+ \if\csname pgfd@lbl@\pgfmanualpdflabel@@\endcsname a% "a"ux
+ % ah, it is "just" known from a previous run, but there is
+ % no code in the pdf! Write it!
+ \def\pgfmanualpdflabel@generateone{1}%
+ \else
+ % ok, we already wrote one before. Skip.
+ \fi
+ }%
+ \if\pgfmanualpdflabel@generateone1%
+ \ifpgfmanualshowlabels
+ \pgfkeysvalueof{/pdflinks/show labels code/.@cmd}{\pgfmanualpdflabel@@}\pgfeov
+ \fi
+ %
+ \if@filesw
+ \ifx\pgfmanualpdf@catcode\pgfutil@empty
+ \else
+ \toks0=\expandafter{\pgfmanualpdf@catcode}%
+ \immediate\write\@auxout{%
+ \noexpand\begingroup
+ \the\toks0
+ }%
+ \fi
+ \immediate\write\@auxout{%
+ \noexpand\expandafter\noexpand\gdef
+ \noexpand\csname pgfd@lbl@\pgfmanualpdflabel@@\noexpand\endcsname{a}% a = known in "a"ux file
+ }%
+ \ifx\pgfmanualpdf@catcode\pgfutil@empty
+ \else
+ \immediate\write\@auxout{\noexpand\endgroup}%
+ \fi
+ \fi
+ \expandafter\gdef\csname pgfd@lbl@\pgfmanualpdflabel@@\endcsname{w}% 1. remember the label AND remember that we "w"rote it into the pdf.
+ \edef\pgfmanualpdflabel@@{\pgfkeysvalueof{/pdflinks/internal link prefix}.\pgfmanualpdflabel@@}%
+ \ifvmode%
+ \expandafter\cleanedhypertarget\expandafter{\pgfmanualpdflabel@@}{#2}%
+ \else%
+ {\setbox0=\hbox{\raise1em\hbox{\expandafter\cleanedhypertarget\expandafter{\pgfmanualpdflabel@@}{}}}\ht0=0pt\box0}#2%
+ \fi%
+ \else
+ #2%
+ \fi
+}%
+
+% A pdf reference to label `#1' with (TeX) text `#2'.
+% @see also \verbpdfref.
+\def\pgfmanualpdfref#1#2{%
+ \begingroup
+ \pgfmanual@handlespeciallabeltokens@in{#1}%
+ %
+ \ifcsname pgfd@lbl@\pgfmanualpdflabel@@\endcsname
+ \else
+ \global\let\pgfmanual@glob=\pgfmanualpdflabel@@
+ \def\pgfmanual@tempa{\foreach \prefix in }%
+ \pgfkeysgetvalue{/pdflinks/search key prefixes in}\pgfmanual@tempb
+ \expandafter\pgfmanual@tempa\expandafter{\pgfmanual@tempb}{%
+ \edef\pgfmanualpdflabel@@{\prefix\pgfmanualpdflabel@@}%
+ \expandafter\pgfmanual@handlespeciallabeltokens@in\expandafter{\pgfmanualpdflabel@@}%
+ \ifcsname pgfd@lbl@\pgfmanualpdflabel@@\endcsname
+ \xdef\pgfmanual@glob{\pgfmanualpdflabel@@}%
+ \breakforeach
+ \fi
+ }%
+ \let\pgfmanualpdflabel@@=\pgfmanual@glob
+ \ifcsname pgfd@lbl@\pgfmanualpdflabel@@\endcsname
+ \else
+ \ifpgfmanualpdfwarnings
+ \begingroup
+ \toks0={#1}%
+ \pgfmanual@warning{pgfmanualpdfref{\the\toks0 }: target label does not exist.}%
+ \endgroup
+ \fi
+ #2%
+ \let\pgfmanualpdflabel@@=\pgfutil@empty
+ \fi
+ \fi
+ \ifx\pgfmanualpdflabel@@\pgfutil@empty
+ \else
+ \expandafter\pgfmanualpdfref@\expandafter{\pgfmanualpdflabel@@}{#2}%
+ \fi
+ \endgroup
+}%
+\def\pgfmanualpdfref@#1#2{%
+ \pgfkeysgetvalue{/pdflinks/internal link prefix}\pgfmanual@temp
+ \expandafter\cleanedhyperlink\expandafter{\pgfmanual@temp.#1}{\pgfkeysvalueof{/pdflinks/render hyperlink/.@cmd}{#2}\pgfeov}%
+ \ifpgfmanualshowlabels
+ \pgfkeysvalueof{/pdflinks/show labels code/.@cmd}{#1}\pgfeov
+ \fi
+}%
+
+% Handles special tokens in a pdf label which should be treated with
+% care.
+%
+% For example, backslashes might produce problems.
+% This occurs quite frequently with automatically generated hyperrefs
+% inside of codeexamples where \pgfmanualpdfref will be invoked -
+% there, we get the catcode 12 backslashes.
+% Check for them!
+%
+% #1: a token list which shall be used either as cross ref or as
+% label.
+%
+% On output, the macro \pgfmanualpdflabel@@ will be '\edef'ed to the
+% new, possibly modified value.
+\def\pgfmanual@handlespeciallabeltokens@in#1{%
+ \begingroup
+ \pgfmanualpdf@installreplacements
+ \expandafter\pgfutil@in@\pgfmanual@pretty@backslash{#1}%
+ \ifpgfutil@in@
+ % assume the backslash is the first char and substitute it:
+ \pgfmanualpdfref@substitute@backslash#1\relax
+ \else
+ \edef\pgfmanualpdflabel@@{#1}%
+ \fi
+ \def\pgfmanual@tmp{\pgfutilstrreplace{ }{\space}}%
+ \expandafter\pgfmanual@tmp\expandafter{\pgfmanualpdflabel@@}%
+ \edef\pgfmanualpdflabel@@{\pgfretval}%
+ \pgfmath@smuggleone\pgfmanualpdflabel@@
+ \endgroup
+}%
+
+\expandafter\def\expandafter\pgfmanualpdfref@substitute@backslash\expandafter#\expandafter1\pgfmanual@pretty@backslash#2\relax{%
+ \edef\pgfmanualpdflabel@@{#1\textbackslash #2}%
+}%
+
+% Typesets '#1' in red,\texttt like every declaration. It will also
+% generate a pdf cross ref anchor for #1.
+%
+% WARNING: this changes catcodes! In case this is not acceptable in
+% your context, you will need to generate a \pgfmanualpdflabel
+% manually.
+%
+% \declareandlabel{\controlsequence} can be used as |\controlsequence|
+\def\declareandlabel{%
+ \begingroup
+ \pgfmanual@verb@preparecatcodes@
+ \def\pgfmanualprettyprinterhandlecollectedargs##1{%
+ \pgfmanualpdflabel##1{\texttt{\declare##1}}% mark: '##1' contains already braces.
+ \endgroup
+ }%
+ \pgfmanualprettyprintercollectargcount1{\relax}%
+}
+
+%
+% \verbpdfref{\controlsequence more stuff}
+% is the same as writing |\controlsequence more stuff|, but the
+% *complete* argument is supposed to be one label.
+%
+% The difference to \pgfmanualpdfref{...}{} is that the argument is
+% supposed to be verbatim text.
+\def\verbpdfref{%
+ \begingroup
+ \pgfmanual@verb@preparecatcodes@
+ \def\pgfmanualprettyprinterhandlecollectedargs##1{%
+ \pgfmanualpdfref##1{\texttt{##1}}% mark: '##1' contains already braces.
+ \endgroup
+ }%
+ \pgfmanualprettyprintercollectargcount1{\relax}%
+}
+
+% Prepare active vertical bars, |....| for auto-pretty cross
+% referencing.
+%
+% Example:
+% |\pgfkeys| -> will generate a hyperref!
+{
+ \catcode`\|=12
+ \gdef\pgfmanual@verb@bar{|}%
+% \gdef\pgfmanual@verb@collect#1|{%
+% % this command will also handle control sequences.
+% \texttt{\pgfmanualprettyprintpgfkeys{#1}}%
+% \endgroup
+% }%
+ \catcode`\|=13
+ \gdef\pgfmanual@verb@activebar{|}%
+}
+\def\pgfmanual@verb{%
+ \begingroup
+ \pgfmanual@verb@preparecatcodes@
+ \toksdef\t@pgfmanual@verb=0
+ \t@pgfmanual@verb={}%
+ \pgfmanual@verb@collect
+}
+% this version of \pgfmanual@verb@collect is less efficient than the
+% one uncommented above. BUT: it can auto-detect the case when
+% |...| has been provided somewhere where I can't change catcodes!
+% The other one would simply fail to compile.
+\def\pgfmanual@verb@collect#1{%
+ \def\pgfmanual@temp{#1}%
+ \ifx\pgfmanual@temp\pgfmanual@verb@bar
+ % ok, finish:
+ \edef\pgfmanual@verb@collect@next{%
+ % this command will also handle control sequences.
+ \noexpand\endgroup
+ \noexpand\texttt{\noexpand\pgfmanualprettyprintpgfkeys{\the\t@pgfmanual@verb}}%
+ }%
+ \else
+ \ifx\pgfmanual@temp\pgfmanual@verb@activebar
+ % ohoh... that should not happen! It means someone invoked
+ % |...| within an argument; I couldn't change catcodes.
+ % Ok, resort to a simple fallback solution.
+ % FIXME : I have just realized that THIS DOESN'T PRESERVE SPACES
+ \edef\pgfmanual@verb@collect@next{%
+ \noexpand\endgroup
+ \noexpand\texttt{\the\t@pgfmanual@verb}%
+ }%
+ \else
+ \t@pgfmanual@verb=\expandafter{\the\t@pgfmanual@verb #1}%
+ \let\pgfmanual@verb@collect@next=\pgfmanual@verb@collect
+ \fi
+ \fi
+ \pgfmanual@verb@collect@next
+}%
+
+\AtBeginDocument{%
+ \ifpgfmanualprettyenabled
+ \catcode`\|=13
+ \expandafter\let\pgfmanual@verb@activebar=\pgfmanual@verb
+ \fi
+}%
+
+\def\pgfmanual@verb@preparecatcodes@{%
+ \let\do\@makeother%
+ \dospecials%
+ \catcode`\%=12 % THATS IMPORTANT! Do *not* handle comments!
+ % these catcodes are expected by the pretty printer...
+ %\catcode`\^^M=13
+ \catcode`\ =13
+ \catcode`\^^I=13
+ \expandafter\def\pgfmanual@pretty@activespace{\space}%
+ \expandafter\def\pgfmanual@pretty@activetab{\space\space\space\space}%
+}%
+\endinput
+% vi: ts=4 sw=4
diff --git a/graphics/pgf/base/tex/pgfmanual.prettyprinter.code.tex b/graphics/pgf/base/tex/pgfmanual.prettyprinter.code.tex
new file mode 100644
index 0000000000..e8aa334224
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmanual.prettyprinter.code.tex
@@ -0,0 +1,1115 @@
+%--------------------------------------------
+%
+% Package pgfplots
+%
+% Provides a user-friendly interface to create function plots (normal
+% plots, semi-logplots and double-logplots).
+%
+% It is based on Till Tantau's PGF package.
+%
+% Copyright 2007/2008/2009 by Christian Feuersänger.
+%
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+%
+%--------------------------------------------
+
+% this is some kind of "plug-in" for pgfmanual-en-macros.tex which
+% provides pretty printing of the code lines in 'codeexample'.
+%
+% It requires to be invoked with \pgfmanualprettyprintcode{#1} at the
+% right place.
+%
+% ATTENTION:
+% this is NOT a sophisticated syntax highlighter like lstlistings!
+% It has rather strict assumptions about how to use it (the input must
+% have been read verbatim, for example).
+
+% Special code for syntax highlighting:
+%
+%
+% USER INTERFACE
+\pgfkeys{%
+ % this is the public hook into
+ % \begin{codeexample}...\end{codeexample} which triggers pretty
+ % printing:
+ /codeexample/typeset listing/.code= {\pgfmanualprettyprintcode{#1}},
+ %
+ % this key will be invoked whenever a key in key-value context has been identified.
+ %
+ % It won't be invoked for handled keys like |my style/.style=....|, see below.
+ %
+ % #1 will be the keys name.
+ /codeexample/prettyprint/key name/.code={#1},
+ %
+ % A variant which will be used instead of |key name| if the key
+ % has a key handler. For example, when the pretty printer finds
+ % |my style/.style|, it will call
+ % |key name with handler={my style}{.style}.
+ /codeexample/prettyprint/key name with handler/.code 2 args={#1/#2},
+ %
+ % Will be invoked whenever the value of a key has been found.
+ % It will be invoked AFTER 'key name' and not at all if there was
+ % no value.
+ %
+ % #1: the key's name
+ % #2: the key's value.
+ %
+ % The default implementation checks if there is a special handler
+ % for the key name '#1', in
+ % /codeexample/prettyprint/key value/#1.
+ % For example:
+ % /codeexample/prettyprint/key value/my key/.code 2 args={name=#1, value =#2}
+ % If such a key exists, it will be invoked with {#1}{#2} as
+ % arguments. Otherwise, the generic method
+ % /codeexample/prettyprint/key value with style detection={#1}{#2}
+ % will be invoked.
+ /codeexample/prettyprint/key value/.code 2 args={%
+ \pgfkeysifdefined{/codeexample/prettyprint/key value/#1}{%
+ \pgfkeysalso{/codeexample/prettyprint/key value/#1={#1}{#2}}%
+ }{%
+ \pgfkeysalso{/codeexample/prettyprint/key value with style detection={#1}{#2}}%
+ }%
+ },
+ % A helper macro for the default 'key value' implementation.
+ /codeexample/prettyprint/key value with style detection/.code 2 args={%
+ \pgfutil@in@{style}{#1}%
+ \ifpgfutil@in@
+ \pgfmanualprettyprintpgfkeys{#2}%
+ \else
+ \pgfkeysalso{/codeexample/prettyprint/key value display only={#2}}%
+ \fi
+ },%
+ %
+ % Will be invoked by the default 'key value' implementation to
+ % typeset the value as such.
+ /codeexample/prettyprint/key value display only/.code={#1},
+ %
+ % Used to typeset a single word. A word is something which has not
+ % been identified in any other context; a maximal sequence of
+ % non-white-space tokens.
+ /codeexample/prettyprint/word/.code={#1},
+ %
+ % A two-argument code key which invokes '#1' if spaces shall
+ % delimit words and '#2' if not.
+ % This may be useless. Handle with care!
+ /codeexample/prettyprint/if space is word delim/.code 2 args={%
+ #1%
+ },%
+ %
+ % A three-argument code key which should invoke '#2' if the single
+ % token '#1' is a word delimiter and '#3' if that is not the case.
+ % Note that '#1' doesn't have the usual catcodes (see the
+ % \pgfmanual@pretty@** macros)!
+ % Furthermore, white spaces are treated separately.
+ /codeexample/prettyprint/if is word delim/.code args={#1#2#3}{%
+ \edef\pgfmanual@check{,;().;\pgfmanual@pretty@lbrace\pgfmanual@pretty@rbrace}%
+ \def\pgfmanual@check@{\pgfutil@in@{#1}}%
+ \expandafter\pgfmanual@check@\expandafter{\pgfmanual@check}%
+ \ifpgfutil@in@ #2\else #3\fi
+ },%
+ %
+ % Used to typeset a single control sequence.
+ % #1 is the control sequence's name as a sequence of catcode 12
+ % tokens.
+ /codeexample/prettyprint/cs/.code={#1},
+ %
+ % Used to typeset a single control sequence together with one or
+ % more arguments.
+ %
+ % #1 is the control sequence's name (including the backslash as
+ % literal string) and
+ % #2,#3,...,#9 are the arguments. The number of arguments depends
+ % on the 'cs arguments/<CS NAME>' key; it contains the integer
+ % number.
+ %
+ % For example, if
+ % |cs arguments/pgfkeys/.initial=1|,
+ % the pretty printer invokes
+ % |cs with args={\pgfkeys}{<argument>}.
+ %
+ % If
+ % |cs arguments/mycommand/.initial=2|,
+ % the pretty printer invokes
+ % |cs with args={\pgfkeys}{<argument1>}{<argument2>}.
+ % In this case, 'cs with args' needs to be defined in a way which
+ % allows to deal with 3 arguments.
+ %
+ % Please note that the value do not contain braces! The braces
+ % need to be inserted manually.
+ %
+ % Special cases:
+ % 1. If end-of-input is encountered BEFORE the expected number of
+ % arguments has been found, the following happens:
+ % - if not even one (partial) argument has been found, the
+ % /codeexample/prettyprint/cs/.@cmd key will be used instead.
+ % - the \ifpgfmanualprettyprinterarghasunmatchedbraces boolean
+ % indicates if the trailing brace is missing.
+ /codeexample/prettyprint/cs with args/.code 2 args={#1\{#2\pgfmanualclosebrace},
+ %
+ % For every identified control sequence, the key
+ % /codeexample/prettyprint/cs arguments/<CSNAME>
+ % will be checked. If it exists, it contains an integer with the
+ % number of arguments it takes.
+ % The <CSNAME> must not contain the '\'.
+ /codeexample/prettyprint/cs arguments/pgfkeys/.initial=1,
+ %
+ % For every identified control sequence, the key
+ % /codeexample/prettyprint/cs/<CSNAME>/.@cmd
+ % will be checked. If it exists, it will be used instead of
+ % 'cs with args' (with the same special case restrictions for
+ % early end-of-input).
+ %
+ % The <CSNAME> must not contain the '\'.
+ %
+ % This allows special treatment for special
+ % commands like \pgfkeys:
+ /codeexample/prettyprint/cs/pgfkeys/.code 2 args={#1\{\pgfmanualprettyprintpgfkeys{#2}\pgfmanualclosebrace},
+ %
+ % recognise environments:
+ /codeexample/prettyprint/cs arguments/begin/.initial=1,
+ /codeexample/prettyprint/cs/begin/.code 2 args={#1\{#2\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/end/.initial=1,
+ /codeexample/prettyprint/cs/end/.code 2 args={#1\{#2\pgfmanualclosebrace},
+ %
+ % a point coordinate (#1)
+ % Note that '#1' will contain the braces (if there was one),
+ /codeexample/prettyprint/point/.code={#1},%
+ %
+ % a point coordinate with explicit coordinate system: (#1:#2)
+ % Note that '#2' will contain the terminating brace (if there was one)
+ % #1: the coordinate system name (*without* the leading brace).
+ % The leading brace must be re-inserted by this style.
+ /codeexample/prettyprint/point with cs/.code 2 args={(#1:#2},%
+ %
+ % The font / color command to use for comments. Will be set at
+ % the beginning of a comment
+ /codeexample/prettyprint/comment font/.initial=,%
+ % the same with specialised code:
+ %/codeexample/prettyprint/point with cs/<CS NAME>/.code 2 args={(#1:#2},%
+ %
+ %
+ % A predefined style which colors every identified token. It's
+ % purpose is only debugging.
+ /codeexample/prettyprint/colored/.style={%
+ /codeexample/prettyprint/key name/.code={\textcolor{red!75!black}{##1}},
+ /codeexample/prettyprint/key name with handler/.code 2 args={\textcolor{red!75!black}{##1}/\textcolor{red!90!black}{##2}},
+ /codeexample/prettyprint/key value display only/.code={\textcolor{yellow}{##1}},
+ /codeexample/prettyprint/cs/.code={\textcolor{green}{##1}},
+ /codeexample/prettyprint/cs with args/.code 2 args={\textcolor{green}{##1}\{\textcolor{orange}{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/pgfkeys/.initial=1,
+ /codeexample/prettyprint/cs/pgfkeys/.code 2 args={\textcolor{green}{##1}\{\pgfmanualprettyprintpgfkeys{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/begin/.initial=1,
+ /codeexample/prettyprint/cs/begin/.code 2 args={\textcolor{green}{##1}\{\textcolor{orange}{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/cs arguments/end/.initial=1,
+ /codeexample/prettyprint/cs/end/.code 2 args={\textcolor{green}{##1}\{\textcolor{orange}{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/word/.code={\textcolor{brown}{##1}},
+ /codeexample/prettyprint/point/.code={\textcolor{red}{##1}},%
+ /codeexample/prettyprint/point with cs/.code 2 args={(\textcolor{green}{##1}:\textcolor{red}{##2}},%
+ },%
+ % A further debugging helper.
+ /codeexample/prettyprint/colored and verbose/.style={%
+ /codeexample/prettyprint/colored,
+ /codeexample/prettyprint/key name/.code={\message{[key name=##1]}\textcolor{red!75!black}{##1}},
+ /codeexample/prettyprint/key name with handler/.code 2 args={\message{[key name with handler=##1/##2]}\textcolor{red!75!black}{##1}/\textcolor{red!90!black}{##2}},
+ /codeexample/prettyprint/key value display only/.code={\def\temp{##1}\message{[key value=\meaning\temp]}\textcolor{yellow}{##1}},
+ /codeexample/prettyprint/cs/.code={\message{[cs=##1]}\textcolor{green}{##1}},
+ /codeexample/prettyprint/cs with args/.code 2 args={\def\temp{##2}\message{[cs with args={##1}{\meaning\temp}]}\textcolor{green}{##1}\{\textcolor{orange}{##2}\pgfmanualclosebrace},
+ /codeexample/prettyprint/word/.code={\message{[word=##1]}\textcolor{brown}{##1}},
+ /codeexample/prettyprint/point/.code={\message{[point=##1]}\textcolor{red}{##1}},%
+ /codeexample/prettyprint/point with cs/.code 2 args={\message{[point with cs={##1}{##2}]}(\textcolor{green}{##1}:\textcolor{red}{##2}},%
+ },%
+ %/codeexample/prettyprint/colored,
+ %/codeexample/prettyprint/colored and verbose,
+}%
+
+\newif\ifpgfmanualprettyenabled
+\pgfmanualprettyenabledtrue
+
+% User interface command to handle unmatched braces:
+%
+% It expands to '\}' unless the preceding argument had unmatched braces.
+\def\pgfmanualclosebrace{%
+ \ifpgfmanualprettyprinterarghasunmatchedbraces
+ \else
+ \}%
+ \fi
+}%
+
+
+% Typesets '#1', possibly using some sort of pretty printer.
+%
+% The argument '#1' is expected to be a long token list in which
+% 1. all characters have catcode 11 or 12 (normal letters),
+% 2. white spaces, tabs and newlines have catcode 13 (are active).
+%
+% @see \pgfmanualprettyprintpgfkeys
+\long\def\pgfmanualprettyprintcode#1{%
+%\def\temp{#1}\message{STARTING PRETTY PRINTING for \meaning\temp}%
+ \ifpgfmanualprettyenabled
+ \begingroup
+ \pgfmanualprettyprintstyles
+ \pgfmanual@pretty@mainloop#1\pgfmanual@EOI
+ \endgroup
+ \else
+ #1%
+ \fi
+}%
+% DISABLE:
+%\long\def\pgfmanualprettyprintcode#1{#1}%
+
+\def\pgfmanualprettyprintstyles{%
+%\tracingmacros=2 \tracingcommands=2 \message{PRETTYPRINT INIT}%
+ \def\{{\pgfmanual@pretty@lbrace}%
+ \def\}{\pgfmanual@pretty@rbrace}%
+ \pgfmanual@pretty@installcommenthandler
+ \let\pgfmanualprettyprintstyles=\relax
+}%
+
+
+\newif\ifpgfmanualprettycommentactive
+
+% we can't use the \@typeset@till@return method for comments because
+% the pretty printer needs full control over the token list.
+%
+% We try a replacement here.
+%
+% FIXME
+% THIS INTRODUCES A NEW GROUP! Does that hurt the pretty printer??
+%
+\def\pgfmanual@pretty@installcommenthandler{%
+ \expandafter\def\pgfmanual@pretty@activepercent{%
+ \begingroup%
+ \pgfmanualprettycommentactivetrue
+ \expandafter\let\pgfmanual@pretty@activenl=\pgfmanual@pretty@recoveraftercomment
+ \expandafter\def\pgfmanual@pretty@activepercent{\%}%
+ \pgfkeysvalueof{/codeexample/prettyprint/comment font}%\tt
+ \%%
+ }%
+}%
+\def\pgfmanual@pretty@recoveraftercomment{%
+ \endgroup
+ \pgfmanual@pretty@activenl
+}%
+
+\def\pgfmanual@EOI{\pgfmanual@EOI}%
+
+{
+ \catcode`\[=0
+ \catcode`\\=12
+ [gdef[pgfmanual@pretty@backslash{\}%
+}
+\begingroup
+ \catcode`\:=12
+ \catcode`\(=12
+ \catcode`\)=12
+ \gdef\pgfmanual@pretty@colon{:}%
+ \gdef\pgfmanual@pretty@lroundbrace{(}%
+ \gdef\pgfmanual@pretty@rroundbrace{)}%
+ \catcode`\[=1
+ \catcode`\]=2
+ \catcode`\{=12
+ \catcode`\}=12
+ \gdef\pgfmanual@pretty@lbrace[{]%
+ \gdef\pgfmanual@pretty@rbrace[}]%
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\[=12
+ \catcode`\]=12
+ \catcode`\,=12
+ \catcode`\ =10\relax\gdef\pgfmanual@pretty@space{ }%
+ \gdef\pgfmanual@pretty@lbracket{[}%
+ \gdef\pgfmanual@pretty@rbracket{]}%
+ \gdef\pgfmanual@pretty@comma{,}%
+ \catcode`\==12
+ \gdef\pgfmanual@pretty@eq{=}%
+\endgroup
+\begingroup
+ \catcode`\%=12
+ \gdef\pgfmanual@pretty@percent{%}
+ \catcode`\%=13
+ \gdef\pgfmanual@pretty@activepercent{%}
+ \catcode`\^^M=13
+ \gdef\pgfmanual@pretty@activenl{^^M}\endgroup
+\begingroup
+\catcode`\^^I=13\relax\gdef\pgfmanual@pretty@activetab{^^I}%
+\catcode`\ =13\relax\gdef\pgfmanual@pretty@activespace{ }\endgroup
+
+% loops through all tokens.
+% #1 is a single token.
+\def\pgfmanual@pretty@mainloop{%
+ \def\pgfmanual@pretty@mainloop@currentword{}%
+ \pgfmanual@pretty@mainloop@
+}%
+\long\def\pgfmanual@pretty@mainloop@#1{%
+ \def\pgfmanual@loc@TMPa{#1}%
+ \let\pgfmanual@pretty@mainloop@NEXT=\pgfmanual@pretty@mainloop@
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@EOI
+ % stop iteration.
+ \pgfmanual@pretty@mainloop@finishword
+ \let\pgfmanual@pretty@mainloop@NEXT=\relax
+ \else
+ \ifpgfmanualprettycommentactive
+ #1\kern0pt%
+ \else
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@pretty@lbracket%
+ % we found the start of OPTIONS '[ ... ]'.
+ \pgfmanual@pretty@mainloop@finishword
+ % Attempt syntax highlighting for pgfkeys:
+ \let\pgfmanual@pretty@mainloop@NEXT=\pgfmanual@pretty@pgfkeys
+ \else
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@pretty@backslash
+ % we found the start of a control sequence '\command'
+ \pgfmanual@pretty@mainloop@finishword
+ %
+ % collect the control sequence name into
+ % \pgfmanual@loc@TMPa, but without the backslash:
+ \let\pgfmanual@loc@TMPa=\pgfutil@empty
+ \let\pgfmanual@pretty@mainloop@NEXT=\pgfmanual@pretty@collectcs@loop
+ \else
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@pretty@lroundbrace%
+ \pgfmanual@pretty@mainloop@finishword
+ \let\pgfmanual@pretty@mainloop@NEXT=\pgfmanual@pretty@collectpoint
+ \else
+ \def\pgfmanual@isspace{0}%
+ \ifnum13=\catcode`#1
+ % we found a white space (space, TAB or NL) or comment
+ \def\pgfmanual@isspace{1}%
+ \else
+ \ifnum10=\catcode`#1
+ \def\pgfmanual@isspace{1}%
+ \fi
+ \fi
+ \if\pgfmanual@isspace1%
+ \pgfkeysvalueof{/codeexample/prettyprint/if space is word delim/.@cmd}{%
+ \pgfmanual@pretty@mainloop@finishword
+ #1% ok, show it.
+ }{%
+ % collect the word.
+ \expandafter\def\expandafter\pgfmanual@pretty@mainloop@currentword\expandafter{\pgfmanual@pretty@mainloop@currentword #1}%
+ }%
+ \else
+ \pgfkeysvalueof{/codeexample/prettyprint/if is word delim/.@cmd}{#1}{%
+ \pgfmanual@pretty@mainloop@finishword
+ #1% ok, show the delimiter.
+ }{%
+ % collect the word.
+ \expandafter\def\expandafter\pgfmanual@pretty@mainloop@currentword\expandafter{\pgfmanual@pretty@mainloop@currentword #1}%
+ }\pgfeov%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgfmanual@pretty@mainloop@NEXT
+}%
+
+\def\pgfmanual@pretty@mainloop@finishword{%
+ \ifx\pgfmanual@pretty@mainloop@currentword\pgfutil@empty
+ \else
+ \def\pgfmanual@loc@TMPa{\pgfkeysvalueof{/codeexample/prettyprint/word/.@cmd}}%
+ \expandafter\pgfmanual@loc@TMPa\pgfmanual@pretty@mainloop@currentword\pgfeov
+ \let\pgfmanual@pretty@mainloop@currentword=\pgfutil@empty
+ \fi
+}%
+
+\def\pgfmanual@pretty@collectpoint{%
+ \let\pgfmanualprettyprinterhandlecollectedargsVtwo=\pgfmanual@pretty@collectargs@finish@collectpoint
+ \expandafter\pgfmanualprettyprintercollectupto\pgfmanual@pretty@rroundbrace
+ {\afterpgfmanual@pretty@collectpoint}%
+}
+
+{
+\catcode`\:=12
+\gdef\pgfmanual@pretty@collectargs@finish@collectpoint#1#2{%
+ \expandafter\pgfutil@in@\pgfmanual@pretty@colon{#1}%
+ \ifpgfutil@in@
+ \def\pgfmanual@pretty@collectpoint@getcoordsystem##1:##2\relax{%
+ \begingroup
+ \pgfmanual@pretty@restorespaces
+ % remove active spaces from ##1:
+ \xdef\pgfmanual@pretty@glob@TMPa{##1}%
+ \endgroup
+ \pgfkeysifdefined{/codeexample/prettyprint/point with cs/\pgfmanual@pretty@glob@TMPa/.@cmd}{%
+ \def\pgfmanual@loc@TMPb{\pgfkeysvalueof{/codeexample/prettyprint/point with cs/\pgfmanual@pretty@glob@TMPa/.@cmd}}%
+ }{%
+ \def\pgfmanual@loc@TMPb{\pgfkeysvalueof{/codeexample/prettyprint/point with cs/.@cmd}}%
+ }%
+ \expandafter\def\expandafter\pgfmanual@loc@TMPa\expandafter{\expandafter{\pgfmanual@pretty@glob@TMPa}{##2}}%
+ \expandafter\pgfmanual@loc@TMPb\pgfmanual@loc@TMPa\pgfeov
+ }%
+ \if1#2%
+ \pgfmanual@pretty@collectpoint@getcoordsystem#1)\relax
+ \else
+ \pgfmanual@pretty@collectpoint@getcoordsystem#1\relax
+ \fi
+ \else
+ \def\pgfmanual@loc@TMPb{\pgfkeysvalueof{/codeexample/prettyprint/point/.@cmd}}%
+ \if1#2%
+ \pgfmanual@loc@TMPb(#1)\pgfeov
+ \else
+ \pgfmanual@loc@TMPb(#1\pgfeov
+ \fi
+ \fi
+}%
+}
+\def\afterpgfmanual@pretty@collectpoint{\pgfmanual@pretty@mainloop}%
+
+% loops through all tokens, assembling the cs name as it goes.
+% #1 is a single token.
+\def\pgfmanual@pretty@collectcs@loop#1{%
+ \let\pgfmanual@pretty@collectcs@loop@NEXT=\pgfmanual@pretty@collectcs@loop
+ \def\pgfmanual@loc@TMPb{#1}%
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@EOI
+ \def\pgfmanual@pretty@collectcs@loop@NEXT{\pgfmanual@pretty@collectcs@loop@END #1}%
+ \else
+ % a csname may only use letters. And: only letters have a
+ % positive lcccode!
+ \ifnum\lccode`#1=0
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@attext%
+ % ok, we may also accept an `@':
+ \edef\pgfmanual@loc@TMPa{\pgfmanual@loc@TMPa #1}%
+ \else
+ % This here is the first non-letter.
+ \def\pgfmanual@pretty@collectcs@loop@NEXT{\pgfmanual@pretty@collectcs@loop@END #1}%
+ \fi
+ \else
+ % continue iterating and assemble the csname...
+ \edef\pgfmanual@loc@TMPa{\pgfmanual@loc@TMPa #1}%
+ \fi
+ \fi
+ \pgfmanual@pretty@collectcs@loop@NEXT
+}%
+\def\afterpgfmanual@pretty@cs{\pgfmanual@pretty@mainloop}%
+\def\pgfmanual@attext{@}
+
+\def\pgfmanual@pretty@collectcs@loop@END{%
+ \pgfkeysifdefined{/codeexample/prettyprint/cs arguments/\pgfmanual@loc@TMPa}{%
+ % oh. The collected control sequence expects arguments. That
+ % means a lot of work since there are no nestable braces in
+ % the token list! All of them have catcode 12... we need to do
+ % that manually.
+ \let\pgfmanualprettyprinterhandlecollectedargs=\pgfmanual@pretty@collectargs@finish@cs
+ \def\pgfmanual@pretty@collectcs@loop@END@next{%
+ \pgfmanualprettyprintercollectargcount
+ {\pgfkeysvalueof{/codeexample/prettyprint/cs arguments/\pgfmanual@loc@TMPa}}%
+ {\afterpgfmanual@pretty@cs}%
+ }%
+ }{%
+ % re-insert the backslash:
+ \edef\pgfmanual@loc@TMPa{\pgfmanual@pretty@backslash \pgfmanual@loc@TMPa}%
+ % ok, report the macro and continue with the main loop.
+ \def\pgfmanual@loc@TMPb{\pgfkeysvalueof{/codeexample/prettyprint/cs/.@cmd}}%
+ \expandafter\pgfmanual@loc@TMPb\pgfmanual@loc@TMPa\pgfeov
+ \let\pgfmanual@pretty@collectcs@loop@END@next=\afterpgfmanual@pretty@cs
+ }%
+ \pgfmanual@pretty@collectcs@loop@END@next
+}%
+
+\newif\ifpgfmanualprettyprinterarghasunmatchedbraces
+
+% Collects arguments inside of a token list, dealing with nested
+% catcode-12-braces.
+%
+% #1: is the NUMBER of arguments to collect.
+% #2: is TeX code which shall be invoked after
+% \pgfmanualprettyprinterhandlecollectedargs has been invoked (see
+% below).
+%
+% PRECONDITION:
+% there is a large token list following
+% \pgfmanualprettyprintercollectargcount with balanced braces. The braces
+% have \catcode 12.
+% POSTCONDITION:
+% 1. the arguments will be collected as
+% '<result> := {<first arg>}{<second arg>}',
+% 2.1 the macro \pgfmanualprettyprinternumcollectedargs will contain
+% the *actual* number of *completely* collected arguments,
+% 2.2 the if \ifpgfmanualprettyprinterarghasunmatchedbraces will be
+% set to \c true if the last found argument had an unmatched brace,
+% 3. then, \pgfmanualprettyprinterhandlecollectedargs{<result>} will be
+% invoked. Just define \pgfmanualprettyprinterhandlecollectedargs
+% properly.
+% Afterwards, #2 will be invoked to recover from the argument
+% collection.
+%
+%
+% Example:
+% \pgfmanualprettyprintercollectargcount{2}{\donnextstep}
+% {_12 first argument }_12 {_12 second argument }_12 next tokens%
+%
+% will result in the expansion
+% \pgfmanualprettyprinterhandlecollectedargs{{_1 first argument }_2 {_1 second argument }_2 }
+% \donnextstep
+% next tokens
+%
+%
+%
+% ATTENTION:
+% \pgfmanualprettyprinterhandlecollectedargs will be invoked with a SINGLE
+% argument. The argument as such will contain extra braces, one pair
+% of braces for each of the #1 arguments. These braces will have
+% catcode 1 and 2, i.e. they can *really* be used in TeX. Thus, the
+% finish routine will be invoked with
+% \pgfmanualprettyprinterhandlecollectedargs{{<arg>}}
+% for one argument and with
+% \pgfmanualprettyprinterhandlecollectedargs{{<first arg>}{<second arg>}}
+% for two and more arguments. Note the extra set of braces for one
+% arg.
+% It might happen that not all arguments have been found if
+% end-of-input occurred before. The
+% \pgfmanualprettyprinterhandlecollectedargs routine has to check
+% this using the macro \pgfmanualprettyprinternumcollectedargs which
+% contains the actual number of collected args.
+%
+% @remark This macro checks for the end-of-input indicator, \pgfmanual@EOI. In case it encounters
+% \pgfmanual@EOI, it
+% 1. stops collecting, leaving the \pgfmanual@EOI as next token to be read,
+% 2. sets \ifpgfmanualprettyprinterarghasunmatchedbraces to \iftrue if necessary,
+% 3. assigns \pgfmanualprettyprinternumcollectedargs
+% 4. invokes the finish routine.
+% The \pgfmanual@EOI needs to be collected by following routines in
+% this case. You can also use \pgfutil@ifnextchar\pgfmanual@EOI{}{} in
+% following routines to check for \pgfmanual@EOI.
+\def\pgfmanualprettyprintercollectargcount#1#2{%
+ \pgfmanualprettyprinterarghasunmatchedbracesfalse
+ \begingroup
+ \edef\pgfmanual@loc@csargcount{#1}%
+ \toksdef\t@afterpgfmanualprettyprinterhandlecollected=10
+ \t@afterpgfmanualprettyprinterhandlecollected={#2}%
+ \let\c@pgfmanual@pretty@openbracecount=\c@pgf@counta
+ \let\c@pgfmanual@pretty@curargcount=\c@pgf@countb
+ % I will track open braces and the number of completely
+ % collected arguments here:
+ \c@pgfmanual@pretty@openbracecount=0
+ \c@pgfmanual@pretty@curargcount=0
+ %
+ % and I will accumulate the argument token lists as such here:
+ \toksdef\t@pgfmanual@currentarg=0
+ \toksdef\t@pgfmanual@allargs=1
+ \t@pgfmanual@currentarg={}%
+ \t@pgfmanual@allargs={}%
+ %
+ \pgfmanual@pretty@collectargs@loop
+}%
+
+% loops through all tokens, collecting the required number of
+% arguments. This involves to track nested braces manually.
+% #1 is a single token.
+\def\pgfmanual@pretty@collectargs@loop#1{%
+ \let\pgfmanual@pretty@collectargs@loop@NEXT=\pgfmanual@pretty@collectargs@loop
+ \def\pgfmanual@loc@TMPc{#1}%
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@EOI
+ \ifnum\c@pgfmanual@pretty@openbracecount>0
+ \ifpgfmanualpdfwarnings
+ \pgfplots@warning{The pretty printer did not found the closing curly brace!? This will potentially lead to display errors}%
+ \fi
+ \fi
+ \edef\pgfmanual@pretty@collectargs@loop@NEXT{%
+ \noexpand\endgroup
+ \ifnum\c@pgfmanual@pretty@openbracecount>0
+ \noexpand\pgfmanualprettyprinterarghasunmatchedbracestrue
+ \fi
+ \noexpand\def\noexpand\pgfmanualprettyprinternumcollectedargs{\the\c@pgfmanual@pretty@curargcount}%
+ \noexpand\pgfmanualprettyprinterhandlecollectedargs{\the\t@pgfmanual@allargs\the\t@pgfmanual@currentarg}%
+ \the\t@afterpgfmanualprettyprinterhandlecollected
+ \noexpand\pgfmanual@EOI% <- put this token back into token list!
+ }%
+ \else
+ \ifpgfmanualprettycommentactive
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@activenl
+ \pgfmanualprettycommentactivefalse
+ \fi
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@activepercent
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \pgfmanualprettycommentactivetrue
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@lbrace
+ \advance\c@pgfmanual@pretty@openbracecount by1
+ \ifnum\c@pgfmanual@pretty@openbracecount>1
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \fi
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@rbrace
+ \advance\c@pgfmanual@pretty@openbracecount by-1
+ \ifnum\c@pgfmanual@pretty@openbracecount=0
+ % we have one complete argument ready!
+ % append it -- with REAL braces if needed:
+ \edef\pgfmanual@loc@TMPc{\the\t@pgfmanual@allargs{\the\t@pgfmanual@currentarg}}%
+ \t@pgfmanual@allargs=\expandafter{\pgfmanual@loc@TMPc}%
+ \t@pgfmanual@currentarg={}%
+ %
+ % check it we need more arguments:
+ \advance\c@pgfmanual@pretty@curargcount by1
+ \ifnum\c@pgfmanual@pretty@curargcount=\pgfmanual@loc@csargcount\relax
+ \edef\pgfmanual@pretty@collectargs@loop@NEXT{%
+ \noexpand\endgroup
+ \noexpand\def\noexpand\pgfmanualprettyprinternumcollectedargs{\the\c@pgfmanual@pretty@curargcount}%
+ \noexpand\pgfmanualprettyprinterhandlecollectedargs{\the\t@pgfmanual@allargs}%
+ \the\t@afterpgfmanualprettyprinterhandlecollected
+ }%
+ \fi
+ \else
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \fi
+ \else
+ \ifnum13=\catcode`#1
+ % we found a white space (space, TAB or NL) or comment
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \else
+ \ifnum10=\catcode`#1
+ % we found a white space (space, TAB
+ % or NL) with unexpected catcode
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \else
+ \ifnum\c@pgfmanual@pretty@openbracecount=0
+ \ifpgfmanualpdfwarnings
+ \begingroup
+ \toks4{#1}%
+ \pgfplots@warning{The pretty printer did not find the expected \pgfmanual@loc@csargcount\space arguments (only token \the\toks4 )}%
+ \endgroup
+ \fi
+ \edef\pgfmanual@pretty@collectargs@loop@NEXT{%
+ \noexpand\endgroup
+ \noexpand\def\noexpand\pgfmanualprettyprinternumcollectedargs{\the\c@pgfmanual@pretty@curargcount}%
+ \noexpand\pgfmanualprettyprinterhandlecollectedargs{\the\t@pgfmanual@allargs\the\t@pgfmanual@currentarg}%
+ \the\t@afterpgfmanualprettyprinterhandlecollected
+ \noexpand#1% <- put this token back into token list!
+ }%
+ \else
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgfmanual@pretty@collectargs@loop@NEXT
+}%
+
+\newif\ifpgfmanualprettyprinterfoundterminator
+
+\def\pgfmanualprettyprinterhandlecollectedargsVtwo@default#1#2{%
+ \if1#2%
+ \pgfmanualprettyprinterfoundterminatortrue
+ \else
+ \pgfmanualprettyprinterfoundterminatorfalse
+ \fi
+ \pgfmanualprettyprinterhandlecollectedargs{#1}%
+}%
+\def\pgfmanualprettyprintercollectupto@restore@callback{%
+ \let\pgfmanualprettyprinterhandlecollectedargsVtwo=\pgfmanualprettyprinterhandlecollectedargsVtwo@default
+}%
+\pgfmanualprettyprintercollectupto@restore@callback
+
+% Collects tokens inside of a token list up to a single delimiting token, dealing with nested
+% catcode-12-braces.
+%
+% #1: is the end token, the delimiter. It won't be collected.
+% #2: is code to invoke after
+% \pgfmanualprettyprinterhandlecollectedargsVtwo has been invoked.
+%
+% PRECONDITION:
+% there is a large token list following
+% \pgfmanualprettyprintercollectargcount with balanced braces. The braces
+% have \catcode 12.
+% POSTCONDITION:
+% - the arguments will be collected as
+% '<result> := <token list>'
+% and then,
+% \pgfmanualprettyprinterhandlecollectedargsVtwo{<result>}{<found terminator>? 1 : 0} will be
+% invoked. Just define
+% \pgfmanualprettyprinterhandlecollectedargsVtwo
+% properly.
+% Then, #2 will be invoked.
+%
+% @see \pgfmanualprettyprintercollectargcount for more details.
+%
+\def\pgfmanualprettyprintercollectupto#1#2{%
+ \pgfmanualprettyprinterarghasunmatchedbracesfalse
+ \begingroup
+ \def\pgfmanual@loc@delimittoken{#1}%
+ \toksdef\t@afterpgfmanualprettyprinterhandlecollected=10
+ \t@afterpgfmanualprettyprinterhandlecollected={#2}%
+ %
+ \let\c@pgfmanual@pretty@openbracecount=\c@pgf@counta
+ % I will track open braces here:
+ \c@pgfmanual@pretty@openbracecount=0
+ %
+ % and I will accumulate the argument token lists as such here:
+ \toksdef\t@pgfmanual@currentarg=0
+ \t@pgfmanual@currentarg={}%
+ %
+ \pgfmanual@pretty@collectupto@loop
+}%
+
+% loops through all tokens, collecting the required number of
+% arguments. This involves to track nested braces manually.
+% #1 is a single token.
+\def\pgfmanual@pretty@collectupto@loop#1{%
+ \let\pgfmanual@pretty@collectupto@loop@NEXT=\pgfmanual@pretty@collectupto@loop
+ \def\pgfmanual@loc@TMPc{#1}%
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@EOI
+ \edef\pgfmanual@pretty@collectupto@loop@NEXT{%
+ \noexpand\endgroup
+ \ifnum\c@pgfmanual@pretty@openbracecount>0
+ \noexpand\pgfmanualprettyprinterarghasunmatchedbracestrue
+ \fi
+ \noexpand\pgfmanualprettyprinterhandlecollectedargsVtwo{\the\t@pgfmanual@currentarg}{0}%
+ \noexpand\pgfmanualprettyprintercollectupto@restore@callback
+ \the\t@afterpgfmanualprettyprinterhandlecollected
+ \noexpand\pgfmanual@EOI% <- put this token back into token list!
+ }%
+ \else
+ \ifpgfmanualprettycommentactive
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@activenl
+ \pgfmanualprettycommentactivefalse
+ \fi
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@activepercent
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \pgfmanualprettycommentactivetrue
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@lbrace
+ \advance\c@pgfmanual@pretty@openbracecount by1
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@pretty@rbrace
+ \advance\c@pgfmanual@pretty@openbracecount by-1
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \else
+ \ifx\pgfmanual@loc@TMPc\pgfmanual@loc@delimittoken
+ \ifnum\c@pgfmanual@pretty@openbracecount=0
+ % do NOT include the delimit token.
+ \edef\pgfmanual@pretty@collectupto@loop@NEXT{%
+ \noexpand\endgroup
+ \noexpand\pgfmanualprettyprinterhandlecollectedargsVtwo{\the\t@pgfmanual@currentarg}{1}%
+ \noexpand\pgfmanualprettyprintercollectupto@restore@callback
+ \the\t@afterpgfmanualprettyprinterhandlecollected
+ }%
+ \else
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \fi
+ \else
+ \t@pgfmanual@currentarg=\expandafter{\the\t@pgfmanual@currentarg#1}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgfmanual@pretty@collectupto@loop@NEXT
+}%
+
+\def\pgfmanual@pretty@collectargs@finish@cs#1{%
+ \def\pgfmanual@pretty@collectargs@finish@cs@hasargs{1}%
+ \ifnum\pgfmanualprettyprinternumcollectedargs=0
+ \ifpgfmanualprettyprinterarghasunmatchedbraces
+ \else
+ \def\pgfmanual@pretty@collectargs@finish@cs@hasargs{0}%
+ \fi
+ \fi
+ \if\pgfmanual@pretty@collectargs@finish@cs@hasargs1%
+ % report the macro and its arguments:
+ \pgfkeysifdefined{/codeexample/prettyprint/cs/\pgfmanual@loc@TMPa/.@cmd}{%
+ % oh, we have a separate routine for this macro! Ok, use it:
+ \edef\pgfmanual@loc@TMPb{\noexpand\pgfkeysvalueof{/codeexample/prettyprint/cs/\pgfmanual@loc@TMPa/.@cmd}}%
+ }{%
+ % use the generic routine:
+ \edef\pgfmanual@loc@TMPb{\noexpand\pgfkeysvalueof{/codeexample/prettyprint/cs with args/.@cmd}}%
+ }%
+ % re-insert the backslash:
+ \edef\pgfmanual@loc@TMPa{{\pgfmanual@pretty@backslash\pgfmanual@loc@TMPa}}%
+ \expandafter\pgfmanual@loc@TMPb\pgfmanual@loc@TMPa #1\pgfeov
+ \else
+ % Oh. We probably got |\pgfkeys| instead of |\pgfkeys{arg}|
+ % re-insert the backslash:
+ \edef\pgfmanual@loc@TMPa{{\pgfmanual@pretty@backslash\pgfmanual@loc@TMPa}}%
+ \edef\pgfmanual@loc@TMPb{\noexpand\pgfkeysvalueof{/codeexample/prettyprint/cs/.@cmd}}%
+ \expandafter\pgfmanual@loc@TMPb\pgfmanual@loc@TMPa\pgfeov
+ #1\relax% simply typeset any encountered tokens after the control sequence.
+ \fi
+}%
+
+% A user macro which pretty prints a set of keys.
+%
+% If '#1' is NOT an argument for \pgfkeys,
+% \pgfmanualprettyprintpgfkeys will try to recognise at least control
+% sequences (in the same way as usual). Thus, you can even use this
+% method if there *could* be pgfkeys arguments in an automated pretty
+% printing environment.
+%
+% However, '#1' should only have catcode 12 characters with the
+% exception of catcode 13 for newlines, spaces and comments.
+\long\def\pgfmanualprettyprintpgfkeys#1{%
+ \ifpgfmanualprettyenabled
+ \begingroup
+ \pgfmanualprettyprintstyles
+ \pgfmanual@pretty@pgfkeys@loop#1\pgfmanual@EOI
+ \endgroup
+ \else
+ #1%
+ \fi
+}
+
+\def\pgfmanual@pretty@pgfkeys{%
+ \let\pgfmanualprettyprinterhandlecollectedargsVtwo=\pgfmanual@pretty@pgfkeys@start
+ \pgfmanualprettyprintercollectupto]{\pgfmanual@pretty@mainloop}%%
+}%
+\long\def\pgfmanual@pretty@pgfkeys@start#1#2{%
+ [%
+ \pgfmanual@pretty@pgfkeys@loop#1\pgfmanual@EOI
+ \if1#2%
+ ]%
+ \fi
+}%
+% iterates through single tokens, detecting key names and values while
+% it goes.
+\long\def\pgfmanual@pretty@pgfkeys@loop#1{%
+ \def\pgfmanual@loc@TMPa{#1}%
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@EOI
+ \def\pgfmanual@pretty@pgfkeys@loop@NEXT{\relax}%
+ \else
+ \def\pgfmanual@pretty@pgfkeys@loop@NEXT{\pgfmanual@pretty@pgfkeys@loop}%
+ \ifpgfmanualprettycommentactive
+ #1\kern0pt%
+ \else
+ \ifnum13=\catcode`#1
+ % we found a white space (space, TAB or NL) or comment
+ #1%
+ \else
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@pretty@comma%
+ %\let\pgfmanual@pretty@pgfkeys@loop@NEXT=\pgfmanual@pretty@pgfkeys@checkforEOI
+ ,%
+ \else
+ \ifnum10=\catcode`#1
+ % another white space... I thought they'd have
+ % catcode 13. doesn't matter.
+ #1%
+ \else
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@pretty@lbrace
+ % braces may not occur in the first place -
+ % but there are circumstances where it is
+ % convenient to deal with them here (when
+ % processing arguments of styles)
+ % Do it.
+ #1%
+ \else
+ \ifx\pgfmanual@loc@TMPa\pgfmanual@pretty@rbrace
+ #1%
+ \else
+ % found the beginning of a key!
+ % We will collect the key name into
+ % \toks0.
+ \toks0={}%
+ %
+ % Handle it:
+ % FIXME what if we found an opening brace!?
+ \def\pgfmanual@pretty@pgfkeys@loop@NEXT{\pgfmanual@pretty@pgfkeys@collectkey #1}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgfmanual@pretty@pgfkeys@loop@NEXT
+}%
+\def\pgfmanual@pretty@pgfkeys@collectkey#1{%
+ \def\pgfmanual@loc@TMPb{#1}%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\pgfmanual@pretty@pgfkeys@collectkey}%
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@EOI
+ % finish key name.
+ \edef\pgfmanual@loc@TMPb{\the\toks0 }%
+ \ifx\pgfmanual@loc@TMPb\pgfutil@empty
+ \else
+ \expandafter\pgfmanual@pretty@pgfkeys@processkey\expandafter{\the\toks0 }%
+ \fi
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\relax}%
+ \else
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@pretty@eq
+ % finish key name.
+ \expandafter\pgfmanual@pretty@pgfkeys@processkey\expandafter{\the\toks0 }%
+ #1%
+ % now, we do the same with the value - we collect it into
+ % \toks0.
+ \toks0={}%
+ \def\pgfmanual@pretty@pgfkeys@collectvalue@hasconsumedspaces{0}%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\pgfmanual@pretty@pgfkeys@collectvalue}%
+ \else
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@pretty@comma
+ % finish key name.
+ \expandafter\pgfmanual@pretty@pgfkeys@processkey\expandafter{\the\toks0 }%
+ #1%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\pgfmanual@pretty@pgfkeys@loop}%
+ \else
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@pretty@activenl
+ % finish key name before newline. This is not
+ % necessarily as in TeX, but its simpler here
+ % because we don't need special cases for comments
+ % and we don't need to gobble following white
+ % spaces.
+ \expandafter\pgfmanual@pretty@pgfkeys@processkey\expandafter{\the\toks0 }%
+ #1%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\pgfmanual@pretty@pgfkeys@loop}%
+ \else
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@pretty@backslash
+ % This is confusing. I simply try to invoke
+ % the control sequence code and recover as
+ % good as possible. Let's see if that's
+ % useful.
+ \edef\pgfmanual@loc@TMPb{\the\toks0 }%
+ \ifx\pgfmanual@loc@TMPb\pgfutil@empty
+ \else
+ \expandafter\pgfmanual@pretty@pgfkeys@processkey\expandafter{\the\toks0 }%
+ \fi
+ %
+ % we found the start of a control sequence '\command':
+ %
+ % collect the control sequence name into
+ % \pgfmanual@loc@TMPa, but without the backslash:
+ \begingroup
+ \let\pgfmanual@loc@TMPa=\pgfutil@empty
+ \def\afterpgfmanual@pretty@cs{%
+ \endgroup
+ \pgfmanual@pretty@pgfkeys@loop
+ }%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\pgfmanual@pretty@collectcs@loop}%
+ \else
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@pretty@lbrace
+ % Braces in key names are allowed (if they
+ % are not the first character of a key
+ % name)
+ \def\pgfmanualprettyprinterhandlecollectedargs##1{%
+ \toks1={##1}%
+ \edef\pgfmanual@loc@TMPc{%
+ \the\toks0 \pgfmanual@pretty@lbrace \the\toks1
+ \ifpgfmanualprettyprinterarghasunmatchedbraces
+ \else
+ \pgfmanual@pretty@rbrace
+ \fi
+ }%
+ \toks0=\expandafter{\pgfmanual@loc@TMPc}%
+ }%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{%
+ \pgfmanualprettyprintercollectargcount{1}{\pgfmanual@pretty@pgfkeys@collectkey}%
+ #1%
+ }%
+ \else
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@pretty@rbrace
+ \expandafter\pgfmanual@pretty@pgfkeys@processkey\expandafter{\the\toks0 }%
+ #1%
+ \def\pgfmanual@pretty@pgfkeys@collectkey@next{\pgfmanual@pretty@pgfkeys@loop}%
+ \else
+ \toks0=\expandafter{\the\toks0 #1}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgfmanual@pretty@pgfkeys@collectkey@next
+}%
+\def\pgfmanual@pretty@pgfkeys@collectvalue#1{%
+ \def\pgfmanual@loc@TMPb{#1}%
+ \let\pgfmanual@pretty@pgfkeys@collectvalue@next=\pgfmanual@pretty@pgfkeys@collectvalue
+ \ifx\pgfmanual@loc@TMPb\pgfmanual@EOI
+ % the key value is empty.
+ %\expandafter\pgfmanual@pretty@pgfkeys@processvalue\expandafter{\the\toks0 }%
+ \let\pgfmanual@pretty@pgfkeys@collectvalue@next=\relax
+ \else
+ \def\pgfmanual@pretty@isconsumed{0}%
+ \if\pgfmanual@pretty@pgfkeys@collectvalue@hasconsumedspaces0%
+ \ifnum13=\catcode`#1
+ % we found a white space (space, TAB or NL)
+ #1%
+ \def\pgfmanual@pretty@isconsumed{1}%
+ \else
+ \ifnum10=\catcode`#1
+ % another white space... I thought they'd have
+ % catcode 13. doesn't matter.
+ \def\pgfmanual@pretty@isconsumed{1}%
+ #1%
+ \fi
+ \fi
+ \fi
+ \if\pgfmanual@pretty@isconsumed0%
+ \def\pgfmanualprettyprinterhandlecollectedargsVtwo##1##2{\pgfmanual@pretty@pgfkeys@processvalue{##1}}% the braces will be handled separately.
+ \def\pgfmanual@pretty@pgfkeys@collectvalue@next{%
+ \pgfmanualprettyprintercollectupto,{\afterpgfmanual@pretty@collectargs@finish@value}#1%
+ }%
+ \fi
+ \fi
+ \pgfmanual@pretty@pgfkeys@collectvalue@next
+}%
+\def\afterpgfmanual@pretty@collectargs@finish@value{%
+ \pgfutil@ifnextchar\pgfmanual@EOI{%
+ \pgfmanual@pretty@pgfkeys@loop
+ }{%
+ \pgfmanual@pretty@pgfkeys@loop,% re-insert the gobbled comma here!
+ }%
+}%
+
+{\catcode`\^^M=13 \catcode`\ =13\relax\catcode`\%=13\relax\gdef\pgfmanual@pretty@restorespaces{\def%{\pgfmanual@pretty@percent}\def^^M{\pgfmanual@pretty@space}\def {\pgfmanual@pretty@space}}}
+
+% #1: the key's name
+\def\pgfmanual@pretty@pgfkeys@processkey#1{%
+ \begingroup
+ \pgfmanual@pretty@restorespaces
+ % remember this key name! It is used when we are dealing with
+ % its value later... (if it has a value)
+ \xdef\pgfmanual@pretty@pgfkeys@collectkey@keyname{#1}%
+ \endgroup
+ %
+ % check if it is a handled key. FIXME: this could be done in a
+ % rigorous way! This here assumes that all key handlers start with
+ % '.' and the '.' occurs never right after a '/' otherwise:
+ \def\pgfmanual@loc@TMPa{\pgfutil@in@{/.}}%
+ \expandafter\pgfmanual@loc@TMPa\expandafter{\pgfmanual@pretty@pgfkeys@collectkey@keyname}%
+ \ifpgfutil@in@
+ % split into key name and handler name...
+ \def\pgfmanual@pretty@splitit##1/.##2\relax{%
+ \def\pgfmanual@loc@TMPb{{##1}{.##2}}%
+ }%
+ \expandafter\pgfmanual@pretty@splitit\pgfmanual@pretty@pgfkeys@collectkey@keyname\relax
+ %
+ % report key name AND handler:
+ \def\pgfmanual@loc@TMPa{\pgfkeysvalueof{/codeexample/prettyprint/key name with handler/.@cmd}}%
+ \expandafter\pgfmanual@loc@TMPa\pgfmanual@loc@TMPb\pgfeov
+ \else
+ % report key name ...
+ \def\pgfmanual@loc@TMPa{\pgfkeysvalueof{/codeexample/prettyprint/key name/.@cmd}}%
+ \expandafter\pgfmanual@loc@TMPa\pgfmanual@pretty@pgfkeys@collectkey@keyname\pgfeov
+ \fi
+}
+\def\pgfmanual@pretty@pgfkeys@processvalue#1{%
+ % report or process the value, depending on the keyname.
+ % After all, it *may* be a style which needs to be pretty printed
+ % as well.
+ \pgfkeysifdefined{/codeexample/prettyprint/key value/\pgfmanual@pretty@pgfkeys@collectkey@keyname/.@cmd}{%
+ % oh, we have a separate routine for this macro! Ok, use it:
+ \edef\pgfmanual@loc@TMPb{\noexpand\pgfkeysvalueof{/codeexample/prettyprint/key value/\pgfmanual@pretty@pgfkeys@collectkey@keyname/.@cmd}}%
+ }{%
+ % use the generic routine:
+ \edef\pgfmanual@loc@TMPb{\noexpand\pgfkeysvalueof{/codeexample/prettyprint/key value/.@cmd}}%
+ }%
+ \edef\pgfmanual@loc@TMPa{{\pgfmanual@pretty@pgfkeys@collectkey@keyname}}%
+ \expandafter\pgfmanual@loc@TMPb\pgfmanual@loc@TMPa{#1}\pgfeov
+}
diff --git a/graphics/pgf/base/tex/pgfmanual.sty b/graphics/pgf/base/tex/pgfmanual.sty
new file mode 100644
index 0000000000..e084fd4183
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmanual.sty
@@ -0,0 +1,12 @@
+% Copyright 2009 by Till Tantau and Christian Feuersänger
+%
+% 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.
+
+\ProvidesPackage{pgfmanual}[2009/10/15]
+
+\input pgfmanual.code.tex
diff --git a/graphics/pgf/base/tex/pgfmath.code.tex b/graphics/pgf/base/tex/pgfmath.code.tex
new file mode 100644
index 0000000000..fb629421d5
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmath.code.tex
@@ -0,0 +1,26 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+
+% Guard against reading twice
+\ifx\pgfmathloaded\pgfutil@undefined
+ \let\pgfmathloaded=\relax
+\else
+ \expandafter\endinput
+\fi
+
+% We need keys:
+\ifx\pgfkeysloaded\pgfutil@undefined
+ \input pgfkeys.code.tex
+\fi
+
+\input pgfmathcalc.code.tex
+\input pgfmathfloat.code.tex
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmath.sty b/graphics/pgf/base/tex/pgfmath.sty
new file mode 100644
index 0000000000..f079db528e
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmath.sty
@@ -0,0 +1,13 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs,pgfkeys}
+\input{pgfmath.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmath.tex b/graphics/pgf/base/tex/pgfmath.tex
new file mode 100644
index 0000000000..b26fbc8c35
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmath.tex
@@ -0,0 +1,23 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+
+\ifx\pgfmathincluded\undefined
+\def\pgfmathincluded{}
+
+\edef\pgfmathatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfsys.tex
+\input pgfmath.code.tex
+\catcode`\@=\pgfmathatcode
+
+\fi
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmathcalc.code.tex b/graphics/pgf/base/tex/pgfmathcalc.code.tex
new file mode 100644
index 0000000000..58c51558c8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathcalc.code.tex
@@ -0,0 +1,542 @@
+% Copyright 2007 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.
+
+% This file loads all the parsing, functions and operator stuff
+%
+% Version 1.414213 29/9/2007
+
+\input pgfmathutil.code.tex
+\input pgfmathparser.code.tex
+\input pgfmathfunctions.code.tex
+%\input pgfmathbase.code.tex
+
+% \pgfmathsetlength, \pgfmathaddtolength
+%
+% #1 = dimension register
+% #2 = expression
+%
+% Description:
+%
+% These functions work similar to \setlength and \addtolength. Only,
+% they allow #2 to contain an expression, which is evaluated before
+% assignment. Furthermore, the font is setup before the assignment is
+% done, so that dimensions like 1em are evaluated correctly.
+%
+% If #2 starts with "+", then a simple assignment is done (but the
+% font is still setup). This is orders of magnitude faster than a
+% parsed assignment.
+
+\def\pgfmathsetlength#1#2{%
+ \expandafter\pgfmath@onquick#2\pgfmath@%
+ {%
+ % Ok, quick version:
+ \begingroup%
+ \pgfmath@selectfont%
+ #1#2\unskip%
+ \expandafter\endgroup%
+ \expandafter#1\the#1\relax%
+ }%
+ {%
+ \pgfmathparse{#2}%
+ \ifpgfmathmathunitsdeclared%
+ #1\pgfmathresult mu\relax%
+ \else%
+ #1\pgfmathresult pt\relax%
+ \fi%
+ }%
+ \ignorespaces%
+}
+
+% \pgfmathaddtolength
+%
+% Add to #1 the result of evaluating #2.
+%
+% #1 - a dimension register
+% #2 - an expression
+%
+\def\pgfmathaddtolength#1#2{%
+ \expandafter\pgfmath@onquick#2\pgfmath@%
+ {%
+ \begingroup%
+ \pgfmath@selectfont%
+ \advance#1#2\unskip%
+ \expandafter%
+ \endgroup%
+ \expandafter#1\the#1\relax%
+ }%
+ {%
+ \pgfmathparse{#2}%
+ \ifpgfmathmathunitsdeclared%
+ \advance#1\pgfmathresult mu\relax%
+ \else%
+ \advance#1\pgfmathresult pt\relax%
+ \fi%
+ }%
+ \ignorespaces%
+}
+
+% \pgfmathsetcount
+%
+% Assign #1 the truncated evaluation of #2.
+%
+% #1 - a count register
+% #2 - an expression
+%
+\def\pgfmathsetcount#1#2{%
+ \expandafter\pgfmath@onquick#2\pgfmath@%
+ {%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ #1#2\relax\pgfmath@%
+ }%
+ {%
+ \pgfmathparse{#2}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ #1\pgfmathresult\relax\pgfmath@%
+ }%
+ \ignorespaces%
+}
+
+% \pgfmathaddtocount
+%
+% Add to #1 the truncated evaluation of #2.
+%
+% #1 - a count register
+% #2 - an expression
+%
+\def\pgfmathaddtocount#1#2{%
+ \expandafter\pgfmath@onquick#2\pgfmath@%
+ {%
+ \edef\pgfmath@addtocounttemp{\the#1}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ #1#2\relax\pgfmath@%
+ \advance#1\pgfmath@addtocounttemp\relax%
+ }%
+ {%
+ \edef\pgfmath@addtocounttemp{\the#1}%
+ \pgfmathparse{#2}%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ #1\pgfmathresult\relax\pgfmath@%
+ \advance#1\pgfmath@addtocounttemp\relax%
+ }%
+ \ignorespaces%
+}
+
+% \pgfmathnewcounter
+%
+% LaTeX style counter which also works in plain TeX. Defines
+% \c@<name> as a count register and also defines \the<name>.
+%
+% #1 the name of the counter.
+%
+% Example:
+%
+% \pgfmathnewcounter{counter}
+% \pgfmathsetcounter{counter}{12}
+% \thecounter (same as \the\c@counter)
+%
+\def\pgfmathnewcounter#1{%
+ \expandafter\ifx\csname c@#1\endcsname\relax%
+ \def\pgfmath@marshal{\csname newcount\endcsname}% Ha! Who cares about \outer?
+ \expandafter\pgfmath@marshal\csname c@#1\endcsname%
+ \expandafter\def\csname the#1\endcsname{\expandafter\the\csname c@#1\endcsname}%
+ \fi%
+}
+
+% \pgfmathsetcounter
+%
+% Set the counter #1 to the evaluation of #2.
+%
+% #1 - a counter name
+% #2 - an expression
+%
+\def\pgfmathsetcounter#1#2{%
+ \expandafter\pgfmathsetcount\csname c@#1\endcsname{#2}%
+}
+
+% \pgfmathaddtocounter
+%
+% Add the counter #1 to the evaluation of #2.
+%
+% #1 - a counter name
+% #2 - an expression
+%
+\def\pgfmathaddtocounter#1#2{%
+ \expandafter\pgfmathaddtocount\csname c@#1\endcsname{#2}%
+}
+
+% \pgfmathmakecounterglobal
+%
+% Make the current value of a counter globally defined.
+%
+% #1 - a (valid) counter name.
+%
+\def\pgfmath@pgftext{pgf}
+\def\pgfmath@tikztext{tikz}
+\def\pgfmathmakecounterglobal#1{%
+ \pgfmath@ifundefined{c@#1}{}{%
+ \expandafter\pgfmath@in@\expandafter{\pgfmath@pgftext}{#1}%
+ \ifpgfmath@in@%
+ \else%
+ \expandafter\pgfmath@in@\expandafter{\pgfmath@tikztext}{#1}%
+ \ifpgfmath@in@%
+ \else%
+ \expandafter\global\csname c@#1\endcsname\csname c@#1\endcsname\relax%
+ \fi%
+ \fi%
+ }%
+}
+
+% \pgfmathsetmacro
+%
+% \edef#1 as the result of evaluating #2.
+%
+% #1 - a macro
+% #2 - an expression
+%
+\def\pgfmathsetmacro#1#2{%
+ \begingroup%
+ \pgfmathparse{#2}%
+ \let#1=\pgfmathresult
+ \pgfmath@smuggleone{#1}%
+ \endgroup%
+}
+
+% \pgfmathsetlengthmacro
+%
+% \edef#1 as the result of evaluating #2 with pt.
+%
+% #1 - a macro
+% #2 - an expression
+%
+\def\pgfmathsetlengthmacro#1#2{%
+ \begingroup%
+ \pgfmathsetlength\pgfmath@x{#2}%
+ \edef#1{\the\pgfmath@x}%
+ \pgfmath@smuggleone{#1}%
+ \endgroup%
+}
+
+% \pgfmathtruncatemacro
+%
+% \edef#1 as the truncated result of evaluating #2.
+%
+% #1 - a macro
+% #2 - an expression
+%
+\def\pgfmathtruncatemacro#1#2{%
+ \begingroup%
+ \pgfmathsetcount\c@pgfmath@counta{#2}%
+ \edef#1{\the\c@pgfmath@counta}%
+ \pgfmath@smuggleone{#1}%
+ \endgroup%
+}
+
+% Check whether a given parameter starts with quick.
+%
+% The command should be followed by nonempty text, ending with
+% \pgfmath@ as a stop-token. Then should follow
+%
+% #1 - code to execute if text starts with +
+% #2 - code to execute if text does not
+%
+% Example:
+%
+% \pgfmath@onquick+0pt\pgfmath@{is quick}{is slow}
+
+\def\pgfmath@onquick{%
+ \futurelet\pgfmath@next%
+ \pgfmath@@onquick}
+\def\pgfmath@@onquick#1\pgfmath@{%
+ \ifx\pgfmath@next+%
+ \let\pgfmath@next=\pgfmath@firstoftwo%
+ \else%
+ \let\pgfmath@next=\pgfmath@secondoftwo%
+ \fi%
+ \pgfmath@next%
+}
+
+% *** The following commands DO NOT WORK without the rest of PGF ***
+%
+% (a dumping ground for stuff that doesn't really belong anywhere else)
+
+% \pgfmathanglebetweenpoints
+%
+% Define \pgfmathresult as the angle between points #1 and #2
+% Should get the quadrants right as well.
+%
+\def\pgfmathanglebetweenpoints#1#2{%
+ \begingroup%
+ \pgf@process{\pgfpointdiff{#1}{#2}}%
+ \edef\pgf@marshall{\expandafter\noexpand\csname pgfmathatan2@\endcsname{\expandafter\Pgf@geT\the\pgf@y}{\expandafter\Pgf@geT\the\pgf@x}}%
+ \pgf@marshall%
+ \ifdim\pgfmathresult pt<0pt%
+ \pgfmathparse{\pgfmathresult+360}%
+ \fi%
+ \expandafter%
+ \endgroup\expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult}%
+}
+
+%
+% \pgfmathrotatepointaround
+%
+% Rotate point #1 about point #2 by #3 degrees.
+%
+\def\pgfmathrotatepointaround#1#2#3{%
+ \pgf@process{%
+ \pgf@process{#1}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@process{#2}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgf@xb\pgf@x%
+ \pgf@yb\pgf@y%
+ \pgf@x=\pgf@xc%
+ \pgf@y=\pgf@yc%
+ \advance\pgf@x-\pgf@xa%
+ \advance\pgf@y-\pgf@ya%
+ \pgfmathsetmacro\angle{#3}%
+ \pgfmathsin@{\angle}%
+ \let\sineangle\pgfmathresult%
+ \pgfmathcos@{\angle}%
+ \let\cosineangle\pgfmathresult%
+ \pgf@xa\cosineangle\pgf@x%
+ \advance\pgf@xa-\sineangle\pgf@y%
+ \pgf@ya\sineangle\pgf@x%
+ \advance\pgf@ya\cosineangle\pgf@y%
+ \pgf@x\pgf@xb%
+ \pgf@y\pgf@yb%
+ \advance\pgf@x\pgf@xa%
+ \advance\pgf@y\pgf@ya%
+ }%
+}
+
+% \pgfmathanglebetweenlines
+%
+% Calculate the clockwise angle between a line from point #1
+% to point #2 and a line from #3 to point #4.
+%
+\def\pgfmathanglebetweenlines#1#2#3#4{%
+ \begingroup%
+ \pgfmathanglebetweenpoints{#1}{#2}%
+ \let\firstangle\pgfmathresult%
+ \pgfmathanglebetweenpoints{#3}{#4}%
+ \let\secondangle\pgfmathresult%
+ \ifdim\firstangle pt>\secondangle pt\relax%
+ \pgfmathadd@{\secondangle}{360}%
+ \let\secondangle\pgfmathresult%
+ \fi%
+ \pgfmathsubtract@{\secondangle}{\firstangle}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% \pgfmathpointreflectalongaxis
+%
+% Reflects point #2 around an axis centered on #2 at an angle #3.
+%
+\def\pgfmathreflectpointalongaxis#1#2#3{%
+ \pgf@process{%
+ \pgfmathanglebetweenpoints{#2}{#1}%
+ \pgfmath@tempdima\pgfmathresult pt\relax%
+ \pgfmathparse{#3}%
+ \advance\pgfmath@tempdima-\pgfmathresult pt\relax%
+ \pgfmath@tempdima-2.0\pgfmath@tempdima%
+ \pgfmathrotatepointaround{#1}{#2}{\pgfmath@tonumber{\pgfmath@tempdima}}%
+ }%
+}
+
+
+
+% \pgfmathpointintersectionoflineandarc
+%
+% A bit experimental at the moment:
+%
+% Locates the point where a line crosses an eliptical arc. If the line
+% does not cross the arc, a meaningless point will result.
+%
+% #1 the point of the line on the "convex" side of the arc.
+% #2 the point of the line on the "concave" side of the arc.
+% #3 the center of the eliptical arc.
+% #4 start angle of the arc.
+% #5 end angle of the arc.
+% #6 radii of the arc.
+%
+\def\pgfmathpointintersectionoflineandarc#1#2#3#4#5#6{%
+ \pgf@process{%
+ %
+ % Get the required angle.
+ %
+ \pgfmathanglebetweenpoints{#2}{#1}%
+ \let\x\pgfmathresult%
+ %
+ % Get the radii of the arc.
+ %
+ \pgfmath@in@{and }{#6}%
+ \ifpgfmath@in@%
+ \pgf@polar@#6\@@%
+ \else%
+ \pgf@polar@#6 and #6\@@%
+ \fi%
+ \edef\xarcradius{\the\pgf@x}%
+ \edef\yarcradius{\the\pgf@y}%
+ %
+ % Get the start and end angles of the arc...
+ %
+ \pgfmathsetmacro\s{#4}%
+ \pgfmathsetmacro\e{#5}%
+ %
+ % ...and also with rounding.
+ %
+ \pgfmathmod@{\s}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\ss\pgfmathresult%
+ \pgfmathmod@{\e}{360}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathadd@{\pgfmathresult}{360}%
+ \fi%
+ \let\ee\pgfmathresult%
+ %
+ % Hackery for when arc straddles zero.
+ %
+ \ifdim\ee pt<\ss pt\relax%
+ \pgfmathadd@{\x}{180}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \let\x\pgfmathresult%
+ \fi%
+ \def\m{360}% Measure of nearness.
+ \pgfmathadd@{\s}{\e}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\n\pgfmathresult% The best estimate (default to middle of arc).
+ \pgfmathloop%
+ \pgfmathadd@{\s}{\e}%
+ \pgfmathdivide@{\pgfmathresult}{2}%
+ \let\p\pgfmathresult%
+ \ifdim\p pt=\s pt\relax%
+ \else%
+ \pgfmathanglebetweenpoints{#2}{%
+ \pgfpointadd{#3}{%
+ \pgf@x\xarcradius\relax%
+ \pgfmathcos@{\p}%
+ \pgf@x\pgfmathresult\pgf@x%
+ \pgf@y\yarcradius\relax%
+ \pgfmathsin@{\p}%
+ \pgf@y\pgfmathresult\pgf@y%
+ }%
+ }%
+ %
+ % Hackery for when arc straddles zero.
+ %
+ \ifdim\ee pt<\ss pt\relax%
+ \pgfmathadd@{\pgfmathresult}{180}%
+ \pgfmathmod@{\pgfmathresult}{360}%
+ \fi%
+ \let\q\pgfmathresult%
+ %
+ % More hackery...
+ %
+ \ifdim\x pt>335pt\relax%
+ \ifdim\q pt<45pt\relax%
+ \pgfmathadd@{\q}{360}%
+ \let\q\pgfmathresult%
+ \fi%
+ \fi%
+ \ifdim\x pt=\q pt% Found it!
+ \pgfmathbreakloop% Breaks after current iteration is complete.
+ \else
+ \ifdim\x pt<\q pt\relax%
+ \let\e\p%
+ \else%
+ \let\s\p%
+ \fi%
+ \fi%
+ \pgfmathsubtract@{\x}{\q}%
+ \pgfmathabs@{\pgfmathresult}%
+ %
+ % Save the estimate if it is better than any previous estimate.
+ %
+ \ifdim\pgfmathresult pt<\m pt\relax%
+ \let\m\pgfmathresult%
+ \let\n\p%
+ \fi%
+ \repeatpgfmathloop%
+ \pgfpointadd{#3}{\pgfpointpolar{\n}{\xarcradius and \yarcradius}}%
+ }%
+}
+
+% \pgfmathangleonellipse
+%
+% Find the angle corresponding to a point on the border of an ellispe.
+%
+% #1 - the point on the border.
+% #2 - the radii of the ellipse.
+%
+\def\pgfmathangleonellipse#1#2{%
+ \begingroup%
+ \pgfmath@in@{and }{#2}%
+ \ifpgfmath@in@%
+ \pgf@polar@#2\@@%
+ \else%
+ \pgf@polar@#2 and #2\@@%
+ \fi%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgf@process{#1}%
+ \ifdim\pgf@x=0pt\relax%
+ \pgfutil@tempdima1pt\relax%
+ \else%
+ \pgfutil@tempdima\pgf@x%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \fi%
+ \ifdim\pgf@y=0pt\relax%
+ \pgfutil@tempdima1pt\relax%
+ \else%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgf@y}}{\pgfmath@tonumber{\pgf@ya}}%
+ \pgfutil@tempdima\pgfmathresult\pgfutil@tempdima%
+ \pgfmathatan@{\pgfmath@tonumber{\pgfutil@tempdima}}%
+ \fi%
+ %
+ \pgfutil@tempdima\pgfmathresult pt\relax%
+ \ifdim\pgfutil@tempdima<0pt\relax%
+ \advance\pgfutil@tempdima360pt\relax%
+ \fi%
+ \ifdim\pgf@x<0pt\relax%
+ \ifdim\pgf@y=0pt\relax%
+ \pgfutil@tempdima180pt\relax%
+ \else%
+ \ifdim\pgf@y<0pt\relax%
+ \advance\pgfutil@tempdima180pt\relax%
+ \else%
+ \advance\pgfutil@tempdima-180pt\relax%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgf@x=0pt\relax%
+ \ifdim\pgf@y<0pt\relax%
+ \pgfutil@tempdima270pt\relax%
+ \else%
+ \pgfutil@tempdima90pt\relax%
+ \fi%
+ \else%
+ \ifdim\pgf@y=0pt\relax%
+ \pgfutil@tempdima0pt\relax%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@returnone\pgfutil@tempdima%
+ \endgroup%
+}
+
+
+% Local Variables:
+% tab-width: 2
+% End:
diff --git a/graphics/pgf/base/tex/pgfmathfloat.code.tex b/graphics/pgf/base/tex/pgfmathfloat.code.tex
new file mode 100644
index 0000000000..bda29cb51b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfloat.code.tex
@@ -0,0 +1,2674 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% 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.
+%
+% This file contains methods for basic floating point arithmetics, rounding
+% to arbitrary precision and number pretty printing.
+%
+
+
+\pgfkeys{
+ % The bug 3430171 (wrong minus sign spacing in pgfmathprintnumber)
+ % has been fixed in 2.10 CVS. Since it changes the spacing, its
+ % effects can be undone with this compatibility switch.
+ /pgf/compat/number printer/.is choice,
+ /pgf/compat/number printer/2.10/.code={%
+ \def\pgfmathprintnumber@begingroup{\bgroup}%
+ \def\pgfmathprintnumber@endgroup{\egroup}%
+ },
+ % I do not know the version number of the next release at this
+ % time. Please be so kind and KEEP THIS NAME INTACT. Add an alias
+ % if needed.
+ /pgf/compat/number printer/next after 2.10/.code={%
+ \def\pgfmathprintnumber@begingroup{\begingroup}%
+ \def\pgfmathprintnumber@endgroup{\endgroup}%
+ },
+ % activate the fix by default.
+ /pgf/compat/number printer/next after 2.10,%
+}
+
+
+\global\newif\ifpgfmathfloatcomparison
+\newif\ifpgfmathfloatroundhasperiod
+\newif\ifpgfmathprintnumberskipzeroperiod
+
+
+% used internally in grouped macros:
+\toksdef\pgfmathfloat@tmptoks=1
+\newif\ifpgfmathfloat@fixed@digits@after@period
+\newif\ifpgfmathfloatroundmayneedrenormalize
+\toksdef\pgfmathfloat@a@Mtok=0
+
+%% WARNING: avoid conflicting register names!
+\let\pgfmathfloat@a@S=\c@pgf@counta
+\let\pgfmathfloat@a@M=\pgf@xa
+\let\pgfmathfloat@a@E=\c@pgf@countb
+\let\pgfmathfloat@b@S=\c@pgf@countc
+\let\pgfmathfloat@b@M=\pgf@xb
+\let\pgfmathfloat@b@E=\c@pgf@countd
+
+% can be changed with options.
+\def\pgfmathfloat@round@precision{2}
+
+% I introduced this to access the "original" precision in case a
+% formatted changes it locally... in this case, the formatter may
+% overwrite \pgfmathfloat@round@precision@orig to provide the original
+% one.
+% The default implementation here does nothing:
+\def\pgfmathfloat@round@precision@orig{\pgfmathfloat@round@precision}%
+
+\gdef\pgfmathfloat@glob@TMP{}
+
+
+% Computes a normalised floating point representation for #1 of the
+% form
+% [FLAGS] MANTISSE EXPONENT
+% meaning
+% [+-]X.XXXXXXX*10^C
+% where
+% X.XXXXXX is a mantissa with first number != 0, C is an integer and
+% FLAGS contains the sign and some other special cases.
+%
+% This method does NOT use TeX Registers to represent the numbers! The
+% computation is COMPLETELY STRING BASED.
+% This allows numbers such at 10000000 or 5.23e-10 to be represented
+% properly, although TeX-registers would produce overflow/underflow
+% errors in these cases.
+%
+% It is to be used to compute logs, because log(X*10^Y) = log(X) + log(10)*Y
+%
+% Arguments:
+% #1: an arbitrary number which shall be parsed. Maybe a macro.
+% Examples:
+% [+-]XXXXX.XXXXXX
+% [+-]XXXXX.XXXXXXeXXXX
+% [+-]0.0000XXXXXX
+% [+-]0.0000XXXXXXeXXXX
+% [+-]inf
+% nan
+% Maybe a macro containing such a number.
+%
+% Return value:
+% \pgfmathresult will be \def'ed to
+% FLAGS MANTISSE 'e' EXPONENT
+% where
+% FLAGS is a number in [0-5] where
+% 0 == '0' (the number is +- 0.0),
+% 1 == '+',
+% 2 == '-',
+% 3 == 'not a number'
+% 4 == '+ infinity'
+% 5 == '- infinity'
+%
+% MANTISSE is a normalised number 1 <= M < 10. It always contains a
+% period and at least one digit after the period.
+%
+% EXPONENT is an integer value.
+%
+% Example:
+% \pgfmathfloatparsenumber{1}
+% -> \pgfmathresult = 11.0e0
+% \pgfmathfloatparsenumber{141.212}
+% -> \pgfmathresult = 11.41212e2
+\def\pgfmathfloatparsenumber#1{%
+ \begingroup
+ \edef\pgfmathresult{#1}%
+ \expandafter\pgfflt@impl\pgfmathresult\pgfflt@EOI
+ \ifpgfmathfloatparsenumberpendingperiod
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok.0}%
+ \fi
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+% The same as \pgfmathfloatparsenumber, but does not perform sanity checking.
+% FIXME: there is no longer any difference here.
+\let\pgfmathfloatqparsenumber=\pgfmathfloatparsenumber
+
+% Takes a floating point number #1 as input and writes flags to count
+% register #2, mantissa to dimen register #3 and exponent to count
+% register #4.
+\def\pgfmathfloattoregisters#1#2#3#4{%
+ \expandafter\pgfmathfloat@decompose#1\relax{#2}{#3}{#4}%
+}
+
+% the same, but writes the mantissa into a token register.
+\def\pgfmathfloattoregisterstok#1#2#3#4{%
+ \expandafter\pgfmathfloat@decompose@tok#1\relax{#2}{#3}{#4}%
+}
+
+% Extracts the flags of #1 into the count register #2.
+\def\pgfmathfloatgetflags#1#2{%
+ \expandafter\pgfmathfloat@decompose@F#1\relax{#2}%
+}
+% Extracts the flags of #1 into the macro #2.
+\def\pgfmathfloatgetflagstomacro#1#2{%
+ \expandafter\pgfmathfloat@decompose@Fmacro#1\relax{#2}%
+}%
+
+% Extracts the mantissa of #1 into the dimen register #2.
+\def\pgfmathfloatgetmantissa#1#2{%
+ \expandafter\pgfmathfloat@decompose@M#1\relax{#2}%
+}
+\let\pgfmathfloatgetmantisse=\pgfmathfloatgetmantissa
+% Extracts the mantissa of #1 into the token register #2.
+\def\pgfmathfloatgetmantissatok#1#2{%
+ \expandafter\pgfmathfloat@decompose@Mtok#1\relax{#2}%
+}
+\let\pgfmathfloatgetmantissetok=\pgfmathfloatgetmantissatok
+% Extracts the exponent of #1 into the count register #2.
+\def\pgfmathfloatgetexponent#1#2{%
+ \expandafter\pgfmathfloat@decompose@E#1\relax{#2}%
+}
+
+
+% Assigns \pgfmathresult to be a float encoded as
+% <FLAGS><MANTISSE>e<EXPONENT>
+%
+% example:
+% \pgfmathfloatcreate{1}{2.0}{10}
+% \pgfmathfloat@to@FMeE@style\pgfmathresult
+% ->
+% \pgfmathresult is now '12.0e10' regardless of the internal float
+% format.
+\def\pgfmathfloat@to@FMeE@style#1{\expandafter\pgfmathfloat@to@FMeE@style@#1\relax\relax}%
+\def\pgfmathfloat@to@FMeE@style@#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@to@FMeE@style@@%
+ \else
+ \expandafter\pgfmathfloat@to@FMeE@style@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@to@FMeE@style@@#1Y#2e#3]\relax\relax{\def\pgfmathresult{#1#2e#3}}%
+\def\pgfmathfloat@to@FMeE@style@error#1\relax\relax{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{%
+ \noexpand\pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ }%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+
+
+% decomposes a lowlevel floating point representation into flags,
+% mantissa and exponent.
+%
+% #4: integer register for the flags.
+% #5: dimen registers for the mantissa.
+% #6: integer register for the exponent.
+%
+% \expandafter\pgfmathfloat@decompose\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@M\pgfmathfloat@a@E
+% -> the three temp registers contain flags, mantissa and exponent
+\def\pgfmathfloat@decompose#1#2{% sanitize!
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@%
+ \else
+ \expandafter\pgfmathfloat@decompose@error%
+ \fi
+ #1#2%
+}
+\def\pgfmathfloat@decompose@#1Y#2e#3]\relax#4#5#6{%
+ #4=#1\relax
+ #5=#2pt % keep space here.
+ #6=#3\relax%
+}
+
+% overloaded, #5 needs to be a token register for the mantissa.
+% @see also \pgfmathfloatvalueof which does also employ the load
+% level repr.
+% \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+% -> the three temp registers contain flags, mantissa and exponent
+\def\pgfmathfloat@decompose@tok#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@tok@%
+ \else
+ \expandafter\pgfmathfloat@decompose@tok@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@decompose@tok@#1Y#2e#3]\relax#4#5#6{%
+ #4=#1\relax
+ #5={#2}%
+ #6=#3\relax%
+}
+% overloaded, returns only ONE of the three components into #4:
+% \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S
+% -> \pgfmathfloat@a@S contains the flags field.
+\def\pgfmathfloat@decompose@F#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@F@%
+ \else
+ \expandafter\pgfmathfloat@decompose@F@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@decompose@Fmacro#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@Fmacro@%
+ \else
+ \expandafter\pgfmathfloat@decompose@F@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@decompose@M#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@M@%
+ \else
+ \expandafter\pgfmathfloat@decompose@M@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@decompose@E#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@E@%
+ \else
+ \expandafter\pgfmathfloat@decompose@E@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@decompose@Mtok#1#2{%
+ \ifx#2Y%
+ \expandafter\pgfmathfloat@decompose@Mtok@%
+ \else
+ \expandafter\pgfmathfloat@decompose@Mtok@error%
+ \fi
+ #1#2%
+}%
+\def\pgfmathfloat@decompose@F@#1Y#2e#3]\relax#4{#4=#1\relax}%
+\def\pgfmathfloat@decompose@Fmacro@#1Y#2e#3]\relax#4{\def#4{#1}}%
+\def\pgfmathfloat@decompose@M@#1Y#2e#3]\relax#4{#4=#2pt}%
+\def\pgfmathfloat@decompose@Mtok@#1Y#2e#3]\relax#4{#4={#2}}%
+\def\pgfmathfloat@decompose@E@#1Y#2e#3]\relax#4{#4=#3\relax}%
+
+\def\pgfmathfloat@decompose@error#1\relax#2#3#4{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{%
+ \noexpand#2=\the\pgfmathfloat@a@S\space
+ \noexpand#3=\the\pgfmathfloat@a@Mtok pt
+ \noexpand#4=\the\pgfmathfloat@a@E\space
+ }%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+\def\pgfmathfloat@decompose@tok@error#1\relax#2#3#4{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{%
+ \noexpand#2=\the\pgfmathfloat@a@S\space
+ \noexpand#3={\the\pgfmathfloat@a@Mtok}%
+ \noexpand#4=\the\pgfmathfloat@a@E\space
+ }%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+\def\pgfmathfloat@decompose@F@error#1\relax#2{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{\noexpand#2=\the\pgfmathfloat@a@S\space}%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+\def\pgfmathfloat@decompose@M@error#1\relax#2{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{\noexpand#2=\the\pgfmathfloat@a@Mtok pt }%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+\def\pgfmathfloat@decompose@Mtok@error#1\relax#2{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{\noexpand#2={\the\pgfmathfloat@a@Mtok}}%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+\def\pgfmathfloat@decompose@E@error#1\relax#2{%
+ \begingroup
+ \pgfmathfloatparsenumber@handleerror{wrong lowlevel format}{#1}{#1}%
+ \xdef\pgfmathfloat@decompose@TMP{\noexpand#2=\the\pgfmathfloat@a@E\space}%
+ \endgroup
+ \pgfmathfloat@decompose@TMP
+}%
+% Takes a floating point number #1 as input and writes flags to macro
+% #2, mantissa to macro #3 and exponent to macro #4.
+\def\pgfmathfloattomacro#1#2#3#4{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \xdef\pgfmathfloat@glob@TMP{%
+ \noexpand\def\noexpand#2{\the\pgfmathfloat@a@S}%
+ \noexpand\def\noexpand#3{\the\pgfmathfloat@a@Mtok}%
+ \noexpand\def\noexpand#4{\the\pgfmathfloat@a@E}%
+ }%
+ \endgroup
+ \pgfmathfloat@glob@TMP
+}
+
+
+% Defines \pgfmathresult as the floating point number encoded by
+% the flags #1, mantissa #2 and exponent #3.
+%
+% All arguments are characters and will be expanded using '\edef'.
+\def\pgfmathfloatcreate#1#2#3{%
+ \edef\pgfmathresult{#1Y#2e#3]}%
+}%
+% This is the character present in any low-level floating point
+% number. It is assumed to be the SECOND character of a float (after
+% the flags integer).
+\def\pgfmathfloat@POSTFLAGSCHAR{Y}
+
+
+
+% Converts a composed floating point representation to fixed point.
+%
+% Example:
+% \pgfmathfloattofixed{142e1}
+% -> \pgfmathresult = 42.0
+\def\pgfmathfloattofixed@#1{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S
+ \def\pgfmathresult{0.0}%
+ \or
+ \expandafter\pgfmathfloattofixed@impl\the\pgfmathfloat@a@Mtok\relax
+ \or
+ \expandafter\pgfmathfloattofixed@impl\the\pgfmathfloat@a@Mtok\relax
+ \pgfmathfloat@a@Mtok=\expandafter{\pgfmathresult}%
+ \edef\pgfmathresult{-\the\pgfmathfloat@a@Mtok}%
+ \or\def\pgfmathresult{nan}%
+ \or\def\pgfmathresult{inf}%
+ \or\def\pgfmathresult{-inf}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+\let\pgfmathfloattofixed=\pgfmathfloattofixed@
+
+% Converts a float to an integer (in integer format).
+%
+% @see \pgfmathfloatint
+\def\pgfmathfloattoint#1{%
+ \pgfmathfloattofixed{#1}%
+ \expandafter\pgfmathfloattoint@@\pgfmathresult\relax
+}%
+\def\pgfmathfloattoint@@#1.#2\relax{%
+ \def\pgfmathresult{#1}%
+}%
+
+% Converts a floating point number to scientific format 1.234e5.
+%
+% This operation is very fast.
+\def\pgfmathfloattosci@#1{%
+ \begingroup
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifcase\pgfmathfloat@a@S
+ \def\pgfmathresult{0.0e0}%
+ \or
+ \edef\pgfmathresult{\the\pgfmathfloat@a@Mtok e\the\pgfmathfloat@a@E}%
+ \or
+ \edef\pgfmathresult{-\the\pgfmathfloat@a@Mtok e\the\pgfmathfloat@a@E}%
+ \or\def\pgfmathresult{nan}%
+ \or\def\pgfmathresult{inf}%
+ \or\def\pgfmathresult{-inf}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\let\pgfmathfloattosci=\pgfmathfloattosci@
+
+% Expands a floating point number to scientific format 1.234e5.
+%
+% This operation is very fast.
+\def\pgfmathfloatvalueof#1{\expandafter\pgfmathfloatvalueof@@#1@@}%
+
+% Make it fool proof such that the following arguments work:
+% \pgfmathfloatvalueof{1Y1.0e1} -> 1.0e1
+% \pgfmathfloatvalueof{2Y1.0e1} -> -1.0e1
+% and wrong arguments as well:
+% \pgfmathfloatvalueof{1} -> 1
+% \pgfmathfloatvalueof{1e2} -> 1e2
+\def\pgfmathfloatvalueof@@#1#2{%
+ \if#2Y%
+ % keep in mind that \pgfmathfloatvalueof should be expandable!
+ % We must not use \let here. Let's hope that #1 and #2 are
+ % single tokens (not something which was enclosed by curly
+ % braces...)
+ \expandafter\pgfmathfloatvalueof@@@\expandafter#1\expandafter#2%
+ \else
+ % Oh - no float!? Ok, we cannot report errors in this context.
+ % So: make it a feature and return the input argument as-is.
+ % Might be useful, in fact...
+ \expandafter\pgfmathfloatvalueof@abort\expandafter#1\expandafter#2%
+ \fi
+}
+\def\pgfmathfloatvalueof@@@#1Y#2e#3]@@{%
+ \ifcase#1 %
+ 0.0e0%
+ \or
+ #2e#3%
+ \or
+ -#2e#3%
+ \or nan%
+ \or inf%
+ \or -inf%
+ \fi
+}%
+\def\pgfmathfloatvalueof@abort#1@@{#1}%
+
+
+
+% Rounds a fixed point number #1 to \pgfmathfloat@round@precision digits precision and returns
+% the result into \pgfmathresult.
+%
+% Any trailing zeros after the period are discarded.
+% See \pgfmathroundtozerofill if you want trailing zeros and fixed
+% width.
+%
+% This method is PURELY text based and can work with arbitrary
+% precision (well, limited to TeX's stack size and integer size).
+%
+% Examples:
+% \pgfmathroundto{1}
+% -> \pgfmathresult = '1'
+%
+% \pgfmathroundto{19999.9996}
+% -> \pgfmathresult = '20000'
+%
+% Arguments:
+% #1 may be either a number or a macro (\pgfmathresult is allowed) expanding to a number.
+%
+% SIDE EFFECT: the global variable \ifpgfmathfloatroundhasperiod will be set.
+\def\pgfmathroundto#1{%
+ \pgfmathfloatroundhasperiodtrue
+ \begingroup
+ \pgfmathfloat@fixed@digits@after@periodfalse
+ \pgfmathroundto@impl{#1}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+
+% Overloaded method.
+%
+% This variant always uses a FIXED number behind the period and fills
+% in zeros if necessary.
+% Examples:
+% \pgfmathroundtozerofill{1}
+% -> \pgfmathresult = '1.00'
+%
+% \pgfmathroundtozerofill{19999.9996}
+% -> \pgfmathresult = '20000.00'
+%
+% SIDE EFFECT: the global variable \ifpgfmathfloatroundhasperiod will be set.
+\def\pgfmathroundtozerofill#1{%
+ \pgfmathfloatroundhasperiodtrue
+ \begingroup
+ \pgfmathfloat@fixed@digits@after@periodtrue
+ \pgfmathroundto@impl{#1}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+% see \pgfmathprintnumber@fixed@style for docs
+\def\pgfmathprintnumber@fixed@styleDEFAULT#1#2#3e#4\relax{%
+ \begingroup
+ \pgfkeysgetvalue{/pgf/number format/set decimal separator}\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP
+ \pgfkeysgetvalue{/pgf/number format/@dec sep mark}\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK
+ \pgfkeysgetvalue{/pgf/number format/set thousands separator}\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP
+ \c@pgf@counta=#4\relax % it is the exponent here.
+ \ifnum#2=0
+ \c@pgf@counta=0
+ \fi
+ \def\pgfmathresult{}%
+ \ifpgfmathfloatroundhasperiod
+ \expandafter\pgfmathprintnumber@fixed@styleDEFAULT@impl@period#1\pgfmathfloat@EOI
+ \else
+ \expandafter\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod#1\pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI%
+ \begingroup
+ \toks0=\expandafter{\pgfmathresult}%
+ \toks1=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 }%
+ \endgroup
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@period#1.#2\pgfmathfloat@EOI{%
+ \ifpgfmathprintnumberskipzeroperiod
+ \def\pgfmathfloat@loc@TMPb{#1}%
+ \ifx\pgfmathfloatparsenumber@tok@ZERO\pgfmathfloat@loc@TMPb
+ \else
+ \def\pgfmathfloat@loc@TMPc{-0}%
+ \ifx\pgfmathfloat@loc@TMPc\pgfmathfloat@loc@TMPb
+ \def\pgfmathresult{-}%
+ \else
+ \def\pgfmathfloat@loc@TMPc{+0}%
+ \ifx\pgfmathfloat@loc@TMPc\pgfmathfloat@loc@TMPb
+ \def\pgfmathresult{+}%
+ \else
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod#1\pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI
+ \fi
+ \fi
+ \fi
+ \else
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod#1\pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI
+ \fi
+ \ifpgfmathprintnumber@thousand@sep@in@fractional
+ \let\pgfmathresultfractional\pgfutil@empty%
+ \pgfmathprintnumber@thousand@sep@in@fractional#2MMMM\@@
+ \else
+ \def\pgfmathresultfractional{#2}%
+ \fi
+ \begingroup
+ \toks0=\expandafter{\pgfmathresult}%
+ \toks1=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK}%
+ \toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP}%
+ \toks3=\expandafter{\pgfmathresultfractional}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 \the\toks3 }%
+ \endgroup
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+}%
+
+% assigns \pgfmathresult such that it contains the formatted result.
+% It assumes that none of the following tokens contains a period.
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod{%
+ \ifx\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP\pgfutil@empty
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall}%
+ \else
+ \ifnum\c@pgf@counta<0\relax % exponent of the number in this context
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall}%
+ \else
+ \ifnum\c@pgf@counta<\pgfkeysvalueof{/pgf/number format/min exponent for 1000 sep}\relax
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall}%
+ \else
+ \advance\c@pgf@counta by1 % counta:= total number of digits, N.
+ \c@pgf@countb=\c@pgf@counta
+ \divide\c@pgf@countb by3 % countb := N DIV 3
+ \c@pgf@countc=\c@pgf@countb
+ \multiply\c@pgf@countc by3
+ \advance\c@pgf@counta by-\c@pgf@countc% now counta := N MOD 3
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printsign
+ }%
+ \fi
+ \fi
+ \fi
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT
+}
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printsign#1{%
+ \def\pgfmathfloat@loc@TMPb{#1}%
+ \ifx\pgfmathfloat@loc@TMPb\pgfmathfloatparsenumber@tok@MINUS
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1}%
+ \let\pgfmathfloat@loc@TMPb=\pgfutil@empty
+ \else
+ \ifx\pgfmathfloat@loc@TMPb\pgfmathfloatparsenumber@tok@PLUS
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1}%
+ \let\pgfmathfloat@loc@TMPb=\pgfutil@empty
+ \else
+ \ifpgfmathprintnumber@showpositive
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult +}%
+ \fi
+ \fi
+ \fi
+ \ifnum\c@pgf@counta>0 % \c@pgf@counta = N MOD 3 in this context
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \expandafter\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printtrailingdigits\pgfmathfloat@loc@TMPb
+ }%
+ \else
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \expandafter\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird\pgfmathfloat@loc@TMPb
+ }%
+ \fi
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT
+}
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printtrailingdigits#1#2{%
+ \ifcase\c@pgf@counta % = N MOD 3 in this context
+ % does not happen per construction
+ \or
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1}%
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird#2%
+ }%
+ \or
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1#2}%
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird%
+ }%
+ \fi
+ \ifnum\c@pgf@countb>0\relax % \c@pgf@countb = N DIV 3 in this context
+ \begingroup
+ \toks0=\expandafter{\pgfmathresult}%
+ \toks1=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 }%
+ \endgroup
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+ \fi
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT
+}
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird#1#2#3{%
+ \ifnum\c@pgf@countb>0\relax
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1#2#3}%
+ \advance\c@pgf@countb by-1
+ \ifnum\c@pgf@countb>0\relax
+ \begingroup
+ \toks0=\expandafter{\pgfmathresult}%
+ \toks1=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 }%
+ \endgroup
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+ \fi
+ \def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT{%
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@counteverythird%
+ }%
+ \else
+ % in this case, #1#2#3 are expected to be
+ % \pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI
+ %--------------------------------------------------
+ % \def\pgfmathfloat@loc@TMPb{\pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI}%
+ % \def\pgfmathfloat@loc@TMPc{#1#2#3}%
+ % \ifx\pgfmathfloat@loc@TMPc\pgfmathfloat@loc@TMPb
+ % \else
+ % \pgfmath@error{INTERNAL ERROR in fixed style - The input sequence did not terminate as expected; which indicates a wrong exponent argument provided to \string\pgfmathprintnumber@fixed@style}{}%
+ % \fi
+ %--------------------------------------------------
+ \let\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT=\relax
+ \fi
+ \pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@NEXT
+}
+
+% \pgfmathprintnumber@thousand@sep@in@fractional 01234525MMMM\@@
+% ->
+% 012<sep>345<sep>25
+\def\pgfmathprintnumber@thousand@sep@in@fractional#1#2#3#4{%
+ \if#4M%
+ % Ok, no further separator
+ \def\pgfmathprint@next{\pgfmathprintnumber@thousand@sep@in@fractional@finish#1#2#3#4}%
+ \else
+ \begingroup
+ \toks0=\expandafter{\pgfmathresultfractional}%
+ \toks1={#1#2#3}%
+ \toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@THOUSAND@SEP}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 }%
+ \endgroup
+ \let\pgfmathresultfractional=\pgfmathfloat@glob@TMP
+ \def\pgfmathprint@next{\pgfmathprintnumber@thousand@sep@in@fractional#4}%
+ \fi
+ \pgfmathprint@next
+}%
+\def\pgfmathprintnumber@thousand@sep@in@fractional@finish#1M{%
+ \expandafter\def\expandafter\pgfmathresultfractional\expandafter{\pgfmathresultfractional #1}%
+ \pgfmathprintnumber@thousand@sep@in@fractional@finish@
+}%
+\def\pgfmathprintnumber@thousand@sep@in@fractional@finish@#1\@@{}%
+
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall#1{%
+ \def\pgfmathfloat@loc@TMPb{#1}%
+ \let\pgfmathfloat@loc@TMPc=\pgfutil@empty
+ \ifx\pgfmathfloat@loc@TMPb\pgfmathfloatparsenumber@tok@MINUS
+ \else
+ \ifx\pgfmathfloat@loc@TMPb\pgfmathfloatparsenumber@tok@PLUS
+ \else
+ \ifpgfmathprintnumber@showpositive
+ \def\pgfmathfloat@loc@TMPc{+}%
+ \fi
+ \fi
+ \fi
+ \expandafter\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall@\pgfmathfloat@loc@TMPc#1%
+}
+\def\pgfmathprintnumber@fixed@styleDEFAULT@impl@noperiod@printall@#1\pgfmathfloat@EOI\pgfmathfloat@EOI\pgfmathfloat@EOI{%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult #1}%
+}%
+
+% @deprecated. It has been replaced by \pgfmathprintnumber@fixed@styleDEFAULT
+% #1 maybe a macro
+\def\pgfmathprintnumber@fixed@stylePERIOD#1#2#3e#4\relax{%
+ \def\pgfmathresult{#1}%
+}
+
+% @deprecated. It has been replaced by \pgfmathprintnumber@fixed@styleDEFAULT
+% #1 maybe a macro
+\def\pgfmathprintnumber@fixed@styleCOMMA#1#2#3e#4\relax{%
+ \ifpgfmathfloatroundhasperiod
+ \expandafter\pgfmathprintnumber@fixed@styleCOMMA@impl#1\pgfmathfloat@EOI
+ \else
+ \def\pgfmathresult{#1}%
+ \fi
+}
+\def\pgfmathprintnumber@fixed@styleCOMMA@impl#1.#2\pgfmathfloat@EOI{\def\pgfmathresult{#1{,}#2}}
+
+% The default style to display fixed point numbers.
+%
+% It does not apply numerics, but it is responsible for typesetting the
+% rounded number.
+% It can access the \ifpgfmathfloatroundhasperiod boolean.
+%
+% Arguments:
+% #1#2#3e#4\relax
+
+% Input:
+% #1 the fixed point number to be displayed (maybe a macro).
+% #2#3e#4: the (possibly unformatted) floating point representation
+% which belongs to #1. This format is returned (only!) by
+% \pgfmathfloat@to@FMeE@style.
+% It is used to determine sign and exponent.
+\let\pgfmathprintnumber@fixed@style=\pgfmathprintnumber@fixed@styleDEFAULT
+
+
+% Rounds a normalized floating point number to \pgfmathfloat@round@precision
+% digits precision and writes the result to \pgfmathresult.
+%
+% This method uses \pgfmathroundto for the mantissa.
+%
+% @see pgfmathfloatroundzerofill
+%
+% SIDE EFFECT: the global variable \ifpgfmathfloatroundhasperiod will be set to
+% whether the final mantissa #5 has a period or not.
+\def\pgfmathfloatround#1{%
+ \pgfmathfloatroundhasperiodtrue
+ \begingroup
+ \pgfmathfloat@fixed@digits@after@periodfalse
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \pgfmathfloatround@impl
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+% Overload.
+%
+% This method uses a fixed width for the mantissa and fills in zeros
+% if necessary.
+%
+% This method uses \pgfmathroundtozerofill for the mantissa.
+%
+% SIDE EFFECT: the global variable \ifpgfmathfloatroundhasperiod will be set to
+% whether the final mantissa #5 has a period or not.
+\def\pgfmathfloatroundzerofill#1{%
+ \pgfmathfloatroundhasperiodtrue
+ \begingroup
+ \pgfmathfloat@fixed@digits@after@periodtrue
+ \expandafter\pgfmathfloat@decompose@tok#1\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \pgfmathfloatround@impl
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+\newif\ifpgfmathfloatround@allow@empty@mantissa
+\def\pgfmathfloatround@mantissa@ONE{1pt }%
+
+% #1: sign
+% #2: mantissa
+% #3: exponent
+% #4: CODE to display if the mantissa is drawn.
+% This code will be shown just before the exponent.
+% Example: #4=\cdot
+% #5: CODE to display if the mantissa is NOT draw. (unused currently)
+% Might be used to display '10^1' instead of '1*10^1'.
+% #6: CODE to display the exponent.
+\def\pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax#4#5#6{%
+ \pgfkeysgetvalue{/pgf/number format/@sci exponent mark}\pgfmathfloatrounddisplaystyle@e@mark
+ \ifcase#1\relax
+ \pgfmathprintnumber@fixed@style{#2}#1#2e0\relax%
+ \expandafter\pgfmathfloatrounddisplaystyle@shared@impl@\expandafter{\pgfmathresult}{#4#6}%
+ \or
+ \def\pgfmathfloat@loc@TMPa{1}% "should draw mantissa=1"
+ \ifpgfmathfloatround@allow@empty@mantissa
+ \else
+ \ifdim#2pt=\pgfmathfloatround@mantissa@ONE
+ \def\pgfmathfloat@loc@TMPa{0}% do not draw it.
+ \fi
+ \fi
+ %
+ \if1\pgfmathfloat@loc@TMPa
+ \pgfmathprintnumber@fixed@style{#2}#1#2e0\relax%
+ \expandafter\pgfmathfloatrounddisplaystyle@shared@impl@\expandafter{\pgfmathresult}{#4#6}%
+ \else
+ \def\pgfmathfloat@loc@TMPa{0}%
+ \pgfmathfloatrounddisplaystyle@shared@impl@{#5}{#6}%
+ \fi
+ \or
+ \def\pgfmathfloat@loc@TMPa{1}% "should draw mantissa=1"
+ \ifpgfmathfloatround@allow@empty@mantissa
+ \else
+ \ifdim#2pt=\pgfmathfloatround@mantissa@ONE
+ \def\pgfmathfloat@loc@TMPa{0}% do not draw it.
+ \fi
+ \fi
+ %
+ \if1\pgfmathfloat@loc@TMPa
+ \pgfmathprintnumber@fixed@style{-#2}#1#2e0\relax%
+ \expandafter\pgfmathfloatrounddisplaystyle@shared@impl@\expandafter{\pgfmathresult}{#4#6}%
+ \else
+ \def\pgfmathfloat@loc@TMPa{0}%
+ \pgfmathfloatrounddisplaystyle@shared@impl@{-#5}{#6}%
+ \fi
+ \or
+ \pgfmathfloatrounddisplaystyle@shared@impl@@{\hbox{NaN}}{}%
+ \or
+ \ifpgfmathprintnumber@showpositive
+ \pgfmathfloatrounddisplaystyle@shared@impl@@{+\infty}{}%
+ \else
+ \pgfmathfloatrounddisplaystyle@shared@impl@@{\infty}{}%
+ \fi
+ \or
+ \pgfmathfloatrounddisplaystyle@shared@impl@@{-\infty}{}%
+ \fi
+}
+
+% #1: the part before the exponent code
+% #2: the part for the exponent code.
+\def\pgfmathfloatrounddisplaystyle@shared@impl@#1#2{%
+ \pgfmathprintnumber@begingroup
+ \toks0={#1}%
+ \toks1=\expandafter{\pgfmathfloatrounddisplaystyle@e@mark #2}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 }%
+ \pgfmathprintnumber@endgroup
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+}%
+% Same as \pgfmathfloatrounddisplaystyle@shared@impl@, but it also
+% inserts the '@dec sep mark' at the end.
+\def\pgfmathfloatrounddisplaystyle@shared@impl@@#1#2{%
+ \pgfmathprintnumber@begingroup
+ \toks0={#1}%
+ \toks1=\expandafter{\pgfmathfloatrounddisplaystyle@e@mark #2}%
+ \pgfkeysgetvalue{/pgf/number format/@dec sep mark}\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK
+ \toks2=\expandafter{\pgfmathprintnumber@fixed@styleDEFAULT@DEC@SEP@MARK}%
+ \xdef\pgfmathfloat@glob@TMP{\the\toks0 \the\toks1 \the\toks2 }%
+ \pgfmathprintnumber@endgroup
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+}
+
+\def\pgfmathfloatrounddisplaystyle@std#1#2e#3\relax{%
+ \pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax{\cdot}{}{10^{#3}}%
+}
+\def\pgfmathfloatrounddisplaystyle@subscript#1#2e#3\relax{%
+ \pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax{}{1}{_{#3}}%
+}
+\def\pgfmathfloatrounddisplaystyle@superscript#1#2e#3\relax{%
+ \pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax{}{1}{^{#3}}%
+}
+\def\pgfmathfloatrounddisplaystyle@e#1#2e#3\relax{%
+ \ifnum#3<0\relax
+ \pgfmathprintnumber@begingroup
+ \count0=#3\relax
+ \multiply\count0 by-1
+ \xdef\pgfmathfloat@glob@TMP{e{-}\the\count0}%
+ \pgfmathprintnumber@endgroup%
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+ \else
+ \def\pgfmathresult{e{+}#3}%
+ \fi
+ \def\pgfmathfloat@loc@TMPb{\pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax{}{1}}%
+ \expandafter\pgfmathfloat@loc@TMPb\expandafter{\pgfmathresult}%
+}
+\def\pgfmathfloatrounddisplaystyle@E#1#2e#3\relax{%
+ \ifnum#3<0\relax
+ \pgfmathprintnumber@begingroup
+ \count0=#3\relax
+ \multiply\count0 by-1
+ \xdef\pgfmathfloat@glob@TMP{E{-}\the\count0}%
+ \pgfmathprintnumber@endgroup%
+ \let\pgfmathresult=\pgfmathfloat@glob@TMP
+ \else
+ \def\pgfmathresult{E{+}#3}%
+ \fi
+ \def\pgfmathfloat@loc@TMPb{\pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\relax{}{1}}%
+ \expandafter\pgfmathfloat@loc@TMPb\expandafter{\pgfmathresult}%
+}
+
+\def\pgfmathfloatrounddisplaystyle@generic#1#2e#3\relax{%
+ \begingroup
+ \pgfkeysvalueof {/pgf/number format/sci generic/@/.@cmd}{#3}{#1}{#2}\pgfeov
+ \pgfkeysgetvalue{/pgf/number format/sci generic/mantissa sep}\pgfmathdisplay@aftermantissa
+ \pgfkeysgetvalue{/pgf/number format/sci generic/empty mantissa sep}\pgfmathdisplay@nomantissa
+ \pgfkeysgetvalue{/pgf/number format/sci generic/exponent}\pgfmathdisplay@e
+ \toks0=\expandafter{\pgfmathdisplay@aftermantissa}%
+ \toks1=\expandafter{\pgfmathdisplay@nomantissa}%
+ \toks2=\expandafter{\pgfmathdisplay@e}%
+ \xdef\pgfmathfloat@glob@TMP{\noexpand\pgfmathfloatrounddisplaystyle@shared@impl#1#2e#3\noexpand\relax{\the\toks0}{\the\toks1}{\the\toks2}}%
+ \endgroup
+ \pgfmathfloat@glob@TMP
+}
+
+% A macro which takes the argument '<SIGN><MANTISSE>e<EXPONENT>' and
+% expands to the final TeX-representation for that floating point
+% number.
+%
+% PRECONDITION:
+% the floating point number has already been rounded properly and
+% the mantissa has been rounded correctly.
+%
+% The argument needs to be in the format returned by
+% \pgfmathfloat@to@FMeE@style and terminated by '\relax'.
+\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@std
+\newif\ifpgfmathfloat@usezerofill@sci
+\newif\ifpgfmathfloat@usezerofill@fixed
+\newif\ifpgfmathprintnumber@assumemathmode
+\newif\ifpgfmathprintnumber@showpositive
+\newif\ifpgfmathprintnumber@frac@warn
+\newif\ifpgfmathprintnumber@frac@whole
+\newif\ifpgfmathparsenumber@comma@as@period
+
+\long\def\pgfmathfloatfrac@verbatim#1#2{#1/#2}%
+
+\let\pgfmathround@@orig=\pgfmathround@
+
+% 2 = compatible
+% 0 = no
+% 1 = yes
+\def\pgfmathprintnumber@RELATIVE@choice@roundtofixed{2}%
+
+\newif\ifpgfmathprintnumber@thousand@sep@in@fractional
+\pgfkeys{%
+ /pgf/number format/.is family,
+ /pgf/number format,
+ fixed/.code= \pgfmath@set@number@printer{pgfmathprintnumber@FIXED},
+ sci/.code= \pgfmath@set@number@printer{pgfmathprintnumber@SCI},
+ std/.code= {\pgfmath@set@number@printer{pgfmathprintnumber@STD}\pgfmathprintnumber@STD@setparam{#1}},
+ std/.default=,%
+ relative round mode/.is choice,
+ relative round mode/fixed/.code={\def\pgfmathprintnumber@RELATIVE@choice@roundtofixed{1}},
+ relative round mode/mantissa/.code={\def\pgfmathprintnumber@RELATIVE@choice@roundtofixed{0}},
+ relative round mode/compatible/.code={\def\pgfmathprintnumber@RELATIVE@choice@roundtofixed{2}},
+ % relative={<exponent base 10>}
+ relative/.code={%
+ \pgfmath@set@number@printer{pgfmathprintnumber@RELATIVE}%
+ \pgfmathround@@orig{#1}%
+ \expandafter\pgfmathfloattoint@@\pgfmathresult\relax
+ \let\pgfmathprintnumber@RELATIVE@param=\pgfmathresult
+ },%
+ relative/.value required,
+ relative*/.style={/pgf/number format/relative={#1},/pgf/number format/relative round mode=fixed},
+ every relative/.style=std,
+ relative style/.style={/pgf/number format/every relative/.append style={#1}},
+ fixed relative/.code= \pgfmath@set@number@printer{pgfmathprintnumber@FIXED@RELATIVE},
+ int detect/.code= \pgfmath@set@number@printer{pgfmathprintnumber@INT@DETECT},
+ int trunc/.code= \pgfmath@set@number@printer{pgfmathprintnumber@INT@TRUNC},
+ frac/.code= \pgfmath@set@number@printer{pgfmathprintnumber@frac},%
+ frac TeX/.initial=\frac,
+ frac whole format/.code={\def\pgfmathresult{#1}},
+ frac denom/.initial=,
+ frac whole/.is if=pgfmathprintnumber@frac@whole,
+ frac whole=true,
+ frac shift/.initial=4,
+ frac warning/.is if=pgfmathprintnumber@frac@warn,
+ frac warning=true,
+ assume math mode/.is if=pgfmathprintnumber@assumemathmode,
+ assume math mode/.default=true,
+ fixed zerofill/.is if= pgfmathfloat@usezerofill@fixed,
+ fixed zerofill/.default=true,
+ sci zerofill/.is if= pgfmathfloat@usezerofill@sci,
+ sci zerofill/.default=true,
+ zerofill/.style= {/pgf/number format/fixed zerofill=#1,/pgf/number format/sci zerofill=#1},
+ zerofill/.default= true,
+ precision/.store in= \pgfmathfloat@round@precision,
+ sci precision/.code={%
+ \edef\pgfmathfloat@loc@TMPa{#1}%
+ \ifx\pgfmathfloat@loc@TMPa\pgfutil@empty
+ \def\pgfmathprintnumber@sci@precision{\pgfmathfloat@round@precision}%
+ \else
+ \let\pgfmathprintnumber@sci@precision=\pgfmathfloat@loc@TMPa
+ \fi
+ },%
+ sci precision/.default=,
+ sci precision=,
+ fixed default/.code= {\let\pgfmathprintnumber@fixed@style=\pgfmathprintnumber@fixed@styleDEFAULT},
+ set decimal separator/.initial=,
+ dec sep/.style={/pgf/number format/set decimal separator={#1}},
+ @dec sep mark/.initial=,
+ @sci exponent mark/.initial=,
+ set thousands separator/.initial=,
+ 1000 sep in fractionals/.is if=pgfmathprintnumber@thousand@sep@in@fractional,
+ 1000 sep in fractionals/.default=true,
+ 1000 sep/.style={/pgf/number format/set thousands separator={#1}},
+ min exponent for 1000 sep/.initial=0,
+ use period/.style= {/pgf/number format/set decimal separator={.},/pgf/number format/set thousands separator={{{,}}}},
+ use comma/.style= {/pgf/number format/set decimal separator={{{,}}},/pgf/number format/set thousands separator={.}},
+ showpos/.is if=pgfmathprintnumber@showpositive,
+ showpos/.default=true,
+ print sign/.is if=pgfmathprintnumber@showpositive,
+ print sign/.default=true,
+ read comma as period/.is if=pgfmathparsenumber@comma@as@period,
+ read comma as period/.default=true,
+ skip 0./.is if=pgfmathprintnumberskipzeroperiod,
+ skip 0./.default=true,
+ skip 0.= false,
+ use period,
+ sci 10^e/.code= {\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@std},
+ sci 10e/.code= {\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@std},
+ sci e/.code= {\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@e},
+ sci E/.code= {\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@E},
+ sci subscript/.code= {\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@subscript},
+ sci superscript/.code= {\let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@superscript},
+ sci generic/.code= {%
+ \let\pgfmathfloatrounddisplaystyle=\pgfmathfloatrounddisplaystyle@generic
+ \pgfkeysdefargs{/pgf/number format/sci generic/@}%
+ {##1##2##3}%
+ {\pgfqkeys{/pgf/number format/sci generic}{#1}}%
+ },
+ sci generic/mantissa sep/.initial=,%
+ sci generic/empty mantissa sep/.initial=,%
+ sci generic/mantisse sep/.style={/pgf/number format/sci generic/mantissa sep={#1}},%
+ sci generic/empty mantisse sep/.style={/pgf/number format/sci generic/empty mantissa sep={#1}},%
+ sci generic/exponent/.initial=,%
+ sci generic/.value required,
+ verbatim/.code={%
+ \pgfqkeys{/pgf/number format}{%
+ sci generic={mantissa sep=,exponent={e##1}},
+ 1000 sep=,
+ skip 0.=false,
+ print sign=false,
+ dec sep=.,
+ assume math mode,
+ frac TeX=\pgfmathfloatfrac@verbatim,
+ frac whole format/.code={\def\pgfmathresult{##1 }},
+ @dec sep mark=,
+ @sci exponent mark=,
+ }%
+ },
+ retain unit mantissa/.is if=pgfmathfloatround@allow@empty@mantissa,
+ retain unit mantissa/.default=true,
+ retain unit mantissa=true,
+ %
+ % allows to replace the implementation, for example
+ % 'implementation=\num'. This is experimental -- it is unclear
+ % if all consumers work well since they rely on the keys in
+ % /pgf/number format.
+ implementation/.code={\def\pgfmathprintnumber@protected{#1}},
+}
+
+
+
+\def\pgfmathprintnumber@STD#1{%
+ % parse the input:
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@STD@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@STD@setparam#1{%
+ \edef\pgfmathfloat@loc@TMPb{#1}%
+ \ifx\pgfmathfloat@loc@TMPb\pgfutil@empty
+ % DEFAULT for lower and upper bound.
+ \def\pgfmathprintnumber@STD@getlowerbound{%
+ \c@pgf@counta=\pgfmathfloat@round@precision@orig\relax
+ \divide\c@pgf@counta by-2\relax
+ }%
+ \def\pgfmathprintnumber@STD@upperbound{4}%
+ \else
+ \expandafter\pgfutil@in@\expandafter:\expandafter{\pgfmathfloat@loc@TMPb}%
+ \ifpgfutil@in@
+ % we have -4:5 or something like that.
+ % parse both values:
+ \def\pgfmathfloat@loc@TMPa##1:##2\relax{%
+ \edef\pgfmathprintnumber@STD@getlowerbound{%
+ \noexpand\c@pgf@counta=##1\space
+ }%
+ \edef\pgfmathprintnumber@STD@upperbound{##2}%
+ }%
+ \expandafter\pgfmathfloat@loc@TMPa\pgfmathfloat@loc@TMPb\relax
+ \else
+ % we have just the lower bound:
+ \def\pgfmathprintnumber@STD@upperbound{4}%
+ \edef\pgfmathprintnumber@STD@getlowerbound{%
+ \noexpand\c@pgf@counta=\pgfmathfloat@loc@TMPb\space
+ }%
+ \fi
+ \fi
+}%
+
+\def\pgfmathprintnumber@STD@issci#1#2e#3\relax{%
+ \expandafter\ifnum#1<3
+ \expandafter\ifnum#3>\pgfmathprintnumber@STD@upperbound\relax
+ \pgfmathprintnumber@SCI@issci#1#2e#3\relax%
+ \else
+ \begingroup
+ \pgfmathprintnumber@STD@getlowerbound
+ \ifnum#3<\c@pgf@counta
+ \pgfmathprintnumber@SCI@issci#1#2e#3\relax%
+ \else
+ \pgfmathprintnumber@FIXED@issci#1#2e#3\relax%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+ \fi
+ \else% nan or inf:
+ \pgfmathfloatrounddisplaystyle#1#2e#3\relax%
+ \fi
+}
+
+\def\pgfmathprintnumber@RELATIVE#1{%
+ % parse the input:
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@RELATIVE@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@RELATIVE@choice@roundtofixed@warn{%
+ \pgf@typeout{! Package pgf warning: the use of /pgf/number format/relative is discouraged (buggy). Please use 'relative*' instead or type \string\pgfkeys{/pgf/number format/relative round mode=fixed} into your preamble.}%
+ \global\let\pgfmathprintnumber@RELATIVE@choice@roundtofixed@warn=\relax
+}
+
+\def\pgfmathprintnumber@RELATIVE@issci#1#2e#3\relax{%
+ \begingroup
+ % format X / 10^{relative}:
+ \c@pgf@counta=#3\relax
+ \advance\c@pgf@counta by-\pgfmathprintnumber@RELATIVE@param\relax
+ \pgfmathfloatcreate{#1}{#2}{\the\c@pgf@counta}%
+ % OK, round it to the desired precision:
+ \if0\pgfmathprintnumber@RELATIVE@choice@roundtofixed
+ % relative round mode=mantissa
+ \def\b@round@fixed{0}%
+ \else
+ \if1\pgfmathprintnumber@RELATIVE@choice@roundtofixed
+ % relative round mode=fixed
+ \def\b@round@fixed{1}%
+ \else
+ \pgfmathprintnumber@RELATIVE@choice@roundtofixed@warn
+ % relative round mode=compatible
+ \ifnum\c@pgf@counta>0
+ % hm. for positive exponents, we should round the
+ % mantissa rather than only the fractional part.
+ \def\b@round@fixed{0}%
+ \else
+ % negative exponent -> round fixed representation:
+ \def\b@round@fixed{1}%
+ \fi
+ \fi
+ \fi
+ \if1\b@round@fixed
+ % round fixed representation:
+ \pgfmathfloattofixed\pgfmathresult
+ \expandafter\pgfmathroundto\expandafter{\pgfmathresult}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ \pgfmathfloatroundhasperiodtrue% make sure the code below works:
+ \else
+ % round the mantissa:
+ \expandafter\pgfmathfloatround\expandafter{\pgfmathresult}%
+ \fi
+ % Now, compute result * 10^{relative} and format the result:
+ \pgfmathfloattoregisterstok\pgfmathresult\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifnum\pgfmathfloat@a@S=0
+ \pgfmathfloat@a@E=\pgfmathfloat@a@S % avoid 0 * 10^8
+ \else
+ \advance\pgfmathfloat@a@E by+\pgfmathprintnumber@RELATIVE@param\relax
+ \fi
+ \edef\pgfmathresultX{%
+ \the\pgfmathfloat@a@S
+ \the\pgfmathfloat@a@Mtok
+ \ifpgfmathfloatroundhasperiod\else.0\fi
+ e\the\pgfmathfloat@a@E}%
+ % call another formatter for the result (but avoid rounding inside of it):
+ \pgfqkeys{/pgf/number format}{/pgf/number format/every relative,
+ fixed zerofill=false,% useless here!
+ sci zerofill=false}%
+ \ifx\pgfmathprintnumber@issci\pgfmathprintnumber@RELATIVE@issci
+ \pgfmath@error{The '/pgf/number format/every relative' style should set a valid display style}%
+ \fi
+ \let\pgfmathfloat@round@precision@orig=\pgfmathfloat@round@precision
+ \def\pgfmathfloat@round@precision{9999}%
+ \expandafter\pgfmathprintnumber@issci\pgfmathresultX\relax%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+\def\pgfmathprintnumber@FIXED@RELATIVE#1{%
+ % parse the input:
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@FIXED@RELATIVE@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@FIXED@RELATIVE@issci#1#2e#3\relax{%
+ \begingroup
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ % we want the first <precision> digits - not the first
+ % <precision>+1 digits:
+ \c@pgf@counta=\pgfmathfloat@round@precision\relax
+ \advance\c@pgf@counta by-1
+ \edef\pgfmathfloat@round@precision{\the\c@pgf@counta}%
+ \pgfmathfloatround{\pgfmathresult}%
+ \pgfmathfloattoregisterstok\pgfmathresult\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \ifnum\pgfmathfloat@a@S=0
+ \pgfmathfloat@a@E=\pgfmathfloat@a@S % avoid 0 * 10^8
+ \fi
+ \edef\pgfmathresultX{%
+ \the\pgfmathfloat@a@S
+ \the\pgfmathfloat@a@Mtok
+ \ifpgfmathfloatroundhasperiod\else.0\fi
+ e\the\pgfmathfloat@a@E}%
+ \let\pgfmathfloat@round@precision@orig=\pgfmathfloat@round@precision
+ \pgfmathfloat@usezerofill@fixedfalse
+ \def\pgfmathfloat@round@precision{9999}% typeset all remaining digits!
+ \expandafter\pgfmathprintnumber@FIXED@issci\pgfmathresultX\relax%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+\def\pgfmathprintnumber@frac#1{%
+ % parse the input:
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloatgetfrac{\pgfmathresult}%
+ \expandafter\pgfmathprintnumber@frac@formatresult\pgfmathresult
+}
+\def\pgfmathprintnumber@frac@issci#1#2e#3\relax{%
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ \pgfmathfloatgetfrac{\pgfmathresult}%
+ \expandafter\pgfmathprintnumber@frac@formatresult\pgfmathresult
+}
+\def\pgfmathprintnumber@frac@formatresult#1#2#3{%
+ \begingroup
+ \pgfkeysgetvalue{/pgf/number format/frac TeX}\pgfmathresult
+ \toks0=\expandafter{\pgfmathresult}%
+ \def\pgfmathfloat@loc@TMPa{#1}%
+ \ifx\pgfmathfloat@loc@TMPa\pgfutil@empty
+ \ifpgfmathprintnumber@showpositive
+ \def\pgfmathfloat@loc@TMPa{+}%
+ \fi
+ \else
+ \ifx\pgfmathfloat@loc@TMPa-%
+ \else
+ \ifx\pgfmathfloat@loc@TMPa+%
+ \else
+ \ifpgfmathprintnumber@showpositive
+ \edef\pgfmathfloat@loc@TMPa{+\pgfmathfloat@loc@TMPa}%
+ \fi
+ \def\pgfmathfloat@loc@TMPb{\pgfkeysvalueof{/pgf/number format/frac whole format/.@cmd}}%
+ \expandafter\pgfmathfloat@loc@TMPb\pgfmathfloat@loc@TMPa\pgfeov
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \fi
+ \fi
+ \fi
+ \toks1=\expandafter{\pgfmathfloat@loc@TMPa}%
+ \edef\pgfmathresult{%
+ \the\toks1 \ifnum#2=0 \else\the\toks0 {#2}{#3}\fi%
+ }%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+% Defines \pgfmathresult to contain three sets of braces containing
+% the sign (optionally containing any components >1), the numerator and the denominator for #1.
+%
+% \pgfmathfloatgetfrac{0.5} -> \pgfmathresult contains {}{1}{2}
+% \pgfmathfloatgetfrac{-0.5} -> \pgfmathresult contains {-}{1}{2}
+% \pgfmathfloatgetfrac{1.5} -> \pgfmathresult contains {1}{1}{2}
+%
+% special cases:
+% \pgfmathfloatgetfrac{0} -> \pgfmathresult contains {0}{0}{1}
+% \pgfmathfloatgetfrac{1} -> \pgfmathresult contains {1}{0}{1}
+%
+% The numerator and denominator is always a number (not empty)
+\def\pgfmathfloatgetfrac#1{%
+ \pgfutil@ifundefined{pgfmathfloatmultiply@}{%
+ \pgfmath@PackageError{Sorry, the number format 'frac' requires '\string\usetikzlibrary{fpu}' (and, optionally, \string\usepackage{fp}) in order to work correctly}%
+ \edef\pgfmathresult{{#1}{0}{1}}%
+ }{%
+ \pgfmathfloatgetfrac@{#1}%
+ }%
+}%
+\def\pgfmathfloatgetfrac@#1{%
+ \begingroup
+ \edef\pgfmathfloat@arg{#1}%
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathfloat@arg\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \def\pgfmathfloat@loc@TMPa{0}%
+ \ifcase\pgfmathfloat@a@S
+ % #1 = 0:
+ \def\pgfmathresult{{0}{0}{1}}%
+ \or% #1 > 0
+ \pgfmathfloat@a@S=1
+ \def\pgfmathfloat@loc@TMPa{1}%
+ \or% #1 < 0
+ \pgfmathfloat@a@S=-1
+ \def\pgfmathfloat@loc@TMPa{1}%
+ \or
+ \edef\pgfmathresult{{}{NaN}{1}}%
+ \or
+ \edef\pgfmathresult{{}{\infty}{1}}%
+ \or
+ \edef\pgfmathresult{{-}{\infty}{1}}%
+ \fi
+ \if1\pgfmathfloat@loc@TMPa
+ \ifnum\pgfmathfloat@a@E<0
+ \def\pgfmathfloat@wholenumber{}%
+ \else
+ \pgfmathfloatcreate{1}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \pgfmathfloattofixed\pgfmathresult%
+ \def\pgfmathfloat@loc@TMPa##1.##2\relax{%
+ \def\pgfmathfloat@wholenumber{##1}%
+ \pgfmathfloatparsenumber{0.##2}%
+ }%
+ \expandafter\pgfmathfloat@loc@TMPa\pgfmathresult\relax
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@b@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \fi
+ %
+ \def\pgfmathfloat@loc@TMPa##1.##2\relax{%
+ \def\pgfmathfloat@mantissa@first{##1}%
+ \def\pgfmathfloat@mantissa@ltone{0.##2}%
+ }%
+ \expandafter\pgfmathfloat@loc@TMPa\the\pgfmathfloat@a@Mtok\relax
+ %
+ \def\pgfmathfloat@loc@@to@int##1.##2\relax##3{%
+ ##3=##1
+ \ifdim0.##2pt>0.5pt
+ \advance##3 by1
+ \fi
+ }%
+ %
+ % alias registers names:
+ \let\pgfmathresultnumerator=\pgfmathfloat@b@S
+ \let\pgfmathresultdenom=\pgfmathfloat@b@E
+ %
+ \pgfkeysgetvalue{/pgf/number format/frac denom}\pgfmath@target@denominator
+ \ifx\pgfmath@target@denominator\pgfutil@empty
+ %
+ \pgfmathfloat@a@E=-\pgfmathfloat@a@E
+ \ifdim\pgfmathfloat@mantissa@ltone pt=0pt
+ \def\pgfmathfloat@factor{1}%
+ \edef\pgfmathfloat@scaled@numerator{\the\pgfmathfloat@a@Mtok}%
+ \else
+ % FIXME : this here is numerically instable.
+ %
+ % The errors of 1/r are magnified by 10^k which
+ % doesn't work.
+ \pgfutil@ifundefined{FPdiv}{%
+ \pgfmathfloatparsenumber{\pgfmathfloat@mantissa@ltone}%
+ \pgfmathfloatreciprocal@{\pgfmathresult}%
+ }{%
+ % \usepackage{fp}.
+ % yields higher absolute precision.
+ \FPmessagesfalse%
+ \FPdebugfalse%
+ \FPdiv\pgfmathresult{1}{\pgfmathfloat@mantissa@ltone}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ }%
+ \let\pgfmathfloat@inv=\pgfmathresult
+ \pgfmathfloatcreate{1}{1.0}{\pgfkeysvalueof{/pgf/number format/frac shift}}%
+ \let\pgfmathfloat@scalebaseten=\pgfmathresult
+ \pgfmathfloatmultiply@{\pgfmathfloat@inv}{\pgfmathfloat@scalebaseten}%
+ \let\pgfmathfloat@factor=\pgfmathresult
+ %
+ \expandafter\pgfmathfloatparsenumber\expandafter{\the\pgfmathfloat@a@Mtok}%
+ \let\pgfmathfloat@loc@TMPa=\pgfmathresult
+ \pgfmathfloatmultiply@{\pgfmathfloat@factor}{\pgfmathfloat@loc@TMPa}%
+ \pgfmathfloattofixed\pgfmathresult
+ \let\pgfmathfloat@scaled@numerator=\pgfmathresult
+ %
+ \pgfmathfloattofixed\pgfmathfloat@factor
+ \expandafter\pgfmathfloat@loc@@to@int\pgfmathresult\relax{\pgfmathfloat@b@S}%
+ \edef\pgfmathfloat@factor{\the\pgfmathfloat@b@S}%
+ \fi
+ %
+ %
+ \pgfmathresultdenom=\pgfmathfloat@factor\relax
+ \pgfmathfloat@multiply@ten@to@the@E\pgfmathresultdenom
+ %
+ \expandafter\pgfmathfloat@loc@@to@int\pgfmathfloat@scaled@numerator\relax{\pgfmathresultnumerator}%
+ %\message{scale = \pgfmathfloat@factor; Z = \the\pgfmathresultnumerator\space ( von \pgfmathfloat@scaled@numerator), N = \the\pgfmathresultdenom.}%
+ %
+ \pgfmathgreatestcommondivisor{\pgfmathresultnumerator}{\pgfmathresultdenom}%
+ \divide\pgfmathresultnumerator by\pgfmathresult\relax
+ \divide\pgfmathresultdenom by\pgfmathresult\relax
+ \ifpgfmathprintnumber@frac@warn
+ \ifnum\pgfmathresultdenom>1000
+ \pgfutil@ifundefined{FPdiv}{%
+ \pgfmathfloattosci@\pgfmathfloat@arg
+ \pgf@typeout{! Package pgf /pgf/number format/frac warning=true: /pgf/number format/frac of `\pgfmathresult' = \the\pgfmathresultnumerator\space / \the\pgfmathresultdenom\space might be large due to instabilities. Try \string\usepackage{fp} to improve accuracy.}%
+ }{}%
+ \fi
+ \fi
+ \else
+ % use target denominator:
+ \pgfmathresultdenom=\pgfmath@target@denominator\relax
+ \pgfmathfloatcreate{1}{\the\pgfmathfloat@a@Mtok}{\the\pgfmathfloat@a@E}%
+ \pgfmathfloattofixed\pgfmathresult
+ \pgf@xa=\pgfmathresult pt
+ \multiply\pgf@xa by\pgfmathresultdenom
+ \edef\pgfmathfloat@scaled@numerator{\pgf@sys@tonumber\pgf@xa}%
+ \expandafter\pgfmathfloat@loc@@to@int\pgfmathfloat@scaled@numerator\relax{\pgfmathresultnumerator}%
+ \fi
+ \ifpgfmathprintnumber@frac@whole
+ \else
+ \ifx\pgfmathfloat@wholenumber\pgfutil@empty
+ \else
+ \count0=\pgfmathfloat@wholenumber\relax
+ \multiply\count0 by\pgfmathresultdenom
+ \advance\pgfmathresultnumerator by\count0
+ \def\pgfmathfloat@wholenumber{}%
+ \fi
+ \fi
+ \ifnum\pgfmathfloat@a@S<0
+ \edef\pgfmathresult{{-\pgfmathfloat@wholenumber}{\the\pgfmathresultnumerator}{\the\pgfmathresultdenom}}%
+ \else
+ \edef\pgfmathresult{{\pgfmathfloat@wholenumber}{\the\pgfmathresultnumerator}{\the\pgfmathresultdenom}}%
+ \fi
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+\def\pgfmathfloat@gobble@until@relax#1\relax{}
+
+% computes the greatest common divisor of two integer numbers (in
+% integer arithmetics).
+\def\pgfmathgreatestcommondivisor#1#2{%
+ \begingroup
+ \count0=#1\relax
+ \count1=#2\relax
+ \ifnum\count0=0
+ \edef\pgfmathresult{\the\count1}%
+ \else
+ \pgfmathgreatestcommondivisor@loop
+ \edef\pgfmathresult{\the\count0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+\def\pgfmathgreatestcommondivisor@loop{%
+ \ifnum\count1=0
+ \else
+ \ifnum\count0>\count1
+ \advance\count0 by-\count1
+ \else
+ \advance\count1 by-\count0
+ \fi
+ \expandafter\pgfmathgreatestcommondivisor@loop
+ \fi
+}%
+
+% multiplies a TeX register by 10^E where E is stored in the register
+% \pgfmathfloat@a@E (and it should be positive!)%
+%
+% #1 a TeX register
+\def\pgfmathfloat@multiply@ten@to@the@E#1{%
+ \ifnum\pgfmathfloat@a@E>0
+ \multiply#1 by10
+ \advance\pgfmathfloat@a@E by-1
+ \def\pgfmathfloat@multiply@ten@to@the@E@next{\pgfmathfloat@multiply@ten@to@the@E{#1}}%
+ \else
+ \let\pgfmathfloat@multiply@ten@to@the@E@next=\relax%
+ \fi
+ \pgfmathfloat@multiply@ten@to@the@E@next
+}%
+
+\def\pgfmathprintnumber@INT@TRUNC#1{%
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@INT@TRUNC@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@INT@TRUNC@impl#1.#2\relax#3#4e#5\relax{%
+ \pgfmathfloatroundhasperiodfalse
+ \pgfmathprintnumber@fixed@style{#1}#3#4e#5\relax%
+}
+\def\pgfmathprintnumber@INT@TRUNC@issci#1#2e#3\relax{%
+ \ifnum#1<3\relax
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \expandafter\pgfmathprintnumber@INT@TRUNC@impl\pgfmathresult\relax#1#2e#3\relax
+ \else
+ \pgfmathfloatrounddisplaystyle#1#2e#3\relax%
+ \fi
+}
+
+% Invokes '#2' if '#1' is actually an integer or '#3' if not.
+%
+% As a side-effect, \pgfretval will be set to the integer value if it
+% actually *is* an integer. Otherwise, \pgfretval will contain the
+% parsed floating point number.
+%
+% #1 a number constant (not necessarily a parsed float).
+\def\pgfmathifisint#1#2#3{%
+ \gdef\pgfmathfloatisint@@{0}%
+ \begingroup
+ \pgfmathfloatparsenumber{#1}%
+ \let\pgfretval\pgfmathresult
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathfloatisint@\pgfmathresult\relax
+ \pgfmath@smuggleone\pgfretval
+ \endgroup
+ \if1\pgfmathfloatisint@@ #2\else #3\fi
+}%
+\def\pgfmathfloatisint@#1#2e#3\relax{%
+ \ifnum#1<3\relax
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \def\pgfmathfloat@round@precision{6}%
+ \expandafter\pgfmathroundto\expandafter{\pgfmathresult}%
+ \ifpgfmathfloatroundhasperiod
+ \else
+ \let\pgfretval\pgfmathresult%
+ \gdef\pgfmathfloatisint@@{1}%
+ \fi
+ \fi
+}
+
+\def\pgfmathprintnumber@INT@DETECT#1{%
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@INT@DETECT@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@INT@DETECT@issci#1#2e#3\relax{%
+ \begingroup
+ \ifnum#1<3\relax
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \let\pgfmathfloat@round@precision@=\pgfmathfloat@round@precision
+ \def\pgfmathfloat@round@precision{6}%
+ \expandafter\pgfmathroundto\expandafter{\pgfmathresult}%
+ \let\pgfmathfloat@round@precision=\pgfmathfloat@round@precision@
+ \ifpgfmathfloatroundhasperiod
+ \pgfmathprintnumber@SCI@issci#1#2e#3\relax
+ \else
+ \expandafter\pgfmathprintnumber@fixed@style\expandafter{\pgfmathresult}#1#2e#3\relax
+ \fi
+ \else
+ \pgfmathfloatrounddisplaystyle#1#2e#3\relax%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+\def\pgfmathprintnumber@FIXED#1{%
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@FIXED@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@FIXED@issci#1#2e#3\relax{%
+ \begingroup
+ \ifnum#1<3
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \ifpgfmathfloat@usezerofill@fixed
+ \expandafter\pgfmathroundtozerofill\expandafter{\pgfmathresult}%
+ \else
+ \expandafter\pgfmathroundto\expandafter{\pgfmathresult}%
+ \fi
+ \ifpgfmathfloatroundmayneedrenormalize
+ \pgfmathfloat@a@E=#3\relax
+ \advance\pgfmathfloat@a@E by1
+ \edef\pgfmathfloat@loc@TMPb{\noexpand\pgfmathprintnumber@fixed@style{\pgfmathresult}#1#2e\the\pgfmathfloat@a@E}%
+ \pgfmathfloat@loc@TMPb\relax%
+ \else
+ \expandafter\pgfmathprintnumber@fixed@style\expandafter{\pgfmathresult}#1#2e#3\relax%
+ \fi
+ \else% nan or inf:
+ \pgfmathfloatrounddisplaystyle#1#2e#3\relax%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+
+\def\pgfmathprintnumber@SCI#1{%
+ \pgfmathfloatparsenumber{#1}%
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathprintnumber@SCI@issci\pgfmathresult\relax
+}
+
+\def\pgfmathprintnumber@SCI@issci#1#2e#3\relax{%
+ \begingroup
+ \pgfmathfloatcreate{#1}{#2}{#3}%
+ \edef\pgfmathfloat@round@precision{\pgfmathprintnumber@sci@precision}%
+ \ifpgfmathfloat@usezerofill@sci
+ \pgfmathfloatroundzerofill{\pgfmathresult}%
+ \else
+ \pgfmathfloatround{\pgfmathresult}%
+ \fi
+ \pgfmathfloat@to@FMeE@style\pgfmathresult
+ \expandafter\pgfmathfloatrounddisplaystyle\pgfmathresult\relax
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+% Prints argument #1 using the current pretty printer environment (all
+% variables in /pgf/number format).
+%
+% You may specify optional arguments with \pgfmathprintnumber[...].
+\def\pgfmathprintnumber{%
+ % \protect allows to supply \pgfmathprintnumber inside of latex
+ % captions. The \csname yields \relax in case protect is undefined.
+ \pgf@texdist@protect\pgfmathprintnumber@protected
+}%
+\def\pgfmathprintnumber@protected{%
+ \pgfutil@ifnextchar[%
+ {\pgfmathprintnumber@OPT}%
+ {\pgfmathprintnumber@noopt}%
+}
+
+\def\pgfmathprintnumber@noopt#1{%
+ \pgfmathprintnumber@{#1}%
+ \ifpgfmathprintnumber@assumemathmode
+ \pgfmathresult
+ \else
+ \pgfutilensuremath{\pgfmathresult}%
+ \fi
+}%
+\def\pgfmathprintnumber@OPT[#1]#2{%
+ \begingroup
+ \pgfqkeys{/pgf/number format}{#1}%
+ \pgfmathprintnumber@{#2}%
+ \ifpgfmathprintnumber@assumemathmode
+ \pgfmathresult
+ \else
+ \pgfutilensuremath{\pgfmathresult}%
+ \fi
+ \endgroup
+}%
+
+% As \pgfmathprintnumber, but it produces its output into the second
+% argument.
+\def\pgfmathprintnumberto{%
+ \pgfutil@ifnextchar[%
+ {\pgfmathprintnumberto@OPT}%
+ {\pgfmathprintnumberto@noopt}%
+}
+
+\def\pgfmathprintnumberto@noopt#1#2{%
+ \begingroup
+ \pgfmathprintnumber@{#1}%
+ \ifpgfmathprintnumber@assumemathmode
+ \global\let\pgfmathfloat@glob@TMP=\pgfmathresult
+ \else
+ \toks0=\expandafter{\pgfmathresult}%
+ \xdef\pgfmathfloat@glob@TMP{\noexpand\pgfutilensuremath{\the\toks0 }}%
+ \fi
+ \endgroup
+ \let#2=\pgfmathfloat@glob@TMP
+}%
+\def\pgfmathprintnumberto@OPT[#1]#2#3{%
+ \begingroup
+ \pgfqkeys{/pgf/number format}{#1}%
+ \pgfmathprintnumber@{#2}%
+ \ifpgfmathprintnumber@assumemathmode
+ \global\let\pgfmathfloat@glob@TMP=\pgfmathresult
+ \else
+ \toks0=\expandafter{\pgfmathresult}%
+ \xdef\pgfmathfloat@glob@TMP{\noexpand\pgfutilensuremath{\the\toks0 }}%
+ \fi
+ \endgroup
+ \let#3=\pgfmathfloat@glob@TMP
+}%
+
+
+% Changes the current number pretty printer to #1.
+%
+% #1 is the macro base name for the pretty print routine, without the
+% leading '\'.
+\def\pgfmath@set@number@printer#1{%
+ \expandafter\let\expandafter\pgfmathprintnumber@\csname #1\endcsname
+ \expandafter\let\expandafter\pgfmathprintnumber@issci\csname #1@issci\endcsname
+}
+
+\pgfkeys{/pgf/number format/std}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% IMPL
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% equals only itself when compared with \ifx:
+\def\pgfmathfloat@EOI{\pgfmathfloat@EOI}%
+
+% Re-use counters internally.
+%
+% They are always grouped and only used inside of the rounding
+% routines.
+\let\c@pgfmathroundto@prec=\pgfmathfloat@b@S% ATTENTION: DOUBLE-USED REGISTERS!
+\let\c@pgfmathroundto@offsetbehindperiod=\pgfmathfloat@b@E
+\newcount\c@pgfmathroundto@lastzeros
+
+\newif\ifpgfmathround@impl@PREPERIOD@is@negative@zero
+
+% PRECONDITION:
+% \ifpgfmathfloatroundhasperiod=\iftrue holds outside of the current TeX group.
+%
+% POSTCONDITION:
+% \ifpgfmathfloatroundhasperiod will be set correctly AFTER the
+% current TeX group.
+% \ifpgfmathfloatroundmayneedrenormalize will be set globally
+\def\pgfmathroundto@impl#1{%
+ \edef\pgfmathround@input{#1}%
+ \global\pgfmathfloatroundmayneedrenormalizefalse
+ \pgfmathfloat@tmptoks={}%
+ \let\pgfmathround@next=\pgfutil@empty
+ \let\pgfmathround@cur=\pgfutil@empty
+ \let\pgfmathresult=\pgfutil@empty
+ \expandafter\c@pgfmathroundto@prec\pgfmathfloat@round@precision\relax
+ \c@pgfmathroundto@lastzeros=0
+ \c@pgfmathroundto@offsetbehindperiod=-1 % means: no period found so far
+ \pgfmathround@impl@PREPERIOD@is@negative@zerotrue
+ \expandafter\pgfmathroundto@impl@ITERATE@NODOT@firstcall\pgfmathround@input\pgfmathfloat@EOI
+}
+
+% \pgfmathroundto implementation in WORDS:
+%
+% coarse idea:
+% 1. collect all digits/sign BEFORE the first period in REVERSE order
+% 2. then, collect UP TO \prec digits after the period in REVERSE order
+% Steps 1. and 2. lead to the digit [sign] sequence
+% "x_{-p} x_{-p+1} ... x_{-2} x_{-1} '.' x_0 ... x_r"
+% where 'r' is the total number of digits. The integer 'p' denotes the
+% ACTUALLY collected number of digits behind the period.
+%
+% Let 'k' be the desired precision.
+%
+% Please note that pgfmathroundto rounds the mantissa, that means |abs(x)|.
+%
+% There are exactly TWO cases:
+% 1. The case with p<=k and x_{-p-1} = end of input.
+% 2. The case with p=k and x_{-p-1} is a further, next character.
+%
+% Then, for case 1.):
+% discard any unused zeros at the tail of our number (possibly
+% including the period)
+%
+% and in case 2.)
+% if NEXT DIGIT < 5:
+% do exactly the same as in case 1.) above and discard any
+% following digits.
+% else
+% let q := -p
+% while(x_q = 9 and q<=r )
+% if q>=0
+% set x_q = '0'
+% else
+% discard digit x_q='9'
+% fi
+% ++q
+% if q=0
+% discard the period
+% fi
+% end while
+% if q = r+1
+% insert a '1'
+% else
+% set x_q = x_q + 1
+% fi
+% fi
+%
+% All these loops have been implemented in spaghetti-code below.
+% Sorry, I fear its hard to understand. In principle, everything is
+% realised using more or less finite state machines (with some number
+% counting logic).
+%
+% Some comments:
+% - The token register \pgfmathfloat@tmptoks is used to accumulate the REVERSED input number.
+% - \pgfmathfloat@EOI always denotes 'END OF INPUT'.
+% - in the second stage, we need to reverse \pgfmathfloat@tmptoks.
+% This is -- again -- done with \pgfmathfloat@tmptoks.
+
+\def\pgfmathroundto@impl@discard@period#1.#2\pgfmathfloat@EOI{%
+ \pgfmathfloatroundhasperiodfalse
+ \aftergroup\pgfmathfloatroundhasperiodfalse
+ \def\pgfmathresult{#1}%
+}
+
+\def\pgfmathroundto@impl@gobble@rest@and@start#1\pgfmathfloat@EOI{%
+ \pgfmathroundto@impl@start
+}
+\def\pgfmathroundto@impl@gobble@and@start\pgfmathfloat@EOI{%
+ \pgfmathroundto@impl@start
+}
+\def\pgfmathroundto@impl@gobble\pgfmathfloat@EOI{}%
+\def\pgfmathroundto@impl@gobble@rest#1\pgfmathfloat@EOI{}%
+
+% This method will be invoked as soon as the first step, the reverse
+% collection of up to PREC digits after the period, has finished.
+\def\pgfmathroundto@impl@start{%
+ \ifx\pgfmathround@next\pgfutil@empty
+ \ifnum\c@pgfmathroundto@offsetbehindperiod<0
+ % no period found.
+ \ifpgfmathfloat@fixed@digits@after@period
+ \ifnum\c@pgfmathroundto@prec=0\relax
+ \pgfmathfloatroundhasperiodfalse
+ \aftergroup\pgfmathfloatroundhasperiodfalse
+ \edef\pgfmathresult{\pgfmathround@input}%
+ \else
+ \pgfmathfloat@tmptoks=\expandafter{\pgfmathround@input.}%
+ \c@pgfmathroundto@offsetbehindperiod=\c@pgfmathroundto@prec
+ \pgfmathroundto@impl@append@zeros
+ \edef\pgfmathresult{\the\pgfmathfloat@tmptoks}%
+ \fi
+ \else
+ \pgfmathfloatroundhasperiodfalse
+ \aftergroup\pgfmathfloatroundhasperiodfalse
+ \edef\pgfmathresult{\pgfmathround@input}%
+ \fi
+ \else
+ %\ifnum\c@pgfmathroundto@offsetbehindperiod>\c@pgfmathroundto@prec
+ % \pgfmath@error{Internal logic error in pgfmathroundto at [I] - should not have happened!?}{}%
+ %\fi
+ \pgfmathroundto@impl@finish@with@truncation
+ \fi
+ \else
+ %\ifnum\c@pgfmathroundto@offsetbehindperiod=\c@pgfmathroundto@prec
+ %\else
+ % \pgfmath@error{Internal logic error in pgfmathroundto at [II] - should not have happened!? I have offsetbehindperiod=\the\c@pgfmathroundto@offsetbehindperiod and prec = \the\c@pgfmathroundto@prec}{}%
+ %\fi
+ \expandafter\ifnum\pgfmathround@next<5\relax
+ \pgfmathroundto@impl@finish@with@truncation
+ \else
+ \multiply\c@pgfmathroundto@offsetbehindperiod by-1
+ \expandafter\pgfmathroundto@impl@ADD@ONE\the\pgfmathfloat@tmptoks\pgfmathfloat@EOI
+ \fi
+ \fi
+}
+
+% takes the current input and decides whether trailing zeros shall be
+% discarded or more zeros need to be filled in.
+\def\pgfmathroundto@impl@finish@with@truncation{%
+ \ifpgfmathfloat@fixed@digits@after@period
+ \expandafter\pgfmathroundto@impl@REVERSE\the\pgfmathfloat@tmptoks\pgfmathfloat@EOI
+ \ifnum\c@pgfmathroundto@lastzeros=\c@pgfmathroundto@offsetbehindperiod
+ \ifpgfmathround@impl@PREPERIOD@is@negative@zero
+ % write '0.0000' instead of '-0.0000':
+ \expandafter\pgfmathroundto@impl@discard@minus\the\pgfmathfloat@tmptoks\pgfmathfloat@EOI
+ \fi
+ \fi
+ \ifnum\c@pgfmathroundto@prec=0\relax
+ \expandafter\pgfmathroundto@impl@discard@period\the\pgfmathfloat@tmptoks\pgfmathfloat@EOI
+ \else
+ \advance\c@pgfmathroundto@prec by-\c@pgfmathroundto@offsetbehindperiod
+ \c@pgfmathroundto@offsetbehindperiod=\c@pgfmathroundto@prec
+ \pgfmathroundto@impl@append@zeros
+ \edef\pgfmathresult{\the\pgfmathfloat@tmptoks}%
+ \fi
+ \else
+ \pgfmathroundto@impl@discard@suffix@zeros
+ \fi
+}
+
+\def\pgfmathroundto@impl@discard@minus-#1\pgfmathfloat@EOI{\pgfmathfloat@tmptoks={#1}}%
+
+% appends \c@pgfmathroundto@offsetbehindperiod zeros at the end of \pgfmathfloat@tmptoks.
+\def\pgfmathroundto@impl@append@zeros{%
+ \ifnum\c@pgfmathroundto@offsetbehindperiod>0
+ \pgfmathfloat@tmptoks=\expandafter{\the\pgfmathfloat@tmptoks0}%
+ \advance\c@pgfmathroundto@offsetbehindperiod by-1
+ \pgfmathroundto@impl@append@zeros
+ \fi
+}
+
+\def\pgfmathroundto@impl@ADD@ONE{%
+ \pgfmathfloat@tmptoks={}% no longer needed because its old value will be read from input
+ \pgfmathroundto@impl@ADD@ONE@ITERATE
+}
+\def\pgfmathroundto@impl@ADD@ONE@ITERATE{%
+ \pgfutil@ifnextchar\pgfmathfloat@EOI{%
+ \global\pgfmathfloatroundmayneedrenormalizetrue
+ \edef\pgfmathresult{1\the\pgfmathfloat@tmptoks}%
+ \pgfmathroundto@impl@gobble
+ }{%
+ \pgfutil@ifnextchar.{%
+ \ifnum\c@pgfmathroundto@prec=0
+ % silently discard period in special case precision=0
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ADD@ONE@ITERATE@gobble@dot}%
+ \else
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ADD@ONE@NEXT@COLLECT}%
+ \fi
+ \pgfmathround@nextcmd
+ }{%
+ \pgfutil@ifnextchar+{%
+ \global\pgfmathfloatroundmayneedrenormalizetrue
+ \edef\pgfmathresult{1\the\pgfmathfloat@tmptoks}%
+ \pgfmathroundto@impl@gobble@rest
+ }{%
+ \pgfutil@ifnextchar-{%
+ \global\pgfmathfloatroundmayneedrenormalizetrue
+ \edef\pgfmathresult{-1\the\pgfmathfloat@tmptoks}%
+ \pgfmathroundto@impl@gobble@rest
+ }{%
+ \pgfmathroundto@impl@ADD@ONE@NEXT
+ }%
+ }%
+ }%
+ }%
+}
+
+\def\pgfmathroundto@impl@ADD@ONE@ITERATE@gobble@dot.{%
+ \pgfmathfloatroundhasperiodfalse
+ \aftergroup\pgfmathfloatroundhasperiodfalse
+ \pgfmathroundto@impl@ADD@ONE@ITERATE
+}
+
+\def\pgfmathroundto@impl@ADD@ONE@NEXT@COLLECT#1{%
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter#1\the\pgfmathfloat@tmptoks}%
+ \pgfmathroundto@impl@ADD@ONE@ITERATE
+}
+\def\pgfmathroundto@impl@ADD@ONE@NEXT#1{%
+ \ifnum#1=9
+ \ifnum\c@pgfmathroundto@offsetbehindperiod<0
+ \ifpgfmathfloat@fixed@digits@after@period
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter0\the\pgfmathfloat@tmptoks}%
+ \else
+ % silently DROP digit
+ \fi
+ \else
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter0\the\pgfmathfloat@tmptoks}%
+ \fi
+ \advance\c@pgfmathroundto@offsetbehindperiod by1
+ \ifnum\c@pgfmathroundto@offsetbehindperiod=0
+ \ifpgfmathfloat@fixed@digits@after@period
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ADD@ONE@ITERATE}%
+ \else
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ADD@ONE@ITERATE@gobble@dot}%
+ \fi
+ \else
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ADD@ONE@ITERATE}%
+ \fi
+ \else
+ % re-use this counter:
+ \c@pgfmathroundto@lastzeros=#1
+ \advance\c@pgfmathroundto@lastzeros by1
+ \edef\pgfmathresult{\the\c@pgfmathroundto@lastzeros\the\pgfmathfloat@tmptoks}%
+ \pgfmathfloat@tmptoks=\expandafter{\pgfmathresult}%
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@REVERSE@ITERATE}%
+ \fi
+ \pgfmathround@nextcmd
+}
+
+
+\def\pgfmathroundto@impl@discard@suffix@zeros{%
+ \ifnum\c@pgfmathroundto@lastzeros=\c@pgfmathroundto@offsetbehindperiod
+ \ifpgfmathround@impl@PREPERIOD@is@negative@zero
+ \pgfmathfloatroundhasperiodfalse
+ \aftergroup\pgfmathfloatroundhasperiodfalse
+ \def\pgfmathresult{0}% write '0' instead of '-0'
+ \else
+ \expandafter\pgfmathroundto@impl@discard@period\pgfmathround@input\pgfmathfloat@EOI
+ \fi
+ \else
+ \ifnum\c@pgfmathroundto@lastzeros=0
+ \expandafter\pgfmathroundto@impl@REVERSE\the\pgfmathfloat@tmptoks\pgfmathfloat@EOI
+ \else
+ \expandafter\pgfmathroundto@impl@discard@suffix@zeros@ITERATE\the\pgfmathfloat@tmptoks\pgfmathfloat@EOI
+ \fi
+ \fi
+}
+
+% PRECONDITION:
+% \c@pgfmathroundto@lastzeros > 0
+\def\pgfmathroundto@impl@discard@suffix@zeros@ITERATE#1{%
+ \advance\c@pgfmathroundto@lastzeros by-1
+ \ifnum\c@pgfmathroundto@lastzeros=0
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@REVERSE}%
+ \else
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@discard@suffix@zeros@ITERATE}%
+ \fi
+ \pgfmathround@nextcmd
+}
+
+% Usage:
+% \pgfmathroundto@impl@REVERSE#1\pgfmathfloat@EOI
+% -> writes #1 reversed into \pgfmathfloat@tmptoks
+\def\pgfmathroundto@impl@REVERSE{%
+ \pgfmathfloat@tmptoks={}%
+ \pgfmathroundto@impl@REVERSE@ITERATE
+}
+
+\def\pgfmathroundto@impl@REVERSE@ITERATE{%
+ \pgfutil@ifnextchar\pgfmathfloat@EOI{%
+ \edef\pgfmathresult{\the\pgfmathfloat@tmptoks}%
+ \pgfmathroundto@impl@gobble
+ }{%
+ \pgfmathroundto@impl@REVERSE@NEXT
+ }%
+}
+
+\def\pgfmathroundto@impl@REVERSE@NEXT#1{%
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter#1\the\pgfmathfloat@tmptoks}%
+ \pgfmathroundto@impl@REVERSE@ITERATE
+}
+
+\def\pgfmathroundto@impl@BEGIN@DOT.{%
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter.\the\pgfmathfloat@tmptoks}%
+ \c@pgfmathroundto@offsetbehindperiod=0
+ \pgfmathroundto@impl@ITERATE@DOT
+}
+\def\pgfmathroundto@impl@ITERATE@DOT{%
+ \pgfutil@ifnextchar\pgfmathfloat@EOI{%
+ % finished.
+ \pgfmathroundto@impl@gobble@and@start
+ }{%
+ \pgfmathroundto@impl@NEXT@DOT
+ }%
+}
+\def\pgfmathroundto@impl@NEXT@DOT#1{%
+ \ifnum\c@pgfmathroundto@offsetbehindperiod=\c@pgfmathroundto@prec
+ \def\pgfmathround@next{#1}%
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@gobble@rest@and@start}%
+ \else
+ \advance\c@pgfmathroundto@offsetbehindperiod by1
+ \ifnum#1=0
+ \advance\c@pgfmathroundto@lastzeros by1
+ \else
+ \c@pgfmathroundto@lastzeros=0
+ \fi
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter#1\the\pgfmathfloat@tmptoks}%
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ITERATE@DOT}%
+ \fi
+ \pgfmathround@nextcmd
+}%
+
+% in contrast to pgfmathroundto@impl@ITERATE@NODOT, this method here
+% checks also for signs
+\def\pgfmathroundto@impl@ITERATE@NODOT@firstcall#1{%
+ \def\pgfmathround@cur{#1}%
+ \ifx\pgfmathround@cur\pgfmathfloat@EOI
+ \pgfmathround@impl@PREPERIOD@is@negative@zerofalse
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@start}%
+ \else
+ \ifx\pgfmathround@cur\pgfmathfloatparsenumber@tok@PERIOD
+ \pgfmathround@impl@PREPERIOD@is@negative@zerofalse
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@BEGIN@DOT.}%
+ \else
+ \ifx\pgfmathround@cur\pgfmathfloatparsenumber@tok@MINUS
+ \else
+ \pgfmathround@impl@PREPERIOD@is@negative@zerofalse
+ \fi
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter#1\the\pgfmathfloat@tmptoks}%
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ITERATE@NODOT}%
+ \fi
+ \fi
+ \pgfmathround@nextcmd
+}
+
+\def\pgfmathroundto@impl@ITERATE@NODOT#1{%
+ \def\pgfmathround@cur{#1}%
+ \ifx\pgfmathround@cur\pgfmathfloat@EOI
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@start}%
+ \else
+ \ifx\pgfmathround@cur\pgfmathfloatparsenumber@tok@PERIOD
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@BEGIN@DOT.}%
+ \else
+ \ifx\pgfmathround@cur\pgfmathfloatparsenumber@tok@ZERO
+ \else
+ \pgfmathround@impl@PREPERIOD@is@negative@zerofalse
+ \fi
+ \pgfmathfloat@tmptoks=\expandafter{\expandafter#1\the\pgfmathfloat@tmptoks}%
+ \def\pgfmathround@nextcmd{\pgfmathroundto@impl@ITERATE@NODOT}%
+ \fi
+ \fi
+ \pgfmathround@nextcmd
+}
+
+%--------------------------------------------
+% END of pgfmathroundto implementation.
+%--------------------------------------------
+
+
+% flags, mantissa and exponent has already been stored into
+% \pgfmathfloat@a@* [using ...@Mtok]
+%
+% PRECONDITION:
+% \ifpgfmathfloatroundhasperiod = \iftrue outside of the current
+% group
+%
+% POSTCONDITION:
+% \ifpgfmathfloatroundhasperiod will be set after the current TeX
+% group.
+\def\pgfmathfloatround@impl{%
+ \expandafter\pgfmathroundto@impl\expandafter{\the\pgfmathfloat@a@Mtok}%
+ \ifpgfmathfloatroundmayneedrenormalize
+ \ifpgfmathfloatroundhasperiod
+ \expandafter\pgfmathfloatround@impl@renormalize\pgfmathresult\pgfmathfloat@EOI%
+ \else
+ \expandafter\pgfmathfloatround@impl@renormalize\pgfmathresult.\pgfmathfloat@EOI%
+ \fi
+ \advance\pgfmathfloat@a@E by1
+ \fi
+ \pgfmathfloatcreate{\the\pgfmathfloat@a@S}{\pgfmathresult}{\the\pgfmathfloat@a@E}%
+}
+
+\def\pgfmathfloatround@impl@renormalize#1#2.#3\pgfmathfloat@EOI{%
+ \pgfmathroundto@impl{#1.#2#3}%
+}
+
+
+
+
+
+% ATTENTION: this thing REQUIRES a period in the mantissa!
+% collects everything into \pgfmathresult
+\def\pgfmathfloattofixed@impl#1.#2\relax{%
+ \ifnum\pgfmathfloat@a@E<0
+ \ifcase-\pgfmathfloat@a@E
+ \or%e-1
+ \pgfmathfloat@a@Mtok={0.}%
+ \or%e-2
+ \pgfmathfloat@a@Mtok={0.0}%
+ \or%e-3
+ \pgfmathfloat@a@Mtok={0.00}%
+ \or%e-4
+ \pgfmathfloat@a@Mtok={0.000}%
+ \or%e-5
+ \pgfmathfloat@a@Mtok={0.0000}%
+ \or%e-6
+ \pgfmathfloat@a@Mtok={0.00000}%
+ \or%e-7
+ \pgfmathfloat@a@Mtok={0.000000}%
+ \or%e-8
+ \pgfmathfloat@a@Mtok={0.0000000}%
+ \or%e-9
+ \pgfmathfloat@a@Mtok={0.00000000}%
+ \or%e-10
+ \pgfmathfloat@a@Mtok={0.000000000}%
+ \else%<= -11
+ \pgfmathfloat@a@Mtok={0.0000000000}%
+ \advance\pgfmathfloat@a@E by10
+ \pgfutil@loop
+ \ifnum\pgfmathfloat@a@E<-1
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok 0}%
+ \advance\pgfmathfloat@a@E by1
+ \pgfutil@repeat
+ \fi
+ \def\pgfmathfloat@loc@TMPb{#2}%
+ \def\pgfmathfloat@loc@TMPc{0}%
+ \ifx\pgfmathfloat@loc@TMPb\pgfmathfloat@loc@TMPc
+ \edef\pgfmathresult{\the\pgfmathfloat@a@Mtok #1}%
+ \else
+ \edef\pgfmathresult{\the\pgfmathfloat@a@Mtok #1#2}%
+ \fi
+ \else
+ %--------------------------------------------------
+ % \ifnum\pgfmathfloat@a@E=0%
+ % \edef\pgfmathresult{#1.#2}%
+ % \else
+ % \pgfmathfloat@a@Mtok={#1}%
+ % \pgfmathfloattofixed@impl@collectmantissa#2\count\pgfmathfloat@a@E
+ % \edef\pgfmathresult{\the\pgfmathfloat@a@Mtok}%
+ % \fi
+ %--------------------------------------------------
+ \pgfmathfloat@a@Mtok{#1}%
+ \pgfmathfloattofixed@impl@pos#2000000000\pgfmathfloat@EOI
+ \edef\pgfmathresult{\the\pgfmathfloat@a@Mtok}%
+ \fi
+}
+
+% FIXME: this implementation here is very fast, but it introduces trailing zeros. Is that acceptable?
+\def\pgfmathfloattofixed@impl@pos#1#2#3#4#5#6#7#8#9\pgfmathfloat@EOI{%
+ \ifcase\pgfmathfloat@a@E
+ % e+0
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok .#1#2#3#4#5#6#7#8#9}%
+ \or%e+1
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1.#2#3#4#5#6#7#8#9}%
+ \or%e+2
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2.#3#4#5#6#7#8#9}%
+ \or%e+3
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3.#4#5#6#7#8#9}%
+ \or%e+4
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4.#5#6#7#8#9}%
+ \or%e+5
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4#5.#6#7#8#9}%
+ \or%e+6
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4#5#6.#7#8#9}%
+ \or%e+7
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4#5#6#7.#8#9}%
+ \or%e+8
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4#5#6#7#8.#9}%
+ \else%>=9
+ \pgfmathfloat@a@Mtok\expandafter{\the\pgfmathfloat@a@Mtok #1#2#3#4#5#6#7#8}%
+ \advance\pgfmathfloat@a@E by-8
+ \pgfmathfloattofixed@impl@collectmantissa#9\count\pgfmathfloat@a@E
+ \fi
+}%
+
+\def\pgfmathfloattofixed@impl@collectmantissa#1#2\count#3{%
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok #1}%
+ \advance\pgfmathfloat@a@E by-1%
+ \def\pgfmathfloat@loc@TMPb{#2}%
+ \ifx\pgfmathfloat@loc@TMPb\pgfutil@empty
+ \pgfutil@loop
+ \ifnum\pgfmathfloat@a@E>0%
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok 0}%
+ \advance\pgfmathfloat@a@E by-1%
+ \pgfutil@repeat
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok .0}%
+ \else
+ \ifnum\pgfmathfloat@a@E=0
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok .#2}%
+ \else
+ \pgfmathfloattofixed@impl@collectmantissa#2\count#3%
+ \fi
+ \fi
+}
+
+
+% ============================================
+%
+%
+% \pgfmathfloatparsenumber implementation
+%
+%
+% ============================================
+
+% accepted parser tokens:
+\def\pgfmathfloatparsenumber@tok@ZERO{0}
+\def\pgfmathfloatparsenumber@tok@PLUS{+}
+\def\pgfmathfloatparsenumber@tok@MINUS{-}
+\def\pgfmathfloatparsenumber@tok@PERIOD{.}
+
+\newif\ifpgfmathfloatparsenumberpendingperiod
+
+\def\pgfflt@EOI{p@EOI}%
+\def\pgfflt@EOI@unexpanded{\pgfflt@EOI}%
+
+% Starts a finite-start-machine parser to read a number.
+%
+% The machine's state is represented by the macro which is currently
+% processed; state transitions are realised using \csname...#1\endcsname
+% constructions.
+%
+% It assigns \pgfmathfloat@a@S, \pgfmathfloat@a@Mtok, \pgfmathfloat@a@E.
+\def\pgfflt@impl#1{%
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \pgfmathfloat@tmptoks={}% this register is used to collect PENDING ZEROS
+ \pgfmathfloat@a@E=0
+ % start parsing: check for sign:
+ \expandafter\ifx\csname pgfflt@#1\endcsname\relax
+ \pgfmathfloat@a@S=1
+ \expandafter\pgfflt@init\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgfflt@#1\endcsname
+ \fi
+}
+% State transitions:
+\expandafter\def\csname pgfflt@+\endcsname{%
+ \pgfmathfloat@a@S=1 %
+ \pgfflt@init}%
+\expandafter\def\csname pgfflt@-\endcsname{%
+ \pgfmathfloat@a@S=2 %
+ \pgfflt@init}%
+\expandafter\def\csname pgfflt@\pgfflt@EOI\endcsname{%
+ \pgfmathfloatparsenumber@handleerror{empty number}{}{}}%
+
+\pgfkeys{
+ /pgf/fpu/handlers/empty number/.style 2 args={%
+ /pgf/fpu/handlers/invalid number={#1}{#2}%
+ },
+ /pgf/fpu/empty number is zero/.style={%
+ /pgf/fpu/handlers/empty number/.code 2 args={%
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ }%
+ },%
+ /pgf/fpu/handlers/invalid separator/.code 2 args={%
+ \pgfmath@error{Could not parse input '#1' as a floating point number, sorry. The unreadable part was near the decimal separator '#2'. Do you need the option 'read comma as period'?}{}%
+ },
+ /pgf/fpu/handlers/invalid number/.code 2 args={%
+ \pgfmath@error{Could not parse input '#1' as a floating point number, sorry. The unreadable part was near '#2'.}{}%
+ },
+ /pgf/fpu/handlers/wrong lowlevel format/.code 2 args={%
+ \pgfmath@error{Sorry, an internal routine of the floating point unit got an ill-formatted floating point number `#1'. The unreadable part was near '#2'.}{}%
+ \let\pgfmathresult=\pgfutil@empty
+ },
+}
+
+% #1 the error handler
+% #2 the number which was invalid.
+% #3 the part which produced the error
+%
+% POSTCONDITION: the three registers
+% \pgfmathfloat@a@S
+% \pgfmathfloat@a@Mtok
+% \pgfmathfloat@a@E
+% will contain the number which results from the error handler.
+\def\pgfmathfloatparsenumber@handleerror#1#2#3{%
+ \let\pgfmathresult=\pgfutil@empty
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \pgfkeys{/pgf/fpu/handlers/#1={#2}{#3}}%
+ \ifx\pgfmathresult\pgfutil@empty
+ \pgfmathfloat@a@S=3
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0
+ \else
+ \expandafter\pgfmathfloat@decompose@tok\pgfmathresult\relax\pgfmathfloat@a@S\pgfmathfloat@a@Mtok\pgfmathfloat@a@E
+ \fi
+}
+\def\pgfflt@error#1\pgfflt@EOI{%
+ \begingroup
+ \pgfmathfloat@a@Mtok={#1}%
+ \xdef\pgfmathfloat@glob@TMP{%
+ \noexpand\pgfmathfloatparsenumber@handleerror
+ {invalid number}{\pgfmathresult}{\the\pgfmathfloat@a@Mtok}}%
+ \endgroup
+ \pgfmathfloat@glob@TMP
+}%
+
+
+
+% FROM: checksign.
+%
+\def\pgfflt@init#1{%
+ \expandafter\ifx\csname pgffltA@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltA@#1\endcsname
+ \fi}
+% state transitions:
+\expandafter\def\csname pgffltA@0\endcsname{\pgfflt@leadingzero}% FIXME: inline optimization!
+\expandafter\def\csname pgffltA@1\endcsname{\pgfflt@nonzerodigit1}%
+\expandafter\def\csname pgffltA@2\endcsname{\pgfflt@nonzerodigit2}%
+\expandafter\def\csname pgffltA@3\endcsname{\pgfflt@nonzerodigit3}%
+\expandafter\def\csname pgffltA@4\endcsname{\pgfflt@nonzerodigit4}%
+\expandafter\def\csname pgffltA@5\endcsname{\pgfflt@nonzerodigit5}%
+\expandafter\def\csname pgffltA@6\endcsname{\pgfflt@nonzerodigit6}%
+\expandafter\def\csname pgffltA@7\endcsname{\pgfflt@nonzerodigit7}%
+\expandafter\def\csname pgffltA@8\endcsname{\pgfflt@nonzerodigit8}%
+\expandafter\def\csname pgffltA@9\endcsname{\pgfflt@nonzerodigit9}%
+\def\pgfflt@nonzerodigit#1{%
+ \pgfmathfloat@a@Mtok={#1}%
+ \pgfmathfloatparsenumberpendingperiodtrue
+ \pgfflt@positiveexp}%
+\expandafter\def\csname pgffltA@n\endcsname{\pgfflt@readnan}% FIXME: inlining?
+\expandafter\def\csname pgffltA@N\endcsname{\pgfflt@readnan}% FIXME: inlining?
+\expandafter\def\csname pgffltA@i\endcsname{\pgfflt@readinf}% FIXME: inlining?
+\expandafter\def\csname pgffltA@I\endcsname{\pgfflt@readinf}% FIXME: inlining?
+\expandafter\def\csname pgffltA@.\endcsname{% read '.9' like '0.9'
+ \pgfmathfloat@a@E=-1
+ \pgfflt@leadingzero@foundperiod}%
+\expandafter\def\csname pgffltA@,\endcsname{% read ',9' like '0,9'
+ \pgfmathfloat@frenchinput{%
+ \pgfmathfloat@a@E=-1
+ \pgfflt@leadingzero@foundperiod
+ }%
+}%
+
+\def\pgfmathfloat@frenchinput#1{%
+ \ifpgfmathparsenumber@comma@as@period
+ \def\pgf@marshal{#1}%
+ \expandafter\pgf@marshal
+ \else
+ \expandafter\pgfflt@error@separator\expandafter,%
+ \fi
+}%
+\def\pgfflt@error@separator#1\pgfflt@EOI{%
+ \begingroup
+ \pgfmathfloat@a@Mtok={#1}%
+ \xdef\pgfmathfloat@glob@TMP{%
+ \noexpand\pgfmathfloatparsenumber@handleerror
+ {invalid separator}{\pgfmathresult}{\the\pgfmathfloat@a@Mtok}}%
+ \endgroup
+ \pgfmathfloat@glob@TMP
+}%
+
+\def\pgfflt@finish#1\pgfflt@EOI{}
+
+\def\pgfflt@readnan #1#2{%
+ \def\pgfflt@readnan@ok{1}%
+ \if#1a\else\if#1A\else\def\pgfflt@readnan@ok{0}\fi\fi
+ \if#2n\else\if#2N\else\def\pgfflt@readnan@ok{0}\fi\fi
+ \if\pgfflt@readnan@ok1%
+ \pgfmathfloat@a@S=3\relax%
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0%
+ \expandafter\pgfflt@finish
+ \else
+ \def\pgfflt@readnan@{\pgfflt@error #1#2}%
+ \expandafter\pgfflt@readnan@
+ \fi
+}
+\def\pgfflt@readinf #1#2{%
+ \def\pgfflt@readinf@ok{1}%
+ \if#1n\else\if#1N\else\def\pgfflt@readinf@ok{0}\fi\fi
+ \if#2f\else\if#2F\else\def\pgfflt@readinf@ok{0}\fi\fi
+ \if\pgfflt@readinf@ok1%
+ \ifnum\pgfmathfloat@a@S=1 %
+ \pgfmathfloat@a@S=4 %
+ \pgfmathfloat@a@Mtok={0.0}%
+ \else
+ \pgfmathfloat@a@S=5 %
+ \pgfmathfloat@a@Mtok={0.0}%
+ \fi
+ \pgfmathfloat@a@E=0 %
+ \expandafter\pgfflt@finish
+ \else
+ \def\pgfflt@readinf@{\pgfflt@error #1#2}%
+ \expandafter\pgfflt@readinf@
+ \fi
+}
+\def\pgfflt@leadingzero#1{%
+ \expandafter\ifx\csname pgffltB@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltB@#1\endcsname
+ \fi}
+% State transitions:
+\expandafter\def\csname pgffltB@0\endcsname{\pgfflt@leadingzero}%
+\expandafter\def\csname pgffltB@1\endcsname{\pgfmathfloat@a@Mtok={1}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@2\endcsname{\pgfmathfloat@a@Mtok={2}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@3\endcsname{\pgfmathfloat@a@Mtok={3}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@4\endcsname{\pgfmathfloat@a@Mtok={4}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@5\endcsname{\pgfmathfloat@a@Mtok={5}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@6\endcsname{\pgfmathfloat@a@Mtok={6}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@7\endcsname{\pgfmathfloat@a@Mtok={7}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@8\endcsname{\pgfmathfloat@a@Mtok={8}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@9\endcsname{\pgfmathfloat@a@Mtok={9}\pgfmathfloatparsenumberpendingperiodtrue \pgfflt@positiveexp}
+\expandafter\def\csname pgffltB@\pgfmathfloat@POSTFLAGSCHAR\endcsname{\pgfmathfloat@a@Mtok={0}\pgfflt@readlowlevelfloat}%
+\expandafter\def\csname pgffltB@.\endcsname{%
+ \pgfmathfloat@a@E=-1
+ \pgfflt@leadingzero@foundperiod}%
+\expandafter\def\csname pgffltB@,\endcsname{%
+ \pgfmathfloat@frenchinput{%
+ \pgfmathfloat@a@E=-1
+ \pgfflt@leadingzero@foundperiod
+ }%
+}%
+\expandafter\def\csname pgffltB@e\endcsname{%
+ \pgfmathfloat@a@S=0\relax%
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0%
+ \pgfflt@readexponent}%
+\let\pgffltB@E=\pgffltB@e
+\expandafter\def\csname pgffltB@\pgfflt@EOI\endcsname{%
+ \pgfmathfloat@a@S=0\relax%
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0}%
+
+\def\pgfflt@leadingzero@foundperiod#1{%
+ \expandafter\ifx\csname pgffltC@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltC@#1\endcsname
+ \fi}
+% State transitions:
+\expandafter\def\csname pgffltC@0\endcsname{%
+ \advance\pgfmathfloat@a@E by-1
+ \pgfflt@leadingzero@foundperiod}%
+\expandafter\def\csname pgffltC@1\endcsname{\pgfmathfloat@a@Mtok={1}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@2\endcsname{\pgfmathfloat@a@Mtok={2}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@3\endcsname{\pgfmathfloat@a@Mtok={3}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@4\endcsname{\pgfmathfloat@a@Mtok={4}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@5\endcsname{\pgfmathfloat@a@Mtok={5}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@6\endcsname{\pgfmathfloat@a@Mtok={6}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@7\endcsname{\pgfmathfloat@a@Mtok={7}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@8\endcsname{\pgfmathfloat@a@Mtok={8}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@9\endcsname{\pgfmathfloat@a@Mtok={9}\pgfmathfloatparsenumberpendingperiodtrue\pgfflt@finish@number@after@period}%
+\expandafter\def\csname pgffltC@e\endcsname{%
+ \pgfmathfloat@a@S=0\relax%
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0%
+ \pgfflt@readexponent}%
+\let\pgffltC@E=\pgffltC@e
+\expandafter\def\csname pgffltC@\pgfflt@EOI\endcsname{%
+ \pgfmathfloat@a@S=0\relax%
+ \pgfmathfloat@a@Mtok={0.0}%
+ \pgfmathfloat@a@E=0}%
+
+
+\def\pgfflt@positiveexp#1{%
+ \expandafter\ifx\csname pgffltD@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltD@#1\endcsname
+ \fi}
+% State transitions:
+\expandafter\def\csname pgffltD@0\endcsname{%
+ \advance\pgfmathfloat@a@E by1
+ \pgfmathfloat@tmptoks=\expandafter{\the\pgfmathfloat@tmptoks0}%
+ \pgfflt@pendingzeros@positiveexp}%
+\expandafter\def\csname pgffltD@1\endcsname{\pgffltD@nonzerodigit1}%
+\expandafter\def\csname pgffltD@2\endcsname{\pgffltD@nonzerodigit2}%
+\expandafter\def\csname pgffltD@3\endcsname{\pgffltD@nonzerodigit3}%
+\expandafter\def\csname pgffltD@4\endcsname{\pgffltD@nonzerodigit4}%
+\expandafter\def\csname pgffltD@5\endcsname{\pgffltD@nonzerodigit5}%
+\expandafter\def\csname pgffltD@6\endcsname{\pgffltD@nonzerodigit6}%
+\expandafter\def\csname pgffltD@7\endcsname{\pgffltD@nonzerodigit7}%
+\expandafter\def\csname pgffltD@8\endcsname{\pgffltD@nonzerodigit8}%
+\expandafter\def\csname pgffltD@9\endcsname{\pgffltD@nonzerodigit9}%
+\expandafter\def\csname pgffltD@\pgfmathfloat@POSTFLAGSCHAR\endcsname{\pgfflt@readlowlevelfloat}%
+\expandafter\def\csname pgffltD@.\endcsname{\pgfflt@finish@number@after@period}% FIXME : inlining?
+\expandafter\def\csname pgffltD@,\endcsname{\pgfmathfloat@frenchinput{\pgfflt@finish@number@after@period}}%
+\expandafter\def\csname pgffltD@e\endcsname{\pgfflt@readexponent}% FIXME : inlining?
+\let\pgffltD@E=\pgffltD@e
+\expandafter\def\csname pgffltD@\pgfflt@EOI\endcsname{}% NOP
+\def\pgffltD@nonzerodigit#1{%
+ \advance\pgfmathfloat@a@E by1
+ \ifpgfmathfloatparsenumberpendingperiod
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok.}%
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \fi
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok#1}%
+ \pgfflt@positiveexp}%
+
+% Read a low-level floating point.
+% Since we are in the second state, \pgfmathfloat@a@Mtok contains the
+% FLAGS. The post-flags-char has also been read.
+\def\pgfflt@readlowlevelfloat#1e#2]\pgfflt@EOI{%
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \pgfmathfloat@a@S=\the\pgfmathfloat@a@Mtok\relax
+ \pgfmathfloat@a@Mtok={#1}%
+ \pgfmathfloat@a@E=#2
+}%
+
+\def\pgfflt@readexponent#1\pgfflt@EOI{%
+ \afterassignment\pgfflt@readexponent@
+ \pgfmathfloat@b@E=#1 \pgfflt@EOI% the white space is important, otherwise \pgfflt@EOI will be expanded.
+}
+\def\pgfflt@readexponent@#1{%
+ \advance\pgfmathfloat@a@E by\pgfmathfloat@b@E\relax
+ %
+ % sanity checking:
+ \def\pgfmathfloat@loc@TMPb{#1}%
+ \ifx\pgfmathfloat@loc@TMPb\pgfflt@EOI@unexpanded
+ \else
+ \def\pgfmathfloat@loc@TMPb{\pgfflt@error#1}%
+ \expandafter\pgfmathfloat@loc@TMPb
+ \fi
+}
+
+\def\pgfflt@pendingzeros@positiveexp#1{%
+ \expandafter\ifx\csname pgffltE@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltE@#1\endcsname
+ \fi}
+% State transitions:
+\expandafter\def\csname pgffltE@0\endcsname{%
+ \pgfmathfloat@tmptoks=\expandafter{\the\pgfmathfloat@tmptoks0}%
+ \advance\pgfmathfloat@a@E by1
+ \pgfflt@pendingzeros@positiveexp}%
+\expandafter\def\csname pgffltE@1\endcsname{\pgffltE@nonzerodigit1}%
+\expandafter\def\csname pgffltE@2\endcsname{\pgffltE@nonzerodigit2}%
+\expandafter\def\csname pgffltE@3\endcsname{\pgffltE@nonzerodigit3}%
+\expandafter\def\csname pgffltE@4\endcsname{\pgffltE@nonzerodigit4}%
+\expandafter\def\csname pgffltE@5\endcsname{\pgffltE@nonzerodigit5}%
+\expandafter\def\csname pgffltE@6\endcsname{\pgffltE@nonzerodigit6}%
+\expandafter\def\csname pgffltE@7\endcsname{\pgffltE@nonzerodigit7}%
+\expandafter\def\csname pgffltE@8\endcsname{\pgffltE@nonzerodigit8}%
+\expandafter\def\csname pgffltE@9\endcsname{\pgffltE@nonzerodigit9}%
+\expandafter\def\csname pgffltE@.\endcsname{\pgfflt@finish@number@after@period}% FIXME : inlining?
+\expandafter\def\csname pgffltE@,\endcsname{\pgfmathfloat@frenchinput{\pgfflt@finish@number@after@period}}% FIXME : inlining?
+\def\pgffltE@e{\pgfflt@readexponent}% FIXME : inlining?
+\let\pgffltE@E=\pgffltE@e
+\expandafter\def\csname pgffltE@\pgfflt@EOI\endcsname{}% NOP
+\def\pgffltE@nonzerodigit#1{%
+ \advance\pgfmathfloat@a@E by1
+ \ifpgfmathfloatparsenumberpendingperiod
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok.}%
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \fi
+ \pgfmathfloat@a@Mtok=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfmathfloat@a@Mtok\the\pgfmathfloat@tmptoks}%
+ \pgfmathfloat@tmptoks={}%
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok#1}%
+ \pgfflt@positiveexp}%
+
+\def\pgfflt@finish@number@after@period#1{%
+ \expandafter\ifx\csname pgffltF@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltF@#1\endcsname
+ \fi}
+% State transitions:
+\expandafter\def\csname pgffltF@0\endcsname{%
+ \pgfmathfloat@tmptoks=\expandafter{\the\pgfmathfloat@tmptoks0}%
+ \pgfflt@pendingzeros}%
+\expandafter\def\csname pgffltF@1\endcsname{\pgffltF@nonzerodigit1}%
+\expandafter\def\csname pgffltF@2\endcsname{\pgffltF@nonzerodigit2}%
+\expandafter\def\csname pgffltF@3\endcsname{\pgffltF@nonzerodigit3}%
+\expandafter\def\csname pgffltF@4\endcsname{\pgffltF@nonzerodigit4}%
+\expandafter\def\csname pgffltF@5\endcsname{\pgffltF@nonzerodigit5}%
+\expandafter\def\csname pgffltF@6\endcsname{\pgffltF@nonzerodigit6}%
+\expandafter\def\csname pgffltF@7\endcsname{\pgffltF@nonzerodigit7}%
+\expandafter\def\csname pgffltF@8\endcsname{\pgffltF@nonzerodigit8}%
+\expandafter\def\csname pgffltF@9\endcsname{\pgffltF@nonzerodigit9}%
+\def\pgffltF@e{\pgfflt@readexponent}%
+\let\pgffltF@E=\pgffltF@e
+\expandafter\def\csname pgffltF@\pgfflt@EOI\endcsname{}% NOP
+\def\pgffltF@nonzerodigit#1{%
+ \ifpgfmathfloatparsenumberpendingperiod
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok.}%
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \fi
+ \pgfmathfloat@a@Mtok=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfmathfloat@a@Mtok\the\pgfmathfloat@tmptoks}%
+ \pgfmathfloat@tmptoks={}%
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok#1}%
+ \pgfflt@finish@number@after@period}%
+
+
+\def\pgfflt@pendingzeros#1{%
+ \expandafter\ifx\csname pgffltG@#1\endcsname\relax
+ \expandafter\pgfflt@error\expandafter#1%
+ \else
+ \expandafter\expandafter\csname pgffltG@#1\endcsname
+ \fi}
+% State transitions:
+\expandafter\def\csname pgffltG@0\endcsname{%
+ \pgfmathfloat@tmptoks=\expandafter{\the\pgfmathfloat@tmptoks0}%
+ \pgfflt@pendingzeros}%
+\expandafter\def\csname pgffltG@1\endcsname{\pgffltG@nonzerodigit1}%
+\expandafter\def\csname pgffltG@2\endcsname{\pgffltG@nonzerodigit2}%
+\expandafter\def\csname pgffltG@3\endcsname{\pgffltG@nonzerodigit3}%
+\expandafter\def\csname pgffltG@4\endcsname{\pgffltG@nonzerodigit4}%
+\expandafter\def\csname pgffltG@5\endcsname{\pgffltG@nonzerodigit5}%
+\expandafter\def\csname pgffltG@6\endcsname{\pgffltG@nonzerodigit6}%
+\expandafter\def\csname pgffltG@7\endcsname{\pgffltG@nonzerodigit7}%
+\expandafter\def\csname pgffltG@8\endcsname{\pgffltG@nonzerodigit8}%
+\expandafter\def\csname pgffltG@9\endcsname{\pgffltG@nonzerodigit9}%
+\def\pgffltG@e{\pgfflt@readexponent}% FIXME: inlining?
+\let\pgffltG@E=\pgffltG@e
+\expandafter\def\csname pgffltG@\pgfflt@EOI\endcsname{}% NOP
+\def\pgffltG@nonzerodigit#1{%
+ \ifpgfmathfloatparsenumberpendingperiod
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok.}%
+ \pgfmathfloatparsenumberpendingperiodfalse
+ \fi
+ \pgfmathfloat@a@Mtok=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfmathfloat@a@Mtok\the\pgfmathfloat@tmptoks}%
+ \pgfmathfloat@tmptoks={}%
+ \pgfmathfloat@a@Mtok=\expandafter{\the\pgfmathfloat@a@Mtok#1}%
+ \pgfflt@finish@number@after@period}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.base.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.base.code.tex
new file mode 100644
index 0000000000..9370a219fe
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.base.code.tex
@@ -0,0 +1,330 @@
+% Copyright 2007 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.
+%
+% This file provides basic macros for converting between bases.
+%
+% Version 1.4142135 8/11/2008
+
+% Base conversion operations for the parser.
+%
+\pgfmathdeclarefunction{bin}{1}{%
+ \begingroup%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \c@pgfmath@counta=#1\relax\pgfmath@%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\the\c@pgfmath@counta}{10}{2}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+\pgfmathdeclarefunction{hex}{1}{%
+ \begingroup%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \c@pgfmath@counta=#1\relax\pgfmath@%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\the\c@pgfmath@counta}{10}{16}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+\pgfmathdeclarefunction{Hex}{1}{%
+ \begingroup%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \c@pgfmath@counta=#1\relax\pgfmath@%
+ \expandafter\pgfmathbasetoBase\expandafter\pgfmathresult\expandafter{\the\c@pgfmath@counta}{10}{16}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+\pgfmathdeclarefunction{oct}{1}{%
+ \begingroup%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \c@pgfmath@counta=#1\relax\pgfmath@%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\the\c@pgfmath@counta}{10}{8}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% Additional macros:
+
+% \pgfmathbasetodec
+%
+% Convert a representation of an integer from
+% the specified base to base 10.
+%
+% #1 - a macro to store the result.
+% #2 - the representation of a number (i.e. not a register)
+% #3 - the current base.
+%
+% e.g.
+%
+% \pgfmathbasetodec\mynumber{10111}{2}
+%
+% \mynumber <- 23
+%
+\def\pgfmathbasetodec#1#2#3{%
+ \pgfmath@checknumber{#2}%
+ \pgfmath@checkbase{#3}%
+ \def\pgfmath@base{#3}%
+ \def\pgfmath@base@macro{#1}%
+ \c@pgfmath@counta=1\relax%
+ \let\pgfmath@reversed=\pgfmath@empty%
+ \expandafter\pgfmathbasetodec@#2\pgfmath@base@stop}
+
+\def\pgfmathbasetodec@#1{%
+ \ifx#1\pgfmath@base@stop%
+ \c@pgfmath@countb=0%
+ \divide\c@pgfmath@counta by\pgfmath@base\relax%
+ \expandafter\pgfmathbasetodec@@%
+ \else%
+ \edef\pgfmath@reversed{\pgfmath@reversed#1}%
+ \expandafter\multiply\expandafter\c@pgfmath@counta\pgfmath@base\relax%
+ \expandafter\pgfmathbasetodec@%
+ \fi}
+
+\def\pgfmathbasetodec@@{\expandafter\pgfmathbasetodec@@@\pgfmath@reversed\pgfmathbasetodec}
+
+\def\pgfmathbasetodec@@@#1{%
+ \ifx\pgfmathbasetodec#1\relax%
+ \expandafter\edef\pgfmath@base@macro{\the\c@pgfmath@countb}%
+ \let\pgfmath@next=\pgfmathbasetodec@@@@%
+ \else%
+ \chardef\pgfmath@charnum`#1\relax%
+ \c@pgfmath@countc=\pgfmath@charnum\relax%
+ \ifnum\c@pgfmath@countc>96\relax%
+ \advance\c@pgfmath@countc by-87\relax%
+ \else
+ \ifnum\c@pgfmath@countc>64\relax%
+ \advance\c@pgfmath@countc by-55\relax%
+ \else
+ \advance\c@pgfmath@countc by-48\relax%
+ \fi%
+ \fi%
+ \ifnum\c@pgfmath@countc<\pgfmath@base\relax%
+ \multiply\c@pgfmath@countc by\c@pgfmath@counta%
+ \advance\c@pgfmath@countb by\c@pgfmath@countc%
+ \divide\c@pgfmath@counta by\pgfmath@base\relax%
+ \let\pgfmath@next\pgfmathbasetodec@@@%
+ \else
+ \pgfmath@error{Digit `#1' invalid for base \pgfmath@base}%
+ \let\pgfmath@next=\relax%
+ \fi%
+ \fi%
+ \pgfmath@next}
+\def\pgfmathbasetodec@@@@{%
+ \expandafter\pgfmath@ensurenumberlength\expandafter{\pgfmath@base@macro}%
+}
+
+% \pgfmathdectobase
+%
+% Convert a representation of an integer from
+% base 10 to the specified base. Letters for bases
+% greater than 10 are in lowercase.
+%
+% #1 - a macro to store the result.
+% #2 - a number in base 10 (in a macro, not a register)
+% #3 - the required base.
+%
+% e.g.
+%
+% \pgfmathdectobase\mynumber{127}{16}
+%
+% \mynumber <- 7f
+%
+\def\pgfmathdectobase#1#2#3{%
+ \pgfmath@checknumber{#2}%
+ \pgfmath@checkbase{#3}%
+ \c@pgfmath@counta=#2\relax%
+ \let#1=\pgfmath@empty%
+ \pgfmathloop
+ \ifnum\c@pgfmath@counta>0\relax%
+ \c@pgfmath@countb=\c@pgfmath@counta%
+ \divide\c@pgfmath@countb by#3\relax%
+ \multiply\c@pgfmath@countb by-#3\relax%
+ \advance\c@pgfmath@countb by\c@pgfmath@counta%
+ \edef#1{\csname pgfmath@lowercase digit@\the\c@pgfmath@countb\endcsname#1}%
+ \divide\c@pgfmath@counta by#3\relax%
+ \repeatpgfmathloop%
+ \pgfmath@ensurenumberlength{#1}}
+
+% \pgfmathdectoBase
+%
+% Convert a representation of an integer from
+% base 10 to the specified base. Letters for bases
+% greater than 10 are in uppercase.
+%
+% #1 - a macro to store the result.
+% #2 - a number in base 10 (in a macro, not a register)
+% #3 - the required base.
+%
+% e.g.
+%
+% \pgfmathdectoBase\mynumber{127}{16}
+%
+% \mynumber <- 7F
+%
+\def\pgfmathdectoBase#1#2#3{%
+ \pgfmath@checkbase{#3}%
+ \pgfmath@checknumber{#2}%
+ \c@pgfmath@counta=#2\relax%
+ \let#1=\pgfmath@empty%
+ \pgfmathloop
+ \ifnum\c@pgfmath@counta>0\relax%
+ \c@pgfmath@countb=\c@pgfmath@counta%
+ \divide\c@pgfmath@countb by#3\relax%
+ \multiply\c@pgfmath@countb by-#3\relax%
+ \advance\c@pgfmath@countb by\c@pgfmath@counta%
+ \edef#1{\csname pgfmath@uppercase digit@\the\c@pgfmath@countb\endcsname#1}%
+ \divide\c@pgfmath@counta by#3\relax%
+ \repeatpgfmathloop%
+ \pgfmath@ensurenumberlength{#1}}
+
+\def\pgfmath@base@digits@create{%
+ \def\pgfmath@base@digit@style{lowercase digit}%
+ \c@pgfmath@counta=0\relax%
+ \pgfmath@base@digits@create@0123456789abcdefghijklmnopqrstuvwxyz\pgfmath@base@digits@create%
+ \def\pgfmath@base@digit@style{uppercase digit}%
+ \c@pgfmath@counta=0\relax%
+ \pgfmath@base@digits@create@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\pgfmath@base@digits@create}
+
+\def\pgfmath@base@digits@create@#1{%
+ \ifx\pgfmath@base@digits@create#1\relax%
+ \else%
+ \expandafter\pgfmath@def\expandafter{\pgfmath@base@digit@style}{\the\c@pgfmath@counta}{#1}%
+ \advance\c@pgfmath@counta by1\relax%
+ \expandafter\pgfmath@base@digits@create@%
+ \fi}
+\pgfmath@base@digits@create
+
+% \pgfmathbasetobase
+%
+% Convert a representation of an integer from
+% between the specified bases. Letters for target
+% bases greater than 10 are in uppercase.
+%
+% #1 - a macro to store the result.
+% #2 - a number (in a macro, not a register)
+% #3 - the source base.
+% #4 - the target base.
+%
+% e.g.
+%
+% \pgfmathbasetobase\mynumber{4321}{5}{9}
+%
+% \mynumber <- 721
+%
+\def\pgfmathbasetobase#1#2#3#4{%
+ \pgfmathbasetodec{\pgfmath@base@temp}{#2}{#3}%
+ \pgfmathdectobase{#1}{\pgfmath@base@temp}{#4}%
+}
+
+% \pgfmathbasetobase
+%
+% Convert a representation of an integer from
+% between the specified bases. Letters for target
+% bases greater than 10 are in uppercase.
+%
+% #1 - a macro to store the result.
+% #2 - a number (in a macro, not a register)
+% #3 - the source base.
+% #4 - the target base.
+%
+% e.g.
+%
+% \pgfmathbasetobase\mynumber{1234}{5}{12}
+%
+% \mynumber <- 142
+%
+\def\pgfmathbasetoBase#1#2#3#4{%
+ \pgfmathbasetodec{\pgfmath@base@temp}{#2}{#3}%
+ \pgfmathdectoBase{#1}{\pgfmath@base@temp}{#4}%
+}
+
+\def\pgfmath@checkbase#1{%
+ \ifnum#1<2\relax%
+ \pgfmath@error{Cannot process numbers in base `#1'.}%
+ \else%
+ \ifnum#1>36\relax%
+ \pgfmath@error{Cannot process numbers in base `#1'.}%
+ \fi%
+ \fi}
+
+\def\pgfmath@checknumber#1{%
+ \expandafter\pgfmath@checknumber@#1\pgfmath@}
+\def\pgfmath@checknumber@#1#2\pgfmath@{%
+ \ifx#1-%
+ \pgfmath@error{Cannot process negative numbers.}%
+ \fi}
+
+% \pgfmath@ensurenumberlength
+%
+% Internal macro for making a representation of a number have
+% a specific length, byte prefixing zeros to the number.
+%
+% #1 - a macro containing a representation of an integer.
+% #2 - the number of digits to ensure.
+%
+% e.g.
+%
+% \foo <- 7FF
+%
+% \pgfmathsetnumberlength{8}%
+% \pgfmath@ensurenumberlength\foo
+%
+% \foo <- 000007FF
+%
+\def\pgfmath@ensurenumberlength#1{%
+ \def\pgfmath@base@tempa{#1}%
+ \expandafter\c@pgfmath@counta\pgfmath@basenumberlength\relax%
+ \expandafter\pgfmath@ensurenumberlength@#1\pgfmath@ensurenumberlength}
+\def\pgfmath@ensurenumberlength@#1{%
+ \ifx\pgfmath@ensurenumberlength#1\relax%
+ \expandafter\pgfmath@ensurenumberlength@@%
+ \else%
+ \advance\c@pgfmath@counta by-1\relax%
+ \expandafter\pgfmath@ensurenumberlength@
+ \fi}
+
+\def\pgfmath@ensurenumberlength@@{%
+ \edef\pgfmath@base@tempb{\pgfmath@base@tempa}%
+ \pgfmath@ensurenumberlength@@@}
+\def\pgfmath@ensurenumberlength@@@{%
+ \ifnum\c@pgfmath@counta>0\relax%
+ \advance\c@pgfmath@counta by-1\relax%
+ \edef\pgfmath@base@tempb{0\pgfmath@base@tempb}%
+ \expandafter\pgfmath@ensurenumberlength@@@%
+ \fi%
+ \expandafter\edef\pgfmath@base@tempa{\pgfmath@base@tempb}}
+
+\def\pgfmathsetbasenumberlength#1{\def\pgfmath@basenumberlength{#1}}
+\pgfmathsetbasenumberlength{1}%
+
+% \pgfmathtodigitlist\marg{macro}\marg{number}}
+%
+% This command converts \meta{number} into a comma-separated
+% list of digits and stores the result in \meta{macro}.
+% The \marg{number} is \emph{not} parsed before processing.
+%
+\def\pgfmathtodigitlist#1#2{%
+ \def\pgfmath@temp{#1}%
+ \let\pgfmath@digitlist=\pgfutil@empty%
+ \edef\pgfmath@@tmp{#2}%
+ \expandafter\pgfmath@todigitlist\pgfmath@@tmp @%
+}
+\def\pgfmath@base@atchar{@}
+\def\pgfmath@todigitlist#1{%
+ \def\pgfmath@digit{#1}%
+ \ifx\pgfmath@digit\pgfmath@base@atchar%
+ \expandafter\let\pgfmath@temp=\pgfmath@digitlist%
+ \else%
+ \ifx\pgfmath@digitlist\pgfutil@empty%
+ \edef\pgfmath@digitlist{#1}%
+ \else%
+ \edef\pgfmath@digitlist{\pgfmath@digitlist,#1}%
+ \fi%
+ \expandafter\pgfmath@todigitlist%
+ \fi%
+}
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.basic.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.basic.code.tex
new file mode 100644
index 0000000000..2dbf154d8b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.basic.code.tex
@@ -0,0 +1,803 @@
+% Copyright 2007 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.
+
+% This file defines the mathematical functions and operators.
+%
+% Version 1.4142135 25/8/2008
+
+% add function.
+%
+\pgfmathdeclarefunction{add}{2}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \pgfmath@y=#2pt\relax%
+ \advance\pgfmath@x by\pgfmath@y%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+
+% subtract function.
+%
+\pgfmathdeclarefunction{subtract}{2}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \pgfmath@y=#2pt\relax%
+ \advance\pgfmath@x by-\pgfmath@y%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% neg function.
+%
+\pgfmathdeclarefunction{neg}{1}{%
+ \begingroup%
+ \pgfmath@x=-#1pt\relax%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+% change the precedence for neg.
+% Otherwise, unary minus and exponentiation won't have the correct precedence
+% (test '-2^2')
+\def\pgfmath@operation@neg@precedence{500}
+
+% multiply function.
+%
+\pgfmathdeclarefunction{multiply}{2}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \pgfmath@y=#2pt\relax%
+ \pgfmath@x=\pgfmath@tonumber{\pgfmath@y}\pgfmath@x%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% divide function.
+%
+\newif\ifpgfmath@divide@period
+
+\pgfmathdeclarefunction{divide}{2}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \pgfmath@y=#2pt\relax%
+ \let\pgfmath@sign=\pgfmath@empty%
+ \ifdim0pt=\pgfmath@y%
+ \pgfmath@error{You've asked me to divide `#1' by `#2', %
+ but I cannot divide any number by `#2'}%
+ \fi%
+ \afterassignment\pgfmath@xa%
+ \c@pgfmath@counta\the\pgfmath@y\relax%
+ \ifdim0pt=\pgfmath@xa%
+ \divide\pgfmath@x by\c@pgfmath@counta%
+ \else%
+ \ifdim0pt>\pgfmath@x%
+ \def\pgfmath@sign{-}%
+ \pgfmath@x=-\pgfmath@x%
+ \fi%
+ \ifdim0pt>\pgfmath@y%
+ \expandafter\def\expandafter\pgfmath@sign\expandafter{\pgfmath@sign-}%
+ \pgfmath@y=-\pgfmath@y%
+ \fi%
+ \ifdim1pt>\pgfmath@y%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgfmath@y}}%
+ \pgfmath@x=\pgfmath@sign\pgfmathresult\pgfmath@x%
+ \else%
+ \def\pgfmathresult{0}%
+ \pgfmath@divide@periodtrue%
+ \c@pgfmath@counta=0\relax%
+ \pgfmathdivide@@%
+ \pgfmath@x=\pgfmath@sign\pgfmathresult pt\relax%
+ \fi%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+\def\pgfmath@small@number{0.00002}
+
+\def\pgfmathdivide@@{%
+ \let\pgfmath@next=\relax%
+ \ifdim\pgfmath@small@number pt<\pgfmath@x%
+ \ifdim\pgfmath@small@number pt<\pgfmath@y%
+ \ifdim\pgfmath@y>\pgfmath@x%
+ \ifpgfmath@divide@period%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult.}%
+ \pgfmath@divide@periodfalse%
+ \fi%
+ \pgfmathdivide@dimenbyten\pgfmath@y%
+ \ifdim\pgfmath@y>\pgfmath@x%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult0}%
+ \fi%
+ \else%
+ \c@pgfmath@counta=\pgfmath@x%
+ \c@pgfmath@countb=\pgfmath@y%
+ \divide\c@pgfmath@counta by\c@pgfmath@countb%
+ \pgfmath@ya=\c@pgfmath@counta\pgfmath@y%
+ \advance\pgfmath@x by-\pgfmath@ya%
+ \def\pgfmath@next{%
+ \toks0=\expandafter{\pgfmathresult}%
+ \edef\pgfmathresult{\the\toks0 \the\c@pgfmath@counta}%
+ }%
+ \ifpgfmath@divide@period
+ \else
+ % we are behind the period. It may happen that the
+ % result is more than one digit - in that case,
+ % introduce special handling:
+ \ifnum\c@pgfmath@counta>9 %
+ \expandafter\pgfmathdivide@advance@last@digit\pgfmathresult CCCCC\@@
+ \advance\c@pgfmath@counta by-10 %
+ \ifnum\c@pgfmath@counta=0
+ \let\pgfmath@next=\relax
+ \fi
+ \fi
+ \fi
+ \pgfmath@next
+ \fi%
+ \let\pgfmath@next=\pgfmathdivide@@%
+ \fi%
+ \fi%
+ \pgfmath@next%
+}
+
+% advances the last digit found in the number. Any missing digits are
+% supposed to be filled with 'C'.
+\def\pgfmathdivide@advance@last@digit#1.#2#3#4#5#6#7\@@{%
+ \pgfmath@ya=\pgfmathresult pt %
+ \if#2C%
+ \pgfmath@xa=1pt %
+ \else
+ \if#3C%
+ \pgfmath@xa=0.1pt %
+ \else
+ \if#4C%
+ \pgfmath@xa=0.01pt %
+ \else
+ \if#5C%
+ \pgfmath@xa=0.001pt %
+ \else
+ \if#6C%
+ \pgfmath@xa=0.0001pt %
+ \else
+ \pgfmath@xa=0.00001pt %
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \advance\pgfmath@ya by\pgfmath@xa
+ \edef\pgfmathresult{\pgfmath@tonumber@notrailingzero\pgfmath@ya}%
+}%
+
+{
+\catcode`\p=12
+\catcode`\t=12
+\gdef\Pgf@geT@NO@TRAILING@ZERO#1.#2pt{%
+ #1.%
+ \ifnum#2=0 \else #2\fi
+}
+}
+\def\pgfmath@tonumber@notrailingzero#1{\expandafter\Pgf@geT@NO@TRAILING@ZERO\the#1}
+
+
+\def\pgfmathdivide@dimenbyten#1{%
+ \edef\pgfmath@temp{\pgfmath@tonumber{#1}}%
+ \expandafter\pgfmathdivide@@dimenbyten\pgfmath@temp\@@#1\@@}
+\def\pgfmathdivide@@dimenbyten#1.#2\@@#3\@@{%
+ \pgfmath@tempcnta=#1\relax%
+ \divide\pgfmath@tempcnta by10\relax%
+ \pgfmath@tempcntb=\pgfmath@tempcnta%
+ \multiply\pgfmath@tempcnta by-10\relax%
+ \advance\pgfmath@tempcnta by#1\relax%
+ #3=\the\pgfmath@tempcntb.\the\pgfmath@tempcnta#2pt\relax%
+}
+
+
+% reciprocal function.
+%
+\pgfmathdeclarefunction{reciprocal}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \ifdim\pgfmath@x=0pt\relax%
+ \pgfmath@error{You asked me to calculate `1/#1', but I cannot divide any number by zero}{}%
+ \fi%
+ \edef\pgfmath@reciprocaltemp{\pgfmath@tonumber{\pgfmath@x}}%
+ \expandafter\pgfmathreciprocal@@\pgfmath@reciprocaltemp0000000\pgfmath@}
+\def\pgfmathreciprocal@@#1.#2#3#4#5#6#7\pgfmath@{%
+ \c@pgfmath@counta#2#3#4#5#6\relax%
+ % If the number is an integer, use TeX arithmetic.
+ \ifnum\c@pgfmath@counta=0\relax%
+ \pgfmath@x1pt\relax%
+ \divide\pgfmath@x#1\relax%
+ \else%
+ \ifnum#1>100\relax%
+ \c@pgfmath@counta#1#2#3#4\relax%
+ \c@pgfmath@countb1000000000\relax%
+ \divide\c@pgfmath@countb\c@pgfmath@counta%
+ \c@pgfmath@counta\c@pgfmath@countb%
+ \divide\c@pgfmath@counta10000\relax%
+ \pgfmath@x\c@pgfmath@counta pt\relax%
+ \multiply\c@pgfmath@counta-10000\relax%
+ \advance\c@pgfmath@countb\c@pgfmath@counta%
+ \pgfmath@y\c@pgfmath@countb pt\relax%
+ \divide\pgfmath@y1000000\relax%
+ \advance\pgfmath@x\pgfmath@y%
+ \else%
+ \c@pgfmath@counta#1#2#3#4#5#6\relax%
+ \c@pgfmath@countb1000000000\relax%
+ \divide\c@pgfmath@countb\c@pgfmath@counta%
+ \c@pgfmath@counta\c@pgfmath@countb%
+ \divide\c@pgfmath@counta10000\relax%
+ \pgfmath@x\c@pgfmath@counta pt\relax%
+ \multiply\c@pgfmath@counta-10000\relax%
+ \advance\c@pgfmath@countb\c@pgfmath@counta%
+ \pgfmath@y\c@pgfmath@countb pt\relax%
+ \pgfmath@y.1\pgfmath@y% Yes! This way is more accurate. Go figure...
+ \pgfmath@y.1\pgfmath@y%
+ \pgfmath@y.1\pgfmath@y%
+ \pgfmath@y.1\pgfmath@y%
+ \advance\pgfmath@x\pgfmath@y%
+ \fi%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% div function.
+%
+\pgfmathdeclarefunction{div}{2}{%
+ \begingroup%
+ \pgfmathdivide@{#1}{#2}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathceil@{\pgfmathresult}%
+ \else%
+ \pgfmathfloor@{\pgfmathresult}%
+ \fi%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \c@pgfmath@counta=\pgfmathresult\relax\pgfmath@%
+ \edef\pgfmathresult{\the\c@pgfmath@counta}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% mod function.
+%
+\pgfmathdeclarefunction{mod}{2}{%
+ \begingroup%
+ \pgfmath@xa#1pt%
+ \pgfmath@xb#2pt%
+ \pgfmath@x\pgfmath@xa%
+ \c@pgfmath@counta\pgfmath@xa%
+ \c@pgfmath@countb\pgfmath@xb%
+ \divide\c@pgfmath@counta\c@pgfmath@countb%
+ \multiply\pgfmath@xb\c@pgfmath@counta%
+ \advance\pgfmath@x-\pgfmath@xb%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% Mod function (never negative).
+%
+\pgfmathdeclarefunction{Mod}{2}{%
+ \begingroup%
+ \pgfmathmod@{#1}{#2}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \ifdim\pgfmath@x<0pt\relax%
+ \advance\pgfmath@x by#2pt\relax%
+ \fi%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% abs function.
+%
+\pgfmathdeclarefunction{abs}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% sign(x)
+\pgfmathdeclarefunction{sign}{1}{%
+ \begingroup
+ \ifdim#1pt>0sp %
+ \def\pgfmathresult{1}%
+ \else
+ \ifdim#1pt=0sp %
+ \def\pgfmathresult{0}%
+ \else
+ \def\pgfmathresult{-1}%
+ \fi
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}
+
+% e constant.
+%
+\pgfmathdeclarefunction{e}{0}{\def\pgfmathresult{2.718281828}}
+
+% ln function.
+%
+% This is based on an algorithm due to Rouben Rostamian and
+% uses coefficients contributed by Alain Matthes.
+%
+\pgfmathdeclarefunction{ln}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \ifdim\pgfmath@x>0pt\else%
+ \pgfmath@error{I cannot calculate the logarithm of `#1'}{}%
+ \fi%
+ \c@pgfmath@counta=0\relax%
+ \ifdim\pgfmath@x>2pt\relax%
+ \ifdim\pgfmath@x<128pt\relax%
+ \ifdim\pgfmath@x<8pt\relax%
+ \ifdim\pgfmath@x<4pt\relax%
+ \divide\pgfmath@x by2\relax%
+ \c@pgfmath@counta=1\relax%
+ \else%
+ \divide\pgfmath@x by4\relax%
+ \c@pgfmath@counta=2\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x<32pt\relax%
+ \ifdim\pgfmath@x<16pt\relax%
+ \divide\pgfmath@x by8\relax%
+ \c@pgfmath@counta=3\relax%
+ \else%
+ \divide\pgfmath@x by16\relax%
+ \c@pgfmath@counta=4\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x<64pt\relax%
+ \divide\pgfmath@x by32\relax%
+ \c@pgfmath@counta=5\relax%
+ \else%
+ \divide\pgfmath@x by64\relax%
+ \c@pgfmath@counta=6\relax%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x<2048pt\relax%
+ \ifdim\pgfmath@x<512pt\relax%
+ \ifdim\pgfmath@x<256pt\relax%
+ \divide\pgfmath@x by128\relax%
+ \c@pgfmath@counta=7\relax%
+ \else%
+ \divide\pgfmath@x by256\relax%
+ \c@pgfmath@counta=8\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x<1024pt\relax%
+ \divide\pgfmath@x by512\relax%
+ \c@pgfmath@counta=9\relax%
+ \else%
+ \divide\pgfmath@x by1024\relax%
+ \c@pgfmath@counta=10\relax%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x<8192pt\relax%
+ \ifdim\pgfmath@x<4096pt\relax%
+ \divide\pgfmath@x by2048\relax%
+ \c@pgfmath@counta=11\relax%
+ \else%
+ \divide\pgfmath@x by4096\relax%
+ \c@pgfmath@counta =12\relax%
+ \fi%
+ \else%
+ \divide\pgfmath@x by8192\relax%
+ \c@pgfmath@counta=13\relax%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x<1pt\relax%
+ \ifdim\pgfmath@x>0.0078125pt\relax% 2^-7
+ \ifdim\pgfmath@x>0.125pt\relax% 2^-3
+ \ifdim\pgfmath@x>0.5pt\relax% 2^-1
+ \multiply\pgfmath@x by2\relax%
+ \c@pgfmath@counta=-1\relax%
+ \else%
+ \multiply\pgfmath@x by4\relax%
+ \c@pgfmath@counta=-2\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x>0.03125pt\relax% 2^-5
+ \ifdim\pgfmath@x>0.0625pt\relax%
+ \multiply\pgfmath@x by8\relax%
+ \c@pgfmath@counta=-3\relax%
+ \else%
+ \multiply\pgfmath@x by16\relax%
+ \c@pgfmath@counta=-4\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x>0.015625pt\relax% 2^-6
+ \multiply\pgfmath@x by32\relax%
+ \c@pgfmath@counta=-5\relax%
+ \else%
+ \multiply\pgfmath@x by64\relax%
+ \c@pgfmath@counta=-6\relax%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x>0.000244140625pt\relax% 2^-11
+ \ifdim\pgfmath@x>0.001953125pt\relax% 2^-9
+ \ifdim\pgfmath@x>0.00390625pt\relax% 2^-8
+ \multiply\pgfmath@x by128\relax%
+ \c@pgfmath@counta=-7\relax%
+ \else%
+ \multiply\pgfmath@x by256\relax%
+ \c@pgfmath@counta=-8\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x>0.0009765625pt\relax% 2^-10
+ \multiply\pgfmath@x by512\relax%
+ \c@pgfmath@counta=-9\relax%
+ \else%
+ \multiply\pgfmath@x by1024\relax%
+ \c@pgfmath@counta=-10\relax%
+ \fi%
+ \fi%
+ \else%
+ \ifdim\pgfmath@x>0.0001220703125pt\relax% 2^13
+ \ifdim\pgfmath@x>0.0002441406256pt\relax% 2^12
+ \multiply\pgfmath@x by2048\relax%
+ \c@pgfmath@counta=-11\relax%
+ \else%
+ \multiply\pgfmath@x by4096\relax%
+ \c@pgfmath@counta=-12\relax%
+ \fi%
+ \else%
+ \multiply\pgfmath@x by8192\relax%
+ \c@pgfmath@counta=-13\relax%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ %
+ % Use A+(B+(C+(D+(E+F*x)*x)*x)*x)*x
+ %
+ % where:
+ % A = -2.787927935
+ % B = 5.047861502
+ % C = -3.489886985
+ % D = 1.589480044
+ % E = -.4025153233
+ % F = 0.04300521312
+ %
+ \edef\pgfmath@temp{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@x=0.04300521312\pgfmath@x%
+ \advance\pgfmath@x by-.4025153233pt\relax%
+ \pgfmath@x=\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x by1.589480044pt\relax%
+ \pgfmath@x=\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x by-3.489886985pt\relax%
+ \pgfmath@x=\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x by5.047861502pt\relax%
+ \pgfmath@x=\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x by-2.787927935pt\relax%
+ \advance\pgfmath@x by\c@pgfmath@counta pt\relax%
+ \pgfmath@x=0.6931471806\pgfmath@x%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% log2 function.
+%
+\pgfmathdeclarefunction{log2}{1}{%
+ \begingroup%
+ \pgfmathln@{#1}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmath@x=1.442695041\pgfmath@x% 1/ln(2).
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% log10 function
+%
+\pgfmathdeclarefunction{log10}{1}{%
+ \begingroup%
+ \pgfmathln@{#1}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmath@x=0.43429441\pgfmath@x% 1/ln(10).
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% This is needed since \pgfmathlog2 and \pgfmathlog10 are not legal macro names
+\expandafter\let\expandafter\pgfmathlogtwo\csname pgfmathlog2\endcsname
+\expandafter\let\expandafter\pgfmathlogtwo@\csname pgfmathlog2@\endcsname
+\expandafter\let\expandafter\pgfmathlogten\csname pgfmathlog10\endcsname
+\expandafter\let\expandafter\pgfmathlogten@\csname pgfmathlog10@\endcsname
+
+% exp function.
+%
+\pgfmathdeclarefunction{exp}{1}{%
+ \begingroup
+ \pgfmath@xc=#1pt\relax
+ \pgfmath@yc=#1pt\relax
+ \ifdim\pgfmath@xc<-9pt
+ \pgfmath@x=1sp\relax
+ \else
+ \ifdim\pgfmath@xc<0pt
+ \pgfmath@xc=-\pgfmath@xc
+ \fi
+ \pgfmath@x=1pt\relax
+ \pgfmath@xa=1pt\relax
+ \pgfmath@xb=\pgfmath@x
+ \pgfmathloop%
+ \divide\pgfmath@xa by\pgfmathcounter
+ \pgfmath@xa=\pgfmath@tonumber\pgfmath@xc\pgfmath@xa%
+ \advance\pgfmath@x by\pgfmath@xa
+ \ifdim\pgfmath@x=\pgfmath@xb
+ \else
+ \pgfmath@xb=\pgfmath@x
+ \repeatpgfmathloop%
+ \ifdim\pgfmath@yc<0pt
+ \pgfmathreciprocal@{\pgfmath@tonumber\pgfmath@x}%
+ \pgfmath@x=\pgfmathresult pt\relax
+ \fi
+ \fi
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup
+}
+
+% sqrt function.
+%
+\pgfmathdeclarefunction{sqrt}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@error{I cannot calculate the square-root of the negative number `#1'}{}%
+ \else%
+ \ifdim\pgfmath@x<10pt\relax%
+ \def\pgfmath@zeros{0}%
+ \def\pgfmath@targetiterations{1}%
+ \else%
+ \ifdim\pgfmath@x<100pt\relax%
+ \def\pgfmath@zeros{}%
+ \def\pgfmath@targetiterations{1}%
+ \else%
+ \ifdim\pgfmath@x<1000pt\relax%
+ \def\pgfmath@zeros{0}%
+ \def\pgfmath@targetiterations{2}%
+ \else%
+ \ifdim\pgfmath@x<10000pt\relax%
+ \def\pgfmath@zeros{}%
+ \def\pgfmath@targetiterations{2}%
+ \else%
+ \def\pgfmath@zeros{0}%
+ \def\pgfmath@targetiterations{3}%
+ \fi\fi\fi\fi\fi%
+ \edef\pgfmath@temp{\pgfmath@zeros\pgfmath@tonumber{\pgfmath@x}}%
+ \expandafter\pgfmath@sqrt@\pgfmath@temp\pgfmath@%
+}
+\def\pgfmath@sqrt@#1.#2\pgfmath@{\pgfmath@@sqrt@#1#2\pgfmath@empty\pgfmath@empty\pgfmath@}
+
+\def\pgfmath@@sqrt@#1#2{%
+ \c@pgfmath@countb=#1#2\relax%
+ \ifnum\c@pgfmath@countb>35\relax%
+ \ifnum\c@pgfmath@countb>63\relax%
+ \ifnum\c@pgfmath@countb>80\relax%
+ \c@pgfmath@counta=9\relax%
+ \else%
+ \c@pgfmath@counta=8\relax%
+ \fi%
+ \else%
+ \ifnum\c@pgfmath@countb>48\relax%
+ \c@pgfmath@counta=7\relax%
+ \else%
+ \c@pgfmath@counta=6\relax%
+ \fi%
+ \fi%
+ \else%
+ \ifnum\c@pgfmath@countb>15\relax%
+ \ifnum\c@pgfmath@countb>24\relax%
+ \c@pgfmath@counta5\relax%
+ \else%
+ \c@pgfmath@counta=4\relax%
+ \fi%
+ \else%
+ \ifnum\c@pgfmath@countb>3\relax%
+ \ifnum\c@pgfmath@countb>8\relax%
+ \c@pgfmath@counta=3\relax%
+ \else%
+ \c@pgfmath@counta=2\relax%
+ \fi%
+ \else%
+ \ifnum\c@pgfmath@countb>0\relax%
+ \c@pgfmath@counta=1\relax%
+ \else%
+ \c@pgfmath@counta=0\relax%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \edef\pgfmath@root{\the\c@pgfmath@counta}%
+ \edef\pgfmath@rootspecial{\the\c@pgfmath@counta}%
+ \multiply\c@pgfmath@counta by-\c@pgfmath@counta\relax%
+ \advance\c@pgfmath@counta by#1#2\relax%
+ \edef\pgfmath@remainder{\the\c@pgfmath@counta}%
+ \pgfmath@@@sqrt@%
+}
+
+\def\pgfmath@@@sqrt@#1#2{%
+ \ifx\pgfmath@empty#1%
+ \edef\pgfmath@remainder{\pgfmath@remainder00}%
+ \def\pgfmath@tokens{\pgfmath@empty\pgfmath@empty}%
+ \else%
+ \ifx\pgfmath@empty#2%
+ \edef\pgfmath@remainder{\pgfmath@remainder#10}%
+ \def\pgfmath@tokens{\pgfmath@empty\pgfmath@empty}%
+ \else%
+ \edef\pgfmath@remainder{\pgfmath@remainder#1#2}%
+ \def\pgfmath@tokens{}%
+ \fi\fi%
+ \c@pgfmath@counta=\pgfmath@rootspecial\relax%
+ \multiply\c@pgfmath@counta by20\relax%
+ \c@pgfmath@countb=\c@pgfmath@counta%
+ \multiply\c@pgfmath@countb by6\relax%
+ \advance\c@pgfmath@countb by36\relax%
+ \c@pgfmath@countc=\c@pgfmath@counta%
+ \multiply\c@pgfmath@countc by2\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \advance\c@pgfmath@countb by-\c@pgfmath@countc%
+ \advance\c@pgfmath@countb by-20\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \advance\c@pgfmath@countb by-\c@pgfmath@countc%
+ \advance\c@pgfmath@countb by-12\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \advance\c@pgfmath@countb by-\c@pgfmath@counta%
+ \advance\c@pgfmath@countb by-3\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \def\pgfmath@digit{0}%
+ \else%
+ \def\pgfmath@digit{1}%
+ \fi%
+ \else%
+ \advance\c@pgfmath@countb by\c@pgfmath@counta%
+ \advance\c@pgfmath@countb by5\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \def\pgfmath@digit{2}%
+ \else%
+ \def\pgfmath@digit{3}%
+ \fi%
+ \fi%
+ \else%
+ \advance\c@pgfmath@countb by\c@pgfmath@counta%
+ \advance\c@pgfmath@countb by9\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \def\pgfmath@digit{4}%
+ \else%
+ \def\pgfmath@digit{5}%
+ \fi%
+ \fi%
+ \else%
+ \advance\c@pgfmath@countb by\c@pgfmath@countc%
+ \advance\c@pgfmath@countb by28\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \advance\c@pgfmath@countb by-\c@pgfmath@counta%
+ \advance\c@pgfmath@countb by-15\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \def\pgfmath@digit{6}%
+ \else%
+ \def\pgfmath@digit{7}%
+ \fi%
+ \else%
+ \advance\c@pgfmath@countb by\c@pgfmath@counta%
+ \advance\c@pgfmath@countb by17\relax%
+ \ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
+ \def\pgfmath@digit{8}%
+ \else%
+ \def\pgfmath@digit{9}%
+ \fi%
+ \fi%
+ \fi%
+ \edef\pgfmath@rootspecial{\pgfmath@rootspecial\pgfmath@digit}%
+ \advance\c@pgfmath@counta by\pgfmath@digit\relax%
+ \multiply\c@pgfmath@counta by-\pgfmath@digit\relax%
+ \advance\c@pgfmath@counta by\pgfmath@remainder\relax%
+ \edef\pgfmath@remainder{\the\c@pgfmath@counta}%
+ \c@pgfmath@counta=\pgfmath@targetiterations\relax%
+ \advance\c@pgfmath@counta by-1\relax%
+ \edef\pgfmath@targetiterations{\the\c@pgfmath@counta}%
+ \ifnum\c@pgfmath@counta=0\relax%
+ \edef\pgfmath@root{\pgfmath@root.\pgfmath@digit}%
+ \else%
+ \edef\pgfmath@root{\pgfmath@root\pgfmath@digit}%
+ \fi%
+ \ifnum\c@pgfmath@counta=-4\relax% -n+1 digits of precision.
+ \let\pgfmath@next\pgfmath@sqrt@end%
+ \else%
+ \let\pgfmath@next\pgfmath@@@sqrt@%
+ \fi%
+ \expandafter\pgfmath@next\pgfmath@tokens%
+}
+
+\def\pgfmath@sqrt@end#1\pgfmath@{%
+ \edef\pgfmathresult{\pgfmath@root}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup}
+
+% \pgfmathpow
+%
+% Calculates #1 ^ #2
+%
+\pgfmathdeclarefunction{pow}{2}{%
+ \begingroup%
+ \pgfmath@xa=#1pt%
+ \pgfmath@xb=#2pt%
+ \ifdim\pgfmath@xa=0pt\relax%
+ \ifdim\pgfmath@xb=0pt\relax%
+ \pgfmath@x=1pt\relax%
+ \else%
+ \pgfmath@x=0pt\relax%
+ \fi%
+ \else%
+ \afterassignment\pgfmath@x%
+ \expandafter\c@pgfmath@counta\the\pgfmath@xb\relax%
+ \ifnum\c@pgfmath@counta<0\relax%
+ \c@pgfmath@counta=-\c@pgfmath@counta%
+ \pgfmathreciprocal@{#1}%
+ \pgfmath@xa=\pgfmathresult pt\relax%
+ \fi
+ \ifdim\pgfmath@x=0pt\relax%
+ \pgfmath@x=1pt\relax%
+ \pgfmathloop%
+ \ifnum\c@pgfmath@counta>0\relax%
+ \ifodd\c@pgfmath@counta%
+ \pgfmath@x=\pgfmath@tonumber{\pgfmath@x}\pgfmath@xa%
+ \fi
+ \ifnum\c@pgfmath@counta>1\relax%
+ \pgfmath@xa=\pgfmath@tonumber{\pgfmath@xa}\pgfmath@xa%
+ \fi%
+ \divide\c@pgfmath@counta by2\relax%
+ \repeatpgfmathloop%
+ \else%
+ \pgfmathln@{#1}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmath@x=\pgfmath@tonumber{\pgfmath@xb}\pgfmath@x%
+ \pgfmathexp@{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \fi%
+ \fi
+ \pgfmath@returnone\pgf@x%
+ \endgroup%
+}
+
+% factorial function.
+%
+\pgfmathdeclarefunction{factorial}{1}{%
+ \begingroup%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \c@pgfmath@counta=#1\relax\pgfmath@%
+ \pgfmath@x=1pt\relax%
+ \pgfmathloop%
+ \ifnum\c@pgfmath@counta<2\relax%
+ \else%
+ \multiply\pgfmath@x by\c@pgfmath@counta%
+ \advance\c@pgfmath@counta by-1\relax%
+ \repeatpgfmathloop%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% Local Variables:
+% coding: undecided-unix
+% End:
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.code.tex
new file mode 100644
index 0000000000..fc08640e4f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.code.tex
@@ -0,0 +1,256 @@
+% Copyright 2007 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.
+
+% Declare a function for the parser.
+%
+% #1 - the name of the function.
+% #2 - arity (or ... for variable arguments).
+% #3 - the code for the function.
+%
+% Use \pgfmathdeclarefunction* to force a redefinition if the function exists already.
+\def\pgfmathdeclarefunction{\pgfmath@ifnextchar*\pgfmathdeclarefunction@force\pgfmathdeclarefunction@check}
+\def\pgfmathdeclarefunction@check#1{%
+ \expandafter\ifx\csname pgfmath@function@#1\endcsname\relax\else%
+ \pgfmath@error{The function `#1' already exists}{}%
+ \fi%
+ \pgfmath@declarefunction{#1}%
+}
+\def\pgfmathdeclarefunction@force*{\pgfmath@declarefunction}%
+
+\def\pgfmathredeclarefunction#1#2{%
+ \expandafter\ifx\csname pgfmath@function@#1\endcsname\relax%
+ \pgfmath@error{The function `#1' does not exist}{}%
+ \else%
+ % was: \pgfmath@namedef{pgfmath#1@}{#2}% TT
+ \edef\pgf@marshal{\noexpand\pgfmathdeclarefunction*{#1}{\csname pgfmath@operation@#1@arity\endcsname}}%
+ \pgf@marshal{#2}%
+ \fi%
+}
+
+\def\pgfmath@declarefunction#1#2{%
+ \pgfmath@namedef{pgfmath@function@#1}{#1}%
+ \pgfmath@namedef{pgfmath@operation@#1@type}{function}%
+ \pgfmath@namedef{pgfmath@operation@#1@arity}{#2}%
+ \pgfmath@namedef{pgfmath@operation@#1@infix}{#1}%
+ \pgfmath@namedef{pgfmath@operation@#1@precedence}{1000}%
+ \expandafter\ifx\csname pgfmath@operation@#1@arity\endcsname\pgfmath@dots%
+ \pgfmath@namedef{pgfmath@operation@#1@arity}{1}%
+ \else%
+ \ifnum\csname pgfmath@operation@#1@arity\endcsname>9\relax%
+ \pgfmath@namedef{pgfmath@operation@#1@arity}{1}%
+ \fi%
+ \fi%
+ \edef\pgfmath@marshal{%
+ \noexpand\pgfmath@@declarefunction%
+ {\expandafter\noexpand\csname pgfmath#1\endcsname}%
+ {\expandafter\noexpand\csname pgfmath#1@\endcsname}%
+ {\csname pgfmath@operation@#1@arity\endcsname}%
+ }%
+ \pgfmath@marshal%
+}
+
+% #1 - \pgfmath<name>.
+% #2 - \pgfmath<name>@.
+% #3 - arity.
+% #4 - code for function <name>.
+%
+\def\pgfmath@@declarefunction#1#2#3#4{% Function of arity 0 - 9.
+ \ifcase#3\relax%
+ \def#1{#2}%
+ \def\pgfmath@@head{\def#2}%
+ \or
+ \def#1##1{\pgfmathparse{##1}\expandafter#2\expandafter{\pgfmathresult}}%
+ \def\pgfmath@@head{\def#2####1}%
+ \else%
+ \pgfmath@toks={}%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>#3\relax%
+ \else%
+ \expandafter\pgfmath@addto@toks\expandafter{\pgfmath@char@hash}%
+ \expandafter\pgfmath@addto@toks\expandafter{\pgfmathcounter}%
+ \repeatpgfmathloop%
+ \edef\pgfmath@head{\noexpand\def\noexpand#1\the\pgfmath@toks}%
+ \edef\pgfmath@@head{\noexpand\def\noexpand#2\the\pgfmath@toks}%
+ \pgfmath@toks={}%
+ \def\pgfmath@arguments{}%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>#3\relax%
+ \else%
+ \pgfmath@addto@toks{\pgfmathparse}%
+ \expandafter\expandafter\expandafter\pgfmath@addto@toks%
+ \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmath@char@hash\pgfmathcounter}}%
+ \pgfmath@addto@toks{\let}%
+ \expandafter\pgfmath@addto@toks\expandafter{%
+ \csname pgfmath@argument@\pgfmathcounter\endcsname=\pgfmathresult}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmath@arguments\expandafter\expandafter\expandafter{\expandafter%
+ \pgfmath@arguments\expandafter{\csname pgfmath@argument@\pgfmathcounter\endcsname}}%
+ \repeatpgfmathloop%
+ \expandafter\pgfmath@addto@toks\expandafter{\expandafter#2\pgfmath@arguments}%
+ \edef\pgfmath@body{{\the\pgfmath@toks}}%
+ \expandafter\pgfmath@head\pgfmath@body%
+ \fi%
+ \pgfmath@@head{#4}%
+}
+
+\def\pgfmath@addto@toks#1{%
+ \edef\pgfmath@toks@expanded{\the\pgfmath@toks}%
+ \expandafter\pgfmath@toks\expandafter{\pgfmath@toks@expanded#1}}
+
+% Key for declaring local functions.
+%
+\pgfkeys{%
+ /pgf/declare function/.code={%
+ \pgfmath@local@functions#1@=@;%
+ }
+}
+
+\def\pgfmath@local@gobbleone#1{}
+\def\pgfmath@local@at{@}%
+
+\def\pgfmath@local@functions{%
+ \pgfutil@ifnextchar x{\pgfmath@local@@functions}{\pgfmath@local@@functions}%
+}
+
+\def\pgfmath@local@@functions#1=#2;{%
+ \def\pgfmath@local@temp{#1}%
+ \ifx\pgfmath@local@temp\pgfmath@local@at%
+ \let\pgfmath@local@next=\relax%
+ \else%
+ \pgfmath@local@function#1=#2;%
+ \let\pgfmath@local@next=\pgfmath@local@functions%
+ \fi%
+ \pgfmath@local@next%
+}
+
+\def\pgfmath@local@function{%
+ \let\pgfmath@local@name=\pgfutil@empty%
+ \let\pgfmath@local@args=\pgfutil@empty%
+ \let\pgfmath@local@body=\pgfutil@empty%
+ \pgfmath@local@@function}
+
+\def\pgfmath@local@@function#1{%
+ \if#1=%
+ \let\pgfmath@local@next=\pgfmath@local@function@body%
+ \else%
+ \if#1(%
+ \let\pgfmath@local@next=\pgfmath@local@function@args%
+ \else%
+ \expandafter\def\expandafter\pgfmath@local@name\expandafter{\pgfmath@local@name#1}%
+ \let\pgfmath@local@next=\pgfmath@local@@function%
+ \fi%
+ \fi%
+ \pgfmath@local@next%
+}
+
+\def\pgfmath@local@function@args#1){%
+ \def\pgfmath@local@args{#1}%
+ \pgfmath@local@@function}
+
+\def\pgfmath@local@function@body#1;{%
+ \def\pgfmath@local@body{#1}%
+ \begingroup%
+ \c@pgf@counta=0\relax%
+ \ifx\pgfmath@local@args\pgfmath@empty%
+ \expandafter\pgfmath@toks\expandafter=\expandafter{\pgfmath@local@body}%
+ \else%
+ \pgfmath@toks={}%
+ \expandafter\pgfmath@local@function@@body\pgfmath@local@args,,%
+ \fi%
+ \xdef\pgfmath@local@temp{%
+ \noexpand\pgfmathnotifynewdeclarefunction{\pgfmath@local@name}{\the\c@pgf@counta}%
+ {\the\pgfmath@toks}%
+ }%
+ \endgroup%
+ \pgfmath@local@temp%
+}
+
+% #1: the name
+% #2: the number of arguments <n>
+% #3: a math expression containing '#1', '#2', ... ,'#'<n>
+% This callback is overwritten by pgflibraryluamath.
+\def\pgfmathnotifynewdeclarefunction#1#2#3{%
+ \pgfmathdeclarefunction{#1}{#2}{\pgfmathparse{#3}}%
+}%
+
+\def\pgfmath@local@function@@body#1,{%
+ \def\pgfmath@local@test{#1}%
+ \ifx\pgfmath@local@test\pgfutil@empty%
+ \let\pgfmath@local@next=\relax%
+ \else%
+ \edef\pgfmath@local@var@string{@\expandafter\pgfmath@local@gobbleone\string#1}%
+ \advance\c@pgf@counta by1\relax%
+ \expandafter\expandafter\expandafter\pgfmath@toks\expandafter\expandafter\expandafter=%
+ \expandafter\expandafter\expandafter{\expandafter\pgfmath@char@hash\the\c@pgf@counta}%
+ \edef#1{\the\pgfmath@toks}%
+ \pgfmath@toks={}%
+ \expandafter\pgfmath@local@function@@@body\pgfmath@local@body @%
+ \edef\pgfmath@local@body{\the\pgfmath@toks}%
+ \let\pgfmath@local@next=\pgfmath@local@function@@body%
+ \fi%
+ \pgfmath@local@next%
+}
+
+\def\pgfmath@local@function@@@body{%
+ \pgfutil@ifnextchar\bgroup{\pgfmath@local@function@@@body@bgroup}%
+ {\pgfmath@local@function@@@body@nobgroup}}%
+
+\def\pgfmath@local@function@@@body@bgroup#1{%
+ \begingroup%
+ \pgfmath@toks={}%
+ \pgfmath@local@function@@@body#1 @%
+ \xdef\pgfmath@local@temp{{\the\pgfmath@toks}}%
+ \endgroup%
+ \expandafter\pgfmath@addto@toks\expandafter{\pgfmath@local@temp}%
+ \pgfmath@local@function@@@body%
+}
+
+\def\pgfmath@local@function@@@body@nobgroup#1{%
+ \ifx#1@%
+ \let\pgfmath@local@next=\relax%
+ \else%
+ \let\pgfmath@local@next=\pgfmath@local@function@@@body%
+ \edef\pgfmath@local@var@@string{@\expandafter\pgfmath@local@gobbleone\string#1}%
+ \ifx\pgfmath@local@var@@string\pgfmath@local@var@string%
+ \expandafter\pgfmath@addto@toks\expandafter{#1}%
+ \else%
+ \edef\pgfmath@local@temp{\the\pgfmath@toks}%
+ \pgfmath@toks={#1}%
+ \edef\pgfmath@local@@temp{\the\pgfmath@toks}%
+ \expandafter\pgfmath@toks\expandafter=\expandafter{\pgfmath@local@temp}%
+ \expandafter\pgfmath@addto@toks\expandafter{\pgfmath@local@@temp}%
+ \fi%
+ \fi%
+ \pgfmath@local@next%
+}
+
+% Allows to define 'x' as some \TeX command '#2'.
+\def\pgfmathdeclarepseudoconstant#1#2{%
+ \pgfmathdeclarefunction*{#1}{0}{#2}%
+}%
+% Redefines a pseudo constant '#1'.
+\def\pgfmathredeclarepseudoconstant#1#2{%
+ \pgfmathredeclarefunction{#1}{#2}%
+}%
+
+\input pgfmathfunctions.basic.code.tex
+\input pgfmathfunctions.trigonometric.code.tex
+\input pgfmathfunctions.random.code.tex
+\input pgfmathfunctions.comparison.code.tex
+\input pgfmathfunctions.base.code.tex
+\input pgfmathfunctions.round.code.tex
+\input pgfmathfunctions.misc.code.tex
+\input pgfmathfunctions.integerarithmetics.code.tex
+
+
+
+% Local Variables:
+% tab-width: 2
+% End:
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.comparison.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.comparison.code.tex
new file mode 100644
index 0000000000..f6e69993e8
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.comparison.code.tex
@@ -0,0 +1,179 @@
+% Copyright 2007 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.
+
+% This file defines the mathematical functions and operators.
+%
+% Version 1.4142135 11/8/2008
+
+\pgfmathdeclarefunction{greater}{2}{%
+ \begingroup%
+ \ifdim#1pt>#2pt\relax%
+ \def\pgfmathresult{1}%
+ \else%
+ \def\pgfmathresult{0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+\let\pgfmathgreaterthan=\pgfmathgreater
+
+\pgfmathdeclarefunction{less}{2}{%
+ \begingroup%
+ \ifdim#1pt<#2pt\relax%
+ \def\pgfmathresult{1}%
+ \else%
+ \def\pgfmathresult{0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+\let\pgfmathlessthan=\pgfmathless
+
+\pgfmathdeclarefunction{equal}{2}{%
+ \begingroup%
+ \ifdim#1pt=#2pt\relax%
+ \def\pgfmathresult{1}%
+ \else%
+ \def\pgfmathresult{0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+\let\pgfmathequalto=\pgfmathequal
+
+
+% approxequalto function from Christian Feuersaenger.
+%
+\newif\ifpgfmathcomparison
+\pgfmathdeclarefunction{approxequalto}{2}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \pgfmath@y=#2pt\relax%
+ \advance\pgfmath@x by-\pgfmath@y%
+ \ifdim\pgfmath@x<0pt\relax%
+ \multiply\pgfmath@x by-1\relax%
+ \fi
+ \ifdim\pgfmath@x<0.0001pt\relax%
+ \def\pgfmathresult{1.0}%
+ \global\pgfmathcomparisontrue%
+ \else%
+ \def\pgfmathresult{0.0}%
+ \global\pgfmathcomparisonfalse%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+
+
+% ifthenelse function.
+%
+\pgfmathdeclarefunction{ifthenelse}{3}{%
+ \begingroup%
+ \ifdim#1pt=0.0pt\relax%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{#3}%
+ \else%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{#2}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% notequal function.
+%
+\pgfmathdeclarefunction{notequal}{2}{%
+ \begingroup%
+ \ifdim#1pt=#2pt\relax%
+ \def\pgfmathresult{0}%
+ \else%
+ \def\pgfmathresult{1}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% notless function.
+%
+\pgfmathdeclarefunction{notless}{2}{%
+ \begingroup%
+ \ifdim#1pt<#2pt\relax%
+ \def\pgfmathresult{0}%
+ \else%
+ \def\pgfmathresult{1}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% notgreater function.
+%
+\pgfmathdeclarefunction{notgreater}{2}{%
+ \begingroup%
+ \ifdim#1pt>#2pt\relax%
+ \def\pgfmathresult{0}%
+ \else%
+ \def\pgfmathresult{1}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% and function.
+%
+\pgfmathdeclarefunction{and}{2}{%
+ \begingroup%
+ \def\pgfmathresult{1}%
+ \ifdim#1pt=0pt\relax%
+ \def\pgfmathresult{0}%
+ \else%
+ \ifdim#2pt=0pt\relax%
+ \def\pgfmathresult{0}%
+ \fi%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% or function.
+%
+\pgfmathdeclarefunction{or}{2}{%
+ \begingroup%
+ \def\pgfmathresult{0}%
+ \ifdim#1pt=0pt\relax%
+ \ifdim#2pt=0pt\relax%
+ \else%
+ \def\pgfmathresult{1}%
+ \fi%
+ \else%
+ \def\pgfmathresult{1}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% not function.
+%
+\pgfmathdeclarefunction{not}{1}{%
+ \begingroup%
+ \ifdim#1pt=0pt\relax%
+ \def\pgfmathresult{1}%
+ \else%
+ \def\pgfmathresult{0}%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% true function.
+%
+\pgfmathdeclarefunction{true}{0}{\def\pgfmathresult{1}}
+
+% false function.
+%
+\pgfmathdeclarefunction{false}{0}{\def\pgfmathresult{0}}
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.integerarithmetics.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.integerarithmetics.code.tex
new file mode 100644
index 0000000000..ab8f4e6d3c
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.integerarithmetics.code.tex
@@ -0,0 +1,124 @@
+% 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.
+
+% Macros contributed by Alain Matthes and adapted by CJ
+\pgfmathdeclarefunction{gcd}{2}{%
+ \begingroup
+ \pgfmathcontinuelooptrue
+ \pgfmath@xa=#1pt
+ \pgfmath@xb=#2pt
+ \ifdim\pgfmath@xa=0pt\relax
+ \pgfmathcontinueloopfalse
+ \pgfmath@xa=\pgfmath@xb
+ \fi
+ \ifdim\pgfmath@xb=0pt\relax
+ \pgfmathcontinueloopfalse
+ \pgfmath@xb=\pgfmath@xa
+ \fi
+ \ifdim\pgfmath@xa<0pt\relax
+ \pgfmath@xa=-\pgfmath@xa
+ \fi
+ \ifdim\pgfmath@xb<0pt\relax
+ \pgfmath@xb=-\pgfmath@xb
+ \fi
+ \loop
+ \ifpgfmathcontinueloop
+ \ifdim\pgfmath@xa=\pgfmath@xb
+ \pgfmathcontinueloopfalse
+ \else
+ \ifdim\pgfmath@xa>\pgfmath@xb
+ \advance\pgfmath@xa by-\pgfmath@xb
+ \else
+ \advance\pgfmath@xb by-\pgfmath@xa
+ \fi
+ \fi
+ \repeat
+ \pgfmathparse{int(\pgfmath@xa)}%
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\newif\ifpgfmath@isprime@unknown
+\newif\ifpgfmath@isprime
+
+\pgfmathdeclarefunction{isprime}{1}{%
+ \begingroup
+ \pgfmath@isprime@unknowntrue
+ \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
+ \ifcase\c@pgfmath@counta\relax
+ % |#1| = 0
+ \pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \or
+ % |#1| = 1
+ \pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \or
+ % |#1| = 2
+ \pgfmath@isprimetrue
+ \pgfmath@isprime@unknownfalse
+ \or
+ % |#1| = 3
+ \pgfmath@isprimetrue
+ \pgfmath@isprime@unknownfalse
+ \else
+ % |#1| > 3
+ \ifodd\c@pgfmath@counta\relax
+ \else
+ \pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \fi
+ \fi
+ \ifpgfmath@isprime@unknown
+ \c@pgfmath@countd=3
+ \pgfmath@isprimetrue
+ \pgfmathloop
+ \c@pgfmath@countb=\c@pgfmath@counta
+ \divide\c@pgfmath@countb by\c@pgfmath@countd
+ \ifnum\c@pgfmath@countb>\c@pgfmath@countd
+ \pgfmath@isprime@unknowntrue
+ \else
+ \pgfmath@isprime@unknownfalse
+ \fi
+ \multiply\c@pgfmath@countb by\c@pgfmath@countd
+ \ifnum\c@pgfmath@countb=\c@pgfmath@counta
+ \global\pgfmath@isprimefalse
+ \pgfmath@isprime@unknownfalse
+ \fi
+ \ifpgfmath@isprime@unknown\advance\c@pgfmath@countd by 2
+ \repeatpgfmathloop
+ \fi
+ \ifpgfmath@isprime
+ \def\pgfmathresult{1}%
+ \else
+ \def\pgfmathresult{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\pgfmathdeclarefunction{isodd}{1}{%
+ \begingroup
+ \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
+ \ifodd\c@pgfmath@counta
+ \def\pgfmathresult{1}%
+ \else
+ \def\pgfmathresult{0}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\pgfmathdeclarefunction{iseven}{1}{%
+ \begingroup
+ \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
+ \ifodd\c@pgfmath@counta
+ \def\pgfmathresult{0}%
+ \else
+ \def\pgfmathresult{1}%
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.misc.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.misc.code.tex
new file mode 100644
index 0000000000..bab8fefd4e
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.misc.code.tex
@@ -0,0 +1,349 @@
+% Copyright 2007 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.
+
+% This file defines the mathematical functions and operators.
+%
+% Version 1.414213 29/9/2007
+
+% veclen function adapted from ideas due to Rouben Rostamian.
+%
+% Calculate the Euclidean length of a 2D vector.
+%
+%
+\pgfmathdeclarefunction{veclen}{2}{%
+ \begingroup%
+ \pgfmath@x#1pt\relax%
+ \pgfmath@y#2pt\relax%
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \ifdim\pgfmath@y<0pt\relax%
+ \pgfmath@y-\pgfmath@y%
+ \fi%
+ \ifdim\pgfmath@x=0pt\relax%
+ \pgfmath@x\pgfmath@y%
+ \else%
+ \ifdim\pgfmath@y=0pt\relax%
+ \else%
+ \ifdim\pgfmath@x>\pgfmath@y%
+ \pgfmath@xa\pgfmath@x%
+ \pgfmath@x\pgfmath@y%
+ \pgfmath@y\pgfmath@xa%
+ \fi%
+ % We use a scaling factor to reduce errors.
+ \ifdim\pgfmath@y>10000pt\relax%
+ \c@pgfmath@counta1500\relax%
+ \else%
+ \ifdim\pgfmath@y>1000pt\relax%
+ \c@pgfmath@counta150\relax%
+ \else%
+ \ifdim\pgfmath@y>100pt\relax%
+ \c@pgfmath@counta50\relax%
+ \else%
+ \c@pgfmath@counta1\relax%
+ \fi%
+ \fi%
+ \fi%
+ \divide\pgfmath@x\c@pgfmath@counta\relax%
+ \divide\pgfmath@y\c@pgfmath@counta\relax%
+ \pgfmathreciprocal@{\pgfmath@tonumber{\pgfmath@y}}%
+ \pgfmath@x\pgfmathresult\pgfmath@x%
+ \pgfmath@xa\pgfmath@tonumber{\pgfmath@x}\pgfmath@x%
+ \edef\pgfmath@temp{\pgfmath@tonumber{\pgfmath@xa}}%
+ %
+ % Use A+x^2*(B+x^2*(C+x^2*(D+E*x^2)))
+ % where
+ % A = +1.000012594
+ % B = +0.4993615349
+ % C = -0.1195159052
+ % D = +0.04453994279
+ % E = -0.01019210944
+ %
+ \pgfmath@x-0.01019210944\pgfmath@xa%
+ \advance\pgfmath@x0.04453994279pt\relax%
+ \pgfmath@x\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x-0.1195159052pt\relax%
+ \pgfmath@x\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x0.4993615349pt\relax%
+ \pgfmath@x\pgfmath@temp\pgfmath@x%
+ \advance\pgfmath@x1.000012594pt\relax%
+ \ifdim\pgfmath@y<0pt\relax%
+ \pgfmath@y-\pgfmath@y%
+ \fi%
+ \pgfmath@x\pgfmath@tonumber{\pgfmath@y}\pgfmath@x%
+ % Invert the scaling factor.
+ \multiply\pgfmath@x\c@pgfmath@counta\relax%
+ \fi%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% Hyperbolic functions contributed by Martin Heller.
+%
+\pgfmathdeclarefunction{cosh}{1}{%
+ \begingroup
+ \edef\pgfmath@arg{#1}%
+ \pgfmathexp@{\pgfmath@arg}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmathexp@{-\pgfmath@arg}%
+ \advance\pgfmath@x by\pgfmathresult pt\relax%
+ \divide\pgfmath@x by2\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup}
+
+\pgfmathdeclarefunction{sinh}{1}{%
+ \begingroup
+ \edef\pgfmath@arg{#1}%
+ \pgfmathexp@{\pgfmath@arg}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmathexp@{-\pgfmath@arg}%
+ \advance\pgfmath@x by-\pgfmathresult pt\relax%
+ \divide\pgfmath@x by2\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup
+}%
+
+\pgfmathdeclarefunction{tanh}{1}{%
+ \begingroup
+ \edef\pgfmath@arg{#1}%
+ \pgfmathsinh@{\pgfmath@arg}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmathcosh@{\pgfmath@arg}%
+ \pgfmath@y=\pgfmathresult pt\relax%
+ \pgfmathdivide@{\pgfmath@tonumber{\pgfmath@x}}{\pgfmath@tonumber{\pgfmath@y}}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup
+}%
+
+% \pgfmathscientific
+%
+% Return the value of #1e#2
+%
+% e.g. \pgfmathscientific{1.23456789123}{4}
+%
+% defines \pgfmathresult as 12345.67891
+%
+% NB These arguments *are not parsed*, as the long mantissa would be lost.
+%
+\def\pgfmathscientific#1#2{%
+ \begingroup%
+ \edef\pgfmath@sci@exponent{#2}%
+ \pgfmath@x#1pt\relax%
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \edef\pgfmath@sci@sign{-}%
+ \expandafter\edef\expandafter\pgfmath@temp\expandafter{\expandafter\pgfmath@gobbleone#1}%
+ \else%
+ \edef\pgfmath@sci@sign{+}%
+ \edef\pgfmath@temp{#1}%
+ \fi%
+ \expandafter\pgfmath@in@\expandafter.\expandafter{#1}%
+ \ifpgfmath@in@%
+ \else%
+ \edef\pgfmath@temp{\pgfmath@temp.0}%
+ \fi%
+ \expandafter\pgfmath@scientific@@\pgfmath@temp00000000000\pgfmath@}
+
+\def\pgfmath@scientific@@#1.#2#3#4#5#6{%
+ \edef\pgfmath@sci@int{#1}%
+ \edef\pgfmath@sci@mantissaA{#2#3#4#5#6}%
+ \pgfmath@scientific@@@}
+
+\def\pgfmath@scientific@@@#1#2#3#4#5#6\pgfmath@{%
+ \edef\pgfmath@sci@mantissaB{#1#2#3#4#5}%
+ \c@pgfmath@counta\pgfmath@sci@exponent\relax%
+ \ifnum\c@pgfmath@counta<-4\relax%
+ \pgfmath@x0pt\relax%
+ \else%
+ \c@pgfmath@countb\c@pgfmath@counta%
+ \ifnum\c@pgfmath@counta<0\relax%
+ \c@pgfmath@counta-\c@pgfmath@counta%
+ \fi%
+ \pgfmathpow@{10}{\the\c@pgfmath@counta}%
+ \afterassignment\pgfmath@gobbletilpgfmath@
+ \c@pgfmath@countc\pgfmathresult\relax\pgfmath@
+ \edef\pgfmath@sci@factor{\the\c@pgfmath@countc}%
+ \ifnum\c@pgfmath@countb<0\relax%
+ % xE-y: easy...
+ \pgfmath@x\pgfmath@sci@int.\pgfmath@sci@mantissaA pt\relax%
+ \divide\pgfmath@x\pgfmath@sci@factor\relax%
+ \else%
+ % xE+y:
+ % Must do this way so as not lose digits in a long mantissa. Sigh...
+ \c@pgfmath@counta\pgfmath@sci@int%
+ \c@pgfmath@countb\pgfmath@sci@mantissaA%
+ \multiply\c@pgfmath@counta\pgfmath@sci@factor\relax%
+ \multiply\c@pgfmath@countb\pgfmath@sci@factor\relax%
+ \c@pgfmath@countc\c@pgfmath@countb%
+ \divide\c@pgfmath@countb100000\relax%
+ \advance\c@pgfmath@counta\c@pgfmath@countb%
+ \multiply\c@pgfmath@countb100000\relax%
+ \advance\c@pgfmath@countc-\c@pgfmath@countb%
+ \c@pgfmath@countb\pgfmath@sci@mantissaB\relax%
+ \multiply\c@pgfmath@countb\pgfmath@sci@factor\relax%
+ \divide\c@pgfmath@countb100000\relax%
+ \advance\c@pgfmath@countc\c@pgfmath@countb%
+ \advance\c@pgfmath@countc100000\relax%
+ \edef\pgfmath@sci@result{\pgfmath@sci@sign\the\c@pgfmath@counta.\expandafter\pgfmath@gobbleone\the\c@pgfmath@countc pt}%
+ \pgfmath@x\pgfmath@sci@result\relax%
+ \fi\fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup}
+
+
+
+% width function.
+%
+\pgfmathdeclarefunction{width}{1}{%
+ \begingroup%
+ \setbox\pgfmath@box=\hbox{{\pgfmath@selectfont{#1}}}%
+ \pgfmath@x=\wd\pgfmath@box%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+
+% height function.
+%
+\pgfmathdeclarefunction{height}{1}{%
+ \begingroup%
+ \setbox\pgfmath@box=\hbox{{\pgfmath@selectfont{#1}}}%
+ \pgfmath@x=\ht\pgfmath@box%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+% depth function.
+%
+\pgfmathdeclarefunction{depth}{1}{%
+ \begingroup%
+ \setbox\pgfmath@box=\hbox{{\pgfmath@selectfont{#1}}}%
+ \pgfmath@x=\dp\pgfmath@box%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
+
+
+% array function.
+%
+\pgfmathdeclarefunction{array}{2}{%
+ \begingroup%
+ \afterassignment\pgfmath@gobbletilpgfmath@\pgfmath@count=#2\relax\pgfmath@%
+ \expandafter\pgfmatharray@@#1\pgfmath@stop%
+}
+
+\def\pgfmath@token@stop{\pgfmath@stop}%
+\def\pgfmatharray@@#1{%
+ \def\pgfmath@temp{#1}%
+ \advance\pgfmath@count by-1\relax%
+ \ifx\pgfmath@temp\pgfmath@token@stop%
+ \pgfmath@error{Array index out of bounds.}{}%
+ \def\pgfmathresult{0}%
+ \pgfmath@smuggleone\pgfmathresult\endgroup%
+ \let\pgfmath@next=\relax%
+ \else%
+ \ifnum\pgfmath@count=-1\relax%
+ \def\pgfmathresult{#1}%
+ \let\pgfmath@next=\pgfmatharray@@@%
+ \else%
+ \let\pgfmath@next=\pgfmatharray@@%
+ \fi%
+ \fi%
+ \pgfmath@next}
+
+\def\pgfmatharray@@@#1\pgfmath@stop{%
+ \pgfmath@smuggleone\pgfmathresult\endgroup%
+}
+
+% dim function: return dimension of an array
+% dim({1,2,3}) return 3
+% dim({{1,2,3},{4,5,6}}) return 2
+\pgfmathdeclarefunction{dim}{1}{%
+ \begingroup
+ \pgfmath@count=0\relax
+ \expandafter\pgfmath@dim@i\pgfutil@firstofone#1\pgfmath@token@stop
+ \edef\pgfmathresult{\the\pgfmath@count}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup}
+
+\def\pgfmath@dim@i#1{%
+ \ifx\pgfmath@token@stop#1%
+ \else
+ \advance\pgfmath@count by 1\relax
+ \expandafter\pgfmath@dim@i
+ \fi}
+
+
+% max function.
+%
+\pgfmathdeclarefunction{max}{...}{%
+ \begingroup%
+ \pgfmath@x=-16383pt\relax%
+ \pgfmathmax@@#1{}}
+
+\def\pgfmathmax@@#1{%
+ \def\pgfmath@temp{#1}%
+ \ifx\pgfmath@temp\pgfmath@empty%
+ \let\pgfmath@next=\pgfmathmax@@@%
+ \else%
+ \ifdim#1pt>\pgfmath@x%
+ \pgfmath@x=#1pt\relax%
+ \fi%
+ \let\pgfmath@next=\pgfmathmax@@%
+ \fi%
+ \pgfmath@next}
+
+\def\pgfmathmax@@@{\pgfmath@returnone\pgfmath@x\endgroup}%
+
+% For computability with old code.
+\def\pgfmathmax#1#2{%
+ \pgfmathparse{#1,#2}%
+ \expandafter\pgfmathmax@\expandafter{\pgfmathresult}%
+}
+
+% min function.
+%
+\pgfmathdeclarefunction{min}{...}{%
+ \begingroup%
+ \pgfmath@x=16383pt\relax%
+ \pgfmathmin@@#1{}}
+
+\def\pgfmathmin@@#1{%
+ \def\pgfmath@temp{#1}%
+ \ifx\pgfmath@temp\pgfmath@empty%
+ \let\pgfmath@next=\pgfmathmin@@@%
+ \else%
+ \ifdim#1pt<\pgfmath@x%
+ \pgfmath@x=#1pt\relax%
+ \fi%
+ \let\pgfmath@next=\pgfmathmin@@%
+ \fi%
+ \pgfmath@next}
+
+\def\pgfmathmin@@@{\pgfmath@returnone\pgfmath@x\endgroup}%
+
+% For computability with old code.
+\def\pgfmathmin#1#2{%
+ \pgfmathparse{#1,#2}%
+ \expandafter\pgfmathmin@\expandafter{\pgfmathresult}%
+}
+
+
+
+% scalar function.
+%
+\pgfmathdeclarefunction{scalar}{1}{%
+ \def\pgfmathresult{#1}%
+ \global\pgfmathunitsdeclaredfalse%
+}
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.random.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.random.code.tex
new file mode 100644
index 0000000000..03be2abfd3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.random.code.tex
@@ -0,0 +1,245 @@
+% Copyright 2007 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.
+
+% This file defines the pseudorandom numbers.
+%
+% Version 1.414213 29/9/2007
+
+% Pseudo-random number generation.
+%
+% See:
+% \book@{pressetal1992,
+% author = {William H. Press and Brian P. Flannery and Saul A.
+% Teukolsky and William T. Vetterling},
+% title = {Numerical Recipies in C},
+% edition = {Second},
+% publisher = {Cambridge University Press}
+% }
+%
+% See also, the documentation for the lcg package by Erich Janka:
+% (http://www.ctan.org/tex-archive/macros/latex/contrib/lcg/lcg.pdf)
+%
+\def\pgfmath@rnd@m{2147483647}% LaTeX Maximum.
+
+\begingroup
+\c@pgfmath@counta=\time%
+\multiply\c@pgfmath@counta by\year%
+\ifnum\c@pgfmath@counta=0
+ \c@pgfmath@counta=1
+\fi
+\xdef\pgfmath@rnd@z{\the\c@pgfmath@counta}% The seed.
+\endgroup
+
+% \pgfmathsetseed
+%
+% Explicitly set the seed for the generator
+%
+% #1 -> the new seed.
+%
+\def\pgfmathsetseed#1{%
+ % Attention pgflibraryluamath.code.tex relies on the fact that
+ % this method also modifies \pgfmathresult:
+ \pgfmathparse{#1}\expandafter\pgfmath@setseed\pgfmathresult.0\pgfmath@stop
+}%
+\def\pgfmath@setseed#1.#2\pgfmath@stop{\def\pgfmath@rnd@z{#1}}%
+
+% Alternative parameters - see Press et al (1992) p278-279,
+% for discussion.
+%
+% a=16807 q=127773 r=2836
+% a=48271 q=4488 r=3399
+%
+\def\pgfmath@rnd@a{69621}
+\def\pgfmath@rnd@r{23902}
+\def\pgfmath@rnd@q{30845}
+
+% \pgfmathgeneratepseudorandomnumber
+%
+% A linear congruency generator for generating
+% pseudo-random numbers. Generates numbers in
+% the range 1 - 2^31-1.
+%
+\def\pgfmathgeneratepseudorandomnumber{%
+ \begingroup%
+ \c@pgfmath@counta=\pgfmath@rnd@z%
+ \c@pgfmath@countb=\pgfmath@rnd@z%
+ \c@pgfmath@countc=\pgfmath@rnd@q%
+ \divide\c@pgfmath@counta by\c@pgfmath@countc%
+ \multiply\c@pgfmath@counta by-\c@pgfmath@countc%
+ \advance\c@pgfmath@counta by\c@pgfmath@countb
+ \c@pgfmath@countc=\pgfmath@rnd@a%
+ \multiply\c@pgfmath@counta by\c@pgfmath@countc%
+ \c@pgfmath@countc=\pgfmath@rnd@q%
+ \divide\c@pgfmath@countb by\c@pgfmath@countc%
+ \c@pgfmath@countc=\pgfmath@rnd@r%
+ \multiply\c@pgfmath@countb by\c@pgfmath@countc%
+ \advance\c@pgfmath@counta by-\c@pgfmath@countb%
+ \ifnum\c@pgfmath@counta<0\relax%
+ \c@pgfmath@countb=\pgfmath@rnd@m%
+ \advance\c@pgfmath@counta by\c@pgfmath@countb%
+ \fi%
+ \xdef\pgfmath@rnd@z{\the\c@pgfmath@counta}%
+ \endgroup%
+ \edef\pgfmathresult{\pgfmath@rnd@z}%
+}
+
+% \pgfmathrnd
+%
+% Generates a pseudo-random number between 0 and 1.
+%
+\pgfmathdeclarefunction{rnd}{0}{%
+ \begingroup%
+ \pgfmathgeneratepseudorandomnumber%
+ \c@pgfmath@counta\pgfmathresult%
+ \c@pgfmath@countb\c@pgfmath@counta%
+ \divide\c@pgfmath@countb100001\relax% To get one.
+ \multiply\c@pgfmath@countb-100001\relax%
+ \advance\c@pgfmath@countb\c@pgfmath@counta%
+ \advance\c@pgfmath@countb1000000\relax%
+ \expandafter\pgfmathrnd@@\the\c@pgfmath@countb\pgfmath@%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+\def\pgfmathrnd@@#1#2#3\pgfmath@{%
+ \edef\pgfmath@temp{#2.#3}%
+ \pgfmath@x=\pgfmath@temp pt\relax%
+}%
+
+% \pgfmathrand
+%
+% Generates a pseudo-random number between -1 and 1.
+%
+\pgfmathdeclarefunction{rand}{0}{%
+ \begingroup%
+ \pgfmathgeneratepseudorandomnumber%
+ \c@pgfmath@counta\pgfmathresult%
+ \c@pgfmath@countb\c@pgfmath@counta%
+ \divide\c@pgfmath@countb200001\relax%
+ \multiply\c@pgfmath@countb-200001\relax%
+ \advance\c@pgfmath@countb\c@pgfmath@counta%
+ \advance\c@pgfmath@countb-100000\relax%
+ \ifnum\c@pgfmath@countb<0\relax%
+ \advance\c@pgfmath@countb-1000000\relax%
+ \else%
+ \advance\c@pgfmath@countb1000000\relax%
+ \fi%
+ \expandafter\pgfmathrand@@\the\c@pgfmath@countb\pgfmath@%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+\def\pgfmathrand@@#1#2#3#4\pgfmath@{%
+ \ifx#1-%
+ \edef\pgfmath@temp{-#3.#4}%
+ \else%
+ \edef\pgfmath@temp{#2.#3#4}%
+ \fi%
+ \pgfmath@x=\pgfmath@temp pt\relax%
+}%
+
+\pgfmathdeclarefunction{random}{...}{%
+ \begingroup%
+ \def\pgfmath@temp{#1}%
+ \ifx\pgfmath@temp\pgfmath@empty%
+ \pgfmathrnd@%
+ \else%
+ \expandafter\pgfmathrandom@@#1\pgfmath@stop%
+ \fi%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup}
+
+\def\pgfmathrandom@@{\futurelet\pgfmath@token\pgfmathrandom@@@}
+\def\pgfmathrandom@@@{%
+ \ifx\pgfmath@token\bgroup%
+ \expandafter\pgfmath@random@@@@%
+ \else%
+ \expandafter\pgfmath@random@@@@@%
+ \fi%
+}
+\def\pgfmath@random@@@@@#1\pgfmath@stop{%
+ \pgfmathrandominteger\pgfmathresult{1}{#1}%
+}
+\def\pgfmath@random@@@@#1#2\pgfmath@stop{%
+ \pgfmathrandominteger\pgfmathresult{#1}{#2}%
+}
+
+% \pgfmathrandominteger
+%
+% Return a 'randomly' selected integer in the range #2 - #3 (inclusive).
+%
+% #1 - a macro to store the integer (not a count register).
+% #2 - the lower limit of the range.
+% #3 - the upper limit of the range.
+%
+\def\pgfmathrandominteger#1#2#3{%
+ \begingroup%
+ \pgfmathsetcount\c@pgfmath@counta{#2}%
+ \pgfmathsetcount\c@pgfmath@countb{#3}%
+ \c@pgfmath@countc\c@pgfmath@countb%
+ % OK. Maybe #2 > #3.
+ \ifnum\c@pgfmath@counta>\c@pgfmath@countb\relax%
+ \c@pgfmath@countc\c@pgfmath@countb%
+ \c@pgfmath@countb\c@pgfmath@counta%
+ \c@pgfmath@counta\c@pgfmath@countc%
+ \fi%
+ \advance\c@pgfmath@countc1\relax%
+ \advance\c@pgfmath@countc-\c@pgfmath@counta%
+ \pgfmathgeneratepseudorandomnumber%
+ \c@pgfmath@counta\pgfmathresult\relax%
+ \c@pgfmath@countb\c@pgfmath@counta%
+ \divide\c@pgfmath@countb\c@pgfmath@countc%
+ \multiply\c@pgfmath@countb-\c@pgfmath@countc%
+ \advance\c@pgfmath@counta\c@pgfmath@countb%
+ \pgfmathaddtocount\c@pgfmath@counta{#2}%
+ \edef\pgfmathresult{\the\c@pgfmath@counta}%
+ \pgfmath@smuggleone{\pgfmathresult}%
+ \endgroup%
+ \edef#1{\pgfmathresult}%
+}
+
+% \pgfmathdeclarerandomlist
+%
+% Create a list to be used with \pgfmathrandomelement.
+%
+% #1 - the name of the list
+% #2 - a list of comma separated elements.
+%
+\def\pgfmathdeclarerandomlist#1#2{%
+ \def\pgfmath@randomlistname{#1}%
+ \begingroup%
+ \c@pgfmath@counta=1\relax%
+ % {} is a possible random element so (locally)
+ % redefine \pgfmath@empty.
+ \def\pgfmath@empty{pgfmath@empty}%
+ \expandafter\pgfmath@scanrandomlist#2{pgfmath@empty}}
+\def\pgfmath@scanrandomlist#1{%
+ \def\pgfmath@scanneditem{#1}%
+ \ifx\pgfmath@scanneditem\pgfmath@empty%
+ \advance\c@pgfmath@counta-1\relax%
+ \expandafter\xdef\csname pgfmath@randomlist@\pgfmath@randomlistname\endcsname{\the\c@pgfmath@counta}%
+ \endgroup%
+ \else%
+ \expandafter\gdef\csname pgfmath@randomlist@\pgfmath@randomlistname @\the\c@pgfmath@counta\endcsname{#1}%
+ \advance\c@pgfmath@counta1\relax%
+ \expandafter\pgfmath@scanrandomlist%
+ \fi}
+
+% \pgfmathrandomitem
+%
+% Return a 'randomly' selected element from a list.
+%
+% #1 - a macro to store the item.
+% #2 - the name of the list.
+%
+\def\pgfmathrandomitem#1#2{%
+ \pgfmath@ifundefined{pgfmath@randomlist@#2}{\pgfmath@error{Unknown random list `#2'}}{%
+ \edef\pgfmath@randomlistlength{\csname pgfmath@randomlist@#2\endcsname}%
+ \pgfmathrandominteger{\pgfmath@randomtemp}{1}{\pgfmath@randomlistlength}%
+ \def#1{\csname pgfmath@randomlist@#2@\pgfmath@randomtemp\endcsname}}}
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.round.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.round.code.tex
new file mode 100644
index 0000000000..4bd05c18c4
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.round.code.tex
@@ -0,0 +1,123 @@
+% Copyright 2007 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.
+
+% This file defines the mathematical functions and operators.
+%
+% Version 1.414213 29/9/2007
+
+% round function. Uses asymmetric half-up rounding.
+%
+\pgfmathdeclarefunction{round}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \afterassignment\pgfmath@xa%
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\relax%
+ \pgfmath@xb\pgfmath@x%
+ \ifdim\pgfmath@xb<0pt\relax%
+ \ifdim\pgfmath@xa<0.5pt\relax%
+ \else%
+ \advance\c@pgfmath@counta-1\relax%
+ \fi%
+ \else%
+ \ifdim\pgfmath@xa<0.5pt\relax%
+ \else%
+ \advance\c@pgfmath@counta1\relax%
+ \fi%
+ \fi%
+ \pgfmath@returnone\the\c@pgfmath@counta pt%
+ \endgroup%
+}%
+
+% floor function.
+%
+\pgfmathdeclarefunction{floor}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \afterassignment\pgfmathfloor@collect@remainder%
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\pgfmath@%
+ \expandafter\pgfmath@x#1pt\relax%
+ \ifdim\pgfmath@x<0pt\relax%
+ \ifdim\pgfmathfloor@remainder>0pt
+ \advance\c@pgfmath@counta by -1\relax%
+ \else
+ % ok, we stripped only '0'.
+ \fi
+ \fi%
+ \pgfmath@x\c@pgfmath@counta pt\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+\def\pgfmathfloor@collect@remainder#1\pgfmath@{%
+ \def\pgfmathfloor@remainder{#1}%
+ \ifx\pgfmathfloor@remainder\pgfutil@empty
+ \def\pgfmathfloor@remainder{0}%
+ \fi
+}%
+
+% ceil function.
+%
+\pgfmathdeclarefunction{ceil}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\relax\pgfmath@%
+ \pgfmath@y\pgfmath@x%
+ \advance\pgfmath@y-\c@pgfmath@counta pt\relax%
+ \pgfmath@x\c@pgfmath@counta pt\relax%
+ \ifdim\pgfmath@y>0pt\relax%
+ \advance\pgfmath@x1pt\relax%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+% int function
+%
+\pgfmathdeclarefunction{int}{1}{%
+ \begingroup%
+ \expandafter\pgfmathint@@#1.\pgfmath@stop
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup}
+
+\def\pgfmathint@@#1.#2\pgfmath@stop{%
+ \def\pgfmath@temp{#1}%
+ \ifx\pgfmath@temp\pgfmath@empty%
+ \def\pgfmathresult{0}%
+ \else%
+ \pgfmath@in@{#1}{+-+0-0}%
+ \ifpgfmath@in@
+ \def\pgfmathresult{0}%
+ \else%
+ \def\pgfmathresult{#1}%
+ \fi%
+ \fi}
+
+% frac function.
+%
+\pgfmathdeclarefunction{frac}{1}{%
+ \begingroup%
+ \expandafter\pgfmathfrac@@#1.\pgfmath@stop%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup}
+
+\def\pgfmathfrac@@#1.{%
+ \pgfmath@ifnextchar\pgfmath@stop{\def\pgfmathresult{0.0}\pgfmath@gobbleone}{\pgfmathfrac@@@}%
+}
+\def\pgfmathfrac@@@#1.\pgfmath@stop{\def\pgfmathresult{0.#1}}
+
+% real function.
+%
+\pgfmathdeclarefunction{real}{1}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup%
+}
diff --git a/graphics/pgf/base/tex/pgfmathfunctions.trigonometric.code.tex b/graphics/pgf/base/tex/pgfmathfunctions.trigonometric.code.tex
new file mode 100644
index 0000000000..76b58bc0f1
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathfunctions.trigonometric.code.tex
@@ -0,0 +1,1571 @@
+% Copyright 2007 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.
+
+% This file defines the trigonometric functions/functions.
+%
+% Much of this file is based on ideas and code (particularly
+% the old \pgfcoremath.code.tex) due to Till Tantau.
+%
+% Version 1.414213 29/9/2007
+
+% \pgfmathpi
+%
+\pgfmathdeclarefunction{pi}{0}{\def\pgfmathresult{3.141592654}}
+
+\pgfkeys{
+ /pgf/trig format/.is choice,
+ % attention: the luamath library will hook into these code keys.
+ /pgf/trig format/deg/.code={\def\pgfmath@trig@format@choice{0}},
+ /pgf/trig format/rad/.code={\def\pgfmath@trig@format@choice{1}},
+ /pgf/trig format/deg,
+}
+
+% Executes #1 if 'trig format=deg' and #2 otherwise.
+\def\pgfmathiftrigonometricusesdeg#1#2{%
+ \if0\pgfmath@trig@format@choice
+ #1%
+ \else
+ #2%
+ \fi
+}%
+
+% \pgfmathradians
+% (for compatibility with 1.18 beta, will be deprecated)
+%
+% Convert #1 from radians to degrees (accurate to 1 deg).
+%
+\pgfmathdeclarefunction{radians}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@x57.29577\pgfmath@x\relax% 57.29577 = 360/(2*pi)
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+% \pgfmathdeg
+%
+% Convert #1 from radians to degrees.
+%
+\pgfmathdeclarefunction{deg}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@scale@rad@to@deg\pgfmath@x
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+\def\pgfmath@scale@rad@to@deg#1{%
+ #1=57.29577#1\relax% 57.29577 = 360/(2*pi)
+}%
+
+% \pgfmathrad
+%
+% Convert #1 from degrees to radians.
+%
+\pgfmathdeclarefunction{rad}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@scale@deg@to@rad\pgfmath@x
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+\def\pgfmath@scale@deg@to@rad#1{%
+ #1=3.14159#1%
+ \divide#1180\relax%
+}%
+
+% \pgfmathsin
+%
+% Calculate the sine of #1 (in degrees).
+%
+\pgfmathdeclarefunction{sin}{1}{%
+ % Let #1 = a.b
+ % Then sin(#1) \approx (1-b)*sin(a) + b*sin(a+1)
+ %
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \if1\pgfmath@trig@format@choice
+ % trig format=rad
+ \pgfmath@scale@rad@to@deg\pgfmath@x
+ \fi
+ \advance\pgfmath@x-90pt\relax%
+ \afterassignment\pgfmath@gobbletilpgfmath@
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\relax\pgfmath@
+ \divide\c@pgfmath@counta360\relax%
+ \multiply\c@pgfmath@counta-360\relax%
+ \advance\pgfmath@x\c@pgfmath@counta pt\relax%
+ \ifdim\pgfmath@x<0pt\relax\pgfmath@x-\pgfmath@x\fi%
+ \ifdim\pgfmath@x<180pt\relax%
+ \else
+ \pgfmath@x-\pgfmath@x%
+ \advance\pgfmath@x360pt\relax%
+ \fi%
+ % Now 0 <= x < 179. So split x into integer and decimal...
+ %
+ \afterassignment\pgfmath@xa%
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\relax%
+ %
+ % ...if #1 is an integer, don't do anything fancy.
+ \ifdim\pgfmath@xa=0pt%
+ \expandafter\pgfmath@x\csname pgfmath@cos@\the\c@pgfmath@counta\endcsname pt\relax%
+ \else%
+ \pgfmath@x-\pgfmath@xa%
+ \advance\pgfmath@x1pt\relax%
+ \expandafter\pgfmath@x\csname pgfmath@cos@\the\c@pgfmath@counta\endcsname\pgfmath@x%
+ \advance\c@pgfmath@counta1\relax%
+ \ifnum\c@pgfmath@counta=181\relax\c@pgfmath@counta179\relax\fi%
+ \expandafter\advance\expandafter\pgfmath@x\csname pgfmath@cos@\the\c@pgfmath@counta\endcsname\pgfmath@xa%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup
+}
+
+% \pgfmathcos
+%
+% Calculate the cosine of #1 (in degrees).
+%
+\pgfmathdeclarefunction{cos}{1}{%
+ % Let x = a.b
+ % Then cos(x) \approx (1-b)*cos(a) + b*cos(a+1)
+ %
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \if1\pgfmath@trig@format@choice
+ % trig format=rad
+ \pgfmath@scale@rad@to@deg\pgfmath@x
+ \fi
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\relax\pgfmath@%
+ \divide\c@pgfmath@counta360\relax%
+ \multiply\c@pgfmath@counta-360\relax%
+ \advance\pgfmath@x\c@pgfmath@counta pt\relax%
+ \ifdim\pgfmath@x<0pt\relax\pgfmath@x-\pgfmath@x\fi%
+ \ifdim\pgfmath@x<180pt\relax%
+ \else%
+ \pgfmath@x-\pgfmath@x%
+ \advance\pgfmath@x360pt\relax%
+ \fi%
+ % Now 0 <= x < 179. So split x into integer and decimal...
+ %
+ \afterassignment\pgfmath@xa%
+ \expandafter\c@pgfmath@counta\the\pgfmath@x\relax%
+ %
+ % ...if #1 is an integer, don't do anything fancy.
+ \ifdim\pgfmath@xa=0pt%
+ \expandafter\pgfmath@x\csname pgfmath@cos@\the\c@pgfmath@counta\endcsname pt%
+ \else%
+ \pgfmath@x-\pgfmath@xa%
+ \advance\pgfmath@x1pt\relax%
+ \expandafter\pgfmath@x\csname pgfmath@cos@\the\c@pgfmath@counta\endcsname\pgfmath@x%
+ \advance\c@pgfmath@counta1\relax%
+ \ifnum\c@pgfmath@counta=181\relax\c@pgfmath@counta179\relax\fi%
+ \expandafter\advance\expandafter\pgfmath@x\csname pgfmath@cos@\the\c@pgfmath@counta\endcsname\pgfmath@xa%
+ \fi%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% \pgfmathsincos
+%
+% Calculate the sin and cosine of #1 (in degrees).
+%
+\def\pgfmathsincos#1{%
+ \pgfmathparse{#1}%
+ \expandafter\pgfmathsincos@\expandafter{\pgfmathresult}}
+\def\pgfmathsincos@#1{%
+ \edef\pgfmath@temparg{#1}%
+ \pgfmathsin@{\pgfmath@temparg}\edef\pgfmathresulty{\pgfmathresult}%
+ \pgfmathcos@{\pgfmath@temparg}\edef\pgfmathresultx{\pgfmathresult}%
+}
+
+% \pgfmathtan
+%
+% Calculate the tangent of #1 (in degrees).
+%
+\pgfmathdeclarefunction{tan}{1}{%
+ \begingroup%
+ \edef\pgfmath@temparg{#1}%
+ \pgfmathcos@{\pgfmath@temparg}%
+ \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}%
+ \edef\pgfmath@tantemp{\pgfmathresult}%
+ \pgfmathsin@{\pgfmath@temparg}%
+ \pgfmath@x\pgfmathresult pt\relax%
+ \pgfmath@x\pgfmath@tantemp\pgfmath@x%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% \pgfmathcosec
+%
+% Calculate the cosec of #1 (in degrees).
+%
+\pgfmathdeclarefunction{cosec}{1}{%
+ \expandafter\pgfmathsin@\expandafter{#1}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+}
+
+% \pgfmathsec
+%
+% Calculate the sec of #1 (in degrees).
+%
+\pgfmathdeclarefunction{sec}{1}{%
+ \expandafter\pgfmathcos@\expandafter{#1}%
+ \pgfmathreciprocal@{\pgfmathresult}%
+}
+
+% \pgfmathcot
+%
+% Calculate the cotangent of #1 (in degrees).
+%
+\pgfmathdeclarefunction{cot}{1}{%
+ \begingroup%
+ \edef\pgfmath@temparg{#1}%
+ \pgfmathsin@{\pgfmath@temparg}%
+ \expandafter\pgfmathreciprocal@\expandafter{\pgfmathresult}%
+ \edef\pgfmath@tantemp{\pgfmathresult}%
+ \pgfmathcos@{\pgfmath@temparg}%
+ \pgfmath@x\pgfmathresult pt\relax%
+ \pgfmath@x\pgfmath@tantemp\pgfmath@x%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+\def\pgfmath@multiply@thousand#1.#2#3#4#5\relax{%
+ \edef\pgfmathresult{#1#2#3#4.#5}%
+}%
+
+% \pgfmathasin
+%
+% The asin of #1
+%
+\pgfmathdeclarefunction{asin}{1}{%
+ \begingroup%
+ \pgfmath@x=#1pt %
+ \pgfmath@xa\pgfmath@x%
+ \edef\pgf@temp{\pgf@sys@tonumber\pgfmath@x}%
+ % compute lossless '*1000' operation:
+ \expandafter\pgfmath@multiply@thousand\pgf@temp 000\relax
+ \pgfmath@x=\pgfmathresult pt %
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \pgfmath@table@lookup{\pgfmath@x}{pgfmath@acos@}{1001}%
+ \pgfmath@x=-\pgfmath@x
+ \advance\pgfmath@x90pt\relax%
+ \ifdim\pgfmath@xa<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \if1\pgfmath@trig@format@choice
+ % trig format=rad
+ \pgfmath@scale@deg@to@rad\pgfmath@x
+ \fi
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% Defines \pgfmath@x to be the result of the table lookup for value
+% '#1' in table '#2'
+%
+% #1: a value for which lookup should be performed
+% #2: the table's prefix name
+% #3: the table's size
+\def\pgfmath@table@lookup#1#2#3{%
+ \pgfmath@x=#1\relax
+ \expandafter\pgfmath@table@lookup@\the\pgfmath@x\relax{#2}{#3}%
+}
+\def\pgfmath@table@lookup@#1.#2\relax#3#4{%
+ \edef\pgf@temp{\Pgf@geT#2}% strip 'pt' suffix.
+ %
+ % prepare constant interpolant (i.e. the value at node '#1'):
+ \pgfmath@x=\csname #3#1\endcsname pt %
+ %
+ \c@pgfmath@countc=#1 %
+ \advance\c@pgfmath@countc by1 %
+ \ifnum\c@pgfmath@countc<#4 %
+ % Ah - we have enough elements in the table.
+ %
+ % perform linear interpolation:
+ \pgfmath@ya=\csname #3\the\c@pgfmath@countc\endcsname pt %
+ \advance\pgfmath@ya by-\pgfmath@x %
+ \advance\pgfmath@x by0.\pgf@temp\pgfmath@ya
+ \fi
+}%
+
+% \pgfmathacos
+%
+% The acos of #1
+%
+\pgfmathdeclarefunction{acos}{1}{%
+ \begingroup%
+ \pgfmath@x#1pt\relax%
+ \pgfmath@xa\pgfmath@x%
+ \edef\pgf@temp{\pgf@sys@tonumber\pgfmath@x}%
+ % compute lossless '*1000' operation:
+ \expandafter\pgfmath@multiply@thousand\pgf@temp 000\relax
+ \pgfmath@x=\pgfmathresult pt %
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \pgfmath@table@lookup{\pgfmath@x}{pgfmath@acos@}{1001}%
+ \ifdim\pgfmath@xa<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \advance\pgfmath@x by180pt\relax%
+ \fi%
+ \if1\pgfmath@trig@format@choice
+ % trig format=rad
+ \pgfmath@scale@deg@to@rad\pgfmath@x
+ \fi
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+\pgfmathdeclarefunction{atan}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@xa\pgfmath@x%
+ \ifdim\pgfmath@x<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \pgfmath@xb\pgfmath@x%
+ \ifdim\pgfmath@x>1pt\relax%
+ \edef\pgfmath@temp{\pgfmath@tonumber{\pgfmath@x}}%
+ \pgfmathreciprocal@{\pgfmath@temp}%
+ \pgfmath@x\pgfmathresult pt\relax%
+ \fi%
+ % compute lossless '*1000' operation:
+ \edef\pgf@temp{\pgf@sys@tonumber\pgfmath@x}%
+ \expandafter\pgfmath@multiply@thousand\pgf@temp 000\relax
+ \pgfmath@x=\pgfmathresult pt %
+ \pgfmath@table@lookup{\pgfmath@x}{pgfmath@atan@}{1001}%xxx
+ \ifdim\pgfmath@xb>1pt\relax%
+ \pgfmath@x=-\pgfmath@x%
+ \advance\pgfmath@x90pt%
+ \fi%
+ \ifdim\pgfmath@xa<0pt\relax%
+ \pgfmath@x-\pgfmath@x%
+ \fi%
+ \if1\pgfmath@trig@format@choice
+ % trig format=rad
+ \pgfmath@scale@deg@to@rad\pgfmath@x
+ \fi
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+\pgfmathdeclarefunction{atan2}{2}{%
+ % Note: first parameter is y (!), second is x (!)
+ \begingroup%
+ \let\pgfmath@trig@format@choice@@=\pgfmath@trig@format@choice
+ \def\pgfmath@trig@format@choice{0}%
+ \pgfmath@y=#1pt\relax%
+ \ifdim\pgfmath@y<0pt\relax%
+ \pgfmath@y=-\pgfmath@y%
+ \fi%
+ \ifdim\pgfmath@y<0.001pt\relax%
+ \ifdim#2pt<0pt\relax%
+ \pgfmath@x=+180pt\relax%
+ \else%
+ \ifdim#2pt>0pt\relax%
+ \pgfmath@x=0pt\relax%
+ \else%
+ \ifdim#1pt<0pt%
+ \pgfmath@x=-90pt\relax%
+ \else%
+ \pgfmath@x=90pt\relax%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \pgfmathabs@{#1}\let\pgfmath@tempa\pgfmathresult%
+ \pgfmathabs@{#2}\let\pgfmath@tempb\pgfmathresult%
+ \ifdim\pgfmath@tempa pt>\pgfmath@tempb pt%
+ \pgfmathdivide@{#2}{\pgfmath@tempa}%
+ \expandafter\pgfmathatan@\expandafter{\pgfmathresult}%
+ \pgfmath@x=90pt%
+ \advance\pgfmath@x by-\pgfmathresult pt\relax%
+ \else%
+ \pgfmathdivide@{\pgfmath@tempa}{#2}%
+ \expandafter\pgfmathatan@\expandafter{\pgfmathresult}%
+ \pgfmath@x=\pgfmathresult pt\relax%
+ \ifdim#2pt<0pt%
+ \advance\pgfmath@x by180pt\relax%
+ \fi%
+ \fi%
+ \ifdim#1pt<0pt\relax%
+ \pgfmath@x=-\pgfmath@x%
+ \fi%
+ \fi%
+ \if1\pgfmath@trig@format@choice@@
+ % trig format=rad
+ \pgfmath@scale@deg@to@rad\pgfmath@x
+ \fi
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}
+
+% This is needed since \pgfmathatan2 is not a legal macro name
+\expandafter\let\expandafter\pgfmathatantwo\csname pgfmathatan2\endcsname
+\expandafter\let\expandafter\pgfmathatantwo@\csname pgfmathatan2@\endcsname
+
+\def\pgfmath@def#1#2#3{\expandafter\def\csname pgfmath@#1@#2\endcsname{#3}}
+\pgfmath@def{cos}{0}{1.00000} \pgfmath@def{cos}{1}{0.99985}
+\pgfmath@def{cos}{2}{0.99939} \pgfmath@def{cos}{3}{0.99863}
+\pgfmath@def{cos}{4}{0.99756} \pgfmath@def{cos}{5}{0.99619}
+\pgfmath@def{cos}{6}{0.99452} \pgfmath@def{cos}{7}{0.99255}
+\pgfmath@def{cos}{8}{0.99027} \pgfmath@def{cos}{9}{0.98769}
+\pgfmath@def{cos}{10}{0.98481} \pgfmath@def{cos}{11}{0.98163}
+\pgfmath@def{cos}{12}{0.97815} \pgfmath@def{cos}{13}{0.97437}
+\pgfmath@def{cos}{14}{0.97030} \pgfmath@def{cos}{15}{0.96593}
+\pgfmath@def{cos}{16}{0.96126} \pgfmath@def{cos}{17}{0.95630}
+\pgfmath@def{cos}{18}{0.95106} \pgfmath@def{cos}{19}{0.94552}
+\pgfmath@def{cos}{20}{0.93969} \pgfmath@def{cos}{21}{0.93358}
+\pgfmath@def{cos}{22}{0.92718} \pgfmath@def{cos}{23}{0.92050}
+\pgfmath@def{cos}{24}{0.91355} \pgfmath@def{cos}{25}{0.90631}
+\pgfmath@def{cos}{26}{0.89879} \pgfmath@def{cos}{27}{0.89101}
+\pgfmath@def{cos}{28}{0.88295} \pgfmath@def{cos}{29}{0.87462}
+\pgfmath@def{cos}{30}{0.86603} \pgfmath@def{cos}{31}{0.85717}
+\pgfmath@def{cos}{32}{0.84805} \pgfmath@def{cos}{33}{0.83867}
+\pgfmath@def{cos}{34}{0.82904} \pgfmath@def{cos}{35}{0.81915}
+\pgfmath@def{cos}{36}{0.80902} \pgfmath@def{cos}{37}{0.79864}
+\pgfmath@def{cos}{38}{0.78801} \pgfmath@def{cos}{39}{0.77715}
+\pgfmath@def{cos}{40}{0.76604} \pgfmath@def{cos}{41}{0.75471}
+\pgfmath@def{cos}{42}{0.74314} \pgfmath@def{cos}{43}{0.73135}
+\pgfmath@def{cos}{44}{0.71934} \pgfmath@def{cos}{45}{0.70711}
+\pgfmath@def{cos}{46}{0.69466} \pgfmath@def{cos}{47}{0.68200}
+\pgfmath@def{cos}{48}{0.66913} \pgfmath@def{cos}{49}{0.65606}
+\pgfmath@def{cos}{50}{0.64279} \pgfmath@def{cos}{51}{0.62932}
+\pgfmath@def{cos}{52}{0.61566} \pgfmath@def{cos}{53}{0.60182}
+\pgfmath@def{cos}{54}{0.58779} \pgfmath@def{cos}{55}{0.57358}
+\pgfmath@def{cos}{56}{0.55919} \pgfmath@def{cos}{57}{0.54464}
+\pgfmath@def{cos}{58}{0.52992} \pgfmath@def{cos}{59}{0.51504}
+\pgfmath@def{cos}{60}{0.50000} \pgfmath@def{cos}{61}{0.48481}
+\pgfmath@def{cos}{62}{0.46947} \pgfmath@def{cos}{63}{0.45399}
+\pgfmath@def{cos}{64}{0.43837} \pgfmath@def{cos}{65}{0.42262}
+\pgfmath@def{cos}{66}{0.40674} \pgfmath@def{cos}{67}{0.39073}
+\pgfmath@def{cos}{68}{0.37461} \pgfmath@def{cos}{69}{0.35837}
+\pgfmath@def{cos}{70}{0.34202} \pgfmath@def{cos}{71}{0.32557}
+\pgfmath@def{cos}{72}{0.30902} \pgfmath@def{cos}{73}{0.29237}
+\pgfmath@def{cos}{74}{0.27564} \pgfmath@def{cos}{75}{0.25882}
+\pgfmath@def{cos}{76}{0.24192} \pgfmath@def{cos}{77}{0.22495}
+\pgfmath@def{cos}{78}{0.20791} \pgfmath@def{cos}{79}{0.19081}
+\pgfmath@def{cos}{80}{0.17365} \pgfmath@def{cos}{81}{0.15643}
+\pgfmath@def{cos}{82}{0.13917} \pgfmath@def{cos}{83}{0.12187}
+\pgfmath@def{cos}{84}{0.10453} \pgfmath@def{cos}{85}{0.08716}
+\pgfmath@def{cos}{86}{0.06976} \pgfmath@def{cos}{87}{0.05234}
+\pgfmath@def{cos}{88}{0.03490} \pgfmath@def{cos}{89}{0.01745}
+\pgfmath@def{cos}{90}{0.00000} \pgfmath@def{cos}{91}{-0.01745}
+\pgfmath@def{cos}{92}{-0.03490} \pgfmath@def{cos}{93}{-0.05234}
+\pgfmath@def{cos}{94}{-0.06976} \pgfmath@def{cos}{95}{-0.08716}
+\pgfmath@def{cos}{96}{-0.10453} \pgfmath@def{cos}{97}{-0.12187}
+\pgfmath@def{cos}{98}{-0.13917} \pgfmath@def{cos}{99}{-0.15643}
+\pgfmath@def{cos}{100}{-0.17365} \pgfmath@def{cos}{101}{-0.19081}
+\pgfmath@def{cos}{102}{-0.20791} \pgfmath@def{cos}{103}{-0.22495}
+\pgfmath@def{cos}{104}{-0.24192} \pgfmath@def{cos}{105}{-0.25882}
+\pgfmath@def{cos}{106}{-0.27564} \pgfmath@def{cos}{107}{-0.29237}
+\pgfmath@def{cos}{108}{-0.30902} \pgfmath@def{cos}{109}{-0.32557}
+\pgfmath@def{cos}{110}{-0.34202} \pgfmath@def{cos}{111}{-0.35837}
+\pgfmath@def{cos}{112}{-0.37461} \pgfmath@def{cos}{113}{-0.39073}
+\pgfmath@def{cos}{114}{-0.40674} \pgfmath@def{cos}{115}{-0.42262}
+\pgfmath@def{cos}{116}{-0.43837} \pgfmath@def{cos}{117}{-0.45399}
+\pgfmath@def{cos}{118}{-0.46947} \pgfmath@def{cos}{119}{-0.48481}
+\pgfmath@def{cos}{120}{-0.50000} \pgfmath@def{cos}{121}{-0.51504}
+\pgfmath@def{cos}{122}{-0.52992} \pgfmath@def{cos}{123}{-0.54464}
+\pgfmath@def{cos}{124}{-0.55919} \pgfmath@def{cos}{125}{-0.57358}
+\pgfmath@def{cos}{126}{-0.58779} \pgfmath@def{cos}{127}{-0.60182}
+\pgfmath@def{cos}{128}{-0.61566} \pgfmath@def{cos}{129}{-0.62932}
+\pgfmath@def{cos}{130}{-0.64279} \pgfmath@def{cos}{131}{-0.65606}
+\pgfmath@def{cos}{132}{-0.66913} \pgfmath@def{cos}{133}{-0.68200}
+\pgfmath@def{cos}{134}{-0.69466} \pgfmath@def{cos}{135}{-0.70711}
+\pgfmath@def{cos}{136}{-0.71934} \pgfmath@def{cos}{137}{-0.73135}
+\pgfmath@def{cos}{138}{-0.74314} \pgfmath@def{cos}{139}{-0.75471}
+\pgfmath@def{cos}{140}{-0.76604} \pgfmath@def{cos}{141}{-0.77715}
+\pgfmath@def{cos}{142}{-0.78801} \pgfmath@def{cos}{143}{-0.79864}
+\pgfmath@def{cos}{144}{-0.80902} \pgfmath@def{cos}{145}{-0.81915}
+\pgfmath@def{cos}{146}{-0.82904} \pgfmath@def{cos}{147}{-0.83867}
+\pgfmath@def{cos}{148}{-0.84805} \pgfmath@def{cos}{149}{-0.85717}
+\pgfmath@def{cos}{150}{-0.86603} \pgfmath@def{cos}{151}{-0.87462}
+\pgfmath@def{cos}{152}{-0.88295} \pgfmath@def{cos}{153}{-0.89101}
+\pgfmath@def{cos}{154}{-0.89879} \pgfmath@def{cos}{155}{-0.90631}
+\pgfmath@def{cos}{156}{-0.91355} \pgfmath@def{cos}{157}{-0.92050}
+\pgfmath@def{cos}{158}{-0.92718} \pgfmath@def{cos}{159}{-0.93358}
+\pgfmath@def{cos}{160}{-0.93969} \pgfmath@def{cos}{161}{-0.94552}
+\pgfmath@def{cos}{162}{-0.95106} \pgfmath@def{cos}{163}{-0.95630}
+\pgfmath@def{cos}{164}{-0.96126} \pgfmath@def{cos}{165}{-0.96593}
+\pgfmath@def{cos}{166}{-0.97030} \pgfmath@def{cos}{167}{-0.97437}
+\pgfmath@def{cos}{168}{-0.97815} \pgfmath@def{cos}{169}{-0.98163}
+\pgfmath@def{cos}{170}{-0.98481} \pgfmath@def{cos}{171}{-0.98769}
+\pgfmath@def{cos}{172}{-0.99027} \pgfmath@def{cos}{173}{-0.99255}
+\pgfmath@def{cos}{174}{-0.99452} \pgfmath@def{cos}{175}{-0.99619}
+\pgfmath@def{cos}{176}{-0.99756} \pgfmath@def{cos}{177}{-0.99863}
+\pgfmath@def{cos}{178}{-0.99939} \pgfmath@def{cos}{179}{-0.99985}
+\pgfmath@def{cos}{180}{-1.00000} \pgfmath@def{cos}{181}{-0.99985}
+
+\pgfmath@def{cosfrac}{0}{1.00000} \pgfmath@def{cosfrac}{1}{0.99995}
+\pgfmath@def{cosfrac}{2}{0.99980} \pgfmath@def{cosfrac}{3}{0.99955}
+\pgfmath@def{cosfrac}{4}{0.99920} \pgfmath@def{cosfrac}{5}{0.99875}
+\pgfmath@def{cosfrac}{6}{0.99820} \pgfmath@def{cosfrac}{7}{0.99755}
+\pgfmath@def{cosfrac}{8}{0.99681} \pgfmath@def{cosfrac}{9}{0.99597}
+\pgfmath@def{cosfrac}{10}{0.99503} \pgfmath@def{cosfrac}{11}{0.99400}
+\pgfmath@def{cosfrac}{12}{0.99287} \pgfmath@def{cosfrac}{13}{0.99165}
+\pgfmath@def{cosfrac}{14}{0.99034} \pgfmath@def{cosfrac}{15}{0.98893}
+\pgfmath@def{cosfrac}{16}{0.98744} \pgfmath@def{cosfrac}{17}{0.98585}
+\pgfmath@def{cosfrac}{18}{0.98418} \pgfmath@def{cosfrac}{19}{0.98242}
+\pgfmath@def{cosfrac}{20}{0.98058} \pgfmath@def{cosfrac}{21}{0.97865}
+\pgfmath@def{cosfrac}{22}{0.97664} \pgfmath@def{cosfrac}{23}{0.97455}
+\pgfmath@def{cosfrac}{24}{0.97238} \pgfmath@def{cosfrac}{25}{0.97014}
+\pgfmath@def{cosfrac}{26}{0.96782} \pgfmath@def{cosfrac}{27}{0.96542}
+\pgfmath@def{cosfrac}{28}{0.96296} \pgfmath@def{cosfrac}{29}{0.96042}
+\pgfmath@def{cosfrac}{30}{0.95782} \pgfmath@def{cosfrac}{31}{0.95515}
+\pgfmath@def{cosfrac}{32}{0.95242} \pgfmath@def{cosfrac}{33}{0.94962}
+\pgfmath@def{cosfrac}{34}{0.94677} \pgfmath@def{cosfrac}{35}{0.94385}
+\pgfmath@def{cosfrac}{36}{0.94088} \pgfmath@def{cosfrac}{37}{0.93786}
+\pgfmath@def{cosfrac}{38}{0.93478} \pgfmath@def{cosfrac}{39}{0.93165}
+\pgfmath@def{cosfrac}{40}{0.92847} \pgfmath@def{cosfrac}{41}{0.92525}
+\pgfmath@def{cosfrac}{42}{0.92198} \pgfmath@def{cosfrac}{43}{0.91866}
+\pgfmath@def{cosfrac}{44}{0.91531} \pgfmath@def{cosfrac}{45}{0.91192}
+\pgfmath@def{cosfrac}{46}{0.90849} \pgfmath@def{cosfrac}{47}{0.90502}
+\pgfmath@def{cosfrac}{48}{0.90152} \pgfmath@def{cosfrac}{49}{0.89799}
+\pgfmath@def{cosfrac}{50}{0.89442} \pgfmath@def{cosfrac}{51}{0.89083}
+\pgfmath@def{cosfrac}{52}{0.88721} \pgfmath@def{cosfrac}{53}{0.88357}
+\pgfmath@def{cosfrac}{54}{0.87990} \pgfmath@def{cosfrac}{55}{0.87621}
+\pgfmath@def{cosfrac}{56}{0.87250} \pgfmath@def{cosfrac}{57}{0.86877}
+\pgfmath@def{cosfrac}{58}{0.86503} \pgfmath@def{cosfrac}{59}{0.86126}
+\pgfmath@def{cosfrac}{60}{0.85749} \pgfmath@def{cosfrac}{61}{0.85370}
+\pgfmath@def{cosfrac}{62}{0.84990} \pgfmath@def{cosfrac}{63}{0.84609}
+\pgfmath@def{cosfrac}{64}{0.84227} \pgfmath@def{cosfrac}{65}{0.83844}
+\pgfmath@def{cosfrac}{66}{0.83460} \pgfmath@def{cosfrac}{67}{0.83077}
+\pgfmath@def{cosfrac}{68}{0.82692} \pgfmath@def{cosfrac}{69}{0.82308}
+\pgfmath@def{cosfrac}{70}{0.81923} \pgfmath@def{cosfrac}{71}{0.81538}
+\pgfmath@def{cosfrac}{72}{0.81153} \pgfmath@def{cosfrac}{73}{0.80768}
+\pgfmath@def{cosfrac}{74}{0.80384} \pgfmath@def{cosfrac}{75}{0.80000}
+\pgfmath@def{cosfrac}{76}{0.79616} \pgfmath@def{cosfrac}{77}{0.79232}
+\pgfmath@def{cosfrac}{78}{0.78850} \pgfmath@def{cosfrac}{79}{0.78468}
+\pgfmath@def{cosfrac}{80}{0.78086} \pgfmath@def{cosfrac}{81}{0.77706}
+\pgfmath@def{cosfrac}{82}{0.77326} \pgfmath@def{cosfrac}{83}{0.76948}
+\pgfmath@def{cosfrac}{84}{0.76570} \pgfmath@def{cosfrac}{85}{0.76193}
+\pgfmath@def{cosfrac}{86}{0.75818} \pgfmath@def{cosfrac}{87}{0.75444}
+\pgfmath@def{cosfrac}{88}{0.75071} \pgfmath@def{cosfrac}{89}{0.74699}
+\pgfmath@def{cosfrac}{90}{0.74329} \pgfmath@def{cosfrac}{91}{0.73960}
+\pgfmath@def{cosfrac}{92}{0.73593} \pgfmath@def{cosfrac}{93}{0.73227}
+\pgfmath@def{cosfrac}{94}{0.72862} \pgfmath@def{cosfrac}{95}{0.72499}
+\pgfmath@def{cosfrac}{96}{0.72138} \pgfmath@def{cosfrac}{97}{0.71779}
+\pgfmath@def{cosfrac}{98}{0.71421} \pgfmath@def{cosfrac}{99}{0.71065}
+\pgfmath@def{cosfrac}{100}{0.70710}
+
+% Oh No! Some really loooooong tables.
+\pgfmath@def{atan}{0}{0.00000} \pgfmath@def{atan}{1}{0.05729}
+\pgfmath@def{atan}{2}{0.11459} \pgfmath@def{atan}{3}{0.17188}
+\pgfmath@def{atan}{4}{0.22918} \pgfmath@def{atan}{5}{0.28647}
+\pgfmath@def{atan}{6}{0.34377} \pgfmath@def{atan}{7}{0.40106}
+\pgfmath@def{atan}{8}{0.45835} \pgfmath@def{atan}{9}{0.51564}
+\pgfmath@def{atan}{10}{0.57293} \pgfmath@def{atan}{11}{0.63022}
+\pgfmath@def{atan}{12}{0.68751} \pgfmath@def{atan}{13}{0.74480}
+\pgfmath@def{atan}{14}{0.80208} \pgfmath@def{atan}{15}{0.85937}
+\pgfmath@def{atan}{16}{0.91665} \pgfmath@def{atan}{17}{0.97393}
+\pgfmath@def{atan}{18}{1.03121} \pgfmath@def{atan}{19}{1.08848}
+\pgfmath@def{atan}{20}{1.14576} \pgfmath@def{atan}{21}{1.20303}
+\pgfmath@def{atan}{22}{1.26030} \pgfmath@def{atan}{23}{1.31757}
+\pgfmath@def{atan}{24}{1.37483} \pgfmath@def{atan}{25}{1.43209}
+\pgfmath@def{atan}{26}{1.48935} \pgfmath@def{atan}{27}{1.54661}
+\pgfmath@def{atan}{28}{1.60386} \pgfmath@def{atan}{29}{1.66111}
+\pgfmath@def{atan}{30}{1.71835} \pgfmath@def{atan}{31}{1.77560}
+\pgfmath@def{atan}{32}{1.83284} \pgfmath@def{atan}{33}{1.89007}
+\pgfmath@def{atan}{34}{1.94730} \pgfmath@def{atan}{35}{2.00453}
+\pgfmath@def{atan}{36}{2.06175} \pgfmath@def{atan}{37}{2.11897}
+\pgfmath@def{atan}{38}{2.17619} \pgfmath@def{atan}{39}{2.23340}
+\pgfmath@def{atan}{40}{2.29061} \pgfmath@def{atan}{41}{2.34781}
+\pgfmath@def{atan}{42}{2.40500} \pgfmath@def{atan}{43}{2.46220}
+\pgfmath@def{atan}{44}{2.51938} \pgfmath@def{atan}{45}{2.57657}
+\pgfmath@def{atan}{46}{2.63374} \pgfmath@def{atan}{47}{2.69092}
+\pgfmath@def{atan}{48}{2.74808} \pgfmath@def{atan}{49}{2.80524}
+\pgfmath@def{atan}{50}{2.86240} \pgfmath@def{atan}{51}{2.91955}
+\pgfmath@def{atan}{52}{2.97669} \pgfmath@def{atan}{53}{3.03383}
+\pgfmath@def{atan}{54}{3.09097} \pgfmath@def{atan}{55}{3.14809}
+\pgfmath@def{atan}{56}{3.20521} \pgfmath@def{atan}{57}{3.26232}
+\pgfmath@def{atan}{58}{3.31943} \pgfmath@def{atan}{59}{3.37653}
+\pgfmath@def{atan}{60}{3.43363} \pgfmath@def{atan}{61}{3.49071}
+\pgfmath@def{atan}{62}{3.54779} \pgfmath@def{atan}{63}{3.60487}
+\pgfmath@def{atan}{64}{3.66193} \pgfmath@def{atan}{65}{3.71899}
+\pgfmath@def{atan}{66}{3.77604} \pgfmath@def{atan}{67}{3.83308}
+\pgfmath@def{atan}{68}{3.89012} \pgfmath@def{atan}{69}{3.94715}
+\pgfmath@def{atan}{70}{4.00417} \pgfmath@def{atan}{71}{4.06118}
+\pgfmath@def{atan}{72}{4.11819} \pgfmath@def{atan}{73}{4.17518}
+\pgfmath@def{atan}{74}{4.23217} \pgfmath@def{atan}{75}{4.28915}
+\pgfmath@def{atan}{76}{4.34612} \pgfmath@def{atan}{77}{4.40308}
+\pgfmath@def{atan}{78}{4.46004} \pgfmath@def{atan}{79}{4.51698}
+\pgfmath@def{atan}{80}{4.57392} \pgfmath@def{atan}{81}{4.63084}
+\pgfmath@def{atan}{82}{4.68776} \pgfmath@def{atan}{83}{4.74467}
+\pgfmath@def{atan}{84}{4.80157} \pgfmath@def{atan}{85}{4.85846}
+\pgfmath@def{atan}{86}{4.91534} \pgfmath@def{atan}{87}{4.97221}
+\pgfmath@def{atan}{88}{5.02907} \pgfmath@def{atan}{89}{5.08592}
+\pgfmath@def{atan}{90}{5.14276} \pgfmath@def{atan}{91}{5.19959}
+\pgfmath@def{atan}{92}{5.25641} \pgfmath@def{atan}{93}{5.31322}
+\pgfmath@def{atan}{94}{5.37002} \pgfmath@def{atan}{95}{5.42681}
+\pgfmath@def{atan}{96}{5.48359} \pgfmath@def{atan}{97}{5.54035}
+\pgfmath@def{atan}{98}{5.59711} \pgfmath@def{atan}{99}{5.65385}
+\pgfmath@def{atan}{100}{5.71059} \pgfmath@def{atan}{101}{5.76731}
+\pgfmath@def{atan}{102}{5.82402} \pgfmath@def{atan}{103}{5.88072}
+\pgfmath@def{atan}{104}{5.93741} \pgfmath@def{atan}{105}{5.99409}
+\pgfmath@def{atan}{106}{6.05075} \pgfmath@def{atan}{107}{6.10741}
+\pgfmath@def{atan}{108}{6.16405} \pgfmath@def{atan}{109}{6.22068}
+\pgfmath@def{atan}{110}{6.27729} \pgfmath@def{atan}{111}{6.33390}
+\pgfmath@def{atan}{112}{6.39049} \pgfmath@def{atan}{113}{6.44707}
+\pgfmath@def{atan}{114}{6.50364} \pgfmath@def{atan}{115}{6.56019}
+\pgfmath@def{atan}{116}{6.61673} \pgfmath@def{atan}{117}{6.67326}
+\pgfmath@def{atan}{118}{6.72978} \pgfmath@def{atan}{119}{6.78628}
+\pgfmath@def{atan}{120}{6.84277} \pgfmath@def{atan}{121}{6.89924}
+\pgfmath@def{atan}{122}{6.95571} \pgfmath@def{atan}{123}{7.01216}
+\pgfmath@def{atan}{124}{7.06859} \pgfmath@def{atan}{125}{7.12501}
+\pgfmath@def{atan}{126}{7.18142} \pgfmath@def{atan}{127}{7.23781}
+\pgfmath@def{atan}{128}{7.29419} \pgfmath@def{atan}{129}{7.35056}
+\pgfmath@def{atan}{130}{7.40691} \pgfmath@def{atan}{131}{7.46324}
+\pgfmath@def{atan}{132}{7.51957} \pgfmath@def{atan}{133}{7.57587}
+\pgfmath@def{atan}{134}{7.63217} \pgfmath@def{atan}{135}{7.68844}
+\pgfmath@def{atan}{136}{7.74471} \pgfmath@def{atan}{137}{7.80095}
+\pgfmath@def{atan}{138}{7.85719} \pgfmath@def{atan}{139}{7.91340}
+\pgfmath@def{atan}{140}{7.96961} \pgfmath@def{atan}{141}{8.02579}
+\pgfmath@def{atan}{142}{8.08196} \pgfmath@def{atan}{143}{8.13812}
+\pgfmath@def{atan}{144}{8.19426} \pgfmath@def{atan}{145}{8.25038}
+\pgfmath@def{atan}{146}{8.30649} \pgfmath@def{atan}{147}{8.36258}
+\pgfmath@def{atan}{148}{8.41866} \pgfmath@def{atan}{149}{8.47472}
+\pgfmath@def{atan}{150}{8.53076} \pgfmath@def{atan}{151}{8.58679}
+\pgfmath@def{atan}{152}{8.64280} \pgfmath@def{atan}{153}{8.69879}
+\pgfmath@def{atan}{154}{8.75477} \pgfmath@def{atan}{155}{8.81073}
+\pgfmath@def{atan}{156}{8.86667} \pgfmath@def{atan}{157}{8.92260}
+\pgfmath@def{atan}{158}{8.97851} \pgfmath@def{atan}{159}{9.03440}
+\pgfmath@def{atan}{160}{9.09027} \pgfmath@def{atan}{161}{9.14613}
+\pgfmath@def{atan}{162}{9.20197} \pgfmath@def{atan}{163}{9.25779}
+\pgfmath@def{atan}{164}{9.31359} \pgfmath@def{atan}{165}{9.36938}
+\pgfmath@def{atan}{166}{9.42515} \pgfmath@def{atan}{167}{9.48090}
+\pgfmath@def{atan}{168}{9.53663} \pgfmath@def{atan}{169}{9.59235}
+\pgfmath@def{atan}{170}{9.64804} \pgfmath@def{atan}{171}{9.70372}
+\pgfmath@def{atan}{172}{9.75938} \pgfmath@def{atan}{173}{9.81502}
+\pgfmath@def{atan}{174}{9.87064} \pgfmath@def{atan}{175}{9.92624}
+\pgfmath@def{atan}{176}{9.98182} \pgfmath@def{atan}{177}{10.03739}
+\pgfmath@def{atan}{178}{10.09294} \pgfmath@def{atan}{179}{10.14846}
+\pgfmath@def{atan}{180}{10.20397} \pgfmath@def{atan}{181}{10.25946}
+\pgfmath@def{atan}{182}{10.31493} \pgfmath@def{atan}{183}{10.37037}
+\pgfmath@def{atan}{184}{10.42580} \pgfmath@def{atan}{185}{10.48121}
+\pgfmath@def{atan}{186}{10.53660} \pgfmath@def{atan}{187}{10.59197}
+\pgfmath@def{atan}{188}{10.64732} \pgfmath@def{atan}{189}{10.70265}
+\pgfmath@def{atan}{190}{10.75796} \pgfmath@def{atan}{191}{10.81325}
+\pgfmath@def{atan}{192}{10.86852} \pgfmath@def{atan}{193}{10.92377}
+\pgfmath@def{atan}{194}{10.97900} \pgfmath@def{atan}{195}{11.03420}
+\pgfmath@def{atan}{196}{11.08939} \pgfmath@def{atan}{197}{11.14456}
+\pgfmath@def{atan}{198}{11.19970} \pgfmath@def{atan}{199}{11.25483}
+\pgfmath@def{atan}{200}{11.30993} \pgfmath@def{atan}{201}{11.36501}
+\pgfmath@def{atan}{202}{11.42007} \pgfmath@def{atan}{203}{11.47511}
+\pgfmath@def{atan}{204}{11.53013} \pgfmath@def{atan}{205}{11.58512}
+\pgfmath@def{atan}{206}{11.64010} \pgfmath@def{atan}{207}{11.69505}
+\pgfmath@def{atan}{208}{11.74998} \pgfmath@def{atan}{209}{11.80489}
+\pgfmath@def{atan}{210}{11.85977} \pgfmath@def{atan}{211}{11.91464}
+\pgfmath@def{atan}{212}{11.96948} \pgfmath@def{atan}{213}{12.02430}
+\pgfmath@def{atan}{214}{12.07910} \pgfmath@def{atan}{215}{12.13388}
+\pgfmath@def{atan}{216}{12.18863} \pgfmath@def{atan}{217}{12.24336}
+\pgfmath@def{atan}{218}{12.29807} \pgfmath@def{atan}{219}{12.35275}
+\pgfmath@def{atan}{220}{12.40741} \pgfmath@def{atan}{221}{12.46205}
+\pgfmath@def{atan}{222}{12.51667} \pgfmath@def{atan}{223}{12.57126}
+\pgfmath@def{atan}{224}{12.62583} \pgfmath@def{atan}{225}{12.68038}
+\pgfmath@def{atan}{226}{12.73490} \pgfmath@def{atan}{227}{12.78940}
+\pgfmath@def{atan}{228}{12.84388} \pgfmath@def{atan}{229}{12.89833}
+\pgfmath@def{atan}{230}{12.95276} \pgfmath@def{atan}{231}{13.00717}
+\pgfmath@def{atan}{232}{13.06155} \pgfmath@def{atan}{233}{13.11590}
+\pgfmath@def{atan}{234}{13.17024} \pgfmath@def{atan}{235}{13.22455}
+\pgfmath@def{atan}{236}{13.27883} \pgfmath@def{atan}{237}{13.33309}
+\pgfmath@def{atan}{238}{13.38733} \pgfmath@def{atan}{239}{13.44154}
+\pgfmath@def{atan}{240}{13.49573} \pgfmath@def{atan}{241}{13.54989}
+\pgfmath@def{atan}{242}{13.60403} \pgfmath@def{atan}{243}{13.65814}
+\pgfmath@def{atan}{244}{13.71223} \pgfmath@def{atan}{245}{13.76630}
+\pgfmath@def{atan}{246}{13.82034} \pgfmath@def{atan}{247}{13.87435}
+\pgfmath@def{atan}{248}{13.92834} \pgfmath@def{atan}{249}{13.98230}
+\pgfmath@def{atan}{250}{14.03624} \pgfmath@def{atan}{251}{14.09015}
+\pgfmath@def{atan}{252}{14.14404} \pgfmath@def{atan}{253}{14.19790}
+\pgfmath@def{atan}{254}{14.25174} \pgfmath@def{atan}{255}{14.30555}
+\pgfmath@def{atan}{256}{14.35933} \pgfmath@def{atan}{257}{14.41309}
+\pgfmath@def{atan}{258}{14.46682} \pgfmath@def{atan}{259}{14.52053}
+\pgfmath@def{atan}{260}{14.57421} \pgfmath@def{atan}{261}{14.62787}
+\pgfmath@def{atan}{262}{14.68149} \pgfmath@def{atan}{263}{14.73510}
+\pgfmath@def{atan}{264}{14.78867} \pgfmath@def{atan}{265}{14.84222}
+\pgfmath@def{atan}{266}{14.89575} \pgfmath@def{atan}{267}{14.94924}
+\pgfmath@def{atan}{268}{15.00271} \pgfmath@def{atan}{269}{15.05615}
+\pgfmath@def{atan}{270}{15.10957} \pgfmath@def{atan}{271}{15.16296}
+\pgfmath@def{atan}{272}{15.21632} \pgfmath@def{atan}{273}{15.26966}
+\pgfmath@def{atan}{274}{15.32297} \pgfmath@def{atan}{275}{15.37625}
+\pgfmath@def{atan}{276}{15.42950} \pgfmath@def{atan}{277}{15.48273}
+\pgfmath@def{atan}{278}{15.53593} \pgfmath@def{atan}{279}{15.58910}
+\pgfmath@def{atan}{280}{15.64224} \pgfmath@def{atan}{281}{15.69536}
+\pgfmath@def{atan}{282}{15.74845} \pgfmath@def{atan}{283}{15.80151}
+\pgfmath@def{atan}{284}{15.85454} \pgfmath@def{atan}{285}{15.90755}
+\pgfmath@def{atan}{286}{15.96052} \pgfmath@def{atan}{287}{16.01347}
+\pgfmath@def{atan}{288}{16.06640} \pgfmath@def{atan}{289}{16.11929}
+\pgfmath@def{atan}{290}{16.17215} \pgfmath@def{atan}{291}{16.22499}
+\pgfmath@def{atan}{292}{16.27780} \pgfmath@def{atan}{293}{16.33058}
+\pgfmath@def{atan}{294}{16.38333} \pgfmath@def{atan}{295}{16.43605}
+\pgfmath@def{atan}{296}{16.48875} \pgfmath@def{atan}{297}{16.54142}
+\pgfmath@def{atan}{298}{16.59405} \pgfmath@def{atan}{299}{16.64666}
+\pgfmath@def{atan}{300}{16.69924} \pgfmath@def{atan}{301}{16.75179}
+\pgfmath@def{atan}{302}{16.80431} \pgfmath@def{atan}{303}{16.85680}
+\pgfmath@def{atan}{304}{16.90927} \pgfmath@def{atan}{305}{16.96170}
+\pgfmath@def{atan}{306}{17.01411} \pgfmath@def{atan}{307}{17.06648}
+\pgfmath@def{atan}{308}{17.11883} \pgfmath@def{atan}{309}{17.17114}
+\pgfmath@def{atan}{310}{17.22343} \pgfmath@def{atan}{311}{17.27569}
+\pgfmath@def{atan}{312}{17.32792} \pgfmath@def{atan}{313}{17.38012}
+\pgfmath@def{atan}{314}{17.43228} \pgfmath@def{atan}{315}{17.48442}
+\pgfmath@def{atan}{316}{17.53653} \pgfmath@def{atan}{317}{17.58861}
+\pgfmath@def{atan}{318}{17.64066} \pgfmath@def{atan}{319}{17.69268}
+\pgfmath@def{atan}{320}{17.74467} \pgfmath@def{atan}{321}{17.79663}
+\pgfmath@def{atan}{322}{17.84855} \pgfmath@def{atan}{323}{17.90045}
+\pgfmath@def{atan}{324}{17.95232} \pgfmath@def{atan}{325}{18.00416}
+\pgfmath@def{atan}{326}{18.05596} \pgfmath@def{atan}{327}{18.10774}
+\pgfmath@def{atan}{328}{18.15949} \pgfmath@def{atan}{329}{18.21120}
+\pgfmath@def{atan}{330}{18.26289} \pgfmath@def{atan}{331}{18.31454}
+\pgfmath@def{atan}{332}{18.36616} \pgfmath@def{atan}{333}{18.41775}
+\pgfmath@def{atan}{334}{18.46931} \pgfmath@def{atan}{335}{18.52084}
+\pgfmath@def{atan}{336}{18.57234} \pgfmath@def{atan}{337}{18.62381}
+\pgfmath@def{atan}{338}{18.67525} \pgfmath@def{atan}{339}{18.72665}
+\pgfmath@def{atan}{340}{18.77803} \pgfmath@def{atan}{341}{18.82937}
+\pgfmath@def{atan}{342}{18.88068} \pgfmath@def{atan}{343}{18.93196}
+\pgfmath@def{atan}{344}{18.98321} \pgfmath@def{atan}{345}{19.03443}
+\pgfmath@def{atan}{346}{19.08562} \pgfmath@def{atan}{347}{19.13677}
+\pgfmath@def{atan}{348}{19.18789} \pgfmath@def{atan}{349}{19.23898}
+\pgfmath@def{atan}{350}{19.29004} \pgfmath@def{atan}{351}{19.34107}
+\pgfmath@def{atan}{352}{19.39206} \pgfmath@def{atan}{353}{19.44303}
+\pgfmath@def{atan}{354}{19.49396} \pgfmath@def{atan}{355}{19.54486}
+\pgfmath@def{atan}{356}{19.59572} \pgfmath@def{atan}{357}{19.64656}
+\pgfmath@def{atan}{358}{19.69736} \pgfmath@def{atan}{359}{19.74813}
+\pgfmath@def{atan}{360}{19.79887} \pgfmath@def{atan}{361}{19.84958}
+\pgfmath@def{atan}{362}{19.90025} \pgfmath@def{atan}{363}{19.95089}
+\pgfmath@def{atan}{364}{20.00150} \pgfmath@def{atan}{365}{20.05208}
+\pgfmath@def{atan}{366}{20.10262} \pgfmath@def{atan}{367}{20.15313}
+\pgfmath@def{atan}{368}{20.20361} \pgfmath@def{atan}{369}{20.25406}
+\pgfmath@def{atan}{370}{20.30447} \pgfmath@def{atan}{371}{20.35485}
+\pgfmath@def{atan}{372}{20.40520} \pgfmath@def{atan}{373}{20.45551}
+\pgfmath@def{atan}{374}{20.50579} \pgfmath@def{atan}{375}{20.55604}
+\pgfmath@def{atan}{376}{20.60626} \pgfmath@def{atan}{377}{20.65644}
+\pgfmath@def{atan}{378}{20.70659} \pgfmath@def{atan}{379}{20.75670}
+\pgfmath@def{atan}{380}{20.80679} \pgfmath@def{atan}{381}{20.85684}
+\pgfmath@def{atan}{382}{20.90685} \pgfmath@def{atan}{383}{20.95684}
+\pgfmath@def{atan}{384}{21.00678} \pgfmath@def{atan}{385}{21.05670}
+\pgfmath@def{atan}{386}{21.10658} \pgfmath@def{atan}{387}{21.15643}
+\pgfmath@def{atan}{388}{21.20625} \pgfmath@def{atan}{389}{21.25603}
+\pgfmath@def{atan}{390}{21.30578} \pgfmath@def{atan}{391}{21.35549}
+\pgfmath@def{atan}{392}{21.40517} \pgfmath@def{atan}{393}{21.45482}
+\pgfmath@def{atan}{394}{21.50444} \pgfmath@def{atan}{395}{21.55402}
+\pgfmath@def{atan}{396}{21.60356} \pgfmath@def{atan}{397}{21.65307}
+\pgfmath@def{atan}{398}{21.70255} \pgfmath@def{atan}{399}{21.75200}
+\pgfmath@def{atan}{400}{21.80140} \pgfmath@def{atan}{401}{21.85078}
+\pgfmath@def{atan}{402}{21.90012} \pgfmath@def{atan}{403}{21.94943}
+\pgfmath@def{atan}{404}{21.99870} \pgfmath@def{atan}{405}{22.04794}
+\pgfmath@def{atan}{406}{22.09715} \pgfmath@def{atan}{407}{22.14632}
+\pgfmath@def{atan}{408}{22.19546} \pgfmath@def{atan}{409}{22.24456}
+\pgfmath@def{atan}{410}{22.29362} \pgfmath@def{atan}{411}{22.34266}
+\pgfmath@def{atan}{412}{22.39166} \pgfmath@def{atan}{413}{22.44062}
+\pgfmath@def{atan}{414}{22.48955} \pgfmath@def{atan}{415}{22.53845}
+\pgfmath@def{atan}{416}{22.58731} \pgfmath@def{atan}{417}{22.63613}
+\pgfmath@def{atan}{418}{22.68492} \pgfmath@def{atan}{419}{22.73368}
+\pgfmath@def{atan}{420}{22.78240} \pgfmath@def{atan}{421}{22.83109}
+\pgfmath@def{atan}{422}{22.87974} \pgfmath@def{atan}{423}{22.92836}
+\pgfmath@def{atan}{424}{22.97694} \pgfmath@def{atan}{425}{23.02549}
+\pgfmath@def{atan}{426}{23.07400} \pgfmath@def{atan}{427}{23.12248}
+\pgfmath@def{atan}{428}{23.17092} \pgfmath@def{atan}{429}{23.21933}
+\pgfmath@def{atan}{430}{23.26770} \pgfmath@def{atan}{431}{23.31604}
+\pgfmath@def{atan}{432}{23.36434} \pgfmath@def{atan}{433}{23.41261}
+\pgfmath@def{atan}{434}{23.46084} \pgfmath@def{atan}{435}{23.50904}
+\pgfmath@def{atan}{436}{23.55720} \pgfmath@def{atan}{437}{23.60532}
+\pgfmath@def{atan}{438}{23.65341} \pgfmath@def{atan}{439}{23.70147}
+\pgfmath@def{atan}{440}{23.74949} \pgfmath@def{atan}{441}{23.79747}
+\pgfmath@def{atan}{442}{23.84542} \pgfmath@def{atan}{443}{23.89334}
+\pgfmath@def{atan}{444}{23.94122} \pgfmath@def{atan}{445}{23.98906}
+\pgfmath@def{atan}{446}{24.03687} \pgfmath@def{atan}{447}{24.08464}
+\pgfmath@def{atan}{448}{24.13238} \pgfmath@def{atan}{449}{24.18008}
+\pgfmath@def{atan}{450}{24.22774} \pgfmath@def{atan}{451}{24.27537}
+\pgfmath@def{atan}{452}{24.32296} \pgfmath@def{atan}{453}{24.37052}
+\pgfmath@def{atan}{454}{24.41804} \pgfmath@def{atan}{455}{24.46553}
+\pgfmath@def{atan}{456}{24.51298} \pgfmath@def{atan}{457}{24.56040}
+\pgfmath@def{atan}{458}{24.60778} \pgfmath@def{atan}{459}{24.65512}
+\pgfmath@def{atan}{460}{24.70243} \pgfmath@def{atan}{461}{24.74970}
+\pgfmath@def{atan}{462}{24.79693} \pgfmath@def{atan}{463}{24.84413}
+\pgfmath@def{atan}{464}{24.89130} \pgfmath@def{atan}{465}{24.93842}
+\pgfmath@def{atan}{466}{24.98551} \pgfmath@def{atan}{467}{25.03257}
+\pgfmath@def{atan}{468}{25.07959} \pgfmath@def{atan}{469}{25.12657}
+\pgfmath@def{atan}{470}{25.17352} \pgfmath@def{atan}{471}{25.22043}
+\pgfmath@def{atan}{472}{25.26731} \pgfmath@def{atan}{473}{25.31414}
+\pgfmath@def{atan}{474}{25.36095} \pgfmath@def{atan}{475}{25.40771}
+\pgfmath@def{atan}{476}{25.45444} \pgfmath@def{atan}{477}{25.50114}
+\pgfmath@def{atan}{478}{25.54780} \pgfmath@def{atan}{479}{25.59442}
+\pgfmath@def{atan}{480}{25.64100} \pgfmath@def{atan}{481}{25.68755}
+\pgfmath@def{atan}{482}{25.73406} \pgfmath@def{atan}{483}{25.78054}
+\pgfmath@def{atan}{484}{25.82698} \pgfmath@def{atan}{485}{25.87338}
+\pgfmath@def{atan}{486}{25.91975} \pgfmath@def{atan}{487}{25.96608}
+\pgfmath@def{atan}{488}{26.01237} \pgfmath@def{atan}{489}{26.05863}
+\pgfmath@def{atan}{490}{26.10485} \pgfmath@def{atan}{491}{26.15103}
+\pgfmath@def{atan}{492}{26.19718} \pgfmath@def{atan}{493}{26.24329}
+\pgfmath@def{atan}{494}{26.28937} \pgfmath@def{atan}{495}{26.33541}
+\pgfmath@def{atan}{496}{26.38141} \pgfmath@def{atan}{497}{26.42737}
+\pgfmath@def{atan}{498}{26.47330} \pgfmath@def{atan}{499}{26.51919}
+\pgfmath@def{atan}{500}{26.56505} \pgfmath@def{atan}{501}{26.61086}
+\pgfmath@def{atan}{502}{26.65665} \pgfmath@def{atan}{503}{26.70239}
+\pgfmath@def{atan}{504}{26.74810} \pgfmath@def{atan}{505}{26.79377}
+\pgfmath@def{atan}{506}{26.83941} \pgfmath@def{atan}{507}{26.88500}
+\pgfmath@def{atan}{508}{26.93057} \pgfmath@def{atan}{509}{26.97609}
+\pgfmath@def{atan}{510}{27.02158} \pgfmath@def{atan}{511}{27.06703}
+\pgfmath@def{atan}{512}{27.11244} \pgfmath@def{atan}{513}{27.15782}
+\pgfmath@def{atan}{514}{27.20316} \pgfmath@def{atan}{515}{27.24846}
+\pgfmath@def{atan}{516}{27.29373} \pgfmath@def{atan}{517}{27.33896}
+\pgfmath@def{atan}{518}{27.38415} \pgfmath@def{atan}{519}{27.42931}
+\pgfmath@def{atan}{520}{27.47443} \pgfmath@def{atan}{521}{27.51951}
+\pgfmath@def{atan}{522}{27.56455} \pgfmath@def{atan}{523}{27.60956}
+\pgfmath@def{atan}{524}{27.65453} \pgfmath@def{atan}{525}{27.69947}
+\pgfmath@def{atan}{526}{27.74437} \pgfmath@def{atan}{527}{27.78923}
+\pgfmath@def{atan}{528}{27.83405} \pgfmath@def{atan}{529}{27.87884}
+\pgfmath@def{atan}{530}{27.92359} \pgfmath@def{atan}{531}{27.96830}
+\pgfmath@def{atan}{532}{28.01297} \pgfmath@def{atan}{533}{28.05761}
+\pgfmath@def{atan}{534}{28.10221} \pgfmath@def{atan}{535}{28.14678}
+\pgfmath@def{atan}{536}{28.19130} \pgfmath@def{atan}{537}{28.23579}
+\pgfmath@def{atan}{538}{28.28025} \pgfmath@def{atan}{539}{28.32466}
+\pgfmath@def{atan}{540}{28.36904} \pgfmath@def{atan}{541}{28.41338}
+\pgfmath@def{atan}{542}{28.45769} \pgfmath@def{atan}{543}{28.50196}
+\pgfmath@def{atan}{544}{28.54619} \pgfmath@def{atan}{545}{28.59038}
+\pgfmath@def{atan}{546}{28.63454} \pgfmath@def{atan}{547}{28.67865}
+\pgfmath@def{atan}{548}{28.72274} \pgfmath@def{atan}{549}{28.76678}
+\pgfmath@def{atan}{550}{28.81079} \pgfmath@def{atan}{551}{28.85476}
+\pgfmath@def{atan}{552}{28.89869} \pgfmath@def{atan}{553}{28.94259}
+\pgfmath@def{atan}{554}{28.98645} \pgfmath@def{atan}{555}{29.03027}
+\pgfmath@def{atan}{556}{29.07405} \pgfmath@def{atan}{557}{29.11780}
+\pgfmath@def{atan}{558}{29.16151} \pgfmath@def{atan}{559}{29.20519}
+\pgfmath@def{atan}{560}{29.24882} \pgfmath@def{atan}{561}{29.29242}
+\pgfmath@def{atan}{562}{29.33598} \pgfmath@def{atan}{563}{29.37951}
+\pgfmath@def{atan}{564}{29.42299} \pgfmath@def{atan}{565}{29.46644}
+\pgfmath@def{atan}{566}{29.50986} \pgfmath@def{atan}{567}{29.55323}
+\pgfmath@def{atan}{568}{29.59657} \pgfmath@def{atan}{569}{29.63987}
+\pgfmath@def{atan}{570}{29.68314} \pgfmath@def{atan}{571}{29.72636}
+\pgfmath@def{atan}{572}{29.76955} \pgfmath@def{atan}{573}{29.81270}
+\pgfmath@def{atan}{574}{29.85582} \pgfmath@def{atan}{575}{29.89890}
+\pgfmath@def{atan}{576}{29.94194} \pgfmath@def{atan}{577}{29.98494}
+\pgfmath@def{atan}{578}{30.02791} \pgfmath@def{atan}{579}{30.07084}
+\pgfmath@def{atan}{580}{30.11373} \pgfmath@def{atan}{581}{30.15658}
+\pgfmath@def{atan}{582}{30.19940} \pgfmath@def{atan}{583}{30.24218}
+\pgfmath@def{atan}{584}{30.28492} \pgfmath@def{atan}{585}{30.32763}
+\pgfmath@def{atan}{586}{30.37030} \pgfmath@def{atan}{587}{30.41293}
+\pgfmath@def{atan}{588}{30.45552} \pgfmath@def{atan}{589}{30.49808}
+\pgfmath@def{atan}{590}{30.54060} \pgfmath@def{atan}{591}{30.58308}
+\pgfmath@def{atan}{592}{30.62553} \pgfmath@def{atan}{593}{30.66794}
+\pgfmath@def{atan}{594}{30.71031} \pgfmath@def{atan}{595}{30.75264}
+\pgfmath@def{atan}{596}{30.79494} \pgfmath@def{atan}{597}{30.83720}
+\pgfmath@def{atan}{598}{30.87942} \pgfmath@def{atan}{599}{30.92160}
+\pgfmath@def{atan}{600}{30.96375} \pgfmath@def{atan}{601}{31.00586}
+\pgfmath@def{atan}{602}{31.04794} \pgfmath@def{atan}{603}{31.08997}
+\pgfmath@def{atan}{604}{31.13197} \pgfmath@def{atan}{605}{31.17393}
+\pgfmath@def{atan}{606}{31.21586} \pgfmath@def{atan}{607}{31.25775}
+\pgfmath@def{atan}{608}{31.29960} \pgfmath@def{atan}{609}{31.34141}
+\pgfmath@def{atan}{610}{31.38319} \pgfmath@def{atan}{611}{31.42493}
+\pgfmath@def{atan}{612}{31.46663} \pgfmath@def{atan}{613}{31.50829}
+\pgfmath@def{atan}{614}{31.54992} \pgfmath@def{atan}{615}{31.59151}
+\pgfmath@def{atan}{616}{31.63306} \pgfmath@def{atan}{617}{31.67458}
+\pgfmath@def{atan}{618}{31.71606} \pgfmath@def{atan}{619}{31.75750}
+\pgfmath@def{atan}{620}{31.79891} \pgfmath@def{atan}{621}{31.84028}
+\pgfmath@def{atan}{622}{31.88161} \pgfmath@def{atan}{623}{31.92290}
+\pgfmath@def{atan}{624}{31.96416} \pgfmath@def{atan}{625}{32.00538}
+\pgfmath@def{atan}{626}{32.04656} \pgfmath@def{atan}{627}{32.08771}
+\pgfmath@def{atan}{628}{32.12882} \pgfmath@def{atan}{629}{32.16989}
+\pgfmath@def{atan}{630}{32.21092} \pgfmath@def{atan}{631}{32.25192}
+\pgfmath@def{atan}{632}{32.29288} \pgfmath@def{atan}{633}{32.33381}
+\pgfmath@def{atan}{634}{32.37469} \pgfmath@def{atan}{635}{32.41554}
+\pgfmath@def{atan}{636}{32.45636} \pgfmath@def{atan}{637}{32.49713}
+\pgfmath@def{atan}{638}{32.53787} \pgfmath@def{atan}{639}{32.57857}
+\pgfmath@def{atan}{640}{32.61924} \pgfmath@def{atan}{641}{32.65987}
+\pgfmath@def{atan}{642}{32.70046} \pgfmath@def{atan}{643}{32.74101}
+\pgfmath@def{atan}{644}{32.78153} \pgfmath@def{atan}{645}{32.82201}
+\pgfmath@def{atan}{646}{32.86246} \pgfmath@def{atan}{647}{32.90286}
+\pgfmath@def{atan}{648}{32.94323} \pgfmath@def{atan}{649}{32.98357}
+\pgfmath@def{atan}{650}{33.02386} \pgfmath@def{atan}{651}{33.06412}
+\pgfmath@def{atan}{652}{33.10435} \pgfmath@def{atan}{653}{33.14453}
+\pgfmath@def{atan}{654}{33.18468} \pgfmath@def{atan}{655}{33.22479}
+\pgfmath@def{atan}{656}{33.26487} \pgfmath@def{atan}{657}{33.30491}
+\pgfmath@def{atan}{658}{33.34491} \pgfmath@def{atan}{659}{33.38488}
+\pgfmath@def{atan}{660}{33.42481} \pgfmath@def{atan}{661}{33.46470}
+\pgfmath@def{atan}{662}{33.50455} \pgfmath@def{atan}{663}{33.54437}
+\pgfmath@def{atan}{664}{33.58416} \pgfmath@def{atan}{665}{33.62390}
+\pgfmath@def{atan}{666}{33.66361} \pgfmath@def{atan}{667}{33.70328}
+\pgfmath@def{atan}{668}{33.74292} \pgfmath@def{atan}{669}{33.78252}
+\pgfmath@def{atan}{670}{33.82208} \pgfmath@def{atan}{671}{33.86161}
+\pgfmath@def{atan}{672}{33.90110} \pgfmath@def{atan}{673}{33.94055}
+\pgfmath@def{atan}{674}{33.97997} \pgfmath@def{atan}{675}{34.01935}
+\pgfmath@def{atan}{676}{34.05869} \pgfmath@def{atan}{677}{34.09800}
+\pgfmath@def{atan}{678}{34.13727} \pgfmath@def{atan}{679}{34.17650}
+\pgfmath@def{atan}{680}{34.21570} \pgfmath@def{atan}{681}{34.25486}
+\pgfmath@def{atan}{682}{34.29398} \pgfmath@def{atan}{683}{34.33307}
+\pgfmath@def{atan}{684}{34.37212} \pgfmath@def{atan}{685}{34.41114}
+\pgfmath@def{atan}{686}{34.45012} \pgfmath@def{atan}{687}{34.48906}
+\pgfmath@def{atan}{688}{34.52797} \pgfmath@def{atan}{689}{34.56684}
+\pgfmath@def{atan}{690}{34.60567} \pgfmath@def{atan}{691}{34.64447}
+\pgfmath@def{atan}{692}{34.68323} \pgfmath@def{atan}{693}{34.72195}
+\pgfmath@def{atan}{694}{34.76064} \pgfmath@def{atan}{695}{34.79930}
+\pgfmath@def{atan}{696}{34.83791} \pgfmath@def{atan}{697}{34.87649}
+\pgfmath@def{atan}{698}{34.91504} \pgfmath@def{atan}{699}{34.95354}
+\pgfmath@def{atan}{700}{34.99202} \pgfmath@def{atan}{701}{35.03045}
+\pgfmath@def{atan}{702}{35.06885} \pgfmath@def{atan}{703}{35.10721}
+\pgfmath@def{atan}{704}{35.14554} \pgfmath@def{atan}{705}{35.18383}
+\pgfmath@def{atan}{706}{35.22209} \pgfmath@def{atan}{707}{35.26031}
+\pgfmath@def{atan}{708}{35.29849} \pgfmath@def{atan}{709}{35.33664}
+\pgfmath@def{atan}{710}{35.37475} \pgfmath@def{atan}{711}{35.41282}
+\pgfmath@def{atan}{712}{35.45086} \pgfmath@def{atan}{713}{35.48886}
+\pgfmath@def{atan}{714}{35.52683} \pgfmath@def{atan}{715}{35.56476}
+\pgfmath@def{atan}{716}{35.60266} \pgfmath@def{atan}{717}{35.64052}
+\pgfmath@def{atan}{718}{35.67834} \pgfmath@def{atan}{719}{35.71613}
+\pgfmath@def{atan}{720}{35.75388} \pgfmath@def{atan}{721}{35.79160}
+\pgfmath@def{atan}{722}{35.82928} \pgfmath@def{atan}{723}{35.86692}
+\pgfmath@def{atan}{724}{35.90453} \pgfmath@def{atan}{725}{35.94211}
+\pgfmath@def{atan}{726}{35.97965} \pgfmath@def{atan}{727}{36.01715}
+\pgfmath@def{atan}{728}{36.05461} \pgfmath@def{atan}{729}{36.09204}
+\pgfmath@def{atan}{730}{36.12944} \pgfmath@def{atan}{731}{36.16680}
+\pgfmath@def{atan}{732}{36.20412} \pgfmath@def{atan}{733}{36.24141}
+\pgfmath@def{atan}{734}{36.27866} \pgfmath@def{atan}{735}{36.31588}
+\pgfmath@def{atan}{736}{36.35306} \pgfmath@def{atan}{737}{36.39021}
+\pgfmath@def{atan}{738}{36.42732} \pgfmath@def{atan}{739}{36.46440}
+\pgfmath@def{atan}{740}{36.50144} \pgfmath@def{atan}{741}{36.53844}
+\pgfmath@def{atan}{742}{36.57541} \pgfmath@def{atan}{743}{36.61234}
+\pgfmath@def{atan}{744}{36.64924} \pgfmath@def{atan}{745}{36.68611}
+\pgfmath@def{atan}{746}{36.72293} \pgfmath@def{atan}{747}{36.75973}
+\pgfmath@def{atan}{748}{36.79648} \pgfmath@def{atan}{749}{36.83321}
+\pgfmath@def{atan}{750}{36.86989} \pgfmath@def{atan}{751}{36.90654}
+\pgfmath@def{atan}{752}{36.94316} \pgfmath@def{atan}{753}{36.97974}
+\pgfmath@def{atan}{754}{37.01629} \pgfmath@def{atan}{755}{37.05280}
+\pgfmath@def{atan}{756}{37.08928} \pgfmath@def{atan}{757}{37.12572}
+\pgfmath@def{atan}{758}{37.16212} \pgfmath@def{atan}{759}{37.19849}
+\pgfmath@def{atan}{760}{37.23483} \pgfmath@def{atan}{761}{37.27113}
+\pgfmath@def{atan}{762}{37.30740} \pgfmath@def{atan}{763}{37.34363}
+\pgfmath@def{atan}{764}{37.37982} \pgfmath@def{atan}{765}{37.41598}
+\pgfmath@def{atan}{766}{37.45211} \pgfmath@def{atan}{767}{37.48820}
+\pgfmath@def{atan}{768}{37.52426} \pgfmath@def{atan}{769}{37.56028}
+\pgfmath@def{atan}{770}{37.59627} \pgfmath@def{atan}{771}{37.63222}
+\pgfmath@def{atan}{772}{37.66814} \pgfmath@def{atan}{773}{37.70402}
+\pgfmath@def{atan}{774}{37.73987} \pgfmath@def{atan}{775}{37.77568}
+\pgfmath@def{atan}{776}{37.81146} \pgfmath@def{atan}{777}{37.84720}
+\pgfmath@def{atan}{778}{37.88291} \pgfmath@def{atan}{779}{37.91859}
+\pgfmath@def{atan}{780}{37.95423} \pgfmath@def{atan}{781}{37.98983}
+\pgfmath@def{atan}{782}{38.02540} \pgfmath@def{atan}{783}{38.06094}
+\pgfmath@def{atan}{784}{38.09644} \pgfmath@def{atan}{785}{38.13191}
+\pgfmath@def{atan}{786}{38.16734} \pgfmath@def{atan}{787}{38.20274}
+\pgfmath@def{atan}{788}{38.23811} \pgfmath@def{atan}{789}{38.27344}
+\pgfmath@def{atan}{790}{38.30873} \pgfmath@def{atan}{791}{38.34399}
+\pgfmath@def{atan}{792}{38.37922} \pgfmath@def{atan}{793}{38.41441}
+\pgfmath@def{atan}{794}{38.44957} \pgfmath@def{atan}{795}{38.48469}
+\pgfmath@def{atan}{796}{38.51979} \pgfmath@def{atan}{797}{38.55484}
+\pgfmath@def{atan}{798}{38.58986} \pgfmath@def{atan}{799}{38.62485}
+\pgfmath@def{atan}{800}{38.65980} \pgfmath@def{atan}{801}{38.69472}
+\pgfmath@def{atan}{802}{38.72961} \pgfmath@def{atan}{803}{38.76446}
+\pgfmath@def{atan}{804}{38.79928} \pgfmath@def{atan}{805}{38.83406}
+\pgfmath@def{atan}{806}{38.86881} \pgfmath@def{atan}{807}{38.90353}
+\pgfmath@def{atan}{808}{38.93821} \pgfmath@def{atan}{809}{38.97285}
+\pgfmath@def{atan}{810}{39.00747} \pgfmath@def{atan}{811}{39.04205}
+\pgfmath@def{atan}{812}{39.07659} \pgfmath@def{atan}{813}{39.11111}
+\pgfmath@def{atan}{814}{39.14558} \pgfmath@def{atan}{815}{39.18003}
+\pgfmath@def{atan}{816}{39.21444} \pgfmath@def{atan}{817}{39.24882}
+\pgfmath@def{atan}{818}{39.28316} \pgfmath@def{atan}{819}{39.31747}
+\pgfmath@def{atan}{820}{39.35175} \pgfmath@def{atan}{821}{39.38599}
+\pgfmath@def{atan}{822}{39.42020} \pgfmath@def{atan}{823}{39.45438}
+\pgfmath@def{atan}{824}{39.48852} \pgfmath@def{atan}{825}{39.52263}
+\pgfmath@def{atan}{826}{39.55670} \pgfmath@def{atan}{827}{39.59074}
+\pgfmath@def{atan}{828}{39.62475} \pgfmath@def{atan}{829}{39.65873}
+\pgfmath@def{atan}{830}{39.69267} \pgfmath@def{atan}{831}{39.72658}
+\pgfmath@def{atan}{832}{39.76045} \pgfmath@def{atan}{833}{39.79429}
+\pgfmath@def{atan}{834}{39.82810} \pgfmath@def{atan}{835}{39.86188}
+\pgfmath@def{atan}{836}{39.89562} \pgfmath@def{atan}{837}{39.92933}
+\pgfmath@def{atan}{838}{39.96300} \pgfmath@def{atan}{839}{39.99665}
+\pgfmath@def{atan}{840}{40.03025} \pgfmath@def{atan}{841}{40.06383}
+\pgfmath@def{atan}{842}{40.09737} \pgfmath@def{atan}{843}{40.13088}
+\pgfmath@def{atan}{844}{40.16436} \pgfmath@def{atan}{845}{40.19781}
+\pgfmath@def{atan}{846}{40.23122} \pgfmath@def{atan}{847}{40.26459}
+\pgfmath@def{atan}{848}{40.29794} \pgfmath@def{atan}{849}{40.33125}
+\pgfmath@def{atan}{850}{40.36453} \pgfmath@def{atan}{851}{40.39778}
+\pgfmath@def{atan}{852}{40.43099} \pgfmath@def{atan}{853}{40.46417}
+\pgfmath@def{atan}{854}{40.49732} \pgfmath@def{atan}{855}{40.53044}
+\pgfmath@def{atan}{856}{40.56352} \pgfmath@def{atan}{857}{40.59657}
+\pgfmath@def{atan}{858}{40.62959} \pgfmath@def{atan}{859}{40.66257}
+\pgfmath@def{atan}{860}{40.69553} \pgfmath@def{atan}{861}{40.72845}
+\pgfmath@def{atan}{862}{40.76133} \pgfmath@def{atan}{863}{40.79419}
+\pgfmath@def{atan}{864}{40.82701} \pgfmath@def{atan}{865}{40.85980}
+\pgfmath@def{atan}{866}{40.89256} \pgfmath@def{atan}{867}{40.92528}
+\pgfmath@def{atan}{868}{40.95798} \pgfmath@def{atan}{869}{40.99064}
+\pgfmath@def{atan}{870}{41.02326} \pgfmath@def{atan}{871}{41.05586}
+\pgfmath@def{atan}{872}{41.08842} \pgfmath@def{atan}{873}{41.12095}
+\pgfmath@def{atan}{874}{41.15345} \pgfmath@def{atan}{875}{41.18592}
+\pgfmath@def{atan}{876}{41.21836} \pgfmath@def{atan}{877}{41.25076}
+\pgfmath@def{atan}{878}{41.28313} \pgfmath@def{atan}{879}{41.31547}
+\pgfmath@def{atan}{880}{41.34777} \pgfmath@def{atan}{881}{41.38005}
+\pgfmath@def{atan}{882}{41.41229} \pgfmath@def{atan}{883}{41.44450}
+\pgfmath@def{atan}{884}{41.47668} \pgfmath@def{atan}{885}{41.50882}
+\pgfmath@def{atan}{886}{41.54094} \pgfmath@def{atan}{887}{41.57302}
+\pgfmath@def{atan}{888}{41.60507} \pgfmath@def{atan}{889}{41.63709}
+\pgfmath@def{atan}{890}{41.66908} \pgfmath@def{atan}{891}{41.70103}
+\pgfmath@def{atan}{892}{41.73296} \pgfmath@def{atan}{893}{41.76485}
+\pgfmath@def{atan}{894}{41.79671} \pgfmath@def{atan}{895}{41.82854}
+\pgfmath@def{atan}{896}{41.86034} \pgfmath@def{atan}{897}{41.89210}
+\pgfmath@def{atan}{898}{41.92383} \pgfmath@def{atan}{899}{41.95554}
+\pgfmath@def{atan}{900}{41.98721} \pgfmath@def{atan}{901}{42.01885}
+\pgfmath@def{atan}{902}{42.05046} \pgfmath@def{atan}{903}{42.08203}
+\pgfmath@def{atan}{904}{42.11358} \pgfmath@def{atan}{905}{42.14509}
+\pgfmath@def{atan}{906}{42.17657} \pgfmath@def{atan}{907}{42.20802}
+\pgfmath@def{atan}{908}{42.23944} \pgfmath@def{atan}{909}{42.27083}
+\pgfmath@def{atan}{910}{42.30219} \pgfmath@def{atan}{911}{42.33352}
+\pgfmath@def{atan}{912}{42.36481} \pgfmath@def{atan}{913}{42.39607}
+\pgfmath@def{atan}{914}{42.42731} \pgfmath@def{atan}{915}{42.45851}
+\pgfmath@def{atan}{916}{42.48968} \pgfmath@def{atan}{917}{42.52082}
+\pgfmath@def{atan}{918}{42.55193} \pgfmath@def{atan}{919}{42.58300}
+\pgfmath@def{atan}{920}{42.61405} \pgfmath@def{atan}{921}{42.64507}
+\pgfmath@def{atan}{922}{42.67605} \pgfmath@def{atan}{923}{42.70701}
+\pgfmath@def{atan}{924}{42.73793} \pgfmath@def{atan}{925}{42.76882}
+\pgfmath@def{atan}{926}{42.79968} \pgfmath@def{atan}{927}{42.83051}
+\pgfmath@def{atan}{928}{42.86131} \pgfmath@def{atan}{929}{42.89208}
+\pgfmath@def{atan}{930}{42.92282} \pgfmath@def{atan}{931}{42.95353}
+\pgfmath@def{atan}{932}{42.98421} \pgfmath@def{atan}{933}{43.01485}
+\pgfmath@def{atan}{934}{43.04547} \pgfmath@def{atan}{935}{43.07605}
+\pgfmath@def{atan}{936}{43.10661} \pgfmath@def{atan}{937}{43.13713}
+\pgfmath@def{atan}{938}{43.16763} \pgfmath@def{atan}{939}{43.19809}
+\pgfmath@def{atan}{940}{43.22853} \pgfmath@def{atan}{941}{43.25893}
+\pgfmath@def{atan}{942}{43.28930} \pgfmath@def{atan}{943}{43.31964}
+\pgfmath@def{atan}{944}{43.34996} \pgfmath@def{atan}{945}{43.38024}
+\pgfmath@def{atan}{946}{43.41049} \pgfmath@def{atan}{947}{43.44071}
+\pgfmath@def{atan}{948}{43.47090} \pgfmath@def{atan}{949}{43.50106}
+\pgfmath@def{atan}{950}{43.53119} \pgfmath@def{atan}{951}{43.56130}
+\pgfmath@def{atan}{952}{43.59137} \pgfmath@def{atan}{953}{43.62141}
+\pgfmath@def{atan}{954}{43.65142} \pgfmath@def{atan}{955}{43.68140}
+\pgfmath@def{atan}{956}{43.71135} \pgfmath@def{atan}{957}{43.74127}
+\pgfmath@def{atan}{958}{43.77116} \pgfmath@def{atan}{959}{43.80102}
+\pgfmath@def{atan}{960}{43.83086} \pgfmath@def{atan}{961}{43.86066}
+\pgfmath@def{atan}{962}{43.89043} \pgfmath@def{atan}{963}{43.92017}
+\pgfmath@def{atan}{964}{43.94988} \pgfmath@def{atan}{965}{43.97957}
+\pgfmath@def{atan}{966}{44.00922} \pgfmath@def{atan}{967}{44.03884}
+\pgfmath@def{atan}{968}{44.06844} \pgfmath@def{atan}{969}{44.09800}
+\pgfmath@def{atan}{970}{44.12754} \pgfmath@def{atan}{971}{44.15704}
+\pgfmath@def{atan}{972}{44.18652} \pgfmath@def{atan}{973}{44.21597}
+\pgfmath@def{atan}{974}{44.24538} \pgfmath@def{atan}{975}{44.27477}
+\pgfmath@def{atan}{976}{44.30413} \pgfmath@def{atan}{977}{44.33346}
+\pgfmath@def{atan}{978}{44.36276} \pgfmath@def{atan}{979}{44.39203}
+\pgfmath@def{atan}{980}{44.42127} \pgfmath@def{atan}{981}{44.45048}
+\pgfmath@def{atan}{982}{44.47966} \pgfmath@def{atan}{983}{44.50882}
+\pgfmath@def{atan}{984}{44.53794} \pgfmath@def{atan}{985}{44.56704}
+\pgfmath@def{atan}{986}{44.59610} \pgfmath@def{atan}{987}{44.62514}
+\pgfmath@def{atan}{988}{44.65415} \pgfmath@def{atan}{989}{44.68313}
+\pgfmath@def{atan}{990}{44.71208} \pgfmath@def{atan}{991}{44.74100}
+\pgfmath@def{atan}{992}{44.76989} \pgfmath@def{atan}{993}{44.79876}
+\pgfmath@def{atan}{994}{44.82759} \pgfmath@def{atan}{995}{44.85640}
+\pgfmath@def{atan}{996}{44.88517} \pgfmath@def{atan}{997}{44.91392}
+\pgfmath@def{atan}{998}{44.94264} \pgfmath@def{atan}{999}{44.97133}
+\pgfmath@def{atan}{1000}{45.00000}
+
+\pgfmath@def{acos}{0}{90.00000} \pgfmath@def{acos}{1}{89.94270}
+\pgfmath@def{acos}{2}{89.88540} \pgfmath@def{acos}{3}{89.82811}
+\pgfmath@def{acos}{4}{89.77081} \pgfmath@def{acos}{5}{89.71352}
+\pgfmath@def{acos}{6}{89.65622} \pgfmath@def{acos}{7}{89.59892}
+\pgfmath@def{acos}{8}{89.54162} \pgfmath@def{acos}{9}{89.48433}
+\pgfmath@def{acos}{10}{89.42703} \pgfmath@def{acos}{11}{89.36973}
+\pgfmath@def{acos}{12}{89.31243} \pgfmath@def{acos}{13}{89.25513}
+\pgfmath@def{acos}{14}{89.19783} \pgfmath@def{acos}{15}{89.14053}
+\pgfmath@def{acos}{16}{89.08322} \pgfmath@def{acos}{17}{89.02592}
+\pgfmath@def{acos}{18}{88.96862} \pgfmath@def{acos}{19}{88.91131}
+\pgfmath@def{acos}{20}{88.85400} \pgfmath@def{acos}{21}{88.79670}
+\pgfmath@def{acos}{22}{88.73939} \pgfmath@def{acos}{23}{88.68208}
+\pgfmath@def{acos}{24}{88.62476} \pgfmath@def{acos}{25}{88.56745}
+\pgfmath@def{acos}{26}{88.51014} \pgfmath@def{acos}{27}{88.45282}
+\pgfmath@def{acos}{28}{88.39550} \pgfmath@def{acos}{29}{88.33818}
+\pgfmath@def{acos}{30}{88.28086} \pgfmath@def{acos}{31}{88.22354}
+\pgfmath@def{acos}{32}{88.16622} \pgfmath@def{acos}{33}{88.10889}
+\pgfmath@def{acos}{34}{88.05156} \pgfmath@def{acos}{35}{87.99423}
+\pgfmath@def{acos}{36}{87.93690} \pgfmath@def{acos}{37}{87.87957}
+\pgfmath@def{acos}{38}{87.82223} \pgfmath@def{acos}{39}{87.76489}
+\pgfmath@def{acos}{40}{87.70755} \pgfmath@def{acos}{41}{87.65021}
+\pgfmath@def{acos}{42}{87.59286} \pgfmath@def{acos}{43}{87.53552}
+\pgfmath@def{acos}{44}{87.47817} \pgfmath@def{acos}{45}{87.42081}
+\pgfmath@def{acos}{46}{87.36346} \pgfmath@def{acos}{47}{87.30610}
+\pgfmath@def{acos}{48}{87.24874} \pgfmath@def{acos}{49}{87.19138}
+\pgfmath@def{acos}{50}{87.13401} \pgfmath@def{acos}{51}{87.07664}
+\pgfmath@def{acos}{52}{87.01927} \pgfmath@def{acos}{53}{86.96190}
+\pgfmath@def{acos}{54}{86.90452} \pgfmath@def{acos}{55}{86.84714}
+\pgfmath@def{acos}{56}{86.78975} \pgfmath@def{acos}{57}{86.73237}
+\pgfmath@def{acos}{58}{86.67497} \pgfmath@def{acos}{59}{86.61758}
+\pgfmath@def{acos}{60}{86.56018} \pgfmath@def{acos}{61}{86.50278}
+\pgfmath@def{acos}{62}{86.44538} \pgfmath@def{acos}{63}{86.38797}
+\pgfmath@def{acos}{64}{86.33056} \pgfmath@def{acos}{65}{86.27314}
+\pgfmath@def{acos}{66}{86.21572} \pgfmath@def{acos}{67}{86.15830}
+\pgfmath@def{acos}{68}{86.10087} \pgfmath@def{acos}{69}{86.04344}
+\pgfmath@def{acos}{70}{85.98601} \pgfmath@def{acos}{71}{85.92857}
+\pgfmath@def{acos}{72}{85.87113} \pgfmath@def{acos}{73}{85.81368}
+\pgfmath@def{acos}{74}{85.75623} \pgfmath@def{acos}{75}{85.69877}
+\pgfmath@def{acos}{76}{85.64131} \pgfmath@def{acos}{77}{85.58385}
+\pgfmath@def{acos}{78}{85.52638} \pgfmath@def{acos}{79}{85.46891}
+\pgfmath@def{acos}{80}{85.41143} \pgfmath@def{acos}{81}{85.35395}
+\pgfmath@def{acos}{82}{85.29646} \pgfmath@def{acos}{83}{85.23897}
+\pgfmath@def{acos}{84}{85.18147} \pgfmath@def{acos}{85}{85.12397}
+\pgfmath@def{acos}{86}{85.06646} \pgfmath@def{acos}{87}{85.00895}
+\pgfmath@def{acos}{88}{84.95144} \pgfmath@def{acos}{89}{84.89392}
+\pgfmath@def{acos}{90}{84.83639} \pgfmath@def{acos}{91}{84.77886}
+\pgfmath@def{acos}{92}{84.72132} \pgfmath@def{acos}{93}{84.66378}
+\pgfmath@def{acos}{94}{84.60623} \pgfmath@def{acos}{95}{84.54868}
+\pgfmath@def{acos}{96}{84.49112} \pgfmath@def{acos}{97}{84.43355}
+\pgfmath@def{acos}{98}{84.37598} \pgfmath@def{acos}{99}{84.31841}
+\pgfmath@def{acos}{100}{84.26083} \pgfmath@def{acos}{101}{84.20324}
+\pgfmath@def{acos}{102}{84.14564} \pgfmath@def{acos}{103}{84.08805}
+\pgfmath@def{acos}{104}{84.03044} \pgfmath@def{acos}{105}{83.97283}
+\pgfmath@def{acos}{106}{83.91521} \pgfmath@def{acos}{107}{83.85759}
+\pgfmath@def{acos}{108}{83.79996} \pgfmath@def{acos}{109}{83.74232}
+\pgfmath@def{acos}{110}{83.68468} \pgfmath@def{acos}{111}{83.62703}
+\pgfmath@def{acos}{112}{83.56938} \pgfmath@def{acos}{113}{83.51171}
+\pgfmath@def{acos}{114}{83.45405} \pgfmath@def{acos}{115}{83.39637}
+\pgfmath@def{acos}{116}{83.33869} \pgfmath@def{acos}{117}{83.28100}
+\pgfmath@def{acos}{118}{83.22330} \pgfmath@def{acos}{119}{83.16560}
+\pgfmath@def{acos}{120}{83.10789} \pgfmath@def{acos}{121}{83.05018}
+\pgfmath@def{acos}{122}{82.99245} \pgfmath@def{acos}{123}{82.93472}
+\pgfmath@def{acos}{124}{82.87698} \pgfmath@def{acos}{125}{82.81924}
+\pgfmath@def{acos}{126}{82.76149} \pgfmath@def{acos}{127}{82.70373}
+\pgfmath@def{acos}{128}{82.64596} \pgfmath@def{acos}{129}{82.58819}
+\pgfmath@def{acos}{130}{82.53040} \pgfmath@def{acos}{131}{82.47261}
+\pgfmath@def{acos}{132}{82.41482} \pgfmath@def{acos}{133}{82.35701}
+\pgfmath@def{acos}{134}{82.29920} \pgfmath@def{acos}{135}{82.24138}
+\pgfmath@def{acos}{136}{82.18355} \pgfmath@def{acos}{137}{82.12571}
+\pgfmath@def{acos}{138}{82.06786} \pgfmath@def{acos}{139}{82.01001}
+\pgfmath@def{acos}{140}{81.95215} \pgfmath@def{acos}{141}{81.89428}
+\pgfmath@def{acos}{142}{81.83640} \pgfmath@def{acos}{143}{81.77851}
+\pgfmath@def{acos}{144}{81.72062} \pgfmath@def{acos}{145}{81.66272}
+\pgfmath@def{acos}{146}{81.60480} \pgfmath@def{acos}{147}{81.54688}
+\pgfmath@def{acos}{148}{81.48895} \pgfmath@def{acos}{149}{81.43102}
+\pgfmath@def{acos}{150}{81.37307} \pgfmath@def{acos}{151}{81.31511}
+\pgfmath@def{acos}{152}{81.25715} \pgfmath@def{acos}{153}{81.19917}
+\pgfmath@def{acos}{154}{81.14119} \pgfmath@def{acos}{155}{81.08320}
+\pgfmath@def{acos}{156}{81.02520} \pgfmath@def{acos}{157}{80.96719}
+\pgfmath@def{acos}{158}{80.90917} \pgfmath@def{acos}{159}{80.85114}
+\pgfmath@def{acos}{160}{80.79310} \pgfmath@def{acos}{161}{80.73505}
+\pgfmath@def{acos}{162}{80.67699} \pgfmath@def{acos}{163}{80.61893}
+\pgfmath@def{acos}{164}{80.56085} \pgfmath@def{acos}{165}{80.50276}
+\pgfmath@def{acos}{166}{80.44466} \pgfmath@def{acos}{167}{80.38656}
+\pgfmath@def{acos}{168}{80.32844} \pgfmath@def{acos}{169}{80.27031}
+\pgfmath@def{acos}{170}{80.21218} \pgfmath@def{acos}{171}{80.15403}
+\pgfmath@def{acos}{172}{80.09587} \pgfmath@def{acos}{173}{80.03770}
+\pgfmath@def{acos}{174}{79.97953} \pgfmath@def{acos}{175}{79.92134}
+\pgfmath@def{acos}{176}{79.86314} \pgfmath@def{acos}{177}{79.80493}
+\pgfmath@def{acos}{178}{79.74671} \pgfmath@def{acos}{179}{79.68848}
+\pgfmath@def{acos}{180}{79.63024} \pgfmath@def{acos}{181}{79.57198}
+\pgfmath@def{acos}{182}{79.51372} \pgfmath@def{acos}{183}{79.45545}
+\pgfmath@def{acos}{184}{79.39716} \pgfmath@def{acos}{185}{79.33886}
+\pgfmath@def{acos}{186}{79.28056} \pgfmath@def{acos}{187}{79.22224}
+\pgfmath@def{acos}{188}{79.16391} \pgfmath@def{acos}{189}{79.10556}
+\pgfmath@def{acos}{190}{79.04721} \pgfmath@def{acos}{191}{78.98885}
+\pgfmath@def{acos}{192}{78.93047} \pgfmath@def{acos}{193}{78.87208}
+\pgfmath@def{acos}{194}{78.81368} \pgfmath@def{acos}{195}{78.75527}
+\pgfmath@def{acos}{196}{78.69685} \pgfmath@def{acos}{197}{78.63841}
+\pgfmath@def{acos}{198}{78.57997} \pgfmath@def{acos}{199}{78.52151}
+\pgfmath@def{acos}{200}{78.46304} \pgfmath@def{acos}{201}{78.40455}
+\pgfmath@def{acos}{202}{78.34606} \pgfmath@def{acos}{203}{78.28755}
+\pgfmath@def{acos}{204}{78.22903} \pgfmath@def{acos}{205}{78.17050}
+\pgfmath@def{acos}{206}{78.11195} \pgfmath@def{acos}{207}{78.05339}
+\pgfmath@def{acos}{208}{77.99482} \pgfmath@def{acos}{209}{77.93624}
+\pgfmath@def{acos}{210}{77.87764} \pgfmath@def{acos}{211}{77.81903}
+\pgfmath@def{acos}{212}{77.76041} \pgfmath@def{acos}{213}{77.70178}
+\pgfmath@def{acos}{214}{77.64313} \pgfmath@def{acos}{215}{77.58447}
+\pgfmath@def{acos}{216}{77.52579} \pgfmath@def{acos}{217}{77.46711}
+\pgfmath@def{acos}{218}{77.40841} \pgfmath@def{acos}{219}{77.34969}
+\pgfmath@def{acos}{220}{77.29096} \pgfmath@def{acos}{221}{77.23222}
+\pgfmath@def{acos}{222}{77.17347} \pgfmath@def{acos}{223}{77.11470}
+\pgfmath@def{acos}{224}{77.05591} \pgfmath@def{acos}{225}{76.99712}
+\pgfmath@def{acos}{226}{76.93831} \pgfmath@def{acos}{227}{76.87948}
+\pgfmath@def{acos}{228}{76.82064} \pgfmath@def{acos}{229}{76.76179}
+\pgfmath@def{acos}{230}{76.70292} \pgfmath@def{acos}{231}{76.64404}
+\pgfmath@def{acos}{232}{76.58515} \pgfmath@def{acos}{233}{76.52624}
+\pgfmath@def{acos}{234}{76.46731} \pgfmath@def{acos}{235}{76.40837}
+\pgfmath@def{acos}{236}{76.34942} \pgfmath@def{acos}{237}{76.29045}
+\pgfmath@def{acos}{238}{76.23147} \pgfmath@def{acos}{239}{76.17247}
+\pgfmath@def{acos}{240}{76.11346} \pgfmath@def{acos}{241}{76.05443}
+\pgfmath@def{acos}{242}{75.99538} \pgfmath@def{acos}{243}{75.93632}
+\pgfmath@def{acos}{244}{75.87725} \pgfmath@def{acos}{245}{75.81816}
+\pgfmath@def{acos}{246}{75.75906} \pgfmath@def{acos}{247}{75.69994}
+\pgfmath@def{acos}{248}{75.64080} \pgfmath@def{acos}{249}{75.58165}
+\pgfmath@def{acos}{250}{75.52248} \pgfmath@def{acos}{251}{75.46330}
+\pgfmath@def{acos}{252}{75.40410} \pgfmath@def{acos}{253}{75.34489}
+\pgfmath@def{acos}{254}{75.28566} \pgfmath@def{acos}{255}{75.22641}
+\pgfmath@def{acos}{256}{75.16715} \pgfmath@def{acos}{257}{75.10787}
+\pgfmath@def{acos}{258}{75.04857} \pgfmath@def{acos}{259}{74.98926}
+\pgfmath@def{acos}{260}{74.92993} \pgfmath@def{acos}{261}{74.87059}
+\pgfmath@def{acos}{262}{74.81123} \pgfmath@def{acos}{263}{74.75185}
+\pgfmath@def{acos}{264}{74.69245} \pgfmath@def{acos}{265}{74.63304}
+\pgfmath@def{acos}{266}{74.57361} \pgfmath@def{acos}{267}{74.51417}
+\pgfmath@def{acos}{268}{74.45471} \pgfmath@def{acos}{269}{74.39523}
+\pgfmath@def{acos}{270}{74.33573} \pgfmath@def{acos}{271}{74.27621}
+\pgfmath@def{acos}{272}{74.21668} \pgfmath@def{acos}{273}{74.15713}
+\pgfmath@def{acos}{274}{74.09757} \pgfmath@def{acos}{275}{74.03798}
+\pgfmath@def{acos}{276}{73.97838} \pgfmath@def{acos}{277}{73.91876}
+\pgfmath@def{acos}{278}{73.85912} \pgfmath@def{acos}{279}{73.79946}
+\pgfmath@def{acos}{280}{73.73979} \pgfmath@def{acos}{281}{73.68010}
+\pgfmath@def{acos}{282}{73.62039} \pgfmath@def{acos}{283}{73.56066}
+\pgfmath@def{acos}{284}{73.50091} \pgfmath@def{acos}{285}{73.44115}
+\pgfmath@def{acos}{286}{73.38136} \pgfmath@def{acos}{287}{73.32156}
+\pgfmath@def{acos}{288}{73.26174} \pgfmath@def{acos}{289}{73.20190}
+\pgfmath@def{acos}{290}{73.14204} \pgfmath@def{acos}{291}{73.08216}
+\pgfmath@def{acos}{292}{73.02226} \pgfmath@def{acos}{293}{72.96235}
+\pgfmath@def{acos}{294}{72.90241} \pgfmath@def{acos}{295}{72.84246}
+\pgfmath@def{acos}{296}{72.78248} \pgfmath@def{acos}{297}{72.72249}
+\pgfmath@def{acos}{298}{72.66248} \pgfmath@def{acos}{299}{72.60244}
+\pgfmath@def{acos}{300}{72.54239} \pgfmath@def{acos}{301}{72.48232}
+\pgfmath@def{acos}{302}{72.42223} \pgfmath@def{acos}{303}{72.36212}
+\pgfmath@def{acos}{304}{72.30198} \pgfmath@def{acos}{305}{72.24183}
+\pgfmath@def{acos}{306}{72.18166} \pgfmath@def{acos}{307}{72.12147}
+\pgfmath@def{acos}{308}{72.06125} \pgfmath@def{acos}{309}{72.00102}
+\pgfmath@def{acos}{310}{71.94077} \pgfmath@def{acos}{311}{71.88049}
+\pgfmath@def{acos}{312}{71.82019} \pgfmath@def{acos}{313}{71.75988}
+\pgfmath@def{acos}{314}{71.69954} \pgfmath@def{acos}{315}{71.63918}
+\pgfmath@def{acos}{316}{71.57880} \pgfmath@def{acos}{317}{71.51840}
+\pgfmath@def{acos}{318}{71.45798} \pgfmath@def{acos}{319}{71.39754}
+\pgfmath@def{acos}{320}{71.33707} \pgfmath@def{acos}{321}{71.27658}
+\pgfmath@def{acos}{322}{71.21608} \pgfmath@def{acos}{323}{71.15555}
+\pgfmath@def{acos}{324}{71.09499} \pgfmath@def{acos}{325}{71.03442}
+\pgfmath@def{acos}{326}{70.97382} \pgfmath@def{acos}{327}{70.91321}
+\pgfmath@def{acos}{328}{70.85257} \pgfmath@def{acos}{329}{70.79190}
+\pgfmath@def{acos}{330}{70.73122} \pgfmath@def{acos}{331}{70.67051}
+\pgfmath@def{acos}{332}{70.60978} \pgfmath@def{acos}{333}{70.54903}
+\pgfmath@def{acos}{334}{70.48826} \pgfmath@def{acos}{335}{70.42746}
+\pgfmath@def{acos}{336}{70.36664} \pgfmath@def{acos}{337}{70.30579}
+\pgfmath@def{acos}{338}{70.24493} \pgfmath@def{acos}{339}{70.18404}
+\pgfmath@def{acos}{340}{70.12312} \pgfmath@def{acos}{341}{70.06218}
+\pgfmath@def{acos}{342}{70.00122} \pgfmath@def{acos}{343}{69.94024}
+\pgfmath@def{acos}{344}{69.87923} \pgfmath@def{acos}{345}{69.81820}
+\pgfmath@def{acos}{346}{69.75714} \pgfmath@def{acos}{347}{69.69606}
+\pgfmath@def{acos}{348}{69.63496} \pgfmath@def{acos}{349}{69.57383}
+\pgfmath@def{acos}{350}{69.51268} \pgfmath@def{acos}{351}{69.45150}
+\pgfmath@def{acos}{352}{69.39030} \pgfmath@def{acos}{353}{69.32908}
+\pgfmath@def{acos}{354}{69.26783} \pgfmath@def{acos}{355}{69.20655}
+\pgfmath@def{acos}{356}{69.14525} \pgfmath@def{acos}{357}{69.08393}
+\pgfmath@def{acos}{358}{69.02258} \pgfmath@def{acos}{359}{68.96120}
+\pgfmath@def{acos}{360}{68.89980} \pgfmath@def{acos}{361}{68.83837}
+\pgfmath@def{acos}{362}{68.77692} \pgfmath@def{acos}{363}{68.71544}
+\pgfmath@def{acos}{364}{68.65394} \pgfmath@def{acos}{365}{68.59241}
+\pgfmath@def{acos}{366}{68.53086} \pgfmath@def{acos}{367}{68.46928}
+\pgfmath@def{acos}{368}{68.40767} \pgfmath@def{acos}{369}{68.34604}
+\pgfmath@def{acos}{370}{68.28438} \pgfmath@def{acos}{371}{68.22269}
+\pgfmath@def{acos}{372}{68.16098} \pgfmath@def{acos}{373}{68.09924}
+\pgfmath@def{acos}{374}{68.03748} \pgfmath@def{acos}{375}{67.97568}
+\pgfmath@def{acos}{376}{67.91386} \pgfmath@def{acos}{377}{67.85202}
+\pgfmath@def{acos}{378}{67.79014} \pgfmath@def{acos}{379}{67.72824}
+\pgfmath@def{acos}{380}{67.66631} \pgfmath@def{acos}{381}{67.60436}
+\pgfmath@def{acos}{382}{67.54237} \pgfmath@def{acos}{383}{67.48036}
+\pgfmath@def{acos}{384}{67.41832} \pgfmath@def{acos}{385}{67.35626}
+\pgfmath@def{acos}{386}{67.29416} \pgfmath@def{acos}{387}{67.23204}
+\pgfmath@def{acos}{388}{67.16988} \pgfmath@def{acos}{389}{67.10770}
+\pgfmath@def{acos}{390}{67.04550} \pgfmath@def{acos}{391}{66.98326}
+\pgfmath@def{acos}{392}{66.92099} \pgfmath@def{acos}{393}{66.85870}
+\pgfmath@def{acos}{394}{66.79637} \pgfmath@def{acos}{395}{66.73402}
+\pgfmath@def{acos}{396}{66.67164} \pgfmath@def{acos}{397}{66.60923}
+\pgfmath@def{acos}{398}{66.54679} \pgfmath@def{acos}{399}{66.48432}
+\pgfmath@def{acos}{400}{66.42182} \pgfmath@def{acos}{401}{66.35929}
+\pgfmath@def{acos}{402}{66.29673} \pgfmath@def{acos}{403}{66.23414}
+\pgfmath@def{acos}{404}{66.17152} \pgfmath@def{acos}{405}{66.10887}
+\pgfmath@def{acos}{406}{66.04619} \pgfmath@def{acos}{407}{65.98348}
+\pgfmath@def{acos}{408}{65.92074} \pgfmath@def{acos}{409}{65.85796}
+\pgfmath@def{acos}{410}{65.79516} \pgfmath@def{acos}{411}{65.73233}
+\pgfmath@def{acos}{412}{65.66946} \pgfmath@def{acos}{413}{65.60657}
+\pgfmath@def{acos}{414}{65.54364} \pgfmath@def{acos}{415}{65.48068}
+\pgfmath@def{acos}{416}{65.41769} \pgfmath@def{acos}{417}{65.35467}
+\pgfmath@def{acos}{418}{65.29161} \pgfmath@def{acos}{419}{65.22853}
+\pgfmath@def{acos}{420}{65.16541} \pgfmath@def{acos}{421}{65.10226}
+\pgfmath@def{acos}{422}{65.03908} \pgfmath@def{acos}{423}{64.97586}
+\pgfmath@def{acos}{424}{64.91261} \pgfmath@def{acos}{425}{64.84933}
+\pgfmath@def{acos}{426}{64.78602} \pgfmath@def{acos}{427}{64.72267}
+\pgfmath@def{acos}{428}{64.65929} \pgfmath@def{acos}{429}{64.59588}
+\pgfmath@def{acos}{430}{64.53244} \pgfmath@def{acos}{431}{64.46896}
+\pgfmath@def{acos}{432}{64.40544} \pgfmath@def{acos}{433}{64.34190}
+\pgfmath@def{acos}{434}{64.27832} \pgfmath@def{acos}{435}{64.21470}
+\pgfmath@def{acos}{436}{64.15105} \pgfmath@def{acos}{437}{64.08737}
+\pgfmath@def{acos}{438}{64.02365} \pgfmath@def{acos}{439}{63.95990}
+\pgfmath@def{acos}{440}{63.89611} \pgfmath@def{acos}{441}{63.83229}
+\pgfmath@def{acos}{442}{63.76844} \pgfmath@def{acos}{443}{63.70455}
+\pgfmath@def{acos}{444}{63.64062} \pgfmath@def{acos}{445}{63.57666}
+\pgfmath@def{acos}{446}{63.51266} \pgfmath@def{acos}{447}{63.44863}
+\pgfmath@def{acos}{448}{63.38456} \pgfmath@def{acos}{449}{63.32045}
+\pgfmath@def{acos}{450}{63.25631} \pgfmath@def{acos}{451}{63.19213}
+\pgfmath@def{acos}{452}{63.12792} \pgfmath@def{acos}{453}{63.06367}
+\pgfmath@def{acos}{454}{62.99938} \pgfmath@def{acos}{455}{62.93506}
+\pgfmath@def{acos}{456}{62.87070} \pgfmath@def{acos}{457}{62.80630}
+\pgfmath@def{acos}{458}{62.74187} \pgfmath@def{acos}{459}{62.67740}
+\pgfmath@def{acos}{460}{62.61289} \pgfmath@def{acos}{461}{62.54834}
+\pgfmath@def{acos}{462}{62.48376} \pgfmath@def{acos}{463}{62.41913}
+\pgfmath@def{acos}{464}{62.35447} \pgfmath@def{acos}{465}{62.28977}
+\pgfmath@def{acos}{466}{62.22504} \pgfmath@def{acos}{467}{62.16026}
+\pgfmath@def{acos}{468}{62.09545} \pgfmath@def{acos}{469}{62.03059}
+\pgfmath@def{acos}{470}{61.96570} \pgfmath@def{acos}{471}{61.90077}
+\pgfmath@def{acos}{472}{61.83580} \pgfmath@def{acos}{473}{61.77079}
+\pgfmath@def{acos}{474}{61.70574} \pgfmath@def{acos}{475}{61.64065}
+\pgfmath@def{acos}{476}{61.57552} \pgfmath@def{acos}{477}{61.51035}
+\pgfmath@def{acos}{478}{61.44514} \pgfmath@def{acos}{479}{61.37988}
+\pgfmath@def{acos}{480}{61.31459} \pgfmath@def{acos}{481}{61.24926}
+\pgfmath@def{acos}{482}{61.18389} \pgfmath@def{acos}{483}{61.11847}
+\pgfmath@def{acos}{484}{61.05302} \pgfmath@def{acos}{485}{60.98752}
+\pgfmath@def{acos}{486}{60.92199} \pgfmath@def{acos}{487}{60.85641}
+\pgfmath@def{acos}{488}{60.79078} \pgfmath@def{acos}{489}{60.72512}
+\pgfmath@def{acos}{490}{60.65941} \pgfmath@def{acos}{491}{60.59367}
+\pgfmath@def{acos}{492}{60.52787} \pgfmath@def{acos}{493}{60.46204}
+\pgfmath@def{acos}{494}{60.39616} \pgfmath@def{acos}{495}{60.33025}
+\pgfmath@def{acos}{496}{60.26428} \pgfmath@def{acos}{497}{60.19828}
+\pgfmath@def{acos}{498}{60.13223} \pgfmath@def{acos}{499}{60.06613}
+\pgfmath@def{acos}{500}{60.00000} \pgfmath@def{acos}{501}{59.93381}
+\pgfmath@def{acos}{502}{59.86759} \pgfmath@def{acos}{503}{59.80132}
+\pgfmath@def{acos}{504}{59.73500} \pgfmath@def{acos}{505}{59.66864}
+\pgfmath@def{acos}{506}{59.60224} \pgfmath@def{acos}{507}{59.53579}
+\pgfmath@def{acos}{508}{59.46929} \pgfmath@def{acos}{509}{59.40275}
+\pgfmath@def{acos}{510}{59.33617} \pgfmath@def{acos}{511}{59.26953}
+\pgfmath@def{acos}{512}{59.20285} \pgfmath@def{acos}{513}{59.13613}
+\pgfmath@def{acos}{514}{59.06936} \pgfmath@def{acos}{515}{59.00254}
+\pgfmath@def{acos}{516}{58.93568} \pgfmath@def{acos}{517}{58.86876}
+\pgfmath@def{acos}{518}{58.80180} \pgfmath@def{acos}{519}{58.73480}
+\pgfmath@def{acos}{520}{58.66774} \pgfmath@def{acos}{521}{58.60064}
+\pgfmath@def{acos}{522}{58.53349} \pgfmath@def{acos}{523}{58.46629}
+\pgfmath@def{acos}{524}{58.39905} \pgfmath@def{acos}{525}{58.33175}
+\pgfmath@def{acos}{526}{58.26441} \pgfmath@def{acos}{527}{58.19702}
+\pgfmath@def{acos}{528}{58.12957} \pgfmath@def{acos}{529}{58.06208}
+\pgfmath@def{acos}{530}{57.99454} \pgfmath@def{acos}{531}{57.92695}
+\pgfmath@def{acos}{532}{57.85931} \pgfmath@def{acos}{533}{57.79162}
+\pgfmath@def{acos}{534}{57.72388} \pgfmath@def{acos}{535}{57.65608}
+\pgfmath@def{acos}{536}{57.58824} \pgfmath@def{acos}{537}{57.52035}
+\pgfmath@def{acos}{538}{57.45240} \pgfmath@def{acos}{539}{57.38441}
+\pgfmath@def{acos}{540}{57.31636} \pgfmath@def{acos}{541}{57.24826}
+\pgfmath@def{acos}{542}{57.18010} \pgfmath@def{acos}{543}{57.11190}
+\pgfmath@def{acos}{544}{57.04364} \pgfmath@def{acos}{545}{56.97533}
+\pgfmath@def{acos}{546}{56.90697} \pgfmath@def{acos}{547}{56.83855}
+\pgfmath@def{acos}{548}{56.77008} \pgfmath@def{acos}{549}{56.70156}
+\pgfmath@def{acos}{550}{56.63298} \pgfmath@def{acos}{551}{56.56435}
+\pgfmath@def{acos}{552}{56.49567} \pgfmath@def{acos}{553}{56.42693}
+\pgfmath@def{acos}{554}{56.35813} \pgfmath@def{acos}{555}{56.28928}
+\pgfmath@def{acos}{556}{56.22038} \pgfmath@def{acos}{557}{56.15141}
+\pgfmath@def{acos}{558}{56.08240} \pgfmath@def{acos}{559}{56.01333}
+\pgfmath@def{acos}{560}{55.94420} \pgfmath@def{acos}{561}{55.87501}
+\pgfmath@def{acos}{562}{55.80577} \pgfmath@def{acos}{563}{55.73647}
+\pgfmath@def{acos}{564}{55.66712} \pgfmath@def{acos}{565}{55.59770}
+\pgfmath@def{acos}{566}{55.52823} \pgfmath@def{acos}{567}{55.45871}
+\pgfmath@def{acos}{568}{55.38912} \pgfmath@def{acos}{569}{55.31947}
+\pgfmath@def{acos}{570}{55.24977} \pgfmath@def{acos}{571}{55.18001}
+\pgfmath@def{acos}{572}{55.11019} \pgfmath@def{acos}{573}{55.04030}
+\pgfmath@def{acos}{574}{54.97036} \pgfmath@def{acos}{575}{54.90036}
+\pgfmath@def{acos}{576}{54.83030} \pgfmath@def{acos}{577}{54.76018}
+\pgfmath@def{acos}{578}{54.69000} \pgfmath@def{acos}{579}{54.61976}
+\pgfmath@def{acos}{580}{54.54945} \pgfmath@def{acos}{581}{54.47909}
+\pgfmath@def{acos}{582}{54.40866} \pgfmath@def{acos}{583}{54.33817}
+\pgfmath@def{acos}{584}{54.26762} \pgfmath@def{acos}{585}{54.19701}
+\pgfmath@def{acos}{586}{54.12633} \pgfmath@def{acos}{587}{54.05559}
+\pgfmath@def{acos}{588}{53.98479} \pgfmath@def{acos}{589}{53.91392}
+\pgfmath@def{acos}{590}{53.84299} \pgfmath@def{acos}{591}{53.77199}
+\pgfmath@def{acos}{592}{53.70093} \pgfmath@def{acos}{593}{53.62981}
+\pgfmath@def{acos}{594}{53.55862} \pgfmath@def{acos}{595}{53.48736}
+\pgfmath@def{acos}{596}{53.41604} \pgfmath@def{acos}{597}{53.34466}
+\pgfmath@def{acos}{598}{53.27320} \pgfmath@def{acos}{599}{53.20168}
+\pgfmath@def{acos}{600}{53.13010} \pgfmath@def{acos}{601}{53.05844}
+\pgfmath@def{acos}{602}{52.98672} \pgfmath@def{acos}{603}{52.91494}
+\pgfmath@def{acos}{604}{52.84308} \pgfmath@def{acos}{605}{52.77115}
+\pgfmath@def{acos}{606}{52.69916} \pgfmath@def{acos}{607}{52.62710}
+\pgfmath@def{acos}{608}{52.55497} \pgfmath@def{acos}{609}{52.48276}
+\pgfmath@def{acos}{610}{52.41049} \pgfmath@def{acos}{611}{52.33815}
+\pgfmath@def{acos}{612}{52.26574} \pgfmath@def{acos}{613}{52.19326}
+\pgfmath@def{acos}{614}{52.12070} \pgfmath@def{acos}{615}{52.04808}
+\pgfmath@def{acos}{616}{51.97538} \pgfmath@def{acos}{617}{51.90261}
+\pgfmath@def{acos}{618}{51.82976} \pgfmath@def{acos}{619}{51.75685}
+\pgfmath@def{acos}{620}{51.68386} \pgfmath@def{acos}{621}{51.61080}
+\pgfmath@def{acos}{622}{51.53766} \pgfmath@def{acos}{623}{51.46445}
+\pgfmath@def{acos}{624}{51.39117} \pgfmath@def{acos}{625}{51.31781}
+\pgfmath@def{acos}{626}{51.24437} \pgfmath@def{acos}{627}{51.17086}
+\pgfmath@def{acos}{628}{51.09728} \pgfmath@def{acos}{629}{51.02361}
+\pgfmath@def{acos}{630}{50.94987} \pgfmath@def{acos}{631}{50.87606}
+\pgfmath@def{acos}{632}{50.80216} \pgfmath@def{acos}{633}{50.72819}
+\pgfmath@def{acos}{634}{50.65414} \pgfmath@def{acos}{635}{50.58001}
+\pgfmath@def{acos}{636}{50.50580} \pgfmath@def{acos}{637}{50.43152}
+\pgfmath@def{acos}{638}{50.35715} \pgfmath@def{acos}{639}{50.28270}
+\pgfmath@def{acos}{640}{50.20818} \pgfmath@def{acos}{641}{50.13357}
+\pgfmath@def{acos}{642}{50.05888} \pgfmath@def{acos}{643}{49.98411}
+\pgfmath@def{acos}{644}{49.90926} \pgfmath@def{acos}{645}{49.83432}
+\pgfmath@def{acos}{646}{49.75930} \pgfmath@def{acos}{647}{49.68420}
+\pgfmath@def{acos}{648}{49.60902} \pgfmath@def{acos}{649}{49.53375}
+\pgfmath@def{acos}{650}{49.45839} \pgfmath@def{acos}{651}{49.38296}
+\pgfmath@def{acos}{652}{49.30743} \pgfmath@def{acos}{653}{49.23182}
+\pgfmath@def{acos}{654}{49.15613} \pgfmath@def{acos}{655}{49.08035}
+\pgfmath@def{acos}{656}{49.00448} \pgfmath@def{acos}{657}{48.92852}
+\pgfmath@def{acos}{658}{48.85248} \pgfmath@def{acos}{659}{48.77634}
+\pgfmath@def{acos}{660}{48.70012} \pgfmath@def{acos}{661}{48.62381}
+\pgfmath@def{acos}{662}{48.54741} \pgfmath@def{acos}{663}{48.47092}
+\pgfmath@def{acos}{664}{48.39434} \pgfmath@def{acos}{665}{48.31767}
+\pgfmath@def{acos}{666}{48.24091} \pgfmath@def{acos}{667}{48.16405}
+\pgfmath@def{acos}{668}{48.08710} \pgfmath@def{acos}{669}{48.01006}
+\pgfmath@def{acos}{670}{47.93293} \pgfmath@def{acos}{671}{47.85570}
+\pgfmath@def{acos}{672}{47.77838} \pgfmath@def{acos}{673}{47.70096}
+\pgfmath@def{acos}{674}{47.62345} \pgfmath@def{acos}{675}{47.54585}
+\pgfmath@def{acos}{676}{47.46814} \pgfmath@def{acos}{677}{47.39034}
+\pgfmath@def{acos}{678}{47.31244} \pgfmath@def{acos}{679}{47.23445}
+\pgfmath@def{acos}{680}{47.15635} \pgfmath@def{acos}{681}{47.07816}
+\pgfmath@def{acos}{682}{46.99987} \pgfmath@def{acos}{683}{46.92147}
+\pgfmath@def{acos}{684}{46.84298} \pgfmath@def{acos}{685}{46.76439}
+\pgfmath@def{acos}{686}{46.68569} \pgfmath@def{acos}{687}{46.60690}
+\pgfmath@def{acos}{688}{46.52800} \pgfmath@def{acos}{689}{46.44899}
+\pgfmath@def{acos}{690}{46.36989} \pgfmath@def{acos}{691}{46.29068}
+\pgfmath@def{acos}{692}{46.21136} \pgfmath@def{acos}{693}{46.13194}
+\pgfmath@def{acos}{694}{46.05241} \pgfmath@def{acos}{695}{45.97278}
+\pgfmath@def{acos}{696}{45.89304} \pgfmath@def{acos}{697}{45.81319}
+\pgfmath@def{acos}{698}{45.73323} \pgfmath@def{acos}{699}{45.65317}
+\pgfmath@def{acos}{700}{45.57299} \pgfmath@def{acos}{701}{45.49271}
+\pgfmath@def{acos}{702}{45.41231} \pgfmath@def{acos}{703}{45.33180}
+\pgfmath@def{acos}{704}{45.25118} \pgfmath@def{acos}{705}{45.17045}
+\pgfmath@def{acos}{706}{45.08961} \pgfmath@def{acos}{707}{45.00865}
+\pgfmath@def{acos}{708}{44.92757} \pgfmath@def{acos}{709}{44.84638}
+\pgfmath@def{acos}{710}{44.76508} \pgfmath@def{acos}{711}{44.68366}
+\pgfmath@def{acos}{712}{44.60212} \pgfmath@def{acos}{713}{44.52046}
+\pgfmath@def{acos}{714}{44.43869} \pgfmath@def{acos}{715}{44.35680}
+\pgfmath@def{acos}{716}{44.27478} \pgfmath@def{acos}{717}{44.19265}
+\pgfmath@def{acos}{718}{44.11039} \pgfmath@def{acos}{719}{44.02802}
+\pgfmath@def{acos}{720}{43.94552} \pgfmath@def{acos}{721}{43.86289}
+\pgfmath@def{acos}{722}{43.78014} \pgfmath@def{acos}{723}{43.69727}
+\pgfmath@def{acos}{724}{43.61427} \pgfmath@def{acos}{725}{43.53115}
+\pgfmath@def{acos}{726}{43.44790} \pgfmath@def{acos}{727}{43.36452}
+\pgfmath@def{acos}{728}{43.28101} \pgfmath@def{acos}{729}{43.19737}
+\pgfmath@def{acos}{730}{43.11360} \pgfmath@def{acos}{731}{43.02970}
+\pgfmath@def{acos}{732}{42.94567} \pgfmath@def{acos}{733}{42.86151}
+\pgfmath@def{acos}{734}{42.77721} \pgfmath@def{acos}{735}{42.69278}
+\pgfmath@def{acos}{736}{42.60821} \pgfmath@def{acos}{737}{42.52351}
+\pgfmath@def{acos}{738}{42.43867} \pgfmath@def{acos}{739}{42.35370}
+\pgfmath@def{acos}{740}{42.26858} \pgfmath@def{acos}{741}{42.18333}
+\pgfmath@def{acos}{742}{42.09793} \pgfmath@def{acos}{743}{42.01240}
+\pgfmath@def{acos}{744}{41.92672} \pgfmath@def{acos}{745}{41.84090}
+\pgfmath@def{acos}{746}{41.75493} \pgfmath@def{acos}{747}{41.66882}
+\pgfmath@def{acos}{748}{41.58257} \pgfmath@def{acos}{749}{41.49617}
+\pgfmath@def{acos}{750}{41.40962} \pgfmath@def{acos}{751}{41.32292}
+\pgfmath@def{acos}{752}{41.23607} \pgfmath@def{acos}{753}{41.14908}
+\pgfmath@def{acos}{754}{41.06193} \pgfmath@def{acos}{755}{40.97463}
+\pgfmath@def{acos}{756}{40.88717} \pgfmath@def{acos}{757}{40.79956}
+\pgfmath@def{acos}{758}{40.71180} \pgfmath@def{acos}{759}{40.62388}
+\pgfmath@def{acos}{760}{40.53580} \pgfmath@def{acos}{761}{40.44756}
+\pgfmath@def{acos}{762}{40.35916} \pgfmath@def{acos}{763}{40.27061}
+\pgfmath@def{acos}{764}{40.18189} \pgfmath@def{acos}{765}{40.09300}
+\pgfmath@def{acos}{766}{40.00396} \pgfmath@def{acos}{767}{39.91474}
+\pgfmath@def{acos}{768}{39.82537} \pgfmath@def{acos}{769}{39.73582}
+\pgfmath@def{acos}{770}{39.64611} \pgfmath@def{acos}{771}{39.55622}
+\pgfmath@def{acos}{772}{39.46617} \pgfmath@def{acos}{773}{39.37594}
+\pgfmath@def{acos}{774}{39.28554} \pgfmath@def{acos}{775}{39.19496}
+\pgfmath@def{acos}{776}{39.10421} \pgfmath@def{acos}{777}{39.01328}
+\pgfmath@def{acos}{778}{38.92218} \pgfmath@def{acos}{779}{38.83089}
+\pgfmath@def{acos}{780}{38.73942} \pgfmath@def{acos}{781}{38.64777}
+\pgfmath@def{acos}{782}{38.55594} \pgfmath@def{acos}{783}{38.46392}
+\pgfmath@def{acos}{784}{38.37171} \pgfmath@def{acos}{785}{38.27932}
+\pgfmath@def{acos}{786}{38.18673} \pgfmath@def{acos}{787}{38.09396}
+\pgfmath@def{acos}{788}{38.00100} \pgfmath@def{acos}{789}{37.90784}
+\pgfmath@def{acos}{790}{37.81448} \pgfmath@def{acos}{791}{37.72093}
+\pgfmath@def{acos}{792}{37.62719} \pgfmath@def{acos}{793}{37.53324}
+\pgfmath@def{acos}{794}{37.43909} \pgfmath@def{acos}{795}{37.34474}
+\pgfmath@def{acos}{796}{37.25019} \pgfmath@def{acos}{797}{37.15542}
+\pgfmath@def{acos}{798}{37.06046} \pgfmath@def{acos}{799}{36.96528}
+\pgfmath@def{acos}{800}{36.86989} \pgfmath@def{acos}{801}{36.77429}
+\pgfmath@def{acos}{802}{36.67848} \pgfmath@def{acos}{803}{36.58245}
+\pgfmath@def{acos}{804}{36.48621} \pgfmath@def{acos}{805}{36.38974}
+\pgfmath@def{acos}{806}{36.29305} \pgfmath@def{acos}{807}{36.19615}
+\pgfmath@def{acos}{808}{36.09901} \pgfmath@def{acos}{809}{36.00165}
+\pgfmath@def{acos}{810}{35.90406} \pgfmath@def{acos}{811}{35.80625}
+\pgfmath@def{acos}{812}{35.70820} \pgfmath@def{acos}{813}{35.60991}
+\pgfmath@def{acos}{814}{35.51139} \pgfmath@def{acos}{815}{35.41263}
+\pgfmath@def{acos}{816}{35.31364} \pgfmath@def{acos}{817}{35.21440}
+\pgfmath@def{acos}{818}{35.11491} \pgfmath@def{acos}{819}{35.01518}
+\pgfmath@def{acos}{820}{34.91520} \pgfmath@def{acos}{821}{34.81497}
+\pgfmath@def{acos}{822}{34.71449} \pgfmath@def{acos}{823}{34.61375}
+\pgfmath@def{acos}{824}{34.51276} \pgfmath@def{acos}{825}{34.41150}
+\pgfmath@def{acos}{826}{34.30999} \pgfmath@def{acos}{827}{34.20821}
+\pgfmath@def{acos}{828}{34.10616} \pgfmath@def{acos}{829}{34.00385}
+\pgfmath@def{acos}{830}{33.90126} \pgfmath@def{acos}{831}{33.79840}
+\pgfmath@def{acos}{832}{33.69526} \pgfmath@def{acos}{833}{33.59184}
+\pgfmath@def{acos}{834}{33.48814} \pgfmath@def{acos}{835}{33.38416}
+\pgfmath@def{acos}{836}{33.27989} \pgfmath@def{acos}{837}{33.17533}
+\pgfmath@def{acos}{838}{33.07047} \pgfmath@def{acos}{839}{32.96532}
+\pgfmath@def{acos}{840}{32.85988} \pgfmath@def{acos}{841}{32.75413}
+\pgfmath@def{acos}{842}{32.64807} \pgfmath@def{acos}{843}{32.54171}
+\pgfmath@def{acos}{844}{32.43504} \pgfmath@def{acos}{845}{32.32806}
+\pgfmath@def{acos}{846}{32.22076} \pgfmath@def{acos}{847}{32.11314}
+\pgfmath@def{acos}{848}{32.00520} \pgfmath@def{acos}{849}{31.89693}
+\pgfmath@def{acos}{850}{31.78833} \pgfmath@def{acos}{851}{31.67939}
+\pgfmath@def{acos}{852}{31.57012} \pgfmath@def{acos}{853}{31.46051}
+\pgfmath@def{acos}{854}{31.35056} \pgfmath@def{acos}{855}{31.24026}
+\pgfmath@def{acos}{856}{31.12961} \pgfmath@def{acos}{857}{31.01860}
+\pgfmath@def{acos}{858}{30.90724} \pgfmath@def{acos}{859}{30.79551}
+\pgfmath@def{acos}{860}{30.68341} \pgfmath@def{acos}{861}{30.57095}
+\pgfmath@def{acos}{862}{30.45811} \pgfmath@def{acos}{863}{30.34489}
+\pgfmath@def{acos}{864}{30.23128} \pgfmath@def{acos}{865}{30.11729}
+\pgfmath@def{acos}{866}{30.00291} \pgfmath@def{acos}{867}{29.88813}
+\pgfmath@def{acos}{868}{29.77294} \pgfmath@def{acos}{869}{29.65736}
+\pgfmath@def{acos}{870}{29.54136} \pgfmath@def{acos}{871}{29.42494}
+\pgfmath@def{acos}{872}{29.30810} \pgfmath@def{acos}{873}{29.19084}
+\pgfmath@def{acos}{874}{29.07315} \pgfmath@def{acos}{875}{28.95502}
+\pgfmath@def{acos}{876}{28.83645} \pgfmath@def{acos}{877}{28.71743}
+\pgfmath@def{acos}{878}{28.59796} \pgfmath@def{acos}{879}{28.47803}
+\pgfmath@def{acos}{880}{28.35763} \pgfmath@def{acos}{881}{28.23677}
+\pgfmath@def{acos}{882}{28.11542} \pgfmath@def{acos}{883}{27.99360}
+\pgfmath@def{acos}{884}{27.87128} \pgfmath@def{acos}{885}{27.74847}
+\pgfmath@def{acos}{886}{27.62516} \pgfmath@def{acos}{887}{27.50134}
+\pgfmath@def{acos}{888}{27.37700} \pgfmath@def{acos}{889}{27.25214}
+\pgfmath@def{acos}{890}{27.12675} \pgfmath@def{acos}{891}{27.00082}
+\pgfmath@def{acos}{892}{26.87434} \pgfmath@def{acos}{893}{26.74731}
+\pgfmath@def{acos}{894}{26.61973} \pgfmath@def{acos}{895}{26.49157}
+\pgfmath@def{acos}{896}{26.36283} \pgfmath@def{acos}{897}{26.23351}
+\pgfmath@def{acos}{898}{26.10359} \pgfmath@def{acos}{899}{25.97306}
+\pgfmath@def{acos}{900}{25.84193} \pgfmath@def{acos}{901}{25.71017}
+\pgfmath@def{acos}{902}{25.57778} \pgfmath@def{acos}{903}{25.44475}
+\pgfmath@def{acos}{904}{25.31106} \pgfmath@def{acos}{905}{25.17671}
+\pgfmath@def{acos}{906}{25.04169} \pgfmath@def{acos}{907}{24.90598}
+\pgfmath@def{acos}{908}{24.76958} \pgfmath@def{acos}{909}{24.63247}
+\pgfmath@def{acos}{910}{24.49464} \pgfmath@def{acos}{911}{24.35608}
+\pgfmath@def{acos}{912}{24.21678} \pgfmath@def{acos}{913}{24.07672}
+\pgfmath@def{acos}{914}{23.93588} \pgfmath@def{acos}{915}{23.79427}
+\pgfmath@def{acos}{916}{23.65185} \pgfmath@def{acos}{917}{23.50863}
+\pgfmath@def{acos}{918}{23.36457} \pgfmath@def{acos}{919}{23.21967}
+\pgfmath@def{acos}{920}{23.07391} \pgfmath@def{acos}{921}{22.92728}
+\pgfmath@def{acos}{922}{22.77975} \pgfmath@def{acos}{923}{22.63132}
+\pgfmath@def{acos}{924}{22.48195} \pgfmath@def{acos}{925}{22.33164}
+\pgfmath@def{acos}{926}{22.18036} \pgfmath@def{acos}{927}{22.02810}
+\pgfmath@def{acos}{928}{21.87483} \pgfmath@def{acos}{929}{21.72053}
+\pgfmath@def{acos}{930}{21.56518} \pgfmath@def{acos}{931}{21.40876}
+\pgfmath@def{acos}{932}{21.25124} \pgfmath@def{acos}{933}{21.09260}
+\pgfmath@def{acos}{934}{20.93281} \pgfmath@def{acos}{935}{20.77185}
+\pgfmath@def{acos}{936}{20.60969} \pgfmath@def{acos}{937}{20.44630}
+\pgfmath@def{acos}{938}{20.28165} \pgfmath@def{acos}{939}{20.11570}
+\pgfmath@def{acos}{940}{19.94844} \pgfmath@def{acos}{941}{19.77982}
+\pgfmath@def{acos}{942}{19.60981} \pgfmath@def{acos}{943}{19.43837}
+\pgfmath@def{acos}{944}{19.26546} \pgfmath@def{acos}{945}{19.09105}
+\pgfmath@def{acos}{946}{18.91509} \pgfmath@def{acos}{947}{18.73754}
+\pgfmath@def{acos}{948}{18.55835} \pgfmath@def{acos}{949}{18.37748}
+\pgfmath@def{acos}{950}{18.19487} \pgfmath@def{acos}{951}{18.01047}
+\pgfmath@def{acos}{952}{17.82423} \pgfmath@def{acos}{953}{17.63609}
+\pgfmath@def{acos}{954}{17.44598} \pgfmath@def{acos}{955}{17.25385}
+\pgfmath@def{acos}{956}{17.05962} \pgfmath@def{acos}{957}{16.86322}
+\pgfmath@def{acos}{958}{16.66457} \pgfmath@def{acos}{959}{16.46359}
+\pgfmath@def{acos}{960}{16.26020} \pgfmath@def{acos}{961}{16.05430}
+\pgfmath@def{acos}{962}{15.84580} \pgfmath@def{acos}{963}{15.63459}
+\pgfmath@def{acos}{964}{15.42057} \pgfmath@def{acos}{965}{15.20360}
+\pgfmath@def{acos}{966}{14.98357} \pgfmath@def{acos}{967}{14.76033}
+\pgfmath@def{acos}{968}{14.53374} \pgfmath@def{acos}{969}{14.30364}
+\pgfmath@def{acos}{970}{14.06986} \pgfmath@def{acos}{971}{13.83221}
+\pgfmath@def{acos}{972}{13.59049} \pgfmath@def{acos}{973}{13.34447}
+\pgfmath@def{acos}{974}{13.09392} \pgfmath@def{acos}{975}{12.83856}
+\pgfmath@def{acos}{976}{12.57811} \pgfmath@def{acos}{977}{12.31225}
+\pgfmath@def{acos}{978}{12.04060} \pgfmath@def{acos}{979}{11.76278}
+\pgfmath@def{acos}{980}{11.47834} \pgfmath@def{acos}{981}{11.18676}
+\pgfmath@def{acos}{982}{10.88748} \pgfmath@def{acos}{983}{10.57984}
+\pgfmath@def{acos}{984}{10.26309} \pgfmath@def{acos}{985}{9.93636}
+\pgfmath@def{acos}{986}{9.59863} \pgfmath@def{acos}{987}{9.24870}
+\pgfmath@def{acos}{988}{8.88512} \pgfmath@def{acos}{989}{8.50614}
+\pgfmath@def{acos}{990}{8.10961} \pgfmath@def{acos}{991}{7.69281}
+\pgfmath@def{acos}{992}{7.25224} \pgfmath@def{acos}{993}{6.78328}
+\pgfmath@def{acos}{994}{6.27958} \pgfmath@def{acos}{995}{5.73196}
+\pgfmath@def{acos}{996}{5.12640} \pgfmath@def{acos}{997}{4.43922}
+\pgfmath@def{acos}{998}{3.62430} \pgfmath@def{acos}{999}{2.56255}
+\pgfmath@def{acos}{1000}{0.00000}
+
+
+
+% Local Variables:
+% tab-width: 2
+% End:
diff --git a/graphics/pgf/base/tex/pgfmathode.code.tex b/graphics/pgf/base/tex/pgfmathode.code.tex
new file mode 100644
index 0000000000..cb3d0d26ca
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathode.code.tex
@@ -0,0 +1,178 @@
+% Copyright 2011 by Christophe Jorssen
+%
+% 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\pgfmathode@stopadd{\pgfmathode@stopadd}
+
+\def\pgfmathode@addindextofunc[#1]#2{%
+ \begingroup
+ \gdef\pgfmathode@func{}%
+ \pgfmathode@addindextofunc@i[#1]#2\pgfmathode@stopadd}
+
+\def\pgfmathode@addindextofunc@i[#1]#2#3{%
+ \ifx#1#2
+ \expandafter\gdef\expandafter\pgfmathode@func\expandafter{%
+ \pgfmathode@func #2[\pgfmathode@timeindex]}%
+ \else
+ \expandafter\gdef\expandafter\pgfmathode@func\expandafter{%
+ \pgfmathode@func #2}%
+ \fi
+ \ifx#3\pgfmathode@stopadd
+ \expandafter\gdef\expandafter\pgfmathode@func\expandafter{%
+ \expandafter{\pgfmathode@func}}%
+ \let\next\endgroup
+ \else
+ \def\next{\pgfmathode@addindextofunc@i[#1]#3}%
+ \fi
+ \next}
+
+%**********************************************************************
+% Know limitation: fk cannot be a time function. Should be possible to
+% use \Sol[0] as time in the set of equations.
+%**********************************************************************
+
+% Numerically solve a differential system with 1st order Runge-Kutta
+% (Euler method)
+% dq1/dt = f1(t,q1,q2,...,qN)
+% dq2/dt = f2(t,q1,q2,...,qN)
+% ...
+% dqN/dt = fN(t,q1,q2,...,qN)
+%
+% #1: A pgf array where the solution will be stored.
+% At the end:
+% #1 -> {{t(0),q1(t(0)),q2(t(0)),...,qN(t(0))},
+% {t(1),q1(t(1)),q2(t(1)),...,qN(t(1))},
+% ...
+% {t(Nstep),q1(t(Nstep)),q2(t(Nstep)),...,qN(t(Nstep))}}
+% #2: A pgf array with f1,f2,...,fN
+% {f1}
+% #3: A pgf array with initial conditions.
+% {t(0),q1(t(0)),q2(t(0)),...,qN(t(0))}
+% #4: t(Nstep)
+% #5: Nstep (number of steps)
+%
+% * First order example: dq/dt = -q + 5 with IC=(t=0,q(0)=0)
+% \pgfmathodeRKI{\Sol}{{-\Sol[1]+5}}{{0,0}}{3.5}{100}
+% * Second order example: {dq1/dt=q2, dq2/dt=-q2/2-sin(q1)} (damped
+% pendulum)
+% \pgfmathodeRKI{\Sol}{{\Sol[2],-\Sol[2]/2-sin(deg(\Sol[1]))}}%
+% {{0,-1,5}}{15}{50}
+
+\def\pgfmathode@generic@init@RK{%
+ \begingroup
+ % Sol array (#1) first element is given by the set of initial
+ % conditions (#3). We need to enclose it in brace so that is a now
+ % a "matrix" array.
+ \gdef#1{{#3}}%
+ % The set of rhs {f1(t,q1,q2,...,qN),...,fN(t,q1,q2,...,qN)} is
+ % given in terms of #1[0],#1[1],...,#1[N]. We need to transform to
+ % #1[\pgfmathode@timeindex][0],...,#1[\pgfmathode@timeindex][N], that is
+ % add [\pgfmathode@timeindex] after every occurrence of #1 in #2.
+ % No need to brace #2 since it is already surrounded by braces. The
+ % result is stored in \pgfmathode@func
+ \pgfmathode@addindextofunc[#1]#2%
+ % Set time step. Actually the number of time steps is #5-1, so we
+ % divide by (#5-1)+1 = #5.
+ \pgfmathsetmacro\pgfmathode@Sol@t{#1[0][0]}%
+ \pgfmathsetmacro\pgfmathode@Deltat{(#4-\pgfmathode@Sol@t)/#5}%
+ % Compute the order of the system: it is equal to the number of IC
+ % minus one (time).
+ \pgfmathsetmacro\pgfmathode@dimfunc{dim(#3)-1}%
+ \pgfmathsetmacro\pgfmathode@numstep{#5-1}}
+
+\def\pgfmathodeRKI#1#2#3#4#5{%
+ \pgfmathode@generic@init@RK
+ % Start the time loop for Runge-Kutta 1st order
+ \foreach \pgfmathode@timeindex in {0,...,\pgfmathode@numstep} {%
+ \message{Step \pgfmathode@timeindex...}%
+ % Start the function loop
+ \foreach \pgfmathode@funcindex in {1,...,\pgfmathode@dimfunc} {%
+ % The RKI algorithm
+ % qk[t(i)] = Deltat*fk(t(i-1),q1(t(i-1)),...qN(t(i-1))) +
+ % qk[t(i-1)]
+ % Note: this part can be really slow due to array management in
+ % pgfmath.
+ % TODO: find a better way (at least inside this loop)
+ \pgfmathparse{%
+ \pgfmathode@Deltat*(\pgfmathode@func[\pgfmathode@funcindex-1])+
+ #1[\pgfmathode@timeindex][\pgfmathode@funcindex]}%
+ % Store the result in a helper macro
+ \expandafter\xdef\csname pgfmathode@Sol@\pgfmathode@funcindex
+ \endcsname{\pgfmathresult}%
+ }
+ % Store step i
+ \pgfmathparse{\pgfmathode@Sol@t+\pgfmathode@Deltat}%
+ \xdef\pgfmathode@Sol@t{\pgfmathresult}%
+ \xdef\pgfmathode@temp{}%
+ \foreach \pgfmathode@funcindex in {1,...,\pgfmathode@dimfunc} {%
+ \ifx\pgfmathode@temp\pgfutil@empty
+ \xdef\pgfmathode@temp{%
+ \csname pgfmathode@Sol@\pgfmathode@funcindex\endcsname}%
+ \else
+ \xdef\pgfmathode@temp{%
+ \pgfmathode@temp,
+ \csname pgfmathode@Sol@\pgfmathode@funcindex\endcsname}%
+ \fi}
+ \xdef#1{%
+ {\expandafter\pgfutil@firstofone#1,%
+ {\pgfmathode@Sol@t,\pgfmathode@temp}}}%
+ }
+ \endgroup}
+
+% RKIV: far from working yet!
+\def\pgfmathodeRKIV#1#2#3#4#5{%
+ \pgfmathode@generic@init@RK
+ % Start the time loop for Runge-Kutta 4th order
+ \foreach \pgfmathode@timeindex in {0,...,\pgfmathode@numstep} {%
+ \message{Step \pgfmathode@timeindex...}%
+ % Start the function loop
+ \foreach \pgfmathode@funcindex in {1,...,\pgfmathode@dimfunc} {%
+ % The RKIV algorithm
+ % qk[t(i)] = qk[t(i-1)] +
+ % (1/6) * (j1k + 2j2k + 2j3k + j4k)
+ % where j1k = fk(t(i-1),q1(t(i-1)),...qN(t(i-1))) * Deltat
+ % j2k = fk(t(i-1)+.5*Deltat,
+ % q1(t(i-1))+.5*j11,...qN(t(i-1))+.5*j1N) * Deltat
+ % j3k = fk(t(i-1)+.5*Deltat,
+ % q1(t(i-1))+.5*j21,...qN(t(i-1))+.5*j2N) * Deltat
+ % j4k = fk(t(i-1)+Deltat,
+ % q1(t(i-1))+j31,...qN(t(i-1))+j3N) * Deltat
+ %
+ % Compute j1k
+ \pgfmathparse{%
+ \pgfmathode@Deltat*(\pgfmathode@func[\pgfmathode@funcindex-1])+
+ #1[\pgfmathode@timeindex][\pgfmathode@funcindex]}%
+ \expandafter\xdef\csname pgfmathode@RKIV@1@\pgfmathode@funcindex
+ \endcsname{\pgfmathresult}%
+ % Compute j2k
+ \pgfmathparse{%
+ \pgfmathode@Deltat*(\pgfmathode@func[\pgfmathode@funcindex-1])+
+ #1[\pgfmathode@timeindex][\pgfmathode@funcindex]}%
+ \expandafter\xdef\csname pgfmathode@RKIV@1@\pgfmathode@funcindex
+ \endcsname{\pgfmathresult}%
+ }
+ % Store step i
+ \pgfmathparse{\pgfmathode@Sol@t+\pgfmathode@Deltat}%
+ \xdef\pgfmathode@Sol@t{\pgfmathresult}%
+ \xdef\pgfmathode@temp{}%
+ \foreach \pgfmathode@funcindex in {1,...,\pgfmathode@dimfunc} {%
+ \ifx\pgfmathode@temp\pgfutil@empty
+ \xdef\pgfmathode@temp{%
+ \csname pgfmathode@Sol@\pgfmathode@funcindex\endcsname}%
+ \else
+ \xdef\pgfmathode@temp{%
+ \pgfmathode@temp,
+ \csname pgfmathode@Sol@\pgfmathode@funcindex\endcsname}%
+ \fi}
+ \xdef#1{%
+ {\expandafter\pgfutil@firstofone#1,%
+ {\pgfmathode@Sol@t,\pgfmathode@temp}}}%
+ }
+ \endgroup}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmathparser.code.tex b/graphics/pgf/base/tex/pgfmathparser.code.tex
new file mode 100644
index 0000000000..c16d07005d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathparser.code.tex
@@ -0,0 +1,993 @@
+
+\newdimen\pgfmath@dimen
+\newcount\pgfmath@count
+\newbox\pgfmath@box
+\newtoks\pgfmath@toks
+
+\newif\ifpgfmath@quickparse
+\newif\ifpgfmathfloat
+\newif\ifpgfmathunitsdeclared
+\newif\ifpgfmathmathunitsdeclared
+\newif\ifpgfmathignoreunitscale
+
+\let\pgfmath@protected@edef=\edef
+\ifcsname protected@edef\endcsname
+ \let\pgfmath@protected@edef=\protected@edef
+\fi
+
+\def\pgfmathprint#1{\pgfmathparse{#1}\pgfmathresult}
+
+\def\pgfmathparse{%
+ \begingroup
+ \pgfmath@catcodes
+ \pgfmath@quickparsefalse
+ % Test for the fpu library
+ \ifpgfmathfloat
+ \let\pgfmath@parse@next=\pgfmathfloatparsenumber
+ \else
+ \let\pgfmath@parse@next=\pgfmathparse@
+ \fi
+ \pgfmath@parse@next}
+
+\def\pgfmath@catcodes{% Maybe unnecessary.
+ \catcode`\==12 %
+ \catcode`\,=12 %
+ \catcode`\|=12 %
+ \catcode`\&=12 %
+}
+
+\def\pgfmathqparse{%
+ \begingroup
+ \pgfmath@catcodes
+ \pgfmath@quickparsetrue
+ \pgfmathparse@}
+
+\def\pgfmathparse@#1{%
+ % No (math) units yet.
+ \global\pgfmathunitsdeclaredfalse
+ \global\pgfmathmathunitsdeclaredfalse
+ % Expand expression so any remaining CSs are registers
+ % or box dimensions (i.e. |\wd|, |\ht|, |\dp|).
+ \pgfmath@protected@edef\pgfmath@expression{#1}%
+ %
+ \expandafter\pgfmathparse@trynumber@loop\pgfmath@expression\pgfmath@parse@stop
+ %
+ % this here is the _real_ parser. it is invoked by
+ % \pgfmathparse@trynumber@loop if that says "this is no number"
+ %\pgfmathparse@@\pgfmath@parse@stop%
+}
+
+\def\pgfmath@parse@stop{\pgfmath@parse@stop}% equals only itself
+
+\def\pgfmathparse@trynumber@token{numeric}
+\begingroup
+\def\\{\global\let\pgf@let@space@token= } \\ % now, \pgf@let@space@token is a space token
+\endgroup
+
+% This a "fast-lane": if the expressions consist merely of number
+% tokens, we can simply return the number as-is.
+%
+% This is significantly faster and should resemble the 80% use-case.
+%
+% #1 a single token
+\def\pgfmathparse@trynumber@loop{%
+ \futurelet\pgfmath@token@let\pgfmathparse@trynumber@loop@
+}%
+\def\pgfmathparse@trynumber@loop@#1{%
+ \ifx\pgfmath@token@let\pgf@let@space@token
+ % Hm. we found a white space... and we have no support for
+ % trimming. That means we have to assume that the white space
+ % occurred somewhere in the middle - and fall back to the
+ % expensive method.
+ \def\pgfmath@parse@next{\pgfmathparse@@#1}%
+ \else
+ \ifx\pgfmath@token@let\bgroup%
+ % oh! We found '{' #1.
+ % Well, these braces appear to be special; fall back to
+ % the complicated routine...
+ \let\pgfmath@parse@next=\pgfmathparse@@
+ \else
+ \ifx\pgfmath@token@let\pgfmath@parse@stop
+ % Ah: we have passed the check! The expression consists only
+ % of 0123456789. , so do not parse anything and return it
+ % as-is!
+ \let\pgfmath@parse@next=\pgfmathparse@expression@is@number
+ \else
+ \expandafter\ifx\csname pgfmath@token@\pgfmathparse@trynumber@token @\string#1\endcsname\relax%
+ % hm. It is none of 0123456789.
+ \let\pgfmath@parse@next=\pgfmathparse@@
+ \else
+ % continue... we only found one of 0123456789. so
+ % far...
+ \let\pgfmath@parse@next=\pgfmathparse@trynumber@loop
+ \fi
+ \fi
+ \fi
+ \fi
+ \pgfmath@parse@next
+}%
+
+\def\pgfmathparse@expression@is@number{%
+ \let\pgfmathresult=\pgfmath@expression
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup
+ \ignorespaces
+}%
+\def\pgfmathparse@@#1\pgfmath@parse@stop{%
+ % We are inside a group (opened in |\pgfmathparse| or
+ % |\pgfmathqparse|).
+ % Stuff for calc compatibility.
+ \let\real=\pgfmath@calc@real
+ \let\minof=\pgfmath@calc@minof
+ \let\maxof=\pgfmath@calc@maxof
+ \let\ratio=\pgfmath@calc@ratio
+ \let\widthof=\pgfmath@calc@widthof
+ \let\heightof=\pgfmath@calc@heightof
+ \let\depthof=\pgfmath@calc@depthof
+ % Restore font (defined in pgfmathutil.code.tex)
+ \pgfmath@selectfont
+ % Set up stack.
+ \pgfmath@stack@operation={{}{}{}}%
+ \pgfmath@stack@operand={{}{}{}}%
+ \let\pgfmath@stack@operation@top=\pgfmath@stack@empty
+ \let\pgfmath@stack@operand@top=\pgfmath@stack@empty
+ % An expression always begins with an operand.
+ \expandafter\pgfmath@bgroup@strip\expandafter{\pgfmath@expression}%
+ % |\pgfmath@bgroup@stripped| is the result of
+ % |\pgfmath@bgroup@strip|
+ \expandafter\pgfmath@parse@@operand\pgfmath@bgroup@stripped @@@@\pgfmath@parse@stop%
+}
+
+\def\pgfmath@parse@end#1\pgfmath@parse@stop{%
+ \pgfmathpostparse
+ \pgfmath@smuggleone\pgfmathresult%
+ \endgroup
+ \ignorespaces}
+
+\let\pgfmathpostparse=\relax
+
+% For compatibility with older version.
+%
+\def\pgfmathscaleresult{%
+ \ifpgfmathunitsdeclared
+ \else
+ \ifpgfmathignoreunitscale
+ \else
+ \afterassignment\pgfmath@gobbletilpgfmath@%
+ \pgfmath@x\pgfmathresultunitscale pt\relax\pgfmath@%
+ \expandafter\pgfmath@x\pgfmathresult\pgfmath@x%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
+ \fi
+ \fi
+}
+
+\def\pgfmathsetresultunitscale#1{\def\pgfmathresultunitscale{#1}}
+
+\def\pgfmathresultunitscale{1}
+
+
+% A utility function which evaluates expression '#1' and invokes '#2'
+% if the expression is true and '#3' if it is false.
+\def\pgfmathifexpression#1#2#3{%
+ \pgfmathparse{#1}%
+ \pgfmath@iftrue{#2}{#3}%
+}%
+% Executes '#1' if \pgfmathresult is 'true', '#2' otherwise.
+% WARNING : overwritten in fpu lib!
+\def\pgfmath@iftrue{%
+ \ifdim\pgfmathresult pt=1.0pt %
+ \let\pgfmath@next=\pgfutil@firstoftwo
+ \else
+ \let\pgfmath@next=\pgfutil@secondoftwo
+ \fi
+ \pgfmath@next%
+}%
+
+% Stuff for computability with the calc package.
+%
+\def\pgfmath@calc@real#1{#1}
+\def\pgfmath@calc@minof#1#2{min(#1,#2)}
+\def\pgfmath@calc@maxof#1#2{max(#1,#2)}
+\def\pgfmath@calc@ratio#1#2{#1/#2}
+\def\pgfmath@calc@widthof#1{width("#1")}
+\def\pgfmath@calc@heightof#1{height("#1")}
+\def\pgfmath@calc@depthof#1{depth("#1")}
+
+\def\pgfmath@bgroup{\string\pgfmath@bgroup}
+\def\pgfmath@egroup{\string\pgfmath@egroup}
+\def\pgfmath@egroup@token{\pgfmath@egroup}
+
+\def\pgfmath@text@@{@}
+\def\pgfmath@text@operator{operator}
+\def\pgfmath@text@function{function}
+\def\pgfmath@dots{...}
+\def\pgfmath@char@zero{0}
+\def\pgfmath@char@quote{"}
+\def\pgfmath@char@exclamation{!}
+\def\pgfmath@char@plus{+}
+\def\pgfmath@char@minus{-}
+\def\pgfmath@char@period{.}
+\def\pgfmath@char@leftangle{<}
+\def\pgfmath@char@leftbracket{[}
+\pgfmath@toks={#}
+\edef\pgfmath@char@hash{\the\pgfmath@toks}
+
+\def\pgfmath@tokens@make#1#2{%
+ % Defines for each token or balanced text in |#2| a control sequence
+ % |\pgfmath@token@<#1>@\string<one token from #2>| and stores |#2|
+ % in it.
+ \def\pgfmath@prefix{#1}%
+ % Note the empty group |{}| at the end that ends the loop in
+ % |\pgfmath@token@@make|.
+ \expandafter\pgfmath@tokens@@make#2{}}
+
+\def\pgfmath@tokens@@make#1{%
+ \def\pgfmath@token{#1}%
+ \ifx\pgfmath@token\pgfmath@empty
+ % End of loop: all tokens or balanced texts were parsed.
+ \else
+ \pgfmath@namedef{pgfmath@token@\pgfmath@prefix @\string#1}{#1}%
+ \expandafter\pgfmath@tokens@@make%
+ \fi}
+
+\pgfmath@tokens@make{box}{\wd\ht\dp}
+\ifx\dimexpr\@undefined\else % needed for classic tex
+ \pgfmath@tokens@make{dimexpr}{\dimexpr\glueexpr}
+\fi
+\pgfmath@tokens@make{unit}{{bp}{cc}{cm}{dd}{em}{ex}{in}{mm}{pc}{pt}{sp}}
+\pgfmath@tokens@make{mathunit}{{mu}}
+\pgfmath@tokens@make{numeric}{.0123456789}
+\pgfmath@tokens@make{number}{0123456789}
+\pgfmath@tokens@make{functional}{_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ}
+\pgfmath@tokens@make{exponent}{eE}
+\pgfmath@tokens@make{group}{{()}{[]}{\pgfmath@bgroup\pgfmath@egroup}}
+\pgfmath@tokens@make{specials}{@)]\pgfmath@egroup}
+\pgfmath@tokens@make{hexadecimal}{0123456789ABCDEFabcdef}
+\pgfmath@tokens@make{octal}{01234567}
+\pgfmath@tokens@make{binary}{01}
+
+\pgfmath@namedef{pgfmath@base@0x}{16}
+\pgfmath@namedef{pgfmath@base@0X}{16}
+\pgfmath@namedef{pgfmath@base@0b}{2}
+\pgfmath@namedef{pgfmath@base@0B}{2}
+
+% Determine if a register is a count or a dimension/skip register.
+\newif\ifpgfmath@dimen@
+\def\pgfmath@dimen@#1{%
+ \begingroup
+ \afterassignment\pgfmath@dimen@@%
+ #1=0.0pt\relax\pgfmath@}
+\def\pgfmath@dimen@@#1#2\pgfmath@{%
+ \endgroup
+ \ifx#1.%
+ \pgfmath@dimen@false
+ \else
+ \pgfmath@dimen@true
+ \fi}
+
+\def\pgfmath@parse@ifbgroup#1#2{%
+ \let\pgfmath@parse@bgroup@after=#1%
+ \let\pgfmath@parse@nobgroup@after=#2%
+ \futurelet\pgfmath@token@let%
+ \pgfmath@parse@@ifbgroup}
+
+\def\pgfmath@parse@@ifbgroup{%
+ \ifx\pgfmath@token@let\bgroup
+ \let\pgfmath@parse@next=\pgfmath@parse@@@ifbgroup
+ \else
+ % |\pgfmath@sptoken| defined in \file{pgfmathutil.code.tex}.
+ \ifx\pgfmath@token@let\pgfmath@sptoken
+ \let\pgfmath@parse@next=\pgfmath@parse@@@@ifbgroup
+ \else
+ \let\pgfmath@parse@next=\pgfmath@parse@nobgroup@after
+ \fi
+ \fi
+ \pgfmath@parse@next}
+
+% TT: If false, octal parsing is switched off (needed for time parsing)
+\newif\ifpgfmath@octalparsing
+\pgfmath@octalparsingtrue
+
+% I (CJ) *think* it replaces |{| and |}| by |\pgfmath@bgroup| and
+% |\pgfmath@egroup|?
+\def\pgfmath@parse@@@ifbgroup#1{%
+ \pgfmath@parse@bgroup@after\pgfmath@bgroup#1\pgfmath@egroup}
+
+{
+\def\:{\pgfmath@parse@@@@ifbgroup}
+\expandafter\gdef\: {\futurelet\pgfmath@token@let\pgfmath@parse@@ifbgroup}
+}
+
+% Parse an operand.
+\def\pgfmath@parse@operand{%
+ \expandafter\pgfmath@parse@@operand\pgfmath@token@next}
+
+% This is the entry point for the parser. It is called at the end of
+% |\pgfmathparse@| with the following syntax
+% |\expandafter\pgfmath@parse@@operand\pgfmath@bgroup@stripped
+% @@@@\pgfmath@parse@stop|.
+% Note: we are inside a group.
+\def\pgfmath@parse@@operand{%
+ \pgfmath@parse@ifbgroup{\pgfmath@parse@@operand}{\pgfmath@parse@@operand@}}
+
+% An operand is
+% * |+| (unary plus),
+% * |-| (unary minus),
+% * a prefix operator
+\def\pgfmath@parse@@operand@#1{%
+ \def\pgfmath@token{#1}%
+ \ifx\pgfmath@token\pgfmath@char@plus
+ % Unary (prefix) plus
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \else
+ \ifx\pgfmath@token\pgfmath@char@minus
+ % Unary (prefix) minus
+ \pgfmath@stack@push@operation{neg}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand
+ \else
+ % See |\pgfmathdeclareoperator| (below). Note that |+| and |-|
+ % that are also declared as operators have been tested before so
+ % they should never be parsed as binary (infix) operator at this stage.
+ \expandafter\ifx\csname pgfmath@operation@\expandafter\string\pgfmath@token @prefix\endcsname\pgfmath@token
+ \let\pgfmath@parse@next=\pgfmath@parse@prefix@operator
+ \else
+ \ifpgfmath@quickparse
+ \let\pgfmath@parse@next=\pgfmath@qparse@operand
+ \else
+ \let\pgfmath@number=\pgfmath@empty
+ \expandafter\ifx\csname pgfmath@token@functional@\string#1\endcsname\relax%
+ \let\pgfmath@base=\pgfmath@empty%
+ \let\pgfmath@token@next=\pgfmath@token%
+ \if#10% Check for octal prefix.
+ \ifpgfmath@octalparsing%
+ \def\pgfmath@base{8}%
+ \fi%
+ \fi%
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \else%
+ \let\pgfmath@function=\pgfmath@token%
+ \let\pgfmath@parse@next=\pgfmath@parse@function%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+% Parse prefix operators.
+%
+\def\pgfmath@parse@prefix@operator{%
+ \ifx\pgfmath@token\pgfmath@char@quote% Quote character.
+ \let\pgfmath@parse@next=\pgfmath@parse@operand@quote%
+ \else%
+ \ifx\pgfmath@token\pgfmath@char@exclamation% Prefix !.
+ \pgfmath@stack@push@operation{not}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \else% Anything else, just push and hope.
+ \expandafter\pgfmath@stack@push@operation\expandafter{\pgfmath@token}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
+}%
+
+
+% Quote part of an expression.
+%
+\def\pgfmath@parse@operand@quote#1"{%
+ \def\pgfmathresult{#1}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+% Quick operand parsing. Should always have units.
+% No functions, base conversion, quoting or scientific notation
+% are permitted.
+\def\pgfmath@qparse@operand{%
+ \afterassignment\pgfmath@qparse@@operand%
+ \pgfmath@dimen\pgfmath@token}
+\def\pgfmath@qparse@@operand{%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+% Parse a number, which can take the form:
+%
+% 1. An integer, or a decimal, with or without units.
+% 2. A dimension/skip or a count register.
+% 3. A dimension register preceded by a number or count register.
+% 4. A box dimension (e.g., \wd\mybox).
+% 5. A box dimension preceded by a number or a count register.
+% 6. Scientific notation (e.g., 1.234567e-10).
+% 7. A binary, hexadecimal, or octal number.
+%
+\def\pgfmath@parse@number{\pgfmath@parse@ifbgroup{\pgfmath@parse@number}{\pgfmath@parse@number@}}
+\def\pgfmath@parse@number@#1{%
+ \let\pgfmath@token=\pgfmath@token@next%
+ \def\pgfmath@token@next{#1}%
+ \pgfmath@parse@@number}
+
+\def\pgfmath@parse@@number{%
+ \ifx\pgfmath@token\pgfmath@egroup@token%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmath@number}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@operator%
+ \else%
+ \expandafter\ifcat\pgfmath@token\relax% A CS?
+ \expandafter\ifx\csname pgfmath@token@dimexpr@\expandafter\string\pgfmath@token\endcsname\relax%
+ \expandafter\ifx\pgfmath@token\numexpr%
+ \let\pgfmath@parse@next=\pgfmath@parse@numexpr%
+ \else%
+ \expandafter\ifx\pgfmath@token\muexpr%
+ \let\pgfmath@parse@next=\pgfmath@parse@muexpr%
+ \else%
+ \expandafter\ifx\csname pgfmath@token@box@\expandafter\string\pgfmath@token\endcsname\relax%
+ % So, is the CS is a dimension or a count register?
+ \expandafter\pgfmath@dimen@\pgfmath@token%
+ \ifpgfmath@dimen@% A dimension register.
+ \global\pgfmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number\pgfmath@token%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \else% A count register.
+ \pgfmath@count=\pgfmath@token%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\the\pgfmath@count}%
+ \expandafter\ifcat\pgfmath@token@next\relax%
+ % A CS following a count register should be \wd, \ht or \dp.
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \else%
+ \let\pgfmathresult=\pgfmath@number%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \fi%
+ \fi%
+ \else%
+ % This should be a box specification, for example, 0.5\wd\mybox.
+ \global\pgfmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number\pgfmath@token\pgfmath@token@next%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \global\pgfmathunitsdeclaredtrue%
+ \let\pgfmath@parse@next=\pgfmath@parse@dimexpr%
+ \fi%
+ \else%
+ \expandafter\ifx\csname pgfmath@token@numeric@\expandafter\string\pgfmath@token\endcsname\relax%
+ % It isn't numeric (i.e., 012345679.), so it might be units...
+ \expandafter\ifx\csname pgfmath@token@unit@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
+ % ...or the exponent characters...
+ \expandafter\ifx\csname pgfmath@token@exponent@\pgfmath@token\endcsname\relax%
+ % ...or a base prefix...
+ \expandafter\ifx\csname pgfmath@base@\pgfmath@number\pgfmath@token\endcsname\relax%
+ % ...or a math unit...
+ \expandafter\ifx\csname pgfmath@token@mathunit@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
+ % ...none of the above...
+ \ifx\pgfmath@base\pgfmath@empty%
+ \let\pgfmathresult=\pgfmath@number%
+ \else%
+ \ifx\pgfmath@number\pgfmath@char@zero%
+ \let\pgfmathresult=\pgfmath@number%
+ \else%
+ % Convert from octal.
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{8}{10}%
+ \fi%
+ \fi%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@operator%
+ \else%
+ % ...here, it is a math unit (mu). Treat it as a pt.
+ \global\pgfmathunitsdeclaredtrue%
+ \global\pgfmathmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number pt\relax%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \fi%
+ \else%
+ % ...here, it is a base prefix 0x, 0X, 0b or 0B
+ \expandafter\let\expandafter\pgfmath@base\expandafter=%
+ \csname pgfmath@base@\pgfmath@number\pgfmath@token\endcsname%
+ \let\pgfmath@parse@next=\pgfmath@parse@base%
+ \fi%
+ \else% ... and here, it is the exponent characters.
+ \let\pgfmath@parse@next=\pgfmath@parse@exponent%
+ \fi%
+ \else% ...but here it is units.
+ \global\pgfmathunitsdeclaredtrue%
+ \pgfmath@dimen=\pgfmath@number\pgfmath@token\pgfmath@token@next\relax%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \fi%
+ \else% It is numeric.
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfmath@number%
+ \expandafter\expandafter\expandafter{\expandafter\pgfmath@number\pgfmath@token}%
+ \ifx\pgfmath@token\pgfmath@char@period%
+ \let\pgfmath@base=\pgfmath@empty%
+ \fi%
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+
+% Parse a \dimexpr
+\def\pgfmath@parse@dimexpr{%
+ \afterassignment\pgfmath@parse@dimexpr@%
+ \expandafter\expandafter\expandafter\pgfmath@dimen\expandafter\pgfmath@token\pgfmath@token@next%
+}
+\def\pgfmath@parse@dimexpr@{%
+ \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@dimen}}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+
+% Parse a \muexpr
+\def\pgfmath@parse@muexpr{%
+ \begingroup%
+ \afterassignment\pgfmath@parse@muexpr@%
+ \expandafter\expandafter\expandafter\muskip\expandafter\expandafter\expandafter0\expandafter\pgfmath@token\expandafter\pgfmath@token@next%
+}
+\def\pgfmath@parse@muexpr@{%
+ \expandafter\endgroup%
+ \expandafter\edef\expandafter\pgfmathresult\expandafter{\expandafter\pgfMATH@STRIPMU\the\muskip0}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+{
+\catcode`\m=12
+\catcode`\u=12
+\gdef\pgfMATH@STRIPMU#1mu{#1}
+}
+
+
+% Parse a \numexpr
+\def\pgfmath@parse@numexpr{%
+ \afterassignment\pgfmath@parse@numexpr@%
+ \expandafter\expandafter\expandafter\pgfmath@count\expandafter\pgfmath@token\pgfmath@token@next%
+}
+\def\pgfmath@parse@numexpr@#1{%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\the\pgfmath@count}%
+ \def\pgfmath@token@next{#1}%
+ \expandafter\ifcat\pgfmath@token@next\relax%
+ % A CS following a count register should be \wd, \ht or \dp.
+ \let\pgfmath@parse@next=\pgfmath@parse@number%
+ \else%
+ \let\pgfmathresult=\pgfmath@number%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+
+% Parse the exponent of a number.
+%
+% REMARK: this method will be overwritten by the FPU library. Please
+% keep changes consistent...
+\def\pgfmath@parse@exponent{%
+ \afterassignment\pgfmath@parse@@exponent%
+ \pgfmath@count\pgfmath@token@next}
+\def\pgfmath@parse@@exponent{%
+ \pgfmathscientific{\pgfmath@number}{\the\pgfmath@count}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \pgfmath@parse@@operator%
+}
+
+% Parse binary or hexadecimal numbers (octal numbers done elsewhere).
+%
+\def\pgfmath@parse@base{%
+ \ifnum\pgfmath@base=2\relax%
+ \let\pgfmath@parse@next=\pgfmath@parse@binary%
+ \else%
+ \ifnum\pgfmath@base=16\relax%
+ \let\pgfmath@parse@next=\pgfmath@parse@hexadecimal%
+ \else%
+ \pgfmath@error{Unexpected numerical base `\pgfmath@base'}{}%
+ \def\pgfmathresult{0}%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \fi%
+ \fi%
+ \let\pgfmath@number=\pgfmath@empty%
+ \expandafter\pgfmath@parse@next\pgfmath@token@next%
+}
+
+\def\pgfmath@parse@binary#1{%
+ \expandafter\ifx\csname pgfmath@token@binary@#1\endcsname\relax%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{2}{10}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \def\pgfmath@token@next{#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \else%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\pgfmath@number#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@binary%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+\def\pgfmath@parse@hexadecimal#1{%
+ \expandafter\ifx\csname pgfmath@token@hexadecimal@#1\endcsname\relax%
+ \expandafter\pgfmathbasetobase\expandafter\pgfmathresult\expandafter{\pgfmath@number}{16}{10}%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \def\pgfmath@token@next{#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \else%
+ \expandafter\def\expandafter\pgfmath@number\expandafter{\pgfmath@number#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@hexadecimal%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+% Parse a function.
+%
+\def\pgfmath@parse@function{\pgfmath@parse@ifbgroup{\pgfmath@parse@function}{\pgfmath@parse@@function}}
+\def\pgfmath@parse@function@{\futurelet\pgfmath@token@let\pgfmath@parse@@function}
+\def\pgfmath@parse@@function{%
+ \ifx\pgfmath@token@let\pgfmath@sptoken%
+ \let\pgfmath@token=\pgfmath@empty%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@@function%
+ \else%
+ \let\pgfmath@parse@next=\pgfmath@parse@@@function%
+ \fi%
+ \pgfmath@parse@next}
+
+\def\pgfmath@parse@@@function#1{%
+ \expandafter\ifx\csname pgfmath@token@functional@\expandafter\string#1\endcsname\relax%
+ \expandafter\ifx\csname pgfmath@token@number@\expandafter\string#1\endcsname\relax%
+ \def\pgfmath@token{#1}% Not from A-Z, a-z, 0-9, or _.
+ \let\pgfmath@parse@next=\pgfmath@parse@@@@function%
+ \else% It is from 0-9.
+ \expandafter\def\expandafter\pgfmath@function\expandafter{\pgfmath@function#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@function@%
+ \fi%
+ \else% It is from A-Z, a-z, or _.
+ \edef\pgfmath@function{\pgfmath@function#1}%
+ \let\pgfmath@parse@next=\pgfmath@parse@function@%
+ \fi%
+ \pgfmath@parse@next}
+
+\def\pgfmath@parse@@@@function{%
+ \expandafter\ifx\csname pgfmath@function@\pgfmath@function\endcsname\relax%
+ \pgfmath@error{Unknown function `\pgfmath@function'}{}%
+ \def\pgfmathresult{0}%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \else%
+ \expandafter\ifnum\csname pgfmath@operation@\pgfmath@function @arity\endcsname=0\relax%
+ % Functions with zero arity are called directly.
+ \csname pgfmath\pgfmath@function @\endcsname%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operator%
+ \else% Otherwise, they are pushed onto the operator stack
+ \expandafter\pgfmath@stack@push@operation\expandafter{\pgfmath@function}%
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \fi%
+ \fi%
+ \expandafter\pgfmath@parse@next\pgfmath@token}
+
+% Parse an operator.
+%
+\def\pgfmath@parse@operator{\pgfmath@parse@ifbgroup{\pgfmath@parse@operator}{\pgfmath@parse@operator@}}%
+\def\pgfmath@parse@operator@#1{% Get one token.
+ \let\pgfmath@token=\pgfmath@token@next%
+ \def\pgfmath@token@next{#1}%
+ \pgfmath@parse@@@operator}
+
+\def\pgfmath@parse@@operator{\pgfmath@parse@ifbgroup{\pgfmath@parse@@operator}{\pgfmath@parse@@operator@}}%
+\def\pgfmath@parse@@operator@#1{% Get first token...
+ \def\pgfmath@token{#1}%
+ \pgfmath@parse@ifbgroup{\pgfmath@parse@@operator@@}{\pgfmath@parse@@operator@@}}%
+\def\pgfmath@parse@@operator@@#1{% ...and second token.
+ \def\pgfmath@token@next{#1}%
+ \pgfmath@parse@@@operator}
+
+\def\pgfmath@parse@@@operator{%
+ \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax%
+ % Not a double character operator.
+ \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\endcsname\relax%
+ % Not a single character operator.
+ \pgfmath@error{Unknown operator `\pgfmath@token' or `\pgfmath@token\pgfmath@token@next'}{}%
+ \def\pgfmathresult{0}%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \else%
+ \expandafter\pgfmath@operation@process\expandafter{\pgfmath@token}%
+ \ifx\pgfmath@token\pgfmath@text@@%
+ \let\pgfmath@parse@next=\pgfmath@parse@end%
+ \else%
+ \expandafter\ifx\csname pgfmath@operation@\pgfmath@token @postfix\endcsname\pgfmath@token%
+ % Postfix operators are followed by an operator.
+ \ifx\pgfmath@token@next\pgfmath@char@leftbracket% Except [.
+ \let\pgfmath@parse@next=\pgfmath@parse@operand%
+ \else%
+ \let\pgfmath@parse@next=\pgfmath@parse@operator%
+ \fi%
+ \else%
+ % Any other operator is followed by an operand.
+ \let\pgfmath@parse@next=\pgfmath@parse@operand%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ % A double character operator...
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmath@token\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmath@token\pgfmath@token@next}%
+ \expandafter\pgfmath@operation@process\expandafter{\pgfmath@token}%
+ % ...is always followed by an operand.
+ \let\pgfmath@parse@next=\pgfmath@parse@@operand%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+
+% Process an operation.
+%
+\def\pgfmath@operation@process#1{%
+ \def\pgfmath@operator{#1}%
+ \ifx\pgfmath@stack@operation@top\pgfmath@stack@empty%
+ \else%
+ \pgfmath@operation@@process%
+ \fi%
+ \expandafter\ifx\csname pgfmath@token@specials@#1\endcsname\relax%
+ \pgfmath@stack@push@operation{#1}%
+ \fi%
+}
+
+% Process the operation stack.
+%
+\def\pgfmath@operation@@process{%
+ \ifx\pgfmath@stack@operation@top\pgfmath@stack@empty%
+ \let\pgfmath@parse@next=\relax%
+ \else%
+ \ifnum\csname pgfmath@operation@\pgfmath@operator @precedence\endcsname>%
+ \csname pgfmath@operation@\pgfmath@stack@operation@top @precedence\endcsname\relax%
+ % If the precedence of the scanned operator is greater than the
+ % precedence of the operator at the top of the stack, do nothing.
+ \let\pgfmath@parse@next=\relax%
+ \else%
+ \let\pgfmath@stack@operation@last=\pgfmath@stack@operation@top%
+ \expandafter\ifx\csname pgfmath@operator@\pgfmath@stack@operation@top\endcsname\relax%
+ \pgfmath@function@@@process%
+ \else%
+ \pgfmath@operator@@@process%
+ \fi%
+ \expandafter\pgfmath@stack@push@operand\expandafter{\pgfmathresult}%
+ \expandafter\ifx\csname pgfmath@token@group@\pgfmath@stack@operation@last\pgfmath@operator\endcsname\relax%
+ \let\pgfmath@parse@next=\pgfmath@operation@@process%
+ \else%
+ \let\pgfmath@parse@next=\relax%
+ \fi%
+ \fi%
+ \fi%
+ \pgfmath@parse@next%
+}
+
+% Process an operator.
+%
+\def\pgfmath@operator@@@process{% Process an operator.
+ \pgfmath@stack@pop@operation\pgfmath@@operator%
+ \pgfmath@stack@pop@operand\pgfmath@operand@a%
+ \ifcase\csname pgfmath@operation@\pgfmath@@operator @arity\endcsname\relax%
+ % Zero arity operators (!).
+ \or%
+ \pgfmath@operator@@@@process{\pgfmath@operand@a}%
+ \or%
+ \pgfmath@stack@pop@operand\pgfmath@operand@b%
+ \pgfmath@operator@@@@process{\pgfmath@operand@b}{\pgfmath@operand@a}%
+ \or%
+ \pgfmath@stack@pop@operand\pgfmath@operand@b%
+ \expandafter\pgfmath@operator@@@@process\expandafter%
+ {\expandafter\pgfmath@operand@b\expandafter}\pgfmath@operand@a%
+ \else%
+ % No operators with more than tenary arity.
+ \fi%
+}
+
+\def\pgfmath@operator@@@@process{%
+ \csname pgfmath%
+ \csname pgfmath@operation@\pgfmath@@operator @name\endcsname%
+ @\endcsname}
+
+% Process a function.
+%
+\def\pgfmath@function@@@process{% Process a function.
+ \ifnum\csname pgfmath@operation@\pgfmath@stack@operation@top @arity\endcsname>0\relax%
+ \pgfmath@stack@pop@operation\pgfmath@@function%
+ \pgfmath@stack@pop@operand\pgfmath@@operand%
+ \ifnum\csname pgfmath@operation@\pgfmath@@function @arity\endcsname>1\relax%
+ \ifnum\csname pgfmath@operation@\pgfmath@@function @arity\endcsname>9\relax%
+ \csname pgfmath\pgfmath@@function @\endcsname{\pgfmath@@operand}%
+ \else%
+ \expandafter\pgfmath@function@@@@process\pgfmath@@operand%
+ \fi
+ \else%
+ \expandafter\pgfmath@function@@@@process\expandafter{\pgfmath@@operand}%
+ \fi%
+ \fi%
+}
+
+\def\pgfmath@function@@@@process{\csname pgfmath\pgfmath@@function @\endcsname}
+
+% Stack.
+%
+\newtoks\pgfmath@stack@operand
+\newtoks\pgfmath@stack@operation
+\let\pgfmath@stack@empty=\pgfmath@empty
+
+\def\pgfmath@stack@push#1#2{%
+ \def\pgfmath@stack@top{#2}%
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmath@stack@top\expandafter}\the#1}}%
+
+\def\pgfmath@stack@pop#1#2{\expandafter\pgfmath@stack@@pop\the#1\pgfmath@stack@stop{#1}{#2}}
+\def\pgfmath@stack@@pop#1#2#3\pgfmath@stack@stop#4#5{\def#5{#1}#4={{#2}#3}\def\pgfmath@stack@top{#2}}
+
+\def\pgfmath@stack@push@operation#1{%
+ \pgfmath@stack@push\pgfmath@stack@operation{#1}%
+ \let\pgfmath@stack@operation@top=\pgfmath@stack@top}
+
+\def\pgfmath@stack@pop@operation#1{%
+ \pgfmath@stack@pop\pgfmath@stack@operation{#1}%
+ \let\pgfmath@stack@operation@top=\pgfmath@stack@top}
+
+% REMARK: This method will be overwritten by the FPU library. Please
+% keep any changes consistent.
+\def\pgfmath@stack@push@operand#1{%
+ \pgfmath@stack@push\pgfmath@stack@operand{#1}%
+ \let\pgfmath@stack@operand@top=\pgfmath@stack@top}
+
+\def\pgfmath@stack@pop@operand#1{%
+ \pgfmath@stack@pop\pgfmath@stack@operand{#1}%
+ \let\pgfmath@stack@operand@top=\pgfmath@stack@top}
+
+
+% Declare an operator for the parser.
+%
+% It is not recommended that new operators be created as
+% the parser is not fully robust for arbitrary operators.
+%
+\def\pgfmathdeclareoperator#1#2#3#4#5{%
+ \ifx\pgfmath@operatorlist\pgfutil@empty
+ \edef\pgfmath@operatorlist{{\string#1}}%
+ \else
+ \edef\pgfmath@operatorlist{\pgfmath@operatorlist,{\string#1}}%
+ \fi
+ \pgfmath@namedef{pgfmath@operator@\string#1}{#1}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@name}{#2}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@arity}{#3}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@#4}{#1}%
+ \pgfmath@namedef{pgfmath@operation@\string#1@precedence}{#5}%
+}
+
+\def\pgfmath@operatorlist{}
+
+\pgfmathdeclareoperator{+}{add} {2}{infix}{500}
+\pgfmathdeclareoperator{-}{subtract}{2}{infix}{500}
+\pgfmathdeclareoperator{*}{multiply}{2}{infix}{700}
+\pgfmathdeclareoperator{/}{divide} {2}{infix}{700}
+\pgfmathdeclareoperator{^}{pow} {2}{infix}{900}
+
+\pgfmathdeclareoperator{<} {} {1}{prefix} {1}
+
+\pgfmathdeclareoperator{>} {greater} {2}{infix} {250}
+\pgfmathdeclareoperator{<} {less} {2}{infix} {250}
+\pgfmathdeclareoperator{==}{equal} {2}{infix} {250}
+\pgfmathdeclareoperator{>=}{notless} {2}{infix} {250}
+\pgfmathdeclareoperator{<=}{notgreater}{2}{infix} {250}
+\pgfmathdeclareoperator{&&}{and} {2}{infix} {200}
+\pgfmathdeclareoperator{||}{or} {2}{infix} {200}
+\pgfmathdeclareoperator{!=}{notequal} {2}{infix} {250}
+\pgfmathdeclareoperator{!} {not} {1}{prefix}{975}
+\pgfmathdeclareoperator{?} {ifthenelse}{3}{infix} {100}
+\pgfmathdeclareoperator{:} {@@collect} {2}{infix}{101}
+
+\pgfmathdeclareoperator{!}{factorial}{1}{postfix}{800}% Must be defined after prefix ! operator.
+\pgfmathdeclareoperator{r}{deg} {1}{postfix}{600}
+
+\pgfmathdeclareoperator{,}{@collect} {2}{infix} {10}
+\pgfmathdeclareoperator{[}{@startindex}{2}{prefix} {7}
+\pgfmathdeclareoperator{]}{@endindex} {0}{postfix}{6}
+\pgfmathdeclareoperator{(}{@startgroup}{1}{prefix} {5}
+\pgfmathdeclareoperator{)}{@endgroup} {0}{postfix}{4}
+
+\pgfmathdeclareoperator{\pgfmath@bgroup}{@startarray}{1}{prefix} {3}
+\pgfmathdeclareoperator{\pgfmath@egroup}{@endarray} {1}{postfix}{2}%
+
+% Special operators.
+\pgfmathdeclareoperator{"}{}{1}{prefix}{1}
+\pgfmathdeclareoperator{@}{}{0}{postfix}{0}
+
+% Internal functions.
+
+% Begin and end parenthesis ().
+%
+\def\pgfmath@startgroup@#1{\pgfmath@protected@edef\pgfmathresult{#1}}
+\def\pgfmath@endgroup@{}% Never actually called.
+
+% Begin and end array access [].
+%
+\def\pgfmath@startindex@#1#2{%
+ \expandafter\pgfmatharray@#1{#2}%
+ \expandafter\pgfmath@bgroup@strip\expandafter{\pgfmathresult}%
+ \ifx\pgfmath@token@let\bgroup%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmathresult}}%
+ \fi}
+\def\pgfmath@endindex@{}% Never actually called.
+
+% Begin and end array {}.
+%
+\def\pgfmath@startarray@#1{\expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{#1}}}
+\def\pgfmath@endarray@#1{\expandafter\def\expandafter\pgfmathresult\expandafter{#1}}% Never actually called.
+
+
+\def\pgfmath@@collect@#1#2{%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmathresult\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter%
+ {\expandafter#1\expandafter}\expandafter{#2}}%
+}
+% Collect items separated by ,.
+%
+\def\pgfmath@collect@#1#2{%
+ \expandafter\def\expandafter\pgfmath@collect@original\expandafter{#1}%
+ \expandafter\pgfmath@bgroup@strip\expandafter{#1}%
+ \ifx\pgfmath@token@let\bgroup%
+ \ifx\pgfmath@collect@original\pgfmath@bgroup@stripped%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmath@bgroup@stripped}%
+ \else%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmath@bgroup@stripped}}%
+ \fi%
+ \else%
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\expandafter{\pgfmath@bgroup@stripped}}%
+ \fi%
+ \expandafter\pgfmath@bgroup@strip\expandafter{#2}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgfmathresult\expandafter\expandafter\expandafter%
+ {\expandafter\pgfmathresult\expandafter{\pgfmath@bgroup@stripped}}%
+}
+
+% Strip braces from a token sequence.
+%
+\def\pgfmath@bgroup@strip#1{%
+ \def\pgfmath@bgroup@strip@last{#1}%
+ \pgfmath@bgroup@@strip{#1}\pgfmath@\pgfmath@@\pgfmath@@@}
+
+\def\pgfmath@bgroup@strip@#1{%
+ \def\pgfmath@bgroup@strip@last{#1}%
+ \pgfmath@bgroup@@strip#1\pgfmath@\pgfmath@@\pgfmath@@@}
+
+\def\pgfmath@bgroup@pgfmath@{\pgfmath@}
+
+\def\pgfmath@bgroup@@strip{%
+ \futurelet\pgfmath@token@let\pgfmath@bgroup@@@strip}
+
+\def\pgfmath@bgroup@@@strip#1#2#3\pgfmath@@@{%
+ \ifx\pgfmath@token@let\bgroup
+ \def\pgfmath@bgroup@test{#2}%
+ \ifx\pgfmath@bgroup@test\pgfmath@bgroup@pgfmath@
+ \def\pgfmath@next{\pgfmath@bgroup@strip@{#1}}%
+ \else
+ \let\pgfmath@bgroup@stripped=\pgfmath@bgroup@strip@last
+ \let\pgfmath@next=\relax
+ \fi
+ \else
+ \pgfmath@bgroup@@@@strip#1#2#3%
+ \let\pgfmath@next=\relax
+ \fi
+ \pgfmath@next}
+
+\def\pgfmath@bgroup@@@@strip#1\pgfmath@\pgfmath@@{%
+ \def\pgfmath@bgroup@stripped{#1}}
+
+% Local Variables:
+% tab-width: 2
+% End:
diff --git a/graphics/pgf/base/tex/pgfmathutil.code.tex b/graphics/pgf/base/tex/pgfmathutil.code.tex
new file mode 100644
index 0000000000..d98ecb25d5
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmathutil.code.tex
@@ -0,0 +1,274 @@
+% Copyright 2007 Mark Wibrow
+%
+% but subject to the LaTeX Project Public License
+% (http://www.latex-project.org/lppl.txt)
+%
+% and the GNU Public License
+% (http://www.gnu.org/licenses/gpl.txt)
+%
+
+% This file defines utilities common to the \pgfmath files.
+%
+% Version 1.414213 29/9/2007
+
+\def\pgfmathincluded{}
+
+% \pgfmath@ensureregister
+%
+% Ensure a control sequence exists as a TeX count/dimen register.
+%
+% #1 - count or dimen.
+% #2 - a control sequence.
+%
+\def\pgfmath@ensureregister#1#2{%
+ \begingroup%
+ \setbox0=\hbox\bgroup\begingroup% In case #2 is a defined macro. Unlikely, but you never know...
+ \afterassignment\pgfmath@@ensureregister%
+ \noexpand#20.0pt\let\pgfmath@temp\relax\relax\pgfmath@#2#1\pgfmath@}
+
+\def\pgfmath@@ensureregister#1#2\pgfmath@#3#4#5\pgfmath@{%
+ \endgroup\egroup%
+ \endgroup%
+ \ifx#4c%
+ \ifx#1.% Already a count register.
+ \else%
+ \csname newcount\endcsname#3% This gets round \outer in plain TeX.
+ \fi%
+ \else%
+ \ifx#4d%
+ \ifx\let#1% Already a dimen register.
+ \else%
+ \csname newdimen\endcsname#3%
+ \fi%
+ \fi%
+ \fi%
+}
+
+% Check registers exist. If not, create them.
+%
+\pgfmath@ensureregister{dimen}{\pgf@x}
+\pgfmath@ensureregister{dimen}{\pgf@xa}
+\pgfmath@ensureregister{dimen}{\pgf@xb}
+\pgfmath@ensureregister{dimen}{\pgf@xc}
+
+\pgfmath@ensureregister{dimen}{\pgf@y}
+\pgfmath@ensureregister{dimen}{\pgf@ya}
+\pgfmath@ensureregister{dimen}{\pgf@yb}
+\pgfmath@ensureregister{dimen}{\pgf@yc}
+
+\pgfmath@ensureregister{dimen}{\pgfutil@tempdima}
+\pgfmath@ensureregister{dimen}{\pgfutil@tempdimb}
+
+\pgfmath@ensureregister{count}{\c@pgf@counta}
+\pgfmath@ensureregister{count}{\c@pgf@countb}
+\pgfmath@ensureregister{count}{\c@pgf@countc}
+\pgfmath@ensureregister{count}{\c@pgf@countd}
+
+\pgfmath@ensureregister{count}{\pgfutil@tempcnta}
+\pgfmath@ensureregister{count}{\pgfutil@tempcntb}
+
+% Alias for \pgfmath.
+%
+\let\pgfmath@x\pgf@x
+\let\pgfmath@xa\pgf@xa
+\let\pgfmath@xb\pgf@xb
+\let\pgfmath@xc\pgf@xc
+
+\let\pgfmath@y\pgf@y
+\let\pgfmath@ya\pgf@ya
+\let\pgfmath@yb\pgf@yb
+\let\pgfmath@yc\pgf@yc
+
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempdimb\pgfutil@tempdimb
+
+\let\c@pgfmath@counta\c@pgf@counta
+\let\c@pgfmath@countb\c@pgf@countb
+\let\c@pgfmath@countc\c@pgf@countc
+\let\c@pgfmath@countd\c@pgf@countd
+
+\let\pgfmath@tempcnta\pgfutil@tempcnta
+\let\pgfmath@tempcntb\pgfutil@tempcntb
+
+% Now check if pgfutil and pgf@sys stuff exists. If it does, fine.
+% Just \let pgfmath versions. If not, define pgfmath versions (Arghhh).
+%
+
+% \...ifnextchar
+%
+\ifx\pgfutil@ifnextchar\pgfmath@undefined%
+ \long\def\pgfmath@ifnextchar#1#2#3{%
+ \let\pgfmath@reserved@d#1%
+ \def\pgfmath@reserved@a{#2}%
+ \def\pgfmath@reserved@b{#3}%
+ \futurelet\pgfmath@let@token\pgfmath@ifnch}
+ \def\pgfmath@ifnch{%
+ \ifx\pgfmath@let@token\pgfmath@sptoken%
+ \let\pgfmath@reserved@c\pgfmath@xifnch%
+ \else%
+ \ifx\pgfmath@let@token\pgfmath@reserved@d%
+ \let\pgfmath@reserved@c\pgfmath@reserved@a%
+ \else%
+ \let\pgfmath@reserved@c\pgfmath@reserved@b%
+ \fi%
+ \fi%
+ \pgfmath@reserved@c}
+ {%
+ \def\:{\global\let\pgfmath@sptoken= } \:
+ \def\:{\pgfmath@xifnch} \expandafter\gdef\: {\futurelet\pgfmath@let@token\pgfmath@ifnch}
+ }%
+\else%
+ \let\pgfmath@ifnextchar\pgfutil@ifnextchar%
+ % Still need to define \pgfmath@sptoken (cannot \let).
+ {%
+ \def\:{\global\let\pgfmath@sptoken= } \:
+ }%
+\fi%
+
+% \...ifundefined
+%
+\ifx\pgfutil@ifundefined\pgfmath@undefined%
+ \long\def\pgfmath@ifundefined#1{%
+ \expandafter\ifx\csname#1\endcsname\relax%
+ \expandafter\pgfmath@firstoftwo%
+ \else%
+ \expandafter\pgfmath@secondoftwo%
+ \fi}%
+\else%
+ \let\pgfmath@ifundefined\pgfutil@ifundefined%
+\fi%
+
+% \...selectfont
+%
+\ifx\pgfutil@selectfont\pgfmath@undefined%
+ \ifx\selectfont\pgfmath@undefined%
+ \let\pgfmath@selectfont\rm% Plain TeX and ConTeXt.
+ \else%
+ \let\pgfmath@selectfont\selectfont% LaTeX.
+ \fi%
+\else%
+ \let\pgfmath@selectfont\pgfutil@selectfont%
+\fi%
+
+% New definition easier than fussing around with let.
+%
+\newif\ifpgfmath@in@
+\def\pgfmath@in@#1#2{%
+ \def\pgfmath@in@@##1#1##2##3\pgfmath@in@@{%
+ \ifx\pgfmath@in@##2\pgfmath@in@false\else\pgfmath@in@true\fi}%
+ \pgfmath@in@@#2#1\pgfmath@in@\pgfmath@in@@}
+
+
+% \...tonumber
+%
+\ifx\pgf@sys@tonumber\pgfmath@undefined%
+ {\catcode`\p=12\catcode`\t=12\gdef\Pgf@geT#1pt{#1}}
+ \def\pgfmath@tonumber#1{\expandafter\Pgf@geT\the#1}
+\else%
+ \let\pgfmath@tonumber\pgf@sys@tonumber%
+\fi%
+
+
+% \PackageWarning and \PackageError
+%
+\ifx\PackageWarning\pgfmath@undefined
+ \def\pgfmath@PackageWarning#1#2{\immediate\write-1{Package #1: Warning! #2.}}%
+\else%
+ \let\pgfmath@PackageWarning\PackageWarning%
+\fi%
+\ifx\PackageError\pgfmath@undefined
+ \def\pgfmath@PackageError#1#2#3{\errmessage{Package #1 Error: #2.}}%
+\else%
+ \let\pgfmath@PackageError\PackageError%
+\fi%
+
+\def\pgfmath@error#1#2{%
+ \pgfmath@PackageError{PGF Math}{%
+ #1%
+ \pgfutil@ifundefined{pgfmath@expression}{}{ (in '\pgfmath@expression')}%
+ }{#2}%
+}
+\def\pgfmath@warning#1{%
+ \pgfmath@PackageWarning{PGF Math}{%
+ #1%
+ \pgfutil@ifundefined{pgfmath@expression}{}{ (in '\pgfmath@expression')}%
+ }%
+}
+
+% \pgfmath@pt
+%
+% Needed to test for 'pt' resulting from expansion using \the.
+%
+{\catcode`\p=12\catcode`\t=12\gdef\PgfmaTh@PT{pt}}
+\edef\pgfmath@pt{\PgfmaTh@PT}%
+
+% \pgfmath@empty
+%
+% A handy macro.
+%
+\def\pgfmath@empty{}
+
+\def\pgfmath@firstoftwo#1#2{#1}
+\def\pgfmath@secondoftwo#1#2{#2}
+
+% \pgfmath@gobbletilpgfmath@
+%
+% Gobble stream until \pgfmath@ {which is undefined}.
+%
+\def\pgfmath@gobbletilpgfmath@#1\pgfmath@{}
+\def\pgfmath@gobbleone#1{}%
+
+
+\def\pgfmath@namedef#1{\expandafter\def\csname#1\endcsname}
+\def\pgfmath@nameedef#1{\expandafter\edef\csname#1\endcsname}
+
+% \pgfmathloop
+%
+% A version of the standard TeX and LaTeX
+% \loop, with an additional macro \pgfmathcounter
+% (which is *not* a TeX counter) which keeps
+% track of the iterations.
+%
+\newif\ifpgfmathcontinueloop
+\def\pgfmathloop#1\repeatpgfmathloop{%
+ \def\pgfmathcounter{1}%
+ \def\pgfmath@iterate{%
+ #1\relax%
+ {% Do this inside a group, just in case...
+ \c@pgfmath@counta\pgfmathcounter%
+ \advance\c@pgfmath@counta1\relax%
+ \xdef\pgfmathloop@temp{\the\c@pgfmath@counta}%
+ }%
+ \edef\pgfmathcounter{\pgfmathloop@temp}%
+ \expandafter\pgfmath@iterate\fi}%
+ \pgfmath@iterate\let\pgfmath@iterate\relax}
+\let\repeatpgfmathloop\fi
+\def\pgfmathbreakloop{\let\pgfmath@iterate\relax}%
+
+% \pgfmath@returnone
+%
+% #1 - a dimension representing a number or dimension.
+%
+% Changed by TT: made faster and simpler since it is used
+% *heavily*. #1 must be something that can be assigned to a
+% dimension.
+%
+\def\pgfmath@returnone#1\endgroup{%
+ \pgfmath@x#1%
+ \edef\pgfmath@temp{\pgfmath@tonumber{\pgfmath@x}}%
+ \expandafter\endgroup\expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmath@temp}%
+}
+
+\let\pgfmathreturn=\pgfmath@returnone
+
+% \pgfmath@smuggleone
+%
+% Smuggle a macro outside a group.
+%
+% Changed by TT: Speedup by insisting, that smuggleone is directly
+% followed by \endgroup
+%
+\def\pgfmath@smuggleone#1\endgroup{%
+ \expandafter\endgroup\expandafter\def\expandafter#1\expandafter{#1}}
+
+\let\pgfmathsmuggle=\pgfmath@smuggleone
diff --git a/graphics/pgf/base/tex/pgfmoduleanimations.code.tex b/graphics/pgf/base/tex/pgfmoduleanimations.code.tex
new file mode 100644
index 0000000000..d4e82cb1af
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduleanimations.code.tex
@@ -0,0 +1,1314 @@
+% Copyright 2015 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmoduleanimations.code.tex}
+
+
+% We need the animation system abstraction:
+
+\input pgfsysanimations.code.tex
+
+
+% Animate an attribute over time
+%
+% #1 = an attribute
+% #2 = configuration keys
+%
+% This command adds animation commands for the attribute given in #1
+% of some future object to the current graphic scope. For instance,
+% when #1 is "fill opacity" then the fill opacity of the object will
+% change over time. The object to which the command refers is
+% specified using a special key in #2.
+%
+% The keys in #2 specify how the changes occur over time. There are a
+% number of keys that have an effect on the animation "as a whole"
+% (like "repeats") while the most central key is the entry key. This
+% key takes two parameters: a time and a value. It specifies that at
+% the given time the attribute should have the specified value. The
+% times must be given in ascending order. Between the times given in
+% this way, the values of the attribute will be interpolated; you can
+% influence the details of how this interpolation is done using
+% additional keys.
+%
+% The keys in #2 are given in key-value syntax and can be given in any
+% order, except that the entry keys must be given in order of
+% ascending times.
+%
+% The syntax of the second parameter of the entry key depends on
+% #1. Currently, these are:
+%
+% Attribute Value Type
+% ---------------------------------------
+% fill opacity scalar
+% stroke opacity scalar
+% opacity scalar
+% visible boolean
+% line width dimension
+% fill color
+% stroke color
+% motion motion
+% translate point
+% scale scaling
+% rotate scalar
+% xskew scalar
+% yskew scalar
+% path path
+% softpath softpath
+% view viewbox
+% dash phase dimension
+% dash pattern dashpattern
+% none any
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{entry={0s}{1}, entry={2s}{0}}
+
+\def\pgfanimateattribute#1#2{%
+ \pgfanimateattributecode{#1}{\pgfkeys{/pgf/animation/.cd,#2}}%
+}%
+
+
+% Variant of \pgfanimateattribute
+%
+% #1 = attribute
+% #2 = code
+%
+% Description:
+%
+% A version of \pgfanimateattribute where instead of keys #2 you
+% provide a code #2 that calls the animation keys itself.
+
+\def\pgfanimateattributecode#1#2{%
+ {%
+ \pgfkeys{/pgf/@animation attributes/.cd,#1}%
+ #2%
+ \csname pgf@animation@check@\pgf@animation@attribute\endcsname%
+ \pgfsysanimate{\pgf@animation@attribute}%
+ }%
+}%
+
+
+
+% Create a time snapshot
+%
+% #1 = a time
+%
+% Description:
+%
+% This command should be called in a scope prior to all calls of
+% animation commands in that scope. When called, all animations will
+% be "intercepted" and, instead of creating the animation code, normal
+% code will be generated that shows the state of the animation at the
+% specified "moment" #1. Since no animation code is involved, this
+% works with all drivers.
+%
+% The command \pgfsnapshotafter works the same way as \pgfsnapshot,
+% only the timing is slightly different: Conceptually, #1 is
+% interpreted as "#1+epsilon". For instance, if there are two values
+% specified for the time #1, then \pgfsnapshot will use the first
+% while \pgfsnapshotafter will use the second. Likewise, when an
+% animation ends at time #1, \pgfsnapshot will still us the
+% animation's value, while \pgfsnapshotafter will not.
+%
+% Example:
+%
+% {
+% \pgfsnapshot{1.2s}
+% \pgfanimateattribute{fill opacity}{entry={0s}{1}, entry={2s}{0}}
+% \fill (0,0) rectangle (1,1);
+% }
+
+\def\pgfsnapshot#1{\pgfparsetime{#1}\expandafter\pgfsysanimsnapshot\expandafter{\pgftimeresult}}%
+\def\pgfsnapshotafter#1{\pgfparsetime{#1}\expandafter\pgfsysanimsnapshotafter\expandafter{\pgftimeresult}}%
+
+
+% The animation attributes
+
+\pgfkeys{/pgf/@animation attributes/.cd,
+ visible/.code=\pgf@animate@attr{visibility}{mapped}\def\pgf@anim@map@true{visible}\def\pgf@anim@map@false{hidden},
+ stage/.code=\pgf@animate@attr{visibility}{mapped}\def\pgf@anim@map@true{visible}\def\pgf@anim@map@false{hidden}\pgfsysanimkeybase\pgfsysanimvaltext{hidden},
+ opacity/.code=\pgf@animate@attr{opacity}{scalar},
+ fill opacity/.code=\pgf@animate@attr{fillopacity}{scalar},
+ draw opacity/.code=\pgf@animate@attr{strokeopacity}{scalar},
+ stroke opacity/.style=draw opacity,
+ line width/.code=\pgf@animate@attr{linewidth}{dimension},
+ fill/.code=\pgf@animate@attr{fillcolor}{color},
+ draw/.code=\pgf@animate@attr{strokecolor}{color},
+ color/.code=\pgf@animate@attr{color}{color},
+ stroke/.style=draw,
+ motion/.code=\pgf@animate@attr{motion}{scalar},
+ translate/.code=\pgf@animate@attr{translate}{point},
+ scale/.code=\pgf@animate@attr{scale}{scaling},
+ rotate/.code=\pgf@animate@attr{rotate}{scalar},
+ xskew/.code=\pgf@animate@attr{skewx}{scalar},
+ yskew/.code=\pgf@animate@attr{skewy}{scalar},
+ skew x/.style=xskew,
+ skew y/.style=yskew,
+ path/.code=\pgf@animate@attr{path}{path},
+ softpath/.code=\pgf@animate@attr{path}{softpath},
+ view/.code=\pgf@animate@attr{viewbox}{viewbox},
+ dash/.code=\pgf@animate@attr{dash}{dash},
+ none/.code=\pgf@animate@attr{none}{none},
+}%
+
+\def\pgf@animate@attr#1#2{%
+ \def\pgf@animation@attribute{#1}%
+ \expandafter\let\expandafter\pgfanim@type@parser\csname pgfanim@parse@type@#2\endcsname%
+}%
+
+
+
+% The time parser
+%
+% #1 = a time
+%
+% This macro parses the time in #1, but adds some support for times:
+%
+% 1) The postfix operator "s" is added, which has no effect.
+% 2) The postfix operator "ms" is added, which divides a number by
+% 1000, so "2ms" equals "0.002".
+% 3) The postfix operator "min" is added, which multiplies a number by
+% 60.
+% 4) The postfix operator "h" is added, which multiplies a number by
+% 3600.
+% 5) The infix operator ":" is redefined, so that it multiplies its
+% first argument by 60 and adds the second. This implies that
+% "1:20" equals "80" and "01:00:00" equals "3600".
+% 6) The parsing of octal numbers is switched off to allow things like
+% "01:08" for 68s.
+
+\def\pgfparsetime#1{%
+ \begingroup%
+ \pgfmathdeclareoperator{s}{@seconds}{1}{postfix}{600}%
+ \pgfmathdeclareoperator{m}{m@encountered}{1}{postfix}{600}%
+ \pgfmathdeclareoperator{i}{i@encountered}{1}{postfix}{600}%
+ \pgfmathdeclareoperator{n}{@minutes}{1}{postfix}{600}%
+ \pgfmathdeclareoperator{h}{@hours}{1}{postfix}{600}%
+ \pgfmathdeclareoperator{:}{time@colon}{2}{infix}{50}%
+ \pgfmath@octalparsingfalse%
+ \pgfmathparse{#1}%
+ \expandafter\endgroup%
+ \expandafter\def\expandafter\pgftimeresult\expandafter{\pgfmathresult}%
+}%
+
+\newif\ifpgfanim@m@encountered
+\newif\ifpgfanim@i@encountered
+\pgfmathdeclarefunction{@seconds}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \ifpgfanim@m@encountered%
+ \divide\pgfmath@x by1000\relax%
+ \fi%
+ \global\pgfanim@m@encounteredfalse%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+\pgfmathdeclarefunction{m@encountered}{1}{%
+ \global\pgfanim@m@encounteredtrue%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+\pgfmathdeclarefunction{i@encountered}{1}{%
+ \ifpgfanim@m@encountered%
+ \global\pgfanim@m@encounteredfalse%
+ \global\pgfanim@i@encounteredtrue%
+ \else%
+ \pgfmath@error{Unexpected i}{}%
+ \fi%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+\pgfmathdeclarefunction{@minutes}{1}{%
+ \ifpgfanim@i@encountered%
+ \global\pgfanim@i@encounteredfalse%
+ \else%
+ \pgfmath@error{Unexpected n}{}%
+ \fi%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@x60\pgfmath@x\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+\pgfmathdeclarefunction{@hours}{1}{%
+ \begingroup%
+ \expandafter\pgfmath@x#1pt\relax%
+ \pgfmath@x3600\pgfmath@x\relax%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+\pgfmathdeclarefunction{time@colon}{2}{%
+ \begingroup%
+ \pgfmath@x=#1pt\relax%
+ \pgfmath@x=60\pgfmath@x\relax%
+ \pgfmath@y=#2pt\relax%
+ \advance\pgfmath@x by\pgfmath@y%
+ \pgfmath@returnone\pgfmath@x%
+ \endgroup%
+}%
+
+
+
+% Sets general animation attributes
+%
+% #1 = key-value pairs that are executed for the path /pgf/animation/
+
+\def\pgfanimationset{\pgfqkeys{/pgf/animation}}%
+
+
+% Sets the target animation scope that should be animated.
+%
+% #1 = A name that will be used with an idscope.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{whom=some scope, entry={0s}{1}, entry={1s}{0}}
+% \begin{scope}[name=some scope]
+% \draw (0,0) -- (1,1);
+% \draw (1,0) -- (2,1);
+% \end{scope}
+
+\pgfanimationset{
+ whom/.code={%
+ \pgf@anim@decomp{#1}%
+ \pgfidrefnextuse\pgf@anim@id\pgf@anim@id@name%
+ \expandafter\expandafter\expandafter\pgfsysanimkeywhom\expandafter\expandafter\expandafter{\expandafter\pgf@anim@id\expandafter}\expandafter{\pgf@anim@type}%
+ \let\pgf@anim@whom@id\pgf@anim@id%
+ \let\pgf@anim@whom@type\pgf@anim@type%
+ }
+}%
+
+\def\pgf@anim@decomp#1{%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@in@\expandafter.\expandafter{\pgf@temp}%
+ \ifpgfutil@in@%
+ \expandafter\pgf@anim@decomp@\pgf@temp\pgf@stop%
+ \else%
+ \expandafter\pgf@anim@decomp@\pgf@temp.\pgf@stop%
+ \fi%
+}%
+\def\pgf@anim@decomp@#1.#2\pgf@stop{%
+ \def\pgf@anim@id@name{#1}%
+ \def\pgf@anim@type{#2}%
+}%
+
+
+% Assigns a name to this animation so that it can be used as an event
+% id in another animation
+%
+% #1 = A name
+%
+% The name "previous" is special and always refers to the most recent
+% animation before the animation currently being constructed.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{name=anim 1, entry={0s}{1}, entry={1s}{0}}
+% \pgfanimateattribute{fill opacity}{begin on={end,of=anim 1}, entry={0s}{1}, entry={1s}{0}}
+
+\pgfanimationset{
+ name/.code=\pgfuseid{#1},
+}%
+
+
+
+
+% Configures whether an animation can be restarted
+%
+% Some animations can restart when certain events take place. This key
+% configures this. Setting it to
+%
+% "true" allows a restart at any time,
+% "false" does not allow a restart,
+% "when not active" allows a restart only, when the element is not
+% active.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{entry={0s}{1}, entry={1s}{0}, restart=false}
+
+\pgfanimationset{
+ restart/.is choice,
+ restart/.default=true,
+ restart/true/.code=\pgfsysanimkeyrestartalways,
+ restart/false/.code=\pgfsysanimkeyrestartnever,
+ restart/never/.code=\pgfsysanimkeyrestartnever,
+ restart/when not active/.code=\pgfsysanimkeyrestartwhennotactive,
+}%
+
+
+% Sets the number times an animation should repeat
+%
+% #1 = A string of the following form:
+%
+% [<empty> | <number> | for <time>] ["accumulating"]
+%
+% When empty (the default value) the animation repeats forever.
+%
+% When a <number> is provided, the animation will repeat <number>
+% times, which need not be an integer.
+%
+% When a <time> is given, the repeating will stop after this much time.
+%
+% When the optional "accumulating" is specified, the repeat
+% accumulates, otherwise each repeat begins with the original start
+% value.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{repeats, entry={0s}{1}, entry={6s}{0}}
+% \pgfanimateattribute{fill opacity}{repeats=2, entry={0s}{1}, entry={6s}{0}}
+% \pgfanimateattribute{fill opacity}{repeats=2 accumulating, entry={0s}{1}, entry={6s}{0}}
+% \pgfanimateattribute{fill opacity}{repeats=for 15s, entry={0s}{1}, entry={6s}{0}}
+
+\pgfanimationset{
+ repeats/.code={%
+ \pgfutil@in@{accumulating\pgf@stop}{#1\pgf@stop}%
+ \ifpgfutil@in@%
+ \pgfsysanimkeyaccumulate%
+ \pgfanim@parse@acc#1\pgf@stop%
+ \else%
+ \pgfsysanimkeynoaccumulate%
+ \pgfanim@parse@noacc{#1}%
+ \fi%
+ },
+ repeats/.default=,
+ repeat/.style={repeats={#1}},
+ repeat/.default=,
+}%
+\def\pgfanim@parse@acc#1accumulating\pgf@stop{%
+ \pgfanim@parse@noacc{#1}%
+}%
+\def\pgfanim@parse@noacc#1{%
+ \pgfutil@in@{\pgf@stop for}{\pgf@stop#1}%
+ \ifpgfutil@in@%
+ \pgfanim@parse@for#1\pgf@stop%
+ \else%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \pgfsysanimkeyrepeatindefinite%
+ \else%
+ \pgfmathparse{#1}%
+ \expandafter\pgfsysanimkeyrepeat\expandafter{\pgfmathresult}%
+ \fi%
+ \fi%
+}%
+\def\pgfanim@parse@for for#1\pgf@stop{\pgfparsetime{#1}\expandafter\pgfsysanimkeyrepeatdur\expandafter{\pgftimeresult}}%
+
+
+
+
+
+% Specifies that an animation should begin or end at a certain time
+% (relative to the current context). The "begin..." options may be
+% used multiple times and their effects accumulate, likewise for the
+% "end..." options.
+%
+% #1 = A time
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{begin=2s, end=2.5s, entry={0s}{1}, entry={1s}{0}}
+
+\pgfanimationset{
+ begin/.code=\pgfparsetime{#1}\expandafter\pgfsysanimkeyoffset\expandafter{\pgftimeresult}{begin},
+ end/.code=\pgfparsetime{#1}\expandafter\pgfsysanimkeyoffset\expandafter{\pgftimeresult}{end},
+}%
+
+
+
+% Specifies that an animation should begin (or end) when a certain
+% event takes place.
+%
+% #1 = A list of key-value pairs.
+%
+% The following keys are allowed:
+%
+% event=some event : The begin / end is triggered by that event. The
+% list of allowed events is defined in the SVG
+% standard.
+% of=some name : The event does not refer to the current group,
+% but to the object named "some name", which must
+% previously have been named \pgfuseid. If some
+% name contains a period, the part before the
+% period must be the name of the id, the part
+% following it the type of the id.
+% key=some key : The trigger is some key being pressed
+% repeat=number : The trigger is that an animation has been
+% repeated number times.
+% delay=time : A delay, may be negative.
+%
+% These keys are executed with the path prefix /pgf/animation/events.
+%
+% Some of them are predefined:
+%
+% "click" is a shorthand for "event=click"
+% "focus in" is a shorthand for "event=focusin"
+% "focus out" is a shorthand for "event=focusout"
+% "activate" is a shorthand for "event=activate"
+% "mouse down" is a shorthand for "event=mousedown"
+% "mouse up" is a shorthand for "event=mouseup"
+% "mouse over" is a shorthand for "event=mouseover"
+% "mouse move" is a shorthand for "event=mousemove"
+% "mouse out" is a shorthand for "event=mouseout"
+% "begin" is a shorthand for "event=begin"
+% "end" is a shorthand for "event=end"
+%
+% Example:
+%
+% % Begin after 5s or when clicked:
+% \pgfanimateattribute{fill opacity}{begin=5s, begin on=click, entry={0s}{1}, entry={1s}{0}}
+%
+% % Begin, when an object named "button" is clicked
+% \pgfanimateattribute{fill opacity}{begin on={click, of=button}, entry={0s}{1}, entry={1s}{0}, name=another animation}
+%
+% % Begin 1s after some other animation ends
+% \pgfanimateattribute{fill opacity}{begin on={end, of=another animation, delay=1s}, entry={0s}{1}, entry={1s}{0}}
+
+\pgfanimationset{
+ begin on/.code={\pgfanim@make@event{#1}{begin}},%
+ end on/.code={\pgfanim@make@event{#1}{end}},
+}%
+
+\def\pgfanim@make@event#1#2{%
+ \let\pgfanim@event@event\pgfutil@empty%
+ \let\pgf@anim@id\pgfutil@empty%
+ \let\pgf@anim@type\pgfutil@empty%
+ \let\pgfanim@event@key\pgfutil@empty%
+ \let\pgfanim@event@repeat\pgfutil@empty%
+ \let\pgfanim@event@delay\pgfutil@empty%
+ \pgfkeys{/pgf/animation/events/.cd,#1}%
+ \ifx\pgfanim@event@key\pgfutil@empty%
+ \ifx\pgfanim@event@repeat\pgfutil@empty%
+ \ifx\pgfanim@event@event\pgfutil@empty%
+ \pgferror{No event specified}%
+ \else%
+ \pgfsysanimkeyevent{\pgf@anim@id}{\pgf@anim@type}{\pgfanim@event@event}{\pgfanim@event@delay}{#2}%
+ \fi%
+ \else%
+ \pgfsysanimkeyrepeatevent{\pgf@anim@id}{\pgf@anim@type}{\pgfanim@event@repeat}{\pgfanim@event@delay}{#2}%
+ \fi%
+ \else%
+ \pgfsysanimkeyaccesskey{\pgfanim@event@key}{\pgfanim@event@delay}{#2}%
+ \fi%
+}%
+
+\pgfkeys{/pgf/animation/events/.cd,
+ event/.store in=\pgfanim@event@event,
+ of/.code={%
+ \pgf@anim@decomp{#1}%
+ \pgfidrefprevuse\pgf@anim@id\pgf@anim@id@name%
+ \ifx\pgf@anim@id\pgfutil@empty%
+ \pgferror{Unknown object/node name '\pgf@anim@id@name'. Did you
+ mean 'of next=\pgf@anim@id@name'?}%
+ \fi%
+ },
+ of next/.code={%
+ \pgf@anim@decomp{#1}%
+ \pgfidrefnextuse\pgf@anim@id\pgf@anim@id@name%
+ },
+ of id/.code=\def\pgf@anim@id{#1},
+ key/.store in=\pgfanim@event@key,
+ repeat/.code=\pgfmathparse{#1}\let\pgfanim@event@repeat\pgfmathresult,
+ delay/.code=\pgfparsetime{#1}\let\pgfanim@event@delay\pgftimeresult,
+ click/.style={event=click},
+ focus in/.style={event=focusin},
+ focus out/.style={event=focusout},
+ mouse down/.style={event=mousedown},
+ mouse up/.style={event=mouseup},
+ mouse over/.style={event=mouseover},
+ mouse move/.style={event=mousemove},
+ mouse out/.style={event=mouseout},
+ begin/.style={event=begin},
+ end/.style={event=end},
+}%
+
+
+% Specifies the timeline start for a snapshot
+%
+% #1 = a time
+%
+% Description:
+%
+% What a snapshot is taken of an animation (using \pgfsnapshot), all
+% animations normally start at time 0s. When this key is used, the
+% animation's timeline start is considered to be at moment #1
+% instead.
+
+\pgfanimationset{
+ begin snapshot/.code=
+ \pgfparsetime{#1}\expandafter\pgfsysanimkeysnapshotstart\expandafter{\pgftimeresult}
+}%
+
+
+% Specifies the origin for transforming animations
+%
+% #1 = a pgf point
+%
+% Specifies the origin of transformations (for instance, a rotate will
+% rotate around this point).
+%
+% Example:
+%
+% \pgfanimateattribute{rotate}{entry={0s}{0}, entry={1s}{90}, origin=\pgfpoint{1cm}{1cm}}
+
+\pgfanimationset{
+ origin/.code={%
+ \pgf@process{#1}%
+ \edef\pgf@marshal{%
+ \noexpand\pgfsysanimkeycanvastransform%
+ {\noexpand\pgftransformshift{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}{\noexpand\pgflowlevelsynccm}}%
+ {\noexpand\pgftransforminvert\noexpand\pgflowlevelsynccm}%
+ \noexpand\pgf@anim@save@transform{\noexpand\pgftransformshift{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ }%
+ \pgf@marshal%
+ },
+}%
+
+\pgfsysanimkeycanvastransform{{\pgflowlevelsynccm}}{\pgftransforminvert\pgflowlevelsynccm}%
+
+
+
+% Specifies the transforming for the animation coordinate system
+%
+% #1 = code that changes the pgf coordinate system
+%
+% Specifies an additional transformation of the coordinate system for
+% animations.
+%
+% Example:
+%
+% \pgfanimateattribute{shift}{entry={0s}{\pgfpointorigin}, entry={1s}{\pgfpoint{1cm}{0cm}}, transform=\pgftransformrotate{30}}
+
+\pgfanimationset{
+ transform/.code={%
+ \pgfsysanimkeycanvastransform{#1{\pgflowlevelsynccm}}{\pgftransforminvert\pgflowlevelsynccm}%
+ \pgf@anim@save@transform{#1}%
+ },
+}%
+
+
+
+% Specifies a motion path.
+%
+% #1 = pgf commands for constructing a path
+%
+% Use this key to specify a motion path for the motion attribute. The
+% values of the "entry" key specify fractions along this path.
+%
+% Example:
+%
+% \pgfanimateattribute{motion}{
+% entry={0s}{0}, entry={1s}{1},
+% along=\pgfpathmoveto{\pgfpointorigin} \pgfpathlineto{\pgfpoint{1cm}{1cm}}
+% }
+
+\pgfanimationset{
+ along/.code=%
+ {%
+ \pgfsyssoftpath@getcurrentpath\pgfanim@save@path%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ #1%
+ \pgfsyssoftpath@getcurrentpath\pgfanim@the@path%
+ \global\let\pgfanim@the@path\pgfanim@the@path%
+ \pgfsyssoftpath@setcurrentpath\pgfanim@save@path%
+ }%
+ \expandafter\pgf@anim@protocol@path@size\pgfanim@the@path\pgf@stop%
+ \expandafter\pgfsysanimkeymovealong\expandafter{\pgfanim@the@path}%
+}%
+
+
+% Specifies a motion soft path.
+%
+% #1 = a pgf soft path (result of calling \pgfsyssoftpath@getcurrentpath)
+%
+% Use this key to specify a motion path for the motion attribute when
+% a softpath has already been constructed.
+%
+% Example:
+%
+% \pgfanimateattribute{motion}{entry={0s}{0}, entry={1s}{1},
+% along softpath=\pgfsyssoftpath@movetotoken {0pt}{0pt}\pgfsyssoftpath@linetotoken {10pt}{10pt}}
+
+\pgfanimationset{
+ along softpath/.code=%
+ \pgf@anim@protocol@path@size#1\pgf@stop%
+ \pgfsysanimkeymovealong{#1}%
+}%
+
+
+\def\pgf@anim@protocol@path@size{%
+ \pgfutil@ifnextchar\pgf@stop\relax\pgf@anim@protocol@path@size@%
+}%
+\def\pgf@anim@protocol@path@size@#1#2#3{%
+ \pgf@protocolanimsizes@direct{#2}{#3}%
+ \pgf@anim@protocol@path@size%
+}%
+
+
+% Configures whether the motion is rotated along the path.
+%
+% Example:
+%
+% \pgfanimateattribute{motion}{rotate along, entry={0s}{0}, entry={1s}{1},
+% along=\pgfpathmoveto{\pgfpointorigin} \pgfpathlineto{\pgfpoint{1cm}{1cm}}}
+
+\pgfanimationset{
+ rotate along/.is choice,
+ rotate along/.default=true,
+ rotate along/true/.code=\pgfsysanimkeyrotatealong,
+ rotate along/false/.code=\pgfsysanimkeynorotatealong,
+}%
+
+
+
+% Specifies an entry
+%
+% #1 = A time. This time will be parsed using \pgfparsetime
+% #2 = A value. The format of this value depends on the current type
+% of the animation attribute. (So for an animation of the "fill
+% opacity", #1 must be a scalar value, for an animation of the "fill"
+% color, #1 must be a color, and so on.)
+% If #2 is the special text "current value", then the current
+% value will be used. For SVG, this is allowed only when exactly
+% two entries are specified and this special value is used for
+% the first one.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{entry={0s}{0}, entry={1s}{1}}
+
+\pgfanimationset{entry/.code 2 args=\pgf@anim@entry{#1}{#2}}%
+\def\pgf@anim@entry#1#2{%
+ \pgf@anim@entry@giventrue%
+ \pgfparsetime{#1}%
+ \edef\pgf@marshal{\noexpand\pgfsysanimkeytime{\pgftimeresult}\pgf@anim@entry@spline\pgf@anim@exit@spline}%
+ \pgf@marshal%
+ \def\pgf@temp{#2}%
+ \ifx\pgf@temp\pgf@special@current@text%
+ \pgfsysanimvalcurrent%
+ \else%
+ \pgfanim@type@parser{#2}%
+ \fi%
+}%
+\def\pgf@special@current@text{current value}%
+\newif\ifpgf@anim@entry@given
+
+
+% Specifies a base value
+%
+% #1 = A value. The format is as for the entry key.
+%
+% Description:
+%
+% Will set the "base" value of the animation, which is a value that is
+% used when the animation is not active.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{base = 0.5, entry={0s}{0.5}, entry={1s}{1}}
+
+\pgfanimationset{base/.code=\pgf@anim@base{#1}}%
+\def\pgf@anim@base#1{%
+ \pgfsysanimkeybase%
+ \pgfanim@type@parser{#1}%
+}%
+
+
+% Specifies that there is an entry "at infinity".
+%
+% When an animation ends, its "effect" can either persist or it can be
+% removed. Setting "freeze at end" to true will cause it to persist,
+% otherwise it will be removed.
+%
+% Example:
+%
+% \pgfanimateattribute{fill opacity}{entry={0s}{1}, entry={1s}{0}, freeze at end}
+
+\pgfanimationset{
+ freeze at end/.is choice,
+ freeze at end/.default=true,
+ freeze at end/true/.code=\pgfsysanimkeyfreezeatend,
+ freeze at end/false/.code=\pgfsysanimkeyremoveatend,
+}%
+
+
+
+% Specifies an entry or exit spline control
+%
+% #1 = time fraction
+% #2 = attribute fraction
+%
+% Description:
+%
+% Suppose that an animation is supposed to interpolate a attribute's
+% value between the two values "50" and "100" over a time of 10s. The
+% simplest way of doing so is to do a linear interpolation, where the
+% value as, say, 1s is 55, at 2s it is 60, and so on.
+%
+% Unfortunately, the linear interpolation does not "look" nice in many
+% cases since the acceleration of a linear interpolation is zero
+% during the animation, but infinite at the beginning and at the end;
+% which looks "jerky".
+%
+% To avoid this, you can specify that the time--attribute curve should
+% not be a straight line, but rather a curve. You specify this curve
+% using a spline.
+%
+% The most logical "coordinate rectangle" used for this spline in our
+% example would be (0s,50) and (10s,100) and we would like to specify
+% something like "(0s,50) .. controls (5s,50) and (9s,100)
+% .. (10s,100)". This would result in a time--attribute curve where
+% the attribute at 50 changes slowly at 0s and also arrives slowly at
+% 100 at 10s, but speeds up between these values.
+%
+% We call the first control point (5s,50) the "exit control" and call
+% (9s,100) the "entry control": The first control dictates how quickly
+% or slowly a time point is left, the second dictates how quickly or
+% slowly we enter the next one.
+%
+% The control points are, however, not specified in the coordinate
+% system indicated above. Rather, the rectangle (0s,50) to (10s, 100),
+% gets normalized to (0,0) to (1,1). The control point (5s,50) would
+% thus become (0.5,0) and (9s,100) becomes (0.9,1).
+%
+% Example:
+%
+% \pgfanimateattribute{rotate}{
+% exit control={0.5}{0},
+% entry control={0.9}{1},
+% entry={0s}{50},
+% entry={10s}{100}}
+
+\pgfanimationset{
+ entry control/.code 2 args={%
+ \pgfmathsetmacro\pgf@temp@t{#1}%
+ \pgfmathsetmacro\pgf@temp@a{#2}%
+ \edef\pgf@anim@entry@spline{{\pgf@temp@t}{\pgf@temp@a}}%
+ },
+ exit control/.code 2 args={%
+ \pgfmathsetmacro\pgf@temp@t{#1}%
+ \pgfmathsetmacro\pgf@temp@a{#2}%
+ \edef\pgf@anim@exit@spline{{\pgf@temp@t}{\pgf@temp@a}}%
+ },
+ stay/.code=\let\pgf@anim@exit@spline\pgfsys@stay@text,%
+ jump/.code=\let\pgf@anim@entry@spline\pgfsys@jump@text,%
+ linear/.style={entry control={1}{1},exit control={0}{0}},
+}%
+\def\pgf@anim@entry@spline@base{{1}{1}}%
+\def\pgf@anim@exit@spline@base{{0}{0}}%
+
+\def\pgf@anim@reset@linear{\let\pgf@anim@entry@spline\pgf@anim@entry@spline@base\let\pgf@anim@exit@spline\pgf@anim@exit@spline@base}%
+\pgf@anim@reset@linear
+
+
+
+% Specifies how much arrow tips should be shortened (as in
+% \pgfsetshortenstart)
+%
+% #1 = an additional shortening distance the path start.
+%
+% Description:
+%
+% Works like \pgfsetshortenstart, only for animated paths.
+
+\pgfanimationset{
+ shorten </.code={%
+ \ifpgf@anim@entry@given%
+ \pgferror{You must specify shorten < prior to the path entries}%
+ \else%
+ \pgfmathsetmacro\pgf@anim@marker@extra@shorten@start{#1}%
+ \edef\pgf@anim@marker@extra@shorten@start{\pgf@anim@marker@extra@shorten@start pt}%
+ \fi%
+ },
+ shorten >/.code={%
+ \ifpgf@anim@entry@given%
+ \pgferror{You must specify shorten < prior to the path entries}%
+ \else%
+ \pgfmathsetmacro\pgf@anim@marker@extra@shorten@end{#1}%
+ \edef\pgf@anim@marker@extra@shorten@end{\pgf@anim@marker@extra@shorten@end pt}%
+ \fi%
+ },
+}%
+\def\pgf@anim@marker@extra@shorten@start{0pt}%
+\def\pgf@anim@marker@extra@shorten@end{0pt}%
+\def\pgf@anim@marker@shorten@start{0pt}%
+\def\pgf@anim@marker@shorten@end{0pt}%
+
+% Specifies the arrow tips used for path animations
+%
+% #1 = an arrow specification of the form <start>-<end> as for the
+% command \pgfsetarrows
+%
+% Description:
+%
+% Specifies arrow tips that are used in a path animation. Note that in
+% order to set the arrow tips of a path that is animated, you always
+% have to use this command. In particular, you should *not* set arrow
+% tips for the to-be-animated path, but use this key and the base key
+% to install a base path with arrow tips.
+
+\pgfanimationset{
+ arrows/.code={%
+ \ifpgf@anim@entry@given%
+ \pgferror{You must specify animation arrows prior to the path entries}%
+ \else%
+ \pgf@anim@parser@arrows#1\pgf@stop%
+ \fi%
+ },
+}%
+
+\def\pgf@anim@parser@arrows#1-#2\pgf@stop{%
+ \pgf@anim@prepare@arrow@start{#1}%
+ \pgf@anim@prepare@arrow@end{#2}%
+ \expandafter\expandafter\expandafter\pgfsysanimkeytipmarkers\expandafter\expandafter\expandafter{\expandafter\pgf@anim@marker@id@start\expandafter}\expandafter{\pgf@anim@marker@id@end}%
+}%
+
+\def\pgf@anim@prepare@arrow@start#1{%
+ \def\pgf@anim@temp{#1}%
+ \ifx\pgf@anim@temp\pgfutil@empty%
+ \let\pgf@anim@marker@id@start\pgfutil@empty%
+ \def\pgf@anim@marker@shorten@start{0pt}%
+ \else%
+ {%
+ \pgfsetarrowsstart{#1}%
+ \pgf@anim@prep@marker@arrow\pgf@start@tip@sequence\pgf@anim@marker@id\pgf@anim@marker@shorten%
+ \global\let\pgf@anim@marker@id@start\pgf@anim@marker@id%
+ \global\let\pgf@anim@temp\pgf@anim@marker@shorten%
+ }%
+ \let\pgf@anim@marker@shorten@start\pgf@anim@temp%
+ \fi%
+}%
+
+\def\pgf@anim@prepare@arrow@end#1{%
+ \def\pgf@anim@temp{#1}%
+ \ifx\pgf@anim@temp\pgfutil@empty%
+ \let\pgf@anim@marker@id@end\pgfutil@empty%
+ \def\pgf@anim@marker@shorten@end{0pt}%
+ \else%
+ {%
+ \pgfsetarrowsend{#1}%
+ \pgf@anim@prep@marker@arrow\pgf@end@tip@sequence\pgf@anim@marker@id\pgf@anim@marker@shorten%
+ \global\let\pgf@anim@marker@id@end\pgf@anim@marker@id%
+ }%
+ \let\pgf@anim@marker@shorten@end\pgf@anim@marker@shorten%
+ \fi%
+}%
+
+
+% Draw an arrow using markers
+
+\def\pgf@anim@prep@marker@arrow#1#2#3{%
+ % #1 = tip sequence
+ % #2 = macro for storing marker code
+ % #3 = macro for storing shortening length
+ %
+ % First, compute id's:
+ {%
+ \let\pgf@arrow@handle\pgf@anim@marker@id@test%
+ \let\pgf@arrow@handle@dot\relax%?
+ \global\let\pgf@anim@marker@id@list\pgfutil@empty%
+ #1%
+ }%
+ \expandafter\let\expandafter#2\csname pgfanim@marker@cache@\pgf@anim@marker@id@list\endcsname%
+ \expandafter\let\expandafter#3\csname pgfanim@marker@cachel@\pgf@anim@marker@id@list\endcsname%
+ \ifx#2\relax% ok, have to create it!
+ \pgf@relevantforpicturesizefalse%
+ \pgfinterruptpath%
+ \pgf@arrow@compute@shortening{#1}%
+ \xdef#3{\the\pgf@xa}%
+ {%
+ \let\pgf@arrow@handle\pgf@anim@drawer@marker
+ \let\pgf@arrow@handle@dot\relax%
+ \pgfsys@marker@declare#2{%
+ \pgftransformxshift{-\pgf@xb}%
+ \pgftransformxshift{\pgf@xa}%
+ #1%
+ }%
+ }%
+ \endpgfinterruptpath%
+ \expandafter\global\expandafter\let\csname pgfanim@marker@cache@\pgf@anim@marker@id@list\endcsname#2%
+ \expandafter\global\expandafter\let\csname pgfanim@marker@cachel@\pgf@anim@marker@id@list\endcsname#3%
+ \fi%
+}%
+
+\def\pgf@anim@marker@id@test#1#2{%
+ \pgfarrows@getid{#1}{#2}%
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+ \xdef\pgf@anim@marker@id@list{\pgf@anim@marker@id@list:\pgf@arrow@id\ifpgfarrowswap s\else n\fi\pgfarrows@slant w\the\pgf@xc}%
+}%
+
+\def\pgf@anim@drawer@marker#1#2{%
+ % Prepare:
+ {%
+ \pgfarrows@getid{#1}{#2}%
+ % Do shift:
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+ % Do slant:
+ \ifdim\pgfarrows@slant pt=0pt%
+ \else%
+ \pgftransformxslant{\pgfarrows@slant}%
+ \fi%
+ % do swap:
+ \ifpgfarrowswap%
+ \pgftransformyscale{-1}%
+ \fi%
+ {%
+ \csname pgf@ar@saves@\pgf@arrow@id\endcsname%
+ \pgfsys@beginscope%
+ \pgf@arrows@color@setup%
+ \pgflowlevelsynccm\csname pgf@ar@cache@\pgf@arrow@id\endcsname%
+ \pgfsys@endscope%
+ }%
+ \expandafter}%
+ % Transform to next tip:
+ \expandafter\pgftransformxshift\expandafter{\the\pgf@xc}%
+}%
+
+
+
+
+
+
+
+
+
+% The parsers
+
+% Parse no value
+%
+% #1 is ignored
+%
+% Example:
+%
+% entry = {0s}{5+6}
+
+\def\pgfanim@parse@type@none#1{%
+ \pgfsysanimvalnone%
+}%
+
+% Parse a scalar
+%
+% #1 is a number parsed using \pgfmathparse
+%
+% Example:
+%
+% entry = {0s}{5+6}
+
+\def\pgfanim@parse@type@scalar#1{%
+ \pgfmathparse{#1}%
+ \expandafter\pgfsysanimvalscalar\expandafter{\pgfmathresult}%
+}%
+
+
+% Parse a dimension
+%
+% #1 is a number parsed using \pgfmathparse
+%
+% Example:
+%
+% entry = {0s}{5cm + 2pt}
+
+\def\pgfanim@parse@type@dimension#1{%
+ \pgfmathparse{#1}%
+ \expandafter\pgfsysanimvaldimension\expandafter{\pgfmathresult pt}%
+}%
+
+
+
+% Parse a mapped text
+%
+% #1 is a text. It is looked up in \pgf@anim@map@#1 and gets replaced
+% by what this macro expands to.
+%
+% Example:
+%
+% entry = {0s}{true}
+
+\def\pgfanim@parse@type@mapped#1{%
+ {%
+ \expandafter\let\expandafter\pgf@temp\csname pgf@anim@map@#1\endcsname\relax%
+ \ifx\pgf@temp\relax%
+ \pgferror{Value '#1' not allowed for an animation for this attribute}%
+ \let\pgf@temp\pgfutil@empty%
+ \fi%
+ \expandafter}%
+ \expandafter\pgfsysanimvaltext\expandafter{\pgf@temp}%
+}%
+
+
+% Parse a color
+%
+% #1 is a color
+%
+% entry = {0s}{blue!20}
+
+\def\pgfanim@parse@type@color#1{%
+ \pgfsysanimvalcolor{#1}%
+}%
+
+
+% Parse a path
+%
+% #1 is a sequence of pgf path construction commands
+%
+% entry = {0s}{\pgfpathmoveto{\pgfpointorigin} \pgfpathlineto{\pgfpoint{1cm}{1cm}}}
+
+\def\pgfanim@parse@type@path#1{%
+ {%
+ \pgfsyssoftpath@getcurrentpath\pgfanim@save@path%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ #1%
+ \pgfsyssoftpath@getcurrentpath\pgfanim@the@path%
+ \pgfprocessround{\pgfanim@the@path}{\pgfanim@the@path}%
+ \global\let\pgfanim@the@path\pgfanim@the@path%
+ \pgfsyssoftpath@setcurrentpath\pgfanim@save@path%
+ }%
+ \expandafter\pgfanim@parse@type@softpath\expandafter{\pgfanim@the@path}%
+}%
+
+
+% Parse a softpath
+%
+% #1 is a sequence of pgf softpath token commands
+%
+% entry = {0s}{\pgfsyssoftpath@movetotoken {0pt}{0pt}\pgfsyssoftpath@linetotoken {10pt}{10pt}}
+
+\def\pgfanim@parse@type@softpath#1{%
+ {%
+ \def\pgf@anim@path{#1}%
+ % Shorten?
+ \pgf@worryfalse%
+ \pgf@xb=\pgf@anim@marker@extra@shorten@start%
+ \advance\pgf@xb by\pgf@anim@marker@shorten@start%
+ \pgf@xc=\pgf@anim@marker@extra@shorten@end%
+ \advance\pgf@xc by\pgf@anim@marker@shorten@end%
+ \ifdim\pgf@xb=0pt\else\pgf@worrytrue\fi%
+ \ifdim\pgf@xc=0pt\else\pgf@worrytrue\fi%
+ \ifpgf@worry%
+ \edef\pgf@path@shortening@distance@end{\the\pgf@xc}%
+ \edef\pgf@path@shortening@distance@start{\the\pgf@xb}%
+ % Yes! Need to shorten.
+ \pgf@anim@shorten@path%
+ \fi%
+ \expandafter}%
+ \expandafter\pgfsysanimvalpath\expandafter{\pgf@anim@path}%
+}%
+
+
+\def\pgf@anim@shorten@path{%
+ \pgf@precise@shorteningfalse%
+ \let\pgf@path@shortening@distance\pgf@path@shortening@distance@end%
+ %
+ % Step 1: Split
+ %
+ \pgfprocesssplitpath{\pgf@anim@path}%
+ \pgfprocesssplitsubpath{\pgfprocessresultpathsuffix}%
+ %
+ % Step 2: extract
+ %
+ \expandafter\pgf@parse@end\pgfprocessresultsubpathsuffix\pgf@stop\pgf@stop\pgf@stop%
+ %
+ % Step 3: prep end
+ %
+ \pgf@prep@end%
+ %
+ % Step 4: shorten end
+ %
+ \ifdim\pgf@path@shortening@distance=0pt\else\pgf@do@shorten@end\fi%
+ %
+ \let\pgf@path@shortening@distance\pgf@path@shortening@distance@start%
+ %
+ % Step 5: extract
+ %
+ \expandafter\pgf@parse@start\pgfprocessresultpathsuffix\pgf@stop\pgf@stop\pgf@stop%
+ %
+ % Step 6: prep start
+ %
+ \pgf@prep@start%
+ %
+ % Step 7: shorten start
+ %
+ \ifdim\pgf@path@shortening@distance=0pt\else\pgf@do@shorten@start\fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@anim@path%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathprefix\pgfprocessresultpathsuffix}%
+}%
+
+
+
+% Parse a point
+%
+% #1 is a point
+%
+% entry = {0s}{\pgfpoint{1cm}{2cm}}
+
+\def\pgfanim@parse@type@point#1{%
+ \pgf@process{#1}%
+ \pgf@protocolanimsizes\pgf@x\pgf@y%
+ \expandafter\expandafter\expandafter\pgfsysanimvaltranslate\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgf@x\expandafter}\expandafter{\the\pgf@y}%
+}%
+
+
+% Parse a scaling
+%
+% #1 = if #1 contains a comma, the two parts are passed to
+% pgfmathparse, otherwise the whole thing is passed to pgfmathparse.
+%
+% entry = {0s}{2}
+% entry = {0s}{2,1}
+
+\def\pgfanim@parse@type@scaling#1{%
+ \pgfutil@in@{,}{#1}%
+ \ifpgfutil@in@%
+ \pgfanim@unpack@comma#1\pgf@stop%
+ \else%
+ \pgfmathparse{#1}%
+ \expandafter\pgfsysanimvalscale\expandafter{\pgfmathresult}{\pgfmathresult}%
+ \fi%
+}%
+\def\pgfanim@unpack@comma#1,#2\pgf@stop{%
+ \pgfmathsetmacro{\pgf@anim@temp@x}{#1}%
+ \pgfmathsetmacro{\pgf@anim@temp@y}{#2}%
+ \expandafter\expandafter\expandafter\pgfsysanimvalscale\expandafter\expandafter\expandafter{\expandafter\pgf@anim@temp@x\expandafter}\expandafter{\pgf@anim@temp@y}%
+}%
+
+
+
+% Parse a viewbox
+%
+% #1 consists of two points, each in parentheses
+%
+% entry = {0s}{{\pgfpoint{1cm}{2cm}}{\pgfpoint{3cm}{4cm}}}
+
+\def\pgfanim@parse@type@viewbox#1{%
+ {%
+ \pgfanim@unpack@viewbox#1%
+ \xdef\pgf@anim@caller{\noexpand\pgfsysanimvalviewbox{\the\pgf@x}{\the\pgf@y}{\the\pgf@xa}{\the\pgf@ya}}%
+ }%
+ \pgf@anim@caller%
+}%
+\def\pgfanim@unpack@viewbox#1#2{%
+ \pgfpointtransformed{#2}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfpointtransformed{#1}%
+ \ifdim\pgf@xa<\pgf@x% swap needed
+ \pgf@xb=\pgf@x%
+ \pgf@x=\pgf@xa%
+ \pgf@xa=\pgf@xb%
+ \fi%
+ \ifdim\pgf@ya<\pgf@y% swap needed
+ \pgf@yb=\pgf@y%
+ \pgf@y=\pgf@ya%
+ \pgf@ya=\pgf@yb%
+ \fi%
+}%
+
+
+
+
+% Parse a dash pattern
+%
+% #1,#2 is a dash pattern as in \pgfsetdash
+%
+% entry = {0s}{{{1pt}{2pt}{3pt}{1pt}}{1pt}}
+
+\def\pgfanim@parse@type@dash#1{\pgfanim@parse@type@dash@#1}%
+\def\pgfanim@parse@type@dash@#1#2{%
+ \def\pgf@temp{}%
+ \def\pgf@next{\pgf@strip}%
+ \pgf@strip#1{pgf@stop}%
+ \expandafter\pgfsysanimvaldash\expandafter{\pgf@temp}{#2}%
+}%
+
+
+
+
+
+%
+%
+% Bounding box adjustments in animations.
+%
+%
+
+\def\pgf@protocolanimsizes#1#2{%
+ \edef\pgf@temp{\noexpand\pgf@anim@handle@point{\the#1}{\the#2}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@protocolanim@list\expandafter\expandafter\expandafter{\expandafter\pgf@protocolanim@list\pgf@temp}%
+}%
+\def\pgf@protocolanimsizes@direct#1#2{%
+ \expandafter\def\expandafter\pgf@protocolanim@list\expandafter{\pgf@protocolanim@list\pgf@anim@handle@point{#1}{#2}}%
+}%
+\let\pgf@protocolanim@list\pgfutil@empty
+
+\def\pgf@animation@check@translate{%
+ \ifx\pgf@protocolanim@list\pgfutil@empty%
+ \else%
+ \expandafter\expandafter\expandafter\pgf@animation@check@translate@\expandafter\expandafter\expandafter{\expandafter\pgf@protocolanim@list\expandafter}\expandafter{\pgf@anim@saved@transform}%
+ \fi%
+}%
+\let\pgf@animation@check@motion\pgf@animation@check@translate
+
+\def\pgf@animation@check@translate@#1#2{%
+ \pgfsys@attach@to@id\pgf@anim@whom@id\pgf@anim@whom@type{%
+ \pgf@size@hookedtrue%
+ {%
+ % Compute bounding box in local coordinate system
+ #2%
+ \pgf@pt@x0pt%
+ \pgf@pt@y0pt%
+ \pgf@picmaxx=-16000pt\relax%
+ \pgf@picminx=16000pt\relax%
+ \pgf@picmaxy=-16000pt\relax%
+ \pgf@picminy=16000pt\relax%
+ #1%
+ \edef\pgf@temp{{\the\pgf@picminx}{\the\pgf@picminy}{\the\pgf@picmaxx}{\the\pgf@picmaxy}}%
+ \expandafter%
+ }\expandafter%
+ \def\expandafter\pgf@temp\expandafter{\pgf@temp}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@path@size@hook\expandafter\expandafter\expandafter{%
+ \expandafter\pgf@path@size@hook\expandafter\pgf@anim@bb\pgf@temp}%
+ }{}%
+}%
+\def\pgf@anim@handle@point#1#2{%
+ \pgf@x#1\pgf@y#2%
+ \pgf@pos@transform\pgf@x\pgf@y%
+ \ifdim\pgf@x<\pgf@picminx\pgf@picminx\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@picmaxx\pgf@picmaxx\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@picminy\pgf@picminy\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@picmaxy\pgf@picmaxy\pgf@y\fi%
+}%
+
+\newdimen\pgf@anim@dim
+
+\def\pgf@anim@bb#1#2#3#4{% (#1,#2) lower left, (#3, #4) upper right
+ \pgf@anim@dim\pgf@size@hook@x%
+ \advance\pgf@anim@dim by#1\relax%
+ \ifdim\pgf@anim@dim<\pgf@picminx\global\pgf@picminx\pgf@anim@dim\fi%
+ \pgf@anim@dim\pgf@size@hook@x%
+ \advance\pgf@anim@dim by#3\relax%
+ \ifdim\pgf@anim@dim>\pgf@picmaxx\global\pgf@picmaxx\pgf@anim@dim\fi%
+ \pgf@anim@dim\pgf@size@hook@y%
+ \advance\pgf@anim@dim by#2\relax%
+ \ifdim\pgf@anim@dim<\pgf@picminy\global\pgf@picminy\pgf@anim@dim\fi%
+ \pgf@anim@dim\pgf@size@hook@y%
+ \advance\pgf@anim@dim by#4\relax%
+ \ifdim\pgf@anim@dim>\pgf@picmaxy\global\pgf@picmaxy\pgf@anim@dim\fi%
+}%
+
+\def\pgf@anim@save@transform#1{%
+ \def\pgf@anim@saved@transform{#1}%
+}%
+\let\pgf@anim@saved@transform\pgfutil@empty%
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmodulebending.code.tex b/graphics/pgf/base/tex/pgfmodulebending.code.tex
new file mode 100644
index 0000000000..888db71204
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmodulebending.code.tex
@@ -0,0 +1,356 @@
+% Copyright 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmodulebending.code.tex}
+
+
+%
+% This file defines commands for drawing bending arrows and lines.
+%
+
+\usepgfmodule{nonlineartransformations}%
+\usepgflibrary{curvilinear}%
+
+
+% Configuration options for arrow tips:
+
+\pgfkeys{
+ /pgf/arrow keys/flex/.code=\pgfarrowsaddtooptions{\pgf@arrows@the@rigidity#1pt\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@flex},
+ /pgf/arrow keys/flex/.default=1,
+ /pgf/arrow keys/flex'/.code=\pgfarrowsaddtooptions{\pgf@arrows@the@rigidity#1pt\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@flex@prime},
+ /pgf/arrow keys/flex'/.default=1,
+ /pgf/arrow
+ keys/bend/.code=\pgfarrowsaddtooptions{\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@bend},
+}%
+
+
+\def\pgf@arrow@mode@is@flex{1}%
+\def\pgf@arrow@mode@is@flex@prime{2}%
+\def\pgf@arrow@mode@is@bend{3}%
+
+\newdimen\pgf@arrows@the@rigidity
+
+%
+%
+% Handle the end of a curve
+%
+%
+
+% First, the preparation. This is, essentially, setting up the
+% nonlinear transformation
+
+\def\pgf@prep@curveend{
+ \pgftransformreset%
+ \pgfsetcurvilinearbeziercurve{\pgfpointlastonpath}{\pgfpointsecondlastonpath}{\pgfpointthirdlastonpath}{\pgfpointfourthlastonpath}
+}%
+
+% Second, the shortening.
+
+\def\pgf@do@shorten@curvedend{%
+ \expandafter\expandafter\expandafter\pgf@do@shorten@curvedend@unpack\expandafter\pgfpointfourthlastonpath\pgfpointthirdlastonpath%
+}%
+\def\pgf@do@shorten@curvedend@unpack\pgfqpoint#1#2\pgfqpoint#3#4{%
+ \pgf@process{\pgfcurvilineardistancetotime{\pgf@path@shortening@distance}}%
+ % Compute new curve:
+ \pgfpointcurveattime{\pgf@x}{\pgfpointlastonpath}{\pgfpointsecondlastonpath}{\pgfpointthirdlastonpath}{\pgfpointfourthlastonpath}%
+ % \pgfx/y and \pgf xa/xb already correct. Need to setup remaining vector...
+ \pgf@xb#3%
+ \pgf@yb#4%
+ \pgf@xb\pgf@time@t\pgf@xb%
+ \pgf@yb\pgf@time@t\pgf@yb%
+ \advance\pgf@xb by\pgf@time@s\pgf@xc%
+ \advance\pgf@yb by\pgf@time@s\pgf@yc%
+ \edef\pgfprocessresultsubpathsuffix{%
+ \expandafter\noexpand\pgfsubpathfourthlasttoken{#1}{#2}%
+ \noexpand\pgfsyssoftpath@curvetosupportatoken{\the\pgf@xb}{\the\pgf@yb}%
+ \noexpand\pgfsyssoftpath@curvetosupportbtoken{\the\pgf@xa}{\the\pgf@ya}%
+ \noexpand\pgfsyssoftpath@curvetotoken{\the\pgf@x}{\the\pgf@y}}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgfprocessresultpathsuffix%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultsubpathprefix\pgfprocessresultsubpathsuffix}%
+}%
+
+% Third, the drawing
+
+\def\pgf@do@draw@curvedend{%
+ \pgf@do@draw@curved\pgf@end@tip@sequence%
+}%
+
+\def\pgf@do@draw@curved#1{%
+ {%
+ \pgftransformreset%
+ \pgf@xb\pgf@arrow@tip@total@length% xb will keep track of the total length
+ \let\pgf@arrow@handle\pgf@draw@curved%
+ \let\pgf@arrow@handle@dot\relax%
+ #1%
+ }%
+}%
+
+\def\pgf@draw@curved#1#2{%
+ % Prepare:
+ {%
+ \pgfarrows@getid{#1}{#2}%
+ % Do shift:
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@rigid@shift\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+ \expandafter\let\expandafter\pgf@arrow@bending@mode\csname pgf@ar@bending@mode@#1\endcsname%
+ \ifx\pgf@arrow@bending@mode\pgfutil@empty\let\pgf@arrow@flex@mode\pgf@arrow@mode@is@flex\fi%
+ % do swap:
+ {%
+ \csname pgf@ar@saves@\pgf@arrow@id\endcsname%
+ \ifcase\pgf@arrow@flex@mode\relax%
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@rigid\csname pgf@ar@visual@\pgf@arrow@id\endcsname% like flex
+ \or%
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@rigid\csname pgf@ar@visual@\pgf@arrow@id\endcsname%
+ \or%
+ \expandafter\expandafter\expandafter\pgf@arrow@drawer@rigid\csname pgf@ar@ends@\pgf@arrow@id\endcsname%
+ \or%
+ \pgf@arrow@drawer@bend%
+ \fi%
+ % hull points inside the above
+ }%
+ \expandafter}%
+ % Transform to next tip:
+ \expandafter\pgf@xb\the\pgf@xb%
+}%
+\def\pgf@falsetext{false}%
+
+\def\pgf@arrow@drawer@rigid@shift#1#2#3{% tip end, back end, line end, sep
+ % Let xa be the actual back end of the current arrow plus the back end:
+ \advance\pgf@xb by#2%
+ \pgf@xa\pgf@xb%
+ % Update the xb:
+ \pgf@x#1%
+ \advance\pgf@x by\pgfarrowsep%
+ \advance\pgf@xb by-\pgf@x%
+}%
+
+
+\def\pgf@arrow@drawer@bend{%
+ \pgftransformnonlinear{\pgf@arrow@bending@mode{\pgf@x}{\pgf@y}}
+ \pgftransformscale{-1}%
+ \pgftransformxshift{-\pgf@xa}%
+ % Do slant:
+ \ifdim\pgfarrows@slant pt=0pt%
+ \else%
+ \pgftransformxslant{\pgfarrows@slant}%
+ \fi%
+ \ifpgfarrowswap%
+ \pgftransformyscale{-1}%
+ \fi%
+ {%
+ \pgf@relevantforpicturesizefalse%
+ \pgfscope%
+ \pgf@arrows@color@setup%
+ \csname pgf@ar@inst@code@\pgf@arrow@id\endcsname%
+ \endpgfscope%
+ }%
+ \pgf@arrows@bending@hull%
+}%
+
+\def\pgf@arrow@drawer@rigid#1#2#3{% (rigid) start, (rigid) end, dummy
+ % Compute the rigid positions:
+ \pgf@x#1% start
+ \pgf@y#2% flexibility*(end-start) + start
+ \advance\pgf@y by-\pgf@x%
+ \pgf@y\pgf@sys@tonumber\pgf@arrows@the@rigidity\pgf@y%
+ \advance\pgf@y by\pgf@x%
+ % Are they equal?
+ \ifdim\pgf@x=\pgf@y%
+ % Yes, do tangent:
+ \pgf@bending@do@tangent%
+ \else%
+ \pgf@bending@do@flex%
+ \fi%
+ \pgf@xc#1%
+ \pgf@xc-\pgf@xc%
+ \pgftransformxshift{+\pgf@xc}%
+ % Do slant:
+ \ifdim\pgfarrows@slant pt=0pt%
+ \else%
+ \pgftransformxslant{\pgfarrows@slant}%
+ \fi%
+ % do swap:
+ \ifpgfarrowswap%
+ \pgftransformyscale{-1}%
+ \fi%
+ \pgfscope%
+ \pgf@arrows@color@setup%
+ \pgflowlevelsynccm\csname pgf@ar@cache@\pgf@arrow@id\endcsname%
+ \endpgfscope%
+ \pgf@arrows@rigid@hull%
+}%
+
+\def\pgf@bending@do@tangent{%
+ \pgf@xb\pgf@xa%
+ \advance\pgf@xb by-\pgf@x%
+ \pgfcurvilineardistancetotime{\pgf@xb}%
+ \pgf@xb\pgf@x%
+ % Compute points:
+ \ifdim\pgf@xb=0pt%
+ \pgf@bending@possible@degenerate%
+ \else%
+ \pgf@bending@do@tangent@normal%
+ \fi%
+ \pgf@ya-\pgf@y%
+ \pgfsettransformentries%
+ {\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
+ {\pgf@sys@tonumber\pgf@ya}{\pgf@sys@tonumber\pgf@x}{\pgf@xc}{\pgf@yc}%
+}%
+
+\def\pgf@bending@do@tangent@normal{%
+ \pgfpointcurveattime{\pgf@xb}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}%
+ \pgf@xc\pgf@x% save
+ \pgf@yc\pgf@y% save
+ % compute normal:
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \pgf@process{\pgfpointnormalised{\pgf@x=\pgf@xb\pgf@y=\pgf@yb}}
+}%
+
+\def\pgf@bending@possible@degenerate{%
+ \ifx\pgf@curvilinear@line@a\pgf@curvilinear@line@b% degenerate!
+ \ifx\pgf@curvilinear@line@a\pgf@curvilinear@line@c% double degenerate!
+ \let\pgf@ref\pgf@curvilinear@line@d%
+ \else
+ \let\pgf@ref\pgf@curvilinear@line@c%
+ \fi%
+ \pgf@process{\pgf@curvilinear@line@a}%
+ \pgf@xc\pgf@x% save
+ \pgf@yc\pgf@y% save
+ \pgf@process{\pgf@ref}%
+ \advance\pgf@x by-\pgf@xc
+ \advance\pgf@y by-\pgf@yc
+ \pgf@process{\pgfpointnormalised{}}
+ \pgf@x-\pgf@x
+ \pgf@y-\pgf@y
+ \else%
+ \pgf@bending@do@tangent@normal%
+ \fi%
+}%
+
+\def\pgf@bending@do@flex{
+ \pgf@xb\pgf@xa%
+ \pgf@xc\pgf@xa%
+ \advance\pgf@xc by-\pgf@x%
+ \advance\pgf@xb by-\pgf@y%
+ \pgfcurvilineardistancetotime{\pgf@xc}%
+ \pgf@xc\pgf@x%
+ \pgfcurvilineardistancetotime{\pgf@xb}%
+ \pgf@xb\pgf@x%
+ % Compute points:
+ \pgf@process{\pgfpointcurveattime{\pgf@xc}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}%
+ \pgf@xc\pgf@x\pgf@yc\pgf@y%
+ \pgf@process{\pgfpointcurveattime{\pgf@xb}{\pgf@curvilinear@line@a}{\pgf@curvilinear@line@b}{\pgf@curvilinear@line@c}{\pgf@curvilinear@line@d}}%
+ \pgf@xb\pgf@x\pgf@yb\pgf@y%
+ \pgftransformarrow{\pgfqpoint{\pgf@xb}{\pgf@yb}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+}%
+
+
+
+
+
+
+% Convex hull stuff:
+
+\def\pgf@arrows@bending@hull{%
+ \ifpgf@relevantforpicturesize%
+ % Do bb update:
+ \expandafter\let\expandafter\pgf@temp\csname pgf@ar@hull@\pgf@arrow@id\endcsname%
+ \ifx\pgf@temp\pgfutil@empty\else%
+ \let\pgf@arrow@hull@point\pgf@arrow@bending@hull@point@first%
+ \pgf@temp%
+ \pgf@arrow@bending@update@bb%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@arrow@bending@hull@point@first#1#2{%
+ \pgfpointtransformednonlinear{\pgfqpoint{#1}{#2}}%
+ \pgf@xa\pgf@x\pgf@xb\pgf@x%
+ \pgf@ya\pgf@y\pgf@yb\pgf@y%
+ \let\pgf@arrow@hull@point\pgf@arrow@bending@hull@point@other%
+}%
+\def\pgf@arrow@bending@hull@point@other#1#2{%
+ \pgfpointtransformednonlinear{\pgfqpoint{#1}{#2}}%
+ \ifdim\pgf@x<\pgf@xa\pgf@xa\pgf@x\else\ifdim\pgf@x>\pgf@xb\pgf@xb\pgf@x\fi\fi%
+ \ifdim\pgf@y<\pgf@ya\pgf@ya\pgf@y\else\ifdim\pgf@y>\pgf@yb\pgf@yb\pgf@y\fi\fi%
+}%
+
+\def\pgf@arrow@bending@update@bb{%
+ \ifdim\pgf@picmaxx=-16000pt\relax%
+ \global\pgf@picminx\pgf@xa%
+ \global\pgf@picmaxx\pgf@xb%
+ \global\pgf@picminy\pgf@ya%
+ \global\pgf@picmaxy\pgf@yb%
+ \else%
+ \ifdim\pgf@xa<\pgf@picminx\global\pgf@picminx\pgf@xa\fi%
+ \ifdim\pgf@ya<\pgf@picminy\global\pgf@picminy\pgf@ya\fi%
+ \ifdim\pgf@xb>\pgf@picmaxx\global\pgf@picmaxx\pgf@xb\fi%
+ \ifdim\pgf@yb>\pgf@picmaxy\global\pgf@picmaxy\pgf@yb\fi%
+ \fi%
+}%
+
+
+
+
+%
+%
+% Handle the start of a curve
+%
+%
+
+
+% First, the preparation.
+
+\def\pgf@prep@curvedstart{
+ \pgftransformreset%
+ \pgfsetcurvilinearbeziercurve{\pgfpointfirstonpath}{\pgfpointsecondonpath}{\pgfpointthirdonpath}{\pgfpointfourthonpath}%
+}%
+
+% Second, the shortening.
+
+\def\pgf@do@shorten@curvedstart{%
+ \expandafter\expandafter\expandafter\pgf@do@shorten@curvedstart@unpack\expandafter\pgfpointthirdonpath\pgfpointfourthonpath%
+}%
+\def\pgf@do@shorten@curvedstart@unpack\pgfqpoint#1#2\pgfqpoint#3#4{%
+ \pgf@process{\pgfcurvilineardistancetotime{\pgf@path@shortening@distance}}%
+ % Compute new curve:
+ \pgfpointcurveattime{\pgf@x}{\pgfpointfirstonpath}{\pgfpointsecondonpath}{\pgfpointthirdonpath}{\pgfpointfourthonpath}%
+ % \pgfx/y and \pgf xa/xb already correct. Need to setup remaining vector...
+ \pgf@xb#1%
+ \pgf@yb#2%
+ \pgf@xb\pgf@time@t\pgf@xb%
+ \pgf@yb\pgf@time@t\pgf@yb%
+ \advance\pgf@xb by\pgf@time@s\pgf@xc%
+ \advance\pgf@yb by\pgf@time@s\pgf@yc%
+ \edef\pgfpointfirstonpath{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \edef\pgfpointsecondonpath{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \edef\pgfprocessresultpathsuffix{%
+ \noexpand\pgfsyssoftpath@movetotoken{\the\pgf@x}{\the\pgf@y}%
+ \noexpand\pgfsyssoftpath@curvetosupportatoken{\the\pgf@xa}{\the\pgf@ya}%
+ \noexpand\pgfsyssoftpath@curvetosupportbtoken{\the\pgf@xb}{\the\pgf@yb}%
+ \noexpand\pgfsyssoftpath@curvetotoken{#3}{#4}%
+ }
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgfprocessresultpathsuffix%
+ \expandafter\expandafter\expandafter{\expandafter\pgfprocessresultpathsuffix\pgfsubpathend}%
+}%
+
+
+% Third, the drawing
+
+\def\pgf@do@draw@curvedstart{%
+ \pgf@do@draw@curved\pgf@start@tip@sequence%
+}%
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmoduledatavisualization.code.tex b/graphics/pgf/base/tex/pgfmoduledatavisualization.code.tex
new file mode 100644
index 0000000000..541c7de8d4
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduledatavisualization.code.tex
@@ -0,0 +1,3215 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmoduledatavisualization.code.tex}
+
+\usepgfmodule{oo,shapes}%
+\usepgflibrary{fpu}%
+
+
+% This module defines the basic framework for data visualization.
+
+% In order to visualize data, you first need data. The format for this
+% data is not specified, indeed, different formats are possible. A
+% data point is created each time the command \pgfdatapoint is
+% used. The "parameters" of the data point are just the current values
+% of the keys or macros in the current scope.
+%
+% A set of data points created using the \pgfdata command.
+% When a data point is created, a number of signals are emitted, see
+% the description of \pgfdatapoint. To actually visualize something,
+% objects should be created that listen to these signals and that
+% handle them.
+%
+% The following class manages a data visualization
+
+\pgfooclass{data visualization}
+{%
+ % Class data visualization
+ %
+ % This class is used to "manage" a data visualization. It provides
+ % methods for hooking into the data visualization process and its
+ % constructor initializes the signals that are issued during a data
+ % visualization.
+ %
+ % When a data visualization object is created, a whole bunch of
+ % signal objects. You should then create objects that connect to
+ % these signals. They will be emitted when datapoints come
+ % available.
+ %
+ % It is permissible to have several data visualization objects
+ % active at the same time.
+ %
+ % To use a data visualization object, you should (possibly
+ % repeatedly) call the method add data() or the macro \pgfdata. You should also
+ % create transformation, mapping and visualization objects. Then,
+ % you should, first, call the method survey, which will "survey" the
+ % data, allowing the mapping and bounding objects to compute the
+ % correct ranges. You may then create further objects based on this
+ % data. Then, you should call the "visualize" method, which will
+ % invoke the visualization signals for the data points.
+
+
+ % These attribute store code that should be executed at certain
+ % points. The order is the following:
+ %
+ % 1. "before survey" code
+ % 2. "begin survey" phase signal
+ % 3. "at start survey" code
+ % 4. data points are processed
+ % 5. "at end survey" code
+ % 6. "end survey" phase signal
+ % 7. "after survey" code
+ %
+ % The first seven points will be repeated until the method "do
+ % another survey" is no longer called during a survey.
+ %
+ % 8. "before visualization" code
+ % 9. "begin visualization" phase signal
+ % 10. "at start visualization" code
+ % 11. data points are processed once more
+ % 12. "at end visualization" code
+ % 13. "end visualization" phase signal
+ % 14. "after visualization" code
+ \attribute before survey;%
+ \attribute at start survey;%
+ \attribute at end survey;%
+ \attribute after survey;%
+ \attribute before visualization;%
+ \attribute at start visualization;%
+ \attribute at end visualization;%
+ \attribute after visualization;%
+
+ %
+ % Survey counts and handling
+ %
+
+ \attribute survey count=1;%
+ % Each time a survey is done before the visualization is done, this
+ % count is incremented. Normally, there is only one survey, but
+ % objects may request another survey or even more surveys to be
+ % done, giving them a chance to setup further internal values. By
+ % accessing this count (via the get survey count method), you can
+ % find out which survey is currently being done.
+
+ \attribute number of surveys=1;%
+ % By increasing this count, you can request additional surveys to be
+ % done.
+
+
+ % Stores the to-be-visualized data
+ \attribute data;%
+
+
+ % Stores the signal objects
+ \attribute prepare datapoint signal;%
+ \attribute map datapoint signal;%
+ \attribute transform datapoint signal;%
+ \attribute visualize datapoint signal;%
+ \attribute finish datapoint signal;%
+ \attribute survey datapoint signal;%
+ \attribute phase signal;%
+ \attribute path signal;%
+ \attribute direction signal;%
+ \attribute style signal;%
+
+
+ % Constructor
+ %
+ % Inits the signals
+ \method data visualization() {
+ \pgfoonew{prepare datapoint signal}=new signal()%
+ \pgfoonew{map datapoint signal}=new signal()%
+ \pgfoonew{transform datapoint signal}=new signal()%
+ \pgfoonew{visualize datapoint signal}=new signal()%
+ \pgfoonew{finish datapoint signal}=new signal()%
+ \pgfoonew{survey datapoint signal}=new signal()%
+ \pgfoonew{phase signal}=new signal()%
+ \pgfoonew{path signal}=new signal()%
+ \pgfoonew{direction signal}=new signal()%
+ \pgfoonew{style signal}=new signal()%
+ %
+ % Store this object in a key
+ %
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeyslet{/pgf/data visualization/obj}\pgf@dv@me
+ }%
+
+ % The phase signal will emit the following constants:
+ \def\pgfdvbeforesurvey{1}%
+ \def\pgfdvbeginsurvey{2}%
+ \def\pgfdvendsurvey{3}%
+ \def\pgfdvaftersurvey{4}%
+ \def\pgfdvbeforevisualization{5}%
+ \def\pgfdvbeginvisualization{6}%
+ \def\pgfdvendvisualization{7}%
+ \def\pgfdvaftervisualization{8}%
+
+ % The path signale will meit the following constants:
+ \def\pgfdvpathmovetotoken{5}%
+ \def\pgfdvpathlinetotoken{6}%
+ \def\pgfdvdirectionfromtoken{7}%
+ \def\pgfdvdirectiontotoken{8}%
+ \def\pgfdvdirectionattoken{9}%
+
+ % Method
+ %
+ % Connect the object #1's slot "#2" to the signal named "#3"
+ \method connect(#1,#2,#3) {
+ \pgfoovalueof{#3}.connect(#1,#2)
+ }%
+
+ % Method
+ %
+ % Add data that is to be visualized. The code #1 should call the
+ % \pgfdatapoint macro for each data point it creates.
+ \method add data(#1) {
+ \pgf@dv@stripped@add#1\pgf@stop
+ }%
+ \def\pgf@dv@stripped@add#1\pgf@stop{%
+ \pgfooappend{data}{#1}%
+ }%
+
+
+ % Setters
+ \method before survey(#1) {
+ \pgfooappend{before survey}{#1}
+ }%
+ \method at start survey(#1) {
+ \pgfooappend{at start survey}{#1}
+ }%
+ \method before visualization(#1) {
+ \pgfooappend{before visualization}{#1}
+ }%
+ \method at start visualization(#1) {
+ \pgfooappend{at start visualization}{#1}
+ }%
+
+ % Method
+ \method at end survey(#1) {
+ \pgfooprefix{at end survey}{#1}
+ }%
+ \method after survey(#1) {
+ \pgfooprefix{after survey}{#1}
+ }%
+ \method at end visualization(#1) {
+ \pgfooprefix{at end visualization}{#1}
+ }%
+ \method after visualization(#1) {
+ \pgfooprefix{after visualization}{#1}
+ }%
+
+
+ % Method
+ %
+ % Copy the signals to macros. This is just for efficiency (ha!)
+ \method prepare signal macros() {
+ \pgfooget{prepare datapoint signal}\pgf@signalpreparedatapoint
+ \pgfooget{map datapoint signal}\pgf@signalmapdatapoint
+ \pgfooget{transform datapoint signal}\pgf@signaltransformdatapoint
+ \pgfooget{visualize datapoint signal}\pgf@signalvisualizedatapoint
+ \pgfooget{finish datapoint signal}\pgf@signalfinishdatapoint
+ \pgfooget{survey datapoint signal}\pgf@signalsurveydatapoint
+ \pgfooget{phase signal}\pgf@signalphase
+ \pgfooget{path signal}\pgf@signalpath
+ \pgfooget{direction signal}\pgf@signaldirection
+ \pgfooget{style signal}\pgf@signalstyle
+ }%
+
+
+ % Survey method
+ %
+ % Call this method to "survey" the data. This should be done before
+ % the "visualize" method is called.
+ \method survey() {
+ % Survey phase.
+ \let\pgfdatapoint=\pgfdatapoint@surveyphase%
+ \pgfoothis.prepare signal macros()
+ \pgfooset{survey count}{1}
+ \pgfutil@loop
+ \pgf@signalphase.emit(\pgfdvbeforesurvey)
+ \pgfoovalueof{before survey}%
+ \pgf@signalphase.emit(\pgfdvbeginsurvey)
+ \pgfoovalueof{at start survey}
+ \pgfoovalueof{data}%
+ \pgfoovalueof{at end survey}
+ \pgf@signalphase.emit(\pgfdvendsurvey)%
+ \pgfoovalueof{after survey}
+ \pgf@signalphase.emit(\pgfdvaftersurvey)
+ \c@pgf@counta=\pgfoovalueof{survey count}\relax
+ \c@pgf@countb=\pgfoovalueof{number of surveys}\relax
+ \ifnum\c@pgf@counta<\c@pgf@countb
+ \advance\c@pgf@counta by1\relax
+ \pgfooeset{survey count}{\the\c@pgf@counta}
+ \pgfutil@repeat
+ }%
+
+ % Getter
+ \method get survey count(#1) {
+ \pgfooget{survey count}{#1}
+ }%
+
+ % Request another survey to be done
+ \method do an additional survey() {
+ \c@pgf@counta=\pgfoovalueof{number of surveys}\relax
+ \advance\c@pgf@counta by1\relax
+ \pgfooeset{number of surveys}{\the\c@pgf@counta}
+ }%
+
+ % Visualize method
+ %
+ % This method will cause the actual visualization.
+ \method visualize() {
+ % Visualization phase.
+ \let\pgfdatapoint=\pgfdatapoint@visualizationphase%
+ \pgfoothis.prepare signal macros()
+ \pgf@signalphase.emit(\pgfdvbeforevisualization)%
+ \pgfoovalueof{before visualization}
+ \pgf@signalphase.emit(\pgfdvbeginvisualization)%
+ \pgfoovalueof{at start visualization}
+ \pgfoovalueof{data}%
+ \pgfoovalueof{at end visualization}
+ \pgf@signalphase.emit(\pgfdvendvisualization)%
+ \pgfoovalueof{after visualization}
+ \pgf@signalphase.emit(\pgfdvaftervisualization)%
+ }%
+}%
+
+
+%
+% The data point keys
+%
+% Unlike other keys, the subkeys of /data point/ can simply be set
+% directly. If the key has not been initialized, it will automatically
+% be.
+\pgfkeys{/data point/.unknown/.code={%
+ \pgfkeyssetvalue{/data point/\pgfkeyscurrentname}{#1}
+ },
+}%
+
+
+
+
+% Create and handle a data point
+%
+% Description:
+%
+% This command is called by the survey and the visualize methods
+% whenever a complete data point has been produced. Depending on the
+% current circumstances, different signals will be emitted.
+%
+% The data that is represented by the data point is not given as a
+% parameter. Rather, it is stored in macros and keys, that is, the
+% data point is conceptually given by the settings of all the keys and
+% macros in the local scope.
+%
+% There are two phases to data processing: In the survey phase data
+% points are produced and handled in order to find out things like
+% their number or the minimum and maximum values of attributes, so
+% that axes and picture sizes can be prepared correctly. In the
+% visualization phase, data point are actually shown.
+%
+% During the survey phase, for each data point the signal
+% "surveydatapoint" is emitted.
+%
+% During the visualization phase, more signals are emitted. A prepare
+% signal is emitted first, giving all objects a
+% chance to "prepare" for the data point. Note that it is permissible
+% for an object to manipulate the data point here (and also
+% in later on).
+%
+% Next, the command \pgfdvmapdatapointtocanvas is called. Mainly,
+% the effect of this command is to setup the keys /data point/canvas x
+% and /data point/canvas y, see the description of this command for
+% more details.
+%
+% The next step consists of signaling "visualize data point". Objects
+% listening to this will cause some form of visualization of the
+% data point to occur.
+%
+% Before the visualization is started, it is checked whether the key
+% /data point/name is set (to a non-empty value). If so,
+% a coordinate is created with the given canvas x and y values and
+% this key's value as name.
+%
+% Finally, finish data point allows objects to do any final processing
+% of the data point.
+
+\def\pgfdatapoint@surveyphase{%
+ \pgf@signalpreparedatapoint.emit()%
+ \pgf@signalmapdatapoint.emit()%
+ \pgf@signalsurveydatapoint.emit()%
+}%
+
+\def\pgfdatapoint@visualizationphase{%
+ \pgf@signalpreparedatapoint.emit()%
+ \pgfdvmapdatapointtocanvas%
+ \pgfkeysifdefined{/data point/name}
+ {%
+ \pgfcoordinate{\pgfkeysvalueof{/data point/name}}{\pgfpointdvdatapoint}%
+ }{}%
+ \pgf@signalvisualizedatapoint.emit()%
+ \pgf@signalfinishdatapoint.emit()%
+}%
+
+
+
+% Compute a position of a data point
+%
+% Description:
+%
+% This command uses a special signal to compute the position where a
+% data point should be visualized on the canvas. In detail, the
+% following happens:
+%
+% A local scope is created and the
+% transformation matrix is reset. Then, two signals are emitted: First,
+% "map data points" and then "transform data point". The first
+% lets listening objects "map" the object by setting up
+% attributes of the data point. The second asks objects
+% listening to this signal to transform the current transformation
+% matrix. After the signals, we compute where
+% the origin lies inside this transformed coordinate system. Then the
+% two keys /data point/canvas x and /data point/canvas y are set to
+% the values of this position. The local scope ends (but the settings
+% of the keys persist by a bit of magic), thus restoring the
+% transformation matrix to its original value.
+
+\def\pgfdvmapdatapointtocanvas{%
+ {%
+ \pgfpointdvlocaldatapoint
+ % Smuggle outside group
+ \expandafter%
+ }%
+ \edef\pgf@marshal{%
+ \noexpand\pgfkeyssetvalue{/data point/canvas x}{\the\pgf@x}
+ \noexpand\pgfkeyssetvalue{/data point/canvas y}{\the\pgf@y}
+ }%
+ \pgf@marshal%
+}%
+
+% Help functions for locating a canvas data point
+%
+% Description:
+%
+% The first function returns the data point computed by a
+% canvasposition... call.
+
+\def\pgfpointdvdatapoint{%
+ \pgfqpoint{\pgfkeysvalueof{/data point/canvas x}}{\pgfkeysvalueof{/data point/canvas y}}%
+}%
+
+\def\pgfpointdvlocaldatapoint{%
+ {%
+ % only returns the data point in \pgf@x and \pgf@y, does not set
+ % canvas x and canvas y
+ \pgf@signalmapdatapoint.emit()%
+ \pgftransformreset%
+ \pgf@signaltransformdatapoint.emit()%
+ \pgfpointtransformed{\pgfpointorigin}%
+ }%
+}%
+
+
+
+%
+% Special path constructions commands
+%
+%
+% The following commands are used to construct paths based on
+% datapoints.
+%
+% Normally, all these methods need to do is to compute the current
+% canvas position of the current data point and then do a moveto,
+% lineto or some other operation to this position.
+%
+% However, when the coordinate system is weird, like with polar
+% coordinates or spherical or log-polar coordinate or whatever, a
+% straight line "along an attribute" is no longer a straight line.
+% In this case, two actions can be taken:
+%
+% 1. The problem can be ignored, resulting in a wrong line.
+% 2. Some clever algorithm kicks in an replaces the straight line by
+% the correct replacement.
+%
+% As always, when a computer tries to be clever, things can go
+% wrong... Nevertheless, some support for the second method is
+% given. This works as follows: Objects can register to the data
+% visualization path signal. This signal is emitted every time the
+% lineto or moveto commands are executed. If an object reacts to such
+% a command and handles it, it should set
+% \pgfdvhandledtrue.
+
+\newif\ifpgfdvhandled
+
+\def\pgfdv@generic#1#2#3{%
+ {%
+ \pgfdvhandledfalse%
+ \pgf@signalmapdatapoint.emit()%
+ #1.emit(#2)%
+ \ifpgfdvhandled%
+ \else%
+ \pgf@process{%
+ \pgftransformreset%
+ \pgf@signaltransformdatapoint.emit()%
+ \pgfpointtransformed{\pgfpointorigin}%
+ }%
+ #3{}%
+ \fi%
+ }%
+}%
+
+
+% Handle a moveto
+%
+% This command has no parameters since the target of the moveto is
+% given by the canvas position of the current local data point.
+\def\pgfpathdvmoveto{%
+ \pgfdv@generic{\pgf@signalpath}{\pgfdvpathmovetotoken}{\pgfpathmoveto}
+}%
+
+
+% Handle a lineto
+%
+% This command has no parameters since the target of the moveto is
+% given by the canvas position of the current local data point.
+\def\pgfpathdvlineto{%
+ \pgfdv@generic{\pgf@signalpath}{\pgfdvpathlinetotoken}{\pgfpathlineto}
+}%
+
+
+
+% Compute a normalized vector at the current point pointing along a
+% line from #1 to #2.
+%
+% #1 = code for setting the attributes of the first point
+% #2 = code for setting the attributes of the second point
+%
+% The current point should be a point on a line from #1 to
+% #2. Both points as well as the current point are
+% localized on the canvas and a vector pointing from the first point
+% to the second one is returned. However, for instance in polar
+% coordinates the vector may actually "point along" the angle axis.
+%
+% Internally, this command first sets up the first data point and then
+% emits a "direction" signal with the \pgfdvpathdirectionfromtoken set and
+% then sets up the second point and emits the corresponding
+% ...totoken. Finally, the \pgfdvpathdirectionattoken is emitted.
+%
+
+\def\pgfpointdvdirection#1#2{%
+ {
+ {
+ #1
+ \pgfdv@generic{\pgf@signaldirection}{\pgfdvdirectionfromtoken}{\xdef\pgf@dv@from{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}
+ }
+ {
+ #2
+ \pgfdv@generic{\pgf@signaldirection}{\pgfdvdirectiontotoken}{\xdef\pgf@dv@to{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}
+ }
+ {\pgfdv@generic{\pgf@signaldirection}{\pgfdvdirectionattoken}{%
+ \pgf@process{
+ \pgfpointnormalised{%
+ \pgfpointdiff{\pgf@dv@from}{\pgf@dv@to}
+ }
+ }}}
+ }
+}%
+
+
+
+
+
+%
+%
+% Data parsing and formatting
+%
+%
+
+
+
+% Run the rendering pipeline on a dataset and/or save the dataset.
+%
+% #1 = options with path /pgf/data/
+% #2 = optionally data given inline in curly braces.
+%
+% Description:
+%
+% This command is used to define a data set. For a single data
+% visualization, multiple data sets can be defined, they will
+% accumulate. Data can be in different formats, as specified by the
+% "format" key, and you can define new formats.
+%
+% The settings of the following keys are important:
+%
+% /pgf/data visualization/obj
+% contains a handle to the dv-object
+%
+% /pgf/data/format
+% stores the format (see below)
+%
+% /pgf/data/read from file
+% determines where the data is.
+%
+% /pgf/data/store in group
+% when nonempty, the data is stored here instead of being fed to the
+% rendering pipeline
+%
+% /pgf/data/use group
+% when nonempty, data that has previously been stored here using
+% |define group| is read from here and all other keys are ignored
+%
+% If "read from file" is empty, the data is stored in the argument that
+% follows. Otherwise, the data is read from the specified source file.
+% This data is stored in an internal variable, which is local to the
+% current group.
+%
+% After the group, the key "/pgf/data/continue code" will be
+% executed.
+%
+% When the data is actually used later on (during a survey or a
+% visualization), independently of what source is used, a format
+% handler is started for each data set. This works as follows: first,
+% the handler's startup code is executed. Then for each line of the
+% data file/the data given inline, the line handler function is
+% called. Finally, the data format end handler is called.
+%
+% The format handler's job is to call \pgfdatapoint each time a
+% complete data point has been produced.
+%
+% Example:
+%
+% \pgfoonew \dv=new data visualization()
+% \pgfoonew \obj=new attribute mapper(...)
+% ...
+%
+% \pgfkeys{/pgf/data/.cd,
+% column 1=dax/low,
+% column 2=dax/high,
+% column 3=dax/entry,
+% column 4=dax/exit}
+%
+% \pgfdata[format=space separated columns]
+% {
+% % today
+% 2000 2300 2100 2200
+% 2000 2350 2200 2500
+% 2200 2300 2250 2260
+% 1800 2260 2260 1900
+% 2000 2300 2100 2200
+% }
+%
+% \pgfdata[format=comma separated columns]
+% {
+% % yesterday
+% 2000, 2350, 2200, 2250
+% 2200, 2300, 2250, 2260
+% }
+%
+% \pgfdata[read from file=data.csv,format=comma separated columns]
+%
+% \dv.survey()
+% \dv.visualize()
+
+\def\pgfdata{\pgfutil@ifnextchar[{\pgf@datagroup@data@opt}{\pgf@datagroup@data@opt[]}}%}%
+\def\pgf@datagroup@data@opt[#1]{%
+ % Ok, add one data thing...
+ \begingroup%
+ \pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}%
+ \pgfkeysgetvalue{/pgf/data/continue code}\pgf@dv@cont@code%
+ \global\let\pgf@dv@cont@code\pgf@dv@cont@code%
+ \pgfkeysgetvalue{/pgf/data/use group}\pgf@dv@use@group%
+ \ifx\pgf@dv@use@group\pgfutil@empty%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data(\pgf@do@data{#1})}%
+ \expandafter\pgf@datagroup@data@opt@cont%
+ \else%
+ \expandafter\ifx\csname pgf@dv@group@@\pgf@dv@use@group\endcsname\relax%
+ \pgferror{Undefined data group '\pgf@dv@use@group'}%
+ \else%
+ {%
+ \pgfkeys{/pgf/data/define group/.code=}% no redefinitions during use
+ \csname pgf@dv@group@@\pgf@dv@use@group\endcsname%
+ }%
+ \fi%
+ \endgroup%
+ \expandafter\pgf@dv@cont@code%
+ \fi%
+}%
+\def\pgf@datagroup@data@opt@cont{%
+ \pgfkeysgetvalue{/pgf/data/format}\pgf@dv@format%
+ \expandafter\let\expandafter\pgf@dv@format@catcodes\csname pgfdv@format@\pgf@dv@format @catcodes\endcsname%
+ \ifx\pgf@dv@format@catcodes\relax
+ \pgferror{Unknown data format '\pgf@dv@format'}%
+ \else%
+ \pgfkeysgetvalue{/pgf/data/read from file}\pgf@dv@source%
+ \ifx\pgf@dv@source\pgfutil@empty%
+ \let\pgf@next\pgf@datagroup@grab@inline%
+ \else%
+ \let\pgf@next\pgf@datagroup@grab@external%
+ \fi%
+ \pgf@next%
+}%
+
+\def\pgf@datagroup@grab@inline{%
+ \pgfutil@ifnextchar\bgroup{%
+ \begingroup%
+ \catcode`\^^M=\active%
+ \pgf@dv@format@catcodes%
+ \pgf@datagroup@grab@@inline}%
+ {\pgferror{Opening brace expected}}%
+}%
+\def\pgf@datagroup@grab@external{%
+ \fi%
+ \endgroup%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{{\pgf@datagroup@do@external}}})}%
+ \pgf@dv@cont@code%
+}%
+
+\def\pgf@dv@do@adddata#1{%
+ \pgfkeysgetvalue{/pgf/data/store in group}\pgf@dv@temp%
+ \ifx\pgf@dv@temp\pgfutil@empty%
+ #1%
+ \else%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@dv@group@@\pgf@dv@temp\endcsname{#1}%
+ \fi%
+}%
+
+{\catcode`\^=7 \catcode`\^^M=13
+ \gdef\pgf@datagroup@grab@@inline#1{%
+ \endgroup%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{{\pgf@datagroup@do@inline#1^^M\pgf@@eol}}})}%
+ \fi%
+ \endgroup%
+ \pgf@dv@cont@code%
+ }%
+}%
+\def\pgf@@eol{\pgf@eol}%
+
+\def\pgf@do@data#1#2{%
+ \begingroup%
+ \pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}%
+ \pgfkeysgetvalue{/pgf/data/format}\pgf@dv@format%
+ \expandafter\let\expandafter\pgf@dv@format@line\csname pgfdv@format@\pgf@dv@format @line\endcsname%
+ \expandafter\let\expandafter\pgf@dv@format@emptyline\csname pgfdv@format@\pgf@dv@format @empty\endcsname%
+ \csname pgfdv@format@\pgfkeysvalueof{/pgf/data/format}@startup\endcsname%
+ #2%
+ \csname pgfdv@format@\pgfkeysvalueof{/pgf/data/format}@end\endcsname%
+ \endgroup%
+}%
+
+
+%
+% Read external file
+%
+
+\def\pgf@datagroup@do@external{%
+ \csname pgfdv@format@\pgfkeysvalueof{/pgf/data/format}@catcodes\endcsname%
+ \immediate\openin\r@pgf@reada=\pgfkeysvalueof{/pgf/data/read from file} %
+ \ifeof\r@pgf@reada\relax
+ \pgferror{Data file '\pgfkeysvalueof{/pgf/data/read from file}' not found}%
+ \else
+ \pgf@datagroup@readline%
+ \fi
+ \immediate\closein\r@pgf@reada%
+}%
+
+\def\pgf@partext{\par}%
+\def\pgf@datagroup@readline{%
+ \immediate\read\r@pgf@reada to \pgf@temp%
+ \ifx\pgf@temp\pgf@partext%
+ \pgf@dv@format@emptyline%
+ \else%
+ \ifx\pgf@temp\pgfutil@empty%
+ \pgf@dv@format@emptyline%
+ \else%
+ \expandafter\pgf@dv@format@line\pgf@temp\pgfeol%
+ \fi%
+ \fi%
+ \ifeof\r@pgf@reada\else\expandafter\pgf@datagroup@readline\fi%
+}%
+
+
+%
+% Read inline data
+%
+
+\def\pgf@datagroup@do@inline{%
+ \pgf@dv@handle@line%
+}%
+
+{\catcode`\^=7 \catcode`\^^M=13
+\gdef\pgf@dv@handle@line{%
+ \pgfutil@ifnextchar^^M{\pgf@dv@format@emptyline\expandafter\pgf@dv@handle@line\pgfutil@gobble}%
+ {\pgfutil@ifnextchar\pgf@@eol{\pgfutil@gobble}{\pgf@dv@handle@nonemptyline}}%
+}%
+\gdef\pgf@dv@handle@nonemptyline#1^^M{%
+ \pgf@dv@format@line#1\pgfeol%
+ \pgf@dv@handle@line%
+}%
+}%
+
+\pgfkeys{
+ /pgf/data/data visualization obj/.initial=\undefined,
+ /pgf/data/format/.initial=table,% the default format
+ /pgf/data/read from file/.initial=,
+ /pgf/data/inline/.style={read from file=},
+ /pgf/data/continue code/.initial=,
+ /pgf/data/store in group/.initial=,
+ /pgf/data/new group/.code={\expandafter\global\expandafter\let\csname pgf@dv@group@@#1\endcsname\pgfutil@empty},
+ /pgf/data/use group/.initial=,
+}%
+
+
+
+
+
+
+% Define a data format
+%
+% #1 = format name
+% #2 = catcode code
+% #3 = startup code
+% #4 = line arguments
+% #5 = line code
+% #6 = empty line code
+% #7 = end code
+%
+% Description:
+%
+% This command defines a new data format for data visualization. When
+% a data set is visualized and the format is set to #1, this handler
+% is used to parse the data.
+%
+% In detail, the \pgfdata command will select a source. Before this
+% source is read, #2 will be executed to setup the
+% catcodes. Additionally, each time the data is parsed, #3 will be
+% called. Then, for each nonempty line of the source, the
+% command #5 is executed, where the line will be matched against the
+% argument pattern given in #4. For empty lines, #6 will be executed
+% instead. At the end of the source, #7 will be executed.
+
+\def\pgfdeclaredataformat#1#2#3#4#5#6#7{%
+ \expandafter\def\csname pgfdv@format@#1@catcodes\endcsname{#2}%
+ \expandafter\def\csname pgfdv@format@#1@startup\endcsname{#3}%
+ \expandafter\def\csname pgfdv@format@#1@line\endcsname#4\pgfeol{#5}%
+ \expandafter\def\csname pgfdv@format@#1@empty\endcsname{#6}%
+ \expandafter\def\csname pgfdv@format@#1@end\endcsname{#7}%
+}%
+
+
+
+%
+% Predefined standard formats
+%
+
+% TeX code format
+%
+% Description:
+%
+% The lines of the data set are assumed to contain executable TeX
+% code that will call \pgfdatapoint.
+%
+% Example:
+%
+% \pgfdatavisualizationrender[format=TeX code]
+% \dataset{
+% \pgfkeyssetvalue{/data point/x}{5}
+% \pgfkeyssetvalue{/data point/y}{5}
+% \pgfdatapoint
+% \pgfkeyssetvalue{/data point/x}{6}
+% \pgfkeyssetvalue{/data point/y}{6}
+% \pgfdatapoint
+% }
+
+\pgfdeclaredataformat{TeX code}{}{}{#1}{#1 }{}{}%
+
+
+
+% Key-value lines format
+%
+% Description:
+%
+% The lines of the data set are passed to \pgfkeys with the path set
+% to /data point.
+%
+% Example:
+%
+% \data[format=named] {
+% x=5, y=6, hi=9
+% x=7, y=6, lo=10
+% }
+
+\pgfdeclaredataformat{named}{}{}{#1}{\pgf@dv@parse@named#1,\pgf@stop}{}{}%
+\def\pgf@dv@parse@named{%
+ \pgfutil@ifnextchar\pgf@stop{\pgfdatapoint\pgfutil@gobble}{\pgf@dv@parse@named@}
+}%
+\def\pgf@dv@parse@named@#1=#2,#3\pgf@stop{%
+ \foreach \pgf@dv@temp in {#2} {%
+ \def\pgf@dv@tempb{/data point/#1=}%
+ \expandafter\expandafter\expandafter\pgfkeys%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@dv@tempb\pgf@dv@temp}%
+ \pgf@dv@parse@named#3\pgf@stop%
+ }
+}%
+
+
+
+
+
+% Table format
+%
+% Description:
+%
+% A table consists of a head line, which contains the attribute names
+% of the values that will be found in the following lines. Each line
+% (except for the headline) contains one data point.
+%
+% Inside each line the data points are separated by a separator like a
+% comma or a space or a colon. The separator can be configured using
+% the key /pgf/data/separator (leave the separator empty or set it to
+% \space for a space as separator). The default separator is a comma.
+%
+% Some tables will miss the headline. In this case, using the
+% /pgf/data/headline key you can provide a headline yourself.
+%
+% Example:
+%
+% \data[format=table] {
+% x y
+% 10 5
+% 11 6
+% 6 7
+% }
+%
+% \data[format=table,separator={,}] {
+% x, y
+% 10, 5
+% 11, 6
+% 6, 7
+% }
+%
+% \data[format=table,headline=x y] {
+% 10 5
+% 11 6
+% 6 7
+% }
+
+\pgfdeclaredataformat{table}
+{} % no catcodes
+{
+ \pgfkeysgetvalue{/pgf/data/headline}\pgf@dv@headline
+ \pgfkeysgetvalue{/pgf/data/separator}\pgf@dv@separator
+ \ifx\pgf@dv@separator\pgfutil@empty
+ \let\pgf@dv@separator\space
+ \fi
+ \ifx\pgf@dv@separator\pgf@dv@spacetext
+ \let\pgf@dv@separator\space
+ \fi
+ \expandafter\def\expandafter\pgf@dv@till@separator%
+ \expandafter##\expandafter1\pgf@dv@separator{\pgf@dv@table@handle{##1}}
+ \expandafter\def\expandafter\pgf@dv@till@separator@head%
+ \expandafter##\expandafter1\pgf@dv@separator{\pgf@dv@head@handle{##1}}
+ \ifx\pgf@dv@headline\pgfutil@empty
+ % Ok, read headline from file
+ \pgfdv@firstlinetrue
+ \else
+ % Headline already set
+ \pgfdv@firstlinefalse
+ \expandafter\pgf@dv@parse@headline\expandafter{\pgf@dv@headline}
+ \fi
+}
+{#1} % special line pattern, so read everything
+{
+ \ifpgfdv@firstline
+ \pgfdv@firstlinefalse
+ \pgf@dv@parse@headline{#1}
+ \else
+ {
+ \c@pgf@counta=0\relax% keep track of attribute number
+ \def\pgf@marshal{\pgf@dv@parse@table#1}
+ \expandafter\expandafter\expandafter\pgf@marshal%
+ \expandafter\pgf@dv@separator\expandafter\pgfeol\pgf@dv@separator
+ \pgfdatapoint
+ }
+ \fi
+}
+{}% ignore empty lines
+{}% no special end code
+
+\newif\ifpgfdv@firstline
+
+\pgfkeys{
+ /pgf/data/separator/.initial={,},
+ /pgf/data/headline/.initial=
+}%
+\def\pgf@dv@spacetext{\space}%
+
+\def\pgf@dv@parse@table{%
+ \pgfutil@ifnextchar"% Special, but ignored right now...
+ {\pgferror{csv with quotes not yet implemented}}
+ {\pgf@dv@till@separator}
+}%
+\def\pgf@dv@table@handle#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfeoltext%
+ % Bingo! Stop
+ \let\pgf@next=\relax%
+ \else%
+ \advance\c@pgf@counta by1\relax%
+ \pgfkeysgetvalue{/pgf/data/table/attribute \the\c@pgf@counta}\pgf@dv@target
+ \ifx\pgf@dv@target\relax%
+ \edef\pgf@dv@target{attribute \the\c@pgf@counta}
+ \pgfkeyslet{/pgf/data/table/attribute \the\c@pgf@counta}\pgf@dv@target
+ \fi
+ \pgfkeyssetvalue{/data point/\pgf@dv@target}{#1}
+ \let\pgf@next=\pgf@dv@parse@table%
+ \fi%
+ \pgf@next%
+}%
+
+
+
+\def\pgf@dv@parse@headline#1{
+ \c@pgf@counta=0\relax% keep track of attribute number
+ \def\pgf@marshal{\pgf@dv@doparse@headline#1}
+ \expandafter\expandafter\expandafter\pgf@marshal%
+ \expandafter\pgf@dv@separator\expandafter\pgfeol\pgf@dv@separator
+}%
+
+\def\pgf@dv@doparse@headline{%
+ \pgfutil@ifnextchar"% Special, but ignored right now...
+ {\pgferror{csv with quotes not yet implemented}}
+ {\pgf@dv@till@separator@head}
+}%
+\def\pgf@dv@head@handle#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfeoltext%
+ % Bingo! Stop
+ \let\pgf@next=\relax%
+ \else%
+ \advance\c@pgf@counta by1\relax%
+ \pgfkeyssetvalue{/pgf/data/table/attribute \the\c@pgf@counta}{#1}
+ \let\pgf@next=\pgf@dv@doparse@headline%
+ \fi%
+ \pgf@next%
+}%
+
+\def\pgfeoltext{\pgfeol}%
+
+
+%
+%
+% Micro math kernel for dv
+%
+%
+
+% The idea behind the following methods is to "abstract away" which
+% math engine is used. In the future, something fancy build on luatex
+% might be used, so it would we should not rely directly on the
+% fpu library code.
+%
+% The system works as follows: First, you "enter" a number into the
+% engine. When you do so, it is converted into some internal
+% representation that cannot be accessed any more and is called a
+% "math variable" henceforth. All commands of the
+% math system only work on math variables.
+%
+% In order to "exit" a value stored in a math variable from the
+% engine, some other macros can be used.
+%
+% Operations like addition or multiplication take two math variables
+% and store the result in another math variable.
+
+
+
+% Store a value in a math variable of the math engine
+%
+% #1 = a math variable (a macro name) that is to store the value
+% #2 = an expression describing a number
+%
+%
+% Description:
+%
+% The #2 should be an expression that evaluates to a number. However,
+% due to the way the pgf math engine(s) work, currently, there are
+% several restrictions/the syntax is not as simple as one might
+% hope. Fortunately, the syntax is hopefully compatible with
+% easier-to-use future systems.
+%
+% The syntax is as follows: #2 may be
+%
+% 1. a simple high-precision number. This number is currently directly
+% passed to \pgfmathfloatparsenumber, so typical permissible values
+% are "100" or "10000000000000" or "nan" or "-5.673543345345e9000"
+%
+% 2. a mathematical expression, which *must* be surrounded by
+% parentheses. From a "mathematical" point of view these
+% parentheses are superfluous, but the they are used to help pgf
+% distinguish expressions from high-precision numbers. (If, in the
+% future, expressions may contain high precision numbers, the
+% parentheses will simply be ignored.)
+%
+% The expression is evaluated using \pgfmathparse, which means that
+% TeX-precision is used. This means, for instance, that numbers
+% larger than about 16500 will create error messages.
+%
+% The advantage is that you may say write things like "(5+6)" or
+% "(pi/2)".
+%
+% 3. In case #2 starts with an exclamation mark (indicating an
+% "escape"), everything following the mark is simply evaluated by
+% TeX. The effect of evaluating #2 should be that the math
+% variable "\pgfdvmathvalue" is set to some value. This value will
+% then be transferred to #1.
+%
+% 4. In case #2 is the result of calling \pgfdvmathexitbyserializing, the
+% "serialized" value is restored. The idea is that the serialized
+% will turn its internal representation of a number into something
+% that can be stored as a text somewhere.
+%
+% Currently, "@" at the beginning of #2 is used to indicate that
+% what follows is a serialized version of a math variable.
+%
+% In order to determine which of the above cases is to be used for a
+% variable, the first symbol #2 is checked, *after* the first symbol
+% of #2 has been expanded once (using \expandafter once).
+%
+% Example:
+%
+% \pgfdvmathenter{\mymacro}{20000000000000}
+% \pgfdvmathenter{\mymacro}{(5+pi)}
+% \pgfdvmathenter{\mymacro}{!\pgfdvmathadd{\pgfdvmathvalue}{\a}{\b}}
+%
+% \pgfdvmathenter{\foo}{5}
+% \pgfdvmathexitbyserializing{\somevalue}{\foo}
+% \pgfdvmathenter{\mymacro}{\somevalue}
+
+\def\pgfdvmathenter#1#2{%
+ \expandafter\pgfdvmathenter@check\expandafter#1#2\pgfdvmath@end%
+}%
+\def\pgfdvmathenter@check#1{%
+ \pgfutil@ifnextchar @{\pgfdvmath@internal#1}{%
+ \pgfutil@ifnextchar ({\pgfdvmath@expression#1}{%)
+ \pgfutil@ifnextchar !{\pgfdvmath@execute#1}{\pgfdvmath@normal#1}}}%
+}%
+
+\def\pgfdvmath@internal#1@#2\pgfdvmath@end{%
+ \def#1{#2}%
+}%
+\def\pgfdvmath@expression#1(#2)#3\pgfdvmath@end{%
+ \pgfmathparse{#2}%
+ \pgfmathfloatparsenumber{\pgfmathresult}%
+ \let#1=\pgfmathresult%
+}%
+\def\pgfdvmath@execute#1!#2\pgfdvmath@end{%
+ #2%
+ \let#1=\pgfdvmathvalue%
+}%
+\def\pgfdvmath@normal#1#2\pgfdvmath@end{%
+ \pgfmathfloatparsenumber{#2}%
+ \let#1=\pgfmathresult%
+}%
+
+
+
+% Print a math variable in the math engine using \pgfmathprintnumber
+%
+% #1 = math variable
+%
+% Description:
+%
+% See the description of \pgfmathprintnumber
+%
+% Example:
+%
+% \pgfdvmathenter{\mymacro}{20000000000000}
+% \pgfdvmathexitbyprinting{\mymacro}
+
+\def\pgfdvmathexitbyprinting#1{%
+ \pgfmathprintnumber{#1}%
+}%
+
+
+
+% Exit a math variable as a number in a scientific and portable number
+% format in a macro
+%
+% #1 = macro in which to store the value
+% #2 = math variable
+%
+% Description:
+%
+% You can exit a number using this operation. You can then directly
+% reenter the number using \pgfdvmathenter
+%
+% Example:
+%
+% \pgfdvmathenter{\mynumber}{20000000000000}
+% \pgfdvmathexitbyscientificformat{\mymacro}{\mynumber}
+
+\def\pgfdvmathexitbyscientificformat#1#2{%
+ \edef#1{\pgfmathfloatvalueof#2}%
+}%
+
+
+
+% Exit a math variable as a "serialized" (= string-based)
+% version.
+%
+% #1 = macro in which to store the value
+% #2 = math variable
+%
+% Description:
+%
+% The serialized version can be reentered using
+% \pgfmathenter and is similar to \pgfdvmathexitbyscientificformat,
+% but exiting and entering are (a bit) faster.
+%
+% Example:
+%
+% \pgfdvmathenter{\mynumber}{20000000000000}
+% \pgfdvmathexitbyserializing{\mymacro}{\mynumber}
+
+\def\pgfdvmathexitbyserializing#1#2{%
+ \edef#1{@#2}%
+}%
+
+
+
+
+
+% Operations on two numbers
+%
+% #1 = macro that should store the result of applying the
+% corresponding operation to the following:
+% #2 = entered number
+% #3 = entered number
+%
+% Description:
+%
+% Sets #1 to the result of applying an operation to #2 and #3
+%
+% Example:
+%
+% \pgfdvmathenter{\a}{2000}
+% \pgfdvmathenter{\b}{5+6}
+% \pgfdvmathadd{\c}{\a}{\b}
+
+\def\pgfdvmathadd#1#2#3{%
+ \pgfmathfloatadd{#2}{#3}%
+ \let#1=\pgfmathresult%
+}%
+\def\pgfdvmathsub#1#2#3{%
+ \pgfmathfloatsubtract{#2}{#3}%
+ \let#1=\pgfmathresult%
+}%
+\def\pgfdvmathmul#1#2#3{%
+ \pgfmathfloatmultiply{#2}{#3}%
+ \let#1=\pgfmathresult%
+}%
+\def\pgfdvmathdiv#1#2#3{%
+ \pgfmathfloatdivide{#2}{#3}%
+ \let#1=\pgfmathresult%
+}%
+
+% Multiply by small number
+%
+% #1 = macro that should store the result of applying the
+% corresponding operation to the following:
+% #2 = entered number
+% #3 = fixed point number like 2 or 0.5, but not 10000000000
+%
+% Description:
+%
+% Sets #1 to the result of applying an operation to #2 and #3
+%
+% Example:
+%
+% \pgfdvmathenter{\a}{2000}
+% \pgfdvmathadd{\b}{\a}{0.2}
+% % \b now stores 400
+
+\def\pgfdvmathmulfixed#1#2#3{%
+ \pgfmathfloatmultiplyfixed{#2}{#3}%
+ \let#1=\pgfmathresult%
+}%
+
+
+
+% Log, ln and exponent functions
+%
+% #1 = a math variable
+% #2 = a math variable
+%
+% Description
+%
+% \pgfdvmathln will compute #1 = ln(#2)
+% \pgfdvmathlog will compute #1 = log_{10}(#2)
+% \pgfdvmathexp will compute #1 = exp(#2)
+% \pgfdvmathpowten will compute #1 = 10^{#2}
+
+\def\pgfdvmathln#1#2{%
+ \pgfmathfloatln{#2}%
+ \let#1=\pgfmathresult%
+}%
+
+\def\pgfdvmathlog#1#2{%
+ \pgfmathfloatln{#2}%
+ \pgfmathfloatmultiply{\pgfmathresult}{\pgfdvmathalwaysloge}%
+ \let#1=\pgfmathresult%
+}%
+
+\def\pgfdvmathexp#1#2{%
+ \pgfmathfloatexp{#2}%
+ \let#1=\pgfmathresult%
+}%
+
+\def\pgfdvmathpowten#1#2{%
+ \pgfmathfloattofixed{#2}%
+ \let\pgf@dv@temp=\pgfmathresult%
+ \pgfmathround{\pgf@dv@temp}%
+ \let\pgf@dv@temp@round=\pgfmathresult%
+ \pgf@x=\pgf@dv@temp@round pt%
+ \pgf@x=-\pgf@x%
+ \advance\pgf@x by\pgf@dv@temp pt\relax%
+ \ifdim\pgf@x>0.0002pt%
+ \pgfmathfloatmultiply{#2}{\pgfdvmathalwayslnten}%
+ \pgfmathfloatexp{\pgfmathresult}%
+ \else
+ \ifdim\pgf@x<-0.0002pt%
+ \pgfmathfloatmultiply{#2}{\pgfdvmathalwayslnten}%
+ \pgfmathfloatexp{\pgfmathresult}%
+ \else
+ \pgf@x=\pgf@dv@temp@round sp%
+ \c@pgf@counta=\pgf@x%
+ \pgfmathfloatcreate{1}{1.0}{\the\c@pgf@counta}%
+ \fi
+ \fi
+ \let#1=\pgfmathresult%
+}%
+
+
+% Floor functions
+%
+% #1 = a math variable
+% #2 = a math variable
+%
+% Description
+%
+% Sets #1 to the largest integer less or equal to #2
+
+\def\pgfdvmathfloor#1#2{%
+ \pgfmathifisint{#2}{%
+ \let#1=#2%
+ }{%
+ \pgfmathfloatgetflags#2\c@pgf@counta%
+ \ifcase\c@pgf@counta
+ \let#1=\pgfdvmathalwayszero%
+ \or
+ \pgfmathfloatfloor{#2}%
+ \let#1=\pgfmathresult%
+ \or
+ \pgfmathfloatsubtract{\pgfdvmathalwaysone}{#2}%
+ \pgfmathfloatfloor{\pgfmathresult}%
+ \pgfmathfloatsubtract{\pgfdvmathalwayszero}{\pgfmathresult}%
+ \let#1=\pgfmathresult%
+ \or\let#1=#2%
+ \or\let#1=#2%
+ \or\let#1=#2%
+ \fi%
+ }%
+}%
+
+
+% Advanced unary operations
+%
+% #1 = macro that should store the result of applying the
+% operation to an entered number
+% #2 = the operation (as a string like "ln")
+% #3 = entered number
+%
+% Description:
+%
+% Sets #1 to the result of applying #2 to #3
+%
+% Example:
+%
+% \pgfdvmathenter{\a}{2000}
+% \pgfdvmathunaryop{\b}{ln}{\a}
+
+\def\pgfdvmathunaryop#1#2#3{%
+ \csname pgfmathfloat#2\endcsname{#3}%
+ \let#1=\pgfmathresult%
+}%
+
+
+% Advanced binary operations
+%
+% #1 = macro that should store the result of applying the
+% operation to two entered number
+% #2 = the operation (as a string like "veclen")
+% #3 = first argument (an entered number)
+% #4 = second argument (an entered number)
+%
+% Description:
+%
+% Sets #1 to the result of applying #2 to #3
+%
+% Example:
+%
+% \pgfdvmathenter{\a}{3}
+% \pgfdvmathenter{\b}{4}
+% \pgfdvmathbinop{\c}{veclen}{\a}{\b}
+
+\def\pgfdvmathbinop#1#2#3#4{%
+ \csname pgfmathfloat#2\endcsname{#3}{#4}%
+ \let#1=\pgfmathresult%
+}%
+
+
+
+% Comparing values
+%
+% #1 = first math variable
+% #2 = second math variable
+% #3 = code to-be-executed if #1 < #2
+% #4 = code to-be-executed if #1 >= #2
+%
+%
+% Example:
+%
+% \pgfdvmathenter{\a}{3}
+% \pgfdvmathenter{\b}{4}
+% \pgfdvmathifless{\a}{\b}{yes}{should not happen}
+
+\def\pgfdvmathifless#1#2#3#4{%
+ \pgfmathfloatlessthan{#1}{#2}%
+ \ifpgfmathfloatcomparison#3\else#4\fi%
+}%
+
+
+
+
+%
+%
+% Standard objects for data visualization
+%
+%
+
+
+%
+% Transformers
+%
+
+\pgfooclass{linear transformer}
+{%
+ % Class linear transformer
+ %
+ % This class is a transformer class. It reacts to the transform
+ % datapoint signal. When this signal is raised, it will shift the
+ % coordinate system as follows: If the current value of /data
+ % point/this.attribute is 0, then the system is shifted to the
+ % current value of this.origin. If the current value is 1, the
+ % system is shifted to this.origin + this.unit vector. For other
+ % values of /data point/this.attribuate, the shift is interpolated
+ % between these two values.
+
+
+ \attribute attribute;%
+ % The attribute (/data point/this.attribute) by which
+ % the unit vector is multiplied. If it is empty (which is
+ % different from 0), no transformation is done at all.
+
+ \attribute origin = \pgfpointorigin;%
+ % The shift in case the /data point/this.attribute is 0.
+
+ \attribute unit vector;%
+ % The coordinate system is additionally shifted by this amount
+ % times the current value of /data point/this.attribute.
+
+
+ % Constructor
+ %
+ % #1 = attribute that is being transformed. Example: x
+ % #2 = a vector corresponding to one unit of #1.
+ % Example: \pgfpoint{1cm}{0cm}
+ \method linear transformer(#1,#2) {
+ \pgfooset{attribute}{#1}
+ \pgf@process{#2}
+ \edef\pgf@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \pgfoolet{unit vector}\pgf@temp%
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,transform,transform datapoint signal)
+ }%
+
+ % Setter
+ \method set origin(#1) {
+ \pgf@process{#1}
+ \edef\pgf@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \pgfoolet{origin}\pgf@temp%
+ }%
+
+ % Slot
+ %
+ % This slot should be connected to the transform datapoint
+ % signal. When this signal is emitted, the coordinate system will be
+ % shifted according to the current value of the attribute.
+ \method transform() {
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{attribute}}\pgf@dv@val%
+ \ifx\pgf@dv@val\pgfutil@empty%
+ \else%
+ \ifx\pgf@dv@val\relax%
+ \else%
+ \pgfdvmathenter{\pgf@dv@math@var}{\pgf@dv@val}%
+ \pgfdvmathexitbyscientificformat{\pgf@dv@val}{\pgf@dv@math@var}%
+ \pgftransformshift{\pgfoovalueof{origin}}%
+ \pgfmathfloatgetexponent\pgf@dv@math@var\c@pgf@counta%
+ \ifnum\c@pgf@counta<-3\relax%
+ \else%
+ \pgftransformshift{\pgfpointscale{\pgf@dv@val}{\pgfoovalueof{unit vector}}}%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+%
+% Numerical mapping of attributes to other attributes
+%
+
+\pgfooclass{interval mapper}
+{%
+ % Class interval mapper
+ %
+ % This interval mapper reacts to the map datapoint signal. Its purpose is to
+ % map one attribute to another attribute. For the first attribute,
+ % an intervals is specified.
+ %
+ % In addition to the in interval [a,b] there is also an outinterval
+ % [c,d]. Values in the range [a,b] are linearly mapped to the
+ % range [c,d] and the result is stored in the second attribute.
+ %
+ % For instance, if the first range is [10,20] and the second range
+ % is [0,100], then 10 is mapped to 0, 11 is mapped to 10, 20 is
+ % mapped to 100 and 30 is mapped to 200.
+ %
+ % It is permissible to specify an additional non-linear
+ % transformation function f. In this case, for an input value x the
+ % position of f(x) inside the interval [f(a),f(b)] is determined and
+ % this position is linearly mapped to [c,d].
+ %
+ % For example, if f(x) = log_10 (x) and the first range [a,b] =
+ % [10,1000] and the second range is [1,2], then 10 is mapped to 1,
+ % 100 is mapped to 1.5 (since f(100) = 3 lies in the middle
+ % between f(10) = 2 and f(1000) = 4) and 100000 is mapped to 3.
+
+
+ \attribute in;%
+ % The name of the input attribute. If the value of this attribute
+ % is empty or undefined, no mapping is done.
+ %
+ % The in attribute may have a subkey called .../const. If this key
+ % has a value different from \relax, it will always be used instead
+ % of the in attribute itself. This can be useful to temporarily
+ % set a constant value to a key inside a mapping chain.
+ %
+ % If the subkey /is min or max is set to "min" or "max", the mapping
+ % will always be done to the respective out min or out max values.
+
+ \attribute out;%
+ % The name of the output attribute.
+
+ \attribute trans;%
+ % Stores (more or less) the transformation function.
+
+ \attribute out min;%
+ % Start of the second range (the value of c).
+
+ \attribute out min;%
+ % End of the second range (the value of d).
+
+ \attribute trans in min;%
+ % Transformed value of the start of the first range (the value
+ % f(a)).
+
+ \attribute scale;%
+ % The scaling factor, that is, the value of (f(b)-f(a))/(d-c).
+
+
+ % Constructor
+ %
+ % #1 = input attribute. Example: velocity.
+ % #2 = output attribute. Example: x
+ % #3 = optional transformation function. The input value for this
+ % function is stored in entered number \pgfvalue.
+ % The output of the function should be stored in the
+ % same entered number.
+ %
+ % The intervals are set using setter methods later on.
+ %
+ \method interval mapper(#1,#2,#3) {
+ \pgfooset{in}{#1}
+ \pgfooset{out}{#2}
+ \def\pgf@temp{#3}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgfooset{trans}{%
+ #3%
+ }%
+ \fi%
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,map,map datapoint signal)
+ }%
+
+ % Method
+ %
+ % #1 = in interval minimum
+ % #2 = in interval maximum
+ % #3 = out interval minimum
+ % #4 = out interval maximum
+ %
+ % This method will (re)compute the correct mappings for the interval
+ % mapper.
+ \method set interval values(#1,#2,#3,#4) {
+ {%
+ \pgfdvmathenter{\pgf@in@interval@min}{#1}
+ \pgfdvmathenter{\pgf@in@interval@max}{#2}
+ \pgfdvmathenter{\pgf@out@interval@min}{#3}
+ \pgfdvmathenter{\pgf@out@interval@max}{#4}
+ % Let's start with the output, it's easier...
+ \pgfoolet{out min}{\pgf@out@interval@min}
+ \pgfoolet{out max}{\pgf@out@interval@max}
+ \pgfdvmathifless{\pgf@in@interval@min}{\pgf@in@interval@max}{%
+ \pgfdvmathsub{\pgf@out@diff}{\pgf@out@interval@max}{\pgf@out@interval@min}
+ \let\pgfvalue=\pgf@in@interval@min
+ \pgfoovalueof{trans}
+ \let\pgf@in@interval@min@transformed=\pgfvalue
+ \pgfoolet{trans in min}{\pgf@in@interval@min@transformed}%
+ \let\pgfvalue=\pgf@in@interval@max
+ \pgfoovalueof{trans}
+ \let\pgf@in@interval@max@transformed=\pgfvalue
+ \pgfdvmathsub{\pgf@diff@in@transformed}{\pgf@in@interval@max@transformed}{\pgf@in@interval@min@transformed}
+ %
+ % Precompute the scaling
+ %
+ \pgfdvmathdiv{\pgf@scale}{\pgf@out@diff}{\pgf@diff@in@transformed}%
+ \pgfoolet{scale}{\pgf@scale}%
+ }{%
+ \pgfoolet{scale}\pgf@dv@no@scale%
+ }%
+ }%
+ }%
+ \def\pgf@dv@no@scale{noscale}%
+
+ % Slot
+ \method map() {
+ \pgfooget{scale}\pgf@dv@scale
+ \ifx\pgf@dv@scale\pgfutil@empty%
+ % not yet setup
+ \else%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{in}/is min or max}\pgf@dv@is%
+ \ifx\pgf@dv@is\pgf@min@text%
+ \pgf@dv@set@out@min%
+ \else%
+ \ifx\pgf@dv@is\pgf@max@text%
+ \pgf@dv@set@out@max%
+ \else%
+ \ifx\pgf@dv@scale\pgf@dv@no@scale%
+ \pgf@dv@mapper@goto@mid%
+ \else%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{in}/const}\pgf@dv@external@value%
+ \ifx\pgf@dv@external@value\relax%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{in}}\pgf@dv@external@value%
+ \fi%
+ \ifx\pgf@dv@external@value\pgfutil@empty%
+ \pgf@dv@mapper@pos@check%
+ \else%
+ \ifx\pgf@dv@external@value\relax%
+ \pgf@dv@mapper@pos@check%
+ \else%
+ \pgfdvmathenter{\pgfvalue}{\pgf@dv@external@value}%
+ \pgf@dv@mapper@trans
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ }%
+
+ \def\pgf@dv@set@out@min{%
+ \pgfkeyslet{/data point/\pgfoovalueof{out}/is min or max}\pgf@min@text%
+ \pgfooget{out min}{\pgf@minmax@temp}%
+ \pgf@dv@set@out@now%
+ }%
+ \def\pgf@dv@set@out@max{%
+ \pgfkeyslet{/data point/\pgfoovalueof{out}/is min or max}\pgf@max@text%
+ \pgfooget{out max}{\pgf@minmax@temp}%
+ \pgf@dv@set@out@now%
+ }%
+ \def\pgf@dv@set@out@now{%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{out}/offset}\pgf@dv@external@offset%
+ \ifx\pgf@dv@external@offset\relax\else%
+ \ifx\pgf@dv@external@offset\pgfutil@empty\else%
+ \pgfdvmathenter{\pgfvalue}{\pgf@minmax@temp}%
+ \pgfdvmathenter{\pgf@dv@offset}{\pgf@dv@external@offset}%
+ \pgfdvmathadd{\pgfvalue}{\pgfvalue}{\pgf@dv@offset}
+ \pgfdvmathexitbyserializing{\pgf@minmax@temp}{\pgfvalue}%
+ \fi
+ \fi
+ \pgfkeyslet{/data point/\pgfoovalueof{out}}\pgf@minmax@temp%
+ }%
+
+ \def\pgf@dv@mapper@trans{
+ \pgfooget{trans in min}{\pgf@dv@trans@in@min}%
+ \pgfooget{scale}{\pgf@dv@scale}%
+ \pgfooget{out min}{\pgf@dv@out@min}%
+ \pgfoovalueof{trans}%
+ \pgfdvmathsub{\pgfvalue}{\pgfvalue}{\pgf@dv@trans@in@min}%
+ \pgfdvmathmul{\pgfvalue}{\pgfvalue}{\pgf@dv@scale}%
+ \pgfdvmathadd{\pgfvalue}{\pgfvalue}{\pgf@dv@out@min}%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{out}/offset}\pgf@dv@external@offset%
+ \ifx\pgf@dv@external@offset\relax\else%
+ \ifx\pgf@dv@external@offset\pgfutil@empty\else%
+ \pgfdvmathenter{\pgf@dv@offset}{\pgf@dv@external@offset}%
+ \pgfdvmathadd{\pgfvalue}{\pgfvalue}{\pgf@dv@offset}
+ \fi
+ \fi
+ \pgfdvmathexitbyserializing{\pgf@temp}{\pgfvalue}%
+ \pgfkeyslet{/data point/\pgfoovalueof{out}}\pgf@temp%
+ }%
+
+ \def\pgf@dv@mapper@pos@check{%
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{in}/out pos}\pgf@dv@pos@value%
+ \ifx\pgf@dv@pos@value\relax\else\if\pgf@dv@pos@value\pgfutil@empty\else%
+ \pgfmathsetmacro{\pgf@dv@pos@num}{\pgf@dv@pos@value}%
+ \pgfmathsetmacro{\pgf@dv@pos@num@prime}{1-\pgf@dv@pos@num}%
+ % Ok, compute transformed min position:
+ \pgfooget{out min}{\pgf@out@interval@min}
+ \pgfooget{out max}{\pgf@out@interval@max}
+ \pgfdvmathmulfixed{\pgf@out@interval@min}{\pgf@out@interval@min}{\pgf@dv@pos@num@prime}
+ \pgfdvmathmulfixed{\pgf@out@interval@max}{\pgf@out@interval@max}{\pgf@dv@pos@num}
+ \pgfdvmathadd{\pgf@out@val}{\pgf@out@interval@min}{\pgf@out@interval@max}%
+ \pgfdvmathexitbyserializing{\pgf@temp}{\pgf@out@val}%
+ \pgfkeyslet{/data point/\pgfoovalueof{out}}\pgf@temp%
+ \fi\fi%
+ }%
+
+ \def\pgf@dv@mapper@goto@mid{%
+ % Ok, compute transformed min position:
+ \pgfooget{out min}{\pgf@out@interval@min}
+ \pgfooget{out max}{\pgf@out@interval@max}
+ \pgfdvmathmulfixed{\pgf@out@interval@min}{\pgf@out@interval@min}{.5}
+ \pgfdvmathmulfixed{\pgf@out@interval@max}{\pgf@out@interval@max}{.5}
+ \pgfdvmathadd{\pgf@out@val}{\pgf@out@interval@min}{\pgf@out@interval@max}%
+ \pgfdvmathexitbyserializing{\pgf@temp}{\pgf@out@val}%
+ \pgfkeyslet{/data point/\pgfoovalueof{out}}\pgf@temp%
+ }%
+}%
+
+
+
+
+
+%\newif\ifpgf@dvclip
+\newif\ifpgf@dvignore
+
+\pgfooclass{scaling mapper}
+{%
+ % Class scaling mapper
+ %
+ % A scaling mapper is (mainly) used to scale an attribute in such a way
+ % that it can be rendered easily on a page. The idea is that you
+ % specify some attribute and a desired target interval size (like
+ % [0,5]). The scaling mapper will then survey the data and will setup a
+ % interval mapper in such a way that the minimum value present in the data is
+ % mapped to 0 and the maximum to 5. However, it is also possible to,
+ % say, only have the maximum value mapped to 5 and have 0 be mapped
+ % to 0. Other, more complicated specifications are also possible.
+ %
+ % The scaling mapper internally creates several objects: First, a surveyor
+ % for determining the minimum and maximum values of the attribute
+ % and a interval mapper for then mapping the values to the scaled
+ % values. Additionally, interval objects are needed.
+
+ \attribute in;%
+ % The to-be-scaled attribute;
+
+ \attribute out;%
+ % The attribute storing the scaled value.
+
+ \attribute in range obj;%
+ % This interval keep track of the range of the in attribute
+
+ \attribute scaling spec;%
+ % A specification of how the scaling should be performed.
+ %
+ % The format is the following:
+ %
+ % #1 at #2 and #3 at #4
+ %
+ % Here, #2 and #4 must be numbers. #1 and #3 can either be numbers
+ % or #1 can be the text "min" and #3 can be the text "max".
+ %
+ % The effect of such a specification is the following: The value #1
+ % is mapped to #2, the value #3 is mapped to #4 and values between
+ % #1 and #3 (or outside this range) are mapped linearly to a value
+ % between (or outside) #2 and #4. In case #1 is set to "min", the
+ % smallest observed value of the in-attribute is mapped to #3 and
+ % similarly for a value of "max" for #3.
+ %
+ % Additionally, as for a interval mapper, a function f might be specified
+ % that deforms the linear mapping. In case f is specified,
+ % f(#1) is mapped to #2 and f(#3) is mapped to #4.
+
+ \attribute spec maps min;%
+ % When the scaling spec maps "min" to some value, rather than some
+ % specific value to that value, then spec maps min will be set to
+ % \pgfutil@firstoftwo, otherwise to \pgfutil@secondoftwo
+
+ \attribute spec maps max;%
+ % Like spec maps min
+
+ \attribute function;%
+ % Stores the function
+
+ \attribute interval mapper;%
+ % Stores the interval mapper object
+
+ \attribute range surveyor;%
+ % Stores the range surveyor object
+
+
+ % Constructor
+ %
+ % #1 = in attribute
+ % #2 = out attribute
+ % #3 = scaling specification
+ % #4 = optional function
+ %
+ \method scaling mapper(#1,#2,#3,#4) {
+ %
+ % Save the parameters in attributes
+ %
+ \pgfooset{in}{#1}
+ \pgfooset{out}{#2}
+ \pgfooset{scaling spec}{#3}
+ \pgfooset{function}{#4}
+ %
+ % Now setup the objects for the before survey phase
+ %
+ %
+ % First, the in range interval
+ \pgfoonew \pgf@dv@in@range@obj=new interval(,)
+ \pgfoolet{in range obj}\pgf@dv@in@range@obj
+ % Second, the in range surveyor. We do not need to store this
+ % object, it will "do its work in the background"
+ \pgfoonew \pgf@dv@range@obj=new range surveyor(#1,\pgf@dv@in@range@obj)
+ \pgf@dv@range@obj.default connects()
+ \pgfoolet{range surveyor}\pgf@dv@range@obj
+ %
+ %
+ % The interval mapper:
+ %
+ \pgfoonew{interval mapper}=new interval mapper(#1,#2,#4)
+ \pgfoovalueof{interval mapper}.default connects()
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,phase,phase signal)
+ }%
+
+ % Getter
+ %
+ % Returns an interval object that stores the range of the in
+ % attribute.
+ \method get in range interval() {
+ \pgfooget{in range obj}\pgfdvinrangeinterval
+ }%
+
+
+ % Getter
+ %
+ % Returns the out attribute.
+ %
+ \method get out() {
+ \pgfooget{out}\pgfdvout
+ }%
+
+ % Getter
+ %
+ % Returns the function attribute.
+ %
+ \method get function(#1) {
+ \pgfooget{function}#1
+ }%
+
+ % Method
+ %
+ % #1 = a included in value
+ %
+ % This method only affects the survey. The value #1 is recorded as
+ % if it were encountered for the in attribute at some point.
+ %
+ \method include in value(#1) {
+ \pgfoovalueof{range surveyor}.include attribute value({#1})
+ }%
+
+
+ % Method
+ %
+ % #1 = value for the attribute
+ %
+ % Sets the attribute to the (evaluated) given value (evaluation
+ % using \pgfmathparse). When the value is evaluated, the values of
+ % \pgfdvmin and \pgfdvmax will be set to the minimum and maximum
+ % values of the in interval. (See \pgfdvmathenter with the "!"-notation).
+ %
+ % In case #1 is set to the special value "min", it evaluates to
+ % \pgfdvmin, when set to "max" it evaluates to \pgfdvmax.
+ %
+ \method set in to(#1) {%
+ \edef\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@min@text%
+ \pgf@dv@lib@set@mm%
+ \let\pgf@dv@value\pgfdvmin%
+ \pgfoovalueof{spec maps min}{\pgfkeyslet{/data point/\pgfoovalueof{in}/is min or max}\pgf@min@text}{}%
+ \else%
+ \ifx\pgf@temp\pgf@max@text%
+ \pgf@dv@lib@set@mm%
+ \let\pgf@dv@value\pgfdvmax%
+ \pgfoovalueof{spec maps min}{\pgfkeyslet{/data point/\pgfoovalueof{in}/is min or max}\pgf@max@text}{}%
+ \else%
+ \pgfdvmathenter{\pgf@dv@value}{\pgf@temp}%
+ \fi%
+ \fi%
+ \pgfdvmathexitbyserializing{\pgf@dv@serial}{\pgf@dv@value}%
+ \pgfkeyslet{/data point/\pgfoovalueof{in}}\pgf@dv@serial%
+ }%
+ \def\pgf@dv@lib@set@mm{
+ \pgfooget{in range obj}\pgfdvinrangeinterval
+ \pgfdvinrangeinterval.get min and max()%
+ }%
+
+
+ % Slot
+ \method phase(#1) {
+ \ifx#1\pgfdvendsurvey
+ % Ok, we setup the interval mapper.
+ %
+ % We start by computing the interval borders:
+ \pgfoovalueof{in range obj}.get min and max()
+ \ifx\pgfdvmin\pgfutil@empty% undefined, since no data points
+ \else%
+ \pgfooget{scaling spec}\pgf@temp%
+ \expandafter\pgf@lib@dv@parse@scaling\pgf@temp\pgf@stop%
+ \pgfoovalueof{interval mapper}.set interval values(%
+ \pgf@lib@dv@min,\pgf@lib@dv@max,%
+ \pgf@lib@dv@min@at,\pgf@lib@dv@max@at)
+ \fi
+ \fi
+ }%
+
+
+ % Internal helper
+ \def\pgf@lib@dv@parse@scaling#1 at#2and #3 at#4\pgf@stop{%
+ \def\pgf@lib@dv@min{#1}%
+ \pgfdvmathenter{\pgf@lib@dv@min@at@mv}{#2}
+ \def\pgf@lib@dv@max{#3}%
+ \pgfdvmathenter{\pgf@lib@dv@max@at@mv}{#4}
+ \ifx\pgf@lib@dv@min\pgf@min@text%
+ \let\pgf@lib@dv@min@mv\pgfdvmin
+ \pgfoolet{spec maps min}\pgfutil@firstoftwo%
+ \else
+ \pgfdvmathenter{\pgf@lib@dv@min@mv}{\pgf@lib@dv@min}
+ \pgfoolet{spec maps min}\pgfutil@secondoftwo%
+ \fi
+ \ifx\pgf@lib@dv@max\pgf@max@text%
+ \let\pgf@lib@dv@max@mv\pgfdvmax
+ \pgfoolet{spec maps max}\pgfutil@firstoftwo%
+ \else
+ \pgfdvmathenter{\pgf@lib@dv@max@mv}{\pgf@lib@dv@max}
+ \pgfoolet{spec maps max}\pgfutil@secondoftwo%
+ \fi
+ \pgfdvmathexitbyserializing{\pgf@lib@dv@min}{\pgf@lib@dv@min@mv}
+ \pgfdvmathexitbyserializing{\pgf@lib@dv@min@at}{\pgf@lib@dv@min@at@mv}
+ \pgfdvmathexitbyserializing{\pgf@lib@dv@max}{\pgf@lib@dv@max@mv}
+ \pgfdvmathexitbyserializing{\pgf@lib@dv@max@at}{\pgf@lib@dv@max@at@mv}
+ }%
+ \def\pgf@min@text{min}%
+ \def\pgf@max@text{max}%
+}%
+
+
+
+
+
+%
+% Surveyors
+%
+
+\pgfooclass{range surveyor}
+{%
+ % Class range surveyor
+ %
+ % A range surveyor is used only in the survey phase. Its job is to
+ % determine the minimum and maximum values of an attribute that are
+ % "seen" during the survey phase. Based on this value, the size of,
+ % say, an axis can be determined later on.
+ %
+ % You can also set the key "sub attributes" of the attribute. In
+ % this case, this key should contain -- as the name suggests -- a
+ % list of subkeys that should also be taken into account for the
+ % computation of the minimum and maximum value. Inside the "sub
+ % attributes" key, each subkey should be surrounded by a call of
+ % \pgfdvsub. For instance, if there are two sub attributes "/data
+ % point/velocity/min" and "/data point/velocity/max" for a key
+ % "/data point/velocity", then "/data point/velocity/sub attributes"
+ % should be set to "\pgfdvsub{/min}\pgfdvsub{/max}".
+
+ \attribute attribute;%
+ % The to-be-surveyed attribute
+
+ \attribute interval obj;%
+ % The interval object that protocols the minimum and maximum
+ % values.
+
+
+ % Constructor
+ %
+ % #1 = the attribute
+ % #2 = handle to the interval object
+ %
+ \method range surveyor(#1,#2) {
+ \pgfooset{attribute}{#1}
+ \pgfoolet{interval obj}#2
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,survey,survey datapoint signal)
+ }%
+
+ % Method
+ %
+ % #1 = a value
+ %
+ % Adjust the interval as if during the survey this value were
+ % encountered
+ \method include attribute value(#1) {
+ \pgf@dv@assign@val@stripped#1\pgf@stop%
+ \pgfoovalueof{interval obj}.adjust(\pgf@dv@range@surv)
+ }%
+ \def\pgf@dv@assign@val@stripped#1\pgf@stop{%
+ \def\pgf@dv@val{#1}
+ }%
+
+ % Slot
+ %
+ % This slot should be connected to the survey datapoint signal. For
+ % each datapoint, this method will call the adjust method of the
+ % interval.
+ %
+ \method survey() {
+ \let\pgfdvsub\pgf@dv@range@surv@sub
+ \pgfdvsub{}%
+ \pgfkeysvalueof{/data point/\pgfoovalueof{attribute}/sub attributes}
+ }%
+
+ \def\pgf@dv@range@surv@sub#1{
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{attribute}#1}\pgf@dv@val%
+ \ifx\pgf@dv@val\relax%
+ \else%
+ \edef\pgf@dv@val{\pgf@dv@val}%
+ \ifx\pgf@dv@val\pgfutil@empty%
+ \else%
+ \pgfoovalueof{interval obj}.adjust(\pgf@dv@range@surv)%
+ \fi%
+ \fi%
+ }%
+
+ \def\pgf@dv@range@surv{%
+ \pgfdvmathenter{\pgf@dv@value}{\pgf@dv@val}%
+ % Now, protocol value
+ \ifx\pgfdvmin\pgfutil@empty%
+ \let\pgfdvmin\pgf@dv@value%
+ \else%
+ \pgfdvmathifless{\pgf@dv@value}{\pgfdvmin}{\let\pgfdvmin\pgf@dv@value}{}%
+ \fi%
+ \ifx\pgfdvmax\pgfutil@empty%
+ \let\pgfdvmax\pgf@dv@value%
+ \else%
+ \pgfdvmathifless{\pgfdvmax}{\pgf@dv@value}{\let\pgfdvmax\pgf@dv@value}{}%
+ \fi%
+ }%
+}%
+
+
+
+%
+% Visualizers
+%
+
+\usepgflibrary{plothandlers}%
+
+
+
+\pgfooclass{plot handler visualizer}
+{%
+ % Class plot handler visualizer
+ %
+ % This visualizer uses one or more plot handlers to visualize data points.
+ % As the data points are processed, the canvas positions of the data
+ % points are recorded. At the end of a group of data points, the
+ % recorded stream of canvas position is visualized (rendered)
+ % using plot handlers. For instance, when the lineto plot handler
+ % is used, the data points are connected by straight lines, when the
+ % curveto plot handler is used, they are connected by smooth curves
+ % and so on.
+ %
+ % Since plot lines are not drawn immediately, but only at the end,
+ % when everything has been collected, multiple plot handlers can
+ % coexist peacefully at the same time.
+ %
+ % You can specify a "filter", which will cause only those data
+ % points to be visualized by the visualizer that pass the test. The
+ % filter should set \pgfdvfilterpassedfalse for to-be-filtered data
+ % point.
+ %
+ % You can specify "projection code" that changes the canvas x and
+ % canvas y positions. This projection code allows you to draw, say,
+ % projected points instead of the actual data point.
+ %
+ % The keys /data point/<name>/execute at begin and /data
+ % point/<name>/execute at end, where <name> is the name of
+ % the visualizer, should store code that is to be executed directly
+ % before and after the stream of coordinates is created. Typically,
+ % these keys will store commands to use the path created by the plot
+ % handler.
+
+ \attribute handlers;%
+ % The to-be-used handlers
+
+ \attribute name;%
+ % The attribute
+
+ \attribute filter=\pgfdvnamedvisualizerfilter;%
+ % Filter code
+
+ \attribute positions;%
+ % An internal protocol of the positions on the stream
+
+ \attribute cache;%
+ % An internal cache. Positions are first inserted into this
+ % cache. Every 100 steps this cache is moved to positions. The idea
+ % behind this is that it will avoid the quadratic time increase that
+ % is normally caused when a protocol is build in TeX.
+
+ \attribute projection code;%
+ % This code is empty by default. However, you can set it for
+ % instance to the following
+ %
+ % \pgfkeyssetvalue{/data point/y=0}\pgfdvmapdatapointtocanvas
+ %
+ % in order to visualize the data point with its y-coordinate
+ % replaced by 0.
+
+ % Constructor
+ %
+ % #1 = A name
+ % #2 = A comma-separated list of handlers like
+ % "\pgfplothandlerlineto,\pgfplothandlercurveto"
+ %
+ \method plot handler visualizer(#1,#2) {
+ \pgfooset{name}{#1}
+ \pgfooset{handlers}{#2}
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,protocol,visualize datapoint signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,phase,phase signal)
+ }%
+
+ % Setter
+ \method set filter(#1) {
+ \pgfooset{filter}{#1}
+ }%
+
+ % Setter
+ \method set projection code(#1) {
+ \pgfooset{projection code}{#1}
+ }%
+
+ % Slot
+ \method protocol() {
+ \pgfdvfilterpassedtrue
+ \pgfoovalueof{filter}
+ \ifpgfdvfilterpassed%
+ \pgf@dv@line@cache@it
+ \fi%
+ }%
+
+ \def\pgf@dv@line@cache@it{
+ % Cache it
+ \pgfooget{cache}\pgf@dv@cache
+ \pgfkeysgetvalue{/data point/outlier}\pgf@temp%
+ \ifx\pgf@temp\pgfutil@empty
+ {%
+ \pgfoovalueof{projection code}
+ \xdef\pgf@dv@add{\noexpand\pgf@dv@ph{\pgfkeysvalueof{/data
+ point/canvas x}}{\pgfkeysvalueof{/data point/canvas y}}}%
+ }
+ \else%
+ % An outlier!
+ \gdef\pgf@dv@add{\pgf@dv@outliner}%
+ \fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@dv@cache%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@dv@cache\pgf@dv@add}%
+ % Possibly flush cache
+ \global\advance\pgf@lib@dv@cache@count by1\relax%
+ \ifnum\pgf@lib@dv@cache@count=100\relax%
+ \global\pgf@lib@dv@cache@count=0\relax%
+ % Append cache to positions
+ \pgfooget{positions}\pgf@dv@temp
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@dv@temp%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@dv@temp\pgf@dv@cache}%
+ \pgfoolet{positions}\pgf@dv@temp
+ \let\pgf@dv@cache\pgfutil@empty
+ \fi
+ \pgfoolet{cache}\pgf@dv@cache
+ }%
+
+ % Slot
+ \method phase(#1) {%
+ \ifx#1\pgfdvendvisualization%
+ \pgfoothis.render()%
+ \fi%
+ }%
+
+ % Internal method
+ \method render() {
+ \pgfscope
+ \pgfooget{handlers}\tikz@dv@temp@list
+ \foreach\tikz@dv@temp in\tikz@dv@temp@list{
+ \ifx\tikz@dv@temp\pgfutil@empty
+ \else
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at begin}
+ \tikz@dv@temp
+ \pgfdvnewstreamtrue
+ \pgfoovalueof{positions}
+ \pgfoovalueof{cache}
+ \ifpgfdvnewstream\else\pgfplotstreamend\fi
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at end}
+ \fi
+ }
+ \endpgfscope
+ \pgfoolet{positions}\pgfutil@empty
+ \pgfoolet{cache}\pgfutil@empty
+ }%
+
+ \def\pgf@dv@ph#1#2{\ifpgfdvnewstream\pgfplotstreamstart\pgfdvnewstreamfalse\fi\pgfplotstreampoint{\pgfqpoint{#1}{#2}}}%
+ \def\pgf@dv@outliner{\ifpgfdvnewstream\else\pgfplotstreamend\pgfdvnewstreamtrue\fi}%
+}%
+
+\newif\ifpgfdvnewstream
+\newcount\pgf@lib@dv@cache@count
+
+\pgfkeys{%
+ /data point/outlier/.initial=,
+ /data point/outlier/.default=true,
+}%
+
+
+% A possible filter for unnamed visualizers
+%
+% #1 = Text to be compared with key /data point/set
+%
+% Description:
+%
+% In a data visualization with multiple visualizers, data points
+% typically "belong" only to a single visualizer. It is, thus,
+% necessary to filter data points according to the current
+% visualizer. This current visualizer is assumed to be stored in /data
+% point/visualizer.
+%
+% When objects allow you to set a filter, you can use this filter to
+% test against /data point/set being equal to #1.
+
+\def\pgfdvvisualizerfilter#1{%
+ \pgfkeysgetvalue{/data point/set}\pgf@dv@visualizer%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@dv@visualizer%
+ \else
+ \pgfdvfilterpassedfalse
+ \fi%
+}%
+
+
+
+% A filter for named visualizer
+%
+% Description:
+%
+% This filter works like \pgfdvvisualizerfilter, only it assumes the
+% the object defines a "name" attribute. In this case, the value of
+% /data point/set is tested against this attribute.
+
+\def\pgfdvnamedvisualizerfilter{%
+ \pgfkeysgetvalue{/data point/set}\pgf@dv@visualizer%
+ \pgfooget{name}\pgf@temp%
+ \ifx\pgf@temp\pgf@dv@visualizer%
+ \else
+ \pgfdvfilterpassedfalse
+ \fi%
+}%
+
+
+
+\pgfooclass{rectangle visualizer}
+{%
+ % Class rectangle visualizer
+ %
+ % This visualizer visualizes a datapoint as a rectangle. It needs
+ % a name, so that /data point/<name>/attribute 1 and /data
+ % point/<name>/attribute 2 store two attributes names a1 to a2. Then,
+ % provided the current value of /data point/set equals name, for
+ % each data point a rectangle between (a1/min,a2/min) and
+ % (a1/max,a2/max) is created.
+
+
+ \attribute name;%
+ % The name
+
+ \attribute a1;%
+ \attribute a2;%
+ % The attributes, filled from /data point/<name>/attribute 1 and 2
+
+
+ % Constructor
+ %
+ % #1 = first attribute
+ % #2 = second attribute
+ %
+ \method rectangle visualizer(#1) {
+ \pgfooset{name}{#1}
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,visualize,visualize datapoint signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,phase,phase signal)
+ }%
+
+ % Slot
+ \method phase(#1) {%
+ \ifx#1\pgfdvbeginsurvey%
+ \pgfooeset{a1}{/data point/\pgfkeysvalueof{/data point/\pgfoovalueof{name}/attribute 1}}
+ \pgfooeset{a2}{/data point/\pgfkeysvalueof{/data point/\pgfoovalueof{name}/attribute 2}}
+ \pgfkeyssetvalue{\pgfoovalueof{a1}/sub attributes}{\pgfdvsub{/min}\pgfdvsub{/max}}
+ \pgfkeyssetvalue{\pgfoovalueof{a2}/sub attributes}{\pgfdvsub{/min}\pgfdvsub{/max}}
+ \fi%
+ }%
+
+ % Slot
+ \method visualize() {
+ {
+ \pgfkeysgetvalue{/data point/set}\pgf@dv@visualizer%
+ \pgfooget{name}\pgf@temp%
+ \ifx\pgf@temp\pgf@dv@visualizer%
+ \pgf@dv@rect@do
+ \fi
+ }
+ }%
+
+ \def\pgf@dv@rect@do{
+ \pgfkeysgetvalue{\pgfoovalueof{a1}/min}\pgf@dv@amin
+ \ifx\pgf@dv@amin\relax\else\ifx\pgf@dv@amin\pgfutil@empty\else
+ \pgfkeysgetvalue{\pgfoovalueof{a1}/max}\pgf@dv@amax
+ \ifx\pgf@dv@amax\relax\else\ifx\pgf@dv@amax\pgfutil@empty\else
+ \pgfkeysgetvalue{\pgfoovalueof{a2}/min}\pgf@dv@bmin
+ \ifx\pgf@dv@bmin\relax\else\ifx\pgf@dv@bmin\pgfutil@empty\else
+ \pgfkeysgetvalue{\pgfoovalueof{a2}/max}\pgf@dv@bmax
+ \ifx\pgf@dv@bmax\relax\else\ifx\pgf@dv@bmax\pgfutil@empty\else
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at begin}
+ \pgfkeyssetvalue{\pgfoovalueof{a1}}{\pgf@dv@amin}
+ \pgfkeyssetvalue{\pgfoovalueof{a2}}{\pgf@dv@bmin}
+ \pgfpathdvmoveto
+ \pgfkeyssetvalue{\pgfoovalueof{a2}}{\pgf@dv@bmax}
+ \pgfpathdvlineto
+ \pgfkeyssetvalue{\pgfoovalueof{a1}}{\pgf@dv@amax}
+ \pgfpathdvlineto
+ \pgfkeyssetvalue{\pgfoovalueof{a2}}{\pgf@dv@bmin}
+ \pgfpathdvlineto
+ \pgfkeyssetvalue{\pgfoovalueof{a1}}{\pgf@dv@amin}
+ \pgfpathdvlineto
+ \pgfpathclose
+ \pgfkeysvalueof{/data point/\pgfoovalueof{name}/execute at end}
+ \fi\fi
+ \fi\fi
+ \fi\fi
+ \fi\fi
+ }%
+}%
+
+\newcount\pgf@lib@dv@cache@count
+
+
+
+%
+% Label positioning classes
+%
+
+\pgfooclass{label visualizer}
+{%
+ % Class label visualizer
+ %
+ % The job of this class is to visualize a label of a curve or some
+ % other object.
+ %
+ % The idea is as follows: This class monitors a certain
+ % attribute. When this attribute reaches a certain value for the
+ % first time, the following happens: A normalized vector of the line
+ % connecting the current canvas position to the canvas position of
+ % the previous data point is computed and stored in pgf@x/pgf@y. The
+ % coordinate system is shifted so that the current data point is at
+ % the origin. Then, some drawing code is executed.
+
+ \attribute attribute;%
+ % The monitored attribute
+
+ \attribute filter;%
+ % Filter code, see plot handler visualizer doc.
+
+ \attribute threshold;%
+ % When the attribute exceeds this threshold, the drawing code is
+ % executed
+
+ \attribute before canvas position=;%
+ % Stores canvas position of the data point before the interesting one
+
+ \attribute canvas position=;%
+ % Stores canvas position of the data point
+
+ \attribute code;%
+ % To-be-executed code when the label should be drawn
+
+
+ % Constructor
+ %
+ % #1 = attribute
+ % #2 = a macro, storing the threshold
+ % #3 = code
+ % #4 = filter code
+ %
+ \method label visualizer(#1,#2,#3,#4) {
+ \pgfooset{attribute}{#1}
+ \expandafter\pgfdvmathenter\expandafter{\expandafter\pgf@temp\expandafter}\expandafter{#2}
+ \pgfoolet{threshold}\pgf@temp
+ \pgfooset{code}{#3}
+ \pgfooset{filter}{#4}
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,test,visualize datapoint signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,phase,phase signal)
+ }%
+
+ % Slot
+ \method test() {
+ \pgfdvfilterpassedtrue
+ \pgfoovalueof{filter}
+ \ifpgfdvfilterpassed%
+ \pgfooget{attribute}\pgf@dv@attribute
+ \ifx\pgf@dv@attribute\pgfutil@empty%
+ % nothing to do (anymore)
+ \else%
+ \pgf@dv@label@vis@record
+ \fi%
+ \fi%
+ }%
+
+ \def\pgf@dv@label@vis@record{
+ % Record current position
+ \edef\pgf@dv@pos{%
+ \noexpand\pgfqpoint%
+ {\pgfkeysvalueof{/data point/canvas x}}%
+ {\pgfkeysvalueof{/data point/canvas y}}}%
+ \pgfooget{canvas position}\pgf@dv@temp%
+ \pgfoolet{before canvas position}\pgf@dv@temp%
+ \pgfoolet{canvas position}\pgf@dv@pos%
+ % Now check threshold
+ \pgfooget{threshold}\pgf@dv@thres%
+ \ifx\pgf@dv@thres\pgfutil@empty%
+ \else%
+ % Hmm, have to check, whether the value is, indeed, correct
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{attribute}}\pgf@dv@val
+ \ifx\pgf@dv@val\relax%
+ \else\ifx\pgf@dv@val\pgfutil@empty%
+ \else%
+ \pgfdvmathenter{\pgf@dv@value}{\pgf@dv@val}%
+ \pgfooget{threshold}{\pgf@dv@thres}
+ % Now, protocol value
+ \pgfdvmathifless{\pgf@dv@value}{\pgf@dv@thres}{}{%
+ \pgfoolet{attribute}\pgfutil@empty% Stop!
+ }%
+ \fi\fi%
+ \fi%
+ }%
+
+ % Slot
+ \method phase(#1) {%
+ \ifx#1\pgfdvendvisualization%
+ \scope
+ \pgfcoordinate{label visualizer coordinate}{\pgfoovalueof{canvas position}}
+ \pgfcoordinate{label visualizer coordinate'}{\pgfoovalueof{before canvas position}}
+ \pgfoovalueof{code}
+ \endscope
+ \fi%
+ }%
+}%
+
+
+
+%
+% Style sheets
+%
+\pgfooclass{style attribute}
+{%
+ % Class style attribute
+ %
+ % Instances of this class are used to select a style based on the
+ % current value of an attribute.
+ %
+ % Instances of this class monitor an attribute. Whenever the "style"
+ % signal is raised, the object investigates the current value of the
+ % attribute. It then looks up /pgf/data visualization/style
+ % sheets/<name of style sheet>/<value of the attribute> and executes
+ % this key, provided it is defined. If it not defined, the key
+ % /pgf/data visualization/style sheets/<name of style sheet>/default
+ % style is executed with the value as a parameter.
+
+ \attribute attribute;%
+ % The name of the attribute
+
+ \attribute style sheet name;%
+ % The styling function
+
+ % Constructor
+ %
+ % #1 = attribute (including, if present, /data point/)
+ % #2 = style sheet name
+ %
+ \method style attribute(#1,#2) {
+ \pgfooset{attribute}{#1}
+ \pgfooset{style sheet name}{#2}
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,invoke style,style signal)
+ }%
+
+ % Slots
+ \method invoke style() {
+ \pgfooget{attribute}\pgf@dv@temp
+ \pgfkeysgetvalue{\pgf@dv@temp}\pgf@dv@temp@val
+ \ifx\pgf@dv@temp@val\pgfutil@empty%do nothing
+ \else\ifx\pgf@dv@temp@val\relax%do nothing
+ \else%
+ \pgfkeysifdefined{\pgf@dv@temp/\pgf@dv@temp@val}{\pgfkeysgetvalue{\pgf@dv@temp/\pgf@dv@temp@val}\pgf@dv@temp@val}{}% redirect
+ \edef\pgf@temp{/pgf/data visualization/style sheets/\pgfoovalueof{style sheet name}}
+ \pgfkeysifassignable{\pgf@temp/\pgf@dv@temp@val}{%
+ \pgfkeysalso{\pgf@temp/\pgf@dv@temp@val}}{%
+ \pgfkeysalso{\pgf@temp/default style/.expand once=\pgf@dv@temp@val}
+ }
+ \fi\fi%
+ }%
+}%
+
+
+% Declares a new style sheet
+%
+% #1 = name of style sheet
+% #2 = settings
+%
+% Description:
+%
+% This is a shortcut for doing a /.cd to /pgf/data visualization/style sheets/#1
+
+\def\pgfdvdeclarestylesheet#1#2{
+ \pgfkeys{/pgf/data visualization/style sheets/#1/.cd,#2}
+}%
+
+
+
+
+
+
+
+
+
+%
+% Legend container class
+%
+
+\pgfooclass{legend}
+{%
+ % Class legend
+ %
+ % This class is used to collect entries into a legend. The idea is
+ % that, say, for each line of a picture you would like to have an
+ % entry in a legend. Then you prepare these entries and send
+ % them to a legend container object. It will collect the entries
+ % and, at the end, arrange them in rows and columns by
+ % separating them using \pgfdvnextcell and \pgfdvendrow.
+ %
+ % By surrounding the resulting arrangement by a call to \pgfmatrix or
+ % a call to \halign you can then create a legend.
+ %
+ % To specify how the entries should be arranged, a size
+ % specification and two directions are needed.
+ %
+ % For the size specification you specify either the ideal number of
+ % columns and the maximum number of rows or you specify the ideal
+ % number of rows and the maximum number of columns. In the first
+ % case, the class first tries to create as many columns as specified
+ % by the "ideal" parameter. If there are less entries than this
+ % parameter, you obviously get less columns, namely as many as there
+ % are entries, each column containing only one entry. If there are
+ % more entries that the ideal number of columns, you get multiple
+ % columns, each containing as many entries to make sure that the
+ % ideal number is met. However, if a column would get more than the
+ % specified maximum number of elements per column, you get more
+ % columns that the ideal number -- to ensure that no column contains
+ % more than the desired number. The case is symmetric, but with the
+ % roles of columns and rows exchanged.
+ %
+ % Here is an example: You specify that you want 2 columns, ideally,
+ % each having a maximum of 4 entries. Here is what you would get:
+ %
+ % Number of entries & Number of resulting columns ... & ... and rows
+ % 1 & 1 & 1
+ % 2 & 2 & 1
+ % 3 & 2 & 2
+ % 4 & 2 & 2
+ % 5 & 2 & 3
+ % 6 & 2 & 3
+ % 7 & 2 & 4
+ % 8 & 2 & 4
+ % 9 & 3 & 4
+ % 10 & 3 & 4
+ % 11 & 3 & 4
+ % 12 & 3 & 4
+ % 13 & 4 & 4
+ %
+ %
+ % Once the number of columns and rows has been computed, the next
+ % step is to "fill" the table. For this, eight strategies may be
+ % specified: right then down, right then up, left then down, left
+ % then up, up then right, up then left, down then right, down then
+ % left. A strategy like "right then up" means the following: Each
+ % new entry should placed right of the previous entry in the
+ % arrangement. However, once the maximum number of elements in a row
+ % has been reached, the a new row should be started that is placed
+ % above ("up") then just-assembled row.
+ %
+ %
+ %
+ %
+ % Example:
+ %
+ % You create an object \legend and then call
+ %
+ % \pgfoofnew \legend=new legend(columns,2,3,down then right)
+ % \legend.add entry(first)
+ % \legend.add entry(second)
+ % \legend.add entry(third)
+ % \legend.add entry(fourth)
+ % \legend.add entry(fifth)
+ % \legend.add entry(sixth)
+ % \legend.add entry(seventh)
+ % \legend.get arrangement(\arrangement)
+ %
+ % Then \arrangment will expand to
+ %
+ % first \pgfdvnextcell fourth \pgfdvnextcell seventh \pgfdvendrow
+ % second \pgfdvnextcell fifth \pgfdvnextcell third \pgfdvendrow
+ % third \pgfdvendrow sixth \pgfdvnextcell \pgfdvendrow
+ %
+ % By saying \let\pgfdvendrow=\\ and \let\pgfdvnextcell=&, you
+ % can use \arrangment inside a table.
+
+
+ \attribute entries;%
+ % Collects the entries
+
+ \attribute columns or rows;%
+ % Specifies whether columns or rows are specified
+
+ \attribute ideal;%
+ % The ideal number of columns/rows
+
+ \attribute max;%
+ % The maximum number of entries per column/row
+
+ \attribute strategy;%
+ % Specifies how the matrix should be filled
+
+ \attribute number of entries=0;%
+ % Counts the number of entries that have been stored
+
+
+ % Constructor
+ %
+ % #1 = "columns" or "rows" -> specifies whether the ideal number and
+ % the max entries number refer to columns or the row
+ % #2 = the ideal number of #1's
+ % #3 = the maximum number of entries in a #1
+ % #4 = one of the eight strategies
+ %
+ \method legend(#1,#2,#3,#4) {
+ \pgfooset{columns or rows}{#1}
+ \pgfooset{ideal}{#2}
+ \pgfooset{max}{#3}
+ \pgfooset{strategy}{#4}
+ }%
+
+ % Method
+ \method default connects() {
+ }%
+
+ % Method
+ \method add entry(#1) {
+ \pgfooappend{entries}{{#1}}
+ \c@pgf@counta=\pgfoovalueof{number of entries}\relax%
+ \advance\c@pgf@counta by1\relax%
+ \pgfooeset{number of entries}{\the\c@pgf@counta}
+ }%
+
+ % Method
+ \method get arrangement(#1) {
+ {
+ %
+ % Step 1: Compute the desired number of rows or columns
+ %
+ %
+ % Compute the ideal number of entries per row/column (called
+ % "target" in the following) and entries per colum/row (called
+ % "per target" in the following)
+ %
+ % if (number of entries > ideal)
+ \ifnum\pgfoovalueof{number of entries}>\pgfoovalueof{ideal}\relax%
+ % {
+ % if (ideal * max > number of entries)
+ \c@pgf@counta=\pgfoovalueof{ideal}\relax%
+ \multiply\c@pgf@counta by\pgfoovalueof{max}\relax%
+ \ifnum\c@pgf@counta>\pgfoovalueof{number of entries}\relax
+ % {
+ % target = ideal;
+ % per target = ceil (number of entries / ideal);
+ \c@pgf@counta=\pgfoovalueof{ideal}\relax%
+ \c@pgf@countb=\pgfoovalueof{number of entries}\relax
+ \advance\c@pgf@countb by-1\relax
+ \divide\c@pgf@countb by\c@pgf@counta\relax%
+ \advance\c@pgf@countb by1\relax%
+ % }
+ % else
+ % {
+ % target = ceil(number of entries / max);
+ % per target = max;
+ \else
+ \c@pgf@countb=\pgfoovalueof{max}\relax%
+ \c@pgf@counta=\pgfoovalueof{number of entries}\relax
+ \advance\c@pgf@counta by-1\relax
+ \divide\c@pgf@counta by\c@pgf@countb\relax%
+ \advance\c@pgf@counta by1\relax%
+ \fi
+ % }
+ % }
+ % else
+ % {
+ % target = number of entries;
+ % per target = 1;
+ % }
+ \else
+ \c@pgf@counta=\pgfoovalueof{number of entries}\relax%
+ \c@pgf@countb=1\relax%
+ \fi%
+ %
+ % Ensure that counta = rows, countb = columns
+ %
+ \pgfooget{columns or rows}\pgf@temp
+ \ifx\pgf@temp\pgf@dv@columnstext%
+ \c@pgf@countc=\c@pgf@counta\relax
+ \c@pgf@counta=\c@pgf@countb\relax
+ \c@pgf@countb=\c@pgf@countc\relax
+ \fi
+ %\edef\temp{rows: \the\c@pgf@counta, columns: \the\c@pgf@countb}\temp
+ %
+ % Now arrange the matrix
+ %
+ \csname pgf@dv@legend@init@\pgfoovalueof{strategy}\endcsname
+ \expandafter\let\expandafter\pgf@dv@updater\csname pgf@dv@legend@update@\pgfoovalueof{strategy}\endcsname
+ \pgfooget{entries}\pgf@temp
+ \expandafter\pgf@dv@legend@arrange\pgf@temp\pgf@stop
+ %
+ % Now assemble the matrix
+ %
+ \edef\pgf@dv@row@list{1,...,\the\c@pgf@counta}
+ \edef\pgf@dv@column@list{1,...,\the\c@pgf@countb}
+ \global\let\pgf@dv@matrix\pgfutil@empty
+ \foreach \pgf@dv@row in \pgf@dv@row@list
+ {
+ \global\let\pgf@dv@matrix@row\pgf@dv@first@mark
+ \foreach \pgf@dv@column in \pgf@dv@column@list
+ {
+ \expandafter\let\expandafter\pgf@temp\csname pgf@dv@legend@entry@\pgf@dv@row @\pgf@dv@column\endcsname
+ \ifx\pgf@temp\relax
+ \let\pgf@temp\pgfutil@empty
+ \fi
+ \ifx\pgf@dv@matrix@row\pgf@dv@first@mark
+ \global\let\pgf@dv@matrix@row\pgf@temp
+ \else
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgf@dv@matrix@row\expandafter{\expandafter\pgfdvnextcell\pgf@temp}
+ \fi
+ }
+ \pgfutil@g@addto@macro\pgf@dv@matrix@row{\pgfdvendrow}
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgf@dv@matrix\expandafter{\pgf@dv@matrix@row}
+ }
+ \global\let\pgf@dv@matrix@row\relax
+ }
+ \let#1\pgf@dv@matrix
+ \global\let\pgf@dv@matrix\relax
+ }%
+
+ \def\pgf@dv@first@mark{\pgf@dv@first@mark}%
+
+ \def\pgf@dv@legend@arrange{%
+ \pgfutil@ifnextchar\pgf@stop{\pgfutil@gobble}{\pgf@dv@legend@handle@entry}
+ }%
+
+ \def\pgf@dv@legend@handle@entry#1{
+ \expandafter\def\csname pgf@dv@legend@entry@\the\c@pgf@countc @\the\c@pgf@countd\endcsname{#1}%
+ \pgf@dv@updater%
+ \pgf@dv@legend@arrange%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@down then right\endcsname{%
+ \c@pgf@countc=1\relax%
+ \c@pgf@countd=1\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@down then right\endcsname{%
+ \advance\c@pgf@countc by1\relax
+ \ifnum\c@pgf@countc>\c@pgf@counta\relax%
+ \c@pgf@countc=1\relax%
+ \advance\c@pgf@countd by1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@right then down\endcsname{%
+ \c@pgf@countc=1\relax%
+ \c@pgf@countd=1\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@right then down\endcsname{%
+ \advance\c@pgf@countd by1\relax
+ \ifnum\c@pgf@countd>\c@pgf@countb\relax%
+ \c@pgf@countd=1\relax%
+ \advance\c@pgf@countc by1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@up then right\endcsname{%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \c@pgf@countd=1\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@up then right\endcsname{%
+ \advance\c@pgf@countc by-1\relax
+ \ifnum\c@pgf@countc=0\relax%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \advance\c@pgf@countd by1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@right then up\endcsname{%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \c@pgf@countd=1\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@right then up\endcsname{%
+ \advance\c@pgf@countd by1\relax
+ \ifnum\c@pgf@countd>\c@pgf@countb\relax%
+ \c@pgf@countd=1\relax%
+ \advance\c@pgf@countc by-1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@left then up\endcsname{%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \c@pgf@countd=\c@pgf@countb\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@left then up\endcsname{%
+ \advance\c@pgf@countd by-1\relax
+ \ifnum\c@pgf@countd=0\relax%
+ \c@pgf@countd=\c@pgf@countb\relax%
+ \advance\c@pgf@countc by-1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@up then left\endcsname{%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \c@pgf@countd=\c@pgf@countb\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@up then left\endcsname{%
+ \advance\c@pgf@countc by-1\relax
+ \ifnum\c@pgf@countc=0\relax%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \advance\c@pgf@countd by-1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@left then down\endcsname{%
+ \c@pgf@countc=1\relax%
+ \c@pgf@countd=\c@pgf@countb\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@left then down\endcsname{%
+ \advance\c@pgf@countd by-1\relax
+ \ifnum\c@pgf@countd=0\relax%
+ \c@pgf@countd=\c@pgf@countb\relax%
+ \advance\c@pgf@countc by1\relax%
+ \fi%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@init@down then left\endcsname{%
+ \c@pgf@countc=1\relax%
+ \c@pgf@countd=\c@pgf@countb\relax%
+ }%
+
+ \expandafter\def\csname pgf@dv@legend@update@down then left\endcsname{%
+ \advance\c@pgf@countc by1\relax
+ \ifnum\c@pgf@countc>\c@pgf@countb\relax%
+ \c@pgf@countc=1\relax%
+ \advance\c@pgf@countd by-1\relax%
+ \fi%
+ }%
+
+ \def\pgf@dv@columnstext{columns}%
+}%
+
+
+
+%
+% Help classes
+%
+
+\pgfooclass{interval}
+{%
+ % Class interval
+ %
+ % Instances of this class store intervals. When either the min or
+ % the max value is empty, this corresponds to "not yet set", (not to
+ % "infinity).
+
+ \attribute min;%
+ % The minimum value of the interval
+
+ \attribute max;%
+ % The maximum value of the interval
+
+ % Constructor
+ %
+ % #1 = initial minimum value
+ % #2 = initial maximum value
+ %
+ \method interval(#1,#2) {
+ \pgfooset{min}{#1}
+ \pgfooset{max}{#2}
+ }%
+
+ % Method
+ \method default connects() {
+ }%
+
+ % Sets the minimum/maximum to a new value
+ \method set min(#1) {
+ \pgfooset{min}{#1}
+ }%
+ \method set max(#1) {
+ \pgfooset{max}{#1}
+ }%
+ \method let min(#1) {
+ \pgfoolet{min}{#1}
+ }%
+ \method let max(#1) {
+ \pgfoolet{max}{#1}
+ }%
+
+ % Getter
+ %
+ % Returns the current values of the minimum and maximum in the
+ % macros \pgfdvmin and \pgfdvmax.
+ \method get min and max() {
+ \pgfooget{min}\pgfdvmin
+ \pgfooget{max}\pgfdvmax
+ }%
+
+ % Adjusts the minimum and maximum values
+ %
+ % #1 = some code. When this code is executed, the values of
+ % \pgfdvmin and \pgfdvmax will be set to the current values of
+ % the minimum/maximum. The code may change these values. The
+ % changed values will then be stored.
+ %
+ % This method does nothing that cannot be achieved also by calling
+ % set/get methods, but it is easier to use and faster.
+ \method adjust(#1) {
+ {%
+ \pgfooget{min}\pgfdvmin
+ \pgfooget{max}\pgfdvmax
+ #1%
+ \pgfoolet{min}\pgfdvmin
+ \pgfoolet{max}\pgfdvmax
+ }%
+ }%
+}%
+
+
+
+\pgfooclass{count}
+{%
+ % Class count
+ %
+ % This class can be used to count the number of data points that are
+ % present or that have a certain property. By default, for every
+ % data point a counter is incremented and the value of this counter
+ % is stored in an attribute. You can also specify an increment for
+ % the counter. You can specify that certain data points should
+ % not have an effect on the counter.
+
+
+ \attribute attribute;%
+ % The attribute that will be set to the current value of the counter
+
+ \attribute val=0;%
+ % The current value of the counter
+
+ \attribute max=0;%
+ % The current value of the counter
+
+ \attribute step=1;%
+ % The stepping by which the counter is incremented for each
+ % datapoint
+
+ \attribute start val=0;%
+ % The start value of the counter
+
+ \attribute filter=;%
+ % This attribute stores some code that is executed for each
+ % data point. If the data point sets the TeX-if ifpgfdvfilterpassed to
+ % true, then the counter is not incremented.
+
+
+ % Constructor
+ %
+ % #1 = The attribute in which the counter value is stored
+ %
+ \method count(#1) {
+ \pgfooset{attribute}{#1}
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,apply,prepare datapoint signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,phase,phase signal)
+ }%
+
+ % Getter
+ \method get max(#1) {
+ \pgfooget{max}{#1}
+ }%
+
+ % Setter
+ \method set value(#1) {
+ \pgfooset{val}{#1}
+ \pgfkeyssetvalue{/data point/\pgfoovalueof{attribute}}{#1}%
+ }%
+
+ % Setter
+ \method set start value(#1) {
+ \pgfooset{start val}{#1}
+ \pgfooset{max}{#1}
+ }%
+
+ % Setter
+ \method set filter(#1) {
+ \pgfooset{filter}{#1}
+ }%
+
+ % Setter
+ \method set step(#1) {
+ \pgfooset{step}{#1}
+ }%
+
+ % Slot
+ \method apply() {
+ \pgfdvfilterpassedtrue%
+ \pgfoovalueof{filter}%
+ \ifpgfdvfilterpassed%
+ \pgfmathparse{\pgfoovalueof{val}+\pgfoovalueof{step}}%
+ \pgfoolet{val}\pgfmathresult%
+ \pgfkeyslet{/data point/\pgfoovalueof{attribute}}\pgfmathresult%
+ \ifdim\pgfmathresult pt>\pgfoovalueof{max}pt\relax%
+ \pgfoolet{max}\pgfmathresult%
+ \fi%
+ \pgfooget{max}\pgfmathresult%
+ \pgfkeyslet{/data point/\pgfoovalueof{attribute}/max}\pgfmathresult%
+ \fi%
+ }%
+
+ % Slot
+ \method phase(#1) {
+ \ifx#1\pgfdvbeginsurvey
+ \pgfooeset{val}{\pgfoovalueof{start val}}
+ \else \ifx#1\pgfdvbeginvisualization
+ \pgfooeset{val}{\pgfoovalueof{start val}}
+ \fi\fi
+ }%
+}%
+
+\newif\ifpgfdvfilterpassed
+
+
+
+
+\pgfooclass{accumulator}
+{%
+ % Class accumulator
+ %
+ % This class is used to keep track of the sum of the values of some
+ % attribute. When this object is connected to some attribute, the
+ % subkey attribute/sum will always contain the sum of all values in
+ % all previous data points with respect to this
+ % attribute. Furthermore, the subkey attribute/prev key will hold
+ % the previous sum, which is sometimes also useful to have access
+ % to.
+
+ \attribute attribute;%
+ % The attribute to-be-accumulated
+
+ \attribute sum;%
+ % The initial value of the sum
+
+ % Constructor
+ %
+ % #1 = to-be-accumulated attribute
+ \method accumulator(#1) {
+ \pgfooset{attribute}{#1}
+ \pgfoothis.reset()
+ }%
+
+ % Method
+ \method default connects() {
+ \pgfoothis.get handle(\pgf@dv@me)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,apply,prepare datapoint signal)
+ \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,phase,phase signal)
+ }%
+
+ % Slot
+ \method apply() {%
+ % Save old sum
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{attribute}/sum}\pgf@temp%
+ \pgfkeyslet{/data point/\pgfoovalueof{attribute}/prev sum}\pgf@temp%
+ % Add new attribute...
+ \pgfkeysgetvalue{/data point/\pgfoovalueof{attribute}}{\pgf@temp@b}%
+ \pgfdvmathenter{\pgf@dv@new@val}{\pgf@temp@b}%
+ % ... to sum
+ \pgfooget{sum}\pgf@dv@sum%
+ \pgfdvmathadd{\pgf@dv@sum}{\pgf@dv@new@val}{\pgf@dv@sum}%
+ \pgfoolet{sum}\pgf@dv@sum
+ % Record in attribute
+ \pgfdvmathexitbyscientificformat{\pgf@dv@serial@sum}{\pgf@dv@sum}
+ \pgfkeyslet{/data point/\pgfoovalueof{attribute}/sum}\pgf@dv@serial@sum
+ }%
+
+ % Method
+ %
+ % Use this method to reset the sum at any point.
+ %
+ \method reset() {
+ \pgfdvmathenter{\pgf@dv@temp}{0}
+ \pgfoolet{sum}{\pgf@dv@temp}
+ \pgfdvmathexitbyserializing{\pgf@dv@zero}{\pgf@dv@temp}
+ \pgfkeyslet{/data point/\pgfoovalueof{attribute}/prev sum}{\pgf@dv@zero}
+ \pgfkeyslet{/data point/\pgfoovalueof{attribute}/sum}{\pgf@dv@zero}
+ }%
+
+ % Slot
+ \method phase(#1) {
+ \ifx#1\pgfdvbeginsurvey
+ \pgfoothis.reset()
+ \else \ifx#1\pgfdvbeginvisualization
+ \pgfoothis.reset()
+ \fi\fi
+ }%
+}%
+
+
+
+
+
+
+
+%
+%
+% Help keys and, attributes
+%
+%
+
+\pgfkeys{% do not even think of changing the values of the following:
+ /data point/always true/.initial=true,
+ /data point/always false/.initial=false,
+ /data point/always 0/.initial=0,
+ /data point/always 1/.initial=1,
+ /data point/always empty/.initial=,
+ /data point/always pgfusepath stroke/.initial=\pgfusepath{stroke},
+}%
+
+\pgfdvmathenter{\pgfdvmathalwaysloge}{0.434294481903252}%
+\pgfdvmathenter{\pgfdvmathalwayslnten}{2.302585092994046}%
+\pgfdvmathenter{\pgfdvmathalwayszero}{0}%
+\pgfdvmathenter{\pgfdvmathalwaysone}{1}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmoduledecorations.code.tex b/graphics/pgf/base/tex/pgfmoduledecorations.code.tex
new file mode 100644
index 0000000000..8c939d5cb4
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduledecorations.code.tex
@@ -0,0 +1,2191 @@
+% Copyright 2008 by Mark Wibrow and Till Tantau
+%
+% 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.
+
+
+% The following naming conventions are (more or less) observed:
+%
+% `decorated' : the path that is being decorated.
+% `decoration' : any path created/left by the automaton
+% `decorate' : generic use where distinction is probably unimportant
+% (e.g. internal macros).
+
+
+
+% These should be moved.
+%
+\def\pgfgetpath#1{\pgfsyssoftpath@getcurrentpath{#1}}%
+\def\pgfsetpath#1{\pgfsyssoftpath@setcurrentpath{#1}}%
+
+
+% Required registers.
+%
+\newdimen\pgfdecoratedcompleteddistance
+\newdimen\pgfdecoratedremainingdistance
+\newdimen\pgfdecoratedinputsegmentcompleteddistance
+\newdimen\pgfdecoratedinputsegmentremainingdistance
+\newdimen\pgf@decorate@distancetomove
+
+\newcount\pgf@decorate@repeatstate
+
+
+% Extra options used in all libraries
+
+\newdimen\pgfdecorationsegmentamplitude
+\newdimen\pgfdecorationsegmentlength
+\pgfdecorationsegmentamplitude2.5pt
+\pgfdecorationsegmentlength10pt
+\def\pgfdecorationsegmentangle{45}%
+\def\pgfdecorationsegmentaspect{0.5}%
+\def\pgfmetadecorationsegmentamplitude{2.5pt}%
+\def\pgfmetadecorationsegmentlength{1cm}%
+
+\pgfkeys{%
+ /pgf/decoration/.code={\pgfkeys{/pgf/decoration/.cd,#1}},
+ /pgf/decoration/.cd,
+ amplitude/.code={\pgfmathsetlength\pgfdecorationsegmentamplitude{#1}},
+ meta-amplitude/.store in=\pgfmetadecorationsegmentamplitude,
+ segment length/.code={\pgfmathsetlength\pgfdecorationsegmentlength{#1}},
+ meta-segment length/.store in=\pgfmetadecorationsegmentlength,
+ angle/.code={\pgfmathparse{#1}\let\pgfdecorationsegmentangle\pgfmathresult},
+ aspect/.code={\pgfmathparse{#1}\let\pgfdecorationsegmentaspect\pgfmathresult},
+ start radius/.initial=2.5pt,
+ end radius/.initial=2.5pt,
+ radius/.style={start radius=#1,end radius=#1},
+ path has corners/.is if=pgfdecoratepathhascorners,
+ reverse path/.is if=pgf@decorate@inputsegmentobjects@reverse,
+}%
+\newif\ifpgfdecoratepathhascorners
+\newif\ifpgf@decorate@inputsegmentobjects@reverse
+
+% Declare a decoration
+%
+% #1 = name of the decoration
+% #2 = initial state
+% #3 = states
+%
+% This command declares a new decoration for later use.
+% Inside the code of #3 the command \state may be used. This command
+% will only be defined while #3 is executed.
+%
+% Example:
+%
+% \pgfdeclaredecoration{zigzag}{q}
+% {
+% \state{q}[width=10pt]
+% {
+% \pgfpathlineto{\pgfpoint{2.5pt}{2.5pt}}
+% \pgfpathlineto{\pgfpoint{7.5pt}{-2.5pt}}
+% \pgfpathlineto{\pgfpoint{10pt}{0pt}}
+% }
+% \state{final}
+% {
+% \pgfpathlineto{\pgfpointdecoratedpathlast}
+% }
+% }
+
+\long\def\pgfdeclaredecoration#1#2#3{%
+ \let\pgf@mod@dec@next=\pgf@mod@dec@firstofone%
+ \pgfifmetadecoration{#1}{%
+ \pgferror{You cannot declare a decoration of the same
+ name as a meta-decoration}%
+ \let\pgf@mod@dec@next=\pgfutil@gobble%
+ }{}%
+ \pgf@mod@dec@next
+ {%
+ \def\pgf@decorate@name{#1}%
+ \pgfutil@namedef{pgf@decorate@@#1@initial}{#2}%
+ \let\pgf@orig@state\state%
+ \let\state\pgf@decorate@state
+ #3%
+ \let\state\pgf@orig@state%
+ }%
+}%
+
+\def\pgf@decorate@state#1{\pgfutil@ifnextchar[{\pgf@decorate@@start#1}{\pgf@decorate@@start#1[]}}%}%
+\def\pgf@decorate@@start#1[#2]#3{%
+ \pgfutil@namedef{pgf@decorate@@\pgf@decorate@name @#1@options}{#2}%
+ \pgfutil@namedef{pgf@decorate@@\pgf@decorate@name @#1@code}{#3}%
+}%
+\long\def\pgf@mod@dec@firstofone#1{#1}%
+
+
+% Test whether something is a decoration
+%
+% #1 = name
+% #2 = if-code
+% #3 = else-code
+%
+% Example:
+%
+% \pgfifdecoration{zigzag}{Exists}{Does not exist}
+
+\def\pgfifdecoration#1#2#3{\pgfutil@ifundefined{pgf@decorate@@#1@initial}{#3}{#2}}%
+
+
+
+% Declare a meta decoration
+%
+% #1 = name of the meta decoration
+% #2 = initial state
+% #3 = states
+%
+% This command declares a new meta decoration for later use.
+% Inside the code of #3 the command \state may be used.
+
+\long\def\pgfdeclaremetadecoration#1#2#3{%
+ \let\pgf@mod@dec@next=\pgf@mod@dec@firstofone%
+ \pgfifdecoration{#1}{%
+ \pgferror{You cannot declare a meta-decoration of the
+ same name as a decoration}%
+ \let\pgf@mod@dec@next=\pgfutil@gobble%
+ }{}%
+ \pgf@mod@dec@next{%
+ \def\pgf@metadecoration@name{#1}%
+ \pgfutil@namedef{pgf@metadecoration@@#1@initial}{#2}%
+ \let\pgf@orig@state\state%
+ \let\state\pgf@metadecoration@state
+ #3%
+ \let\state\pgf@orig@state%
+ }%
+}%
+
+\def\pgf@metadecoration@state#1{\pgfutil@ifnextchar[{\pgf@metadecoration@@state#1}{\pgf@metadecoration@@state#1[]}}%}%
+\def\pgf@metadecoration@@state#1[#2]#3{%
+ \pgfutil@namedef{pgf@metadecoration@@\pgf@metadecoration@name @#1@options}{#2}%
+ \pgfutil@namedef{pgf@metadecoration@@\pgf@metadecoration@name @#1@code}{#3}%
+}%
+
+
+% Test whether something is a meta-decoration
+%
+% #1 = name
+% #2 = if-code
+% #3 = else-code
+%
+% Example:
+%
+% \pgfifmetadecoration{zigzag}{Exists}{Does not exist}
+
+\def\pgfifmetadecoration#1#2#3{\pgfutil@ifundefined{pgf@metadecoration@@#1@initial}{#3}{#2}}%
+
+
+
+
+
+\let\pgfdecoratebeforecode\pgfutil@empty
+\let\pgfdecorateaftercode\pgfutil@empty
+
+% \pgfdecoratepath
+%
+% Decorate a path.
+%
+% \pgfdecoratebeforecode and \pgfdecorateaftercode can be used to
+% execute code before and after the decoration.
+%
+% #1 - the name of the decoration.
+% #2 - a (non-empty) path specification.
+%
+% Example:
+%
+% \pgfdeclaredecoration{circles}{red circles}{
+% \state{red circles}[width=10pt, repeat state=2, next state=blue circles]
+% {
+% \pgfmathparse{round(rnd*100)}
+% \pgfsetstrokecolor{red!\pgfmathresult!brown}
+% \pgfsetfillcolor{orange!\pgfmathresult!yellow}
+% \pgfpathcircle{\pgfpointorigin}{2.5pt}
+% \pgfusepath{stroke,fill}
+% }
+% \state{blue circles}[width=10pt, repeat state=1, next state=red circles]
+% {
+% \pgfmathparse{round(rnd*100)}
+% \pgfsetstrokecolor{blue!\pgfmathresult!gray}
+% \pgfsetfillcolor{blue!\pgfmathresult!white}
+% \pgfpathcircle{\pgfpointorigin}{2.5pt}
+% \pgfusepath{stroke,fill}
+% }
+% \state{final}{}
+% }
+%
+% \pgfpicture
+% \pgfdecoratepath{circles}
+% {
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfpoint{0cm}{3cm}}{\pgfpoint{4cm}{0cm}}{\pgfpoint{4cm}{3cm}}
+% }
+% \endpgfpicture
+%
+\long\def\pgfdecoratepath#1#2{%
+ \pgfdecoration{{#1}{\pgfdecoratedpathlength}{\pgfdecoratebeforecode}{\pgfdecorateaftercode}}%
+ #2%
+ \endpgfdecoration}%
+
+
+
+
+% \pgfdecoratecurrentpath
+%
+% Decorate the current/existing path, but (unavoidably) destroys it.
+%
+% \pgfdecoratebeforecode and \pgfdecorateaftercode can be used to
+% execute code before and after the decoration.
+%
+% #1 - the name of the decoration.
+%
+% Example:
+%
+% \pgfdeclaredecoration{stars}{move}{
+% \state{move}[width=7.5pt, next state=star]{}
+% \state{star}[width=7.5pt, next state=move]
+% {
+% \pgfmathparse{round(rnd*100)}
+% \pgfsetfillcolor{yellow!\pgfmathresult!orange}
+% \pgfsetstrokecolor{yellow!\pgfmathresult!red}
+% \pgfmathparse{rnd*.75+.25}
+% \pgftransformscale{\pgfmathresult}
+% \pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}}
+% }
+% \state{final}
+% {
+% \pgfpathmoveto{\pgfpointdecoratedpathlast}
+% }
+% }
+%
+% \pgfpicture
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfqpoint{0cm}{2cm}}{\pgfqpoint{3cm}{2cm}}{\pgfqpoint{3cm}{0cm}}
+% \pgfpathcurveto{\pgfqpoint{3cm}{-3cm}}{\pgfqpoint{0cm}{0cm}}{\pgfqpoint{0cm}{-3cm}}
+% \pgfpathcurveto{\pgfqpoint{0cm}{-5cm}}{\pgfqpoint{3cm}{-5cm}}{\pgfqpoint{3cm}{-3cm}}
+% \pgfdecoratecurrentpath{stars}
+% \endpgfpicture
+%
+\def\pgfdecoratecurrentpath#1{%
+ \pgfgetpath\pgf@decorate@currentpath%
+ \pgfsetpath\pgfutil@empty%
+ \pgfdecoration{{#1}{\pgfdecoratedpathlength}{\pgfdecoratebeforecode}{\pgfdecorateaftercode}}%
+ \pgfsetpath\pgf@decorate@currentpath%
+ \endpgfdecoration}%
+
+
+
+
+% Environment \pgfdecoration \endpgfdecoration
+%
+% Decorates a path with multiple decorations.
+%
+% Definitions:
+%
+% `existing path'
+% - any unused path existing prior to the environment.
+%
+% `decorated path'
+% - the path that is being decorated.
+%
+% `decoration path'
+% - any unused path left by the decoration automaton.
+%
+% The action of the environment is as follows:
+%
+% 1. Any existing path is saved.
+% 2. Construction commands are executed forming the decorated path.
+% 3. If the first command in the decorated path is not a `move to',
+% the last known position from the existing path is inserted.
+% 4. The saved existing path is reinstalled.
+% 5. The decoration automaton is executed along the decorated path.
+%
+% Parameters:
+%
+% #1 - a comma separated list of decoration specifications.
+%
+% A decoration specification takes the format:
+%
+% {<name>}{<distance>}{<before code>}{<after code>}
+%
+% The decoration <name> is applied to a section of the decorated
+% path from the last point on the decorated path the decoration
+% automaton reached to <distance> from that point.
+%
+% When <distance>} is parsed, the dimension
+% \pgfdecoratedreminingdistance holds the distance remaining on the
+% entire decorated path, and the macro \pgfdecoratedpathlength holds
+% the total length of the entire decorated path.
+% After <distance> is parsed, both are set to to the value of
+% <distance> for the automaton to decorate current section of the
+% decorated path.
+%
+% <before code> is executed just before the decoration automaton
+% starts and <after code> is executed just after the automaton stops.
+% If <before code> or <after code> are empty, they can be omitted.
+% The macros \pgfdecoratedpathfirst and \pgfdecoratedpathlast
+% will be set up as the first and last points on the current section
+% of the decorated path.
+%
+% When the environment exits, the following macros will be set up:
+%
+% \pgfdecorateexistingpath
+% - the existing path.
+%
+% \pgfdecoratedpath
+% - the decorated path.
+%
+% \pgfdecorationpath
+% - any unused decoration path.
+%
+% \pgfpointdecoratedpathlast
+% - the last point on the decorated path.
+%
+% Examples (require pgfdecorations library):
+%
+% \pgfpicture
+% \pgfdecoration
+% {
+% {lineto}{\pgfdecoratedpathlength/3},
+% {zigzag}{\pgfdecoratedpathlength/3},
+% {lineto}{\pgfdecoratedpathlength/3}
+% }
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfpoint{0cm}{4cm}}{\pgfpoint{5cm}{0cm}}{\pgfpoint{5cm}{4cm}}
+% \endpgfdecoration
+% \pgfusepath{stroke}
+% \endpgfpicture
+%
+%
+% \pgfpicture
+% \pgfdecoration
+% {
+% {lineto}{\pgfdecoratedpathlength/5}{}{\pgfusepath{stroke}},
+% {zigzag}{\pgfdecoratedpathlength/5}
+% {
+% \pgfpathmoveto{\pgfpointdecoratedpathfirst}
+% }
+% {
+% \pgfsetstrokecolor{red}
+% \pgfusepath{stroke}
+% },
+% {lineto}{\pgfdecoratedpathlength/5}
+% {
+% \pgfpathmoveto{\pgfpointdecoratedpathfirst}
+% }
+% {
+% \pgfsetstrokecolor{black}
+% \pgfusepath{stroke}
+% },
+% {zigzag}{\pgfdecoratedpathlength/5}
+% {
+% \pgfpathmoveto{\pgfpointdecoratedpathfirst}
+% }
+% {
+% \pgfsetstrokecolor{red}
+% \pgfusepath{stroke}
+% },
+% {lineto}{\pgfdecoratedpathlength/5}
+% {
+% \pgfpathmoveto{\pgfpointdecoratedpathfirst}
+% }
+% {
+% \pgfsetstrokecolor{black}
+% \pgfusepath{stroke}
+% }
+% }
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfpoint{0cm}{4cm}}{\pgfpoint{5cm}{0cm}}{\pgfpoint{5cm}{4cm}}
+% \endpgfdecoration
+%
+% \endpgfpicture
+%
+%
+%
+% \pgfdeclaredecoration{polygons}{move}{
+% \state{move}[width=7.5pt, next state=polygon]{}
+% \state{polygon}[width=7.5pt, next state=move]
+% {
+% \pgfmathparse{round(rnd*100)}
+% \pgfsetfillcolor{green!\pgfmathresult!yellow}
+% \pgfsetstrokecolor{green!\pgfmathresult!brown}
+% \pgfnode{regular polygon}{center}{}{}{\pgfusepath{stroke,fill}}
+% }
+% \state{final}
+% {
+% \pgfpathmoveto{\pgfpointdecoratedpathlast}
+% }
+% }
+%
+% \pgfpicture
+% \pgfdecoration
+% {
+% {polygons}{45pt},
+% {lineto}{30pt}
+% {\pgfpathmoveto{\pgfpointdecoratedpathfirst}}
+% {
+% \pgfsetstrokecolor{yellow!50!orange}
+% \pgfusepath{stroke}
+% },
+% {polygons}{45pt},
+% {lineto}{30pt}
+% {\pgfpathmoveto{\pgfpointdecoratedpathfirst}}
+% {
+% \pgfsetstrokecolor{green!50!blue}
+% \pgfusepath{stroke}
+% },
+% {polygons}{\pgfdecoratedremainingdistance}
+% }
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfpoint{0cm}{4cm}}{\pgfpoint{5cm}{0cm}}{\pgfpoint{5cm}{4cm}}
+% \endpgfdecoration
+% \endpgfpicture
+%
+%
+% \pgfpicture
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfpoint{0cm}{4cm}}{\pgfpoint{5cm}{0cm}}{\pgfpoint{5cm}{4cm}}
+% \pgfgetpath\temppath
+% \pgfsetstrokecolor{red}
+% \pgfusepath{stroke}
+%
+% \pgfset{decoration text={Here is some text all the way along this curve!}}
+% \pgfdecoration{{text}{\pgfdecoratedremainingdistance}}
+% \pgfsetpath\temppath
+% \endpgfdecoration
+% \endpgfpicture
+%
+\def\pgfdecoration#1{%
+ \begingroup%
+ \def\pgf@decorate@decorationlist{#1}%
+ \pgf@decoration@env%
+}%
+
+\def\endpgfdecoration{%
+ \pgf@decoration@endenv%
+ \ifx\pgfdecoratedpath\pgfutil@empty%
+ \else%
+ %
+ % Perform the decoration(s).
+ %
+ \pgf@decorate@for\pgf@temp:=\pgf@decorate@decorationlist\do{%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \expandafter\pgf@decorate@invoke\expandafter{\pgf@temp}%
+ \fi%
+ }%
+ \fi%
+ \pgfgetpath\pgfdecorationpath%
+ %
+ % Take stuff outside the group.
+ %
+ \global\let\pgf@decorate@decorationpathtemp\pgfdecorationpath%
+ \global\let\pgf@decorate@decoratedpathtemp\pgfdecoratedpath%
+ \global\let\pgf@decorate@existingpathtemp\pgfdecorateexistingpath%
+ \global\let\pgfpoint@decorated@pathlasttemp\pgfpoint@decorated@pathlast%
+ \endgroup%
+ %
+ % Are we in LaTeX?
+ %
+ \pgfutil@ifnextchar\@checkend{\aftergroup\pgf@decorate@installmacrosatend}%
+ {\pgf@decorate@installmacrosatend}%
+}%
+
+
+
+% Environment \pgfmetadecoration \endpgfmetadecoration
+%
+% Decorate a path with decoration automatons!
+%
+% Example:
+%
+% \pgfdeclaremetadecoration{fancy line}{line to}{
+% \state{line to}[width=1cm, next state=zigzag]
+% {
+% \decoration{lineto}
+% \beforedecoration{\pgfpathmoveto{\pgfpointdecoratedpathfirst}}
+% \afterdecoration
+% {
+% \pgfsetstrokecolor{black}
+% \pgfusepath{stroke}
+% }
+% }
+% \state{zigzag}[width=2cm, next state=line to]
+% {
+% \decoration{zigzag}
+% \beforedecoration{\pgfpathmoveto{\pgfpointdecoratedpathfirst}}
+% \afterdecoration
+% {
+% \pgfsetstrokecolor{red}
+% \pgfusepath{stroke}
+% }
+% }
+% \state{final}
+% {
+% \decoration{lineto}
+% \beforedecoration{\pgfpathmoveto{\pgfpointdecoratedpathfirst}}
+% \afterdecoration
+% {
+% \pgfsetstrokecolor{black}
+% \pgfusepath{stroke}
+% }
+% }
+% }
+%
+% \pgfpicture
+% \pgfmetadecoration{fancy line}
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathcurveto{\pgfqpoint{0cm}{2cm}}{\pgfqpoint{3cm}{2cm}}{\pgfqpoint{3cm}{0cm}}
+% \pgfpathcurveto{\pgfqpoint{3cm}{-3cm}}{\pgfqpoint{0cm}{0cm}}{\pgfqpoint{0cm}{-3cm}}
+% \pgfpathcurveto{\pgfqpoint{0cm}{-5cm}}{\pgfqpoint{3cm}{-5cm}}{\pgfqpoint{3cm}{-3cm}}
+% \endpgfmetadecoration
+% \endpgfpicture
+%
+\def\pgfmetadecoration#1{%
+ \begingroup%
+ \let\decoration\pgf@metadecoration@decoration%
+ \let\beforedecoration\pgf@metadecoration@beforedecoration%
+ \let\afterdecoration\pgf@metadecoration@afterdecoration%
+ \def\pgf@metadecoration@name{#1}%
+ \pgf@decoration@env%
+}%
+
+\def\endpgfmetadecoration{%
+ \pgf@decoration@endenv%
+ \ifx\pgfdecoratedpath\pgfutil@empty%
+ \else%
+ \let\pgfmetadecoratedpathlength\pgf@decorate@totalpathlength%
+ \def\pgfmetadecoratedinputsegmentremainingdistance{\pgfdecoratedremainingdistance}%
+ \def\pgfmetadecoratedinputsegmentcompleteddistance{\pgfdecoratedcompleteddistance}%
+ %
+ % Perform the meta decoration...
+ %
+ \expandafter\let\expandafter\pgf@metadecoration@current@state%
+ \csname pgf@metadecoration@@\pgf@metadecoration@name @initial\endcsname%
+ \pgf@metadecoration@run%
+ %
+ % ..until the final state.
+ %
+ \let\pgf@decorate@tempname\pgfutil@empty%
+ \let\pgf@decorate@tempbefore\pgfutil@empty%
+ \let\pgf@decorate@tempafter\pgfutil@empty%
+ \csname pgf@metadecoration@@\pgf@metadecoration@name @\pgf@metadecoration@current@state @code\endcsname%
+ \ifx\pgf@decorate@tempname\pgfutil@empty%
+ \def\pgf@decorate@tempname{moveto}
+ \fi%
+ \pgf@decorate@invoke{%
+ {\pgf@decorate@tempname}{\pgfdecoratedremainingdistance}%
+ {\pgf@decorate@tempbefore}{\pgf@decorate@tempafter}%
+ }%
+ \fi%
+ \pgfgetpath\pgfdecorationpath%
+ %
+ % Take stuff outside the group.
+ %
+ \global\let\pgf@decorate@decorationpathtemp\pgfdecorationpath%
+ \global\let\pgf@decorate@decoratedpathtemp\pgfdecoratedpath%
+ \global\let\pgf@decorate@existingpathtemp\pgfdecorateexistingpath%
+ \global\let\pgfpoint@decorated@pathlasttemp\pgfpoint@decorated@pathlast%
+ \endgroup%
+ %
+ % Are we in LaTeX?
+ %
+ \pgfutil@ifnextchar\@checkend{\aftergroup\pgf@decorate@installmacrosatend}%
+ {\pgf@decorate@installmacrosatend}%
+}%
+
+
+
+
+
+
+% Internal macro for the decoration environment.
+%
+\def\pgf@decoration@env{%
+ \pgfgetpath\pgfdecorateexistingpath%
+ \pgfsetpath\pgfutil@empty%
+ \let\pgfdecorationpath\pgfutil@empty%
+ \let\pgfdecoratedpath\pgfutil@empty%
+ \let\pgfpoint@decorated@pathlast\pgfpointorigin%
+ \edef\pgfpoint@decorate@existingpathlast{\pgf@x\the\pgf@path@lastx\pgf@y\the\pgf@path@lasty}%
+ %
+ % Begin a group so transformations don't mess things up.
+ %
+ \bgroup%
+}%
+
+\def\pgf@decorate@path@check@moveto#1{%
+ \expandafter\pgf@decorate@path@@check@moveto#1\pgf@decorate@stop\pgf@decorate@@stop}%
+
+\def\pgf@decorate@token@stop{\pgf@decorate@stop}%
+\def\pgf@decorate@path@@check@moveto#1#2#3#4\pgf@decorate@@stop#5#6{%
+ \def\pgf@decorate@temp{#4}%
+ \pgf@x=#2\relax%
+ \pgf@y=#3\relax%
+ \ifx\pgf@decorate@temp\pgf@decorate@token@stop%
+ #5%
+ \else%
+ #6%
+ \fi%
+}%
+
+\def\pgf@decoration@endenv{%
+ \egroup%
+ \pgftransformreset%
+ %
+ % Save the existing soft path and restore the existing path.
+ %
+ \pgfgetpath\pgfdecoratedpath%
+ \pgfsetpath\pgfdecorateexistingpath%
+ %
+ \ifx\pgfdecoratedpath\pgfutil@empty%
+ \pgferror{I cannot decorate an empty path}%
+ \else%
+ %
+ % If the path consists of a single moveto token, make it
+ % a very small horizontal line.
+ %
+ \pgf@decorate@path@check@moveto\pgfdecoratedpath{%
+ \advance\pgf@x by0.0001pt\relax%
+ \edef\pgfdecoratedpath{%
+ \expandafter\noexpand\pgfdecoratedpath%
+ \noexpand\pgfsyssoftpath@linetotoken{\the\pgf@x}{\the\pgf@y}%
+ }%
+ }%
+ {}%
+ %
+ % Remove special round tokens and get points.
+ %
+ \pgfprocessround{\pgfdecoratedpath}{\pgfdecoratedpath}%
+ %
+ % Parse the soft path into a series of decorated input segment objects.
+ %
+ \pgf@decorate@parsesoftpath{\pgfdecoratedpath}{\pgf@decorate@inputsegmentobjects}%
+ %
+ % Setup further options
+ %
+ \pgfkeys{/pgf/every decoration/.try}%
+ %
+ % Reverse objects if necessary.
+ %
+ \ifpgf@decorate@inputsegmentobjects@reverse%
+ \pgf@decorate@inputsegmentobjects@reverse{\pgf@decorate@inputsegmentobjects}{\pgf@decorate@inputsegmentobjects}%
+ \fi%
+ %
+ \let\pgf@decorated@remainingdistance\pgf@decorate@totalpathlength%
+ %
+ \let\pgfpoint@decorated@totalpathfirst\pgfpoint@decorated@firstparsed%
+ \let\pgfpoint@decorated@totalpathlast\pgfpoint@decorate@lastnonmovetoparsed%
+ %
+ \let\pgfpoint@decorated@pathfirst\pgfpoint@decorated@totalpathfirst
+ \let\pgfpoint@decorated@pathlast\pgfpoint@decorated@totalpathlast%
+ %
+ % Set up the first input segment.
+ %
+ \let\pgf@decorate@currentinputsegmentobjects\pgf@decorate@inputsegmentobjects%
+ \let\pgf@decorate@transformtoinputsegment\pgfutil@empty%
+ \pgf@decorate@getnextinputsegmentobject\pgf@decorate@nextinputsegmentobject%
+ \pgf@decorate@processnextinputsegmentobject%
+ \pgf@decorate@distancetomove0pt\relax%
+ \fi%
+}%
+
+
+
+
+\def\pgf@decorate@installmacrosatend{%
+ \let\pgfdecorationpath\pgf@decorate@decorationpathtemp%
+ \let\pgfdecoratedpath\pgf@decorate@decoratedpathtemp%
+ \let\pgfdecorateexistingpath\pgf@decorate@existingpathtemp%
+ \let\pgfpoint@decorated@pathlast\pgfpoint@decorated@pathlasttemp%
+}%
+
+\let\pgfdecorationpath\pgfutil@empty
+\let\pgfdecoratedpath\pgfutil@empty
+\let\pgfdecorateexisitingpath\pgfutil@empty
+
+\let\pgfpoint@decorated@pathlast\pgfpointorigin
+
+
+
+% A version of \pgfutil@for which doesn't expand each value in #3.
+%
+\def\pgf@decorate@for#1:=#2\do#3{%
+ \def\pgf@decorate@for@var{#1}%
+ \def\pgf@decorate@for@action{#3}%
+ \expandafter\pgf@decorate@@for#2,\pgf@stop,}%
+
+\def\pgf@decorate@@for#1,{%
+ \ifx#1\pgf@stop%
+ \expandafter\let\pgf@decorate@for@var\pgfutil@empty%
+ \else%
+ \expandafter\def\pgf@decorate@for@var{#1}%
+ \pgf@decorate@for@action%
+ \expandafter\pgf@decorate@@for%
+ \fi%
+}%
+
+
+% Invoke a decoration.
+%
+% #1 - {<name>}{<distance>}{<before code>}{<after code>}
+%
+\def\pgf@decorate@invoke#1{%
+ \pgf@decorate@@invoke#1\pgf@decorate@invoke\pgf@decorate@invoke\pgf@decorate@invoke\pgf@stop}%
+
+\def\pgf@decorate@@invoke#1#2#3#4#5\pgf@stop{%
+ \pgfutil@ifundefined{pgf@decorate@@#1@initial}%
+ {%
+ \pgferror{Unknown decoration `#1'}%
+ }%
+ {%
+ \def\pgf@decorate@name{#1}%
+ \ifx\pgf@decorate@invoke#3%
+ \let\pgf@decorate@beforecode\pgfutil@empty%
+ \else%
+ \def\pgf@decorate@beforecode{#3}%
+ \fi%
+ \ifx\pgf@decorate@invoke#4%
+ \let\pgf@decorate@aftercode\pgfutil@empty%
+ \else%
+ \def\pgf@decorate@aftercode{#4}%
+ \fi%
+ %
+ % Make remaining distance and the decorated path length `public'.
+ %
+ \pgfdecoratedremainingdistance\pgf@decorated@remainingdistance\relax%
+ \let\pgfdecoratedpathlength\pgf@decorate@totalpathlength%
+ %
+ \pgfmathsetlength\pgf@xa{#2}%
+ \ifdim\pgf@xa>\pgf@decorated@remainingdistance\relax%
+ \pgf@xa\pgf@decorated@remainingdistance\relax%
+ \fi%
+ \edef\pgf@decorate@currentpathlength{\the\pgf@xa}%
+ %
+ % Calculate the distance remaining to the end of the entire path.
+ %
+ \pgf@xa-\pgf@decorate@currentpathlength\relax%
+ \advance\pgf@xa\pgf@decorated@remainingdistance\relax%
+ \edef\pgf@decorated@remainingdistance{\the\pgf@xa}%
+ %
+ % Set up the macros and distances for the current section
+ % of the decorated path.
+ %
+ \let\pgfdecoratedpathlength\pgf@decorate@currentpathlength%
+ \pgfdecoratedremainingdistance\pgfdecoratedpathlength\relax%
+ \pgfdecoratedcompleteddistance0pt\relax%
+ %
+ % Execute user-defined code beore decoration.
+ %
+ \pgf@decorate@beforecode%
+ %
+ % Run the decoration...
+ %
+ \expandafter\let\expandafter\pgf@decorate@current@state%
+ \csname pgf@decorate@@\pgf@decorate@name @initial\endcsname%
+ \pgf@decorate@run%
+ %
+ % ...until the final state.
+ %
+ \ifdim\pgf@decorated@remainingdistance<1pt\relax% Should be =0pt, but need to control for inaccuracies.
+ \let\pgfpoint@decorated@pathlast\pgfpoint@decorated@totalpathlast%
+ \else%
+ %
+ % Set up \pgfpoint@decorated@pathlast if the end of
+ % the total decorated path has not been reached.
+ %
+ {%
+ \pgf@decorate@movealonginputsegment{\the\pgfdecoratedremainingdistance}%
+ \pgf@decorate@transformtoinputsegment%
+ \pgfpointorigin%
+ \pgf@pos@transform@glob%
+ \global\pgf@x\pgf@x%
+ \global\pgf@y\pgf@y%
+ }%
+ \edef\pgfpoint@decorated@pathlast{\pgf@x\the\pgf@x\pgf@y\the\pgf@y}%
+ \fi%
+ {%
+ \pgftransformreset%
+ \pgf@decorate@transformtoinputsegment%
+ \pgf@decorate@additionaltransform%
+ \csname pgf@decorate@@\pgf@decorate@name @final@code\endcsname%
+ }%
+ \pgf@decorate@movealonginputsegment{\the\pgfdecoratedremainingdistance}%
+ %
+ % Execute user-defined code after decoration.
+ %
+ \pgf@decorate@aftercode%
+ %
+ % Update the input segment objects.
+ %
+ \let\pgf@decorate@additionaltransform\pgfutil@empty%
+ \let\pgf@decorate@inputsegmentobjects\pgf@decorate@inputsegmentobjects@aftersplit%
+ \let\pgfpoint@decorated@pathfirst\pgfpoint@decorated@pathlast%
+ }%
+}%
+
+
+
+\let\pgf@decorate@transformtoinputsegment\pgfutil@empty%
+\let\pgf@decorate@additionaltransform\pgfutil@empty%
+
+
+% \pgfpointdecoratedpathfirst
+%
+\def\pgfpointdecoratedpathfirst{%
+ {%
+ \pgftransforminvert%
+ \pgfpoint@decorated@pathfirst%
+ \pgf@pos@transform@glob%
+ \global\pgf@x\pgf@x%
+ \global\pgf@y\pgf@y%
+ }%
+}%
+
+% \pgfpointdecoratedpathlast
+%
+\def\pgfpointdecoratedpathlast{%
+ {%
+ \pgftransforminvert%
+ \pgfpoint@decorated@pathlast%
+ \pgf@pos@transform@glob%
+ \global\pgf@x\pgf@x%
+ \global\pgf@y\pgf@y%
+ }%
+}%
+
+% \pgfpointdecoratedinputsegmentfirst
+%
+% The first point of the current sub-path.
+%
+\def\pgfpointdecoratedinputsegmentfirst{%
+ {%
+ \pgftransforminvert%
+ \pgf@decorate@inputsegment@first%
+ \pgf@pos@transform@glob%
+ \global\pgf@x\pgf@x%
+ \global\pgf@y\pgf@y%
+ }%
+}%
+
+% \pgfpointdecoratedinputsegmentlast
+%
+% The final point of the current sub-path.
+%
+\def\pgfpointdecoratedinputsegmentlast{%
+ {%
+ \pgftransforminvert%
+ \pgf@decorate@inputsegment@last%
+ \pgf@pos@transform@glob%
+ \global\pgf@x\pgf@x%
+ \global\pgf@y\pgf@y%
+ }%
+}%
+
+
+\def\pgf@final@text{final}%
+
+% Run a normal decoration.
+%
+\def\pgf@decorate@run{%
+ \let\pgf@decorate@next\pgf@decorate@do@state%
+ \ifx\pgf@decorate@current@state\pgf@final@text%
+ \let\pgf@decorate@next\relax%
+ \fi%
+ \pgf@decorate@next%
+}%
+
+\def\pgf@decorate@do@state{%
+ \let\pgf@decorate@next\relax%
+ \let\pgf@decorate@next@state\pgf@decorate@current@state%
+ %
+ % Get the options.
+ %
+ \let\pgf@decorate@persistent@pre=\relax%
+ \let\pgf@decorate@persistent@post=\relax%
+ \expandafter\expandafter\expandafter\pgf@decorate@setter
+ \expandafter\expandafter\expandafter{\csname pgf@decorate@@\pgf@decorate@name @\pgf@decorate@current@state @options\endcsname}%
+ \ifx\pgf@decorate@next\relax%
+ \let\pgf@decorate@next\pgf@decorate@do@code%
+ \fi%
+ \pgf@decorate@next%
+}%
+
+\def\pgf@decorate@setter{\pgfqkeys{/pgf/decoration automaton}}%
+
+\pgf@decorate@repeatstate-1\relax
+
+\def\pgf@decorate@do@code{%
+ %
+ % Execute code.
+ %
+ \pgf@decorate@persistent@pre%
+ {%
+ \pgftransformreset%
+ \pgf@decorate@transformtoinputsegment%
+ \pgf@decorate@additionaltransform%
+ \csname pgf@decorate@@\pgf@decorate@name @\pgf@decorate@current@state @code\endcsname%
+ }%
+ \pgf@decorate@persistent@post%
+ \pgf@decorate@movealongpath{\pgf@decorate@width}%
+ %
+ % Next iteration.
+ %
+ \ifnum\pgf@decorate@repeatstate>0\relax%
+ \advance\pgf@decorate@repeatstate-1\relax%
+ \else%
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@current@state\pgf@decorate@next@state%
+ \fi%
+ \pgf@decorate@run%
+}%
+
+\pgfkeys{
+ /pgf/decoration automaton/width/.code=\def\pgf@decorate@width{#1}\pgf@decorate@switch@if#1 to final\pgf@stop,%
+ /pgf/decoration automaton/switch if less than/.code=\pgf@decorate@switch@if#1\pgf@stop,%
+ /pgf/decoration automaton/switch if input segment less than/.code=\pgf@decorate@switch@ifinputsegment#1\pgf@stop,%
+ /pgf/decoration automaton/next state/.store in=\pgf@decorate@next@state,%
+ /pgf/decoration automaton/persistent precomputation/.store in=\pgf@decorate@persistent@pre,%
+ /pgf/decoration automaton/persistent postcomputation/.store in=\pgf@decorate@persistent@post,%
+ /pgf/decoration automaton/repeat state/.code={%
+ \ifnum\pgf@decorate@repeatstate=-1\relax%
+ \pgfmathsetcount\pgf@decorate@repeatstate{#1}%
+ \fi%
+ },%
+ /pgf/decoration automaton/if input segment is closepath/.code={%
+ \ifpgf@decorate@is@closepath@%
+ \pgfkeysalso{#1}%
+ \fi%
+ },
+ /pgf/decoration automaton/auto end on length/.code=\pgf@decorate@auto@end{#1},
+ /pgf/decoration automaton/auto corner on length/.code=\pgf@decorate@auto@corner{#1},
+}%
+
+\def\pgf@decorate@auto@end#1{%
+ \ifx\pgf@decorate@next\relax%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifpgf@decorate@is@closepath@%
+ \ifdim\pgfdecoratedremainingdistance>\pgf@x%
+ \ifdim\pgfdecoratedinputsegmentremainingdistance>\pgf@x%
+ \else%
+ \pgfpathclose%
+ \pgf@decorate@movealongpath{\pgfdecoratedinputsegmentremainingdistance}%
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \fi%
+ \else%
+ \pgfpathclose%
+ \def\pgf@decorate@current@state{final}%
+ \def\pgf@decorate@width{\pgfdecoratedremainingdistance}
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \fi%
+ \else%
+ \ifdim\pgfdecoratedremainingdistance>\pgf@x%
+ \else%
+ {%
+ \pgftransformreset%
+ \pgf@decorate@transformtoinputsegment%
+ \pgf@decorate@additionaltransform%
+ \pgfpathlineto{\pgfpoint{\pgfdecoratedremainingdistance}{0pt}}
+ }%
+ \def\pgf@decorate@current@state{final}%
+ \def\pgf@decorate@width{\pgfdecoratedremainingdistance}
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@decorate@auto@corner#1{%
+ \ifpgfdecoratepathhascorners%
+ \ifx\pgf@decorate@next\relax%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifdim\pgfdecoratedinputsegmentremainingdistance>\pgf@x%
+ \else%
+ {%
+ \pgftransformreset%
+ \pgf@decorate@transformtoinputsegment%
+ \pgf@decorate@additionaltransform%
+ \pgfpathlineto{\pgfqpoint{\pgfdecoratedinputsegmentremainingdistance}{0pt}}
+ }%
+ \pgf@decorate@movealongpath{\pgfdecoratedinputsegmentremainingdistance}%
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@decorate@switch@if#1to #2\pgf@stop{%
+ \ifx\pgf@decorate@next\relax%
+ \ifdim\pgfdecoratedremainingdistance=0pt\relax%
+ \def\pgf@decorate@current@state{#2}%
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \else%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifdim\pgfdecoratedremainingdistance<\pgf@x%
+ \def\pgf@decorate@current@state{#2}%
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@decorate@switch@ifinputsegment#1to #2\pgf@stop{%
+ \ifx\pgf@decorate@next\relax%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifdim\pgfdecoratedinputsegmentremainingdistance<\pgf@x%
+ \def\pgf@decorate@current@state{#2}%
+ \pgf@decorate@repeatstate-1\relax%
+ \let\pgf@decorate@next\pgf@decorate@run%
+ \fi%
+ \fi%
+}%
+
+
+
+
+% \pgfsetdecorationsegmenttransformation
+%
+% Set the additional transform for each decoration state.
+%
+% Example:
+%
+% \pgfsetdecorationsegmenttransformation{\pgftransformyshift{5pt}}
+%
+\def\pgfsetdecorationsegmenttransformation#1{\def\pgf@decorate@additionaltransform{#1}}%
+\let\pgf@decorate@additionaltransform\pgfutil@empty%
+
+
+
+
+\def\pgf@metadecoration@decoration#1{%
+ \edef\pgf@decorate@tempname{#1}%
+}%
+\def\pgf@metadecoration@beforedecoration#1{%
+ \def\pgf@decorate@tempbefore{#1}%
+}%
+\def\pgf@metadecoration@afterdecoration#1{%
+ \def\pgf@decorate@tempafter{#1}%
+}%
+
+
+\def\pgf@final@text{final}%
+
+% Run a meta decoration.
+%
+\def\pgf@metadecoration@run{%
+ \let\pgf@metadecoration@next\pgf@metadecoration@do@state%
+ \ifx\pgf@metadecoration@current@state\pgf@final@text%
+ \let\pgf@metadecoration@next\relax%
+ \fi%
+ \pgf@metadecoration@next%
+}%
+
+\def\pgf@metadecoration@do@state{%
+ \let\pgf@metadecoration@next\relax%
+ \let\pgf@metadecoration@next@state\pgf@metadecoration@current@state%
+ %
+ % Set up some macros.
+ %
+ \let\pgfmetadecoratedremainingdistance\pgf@decorated@remainingdistance%
+ \pgf@x-\pgfmetadecoratedremainingdistance\relax%
+ \advance\pgf@x\pgf@decorate@totalpathlength\relax%
+ \edef\pgfmetadecoratedcompleteddistance{\the\pgf@x}%
+ %
+ % Get the options.
+ %
+ \expandafter\expandafter\expandafter\pgf@metadecoration@setter
+ \expandafter\expandafter\expandafter{\csname pgf@metadecoration@@\pgf@metadecoration@name @\pgf@metadecoration@current@state @options\endcsname}%
+ \ifx\pgf@metadecoration@next\relax%
+ \let\pgf@metadecoration@next\pgf@metadecoration@do@code%
+ \fi%
+ \pgf@metadecoration@next%
+}%
+
+\def\pgf@metadecoration@do@code{%
+ %
+ % Execute code.
+ %
+ \let\pgf@decorate@tempname\pgfutil@empty%
+ \let\pgf@decorate@tempbefore\pgfutil@empty%
+ \let\pgf@decorate@tempafter\pgfutil@empty%
+ \let\pgfpointmetadecoratedpathfirst\pgfpointdecoratedpathfirst%
+ \let\pgfpointmetadecoratedpathlast\pgfpointdecoratedpathlast%
+ \csname pgf@metadecoration@@\pgf@metadecoration@name @\pgf@metadecoration@current@state @code\endcsname%
+ \ifx\pgf@decorate@tempname\pgfutil@empty%
+ \def\pgf@decorate@tempname{moveto}
+ \fi%
+ \pgf@decorate@invoke{%
+ {\pgf@decorate@tempname}{\pgf@metadecoration@width}%
+ {\pgf@decorate@tempbefore}{\pgf@decorate@tempafter}%
+ }%
+ %
+ % Next iteration.
+ %
+ \let\pgf@metadecoration@current@state\pgf@metadecoration@next@state%
+ \pgf@metadecoration@run%
+}%
+
+\def\pgf@metadecoration@setter{\pgfqkeys{/pgf/meta-decoration automaton}}%
+
+\pgfkeys{
+ /pgf/meta-decoration automaton/width/.code=\def\pgf@metadecoration@width{#1}\pgf@metadecoration@switch@if#1 to final\pgf@stop,%
+ /pgf/meta-decoration automaton/switch if less than/.code=\pgf@metadecoration@switch@if#1\pgf@stop,%
+ /pgf/meta-decoration automaton/switch if input segment less than/.code=\pgf@metadecoration@switch@ifinputsegment#1\pgf@stop,%
+ /pgf/meta-decoration automaton/next state/.store in=\pgf@metadecoration@next@state,%
+}%
+
+\def\pgf@metadecoration@switch@if#1to #2\pgf@stop{%
+ \ifx\pgf@metadecoration@next\relax%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifdim\pgf@decorated@remainingdistance<\pgf@x%
+ \def\pgf@metadecoration@current@state{#2}%
+ \let\pgf@metadecoration@next\pgf@metadecoration@run%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@metadecoration@switch@ifinputsegment#1to #2\pgf@stop{%
+ \ifx\pgf@metadecoration@next\relax%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifdim\pgfdecoratedinputsegmentremainingdistance<\pgf@x%
+ \def\pgf@metadecoration@current@state{#2}%
+ \let\pgf@metadecoration@next\pgf@metadecoration@run%
+ \fi%
+ \fi%
+}%
+
+
+
+% Move along the path by a specified distance.
+%
+\def\pgf@decorate@movealongpath#1{%
+ \pgfmathsetlength\pgf@decorate@distancetomove{#1}%
+ \advance\pgfdecoratedcompleteddistance\pgf@decorate@distancetomove%
+ \advance\pgfdecoratedremainingdistance-\pgf@decorate@distancetomove%
+ \pgf@decorate@@movealongpath%
+}%
+\def\pgf@decorate@@movealongpath{%
+ \advance\pgfdecoratedinputsegmentcompleteddistance\pgf@decorate@distancetomove%
+ \advance\pgfdecoratedinputsegmentremainingdistance-\pgf@decorate@distancetomove%
+ \ifdim\pgfdecoratedinputsegmentremainingdistance>0pt\relax%
+ \let\pgf@next\pgf@decorate@@@movealongpath%
+ \else%
+ \pgf@decorate@distancetomove-\pgfdecoratedinputsegmentremainingdistance%
+ \pgf@decorate@processnextinputsegmentobject%
+ \ifx\pgf@decorate@currentinputsegmentobjects\pgfutil@empty%
+ \pgfdecoratedremainingdistance0pt\relax%
+ \let\pgf@next\relax%
+ \else%
+ \let\pgf@next\pgf@decorate@@movealongpath%
+ \fi%
+ \fi%
+ \pgf@next%
+}%
+
+\def\pgf@decorate@@@movealongpath{%
+ %
+ % Move along input segment for real.
+ %
+ \pgf@decorate@movealonginputsegment{\the\pgf@decorate@distancetomove}%
+ \pgf@decorate@distancetomove0pt\relax%
+ %
+ % Grrr. Hacking to control some inaccuracies.
+ %
+ \ifdim\pgf@decorate@inputsegmenttime pt>1pt\relax%
+ \let\pgf@decorate@inputsegmenttimetemp\pgf@decorate@inputsegmenttime%
+ \pgf@decorate@processnextinputsegmentobject%
+ \pgf@x\pgf@decorate@inputsegmenttimetemp pt\relax%
+ \advance\pgf@x-1pt\relax%
+ \edef\pgf@decorate@inputsegmenttime{\pgfmath@tonumber{\pgf@x}}%
+ \ifx\pgf@decorate@currentinputsegmentobjects\pgfutil@empty%
+ \pgfdecoratedremainingdistance0pt\relax%
+ \fi%
+ \fi%
+}%
+
+% Return the next input segment object in a macro
+%
+\def\pgf@decorate@getnextinputsegmentobject#1{%
+ \ifx\pgf@decorate@currentinputsegmentobjects\pgfutil@empty%
+ \let\pgf@next\relax%
+ \else%
+ \def\pgf@decorate@temp{#1}%
+ \let\pgf@next\pgf@decorate@@getnextinputsegmentobject%
+ \fi%
+ \pgf@next%
+}%
+\def\pgf@decorate@@getnextinputsegmentobject{%
+ \expandafter\pgf@decorate@@@getnextinputsegmentobject\pgf@decorate@currentinputsegmentobjects\pgf@stop}%
+\def\pgf@decorate@@@getnextinputsegmentobject#1#2\pgf@stop{%
+ \expandafter\def\pgf@decorate@temp{#1}%
+ \def\pgf@decorate@currentinputsegmentobjects{#2}}%
+
+% Process the next input segment object.
+%
+\def\pgf@decorate@processnextinputsegmentobject{%
+ \let\pgfdecorationpreviousinputsegment\pgfdecoratecurrentinputsegment%
+ \let\pgf@decorate@currentinputsegmentobject\pgf@decorate@nextinputsegmentobject%
+ \pgf@decorate@getnextinputsegmentobject\pgf@decorate@nextinputsegmentobject%
+ %
+ % If the current input segment object is a moveto, execute the
+ % object macro and get the next input segment object.
+ %
+ \pgf@decorate@is@closepath@false%
+ \pgf@decorate@currentinputsegmentobject%
+ \ifx\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentmoveto%
+ \pgfpathmoveto{\pgf@decorate@inputsegment@first}%
+ \let\pgfdecorationpreviousinputsegment\pgfdecorationcurrentinputsegment%
+ \let\pgf@decorate@currentinputsegmentobject\pgf@decorate@nextinputsegmentobject%
+ \pgf@decorate@getnextinputsegmentobject\pgf@decorate@nextinputsegmentobject%
+ \pgf@decorate@is@closepath@false%
+ \pgf@decorate@currentinputsegmentobject%
+ \fi%
+ %
+ % Teensy hack in case a path goes nowhere.
+ %
+ \ifdim\pgfdecoratedinputsegmentlength=0pt\relax%
+ \def\pgfdecoratedinputsegmentlength{0.05pt}% Arbitrary choice >0pt.
+ \fi%
+ \pgfdecoratedinputsegmentremainingdistance\pgfdecoratedinputsegmentlength\relax%
+ \pgfdecoratedinputsegmentcompleteddistance0pt\relax%
+ \def\pgf@decorate@inputsegmenttime{0}%
+ %
+ % Get the angle at the start of the input segment.
+ %
+ \ifx\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentcurveto%
+ \pgfmathanglebetweenpoints{\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@supporta}%
+ \let\pgfdecoratedangle\pgfmathresult%
+ \let\pgfdecoratedinputsegmentstartangle\pgfmathresult%
+ \pgfmathanglebetweenpoints{\pgf@decorate@inputsegment@supportb}{\pgf@decorate@inputsegment@last}%
+ \let\pgfdecoratedinputsegmentendangle\pgfmathresult%
+ \else%
+ \pgfmathanglebetweenpoints{\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@last}%
+ \let\pgfdecoratedangle\pgfmathresult%
+ \let\pgfdecoratedinputsegmentstartangle\pgfmathresult%
+ \let\pgfdecoratedinputsegmentendangle\pgfmathresult%
+ \fi%
+ %
+ % Get the angle to the next input segment.
+ %
+ \begingroup%
+ \pgf@decorate@nextinputsegmentobject%
+ \global\let\pgf@decorate@temp\pgfdecorationcurrentinputsegment%
+ \ifx\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentmoveto%
+ \expandafter\pgf@decorate@currentinputsegmentobject%
+ \fi%
+ \ifx\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentcurveto%
+ \pgfmathanglebetweenpoints{\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@supporta}%
+ \else%
+ \pgfmathanglebetweenpoints{\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@last}%
+ \fi%
+ \pgf@x-\pgfdecoratedangle pt\relax%
+ \advance\pgf@x\pgfmathresult pt\relax%
+ \edef\pgfdecoratedangletonextinputsegment{\the\pgf@x}%
+ \pgfmath@smuggleone\pgfdecoratedangletonextinputsegment%
+ \endgroup%
+ \let\pgfdecorationnextinputsegmentobject\pgf@decorate@temp%
+}%
+
+
+%
+% Input segment objects
+%
+
+\newif\ifpgf@decorate@is@closepath@%
+
+% Input segment types.
+%
+% These allow comparison with \ifx using
+%
+% \pgfdecorationcurrentinputsegment
+% \pgfdecorationnextinputsegment
+% \pgfdecorationcurrentprevioussegment
+%
+\def\pgfdecorationinputsegmentmoveto{moveto}%
+\def\pgfdecorationinputsegmentlineto{lineto}%
+\def\pgfdecorationinputsegmentcurveto{curveto}%
+\def\pgfdecorationinputsegmentclosepath{closepath}%
+\def\pgfdecorationinputsegmentlast{last}%
+
+% Input segment object moveto.
+%
+\def\pgf@decorate@inputsegmentobject@moveto#1{%
+ \def\pgf@decorate@inputsegment@first{#1}%
+ \def\pgf@decorate@inputsegment@supporta{#1}%
+ \def\pgf@decorate@inputsegment@supportb{#1}%
+ \def\pgf@decorate@inputsegment@last{#1}%
+ \edef\pgf@decorate@lastmoveto{#1}%
+ \def\pgfdecoratedinputsegmentlength{0pt}%
+ \let\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentmoveto%
+}%
+
+% Input segment object lineto.
+%
+\def\pgf@decorate@inputsegmentobject@lineto#1#2#3{%
+ \def\pgfdecoratedinputsegmentlength{#1}%
+ \def\pgf@decorate@inputsegment@first{#2}%
+ \def\pgf@decorate@inputsegment@last{#3}%
+ %
+ % Supports should be defined like this, so if treated as a curve,
+ % equal time steps will correspond to equal distances.
+ %
+ \pgfpointdiff{#2}{#3}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfextract@process\pgf@decorate@inputsegment@supporta{%
+ \pgf@process{#2}%
+ \advance\pgf@x0.333333\pgf@xa%
+ \advance\pgf@y0.333333\pgf@ya%
+ }%
+ \pgfextract@process\pgf@decorate@inputsegment@supportb{%
+ \pgf@process{#2}%
+ \advance\pgf@x0.666666\pgf@xa%
+ \advance\pgf@y0.666666\pgf@ya%
+ }%
+ \let\pgf@decorate@movealonginputsegment\pgf@decorate@movealonginputsegment@line%
+ \let\pgf@decorate@transformtoinputsegment\pgf@decorate@transformtoinputsegment@line%
+ \let\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentlineto%
+}%
+
+% Input segment object curveto.
+%
+\def\pgf@decorate@inputsegmentobject@curveto#1#2#3#4#5{%
+ \def\pgfdecoratedinputsegmentlength{#1}%
+ \def\pgf@decorate@inputsegment@first{#2}%
+ \def\pgf@decorate@inputsegment@supporta{#3}%
+ \def\pgf@decorate@inputsegment@supportb{#4}%
+ \def\pgf@decorate@inputsegment@last{#5}%
+ %
+ \let\pgf@decorate@movealonginputsegment\pgf@decorate@movealonginputsegment@curve%
+ \let\pgf@decorate@transformtoinputsegment\pgf@decorate@transformtoinputsegment@curve%
+ \let\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentcurveto%
+}%
+
+% Input segment object closepath.
+%
+% Treated like a lineto, but flag that it is a closepath.
+%
+\def\pgf@decorate@inputsegmentobject@closepath#1#2#3{%
+ \pgf@decorate@is@closepath@true%
+ %
+ \def\pgfdecoratedinputsegmentlength{#1}%
+ \def\pgf@decorate@inputsegment@first{#2}%
+ \def\pgf@decorate@inputsegment@last{#3}%
+ %
+ \pgfpointdiff{#2}{#3}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgfextract@process\pgf@decorate@inputsegment@supporta{%
+ \pgf@process{#2}%
+ \advance\pgf@x0.333333\pgf@xa%
+ \advance\pgf@y0.333333\pgf@ya%
+ }%
+ \pgfextract@process\pgf@decorate@inputsegment@supportb{%
+ \pgf@process{#2}%
+ \advance\pgf@x0.666666\pgf@xa%
+ \advance\pgf@y0.666666\pgf@ya%
+ }%
+ %
+ \let\pgf@decorate@movealonginputsegment\pgf@decorate@movealonginputsegment@line%
+ \let\pgf@decorate@transformtoinputsegment\pgf@decorate@transformtoinputsegment@line%
+ \let\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentclosepath%
+}%
+
+
+% Input segment object endofinputsegments.
+%
+\def\pgf@decorate@inputsegmentobject@endofinputsegments{%
+ \let\pgfdecorationcurrentinputsegment\pgfdecorationinputsegmentlast%
+}%
+
+
+
+
+% This macro controls how the automaton moves along a line sub-path
+%
+\def\pgf@decorate@movealonginputsegment@line#1{}% Nothing special needed.
+
+% This macro controls how the automaton moves along a curve sub-path.
+%
+\def\pgf@decorate@movealonginputsegment@curve#1{%
+ \ifdim#1=0pt\relax%
+ \else%
+ \pgfpointcurveattime{\pgf@decorate@inputsegmenttime}%
+ {\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@supporta}%
+ {\pgf@decorate@inputsegment@supportb}{\pgf@decorate@inputsegment@last}%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \pgf@xb\pgf@decorate@inputsegmenttime pt\relax%
+ %
+ % Reduce the initial time step, depending on the length
+ % of the path. To do: Optimise this step (should also depend on #1).
+ %
+ \ifdim\pgf@decorate@currentpathlength<128pt\relax%
+ \pgf@yb.03125pt\relax%
+ \else%
+ \ifdim\pgf@decorate@currentpathlength<512pt\relax%
+ \pgf@yb.015625pt\relax%
+ \else%
+ \ifdim\pgf@decorate@currentpathlength<2048pt\relax%
+ \pgf@yb.00390625pt\relax%
+ \else%
+ \pgf@yb.0009765625pt\relax%
+ \fi%
+ \fi%
+ \fi%
+ \c@pgf@counta1\relax%
+ \pgfutil@tempdima0pt\relax%
+ \pgfmathloop%
+ \advance\pgf@xb\c@pgf@counta\pgf@yb%
+ %
+ % We would like to use \pgfpointcurveattime. However, we must not
+ % overuse \pgf@process or \pgfmath stuff within this loop,
+ % otherwise we increase the chances of save stack overflow.
+ %
+ \edef\pgf@decorate@temp{%
+ \pgf@xa\the\pgf@xa%
+ \pgf@xb\the\pgf@xb%
+ \pgf@ya\the\pgf@ya%
+ \pgf@yb\the\pgf@yb%
+ }%
+ %
+ \pgfpoint@decorate@curveattime{\pgfmath@tonumber{\pgf@xb}}%
+ {\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@supporta}%
+ {\pgf@decorate@inputsegment@supportb}{\pgf@decorate@inputsegment@last}%
+ \pgf@decorate@temp%
+ %
+ \pgf@xc\pgf@xa%
+ \pgf@yc\pgf@ya%
+ \pgf@xa\pgf@x%
+ \pgf@ya\pgf@y%
+ \advance\pgf@x-\pgf@xc%
+ \advance\pgf@y-\pgf@yc%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgfutil@tempdimb\pgfmathresult pt\relax%
+ \advance\pgfutil@tempdima\c@pgf@counta\pgfutil@tempdimb%
+ \ifnum\c@pgf@counta>0\relax%
+ \ifdim\pgfutil@tempdima>#1\relax%
+ \c@pgf@counta-\c@pgf@counta%
+ \pgf@yb.5\pgf@yb%
+ \fi%
+ \else%
+ \ifdim\pgfutil@tempdima<#1\relax%
+ \c@pgf@counta-\c@pgf@counta%
+ \pgf@yb.5\pgf@yb%
+ \fi%
+ \fi%
+ \ifdim\pgf@yb=0pt\relax% *Should* be OK.
+ \else%
+ \repeatpgfmathloop%
+ \edef\pgf@decorate@inputsegmenttime{\pgfmath@tonumber{\pgf@xb}}%
+ %
+ % Now calculate the angle at the new time on the curve.
+ %
+ % We can use \pgfpointcurveattime safely here.
+ %
+ \pgfpointcurveattime{\pgf@decorate@inputsegmenttime}%
+ {\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@supporta}%
+ {\pgf@decorate@inputsegment@supportb}{\pgf@decorate@inputsegment@last}%
+ \edef\pgf@marshal{%
+ \noexpand\pgfmathanglebetweenpoints%
+ {\pgf@x\the\pgf@xb\pgf@y\the\pgf@yb}%
+ {\pgf@x\the\pgf@xa\pgf@y\the\pgf@ya}%
+ }%
+ \pgf@marshal%
+ \let\pgfdecoratedangle\pgfmathresult%
+ \fi%
+}%
+
+% \pgfpoint@decorate@curveattime
+%
+% A `quick' version of \pgfpointcurveattime
+%
+% No parsing and no use of \pgf@process.
+% This prevents save stack build up when used inside a loop.
+%
+\def\pgfpoint@decorate@curveattime#1#2#3#4#5{%
+ \edef\pgf@time@s{#1}%
+ \pgf@x-\pgf@time@s pt\relax%
+ \advance\pgf@x1pt\relax%
+ \edef\pgf@time@t{\pgf@sys@tonumber{\pgf@x}}%
+ #5\relax%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ #4\relax%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ #3\relax%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ #2\relax%
+ % First iteration:
+ \pgf@x=\pgf@time@t\pgf@x\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \pgf@y=\pgf@time@t\pgf@y\advance\pgf@y by\pgf@time@s\pgf@ya%
+ \pgf@xa=\pgf@time@t\pgf@xa\advance\pgf@xa by\pgf@time@s\pgf@xb%
+ \pgf@ya=\pgf@time@t\pgf@ya\advance\pgf@ya by\pgf@time@s\pgf@yb%
+ \pgf@xb=\pgf@time@t\pgf@xb\advance\pgf@xb by\pgf@time@s\pgf@xc%
+ \pgf@yb=\pgf@time@t\pgf@yb\advance\pgf@yb by\pgf@time@s\pgf@yc%
+ % Second iteration:
+ \pgf@x=\pgf@time@t\pgf@x\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \pgf@y=\pgf@time@t\pgf@y\advance\pgf@y by\pgf@time@s\pgf@ya%
+ \pgf@xa=\pgf@time@t\pgf@xa\advance\pgf@xa by\pgf@time@s\pgf@xb%
+ \pgf@ya=\pgf@time@t\pgf@ya\advance\pgf@ya by\pgf@time@s\pgf@yb%
+ % Save x/y
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ % Third iteration:
+ \pgf@x=\pgf@time@t\pgf@x\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \pgf@y=\pgf@time@t\pgf@y\advance\pgf@y by\pgf@time@s\pgf@ya%
+}%
+
+
+% Applies the necessary transform for a line sub-path.
+%
+\def\pgf@decorate@transformtoinputsegment@line{%
+ \pgftransformshift{%
+ \pgfpointlineatdistance{\pgfdecoratedinputsegmentcompleteddistance}{\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@last}
+ }%
+ \pgftransformrotate{\pgfdecoratedangle}%
+}%
+
+% Applies the necessary transform for a curve sub-path.
+%
+\def\pgf@decorate@transformtoinputsegment@curve{%
+ \pgfslopedattimetrue%
+ \pgfallowupsidedownattimetrue%
+ \pgftransformcurveattime{\pgf@decorate@inputsegmenttime}%
+ {\pgf@decorate@inputsegment@first}{\pgf@decorate@inputsegment@supporta}%
+ {\pgf@decorate@inputsegment@supportb}{\pgf@decorate@inputsegment@last}%
+}%
+
+
+
+
+
+% \pgf@decorate@parsesoftpath
+%
+% Parses an instance of a soft path into intermediate line and curve
+% sub-path objects which the decoration automaton can use to traverse
+% the decorated path.
+%
+% The soft path should be well formed and only contain `primative'
+% soft path tokens, that is: moveto, lineto, curvetosupporta,
+% curvetosupportb, curveto, rectcorner, rectsize, and closepath.
+% (i.e., all specialround tokens should have removed using
+% \pgfprocessround)
+%
+% The overall length of the path is also calculated and returned
+% in the macro \pgfdecoratedpathlength.
+%
+% Parameters:
+%
+% #1 - a macro containing a well formed soft path.
+% #2 - a macro to store the intermediate sub-path representations.
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointorigin}
+% \pgfpathlineto{\pgfpoint{0pt}{12pt}}
+% \pgfpathlineto{\pgfpoint{12pt}{0pt}}
+% \pgfgetpath\softpath
+%
+% \pgf@decorate@parsesoftpath{\softpath}{\parsedsoftpath}
+%
+% results in:
+%
+% \parsedsoftpath ->
+% {\pgf@decorate@inputsegmentobject@lineto{12pt}{\pgf@x 0pt\pgf@y 0pt}{\pgf@x 0pt\pgf@y 12pt}}
+% {\pgf@decorate@inputsegmentobject@lineto{12pt}{\pgf@x 0pt\pgf@y 12pt}{\pgf@x 12pt\pgf@y 12pt}}
+%
+% \pgfdecoratedpathlength ->
+% 24pt
+%
+
+\def\pgf@decorate@parsesoftpath#1#2{%
+ \def\pgf@decorate@inputsegmentobjectsmacro{#2}%
+ \let\pgf@decorate@inputsegmentobjects\pgfutil@empty%
+ \pgfutil@tempdima0pt\relax%
+ \let\pgfpoint@decorate@lastparsed\pgfpoint@decorate@existingpathlast%
+ \let\pgfpoint@decorate@lastnonmovetoparsed\pgfpoint@origin%
+ \let\pgf@decorate@queueinputsegmentobject\pgfutil@empty%
+ \let\pgfpoint@decorated@firstparsed\pgfutil@empty%
+ \expandafter\pgf@decorate@@parsesoftpath#1\pgf@stop%
+}%
+
+\def\pgf@decorate@@parsesoftpath#1{%
+ \ifx#1\pgf@stop%
+ \let\pgf@decorate@queueinputsegmentobject\pgfutil@empty% <- removes final moveto (may not be desirable).
+ \pgf@decorate@addtoinputsegmentobjects{\pgf@decorate@inputsegmentobject@endofinputsegments}%
+ \pgf@decorate@addtoinputsegmentobjects{\pgf@decorate@inputsegmentobject@endofinputsegments}%
+ \expandafter\let\pgf@decorate@inputsegmentobjectsmacro\pgf@decorate@inputsegmentobjects%
+ \edef\pgf@decorate@totalpathlength{\the\pgfutil@tempdima}%
+ \let\pgf@next\relax%
+ \else%
+ \ifx#1\pgfsyssoftpath@movetotoken%
+ \let\pgf@next\pgf@decorate@parsemoveto%
+ \else%
+ \ifx#1\pgfsyssoftpath@linetotoken%
+ \let\pgf@next\pgf@decorate@parselineto%
+ \else%
+ \ifx#1\pgfsyssoftpath@curvetosupportatoken%
+ \let\pgf@next\pgf@decorate@parsecurveto%
+ \else%
+ \ifx#1\pgfsyssoftpath@closepathtoken%
+ \let\pgf@next\pgf@decorate@parseclosepath%
+ \else%
+ \ifx#1\pgfsyssoftpath@rectcornertoken%
+ \let\pgf@next\pgf@decorate@parserect%
+ \else%
+ \pgferror{Unrecognised soft path token `#1'}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgf@next}%
+
+
+\def\pgf@decorate@addtoinputsegmentobjects#1{%
+ %
+ % If there is an input segment object waiting (i.e. a moveto), insert it here.
+ %
+ \ifx\pgf@decorate@queueinputsegmentobject\pgfutil@empty%
+ \else%
+ \let\pgf@decorate@temp\pgf@decorate@queueinputsegmentobject%
+ \let\pgf@decorate@queueinputsegmentobject\pgfutil@empty%
+ \expandafter\pgf@decorate@addtoinputsegmentobjects\expandafter{\pgf@decorate@temp}%
+ \fi%
+ \ifx\pgfpoint@decorated@firstparsed\pgfutil@empty%
+ #1%
+ \let\pgfpoint@decorated@firstparsed\pgf@decorate@inputsegment@first%
+ \fi%
+ \expandafter\def\expandafter\pgf@decorate@inputsegmentobjects\expandafter%
+ {\pgf@decorate@inputsegmentobjects{#1}}%
+}%
+
+% Convert \pgfsyssoftpath@movetotoken{<X>}{<Y>} into the following
+% representation:
+%
+% \pgf@decorate@inputsegmentobject@moveto{\pgf@x X\pgf@y Y}
+%
+% The moveto input segment object is not added immediately, so that
+% only the last of multiple movetos is inserted.
+%
+\def\pgf@decorate@parsemoveto#1#2{%
+ \def\pgf@decorate@queueinputsegmentobject{\pgf@decorate@inputsegmentobject@moveto{\pgf@x#1\pgf@y#2}}%
+ \def\pgfpoint@decorate@lastparsed{\pgf@x#1\pgf@y#2}%
+ \pgf@decorate@@parsesoftpath%
+}%
+
+% Convert \pgfsyssoftpath@linetotoken{<X>}{<Y>} into the following
+% representation:
+%
+% \pgf@decorate@inputsegmentobject@lineto{<length>}{\pgf@x <Last X> \pgf@y <Last Y}{\pgf@x <X> \pgf@y <Y>}
+%
+\def\pgf@decorate@parselineto#1#2{%
+ \pgf@decorate@linelength{\pgfpoint@decorate@lastparsed}{\pgf@x#1\pgf@y#2}%
+ \advance\pgfutil@tempdima\pgfmathresult pt\relax%
+ \edef\pgf@decorate@temp{%
+ \noexpand\pgf@decorate@inputsegmentobject@lineto{\pgfmathresult pt}{\pgfpoint@decorate@lastparsed}{\pgf@x#1\pgf@y#2}%
+ }%
+ \edef\pgfpoint@decorate@lastparsed{\pgf@x#1\pgf@y#2}%
+ \let\pgfpoint@decorate@lastnonmovetoparsed\pgfpoint@decorate@lastparsed%
+ \expandafter\pgf@decorate@addtoinputsegmentobjects\expandafter{\pgf@decorate@temp}%
+ \pgf@decorate@@parsesoftpath%
+}%
+
+% Convert \pgfsyssoftpath@curvetosupportatoken{<Xa>}{<Ya>}...etc
+% into the following representation:
+%
+% \pgf@decorate@inputsegmentobject@curveto{<length>}{\pgf@x <Last X> \pgf@y <Last Y}
+% {\pgf@x <Xa> \pgf@y <Ya>}{\pgf@x <Xb> \pgf@y <Yb>}{\pgf@x <X> \pgf@y <Y>}
+%
+\def\pgf@decorate@parsecurveto#1#2\pgfsyssoftpath@curvetosupportbtoken#3#4\pgfsyssoftpath@curvetotoken#5#6{%
+ \pgf@decorate@curvelength{\pgfpoint@decorate@lastparsed}{\pgf@x#1\pgf@y#2}{\pgf@x#3\pgf@y#4}{\pgf@x#5\pgf@y#6}%
+ \advance\pgfutil@tempdima\pgfmathresult pt\relax%
+ \edef\pgf@decorate@temp{%
+ \noexpand\pgf@decorate@inputsegmentobject@curveto{\pgfmathresult pt}{\pgfpoint@decorate@lastparsed}%
+ {\pgf@x#1\pgf@y#2}{\pgf@x#3\pgf@y#4}{\pgf@x#5\pgf@y#6}%
+ }%
+ \expandafter\pgf@decorate@addtoinputsegmentobjects\expandafter{\pgf@decorate@temp}%
+ \edef\pgfpoint@decorate@lastparsed{\pgf@x#5\pgf@y#6}%
+ \let\pgfpoint@decorate@lastnonmovetoparsed\pgfpoint@decorate@lastparsed%
+ \pgf@decorate@@parsesoftpath%
+}%
+
+
+\def\pgf@decorate@parseclosepath#1#2{%
+ \pgf@decorate@linelength{\pgfpoint@decorate@lastparsed}{\pgf@x#1\pgf@y#2}%
+ \advance\pgfutil@tempdima\pgfmathresult pt\relax%
+ \edef\pgf@decorate@temp{%
+ \noexpand\pgf@decorate@inputsegmentobject@closepath{\pgfmathresult pt}{\pgfpoint@decorate@lastparsed}{\pgf@x#1\pgf@y#2}%
+ }%
+ \expandafter\pgf@decorate@addtoinputsegmentobjects\expandafter{\pgf@decorate@temp}%
+ \edef\pgfpoint@decorate@lastparsed{\pgf@x#1\pgf@y#2}%
+ \let\pgfpoint@decorate@lastnonmovetoparsed\pgfpoint@decorate@lastparsed%
+ \pgf@decorate@@parsesoftpath%
+}%
+
+% Convert \pgfsyssoftpath@rectcornertoken{<X>}{<Y>}\pgfsyssoftpath@rectsizetoken{<Xa>}{<Ya>}
+% into either (clockwise)
+%
+% \pgf@decorate@inputsegmentobject@moveto{<X>}{<Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 1>}{\pgf@x <X> \pgf@y <Y>}{\pgf@x <X> \pgf@y <Ya+Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 2>}{\pgf@x <X> \pgf@y <Ya+Y>}{\pgf@x <Xa+X> \pgf@y <Ya+Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 1>}{\pgf@x <Xa+X> \pgf@y <Ya+X>}{\pgf@x <Xa+X> \pgf@y <Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 2>}{\pgf@x <Xa+X> \pgf@y <Y>}{\pgf@x <X> \pgf@y <Y>}
+% \pgf@decorate@inputsegmentobject@moveto{<Xa>}{<Ya>}
+%
+% ...or (anti-clockwise)
+%
+% \pgf@decorate@inputsegmentobject@moveto{<X>}{<Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 2>}{\pgf@x <X> \pgf@y <Y>}{\pgf@x <Xa+X> \pgf@y <Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 1>}{\pgf@x <Xa+X> \pgf@y <Y>}{\pgf@x <Xa+X> \pgf@y <Ya+Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 2>}{\pgf@x <Xa+X> \pgf@y <Ya+Y>}{\pgf@x <X> \pgf@y <Ya+Y>}
+% \pgf@decorate@inputsegmentobject@lineto{<length 1>}{\pgf@x <X> \pgf@y <Ya+Y>}{\pgf@x <X> \pgf@y <Y>}
+% \pgf@decorate@inputsegmentobject@moveto{<Xa>}{<Ya>}
+%
+\newif\ifpgfdecoraterectangleclockwise
+\def\pgf@decorate@parserect#1#2\pgfsyssoftpath@rectsizetoken#3#4{%
+ %
+ % Subvert \pgf@decorate@parsesoftpath so parsing macros will
+ % return here instead of continuing to parse the soft path.
+ %
+ \let\pgf@decorate@orig@@parsesoftpath\pgf@decorate@@parsesoftpath%
+ \let\pgf@decorate@@parsesoftpath\relax%
+ \pgf@decorate@parsemoveto{#1}{#2}%
+ \pgf@xa#1\relax%
+ \pgf@ya#2\relax%
+ \ifpgfdecoraterectangleclockwise%
+ \advance\pgf@ya#4%
+ \pgf@yb\pgf@ya%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parselineto\pgf@temp%
+ \advance\pgf@xa#3%
+ \pgf@xb\pgf@xa%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parselineto\pgf@temp%
+ \advance\pgf@ya-#4%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parselineto\pgf@temp%
+ \advance\pgf@xa-#3%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parseclosepath\pgf@temp%
+ \else%
+ \advance\pgf@xa#3%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \pgf@xb\pgf@xa%
+ \expandafter\pgf@decorate@parselineto\pgf@temp%
+ \advance\pgf@ya#4%
+ \pgf@yb\pgf@ya%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parselineto\pgf@temp%
+ \advance\pgf@xa-#3%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parselineto\pgf@temp%
+ \advance\pgf@ya-#4%
+ \edef\pgf@temp{{\the\pgf@xa}{\the\pgf@ya}}%
+ \expandafter\pgf@decorate@parseclosepath\pgf@temp%
+ \fi%
+ %
+ % Restore the parsing.
+ %
+ \let\pgf@decorate@@parsesoftpath\pgf@decorate@orig@@parsesoftpath%
+ \edef\pgf@marshal{\noexpand\pgf@decorate@parsemoveto{\the\pgf@xb}{\the\pgf@yb}}%
+ \pgf@marshal%
+}%
+
+
+
+
+% \pgf@decorate@linelength
+%
+% Define \pgfmathresult as the distance between #1 and #2 (without units).
+%
+\def\pgf@decorate@linelength#1#2{%
+ \pgf@process{\pgfpointdiff{#1}{#2}}%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+}%
+
+% \pgf@decorate@curvelength
+%
+% Define \pgfmathresult as the length (without units) of the cubic
+% bezier described by #1,#2,#3 and #4.
+%
+% To approximate the length of the curve P (sort of) use:
+%
+% curveLength(P,q)
+% Q = subdivideLeft(P);
+% R = subdivideRight(P);
+% return curveLength'(Q,q) + curveLength'(R,q);
+%
+% curveLength'(P,q)
+% <P1,P2,P3,P4> <- P;
+% P' = P4 - P1;
+% x = P'.x();
+% y = P'.y();
+% if (x < q) && (y < q)
+% return |P'|;
+% else%
+% Q = subdivideLeft(P);
+% R = subdivideRight(P);
+% return curveLength'(Q,q) + curveLength'(R,q);
+%
+% Where q is some small value (`tolerance').
+%
+\newif\ifpgf@decorate@subdivide
+\def\pgf@decorate@curvelength#1#2#3#4{%
+ %
+ % Always begin with a subdivision in case #1 = #4.
+ %
+ \begingroup%
+ \pgf@decorate@recursive@subdividecurve@left{#1}{#2}{#3}{#4}%
+ \pgfutil@tempdimb\pgfmathresult pt\relax%
+ \pgf@decorate@recursive@subdividecurve@right{#1}{#2}{#3}{#4}%
+ \advance\pgfutil@tempdimb\pgfmathresult pt\relax%
+ \pgfmath@returnone\pgfutil@tempdimb%
+ \endgroup%
+}%
+
+\def\pgf@decorate@@curvelength#1#2#3#4{%
+ \begingroup%
+ \pgf@decorate@curvecordlength{#1}{#2}{#3}{#4}%
+ \ifpgf@decorate@subdivide%
+ \pgf@decorate@recursive@subdividecurve@left{#1}{#2}{#3}{#4}%
+ \pgfutil@tempdimb\pgfmathresult pt\relax%
+ \pgf@decorate@recursive@subdividecurve@right{#1}{#2}{#3}{#4}%
+ \advance\pgfutil@tempdimb\pgfmathresult pt\relax%
+ \expandafter\pgfmath@returnone\expandafter\pgfutil@tempdimb%
+ \else%
+ \expandafter\pgfmath@returnone\expandafter\pgfmathresult\expandafter p\expandafter t\expandafter%
+ \fi%
+ \endgroup%
+}%
+
+\def\pgf@decorate@curvelength@tolerance{1pt}%
+
+\def\pgf@decorate@curvecordlength#1#2#3#4{%
+ %
+ % Calculate the curve cord vector.
+ %
+ #4\relax%
+ \pgf@xa\pgf@x\pgf@ya\pgf@y%
+ #1\relax%
+ \advance\pgf@xa-\pgf@x%
+ \advance\pgf@ya-\pgf@y%
+ \ifdim\pgf@xa<0pt\relax\pgf@xa-\pgf@xa\fi%
+ \ifdim\pgf@ya<0pt\relax\pgf@ya-\pgf@ya\fi%
+ %
+ % Always subdivide, unless...
+ %
+ \pgf@decorate@subdividetrue%
+ %
+ % The cord vector is small.
+ %
+ \ifdim\pgf@xa<\pgf@decorate@curvelength@tolerance\relax%
+ \ifdim\pgf@ya<\pgf@decorate@curvelength@tolerance\relax%
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@ya}}%
+ \pgf@decorate@subdividefalse%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@decorate@recursive@subdividecurve@left#1#2#3#4{%
+ {%
+ %
+ % The left curve (from t=0 to t=.5)
+ %
+ #1\relax%
+ \pgfutil@tempdima\pgf@x%
+ \pgfutil@tempdimb\pgf@y%
+ \pgf@xa.5\pgf@x\pgf@ya.5\pgf@y%
+ \pgf@xb.25\pgf@x\pgf@yb.25\pgf@y%
+ \pgf@xc.125\pgf@x\pgf@yc.125\pgf@y%
+ #2\relax%
+ \advance\pgf@xa.5\pgf@x\advance\pgf@ya.5\pgf@y%
+ \advance\pgf@xb.5\pgf@x\advance\pgf@yb.5\pgf@y%
+ \advance\pgf@xc.375\pgf@x\advance\pgf@yc.375\pgf@y%
+ #3\relax%
+ \advance\pgf@xb.25\pgf@x\advance\pgf@yb.25\pgf@y%
+ \advance\pgf@xc.375\pgf@x\advance\pgf@yc.375\pgf@y%
+ #4\relax%
+ \advance\pgf@xc.125\pgf@x\advance\pgf@yc.125\pgf@y%
+ \xdef\pgf@marshal{%
+ \noexpand\pgf@decorate@@curvelength%
+ {\pgf@x\the\pgfutil@tempdima\pgf@y\the\pgfutil@tempdimb}%
+ {\pgf@x\the\pgf@xa\pgf@y\the\pgf@ya}{\pgf@x\the\pgf@xb\pgf@y\the\pgf@yb}
+ {\pgf@x\the\pgf@xc\pgf@y\the\pgf@yc}%
+ }%
+ }%
+ \pgf@marshal%
+}%
+
+\def\pgf@decorate@recursive@subdividecurve@right#1#2#3#4{%
+ {%
+ %
+ % The right curve (from t=0.5 to t=1)
+ %
+ #1\relax%
+ \pgfutil@tempdima.125\pgf@x\pgfutil@tempdimb.125\pgf@y%
+ #2\relax%
+ \advance\pgfutil@tempdima.375\pgf@x\advance\pgfutil@tempdimb.375\pgf@y%
+ \pgf@xa.25\pgf@x\pgf@ya.25\pgf@y%
+ #3\relax%
+ \advance\pgfutil@tempdima.375\pgf@x\advance\pgfutil@tempdimb.375\pgf@y%
+ \advance\pgf@xa.5\pgf@x\advance\pgf@ya.5\pgf@y%
+ \pgf@xb.5\pgf@x\pgf@yb.5\pgf@y%
+ #4\relax%
+ \advance\pgfutil@tempdima.125\pgf@x\advance\pgfutil@tempdimb.125\pgf@y%
+ \advance\pgf@xa.25\pgf@x\advance\pgf@ya.25\pgf@y%
+ \advance\pgf@xb.5\pgf@x\advance\pgf@yb.5\pgf@y%
+ \pgf@xc\pgf@x\pgf@yc\pgf@y%
+ \xdef\pgf@marshal{%
+ \noexpand\pgf@decorate@@curvelength%
+ {\pgf@x\the\pgfutil@tempdima\pgf@y\the\pgfutil@tempdimb}%
+ {\pgf@x\the\pgf@xa\pgf@y\the\pgf@ya}{\pgf@x\the\pgf@xb\pgf@y\the\pgf@yb}
+ {\pgf@x\the\pgf@xc\pgf@y\the\pgf@yc}%
+ }%
+ }%
+ \pgf@marshal%
+}%
+
+
+% Macro to reverse a set of input segment objects.
+%
+% #1 - a macro holding the input segment objects.
+% #2 - a macro holding the reversed input segment objects.
+%
+\def\pgf@decorate@inputsegmentobjects@reverse#1#2{%
+ \def\pgf@decorate@path@storein{#2}%
+ \def\pgf@decorate@inputsegments@@temp{}%
+ \expandafter\pgf@decorate@inputsegments@@reverse@pass@first#1\pgf@stop}%
+
+\def\pgf@decorate@inputsegments@@reverse@pass@first#1#2\pgf@stop{%
+ \def\pgf@decorate@temp{#1}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgf@decorate@inputsegments@@temp\expandafter\expandafter\expandafter%
+ {\expandafter\pgf@decorate@temp\pgf@decorate@inputsegments@@temp}%
+ \def\pgf@decorate@test{#2}
+ \ifx\pgf@decorate@test\pgfutil@empty%
+ \def\pgf@decorate@next{%
+ \expandafter\pgf@decorate@inputsegmentobjects@reverse@pass@second\pgf@decorate@inputsegments@@temp\pgf@stop%
+ }%
+ \else%
+ \def\pgf@decorate@next{\pgf@decorate@inputsegments@@reverse@pass@first#2\pgf@stop}%
+ \fi%
+ \pgf@decorate@next%
+}%
+\def\pgf@decorate@inputsegmentobjects@reverse@pass@second#1#2#3\pgf@stop{%
+ \def\pgf@decorate@inputsegments@temp{#3}%
+ \def\pgf@decorate@inputsegments@@temp{}%
+ \let\pgf@decorate@current@inputsegmentobject=\pgfutil@empty
+ \let\pgf@decorate@last@object=\pgfutil@empty
+ \pgf@decorate@inputsegmentobjects@reverse@moveto@waitingtrue%
+ \pgf@decorate@inputsegmentobjects@reverse@closepath@waitingfalse%
+ \expandafter\pgf@decorate@path@@reverse@pass@second\pgf@decorate@inputsegments@temp\pgf@stop}%
+
+
+\def\pgf@decorate@path@@reverse@pass@second#1{%
+ \ifx#1\pgf@stop%
+ \expandafter\def\expandafter\pgf@decorate@inputsegments@@temp\expandafter{%
+ \pgf@decorate@inputsegments@@temp%
+ {\pgf@decorate@inputsegmentobject@endofinputsegments}%
+ {\pgf@decorate@inputsegmentobject@endofinputsegments}
+ }%
+ \expandafter\let\pgf@decorate@path@storein=\pgf@decorate@inputsegments@@temp%
+ \let\pgf@decorate@next=\relax%
+ \else%
+ \ifx#1\pgf@decorate@inputsegmentobject@moveto%
+ \let\pgf@decorate@next=\pgf@decorate@inputsegmentobjects@reverse@moveto%
+ \else%
+ \ifx#1\pgf@decorate@inputsegmentobject@lineto%
+ \let\pgf@decorate@next=\pgf@decorate@inputsegmentobjects@reverse@lineto%
+ \else%
+ \ifx#1\pgf@decorate@inputsegmentobject@curveto%
+ \let\pgf@decorate@next=\pgf@decorate@inputsegmentobjects@reverse@curveto%
+ \else%
+ \ifx#1\pgf@decorate@inputsegmentobject@closepath%
+ \let\pgf@decorate@next=\pgf@decorate@inputsegmentobjects@reverse@closepath%
+ \else%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgf@decorate@next%
+}%
+
+\newif\ifpgf@decorate@inputsegmentobjects@reverse@moveto@waiting
+
+\def\pgf@decorate@inputsegmentobjects@reverse@moveto#1{%
+ \ifpgf@decorate@inputsegmentobjects@reverse@closepath@waiting%
+ \edef\pgf@decorate@current@inputsegmentobject{%
+ {\noexpand\pgf@decorate@inputsegmentobject@closepath%
+ {\pgf@decorate@reverse@closepath@length}%
+ {\pgf@decorate@last}%
+ {#1}%
+ }%
+ }%
+ \pgf@decorate@inputsegmentobjects@reverse@closepath@waitingfalse%
+ \else%
+ \let\pgf@decorate@current@inputsegmentobject=\pgfutil@empty%
+ \fi%
+ \pgf@decorate@inputsegmentobjects@reverse@moveto@waitingtrue%
+ \pgf@decorate@path@@@reverse@pass@second%
+}%
+
+\newif\ifpgf@decorate@inputsegmentobjects@reverse@closepath@waiting
+
+\def\pgf@decorate@inputsegmentobjects@reverse@closepath#1#2#3{%
+ \pgf@decorate@inputsegmentobjects@reverse@closepath@waitingtrue%
+ \def\pgf@decorate@reverse@closepath@length{#1}%
+ \def\pgf@decorate@current@inputsegmentobject{}%
+ \pgf@decorate@inputsegmentobjects@reverse@lineto{#1}{#2}{#3}%
+}%
+
+\def\pgf@decorate@inputsegmentobjects@reverse@lineto#1#2#3#4{%
+ \ifpgf@decorate@inputsegmentobjects@reverse@moveto@waiting%
+ \def\pgf@decorate@current@inputsegmentobject{{\pgf@decorate@inputsegmentobject@moveto{#3}}}%
+ \pgf@decorate@inputsegmentobjects@reverse@moveto@waitingfalse%
+ \else%
+ \let\pgf@decorate@current@inputsegmentobject=\pgfutil@empty%
+ \fi%
+ \def\pgf@decorate@append@inputsegmentobject{{\pgf@decorate@inputsegmentobject@lineto{#1}{#3}{#2}}}%
+ \ifx#4\pgf@decorate@inputsegmentobject@moveto%
+ \ifpgf@decorate@inputsegmentobjects@reverse@closepath@waiting%
+ \def\pgf@decorate@append@inputsegmentobject{{\pgf@decorate@inputsegmentobject@closepath{#1}{#3}{#2}}}%
+ \pgf@decorate@inputsegmentobjects@reverse@closepath@waitingfalse%
+ \else%
+ \def\pgf@decorate@append@inputsegmentobject{{\pgf@decorate@inputsegmentobject@lineto{#1}{#3}{#2}}}%
+ \fi%
+ \fi%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgf@decorate@current@inputsegmentobject\expandafter\expandafter\expandafter%
+ {\expandafter\pgf@decorate@current@inputsegmentobject\pgf@decorate@append@inputsegmentobject}
+ \def\pgf@decorate@last{#2}%
+ \pgf@decorate@path@@@reverse@pass@second#4%
+}%
+
+\def\pgf@decorate@inputsegmentobjects@reverse@curveto#1#2#3#4#5{%
+ \ifpgf@decorate@inputsegmentobjects@reverse@moveto@waiting%
+ \def\pgf@decorate@current@inputsegmentobject{%
+ {\pgf@decorate@inputsegmentobject@moveto{#5}}%
+ {\pgf@decorate@inputsegmentobject@curveto{#1}{#5}{#4}{#3}{#2}}%
+ }%
+ \pgf@decorate@inputsegmentobjects@reverse@moveto@waitingfalse%
+ \else%
+ \def\pgf@decorate@current@inputsegmentobject{{\pgf@decorate@inputsegmentobject@curveto{#1}{#5}{#4}{#3}{#2}}}%
+ \fi%
+ \def\pgf@decorate@last{#2}%
+ \pgf@decorate@path@@@reverse@pass@second%
+}%
+
+\def\pgf@decorate@path@@@reverse@pass@second{%
+ \ifx\pgf@decorate@current@inputsegmentobject\pgfutil@empty%
+ \else%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \pgf@decorate@inputsegments@@temp\expandafter\expandafter\expandafter%
+ {\expandafter\pgf@decorate@inputsegments@@temp\pgf@decorate@current@inputsegmentobject}%
+ \fi%
+ \pgf@decorate@path@@reverse@pass@second%
+}%
+
+
+
+
+
+\let\startpgfdecoration=\pgfdecoration
+\let\stoppgfdecoration=\endpgfdecoration
+
+\let\startpgfmetadecoration=\pgfmetadecoration
+\let\stoppgfmetadecoration=\endpgfmetadecoration
+
+
+
+%
+% Predefined decorations
+%
+
+
+% Simple decorations.
+
+\pgfdeclaredecoration{lineto}{initial}{%
+ \state{initial}[switch if input segment less than=\pgfdecoratedremainingdistance to input segment,
+ width=\pgfdecoratedremainingdistance]
+ {
+ }%
+ \state{input segment}[width=\pgfdecoratedinputsegmentlength,next state=initial]
+ {
+ \pgfpathlineto{\pgfpointdecoratedinputsegmentlast}
+ }%
+
+ \state{final}{\pgfpathlineto{\pgfpointdecoratedpathlast}}%
+}%
+
+\pgfdeclaredecoration{moveto}{initial}{%
+ \state{initial}[width=\pgfdecoratedremainingdistance]{}%
+ \state{final}{\pgfpathmoveto{\pgfpointdecoratedpathlast}}%
+}%
+
+% This decorations curves to the end along the line.
+
+\pgfdeclaredecoration{curveto}{initial}{%
+ \state{initial}[width=\pgfdecoratedinputsegmentlength/100]
+ {
+ \pgfpathlineto{\pgfpointorigin}
+ }%
+ \state{final}{\pgfpathlineto{\pgfpointdecoratedpathlast}}%
+}%
+
+
+
+
+% Compatibility with old "snakes":
+
+\let\pgfsnakeremainingdistance=\pgfdecoratedremainingdistance
+\let\pgfsnakecompleteddistance=\pgfdecoratedcompleteddistance
+\def\pgfsnakeangle{\pgfdecoratedangle}%
+\let\pgfdeclaresnake=\pgfdeclaredecoration
+\let\pgfsetsnakesegmenttransformation=\pgfsetdecorationsegmenttransformation
+\def\pgfpathsnakesto#1#2{%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfdecoration\expandafter{\pgf@temp}%
+ \pgfpathlineto{#2}%
+ \endpgfdecoration%
+}%
+\def\pgfpathsnaketo#1#2{\pgfpathsnakesto{{#1}{\pgfsnakeremainingdistance}}{#2}}%
+\def\pgfpathsnakealongvector#1#2#3{%
+ \pgf@process{#3}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfmathparse{#2}%
+ \pgf@xa=\pgfmathresult\pgf@xa%
+ \pgf@ya=\pgfmathresult\pgf@ya%
+ \advance\pgf@xa by\pgf@path@lastx%
+ \advance\pgf@ya by\pgf@path@lasty%
+ \edef\pgf@snake@lib@temp{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \pgfpathsnaketo{#1}{\pgf@snake@lib@temp}%
+}%
+
+\let\pgfsnakesegmentamplitude=\pgfdecorationsegmentamplitude
+\let\pgfsnakesegmentlength=\pgfdecorationsegmentlength
+\def\pgfsnakesegmentangle{\pgfdecorationsegmentangle}%
+\def\pgfsnakesegmentobjectlength{\pgfkeysvalueof{/pgf/decoration/shape start width}}%
+\def\pgfsnakesegmentaspect{\pgfdecorationsegmentaspect}%
+
+\pgfset{%
+ /pgf/segment amplitude/.style={/pgf/decoration={amplitude=#1,shape height=2*#1}},
+ /pgf/segment length/.style={/pgf/decoration={segment length=#1}},
+ /pgf/segment angle/.style={/pgf/decoration={angle=#1}},
+ /pgf/segment aspect/.style={/pgf/decoration={aspect=#1}},
+ /pgf/segment object length/.style={/pgf/decoration={shape width=#1,radius=#1}}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmodulematrix.code.tex b/graphics/pgf/base/tex/pgfmodulematrix.code.tex
new file mode 100644
index 0000000000..50c0e1e52f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmodulematrix.code.tex
@@ -0,0 +1,652 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmodulematrix.code.tex}
+
+\usepgfmodule{shapes}%
+
+\newif\ifpgfmatrix
+\newif\ifpgf@matrix@correct@call
+
+\newif\ifpgf@matrix@fixed
+
+\newcount\pgfmatrixcurrentrow
+
+\newcount\pgfmatrixcurrentcolumn
+\newcount\pgf@matrix@numberofcolumns
+
+\let\pgf@matrix@cell=\pgfnodeparttextbox % alias
+\let\pgf@matrix@box=\pgf@matrix@cell % alias
+
+
+% Sets the default row or column sep
+%
+% #1 = default row or column sep list
+%
+% Description:
+%
+% Sets the macro \pgfmatrixrowsep or \pgfmatrixcolumnsep to #1.
+%
+% Example:
+%
+% \pgfsetmatrixrowsep{5pt}
+
+\def\pgfsetmatrixrowsep#1{\def\pgfmatrixrowsep{#1}}%
+\def\pgfsetmatrixcolumnsep#1{\def\pgfmatrixcolumnsep{#1}}%
+
+\def\pgfmatrixrowsep{0pt}%
+\def\pgfmatrixcolumnsep{0pt}%
+
+
+
+% The pgfmatrix command creates a node that contains a matrix. Like
+% the \pgfnode command, it is to be used inside a pgfpicture
+% environment.
+%
+% #1 = shape type
+% #2 = anchor
+% #3 = name for later reference
+% #4 = path usage command
+% #5 = inner shift
+% #6 = startup code
+% #7 = the matrix code (may contain verbatim stuff)
+%
+% Description:
+%
+% This command creates a node that contains a matrix. For
+% each cell of the matrix, drawing commands may be given. These
+% commands will create a cell picture and a bounding box is computed
+% for each cell picture. The cell picture is then placed inside the
+% cell. The position inside the cell is computed according to the
+% following rules:
+%
+% 1. In each column, the origins of the cell pictures are all on a
+% vertical line.
+% 2. In each row, the origins of the cell pictures are all on a
+% horizontal line.
+% 3. All cells in the same row have the same height and depth.
+% 4. All cells in the same column have the same width.
+% 5. The size of cells are chosen minimal such that the boxes fit into
+% the cells and still meet the above requirement.
+%
+% Next, the whole resulting matrix, which is given as #7, is placed
+% inside a node whose name is given as #3, whose shape is #1, and
+% whose anchor is #2. This means that the resulting node is shifted
+% such that the given anchor lies at the origin. Then, as for a normal
+% node, the #4 path usage command is used for the node.
+%
+% The parameter #5 is an additional negative shift for the node. Normally, such
+% a shift could be given beforehand (that is, the shift could be
+% preapplied to the current transformation matrix). However, when #5
+% is evaluated, you can refer to temporary positions of nodes inside
+% the matrix. In detail, the following happens: When the matrix has
+% been typeset, all nodes in the matrix temporarily get assigned their
+% positions in the matrix box. The origin of this coordinate system is
+% at the left baseline end of the matrix box, which corresponds to the
+% text anchor. The position #5 is then interpreted inside this
+% coordinate system and then used for shifting.
+%
+% The idea behind using the parameter #5 is the following: If you
+% specify "text" as anchor #2 and specify \pgfpointanchor{inner
+% node}{some anchor} for parameter #5, where inner node is a node that
+% is created in the matrix, then the whole matrix will be shifted such
+% that inner node.some anchor lies at the origin of the whole picture.
+%
+% At the beginning and at the end of each cell, the macros
+% \pgfmatrixbegincode and \pgfmatrixendcode are called. Inside these
+% macros you can use \pgfmatrixcurrentcolumn and \pgfmatrixcurrentrow
+% to access the current row and column.
+%
+% Before each column except for the first, an extra space given by the
+% macro \pgfmatrixcolumnsep is added. Additionally, an extra space
+% given by the optional argument of the \pgfmatrixnextcell commands in
+% the first line are added, which may vary between columns. Between
+% rows, an extra space given by the macro \pgfmatrixrowsep is
+% added. You can also change this value for each row by using a \gdef.
+%
+%
+% Lines are ended using the command \pgfmatrixendrow. The command \\
+% is \let to be the same, but \\ is sometimes overridden by, say,
+% minipage, so it's good to have \pgfmatrixendrow as a "fallback".
+%
+% Inside the matrix, \\ must be used to end every line ***including
+% the last***. You can pass an optional parameter to \\ as in \\[2pt]
+% to give an additional space after this particular line.
+%
+% The usage of \\ at the end of the matrix is important since this
+% command is used to find the end of the matrix. What happens is that
+% \\ followed by a closing brace ends the matrix.
+%
+% Inside the matrix, you must use \pgfmatrixnextcell to separate
+% columns. The reason is that two columns are used internally for
+% every single column shown. The macro \pgfmatrixnextcell is yields
+% (more or less) two && (and some further trickery).
+%
+% The parameter #6 is executed at the beginning of the matrix
+% group. It is inside the protecting group of the matrix, but outside
+% the matrix itself. It can be used for different purposes: 1) It can be
+% used to simplify the next cell macro. 2) It can be used to issue an
+% \aftergroup command. 3) It can be used to setup local settings. For
+% example, by setting #6 to \let\&=\pgfmatrixnextcell you can use \&
+% instead of \pgfmatrixnextcell. You can also set the catcode of & to
+% active.
+%
+%
+% Example:
+%
+% \begin{tikzpicture}
+%
+% \draw (0,0) circle (1mm); % b.north will lie on the center of this circle
+%
+% \pgfmatrix{rectangle}{text}{mymatrix}{\pgfusepath{}}{\pgfpointanchor{b}{north}}{\let\&=\pgfmatrixnextcell}
+% {
+% \draw (0,0) circle (1cm); \& \node (a) [draw] {Hallo}; \\
+% \node (b) [draw] {Welt}; \& \draw (0,0) circle (5mm); \\
+% }
+%
+% \draw [->] (a) -- (b);
+%
+% \end{tikzpicture}
+
+\def\pgfmatrix#1#2#3#4#5#6{%
+ \ifpgfmatrix%
+ \pgferror{You cannot nest pgfmatrix environments, yet}
+ \fi%
+ \bgroup%
+ \everycr{}%
+ #6%
+ \def\pgf@matrix@par@shape{#1}%
+ \def\pgf@matrix@par@anchor{#2}%
+ \def\pgf@matrix@par@name{#3}%
+ \def\pgf@matrix@par@usage{#4}%
+ \def\pgf@matrix@par@shift{#5}%
+ % the matrix must have a name:
+ \ifx\pgf@matrix@par@name\pgfutil@empty%
+ \def\pgf@matrix@par@name{pgf@matrix@internal}%
+ \fi%
+ \pgfmatrixcurrentrow=0\relax%
+ \pgfmatrixcurrentcolumn=0\relax%
+ \pgf@matrix@numberofcolumns=0\relax%
+ \let\\=\pgfmatrixendrow%
+ \tabskip=0pt%
+ \offinterlineskip%
+ \pgfmatrixtrue%
+ \let\pgf@matrix@node@list=\pgfutil@empty%
+ \expandafter\let\csname pgf@matrix@column@finish@1\endcsname=\pgfutil@empty%
+ \let\pgf@matrix@row@finish=\pgfutil@empty%
+ %
+ % Get rid of bgroup
+ %
+ \afterassignment\pgf@matrix@cont\let\pgf@next=%
+}%
+\def\pgf@matrix@cont{%
+ \setbox\pgf@matrix@box=\hbox\bgroup\vbox\bgroup%
+ \halign\bgroup%
+ \pgf@matrix@init@row%
+ \pgf@matrix@step@column%
+ {%
+ \pgf@matrix@startcell%
+ ##%
+ \pgf@matrix@endcell%
+ }%
+ &%
+ ##\pgf@matrix@padding&&%
+ \pgf@matrix@step@column%
+ {%
+ \pgf@matrix@startcell%
+ ##%
+ \pgf@matrix@endcell%
+ }&%
+ ##\pgf@matrix@padding%
+ \cr%
+}%
+
+\def\pgf@end@matrix{%
+ \egroup\egroup%
+ \egroup%
+ %
+ % If there are named nodes, we must adjust their coordinates.
+ %
+ \ifx\pgf@matrix@node@list\pgfutil@empty%
+ \else%
+ % Ok, this means we got a lot of work to do...
+ \pgf@matrix@compute@origin%
+ \pgf@matrix@shift@nodes@initial%
+ \fi%
+ %
+ % Compute additional shift
+ %
+ \pgftransformresetnontranslations%
+ \pgftransformshift{\pgf@process{\pgftransformreset\pgf@matrix@par@shift\pgf@x=-\pgf@x\pgf@y=-\pgf@y}}%
+ %
+ % Create node
+ %
+ \pgfmultipartnode{\pgf@matrix@par@shape}{\pgf@matrix@par@anchor}{\pgf@matrix@par@name}{\pgf@matrix@par@usage}%
+ %
+ % If there are named nodes, we must adjust their coordinates, again.
+ %
+ \ifx\pgf@matrix@node@list\pgfutil@empty%
+ \else%
+ {%
+ \pgftransformreset%
+ \pgf@process{\pgfpointanchor{\pgf@matrix@par@name}{text}}%
+ \xdef\pgf@matrix@offset{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@matrix@shift@nodes@secondary{\pgf@matrix@offset}%
+ }%
+ \fi%
+}%
+
+
+
+
+% Ending a cell
+%
+% #1 = (optional) spacing between previous and next column. This
+% parameter only has an effect in the first row.
+%
+% Description:
+%
+% This command ends a cell of a matrix.
+%
+% Example:
+%
+% \pgfmatrix{rectangle}{text}{mymatrix}{\pgfusepath{}}{\pgfpointanchor{b}{north}}{}
+% {
+% \draw (0,0) circle (1cm); \pgfmatrixnextcell[1cm] \node (a) [draw] {Hallo}; \\
+% \node (b) [draw] {Welt}; \pgfmatrixnextcell \draw (0,0) circle (5mm); \\
+% }
+
+\def\pgfmatrixnextcell{%
+ % if the cell contains nothing, the following \let will be at the
+ % beginning (macro expansion has stopped here since neither \omit
+ % nor \span was found)
+ \let\pgf@matrix@signal@cell@end=\pgf@matrix@signal@cell@end%
+ \pgfutil@ifnextchar[{\pgf@matrix@cell@cont}{\pgf@matrix@cell@cont[0pt]}}%}%
+
+\def\pgf@matrix@cell@cont[#1]{%
+ \xdef\pgf@matrix@last@nextcell@options{#1}%
+ &\pgf@matrix@correct@calltrue&%
+}%
+
+
+\def\pgf@matrix@fixed@text{between origins}%
+\def\pgf@matrix@natural@text{between borders}%
+
+\def\pgf@matrix@addtolength#1#2{\edef\pgf@temp{#2}\expandafter\pgf@matrix@addtolength@\expandafter#1#2,\pgf@stop}%
+\def\pgf@matrix@addtolength@#1#2,#3\pgf@stop{%
+ \def\pgf@temp{#2}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \ifx\pgf@temp\pgf@matrix@fixed@text%
+ \global\pgf@matrix@fixedtrue%
+ \else%
+ \ifx\pgf@temp\pgf@matrix@natural@text%
+ \global\pgf@matrix@fixedfalse%
+ \else%
+ \pgfmathaddtolength{#1}{#2}%
+ \fi%
+ \fi%
+ \fi%
+ \def\pgf@temp{#3}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgf@matrix@addtolength@#1#3\pgf@stop%
+ \fi%
+}%
+
+
+
+% Init a line
+
+\def\pgf@matrix@init@row{%
+ \relax%
+ \global\advance\pgfmatrixcurrentrow by 1\relax%
+ \global\pgfmatrixcurrentcolumn=0\relax%
+ \expandafter\gdef\csname pgf@matrix@maxy\the\pgfmatrixcurrentrow\endcsname{0pt}%
+ \expandafter\gdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{0pt}%
+}%
+
+
+
+% Step the row column number
+
+\def\pgf@matrix@step@column{%
+ \relax%
+ \global\advance\pgfmatrixcurrentcolumn by1\relax%
+}%
+
+
+
+% Start a cell
+
+\def\pgf@matrix@startcell{%
+ %
+ % Step 1: Init the list of nodes for this cell
+ %
+ \let\pgf@nodecallback=\pgf@matrix@nodecallback%
+ %
+ % Step 2: Setup the bounding box
+ %
+ \pgfinterruptboundingbox%
+ %
+ % Step 3: Reset the transformation matrix
+ %
+ \pgftransformreset%
+ %
+ % Step 4: Collect everything in a cell box
+ %
+ \setbox\pgf@matrix@cell=\hbox\bgroup\bgroup%
+ % make sure that cell pictures are not affected if matrices have
+ % 'overlay' option on:
+ \pgf@relevantforpicturesizetrue
+ \pgfsys@beginpicture%
+ \normalbaselines%
+ % Find out whether the cell is empty:
+ \pgfutil@ifnextchar\let%
+ {% ok, candidate, check following symbol
+ \afterassignment\pgf@matrix@empty@check\let\pgf@matrix@temp=% get rid of \let
+ }%
+ {% no, not empty
+ \pgf@matrix@empty@cell@false%
+ \pgfmatrixbegincode%
+ }%
+}%
+
+\def\pgf@matrix@empty@check{\futurelet\pgf@matrix@check@token\pgf@matrix@empty@check@cont}%
+\def\pgf@matrix@empty@check@cont{%
+ \ifx\pgf@matrix@check@token\pgf@matrix@signal@cell@end%
+ \pgf@matrix@empty@cell@true%
+ \expandafter%
+ \pgfmatrixemptycode%
+ \expandafter%
+ \let% reinserted
+ \else%
+ \pgf@matrix@empty@cell@false%
+ \expandafter%
+ \pgfmatrixbegincode%
+ \expandafter
+ \let% reinserted
+ \fi%
+}%
+
+\newif\ifpgf@matrix@empty@cell@
+
+
+% End a cell
+
+\def\pgf@matrix@endcell{%
+ \ifpgf@matrix@empty@cell@%
+ \else%
+ \expandafter\expandafter\expandafter\pgfmatrixendcode%
+ \expandafter\ifpgf@matrix@last@cell@in@row\expandafter\pgf@matrix@last@cell@in@rowtrue\expandafter\fi%
+ \fi%
+ \pgfsys@endpicture%
+ \ifnum\pgfmatrixcurrentcolumn<\pgf@matrix@numberofcolumns%
+ \else%
+ \ifpgf@matrix@last@cell@in@row\else%
+ {%
+ \global\pgf@matrix@fixedfalse%
+ \pgf@x=0pt%
+ \pgf@matrix@addtolength{\pgf@x}{\pgfmatrixcolumnsep}%
+ \pgf@matrix@addtolength{\pgf@x}{\pgf@matrix@last@nextcell@options}%
+ \ifpgf@matrix@fixed%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@matrix@column@finish@\the\pgfmatrixcurrentcolumn\endcsname%
+ {\global\pgf@picmaxx=0pt}%
+ \fi%
+ \advance\pgfmatrixcurrentcolumn by1\relax % only temporary for the following:
+ \expandafter\xdef\csname pgf@matrix@column@sep@\the\pgfmatrixcurrentcolumn\endcsname{\the\pgf@x}%
+ \ifpgf@matrix@fixed%
+ \expandafter\gdef\csname pgf@matrix@column@finish@\the\pgfmatrixcurrentcolumn\endcsname{\global\pgf@picminx=0pt}%
+ \else%
+ \expandafter\global\expandafter\let\csname pgf@matrix@column@finish@\the\pgfmatrixcurrentcolumn\endcsname=\pgfutil@empty%
+ \fi%
+ }%
+ \fi\fi%
+ % Special case of the empty picture
+ \ifdim\pgf@picmaxx=-16000pt\relax%
+ \global\pgf@picmaxx=0pt\relax%
+ \global\pgf@picminx=0pt\relax%
+ \global\pgf@picmaxy=0pt\relax%
+ \global\pgf@picminy=0pt\relax%
+ \fi%
+ \csname pgf@matrix@column@finish@\the\pgfmatrixcurrentcolumn\endcsname%
+ \pgf@matrix@row@finish%
+ \egroup\egroup%
+ %
+ % Step 5: Horizontal gap
+ %
+ \ifnum\pgfmatrixcurrentcolumn>1\relax%
+ \pgf@y=\csname pgf@matrix@column@sep@\the\pgfmatrixcurrentcolumn\endcsname\relax%
+ \advance\pgf@picminx by-\pgf@y%
+ \fi%
+ %
+ % Step 6: Protocol and adjust height and depth
+ %
+ % Step 6.1: Protocol...
+ %
+ \ifdim\pgf@picmaxy>\csname pgf@matrix@maxy\the\pgfmatrixcurrentrow\endcsname%
+ \expandafter\xdef\csname pgf@matrix@maxy\the\pgfmatrixcurrentrow\endcsname{\the\pgf@picmaxy}%
+ \fi%
+ \ifdim\pgf@picminy<\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname%
+ \expandafter\xdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{\the\pgf@picminy}%
+ \fi%
+ %
+ % Step 6.2: and setup.
+ %
+ \ht\pgf@matrix@cell=\pgf@picmaxy%
+ \dp\pgf@matrix@cell=-\pgf@picminy%
+ %
+ % Step 7: Protocol and adjust left and right width
+ %
+ % Step 7.1: Protocol...
+ %
+ \ifnum\pgfmatrixcurrentcolumn>\pgf@matrix@numberofcolumns\relax%
+ \expandafter\xdef\csname pgf@matrix@maxx\the\pgfmatrixcurrentcolumn\endcsname{\the\pgf@picmaxx}%
+ \expandafter\xdef\csname pgf@matrix@minx\the\pgfmatrixcurrentcolumn\endcsname{\the\pgf@picminx}%
+ \global\pgf@matrix@numberofcolumns=\pgfmatrixcurrentcolumn\relax%
+ \else%
+ \ifdim\pgf@picmaxx>\csname pgf@matrix@maxx\the\pgfmatrixcurrentcolumn\endcsname%
+ \expandafter\xdef\csname pgf@matrix@maxx\the\pgfmatrixcurrentcolumn\endcsname{\the\pgf@picmaxx}%
+ \fi%
+ \ifdim\pgf@picminx<\csname pgf@matrix@minx\the\pgfmatrixcurrentcolumn\endcsname%
+ \expandafter\xdef\csname pgf@matrix@minx\the\pgfmatrixcurrentcolumn\endcsname{\the\pgf@picminx}%
+ \fi%
+ \fi%
+ %
+ % Step 7.2: and setup.
+ %
+ \xdef\pgf@matrix@paddingskip{\the\pgf@picmaxx}%
+ %
+ % Step 8: Put in the box now
+ %
+ \hfil\hskip-\pgf@picminx%
+ \wd\pgf@matrix@cell=0pt%
+ \box\pgf@matrix@cell%
+ %
+ % Step 9: End bounding box
+ \endpgfinterruptboundingbox%
+}%
+
+% Default code for the start and end code
+\let\pgfmatrixbegincode=\relax
+\let\pgfmatrixendcode=\relax
+\let\pgfmatrixemptycode=\relax
+
+
+% The following callback is called for every node that is produced
+% inside a cell
+
+\def\pgf@matrix@nodecallback#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \xdef\pgf@matrix@node@list{\pgf@matrix@node@list,{#1}}%
+ \expandafter\xdef\csname pgf@matrix@node@location@#1\endcsname{{\the\pgfmatrixcurrentrow}{\the\pgfmatrixcurrentcolumn}}%
+ \fi%
+}%
+
+
+
+% Padding code
+
+\def\pgf@matrix@padding{%
+ \ifpgf@matrix@correct@call%
+ \else%
+ \pgferror{Single ampersand used with wrong catcode}%
+ \fi%
+ \hskip\pgf@matrix@paddingskip\hfil%
+}%
+
+
+% Compute the real positions of the origins
+
+% We must now compute the real positions of the origins of all the
+% small pictures. To this end, we need to compute prefix sums. After
+% the procedure is done, the minx and the maxy will contain the origin
+% positions.
+
+\def\pgf@matrix@compute@origin{%
+ %
+ % Inverse prefix sum on the vertical positions
+ %
+ {%
+ \ifnum\pgfmatrixcurrentrow>0\relax%
+ \expandafter\gdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{0pt}%
+ \fi
+ \c@pgf@counta=\pgfmatrixcurrentrow\relax%
+ \loop%
+ \ifnum\c@pgf@counta>1\relax%
+ \pgf@y=\csname pgf@matrix@miny\the\c@pgf@counta\endcsname\relax%
+ \advance\pgf@y by\csname pgf@matrix@maxy\the\c@pgf@counta\endcsname\relax
+ \advance\c@pgf@counta by-1\relax%
+ \pgf@ya=\csname pgf@matrix@miny\the\c@pgf@counta\endcsname\relax%
+ \advance\pgf@y by-\pgf@ya\relax%
+ \expandafter\xdef\csname pgf@matrix@miny\the\c@pgf@counta\endcsname{\the\pgf@y}%
+ \repeat%
+ }%
+ %
+ % Prefix sum on the horizontal positions
+ %
+ {%
+ \ifnum\pgf@matrix@numberofcolumns>0\relax%
+ \pgf@x=\csname pgf@matrix@minx1\endcsname\relax%
+ \pgf@x=-\pgf@x%
+ \expandafter\xdef\csname pgf@matrix@minx1\endcsname{\the\pgf@x}%
+ \fi
+ \c@pgf@counta=1\relax%
+ \loop%
+ \ifnum\c@pgf@counta<\pgf@matrix@numberofcolumns\relax%
+ \pgf@x=\csname pgf@matrix@minx\the\c@pgf@counta\endcsname\relax%
+ \advance\pgf@x by\csname pgf@matrix@maxx\the\c@pgf@counta\endcsname\relax%
+ \advance\c@pgf@counta by1\relax%
+ \pgf@xa=\csname pgf@matrix@minx\the\c@pgf@counta\endcsname\relax%
+ \advance\pgf@x by-\pgf@xa\relax%
+ \expandafter\xdef\csname pgf@matrix@minx\the\c@pgf@counta\endcsname{\the\pgf@x}%
+ \repeat%
+ }%
+}%
+
+
+% Shift the nodes to their origins
+
+% The following procedure shifts all nodes in
+% \pgf@matrix@node@list to their location inside a temporary
+% picture. This picture will later be shifted again to its final
+% position in the real picture.
+
+\def\pgf@matrix@shift@nodes@initial{%
+ {%
+ \pgfutil@for\pgf@matrix@node@name:=\pgf@matrix@node@list\do{%
+ \ifx\pgf@matrix@node@name\pgfutil@empty%
+ \else%
+ \expandafter\ifx\csname pgf@matrix@node@visited@\pgf@matrix@node@name\endcsname\relax%
+ \pgf@shift@node{\pgf@matrix@node@name}{%
+ \pgf@x=\csname pgf@matrix@minx%
+ \expandafter\expandafter\expandafter\pgfutil@secondoftwo\csname pgf@matrix@node@location@\pgf@matrix@node@name\endcsname\endcsname%
+ \pgf@y=\csname pgf@matrix@miny%
+ \expandafter\expandafter\expandafter\pgfutil@firstoftwo\csname pgf@matrix@node@location@\pgf@matrix@node@name\endcsname\endcsname%
+ }%
+ \expandafter\let\csname pgf@matrix@node@visited@\pgf@matrix@node@name\endcsname=\pgfutil@empty%
+ \fi%
+ \fi%
+ }%
+ }%
+}%
+
+
+% The second shifting, done in the following procedure, shifts all
+% nodes to their real positions inside the real picture.
+
+\def\pgf@matrix@shift@nodes@secondary#1{%
+ \pgfutil@for\pgf@matrix@node@name:=\pgf@matrix@node@list\do{%
+ \ifx\pgf@matrix@node@name\pgfutil@empty%
+ \else%
+ \expandafter\ifx\csname pgf@matrix@node@visited@\pgf@matrix@node@name\endcsname\relax%
+ \pgf@shift@node{\pgf@matrix@node@name}{#1}%
+ \expandafter\let\csname pgf@matrix@node@visited@\pgf@matrix@node@name\endcsname=\pgfutil@empty%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+% End of line
+\def\pgfmatrixendrow{%
+ % if the cell contains nothing, the following \let will be at the
+ % beginning (macro expansion has stopped here since neither \omit
+ % nor \span was found)
+ \let\pgf@matrix@signal@cell@end=\pgf@matrix@signal@cell@end
+ \pgf@matrix@last@cell@in@rowtrue%
+ \xdef\pgf@matrix@rowsep{\pgfmatrixrowsep}%
+ &\pgf@matrix@correct@calltrue%
+ \global\pgf@matrix@fixedfalse%
+ \pgf@y=0pt%
+ \pgf@matrix@addtolength\pgf@y{\pgf@matrix@rowsep}%
+ \pgfutil@ifnextchar[{\pgfmatrixendrow@skip}{\pgf@matrix@finish@line}%
+}%
+\newif\ifpgf@matrix@last@cell@in@row
+
+\def\pgf@matrix@signal@cell@end{\pgf@matrix@signal@cell@end}%
+% exact definition does not matter, only needs to be unique.
+
+\def\pgfmatrixendrow@skip[#1]{%
+ \pgf@matrix@addtolength\pgf@y{#1}%
+ \pgf@matrix@finish@line%
+}%
+
+\def\pgf@matrix@finish@line{%
+ \global\pgf@y=\pgf@y%
+ \pgf@ya=-\pgf@y%
+ \global\advance\pgf@ya by\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname%
+ \expandafter\xdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{\the\pgf@ya}%
+ \pgfutil@ifnextchar\egroup{\cr\pgf@end@matrix}{\pgf@matrix@no@eom@found}%
+}%
+
+\def\pgf@matrix@eom@found{%
+ \cr%
+ \pgf@end@matrix%
+}%
+
+\def\pgf@matrix@no@eom@found{%
+ \cr%
+ \noalign{\vskip\pgf@y%
+ \ifpgf@matrix@fixed%
+ \vskip\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname% unskip
+ \vskip\pgf@y%
+ \pgf@y=-\pgf@y%
+ \expandafter\xdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{\the\pgf@y}%
+ \gdef\pgf@matrix@row@finish{\global\pgf@picmaxy=0pt}%
+ \else%
+ \global\let\pgf@matrix@row@finish=\pgfutil@empty%
+ \fi%
+ }%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmodulenonlineartransformations.code.tex b/graphics/pgf/base/tex/pgfmodulenonlineartransformations.code.tex
new file mode 100644
index 0000000000..8e607b207d
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmodulenonlineartransformations.code.tex
@@ -0,0 +1,342 @@
+% Copyright 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmodulenonlineartransformations.code.tex}
+
+
+%
+% This file defines commands for nonlinear coordinate systems. This is
+% needed, for instance, for bend arrow heads.
+%
+%
+% Non-linear coordinate systems transform coordinates, in addition to
+% the normal linear transformations, in a, well, non-linear way. An
+% example are polar coordinates.
+%
+% Like the linear transformations, non-linear transformations are
+% applied on a low level and they are integrated into the whole path
+% construction mechanism. So, while \pgfpointpolar also "does
+% something nonlinear", it just provides a way of computing a
+% coordinate. In contrast, installing a polar transformation will
+% transform everything being drawn using the \pgfpath... commands an
+% will even turn a straight line into a circle.
+%
+% Since computing non-linear transformations is expensive, they are
+% only applied "if really necessary".
+
+
+
+
+% Return a transformed point
+%
+% #1 = a point
+%
+% Description:
+%
+% Applies the current transformation and the current nonlinear
+% transformation to the given point and returns the result in \pgf@x/y.
+
+\def\pgfpointtransformednonlinear#1{%
+ \pgf@process{%
+ #1%
+ \pgf@pos@transform@glob%
+ \pgf@nlt@list%
+ }
+}%
+
+
+
+
+% Approximate the nonlinear translation locally
+%
+% Description:
+%
+% Does a "local synchronization" of the nonlinear transformation with
+% the linear transformation regarding the translation part of the
+% current nonlinear transformation. The *linear* transformation will be
+% updated so that it translates things to the point to which the
+% nonlinear transformation transforms the origin. The nonlinear
+% transformation will be reset.
+%
+% The net effect is that you can now draw things near the origin as
+% before, but with just a linear transformation in force. Note that
+% the coordinate system will not be rotated, only a shift is done (use
+% the "real" local sync for a full sync).
+
+\def\pgfapproximatenonlineartranslation{%
+ \ifx\pgf@nlt@list\pgfutil@empty%
+ \else%
+ \pgfpointtransformednonlinear{\pgfpointorigin}%
+ \pgf@pt@x=\pgf@x%
+ \pgf@pt@y=\pgf@y%
+ \let\pgf@nlt@list\pgfutil@empty%
+ \let\pgf@nlt@moveto\pgf@lt@moveto%
+ \let\pgf@nlt@lineto\pgf@lt@lineto%
+ \let\pgf@nlt@curveto\pgf@lt@curveto%
+ \let\pgf@nlt@closepath\pgf@lt@closepath%
+ \fi%
+}%
+
+
+
+% Local sync translation
+%
+% Description:
+%
+% Does a "complete local synchronization" of the nonlinear
+% transformation with the linear transformation. The *linear*
+% transformation will be updated so that it transforms things to the
+% point to which the nonlinear transformation transforms the
+% origin. The nonlinear transformation will be reset.
+%
+% The net effect is that you can now draw things near the origin as
+% before, but with just a linear transformation in force.
+
+\def\pgfapproximatenonlineartransformation{%
+ \ifx\pgf@nlt@list\pgfutil@empty%
+ \else%
+ \pgfpointtransformednonlinear{\pgfpoint{1pt}{0pt}}%
+ \pgf@xa\pgf@x
+ \pgf@ya\pgf@y
+ \pgfpointtransformednonlinear{\pgfpoint{0pt}{1pt}}%
+ \pgf@xb\pgf@x
+ \pgf@yb\pgf@y
+ \pgfpointtransformednonlinear{\pgfpointorigin}%
+ \advance\pgf@xa by-\pgf@x
+ \advance\pgf@xb by-\pgf@x
+ \advance\pgf@ya by-\pgf@y
+ \advance\pgf@yb by-\pgf@y
+ \pgfsettransformentries{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@ya}{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@yb}{\pgf@x}{\pgf@y}%
+ \let\pgf@nlt@list\pgfutil@empty%
+ \let\pgf@nlt@moveto\pgf@lt@moveto%
+ \let\pgf@nlt@lineto\pgf@lt@lineto%
+ \let\pgf@nlt@curveto\pgf@lt@curveto%
+ \let\pgf@nlt@closepath\pgf@lt@closepath%
+ \fi%
+}%
+
+
+
+% Adds a non-linear transformation to the current list of
+% transformations.
+%
+% #1 = code
+%
+% Description:
+%
+% When the code #1 is called, \pgf@x and \pgf@y will be set to some
+% values, let us call this the point p. The nonlinear transformation
+% will now map this point to a new point f(p). The coordinates of this
+% point should be returned in \pgf@x and \pgf@y. Furthermore, consider
+% the two "unit tangents" (going in $x$-direction and in
+% $y$-direction) at point p. The nonlinear transformation will map
+% these to new tangents, t_x and t_y. The (not necessarily normalized)
+% vectors t_x and t_y should be returned in pgf@xa and -ya and pgf@xb
+% and pgf@yb. The macro should not do any global assignments except to
+% \pgf@x and \pgf@y, but may do arbitrary local assignments.
+%
+% The effect of installing a new transformation is the following: As
+% long as there is at least one nonlinear transformation installed,
+% whenever the path construction commands add a curve or line to the
+% softpath, the line or curve will be "bend" by applying all of the
+% nonlinear transformation installed. In particular, straight lines
+% will be replaced by curves.
+%
+% Note that the normal linear transformation are always applied before
+% any nonlinear transformations are applied.
+
+\def\pgftransformnonlinear#1{%
+ \expandafter\def\expandafter\pgf@nlt@list\expandafter{\pgf@nlt@list#1}%
+ \let\pgf@nlt@moveto\pgf@nlt@moveto@nlt
+ \let\pgf@nlt@lineto\pgf@nlt@lineto@nlt
+ \let\pgf@nlt@curveto\pgf@nlt@curveto@nlt
+ \let\pgf@nlt@closepath\pgf@nlt@closepath@nlt
+}%
+
+\def\pgf@nlt@moveto@nlt#1#2{%
+ {%
+ \pgfutil@tempdima#1%
+ \pgfutil@tempdimb#2%
+ \pgf@x\pgfutil@tempdima%
+ \pgf@y\pgfutil@tempdimb%
+ \xdef\pgf@nlt@last@moveto@orig{{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@nlt@list%
+ \xdef\pgf@nlt@last@moveto@trans{{\the\pgf@x}{\the\pgf@y}}%
+ \xdef\pgf@nlt@last@moveto@xaxis{{\the\pgf@xa}{\the\pgf@ya}}%
+ \xdef\pgf@nlt@last@moveto@yaxis{{\the\pgf@xb}{\the\pgf@yb}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \pgfsyssoftpath@moveto{\the\pgf@x}{\the\pgf@y}%
+ \global\let\pgf@nlt@last@coord@orig\pgf@nlt@last@moveto@orig%
+ \global\let\pgf@nlt@last@coord@trans\pgf@nlt@last@moveto@trans%
+ \global\let\pgf@nlt@last@coord@xaxis\pgf@nlt@last@moveto@xaxis%
+ \global\let\pgf@nlt@last@coord@yaxis\pgf@nlt@last@moveto@yaxis%
+ }%
+}%
+
+
+\def\pgf@nlt@lineto@nlt#1#2{%
+ {%
+ \edef\pgf@temp{\pgf@xc\the#1\pgf@yc\the#2}%
+ \pgf@temp%
+ \expandafter\pgfqpoint\pgf@nlt@last@coord@orig%
+ \expandafter\pgf@nlt@set@temps\pgf@nlt@last@coord@trans%
+ % Test, whether the points are quite near:
+ \pgf@xa\pgf@x\advance\pgf@xa by-\pgf@xc%
+ \pgf@ya\pgf@y\advance\pgf@ya by-\pgf@yc%
+ \pgfutil@tempswafalse%
+ \ifdim\pgf@xa<0.1pt\relax\ifdim\pgf@xa>-0.1pt\relax\ifdim\pgf@ya<0.1pt\relax\ifdim\pgf@ya>-0.1pt\relax\pgfutil@tempswatrue\fi\fi\fi\fi%
+ \ifpgfutil@tempswa%
+ \pgf@x\pgf@xc\pgf@y\pgf@yc%
+ \xdef\pgf@nlt@last@coord@orig{{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@process{\pgf@nlt@list}%
+ \xdef\pgf@nlt@last@coord@trans{{\the\pgf@x}{\the\pgf@y}}%
+ \xdef\pgf@nlt@last@coord@xaxis{{\the\pgf@xa}{\the\pgf@ya}}%
+ \xdef\pgf@nlt@last@coord@yaxis{{\the\pgf@xb}{\the\pgf@yb}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}%
+ \pgfsyssoftpath@lineto{\the\pgf@x}{\the\pgf@y}%
+ \else%
+ % Compute support points
+ \pgf@xb=.333333\pgf@x%
+ \advance\pgf@xb by.666666\pgf@xc%
+ \pgf@yb=.333333\pgf@y%
+ \advance\pgf@yb by.666666\pgf@yc%
+ \pgf@xa=.333333\pgf@xc%
+ \advance\pgf@xa by.666666\pgf@x%
+ \pgf@ya=.333333\pgf@yc%
+ \advance\pgf@ya by.666666\pgf@y%
+ \pgf@nlt@inner@curve%
+ \fi%
+ }%
+}%
+
+\def\pgf@nlt@set@temps#1#2{%
+ \pgfutil@tempdima#1\pgfutil@tempdimb#2%
+}%
+
+\def\pgf@nlt@curveto@nlt#1#2#3#4#5#6{%
+ {%
+ \edef\pgf@temp{\pgf@xa\the#1\pgf@ya\the#2\pgf@xb\the#3\pgf@yb\the#4\pgf@xc\the#5\pgf@yc\the#6}%
+ \pgf@temp%
+ \pgf@nlt@inner@curve%
+ }%
+}%
+
+\newdimen\pgftransformnonlinearflatness
+\pgftransformnonlinearflatness=5pt
+\def\pgfsettransformnonlinearflatness#1{\pgfmathsetlength\pgftransformnonlinearflatness{#1}}%
+
+
+
+% Compute a curve from \pgf@nlt@last@coord@orig to \pgf@xc/\pgf@yc via the
+% controls \pgf@xa/\pgf@ya and \pgf@xb/\pgf@yb.
+\def\pgf@nlt@inner@curve{%
+ \expandafter\pgfqpoint\pgf@nlt@last@coord@orig%
+ % Save delta of supports:
+ \pgfutil@tempdima\pgf@xa\advance\pgfutil@tempdima by-\pgf@xb
+ \pgfutil@tempdimb\pgf@ya\advance\pgfutil@tempdimb by-\pgf@yb
+ \begingroup
+ % Replace supports by relative supports
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \advance\pgf@xb by-\pgf@xc%
+ \advance\pgf@yb by-\pgf@yc%
+ %
+ % Now, test whether the flatness is satisfied:
+ %
+ \pgfutil@tempswafalse
+ \ifdim\pgfutil@tempdima>\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgfutil@tempdima<-\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgfutil@tempdimb>\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgfutil@tempdimb<-\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@xa>\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@xa<-\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@ya>\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@ya<-\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@xb>\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@xb<-\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@yb>\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifdim\pgf@yb<-\pgftransformnonlinearflatness\pgfutil@tempswatrue\fi%
+ \ifpgfutil@tempswa%
+ \endgroup% Undo the adjustments...
+ {%
+ \edef\pgf@orig@xya{\pgf@xa\the\pgf@xa\pgf@ya\the\pgf@ya}
+ \edef\pgf@orig@xyb{\pgf@xb\the\pgf@xb\pgf@yb\the\pgf@yb}
+ \edef\pgf@orig@xyc{\pgf@xc\the\pgf@xc\pgf@yc\the\pgf@yc}
+ \pgfpointcurveattime{.5}%
+ {\expandafter\pgfqpoint\pgf@nlt@last@coord@orig}%
+ {\pgf@x\pgf@xa\pgf@y\pgf@ya}%
+ {\pgf@x\pgf@xb\pgf@y\pgf@yb}%
+ {\pgf@x\pgf@xc\pgf@y\pgf@yc}%
+ % First new curve:
+ % Start is at last@coord@orig,
+ % first support is at last@coord@orig*t + s*(original xa/ya)
+ % second support is at xb/yb
+ % target is at x/y
+ {%
+ % Target:
+ \pgf@xc\pgf@x\pgf@yc\pgf@y
+ % First support:
+ \expandafter\pgfqpoint\pgf@nlt@last@coord@orig%
+ \pgf@orig@xya%
+ \pgf@xa\pgf@time@s\pgf@xa\advance\pgf@xa by\pgf@time@t\pgf@x%
+ \pgf@ya\pgf@time@s\pgf@ya\advance\pgf@ya by\pgf@time@t\pgf@y%
+ \pgf@nlt@inner@curve%
+ }%
+ % Second new curve:
+ % Start is at (new) last@coord@orig
+ % first support is at xa/ya
+ % second support is at t*(original xb/yb) + s*(original xc/yc)
+ % target is at original xc/yc
+ {%
+ \pgf@orig@xyb%
+ \pgf@orig@xyc%
+ \pgf@xb\pgf@time@t\pgf@xb\advance\pgf@xb by\pgf@time@s\pgf@xc%
+ \pgf@yb\pgf@time@t\pgf@yb\advance\pgf@yb by\pgf@time@s\pgf@yc%
+ \pgf@nlt@inner@curve%
+ }%
+ }%
+ \else%
+ \endgroup% Snap back...
+ \pgf@nlt@do@inner@curve%
+ \fi%
+}%
+
+\def\pgf@nlt@do@inner@curve{%
+ \pgf@process{\pgf@x\pgf@xa\pgf@y\pgf@ya\pgf@nlt@list}%
+ \pgf@xa\pgf@x\pgf@ya\pgf@y%
+ \pgf@process{\pgf@x\pgf@xb\pgf@y\pgf@yb\pgf@nlt@list}%
+ \pgf@xb\pgf@x\pgf@yb\pgf@y%
+ \xdef\pgf@nlt@last@coord@orig{{\the\pgf@xc}{\the\pgf@yc}}%
+ \pgf@process{\pgf@x\pgf@xc\pgf@y\pgf@yc\pgf@nlt@list}%
+ \pgf@xc\pgf@x\pgf@yc\pgf@y%
+ \xdef\pgf@nlt@last@coord@trans{{\the\pgf@xc}{\the\pgf@yc}}%
+ \pgf@protocolsizes{\pgf@xa}{\pgf@ya}%
+ \pgf@protocolsizes{\pgf@xb}{\pgf@yb}%
+ \pgf@protocolsizes{\pgf@xc}{\pgf@yc}%
+ \pgfsyssoftpath@curveto{\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}{\the\pgf@xc}{\the\pgf@yc}%
+}%
+
+
+\def\pgf@nlt@closepath@nlt{%
+ {%
+ \expandafter\pgfqpoint\pgf@nlt@last@moveto@orig%
+ \expandafter\pgf@nlt@set@temps\pgf@nlt@last@coord@orig%
+ \advance\pgfutil@tempdima by-\pgf@x%
+ \advance\pgfutil@tempdimb by-\pgf@y%
+ \pgfutil@tempswatrue%
+ \ifdim\pgfutil@tempdima<0.01pt\relax\ifdim\pgfutil@tempdima>-0.01pt\relax\ifdim\pgfutil@tempdimb<0.01pt\relax\ifdim\pgfutil@tempdimb>-0.01pt\relax\pgfutil@tempswafalse\fi\fi\fi\fi%
+ \ifpgfutil@tempswa%
+ \pgf@nlt@lineto@nlt{\pgf@x}{\pgf@y}%
+ \fi%
+ \pgfsyssoftpath@closepath%
+ }%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmoduleoo.code.tex b/graphics/pgf/base/tex/pgfmoduleoo.code.tex
new file mode 100644
index 0000000000..38ceef34cd
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduleoo.code.tex
@@ -0,0 +1,844 @@
+% Copyright 2006 by Till Tantau
+% Copyright 2011 by Saso Zivanovic
+%
+% 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.
+%
+% Based on pgfmoduleoo.code.tex v1.8 by Till Tantau. This version adds inheritance.
+
+
+
+% Support of object-oriented programming in TeX, with inheritance.
+
+
+% The oo support works as follows:
+%
+% The main supported concepts are classes, objects, methods,
+% attributes and signal/slots. A class defines a set of methods, which are,
+% in the end, just normal TeX macros. Once a class has been created,
+% it can be instantiated by calling the \pgfoonew command, resulting
+% in a new object. Objects are local to their group. Given an object,
+% you can send it a message, resulting in the method code of the
+% object's method to be executed. While an object exists, it has a set
+% of attributes whose values can change over time. Attributes values
+% are not local to TeX groups, rather their life-cycle is the same as
+% the object's (which, however, is local to the group in which the
+% object was declared).
+%
+% The implementation is as follows: There is an ID counter that is
+% increased each time an object is created. This counter is local to
+% the group, which means that when a group ends the counter will
+% revert to the previous value, allowing objects to the reused in
+% subsequent groups.
+%
+% A method is just a normal \TeX macro, but to call it you write
+% \objecthandle.methodname(parameters). The \objecthandle is a macro
+% that is created when you say \pgfoonew. The special object
+% \pgfoothis is the current object.
+%
+% Attributes are stored globally in internal TeX macros whose name is
+% composed of the object number and the attribute name.
+
+
+
+
+% Declares a class
+%
+% #1 = class name
+% #2 = methods
+%
+% Description:
+%
+% This command declares a class for future use. Inside #2, the macro
+% \method can be used to declare a method. The \method macro takes a
+% method name, parameters (methods are normal TeX macros, after all)
+% and body.
+
+% base classes are put in parenthesis before the new class name, but
+% are optional.
+\def\pgfooclass{%
+ \pgfutil@ifnextchar ({%
+ \pgfooclass@
+ }{%
+ \pgfooclass@()
+ }%
+}%
+\long\def\pgfooclass@(#1)#2#3{%
+ \def\pgfoo@classname{#2}%
+ \expandafter\ifx\csname pgfooY\pgfoo@classname.@pgfooinit\endcsname\relax\else
+ \pgferror{class #2 is already defined}%
+ \fi
+ \pgfoo@ciii{#2}{#1}%
+ \expandafter\let\csname pgfooY#2@pgfoo@mro\endcsname\pgfoo@mro
+ \let\pgfoo@origmethod=\method%
+ \let\pgfoo@origattribute=\attribute%
+ \let\method=\pgfoo@declaremethod%
+ \let\attribute=\pgfoo@declareattribute%
+ \let\pgfoo@attributes=\pgfutil@empty%
+ \let\pgfoo@methods=\pgfutil@empty%
+ #3%
+ % inherit
+ \def\pgfoo@temp@baseclasses{#1}%
+ \pgfoo@inherit@methods
+ \pgfoo@inherit@attributes
+ % Always present (and never inherited) methods:
+ \expandafter\let\csname pgfooY\pgfoo@classname.get handle\endcsname\pgfoo@obj%
+ \expandafter\let\csname pgfooY\pgfoo@classname.get id\endcsname\pgfoo@id%
+ % for compatibility with previous versions of pgfoo, define method
+ % with the same name as the class as a synonym for init
+ \expandafter\let\expandafter\pgfoo@init\csname pgfooY\pgfoo@classname.init\endcsname
+ \expandafter\let\csname pgfooY\pgfoo@classname.\pgfoo@classname\endcsname\pgfoo@init
+ % Cleanup
+ \let\method=\pgfoo@origmethod%
+ \let\attribute=\pgfoo@origattribute%
+}%
+
+\def\pgfoo@emptyinit(){}%
+\def\pgfoo@escapeif#1#2\fi{\fi#1}% a little helper
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Compute MRO using C3 algorithm
+% The sequences are enclosed in brackets; elements of sequences and
+% the big list are terminated by a comma and a dot, respectively. (Why
+% comma *and* a dot: TeX's parset---brackets don't form groups! Soooo,
+% why not braces? Because I don't know how do delete excess "{},"s...)
+
+% #1 = current class, #2 = list of base classes
+\def\pgfoo@ciii#1#2{%
+ % \pgfoo@seq will hold a list of sequences.
+ % (i) the first sequence has just one element: the current class
+ \def\pgfoo@seq{[#1,].}%
+ % (ii) every subclass has a sequence (in the order as they were
+ % given): the class' sequence is its mro.
+ \pgfutil@for\pgfoo@baseclass:={#2}\do{%
+ \edef\pgfoo@baseclass@mro{\csname pgfooY\pgfoo@baseclass @pgfoo@mro\endcsname}%
+ \expandafter\ifx\expandafter\relax\pgfoo@baseclass@mro\relax\else
+ \edef\pgfoo@seq{\pgfoo@seq[\pgfoo@baseclass@mro,].}%
+ \fi
+ }%
+ % The final sequence is a sequence of base classes, in the order as
+ % they were given.
+ \ifx\relax#2\relax\else
+ \edef\pgfoo@seq{\pgfoo@seq[#2,].}%
+ \fi
+ \edef\pgfoo@temp{()(\pgfoo@seq)}%
+ \expandafter\pgfoo@ciii@merge\pgfoo@temp
+}%
+
+% #1 = MRO so far
+% #2 = remaining sequences
+% no empty sequences [] should arrive here: they should be removed
+% before calling this macro
+\def\pgfoo@ciii@merge(#1)(#2){%
+ \ifx\relax#2\relax
+ \pgfoo@ciii@done(#1)%
+ \else\pgfoo@escapeif{% split #2
+ \pgfoo@ciii@merge@A(#1)(#2)%
+ }\fi%
+}%
+% a splitter: to be only called from \pgfoo@ciii@merge
+\def\pgfoo@ciii@merge@A(#1)(#2.#3){%
+ \ifx\relax#3\relax % if #3 is empty, we can take the shortcut
+ \pgfoo@ciii@mergeA@done(#1)(#2)%
+ \else\pgfoo@escapeif{%
+ \pgfoo@ciii@merge@checkHead(#1)()(#2)()(#3)%
+ }\fi
+}%
+
+\def\pgfoo@ciii@mergeA@done(#1)([#2]){%
+ \pgfoo@ciii@done(#1#2)%
+}%
+
+% #1 = MRO so far
+% #2 = sequences with bad heads (dot after each sequence)
+% [#3,#4] = the sequence whose head we're testing right
+% now---obviously, it should not be empty! (#3 has no comma,
+% #4 has a comma after each class name)
+% #5 = #3 does not occur in the tail of these sequences (dot after
+% each sequence)
+% #6 = the remaining sequences (dot after each sequence)
+\def\pgfoo@ciii@merge@checkHead(#1)(#2)([#3,#4])(#5)(#6){%
+ \pgfutil@in@{[#3,}{#2}%
+ \ifpgfutil@in@\pgfoo@escapeif{% #3 is already blacklisted
+ \pgfoo@ciii@clean\pgfoo@ciii@merge@checkHead@P{(#1)(#2[#3,#4].)(#5#6)}%
+ }\else\pgfoo@escapeif{%
+ \ifx\relax#6\relax\pgfoo@escapeif{% no more sequences to test the head against!
+ % so, #3 is a good head, and we can recurse
+ \pgfoo@ciii@goodHeadFound(#1)(#3)(#2[#4].#5)%
+ }\else\pgfoo@escapeif{% split #6 and get to work
+ \pgfoo@ciii@merge@checkHead@A(#1)(#2)([#3,#4])(#5)(#6)%
+ }\fi
+ }\fi
+}%
+% splitter: to be only called from \pgfoo@ciii@merge@checkHead
+% we will check if #3 occurs in the tail of #6
+\def\pgfoo@ciii@merge@checkHead@A(#1)(#2)([#3,#4])(#5)(#6.#7){%
+ \pgfoo@ciii@merge@checkHead@B(#1)(#2)([#3,#4])(#5)(#6)(#7)%
+}%
+% splitter: to be only called from \pgfoo@ciii@merge@checkHead@A
+% &worker: we will check if #3 occurs in #7. If it does, #3 is a bad head.
+\def\pgfoo@ciii@merge@checkHead@B(#1)(#2)([#3,#4])(#5)([#6,#7])(#8){%
+% \def\pgfoo@ciii@tempA{#3}\def\pgfoo@ciii@tempB{#5}%
+% \ifx\pgfoo@ciii@tempA\pgfoo@ciii@tempB
+% \pgferror{An attempt to derive from the same class twice}%
+% \else\pgfoo@escapeif{%
+ \pgfutil@in@{,#3,}{,#7}%
+ \ifpgfutil@in@\pgfoo@escapeif{% bad head! get next head and restart
+ % but: need to clean up first!
+ \pgfoo@ciii@clean\pgfoo@ciii@merge@checkHead@P{(#1)(#2[#3,#4].)(#5[#6,#7].#8)}%
+ }\else\pgfoo@escapeif{% so far, so good
+ \ifx\relax#8\relax\pgfoo@escapeif{% if #8 is empty, we won:
+ % #3 is a good head! we will move it to MRO
+ % but clean-up first!
+ \pgfoo@ciii@goodHeadFound(#1)(#3)(#2[#4].#5[#6,#7].)%
+ }\else\pgfoo@escapeif{% proceed to the first seq in #8
+ \pgfoo@ciii@clean\pgfoo@ciii@merge@checkHead{(#1)(#2)([#3,#4])(#5[#6,#7].)(#8)}%
+ }\fi
+ }\fi
+% }\fi
+}%
+
+% #1 = MRO
+% #2 = good head
+% #3 = the remaining sequences (in need of removing the good head from
+% them, and then also some general cleanup)
+\def\pgfoo@ciii@goodHeadFound(#1)(#2)(#3){%
+ \pgfutil@in@{,#2,}{#3}%
+ \ifpgfutil@in@\pgfoo@escapeif{%
+ \def\pgfoo@ciii@removeGoodHead(##1)(##2)(##3,#2,##4){%
+ \pgfoo@ciii@goodHeadFound(##1)(##2)(##3,##4)}%
+ \pgfoo@ciii@removeGoodHead(#1)(#2)(#3)%
+ }\else\pgfoo@escapeif{%
+ \pgfutil@in@{[#2,}{#3}%
+ \ifpgfutil@in@\pgfoo@escapeif{%
+ \def\pgfoo@ciii@removeGoodHead(##1)(##2)(##3[#2,##4){%
+ \pgfoo@ciii@goodHeadFound(##1)(##2)(##3[##4)}%
+ \pgfoo@ciii@removeGoodHead(#1)(#2)(#3)%
+ }\else\pgfoo@escapeif{%
+ \pgfoo@ciii@clean\pgfoo@ciii@merge{(#1#2,)(#3)}%
+ }\fi
+ }\fi
+}%
+
+% mediates between the bad head exit of \pgfoo@ciii@merge@checkHead@B
+% and \pgfoo@ciii@merge@checkHead; we need the mediator because #3
+% below might have been affected by cleaning.
+\def\pgfoo@ciii@merge@checkHead@P(#1)(#2)(#3){%
+ \if\relax#3\relax % no more good head candidates!
+ \pgferror{Bad MRO: There is no good (monotonic etc.)
+ Method Resolution Order for your class hierarchy}%
+ \else\pgfoo@escapeif{%
+ \pgfoo@ciii@merge@checkHead@Q(#1)(#2)(#3)%
+ }\fi
+}%
+% splitter for \pgfoo@ciii@merge@checkHead@P
+% #3 = the sequence containing the newest good head candidate
+\def\pgfoo@ciii@merge@checkHead@Q(#1)(#2)(#3.#4){%
+ \pgfoo@ciii@merge@checkHead(#1)(#2)(#3)()(#4)%
+}%
+
+% cyclically removes all occurrences of "[]," and "[]." (i.e., empty
+% sequences) in #2. When done, calls #1 with whatever remains.
+\def\pgfoo@ciii@clean#1#2{% clean commas
+ \pgfutil@in@{[].}{#2}% clean dots
+ \ifpgfutil@in@\pgfoo@escapeif{%
+ \pgfoo@ciii@clean@dot#1#2\pgfoo@ciii@clean@END
+ }\else\pgfoo@escapeif{%
+ #1#2%
+ }\fi
+}%
+\def\pgfoo@ciii@clean@dot#1#2[].#3\pgfoo@ciii@clean@END{%
+ \pgfoo@ciii@clean#1{#2#3}%
+}%
+
+\def\pgfoo@ciii@done(#1,){%
+ \def\pgfoo@mro{#1}%
+}%
+
+% end of C3
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% Declare a method
+%
+% Description:
+%
+% Defines a method. To use/invoke this method for an object \object,
+% you write \object.methodname(parameters). This will cause the method
+% body to be invoked with the argument "(parameters)".
+%
+% To define the method \method should be directly followed by the
+% method name and, then, by (, followed by a parameter pattern,
+% followed by ), followed by the message body. Spaces are allowed only
+% after "\method" and after the closing ).
+%
+% Example:
+%
+% \pgfooclass{MyPlot}{
+%
+% \attribute x=0;
+% \attribute y=0;
+%
+% \method MyPlot() {
+% }
+%
+% \method getX(#1) {
+% \pgfooget{x}{#1}
+% }
+%
+% \method setPoint(#1,#2) {
+% \pgfooset{x}{#1}
+% \pgfooset{y}{#2}
+% }
+% }
+
+% define the method macro and append the method to the method collection
+\long\def\pgfoo@declaremethod#1(#2)#3{%
+ \def\pgfoo@method{#1}%
+ \ifx\pgfoo@classname\pgfoo@method
+ \def\pgfoo@method{init}%
+ \fi
+ \expandafter\long\expandafter\def\csname pgfooY\pgfoo@classname.\pgfoo@method\endcsname(#2){#3}%
+ \edef\pgfoo@methods{\pgfoo@methods,\pgfoo@method}%
+}%
+
+\def\pgfoo@inherit@methods{%
+ % for non-derived classes:
+ \expandafter\ifx\expandafter\relax\pgfoo@temp@baseclasses\relax
+ % if init is not defined, define an empty one
+ \expandafter\ifx\csname pgfooY\pgfoo@classname.init\endcsname\relax
+ \expandafter\let\csname pgfooY\pgfoo@classname.init\endcsname\pgfoo@emptyinit%
+ \edef\pgfoo@methods{,init\pgfoo@methods}%
+ \fi
+ \fi
+ \if\relax\pgfoo@methods\relax\else
+ % gobble the initial comma
+ \edef\pgfoo@methods{\expandafter\pgfutil@gobble\pgfoo@methods}%
+ \fi
+ % remember the list of collected methods
+ \expandafter\let\csname pgfooY\pgfoo@classname @pgfoo@methods\endcsname\pgfoo@methods
+ % get MRO
+ \expandafter\let\expandafter\pgfoo@mro\csname pgfooY\pgfoo@classname @pgfoo@mro\endcsname
+ % loop throough base classes in MRO
+ \pgfutil@for\pgfoo@baseclass:=\pgfoo@mro\do{%
+ \ifx\pgfoo@baseclass\pgfoo@classname % skip self
+ \else\pgfoo@escapeif{%
+ % get methods defined in this base class
+ \expandafter\let\expandafter\pgfoo@methods\csname pgfooY\pgfoo@baseclass @pgfoo@methods\endcsname
+ \pgfutil@for\pgfoo@method:=\pgfoo@methods\do{% for each method
+ % check if it is already defined in our class
+ \expandafter\ifx\csname pgfooY\pgfoo@classname.\pgfoo@method\endcsname\relax
+ % if not, link the method name from our class to base class
+ \edef\pgfoo@temp{\noexpand\let
+ \expandafter\noexpand\csname pgfooY\pgfoo@classname.\pgfoo@method\endcsname
+ \expandafter\noexpand\csname pgfooY\pgfoo@baseclass.\pgfoo@method\endcsname}%
+ \pgfoo@temp
+ \fi
+ }%
+ }\fi
+ }%
+}%
+
+\def\pgfoosuper(#1,#2).#3({%
+ #2.get id(\pgfoo@temp@id)%
+ \edef\pgfoo@classname{\csname pgfooX\pgfoo@temp@id @class\endcsname}%
+ \def\pgfoo@super@A##1,#1,##2.##3({%
+ \pgfoo@super@B##2.##3(%
+ }%
+ \expandafter\let\expandafter\pgfoo@mro\csname pgfooY\pgfoo@classname @pgfoo@mro\endcsname
+ \expandafter\pgfoo@super@A\expandafter,\pgfoo@mro,.#3(%
+}%
+\def\pgfoo@super@B#1,#2.#3({%
+ \expandafter\ifx\csname pgfooY#1.#3\endcsname\relax
+ \pgfoo@escapeif{\pgfoo@super@B#2.#3(}%
+ \else
+ \pgfoo@escapeif{\expandafter\pgfoo@caller\pgfoo@temp@id.#1.#3(}%
+ \fi
+}%
+
+
+
+% Declare an attribute
+%
+% #1 = attribute name
+% #2 = optional default value
+%
+% Description:
+%
+% Declares the attribute #1 for the current class. If the attribute
+% name is followed by =, the text following the equal sign is the
+% default value.
+
+\def\pgfoo@declareattribute#1;{%
+ \pgfutil@in@{ =}{#1}%
+ \ifpgfutil@in@%
+ \pgfoo@declareunpackspace#1;%
+ \else%
+ \pgfutil@in@={#1}%
+ \ifpgfutil@in@%
+ \pgfoo@declareunpack#1;%
+ \else%
+ \pgfoo@declareattribute@\let{#1}\pgfutil@empty
+ \fi%
+ \fi%
+}%
+\def\pgfoo@declareunpack#1=#2;{\pgfoo@declareattribute@\def{#1}{{#2}}}%
+\def\pgfoo@declareunpackspace#1 =#2;{\pgfoo@declareattribute@\def{#1}{{#2}}}%
+
+% put the initial value in the class's namespace
+% put the attr name in a list
+\def\pgfoo@declareattribute@#1#2#3{%
+ \expandafter#1\csname pgfooY\pgfoo@classname @#2\endcsname#3%
+ \expandafter\def\expandafter\pgfoo@attributes\expandafter{\pgfoo@attributes,#2}%
+}%
+
+% for each base class:
+% for each attribute declared in that class:
+% add the attr on a list if it's not there yet
+% convert the list of (attr,class which it comes from) into an
+% efficient sequence of triples \op{attrname}\pointer-to-initial-value
+% (\op is then set differently in init and garbage collection)
+\def\pgfoo@inherit@attributes{%
+ % store the list of attributes declared in this class for use in
+ % derived classes
+ \if\relax\pgfoo@attributes\relax\else
+ \edef\pgfoo@attributes{\expandafter\pgfutil@gobble\pgfoo@attributes}% gobble comma
+ \fi
+ \expandafter\let\csname pgfooY\pgfoo@classname.@pgfoo@attributes\endcsname\pgfoo@attributes%
+ % get MRO
+ \expandafter\let\expandafter\pgfoo@mro\csname pgfooY\pgfoo@classname @pgfoo@mro\endcsname
+ \def\pgfoo@allattributes{}% here we will store the attrs declared in base classes
+ \pgfutil@for\pgfoo@baseclass:=\pgfoo@mro\do{% for each base class in MRO order
+ % the attributes declared in this base class
+ \expandafter\let\expandafter\pgfoo@attributes\csname pgfooY\pgfoo@baseclass.@pgfoo@attributes\endcsname
+ \pgfutil@for\pgfoo@attribute:=\pgfoo@attributes\do{% for each attribute
+ % check if we have already found it in some previous base class
+ \edef\pgfoo@temp{{,\pgfoo@attribute=}{\pgfoo@allattributes,}}%
+ \expandafter\pgfutil@in@\pgfoo@temp
+ \ifpgfutil@in@\else % don't overwrite
+ % append to the list
+ \edef\pgfoo@allattributes{\pgfoo@allattributes,\pgfoo@attribute=\pgfoo@baseclass}%
+ \fi
+ }%
+ }%
+ \if\relax\pgfoo@allattributes\relax\else
+ \edef\pgfoo@allattributes{\expandafter\pgfutil@gobble\pgfoo@allattributes}% gobble comma
+ \fi
+ % this macro will hold a list of attributes from all base classes
+ % we run this macro at init and gc
+ \def\pgfoo@process@attributes{}%
+ \pgfutil@for\pgfoo@attributeclass:=\pgfoo@allattributes\do{% for each (attribute, class) pair
+ % append to the attribute processor
+ \expandafter\pgfoo@inherit@attributes@appendattribute\pgfoo@attributeclass.%
+ }%
+ \expandafter\let\csname pgfooY\pgfoo@classname .@pgfoo@process@attributes\endcsname\pgfoo@process@attributes
+}%
+
+
+% #1=attr, #2=class which the attr comes from
+\def\pgfoo@inherit@attributes@appendattribute#1=#2.{%
+ \def\pgfoo@tempA{\pgfoo@attribute@op{#1}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfoo@tempB\expandafter\expandafter\expandafter{\expandafter\pgfoo@tempA\csname pgfooY#2@#1\endcsname}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfoo@process@attributes\expandafter\expandafter\expandafter{\expandafter\pgfoo@process@attributes\pgfoo@tempB}%
+ % above is just this:
+ % \def\pgfoo@process@attributes{\pgfoo@process@attributes\pgfoo@attribute@op{#1}%
+ % \csname pgfooY#2@#1\endcsname}
+ % with \pgfoo@process@attributes and \csname expanded exactly once:
+}%
+
+% \pgfoo@attribute@op for garbage collection
+\def\pgfoo@gc@attribute#1#2{\pgfoolet{#1}\relax}%
+
+
+\newcount\pgfoo@objectcount
+\newcount\pgfoothis@count
+
+% The attribute value method
+%
+% #1 = attr
+%
+% This method inserts the current value of the given attribute for the
+% current object.
+
+\def\pgfoovalueof#1{%
+ \csname pgfooX\the\pgfoothis@count @#1\endcsname%
+}%
+
+
+% The attribute get method
+%
+% #1 = attr
+% #2 = macro
+%
+% This method makes the macro equal to the current value of the
+% attribute for the current object.
+
+\def\pgfooget#1#2{%
+ \expandafter\let\expandafter#2\csname pgfooX\the\pgfoothis@count @#1\endcsname%
+}%
+
+
+% The attribute set method
+%
+% #1 = attr
+% #2 = value
+%
+% This method sets the given attribute for the current object to the
+% given value.
+
+\long\def\pgfooset#1#2{%
+ \expandafter\gdef\csname pgfooX\the\pgfoothis@count @#1\endcsname{#2}%
+}%
+
+
+% The attribute set method (expanded version)
+%
+% #1 = attr
+% #2 = value
+%
+% This method sets the given attribute for the current object to the
+% expanded version of the given value.
+
+\long\def\pgfooeset#1#2{%
+ \expandafter\xdef\csname pgfooX\the\pgfoothis@count @#1\endcsname{#2}%
+}%
+
+
+% The attribute let method
+%
+% #1 = attr
+% #2 = value
+%
+% This method sets the given attribute for the current object to the
+% given value using \let.
+
+\def\pgfoolet#1#2{%
+ \expandafter\global\expandafter\let\csname pgfooX\the\pgfoothis@count @#1\endcsname#2%
+}%
+
+
+% Add something to an attribute at the end
+%
+% #1 = attr
+% #2 = code
+%
+% This method adds the give code to the attr at the end.
+
+\def\pgfooappend#1#2{%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@oo@temp\expandafter\expandafter\expandafter{\csname pgfooX\the\pgfoothis@count @#1\endcsname#2}%
+ \expandafter\global\expandafter\let\csname pgfooX\the\pgfoothis@count @#1\endcsname\pgf@oo@temp%
+}%
+
+
+% Add something to an attribute at the beginning
+%
+% #1 = attr
+% #2 = code
+%
+% This method adds the give code to the attr at the beginning.
+
+\def\pgfooprefix#1#2{%
+ \pgfooget{#1}\pgf@oo@temp%
+ \def\pgf@oo@@temp{#2}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@oo@temp%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@oo@@temp\pgf@oo@temp}%
+ \pgfoolet{#1}\pgf@oo@temp%
+}%
+
+
+
+% Help macro for scanning arguments
+\newtoks\pgfoo@toks
+
+\def\pgfoo@collect@args{%
+ \pgfutil@ifnextchar\bgroup\pgfoo@collect@args@group\pgfoo@collect@args@nogroup%
+}%
+\def\pgfoo@collect@args@nogroup#1){%
+ \pgfoo@toks{#1}%
+ \pgfoo@continue%
+}%
+\def\pgfoo@collect@args@group#1{%
+ \pgfutil@ifnextchar){\pgfoo@toks{{#1}}\expandafter\pgfoo@continue\pgfutil@gobble}{\pgfoo@collect@args@nogroup{#1}}%
+}%
+
+
+% Instantiate an object
+%
+% Possible syntax:
+%
+% 1) \pgfoonew new <class name>(<constructor parameters)
+% 2) \pgfoonew \<objectname>=new <class name>(<constructor parameters)
+% 3) \pgfoonew{attribute}=new <class name>(<constructor parameters)
+%
+% Description:
+%
+% Creates an object. After the object has been created, the method
+% called <class name> (the constructor) is invoked. If the
+% \<objectname>= part is present, the macro is assigned to the newly
+% created object.
+
+\def\pgfoonew{%
+ \pgfutil@ifnextchar n{%
+ \pgfoo@new\pgfoo@dummy=%
+ }{%
+ \pgfutil@ifnextchar\bgroup{%
+ \pgfoo@new@attribute%
+ }{%
+ \pgfoo@new%
+ }%
+ }%
+}%
+\def\pgfoo@new#1={%
+ \def\pgfutil@reserved@a{#1}%
+ \let\pgfutil@next\pgfoo@@new
+ \futurelet\pgfutil@let@token\pgfutil@ignorespaces}%
+\def\pgfoo@@new new #1({%
+ \expandafter\ifx\csname pgfooY#1.get id\endcsname\relax%
+ \pgferror{Unknown class '#1'}%
+ \else%
+ \expandafter\pgfoo@new@create\pgfutil@reserved@a{#1}%
+ {%
+ \pgfoothis@count\pgfoo@objectcount%
+ \let\pgfoo@attribute@op\pgfoolet
+ \csname pgfooY#1.@pgfoo@process@attributes\endcsname%
+ }%
+ \let\pgfoo@continue=\pgf@oo@new@cont%
+ \expandafter\pgfoo@collect@args%
+ \fi%
+}%
+
+\def\pgf@oo@new@cont{%
+ \expandafter\pgfoolastobj\expandafter.\expandafter i\expandafter n\expandafter i\expandafter t\expandafter(\the\pgfoo@toks)%
+ \aftergroup\pgfoogc% cleanup after group
+}%
+
+\def\pgfoo@new@attribute#1={%
+ \def\pgfutil@reserved@a{#1}%
+ \let\pgfutil@next\pgfoo@@new@attribute
+ \futurelet\pgfutil@let@token\pgfutil@ignorespaces}%
+\def\pgfoo@@new@attribute new #1({%
+ \expandafter\ifx\csname pgfooY#1.get id\endcsname\relax%
+ \pgferror{Unknown class '#1'}%
+ \else%
+ \pgfoo@new@create\pgfoo@temp{#1}%
+ {%
+ \pgfoothis@count\pgfoo@objectcount%
+ \let\pgfoo@attribute@op\pgfoolet%
+ \csname pgfooY#1.@pgfoo@process@attributes\endcsname%
+ }%
+ \expandafter\pgfoolet\expandafter{\pgfutil@reserved@a}\pgfoo@temp%
+ \let\pgfoo@continue=\pgf@oo@new@cont%
+ \expandafter\pgfoo@collect@args%
+ \fi%
+}%
+
+\def\pgfoo@new@create#1#2{%
+ \advance\pgfoo@objectcount by 1\relax%
+ \edef\pgfoolastobj{\noexpand\pgfoo@caller{\the\pgfoo@objectcount}}%
+ \expandafter\gdef\csname pgfooX\the\pgfoo@objectcount @class\endcsname{#2}%
+ \let#1\pgfoolastobj%
+}%
+
+\def\pgfoo@caller#1.#2({%
+ \expandafter\let\expandafter\pgfoo@caller@temp\csname pgfooY\csname pgfooX#1@class\endcsname.#2\endcsname%
+ \ifx\pgfoo@caller@temp\relax%
+ % assume that #2 is of form "superclass.method"
+ \expandafter\let\expandafter\pgfoo@caller@temp\csname pgfooY#2\endcsname%
+ \ifx\pgfoo@caller@temp\relax%
+ \pgferror{Object #1 has no method '#2'}%
+ \fi%
+ \fi%
+ \def\pgf@marshal{%
+ \pgfoothis@count=#1\relax%
+ }%
+ \let\pgfoo@continue\pgfoo@caller@cont%
+ \pgfoo@collect@args%
+}%
+\def\pgfoo@caller@cont{%
+ \edef\pgf@marshal{%
+ \pgf@marshal%
+ \noexpand\pgfoo@caller@temp(\the\pgfoo@toks)%
+ }%
+ \expandafter\pgf@marshal\expandafter\pgfoothis@count\the\pgfoothis@count\relax%
+}%
+\let\pgfoo@orig@caller=\pgfoo@caller
+
+% The special "this" object
+
+\def\pgfoothis.#1({%
+ \expandafter\let\expandafter\pgfoo@caller@temp\csname pgfooY\csname pgfooX\the\pgfoothis@count @class\endcsname.#1\endcsname%
+ \ifx\pgfoo@caller@temp\relax%
+ % assume that #1 is of form "superclass.method"
+ \expandafter\let\expandafter\pgfoo@caller@temp\csname pgfooY#1\endcsname%
+ \fi%
+ \let\pgfoo@continue\pgfoothis@cont%
+ \pgfoo@collect@args%
+}%
+\def\pgfoothis@cont{%
+ \expandafter\pgfoo@caller@temp\expandafter(\the\pgfoo@toks)%
+}%
+
+
+
+% Get the object id
+%
+% #1 = macro to store the id
+%
+% Description:
+%
+% This special method allows you to access the object id. You can then
+% use \pgfoocall to call a method using this id. This is mainly useful
+% when you wish to store the id for a longer time.
+
+\def\pgfoo@id(#1){%
+ \edef#1{\the\pgfoothis@count}%
+}%
+
+% Yields the object with the given id
+%
+% #1 = id
+%
+% Description:
+%
+% Given an object id, \pgfooobj{<id>} will yield the object having
+% this id.
+
+\def\pgfooobj#1{%
+ \pgfoo@caller{#1}%
+}%
+
+
+% Get the object
+%
+% #1 = macro to store the object
+%
+% Description:
+%
+% This special method allows you to get a new handle to a given
+% object. If \obj is an object, you could normally just say
+% \let#1=\obj. However, if \obj happens to be \pgfoothis, then you may
+% wish to get a handle to the object itself, not to the special macro
+% \pgfoothis. In this case you can say \obj.get handle(#1).
+
+\def\pgfoo@obj(#1){%
+ \edef#1{\noexpand\pgfoo@caller{\the\pgfoothis@count}}%
+}%
+
+
+
+% The garbage collector
+%
+% Description:
+%
+% This method frees space occupied by unused objects. Garbage are
+% objects that have been destroyed because of the end of the scope in
+% which they were created. In this case, however, the memory used by
+% this object is not immediately reused because the attributes of the
+% object are actually stored in global variables. When the garbage
+% collector is called, it will set all these global variables to
+% \relax, thereby ensuring that no memory is needed for them.
+
+\def\pgfoogc{%
+ {%
+ % We do this in a group...
+ \pgfoothis@count\pgfoo@objectcount% this is temporary...
+ \let\pgfoo@next=\pgfoo@dogc%
+ \pgfoo@next%
+ }%
+}%
+\def\pgfoo@dogc{%
+ \advance\pgfoothis@count by 1\relax%
+ \expandafter\ifx\csname pgfooX\the\pgfoothis@count @class\endcsname\relax%
+ \let\pgfoo@next=\relax%
+ \else%
+ % Cleanup this object:
+ % The following is the fast version of \pgfooobj{\the\pgfoo@objectcount}.@pgfoogc:
+ \let\pgfoo@attribute@op\pgfoo@gc@attribute
+ \csname pgfooY\csname pgfooX\the\pgfoothis@count @class\endcsname.@pgfoo@process@attributes\endcsname%
+ \expandafter\global\expandafter\let\csname pgfooX\the\pgfoothis@count @class\endcsname\relax%
+ \fi%
+ \pgfoo@next%
+}%
+
+
+
+%
+%
+% Object class
+% defines method "copy"
+%
+%
+
+\pgfooclass{object}{%
+ \method copy(#1) {%
+ % create a new object
+ \edef\pgfoo@temp@classname{\csname pgfooX\the\pgfoothis@count @class\endcsname}%
+ \expandafter\pgfoo@new@create\expandafter#1\expandafter{\pgfoo@temp@classname}%
+ \def\pgfoo@copy@attributes##1##2{%
+ \pgfooget{##1}\pgfoo@attrvalue
+ \expandafter\let\csname pgfooX\the\pgfoo@objectcount @##1\endcsname\pgfoo@attrvalue
+ }%
+ \let\pgfoo@attribute@op\pgfoo@copy@attributes
+ \csname pgfooY\pgfoo@temp@classname .@pgfoo@process@attributes\endcsname
+ \aftergroup\pgfoogc% cleanup after group
+ }%
+}%
+
+
+%
+%
+% Signal class
+%
+%
+
+\pgfooclass{signal}
+{%
+ %
+ % This class implements signals.
+ %
+ % After you have created a signal object, you can call
+ % connect to connect a slot. Then, whenever the emit method is
+ % called, all connected methods get called.
+
+ % Attribute
+ \attribute emitter;%
+ % Collects the objects that should be called.
+
+ % Constructor
+ \method signal() {}%
+
+ % Connect a slot (method) #2 of object #1
+ \method connect(#1,#2) {%
+ {%
+ #1.get id(\pgf@tempid)%
+ % Save in emitter
+ \pgfooget{emitter}\pgf@temp%
+ \let\pgfoo@signal@call=\relax% avoid expansion
+ \edef\pgf@temp{\pgf@temp\pgfoo@signal@call{\pgf@tempid}{#2}}%
+ \pgfoolet{emitter}\pgf@temp%
+ }%
+ }%
+
+ \def\pgfoo@signal@call#1#2{%
+ \def\pgf@temp{\pgfooobj{#1}.#2}%
+ \expandafter\pgf@temp\expandafter(\pgfoo@signal@args)%
+ }%
+
+ % Emit a signal
+ \method emit(#1) {%
+ \def\pgfoo@signal@args{#1}%
+ \pgfoovalueof{emitter}
+ }%
+}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmoduleparser.code.tex b/graphics/pgf/base/tex/pgfmoduleparser.code.tex
new file mode 100644
index 0000000000..3528771b1a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduleparser.code.tex
@@ -0,0 +1,681 @@
+% Copyright 2009 by Till Tantau
+% Copyright 2019 by Jonathan P. Spratte
+%
+% 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.
+
+\ProvidesFileRCS{pgfmoduleparser.code.tex}
+
+%
+% This file defines commands for defining a letter-by-letter parser
+% based on a dfa. The idea is inspired by the pgf module parser, but extends it
+% and eventually replaced it.
+%
+
+% options
+\long\def\pgfparserset#1%
+ {%
+ \pgfset{/pgfparser/.cd,#1}%
+ }
+\pgfparserset
+ {%
+ ,silent/.is if=\pgfparser@ifname{every parser silent}%
+ ,status/.is if=\pgfparser@ifname{pgfparser status}%
+ }
+
+% logic helpers
+\long\def\pgfparser@fi@Bn\fi#1{\fi}
+\long\def\pgfparser@fi@Bg\fi#1#2{\fi}
+\long\def\pgfparser@fi@BTb\fi#1#2#3{\fi#2}
+\long\def\pgfparser@fi@BTc\fi#1#2#3{\fi#3}
+
+% opt arg parsing
+\long\def\pgfparserifmark#1%
+ {%
+ \ifx\pgfparser@mark#1%
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@oarg#1%
+ {%
+ \pgfutil@ifnextchar[{\pgfparser@oarg@oarg@{#1}}{#1{\pgfparser@mark}}%
+ }
+\long\def\pgfparser@oarg@oarg@#1[#2]%
+ {%
+ #1{#2}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@Oarg#1#2%
+ {%
+ \pgfutil@ifnextchar[{\pgfparser@oarg@oarg@{#2}}{#2{#1}}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@darg#1#2#3%
+ {%
+ \long\def\pgfparser@oarg@darg@##1#1##2#2{##1{##2}}%
+ \pgfutil@ifnextchar#1{\pgfparser@oarg@darg@{#3}}{#3{\pgfparser@mark}}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@Darg#1#2#3#4%
+ {%
+ \long\def\pgfparser@oarg@darg@##1#1##2#2{##1{##2}}%
+ \pgfutil@ifnextchar#1{\pgfparser@oarg@darg@{#4}}{#4{#3}}%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@targ@#1%
+ {%
+ \def\pgfparser@oarg@targ@next{#1}%
+ \afterassignment\pgfparser@oarg@targ@next
+ \let\pgfparser@ignored@token=%
+ }
+\pgfutil@protected\long\def\pgfparser@oarg@targ#1#2%
+ {%
+ \pgfutil@ifnextchar#1%
+ {\pgfparser@oarg@targ@{#2{\pgfparser@mark}}}{#2{\pgfparser@stop}}%
+ }
+
+% status messages
+\pgfutil@protected\def\pgfparser@msg#1%
+ {%
+ \immediate\write0{(pgfparser) #1}%
+ }
+\pgfutil@protected\def\pgfparser@status@start#1%
+ {%
+ \pgfparser@if{pgfparser status}{\pgfparser@msg{parser '#1' started}}{}%
+ }
+\pgfutil@protected\def\pgfparser@status@state#1%
+ {%
+ \pgfparser@if{pgfparser status}
+ {\pgfparser@msg{|= switched to state '#1'}}
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule
+ {%
+ \pgfparser@if{pgfparser status}
+ {\pgfparser@msg{| \space|= rule '\meaning\pgfparsertoken' executed}}
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule@all
+ {%
+ \pgfparser@if{pgfparser status}
+ {%
+ \pgfparser@msg
+ {| \space|= (all) rule '\meaning\pgfparsertoken' executed}%
+ }
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule@undefined
+ {%
+ \pgfparser@if{pgfparser status}
+ {%
+ \pgfparser@msg
+ {| \space|= unknown for '\meaning\pgfparsertoken' executed}%
+ }
+ {}%
+ }
+\pgfutil@protected\def\pgfparser@status@rule@undefined@all
+ {%
+ \pgfparser@if{pgfparser status}
+ {%
+ \pgfparser@msg
+ {| \space|= (all) unknown for '\meaning\pgfparsertoken' executed}%
+ }
+ {}%
+ }
+
+% macros for string comparison
+\begingroup
+\lccode`\P=`\P \lccode`\G=`\G \lccode`\F=`\F
+\lccode`\:=`\X \lccode`\;=`\r \lccode`\A=`\-
+\lowercase
+ {%
+ \endgroup
+ \def\pgfparser@mark{APGFparse;:mark-}%
+ \def\pgfparser@stop{APGFparse;:stop-}%
+ }%
+\def\pgfparser@final{final}
+\def\pgfparser@noarg{noarg}
+\def\pgfparser@blankspace{blank space}
+
+% counters
+\newcount\pgfparserdef@arg@count
+
+% shortcuts for special names
+\def\pgfparser@name#1%
+ {%
+ pgfparser #1%
+ }
+\def\pgfparser@rule#1%
+ {%
+ \pgfparser@current\space #1\space \meaning\pgfparsertoken
+ }
+\def\pgfparser@type#1%
+ {%
+ \pgfparser@rule{#1} type%
+ }
+\def\pgfparser@code#1%
+ {%
+ \pgfparser@rule{#1} code%
+ }
+\def\pgfparser@undefined#1%
+ {%
+ \pgfparser@current\space #1\space unknown%
+ }
+\def\pgfparser@ifname#1%
+ {%
+ pgfparserconditional #1%
+ }
+
+% conditionals
+\def\pgfparser@if#1%
+ {%
+ \pgfutil@ifundefined{if\pgfparser@ifname{#1}}
+ {%
+ \pgferror{Undefined conditional '#1'. Falling back to false}%
+ \iffalse
+ }
+ {\csname if\pgfparser@ifname{#1}\endcsname}%
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ }
+\def\pgfparser@newif#1%
+ {%
+ \csname newif\expandafter\endcsname
+ \csname if\pgfparser@ifname{#1}\endcsname
+ }
+\pgfparser@newif{every parser silent}
+\pgfparser@newif{pgfparserdef abort}
+\pgfparser@newif{pgfparser status}
+
+% pgfparserdef
+\pgfutil@protected\def\pgfparserdef#1#2%
+ {%
+ \def\pgfparserdef@twoargs{{#1}{#2}}%
+ \pgfparserdef@a
+ }
+\pgfutil@protected\def\pgfparserdef@a
+ {%
+ \futurelet\pgfparserdef@arg\pgfparserdef@b
+ }
+\def\pgfparserdef@b
+ {%
+ \ifx\pgfparserdef@arg\pgfutil@sptoken
+ % will also gobble the \pgfparserdef@c after \fi
+ \pgfparserdef@gobble@space
+ \fi
+ \pgfparserdef@c
+ }
+\pgfutil@protected\def\pgfparserdef@gobble@space\fi#1%
+ {%
+ \fi
+ \afterassignment\pgfparserdef@a
+ \let\pgfparser@ignored@token= % space after = to get spaces, too
+ }
+\pgfutil@protected\def\pgfparserdef@c#1%
+ {%
+ \ifx\pgfparserdef@arg\bgroup
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \def\pgfparserdef@arg{#1}%
+ \ifx\pgfparser@blankspace\pgfparserdef@arg
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {\expandafter\pgfparserdef@d\pgfparserdef@twoargs{blank space \space}}
+ {\expandafter\pgfparserdef@d\pgfparserdef@twoargs{#1}}%
+ }
+ {%
+ \expandafter\pgfparserdef@d\pgfparserdef@twoargs
+ {\meaning\pgfparserdef@arg}%
+ }%
+ }
+\long\def\pgfparserdef@d#1#2#3%
+ {%
+ \pgfparser@oarg@Oarg{}{\pgfparserdef@e{#1}{#2}{#3}}%
+ }
+\pgfutil@protected\long\def\pgfparserdef@e#1#2#3#4#5%
+ {%
+ \pgfparser@initiate@parser{#1}%
+ \csname\pgfparser@ifname{pgfparserdef abort}false\endcsname
+ % check how many arguments are used, also parses whether the argument string
+ % is valid
+ \pgfparserdef@arg@count=0
+ \pgfparserdef@argcount#4\pgfparser@mark
+ \ifnum\pgfparserdef@arg@count>9
+ \pgferror
+ {%
+ Too many arguments for parser rule. A maximum of 9 parameters is
+ supported.%
+ }%
+ \csname\pgfparser@ifname{pgfparserdef abort}true\endcsname
+ \fi
+ % define what the code does
+ \pgfparser@if{pgfparserdef abort}{}
+ {%
+ % use a macro as flag that there is a rule for the specified state and
+ % hold information how to parse it
+ \ifnum\pgfparserdef@arg@count=0
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 type}{noarg}%
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 code}%
+ {#5\pgfparser@getnexttoken}%
+ \else
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 type}{#4}%
+ \expandafter\pgfparserdef@argstring@def\the\pgfparserdef@arg@count
+ \pgfutil@namedef{\pgfparser@name{#1} #2 #3 code\expandafter}%
+ \pgfparserdef@argstring##1##2##3##4##5##6##7##8##9%
+ {#5\pgfparser@getnexttoken}%
+ \fi
+ }%
+ }
+\def\pgfparserdef@argstring@def#1%
+ {%
+ \def\pgfparserdef@argstring##1#1##2##{##1#1}%
+ }
+\def\pgfparserdef@argcount#1%
+ {%
+ \ifx\pgfparser@mark#1%
+ \pgfparser@fi@Bg
+ \fi
+ \pgfutil@firstofone
+ {%
+ \pgfutil@IfUndefined{pgfparserdef@argcount@#1}
+ {%
+ \pgferror{Unknown argument type '#1'. Aborting rule definition}%
+ \pgfparserdef@argcount@abort
+ }
+ {\csname pgfparserdef@argcount@#1\endcsname}%
+ }%
+ }
+\pgfutil@protected\long\def\pgfparserdef@argcount@abort#1\pgfparser@mark
+ {%
+ \csname\pgfparser@ifname{pgfparserdef abort}true\endcsname
+ }
+\def\pgfparserdef@argcount@m
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+\let\pgfparserdef@argcount@o\pgfparserdef@argcount@m
+\def\pgfparserdef@argcount@O#1%
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+\let\pgfparserdef@argcount@r\pgfparserdef@argcount@O
+\let\pgfparserdef@argcount@t\pgfparserdef@argcount@O
+\def\pgfparserdef@argcount@d#1#2%
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+\def\pgfparserdef@argcount@D#1#2#3%
+ {%
+ \advance\pgfparserdef@arg@count1
+ \pgfparserdef@argcount
+ }
+
+\pgfutil@protected\def\pgfparser@initiate@parser#1%
+ {%
+ % if that is the first rule for the parser
+ \pgfutil@IfUndefined{if\pgfparser@ifname{#1 silent}}%
+ {%
+ % define space to be a no-op
+ \pgfutil@namedef
+ {\pgfparser@name{#1} all blank space \space\space type}{noarg}%
+ \pgfutil@namedef
+ {\pgfparser@name{#1} all blank space \space\space code}%
+ {\pgfparser@getnexttoken}%
+ % define a new conditional whether the parser silently ignores unknown
+ % tokens
+ \pgfparser@newif{#1 silent}%
+ \pgfparserset
+ {%
+ #1/silent/.is if=\pgfparser@ifname{#1 silent}%
+ }%
+ }
+ {}%
+ }
+
+% pgfparserlet
+\pgfutil@protected\def\pgfparserlet#1#2%
+ {%
+ \def\pgfparserlet@parser@a{#1}%
+ \def\pgfparserlet@state@a{#2}%
+ \pgfparserlet@a
+ }
+\pgfutil@protected\def\pgfparserlet@a
+ {%
+ \futurelet\pgfparserlet@arga\pgfparserlet@b
+ }
+\def\pgfparserlet@b
+ {%
+ \ifx\pgfparserlet@arga\pgfutil@sptoken
+ % will also gobble the \pgfparserlet@c after \fi
+ \pgfparserlet@gobble@space\pgfparserlet@a
+ \fi
+ \pgfparserlet@c
+ }
+\pgfutil@protected\def\pgfparserlet@gobble@space#1\fi#2%
+ {%
+ \fi
+ \afterassignment#1%
+ \let\pgfparser@ignored@token= % space after = to get spaces, too
+ }
+\pgfutil@protected\def\pgfparserlet@c#1%
+ {%
+ \ifx\pgfparserlet@arga\bgroup
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \def\pgfparserlet@arga{#1}%
+ \ifx\pgfparser@blankspace\pgfparserlet@arga
+ \def\pgfparserlet@arga{blank space \space}%
+ \fi
+ }
+ {\edef\pgfparserlet@arga{\meaning\pgfparserlet@arga}}%
+ \pgfparser@oarg@oarg\pgfparserlet@d
+ }
+\pgfutil@protected\def\pgfparserlet@d#1%
+ {%
+ \pgfparserifmark{#1}
+ {%
+ \let\pgfparserlet@parser@b\pgfparserlet@parser@a
+ \let\pgfparserlet@state@b\pgfparserlet@state@a
+ \pgfparserlet@f
+ }
+ {\pgfparser@oarg@oarg{\pgfparserlet@e{#1}}}%
+ }
+\pgfutil@protected\def\pgfparserlet@e#1#2%
+ {%
+ \pgfparserifmark{#2}
+ {%
+ \let\pgfparserlet@parser@b\pgfparserlet@parser@a
+ \def\pgfparserlet@state@b{#1}%
+ }
+ {%
+ \def\pgfparserlet@parser@b{#1}%
+ \def\pgfparserlet@state@b{#2}%
+ }
+ \pgfparserlet@f
+ }
+\pgfutil@protected\def\pgfparserlet@f
+ {%
+ \futurelet\pgfparserlet@argb\pgfparserlet@g
+ }
+\def\pgfparserlet@g
+ {%
+ \ifx\pgfparserlet@argb\pgfutil@sptoken
+ % will also gobble the \pgfparserlet@c after \fi
+ \pgfparserlet@gobble@space\pgfparserlet@f
+ \fi
+ \pgfparserlet@h
+ }
+\pgfutil@protected\def\pgfparserlet@h#1%
+ {%
+ \ifx\pgfparserlet@argb\bgroup
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \def\pgfparserlet@argb{#1}%
+ \ifx\pgfparser@blankspace\pgfparserlet@argb
+ \def\pgfparserlet@argb{blank space \space}%
+ \fi
+ }
+ {\edef\pgfparserlet@argb{\meaning\pgfparserlet@argb}}%
+ \pgfparserlet@i
+ \pgfparserlet@parser@a
+ \pgfparserlet@state@a
+ \pgfparserlet@arga
+ \pgfparserlet@parser@b
+ \pgfparserlet@state@b
+ \pgfparserlet@argb
+ }
+\def\pgfparserlet@i#1#2#3#4#5#6%
+ {%
+ \pgfutil@IfUndefined{\pgfparser@name{#4} #5 #6 type}
+ {%
+ \pgferror
+ {%
+ There is no rule defined for parser '#4' in state '#5' for '#6'.
+ Aborting \string\pgfparserlet
+ }%
+ }
+ {%
+ \pgfparser@initiate@parser{#1}%
+ \pgfparserlet@let{#1}{#2}{#3}{#4}{#5}{#6}{type}%
+ \pgfparserlet@let{#1}{#2}{#3}{#4}{#5}{#6}{code}%
+ }%
+ }
+\def\pgfparserlet@let#1#2#3#4#5#6#7%
+ {%
+ \expandafter\let\csname\pgfparser@name{#1} #2 #3 #7\expandafter\endcsname
+ \csname\pgfparser@name{#4} #5 #6 #7\endcsname
+ }
+
+\pgfutil@protected\long\def\pgfparserdefunknown#1#2#3%
+ {%
+ \pgfparser@initiate@parser{#1}%
+ \pgfutil@namedef{\pgfparser@name{#1} #2 unknown}{#3}%
+ }
+\pgfutil@protected\long\def\pgfparserdeffinal#1#2%
+ {%
+ \pgfutil@namedef{\pgfparser@name{#1} final action}{#2}%
+ }
+\pgfutil@protected\def\pgfparserswitch#1%
+ {%
+ \pgfparser@status@state{#1}%
+ \def\pgfparserstate{#1}%
+ }
+\pgfutil@protected\def\pgfparserparse#1%
+ {%
+ \pgfutil@IfUndefined{if\pgfparser@ifname{#1 silent}}
+ {\pgferror{No parser named '#1' defined}}
+ {%
+ \edef\pgfparser@current{\pgfparser@name{#1}}%
+ \def\pgfparser@usersname{#1}%
+ \pgfparser@status@start{#1}%
+ \pgfparserswitch{initial}%
+ \pgfparser@getnexttoken
+ }%
+ }
+% get next token
+\pgfutil@protected\def\pgfparser@getnexttoken
+ {%
+ \ifx\pgfparserstate\pgfparser@final
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {%
+ \pgfutil@IfUndefined{\pgfparser@current\space final action}
+ {}
+ {\csname \pgfparser@current\space final action\endcsname}%
+ }
+ {%
+ \futurelet\pgfparsertoken\pgfparser@getnexttoken@a
+ }%
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@a
+ {%
+ \pgfparser@getnexttoken@iftokengobble\bgroup\bgroup
+ {%
+ \pgfparser@getnexttoken@iftokengobble\egroup\egroup
+ {%
+ \pgfparser@getnexttoken@iftokengobble\pgfutil@sptoken{ }%
+ {\pgfparser@getnexttoken@defchar}%
+ }%
+ }%
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@iftokengobble#1#2%
+ {%
+ \ifx\pgfparsertoken#1%
+ \def\pgfparserletter{#2}%
+ \pgfparser@getnexttoken@gobble
+ \fi
+ \pgfutil@firstofone
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@gobble\fi#1#2%
+ {%
+ \fi
+ \afterassignment\pgfparser@getnexttoken@b
+ \let\pgfparser@ignored@token= % gobble should gobble a space
+ }
+\pgfutil@protected\long\def\pgfparser@getnexttoken@defchar#1%
+ {%
+ \def\pgfparserletter{#1}%
+ \pgfparser@getnexttoken@b
+ }
+\pgfutil@protected\def\pgfparser@getnexttoken@b
+ {%
+ \pgfutil@IfUndefined{\pgfparser@type{\pgfparserstate}}
+ {%
+ \pgfutil@IfUndefined{\pgfparser@type{all}}
+ {%
+ \pgfparser@if{every parser silent}{}
+ {%
+ \pgfparser@if{\pgfparser@usersname\space silent}{}
+ {%
+ \pgferror
+ {%
+ No rule for parser '\pgfparser@usersname' in state
+ '\pgfparserstate' for '\meaning\pgfparsertoken'.
+ Ignoring token%
+ }%
+ }%
+ }%
+ \pgfutil@IfUndefined{\pgfparser@undefined{\pgfparserstate}}
+ {%
+ \pgfutil@IfUndefined{\pgfparser@undefined{all}}
+ {}
+ {%
+ \pgfparser@status@rule@undefined@all
+ \csname\pgfparser@undefined{all}\endcsname
+ }%
+ }
+ {%
+ \pgfparser@status@rule@undefined
+ \csname\pgfparser@undefined{\pgfparserstate}\endcsname
+ }%
+ \pgfparser@getnexttoken
+ }
+ {%
+ \pgfparser@status@rule@all
+ \pgfparser@handle{all}%
+ }%
+ }
+ {%
+ \pgfparser@status@rule
+ \pgfparser@handle{\pgfparserstate}%
+ }%
+ }
+
+% handle arguments
+\pgfutil@protected\def\pgfparser@handle#1%
+ {%
+ \expandafter\ifx\csname\pgfparser@type{#1}\endcsname\pgfparser@noarg
+ \pgfparser@fi@BTb
+ \fi
+ \pgfutil@secondoftwo
+ {\csname\pgfparser@code{#1}\endcsname}
+ {\pgfparser@handle@args{#1}}%
+ }
+\pgfutil@protected\def\pgfparser@handle@args#1%
+ {%
+ \def\pgfparser@stateorall{#1}%
+ \expandafter\expandafter\expandafter\pgfparser@handle@args@a
+ \csname\pgfparser@type{#1}\endcsname\pgfparser@mark\pgfparser@stop
+ }
+\def\pgfparser@handle@args@a
+ {%
+ \pgfparser@handle@args@b{}%
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@b#1#2#3\pgfparser@stop
+ {%
+ \pgfparserifmark{#2}
+ {\csname\pgfparser@code{\pgfparser@stateorall}\endcsname#1}
+ {%
+ \pgfutil@IfUndefined{pgfparser@handle@args@#2}
+ {\pgferror{Unknown argument type '#2'}}
+ {\csname pgfparser@handle@args@#2\endcsname{#1}{#3}}%
+ }%
+ }
+\long\def\pgfparser@handle@args@c#1#2%
+ {%
+ \pgfparserifmark{#2}
+ {\csname\pgfparser@code{\pgfparser@stateorall}\endcsname#1}
+ {\pgfparser@handle@args@b{#1}#2\pgfparser@stop}%
+ }
+\long\def\pgfparser@handle@args@m#1#2#3%
+ {%
+ \pgfparser@handle@args@c{#1{#3}}{#2}%
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@o#1#2%
+ {%
+ \pgfparser@oarg@oarg{\pgfparser@handle@args@m{#1}{#2}}%
+ }
+\long\def\pgfparser@handle@args@O#1#2%
+ {%
+ \pgfparser@handle@args@O@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@O@#1#2#3\pgfparser@stop
+ {%
+ \pgfparser@oarg@Oarg{#2}{\pgfparser@handle@args@m{#1}{#3}}%
+ }
+\long\def\pgfparser@handle@args@d#1#2%
+ {%
+ \pgfparser@handle@args@d@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@d@#1#2#3#4\pgfparser@stop
+ {%
+ \pgfparser@oarg@darg{#2}{#3}{\pgfparser@handle@args@m{#1}{#4}}%
+ }
+\long\def\pgfparser@handle@args@D#1#2%
+ {%
+ \pgfparser@handle@args@D@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@D@#1#2#3#4#5\pgfparser@stop
+ {%
+ \pgfparser@oarg@Darg{#2}{#3}{#4}{\pgfparser@handle@args@m{#1}{#5}}%
+ }
+\long\def\pgfparser@handle@args@r#1#2%
+ {%
+ \pgfparser@handle@args@r@a{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@r@a#1#2#3\pgfparser@stop
+ {%
+ \def\pgfparser@handle@args@r@b##1#2%
+ {\pgfparser@handle@args@c{#1{##1}}{#3}}%
+ \pgfparser@handle@args@r@b
+ }
+\long\def\pgfparser@handle@args@t#1#2%
+ {%
+ \pgfparser@handle@args@t@{#1}#2\pgfparser@stop
+ }
+\pgfutil@protected\long\def\pgfparser@handle@args@t@#1#2#3\pgfparser@stop
+ {%
+ \pgfparser@oarg@targ{#2}{\pgfparser@handle@args@m{#1}{#3}}%
+ }
+
+\pgfutil@protected\long\def\pgfparserreinsert#1%
+ {%
+ \ifx\pgfparser@getnexttoken#1%
+ \pgfparser@fi@BTb
+ \fi
+ \@secondoftwo
+ {\expandafter\pgfparser@getnexttoken\pgfparserletter}
+ {%
+ \pgferror
+ {%
+ Misuse of \string\pgfparserreinsert\space detected. You should only
+ use it at the the end of an action code%
+ }%
+ #1%
+ }%
+ }
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmoduleplot.code.tex b/graphics/pgf/base/tex/pgfmoduleplot.code.tex
new file mode 100644
index 0000000000..1a553f925c
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduleplot.code.tex
@@ -0,0 +1,561 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmoduleplot.code.tex}
+
+
+% PGF's plotting interface works as follows:
+%
+% In order to plot something, two things need to be done. First, you
+% need to provide the coordinates (obviously) of the points that
+% should be plotted. The coordinates are given via a long stream of
+% commands. These commands are \pgfplotstreamstart, which is
+% given exactly once at the beginning, the commands
+% \pgfplotstreampoint, \pgfplotstreampointoutlier,
+% \pgfplotstreampointundefined, \pgfplotstreamnewdataset, of which
+% there are numerous in the middle, the special \pgfplotstreamspecial,
+% of which there may be numerous in the middle, and \pgfplotstreamend,
+% which must be given at the end. Between these commands arbitrary
+% other commands may be given. Here is an example:
+%
+% ...
+% \pgfplotstreamstart
+% \pgfplotstreampoint{\pgfpointxy{0}{0}}
+% \pgfplotstreampoint{\pgfpointxy{1}{1}}
+% \pgfplotstreamnewdataset
+% \pgfplotstreampoint{\pgfpointxy{2}{4}}
+% \relax
+% \pgfplotstreampointoutlier{\pgfpointxy{3}{9}}
+% \pgfplotstreamspecial{some handler-dependent special stuff}
+% \pgfplotstreamend
+%
+% By themselves, the \pgfplotstreamxxxx commands do not do anything by
+% default. Rather, to ``use'' such a stream, you must first install a
+% stream handler. For example, the ``lineto'' handler will simply
+% basically every \pgfplotstreampoint into a \pgfpathlineto.
+%
+% One special things is the handling of "jumps" in a stream. For
+% instance, when a lineto handler encounters an "outlier" or a new
+% data set, the current line should end and a new subpath should start
+% (unless configured otherwise). For this, the special jump handler is
+% important.
+%
+% Example:
+%
+% \pgfpathmoveto{\pgfpointorigin}
+%
+% \pgfplothandlerlineto
+% \pgfplotstreamstart
+% \pgfplotstreampoint{\pgfpointxy{0}{0}}
+% \pgfplotstreampoint{\pgfpointxy{1}{1}}
+% \pgfplotstreampoint{\pgfpointxy{2}{4}}
+% \relax
+% \pgfplotstreampoint{\pgfpointxy{3}{9}}
+% \pgfplotstreamend
+
+
+% The stream commands actually call their ``internal'' versions, which
+% are set by the handlers:
+\def\pgfplotstreamstart{\pgf@plotstreamstart}%
+\def\pgfplotstreampoint#1{\gdef\pgfplotlastpoint{#1}\pgf@plotstreampoint{#1}}%
+\def\pgfplotstreampointoutlier#1{\pgfplot@outliers{}{\pgf@plotstreamjump}{\pgfplotstreampoint{#1}}}%
+\def\pgfplotstreampointundefined{\pgfplot@outliers{}{\pgf@plotstreamjump}{}}%
+\def\pgfplotstreamnewdataset{\pgfplot@outliers{}{\pgf@plotstreamjump}{}}%
+\def\pgfplotstreamspecial{\pgf@plotstreamspecial}%
+\def\pgfplotstreamend{\pgf@plotstreamend}%
+
+\def\pgfplot@ignorer#1#2#3{#1}%
+\def\pgfplot@jumper#1#2#3{#2}%
+\def\pgfplot@plotter#1#2#3{#3}%
+
+\let\pgfplot@outliers\pgfplot@jumper
+\let\pgfplot@undefined\pgfplot@jumper
+\let\pgfplot@newdata\pgfplot@jumper
+
+\pgfset{
+ handle outlier points in plots/.is choice,
+ handle outlier points in plots/ignore/.code=\let\pgfplot@outliers\pgfplot@ignorer,
+ handle outlier points in plots/jump/.code=\let\pgfplot@outliers\pgfplot@jumper,
+ handle outlier points in plots/plot/.code=\let\pgfplot@outliers\pgfplot@plotter,
+ handle undefined points in plots/.is choice,
+ handle undefined points in plots/ignore/.code=\let\pgfplot@undefined\pgfplot@ignorer,
+ handle undefined points in plots/jump/.code=\let\pgfplot@undefined\pgfplot@jumper,
+ handle new data sets in plots/.is choice,
+ handle new data sets in plots/ignore/.code=\let\pgfplot@newdata\pgfplot@ignorer,
+ handle new data sets in plots/jump/.code=\let\pgfplot@newdata\pgfplot@jumper,
+}%
+
+
+% Declares a new plot handler
+%
+% #1 = macro that should install the stream handler subsequently
+% #2 = parameter list of said macro.
+% #3 = keys as described below
+%
+% Description:
+%
+% When you declare a new plot handler, you provide, through keys,
+% different "actions" that should be taken when the different stream
+% commands are used:
+%
+% start = some code to be executed when \pgfplotstreamstart is called
+% for this plothandler
+% end = same for the end of the stream
+% point = code to be executed for a point of the stream
+% jump = code to be executed for a "jump" in the stream
+% special = code to be executed for \pgfplotstreamspecial
+% start macro = here and for the following keys, the to-be-executed
+% code is stored in the given macro
+% end macro = see above
+% jump macro = see above
+% point macro = see above
+% special macro = see above
+%
+% Example:
+%
+% \pgfdeclareplothandler{\ultrasimplehandler}{}{
+% point=\pgfpathlineto{##1}
+% }
+
+\def\pgfdeclareplothandler#1#2#3{%
+ \def#1#2{%
+ \pgfkeys{%
+ /pgf/plots/@handler options/.cd,
+ start=\relax,
+ end macro=\relax,
+ point macro=\pgfutil@gobble,
+ jump macro=\relax,
+ special macro=\pgfutil@gobble,%
+ #3%
+ }%
+ }%
+}%
+
+\pgfkeys{%
+ /pgf/plots/@handler options/.cd,
+ start/.code=%
+ \gdef\pgf@plotstreamstart{%
+ \global\pgf@plot@startedfalse%
+ \global\let\pgf@plotstreamend\pgf@plotstreamend@init%
+ \global\let\pgf@plotstreampoint\pgf@plotstreampoint@init%
+ \global\let\pgf@plotstreamjump\pgf@plotstreamjump@init%
+ \global\let\pgf@plotstreamspecial\pgf@plotstreamspecial@init%
+ #1%
+ },%
+ start macro/.code=%
+ \gdef\pgf@plotstreamstart{%
+ \global\pgf@plot@startedfalse%
+ \global\let\pgf@plotstreamend\pgf@plotstreamend@init%
+ \global\let\pgf@plotstreampoint\pgf@plotstreampoint@init%
+ \global\let\pgf@plotstreamjump\pgf@plotstreamjump@init%
+ \global\let\pgf@plotstreamspecial\pgf@plotstreamspecial@init%
+ #1%
+ },%
+ end/.code=\gdef\pgf@plotstreamend@init{#1},
+ end macro/.code=\global\let\pgf@plotstreamend@init#1,
+ point/.code=\gdef\pgf@plotstreampoint@init##1{#1},
+ point macro/.code=\global\let\pgf@plotstreampoint@init#1,
+ jump/.code=\gdef\pgf@plotstreamjump@init{#1},
+ jump macro/.code=\global\let\pgf@plotstreamjump@init#1,
+ special/.code=\gdef\pgf@plotstreamspecial@init##1{#1},
+ special macro/.code=\global\let\pgf@plotstreamspecial@init#1,
+}%
+
+\newif\ifpgf@plot@started
+
+
+
+
+% Sets the action taken for the first point of a plot to a lineto.
+%
+% Description:
+%
+% For certain handlers it makes sense either the start a plot by
+% moving to the first point of the plot or to do a lineto to that
+% first point. Using this command this action can be set to a lineto.
+%
+% Example:
+%
+% \pgfsetlinetofirstplotpoint
+
+\def\pgfsetlinetofirstplotpoint{\let\pgf@plot@first@action=\pgfpathlineto}%
+
+
+% Sets the action taken for the first point of a plot to a moveto.
+%
+% Example:
+%
+% \pgfsetmovetofirstplotpoint
+
+\def\pgfsetmovetofirstplotpoint{\let\pgf@plot@first@action=\pgfpathmoveto}%
+
+\let\pgf@plot@first@action=\pgfpathmoveto
+
+
+
+
+%
+% Handlers
+%
+
+
+% This handler converts each plot stream command into a lineto
+% command, except for the first, which is converted to the action that
+% has previously been specified using \pgfsetlinetofirstplotpoint or
+% \pgfsetmovetofirstplotpoint.
+%
+% Example:
+%
+% \pgfplothandlerlineto
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerlineto}{}{
+ point macro=\pgf@plot@line@handler,
+ jump=\global\let\pgf@plotstreampoint\pgf@plot@line@handler@move%
+}%
+
+\def\pgf@plot@line@handler#1{%
+ \pgf@plot@first@action{#1}%
+ \global\let\pgf@plotstreampoint=\pgfpathlineto%
+}%
+
+\def\pgf@plot@line@handler@move#1{%
+ \pgfpathmoveto{#1}%
+ \global\let\pgf@plotstreampoint=\pgfpathlineto%
+}%
+
+
+
+% This handler turns creates a series of lineto commands, with the
+% last command being a closepath, resulting in a closed path. If a
+% jump is encountered, the current subpath is closed and a new subpath
+% is started.
+%
+% Example:
+%
+% \pgfplothandlerpolygon
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerpolygon}{}{%
+ point macro=\pgf@plot@line@handler@close,
+ jump macro=\pgf@plot@next@close@and@moveto,
+ end macro=\pgf@plot@polygon@stop
+}%
+
+\def\pgf@plot@line@handler@close#1{%
+ \pgfpathmoveto{#1}%
+ \global\pgf@plot@startedtrue%
+ \global\let\pgf@plotstreampoint=\pgfpathlineto%
+}%
+
+\def\pgf@plot@polygon@stop{%
+ \ifpgf@plot@started%
+ \pgfpathclose%
+ \fi%
+ \global\pgf@plot@startedfalse%
+}%
+
+\def\pgf@plot@next@close@and@moveto{%
+ \ifpgf@plot@started%
+ \pgfpathclose%
+ \fi%
+ \global\let\pgf@plotstreampoint\pgf@plot@line@handler@close%
+}%
+
+
+% More handlers are defined in pgflibraryplothandlers
+
+
+
+
+
+% This handler discards the plot.
+%
+% Example:
+%
+% \pgfplothandlerdiscard
+% \pgfplotxyfile{mytable}
+
+\pgfdeclareplothandler{\pgfplothandlerdiscard}{}{}%
+
+
+
+% This handler records each plot stream command to a macro. This is
+% useful if plot commands are difficult to generate and need to be
+% ``recycled'' later on.
+%
+% Example:
+%
+% \pgfplothandlerrecord{\myplot}
+% \pgfplotxyfile{mytable} % stored in \myplot now
+% \pgfplothandlerline
+% \myplot
+% \pgftransformxshift{1cm}
+% \myplot
+
+\pgfdeclareplothandler{\pgfplothandlerrecord}{#1}{%
+ start=\gdef#1{\pgfplotstreamstart},
+ point=\expandafter\gdef\expandafter#1\expandafter{#1\pgfplotstreampoint{##1}},
+ jump=\expandafter\gdef\expandafter#1\expandafter{#1\pgf@plotstreamjump},
+ special=\expandafter\gdef\expandafter#1\expandafter{#1\pgfplotstreamspecial{##1}},
+ end=\expandafter\gdef\expandafter#1\expandafter{#1\pgfplotstreamend},
+}%
+
+
+
+% Read a plot stream from a file and plot it.
+%
+% #1 = file from which to read things
+%
+% File format:
+%
+% Each line of the file should begin with two numbers separated by a
+% space. Such a line with number #1 and #2 is converted to a
+% \pgfplotstreampoint{\pgfpointxy{#1}{#2}}. Extra characters following
+% on the line are ignored.
+%
+% Lines starting with ``%'' and ``#'' are ignored.
+%
+% Example:
+%
+% \pgfplotxyfile{tableformgnuplot.dat}
+
+\def\pgfplotxyfile#1{%
+ \begingroup%
+ \def\b@pgfplotsxyfile@scanning@for@first{1}%
+ \pgfplotstreamstart%
+ \openin\r@pgf@reada=#1
+ \ifeof\r@pgf@reada
+ \pgfwarning{Plot data file `#1' not found.}
+ \else
+ \catcode`\#=14
+ \catcode`\^^M=5
+ \pgf@readxyfile%
+ \fi
+ \pgfplotstreamend%
+ \endgroup%
+}%
+
+\let\pgf@savedpar=\par
+\def\pgf@partext{\par}%
+\def\pgf@readxyfile{%
+ \pgfutil@read\r@pgf@reada to \pgf@temp%
+ \let\par=\pgf@savedpar%
+ \edef\pgf@temp{\pgf@temp}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \if1\b@pgfplotsxyfile@scanning@for@first
+ \else
+ \ifeof\r@pgf@reada\else\pgfplotstreamnewdataset\fi%
+ \fi
+ \else\ifx\pgf@temp\pgf@partext%
+ \if1\b@pgfplotsxyfile@scanning@for@first
+ \else
+ \ifeof\r@pgf@reada\else\pgfplotstreamnewdataset\fi%
+ \fi
+ \else%
+ \expandafter\pgf@parsexyline\pgf@temp\pgf@stop%
+ \fi\fi%
+ \ifeof\r@pgf@reada\else\expandafter\pgf@readxyfile\fi%
+}%
+
+\def\pgf@parsexyline#1 #2 #3\pgf@stop{%
+ \def\b@pgfplotsxyfile@scanning@for@first{0}%
+ \edef\pgf@xyline@flag@val{#3}%
+ \ifx\pgf@xyline@flag@val\pgf@xyline@flag@undef%
+ \pgfplotstreampointundefined%
+ \else\ifx\pgf@xyline@flag@val\pgf@xyline@flag@out%
+ \pgfplotstreampointoutlier{\pgfpointxy{#1}{#2}}%
+ \else%
+ \pgfplotstreampoint{\pgfpointxy{#1}{#2}}%
+ \fi\fi%
+}%
+
+\edef\pgf@xyline@flag@out{o\space}%
+\edef\pgf@xyline@flag@undef{u\space}%
+
+
+
+
+% Read a plot stream from a file and plot it.
+%
+% #1 = file from which to read things
+%
+% File format:
+%
+% Like xy, except that each line contains three numbers, which are
+% converted to xyz coordinates.
+%
+% Example:
+%
+% \pgfplotxyfile{tableformgnuplot.dat}
+
+\def\pgfplotxyzfile#1{%
+ \begingroup%
+ \pgfplotstreamstart%
+ \openin\r@pgf@reada=#1
+ \ifeof\r@pgf@reada
+ \pgfwarning{Plot data file `#1' not found.}
+ \else
+ \catcode`\#=14
+ \catcode`\^^M=5
+ \pgf@readxyzfile%
+ \fi
+ \pgfplotstreamend%
+ \endgroup%
+}%
+
+\def\pgf@readxyzfile{%
+ \pgfutil@read\r@pgf@reada to \pgf@temp%
+ \ifx\pgf@temp\pgfutil@empty%
+ \if1\b@pgfplotsxyfile@scanning@for@first
+ \else
+ \ifeof\r@pgf@reada\else\pgfplotstreamnewdataset\fi%
+ \fi
+ \else\ifx\pgf@temp\pgf@partext%
+ \if1\b@pgfplotsxyfile@scanning@for@first
+ \else
+ \ifeof\r@pgf@reada\else\pgfplotstreamnewdataset\fi%
+ \fi
+ \else%
+ \expandafter\pgf@parsexyzline\pgf@temp\pgf@stop%
+ \fi\fi%
+ \ifeof\r@pgf@reada\else\expandafter\pgf@readxyzfile\fi%
+}%
+
+\def\pgf@parsexyzline#1 #2 #3 #4\pgf@stop{%
+ \def\b@pgfplotsxyfile@scanning@for@first{0}%
+ \edef\pgf@xyline@flag@val{#4}%
+ \ifx\pgf@xyline@flag@val\pgf@xyline@flag@undef%
+ \pgfplotstreampointundefined%
+ \else\ifx\pgf@xyline@flag@val\pgf@xyline@flag@out%
+ \pgfplotstreampointoutlier{\pgfpointxyz{#1}{#2}{#3}}%
+ \else%
+ \pgfplotstreampoint{\pgfpointxyz{#1}{#2}{#3}}%
+ \fi\fi%
+}%
+
+
+
+
+% Render a function using gnuplot.
+%
+% #1 = filename prefix for .gnuplot and .table files (optional,
+% default is \jobname)
+% #2 = gnuplot function text
+%
+% Description:
+%
+% This command will write a file called #1.gnuplot that sets up
+% some gnuplot commands to write output to a file called
+% #1.table. Then it calls gnuplot (using the \write18 mechanism)
+% to execute the file. Then it reads #2.table using \pgfplotxyfile.
+%
+% Example:
+%
+% \pgfplothandlerlineto
+% \pgfplotgnuplot[\jobname]{plot [x=0:5] x*sin(x)}
+
+{%
+ \catcode`\%=12
+ \catcode`\"=12
+ \xdef\pgf@gnuplot@head{set table \noexpand\pgf@plottablefile@quoted; set format "%.5f"}
+}%
+
+\let\pgf@plotwrite=\w@pgf@writea
+\newif\ifpgf@resample@plot
+
+\pgfkeys{%
+ /pgf/plot/gnuplot call/.initial={gnuplot}}%
+
+\def\pgfplotgnuplot{\pgfutil@ifnextchar[{\pgf@plotgnuplot}{\pgf@plotgnuplot[\jobname]}}%}%
+\def\pgf@plotgnuplot[#1]#2{%
+ \pgf@resample@plottrue%
+ \pgfutilpreparefilename{#1.gnuplot}%
+ \let\pgf@plotgnuplotfile=\pgfretval
+ \pgfutilpreparefilename{#1.table}%
+ \let\pgf@plottablefile=\pgfretval
+ \let\pgf@plottablefile@quoted=\pgfretvalquoted
+ % Check, whether it is up-to-date
+ \openin\pgfutil@inputcheck=\pgf@plotgnuplotfile\relax
+ \ifeof\pgfutil@inputcheck%
+ \else%
+ \pgfutil@read\pgfutil@inputcheck to\pgf@temp% ignored
+ \pgfutil@read\pgfutil@inputcheck to\pgf@plot@line%
+ \closein\pgfutil@inputcheck
+ \edef\pgf@plot@code{#2\space}%
+ \ifx\pgf@plot@code\pgf@plot@line%
+ \openin\pgfutil@inputcheck=\pgfretval\relax
+ \ifeof\pgfutil@inputcheck%
+ \else%
+ \closein\pgfutil@inputcheck
+ \pgf@resample@plotfalse%
+ \fi%
+ \fi%
+ \fi
+ \ifpgf@resample@plot%
+ \immediate\openout\pgf@plotwrite=\pgf@plotgnuplotfile\relax
+ \immediate\pgfutil@write\pgf@plotwrite{\pgf@gnuplot@head}%
+ \immediate\pgfutil@write\pgf@plotwrite{#2}%
+ \immediate\closeout\pgf@plotwrite%
+ \pgfutil@shellescape{%
+ \pgfkeysvalueof{/pgf/plot/gnuplot call} \pgf@plotgnuplotfile}%
+ \fi%
+% \let\pgf@savedparsexyline=\pgf@parsexyline%
+% \let\pgf@parsexyline=\pgf@parsegnuplotxyline%
+ \pgfplotxyfile{\pgf@plottablefile}%
+% \let\pgf@parsexyline=\pgf@savedparsexyline%
+}%
+
+% \def\pgf@parsegnuplotxyline#1 #2 #3\pgf@stop{%
+% \edef\pgf@xyline@flag@val{#3}%
+% \edef\pgf@xyline@flag@out{o\space}%
+% \edef\pgf@xyline@flag@undef{u\space}%
+% \ifx\pgf@xyline@flag@val\pgf@xyline@flag@undef%
+% \pgfplotstreampointundefined%
+% \else\ifx\pgf@xyline@flag@val\pgf@xyline@flag@out%
+% \pgfplotstreampointoutlier{\pgfpointxy{#1}{#2}}%
+% \else%
+% \pgfplotstreampoint{\pgfpointxy{#1}{#2}}%
+% \fi\fi%
+% }%
+
+% This producer handler plots a function using pgf's mathematical engine.
+%
+% #1 = variable
+% #2 = domain for the variable
+% #3 = point, typically defined in terms of the value of the variable
+%
+% Description:
+%
+% This producer will iterate the variable #1 over all variables in #2
+% (using the \foreach statement). For each value, a plot coordinate
+% #3 is created.
+%
+% Note that this command is pretty slow.
+%
+% Example:
+%
+% \pgfplothandlerlineto
+% \pgfplotfunction{\x}{0,0.1,...,3.141}{\pgfpointxy{\x}{sin(\x)}}
+
+\def\pgfplotfunction#1#2#3{%
+ \pgfplotstreamstart%
+ \foreach#1in{#2}%
+ {%
+ \pgf@process{#3}%
+ \edef\pgf@marshal{\noexpand\pgfplotstreampoint{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \pgf@marshal%
+ }
+ \pgfplotstreamend%
+}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmoduleshapes.code.tex b/graphics/pgf/base/tex/pgfmoduleshapes.code.tex
new file mode 100644
index 0000000000..78edf01c62
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmoduleshapes.code.tex
@@ -0,0 +1,1300 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmoduleshapes.code.tex}
+
+
+
+\newbox\pgfnodeparttextbox
+
+
+% Creates a node
+%
+% #1 = shape type
+% #2 = anchor
+% #3 = name for later reference
+% #4 = path usage command
+%
+% Description:
+%
+% This command draws a shape that has previously been defined using
+% \pgfdeclareshape. The shape is shifted such that the anchor is at
+% the origin. In order to transform the whole shape, you should setup
+% pgf's transformation matrix prior to calling this command.
+%
+% When this command is called, the shape-specific TeX boxes of the
+% node must have been setup correctly.
+%
+% Example:
+%
+% \pgftransformshift{\pgfpoint{1cm}{1cm}}
+% \pgfmultipartnode{rectangle}{center}{hellonode}{\pgfusepath{stroke}}
+
+\def\pgfmultipartnode#1#2#3#4{%
+ \pgfutil@ifundefined{pgf@sh@s@#1}%
+ {\pgferror{Unknown shape ``#1''}}%
+ {%
+ {%
+ \ifpgflatenodepositioning%
+ \pgfsys@beginscope%
+ \fi%
+ \pgf@outer@adjust@hook%
+ \let\pgf@sh@savedmacros=\pgfutil@empty% MW
+ \let\pgf@sh@savedpoints=\pgfutil@empty%
+ \def\pgf@sm@shape@name{#1}% CJ % TT added prefix!
+ \csname pgf@sh@s@#1\endcsname%
+ \pgf@sh@savedpoints%
+ \pgf@sh@savedmacros% MW
+ \pgftransformshift{%
+ \pgf@sh@reanchor{#1}{#2}%
+ \pgf@x=-\pgf@x%
+ \pgf@y=-\pgf@y%
+ }%
+ \expandafter\pgfsavepgf@process\csname pgf@sh@sa@#3\endcsname{%
+ \pgf@sh@reanchor{#1}{#2}% FIXME : this is double work!
+ }%
+ % Save the saved points and the transformation matrix
+ \edef\pgf@node@name{#3}%
+ \ifpgflatenodepositioning%
+ \pgf@shapes@late@pos@begin%
+ \fi%
+ \ifx\pgf@node@name\pgfutil@empty%
+ \else%
+ \expandafter\xdef\csname pgf@sh@ns@\pgf@node@name\endcsname{#1}%
+ \edef\pgf@sh@@temp{\noexpand\gdef\expandafter\noexpand\csname pgf@sh@np@\pgf@node@name\endcsname}%
+ \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@savedpoints}%
+ \edef\pgf@sh@@temp{\noexpand\gdef\expandafter\noexpand\csname pgf@sh@ma@\pgf@node@name\endcsname}% MW
+ \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@savedmacros}% MW
+ \pgfgettransform\pgf@temp%
+ \expandafter\xdef\csname pgf@sh@nt@\pgf@node@name\endcsname{\pgf@temp}%
+ \expandafter\xdef\csname pgf@sh@pi@\pgf@node@name\endcsname{\pgfpictureid}%
+ \fi%
+ \pgfutil@ifundefined{pgf@sh@bbg@#1}{}
+ {{\pgfusetype{.behind background}\pgfidscope\pgfscope\csname pgf@sh@bbg@#1\endcsname\endpgfscope\endpgfidscope}}%
+ \pgfutil@ifundefined{pgf@sh@bg@#1}{%
+ \global\let\pgfpositionnodelaterpath\pgfutil@empty%
+ }%
+ {\pgfpushtype%
+ \pgfusetype{.background}\csname pgf@sh@bg@#1\endcsname%
+ \ifpgflatenodepositioning%
+ \pgfsyssoftpath@getcurrentpath\pgfpositionnodelaterpath%
+ \pgfprocessround{\pgfpositionnodelaterpath}{\pgfpositionnodelaterpath}%
+ \global\let\pgfpositionnodelaterpath\pgfpositionnodelaterpath%
+ \fi%
+ #4\pgfpoptype}%
+ \pgfutil@ifundefined{pgf@sh@fbg@#1}{}
+ {{\pgfusetype{.before background}\pgfidscope\pgfscope\csname pgf@sh@fbg@#1\endcsname\endpgfscope\endpgfidscope}}%
+ {%
+ \expandafter\pgfutil@for\expandafter\pgf@shape@com\expandafter:\expandafter=\csname pgf@sh@boxes@#1\endcsname\do{%
+ {%
+ \pgfusetype{.\pgf@shape@com}%
+ \pgftransformshift{\pgf@sh@reanchor{#1}{\pgf@shape@com}}%
+ \pgfapproximatenonlineartransformation%
+ \expandafter\pgfqboxsynced\expandafter{\csname pgfnodepart\pgf@shape@com box\endcsname}%
+ }%
+ }%
+ }%
+ \pgfutil@ifundefined{pgf@sh@bfg@#1}{}%
+ {{\pgfusetype{.behind foreground}\pgfidscope\pgfscope\csname pgf@sh@bfg@#1\endcsname\endpgfscope\endpgfidscope}}%
+ \pgfutil@ifundefined{pgf@sh@fg@#1}{}%
+ {\pgfpushtype\pgfusetype{.foreground}\csname pgf@sh@fg@#1\endcsname#4\pgfpoptype}%
+ \pgfutil@ifundefined{pgf@sh@ffg@#1}{}%
+ {{\pgfusetype{.before foreground}\pgfidscope\pgfscope\csname pgf@sh@ffg@#1\endcsname\endpgfscope\endpgfidscope}}%
+ \ifpgflatenodepositioning%
+ \pgf@shapes@late@pos@end%
+ \pgfsys@endscope%
+ \else%
+ \expandafter\pgf@nodecallback\expandafter{\pgf@node@name}%
+ \fi%
+ }%
+ }%
+}%
+\let\pgf@outer@adjust@hook\relax
+
+\def\pgf@shapes@late@pos@begin{%
+ % Rename node
+ \edef\pgf@node@name{not yet positionedPGFINTERNAL\pgf@node@name}%
+ % Interrupt bounding box!
+ \pgfinterruptboundingbox%
+ % Put everything in our box:
+ \pgf@relevantforpicturesizetrue%
+ \setbox\pgfpositionnodelaterbox=\hbox%
+ \bgroup%
+ \pgfsys@beginscope%
+}%
+
+\def\pgf@shapes@late@pos@end{%
+ \pgfsys@endscope%
+ \egroup% Close box
+ \ifdim\pgf@picminx>\pgf@picmaxx\relax% happens for empty nodes
+ \def\pgfpositionnodelaterminx{0.0pt}%
+ \let\pgfpositionnodelaterminy\pgfpositionnodelaterminx%
+ \let\pgfpositionnodelatermaxx\pgfpositionnodelaterminx%
+ \let\pgfpositionnodelatermaxy\pgfpositionnodelaterminx%
+ \else%
+ \edef\pgfpositionnodelaterminx{\the\pgf@picminx}%
+ \edef\pgfpositionnodelaterminy{\the\pgf@picminy}%
+ \edef\pgfpositionnodelatermaxx{\the\pgf@picmaxx}%
+ \edef\pgfpositionnodelatermaxy{\the\pgf@picmaxy}%
+ \fi%
+ \let\pgfpositionnodelatername=\pgf@node@name%
+ \pgf@positionnodelater@macro%
+ \endpgfinterruptboundingbox%
+}%
+
+\def\pgf@shift@node#1#2{%
+ % This internal command shifts the recorded coordinates for node #1
+ % by the vector #2. It is used to
+ % correct the position of the node if the recorded coordinate
+ % happens to be wrong
+ {%
+ \pgfsettransform{\csname pgf@sh@nt@#1\endcsname}%
+ \pgf@process{#2}%
+ \advance\pgf@pt@x by\pgf@x%
+ \advance\pgf@pt@y by\pgf@y%
+ \pgfgettransform{\pgf@temp}%
+ \expandafter\xdef\csname pgf@sh@nt@#1\endcsname{\pgf@temp}%
+ }%
+}%
+
+
+
+% Creates a node
+%
+% #1 = shape type
+% #2 = anchor
+% #3 = normal TeX text
+% #4 = name for later reference
+% #5 = path usage command
+%
+% Description:
+%
+% This command draws a shape that has previously been defined using
+% \pgfdeclareshape. The shape is shifted such that the anchor is at
+% the origin. In order to transform the whole shape, you should setup
+% pgf's transformation matrix prior to calling this command.
+%
+% Example:
+%
+% \pgftransformshift{\pgfpoint{1cm}{1cm}}
+% \pgfnode{rectangle}{center}{Hello}{hellonode}{\pgfusepath{stroke}}
+
+\def\pgfnode#1#2#3#4#5{%
+ {%
+ \setbox\pgfnodeparttextbox=\hbox%
+ {%
+ \pgfinterruptpicture%
+ {#3}%
+ \endpgfinterruptpicture%
+ }%
+ \pgfmultipartnode{#1}{#2}{#4}{#5}%
+ }
+}%
+
+
+
+% Create a node that is positioned later
+%
+% #1 = macro to be called after the next node has been created
+%
+% Description:
+%
+% You can use this command to create a node that is "positioned
+% later". The idea is the following: Normally, when a node is created
+% using a command like \pgfnode, the node is immediately inserted into
+% the current picture. In particular, you have no chance to change the
+% position of a created node after it has been create.
+%
+% Using \pgfpositionnodelater, you can change the default
+% behaviour. This command is not a replacement for \pgfnode, but is
+% called before such a command and will cause the following to happen:
+% The node is created, but not inserted into the picture. Instead, it
+% is stored in the box \pgfpositionnodelaterbox. Furthermore, the node
+% is not relevant for the picture's bounding box, but a bounding box
+% for the node is computed and stored in the macros
+% \pgfpositionnodelaterboundboxminx to
+% \pgfpositionnodelaterboundboxmaxy. Finally, the
+% macro #1 is called with the following macros setup:
+%
+% \pgfpositionnodelaterbox
+% A box register (box 0 by default) that stores the node's paths and
+% texts. You should move the contents of this box to a box of your
+% choice.
+%
+% \pgfpositionnodelatername
+% The name of the just-created-node. This name will be the
+% originally "desired" name of the box plus the prefix "not yet
+% positioned boxPGFINTERNAL".
+%
+% \pgfpositionnodelaterminx
+% \pgfpositionnodelatermaxx
+% \pgfpositionnodelaterminy
+% \pgfpositionnodelatermaxy
+% These four macros store the bounding box as dimensions that are
+% guarenteed to end with "pt".
+%
+% By setting #1 to \relax (which is the default), you can switch off
+% the whole mechanism
+%
+% Once a late node has been created, you can add arbitrary code in the
+% same picture. Then, at some later point, you call
+% \pgfpositionnodenow to finally position the node at a given position.
+%
+% When \pgfpositionnodenow is called, the macros mentioned above
+% should have the exact same values they had when #1 is called.
+
+\def\pgfpositionnodelater#1{%
+ \let\pgf@positionnodelater@macro=#1%
+ \ifx\pgf@positionnodelater@macro\relax%
+ \pgflatenodepositioningfalse%
+ \else%
+ \pgflatenodepositioningtrue%
+ \fi%
+}%
+\newif\ifpgflatenodepositioning
+\pgfpositionnodelater{\relax}%
+\def\pgfpositionnodelaterbox{0}%
+
+
+
+
+% Position a node that has been scheduled for later insertion
+%
+% #1 = position in the picture, where the original anchor should go,
+% now
+%
+% Description:
+%
+% This command works in concert with \pgfpositionnodelater, see the
+% description there. When \pgfpositionnodenow is called, the macros
+% \pgfpositionnodelaterbox and so on should be set to the values they
+% had when the macro given to \pgfpositionnodelater was called. Then,
+% the box described by these macros will be inserted into the picture
+% at the position given #1. More precisely, the original node will
+% have been positioned such that the anchor given upon invocation is
+% at (0,0) and the node is now shifted by #1 before being inserted
+% into the actual picture.
+
+\def\pgfpositionnodenow#1{%
+ \pgfinterruptpath%
+ {%
+ \pgfpointtransformed{#1}%
+ \edef\pgf@temp@shift{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \pgftransformreset%
+ \pgftransformshift{\pgf@temp@shift}%
+ \pgfsys@pictureboxsynced\pgfpositionnodelaterbox%
+ \pgf@shift@node{\pgfpositionnodelatername}{\pgf@temp@shift}%
+ % Bounding box update...
+ \pgfpointtransformed{\pgfqpoint{\pgfpositionnodelaterminx}{\pgfpositionnodelaterminy}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}
+ \pgfpointtransformed{\pgfqpoint{\pgfpositionnodelatermaxx}{\pgfpositionnodelatermaxy}}%
+ \pgf@protocolsizes{\pgf@x}{\pgf@y}
+ % Naming and callbacks
+ \expandafter\pgfpositionnodenow@rename\pgfpositionnodelatername\relax%
+ }%
+ % Late setup%
+ {%
+ \csname pgf@lns@\pgfpositionnodelatername\endcsname%
+ \expandafter\global\expandafter\let\csname pgf@lns@\pgfpositionnodelatername\endcsname\relax%
+ }%
+ \endpgfinterruptpath%
+}%
+
+\def\pgfpositionnodenow@rename not yet positionedPGFINTERNAL#1\relax{%
+ \pgfnoderename{#1}{not yet positionedPGFINTERNAL#1}
+}%
+
+
+
+% "Fake" a node
+%
+% #1 = node name
+%
+% Description:
+%
+% This command will setup things so that it "looks like" a node named
+% #1 has been created, but, in reality, no node is created. The idea
+% is that a node created in this way can be referenced by systems
+% using the late positioning, which will only create the node later
+% on.
+%
+\def\pgffakenode#1{%
+ \edef\pgf@temp{\ifpgflatenodepositioning not yet positionedPGFINTERNAL\fi#1}%
+ \expandafter\gdef\csname pgf@sh@ns@\pgf@temp\endcsname{coordinate}%
+ \expandafter\gdef\csname pgf@sh@np@\pgf@temp\endcsname{\def\centerpoint{\pgfpointorigin}}%
+ \expandafter\gdef\csname pgf@sh@nt@\pgf@temp\endcsname{{1}{0}{0}{1}{0pt}{0pt}}%
+ \expandafter\global\expandafter\let\csname pgf@sh@ma@\pgf@temp\endcsname\pgfutil@empty%
+ \expandafter\xdef\csname pgf@sh@pi@\pgf@temp\endcsname{\pgfpictureid}%
+}%
+
+
+
+% Specify code that should be executed after a node has been created
+%
+% #1 = node name
+% #2 = later code
+%
+% Description:
+%
+% This macro allows you to provide some code #2 that will be executed
+% right after a node has been positioned using \pgfpositionnodenow. If
+% the node has already been positioned (if the late positioning is not
+% switched on), nothing happens.
+
+\def\pgfnodepostsetupcode#1#2{%
+ \ifpgflatenodepositioning%
+ \expandafter\ifx\csname pgf@lns@not yet positionedPGFINTERNAL#1\endcsname\relax%
+ \expandafter\gdef\csname pgf@lns@not yet positionedPGFINTERNAL#1\endcsname{#2}%
+ \else%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@lns@not yet positionedPGFINTERNAL#1\endcsname{#2}%
+ \fi%
+ \fi%
+}%
+
+
+
+% Alias a node
+%
+% #1 = new node name
+% #2 = existing node name
+%
+% Description:
+%
+% This command allows you to subsequently access the node #2 using the
+% name #1.
+%
+% Example:
+%
+% \pgfnode{rectangle}{center}{Hallo}{hellonode}{}
+% \pgfnodealias{mynode}{hellonode}
+
+\def\pgfnodealias#1#2{%
+ \pgf@node@gnamelet{pgf@sh@ns@#1}{pgf@sh@ns@#2}%
+ \pgf@node@gnamelet{pgf@sh@np@#1}{pgf@sh@np@#2}%
+ \pgf@node@gnamelet{pgf@sh@nt@#1}{pgf@sh@nt@#2}%
+ \pgf@node@gnamelet{pgf@sh@pi@#1}{pgf@sh@pi@#2}%
+ \pgf@node@gnamelet{pgf@sh@ma@#1}{pgf@sh@ma@#2}%
+ \pgf@nodecallback{#1}%
+}%
+\def\pgf@node@gnamelet#1#2{%
+ \expandafter\let\expandafter\pgf@temp\csname #2\endcsname%
+ \expandafter\global\expandafter\let\csname #1\endcsname=\pgf@temp%
+}%
+
+% Rename a node
+%
+% #1 = new name
+% #2 = old name
+%
+% Description:
+%
+% Renames a node. This is like an alias, only the memory used for the
+% old name is freed.
+
+\def\pgfnoderename#1#2{%
+ \pgfnodealias{#1}{#2}%
+ \expandafter\global\expandafter\let\csname pgf@sh@ns@#2\endcsname\relax
+ \expandafter\global\expandafter\let\csname pgf@sh@np@#2\endcsname\relax
+ \expandafter\global\expandafter\let\csname pgf@sh@nt@#2\endcsname\relax
+ \expandafter\global\expandafter\let\csname pgf@sh@pi@#2\endcsname\relax
+ \expandafter\global\expandafter\let\csname pgf@sh@ma@#2\endcsname\relax
+}%
+
+
+
+
+% Quickly create a coordinate node
+%
+% #1 = name
+% #2 = coordinate
+%
+% Description:
+%
+% Creates a node of shape coordinate. The following have the same
+% effect, only the second is much faster:
+%
+% { \pgftransformshift{\pgfpoint{1cm}{2cm} \pgfnode{coordinate}{center}{}{foo}{} }
+% \pgfcoordinate{foo}{\pgfpoint{1cm}{2cm}}
+
+\def\pgfcoordinate#1#2{%
+ \edef\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty% do nothing
+ \else%
+ \ifpgflatenodepositioning%
+ {\pgftransformshift{#2}\pgfnode{coordinate}{center}{}{#1}{}}%
+ \else%
+ \pgf@process{\pgfpointtransformed{#2}}%
+ \expandafter\gdef\csname pgf@sh@ns@#1\endcsname{coordinate}%
+ \expandafter\xdef\csname pgf@sh@np@#1\endcsname{%
+ \noexpand\def\noexpand\centerpoint{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ }
+ \expandafter\gdef\csname pgf@sh@nt@#1\endcsname{{1}{0}{0}{1}{0pt}{0pt}}%
+ \expandafter\global\expandafter\let\csname pgf@sh@ma@#1\endcsname\pgfutil@empty%
+ \expandafter\xdef\csname pgf@sh@pi@#1\endcsname{\pgfpictureid}%
+ \fi%
+ \fi%
+}%
+
+\def\pgf@sh@redeferredanchor#1#2{% CJ
+ \expandafter\gdef\csname pgf@anchor@\pgf@sm@shape@name @#1\endcsname{#2}}% CJ
+
+
+
+
+
+
+\def\pgf@sh@resavedanchor#1#2{%
+ \pgf@process{#2}%
+ \edef\pgf@sh@marshal{%
+ \noexpand\pgfutil@g@addto@macro\noexpand\pgf@sh@savedpoints{%
+ \noexpand\def\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ }}%
+ \pgf@sh@marshal%
+}%
+
+
+\def\pgf@sh@resaveddimen#1#2{%
+ {#2\global\pgf@x=\pgf@x}%
+ \edef\pgf@sh@marshal{%
+ \noexpand\pgfutil@g@addto@macro\noexpand\pgf@sh@savedpoints{%
+ \noexpand\def\noexpand#1{\the\pgf@x}%
+ }}%
+ \pgf@sh@marshal%
+}%
+
+\def\pgf@sh@resavedmacro#1#2{%
+ \let#1\pgfutil@empty%
+ \def\addtosavedmacro##1{%
+ \expandafter\def\expandafter\pgf@sh@addtomacro@temp\expandafter{#1\noexpand\def\noexpand##1{##1}}%
+ {\expandafter\pgfutil@toks@\expandafter{\pgf@sh@addtomacro@temp}\expandafter}%
+ \expandafter\def\expandafter#1\expandafter{\the\pgfutil@toks@}%
+ }%
+ #2\relax%
+ \edef\pgf@sh@marshal{%
+ \noexpand\pgfutil@g@addto@macro\noexpand\pgf@sh@savedmacros{%
+ \noexpand\def\noexpand#1{#1}%
+ }}%
+ \pgf@sh@marshal%
+}%
+
+% Invoke an anchor
+\def\pgf@sh@reanchor#1#2{%
+ \pgfutil@ifundefined{pgf@anchor@#1@#2}%
+ {%
+ \pgfutil@ifundefined{pgf@anchor@generic@#2}{%
+ \pgfmathsetcounter{pgf@counta}{#2}%
+ \csname pgf@anchor@#1@border\endcsname{\pgfqpointpolar{\the\c@pgf@counta}{1pt}}%
+ }{%
+ \csname pgf@anchor@generic@#2\endcsname{#1}%
+ }%
+ }%
+ {\csname pgf@anchor@#1@#2\endcsname}%
+}%
+
+% Defines a generic anchor, i.e. one which gets the associated shape
+% as first argument.
+%
+% #1: the anchor name.
+% #2: the code of the anchor. It may depend upon '##1', the shape's
+% name.
+%
+% The anchor will be defined locally in the current TeX scope.
+%
+% If the anchor will be referenced later by \pgfpointanchor, the macro \pgfreferencednodename
+% can be used to query the referenced node's name.
+% This macro is not defined during node creation.
+\def\pgfdeclaregenericanchor#1#2{%
+ \expandafter\def\csname pgf@anchor@generic@#1\endcsname##1{#2}%
+}%
+
+
+% Retrieves an anchor of a shape
+%
+% #1 = name
+% #2 = anchor or a number (corresponding to a degree)
+%
+% Description:
+%
+% This command yields a point at the anchor of the given named shape.
+%
+% Example:
+%
+% \pgfshape{rectangle}{center}{Hello}{hellonode}{\pgfusepath[stroke]}
+% \pgfpathmoveto{\pgfpointanchor{hellonode}{center}}
+
+\def\pgfpointanchor#1#2{%
+ % Ok, check whether #1 is known!
+ \pgfutil@ifundefined{pgf@sh@ns@#1}
+ {\pgfutil@ifundefined{pgf@sh@ns@not yet positionedPGFINTERNAL#1}{%
+ \pgferror{No shape named #1 is known}}{
+ % else, fail silently
+ }%
+ \pgfpointorigin}%
+ {%
+ \pgf@process{%
+ \edef\pgfreferencednodename{#1}% for use inside of anchors.
+ % MW install special macros
+ \csname pgf@sh@ma@#1\endcsname% MW
+ % install special coordinates
+ \csname pgf@sh@np@#1\endcsname
+ \pgf@sh@reanchor{\csname pgf@sh@ns@#1\endcsname}{#2}%
+ {%
+ \pgfsettransform{\csname pgf@sh@nt@#1\endcsname}%
+ \pgf@pos@transform@glob%
+ }%
+ % Add inter picture transformation
+ \pgf@shape@interpictureshift{#1}%
+ % Undo current transformation
+ \pgftransforminvert%
+ \pgf@pos@transform@glob%
+ }%
+ }%
+}%
+
+\def\pgf@shape@interpictureshift#1{%
+ \expandafter\ifx\csname pgf@sh@pi@#1\endcsname\pgfpictureid%
+ \else%
+ \pgfsys@getposition{\csname pgf@sh@pi@#1\endcsname}\pgf@shape@original@pos%
+ \pgfsys@getposition{\pgfpictureid}\pgf@shape@current@pos%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointorigin\pgf@shape@current@pos}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \pgf@process{\pgfpointorigin\pgf@shape@original@pos}%
+ \advance\pgf@xa by\pgf@x%
+ \advance\pgf@ya by\pgf@y%
+ \pgf@x=\pgf@xa%
+ \pgf@y=\pgf@ya%
+ \fi%
+}%
+
+
+
+% Retrieves a border point of a shape
+%
+% #1 = name
+% #2 = another point
+%
+% Description:
+%
+% This command yields a point on the border of the shape that is on a
+% straight line from the center to the point #2.
+%
+% Example:
+%
+% \pgfshape{rectangle}{center}{Hello}{hellonode}{\pgfusepath[stroke]}
+% \pgfpathmoveto{\pgfpointshapeborder{hellonode}{\pgfpoint{2cm}{1cm}}
+% \pgfpathlineto{\pgfpoint{2cm}{1cm}}
+% \pgfusepath{stroke}
+
+\def\pgfpointshapeborder#1#2{%
+ % Ok, check whether #1 is known!
+ \pgfutil@ifundefined{pgf@sh@ns@#1}
+ {\pgferror{No shape named #1 is known}%
+ \pgfpointorigin}%
+ {%
+ \pgf@process{%
+ \edef\pgfreferencednodename{#1}% for use inside of anchors.
+ % MW install special macros
+ \csname pgf@sh@ma@#1\endcsname% MW
+ % install special coordinates
+ \csname pgf@sh@np@#1\endcsname%
+ {%
+ \pgf@process{\pgfpointtransformed{#2}}%
+ \pgfsettransform{\csname pgf@sh@nt@#1\endcsname}%
+ \pgftransforminvert%
+ \pgf@pos@transform@glob%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\csname pgf@anchor@\csname pgf@sh@ns@#1\endcsname @center\endcsname}%
+ \pgf@process{\pgf@shape@interpictureshift{#1}}%%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \csname pgf@anchor@\csname pgf@sh@ns@#1\endcsname @border\endcsname{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \pgfsettransform{\csname pgf@sh@nt@#1\endcsname}%
+ \pgf@pos@transform@glob%
+ \global\pgf@x=\pgf@x%
+ \global\pgf@y=\pgf@y%
+ }%
+ % Add inter picture transformation
+ \pgf@shape@interpictureshift{#1}%
+ % Undo current transformation
+ \pgftransforminvert%
+ \pgf@pos@transform@glob%
+ }%
+ }%
+}%
+
+
+% Retrieve the list of node parts of a shape
+%
+% #1 = a macro
+% #2 = a shape name
+%
+% Description:
+%
+% Stores the list of node parts of a shape #2 in the macro #1.
+%
+% Example:
+%
+% \pgfgetnodeparts\mylist{circle split}
+%
+% This will set \mylist\ to "text,lower"
+
+\def\pgfgetnodeparts#1#2{%
+ \expandafter\let\expandafter#1\csname pgf@sh@boxes@#2\endcsname%
+}%
+
+
+% Declares a shape type
+%
+% #1 = shape type
+% #2 = shape specification
+%
+% Description:
+%
+% This command declares a new shape type. The shape specification
+% should contain the following commands:
+%
+% - \savedanchor
+% This command takes two arguments: a name and some code. The point
+% specified by the code (the \pgf@x and \pgf@y values resulting from
+% executing the code, to be precise), will be stored under the given
+% name. Whenever, later on, an anchor is invoked these stored points
+% will be available. The \saveddimen works like \savedanchor, only a
+% single dimension is stored (taken from \pgf@x).
+% When a savedanchor is calculated, the height/width/depth of the
+% boxes mentioned in \nodeparts can be used.
+%
+% - \anchor
+% Specifies an anchor. This command takes two arguments: an anchor
+% name and some code for computing the anchor. When the anchor
+% computation starts, all shape points and shape dimension will be
+% setup.
+%
+% - \anchorborder
+% This command should compute a point on the border of the
+% shape. When the code is called, \pgf@x and \pgf@y will have been
+% preinitialised with a direction.
+%
+% - \behindbackgroundpath
+% Some things to be draw behind everything.
+%
+% - \backgroundpath
+% A path that is drawn behind the main box. How this path is used
+% depends on how \pgfshape is called.
+%
+% - \beforebackgroundpath
+% Some things to be draw before the background path, but behind the
+% main box.
+%
+% - \behindforegroundpath
+% Some things to be draw on top of the main box.
+%
+% - \foregroundpath
+% A path that is drawn on top of all of the above. How this path is
+% used depends on how \pgfshape is called.
+%
+% - \beforeforegroundpath
+% Some things to be draw before everything.
+%
+% - \nodeparts
+% List of node parts that make up the shape. For each entry XYZ in
+% the list there must be a box named \pgfnodepartXYZbox (possibly
+% ``redirected'' to some different box using \let). Each such box
+% will be placed at the anchor XYZ.
+% By default, \nodeparts is just {text}. Thus, there will be one
+% node part box named \pgfnodeparttextbox and this node will be
+% placed at the anchor text.
+%
+%
+% Example:
+%
+% See the definition of rectangle, below.
+
+\long\def\pgfdeclareshape#1#2{%
+ {%
+ \def\pgf@sm@shape@name{#1}%
+ \let\savedanchor=\pgf@sh@savedanchor
+ \let\saveddimen=\pgf@sh@saveddimen
+ \let\savedmacro=\pgf@sh@savedmacro% MW
+ \let\deferredanchor=\pgf@sh@deferredanchor% CJ
+ \let\anchor=\pgf@sh@anchor
+ \let\anchorborder=\pgf@sh@anchorborder
+ \let\behindbackgroundpath=\pgf@sh@behindbgpath
+ \let\backgroundpath=\pgf@sh@bgpath
+ \let\beforebackgroundpath=\pgf@sh@beforebgpath
+ \let\behindforegroundpath=\pgf@sh@behindfgpath
+ \let\foregroundpath=\pgf@sh@fgpath
+ \let\beforeforegroundpath=\pgf@sh@beforefgpath
+ \let\nodeparts=\pgf@sh@boxes
+ \let\inheritsavedanchors=\pgf@sh@inheritsavedanchors
+ \let\inheritanchor=\pgf@sh@inheritanchor
+ \let\inheritanchorborder=\pgf@sh@inheritanchorborder
+ \let\inheritbehindbackgroundpath=\pgf@sh@inheritbehindbgpath
+ \let\inheritbackgroundpath=\pgf@sh@inheritbgpath
+ \let\inheritbeforebackgroundpath=\pgf@sh@inheritbeforebgpath
+ \let\inheritbehindforegroundpath=\pgf@sh@inheritbehindfgpath
+ \let\inheritforegroundpath=\pgf@sh@inheritfgpath
+ \let\inheritbeforeforegroundpath=\pgf@sh@inheritbeforefgpath
+ \let\inheritnodeparts=\pgf@sh@inheritboxes
+ \anchorborder{\csname pgf@anchor@#1@center\endcsname}%
+ \anchor{text}{\pgfpointorigin}%
+ \nodeparts{text}%
+ \expandafter\global\expandafter\let\csname pgf@sh@s@\pgf@sm@shape@name\endcsname=\pgfutil@empty%
+ #2%
+ }%
+}%
+
+\def\pgf@sh@savedanchor#1#2{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@\pgf@sm@shape@name\endcsname{\pgf@sh@resavedanchor{#1}{#2}}}%
+\def\pgf@sh@saveddimen#1#2{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@\pgf@sm@shape@name\endcsname{\pgf@sh@resaveddimen{#1}{#2}}}%
+ \def\pgf@sh@savedmacro#1#2{% MW
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@\pgf@sm@shape@name\endcsname{\pgf@sh@resavedmacro{#1}{#2}}}% MW
+\def\pgf@sh@anchor#1#2{\expandafter\gdef\csname pgf@anchor@\pgf@sm@shape@name @#1\endcsname{#2}}%
+\def\pgf@sh@deferredanchor#1#2{% CJ
+ \expandafter\pgfutil@g@addto@macro
+ \csname pgf@sh@s@\pgf@sm@shape@name\endcsname{\pgf@sh@redeferredanchor{#1}{#2}}}% CJ
+\def\pgf@sh@anchorborder#1{\expandafter\gdef\csname pgf@anchor@\pgf@sm@shape@name @border\endcsname##1{\pgf@process{##1}#1}}%
+\long\def\pgf@sh@behindbgpath#1{\expandafter\gdef\csname pgf@sh@bbg@\pgf@sm@shape@name\endcsname{#1}}%
+\long\def\pgf@sh@bgpath#1{\expandafter\gdef\csname pgf@sh@bg@\pgf@sm@shape@name\endcsname{#1}}%
+\long\def\pgf@sh@beforebgpath#1{\expandafter\gdef\csname pgf@sh@fbg@\pgf@sm@shape@name\endcsname{#1}}%
+\long\def\pgf@sh@behindfgpath#1{\expandafter\gdef\csname pgf@sh@bfg@\pgf@sm@shape@name\endcsname{#1}}%
+\long\def\pgf@sh@fgpath#1{\expandafter\gdef\csname pgf@sh@fg@\pgf@sm@shape@name\endcsname{#1}}%
+\long\def\pgf@sh@beforefgpath#1{\expandafter\gdef\csname pgf@sh@ffg@\pgf@sm@shape@name\endcsname{#1}}%
+\def\pgf@sh@boxes#1{\expandafter\gdef\csname pgf@sh@boxes@\pgf@sm@shape@name\endcsname{#1}}%
+
+\def\pgf@sh@inheritsavedanchors[from=#1]{%
+ \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@\pgf@sm@shape@name\endcsname{\csname pgf@sh@s@#1\endcsname}}%
+
+\def\pgf@sh@inheritanchor[from=#1]#2{%
+ \edef\pgf@marshal{\global\let\expandafter\noexpand\csname
+ pgf@anchor@\pgf@sm@shape@name @#2\endcsname=\expandafter\noexpand\csname
+ pgf@anchor@#1@#2\endcsname}%
+ \pgf@marshal%
+}%
+\def\pgf@sh@inheritanchorborder[from=#1]{%
+ \edef\pgf@marshal{\global\let\expandafter\noexpand\csname
+ pgf@anchor@\pgf@sm@shape@name @border\endcsname=\expandafter\noexpand\csname
+ pgf@anchor@#1@border\endcsname}%
+ \pgf@marshal%
+}%
+\def\pgf@sh@inheritor#1#2{%
+ \edef\pgf@marshal{\global\let\expandafter\noexpand\csname
+ pgf@sh@#1@\pgf@sm@shape@name\endcsname=\expandafter\noexpand\csname
+ pgf@sh@#1@#2\endcsname}%
+ \pgf@marshal%
+}%
+\def\pgf@sh@inheritbehindbgpath[from=#1]{\pgf@sh@inheritor{bbg}{#1}}%
+\def\pgf@sh@inheritbgpath[from=#1]{\pgf@sh@inheritor{bg}{#1}}%
+\def\pgf@sh@inheritbeforebgpath[from=#1]{\pgf@sh@inheritor{fbg}{#1}}%
+\def\pgf@sh@inheritbehindfgpath[from=#1]{\pgf@sh@inheritor{bfg}{#1}}%
+\def\pgf@sh@inheritfgpath[from=#1]{\pgf@sh@inheritor{fg}{#1}}%
+\def\pgf@sh@inheritbeforefgpath[from=#1]{\pgf@sh@inheritor{ffg}{#1}}%
+\def\pgf@sh@inheritboxes[from=#1]{\pgf@sh@inheritor{boxes}{#1}}%
+
+
+
+%
+% Coordinate. This shape is special: It is only used to reference a
+% point for later usage. Nothing is drawn, all anchors are identical
+% to the center.
+%
+
+\pgfdeclareshape{coordinate}
+{%
+ \savedanchor\centerpoint{%
+ % x
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ % y
+ \pgf@y=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by -.5\dp\pgfnodeparttextbox%
+ }%
+
+ \anchor{center}{\centerpoint}%
+ \anchor{north}{\centerpoint}%
+ \anchor{north west}{\centerpoint}%
+ \anchor{north east}{\centerpoint}%
+ \anchor{center}{\centerpoint}%
+ \anchor{west}{\centerpoint}%
+ \anchor{east}{\centerpoint}%
+ \anchor{mid}{\centerpoint}%
+ \anchor{mid west}{\centerpoint}%
+ \anchor{mid east}{\centerpoint}%
+ \anchor{base}{\centerpoint}%
+ \anchor{base west}{\centerpoint}%
+ \anchor{base east}{\centerpoint}%
+ \anchor{south}{\centerpoint}%
+ \anchor{south west}{\centerpoint}%
+ \anchor{south east}{\centerpoint}%
+ \anchorborder{\centerpoint}%
+
+ \nodeparts{}% no text
+}%
+
+
+% Value keys for shapes:
+%
+% /pgf/inner xsep : recommended inner x separation
+% /pgf/inner ysep : recommended inner y separation
+% /pgf/outer xsep : recommended outer x separation
+% /pgf/outer ysep : recommended outer y separation
+% /pgf/minimum width : recommended minimum width
+% /pgf/minimum height : recommended minimum height
+
+\pgfset{
+ inner xsep/.initial =.3333em,
+ inner ysep/.initial =.3333em,
+ inner sep/.style ={/pgf/inner xsep=#1,/pgf/inner ysep=#1},
+ outer xsep/.initial =.5\pgflinewidth,
+ outer ysep/.initial =.5\pgflinewidth,
+ outer sep/.code =\pgf@handle@outer@sep{#1},
+ minimum width/.initial =1pt,
+ minimum height/.initial =1pt,
+ minimum size/.style ={/pgf/minimum width=#1,/pgf/minimum height=#1},
+}%
+
+
+
+\def\pgf@handle@outer@sep#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgf@auto@text%
+ \def\pgf@outer@adjust@hook{%
+ \pgftransformationadjustments%
+ \pgfkeyssetvalue{/pgf/outer xsep}{.5\pgflinewidth*\pgfhorizontaltransformationadjustment}%
+ \pgfkeyssetvalue{/pgf/outer ysep}{.5\pgflinewidth*\pgfverticaltransformationadjustment}%
+ \pgf@outer@auto@adjust@hook%
+ }%
+ \else%
+ \pgfkeyssetvalue{/pgf/outer xsep}{#1}%
+ \pgfkeyssetvalue{/pgf/outer ysep}{#1}%
+ \fi%
+}%
+\def\pgf@auto@text{auto}%
+
+\let\pgf@outer@auto@adjust@hook\relax
+
+
+% Keys for rotating the shape border.
+% (may not be supported by all shapes)
+%
+% /pgf/shape border uses incircle : Calculate the shape border using the incircle
+% around the node contents (+inner sep).
+%
+% /pgf/shape border rotate : Angle of independent border rotation.
+
+\newif\ifpgfshapeborderusesincircle
+\pgfkeys{/pgf/shape border uses incircle/.is if=pgfshapeborderusesincircle}%
+\pgfkeys{/pgf/shape border rotate/.initial=0}%
+
+%
+% Rectangle
+%
+
+\pgfdeclareshape{rectangle}
+{%
+ \savedanchor\northeast{%
+ % Calculate x
+ %
+ % First, is width < minimum width?
+ \pgf@x=\the\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x by 2\pgf@xc%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<\pgf@xb%
+ % yes, too small. Enlarge...
+ \pgf@x=\pgf@xb%
+ \fi%
+ % Now, calculate right border: .5\wd\pgfnodeparttextbox + .5 \pgf@x + outer sep
+ \pgf@x=.5\pgf@x%
+ \advance\pgf@x by.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \advance\pgf@x by\pgf@xa%
+ % Calculate y
+ %
+ % First, is height+depth < minimum height?
+ \pgf@y=\ht\pgfnodeparttextbox%
+ \advance\pgf@y by\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y by 2\pgf@yc%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<\pgf@yb%
+ % yes, too small. Enlarge...
+ \pgf@y=\pgf@yb%
+ \fi%
+ % Now, calculate upper border: .5\ht-.5\dp + .5 \pgf@y + outer sep
+ \pgf@y=.5\pgf@y%
+ \advance\pgf@y by-.5\dp\pgfnodeparttextbox%
+ \advance\pgf@y by.5\ht\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \advance\pgf@y by\pgf@ya%
+ }%
+
+ \savedanchor\southwest{%
+ % Calculate x
+ %
+ % First, is width < minimum width?
+ \pgf@x=\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@x by 2\pgf@xc%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
+ \ifdim\pgf@x<\pgf@xb%
+ % yes, too small. Enlarge...
+ \pgf@x=\pgf@xb%
+ \fi%
+ % Now, calculate left border: .5\wd\pgfnodeparttextbox - .5 \pgf@x - outer sep
+ \pgf@x=-.5\pgf@x%
+ \advance\pgf@x by.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \advance\pgf@x by-\pgf@xa%
+ % Calculate y
+ %
+ % First, is height+depth < minimum height?
+ \pgf@y=\ht\pgfnodeparttextbox%
+ \advance\pgf@y by\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@y by 2\pgf@yc%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@y<\pgf@yb%
+ % yes, too small. Enlarge...
+ \pgf@y=\pgf@yb%
+ \fi%
+ % Now, calculate upper border: .5\ht-.5\dp - .5 \pgf@y - outer sep
+ \pgf@y=-.5\pgf@y%
+ \advance\pgf@y by-.5\dp\pgfnodeparttextbox%
+ \advance\pgf@y by.5\ht\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \advance\pgf@y by-\pgf@ya%
+ }%
+
+ %
+ % Anchors
+ %
+ \anchor{center}{
+ \pgf@process{\northeast}%
+ \pgf@xa=.5\pgf@x%
+ \pgf@ya=.5\pgf@y%
+ \pgf@process{\southwest}%
+ \pgf@x=.5\pgf@x%
+ \pgf@y=.5\pgf@y%
+ \advance\pgf@x by \pgf@xa%
+ \advance\pgf@y by \pgf@ya%
+ }%
+ \anchor{mid}{\pgf@anchor@rectangle@center\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base}{\pgf@anchor@rectangle@center\pgf@y=0pt}%
+ \anchor{north}{
+ \pgf@process{\southwest}%
+ \pgf@xa=.5\pgf@x%
+ \pgf@process{\northeast}%
+ \pgf@x=.5\pgf@x%
+ \advance\pgf@x by \pgf@xa%
+ }%
+ \anchor{south}{
+ \pgf@process{\northeast}%
+ \pgf@xa=.5\pgf@x%
+ \pgf@process{\southwest}%
+ \pgf@x=.5\pgf@x%
+ \advance\pgf@x by \pgf@xa%
+ }%
+ \anchor{west}{
+ \pgf@process{\northeast}%
+ \pgf@ya=.5\pgf@y%
+ \pgf@process{\southwest}%
+ \pgf@y=.5\pgf@y%
+ \advance\pgf@y by \pgf@ya%
+ }%
+ \anchor{mid west}{\southwest\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base west}{\southwest\pgf@y=0pt}%
+ \anchor{north west}{
+ \southwest
+ \pgf@xa=\pgf@x
+ \northeast
+ \pgf@x=\pgf@xa}%
+ \anchor{south west}{\southwest}%
+ \anchor{east}{%
+ \pgf@process{\southwest}%
+ \pgf@ya=.5\pgf@y%
+ \pgf@process{\northeast}%
+ \pgf@y=.5\pgf@y%
+ \advance\pgf@y by \pgf@ya%
+ }%
+ \anchor{mid east}{\northeast\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base east}{\northeast\pgf@y=0pt}%
+ \anchor{north east}{\northeast}%
+ \anchor{south east}{
+ \northeast
+ \pgf@xa=\pgf@x
+ \southwest
+ \pgf@x=\pgf@xa
+ }%
+ \anchorborder{%
+ \pgf@xb=\pgf@x% xb/yb is target
+ \pgf@yb=\pgf@y%
+ \southwest%
+ \pgf@xa=\pgf@x% xa/ya is se
+ \pgf@ya=\pgf@y%
+ \northeast%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \pgf@xc=.5\pgf@x% x/y is half width/height
+ \pgf@yc=.5\pgf@y%
+ \advance\pgf@xa by\pgf@xc% xa/ya becomes center
+ \advance\pgf@ya by\pgf@yc%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpointborderrectangle
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}
+ {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ }%
+ \pgf@process{\pgf@marshal}%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ }%
+
+ %
+ % Background path
+ %
+ \backgroundpath{
+ \pgfpathrectanglecorners
+ {\pgfpointadd{\southwest}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}
+ {\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfkeysvalueof{/pgf/outer xsep}}{\pgfkeysvalueof{/pgf/outer ysep}}}}}
+ }%
+}%
+
+
+% Special current path start coordinate:
+\expandafter\def\csname pgf@sh@ns@current subpath start\endcsname{coordinate}%
+\expandafter\def\csname pgf@sh@np@current subpath start\endcsname{%
+ \def\centerpoint{\expandafter\pgfqpoint\pgfsyssoftpath@lastmoveto}%
+}%
+\expandafter\def\csname pgf@sh@nt@current subpath start\endcsname{{1}{0}{0}{1}{0pt}{0pt}}%
+\expandafter\def\csname pgf@sh@pi@current subpath start\endcsname{\pgfpictureid}%
+
+
+
+% Special current bounding box rectangle:
+\expandafter\def\csname pgf@sh@ns@current bounding box\endcsname{rectangle}%
+\expandafter\def\csname pgf@sh@np@current bounding box\endcsname{%
+ \def\southwest{\pgfqpoint{\pgf@picminx}{\pgf@picminy}}%
+ \def\northeast{\pgfqpoint{\pgf@picmaxx}{\pgf@picmaxy}}%
+}%
+\expandafter\def\csname pgf@sh@nt@current bounding box\endcsname{{1}{0}{0}{1}{0pt}{0pt}}%
+\expandafter\def\csname pgf@sh@pi@current bounding box\endcsname{\pgfpictureid}%
+
+
+% Special current path bounding box rectangle:
+\expandafter\def\csname pgf@sh@ns@current path bounding box\endcsname{rectangle}%
+\expandafter\def\csname pgf@sh@np@current path bounding box\endcsname{%
+ \def\southwest{\pgfqpoint{\pgf@pathminx}{\pgf@pathminy}}%
+ \def\northeast{\pgfqpoint{\pgf@pathmaxx}{\pgf@pathmaxy}}%
+}%
+\expandafter\def\csname pgf@sh@nt@current path bounding box\endcsname{{1}{0}{0}{1}{0pt}{0pt}}%
+\expandafter\def\csname pgf@sh@pi@current path bounding box\endcsname{\pgfpictureid}%
+
+
+% Special current page bounding box rectangle:
+\expandafter\def\csname pgf@sh@ns@current page\endcsname{rectangle}%
+\expandafter\def\csname pgf@sh@np@current page\endcsname{%
+ \def\southwest{\pgfpointorigin}%
+ \def\northeast{\pgfpoint{\pgfsys@thepagewidth}{\pgfsys@thepageheight}}%
+}%
+\expandafter\def\csname pgf@sh@nt@current page\endcsname{{1}{0}{0}{1}{0pt}{0pt}}%
+\expandafter\def\csname pgf@sh@pi@current page\endcsname{pgfpageorigin}%
+
+
+% Special scope bounding box rectangle:
+\pgfkeys{/pgf/local bounding box/.code={%
+ \expandafter\gdef\csname pgf@sh@ns@#1\endcsname{rectangle}
+ \expandafter\gdef\csname pgf@sh@np@#1\endcsname{%
+ \def\southwest{\pgfqpoint{\csname pgf@lbb@minx@#1\endcsname}{\csname pgf@lbb@miny@#1\endcsname}}%
+ \def\northeast{\pgfqpoint{\csname pgf@lbb@maxx@#1\endcsname}{\csname pgf@lbb@maxy@#1\endcsname}}%
+ }
+ \expandafter\gdef\csname pgf@sh@nt@#1\endcsname{{1}{0}{0}{1}{0pt}{0pt}}
+ \expandafter\gdef\csname pgf@sh@pi@#1\endcsname{\pgfpictureid}
+ \expandafter\gdef\csname pgf@lbb@maxx@#1\endcsname{-16000pt}%
+ \expandafter\gdef\csname pgf@lbb@minx@#1\endcsname{16000pt}%
+ \expandafter\gdef\csname pgf@lbb@maxy@#1\endcsname{-16000pt}%
+ \expandafter\gdef\csname pgf@lbb@miny@#1\endcsname{16000pt}%
+ \pgf@size@hookedtrue%
+ \expandafter\def\expandafter\pgf@path@size@hook\expandafter{\pgf@path@size@hook\pgf@lbb@do{#1}}
+ },
+ /pgf/freeze local bounding box/.code={%
+ {%
+ \csname pgf@sh@np@#1\endcsname%
+ \southwest%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \northeast%
+ \expandafter\xdef\csname pgf@sh@np@#1\endcsname{%
+ \noexpand\def\noexpand\southwest{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \noexpand\def\noexpand\northeast{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ }%
+ }%
+ },
+}%
+\def\pgf@lbb@do#1{%
+ \ifdim\pgf@size@hook@x<\csname pgf@lbb@minx@#1\endcsname\expandafter\xdef\csname pgf@lbb@minx@#1\endcsname{\the\pgf@size@hook@x}\fi%
+ \ifdim\pgf@size@hook@x>\csname pgf@lbb@maxx@#1\endcsname\expandafter\xdef\csname pgf@lbb@maxx@#1\endcsname{\the\pgf@size@hook@x}\fi%
+ \ifdim\pgf@size@hook@y<\csname pgf@lbb@miny@#1\endcsname\expandafter\xdef\csname pgf@lbb@miny@#1\endcsname{\the\pgf@size@hook@y}\fi%
+ \ifdim\pgf@size@hook@y>\csname pgf@lbb@maxy@#1\endcsname\expandafter\xdef\csname pgf@lbb@maxy@#1\endcsname{\the\pgf@size@hook@y}\fi%
+}%
+
+%
+% Circle
+%
+
+\pgfdeclareshape{circle}
+%
+% Draws a circle around the text
+%
+{%
+ \savedanchor\centerpoint{%
+ \pgf@x=.5\wd\pgfnodeparttextbox%
+ \pgf@y=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@y by-.5\dp\pgfnodeparttextbox%
+ }%
+
+ \saveddimen\radius{%
+ %
+ % Calculate ``height radius''
+ %
+ \pgf@ya=.5\ht\pgfnodeparttextbox%
+ \advance\pgf@ya by.5\dp\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/inner ysep}}%
+ \advance\pgf@ya by\pgf@yb%
+ %
+ % Calculate ``width radius''
+ %
+ \pgf@xa=.5\wd\pgfnodeparttextbox%
+ \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/inner xsep}}%
+ \advance\pgf@xa by\pgf@xb%
+ %
+ % Calculate length of radius vector:
+ %
+ \pgf@process{\pgfpointnormalised{\pgfqpoint{\pgf@xa}{\pgf@ya}}}%
+ \ifdim\pgf@x>\pgf@y%
+ \c@pgf@counta=\pgf@x%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \divide\c@pgf@counta by 255\relax%
+ \pgf@xa=16\pgf@xa\relax%
+ \divide\pgf@xa by\c@pgf@counta%
+ \pgf@xa=16\pgf@xa\relax%
+ \fi%
+ \else%
+ \c@pgf@counta=\pgf@y%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \divide\c@pgf@counta by 255\relax%
+ \pgf@ya=16\pgf@ya\relax%
+ \divide\pgf@ya by\c@pgf@counta%
+ \pgf@xa=16\pgf@ya\relax%
+ \fi%
+ \fi%
+ \pgf@x=\pgf@xa%
+ %
+ % If necessary, adjust radius so that the size requirements are
+ % met:
+ %
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/minimum width}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/minimum height}}%
+ \ifdim\pgf@x<.5\pgf@xb%
+ \pgf@x=.5\pgf@xb%
+ \fi%
+ \ifdim\pgf@x<.5\pgf@yb%
+ \pgf@x=.5\pgf@yb%
+ \fi%
+ %
+ % Now, add larger of outer separations.
+ %
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgf@x by\pgf@yb%
+ \else%
+ \advance\pgf@x by\pgf@xb%
+ \fi%
+ }%
+
+ %
+ % Anchors
+ %
+ \anchor{center}{\centerpoint}%
+ \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base}{\centerpoint\pgf@y=0pt}%
+ \anchor{north}{\centerpoint\advance\pgf@y by\radius}%
+ \anchor{south}{\centerpoint\advance\pgf@y by-\radius}%
+ \anchor{west}{\centerpoint\advance\pgf@x by-\radius}%
+ \anchor{east}{\centerpoint\advance\pgf@x by\radius}%
+ \anchor{mid west}{\centerpoint\advance\pgf@x by-\radius\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{mid east}{\centerpoint\advance\pgf@x by\radius\pgfmathsetlength\pgf@y{.5ex}}%
+ \anchor{base west}{\centerpoint\advance\pgf@x by-\radius\pgf@y=0pt}%
+ \anchor{base east}{\centerpoint\advance\pgf@x by\radius\pgf@y=0pt}%
+ \anchor{north west}{
+ \centerpoint
+ \pgf@xa=\radius
+ \advance\pgf@x by-0.707107\pgf@xa
+ \advance\pgf@y by0.707107\pgf@xa
+ }%
+ \anchor{south west}{
+ \centerpoint
+ \pgf@xa=\radius
+ \advance\pgf@x by-0.707107\pgf@xa
+ \advance\pgf@y by-0.707107\pgf@xa
+ }%
+ \anchor{north east}{
+ \centerpoint
+ \pgf@xa=\radius
+ \advance\pgf@x by0.707107\pgf@xa
+ \advance\pgf@y by0.707107\pgf@xa
+ }%
+ \anchor{south east}{
+ \centerpoint
+ \pgf@xa=\radius
+ \advance\pgf@x by0.707107\pgf@xa
+ \advance\pgf@y by-0.707107\pgf@xa
+ }%
+ \anchorborder{
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \edef\pgf@marshal{%
+ \noexpand\pgfpointborderellipse
+ {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}
+ {\noexpand\pgfqpoint{\radius}{\radius}}%
+ }%
+ \pgf@marshal%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \centerpoint%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@y by\pgf@ya%
+ }%
+
+ %
+ % Background path
+ %
+ \backgroundpath{%
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ \pgfpathcircle{\centerpoint}{\pgfutil@tempdima}%
+ }%
+}%
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmodulesnakes.code.tex b/graphics/pgf/base/tex/pgfmodulesnakes.code.tex
new file mode 100644
index 0000000000..9df6d30980
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmodulesnakes.code.tex
@@ -0,0 +1,369 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmodulesnakes.code.tex}
+
+\pgfwarning{Snakes have been superseded by decorations. Use the module decorations instead of snakes}
+
+\usepgfmodule{decorations}%
+
+\endinput
+
+
+
+\newdimen\pgfsnakeremainingdistance
+\newdimen\pgfsnakecompleteddistance
+
+
+% Creates a new pgf snake
+%
+% #1 = snake name
+% #1 = initial state
+% #3 = states of the snake
+%
+%
+% This command declares a new snake for later use. The second
+% parameter specifies the states of the snake, see also the
+% description of pgfpathsnake.
+%
+% Inside the code of #3 the command \state may be used. This command
+% will only be defined while #3 is executed.
+%
+% Example:
+%
+% \pgfdeclaresnake{zig zag}{one zig zag}
+% {
+% \state{one zig zag}[width=10pt]
+% {
+% \pgfpathlineto{\pgfpoint{2.5pt}{2.5pt}}
+% \pgfpathlineto{\pgfpoint{7.5pt}{-2.5pt}}
+% \pgfpathlineto{\pgfpoint{10pt}{0pt}}
+% }
+% \state{final}
+% {
+% \pgfpathlineto{\pgfpoint{\pgfsnakeremainingdistance}{0pt}}
+% }
+% }
+
+\long\def\pgfdeclaresnake#1#2#3{%
+ \def\pgf@snake@name{#1}%
+ \pgfutil@namedef{pgf@snake@@#1@initial}{#2}%
+ \let\pgf@orig@state=\state%
+ \let\state=\pgf@snake@state
+ #3
+ \let\state=\pgf@orig@state%
+}%
+
+
+% Sets the additional transformation applied to every segment of a snake
+%
+% #1 = transformation
+%
+% Example:
+%
+% \pgfsetsnakesegmenttransformation{\pgftransformyshift{5pt}}
+
+\def\pgfsetsnakesegmenttransformation#1{\def\pgf@snakeadditionaltransform{#1}}%
+\pgfsetsnakesegmenttransformation{}%
+
+
+% Declares a new state
+%
+% #1 = state name
+% #2 = options
+% #3 = path element
+%
+% Description:
+%
+% When a snake is drawn and the current state is #1, the following
+% happens. First, the options are executed, which will possible change
+% the state. If that does not happen, the path element is added to the
+% path and the coordinate system is translated by the path element's
+% width (which is specified using the width option).
+%
+% Example:
+%
+% \state{initial}[width=10pt]
+% {
+% \pgfpathlineto{\pgfpoint{2.5pt}{2.5pt}}
+% \pgfpathlineto{\pgfpoint{7.5pt}{-2.5pt}}
+% \pgfpathlineto{\pgfpoint{10pt}{0pt}}
+% }
+
+\def\pgf@snake@state#1{\pgfutil@ifnextchar[{\pgf@@snake@start#1}{\pgf@@snake@start#1[]}}%}%
+\def\pgf@@snake@start#1[#2]#3{%
+ \pgfutil@namedef{pgf@snake@@\pgf@snake@name @#1@options}{#2}%
+ \pgfutil@namedef{pgf@snake@@\pgf@snake@name @#1@code}{#3}%
+}%
+
+
+
+% Use multiple snakes
+%
+% #1 = list of snake names/length pairs
+% #2 = point to which the snake leads
+%
+% This operation uses the snakes in parameter #1 to get to the point
+% #4. The parameter #1 should contain pairs consisting of a snake name
+% and a length for which this snake should be used. When the length is
+% computed, the dimensions \pgfsnakeremainingdistance and
+% \pgfsnakecompleteddistance will have been set to the length of the
+% total distance to #2 that has already been covered/that still needs
+% to be covered.
+%
+% Example:
+%
+% \pgfpathsnakesto{{lineto}{1cm},{zig zag}{\pgfsnakeremainingdistance}}{\pgfpoint{2cm}{3cm}}
+
+\def\pgfpathsnakesto#1#2{%
+ \begingroup%
+ % compute target vector
+ \pgfpointtransformed{#2}%
+ \advance\pgf@x by-\pgf@path@lastx%
+ \advance\pgf@y by-\pgf@path@lasty%
+ %
+ % MW: Calculate the angle of the snake.
+ %
+ \edef\pgf@marshal{%
+ \noexpand\pgfmathanglebetweenpoints{\noexpand\pgfpointorigin}{%
+ \noexpand\pgf@x\the\pgf@x\noexpand\pgf@y\the\pgf@y}%
+ }%
+ \pgf@marshal%
+ \let\pgfsnakeangle\pgfmathresult%
+ %
+ % MW: Use this instead for length (?). More accurate and only a few operations slower.
+ %
+ \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
+ \pgfsnakeremainingdistance\pgfmathresult pt\relax%
+ %
+ % Ok, now normalize the vector...
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointnormalised{}}%
+ % ok, now computer length (arghh...)
+ % In theory that's easy: divide the larger of the values x or y by
+ % the normalized x or y. Well...
+ %
+ % First, make xa and ya positive:
+ % \ifdim\pgf@xa<0pt%
+% \pgf@xa=-\pgf@xa%
+% \fi%
+% \ifdim\pgf@ya<0pt%
+% \pgf@ya=-\pgf@ya%
+% \fi%
+% % Now do division:
+% \ifdim\pgf@xa>\pgf@ya%
+% \c@pgf@counta=\pgf@x%
+% \ifnum\c@pgf@counta=0\relax%
+% \else%
+% \divide\c@pgf@counta by 255\relax%
+% \pgf@xa=16\pgf@xa\relax%
+% \divide\pgf@xa by\c@pgf@counta%
+% \pgf@xa=16\pgf@xa\relax%
+% \fi%
+% \else%
+% \c@pgf@counta=\pgf@y%
+% \ifnum\c@pgf@counta=0\relax%
+% \else%
+% \divide\c@pgf@counta by 255\relax%
+% \pgf@ya=16\pgf@ya\relax%
+% \divide\pgf@ya by\c@pgf@counta%
+% \pgf@xa=16\pgf@ya\relax%
+% \fi%
+% \fi%
+% % Make positive:
+% \ifdim\pgf@xa<0pt%
+% \pgf@xa=-\pgf@xa%
+% \fi%
+% % Ok, now we draw things...
+ \edef\pgf@list{#1}%
+% \pgfsnakeremainingdistance=\pgf@xa%
+ \pgfsnakecompleteddistance=0pt%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgfutil@for\pgf@temp:=\pgf@list\do{%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \expandafter\pgf@snake@invoke\pgf@temp%
+ \fi%
+ }%
+ \endgroup%
+}%
+
+\def\pgf@snake@invoke#1#2{%
+ \pgfmathsetlength\pgf@xa{#2}%
+ {%
+ \edef\pgf@marshal{\noexpand\pgfpathsnakealongvector{#1}{\the\pgf@xa}{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}}%
+ \pgf@marshal%
+ }%
+ \advance\pgfsnakecompleteddistance by\pgf@xa%
+ \advance\pgfsnakeremainingdistance by-\pgf@xa%
+}%
+
+% Use a snake
+%
+% #1 = snake name
+% #2 = point to which the snake leads
+%
+% This operation mainly computes \pgfpathsnakealongvector for a vector
+% appropriately chosen. See \pgfpathsnakealongvector for details.
+%
+% Example:
+%
+% \pgfpathsnaketo{zig zag}{\pgfpoint{2cm}{3cm}}
+
+\def\pgfpathsnaketo#1#2{\pgfpathsnakesto{{#1}{\pgfsnakeremainingdistance}}{#2}}%
+
+
+
+% Use a snake
+%
+% #1 = snake name
+% #2 = length of the snake
+% #3 = vector along which the snake grows, should have unit length.
+%
+% This command draws a snake (more precisely, it adds a snake to the
+% path). This works as follows:
+%
+% First, the coordinate system is transformed such that the vector #3
+% points to the right.
+%
+% Next, the state `initial' of the snake is entered. Unless the
+% options of this state cause it to switch to another state, the path
+% element is added to the path. Then, the coordinate system is
+% translated by the width of the path element as specified in the
+% width option of the path element. The dimensions
+% \pgfsnakeremainingdistance and \pgfsnakecompleteddistance are
+% updated.
+%
+% The process ends when the state `final' is entered. The code of the
+% final state is executed and the process stops.
+%
+% Example:
+%
+% \pgfpathsnakealongvector{zig zag}{100pt}{\pgfpolar{30}{1pt}}
+
+\def\pgfpathsnakealongvector#1#2#3{%
+ \pgfutil@ifundefined{pgf@snake@@#1@initial}{\pgferror{Undefined snake ``#1''}}
+ {
+ \begingroup% keep things local
+ \pgftransformreset%
+ \pgf@pt@x=\pgf@path@lastx% evil trickery to transform to the last point
+ \pgf@pt@y=\pgf@path@lasty%
+ \pgf@process{#3}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@xb=-\pgf@y%
+ \pgf@yb=\pgf@x%
+ \pgftransformcm
+ {\pgf@sys@tonumber{\pgf@xa}}{\pgf@sys@tonumber{\pgf@ya}}
+ {\pgf@sys@tonumber{\pgf@xb}}{\pgf@sys@tonumber{\pgf@yb}}
+ {\pgfpointorigin}%
+ % Now, setup the automaton
+ \expandafter\let\expandafter\pgf@snake@current@state\expandafter=\csname pgf@snake@@#1@initial\endcsname%
+ \def\pgf@snake@name{#1}%
+ \pgfsnakecompleteddistance=0pt%
+ \pgfmathsetlength\pgfsnakeremainingdistance{#2}%
+ \pgf@snake@run%
+ % Last step:
+ {%
+ \pgftransformxshift{\pgfsnakecompleteddistance}%
+ \pgf@snakeadditionaltransform%
+ \csname pgf@snake@@#1@final@code\endcsname%
+ }%
+ \endgroup%
+ }%
+}%
+
+\def\pgf@final@text{final}%
+
+\def\pgf@snake@run{%
+ \let\pgf@snake@next=\pgf@snake@do@state%
+ \ifx\pgf@snake@current@state\pgf@final@text%
+ \let\pgf@snake@next=\relax%
+ \fi%
+ \pgf@snake@next%
+}%
+
+\def\pgf@snake@do@state{%
+ \let\pgf@snake@next=\relax%
+ \let\pgf@snake@next@state=\pgf@snake@current@state%
+ % execute options
+ \expandafter\expandafter\expandafter\pgf@snakes@setter
+ \expandafter\expandafter\expandafter{\csname pgf@snake@@\pgf@snake@name @\pgf@snake@current@state @options\endcsname}%
+ \ifx\pgf@snake@next\relax%
+ \let\pgf@snake@next=\pgf@snake@do@code%
+ \fi%
+ \pgf@snake@next%
+}%
+\def\pgf@snakes@setter{%
+ \pgfqkeys{/pgf/snakes}%
+}%
+
+\def\pgf@snake@do@code{%
+ % Ok, execute code:
+ {%
+ \pgftransformxshift{\pgfsnakecompleteddistance}%
+ \pgf@snakeadditionaltransform%
+ \csname pgf@snake@@\pgf@snake@name @\pgf@snake@current@state @code\endcsname%
+ }%
+ % next, do transformation and update
+ \pgfmathsetlength{\pgf@xa}{\pgf@snake@width}%
+ \advance\pgfsnakeremainingdistance by-\pgf@xa%
+ \advance\pgfsnakecompleteddistance by\pgf@xa%
+ % Next iteration:
+ \let\pgf@snake@current@state=\pgf@snake@next@state%
+ \pgf@snake@run%
+}%
+
+\pgfkeys{
+ /pgf/snakes/width/.code=\def\pgf@snake@width{#1}\pgf@snake@switch@if#1 to final\pgf@stop,%
+ /pgf/snakes/switch if less than/.code=\pgf@snake@switch@if#1\pgf@stop,%
+ /pgf/snakes/next state/.store in=\pgf@snake@next@state%
+}%
+
+\def\pgf@snake@switch@if#1to #2\pgf@stop{%
+ \ifx\pgf@snake@next\relax%
+ \pgfmathsetlength\pgf@x{#1}%
+ \ifdim\pgfsnakeremainingdistance<\pgf@x%
+ \def\pgf@snake@current@state{#2}%
+ \let\pgf@snake@next=\pgf@snake@run%
+ \fi%
+ \fi%
+}%
+
+
+
+% lineto snake
+%
+% This snake simply adds a straight line. This snake is mainly useful
+% in conjunction with other snakes.
+
+\pgfdeclaresnake{lineto}{final}
+{%
+ \state{final}
+ { \pgfpathlineto{\pgfqpoint{\pgfsnakeremainingdistance}{0pt}} }
+}%
+
+
+
+% moveto snake
+%
+% This snake simply jumps to the end. This snake, too, is mainly
+% useful in conjunction with other snakes.
+
+\pgfdeclaresnake{moveto}{final}
+{%
+ \state{final}
+ { \pgfpathmoveto{\pgfqpoint{\pgfsnakeremainingdistance}{0pt}} }
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfmodulesorting.code.tex b/graphics/pgf/base/tex/pgfmodulesorting.code.tex
new file mode 100644
index 0000000000..e22bdb0991
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfmodulesorting.code.tex
@@ -0,0 +1,69 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfmodulesorting.code.tex}
+
+%
+% This file defines commands for sorting data. This is useful for 3d plots,
+% but also for drawing things in the correct order.
+%
+
+
+\newcount\pgfsortingbuckets
+
+
+% Init the sorting
+%
+% #1 = number of buckets
+%
+% Description:
+%
+% This macro inits a sorting. At any time there can be only one active
+% sorting. When you init the sorting, #1 should be a number of
+% buckets. You can then call \pgfsortinginsert to insert code into the
+% buckets. Once you are done, calling \pgfsortingexecute will execute
+% first the code in buckets 0, then the code in bucket 1, and so on to
+% bucket number #1-1.
+%
+\def\pgfsortinginit#1{
+ \pgfsortingbuckets#1\relax%
+ \c@pgf@counta=0\relax
+ \pgfutil@loop
+ \ifnum\c@pgf@counta<\c@pgf@countb\relax%
+ \expandafter\global\expandafter\let\csname pgf@sort@\the\c@pgf@counta\endcsname\pgfutil@empty%
+ \advance\c@pgf@counta by1\relax%
+ \pgfutil@repeat
+}%
+
+% Insert code into some bucket
+%
+% #1 = the bucket
+% #2 = the code
+%
+\def\pgfsortinginsert#1#2{
+ \expandafter\let\expandafter\pgf@temp\csname pgf@lib@sort@#1\endcsname%
+ \expandafter\def\expandafter\pgf@temp\expandafter{\pgf@temp#2}%
+ \expandafter\global\expandafter\let\csname pgf@lib@sort@\the\c@pgf@counta\endcsname\pgf@temp%
+}%
+
+
+% After all code has been inserted into the buckets, you can call
+% this method to execute the code in the order of the buckets.
+\def\pgfsortingexecute{
+ \c@pgf@countb=\pgfoovalueof{buckets}\relax
+ \c@pgf@counta=0\relax
+ \pgfutil@loop
+ \ifnum\c@pgf@counta<\c@pgf@countb\relax%
+ \csname pgf@lib@sort@\the\c@pgf@counta\endcsname%
+ \advance\c@pgf@counta by1\relax%
+ \pgfutil@repeat
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfnodes.sty b/graphics/pgf/base/tex/pgfnodes.sty
new file mode 100644
index 0000000000..33a7686796
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfnodes.sty
@@ -0,0 +1,19 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfnodes.sty}
+
+\RequirePackage{pgf}
+
+\PackageWarning{pgfnodes}{This package is obsolete. pgf.sty will load
+ node management automatically}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfpages.sty b/graphics/pgf/base/tex/pgfpages.sty
new file mode 100644
index 0000000000..c652a2621b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfpages.sty
@@ -0,0 +1,1139 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesPackage{pgfpages}[2011/01/05 ver 0.02]
+
+\RequirePackage{pgfcore,calc}
+
+\newcount\pgf@logicalpages
+\newcount\pgf@firstshipout
+\newcount\pgf@lastshipout
+\newcount\pgf@currentshipout
+\newcount\pgf@cpn
+\newcount\pgf@shipoutnextto
+\newdimen\pgfphysicalheight
+\newdimen\pgfphysicalwidth
+
+\pgf@shipoutnextto=0\relax
+\pgf@logicalpages=0\relax
+\pgf@firstshipout=1\relax
+\pgf@lastshipout=1\relax
+\pgf@currentshipout=1\relax
+\pgfphysicalheight=\paperheight
+\pgfphysicalwidth=\paperwidth
+
+\newif\ifpgfphysicalpageempty
+\newif\ifpgf@holdingphysicalpage
+
+\pgfphysicalpageemptytrue
+\pgf@holdingphysicalpagefalse
+
+
+% Define a layout
+%
+% #1 = layout name
+% #2 = code before options have been set
+% #2 = code after options have been set
+%
+% Example:
+%
+% \pgfpagesdeclarelayout{resize to}{
+% \pgfpagesphysicalpageoptions{logical pages=1,physical height=\pgfpageoptionheight,physical width=\pgfpageoptionwidth}
+% \pgfpageslogicalpageoptions{1}{resized width=\pgfphysicalwidth,%
+% resized height=\pgfphysicalheight,center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}}}
+
+\newcommand\pgfpagesdeclarelayout[3]{
+ \expandafter\newcommand\csname pgfpages@layoutbefore@#1\endcsname{#2}
+ \expandafter\newcommand\csname pgfpages@layout@#1\endcsname{#3}}
+
+
+% Use a layout
+%
+% #1 = layout name
+% #2 = options
+%
+% Example:
+%
+% \pgfpagesuselayout{resize to}[a4paper]
+
+\def\pgfpagesuselayout#1{\pgfutil@ifnextchar[{\pgf@pagelayout{#1}}{\pgf@pagelayout{#1}[]}}
+\def\pgf@pagelayout#1[#2]{
+ \csname pgfpages@layoutbefore@#1\endcsname
+ \setkeys{pgfpagesuselayoutoption}{#2}
+ \pgfutil@ifundefined{pgfpages@layout@#1}{
+ \PackageError{pgfpages}{Page layout `#1' undefined.}{}
+ }
+ {
+ \csname pgfpages@layout@#1\endcsname
+ }
+}
+
+
+% Predefined options
+
+\define@key{pgfpagesuselayoutoption}{physical paper width}%
+{\def\pgfpageoptionwidth{#1}}
+
+\define@key{pgfpagesuselayoutoption}{physical paper height}%
+{\def\pgfpageoptionheight{#1}}
+
+\define@key{pgfpagesuselayoutoption}{a0paper}[]%
+{\def\pgfpageoptionheight{1189mm} \def\pgfpageoptionwidth{841mm}}
+
+\define@key{pgfpagesuselayoutoption}{a1paper}[]%
+{\def\pgfpageoptionheight{841mm} \def\pgfpageoptionwidth{594mm}}
+
+\define@key{pgfpagesuselayoutoption}{a2paper}[]%
+{\def\pgfpageoptionheight{594mm} \def\pgfpageoptionwidth{420mm}}
+
+\define@key{pgfpagesuselayoutoption}{a3paper}[]%
+{\def\pgfpageoptionheight{420mm} \def\pgfpageoptionwidth{297mm}}
+
+\define@key{pgfpagesuselayoutoption}{a4paper}[]%
+{\def\pgfpageoptionheight{297mm} \def\pgfpageoptionwidth{210mm}}
+
+\define@key{pgfpagesuselayoutoption}{a5paper}[]%
+{\def\pgfpageoptionheight{210mm} \def\pgfpageoptionwidth{148mm}}
+
+\define@key{pgfpagesuselayoutoption}{a6paper}[]%
+{\def\pgfpageoptionheight{148mm} \def\pgfpageoptionwidth{105mm}}
+
+\define@key{pgfpagesuselayoutoption}{letterpaper}[]%
+{\def\pgfpageoptionheight{11in} \def\pgfpageoptionwidth{8.5in}}
+
+\define@key{pgfpagesuselayoutoption}{legalpaper}[]%
+{\def\pgfpageoptionheight{14in} \def\pgfpageoptionwidth{8.5in}}
+
+\define@key{pgfpagesuselayoutoption}{executivepaper}[]%
+{\def\pgfpageoptionheight{10.5in}\def\pgfpageoptionwidth{7.25in}}
+
+\define@key{pgfpagesuselayoutoption}{landscape}[]%
+{
+ \let\pgf@temp=\pgfpageoptionwidth
+ \let\pgfpageoptionwidth=\pgfpageoptionheight
+ \let\pgfpageoptionheight=\pgf@temp
+}
+
+\define@key{pgfpagesuselayoutoption}{border shrink}%
+{\def\pgfpageoptionborder{#1}}
+
+\define@key{pgfpagesuselayoutoption}{corner width}%
+{\def\pgfpageoptioncornerwidth{#1}}
+
+\define@key{pgfpagesuselayoutoption}{odd numbered pages right}[]%
+{\def\pgfpageoptionfirstshipout{2}}
+
+\define@key{pgfpagesuselayoutoption}{second right}[]%
+{%
+ \def\pgfpageoptionfirstcenter{\pgfpoint{.5\paperwidth}{.5\paperheight}}%
+ \def\pgfpageoptionsecondcenter{\pgfpoint{1.5\paperwidth}{.5\paperheight}}%
+ \def\pgfpageoptiontwoheight{\paperheight}%
+ \def\pgfpageoptiontwowidth{2\paperwidth}%
+}
+
+\define@key{pgfpagesuselayoutoption}{second left}[]%
+{%
+ \def\pgfpageoptionfirstcenter{\pgfpoint{1.5\paperwidth}{.5\paperheight}}%
+ \def\pgfpageoptionsecondcenter{\pgfpoint{.5\paperwidth}{.5\paperheight}}%
+ \def\pgfpageoptiontwoheight{\paperheight}%
+ \def\pgfpageoptiontwowidth{2\paperwidth}%
+}
+
+\define@key{pgfpagesuselayoutoption}{second top}[]%
+{%
+ \def\pgfpageoptionfirstcenter{\pgfpoint{.5\paperwidth}{.5\paperheight}}%
+ \def\pgfpageoptionsecondcenter{\pgfpoint{.5\paperwidth}{1.5\paperheight}}%
+ \def\pgfpageoptiontwoheight{2\paperheight}%
+ \def\pgfpageoptiontwowidth{\paperwidth}%
+}
+
+\define@key{pgfpagesuselayoutoption}{second bottom}[]%
+{%
+ \def\pgfpageoptionfirstcenter{\pgfpoint{.5\paperwidth}{1.5\paperheight}}%
+ \def\pgfpageoptionsecondcenter{\pgfpoint{.5\paperwidth}{.5\paperheight}}%
+ \def\pgfpageoptiontwoheight{2\paperheight}%
+ \def\pgfpageoptiontwowidth{\paperwidth}%
+}
+
+
+
+% Predefined layouts
+
+\pgfpagesdeclarelayout{rounded corners}
+{
+ \def\pgfpageoptioncornerwidth{10pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=1
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight},%
+ corner width=\pgfpageoptioncornerwidth%
+ }%
+}
+
+\pgfpagesdeclarelayout{resize to}
+{
+ \def\pgfpageoptionborder{0pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=1,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ resized width=\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ border shrink=\pgfpageoptionborder,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+}
+
+\pgfpagesdeclarelayout{two screens with lagging second}
+{}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=2,%
+ physical height=\pgfpageoptiontwoheight,%
+ physical width=\pgfpageoptiontwowidth,%
+ last logical shipout=1,%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ center=\pgfpageoptionfirstcenter,%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ center=\pgfpageoptionsecondcenter,%
+ copy from=1%
+ }%
+}
+
+\pgfpagesdeclarelayout{two screens with optional second}
+{}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=2,%
+ physical height=\pgfpageoptiontwoheight,%
+ physical width=\pgfpageoptiontwowidth,%
+ last logical shipout=1%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ center=\pgfpageoptionfirstcenter,%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ center=\pgfpageoptionsecondcenter,%
+ copy from=2%
+ }%
+}
+
+\pgfpagesdeclarelayout{2 on 1}
+{
+ \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
+ \edef\pgfpageoptionwidth{\the\paperheight}
+ \def\pgfpageoptionborder{0pt}
+ \def\pgfpageoptionfirstshipout{1}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=2,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth,%
+ current logical shipout=\pgfpageoptionfirstshipout%
+ }
+ \ifdim\paperheight>\paperwidth\relax
+ % put side-by-side
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+ \else
+ % stack on top of one another
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \fi
+}
+
+
+\pgfpagesdeclarelayout{4 on 1}
+{
+ \edef\pgfpageoptionheight{\the\paperheight}
+ \edef\pgfpageoptionwidth{\the\paperwidth}
+ \edef\pgfpageoptionborder{0pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=4,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{3}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{4}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+}
+
+
+\pgfpagesdeclarelayout{6 on 1}
+{
+ \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
+ \edef\pgfpageoptionwidth{\the\paperheight}
+ \def\pgfpageoptionborder{0pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=6,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth%
+ }
+ \ifdim\paperheight>\paperwidth\relax
+ % put side-by-side
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.167\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{3}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.833\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{4}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.167\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{5}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{6}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.833\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \else
+ % stack on top of one another
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.833\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.833\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{3}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{4}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{5}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.167\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{6}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.167\pgfphysicalheight}%
+ }%
+ \fi
+}
+
+
+\pgfpagesdeclarelayout{8 on 1}
+{
+ \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
+ \edef\pgfpageoptionwidth{\the\paperheight}
+ \def\pgfpageoptionborder{0pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=8,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth%
+ }
+ \ifdim\paperheight>\paperwidth\relax
+ % put side-by-side
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.125\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.375\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{3}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.625\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{4}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.875\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{5}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.125\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{6}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.375\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{7}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.625\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{8}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\pgfpoint{.875\pgfphysicalwidth}{.25\pgfphysicalheight}%
+ }%
+ \else
+ % stack on top of one another
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.875\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.875\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{3}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.625\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{4}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.625\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{5}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.375\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{6}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.375\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{7}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.25\pgfphysicalwidth}{.125\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{8}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.75\pgfphysicalwidth}{.125\pgfphysicalheight}%
+ }%
+ \fi
+}
+
+
+\pgfpagesdeclarelayout{16 on 1}
+{
+ \edef\pgfpageoptionheight{\the\paperheight}
+ \edef\pgfpageoptionwidth{\the\paperwidth}
+ \edef\pgfpageoptionborder{0pt}
+}
+{
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=16,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.125\pgfphysicalwidth}{.875\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{2}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.375\pgfphysicalwidth}{.875\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{3}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.625\pgfphysicalwidth}{.875\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{4}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.875\pgfphysicalwidth}{.875\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{5}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.125\pgfphysicalwidth}{.625\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{6}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.375\pgfphysicalwidth}{.625\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{7}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.625\pgfphysicalwidth}{.625\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{8}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.875\pgfphysicalwidth}{.625\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{9}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.125\pgfphysicalwidth}{.375\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{10}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.375\pgfphysicalwidth}{.375\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{11}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.625\pgfphysicalwidth}{.375\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{12}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.875\pgfphysicalwidth}{.375\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{13}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.125\pgfphysicalwidth}{.125\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{14}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.375\pgfphysicalwidth}{.125\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{15}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.625\pgfphysicalwidth}{.125\pgfphysicalheight}%
+ }%
+ \pgfpageslogicalpageoptions{16}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ resized width=.25\pgfphysicalwidth,%
+ resized height=.25\pgfphysicalheight,%
+ center=\pgfpoint{.875\pgfphysicalwidth}{.125\pgfphysicalheight}%
+ }%
+}
+
+
+% Change/set main option
+%
+% #1 = options
+%
+% Options:
+%
+% logical pages = number of logical pages per physical page
+% logical shipouts = number of shipouts needed to fill a physical page
+% (may be less than the number of logical pages,
+% if some logical pages are calculated
+% automatically)
+% current logical shipout = number of logical shipout that will come
+% next.
+%
+% Example:
+%
+% \pgfpagesphysicalpageoptions{logical pages=2,logical shipouts=1}
+
+\newcommand\pgfpagesphysicalpageoptions[1]{%
+ \pgf@lastshipout=0\relax%
+ \pgf@currentshipout=0\relax%
+ \setkeys{pgfpages@main}{#1}%
+ \ifnum\pgf@lastshipout=0\relax%not set
+ \pgf@lastshipout=\pgf@logicalpages%
+ \fi%
+ \ifnum\pgf@currentshipout=0\relax%not set
+ \pgf@currentshipout=\pgf@firstshipout%
+ \fi%
+}
+
+
+\define@key{pgfpages@main}{logical pages}{\pgf@logicalpages=#1\relax}
+\define@key{pgfpages@main}{first logical shipout}{\pgf@firstshipout=#1\relax}
+\define@key{pgfpages@main}{last logical shipout}{\pgf@lastshipout=#1\relax}
+\define@key{pgfpages@main}{current logical shipout}{\pgf@currentshipout=#1\relax}
+\define@key{pgfpages@main}{physical height}{\pgfphysicalheight=#1\relax}
+\define@key{pgfpages@main}{physical width}{\pgfphysicalwidth=#1\relax}
+
+
+
+% Setup/change parameters of a logical page. You must call this
+% macro for each logical page.
+%
+% #1 = logical page number
+% #2 = options
+%
+% Options:
+%
+% original height = height of the logical page (\paperheight at point of
+% first invocation by default)
+% original width = width of the logical page (\paperwidth by default)
+% resized height = height of the logical page after resizing
+% resized width = width of the logical page after resizing
+% border shrink = length that is subtracted from resized height and
+% resized width
+% border code = pgf commands to be used for drawing a border (a
+% path with the border set will already have been
+% set)
+% rounded corners = clip the frame against a rectangle of the size of
+% the frame with corners of the given radius
+% scale = factor by which the page is enlarged/shrunk
+% center = center of the logical page in the physical page
+% rotation = degree by which the page is rotated around its center
+% xscale = scale only x-axis (use -1 to flip along y-axis)
+% yscale = scale only y-axis (use -1 to flip along x-axis)
+% copy from = copy the contents from this logical page of the
+% previous physical page, if no contents is specified
+%
+% If more than one of the three options ``resized height'', ``resized
+% width'' and ``scale'' are given, the smallest resulting scaling
+% wins.
+%
+% Example:
+%
+% \pgfpageslogicalpageoptions{1}{scale=0.5,center=\pgfpoint{0cm}{2cm}}
+
+\newcommand\pgfpageslogicalpageoptions[2]{%
+ \pgf@cpn=#1\relax%
+ \expandafter\ifx\csname pgfpages@box@#1\endcsname\relax%
+ \expandafter\newbox\csname pgfpages@box@#1\endcsname%
+ \edef\pgf@temp{%
+ \noexpand\pgf@psetcurrent{height}{\the\paperheight}%
+ \noexpand\pgf@psetcurrent{width}{\the\paperwidth}%
+ }%
+ \pgf@temp%
+ \fi%
+ \setkeys{pgfpages@page}{#2}%
+ \pgf@calculateresizes{height}%
+ \pgf@calculateresizes{width}%
+ \pgfsetupphysicalpagesizes%
+}
+
+\def\pgf@epset#1#2#3{\expandafter\edef\csname pgfpages@p@#1@#2\endcsname{#3}}
+\def\pgf@epsetcurrent#1#2{\pgf@pset{\the\pgf@cpn}{#1}{#2}}
+\def\pgf@pset#1#2#3{\expandafter\def\csname pgfpages@p@#1@#2\endcsname{#3}}
+\def\pgf@pget#1#2{\csname pgfpages@p@#1@#2\endcsname}
+\def\pgf@psetcurrent#1#2{\pgf@pset{\the\pgf@cpn}{#1}{#2}}
+\def\pgf@pgetcurrent#1{\pgf@pget{\the\pgf@cpn}}
+
+\define@key{pgfpages@page}{scale}{\pgf@epsetcurrent{scale}{#1}}
+\define@key{pgfpages@page}{xscale}{\pgf@epsetcurrent{xscale}{#1}}
+\define@key{pgfpages@page}{yscale}{\pgf@epsetcurrent{yscale}{#1}}
+\define@key{pgfpages@page}{original height}{\pgf@epsetcurrent{height}{#1}}
+\define@key{pgfpages@page}{original width}{\pgf@epsetcurrent{width}{#1}}
+\define@key{pgfpages@page}{resized height}{\pgf@epsetcurrent{reheight}{#1}}
+\define@key{pgfpages@page}{resized width}{\pgf@epsetcurrent{rewidth}{#1}}
+\define@key{pgfpages@page}{center}{\pgf@psetcurrent{center}{#1}}
+\define@key{pgfpages@page}{rotation}{\pgf@epsetcurrent{rotation}{#1}}
+\define@key{pgfpages@page}{copy from}{\pgf@epsetcurrent{copy}{#1}}
+\define@key{pgfpages@page}{border shrink}{\pgf@epsetcurrent{border}{#1}}
+\define@key{pgfpages@page}{border code}{\pgf@psetcurrent{bordercode}{#1}}
+\define@key{pgfpages@page}{corner width}{\pgf@psetcurrent{cornerwidth}{#1}}
+
+\def\pgf@calculateresizes#1{%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @re#1\endcsname\relax%
+ \else%
+ \expandafter\pgfutil@tempdima\csname pgfpages@p@\the\pgf@cpn @re#1\endcsname\relax%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @border\endcsname\relax%
+ \else%
+ \expandafter\pgfutil@tempdimb\csname pgfpages@p@\the\pgf@cpn @border\endcsname\relax%
+ \advance\pgfutil@tempdima by-2\pgfutil@tempdimb\relax%
+ \fi%
+ \expandafter\pgfutil@tempdimb\csname pgfpages@p@\the\pgf@cpn @#1\endcsname\relax%
+ \pgfutil@tempcnta=\pgfutil@tempdimb%
+ \divide\pgfutil@tempcnta by 65536\relax%
+ \ifnum\pgfutil@tempcnta=0\relax%
+ \pgfutil@tempcnta=1\relax%
+ \fi%
+ \divide\pgfutil@tempdima by\pgfutil@tempcnta\relax%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @scale\endcsname\relax%
+ \pgfutil@tempdimb=10000pt%
+ \else%
+ \expandafter\pgfutil@tempdimb\expandafter=\csname pgfpages@p@\the\pgf@cpn @scale\endcsname pt\relax%
+ \fi%
+ \ifdim\pgfutil@tempdima<\pgfutil@tempdimb%
+ \edef\pgf@temp{{scale}{\expandafter\Pgf@geT\the\pgfutil@tempdima}}%
+ \expandafter\pgf@psetcurrent\pgf@temp%
+ \fi%
+ \fi%
+}
+
+
+
+% Shipout a physical page immediately
+%
+% Example:
+%
+% \pgfshipoutphysicalpage
+
+\newcommand\pgfshipoutphysicalpage{%
+ \ifnum\pgf@logicalpages>0\relax%
+ \pgfpages@buildshipoutbox%
+ \pgfpages@shipoutshipoutbox%
+ \pgfpages@performcopying%
+ \global\pgfphysicalpageemptytrue%
+ \global\pgf@holdingphysicalpagefalse%
+ \fi%
+}
+
+\newbox\pgfpages@shipoutbox
+
+\def\pgfpages@buildshipoutbox{%
+ \setbox\pgfpages@shipoutbox=\vbox{{%
+ \set@typeset@protect%
+ \offinterlineskip%
+ \pgfsys@beginpicture%
+ \pgf@cpn=1\relax%
+ \loop%
+ \setbox0=\hbox to \csname pgfpages@p@\the\pgf@cpn @width\endcsname{%
+ \hskip1in%
+ \vbox to \csname pgfpages@p@\the\pgf@cpn @height\endcsname%
+ {\vskip1in\offinterlineskip\expandafter\copy\csname
+ pgfpages@box@\the\pgf@cpn\endcsname\vss}\hss}%
+ \pgfsys@beginscope%
+ % Translate lower left corner
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @center\endcsname\relax%
+ \else%
+ \pgflowlevel{\pgftransformshift{\csname pgfpages@p@\the\pgf@cpn @center\endcsname}}%
+ \fi%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @scale\endcsname\relax%
+ \else%
+ \pgflowlevel{\pgftransformscale{\csname pgfpages@p@\the\pgf@cpn @scale\endcsname}}%
+ \fi%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @xscale\endcsname\relax%
+ \else%
+ \pgflowlevel{\pgftransformxscale{\csname pgfpages@p@\the\pgf@cpn @xscale\endcsname}{1}}%
+ \fi%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @yscale\endcsname\relax%
+ \else%
+ \pgflowlevel{\pgftransformyscale{\csname pgfpages@p@\the\pgf@cpn @yscale\endcsname}}%
+ \fi%
+ \pgfscope%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @rotation\endcsname\relax%
+ \else%
+ \pgflowlevel{\pgftransformrotate{\csname
+ pgfpages@p@\the\pgf@cpn @rotation\endcsname}}%
+ \fi%
+ \pgfutil@tempdima=\csname pgfpages@p@\the\pgf@cpn @width\endcsname\relax%
+ \pgfutil@tempdimb=\csname pgfpages@p@\the\pgf@cpn @height\endcsname\relax%
+ \pgflowlevel{\pgftransformshift{\pgfpoint{-.5\pgfutil@tempdima}{-.5\pgfutil@tempdimb}}}%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @bordercode\endcsname\relax%
+ \else%
+ \pgfpathmoveto{\pgfpointorigin}%
+ \pgfpathlineto{\pgfpoint{\wd0}{0pt}}%
+ \pgfpathlineto{\pgfpoint{\wd0}{\ht0}}%
+ \pgfpathlineto{\pgfpoint{0pt}{\ht0}}%
+ \pgfpathclose%
+ {\csname pgfpages@p@\the\pgf@cpn @bordercode\endcsname}%
+ \fi%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @cornerwidth\endcsname\relax%
+ \else%
+ {
+ \expandafter\pgfutil@tempdima\csname pgfpages@p@\the\pgf@cpn @cornerwidth\endcsname\relax%
+ \color{black}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdima}}%
+ \pgfpathrectangle{\pgfpoint{0pt}{\ht0-\pgfutil@tempdima}}{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdima}}%
+ \pgfpathrectangle{\pgfpoint{\wd0-\pgfutil@tempdima}{0pt}}{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdima}}%
+ \pgfpathrectangle{\pgfpoint{\wd0-\pgfutil@tempdima}{\ht0-\pgfutil@tempdima}}{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdima}}%
+ \pgfusepath{fill}%
+ \pgfpathmoveto{\pgfpoint{0pt}{\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfpoint{0pt}{0.555\pgfutil@tempdima}}{\pgfpoint{.555\pgfutil@tempdima}{0pt}}{\pgfpoint{\pgfutil@tempdima}{0pt}}
+ \pgfpathlineto{\pgfpoint{\wd0-\pgfutil@tempdima}{0pt}}
+ \pgfpathcurveto{\pgfpoint{\wd0-.555\pgfutil@tempdima}{0pt}}{\pgfpoint{\wd0}{.555\pgfutil@tempdima}}{\pgfpoint{\wd0}{\pgfutil@tempdima}}
+ \pgfpathlineto{\pgfpoint{\wd0}{\ht0-\pgfutil@tempdima}}
+ \pgfpathcurveto{\pgfpoint{\wd0}{\ht0-.555\pgfutil@tempdima}}{\pgfpoint{\wd0-.555\pgfutil@tempdima}{\ht0}}{\pgfpoint{\wd0-\pgfutil@tempdima}{\ht0}}
+ \pgfpathlineto{\pgfpoint{\pgfutil@tempdima}{\ht0}}
+ \pgfpathcurveto{\pgfpoint{.555\pgfutil@tempdima}{\ht0}}{\pgfpoint{0pt}{\ht0-.555\pgfutil@tempdima}}{\pgfpoint{0pt}{\ht0-\pgfutil@tempdima}}
+ \pgfpathclose
+ \pgfusepath{clip}
+ \color{white}
+ \pgfpathrectangle{\pgfpointorigin}{\pgfpoint{\wd0}{\ht0}}
+ \pgfusepath{fill}
+ }
+ \fi%
+ \ht0=0pt%
+ \wd0=0pt%
+ \dp0=0pt%
+ \pgfsys@hbox0%
+ \endpgfscope%
+ \pgfsys@endscope%
+ \ifnum\pgf@cpn<\pgf@logicalpages%
+ \advance \pgf@cpn by 1\relax%
+ \repeat%
+ \pgfsys@endpicture%
+ }}%
+}
+
+
+\def\pgfpages@shipoutshipoutbox{%
+ \begingroup
+ \let \protect \noexpand
+ \@resetactivechars
+ \global\let\@@if@newlist\if@newlist
+ \global\@newlistfalse
+ \@parboxrestore%
+ \pgfpages@originalshipout%
+ \vbox{\hbox{%
+ \pgfsetupphysicalpagesizes%
+ \hskip-1in%
+ \vbox to \pgfphysicalheight{%
+ \vss\box\pgfpages@shipoutbox%
+ \vskip1in%
+ }}%
+ \pgfsetupphysicalpagesizes%
+ }%
+ \endgroup%
+}
+
+\def\pgfpages@performcopying{
+ \pgf@cpn=1\relax% copy first
+ \loop%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @copy\endcsname\relax
+ \else%
+ \edef\pgf@temp{\noexpand\global\noexpand\setbox\csname pgfpages@box@%
+ \the\pgf@cpn\endcsname=\noexpand\copy\csname pgfpages@box@\csname
+ pgfpages@p@\the\pgf@cpn @copy\endcsname\endcsname}%
+ \pgf@temp%
+ \fi%
+ \ifnum\pgf@cpn<\pgf@logicalpages%
+ \advance \pgf@cpn by 1\relax%
+ \repeat%
+ \pgf@cpn=1\relax% then void
+ \loop%
+ \expandafter\ifx\csname pgfpages@p@\the\pgf@cpn @copy\endcsname\relax
+ \expandafter\global\expandafter\setbox\csname pgfpages@box@\the\pgf@cpn\endcsname=\box\voidb@x%
+ \else%
+ \fi%
+ \ifnum\pgf@cpn<\pgf@logicalpages%
+ \advance \pgf@cpn by 1\relax%
+ \repeat%
+}
+
+
+
+% Save original shipout commands
+%
+% Example:
+%
+% \pgfhookintoshipout
+
+\newcommand\pgfhookintoshipout{
+ \ifx\CROP@shipout\undefined
+ \let\pgfpages@originalshipout=\shipout
+ \let\shipout=\pgfpages@interceptshipout
+ \else
+ \let\pgfpages@originalshipout=\CROP@shipout
+ \let\CROP@shipout=\pgfpages@interceptshipout
+ \fi
+}
+
+\def\pgfpages@interceptshipout{%
+ \ifnum\pgf@shipoutnextto>0\relax
+ \def\pgf@next{%
+ \expandafter\global\expandafter\setbox\csname pgfpages@box@\the\pgf@shipoutnextto\endcsname=\box\voidb@x%
+ \afterassignment\pgfpages@shipouttestnext%
+ \pgfpagesshipoutlogicalpage{\the\pgf@shipoutnextto}%
+ }%
+ \else%
+ \ifpgf@holdingphysicalpage% shipout physical page now
+ {\pgfshipoutphysicalpage}%
+ \fi%
+ \ifnum\pgf@logicalpages=0\relax
+ \def\pgf@next{\pgfpages@originalshipout}%
+ \else%
+ \def\pgf@next{%
+ \expandafter\global\expandafter\setbox\csname pgfpages@box@\the\pgf@currentshipout\endcsname=\box\voidb@x%
+ \afterassignment\pgfpages@shipouttest%
+ \pgfpagesshipoutlogicalpage{\the\pgf@currentshipout}%
+ }%
+ \fi%
+ \fi%
+ \pgf@next%
+}
+
+\def\pgfpages@shipouttest{%
+ \ifvoid\csname pgfpages@box@\the\pgf@currentshipout\endcsname\relax%
+ \aftergroup\pgfpages@preparenextshipout%
+ \else%
+ \pgfpages@preparenextshipout%
+ \fi%
+}
+
+\def\pgfpages@shipouttestnext{%
+ \ifvoid\csname pgfpages@box@\the\pgf@shipoutnextto\endcsname\relax%
+ \aftergroup\pgfpages@preparenextshipout%
+ \else%
+ \pgfpages@preparenextshipout%
+ \fi%
+}
+
+\def\pgfpages@preparenextshipout{%
+ \ifnum\pgf@shipoutnextto=0\relax%
+ \global\advance\pgf@currentshipout by 1\relax%
+ \else%
+ \global\pgf@shipoutnextto=0\relax%
+ \fi%
+ \ifnum\pgf@currentshipout>\pgf@lastshipout\relax%
+ \global\pgf@currentshipout=\pgf@firstshipout\relax%
+ \global\pgf@holdingphysicalpagetrue%
+ \fi%
+}
+
+
+
+% Shipout a logical page
+%
+% #1 = logical page number
+%
+% The command should be followed by a box. This box will become the
+% contents of the logical page.
+%
+% Example:
+%
+% \pgfpagesshipoutlogicalpage{0}\vbox{Hi!}
+
+\newcommand\pgfpagesshipoutlogicalpage[1]{%
+ \global\pgfphysicalpageemptyfalse%
+ \expandafter\global\expandafter\setbox\csname pgfpages@box@#1\endcsname=}
+
+
+
+% Finish current page and shipout next page to a specific logical page.
+%
+% #1 = logical page number
+%
+% When the current page has been typset, it will be become the given
+% logical page. This command ``interrupts'' the normal order of
+% logical pages.
+%
+% Example:
+%
+% \pgfpagesuselayout{two screens with optional second}
+%
+% Text for main page.\clearpage
+%
+% \pgfpagescurrentpagewillbelogicalpage{2}
+%
+% Text that goes to second page
+%
+% \clearpage
+%
+% Text for main page.
+
+\newcommand\pgfpagescurrentpagewillbelogicalpage[1]{%
+ \global\pgf@shipoutnextto=#1\relax%
+}
+
+
+% Setup the physical page sizes
+%
+% Example:
+%
+% \pgfsetupphysicalpagesizes
+
+\newcommand\pgfsetupphysicalpagesizes{%
+ \pgfsys@global@papersize{\the\pgfphysicalwidth}{\the\pgfphysicalheight}%
+}
+
+
+%
+% Start/End setup
+%
+\pgfhookintoshipout
+
+\AtEndDocument
+{
+ \clearpage
+ \ifpgfphysicalpageempty
+ \else
+ \pgfshipoutphysicalpage
+ \fi
+}
+
diff --git a/graphics/pgf/base/tex/pgfpict2e.sty b/graphics/pgf/base/tex/pgfpict2e.sty
new file mode 100644
index 0000000000..830fa0c642
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfpict2e.sty
@@ -0,0 +1,112 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesPackage{pgfpict2e}[2004/11/28 ver 0.01]
+
+\RequirePackage{pgfcore}
+
+\def\pgf@pict@line(#1,#2)#3{%
+ \pgfsys@beginpurepicture%
+ \pgfsetlinewidth{\@wholewidth}%
+ \pgfsetroundcap%
+ \pgfpathqmoveto{0}{0}%
+ \ifnum#1=0\relax%
+ \pgf@xa=0pt\relax%
+ \pgf@ya=#3\unitlength\relax%
+ \else%
+ \pgf@y=#2\unitlength%
+ \divide\pgf@y by#1\relax%
+ \pgf@xa=#3\unitlength\relax%
+ \pgf@ya=#3\pgf@y\relax%
+ \fi%
+ \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}%
+ \pgfusepath{stroke}%
+ \pgfsys@endpurepicture%
+}%
+
+\def\line(#1,#2)#3{{\pgfsetarrows{-}\pgf@pict@line(#1,#2){#3}}}%
+\def\vector(#1,#2)#3{{\pgfsetarrows{-latex}\pgf@pict@line(#1,#2){#3}}}%
+
+\def\@circle#1{{%
+ \pgfsys@beginpurepicture%
+ \pgfsetlinewidth{\@wholewidth}%
+ \pgf@x=#1\unitlength%
+ \pgfpathqcircle{.5\pgf@x}%
+ \pgfusepathqstroke%
+ \pgfsys@endpurepicture}}
+
+\def\@dot#1{{%
+ \pgfsys@beginpurepicture%
+ \pgfsetlinewidth{\@wholewidth}%
+ \pgf@x=#1\unitlength%
+ \pgfpathqcircle{.5\pgf@x}%
+ \pgfusepathqfill%
+ \pgfsys@endpurepicture}}
+
+
+\def\oval{\pgfutil@ifnextchar[{\pgfpictIIe@oval}{\pgfpictIIe@oval[20pt]}}
+\def\pgfpictIIe@oval[#1](#2,#3){\pgfutil@ifnextchar[{\pgfpictIIe@@oval[#1](#2,#3)}{\pgfpictIIe@@oval[#1](#2,#3)[]}}
+\def\pgfpictIIe@@oval[#1](#2,#3)[#4]{{%
+ \pgfsys@beginpurepicture%
+ \@tfor\reserved@a:=#4\do{\csname pgfpictIIe@clip\reserved@a\endcsname}%
+ \pgf@x=#2\unitlength%
+ \pgf@y=#3\unitlength%
+ \pgf@x=-.5\pgf@x%
+ \pgf@y=-.5\pgf@y%
+ \pgfsys@transformshift{\the\pgf@x}{\the\pgf@y}%
+ \pgfsetlinewidth{\@wholewidth}%
+ \pgf@ya=#3\unitlength%
+ \advance\pgf@ya by-#1\relax%
+ \pgfpathmoveto{\pgfpoint{0pt}{\pgf@ya}}%
+ \pgfpatharc{180}{90}{#1}%
+ \pgf@xa=#2\unitlength%
+ \advance\pgf@xa by-#1\relax%
+ \pgfpathlineto{\pgfpoint{\pgf@xa}{#3\unitlength}}%
+ \pgfpatharc{90}{0}{#1}%
+ \pgfpathlineto{\pgfpoint{#2\unitlength}{#1}}%
+ \pgfpatharc{0}{-90}{#1}%
+ \pgfpathlineto{\pgfpoint{#1}{0pt}}%
+ \pgfpatharc{-90}{-180}{#1}%
+ \pgfpathclose%
+ \pgfusepathqstroke%
+ \pgfsys@endpurepicture%
+}}
+\def\pgfpictIIe@clipr{\pgfpathrectangle{\pgfpoint{0pt}{-1000pt}}{\pgfpoint{1000pt}{2000pt}}\pgfusepath{clip}}
+\def\pgfpictIIe@clipl{\pgfpathrectangle{\pgfpoint{-1000pt}{-1000pt}}{\pgfpoint{1000pt}{2000pt}}\pgfusepath{clip}}
+\def\pgfpictIIe@clipt{\pgfpathrectangle{\pgfpoint{-1000pt}{0pt}}{\pgfpoint{2000pt}{1000pt}}\pgfusepath{clip}}
+\def\pgfpictIIe@clipb{\pgfpathrectangle{\pgfpoint{-1000pt}{-1000pt}}{\pgfpoint{2000pt}{1000pt}}\pgfusepath{clip}}
+
+
+\renewcommand\bezier[1]{\pgfpictIIe@qbezier}
+\renewcommand\qbezier[1][]{\pgfpictIIe@qbezier}
+\def\pgfpictIIe@qbezier(#1,#2)(#3,#4)(#5,#6){{%
+ \pgfsys@beginpurepicture%
+ \pgfsetlinewidth{\@wholewidth}%
+ \pgfpathmoveto{\pgfpoint{#1\unitlength}{#2\unitlength}}%
+ \pgfpathcurveto%
+ {\pgfpointmid{0.66666666}{\pgfpoint{#1\unitlength}{#2\unitlength}}{\pgfpoint{#3\unitlength}{#4\unitlength}}}%
+ {\pgfpointmid{0.66666666}{\pgfpoint{#5\unitlength}{#6\unitlength}}{\pgfpoint{#3\unitlength}{#4\unitlength}}}%
+ {\pgfpoint{#5\unitlength}{#6\unitlength}}%%
+ \pgfusepathqstroke%
+ \pgfsys@endpurepicture%
+}}
+\newcommand\cbezier[1][]{\pgfpictIIe@cbezier}
+\def\pgfpictIIe@cbezier(#1,#2)(#3,#4)(#5,#6)(#7,#8){{%
+ \pgfsys@beginpurepicture%
+ \pgfsetlinewidth{\@wholewidth}%
+ \pgfpathmoveto{\pgfpoint{#1\unitlength}{#2\unitlength}}%
+ \pgfpathcurveto%
+ {\pgfpoint{#3\unitlength}{#4\unitlength}}%
+ {\pgfpoint{#5\unitlength}{#6\unitlength}}%
+ {\pgfpoint{#7\unitlength}{#8\unitlength}}%%
+ \pgfusepathqstroke%
+ \pgfsys@endpurepicture%
+}}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfrcs.code.tex b/graphics/pgf/base/tex/pgfrcs.code.tex
new file mode 100644
index 0000000000..f83674c752
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfrcs.code.tex
@@ -0,0 +1,155 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ifx\eTeXrevision\undefined%
+ \pgfutil@packageerror{PGF}{PGF requires etex in extended mode}{}%
+ \csname @@end\expandafter\endcsname\expandafter\end%
+\fi
+
+\ifnum\eTeXversion<2
+ \pgfutil@packageerror{PGF}{PGF requires etex version 2}{}%
+ \csname @@end\expandafter\endcsname\expandafter\end%
+\fi
+
+% The purpose of this file is to define the command
+% \ProvidesPackageRCS, which should be followed by an RCS id
+% string. This command will also be available in plain TeX, where it
+% prints out a message to the log.
+
+\pgfutil@IfFileExists{pgf.revision.tex}{\input pgf.revision.tex } {%
+ \def\pgfrevision{0}%
+ \def\pgfversion{0.0}%
+ \def\pgfversiondatetime{2014-07-01 00:00:00 +100}%
+ \def\pgfrevisiondatetime{2014-07-01 00:00:00 +100}%
+ \def\pgfversiondate{2014/07/01}%
+ \def\pgfrevisiondate{2014/07/01}%
+}
+
+\begingroup
+\catcode`\"=12
+\pgfutil@IfUndefined{directlua}{}{%
+ \directlua{pgf = {}; pgf.pgfversion = "\pgfversion"}%
+}%
+\endgroup
+
+% \def\pgftypesetversion{\oldstylenums{3}.\oldstylenums{0}.\oldstylenums{1}}
+% XXX : implement pretty-printing:
+% which is better? 'version' is something like 3.0.1 . revision is
+% 3.0.1-151-g62184b3 which might be better for instable builds
+%\let\pgftypesetversion=\pgfversion
+\let\pgftypesetversion=\pgfrevision
+
+
+\ifx\pgfrcsloaded\undefined
+\def\pgfrcsloaded{}
+
+\edef\pgfrcsatcode{\the\catcode`\@}
+\catcode`\@=11
+
+% not used in PGF, deprecated
+\def\ProvidesFileRCS{%
+ \let\pgfrcs@final=\ProvidesFileRCS@
+ \pgfrcs@parseinput
+}
+\def\ProvidesFileRCS@#1{%
+ \ProvidesFile{#1}[\pgfversiondate\space v\pgfversion\space(\pgfrevision)]%
+}
+
+\def\pgf@remove@ext#1.#2\relax{%
+ \def\pgfretval{#1}%
+}%
+
+\def\ProvidesPackageRCS{%
+ \let\pgfrcs@final=\ProvidesPackageRCS@
+ \pgfrcs@parseinput
+}
+\def\ProvidesPackageRCS@#1{%
+ \pgf@remove@ext#1.\relax
+ \edef\pgfrcs@marshal{{\pgfretval}[\pgfversiondate\space v\pgfversion\space(\pgfrevision)]}%
+ \expandafter\ProvidesPackage\pgfrcs@marshal
+}
+
+% not used in PGF, deprecated
+\def\ProvidesClassRCS{%
+ \let\pgfrcs@final=\ProvidesClassRCS@
+ \pgfrcs@parseinput
+}
+\def\ProvidesClassRCS@#1{%
+ \pgf@remove@ext#1.\relax
+ \edef\pgfrcs@marshal{{\pgfretval}[\pgfversiondate\space v\pgfversion\space(\pgfrevision)]}%
+ \expandafter\ProvidesClass\pgfrcs@marshal
+}
+
+\def\pgfrcs@parseinput@bracket{[}%
+\def\pgfrcs@parseinput@dollarsign{$}%
+
+\def\pgfrcs@parseinput#1{%
+ \def\pgfrcs@parseinput@{#1}%
+ \ifx\pgfrcs@parseinput@\pgfrcs@parseinput@bracket%
+ % still accept it if someone has written his own pgfrcs files with headers of sorts
+ % \ProvidesPackageRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/basiclayer/pgfcore.code.tex,v 1.7 2010/04/11 07:09:19 username Exp $
+ \let\next=\pgfrcs@parseinput@opt
+ \else
+ \ifx\pgfrcs@parseinput@\pgfrcs@parseinput@dollarsign
+ % still accept it if someone has written his own pgfrcs files with headers of sorts
+ % \ProvidesPackageRCS $Header: /cvsroot/pgf/pgf/generic/pgf/basiclayer/pgfcore.code.tex,v 1.7 2010/04/11 07:09:19 username Exp $
+ \let\next\pgfrcs@parseinput@dollar
+ \else
+ % the new, normal pgf-way is \ProvidesPackageRCS{pgfcore.code.tex}
+ \def\next{\pgfrcs@final{#1}}%
+ \fi
+ \fi
+ \next
+}
+\def\pgfrcs@parseinput@opt#1] ${%
+ % just backwards compatibility -- ignore the information, but parse the input tokens:
+ \pgfrcs@parseinput@dollar
+}%
+\def\pgfrcs@parseinput@dollar#1${%
+ \pgf@parseid $#1$%
+ % we ignore pretty much everything except for the file name:
+ \edef\pgfrcs@parseinput@{\pgf@rcsfile.\pgf@rcssuffix}%
+ \expandafter\pgfrcs@final\expandafter{\pgfrcs@parseinput@}%
+}%
+% Get date and version from RCS Ids
+\def\pgf@parseid $#1: #2.#3,v #4 #5/#6/#7 #8${%
+ \pgf@parsercsfile$#2/$
+ \def\pgf@rcssuffix{#3}
+ \def\pgf@rcsrevision{#4}
+ \def\pgf@rcsdate{#5/#6/#7}
+}
+\def\pgf@parsercsfile$#1/#2${
+ \def\pgf@temp{#2}
+ \ifx\pgf@temp\pgfutil@empty
+ \def\pgf@rcsfile{#1}
+ \else
+ \pgf@parsercsfile$#2$
+ \fi}
+
+
+\ifx\ProvidesPackage\@undefined
+ % plain tex
+ \def\ProvidesPackage#1[#2]{\wlog{Loading package #1 version #2.}}
+\fi
+
+\ifx\ProvidesFile\@undefined
+ % plain tex
+ \def\ProvidesFile#1[#2]{\wlog{Loading file #1 version #2.}}
+\fi
+
+\ProvidesPackageRCS{pgfrcs.code.tex}
+
+\catcode`\@=\pgfrcsatcode
+
+\fi
+
+
+% Local Variables:
+% coding: undecided-unix
+% End:
diff --git a/graphics/pgf/base/tex/pgfrcs.sty b/graphics/pgf/base/tex/pgfrcs.sty
new file mode 100644
index 0000000000..05db9decae
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfrcs.sty
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\input pgfutil-common.tex
+\input pgfutil-latex.def
+
+\input{pgfrcs.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfrcs.tex b/graphics/pgf/base/tex/pgfrcs.tex
new file mode 100644
index 0000000000..6d8928dc07
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfrcs.tex
@@ -0,0 +1,26 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\ifx\pgfrcsincluded\undefined
+\def\pgfrcsincluded{}
+
+\edef\pgfrcsatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfutil-common.tex
+\input pgfutil-plain.def
+
+\input pgfrcs.code.tex
+
+\catcode`\@=\pgfrcsatcode
+
+\fi
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfshade.sty b/graphics/pgf/base/tex/pgfshade.sty
new file mode 100644
index 0000000000..29d430e34f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfshade.sty
@@ -0,0 +1,19 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\ProvidesPackageRCS{pgfshade.sty}
+
+\RequirePackage{pgf}
+
+\PackageWarning{pgfshade}{This package is obsolete. pgf.sty will load
+ shade management automatically}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsys-common-pdf-via-dvi.def b/graphics/pgf/base/tex/pgfsys-common-pdf-via-dvi.def
new file mode 100644
index 0000000000..d39078338a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-common-pdf-via-dvi.def
@@ -0,0 +1,172 @@
+% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-common-pdf-via-dvi.def}
+
+% Common driver commands for all drivers that produce pdf via the
+% detour of a dvi file
+
+% For unique object name:
+\newcount\pgfsys@objnum\pgfsys@objnum\@ne
+
+% Hboxes
+
+\def\pgfsys@beginpurepicture{\special{pdf: content q}}
+
+
+\def\pgfsys@imagesuffixlist{.pdf:.jpg:.jpeg:.png:}
+\def\pgfsys@horishading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgf@process{\pgfpoint{\pgf@max}{#2}}%
+ \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{\special{pdf: beginxobj @pgfshade\the\pgfsys@objnum\space width \the\pgf@max\space height \the\pgf@y}}}\@temp%
+ \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{\special{pdf: put @resources <<
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@doma\space0 \pgf@domb\space0]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >> >>}}}\@temp% <<
+ \pgfutil@insertatbegincurrentpage{\special{pdf: content /Sh sh}%
+ \special{pdf: endxobj}}%
+ \xdef\pgfutil@tempa{%
+ \hbox to\the\pgf@max{\vbox to#2{\vfil\special{pdf: usexobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne
+}
+\def\pgfsys@vertshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgf@process{\pgfpoint{\pgf@max}{#2}}%
+ \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{\special{pdf: beginxobj @pgfshade\the\pgfsys@objnum\space width \the\pgf@y\space height \the\pgf@max\space}}}\@temp%
+ \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{\special{pdf: put @resources <<
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [0 \pgf@doma\space0 \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >> >>}}}\@temp% <<
+ \pgfutil@insertatbegincurrentpage{\special{pdf: content /Sh sh}%
+ \special{pdf: endxobj}}%
+ \xdef\pgfutil@tempa{%
+ \hbox to#2{\vbox to\the\pgf@max{\vfil\special{pdf: usexobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne
+}
+\def\pgfsys@radialshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgf@process{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
+ \advance\pgf@xa by \pgf@x\relax%
+ \advance\pgf@ya by \pgf@y\relax%
+ \pgf@sys@bp@correct{\pgf@x}%
+ \pgf@sys@bp@correct{\pgf@y}%
+ \pgf@sys@bp@correct{\pgf@xa}%
+ \pgf@sys@bp@correct{\pgf@ya}%
+ \pgfutil@tempdima=2\pgf@max\relax%
+ \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{\special{pdf: beginxobj @pgfshade\the\pgfsys@objnum\space width \the\pgfutil@tempdima\space height \the\pgfutil@tempdima}}}\@temp%
+ \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{\special{pdf: put @resources <<
+ /Shading << /Sh << /ShadingType 3
+ /ColorSpace \pgf@shading@device\space
+ /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] >> >> >>}}}\@temp% <<
+ \pgfutil@insertatbegincurrentpage{\special{pdf: content /Sh sh}%
+ \special{pdf: endxobj}}%
+ \xdef\pgfutil@tempa{%
+ \hbox to\the\pgfutil@tempdima{\vbox to\the\pgfutil@tempdima{\vfil\special{pdf: usexobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne
+}%
+
+\def\pgf@sys@pdf@dvi@tracker{
+ \def\pgfsys@markposition##1{%
+ \pdfsavepos%
+ \edef\pgf@temp{##1}%
+ \expandafter\write\expandafter\pgfutil@auxout\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\pdflastxpos}{\the\pdflastypos}}%
+ }
+ \def\pgfsyspdfmark##1##2##3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@##1\endcsname{\pgfqpoint{##2sp}{##3sp}}%
+ }
+ \def\pgfsys@getposition##1##2{%
+ \edef\pgf@marshal{\let\noexpand##2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@##1\endcsname}%
+ \pgf@marshal%
+ }
+ \def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfpointorigin}
+}
+
+
+
+%
+% Resource management
+%
+
+\newif\ifpgf@sys@pdf@colorspaces@exists
+\newif\ifpgf@sys@pdf@patterns@exists
+\newif\ifpgf@sys@pdf@extgs@exists
+\newif\ifpgf@sys@pdf@colorspaces@created
+\newif\ifpgf@sys@pdf@patterns@created
+\newif\ifpgf@sys@pdf@extgs@created
+\newif\ifpgf@sys@pdf@any@resources
+
+\def\pgf@sys@setuppdfresources@plain{%
+ % This command will setup pdf resource in plain and in latex
+ % mode. ConTeXt has its own handler
+ \pgfutil@insertatbegineverypage{%
+ \pgf@sys@pdf@any@resourcesfalse%
+ \ifpgf@sys@pdf@extgs@exists%
+ \pgf@sys@pdf@any@resourcestrue%
+ \ifpgf@sys@pdf@extgs@created \else \special{pdf: obj @pgfextgs <<>>} \global\pgf@sys@pdf@extgs@createdtrue \fi% <<
+ \fi%
+ \ifpgf@sys@pdf@colorspaces@exists%
+ \pgf@sys@pdf@any@resourcestrue%
+ \ifpgf@sys@pdf@colorspaces@created \else \special{pdf: obj @pgfcolorspaces <<>>} \global\pgf@sys@pdf@colorspaces@createdtrue \fi% <<
+ \fi%
+ \ifpgf@sys@pdf@patterns@exists%
+ \pgf@sys@pdf@any@resourcestrue%
+ \ifpgf@sys@pdf@patterns@created \else \special{pdf: obj @pgfpatterns <<>>} \global\pgf@sys@pdf@patterns@createdtrue \fi% <<
+ \fi%
+ \ifpgf@sys@pdf@any@resources%
+ \special{pdf: put @resources <<
+ \ifpgf@sys@pdf@extgs@exists /ExtGState @pgfextgs \fi
+ \ifpgf@sys@pdf@patterns@exists /Pattern @pgfpattern \fi
+ \ifpgf@sys@pdf@colorspaces@exists /ColorSpace @pgfcolorspaces \fi
+ >>}% <<
+ \fi%
+ }
+ \def\pgf@sys@addpdfresource@extgs@plain##1{%
+ \global\pgf@sys@pdf@extgs@existstrue%
+ \pgfutil@insertatbegincurrentpage{\special{pdf: put @pgfextgs << ##1 >>}}% <<
+ }
+ \def\pgf@sys@addpdfresource@colorspaces@plain##1{%
+ \global\pgf@sys@pdf@colorspaces@existstrue%
+ \pgfutil@insertatbegincurrentpage{\special{pdf: put @pgfcolorspaces << ##1 >>}}% <<
+ }
+ \def\pgf@sys@addpdfresource@patterns@plain##1{%
+ \global\pgf@sys@pdf@patterns@existstrue%
+ \pgfutil@insertatbegincurrentpage{\special{pdf: put @pgfpatterns << ##1 >>}}% <<
+ }
+}
+\pgfutil@setuppdfresources % possibly call the above
+
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-common-pdf.def b/graphics/pgf/base/tex/pgfsys-common-pdf.def
new file mode 100644
index 0000000000..c70f3ef2b7
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-common-pdf.def
@@ -0,0 +1,119 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-common-pdf.def}
+
+
+% Common driver commands for all drivers that produce pdf
+
+
+% Path construction:
+\def\pgfsys@lineto#1#2{\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgfsysprotocol@literal{l}}
+\def\pgfsys@moveto#1#2{\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgfsysprotocol@literal{m}}
+\def\pgfsys@curveto#1#2#3#4#5#6{%
+ \pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgf@sys@bp{#3}\pgf@sys@bp{#4}\pgf@sys@bp{#5}\pgf@sys@bp{#6}\pgfsysprotocol@literal{c}}
+\def\pgfsys@rect#1#2#3#4{\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgf@sys@bp{#3}\pgf@sys@bp{#4}\pgfsysprotocol@literal{re}}
+\def\pgfsys@closepath{\pgfsysprotocol@literal{h}}
+
+% Path usage:
+\def\pgfsys@stroke{\pgfsysprotocol@literal{S}}
+\def\pgfsys@closestroke{\pgfsysprotocol@literal{s}}
+\def\pgfsys@fill{\ifpgfsys@eorule\pgfsysprotocol@literal{f*}\else\pgfsysprotocol@literal{f}\fi}
+\def\pgfsys@fillstroke{\ifpgfsys@eorule\pgfsysprotocol@literal{B*}\else\pgfsysprotocol@literal{B}\fi}
+\def\pgfsys@clipnext{\ifpgfsys@eorule\pgfsysprotocol@literal{W*}\else\pgfsysprotocol@literal{W}\fi}
+\def\pgfsys@discardpath{\pgfsysprotocol@literal{n}}
+
+% Transformation:
+\def\pgfsys@transformcm#1#2#3#4#5#6{%
+ \pgfsysprotocol@literalbuffered{#1 #2 #3 #4}\pgf@sys@bp{#5}\pgf@sys@bp{#6}\pgfsysprotocol@literal{cm}}
+
+% Scopes
+\def\pgfsys@beginscope{\pgfsysprotocol@literal{q}}
+\def\pgfsys@endscope{\pgfsysprotocol@literal{Q}}
+
+% Graphics state
+\def\pgfsys@setdash#1#2{%
+ \pgfsysprotocol@literalbuffered{[}%
+ \pgfutil@for\pgf@sys@temp:={#1}\do{\pgf@sys@bp{\pgf@sys@temp}}%
+ \pgfsysprotocol@literalbuffered{]}%
+ \pgf@sys@bp{#2}\pgfsysprotocol@literal{d}}
+\def\pgfsys@setlinewidth#1{\pgf@sys@bp{#1}\pgfsysprotocol@literal{w}}
+\def\pgfsys@setmiterlimit#1{\pgfsysprotocol@literal{#1 M}}
+\def\pgfsys@buttcap{\pgfsysprotocol@literal{0 J}}
+\def\pgfsys@roundcap{\pgfsysprotocol@literal{1 J}}
+\def\pgfsys@rectcap{\pgfsysprotocol@literal{2 J}}
+\def\pgfsys@miterjoin{\pgfsysprotocol@literal{0 j}}
+\def\pgfsys@roundjoin{\pgfsysprotocol@literal{1 j}}
+\def\pgfsys@beveljoin{\pgfsysprotocol@literal{2 j}}
+\def\pgfsys@color@rgb@stroke#1#2#3{\pgfsysprotocol@literal{#1 #2 #3 RG}}
+\def\pgfsys@color@rgb@fill#1#2#3{\pgfsysprotocol@literal{#1 #2 #3 rg}}
+\def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgfsysprotocol@literal{#1 #2 #3 #4 K}}
+\def\pgfsys@color@cmyk@fill#1#2#3#4{\pgfsysprotocol@literal{#1 #2 #3 #4 k}}
+\def\pgfsys@color@cmy@stroke#1#2#3{\pgfsysprotocol@literal{#1 #2 #3 0 K}}
+\def\pgfsys@color@cmy@fill#1#2#3{\pgfsysprotocol@literal{#1 #2 #3 0 k}}
+\def\pgfsys@color@gray@stroke#1{\pgfsysprotocol@literal{#1 G}}
+\def\pgfsys@color@gray@fill#1{\pgfsysprotocol@literal{#1 g}}
+
+% Visibility
+\def\pgfsys@begininvisiblescope{\pgfsys@beginscope{\pgfsys@discardpath\pgfsys@clipnext\pgfsys@moveto{0pt}{0pt}\pgfsys@discardpath}}
+\def\pgfsys@endinvisiblescope{\pgfsys@endscope}
+
+% Opacity
+\def\pgfsys@stroke@opacity#1{%
+ \expandafter\ifx\csname pgf@sys@pdf@so@#1\endcsname\relax%
+ \expandafter\gdef\csname pgf@sys@pdf@so@#1\endcsname{/pgf@CA#1}%
+ \pgfutil@addpdfresource@extgs{/pgf@CA#1 << /CA #1 >>}%<<
+ \fi%
+ \pgfsysprotocol@literal{\csname pgf@sys@pdf@so@#1\endcsname\space gs}%
+}
+\def\pgfsys@fill@opacity#1{%
+ \expandafter\ifx\csname pgf@sys@pdf@fo@#1\endcsname\relax%
+ \expandafter\gdef\csname pgf@sys@pdf@fo@#1\endcsname{/pgf@ca#1}%
+ \pgfutil@addpdfresource@extgs{/pgf@ca#1 << /ca #1 >>}%<<
+ \fi%
+ \pgfsysprotocol@literal{\csname pgf@sys@pdf@fo@#1\endcsname\space gs}%
+}
+
+% Blending
+\def\pgfsys@blend@mode#1{%
+ \expandafter\ifx\csname pgf@sys@pdf@bm@#1\endcsname\relax%
+ \expandafter\let\expandafter\pgf@temp\csname pgf@sys@pdf@blend@mode@map@#1\endcsname%
+ \expandafter\xdef\csname pgf@sys@pdf@bm@#1\endcsname{/pgf@bm\pgf@temp}%
+ \ifx\pgf@temp\relax%
+ \pgferror{Unknown blend mode '#1'}%
+ \def\pgf@temp{Normal}%
+ \fi%
+ \edef\pgf@temp{/pgf@bm\pgf@temp << /BM [ /\pgf@temp ] >>}%<<
+ \expandafter\pgfutil@addpdfresource@extgs\expandafter{\pgf@temp}%
+ \fi%
+ \pgfsysprotocol@literal{\csname pgf@sys@pdf@bm@#1\endcsname\space gs}%
+}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@normal\endcsname{Normal}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@multiply\endcsname{Multiply}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@screen\endcsname{Screen}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@overlay\endcsname{Overlay}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@darken\endcsname{Darken}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@lighten\endcsname{Lighten}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@color dodge\endcsname{ColorDodge}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@color burn\endcsname{ColorBurn}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@hard light\endcsname{HardLight}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@soft light\endcsname{SoftLight}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@difference\endcsname{Difference}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@exclusion\endcsname{Exclusion}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@saturation\endcsname{Saturation}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@color\endcsname{Color}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@hue\endcsname{Hue}
+\expandafter\def\csname pgf@sys@pdf@blend@mode@map@luminosity\endcsname{Luminosity}
+
+\endinput
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-common-postscript.def b/graphics/pgf/base/tex/pgfsys-common-postscript.def
new file mode 100644
index 0000000000..803ed71cda
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-common-postscript.def
@@ -0,0 +1,600 @@
+% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-common-postscript.def}
+
+
+% Driver commands for postscript
+
+\newif\ifpgf@fillcolor
+\newif\ifpgf@strokecolor
+\newif\ifpgfsys@@clipnext
+
+% Path construction:
+\def\pgfsys@lineto#1#2{\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgfsysprotocol@literal{lineto}}
+\def\pgfsys@moveto#1#2{\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgfsysprotocol@literal{moveto}}
+\def\pgfsys@curveto#1#2#3#4#5#6{%
+ \pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgf@sys@bp{#3}\pgf@sys@bp{#4}\pgf@sys@bp{#5}\pgf@sys@bp{#6}\pgfsysprotocol@literal{curveto}}
+\def\pgfsys@rect#1#2#3#4{\pgf@sys@bp{#4}\pgf@sys@bp{#3}\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgfsysprotocol@literal{pgfe}}
+\def\pgfsys@closepath{\pgfsysprotocol@literal{closepath}}
+
+% Path usage:
+\def\pgfsys@stroke{%
+ \ifpgfsys@@clipnext%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{gsave pgfsc pgfstr grestore eoclip newpath}%
+ \else%
+ \pgfsysprotocol@literal{gsave pgfsc pgfstr grestore clip newpath}%
+ \fi%
+ \pgfsys@@clipnextfalse%
+ \else%
+ \ifpgf@strokecolor%
+ \pgfsysprotocol@literal{gsave pgfsc pgfstr grestore newpath}%
+ \else%
+ \pgfsysprotocol@literal{pgfstr}%
+ \fi%
+ \fi}
+\def\pgfsys@fill{%
+ \ifpgfsys@@clipnext%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{gsave pgffc pgfeofill grestore eoclip newpath}%
+ \else%
+ \pgfsysprotocol@literal{gsave pgffc pgffill grestore clip newpath}%
+ \fi%
+ \pgfsys@@clipnextfalse%
+ \else%
+ \ifpgf@fillcolor%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{gsave pgffc pgfeofill grestore newpath}%
+ \else%
+ \pgfsysprotocol@literal{gsave pgffc pgffill grestore newpath}%
+ \fi%
+ \else%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{pgfeofill}%
+ \else%
+ \pgfsysprotocol@literal{pgffill}%
+ \fi%
+ \fi%
+ \fi}
+\def\pgfsys@fillstroke{%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{gsave pgffc pgfeofill grestore gsave pgfsc pgfstr grestore}%
+ \else%
+ \pgfsysprotocol@literal{gsave pgffc pgffill grestore gsave pgfsc pgfstr grestore}%
+ \fi%
+ \ifpgfsys@@clipnext%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{eoclip}%
+ \else%
+ \pgfsysprotocol@literal{clip}%
+ \fi%
+ \pgfsys@@clipnextfalse%
+ \fi%
+ \pgfsysprotocol@literal{newpath}}
+\def\pgfsys@clipnext{\pgfsys@@clipnexttrue}
+\def\pgfsys@discardpath{%
+ \ifpgfsys@@clipnext%
+ \ifpgfsys@eorule%
+ \pgfsysprotocol@literal{eoclip}%
+ \else%
+ \pgfsysprotocol@literal{clip}%
+ \fi%
+ \pgfsys@@clipnextfalse%
+ \fi%
+ \pgfsysprotocol@literal{newpath}}
+
+% Transformation:
+\def\pgfsys@transformshift#1#2{\pgf@sys@bp{#1}\pgf@sys@bp{#2}\pgfsysprotocol@literal{translate}}
+\def\pgfsys@transformxyscale#1#2{\pgfsysprotocol@literal{#1 #2 scale}}
+\def\pgfsys@transformcm#1#2#3#4#5#6{%
+ \pgfsysprotocol@literalbuffered{[#1 #2 #3 #4}\pgf@sys@bp{#5}\pgf@sys@bp{#6}\pgfsysprotocol@literal{] concat}}
+
+% Scopes
+\def\pgfsys@beginscope{\pgfsysprotocol@literal{save}}
+\def\pgfsys@endscope{\pgfsysprotocol@literal{restore}}
+
+\newif\ifpgfsys@ps@boxmode
+\def\pgfsys@begin@text{\pgfsys@ps@boxmodetrue}
+\def\pgfsys@end@text{}
+
+
+% Graphics state
+\def\pgfsys@setdash#1#2{%
+ \pgfsysprotocol@literalbuffered{[}%
+ \pgfutil@for\pgf@sys@temp:={#1}\do{\pgf@sys@bp{\pgf@sys@temp}}%
+ \pgfsysprotocol@literalbuffered{]}%
+ \pgf@sys@bp{#2}\pgfsysprotocol@literal{setdash}}
+\def\pgfsys@setlinewidth#1{\pgf@sys@bp{#1}\pgfsysprotocol@literal{pgfw}}
+\def\pgfsys@setmiterlimit#1{\pgfsysprotocol@literal{#1 setmiterlimit}}
+\def\pgfsys@buttcap{\pgfsysprotocol@literal{0 setlinecap}}
+\def\pgfsys@roundcap{\pgfsysprotocol@literal{1 setlinecap}}
+\def\pgfsys@rectcap{\pgfsysprotocol@literal{2 setlinecap}}
+\def\pgfsys@miterjoin{\pgfsysprotocol@literal{0 setlinejoin}}
+\def\pgfsys@roundjoin{\pgfsysprotocol@literal{1 setlinejoin}}
+\def\pgfsys@beveljoin{\pgfsysprotocol@literal{2 setlinejoin}}
+\def\pgfsys@color@rgb@stroke#1#2#3{\pgfsysprotocol@literal{/pgfsc{#1 #2 #3 setrgbcolor}def}\pgf@strokecolortrue}
+\def\pgfsys@color@rgb@fill#1#2#3{\pgfsysprotocol@literal{/pgffc{#1 #2 #3 setrgbcolor}def}\pgf@fillcolortrue}
+\def\pgfsys@color@rgb#1#2#3{\pgfsys@color@reset\pgfsysprotocol@literal{#1 #2 #3 setrgbcolor}}
+\def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgfsysprotocol@literal{/pgfsc{#1 #2 #3 #4 setcmykcolor}def}\pgf@strokecolortrue}
+\def\pgfsys@color@cmyk@fill#1#2#3#4{\pgfsysprotocol@literal{/pgffc{#1 #2 #3 #4 setcmykcolor}def}\pgf@fillcolortrue}
+\def\pgfsys@color@cmyk#1#2#3#4{\pgfsys@color@reset\pgfsysprotocol@literal{#1 #2 #3 #4 setcmykcolor}}
+\def\pgfsys@color@cmy@stroke#1#2#3{\pgfsysprotocol@literal{/pgfsc{#1 #2 #3 0 setcmykcolor}def}\pgf@strokecolortrue}
+\def\pgfsys@color@cmy@fill#1#2#3{\pgfsysprotocol@literal{/pgffc{#1 #2 #3 0 setcmykcolor}def}\pgf@fillcolortrue}
+\def\pgfsys@color@cmy#1#2#3{\pgfsys@color@reset\pgfsysprotocol@literal{#1 #2 #3 0 setcmykcolor}}
+\def\pgfsys@color@gray@stroke#1{\pgfsysprotocol@literal{/pgfsc{#1 setgray}def}\pgf@strokecolortrue}
+\def\pgfsys@color@gray@fill#1{\pgfsysprotocol@literal{/pgffc{#1 setgray}def}\pgf@fillcolortrue}
+\def\pgfsys@color@gray#1{\pgfsys@color@reset\pgfsysprotocol@literal{#1 setgray}}
+\def\pgfsysps@color@resetnow{\pgfsysprotocol@literal{/pgfsc{}def/pgffc{}def}\pgf@strokecolorfalse\pgf@fillcolorfalse}%
+\def\pgfsys@color@reset{%
+ \ifpgfsys@color@reset@inorder%
+ \ifpgf@strokecolor%
+ \pgfsysps@color@resetnow%
+ \else%
+ \ifpgf@fillcolor%
+ \pgfsysps@color@resetnow%
+ \fi%
+ \fi%
+ \else%
+ \pgfsysps@color@resetnow%
+ \fi}
+
+
+% Opacity
+
+\def\pgfsys@fill@opacity#1{%
+ \pgfsysprotocol@literal{#1 .pgfsetfillopacityalpha}
+}
+\def\pgfsys@stroke@opacity#1{%
+ \pgfsysprotocol@literal{#1 .pgfsetstrokeopacityalpha}
+}
+
+% Objects
+\newcount\pgf@objectcount
+\def\pgfsys@defobject#1#2#3#4{%
+ \global\advance\pgf@objectcount by 1%
+ \expandafter\xdef\csname#1\endcsname{\the\pgf@objectcount}%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ #4%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@@temp%
+ \pgf@sys@postscript@object{/pgf\csname#1\endcsname{gsave exec \pgfsys@@temp\space grestore} bind def}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfsys@temp%
+}
+\def\pgfsys@useobject#1#2{%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedfalse%
+ #2%
+ \pgfsysprotocol@invokecurrentprotocol%
+ \pgfsys@invoke{pgf\csname#1\endcsname}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfsys@temp}
+
+% Shadings
+
+\def\pgfsys@horishading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathsetlength\pgf@x{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@sys@bp@correct{\pgf@x}%
+ \pgf@y=\pgf@max%
+ \pgf@sys@bp@correct{\pgf@y}%
+ \xdef\pgfutil@tempa{\hbox to \the\pgf@max{%
+ \noexpand\vrule width0pt height\the\pgf@xa%
+ \noexpand\pgfsys@beginpurepicture%
+ \noexpand\pgfsys@rect{0pt}{0pt}{\the\pgf@max}{\the\pgf@xa}%
+ \noexpand\pgfsys@clipnext%
+ \noexpand\pgfsys@discardpath%
+ \noexpand\pgfsys@invoke{\pgf@domb\space \pgf@sys@tonumber{\pgf@x} pgfH\pgf@shading@model\space \pgf@psfuncs\space pop}%
+ \hss%
+ \noexpand\pgfsys@endpurepicture}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\pgfsys@vertshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathsetlength\pgf@x{#2}%
+ \pgf@xa=\pgf@x%
+ \pgf@sys@bp@correct{\pgf@x}%
+ \pgf@y=\pgf@max%
+ \pgf@sys@bp@correct{\pgf@y}%
+ \xdef\pgfutil@tempa{\hbox to \the\pgf@xa{%
+ \noexpand\vrule width0pt height\the\pgf@max%
+ \noexpand\pgfsys@beginpurepicture%
+ \noexpand\pgfsys@rect{0pt}{0pt}{\the\pgf@xa}{\the\pgf@max}%
+ \noexpand\pgfsys@clipnext%
+ \noexpand\pgfsys@discardpath%
+ \noexpand\pgfsys@invoke{\pgf@domb\space \pgf@sys@tonumber{\pgf@x} pgfV\pgf@shading@model\space \pgf@psfuncs\space pop}%
+ \hss%
+ \noexpand\pgfsys@endpurepicture}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\pgfsys@radialshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgf@process{#2}%
+ \pgf@sys@bp@correct{\pgf@x}%
+ \pgf@sys@bp@correct{\pgf@y}%
+ \pgf@xa=2\pgf@max%
+ \pgf@sys@bp@correct{\pgf@max}%
+ \advance\pgf@x by \pgf@max%
+ \advance\pgf@y by \pgf@max%
+ \xdef\pgfutil@tempa{\hbox to \the\pgf@xa{%
+ \noexpand\vrule width0pt height\the\pgf@xa%
+ \noexpand\pgfsys@beginpurepicture%
+ \noexpand\pgfsys@invoke{%
+ \pgf@domb\space \pgf@sys@tonumber{\pgf@y} \pgf@sys@tonumber{\pgf@x} \pgf@sys@tonumber{\pgf@max} pgfR1\pgf@shading@model\space
+ \pgf@psfuncs\space \pgf@firstcolor\space \pgf@doma\space pgfR2\pgf@shading@model}%
+ \hss%
+ \noexpand\pgfsys@endpurepicture}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\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%
+ \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%
+ \xdef\pgfutil@tempa{%
+ \hbox to\the\pgf@x{\vbox to\the\pgf@y{\vfil
+ \noexpand\pgfsys@beginpurepicture%
+ \noexpand\pgfsys@invoke{%
+ \pgf@sys@tonumber{\pgf@xc} \pgf@sys@tonumber{\pgf@yc} translate
+ 1.1 setlinewidth [] 0 setdash 0 setlinecap
+ /pgfproc {#4} bind def
+ \pgf@sys@tonumber{\pgf@ya} 1 \pgf@sys@tonumber{\pgf@yb}
+ {
+ \pgf@sys@tonumber{\pgf@xa} 1 \pgf@sys@tonumber{\pgf@xb}
+ { 1 index 2 copy pgfproc \pgf@shading@ps@device\space moveto 1.1 0 rlineto stroke }
+ for
+ pop
+ }
+ for
+ }%
+ \noexpand\pgfsys@endpurepicture
+ }\hfil}%
+ }%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+
+%
+% Patterns
+%
+
+
+\def\pgfsys@declarepattern#1#2#3#4#5#6#7{%
+ % Start building the pattern dictionary:
+ \pgf@xa=#2\relax%
+ \pgf@ya=#3\relax%
+ \pgf@xb=#4\relax%
+ \pgf@yb=#5\relax%
+ \pgf@xc=#6\relax%
+ \pgf@yc=#7\relax%
+ \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@sys@bp@correct\pgf@xc%
+ \pgf@sys@bp@correct\pgf@yc%
+ \pgfsys@@declarepattern{#1}%
+}
+
+\def\pgfsys@@declarepattern#1#2#3#4#5#6#7#8#9{%
+ \pgfutil@tempdima=#6\relax%
+ \pgfutil@tempdimb=#7\relax%
+ \pgf@sys@bp@correct\pgfutil@tempdima%
+ \pgf@sys@bp@correct\pgfutil@tempdimb%
+ \edef\pgf@sys@marshal{%
+ \noexpand\pgfutil@insertatbegincurrentpage{\noexpand\pgfsys@outerinvoke{
+ save true setglobal globaldict begin /pgfpat#1
+ {
+ \ifnum#9=0 [/Pattern /DeviceRGB] \else /Pattern \fi\space
+ setcolorspace
+ gsave
+ initgraphics
+ <<
+ /Type /Pattern
+ /PatternType 1
+ /PaintType \ifnum#9=0 2 \else 1 \fi
+ /TilingType 1
+ /BBox [\pgf@sys@tonumber\pgf@xa\space\pgf@sys@tonumber\pgf@ya\space\pgf@sys@tonumber\pgf@xb\space\pgf@sys@tonumber\pgf@yb]
+ /XStep \pgf@sys@tonumber\pgf@xc\space
+ /YStep \pgf@sys@tonumber\pgf@yc\space
+ /Matrix [#2\space#3\space#4\space#5\space\pgf@sys@tonumber\pgfutil@tempdima\space\pgf@sys@tonumber\pgfutil@tempdimb]
+ /PaintProc
+ { begin 2 dict begin #8\space end end } bind
+ >>
+ matrix
+ makepattern
+ %/pgfpat#1\space exch def
+ grestore
+ setcolor
+ } bind def end restore
+ }}% <<
+ }%
+ \pgf@sys@marshal%
+}
+
+\def\pgfsys@setpatternuncolored#1#2#3#4{%
+ \pgfsysprotocol@literal{/pgffc{#2 #3 #4 pgfpat#1}def}%
+% [/Pattern /DeviceRGB] setcolorspace
+% #2 #3 #4 pgfpat#1\space setcolor
+% }def}%
+ \pgf@fillcolortrue%
+}
+
+\def\pgfsys@setpatterncolored#1{%
+ \pgfsysprotocol@literal{/pgffc{pgfpat#1}def}%/Pattern setcolorspace
+% pgfpat#1\space setcolor}def}%
+ \pgf@fillcolortrue%
+}
+
+
+
+\def\pgfsys@atbegindocument{%
+ % Parameters to horizontal pre axishade: \pgf@domb x
+ \pgf@sys@postscript@header{/pgfHrgb{%
+ /pgfheight exch def 0.75 setlinewidth [] 0 setdash
+ /pgfshade {pgfArgb} def /pgfdir { dup 0 moveto
+ dup 5 index lineto } bind def} bind def}%
+
+ % Parameters to vertical pre axishade: \pgf@domb x
+ \pgf@sys@postscript@header{/pgfVrgb{%
+ /pgfheight exch def 0.75 setlinewidth [] 0 setdash
+ /pgfshade {pgfArgb} def /pgfdir { dup 0 exch moveto dup 5 index
+ exch lineto } bind def} bind def}%
+
+ % Parameters to axishade: end x, start x, r-, g-, b- of first color, r-, g-, b- of second color
+ % Stack afterwards: end x
+ \pgf@sys@postscript@header{/pgfArgb{
+ /pgfdiff 8 index round cvi 8 index round cvi sub 2 mul 1 add def
+ 2 index 6 index sub pgfdiff div % put red-step on stack
+ 2 index 6 index sub pgfdiff div % put green-step on stack
+ 2 index 6 index sub pgfdiff div % put blue-step on stack
+ pgfheight 9 index 9 index 9 index 14 index
+ pgfdiff {
+ 3 index 3 index 3 index setrgbcolor % Set color
+ pgfdir
+ stroke
+ 4 -1 roll 7 index add % red += incred
+ 4 -1 roll 6 index add % green += incgreen
+ 4 -1 roll 5 index add % blue += incblue
+ 4 -1 roll .5 sub % x += 0.5
+ } repeat
+ mark 15 1 roll cleartomark exch pop % leave only start x on stack
+ }bind def }
+
+ % Parameters to radialshade pre: \pgf@domb y x max
+ \pgf@sys@postscript@header{/pgfR1rgb{
+ newpath dup dup dup 0 360 arc clip newpath
+ dup /pgfendx exch def
+ /pgfendy exch def
+ 0.875 setlinewidth
+ [] 0 setdash
+ /pgfshade {pgfRrgb} def
+ /pgfstartx exch def
+ /pgfstarty exch def
+ /pgfdiffx pgfendx pgfstartx sub def
+ /pgfdiffy pgfendy pgfstarty sub def
+ dup /pgfdomb exch def
+ }bind def }
+
+ % Parameters to radialshade post: \pgf@firstcolor \pgf@doma
+ \pgf@sys@postscript@header{/pgfR2rgb{
+ newpath 0.5 add pgfcircx pgfcircy 3 2 roll 0 360 arc
+ setrgbcolor fill pop}bind def }%
+
+ % Parameters to radialshade: end x, start x, r-, g-, b- of first color, r-, g-, b- of second color
+ % Stack afterwards: end x
+ \pgf@sys@postscript@header{/pgfRrgb{
+ /pgfdiff 8 index round cvi 8 index round cvi sub 4 mul 1 add def
+ /pgfcircx pgfstartx 9 index pgfdiffx pgfdomb div mul add def
+ /pgfcircy pgfstarty 9 index pgfdiffy pgfdomb div mul add def
+ /pgfcircxe pgfstartx 8 index pgfdiffx pgfdomb div mul add def
+ /pgfcircye pgfstarty 8 index pgfdiffy pgfdomb div mul add def
+ /pgfxstep pgfcircxe pgfcircx sub pgfdiff div def
+ /pgfystep pgfcircye pgfcircy sub pgfdiff div def
+ 2 index 6 index sub pgfdiff div % put red-step on stack
+ 2 index 6 index sub pgfdiff div % put green-step on stack
+ 2 index 6 index sub pgfdiff div % put green-step on stack
+ 8 index 8 index 8 index 13 index
+ pgfdiff {
+ 3 index 3 index 3 index setrgbcolor % Set color
+ pgfcircx pgfcircy 2 index 0 360 arc closepath
+ stroke
+ 4 -1 roll 6 index add % red += incred
+ 4 -1 roll 5 index add % green += incgreen
+ 4 -1 roll 4 index add % blue += incblue
+ 4 -1 roll .25 sub % x += 0.25
+ /pgfcircx pgfcircx pgfxstep add def
+ /pgfcircy pgfcircy pgfystep add def
+ } repeat
+ mark 14 1 roll cleartomark exch pop % leave only start x on stack
+ }bind def}
+
+ % Parameters to horizontal pre axishade: \pgf@domb x
+ \pgf@sys@postscript@header{/pgfHcmyk{
+ /pgfheight exch def 0.75 setlinewidth [] 0 setdash
+ /pgfshade {pgfAcmyk} def /pgfdir { dup 0 moveto
+ dup 6 index lineto } bind def} bind def}%
+
+ % Parameters to vertical pre axishade: \pgf@domb x
+ \pgf@sys@postscript@header{/pgfVcmyk{
+ /pgfheight exch def 0.75 setlinewidth [] 0 setdash
+ /pgfshade {pgfAcmyk} def /pgfdir { dup 0 exch moveto dup 6 index
+ exch lineto } bind def} bind def}%
+
+ % Parameters to axishade: end x, start x, c-, m-, y-, k- of first color, c-, m-, y-, k- of second color
+ \pgf@sys@postscript@header{/pgfAcmyk{
+ /pgfdiff 10 index round cvi 10 index round cvi sub 2 mul 1 add def
+ 3 index 8 index sub pgfdiff div % put cyan-step on stack
+ 3 index 8 index sub pgfdiff div % put magenta-step on stack
+ 3 index 8 index sub pgfdiff div % put yellow-step on stack
+ 3 index 8 index sub pgfdiff div % put black-step on stack
+ pgfheight 12 index 12 index 12 index 12 index 18 index
+ pgfdiff {
+ 4 index 4 index 4 index 4 index setcmykcolor % Set color
+ pgfdir
+ stroke
+ 5 -1 roll 9 index add % cyan += inccyan
+ 5 -1 roll 8 index add % magenta += incmagenta
+ 5 -1 roll 7 index add % yellow += incyellow
+ 5 -1 roll 6 index add % black += incblack
+ 5 -1 roll .5 sub % x += 0.5
+ } repeat
+ mark 19 1 roll cleartomark exch pop % leave only start x on stack
+ }bind def }%
+
+ % Parameters to radialshade pre: \pgf@domb y x max
+ \pgf@sys@postscript@header{/pgfR1cmyk{
+ newpath dup dup dup 0 360 arc clip newpath
+ dup /pgfendx exch def
+ /pgfendy exch def
+ 0.875 setlinewidth
+ [] 0 setdash
+ /pgfshade {pgfRcmyk} def
+ /pgfstartx exch def
+ /pgfstarty exch def
+ /pgfdiffx pgfendx pgfstartx sub def
+ /pgfdiffy pgfendy pgfstarty sub def
+ dup /pgfdomb exch def
+ }bind def }%
+
+ % Parameters to radialshade post: \pgf@firstcolor \pgf@doma
+ \pgf@sys@postscript@header{/pgfR2cmyk{
+ newpath 0.5 add pgfcircx pgfcircy 3 2 roll 0 360 arc
+ setcmykcolor fill pop}bind def }%
+
+ % Parameters to radialshade: end x, start x, c-, m-, y-, k- of first color, c-, m-, y-, k- of second color
+ \pgf@sys@postscript@header{/pgfRcmyk{
+ /pgfdiff 10 index round cvi 10 index round cvi sub 4 mul 1 add def
+ /pgfcircx pgfstartx 11 index pgfdiffx pgfdomb div mul add def
+ /pgfcircy pgfstarty 11 index pgfdiffy pgfdomb div mul add def
+ /pgfcircxe pgfstartx 10 index pgfdiffx pgfdomb div mul add def
+ /pgfcircye pgfstarty 10 index pgfdiffy pgfdomb div mul add def
+ /pgfxstep pgfcircxe pgfcircx sub pgfdiff div def
+ /pgfystep pgfcircye pgfcircy sub pgfdiff div def
+ 3 index 8 index sub pgfdiff div % put cyan-step on stack
+ 3 index 8 index sub pgfdiff div % put magenta-step on stack
+ 3 index 8 index sub pgfdiff div % put yellow-step on stack
+ 3 index 8 index sub pgfdiff div % put black-step on stack
+ 11 index 11 index 11 index 11 index 17 index
+ pgfdiff {
+ 4 index 4 index 4 index 4 index setcmykcolor % Set color
+ pgfcircx pgfcircy 2 index 0 360 arc closepath
+ stroke
+ 5 -1 roll 8 index add % cyan += inccyan
+ 5 -1 roll 7 index add % magenta += incmagenta
+ 5 -1 roll 6 index add % yellow += incyellow
+ 5 -1 roll 5 index add % black += incblack
+ 5 -1 roll .25 sub % x += 0.25
+ /pgfcircx pgfcircx pgfxstep add def
+ /pgfcircy pgfcircy pgfystep add def
+ } repeat
+ mark 18 1 roll cleartomark exch pop % leave only start x on stack
+ }bind def}%
+
+ % Parameters to horizontal pre axishade: \pgf@domb x
+ \pgf@sys@postscript@header{/pgfHgray{
+ /pgfheight exch def 0.75 setlinewidth [] 0 setdash
+ /pgfshade {pgfAgray} def /pgfdir { dup 0 moveto
+ dup 3 index lineto } bind def} bind def}%
+
+ % Parameters to vertical pre axishade: \pgf@domb x
+ \pgf@sys@postscript@header{/pgfVgray{
+ /pgfheight exch def 0.75 setlinewidth [] 0 setdash
+ /pgfshade {pgfAgray} def /pgfdir { dup 0 exch moveto dup 3 index
+ exch lineto } bind def} bind def}%
+
+ % Parameters to axishade: end x, start x, g of first color, g of second color
+ \pgf@sys@postscript@header{/pgfAgray{
+ /pgfdiff 4 index round cvi 4 index round cvi sub 2 mul 1 add def
+ dup 2 index sub pgfdiff div % put gray-step on stack
+ pgfheight 3 index 6 index
+ pgfdiff {
+ 1 index setgray % Set color
+ pgfdir
+ stroke
+ exch 3 index add % gray += incgray
+ exch .5 sub % x += 0.5
+ } repeat
+ mark 7 1 roll cleartomark exch pop % leave only start x on stack
+ }bind def }%
+
+ % Parameters to radialshade pre: \pgf@domb y x max
+ \pgf@sys@postscript@header{/pgfR1gray{
+ newpath dup dup dup 0 360 arc clip newpath
+ dup /pgfendx exch def
+ /pgfendy exch def
+ 0.875 setlinewidth
+ [] 0 setdash
+ /pgfshade {pgfRgray} def
+ /pgfstartx exch def
+ /pgfstarty exch def
+ /pgfdiffx pgfendx pgfstartx sub def
+ /pgfdiffy pgfendy pgfstarty sub def
+ dup /pgfdomb exch def
+ }bind def }%
+
+ % Parameters to radialshade post: \pgf@firstcolor \pgf@doma
+ \pgf@sys@postscript@header{/pgfR2gray{
+ newpath 0.5 add pgfcircx pgfcircy 3 2 roll 0 360 arc
+ setgray fill pop}bind def }%
+
+ % Parameters to radialshade: end x, start x, g of first color, g of second color
+ \pgf@sys@postscript@header{/pgfRgray{
+ /pgfdiff 4 index round cvi 4 index round cvi sub 4 mul 1 add def
+ /pgfcircx pgfstartx 5 index pgfdiffx pgfdomb div mul add def
+ /pgfcircy pgfstarty 5 index pgfdiffy pgfdomb div mul add def
+ /pgfcircxe pgfstartx 4 index pgfdiffx pgfdomb div mul add def
+ /pgfcircye pgfstarty 4 index pgfdiffy pgfdomb div mul add def
+ /pgfxstep pgfcircxe pgfcircx sub pgfdiff div def
+ /pgfystep pgfcircye pgfcircy sub pgfdiff div def
+ dup 2 index sub pgfdiff div % put gray-step on stack
+ 2 index 5 index
+ pgfdiff {
+ 1 index setgray % Set color
+ pgfcircx pgfcircy 2 index 0 360 arc closepath
+ stroke
+ exch 2 index add % gray += incgray
+ exch .25 sub % x += 0.25
+ /pgfcircx pgfcircx pgfxstep add def
+ /pgfcircy pgfcircy pgfystep add def
+ } repeat
+ mark 6 1 roll cleartomark exch pop % leave only start x on stack
+ }bind def}%
+}
+
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-common-svg.def b/graphics/pgf/base/tex/pgfsys-common-svg.def
new file mode 100644
index 0000000000..9dcb2e0e7c
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-common-svg.def
@@ -0,0 +1,1613 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-common-svg.def}
+
+
+% Driver commands for svg
+
+
+
+% Helping functions:
+\def\pgf@sys@svg@make@defs#1{\pgf@sys@fail{svg defs}}
+\def\pgf@sys@svg@ref@defs#1{\pgf@sys@fail{svg defs}}
+\let\pgf@sys@svgpath=\pgfutil@empty
+\def\pgf@sys@svgnum#1{%
+ {%
+ \pgf@x=#1\relax%
+ \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}%
+ \pgfutil@toks@\expandafter\expandafter\expandafter{\expandafter\pgf@sys@svgpath\temp}%
+ \xdef\pgf@sys@svgpath{\the\pgfutil@toks@}%
+ }%
+}
+\def\pgf@sys@addtosvgpath#1{\pgfutil@g@addto@macro\pgf@sys@svgpath{#1\space}}
+\def\pgf@sys@flushsvgpath{\pgfsysprotocol@literal{\pgf@sys@svgpath}\global\let\pgf@sys@svgpath=\pgfutil@empty}
+\def\pgf@sys@svg@gs#1{%
+ {%
+ \pgfsysprotocol@literal{<g #1>\pgfsys@svg@newline}%
+ }%
+ \global\advance\pgf@sys@svg@scopecount by1\relax%
+}
+\newcount\pgf@sys@svg@objectcount
+
+{\catcode`\%=12
+\gdef\pgf@sys@svg@percentchar{%}
+}
+{\catcode`\#=11
+\gdef\pgf@sys@svg@hash{#}
+}
+
+% Path construction:
+\def\pgfsys@lineto#1#2{\pgf@sys@addtosvgpath{L}\pgf@sys@svgnum{#1}\pgf@sys@svgnum{#2}}
+\def\pgfsys@moveto#1#2{\pgf@sys@addtosvgpath{M}\pgf@sys@svgnum{#1}\pgf@sys@svgnum{#2}}
+\def\pgfsys@curveto#1#2#3#4#5#6{%
+ \pgf@sys@addtosvgpath{C}%
+ \pgf@sys@svgnum{#1}\pgf@sys@svgnum{#2}%
+ \pgf@sys@svgnum{#3}\pgf@sys@svgnum{#4}%
+ \pgf@sys@svgnum{#5}\pgf@sys@svgnum{#6}}
+\def\pgfsys@rect#1#2#3#4{%
+ \pgfsys@moveto{#1}{#2}%
+ \pgf@sys@addtosvgpath{h}\pgf@sys@svgnum{#3}%
+ \pgf@sys@addtosvgpath{v}\pgf@sys@svgnum{#4}%
+ \pgf@sys@addtosvgpath{h}{\pgf@x=#3\pgf@x=-\pgf@x\pgf@sys@svgnum{\pgf@x}}%
+ \pgfsys@closepath}
+\def\pgfsys@closepath{\pgf@sys@addtosvgpath{Z}}
+
+% Path usage:
+\newif\ifpgf@sys@svg@clipnext
+\def\pgf@sys@svg@possiblyclippedpath#1{%
+ \edef\pgf@sys@cacheref{\pgfsys@id@refcurrent}%
+ \pgfsys@if@fresh@currentid{\csname pgf@sys@svg@path@\pgf@sys@cacheref\endcsname}{}%
+ \let\pgfsys@anim@ba@d\pgfutil@empty
+ \csname pgfsys@anim@ba@\pgf@sys@cacheref\endcsname%
+ \ifpgf@sys@svg@clipnext%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \pgfsysprotocol@literal{%
+ <clipPath id="\pgfsys@if@fresh@currentid{\pgf@sys@cacheref}{pgfcp\the\pgf@sys@svg@objectcount}clip">
+ <path id="\pgfsys@if@fresh@currentid{\pgf@sys@cacheref}{pgfcp\the\pgf@sys@svg@objectcount}" d="}%
+ \ifx\pgfsys@anim@ba@d\pgfutil@empty\pgf@sys@flushsvgpath\else\pgfsysprotocol@literal{\pgfsys@anim@ba@d}\fi%
+ \pgfsysprotocol@literal{"/> </clipPath>\pgfsys@svg@newline }
+ \pgfsysprotocol@literal{<use xlink:href="\#\pgfsys@if@fresh@currentid{\pgf@sys@cacheref}{pgfcp\the\pgf@sys@svg@objectcount}" %
+ \ifx\pgfsys@anim@ba@d\pgfutil@empty\else%
+ \ifx\pgfsys@anim@ba@markerstart\pgfutil@empty\else%
+ marker-start="url(\#\pgfsys@anim@ba@markerstart)" %
+ \fi%
+ \ifx\pgfsys@anim@ba@markerend\pgfutil@empty\else%
+ marker-end="url(\#\pgfsys@anim@ba@markerend)" %
+ \fi%
+ \fi%
+ #1/>\pgfsys@svg@newline }%
+ \pgf@sys@svg@gs{clip-path="url(\#\pgfsys@if@fresh@currentid{\pgfsys@id@refcurrent}{pgfcp\the\pgf@sys@svg@objectcount}clip)"}
+ \pgf@sys@svg@clipnextfalse%
+ \else%
+ \pgfsysprotocol@literal{<path\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent"}{} d="}%
+ \ifx\pgfsys@anim@ba@d\pgfutil@empty\pgf@sys@flushsvgpath\else\pgfsysprotocol@literal{\pgfsys@anim@ba@d}\fi%
+ \pgfsysprotocol@literal{" %
+ \ifx\pgfsys@anim@ba@d\pgfutil@empty\else%
+ \ifx\pgfsys@anim@ba@markerstart\pgfutil@empty\else%
+ marker-start="url(\#\pgfsys@anim@ba@markerstart)" %
+ \fi%
+ \ifx\pgfsys@anim@ba@markerend\pgfutil@empty\else%
+ marker-end="url(\#\pgfsys@anim@ba@markerend)" %
+ \fi%
+ \fi%
+ #1/>\pgfsys@svg@newline }%
+ \fi%
+ \pgfsys@invalidate@currentid%
+}
+\def\pgfsys@stroke{\pgf@sys@svg@possiblyclippedpath{fill="none"}}
+\def\pgfsys@fill{\pgf@sys@svg@possiblyclippedpath{stroke="none"}}
+\def\pgfsys@fillstroke{\pgf@sys@svg@possiblyclippedpath{}}
+\def\pgfsys@clipnext{\pgf@sys@svg@clipnexttrue}
+\def\pgfsys@discardpath{%
+ \ifpgf@sys@svg@clipnext%
+ \edef\pgf@sys@cacheref{\pgfsys@id@refcurrent}%
+ \let\pgfsys@anim@ba@d\pgfutil@empty
+ \csname pgfsys@anim@ba@\pgf@sys@cacheref\endcsname%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \pgfsysprotocol@literal{%
+ <clipPath id="pgfcp\the\pgf@sys@svg@objectcount">%
+ <path\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent"}{} d="}%
+ \ifx\pgfsys@anim@ba@d\pgfutil@empty\pgf@sys@flushsvgpath\else\pgfsysprotocol@literal{\pgfsys@anim@ba@d}\fi%
+ \pgfsysprotocol@literal{"/> </clipPath>\pgfsys@svg@newline }
+ \pgf@sys@svg@gs{clip-path="url(\#pgfcp\the\pgf@sys@svg@objectcount)"}
+ \pgf@sys@svg@clipnextfalse%
+ \else%
+ \global\let\pgf@sys@svgpath=\pgfutil@empty
+ \fi%
+ \pgfsys@invalidate@currentid%
+}
+
+% Fill rules:
+\def\pgfsys@eoruletrue{\pgf@sys@svg@gs{fill-rule="evenodd"}}
+\def\pgfsys@eorulefalse{\pgf@sys@svg@gs{fill-rule="nonzero"}}
+
+% Transparency:
+\def\pgfsys@opacity#1{\pgf@sys@svg@gs{opacity="#1"}}
+\def\pgfsys@stroke@opacity#1{\pgf@sys@svg@gs{stroke-opacity="#1"}}
+\def\pgfsys@fill@opacity#1{\pgf@sys@svg@gs{fill-opacity="#1"}\def\pgf@sys@svg@opacity{#1}}
+\def\pgf@sys@svg@opacity{1}
+\def\pgfsys@transparencygroupfrombox#1{%
+ \setbox#1=\hbox{%
+ \pgfsys@invoke{<g opacity="\pgf@sys@svg@opacity" stroke-opacity="1" fill-opacity="1">\pgfsys@svg@newline }%
+ \box#1%
+ \pgfsys@invoke{</g>\pgfsys@svg@newline }%
+ }%
+}
+
+% Transformation:
+\def\pgfsys@transformcm#1#2#3#4#5#6{%
+ {\pgf@x=#5\pgf@y=#6%
+ \edef\pgf@temp{#1,#2,#3,#4}%
+ \ifx\pgf@temp\pgf@sys@svg@idtrans@text%
+ \ifdim\pgf@x=0pt\relax%
+ \ifdim\pgf@y=0pt%
+ \else%
+ \pgf@sys@svg@gs{transform="translate(\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}%
+ \fi%
+ \else%
+ \pgf@sys@svg@gs{transform="translate(\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}%
+ \fi%
+ \else%
+ \pgf@sys@svg@gs{transform="matrix(#1,#2,#3,#4,\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}%
+ \fi}}
+\def\pgfsys@transformshift#1#2{%
+ {\pgf@x=#1\pgf@y=#2%
+ \ifdim\pgf@x=0pt\relax%
+ \ifdim\pgf@y=0pt%
+ \else%
+ \pgf@sys@svg@gs{transform="translate(\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}%
+ \fi%
+ \else%
+ \pgf@sys@svg@gs{transform="translate(\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}%
+ \fi}}
+\def\pgfsys@transformxyscale#1#2{%
+ {\pgf@x=#1pt\pgf@y=#2pt%
+ \pgf@sys@svg@gs{transform="scale(\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}}}
+\def\pgfsys@viewboxmeet{\pgf@sys@svg@viewbox{meet}}
+\def\pgfsys@viewboxslice{\pgf@sys@svg@viewbox{slice}}
+\def\pgf@sys@svg@viewbox#1#2#3#4#5#6#7#8#9{%
+ {%
+ \edef\pgf@sys@cacheref{\pgfsys@id@refcurrent}%
+ \csname pgfsys@anim@ba@\pgf@sys@cacheref\endcsname%
+ \pgf@x#2%
+ \pgf@y#3%
+ \pgf@xa#4%
+ \pgf@ya#5%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \pgf@xb#6%
+ \pgf@yb#7%
+ \pgf@xc#8%
+ \pgf@yc#9%
+ \advance\pgf@xc by-\pgf@xb%
+ \advance\pgf@yc by-\pgf@yb%
+ \pgfsysprotocol@literal{<svg
+ overflow="visible"
+ preserveAspectRatio="xMidYMid #1"
+ \pgfsys@if@fresh@currentid{ id="\pgf@sys@cacheref"}{}
+ x="\pgf@sys@tonumber{\pgf@x}"
+ y="\pgf@sys@tonumber{\pgf@y}"
+ width="\pgf@sys@tonumber{\pgf@xa}"
+ height="\pgf@sys@tonumber{\pgf@ya}"
+ viewBox="%
+ \ifx\pgfsys@anim@ba@viewBox\pgfutil@empty%
+ \pgf@sys@tonumber{\pgf@xb} \pgf@sys@tonumber{\pgf@yb} \pgf@sys@tonumber{\pgf@xc} \pgf@sys@tonumber{\pgf@yc}%
+ \else%
+ \pgfsys@anim@ba@viewBox%
+ \fi%
+ ">}%
+ \pgfsys@invalidate@currentid%
+ }%
+}
+\def\pgfsys@endviewbox{\pgfsysprotocol@literal{</svg>}}
+
+
+% Scopes
+\newcount\pgf@sys@svg@scopecount
+
+\newif\ifpgfsys@svg@boxmode
+\def\pgfsys@begin@text{\pgfsys@beginscope\pgfsys@svg@boxmodetrue}
+\def\pgfsys@end@text{\pgfsys@endscope}
+
+\def\pgfsys@beginscope{%
+ \edef\pgf@sys@svg@thescopecount{\the\pgf@sys@svg@scopecount}%
+ \begingroup%
+ \pgf@sys@svg@scopecount=0\relax%
+}
+\def\pgfsys@beginscope@#1{%
+ \edef\pgf@sys@svg@thescopecount{\the\pgf@sys@svg@scopecount}%
+ \begingroup%
+ \pgf@sys@svg@scopecount=1\relax%
+ \pgfsysprotocol@literal{<g#1>\pgfsys@svg@newline }%
+}
+\def\pgfsys@endscope{%
+ \loop%
+ \ifnum\pgf@sys@svg@scopecount>0\relax%
+ \pgfsysprotocol@literal{</g>\pgfsys@svg@newline }%
+ \advance\pgf@sys@svg@scopecount by-1\relax%
+ \repeat%
+ \endgroup%
+ \global\pgf@sys@svg@scopecount=\pgf@sys@svg@thescopecount\relax%
+}
+\newif\ifpgfsys@svg@close@strokenone
+\def\pgfsys@begin@idscope{%
+ \begingroup%
+ \pgfsys@if@fresh@currentid{%
+ \edef\pgf@sys@cacheref{\pgfsys@id@refcurrent}%
+ \let\pgf@sys@svg@ba@gs\pgfutil@empty%
+ \csname pgfsys@anim@ba@\pgf@sys@cacheref\endcsname%
+ \pgfsys@beginscope@{ id="\pgf@sys@cacheref" \pgf@sys@svg@ba@gs\pgfsys@svg@rdf}%
+ \expandafter\let\expandafter\pgf@sys@svg@end@id@scope@code\csname pgf@sys@att@end@\pgfsys@id@refcurrent\endcsname%
+ \let\pgf@sys@svg@end@id@scope\pgfsys@endscope%
+ \csname pgf@sys@att@beg@\pgfsys@id@refcurrent\endcsname%
+ }{%
+ \ifx\pgfsys@svg@rdf\pgfutil@empty%
+ \let\pgf@sys@svg@end@id@scope@code\relax%
+ \let\pgf@sys@svg@end@id@scope\relax%
+ \else%
+ \pgfsys@beginscope@{\pgfsys@svg@rdf}%
+ \let\pgf@sys@svg@end@id@scope@code\relax%
+ \let\pgf@sys@svg@end@id@scope\pgfsys@endscope%
+ \fi%
+ }%
+ \expandafter\global\expandafter\let\csname pgf@sys@att@beg@\pgfsys@id@refcurrent\endcsname\relax%
+ \expandafter\global\expandafter\let\csname pgf@sys@att@end@\pgfsys@id@refcurrent\endcsname\relax%
+ \ifpgfsys@svg@boxmode\pgfsysprotocol@literal{<g stroke="none">}\pgfsys@svg@close@strokenonetrue\fi%
+ \pgfsys@invalidate@currentid%
+ \begingroup%
+ \global\let\pgfsys@svg@rdf\pgfutil@empty%
+}
+\def\pgfsys@end@idscope{%
+ \endgroup%
+ \ifpgfsys@svg@close@strokenone\pgfsysprotocol@literal{</g>}\fi%
+ \pgf@sys@svg@end@id@scope@code%
+ \pgf@sys@svg@end@id@scope%
+ \endgroup%
+}
+\let\pgfsys@svg@rdf\pgfutil@empty%
+
+% IDs
+
+\newcount\pgf@sys@svg@type@count
+
+\def\pgfsys@clean@type#1#2{%
+ \expandafter\let\expandafter#1\csname pgf@sys@svg@lookup@#2\endcsname%
+ \if#1\relax%
+ \global\advance\pgf@sys@svg@type@count by1\relax%
+ \expandafter\xdef\csname pgf@sys@svg@lookup@#2\endcsname{t\the\pgf@sys@svg@type@count}%
+ \expandafter\let\expandafter#1\csname pgf@sys@svg@lookup@#2\endcsname%
+ \fi%
+}
+
+
+
+% Graphics state
+\def\pgfsys@setdash#1#2{%
+ {%
+ \pgf@xa#2\relax%
+ \edef\pgf@test@dashpattern{#1}%
+ \ifx\pgf@test@dashpattern\pgfutil@empty%
+ \pgf@sys@svg@gs{stroke-dasharray="none" stroke-dashoffset="\pgf@sys@tonumber\pgf@xa"}%
+ \else%
+ \let\pgf@sys@svg@parsed@dash\pgfutil@empty%
+ \expandafter\pgf@sys@svg@parse@dash\pgf@test@dashpattern,\relax%
+ \pgf@sys@svg@gs{stroke-dasharray="\pgf@sys@svg@parsed@dash" stroke-dashoffset="\pgf@sys@tonumber\pgf@xa"}%
+ \fi%
+ }%
+}
+\def\pgf@sys@svg@parse@dash#1,{%
+ \pgf@x#1\relax%
+ \pgfutil@ifnextchar\relax{%
+ \edef\pgf@sys@svg@parsed@dash{\pgf@sys@svg@parsed@dash\pgf@sys@tonumber\pgf@x}%
+ }{%
+ \edef\pgf@sys@svg@parsed@dash{\pgf@sys@svg@parsed@dash\pgf@sys@tonumber\pgf@x,}%
+ \pgf@sys@svg@parse@dash%
+ }%
+}
+\def\pgfsys@setlinewidth#1{{\pgf@x=#1\pgf@sys@svg@gs{stroke-width="\pgf@sys@tonumber{\pgf@x}"}}}
+\def\pgfsys@setmiterlimit#1{\pgf@sys@svg@gs{stroke-miterlimit="#1"}}
+\def\pgfsys@buttcap{\pgf@sys@svg@gs{stroke-linecap="butt"}}
+\def\pgfsys@roundcap{\pgf@sys@svg@gs{stroke-linecap="round"}}
+\def\pgfsys@rectcap{\pgf@sys@svg@gs{stroke-linecap="square"}}
+\def\pgfsys@miterjoin{\pgf@sys@svg@gs{stroke-linejoin="miter"}}
+\def\pgfsys@roundjoin{\pgf@sys@svg@gs{stroke-linejoin="round"}}
+\def\pgfsys@beveljoin{\pgf@sys@svg@gs{stroke-linejoin="bevel"}}
+
+% Invisibility
+\def\pgfsys@begininvisible{\pgfsysprotocol@literal{<g visibility="hidden">\pgfsys@svg@newline }}
+\def\pgfsys@endinvisible{\pgfsysprotocol@literal{</g>}}
+\def\pgfsys@begininvisiblescope{\pgfsys@beginscope@{ visibility="hidden"}}
+\def\pgfsys@endinvisiblescope{\pgfsys@endscope}
+
+
+%
+% Color management
+%
+
+\def\pgf@sys@svg@rgb@to@hash#1#2#3{%
+ {%
+ \pgf@sys@svg@do@color{#1}%
+ \let\pgf@sys@svg@ra\pgf@sys@svg@hex@first%
+ \let\pgf@sys@svg@rb\pgf@sys@svg@hex@second%
+ \pgf@sys@svg@do@color{#2}%
+ \let\pgf@sys@svg@ga\pgf@sys@svg@hex@first%
+ \let\pgf@sys@svg@gb\pgf@sys@svg@hex@second%
+ \pgf@sys@svg@do@color{#3}%
+ \let\pgf@sys@svg@ba\pgf@sys@svg@hex@first%
+ \let\pgf@sys@svg@bb\pgf@sys@svg@hex@second%
+ \xdef\pgf@sys@svg@prepared{\pgf@sys@svg@hash\pgf@sys@svg@ra\pgf@sys@svg@rb\pgf@sys@svg@ga\pgf@sys@svg@gb\pgf@sys@svg@ba\pgf@sys@svg@bb}%
+ \ifx\pgf@sys@svg@ra\pgf@sys@svg@rb%
+ \ifx\pgf@sys@svg@ga\pgf@sys@svg@gb%
+ \ifx\pgf@sys@svg@ba\pgf@sys@svg@bb%
+ \xdef\pgf@sys@svg@prepared{\pgf@sys@svg@hash\pgf@sys@svg@ra\pgf@sys@svg@ga\pgf@sys@svg@ba}%
+ \fi%
+ \fi%
+ \fi%
+ }%
+}
+
+\expandafter\def\csname pgf@svg@0\endcsname{0}
+\expandafter\def\csname pgf@svg@1\endcsname{1}
+\expandafter\def\csname pgf@svg@2\endcsname{2}
+\expandafter\def\csname pgf@svg@3\endcsname{3}
+\expandafter\def\csname pgf@svg@4\endcsname{4}
+\expandafter\def\csname pgf@svg@5\endcsname{5}
+\expandafter\def\csname pgf@svg@6\endcsname{6}
+\expandafter\def\csname pgf@svg@7\endcsname{7}
+\expandafter\def\csname pgf@svg@8\endcsname{8}
+\expandafter\def\csname pgf@svg@9\endcsname{9}
+\expandafter\def\csname pgf@svg@10\endcsname{a}
+\expandafter\def\csname pgf@svg@11\endcsname{b}
+\expandafter\def\csname pgf@svg@12\endcsname{c}
+\expandafter\def\csname pgf@svg@13\endcsname{d}
+\expandafter\def\csname pgf@svg@14\endcsname{e}
+\expandafter\def\csname pgf@svg@15\endcsname{f}
+
+\def\pgf@sys@svg@do@color#1{%
+ \pgf@x#1\relax%
+ \c@pgf@counta\pgf@x%
+ \divide\c@pgf@counta by256\relax%
+ \ifnum\c@pgf@counta>255\relax%
+ \c@pgf@counta=255\relax%
+ \fi%
+ \ifnum\c@pgf@counta<0\relax%
+ \c@pgf@counta=0\relax%
+ \fi%
+ \c@pgf@countb\c@pgf@counta\relax%
+ \divide\c@pgf@countb by16\relax%
+ \expandafter\let\expandafter\pgf@sys@svg@hex@first\csname pgf@svg@\the\c@pgf@countb\endcsname%
+ \multiply\c@pgf@countb by16\relax%
+ \advance\c@pgf@counta by-\c@pgf@countb\relax%
+ \expandafter\let\expandafter\pgf@sys@svg@hex@second\csname pgf@svg@\the\c@pgf@counta\endcsname%
+}
+
+\def\pgf@sys@svg@color@rgb#1,#2,#3\relax{%
+ {%
+ \pgf@sys@svg@rgb@to@hash{#1pt}{#2pt}{#3pt}%
+ }%
+}
+\def\pgf@sys@svg@color@cmy#1,#2,#3\relax{%
+ {%
+ \pgf@xa=1pt%
+ \advance\pgf@xa by-#1pt%
+ \pgf@xb=1pt%
+ \advance\pgf@xb by-#2pt%
+ \pgf@xc=1pt%
+ \advance\pgf@xc by-#3pt%
+ \pgf@sys@svg@rgb@to@hash{\pgf@xa}{\pgf@xb}{\pgf@xc}%
+ }%
+}
+\def\pgf@sys@svg@color@cmyk#1,#2,#3,#4\relax{%
+ {%
+ \pgf@xa=1pt%
+ \advance\pgf@xa by-#4pt%
+ \pgf@xa=#1\pgf@xa%
+ \advance\pgf@xa by#4pt%
+ \advance\pgf@xa by-1pt%
+ \pgf@xa=-\pgf@xa%
+ \pgf@xb=1pt%
+ \advance\pgf@xb by-#4pt%
+ \pgf@xb=#2\pgf@xb%
+ \advance\pgf@xb by#4pt%
+ \advance\pgf@xb by-1pt%
+ \pgf@xb=-\pgf@xb%
+ \pgf@xc=1pt%
+ \advance\pgf@xc by-#4pt%
+ \pgf@xc=#3\pgf@xc%
+ \advance\pgf@xc by#4pt%
+ \advance\pgf@xc by-1pt%
+ \pgf@xc=-\pgf@xc%
+ \pgf@sys@svg@rgb@to@hash{\pgf@xa}{\pgf@xb}{\pgf@xc}%
+ }%
+}
+\def\pgf@sys@svg@color@gray#1\relax{%
+ {%
+ \pgf@xa=#1pt%
+ \pgf@sys@svg@rgb@to@hash{\pgf@xa}{\pgf@xa}{\pgf@xa}%
+ }%
+}
+
+\def\pgf@sys@svg@gs@color#1{%
+ \ifpgfpicture\pgf@sys@svg@gs{#1}\fi%
+}
+
+\def\pgf@sys@svg@colorpop{\special{color pop}}
+
+
+% RGB
+\def\pgfsys@color@rgb@stroke#1#2#3{%
+ \pgf@sys@svg@color@rgb#1,#2,#3\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{stroke="\pgf@sys@svg@prepared"}}
+\def\pgfsys@color@rgb@fill#1#2#3{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@rgb#1,#2,#3\relax%
+ \pgf@sys@svg@gs@color{fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push rgb #1 #2 #3}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+\def\pgfsys@color@rgb#1#2#3{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@rgb#1,#2,#3\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{\ifpgfsys@svg@boxmode\else stroke="\pgf@sys@svg@prepared" \fi fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push rgb #1 #2 #3}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+
+%CMYK
+\def\pgfsys@color@cmyk@stroke#1#2#3#4{%
+ \pgf@sys@svg@color@cmyk#1,#2,#3,#4\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{stroke="\pgf@sys@svg@prepared"}}
+\def\pgfsys@color@cmyk@fill#1#2#3#4{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@cmyk#1,#2,#3,#4\relax%
+ \pgf@sys@svg@gs@color{fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push cmyk #1 #2 #3 #4}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+\def\pgfsys@color@cmyk#1#2#3#4{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@cmyk#1,#2,#3,#4\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{\ifpgfsys@svg@boxmode\else stroke="\pgf@sys@svg@prepared" \fi fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push cmyk #1 #2 #3 #4}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+
+% CMY
+\def\pgfsys@color@cmy@stroke#1#2#3{%
+ \pgf@sys@svg@color@cmy#1,#2,#3\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{stroke="\pgf@sys@svg@prepared"}}
+\def\pgfsys@color@cmy@fill#1#2#3{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@cmy#1,#2,#3\relax%
+ \pgf@sys@svg@gs@color{fill="\pgf@sys@svg@prepared"}
+ \else%
+ \special{color push cmyk #1 #2 #3 0}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+\def\pgfsys@color@cmy#1#2#3{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@cmy#1,#2,#3\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{\ifpgfsys@svg@boxmode\else stroke="\pgf@sys@svg@prepared" \fi fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push cmyk #1 #2 #3 0}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+
+% gray
+\def\pgfsys@color@gray@stroke#1{%
+ \pgf@sys@svg@color@gray#1\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{stroke="\pgf@sys@svg@prepared"}}
+\def\pgfsys@color@gray@fill#1{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@gray#1\relax%
+ \pgf@sys@svg@gs@color{fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push gray #1}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+\def\pgfsys@color@gray#1{%
+ \ifpgfpicture%
+ \pgf@sys@svg@color@gray#1\relax%
+ \let\pgf@sys@svg@last@stroke\pgf@sys@svg@prepared%
+ \pgf@sys@svg@gs@color{\ifpgfsys@svg@boxmode\else stroke="\pgf@sys@svg@prepared" \fi fill="\pgf@sys@svg@prepared"}%
+ \else%
+ \special{color push gray #1}%
+ \aftergroup\pgf@sys@svg@colorpop%
+ \fi}
+
+
+% Shadings:
+\def\pgf@sys@svg@shading@stops{%
+ % Step 1: Compute 1/\pgf@sys@shading@end@pos
+ \pgf@x=\pgf@sys@shading@end@pos\relax%
+ \c@pgf@counta=\pgf@x\relax%
+ \divide\c@pgf@counta by4096\relax%
+ % Step 2: Insert stops.
+ \expandafter\pgf@sys@svg@shading@dostops\pgf@sys@shading@ranges%
+ % dummy for end:
+ {{\pgf@sys@shading@end@pos}{\pgf@sys@shading@end@pos}{\pgf@sys@shading@end@rgb}{\pgf@sys@shading@end@rgb}}%
+ {}% end
+}
+\def\pgf@sys@svg@shading@dostops#1{%
+ \edef\pgf@test{#1}%
+ \ifx\pgf@test\pgfutil@empty%
+ \else%
+ \expandafter\pgf@sys@svg@shading@dostop\pgf@test%
+ \expandafter\pgf@sys@svg@shading@dostops%
+ \fi%
+}
+\def\pgf@sys@svg@shading@dostop#1#2#3#4{%
+ % #1 start pos
+ % #2 end pos
+ % #3 start rgb
+ % #4 end rgb
+ \pgf@x=#1%
+ \pgf@x=16\pgf@x%
+ \divide\pgf@x by \c@pgf@counta\relax%
+ \pgf@sys@svg@addtostops{<stop offset="\pgf@sys@tonumber\pgf@x" stop-color="}%
+ \pgf@sys@svg@shading@dorgb#3%
+ \pgf@sys@svg@addtostops{"/>\noexpand\pgfsys@svg@newline}%
+}
+\def\pgf@sys@svg@shading@dorgb#1#2#3{%
+ \pgf@sys@svg@color@rgb#1,#2,#3\relax%
+ \pgf@sys@svg@addtostops{\pgf@sys@svg@prepared}%
+}
+
+\let\pgf@sys@svg@thestops=\pgfutil@empty
+\def\pgf@sys@svg@addtostops#1{%
+ \edef\pgf@temp{#1}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\pgf@sys@svg@thestops
+ \expandafter\expandafter\expandafter{\expandafter\pgf@sys@svg@thestops\expandafter\space\pgf@temp}%
+}
+
+
+\def\pgfsys@horishading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \pgf@sys@svg@addtostops{<linearGradient id="pgfsh\the\pgf@sys@svg@objectcount">\noexpand\pgfsys@svg@newline}%
+ \pgf@sys@svg@shading@stops%
+ \pgf@sys@svg@addtostops{</linearGradient>\noexpand\pgfsys@svg@newline}%
+ \pgf@process{\pgfpoint{\pgf@sys@shading@end@pos}{#2}}%
+ \xdef\pgfutil@tempa{%
+ \def\noexpand\pgf@sys@svg@sh@defs{\noexpand\pgfsysprotocol@literal{\pgf@sys@svg@thestops}}%
+ \def\noexpand\pgf@sys@svg@sh{\noexpand\pgfsysprotocol@literal{<rect
+ width="\pgf@sys@tonumber{\pgf@x}"
+ height="\pgf@sys@tonumber{\pgf@y}"
+ style="fill:url(\noexpand\#pgfsh\the\pgf@sys@svg@objectcount);
+ stroke:none"/>\noexpand\pgfsys@svg@newline}}%
+ \def\noexpand\pgf@sys@svg@pos{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
+ }%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+
+\def\pgfsys@functionalshading#1#2#3#4{%
+ \pgf@sys@fail{functional shadings}%
+ \expandafter\gdef\csname @pgfshading#1!\endcsname{%
+ \let\pgf@sys@svg@sh@defs\relax%
+ \let\pgf@sys@svg@sh\relax%
+ \let\pgf@sys@svg@pos\pgfpointorigin%
+ }%
+}
+
+\def\pgfsys@vertshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \pgf@sys@svg@addtostops{<linearGradient
+ id="pgfsh\the\pgf@sys@svg@objectcount"
+ gradientTransform="rotate(90)">\noexpand\pgfsys@svg@newline}%
+ \pgf@sys@svg@shading@stops%
+ \pgf@sys@svg@addtostops{</linearGradient>\noexpand\pgfsys@svg@newline}%
+ \pgf@process{\pgfpoint{\pgf@sys@shading@end@pos}{#2}}%
+ \xdef\pgfutil@tempa{%
+ \def\noexpand\pgf@sys@svg@sh@defs{\noexpand\pgfsysprotocol@literal{\pgf@sys@svg@thestops}}%
+ \def\noexpand\pgf@sys@svg@sh{\noexpand\pgfsysprotocol@literal{<rect
+ width="\pgf@sys@tonumber{\pgf@y}"
+ height="\pgf@sys@tonumber{\pgf@x}"
+ style="fill:url(\noexpand\#pgfsh\the\pgf@sys@svg@objectcount);
+ stroke:none"/>\noexpand\pgfsys@svg@newline}}%
+ \def\noexpand\pgf@sys@svg@pos{\noexpand\pgfpoint{\the\pgf@y}{\the\pgf@x}}%
+ }%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+
+\def\pgfsys@radialshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgf@x=\pgf@sys@shading@end@pos\relax%
+ \c@pgf@counta=\pgf@x\relax%
+ \divide\c@pgf@counta by4096\relax%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \pgf@process{#2}%
+ % Divide by 2\pgf@sys@shading@end@pos%
+ \pgf@x=8\pgf@x%
+ \divide\pgf@x by \c@pgf@counta\relax%
+ \pgf@y=8\pgf@y%
+ \divide\pgf@y by \c@pgf@counta\relax%
+ \advance\pgf@x by.5pt%
+ \advance\pgf@y by.5pt%
+ \pgf@sys@svg@addtostops{<radialGradient
+ id="pgfsh\the\pgf@sys@svg@objectcount"
+ fx="\pgf@sys@tonumber\pgf@x"
+ fy="\pgf@sys@tonumber\pgf@y"
+ >\noexpand\pgfsys@svg@newline}%
+ \pgf@sys@svg@shading@stops%
+ \pgf@sys@svg@addtostops{</radialGradient>\noexpand\pgfsys@svg@newline}%
+ \pgf@xa=\pgf@sys@shading@end@pos%
+ \pgf@xb=2\pgf@xa%
+ \xdef\pgfutil@tempa{%
+ \def\noexpand\pgf@sys@svg@sh@defs{\noexpand\pgfsysprotocol@literal{\pgf@sys@svg@thestops}}%
+ \def\noexpand\pgf@sys@svg@sh{\noexpand\pgfsysprotocol@literal{<circle
+ cx="\pgf@sys@tonumber{\pgf@xa}"
+ cy="\pgf@sys@tonumber{\pgf@xa}"
+ r="\pgf@sys@tonumber{\pgf@xa}"
+ style="fill:url(\noexpand\#pgfsh\the\pgf@sys@svg@objectcount);
+ stroke:none"/>\noexpand\pgfsys@svg@newline}}%
+ \def\noexpand\pgf@sys@svg@pos{\noexpand\pgfpoint{\the\pgf@xb}{\the\pgf@xb}}%
+ }%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+
+
+% Patterns
+
+\def\pgfsys@declarepattern#1#2#3#4#5#6#7{%
+ % Start building the pattern dictionary:
+ \pgf@xa=#2\relax%
+ \pgf@ya=#3\relax%
+ \pgf@xb=#4\relax%
+ \pgf@yb=#5\relax%
+ \pgf@xc=#6\relax%
+ \pgf@yc=#7\relax%
+ \pgfsys@@declarepattern{#1}%
+}
+
+\def\pgfsys@@declarepattern#1#2#3#4#5#6#7#8#9{%
+ \pgfutil@tempdima=#6\relax%
+ \pgfutil@tempdimb=#7\relax%
+ \ifnum#9=1\relax%
+ % Colored. That's easy:
+ \pgf@sys@svg@make@defs{#1}{
+ <pattern
+ id="pgfpat#1"
+ patternUnits="userSpaceOnUse"
+ width="\pgf@sys@tonumber\pgf@xc"
+ height="\pgf@sys@tonumber\pgf@yc"
+ patternTransform="matrix(#2\space#3\space#4\space#5\space\pgf@sys@tonumber\pgfutil@tempdima\space\pgf@sys@tonumber\pgfutil@tempdimb)">
+ #8
+ </pattern>}%
+ \else%
+ % Uncolored. Yikes!
+ \pgf@sys@svg@make@defs{#1}{
+ <pattern
+ id="pgfpat#1"
+ patternUnits="userSpaceOnUse"
+ width="\pgf@sys@tonumber\pgf@xc"
+ height="\pgf@sys@tonumber\pgf@yc"
+ patternTransform="matrix(#2\space#3\space#4\space#5\space\pgf@sys@tonumber\pgfutil@tempdima\space\pgf@sys@tonumber\pgfutil@tempdimb)"/>
+ <symbol id="pgfsym#1">
+ #8
+ </symbol>}%
+ \fi%
+}
+
+\def\pgfsys@setpatternuncolored#1#2#3#4{%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \pgf@sys@svg@color@rgb#2,#3,#4\relax%
+ \pgfsysprotocol@literal{
+ <pattern id="pgfupat\the\pgf@sys@svg@objectcount" xlink:href="\#pgfpat#1">
+ <g stroke="\pgf@sys@svg@prepared" fill="\pgf@sys@svg@prepared"> <use xlink:href="\#pgfsym#1"/> </g>
+ </pattern>}%
+ \pgf@sys@svg@ref@defs{#1}%
+ \pgf@sys@svg@gs@color{fill="url(\#pgfupat\the\pgf@sys@svg@objectcount)"}%
+}
+
+\def\pgfsys@setpatterncolored#1{%
+ \pgf@sys@svg@ref@defs{#1}%
+ \pgf@sys@svg@gs@color{fill="url(\#pgfpat#1)"}%
+}
+
+
+
+
+
+
+% Animation
+
+\pgfsysanimationsupportedtrue
+
+\let\pgfsys@anim@val@dur\pgfutil@empty
+\let\pgfsys@anim@val@restart\pgfutil@empty
+\let\pgfsys@anim@val@repeatCount\pgfutil@empty
+\let\pgfsys@anim@val@repeatDur\pgfutil@empty
+\let\pgfsys@anim@val@fill\pgfutil@empty
+\let\pgfsys@anim@val@keyTimes\pgfutil@empty
+\let\pgfsys@anim@val@keyPoints\pgfutil@empty
+\let\pgfsys@anim@val@keySplines\pgfutil@empty
+\let\pgfsys@anim@val@begin\pgfutil@empty
+\let\pgfsys@anim@val@end\pgfutil@empty
+\let\pgfsys@anim@val@additive\pgfutil@empty
+\let\pgfsys@anim@val@accumulate\pgfutil@empty
+\def\pgfsys@anim@val@calcMode{spline}
+\let\pgfsys@anim@val@from\pgfutil@empty
+\let\pgfsys@anim@val@to\pgfutil@empty
+\let\pgfsys@anim@val@path\pgfutil@empty
+\let\pgfsys@anim@val@rotate\pgfutil@empty
+\let\pgfsys@anim@val@values\pgfutil@empty
+\def\pgfsys@anim@val@canvas@trans{{}{}}
+\let\pgfsys@anim@val@@id\pgfutil@empty
+\let\pgfsys@anim@val@@type\pgfutil@empty
+\let\pgfsys@anim@val@base\pgfutil@empty
+\let\pgfsys@anim@val@idref\pgfutil@empty
+\expandafter\let\csname pgfsys@anim@val@xlink:href\endcsname\pgfutil@empty
+
+\def\pgf@sys@svg@key#1{%
+ \expandafter\ifx\csname pgfsys@anim@val@#1\endcsname\pgfutil@empty\else%
+ \space#1="\csname pgfsys@anim@val@#1\endcsname"%
+ \fi%
+}
+
+\def\pgf@svg@anim@keys{
+ \pgf@sys@svg@key{dur}%
+ \pgf@sys@svg@key{restart}%
+ \pgf@sys@svg@key{repeatCount}%
+ \pgf@sys@svg@key{repeatDur}%
+ \pgf@sys@svg@key{fill}%
+ \pgf@sys@svg@key{keyTimes}%
+ \pgf@sys@svg@key{keyPoints}%
+ \pgf@sys@svg@key{keySplines}%
+ \pgf@sys@svg@key{begin}%
+ \pgf@sys@svg@key{end}%
+ \pgf@sys@svg@key{additive}%
+ \pgf@sys@svg@key{accumulate}%
+ \pgf@sys@svg@key{calcMode}%
+ \pgf@sys@svg@key{values}%
+ \pgf@sys@svg@key{from}%
+ \pgf@sys@svg@key{to}%
+ \pgf@sys@svg@key{path}%
+ \pgf@sys@svg@key{rotate}%
+ \pgf@sys@svg@key{xlink:href}%
+}
+
+\newif\ifpgf@sys@at@least@one@event
+\def\pgf@sys@svg@do@events#1{%
+ \pgf@sys@at@least@one@eventfalse%
+ \def\pgf@sys@event@target{#1}%
+ \expandafter\expandafter\expandafter\pgf@sys@svg@do@events@now\csname pgf@sys@event@list@#1\endcsname\relax%
+}
+\def\pgf@sys@svg@do@events@now{%
+ \pgfutil@ifnextchar\relax{}{\pgf@sys@svg@do@event}%
+}
+\def\pgf@sys@svg@do@event#1#2#3#4{%
+ \pgf@sys@at@least@one@eventtrue%
+ %
+ {%
+ \edef\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgfsys@register@type{#2}%
+ \def\pgf@temp{\pgfsys@id@ref{#1}{#2}.}%
+ \fi%
+ \edef\pgf@@temp{#4}%
+ \ifx\pgf@@temp\pgfutil@empty%
+ \pgf@x0pt%
+ \else%
+ \pgf@x#4pt%
+ \fi%
+ \ifx\pgf@sys@event@target\pgf@sys@begin@text%
+ \advance\pgf@x by\pgf@xa\relax%
+ \fi\relax%
+ \ifdim\pgf@x<0pt%
+ \edef\pgf@@temp{ \pgf@sys@tonumber\pgf@x s}%
+ \else
+ \edef\pgf@@temp{ +\pgf@sys@tonumber\pgf@x s}%
+ \fi%
+ \xdef\pgf@svg@anim@temp{\pgf@temp#3\pgf@@temp}%
+ }%
+ \pgf@sys@svg@append{\pgf@sys@event@target}{\pgf@svg@anim@temp}%
+ \global\let\pgf@svg@anim@temp\relax%
+ \pgf@sys@svg@do@events@now%
+}
+
+
+\newif\ifpgf@sys@svg@is@sync@base
+\def\pgf@sys@svg@anim#1#2#3{%
+ \ifx\pgfsys@anim@val@@id\pgfutil@empty%
+ \pgferror{Animation misses ``whom''}%
+ \else%
+ {%
+ \ifx\pgfsys@anim@val@base\pgfutil@empty%
+ \else%
+ % Hook into id:
+ \expandafter\let\expandafter\pgf@sys@temp\csname pgfsys@anim@ba@\pgfsys@anim@val@idref\endcsname%
+ \ifx\pgf@sys@temp\relax%
+ \edef\pgf@sys@temp{\global\let\expandafter\noexpand\csname pgfsys@anim@ba@\pgfsys@anim@val@idref\endcsname\relax\noexpand\pgfsys@anim@ba@setup}%
+ \fi%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@temp\expandafter\expandafter\expandafter{\expandafter\pgf@sys@temp\expandafter\def\expandafter#3\expandafter{\pgfsys@anim@val@base}}%
+ \expandafter\global\expandafter\let\csname pgfsys@anim@ba@\pgfsys@anim@val@idref\endcsname\pgf@sys@temp%
+ \fi%
+ \pgf@sys@svg@tl@eval%
+ \pgf@sys@svg@do@events{begin}%
+ \ifpgf@sys@at@least@one@event%
+ \else%
+ \pgf@sys@svg@append{begin}{\ifdim\pgf@xa>0pt+\fi\pgf@sys@tonumber\pgf@xa s}%
+ \fi%
+ \pgf@sys@svg@do@events{end}%
+ #2%
+ % Suppress empty, superfluous animations:
+ \pgfutil@tempswatrue%
+ \pgfsys@if@fresh@currentid{}{%
+ \ifx\pgfsys@anim@val@values\pgfutil@empty%
+ \ifx\pgfsys@anim@val@to\pgfutil@empty%
+ \ifx\pgfsys@anim@val@dur\pgfutil@empty%
+ \pgfutil@tempswafalse%
+ \fi%
+ \fi%
+ \fi}
+ \ifpgfutil@tempswa%
+ \edef\pgf@temp{{<animate #1\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent"}{}\pgf@svg@anim@keys/>\pgfsys@svg@newline}}%
+ \expandafter\pgfsysprotocol@literal\pgf@temp%
+ \fi%
+ \pgfsys@invalidate@currentid%
+ }%
+ \fi%
+}
+
+\def\pgf@sys@svg@anim@path{%
+ % animate a path...
+ \ifx\pgfsys@anim@val@@id\pgfutil@empty%
+ \pgferror{Animation misses ``whom''}%
+ \else%
+ {%
+ \let\pgf@sys@svg@add@code\pgfutil@empty%
+ %
+ % Setup markers:
+ %
+ % Setup start
+ \ifx\pgf@svg@anim@marker@start\pgfutil@empty%
+ \let\pgf@sys@svg@marker@id@start\pgfutil@empty%
+ \else%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \edef\pgf@sys@svg@marker@id{pgf\the\pgf@sys@svg@objectcount}%
+ \edef\pgf@sys@svg@add@code{%
+ \noexpand\pgf@sys@svg@ref@defs{pgfs\pgf@svg@anim@marker@start}%
+ \noexpand\pgfsysprotocol@literal{<marker id="\pgf@sys@svg@marker@id" markerUnits="userSpaceOnUse" orient="auto" overflow="visible">
+ <use xlink:href="\#pgfs\pgf@svg@anim@marker@start" transform="scale(-1,-1)"/> </marker>\pgfsys@svg@newline}%
+ }%
+ \let\pgf@sys@svg@marker@id@start\pgf@sys@svg@marker@id%
+ \fi%
+ % Setup end
+ \ifx\pgf@svg@anim@marker@end\pgfutil@empty%
+ \let\pgf@sys@svg@marker@id@end\pgfutil@empty%
+ \else%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \edef\pgf@sys@svg@marker@id{pgf\the\pgf@sys@svg@objectcount}%
+ \edef\pgf@sys@svg@add@code@{%
+ \noexpand\pgf@sys@svg@ref@defs{pgfs\pgf@svg@anim@marker@end}%
+ \noexpand\pgfsysprotocol@literal{<marker id="\pgf@sys@svg@marker@id" markerUnits="userSpaceOnUse" orient="auto" overflow="visible">
+ <use xlink:href="\#pgfs\pgf@svg@anim@marker@end"/> </marker>\pgfsys@svg@newline}%
+ }%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@svg@add@code\expandafter\expandafter\expandafter{\expandafter\pgf@sys@svg@add@code\pgf@sys@svg@add@code@}%
+ \let\pgf@sys@svg@marker@id@end\pgf@sys@svg@marker@id%
+ \fi%
+ \ifx\pgfsys@anim@val@base\pgfutil@empty%
+ \else%
+ % Hook into id of path:
+ \expandafter\let\expandafter\pgf@sys@temp\csname pgfsys@anim@ba@\pgfsys@anim@val@idref\endcsname%
+ \ifx\pgf@sys@temp\relax%
+ \edef\pgf@sys@temp{\global\let\expandafter\noexpand\csname pgfsys@anim@ba@\pgfsys@anim@val@idref\endcsname\relax\noexpand\pgfsys@anim@ba@setup}%
+ \fi%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@temp\expandafter\expandafter\expandafter{\expandafter\pgf@sys@temp\expandafter\def\expandafter\pgfsys@anim@ba@d\expandafter{\pgfsys@anim@val@base}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@temp\expandafter\expandafter\expandafter{\expandafter\pgf@sys@temp\expandafter\def\expandafter\pgfsys@anim@ba@markerstart\expandafter{\pgf@sys@svg@marker@id@start}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@temp\expandafter\expandafter\expandafter{\expandafter\pgf@sys@temp\expandafter\def\expandafter\pgfsys@anim@ba@markerend\expandafter{\pgf@sys@svg@marker@id@end}}%
+ \expandafter\global\expandafter\let\csname pgfsys@anim@ba@\pgfsys@anim@val@idref\endcsname\pgf@sys@temp%
+ \fi%
+ \pgf@sys@svg@tl@eval%
+ \pgf@sys@svg@do@events{begin}%
+ \ifpgf@sys@at@least@one@event%
+ \else%
+ \pgf@sys@svg@append{begin}{\ifdim\pgf@xa>0pt+\fi\pgf@sys@tonumber\pgf@xa s}%
+ \fi%
+ \pgf@sys@svg@do@events{end}%
+ % Suppress empty, superfluous animations:
+ \pgfutil@tempswatrue%
+ \pgfsys@if@fresh@currentid{}{%
+ \ifx\pgfsys@anim@val@values\pgfutil@empty%
+ \ifx\pgfsys@anim@val@to\pgfutil@empty%
+ \ifx\pgfsys@anim@val@dur\pgfutil@empty%
+ \pgfutil@tempswafalse%
+ \fi%
+ \fi%
+ \fi}
+ \ifpgfutil@tempswa%
+ % Ok, first, animate the path:
+ \edef\pgf@temp{%
+ {%
+ <animate attributeName="d"\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent"}{}\pgf@svg@anim@keys/>\pgfsys@svg@newline
+ <animate attributeName="marker-start"\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent-ms"}{}%
+ \pgf@sys@svg@key{dur}%
+ \pgf@sys@svg@key{restart}%
+ \pgf@sys@svg@key{repeatCount}%
+ \pgf@sys@svg@key{repeatDur}%
+ \pgf@sys@svg@key{fill}%
+ \pgf@sys@svg@key{begin}%
+ \pgf@sys@svg@key{end}%
+ \pgf@sys@svg@key{xlink:href}
+ from="\ifx\pgf@svg@anim@marker@start\pgfutil@empty none\else url(\#\pgf@sys@svg@marker@id@start)\fi"
+ to="\ifx\pgf@svg@anim@marker@start\pgfutil@empty none\else url(\#\pgf@sys@svg@marker@id@start)\fi"
+ />\pgfsys@svg@newline%
+ <animate attributeName="marker-end"\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent-me"}{}%
+ \pgf@sys@svg@key{dur}%
+ \pgf@sys@svg@key{restart}%
+ \pgf@sys@svg@key{repeatCount}%
+ \pgf@sys@svg@key{repeatDur}%
+ \pgf@sys@svg@key{fill}%
+ \pgf@sys@svg@key{begin}%
+ \pgf@sys@svg@key{end}%
+ \pgf@sys@svg@key{xlink:href}
+ from="\ifx\pgf@svg@anim@marker@end\pgfutil@empty none\else url(\#\pgf@sys@svg@marker@id@end)\fi"
+ to="\ifx\pgf@svg@anim@marker@end\pgfutil@empty none\else url(\#\pgf@sys@svg@marker@id@end)\fi"
+ />\pgfsys@svg@newline%
+ }}%
+ \expandafter\pgfsysprotocol@literal\pgf@temp%
+ \fi%
+ \ifx\pgf@sys@svg@add@code\pgfutil@empty%
+ \else%
+ \expandafter\let\expandafter\pgf@sys@svg@add@code@\csname pgf@sys@svg@path@\pgfsys@id@ref{\pgfsys@anim@val@@id}{\pgfsys@anim@val@@type}\endcsname%
+ \ifx\pgf@sys@svg@add@code@\relax%
+ \else%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@svg@add@code\expandafter\expandafter\expandafter{\expandafter\pgf@sys@svg@add@code\pgf@sys@svg@add@code@}%
+ \fi%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@svg@add@code%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@sys@svg@add@code\expandafter\global\expandafter\let\csname pgf@sys@svg@path@\pgfsys@id@ref{\pgfsys@anim@val@@id}{\pgfsys@anim@val@@type}\endcsname\relax}%
+ \expandafter\global\expandafter\let\csname pgf@sys@svg@path@\pgfsys@id@ref{\pgfsys@anim@val@@id}{\pgfsys@anim@val@@type}\endcsname\pgf@sys@svg@add@code%
+ \fi%
+ \pgfsys@invalidate@currentid%
+ }%
+ \fi%
+}
+
+\def\pgfsys@anim@ba@setup{%
+ \let\pgfsys@anim@ba@opacity\pgfutil@empty%
+ \let\pgfsys@anim@ba@fillopacity\pgfutil@empty%
+ \let\pgfsys@anim@ba@strokeopacity\pgfutil@empty%
+ \let\pgfsys@anim@ba@visibility\pgfutil@empty%
+ \let\pgfsys@anim@ba@strokewidth\pgfutil@empty%
+ \let\pgfsys@anim@ba@fill\pgfutil@empty%
+ \let\pgfsys@anim@ba@stroke\pgfutil@empty%
+ \let\pgfsys@anim@ba@strokedasharray\pgfutil@empty%
+ \let\pgfsys@anim@ba@strokedashoffset\pgfutil@empty%
+ \let\pgf@sys@svg@ba@gs\pgf@sys@svg@ba@gs@do@now%
+}
+\let\pgfsys@anim@ba@opacity\pgfutil@empty%
+\let\pgfsys@anim@ba@fillopacity\pgfutil@empty%
+\let\pgfsys@anim@ba@strokeopacity\pgfutil@empty%
+\let\pgfsys@anim@ba@visibility\pgfutil@empty%
+\let\pgfsys@anim@ba@strokewidth\pgfutil@empty%
+\let\pgfsys@anim@ba@fill\pgfutil@empty%
+\let\pgfsys@anim@ba@stroke\pgfutil@empty%
+\let\pgfsys@anim@ba@viewBox\pgfutil@empty%
+\let\pgfsys@anim@ba@d\pgfutil@empty%
+\let\pgfsys@anim@ba@strokedasharray\pgfutil@empty%
+\let\pgfsys@anim@ba@strokedashoffset\pgfutil@empty%
+\let\pgfsys@anim@ba@markerstart\pgfutil@empty%
+\let\pgfsys@anim@ba@markerendd\pgfutil@empty%
+
+\def\pgf@sys@svg@ba@gs@do@now{%
+ \ifx\pgfsys@anim@ba@fill\pgfutil@empty\else fill="\pgfsys@anim@ba@fill" \fi%
+ \ifx\pgfsys@anim@ba@stroke\pgfutil@empty\else stroke="\pgfsys@anim@ba@stroke" \fi%
+ \ifx\pgfsys@anim@ba@opacity\pgfutil@empty\else opacity="\pgfsys@anim@ba@opacity" \fi%
+ \ifx\pgfsys@anim@ba@fillopacity\pgfutil@empty\else fill-opacity="\pgfsys@anim@ba@fillopacity" \fi%
+ \ifx\pgfsys@anim@ba@strokeopacity\pgfutil@empty\else stroke-opacity="\pgfsys@anim@ba@strokeopacity" \fi%
+ \ifx\pgfsys@anim@ba@visibility\pgfutil@empty\else visibility="\pgfsys@anim@ba@visibility" \fi%
+ \ifx\pgfsys@anim@ba@strokewidth\pgfutil@empty\else stroke-width="\pgfsys@anim@ba@strokewidth" \fi%
+ \ifx\pgfsys@anim@ba@strokedasharray\pgfutil@empty\else stroke-dasharray="\pgfsys@anim@ba@strokedasharray" \fi%
+ \ifx\pgfsys@anim@ba@strokedashoffset\pgfutil@empty\else stroke-dashoffset="\pgfsys@anim@ba@strokedashoffset" \fi%
+}
+
+
+
+\newcount\pgf@sys@svg@canvascount
+\def\pgf@sys@svg@anim@trans#1#2#3{%
+ \ifx\pgfsys@anim@val@@id\pgfutil@empty%
+ \pgferror{Animation misses ``whom''}%
+ \else%
+ {%
+ %
+ \global\advance\pgf@sys@svg@canvascount by1\relax%
+ \pgf@sys@svg@tl@eval%
+ \pgf@sys@svg@do@events{begin}%
+ \ifpgf@sys@at@least@one@event%
+ \else%
+ \pgf@sys@svg@append{begin}{\ifdim\pgf@xa>0pt+\fi\pgf@sys@tonumber\pgf@xa s}%
+ \fi%
+ \pgf@sys@svg@do@events{end}%
+ #2%
+ \pgfsys@register@type{\pgfsys@anim@val@@type}%
+ \pgf@sys@svg@replace{xlink:href}{\#\pgfsys@id@ref{\pgfsys@anim@val@@id canvas\the\pgf@sys@svg@canvascount}{\pgfsys@anim@val@@type}}%
+ \ifx\pgfsys@anim@val@base\pgfutil@empty%
+ \let\pgf@sys@svg@base@trans\pgfutil@empty%
+ \else%
+ \edef\pgf@sys@svg@base@trans{ transform="#3(\pgfsys@anim@val@base)"}%
+ \fi%
+ \pgfsysprotocol@literal{<#1\pgfsys@if@fresh@currentid{ id="\pgfsys@id@refcurrent"}{}\pgf@svg@anim@keys/>\pgfsys@svg@newline}%
+ \pgfsys@invalidate@currentid%
+ \edef\pgf@temp{{\pgfsys@id@ref{\pgfsys@anim@val@@id
+ canvas\the\pgf@sys@svg@canvascount}{\pgfsys@anim@val@@type}}}%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgf@sys@svg@attacher%
+ \expandafter\expandafter\expandafter\pgf@temp\expandafter\pgfsys@anim@val@canvas@trans\expandafter{\pgf@sys@svg@base@trans}%
+ }%
+ \fi%
+}
+
+\newif\ifpgf@sys@svg@called
+\def\pgf@sys@svg@attacher#1#2#3#4{%
+ \toks0{%
+ {%
+ \let\pgfsys@transformcm\pgfsys@anim@transformcm%
+ \global\pgf@sys@svg@calledfalse%
+ #2%
+ \ifpgf@sys@svg@called\else\pgfsysprotocol@literal{<g>}\fi%
+ \pgfsysprotocol@literal{<g id="#1"#4>}
+ {%
+ \global\pgf@sys@svg@calledfalse%
+ #3%
+ \ifpgf@sys@svg@called\else\pgfsysprotocol@literal{<g>}\fi%
+ }%
+ }%
+ }%
+ \edef\pgf@sys@svg@beg{\the\toks0}%
+ \def\pgf@sys@svg@end{\pgfsysprotocol@literal{</g></g></g>\noexpand\pgfsys@svg@newline}}%
+ \expandafter\expandafter\expandafter\pgfsys@attach@to@id%
+ \expandafter\expandafter\expandafter\pgfsys@anim@val@@id%
+ \expandafter\expandafter\expandafter\pgfsys@anim@val@@type%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@sys@svg@beg\expandafter}\expandafter{\pgf@sys@svg@end}%
+}
+
+
+\def\pgfsys@anim@transformcm#1#2#3#4#5#6{%
+ \ifpgf@sys@svg@called%
+ \pgferror{Double transformation calls in animation}%
+ \else%
+ {%
+ \pgf@x=#5\pgf@y=#6%
+ \edef\pgf@temp{ transform="matrix(#1,#2,#3,#4,\pgf@sys@tonumber{\pgf@x},\pgf@sys@tonumber{\pgf@y})"}%
+ \ifx\pgf@temp\pgf@sys@svg@idmat@stext%
+ \let\pgf@temp\pgfutil@empty%
+ \fi%
+ \pgfsysprotocol@literal{<g\pgf@temp>}%
+ }%
+ \global\pgf@sys@svg@calledtrue%
+ \fi%
+}
+\def\pgf@sys@svg@idtrans@text{1.0,0.0,0.0,1.0}
+\def\pgf@sys@svg@idmat@text{transform="matrix(1.0,0.0,0.0,1.0,0.0,0.0)"}
+\def\pgf@sys@svg@idmat@stext{ transform="matrix(1.0,0.0,0.0,1.0,0.0,0.0)"}
+
+\def\pgf@sys@svg@replace#1#2{%
+ \expandafter\edef\csname pgfsys@anim@val@#1\endcsname{#2}%
+}
+
+\def\pgf@sys@svg@append#1#2{%
+ \expandafter\let\expandafter\pgf@svg@anim@temp@\csname pgfsys@anim@val@#1\endcsname%
+ \ifx\pgf@svg@anim@temp@\pgfutil@empty%
+ \expandafter\edef\csname pgfsys@anim@val@#1\endcsname{#2}%
+ \else\ifx\pgf@svg@anim@temp@\relax%
+ \pgfutil@packageerror{pgfsys}{Unknown animation key '#1'}{}
+ \else%
+ \edef\pgf@svg@anim@temp@{\pgf@svg@anim@temp@;#2}%
+ \expandafter\let\csname pgfsys@anim@val@#1\endcsname\pgf@svg@anim@temp@%
+ \fi\fi%
+}
+
+% The actual animate command
+\def\pgfsys@animate#1{%
+ \expandafter\let\expandafter\pgf@sys@temp\csname pgfsys@svg@animate#1\endcsname\relax%
+ \ifx\pgf@sys@temp\relax%
+ \pgf@sys@fail{animation attribute #1}%
+ \else%
+ \pgf@sys@temp%
+ \fi%
+}
+
+
+% The non-transforming animations
+\def\pgfsys@svg@animatenone{}
+\def\pgfsys@svg@animateopacity{\pgf@sys@svg@anim{attributeName="opacity"}{}{\pgfsys@anim@ba@opacity}}
+\def\pgfsys@svg@animatefillopacity{\pgf@sys@svg@anim{attributeName="fill-opacity"}{}{\pgfsys@anim@ba@fillopacity}}
+\def\pgfsys@svg@animatestrokeopacity{\pgf@sys@svg@anim{attributeName="stroke-opacity"}{}{\pgfsys@anim@ba@strokeopacity}}
+\def\pgfsys@svg@animatevisibility{\pgf@sys@svg@anim{attributeName="visibility"}{}{\pgfsys@anim@ba@visibility}}
+\def\pgfsys@svg@animatelinewidth{\pgf@sys@svg@anim{attributeName="stroke-width"}{}{\pgfsys@anim@ba@strokewidth}}
+\def\pgfsys@svg@animatecolor{\pgf@sys@svg@anim{attributeName="fill"}{}{\pgfsys@anim@ba@fill}\pgf@sys@svg@anim{attributeName="stroke"}{}{\pgfsys@anim@ba@stroke}}
+\def\pgfsys@svg@animatefillcolor{\pgf@sys@svg@anim{attributeName="fill"}{}{\pgfsys@anim@ba@fill}}
+\def\pgfsys@svg@animatestrokecolor{\pgf@sys@svg@anim{attributeName="stroke"}{}{\pgfsys@anim@ba@stroke}}
+\def\pgfsys@svg@animateviewbox{\pgf@sys@svg@anim{attributeName="viewBox"}{}{\pgfsys@anim@ba@viewBox}}
+\def\pgfsys@svg@animatepath{\pgf@sys@svg@anim@path}
+\def\pgfsys@svg@animatesyncbase{{\pgf@sys@svg@is@sync@basetrue\pgf@sys@svg@anim{}{}{}}}
+\def\pgfsys@svg@animatedash{%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@base}{\pgfsys@anim@val@base@array}{\pgfsys@anim@val@base@offset}%
+ \let\pgfsys@anim@val@base\pgfsys@anim@val@base@array%
+ \pgf@sys@svg@anim{attributeName="stroke-dasharray"}{%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@from}{\pgfsys@anim@val@from@array}{\pgfsys@anim@val@from@offset}%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@to}{\pgfsys@anim@val@to@array}{\pgfsys@anim@val@to@offset}%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@values}{\pgfsys@anim@val@values@array}{\pgfsys@anim@val@values@offset}%
+ \let\pgfsys@anim@val@from\pgfsys@anim@val@from@array%
+ \let\pgfsys@anim@val@to\pgfsys@anim@val@to@array%
+ \let\pgfsys@anim@val@values\pgfsys@anim@val@values@array%
+ }{\pgfsys@anim@ba@strokedasharray}%
+ \let\pgfsys@anim@val@base\pgfsys@anim@val@base@offset%
+ \pgf@sys@svg@anim{attributeName="stroke-dashoffset"}{%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@from}{\pgfsys@anim@val@from@array}{\pgfsys@anim@val@from@offset}%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@to}{\pgfsys@anim@val@to@array}{\pgfsys@anim@val@to@offset}%
+ \pgf@svg@anim@prep@dash{\pgfsys@anim@val@values}{\pgfsys@anim@val@values@array}{\pgfsys@anim@val@values@offset}%
+ \let\pgfsys@anim@val@from\pgfsys@anim@val@from@offset%
+ \let\pgfsys@anim@val@to\pgfsys@anim@val@to@offset%
+ \let\pgfsys@anim@val@values\pgfsys@anim@val@values@offset%
+ }{\pgfsys@anim@ba@strokedashoffset}%
+}
+
+% The transforming animations
+\def\pgfsys@svg@animatetranslate{\pgf@sys@svg@anim@trans{animateTransform attributeName="transform" type="translate"}{}{translate}}
+\def\pgfsys@svg@animatescale{\pgf@sys@svg@anim@trans{animateTransform attributeName="transform" type="scale"}{}{scale}}
+\def\pgfsys@svg@animaterotate{\pgf@sys@svg@anim@trans{animateTransform attributeName="transform" type="rotate"}{}{rotate}}
+\def\pgfsys@svg@animateskewx{\pgf@sys@svg@anim@trans{animateTransform attributeName="transform" type="skewX"}{}{skewX}}
+\def\pgfsys@svg@animateskewy{\pgf@sys@svg@anim@trans{animateTransform attributeName="transform" type="skewY"}{}{skewY}}
+\def\pgfsys@svg@animatemotion{\pgf@sys@svg@anim@trans{animateMotion}{%
+ \let\pgfsys@anim@val@base\pgfutil@empty%
+ \let\pgfsys@anim@val@keyPoints\pgfsys@anim@val@values%
+ \let\pgfsys@anim@val@values\pgfutil@empty%
+ \ifx\pgfsys@anim@val@keyTimes\pgfutil@empty%
+ \let\pgfsys@anim@val@keyPoints\pgfutil@empty%
+ \fi%
+ }{}}
+
+% The keys
+\def\pgfsys@animation@whom#1#2{%
+ % Animations must "look forward"...
+ \pgfsys@if@fresh@id{#1}{#2}{}{\pgferror{Animations must precede the to-be-animated objects (``whom'')}}%
+ \pgf@sys@svg@replace{@id}{#1}%
+ \pgf@sys@svg@replace{@type}{#2}%
+ \pgf@sys@svg@replace{xlink:href}{\#\pgfsys@id@ref{#1}{#2}}%
+ \pgf@sys@svg@replace{idref}{\pgfsys@id@ref{#1}{#2}}%
+}
+\def\pgfsys@animation@restart@always{\pgf@sys@svg@replace{restart}{always}}
+\def\pgfsys@animation@restart@never{\pgf@sys@svg@replace{restart}{never}}
+\def\pgfsys@animation@restart@whennotactive{\pgf@sys@svg@replace{restart}{whenNotActive}}
+\def\pgfsys@animation@repeat@indefinite{\pgf@sys@svg@replace{repeatCount}{indefinite}}
+\def\pgfsys@animation@repeat#1{\pgf@sys@svg@replace{repeatCount}{#1}}
+\def\pgfsys@animation@repeat@dur#1{\pgf@sys@svg@replace{repeatDur}{#1}}
+\def\pgfsys@animation@freezeatend{\pgf@sys@svg@replace{fill}{freeze}}
+\def\pgfsys@animation@removeatend{\pgf@sys@svg@replace{fill}{remove}}
+\def\pgfsys@animation@canvas@transform#1#2{\def\pgfsys@anim@val@canvas@trans{{#1}{#2}}}
+\def\pgfsys@animation@offset#1#2{\pgfsys@animation@event{}{}{}{#1}{#2}}
+\def\pgfsys@animation@event#1#2#3#4#5{%
+ \expandafter\edef\csname pgf@sys@event@list@#5\endcsname{\csname pgf@sys@event@list@#5\endcsname{#1}{#2}{#3}{#4}}%
+}%
+\def\pgf@sys@event@list@begin{}
+\def\pgf@sys@event@list@end{}
+\def\pgfsys@animation@syncbegin#1#2#3#4{\pgfsys@animation@event{#1}{#2}{begin}{#3}{#4}}
+\def\pgfsys@animation@syncend#1#2#3#4{\pgfsys@animation@event{#1}{#2}{end}{#3}{#4}}
+\def\pgfsys@animation@repeat@event#1#2#3#4#5{\pgfsys@animation@event{#1}{#2}{repeat(#3)}{#4}{#5}}
+\def\pgfsys@animation@accesskey#1#2#3{\pgfsys@animation@event{}{}{accessKey(#1)}{#2}{#3}}
+%\def\pgfsys@animation@sum{\pgf@sys@svg@replace{additive}{sum}}
+%\def\pgfsys@animation@replace{\pgf@sys@svg@replace{additive}{replace}}
+\def\pgfsys@animation@accumulate{\pgf@sys@svg@replace{accumulate}{sum}}
+\def\pgfsys@animation@noaccumulate{\pgf@sys@svg@replace{accumulate}{}}
+\def\pgfsys@animation@rotatealong{\pgf@sys@svg@replace{rotate}{auto}}
+\def\pgfsys@animation@norotatealong{\pgf@sys@svg@replace{rotate}{}}
+\def\pgfsys@animation@movealong#1{%
+ {%
+ \let\pgf@sys@save@svgpath=\pgf@sys@svgpath%
+ \global\let\pgf@sys@svgpath=\pgfutil@empty%
+ \pgfsyssoftpath@getcurrentpath\pgf@sys@save@path%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ #1%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsyssoftpath@setcurrentpath\pgf@sys@save@path%
+ \global\let\pgf@svg@anim@temp\pgf@sys@svgpath%
+ \global\let\pgf@sys@svgpath\pgf@sys@save@svgpath%
+ }%
+ \pgf@sys@svg@replace{path}{\pgf@svg@anim@temp}%
+}
+\def\pgfsys@animation@tip@markers#1#2{%
+ \edef\pgf@svg@anim@marker@start{#1}%
+ \edef\pgf@svg@anim@marker@end{#2}%
+}
+\let\pgf@svg@anim@marker@start\pgfutil@empty
+\let\pgf@svg@anim@marker@end\pgfutil@empty
+
+
+
+% Timelines
+\let\pgf@sys@svg@tl@entries\pgfutil@empty
+\let\pgf@sys@svg@tl@start\pgfutil@empty
+\let\pgf@sys@svg@tl@end\pgfutil@empty
+
+
+\def\pgfsys@animation@time#1#2#3#4#5{%
+ \def\pgf@sys@svg@t{#1}%
+ \let\pgf@sys@last@out@spline\pgf@sys@svg@out@spline%
+ \def\pgf@sys@svg@in@spline{{#2}{#3}}%
+ \def\pgf@sys@svg@out@spline{{#4}{#5}}%
+}
+\def\pgfsys@animation@base{%
+ \let\pgf@sys@svg@t\pgf@sys@svg@base@text%
+}
+\def\pgf@sys@svg@base@text{base}
+
+\def\pgf@sys@svg@entry#1{%
+ \ifx\pgf@sys@svg@t\pgf@sys@svg@base@text%
+ % Ah, base. Save!
+ \edef\pgfsys@anim@val@base{#1}%
+ \else%
+ \ifx\pgf@sys@svg@tl@start\pgfutil@empty%
+ % Ah, first.
+ \let\pgf@sys@svg@tl@start\pgf@sys@svg@t%
+ \edef\pgf@sys@svg@tl@entries{%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@t}%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ }%
+ \else%
+ \ifx\pgf@sys@last@out@spline\pgfsys@stay@text%
+ \ifx\pgf@sys@svg@in@spline\pgfsys@jump@text%
+ {%
+ \pgf@x\pgf@sys@svg@t pt
+ \pgf@xa\pgf@sys@svg@tl@end pt%
+ \advance\pgf@x by\pgf@xa%
+ \pgf@x.5\pgf@x%
+ \edef\pgf@sys@temp{\pgf@sys@tonumber\pgf@x}
+ \expandafter}\expandafter\def\expandafter\pgf@sys@temp\expandafter{\pgf@sys@temp}%
+ \edef\pgf@sys@svg@temp{%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@temp}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{\pgf@sys@svg@last@value}%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@temp}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@t}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ }%
+ \else
+ \edef\pgf@sys@svg@temp{%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@t}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{\pgf@sys@svg@last@value}%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@t}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ }%
+ \fi%
+ \else%
+ \ifx\pgf@sys@svg@in@spline\pgfsys@jump@text%
+ \edef\pgf@sys@svg@temp{%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@tl@end}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@t}%
+ \noexpand\pgf@sys@svg@add@spline{0}{0}{1}{1}%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ }%
+ \else%
+ \edef\pgf@sys@svg@temp{%
+ \noexpand\pgf@sys@svg@add@time{\pgf@sys@svg@t}%
+ \noexpand\pgf@sys@svg@add@spline\pgf@sys@last@out@spline\pgf@sys@svg@in@spline%
+ \noexpand\pgf@sys@svg@add@value{#1}%
+ }%
+ \fi%
+ \fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@sys@svg@tl@entries%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@sys@svg@tl@entries\pgf@sys@svg@temp}%
+ \fi%
+ \let\pgf@sys@svg@tl@end\pgf@sys@svg@t%
+ \edef\pgf@sys@svg@last@value{#1}%
+ \fi%
+}
+\newif\ifpgf@sys@svg@do@times
+\def\pgf@sys@svg@tl@eval{%
+ \pgf@xa=0pt%
+ % Overrulings
+ \pgf@sys@svg@do@timestrue%
+ % Ok, we need to compute the time interval
+ \ifx\pgf@sys@svg@tl@end\pgfutil@empty%
+ \else%
+ \ifx\pgf@sys@svg@tl@start\pgfutil@empty\else\pgf@xa=\pgf@sys@svg@tl@start pt\fi%
+ \pgf@xb=\pgf@sys@svg@tl@end pt%
+ \advance\pgf@xb by -\pgf@xa%
+ % Ok, \pgf@xb is now the duration.
+ \ifdim\pgf@xb>0pt\relax%
+ \pgf@sys@svg@replace{dur}{\pgf@sys@tonumber\pgf@xb}%
+ \else%
+ \pgf@sys@svg@replace{dur}{\pgf@sys@svg@indefinitetext}%
+ \fi%
+ % Now, prepare factors
+ \pgf@xc=8192pt%
+ \ifdim\pgf@xb<0.0001pt\relax
+ \pgf@xc=1pt%
+ \pgf@xb=1sp%
+ \else%
+ \divide\pgf@xc by\pgf@xb%
+ \multiply\pgf@xb by\pgf@xc%
+ \divide\pgf@xb by65536%
+ \fi%
+ % Now, run!
+ \pgf@sys@svg@tl@entries%
+ \ifx\pgfsys@anim@val@dur\pgf@sys@svg@indefinitetext%
+ \let\pgfsys@anim@val@from\pgfsys@anim@val@to%
+ \let\pgfsys@anim@val@keyTimes\pgfutil@empty%
+ \let\pgfsys@anim@val@calcMode\pgfutil@empty%
+ \fi%
+ \fi%
+}
+\def\pgf@sys@svg@indefinitetext{indefinite}
+\def\pgf@sys@svg@add@time#1{%
+ \ifpgf@sys@svg@do@times%
+ % Compute fraction:
+ \pgf@yb=#1pt%
+ \advance\pgf@yb by-\pgf@xa%
+ \multiply\pgf@yb by\pgf@xc%
+ \divide\pgf@yb by\pgf@xb%
+ \ifdim\pgf@yb<0pt\pgf@yb=0pt\fi%
+ \ifdim\pgf@yb>1pt\pgf@yb=1pt\fi%
+ \pgf@sys@svg@append{keyTimes}{\pgf@sys@tonumber\pgf@yb}%
+ \fi%
+}
+\def\pgf@sys@svg@add@spline#1#2#3#4{\ifpgf@sys@svg@do@times\pgf@sys@svg@append{keySplines}{#1 #2 #3 #4}\fi}
+\def\pgf@sys@svg@add@value#1{%
+ \ifx\pgfsys@anim@val@values\pgfutil@empty%
+ \ifx\pgfsys@anim@val@to\pgfutil@empty%
+ \pgf@sys@svg@replace{to}{#1}%
+ \else% move
+ \let\pgfsys@anim@val@values\pgfsys@anim@val@to%
+ \let\pgfsys@anim@val@to\pgfutil@empty%
+ \pgf@sys@svg@append{values}{#1}%
+ \fi%
+ \else%
+ \pgf@sys@svg@append{values}{#1}%
+ \fi%
+}
+\def\pgfsys@animation@val@current{\pgf@sys@svg@entry{}}
+\def\pgfsys@animation@val{\pgf@sys@svg@entry{nil}} % will be ignored anyway
+\def\pgfsys@animation@val@text#1{\pgf@sys@svg@entry{#1}}
+\def\pgfsys@animation@val@scalar#1{\pgf@sys@svg@entry{#1}}
+\def\pgfsys@animation@val@dimension#1{%
+ {%
+ \pgf@x=#1\relax%
+ \xdef\pgf@svg@anim@temp{\expandafter\Pgf@geT\the\pgf@x}%
+ }%
+ \pgf@sys@svg@entry{\pgf@svg@anim@temp}%
+}
+\def\pgfsys@animation@val@color@rgb#1#2#3{\pgf@sys@svg@color@rgb#1,#2,#3\relax\pgf@sys@svg@entry{\pgf@sys@svg@prepared}}
+\def\pgfsys@animation@val@color@cmyk#1#2#3#4{\pgf@sys@svg@color@cmyk#1,#2,#3,#4\relax\pgf@sys@svg@entry{\pgf@sys@svg@prepared}}
+\def\pgfsys@animation@val@color@cmy#1#2#3{\pgf@sys@svg@color@cmy#1,#2,#3\relax\pgf@sys@svg@entry{\pgf@sys@svg@prepared}}
+\def\pgfsys@animation@val@color@gray#1{\pgf@sys@svg@color@gray#1\relax\pgf@sys@svg@entry{\pgf@sys@svg@prepared}}
+\def\pgfsys@animation@val@path#1{%
+ {%
+ \let\pgf@sys@save@svgpath=\pgf@sys@svgpath%
+ \global\let\pgf@sys@svgpath=\pgfutil@empty%
+ \pgfsyssoftpath@getcurrentpath\pgf@sys@save@path%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+ #1%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsyssoftpath@setcurrentpath\pgf@sys@save@path%
+ \global\let\pgf@svg@anim@temp\pgf@sys@svgpath%
+ \global\let\pgf@sys@svgpath\pgf@sys@save@svgpath%
+ }%
+ \pgf@sys@svg@entry{\pgf@svg@anim@temp}%
+}
+\def\pgfsys@animation@val@translate#1#2{%
+ {%
+ \pgf@x=#1\relax%
+ \pgf@y=#2\relax%
+ \xdef\pgf@svg@anim@temp{\expandafter\Pgf@geT\the\pgf@x,\expandafter\Pgf@geT\the\pgf@y}%
+ }%
+ \pgf@sys@svg@entry{\pgf@svg@anim@temp}%
+}
+\def\pgfsys@animation@val@scale#1#2{\pgf@sys@svg@entry{#1,#2}}
+\def\pgfsys@animation@val@viewbox#1#2#3#4{%
+ {%
+ \pgf@x=#1\relax%
+ \pgf@y=#2\relax%
+ \pgf@xa=#3\relax%
+ \pgf@ya=#4\relax%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \xdef\pgf@svg@anim@temp{\expandafter\Pgf@geT\the\pgf@x\space\expandafter\Pgf@geT\the\pgf@y\space\expandafter\Pgf@geT\the\pgf@xa\space\expandafter\Pgf@geT\the\pgf@ya}%
+ }%
+ \pgf@sys@svg@entry{\pgf@svg@anim@temp}%
+}
+\def\pgfsys@animation@val@dash#1#2{%
+ \edef\pgf@test@dashpattern{#1}%
+ \let\pgf@sys@svg@parsed@dash\pgfutil@empty%
+ \ifx\pgf@test@dashpattern\pgfutil@empty%
+ \else%
+ \expandafter\pgf@sys@svg@parse@dash\pgf@test@dashpattern,\relax%
+ \fi%
+ {%
+ \pgf@x=#2\relax%
+ \xdef\pgf@svg@anim@temp{\expandafter\Pgf@geT\the\pgf@x}%
+ }%
+ \pgf@sys@svg@entry{{\pgf@sys@svg@parsed@dash}{\pgf@svg@anim@temp}}%
+}
+
+
+
+\def\pgf@svg@anim@prep@dash#1#2#3{%
+ \let\pgf@svg@anim@dash@array\pgfutil@empty%
+ \let\pgf@svg@anim@dash@offset\pgfutil@empty%
+ % #1 = \pgfsys@anim@val@from or \pgfsys@anim@val@to or \pgfsys@anim@val@values
+ \ifx#1\pgfutil@empty%
+ \else%
+ \expandafter\pgf@svg@anim@prep@dash@parse#1\pgf@stop%
+ \fi%
+ \let#2\pgf@svg@anim@dash@array%
+ \let#3\pgf@svg@anim@dash@offset%
+}
+
+\def\pgf@svg@anim@prep@dash@parse#1#2{%
+ \expandafter\def\expandafter\pgf@svg@anim@dash@array\expandafter{\pgf@svg@anim@dash@array#1}%
+ \expandafter\def\expandafter\pgf@svg@anim@dash@offset\expandafter{\pgf@svg@anim@dash@offset#2}%
+ \pgfutil@ifnextchar;{%
+ \expandafter\def\expandafter\pgf@svg@anim@dash@array\expandafter{\pgf@svg@anim@dash@array;}%
+ \expandafter\def\expandafter\pgf@svg@anim@dash@offset\expandafter{\pgf@svg@anim@dash@offset;}%
+ \expandafter\pgf@svg@anim@prep@dash@parse\pgfutil@gobble%
+ }{%
+ \pgfutil@gobble% done, gobble \pgf@stop
+ }%
+}
+
+
+%
+% Markers
+%
+
+\def\pgfsys@marker@declare@{%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsys@beginscope@{ id="pgfs\the\pgf@sys@id@count"}%
+ \pgfsysprotocol@literal{\csname pgf@sys@marker@prot@\the\pgf@sys@id@count\endcsname}%
+ \pgfsys@endscope%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
+ \pgf@sys@svg@make@defs{pgfs\the\pgf@sys@id@count}{\pgfsys@temp}%
+}
+
+\def\pgfsys@marker@use#1{%
+ \pgf@sys@svg@ref@defs{pgfs#1}%
+ \pgfsysprotocol@literal{<use xlink:href="\#pgfs#1"/>}%
+}
+
+\def\pgfsys@marker@at@begin@usedpath#1{\def\pgf@sys@svg@marker@begin{#1}\let\pgf@sys@svg@marker@begin@use\pgfutil@empty}
+\def\pgfsys@marker@at@end@usedpath#1{\def\pgf@sys@svg@marker@end{#1}\let\pgf@sys@svg@marker@begin@use\pgfutil@empty}
+
+\let\pgf@sys@svg@marker@begin\relax
+\let\pgf@sys@svg@marker@end\relax
+
+\let\pgf@sys@svg@marker@begin@use\pgfutil@empty
+\let\pgf@sys@svg@marker@end@use\pgfutil@empty
+
+\def\pgf@sys@svg@prep@marker#1#2#3#4#5{%
+ \pgf@sys@svg@ref@defs{pgfs#1}%
+ \global\advance\pgf@sys@svg@objectcount by1\relax%
+ \edef\pgf@sys@svg@marker@id{pgf\the\pgf@sys@svg@objectcount}%
+ \pgfsysprotocol@literal{<marker id="\pgf@sys@svg@marker@id" markerUnits="userSpaceOnUse" orient="auto" overflow="visible">
+ <use xlink:href="\#pgfs#1"#2/> </marker>\pgfsys@svg@newline}%
+ \edef#3{marker-#4="url(\#\pgf@sys@svg@marker@id)" }%
+}
+
+
+%
+% RDF
+%
+
+\def\pgf@svg@rdf@init{%
+ \ifx\pgfsys@svg@rdf\pgfutil@empty%
+ % Ok, first, so init
+ \global\let\pgf@svg@rdf@vocab\relax%
+ \global\let\pgf@svg@rdf@about\relax%
+ \global\let\pgf@svg@rdf@content\relax%
+ \global\let\pgf@svg@rdf@datatype\relax%
+ \global\let\pgf@svg@rdf@href\relax%
+ \global\let\pgf@svg@rdf@inlist\relax%
+ \global\let\pgf@svg@rdf@prefix\relax%
+ \global\let\pgf@svg@rdf@property\relax%
+ \global\let\pgf@svg@rdf@rel\relax%
+ \global\let\pgf@svg@rdf@resource\relax%
+ \global\let\pgf@svg@rdf@rev\relax%
+ \global\let\pgf@svg@rdf@src\relax%
+ \global\let\pgf@svg@rdf@typeof\relax%
+ \global\let\pgfsys@svg@rdf\pgfsys@svg@rdf@initial%
+ \fi%
+}
+\def\pgfsys@svg@rdf@initial{%
+ \ifx\pgf@svg@rdf@vocab\relax\else\space vocab="\pgf@svg@rdf@vocab"\fi%
+ \ifx\pgf@svg@rdf@about\relax\else\space about="\pgf@svg@rdf@about"\fi%
+ \ifx\pgf@svg@rdf@datatype\relax\else\space datatype="\pgf@svg@rdf@datatype"\fi%
+ \ifx\pgf@svg@rdf@href\relax\else\space href="\pgf@svg@rdf@href"\fi%
+ \ifx\pgf@svg@rdf@inlist\relax\else\space inlist="\pgf@svg@rdf@inlist"\fi%
+ \ifx\pgf@svg@rdf@prefix\relax\else\space prefix="\pgf@svg@rdf@prefix"\fi%
+ \ifx\pgf@svg@rdf@property\relax\else\space property="\pgf@svg@rdf@property"\fi%
+ \ifx\pgf@svg@rdf@rel\relax\else\space rel="\pgf@svg@rdf@rel"\fi%
+ \ifx\pgf@svg@rdf@resource\relax\else\space resource="\pgf@svg@rdf@resource"\fi%
+ \ifx\pgf@svg@rdf@rev\relax\else\space rev="\pgf@svg@rdf@rev"\fi%
+ \ifx\pgf@svg@rdf@src\relax\else\space src="\pgf@svg@rdf@src"\fi%
+ \ifx\pgf@svg@rdf@typeof\relax\else\space typeof="\pgf@svg@rdf@typeof"\fi%
+ \ifx\pgf@svg@rdf@content\relax\else\space content="\pgf@svg@rdf@content"\fi%
+}
+
+\def\pgfsys@rdf@about#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@about{#1}}
+\def\pgfsys@rdf@content#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@content{#1}}
+\def\pgfsys@rdf@datatype#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@datatype{#1}}
+\def\pgfsys@rdf@href#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@href{#1}}
+\def\pgfsys@rdf@inlist{\pgf@svg@rdf@init\let\pgf@svg@rdf@inlist\pgfutil@empty}
+\def\pgfsys@rdf@prefix#1{\pgf@svg@rdf@init%
+ \ifx\pgf@svg@rdf@prefix\relax%
+ \gdef\pgf@svg@rdf@prefix{#1}
+ \else%
+ \expandafter\gdef\expandafter\pgf@svg@rdf@prefix\expandafter{\pgf@svg@rdf@prefix\space#1}%
+ \fi}
+\def\pgfsys@rdf@property#1{\pgf@svg@rdf@init%
+ \ifx\pgf@svg@rdf@property\relax%
+ \gdef\pgf@svg@rdf@property{#1}
+ \else%
+ \expandafter\gdef\expandafter\pgf@svg@rdf@property\expandafter{\pgf@svg@rdf@property\space#1}%
+ \fi}
+\def\pgfsys@rdf@rel#1{\pgf@svg@rdf@init%
+ \ifx\pgf@svg@rdf@rel\relax%
+ \gdef\pgf@svg@rdf@rel{#1}
+ \else%
+ \expandafter\gdef\expandafter\pgf@svg@rdf@rel\expandafter{\pgf@svg@rdf@rel\space#1}%
+ \fi}
+\def\pgfsys@rdf@rev#1{\pgf@svg@rdf@init%
+ \ifx\pgf@svg@rdf@rev\relax%
+ \gdef\pgf@svg@rdf@rev{#1}
+ \else%
+ \expandafter\gdef\expandafter\pgf@svg@rdf@rev\expandafter{\pgf@svg@rdf@rev\space#1}%
+ \fi}
+\def\pgfsys@rdf@typeof#1{\pgf@svg@rdf@init%
+ \ifx\pgf@svg@rdf@typeof\relax%
+ \gdef\pgf@svg@rdf@typeof{#1}
+ \else%
+ \expandafter\gdef\expandafter\pgf@svg@rdf@typeof\expandafter{\pgf@svg@rdf@typeof\space#1}%
+ \fi}
+\def\pgfsys@rdf@resource#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@resource{#1}}
+\def\pgfsys@rdf@src#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@src{#1}}
+\def\pgfsys@rdf@vocab#1{\pgf@svg@rdf@init\gdef\pgf@svg@rdf@vocab{#1}}
+
+
+
+
+
+
+%
+
+\def\pgfutil@color{\pgfsetcolor}
+
+\endinput
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-dvi.def b/graphics/pgf/base/tex/pgfsys-dvi.def
new file mode 100644
index 0000000000..a6397752ff
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-dvi.def
@@ -0,0 +1,394 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-dvi.def}
+
+% Driver commands for pure, ultra-portable dvi, in the tradition of
+% old-style LaTeX pictures.
+%
+% Do not expect magic from this file
+
+
+\newtoks\pgf@sys@dvi@path
+\def\pgf@sys@dvi@addtopath#1{\pgf@sys@dvi@path\expandafter{\the\pgf@sys@dvi@path#1}}
+
+% Placing an object:
+\def\pgf@sys@dvi@put#1#2#3{%
+ {%
+ \setbox\pgf@hbox=\hbox{\raise#2\hbox to0pt{\kern#1\relax#3\hss}}%
+ \wd\pgf@hbox=0pt%
+ \ht\pgf@hbox=0pt%
+ \dp\pgf@hbox=0pt%
+ \box\pgf@hbox%
+ }%
+}
+
+\def\pgf@sys@dvi@drawrect#1#2#3#4{%
+ {%
+ \pgf@x=#1%
+ \pgf@y=#2%
+ \pgf@xa=#3%
+ \pgf@ya=#4%
+ \ifdim\pgf@xa<0pt%
+ \advance\pgf@x by\pgf@xa%
+ \pgf@xa=-\pgf@xa%
+ \fi%
+ \ifdim\pgf@ya<0pt%
+ \advance\pgf@y by\pgf@ya%
+ \pgf@ya=-\pgf@ya%
+ \fi%
+ \pgf@sys@dvi@put{\pgf@x}{\pgf@y}{\vrule width\pgf@xa height\pgf@ya}%
+ }%
+}
+
+\def\pgf@sys@dvi@bezier{%
+ {%
+ % First iteration:
+ \pgf@x=\pgf@time@t\pgf@x\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \pgf@y=\pgf@time@t\pgf@y\advance\pgf@y by\pgf@time@s\pgf@ya%
+ \pgf@xa=\pgf@time@t\pgf@xa\advance\pgf@xa by\pgf@time@s\pgf@xb%
+ \pgf@ya=\pgf@time@t\pgf@ya\advance\pgf@ya by\pgf@time@s\pgf@yb%
+ \pgf@xb=\pgf@time@t\pgf@xb\advance\pgf@xb by\pgf@time@s\pgf@xc%
+ \pgf@yb=\pgf@time@t\pgf@yb\advance\pgf@yb by\pgf@time@s\pgf@yc%
+ % Second iteration:
+ \pgf@x=\pgf@time@t\pgf@x\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \pgf@y=\pgf@time@t\pgf@y\advance\pgf@y by\pgf@time@s\pgf@ya%
+ \pgf@xa=\pgf@time@t\pgf@xa\advance\pgf@xa by\pgf@time@s\pgf@xb%
+ \pgf@ya=\pgf@time@t\pgf@ya\advance\pgf@ya by\pgf@time@s\pgf@yb%
+ % Third iteration:
+ \pgf@x=\pgf@time@t\pgf@x\advance\pgf@x by\pgf@time@s\pgf@xa%
+ \pgf@y=\pgf@time@t\pgf@y\advance\pgf@y by\pgf@time@s\pgf@ya%
+ %
+ \advance\pgf@x by-.5\pgf@sys@dvi@linewidth%
+ \advance\pgf@y by-.5\pgf@sys@dvi@linewidth%
+ \pgf@sys@dvi@drawrect{\pgf@x}{\pgf@y}{\pgf@sys@dvi@linewidth}{\pgf@sys@dvi@linewidth}%
+ }%
+}
+
+\def\pgf@sys@dvi@drawcurve#1#2#3#4#5#6#7#8{%
+ {%
+ \pgf@x=#1%
+ \pgf@y=#2%
+ \pgf@xa=#3%
+ \pgf@ya=#4%
+ \pgf@xb=#5%
+ \pgf@yb=#6%
+ \pgf@xc=#7%
+ \pgf@yc=#8%
+ % Compute number of steps:
+ \pgfutil@tempdima=\pgf@x%
+ \advance\pgfutil@tempdima by-\pgf@xa%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgfutil@tempdimb=-\pgfutil@tempdima%
+ \else%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \fi%
+ \pgfutil@tempdima=\pgf@y%
+ \advance\pgfutil@tempdima by-\pgf@ya%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgfutil@tempdima=-\pgfutil@tempdima%
+ \fi%
+ \ifdim\pgfutil@tempdima>\pgfutil@tempdimb%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \fi%
+ \pgfutil@tempdima=\pgf@xb%
+ \advance\pgfutil@tempdima by-\pgf@xc%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgfutil@tempdima=-\pgfutil@tempdima%
+ \fi%
+ \ifdim\pgfutil@tempdima>\pgfutil@tempdimb%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \fi%
+ \pgfutil@tempdima=\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yc%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgfutil@tempdima=-\pgfutil@tempdima%
+ \fi%
+ \ifdim\pgfutil@tempdima>\pgfutil@tempdimb%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \fi%
+ \pgfutil@tempdima=\pgf@x%
+ \advance\pgfutil@tempdima by-\pgf@xc%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgfutil@tempdima=-\pgfutil@tempdima%
+ \fi%
+ \ifdim\pgfutil@tempdima>\pgfutil@tempdimb%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \fi%
+ \pgfutil@tempdima=\pgf@y%
+ \advance\pgfutil@tempdima by-\pgf@yc%
+ \ifdim\pgfutil@tempdima<0pt%
+ \pgfutil@tempdima=-\pgfutil@tempdima%
+ \fi%
+ \ifdim\pgfutil@tempdima>\pgfutil@tempdimb%
+ \pgfutil@tempdimb=\pgfutil@tempdima%
+ \fi%
+ \pgfutil@tempcnta=\pgfutil@tempdimb%
+ \ifdim\pgf@sys@dvi@linewidth>0.3pt%
+ \pgfutil@tempdimb=0.15pt%
+ \else%
+ \ifdim\pgf@sys@dvi@linewidth<0.05pt%
+ \pgfutil@tempdimb=.025pt%
+ \else%
+ \pgfutil@tempdimb=.5\pgf@sys@dvi@linewidth%
+ \fi%
+ \fi%
+ \pgfutil@tempcntb=\pgfutil@tempdimb%
+ \divide\pgfutil@tempcnta by\pgfutil@tempcntb\relax%
+ \ifnum\pgfutil@tempcnta>0\relax%
+ \pgfutil@tempcntb=0\relax%
+ \loop%
+ {%
+ \pgfutil@tempdima=\the\pgfutil@tempcntb pt%
+ \pgfutil@tempdimb=\the\pgfutil@tempcnta pt%
+ \advance\pgfutil@tempdimb by-\pgfutil@tempdima\relax%
+ \divide\pgfutil@tempdima by\pgfutil@tempcnta\relax%
+ \divide\pgfutil@tempdimb by\pgfutil@tempcnta\relax%
+ \edef\pgf@time@t{\pgf@sys@tonumber{\pgfutil@tempdima}}%
+ \edef\pgf@time@s{\pgf@sys@tonumber{\pgfutil@tempdimb}}%
+ \pgf@sys@dvi@bezier%
+ }%
+ \advance\pgfutil@tempcntb by1\relax
+ \ifnum\pgfutil@tempcntb<\pgfutil@tempcnta%
+ {\def\pgf@time@t{1}\def\pgf@time@s{0}\pgf@sys@dvi@bezier}%
+ \repeat%
+ \fi%
+ }%
+}
+
+% Text:
+\def\pgfsys@hbox#1{%
+ \pgfsys@begin@idscope%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \pgf@sys@dvi@put{\pgf@sys@dvi@pt@x}{\pgf@sys@dvi@pt@y}{\box#1}%
+ \pgfsys@end@idscope%
+}
+
+
+
+% Literals:
+
+\def\pgfsys@invoke#1{#1}
+
+
+% Buffered path construction:
+
+\def\pgfsys@moveto#1#2{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@addtopath{\noexpand\pgf@sys@dvi@moveto{#1}{#2}}}}
+\def\pgfsys@lineto#1#2{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@addtopath{\noexpand\pgf@sys@dvi@lineto{#1}{#2}}}}
+\def\pgfsys@curveto#1#2#3#4#5#6{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@addtopath{\noexpand\pgf@sys@dvi@curveto{#1}{#2}{#3}{#4}{#5}{#6}}}}
+\def\pgfsys@rect#1#2#3#4{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@addtopath{\noexpand\pgf@sys@dvi@rect{#1}{#2}{#3}{#4}}}}
+\def\pgfsys@closepath{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@addtopath{\noexpand\pgf@sys@dvi@closepath}}}
+
+
+% Scoping
+\def\pgfsys@beginscope{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@beginscope}}%
+\def\pgfsys@endscope{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@endscope}}%
+
+\def\pgf@sys@dvi@beginscope{%
+ % Save current stuff...
+ \edef\pgf@sys@dvi@return{%
+ \global\pgf@sys@dvi@linewidth=\the\pgf@sys@dvi@linewidth%
+ \global\pgf@sys@dvi@pt@x=\the\pgf@sys@dvi@pt@x%
+ \global\pgf@sys@dvi@pt@y=\the\pgf@sys@dvi@pt@y%
+ \gdef\noexpand\pgf@sys@dvi@pt@aa{\pgf@sys@dvi@pt@aa}%
+ \gdef\noexpand\pgf@sys@dvi@pt@ab{\pgf@sys@dvi@pt@ab}%
+ \gdef\noexpand\pgf@sys@dvi@pt@ba{\pgf@sys@dvi@pt@ba}%
+ \gdef\noexpand\pgf@sys@dvi@pt@bb{\pgf@sys@dvi@pt@bb}%
+ }%
+ \begingroup%
+ \ignorespaces%
+}
+
+\def\pgf@sys@dvi@endscope{%
+ \endgroup%
+ \pgf@sys@dvi@return%
+}
+
+
+
+% Line width
+
+\newdimen\pgf@sys@dvi@linewidth
+\pgf@sys@dvi@linewidth=0.4pt
+
+\def\pgfsys@setlinewidth#1{\global\pgf@sys@dvi@linewidth=#1\relax}
+
+
+% Transformation matrix
+
+\newdimen\pgf@sys@dvi@pt@x
+\newdimen\pgf@sys@dvi@pt@y
+
+\def\pgf@sys@dvi@pt@aa{1.0} \def\pgf@sys@dvi@pt@ab{0.0}
+\def\pgf@sys@dvi@pt@ba{0.0} \def\pgf@sys@dvi@pt@bb{1.0}
+
+\def\pgf@sys@dvi@pos@transform#1#2{%
+ \pgf@pt@temp=#1%
+ #1=\pgf@sys@dvi@pt@aa#1%
+ \advance#1 by\pgf@sys@dvi@pt@ba#2%
+ #2=\pgf@sys@dvi@pt@bb#2%
+ \advance#2 by\pgf@sys@dvi@pt@ab\pgf@pt@temp%
+ \advance#1 by\pgf@sys@dvi@pt@x%
+ \advance#2 by\pgf@sys@dvi@pt@y%
+}
+
+\def\pgf@sys@dvi@transformcm#1#2#3#4#5#6{%
+ {%
+ \pgf@xc=#5%
+ \pgf@yc=#6%
+ %
+ \pgf@x=#1pt%
+ \pgf@y=#2pt%
+ %
+ \pgf@xa=\pgf@sys@dvi@pt@aa\pgf@x%
+ \advance\pgf@xa by \pgf@sys@dvi@pt@ba\pgf@y%
+ %
+ \pgf@ya=\pgf@sys@dvi@pt@ab\pgf@x%
+ \advance\pgf@ya by \pgf@sys@dvi@pt@bb\pgf@y%
+ %
+ \pgf@x=#3pt%
+ \pgf@y=#4pt%
+ %
+ \pgf@xb=\pgf@sys@dvi@pt@aa\pgf@x%
+ \advance\pgf@xb by \pgf@sys@dvi@pt@ba\pgf@y%
+ %
+ \pgf@yb=\pgf@sys@dvi@pt@ab\pgf@x%
+ \advance\pgf@yb by \pgf@sys@dvi@pt@bb\pgf@y%
+ %
+ \pgf@x=\pgf@sys@dvi@pt@aa\pgf@xc%
+ \advance\pgf@x by\pgf@sys@dvi@pt@ba\pgf@yc%
+ \advance\pgf@x by\pgf@sys@dvi@pt@x%
+ %
+ \pgf@y=\pgf@sys@dvi@pt@ab\pgf@xc%
+ \advance\pgf@y by\pgf@sys@dvi@pt@bb\pgf@yc%
+ \advance\pgf@y by\pgf@sys@dvi@pt@y%
+ %
+ \global\pgf@sys@dvi@pt@x=\pgf@x%
+ \global\pgf@sys@dvi@pt@y=\pgf@y%
+ \xdef\pgf@sys@dvi@pt@aa{\pgf@sys@tonumber{\pgf@xa}}%
+ \xdef\pgf@sys@dvi@pt@ab{\pgf@sys@tonumber{\pgf@ya}}%
+ \xdef\pgf@sys@dvi@pt@ba{\pgf@sys@tonumber{\pgf@xb}}%
+ \xdef\pgf@sys@dvi@pt@bb{\pgf@sys@tonumber{\pgf@yb}}%
+ }%
+}
+
+\def\pgfsys@transformcm#1#2#3#4#5#6{%
+ {%
+ \pgf@x=#5\relax%
+ \pgf@y=#6\relax%
+ \pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@transformcm{#1}{#2}{#3}{#4}{\the\pgf@x}{\the\pgf@y}}%
+ }%
+}
+
+
+% Stroking
+
+\def\pgfsys@stroke{\pgfsysprotocol@literal{\noexpand\pgf@sys@dvi@stroke}}%
+
+
+\def\pgf@sys@dvi@stroke{%
+ \let\pgf@sys@dvi@moveto=\pgf@sys@dvi@moveto@stroke%
+ \let\pgf@sys@dvi@lineto=\pgf@sys@dvi@lineto@stroke%
+ \let\pgf@sys@dvi@curveto=\pgf@sys@dvi@curveto@stroke%
+ \let\pgf@sys@dvi@rect=\pgf@sys@dvi@rect@stroke%
+ \let\pgf@sys@dvi@closepath=\pgf@sys@dvi@closepath@stroke%
+ {\the\pgf@sys@dvi@path}%
+ \pgf@sys@dvi@path{}%
+}
+
+\def\pgf@sys@dvi@moveto@stroke#1#2{%
+ % These two store the current position:
+ \pgf@xc=#1\relax%
+ \pgf@yc=#2\relax%
+ % These two store the last moveto:
+ \pgf@xb=\pgf@xc%
+ \pgf@yb=\pgf@yc%
+}
+
+\def\pgf@sys@dvi@lineto@stroke#1#2{%
+ {%
+ \pgf@xa=#1\relax%
+ \pgf@ya=#2\relax%
+ \pgf@x=\pgf@xc%
+ \pgf@y=\pgf@yc%
+ \pgf@sys@dvi@pos@transform{\pgf@xa}{\pgf@ya}%
+ \pgf@sys@dvi@pos@transform{\pgf@x}{\pgf@y}%
+ % Now, we need to draw a line from (x/y) to (xa/ya)
+ %
+ % Horizontal?
+ \ifdim\pgf@y=\pgf@ya%
+ % Ok, that should be easy...
+ \pgf@xb=\pgf@xa%
+ \advance\pgf@xb by-\pgf@x%
+ \advance\pgf@y by-0.5\pgf@sys@dvi@linewidth%
+ \pgf@sys@dvi@drawrect{\pgf@x}{\pgf@y}{\pgf@xb}{\pgf@sys@dvi@linewidth}%
+ \else%
+ \ifdim\pgf@x=\pgf@xa%
+ % Ok, also easy...
+ \pgf@yb=\pgf@ya%
+ \advance\pgf@yb by-\pgf@y%
+ \advance\pgf@x by-0.5\pgf@sys@dvi@linewidth%
+ \pgf@sys@dvi@drawrect{\pgf@x}{\pgf@y}{\pgf@sys@dvi@linewidth}{\pgf@yb}%
+ \else%
+ \edef\pgf@marshal{\noexpand\pgf@sys@dvi@drawcurve{\the\pgf@x}{\the\pgf@y}{\the\pgf@x}{\the\pgf@y}{\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xa}{\the\pgf@ya}}%
+ \pgf@marshal%
+ \fi%
+ \fi%
+ }%
+ % Remember:
+ \pgf@xc=#1\relax%
+ \pgf@yc=#2\relax%
+}
+
+
+\def\pgf@sys@dvi@curveto@stroke#1#2#3#4#5#6{%
+ \pgf@x=\pgf@xc%
+ \pgf@y=\pgf@yc%
+ \pgf@xa=#1%
+ \pgf@ya=#2%
+ \pgf@xb=#3%
+ \pgf@yb=#4%
+ \pgf@xc=#5%
+ \pgf@yc=#6%
+ {%
+ \pgf@sys@dvi@pos@transform{\pgf@x}{\pgf@y}%
+ \pgf@sys@dvi@pos@transform{\pgf@xa}{\pgf@ya}%
+ \pgf@sys@dvi@pos@transform{\pgf@xb}{\pgf@yb}%
+ \pgf@sys@dvi@pos@transform{\pgf@xc}{\pgf@yc}%
+ \pgf@sys@dvi@drawcurve{\pgf@x}{\pgf@y}{\pgf@xa}{\pgf@ya}{\pgf@xb}{\pgf@yb}{\pgf@xc}{\pgf@yc}%
+ }%
+}
+
+\def\pgf@sys@dvi@closepath@stroke{%
+ \pgf@sys@dvi@lineto@stroke{\pgf@xc}{\pgf@yc}%
+}
+
+\def\pgf@sys@dvi@rect@stroke#1#2#3#4{%
+ \pgf@x=#1\relax%
+ \pgf@y=#2\relax%
+ \pgf@xa=#3\relax%
+ \pgf@ya=#4\relax%
+ \advance\pgf@xa by\pgf@x%
+ \advance\pgf@ya by\pgf@y%
+ \pgf@sys@dvi@moveto@stroke{\pgf@x}{\pgf@y}%
+ \pgf@sys@dvi@lineto@stroke{\pgf@xa}{\pgf@y}%
+ \pgf@sys@dvi@lineto@stroke{\pgf@xa}{\pgf@ya}%
+ \pgf@sys@dvi@lineto@stroke{\pgf@x}{\pgf@ya}%
+ \pgf@sys@dvi@closepath@stroke%
+}
+
+
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-dvipdfm.def b/graphics/pgf/base/tex/pgfsys-dvipdfm.def
new file mode 100644
index 0000000000..939595089a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-dvipdfm.def
@@ -0,0 +1,110 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-dvipdfm.def}
+
+% Driver commands for dvipdfm
+
+%
+% Load common pdf and pdf in dvi commands:
+%
+\input pgfsys-common-pdf.def
+\input pgfsys-common-pdf-via-dvi.def
+
+%
+% dvipdfm-specific stuff:
+%
+
+\def\pgfsys@hbox#1{%
+ \pgfsys@begin@idscope%
+ \pgfsys@invoke{q -1 0 0 -1 0 0 cm}%
+ \special{pdf: content -1 0 0 -1 0 0 cm 3 Tr q}% translate to
+ % original coordinate system and do
+ % not show anything
+ {\hbox to 0pt{\pgfutil@font@normalfont\pgfutil@selectfont.\hss}}% enforce font change
+ \pgfsys@invoke{0 Tr}%
+ \pgfsys@invoke{0 J [] 0 d}% reset line cap and dash
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1
+ \pgfsys@invoke{n Q Q}%
+ \pgfsys@end@idscope%
+}
+\def\pgfsys@hboxsynced#1{%
+ {%
+ \pgfsys@begin@idscope%
+ \pgfsys@beginscope%
+ \setbox\pgf@hbox=\hbox{%
+ \hskip\pgf@pt@x%
+ \raise\pgf@pt@y\hbox{%
+ \pgf@pt@x=0pt%
+ \pgf@pt@y=0pt%
+ \special{pdf: content q}%
+ \pgflowlevelsynccm%
+ \pgfsys@invoke{q -1 0 0 -1 0 0 cm}%
+ \special{pdf: content -1 0 0 -1 0 0 cm q}% translate to original coordinate system
+ \pgfsys@invoke{0 J [] 0 d}% reset line cap and dash
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1%
+ \pgfsys@invoke{n Q Q Q}%
+ }%
+ \hss%
+ }%
+ \wd\pgf@hbox=0pt%
+ \ht\pgf@hbox=0pt%
+ \dp\pgf@hbox=0pt%
+ \pgfsys@hbox\pgf@hbox%
+ \pgfsys@endscope%
+ \pgfsys@end@idscope%
+ }%
+}
+
+\def\pgfsys@beginpicture{%
+ \pgfsys@invoke{3 Tr}%
+ \hbox to 0pt{\pgfutil@font@normalfont\pgfutil@selectfont.\hss}% enforce font change
+ \pgfsys@invoke{0 Tr}%
+ \special{pdf: content q}}
+\def\pgfsys@endpicture{%
+ \pgfsys@invoke{n Q}%
+}
+
+\def\pgfsys@invoke#1{\special{pdf: content Q #1 q}} % ugly, but necessary...
+
+\def\pgfsys@papersize#1#2{%
+% \expandafter\gdef\expandafter\pgfsys@atbegindocument%
+% \expandafter{\pgfsys@atbegindocument
+ \special{papersize=#1,#2}%
+% }
+}
+
+\def\pgfsys@prepare@papersize#1#2{%
+ \expandafter\gdef\expandafter\pgfsys@atbegindocument%
+ \expandafter{\pgfsys@atbegindocument
+ \special{papersize=#1,#2}%
+ }
+}
+
+%
+% Position tracking (needs pdftex >= 1.40.0-alpha-20051205 in dvi mode)
+%
+\ifx\pdftexversion\@undefined
+\else
+ \ifnum\pdftexversion>139
+ \pgf@sys@pdf@dvi@tracker
+ \fi
+\fi
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-dvipdfmx.def b/graphics/pgf/base/tex/pgfsys-dvipdfmx.def
new file mode 100644
index 0000000000..67b6cd87b3
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-dvipdfmx.def
@@ -0,0 +1,512 @@
+% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-dvipdfmx.def}
+
+% Driver commands for dvipdfmx
+%
+% Modified by Jin-Hwan Cho <chofchof@ktug.or.kr> on April 18, 2009.
+% This driver requires the version DVIPDFMX-20080605 that is contained
+% in texlive 2008 or later.
+
+%
+% Load common pdf and pdf in dvi commands:
+%
+\input pgfsys-common-pdf.def
+
+
+% For unique object name:
+\newcount\pgfsys@objnum\pgfsys@objnum\@ne
+
+% `pdf:code' is an abbreviation of `pdf:literal direct', the idea of which
+% came from pdfTeX's primitive \pdfliteral direct.
+\def\pgfsys@invoke#1{\special{pdf:code #1}}
+
+% If color is changed by \pgfsys@invoke explicitly, the color
+% optimization routine in dvipdfmx does not work correctly
+% because the routine checks color specials only. For example,
+%
+% \special{color push 0}\pgfsys@invoke{1 g 1 G}\special{color push 0}
+%
+% the last color special will be ignored the optimization routine
+% thinks that the color has changed to the same color.
+% To avoid this problem, we need to change the color temporarily to another.
+%
+% We assume that black is the default color when no color is specified.
+\def\pgfsys@dvipdfmx@start@force@reset@color{%
+ \special{pdf:bcolor [1]}%
+ \special{pdf:bcolor [0]}%
+}
+\def\pgfsys@dvipdfmx@stop@force@reset@color{%
+ \special{pdf:ecolor}%
+ \special{pdf:ecolor}%
+}
+
+
+\def\pgfsys@dvipdfmx@suspendcontent{%
+ \special{pdf:code q -1 0 0 -1 0 0 cm q}%
+ \special{pdf: econtent}%
+ \special{pdf: bcontent}%
+ \special{pdf:code -1 0 0 -1 0 0 cm}%
+ \special{pdf:code q}% translate to original system
+ \special{pdf: econtent}%
+}
+
+\def\pgfsys@dvipdfmx@unsuspendcontent{%
+ \special{pdf: bcontent}%
+ \special{pdf:code Q Q Q}%
+}
+
+\def\pgfsys@hbox#1{%
+ \pgfsys@begin@idscope%
+ \pgfsys@beginscope%
+ \setbox#1=\hbox{\box#1}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \pgfsys@dvipdfmx@suspendcontent%
+ \pgfsys@invoke{0 J [] 0 d}% reset line cap and dash
+ \pgfsys@dvipdfmx@start@force@reset@color%
+ \box#1%
+ \pgfsys@dvipdfmx@stop@force@reset@color%
+ \pgfsys@dvipdfmx@unsuspendcontent%
+ \pgfsys@endscope%
+ \pgfsys@end@idscope%
+}
+
+% We cannot use many codes in pgfsys-common-pdf-via-dvi.def.
+% So it is rewritten here (with some bugs fixed).
+\def\pgfsys@hboxsynced#1{%
+ \pgfsys@begin@idscope%
+ \pgfsys@beginscope%
+ \setbox#1=\hbox{\box#1}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \pgfsys@dvipdfmx@suspendcontent%
+ \pgfsys@invoke{0 J [] 0 d}% reset line cap and dash
+ \pgfsys@dvipdfmx@start@force@reset@color%
+ \pgf@sys@bp@correct\pgf@pt@x%
+ \pgf@sys@bp@correct\pgf@pt@y%
+ \special{pdf:btrans matrix \pgf@pt@aa\space \pgf@pt@ab\space \pgf@pt@ba\space \pgf@pt@bb\space
+ \pgf@sys@tonumber{\pgf@pt@x} \pgf@sys@tonumber{\pgf@pt@y}}%
+ \box#1%
+ \special{pdf:etrans}%
+ \pgfsys@dvipdfmx@stop@force@reset@color%
+ \pgfsys@dvipdfmx@unsuspendcontent%
+ \pgfsys@endscope%
+ \pgfsys@end@idscope%
+}
+
+% All text materials between `pdf:bcontent' and `pdf:econtent' are
+% treated in the relative coordinate.
+\def\pgfsys@beginpicture{\special{pdf:bcontent}}
+\def\pgfsys@endpicture{\special{pdf:econtent}}
+
+\def\pgfsys@imagesuffixlist{.pdf:.jpg:.jpeg:.png:.bmp:}
+
+% Shaidng came from pgfsys-pdftex.def
+\def\pgfsys@horishading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathparse{#2}%
+ \pgf@process{\pgfpoint{\pgf@max}{#2}}%
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space width \the\pgf@max\space height \pgfmathresult pt}%
+ \special{pdf:put @resources
+ <<
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@doma\space0 \pgf@domb\space0]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>
+ >>}%
+ \pgfsys@invoke{/Sh sh}%
+ \special{pdf:exobj}}}\@tempa% <<
+ \xdef\pgfutil@tempa{%
+ \hbox to\the\pgf@max{\vbox to\pgfmathresult pt{\vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne%
+}
+\def\pgfsys@vertshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \pgfmathparse{#2}%
+ \pgf@process{\pgfpoint{\pgf@max}{#2}}%
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space width \pgfmathresult pt\space height \the\pgf@max}%
+ \special{pdf:put @resources
+ <<
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [0 \pgf@doma\space0 \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>
+ >>}%
+ \pgfsys@invoke{/Sh sh}%
+ \special{pdf:exobj}}}\@tempa% <<
+ \xdef\pgfutil@tempa{%
+ \hbox to\pgfmathresult pt{\vbox to\the\pgf@max{\vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne%
+}
+\def\pgfsys@radialshading#1#2#3{%
+ {%
+ \pgf@parsefunc{#3}%
+ \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}%
+ \pgfutil@tempdima=2\pgf@max%
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space width \the\pgfutil@tempdima\space height \the\pgfutil@tempdima}%
+ \special{pdf:put @resources
+ <<
+ /Shading << /Sh << /ShadingType 3
+ /ColorSpace \pgf@shading@device\space
+ /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] >> >>
+ >>}%
+ \pgfsys@invoke{/Sh sh}%
+ \special{pdf:exobj}}}\@tempa% <<
+ \xdef\pgfutil@tempa{%
+ \hbox to\the\pgfutil@tempdima{\vbox to\the\pgfutil@tempdima{\vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne%
+}
+\def\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%
+ \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
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:stream @pgfstream\the\pgfsys@objnum\space({#4}) <</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 [\pgf@shading@functional@range]>>}}}\@tempa%
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space width \the\pgf@x\space height \the\pgf@y}%
+ \special{pdf:put @resources <</Shading <</Sh <</ShadingType 1
+ /ColorSpace \pgf@shading@device\space
+ /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 @pgfstream\the\pgfsys@objnum>> >> >>}%
+ \pgfsys@invoke{/Sh sh}%
+ \special{pdf:exobj}}}\@tempa% <<
+ \xdef\pgfutil@tempa{%
+ \hbox to\the\pgf@x{\vbox to\the\pgf@y{\vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+ \global\advance\pgfsys@objnum\@ne%
+}
+
+% \pgf@sys@pdf@dvi@tracker was not touched!
+\def\pgf@sys@pdf@dvi@tracker{
+ \def\pgfsys@markposition##1{%
+ \pdfsavepos%
+ \edef\pgf@temp{##1}%
+ \expandafter\pgfutil@writetoaux\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\pdflastxpos}{\the\pdflastypos}}%
+ }
+ \def\pgfsyspdfmark##1##2##3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@##1\endcsname{\pgfqpoint{##2sp}{##3sp}}%
+ \pgfutil@check@rerun{##1}{{##2}{##3}}%
+ }
+ \def\pgfsys@getposition##1##2{%
+ \edef\pgf@marshal{\let\noexpand##2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@##1\endcsname}%
+ \pgf@marshal%
+ }
+ \def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfpointorigin}
+}
+
+% Resource management: bugs were fixed.
+\newif\ifpgf@sys@pdf@colorspaces@exists
+\newif\ifpgf@sys@pdf@patterns@exists
+\newif\ifpgf@sys@pdf@extgs@exists
+\newif\ifpgf@sys@pdf@colorspaces@created
+\newif\ifpgf@sys@pdf@patterns@created
+\newif\ifpgf@sys@pdf@extgs@created
+\newif\ifpgf@sys@pdf@any@resources
+
+\def\pgf@sys@setuppdfresources@plain{%
+ % This command will setup pdf resource in plain and in latex
+ % mode. ConTeXt has its own handler
+ \pgfutil@insertatbegineverypage{%
+ \pgf@sys@pdf@any@resourcesfalse%
+ \ifpgf@sys@pdf@extgs@exists%
+ \pgf@sys@pdf@any@resourcestrue%
+ \ifpgf@sys@pdf@extgs@created\else\special{pdf:obj @pgfextgs <<>>}\global\pgf@sys@pdf@extgs@createdtrue\fi% <<
+ \fi%
+ \ifpgf@sys@pdf@colorspaces@exists%
+ \pgf@sys@pdf@any@resourcestrue%
+ \ifpgf@sys@pdf@colorspaces@created\else\special{pdf:obj @pgfcolorspaces <<>>}\global\pgf@sys@pdf@colorspaces@createdtrue\fi% <<
+ \fi%
+ \ifpgf@sys@pdf@patterns@exists%
+ \pgf@sys@pdf@any@resourcestrue%
+ \ifpgf@sys@pdf@patterns@created\else\special{pdf:obj @pgfpatterns <<>>}\global\pgf@sys@pdf@patterns@createdtrue\fi% <<
+ \fi%
+ \ifpgf@sys@pdf@any@resources%
+ \special{pdf:put @resources
+ <<
+ \ifpgf@sys@pdf@extgs@exists /ExtGState @pgfextgs \fi
+ \ifpgf@sys@pdf@patterns@exists /Pattern @pgfpatterns \fi
+ \ifpgf@sys@pdf@colorspaces@exists /ColorSpace @pgfcolorspaces \fi
+ >>}% <<
+ \fi%
+ }
+ \def\pgf@sys@addpdfresource@extgs@plain##1{%
+ \global\pgf@sys@pdf@extgs@existstrue%
+ \pgfutil@insertatbegincurrentpage{\special{pdf:put @pgfextgs << ##1 >>}}% <<
+ }
+ \def\pgf@sys@addpdfresource@colorspaces@plain##1{%
+ \global\pgf@sys@pdf@colorspaces@existstrue%
+ \pgfutil@insertatbegincurrentpage{\special{pdf:put @pgfcolorspaces << ##1 >>}}% <<
+ }
+ \def\pgf@sys@addpdfresource@patterns@plain##1{%
+ \global\pgf@sys@pdf@patterns@existstrue%
+ \pgfutil@insertatbegincurrentpage{\special{pdf:put @pgfpatterns << ##1 >>}}% <<
+ }
+}
+\pgfutil@setuppdfresources % possibly call the above
+
+% As pgfsys-pdftex.def, the following code is required
+% to give colors on pattern objects.
+\pgfutil@addpdfresource@colorspaces{ /pgfprgb [/Pattern /DeviceRGB] }
+
+% Image Mask came from pgfsys-pdftex.def
+% generic/pgf/basiclayer/pgfcoreimage.code.tex must be modified!
+\def\pgfsys@defineimage{% width, height, page number
+ \ifx\includegraphics\undefined
+ \ifx\pgf@imagewidth\pgfutil@empty\edef\pgf@imagewidth{1bp}\fi% width?
+ \ifx\pgf@imageheight\pgfutil@empty\edef\pgf@imageheight{1bp}\fi% height?
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{ page \pgf@imagepage}\fi%
+ \ifx\pgf@imageinterpolate\pgfutil@empty\else\edef\pgf@imageinterpolate{ /Interpolate\space\pgf@imageinterpolate}\fi%
+ \ifx\pgf@imagemask\pgfutil@empty\else\xdef\pgf@imagemask{ /SMask @\pgf@imagemask}\fi%
+ \edef\pgf@image{\noexpand\hbox to \pgf@imagewidth{\vbox to \pgf@imageheight{\vfil\special{pdf:image width \pgf@imagewidth\space height \pgf@imageheight\space\pgf@imagepage\space(\pgf@filename) <<\pgf@imageinterpolate\pgf@imagemask\space>>}}\hfil}}%
+ \else
+ \ifx\pgf@imagewidth\pgfutil@empty\else\edef\pgf@imagewidth{width=\pgf@imagewidth,}\fi%
+ \ifx\pgf@imageheight\pgfutil@empty\else\edef\pgf@imageheight{height=\pgf@imageheight,}\fi%
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{page=\pgf@imagepage,}\fi%
+ \ifx\pgf@imageinterpolate\pgfutil@empty\else\edef\pgf@imageinterpolate{interpolate=\pgf@imageinterpolate,}\fi%
+ \ifx\pgf@imagemask\pgfutil@empty\else\xdef\pgf@imagemask{mask=\pgf@imagemask,}\fi%
+ \edef\pgf@image{\noexpand\includegraphics[\pgf@imageheight\pgf@imagewidth\pgf@imagepage\pgf@imageinterpolate\pgf@imagemask]{\pgf@filename}}%
+ \fi%
+}
+\def\pgfsys@definemask#1{%
+ \ifx\pgf@maskmatte\pgfutil@empty%
+ \else%
+ \edef\pgf@maskmatte{/Matte [\pgf@maskmatte]}%
+ \fi%
+ \edef\pgf@attr{\pgf@maskmatte\space /Decode [1 0]}%
+ \special{pdf:image @pgfmask\the\pgfsys@objnum\space hide (\pgf@filename) << \pgf@attr >>}%
+ \edef\pgf@mask{pgfmask\the\pgfsys@objnum}%
+ \global\advance\pgfsys@objnum\@ne%
+}
+
+% Patterns came from pgfsys-pdftex.def
+% dvipdfmx provides a new special `pdf:stream' for a stream object.
+\def\pgfsys@declarepattern#1#2#3#4#5#6#7{%
+ % Start building the pattern dictionary:
+ \pgf@xa=#2\relax%
+ \pgf@ya=#3\relax%
+ \pgf@xb=#4\relax%
+ \pgf@yb=#5\relax%
+ \pgf@xc=#6\relax%
+ \pgf@yc=#7\relax%
+ \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@sys@bp@correct\pgf@xc%
+ \pgf@sys@bp@correct\pgf@yc%
+ \pgfsys@@declarepattern{#1}%
+}
+
+\def\pgfsys@@declarepattern#1#2#3#4#5#6#7#8#9{%
+ \pgfutil@tempdima=#6\relax%
+ \pgfutil@tempdimb=#7\relax%
+ \pgf@sys@bp@correct\pgfutil@tempdima%
+ \pgf@sys@bp@correct\pgfutil@tempdimb%
+ % Now create the pattern object:
+ \pgfsys@dvipdfmx@patternobj{%
+ \pgfsys@dvipdfmx@stream{@pgfpatternobject#1}{#8}{%
+ /Type /Pattern
+ /PatternType 1
+ /PaintType \ifnum#9=0 2 \else 1 \fi
+ /TilingType 1
+ /BBox [\pgf@sys@tonumber\pgf@xa\space\pgf@sys@tonumber\pgf@ya\space\pgf@sys@tonumber\pgf@xb\space\pgf@sys@tonumber\pgf@yb]
+ /XStep \pgf@sys@tonumber\pgf@xc\space
+ /YStep \pgf@sys@tonumber\pgf@yc\space
+ /Matrix [#2\space#3\space#4\space#5\space\pgf@sys@tonumber\pgfutil@tempdima\space\pgf@sys@tonumber\pgfutil@tempdimb]
+ /Resources << >> %<<
+ }%
+ }%
+ \pgfutil@addpdfresource@patterns{/pgfpat#1\space @pgfpatternobject#1}%
+}
+
+% hook for xdvipdfmx:
+\def\pgfsys@dvipdfmx@patternobj#1{%
+ #1%
+}%
+
+% hook for xdvipdfmx:
+\def\pgfsys@dvipdfmx@stream#1#2#3{%
+ \special{pdf:stream #1 (#2) << #3 >>}%
+}%
+
+
+\def\pgfsys@setpatternuncolored#1#2#3#4{%
+ \pgfsysprotocol@literal{/pgfprgb cs #2 #3 #4 /pgfpat#1\space scn}%
+}
+\def\pgfsys@setpatterncolored#1{%
+ \pgfsysprotocol@literal{/Pattern cs /pgfpat#1\space scn}%
+}
+
+% Opacity masks (fadings) came from pgfsys-pdftex.def
+%
+% One problem was that the second argument of \pgfsys@fadingfrombox
+% is a box so that \pgfutil@insertatbegincurrentpage cannot be used.
+% So, the new command \pgfutil@insertatbegincurrentpagefrombox is written
+% in generic/pgf/utilities/pgfutil-[context,latex,plain].def.
+\def\pgfsys@fadingfrombox#1#2{%
+ \expandafter\ifx\csname pgfsmaskxform@#1\endcsname\relax%
+ {%
+ \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}}}%
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:bxobj @pgfsmask\the\pgfsys@objnum\space%
+ width \the\wd#2\space height \the\ht#2\space depth \the\dp#2}%
+ \wd#2=0pt%
+ \ht#2=0pt%
+ \dp#2=0pt%
+ \box#2%
+ \special{pdf:put @resources
+ <<
+ \ifpgf@sys@pdf@extgs@exists /ExtGState @pgfextgs \fi
+ \ifpgf@sys@pdf@patterns@exists /Pattern @pgfpatterns \fi
+ \ifpgf@sys@pdf@colorspaces@exists /ColorSpace @pgfcolorspaces \fi
+ >>}% <<
+ \special{pdf:exobj <</Group <</S/Transparency /CS/DeviceGray>> >>}}}\@tempa%
+ \expandafter\xdef\csname pgfsmaskxform@#1\endcsname{\the\pgfsys@objnum}%
+ }%
+ \global\advance\pgfsys@objnum\@ne%
+ \fi%
+}
+\def\pgfsys@usefading#1#2#3#4#5#6#7{%
+ \expandafter\ifx\csname pgfsmaskxform@#1\endcsname\relax%
+ \pgferror{Undefined fading '#1'}%
+ \else%
+ {%
+ \expandafter\ifx\csname pgfsmask@#1\endcsname\relax%
+ \pgf@sys@pdf@install@mask{#1}%
+ \fi%
+ \pgftransformreset%
+ \pgftransformcm{#2}{#3}{#4}{#5}{\pgfpoint{#6}{#7}}%
+ \csname pgfsmasktrans@#1\endcsname%
+ {%
+ \pgflowlevelsynccm%
+ \pgfsys@invoke{/pgfsmask\csname pgfsmaskxform@#1\endcsname\space gs}%
+ }%
+ \pgftransforminvert%
+ \pgflowlevelsynccm%
+ }%
+ \fi
+}
+\def\pgf@sys@pdf@install@mask#1{%
+ \pgfutil@addpdfresource@extgs{%
+ /pgfsmask\csname pgfsmaskxform@#1\endcsname\space <<
+ /SMask <<
+ /S /Luminosity
+ /G @pgfsmask\csname pgfsmaskxform@#1\endcsname
+ >> >>}%<<
+ \expandafter\let\csname pgfsmask@#1\endcsname\expandafter\csname pgfsmaskxform@#1\endcsname%
+}
+
+% Transparency groups came from pgfsys-pdftex.def
+\def\pgfsys@transparencygroupfrombox#1{%
+ {%
+ \pgf@sys@bp@correct\pgf@picminx%
+ \pgf@sys@bp@correct\pgf@picmaxx%
+ \pgf@sys@bp@correct\pgf@picminy%
+ \pgf@sys@bp@correct\pgf@picmaxy%
+ \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
+ \special{pdf:bxobj @pgftransgroup\the\pgfsys@objnum\space bbox \pgf@sys@tonumber\pgf@picminx\space\pgf@sys@tonumber\pgf@picminy\space\pgf@sys@tonumber\pgf@picmaxx\space\pgf@sys@tonumber\pgf@picmaxy}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \hskip\pgf@picminx bp\box#1\hskip-\pgf@picminx bp%
+ \special{pdf:put @resources
+ <<
+ \ifpgf@sys@pdf@extgs@exists /ExtGState @pgfextgs \fi
+ \ifpgf@sys@pdf@patterns@exists /Pattern @pgfpatterns \fi
+ \ifpgf@sys@pdf@colorspaces@exists /ColorSpace @pgfcolorspaces \fi
+ >>}% <<
+ \special{pdf:exobj <</Group << /S /Transparency
+ /I \ifpgfsys@transparency@group@isolated true \else false \fi
+ /K \ifpgfsys@transparency@group@knockout true \else false \fi>> >>}%
+ }}\@tempa%
+ \special{pdf:uxobj @pgftransgroup\the\pgfsys@objnum}%
+ }%
+ \global\advance\pgfsys@objnum\@ne%
+}
+
+%
+% Position tracking (needs pdftex >= 1.40.0-alpha-20051205 in dvi mode)
+%
+\ifx\pdfsavepos\@undefined
+\else
+ \pgf@sys@pdf@dvi@tracker
+\fi
+
+\def\pgfsys@papersize#1#2{%
+% \expandafter\gdef\expandafter\pgfsys@atbegindocument%%
+% \expandafter{\pgfsys@atbegindocument
+ \special{papersize=#1,#2}%
+% }
+}
+\def\pgfsys@prepare@papersize#1#2{%
+ \expandafter\gdef\expandafter\pgfsys@atbegindocument%%
+ \expandafter{\pgfsys@atbegindocument
+ \special{papersize=#1,#2}%
+ }
+}
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-dvips.def b/graphics/pgf/base/tex/pgfsys-dvips.def
new file mode 100644
index 0000000000..4cb4d51b8b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-dvips.def
@@ -0,0 +1,145 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-dvips.def}
+
+% Driver commands for dvips
+
+\def\pgfsys@invoke#1{\special{ps\ifpgfsys@ps@boxmode\else:\fi: #1}}
+\def\pgfsys@outerinvoke#1{\special{ps: #1}}
+\def\pgf@sys@postscript@header#1{\pgfutil@insertatbegincurrentpage{\special{! #1}}}
+\def\pgf@sys@postscript@object#1{\special{! #1}}
+
+
+%
+% Load common postscript commands:
+%
+\input pgfsys-common-postscript.def
+
+
+%
+% dvips-specific stuff:
+%
+
+\def\pgfsys@beginpicture{\pgfsys@ps@boxmodefalse\special{ps: }\special{ps::[begin]}\pgfsys@invoke{pgfo}}
+\def\pgfsys@endpicture{\pgfsys@invoke{pgfc}\special{ps::[end]}}
+\def\pgfsys@hbox#1{%
+ \pgfsys@begin@idscope%
+ \pgfsys@invoke{pgfs}%
+ \special{ps::[end]}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1
+ \special{ps::[begin]}%
+ \pgfsys@invoke{pgfr}%
+ \pgfsys@end@idscope%
+}
+\def\pgfsys@begininvisible{%
+ \special{ps::[begin]}%
+ \pgfsys@invoke{gsave nulldevice}%
+ \special{ps::[end]}}
+\def\pgfsys@endinvisible{%
+ \special{ps::[begin]}%
+ \pgfsys@invoke{grestore}%
+ \special{ps::[end]}%
+}
+\def\pgfsys@color@unstacked#1{\special{ps: \XC@usecolor{#1}}}
+\def\pgfsys@imagesuffixlist{.epsi:.eps:.ps:}
+
+\def\pgfsys@papersize#1#2{%
+ \special{papersize=#1,#2}%
+ % \expandafter\gdef\expandafter\pgfsys@atbegindocument\expandafter{\pgfsys@atbegindocument\special{papersize=#1,#2}}%
+}
+\def\pgfsys@prepare@papersize#1#2{%
+ \expandafter\gdef\expandafter\pgfsys@atbegindocument\expandafter{\pgfsys@atbegindocument\special{papersize=#1,#2}}%
+}
+
+\expandafter\gdef\expandafter\pgfsys@atbegindocument\expandafter{\pgfsys@atbegindocument%
+ \pgf@sys@postscript@header{
+ /pgfsc{}bind def% stroke color is empty by default
+ /pgffc{}bind def% fill color is empty by default
+ /pgfstr{stroke}bind def%
+ /pgffill{fill}bind def%
+ /pgfeofill{eofill}bind def%
+ /pgfe{a dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}bind def% rectangle
+ /pgfw{setlinewidth}bind def% setlinewidth
+ /pgfs{save pgfpd 72 Resolution div 72 VResolution div neg scale
+ magscale{1 DVImag div dup scale}if
+ pgfx neg pgfy neg translate pgffoa .setopacityalpha}bind def% save
+ /pgfr{pgfsd restore}bind def %restore
+ userdict begin%
+ /pgfo{pgfsd /pgfx currentpoint /pgfy exch def def @beginspecial}bind def %open
+ /pgfc{newpath @endspecial pgfpd}bind def %close
+ /pgfsd{globaldict /pgfdelta /delta where {pop delta} {0} ifelse put}bind def% save delta
+ /pgfpd{/delta globaldict /pgfdelta get def}bind def % put delta
+ /.setopacityalpha where {pop} {/.setopacityalpha{pop}def} ifelse % install .setopacityalpha
+ /.pgfsetfillopacityalpha{/pgffoa exch def
+ /pgffill{gsave pgffoa .setopacityalpha fill 1 .setopacityalpha newpath fill grestore newpath}bind def
+ /pgfeofill{gsave pgffoa .setopacityalpha eofill 1 .setopacityalpha newpath eofill grestore newpath}bind def}bind def
+ /.pgfsetstrokeopacityalpha{/pgfsoa exch def /pgfstr{gsave pgfsoa .setopacityalpha stroke grestore newpath}bind def}bind def
+ /pgffoa 1 def
+ /pgfsoa 1 def
+ end
+ }%
+}
+
+\AtBeginDocument{ % needed for plain TeX
+ \pgfsys@atbegindocument
+ \let\pgfsys@atbegindocument=\pgfutil@empty
+}
+
+
+
+%
+% Position tracking (needs pdftex or luatex in dvi mode)
+%
+\ifx\savepos\@undefined
+ \ifx\pdfsavepos\@undefined
+ \else
+ \let\pgf@savepos\pdfsavepos
+ \let\pgf@lastxpos\pdflastxpos
+ \let\pgf@lastypos\pdflastypos
+ \fi
+\else
+ \let\pgf@savepos\savepos
+ \let\pgf@lastxpos\lastxpos
+ \let\pgf@lastypos\lastypos
+\fi
+
+
+\ifx\pgf@savepos\@undefined
+\else
+
+\def\pgfsys@markposition#1{%
+ \pgf@savepos%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@writetoaux\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\pgf@lastxpos}{\the\pgf@lastypos}}%
+}
+
+\def\pgfsyspdfmark#1#2#3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@#1\endcsname{\pgfqpoint{#2sp}{#3sp}}%
+ \pgfutil@check@rerun{#1}{{#2}{#3}}%
+}
+
+\def\pgfsys@getposition#1#2{%
+ \edef\pgf@marshal{\let\noexpand#2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@#1\endcsname}%
+ \pgf@marshal%
+}
+
+\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfpointorigin}
+
+\fi
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-dvisvgm.def b/graphics/pgf/base/tex/pgfsys-dvisvgm.def
new file mode 100644
index 0000000000..f817f50874
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-dvisvgm.def
@@ -0,0 +1,217 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-dvisvgm.def}
+
+
+% Driver commands for dvisvgm
+
+%
+% Load common pdf commands:
+%
+\input pgfsys-common-svg.def
+
+\newif\ifpgf@sys@svg@inpicture
+
+\def\pgf@sys@svg@make@defs#1#2{{\let\#\pgf@sys@svg@hash\special{dvisvgm:rawset #1}\special{dvisvgm:rawdef #2}\special{dvisvgm:endrawset}}}
+\def\pgf@sys@svg@ref@defs#1{\special{dvisvgm:rawput #1}}
+\def\pgfsys@invoke#1{{\let\#\pgf@sys@svg@hash\special{dvisvgm:raw #1}}}
+\def\pgfsys@beginpicture{%
+ \special{color push gray 0}% make dvisvgm *not* add anything to text
+ \pgf@sys@svg@inpicturetrue% in a picture
+ \pgfsys@svg@boxmodefalse%
+ \pgfsys@invoke{<g \ifx\pgf@sys@svg@last@stroke\relax\else
+ stroke="\pgf@sys@svg@last@stroke" \fi stroke-miterlimit="10" transform="translate({?x},{?y})scale(0.996264,-0.996264)">}}
+\def\pgfsys@endpicture{\pgfsys@invoke{</g>}\special{color pop}}
+
+\def\pgfsys@svg@newline{{?nl}}
+
+\let\pgf@sys@svg@last@stroke\relax%
+
+
+\def\pgfsys@hbox#1{%
+ {%
+ \setbox#1=\hbox{\box#1}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \pgfsys@begin@idscope%
+ \pgfsys@invoke{<g stroke="none" transform="scale(-1.00375,1.00375)translate({?x},{?y})scale(-1,-1)">}\box#1\pgfsys@invoke{</g>}%
+ \pgfsys@end@idscope%
+ }%
+}
+
+\def\pgfsys@hboxsynced#1{%
+ {%
+ \setbox#1=\hbox{\box#1}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \pgfsys@begin@idscope%
+ \pgfsys@beginscope%
+ \pgflowlevelsynccm%
+ \pgfsys@invoke{<g stroke="none" transform="scale(-1.00375,1.00375)translate({?x},{?y})scale(-1,-1)">}\box#1\pgfsys@invoke{</g>}%
+ \pgfsys@endscope%
+ \pgfsys@end@idscope%
+ }%
+}
+
+
+\def\pgfsys@shadingoutsidepgfpicture#1{%
+ \begingroup%
+ #1%
+ \setbox\pgfpic=\hbox to0pt{%
+ \pgfsys@beginpicture%
+ \pgfsys@beginscope%
+ \pgf@sys@svg@sh@defs%
+ \pgf@sys@svg@sh%
+ \pgfsys@endscope%
+ \pgfsys@endpicture%
+ \hss%
+ }%
+ \pgf@process{\pgf@sys@svg@pos}%
+ \pgf@picminx=0pt%
+ \pgf@picminy=0pt%
+ \pgf@picmaxx=\pgf@x%
+ \pgf@picmaxy=\pgf@y%
+ \def\pgf@trimleft@final{0pt}%
+ \def\pgf@trimright@final{0pt}%
+ \def\pgf@shift@baseline{0pt}%
+ \pgfsys@typesetpicturebox\pgfpic%
+ \endgroup%
+}
+
+\def\pgfsys@shadinginsidepgfpicture#1{%
+ #1%
+ \pgf@sys@svg@sh@defs% hmmm....
+ \pgf@process{\pgf@sys@svg@pos}
+ \pgf@xa=-.5\pgf@x%
+ \pgf@ya=-.5\pgf@y%
+ \pgfsysprotocol@literal{<g transform="translate(\pgf@sys@tonumber{\pgf@xa},\pgf@sys@tonumber{\pgf@ya})">}%
+ \pgf@sys@svg@sh%
+ \pgfsysprotocol@literal{</g>}%
+}
+
+
+
+\def\pgfsys@papersize#1#2{%
+ {%
+ \pgf@x#1\relax%
+ \pgf@y#2\relax%
+ \pgf@xa-1in\relax%
+ \special{dvisvgm:bbox fix \pgf@sys@tonumber\pgf@xa\space \pgf@sys@tonumber\pgf@xa\space \pgf@sys@tonumber\pgf@x\space \pgf@sys@tonumber\pgf@y}%
+ }%
+}
+\def\pgfsys@prepare@papersize#1#2{%
+ \expandafter\gdef\expandafter\pgfsys@atbegindocument\expandafter{\pgfsys@atbegindocument\pgfsys@papersize{#1}{#2}}%
+}
+
+
+
+\def\pgfsys@typesetpicturebox#1{%
+ \pgf@ya=\pgf@shift@baseline\relax%
+ \advance\pgf@ya by-\pgf@picminy\relax%
+ %
+ %
+ \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height
+ \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width
+ \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}%
+ \ht#1=\pgf@picmaxy%
+ \wd#1=\pgf@picmaxx%
+ \dp#1=0pt%
+ \leavevmode%
+ \pgf@xa=\pgf@trimleft@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi%
+ \raise-\pgf@ya\hbox{\ifpgf@sys@svg@inpicture\else\special{dvisvgm:bbox \pgf@sys@tonumber\pgf@picmaxx\space\pgf@sys@tonumber\pgf@picmaxy}\fi\box#1}%
+ \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi%
+}
+
+
+
+\def\pgfsys@text@to@black@hook{%
+ \let\pgfsys@svg@set@color@orig\set@color%
+ \let\pgfsys@svg@reset@color@orig\reset@color%
+ \def\set@color{\special{dvisvgm:raw <g fill="black">}\pgfsys@svg@set@color@orig}%
+ \def\reset@color{\special{dvisvgm:raw </g>}\pgfsys@svg@reset@color@orig}%
+}
+
+
+
+% Fadings
+
+% FIXME: Correct sizes!
+
+%
+% Opacity masks
+%
+% \def\pgfsys@fadingfrombox#1#2{%
+% \setbox#2=\hbox{%
+% \pgfsys@invoke{<mask id="pgfmask#1">}%
+% \box#2%
+% \pgfsys@invoke{</mask>}%
+% }%
+% \wd#2=0pt%
+% \ht#2=0pt%
+% \dp#2=0pt%
+% \unskip\box#2%
+% }
+% \def\pgfsys@usefading#1#2#3#4#5#6#7{%
+% \pgf@sys@svg@gs@color{mask="url(\#pgfmask#1)"}%
+% }
+
+
+
+
+%
+% Position tracking (needs pdftex or luatex in dvi mode)
+%
+\ifx\savepos\@undefined
+ \ifx\pdfsavepos\@undefined
+ \else
+ \let\pgf@savepos\pdfsavepos
+ \let\pgf@lastxpos\pdflastxpos
+ \let\pgf@lastypos\pdflastypos
+ \fi
+\else
+ \let\pgf@savepos\savepos
+ \let\pgf@lastxpos\lastxpos
+ \let\pgf@lastypos\lastypos
+\fi
+
+
+\ifx\pgf@savepos\@undefined
+\else
+
+\def\pgfsys@markposition#1{%
+ \pgf@savepos%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@writetoaux\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\pgf@lastxpos}{\the\pgf@lastypos}}%
+}
+
+\def\pgfsyspdfmark#1#2#3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@#1\endcsname{\pgfqpoint{#2sp}{#3sp}}%
+ \pgfutil@check@rerun{#1}{{#2}{#3}}%
+}
+
+\def\pgfsys@getposition#1#2{%
+ \edef\pgf@marshal{\let\noexpand#2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@#1\endcsname}%
+ \pgf@marshal%
+}
+
+\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfpointorigin}
+
+\fi
+
+
+\endinput
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-luatex.def b/graphics/pgf/base/tex/pgfsys-luatex.def
new file mode 100644
index 0000000000..a0b63c1cac
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-luatex.def
@@ -0,0 +1,401 @@
+% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-luatex.def}
+
+\ifnum\luatexversion<95
+ \immediate\write-1{luatex driver of PGF: detected lua version \the\luatexversion; falling back to old pdftex driver^^J}%
+ \input pgfsys-pdftex.def
+ \expandafter\endinput
+\fi
+
+% Driver commands for pdf
+
+%
+% Load common pdf commands:
+%
+\input pgfsys-common-pdf.def
+
+%
+% pdftex-specific stuff:
+%
+\def\pgfsys@invoke#1{\pdfextension literal{#1}}
+
+% Synced hboxes
+\def\pgfsys@hboxsynced#1{%
+ {%
+ \pgfsys@beginscope%
+ \setbox\pgf@hbox=\hbox{%
+ \hskip\pgf@pt@x%
+ \raise\pgf@pt@y\hbox{%
+ \pgf@pt@x=0pt%
+ \pgf@pt@y=0pt%
+ \pgflowlevelsynccm%
+ \pgfsys@hbox#1}%
+ \hss%
+ }%
+ \wd\pgf@hbox=0pt%
+ \ht\pgf@hbox=0pt%
+ \dp\pgf@hbox=0pt%
+ \box\pgf@hbox%
+ \pgfsys@endscope%
+ }%
+}
+
+
+
+\def\pgfsys@imagesuffixlist{.pdf:.jpg:.jpeg:.png:}
+\def\pgfsys@defineimage{% width, height, page number
+ \ifx\pgf@imagewidth\pgfutil@empty\else\edef\pgf@imagewidth{ width \pgf@imagewidth }\fi%
+ \ifx\pgf@imageheight\pgfutil@empty\else\edef\pgf@imageheight{ height \pgf@imageheight }\fi%
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{ page \pgf@imagepage }\fi%
+ \ifx\saveimageresource\@undefined% old version of lualatex
+ \ifx\pgf@imagepage\pgfutil@empty\else%
+ \pgfwarning{Page selection not supported. Ignoring page selection}%
+ \fi%
+ \setbox\pgfutil@tempboxa=\hbox{%
+ \pdfimage \pgf@imageheight \pgf@imagewidth {\pgf@filename}}%
+ \pdfform\pgfutil@tempboxa%
+ \edef\pgf@image{\noexpand\pdfrefform\the\pdflastform}%
+ \else% new version
+ {\saveimageresource \pgf@imageheight \pgf@imagewidth attr
+ {/Interpolate \pgf@imageinterpolate\space\pgf@imagemask} \pgf@imagepage
+ {\pgf@filename}}%
+ \edef\pgf@image{\noexpand\useimageresource\the\lastsavedimageresourceindex}%
+ \fi
+}%
+\def\pgfsys@definemask#1{%
+ \ifx\pgf@maskmatte\pgfutil@empty%
+ \else%
+ \edef\pgf@maskmatte{/Matte [\pgf@maskmatte]}%
+ \fi%
+ \edef\pgf@attr{{\pgf@maskmatte\space /Decode [1 0]}}%
+ \immediate\saveimageresource attr \pgf@attr {\pgf@filename}%
+ \edef\pgf@mask{/SMask \the\lastsavedimageresourceindex\space 0 R}%
+}
+\def\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}}%
+ \immediate\saveboxresource resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@doma\space0 \pgf@domb\space0]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \xdef\pgfutil@tempa{\hbox{\noexpand\useboxresource\the\lastsavedboxresourceindex}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\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}}%
+ \immediate\saveboxresource resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [0 \pgf@doma\space0 \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \xdef\pgfutil@tempa{\hbox{\noexpand\useboxresource\the\lastsavedboxresourceindex}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\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}%
+ \immediate\saveboxresource resources {%
+ /Shading << /Sh << /ShadingType 3
+ /ColorSpace \pgf@shading@device\space
+ /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% <<
+ \xdef\pgfutil@tempa{\hbox{\noexpand\useboxresource\the\lastsavedboxresourceindex}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}%
+\def\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
+ \pdfextension obj
+ 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 [\pgf@shading@functional@range]
+ }
+ {{#4}}%
+ \edef\pgf@temp@num{\the\numexpr\pdffeedback lastobj\relax}%
+ \saveboxresource resources {%
+ /Shading << /Sh << /ShadingType 1
+ /ColorSpace \pgf@shading@device\space
+ /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% <<
+ \xdef\pgfutil@tempa{\hbox{%
+ \noexpand\useboxresource\the\lastsavedboxresourceindex%
+ \noexpand\pdfextension refobj \pgf@temp@num%
+ }}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+
+
+
+% Patterns
+
+\def\pgfsys@declarepattern#1#2#3#4#5#6#7{%
+ % Start building the pattern dictionary:
+ \pgf@xa=#2\relax%
+ \pgf@ya=#3\relax%
+ \pgf@xb=#4\relax%
+ \pgf@yb=#5\relax%
+ \pgf@xc=#6\relax%
+ \pgf@yc=#7\relax%
+ \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@sys@bp@correct\pgf@xc%
+ \pgf@sys@bp@correct\pgf@yc%
+ \pgfsys@@declarepattern{#1}%
+}
+
+\def\pgfsys@@declarepattern#1#2#3#4#5#6#7#8#9{%
+ \pgfutil@tempdima=#6\relax%
+ \pgfutil@tempdimb=#7\relax%
+ \pgf@sys@bp@correct\pgfutil@tempdima%
+ \pgf@sys@bp@correct\pgfutil@tempdimb%
+ % Now create the pattern object:
+ \immediate\pdfextension obj stream
+ attr
+ {
+ /Type /Pattern
+ /PatternType 1
+ /PaintType \ifnum#9=0 2 \else 1 \fi
+ /TilingType 1
+ /BBox [\pgf@sys@tonumber\pgf@xa\space\pgf@sys@tonumber\pgf@ya\space\pgf@sys@tonumber\pgf@xb\space\pgf@sys@tonumber\pgf@yb]
+ /XStep \pgf@sys@tonumber\pgf@xc\space
+ /YStep \pgf@sys@tonumber\pgf@yc\space
+ /Matrix [#2\space#3\space#4\space#5\space\pgf@sys@tonumber\pgfutil@tempdima\space\pgf@sys@tonumber\pgfutil@tempdimb]
+ /Resources << >> %<<
+ }
+ {#8}%
+ \pgfutil@addpdfresource@patterns{/pgfpat#1\space \the\numexpr\pdffeedback lastobj\relax\space 0 R}%
+}
+
+\def\pgfsys@setpatternuncolored#1#2#3#4{%
+ \pgfsysprotocol@literal{/pgfprgb cs #2 #3 #4 /pgfpat#1\space scn}%
+}
+
+\def\pgfsys@setpatterncolored#1{%
+ \pgfsysprotocol@literal{/Pattern cs /pgfpat#1\space scn}%
+}
+
+
+
+\def\pgfsys@papersize#1#2{\pageheight#2\relax\pagewidth#1\relax}
+
+\def\pgfsys@global@papersize#1#2{\global\pageheight#2\relax\global\pagewidth#1\relax}
+
+\ifx\paperheight\@undefined
+ \def\pgfsys@thepageheight{\pageheight}
+ \def\pgfsys@thepagewidth{\pagewidth}
+\fi
+
+
+%
+% Position tracking
+%
+\def\pgfsys@markposition#1{%
+ \savepos%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@writetoaux\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\lastxpos}{\the\lastypos}}%
+}
+
+\def\pgfsyspdfmark#1#2#3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@#1\endcsname{\pgfqpoint{#2sp}{#3sp}}%
+ \pgfutil@check@rerun{#1}{{#2}{#3}}%
+}
+
+\def\pgfsys@getposition#1#2{%
+ \edef\pgf@marshal{\let\noexpand#2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@#1\endcsname}%
+ \pgf@marshal%
+}
+
+\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{\hoffset}{\voffset}}
+
+
+%
+% Opacity masks
+%
+\def\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}}}%
+ \saveboxresource resources { \pgf@sys@pdf@possible@resources } #2%
+ \expandafter\xdef\csname pgfsmaskxform@#1\endcsname{\the\lastsavedboxresourceindex}%
+ }%
+}
+\def\pgfsys@usefading#1#2#3#4#5#6#7{%
+ \expandafter\ifx\csname pgfsmaskxform@#1\endcsname\relax%
+ \pgferror{Undefined fading '#1'}%
+ \else%
+ {%
+ \expandafter\ifx\csname pgfsmaks@#1\endcsname\relax%
+ \pgf@sys@pdf@install@mask{#1}%
+ \fi%
+ \pgftransformreset%
+ \pgftransformcm{#2}{#3}{#4}{#5}{\pgfpoint{#6}{#7}}%
+ \csname pgfsmasktrans@#1\endcsname%
+ {%
+ \pgflowlevelsynccm%
+ \pgfsys@invoke{/pgfsmask\csname pgfsmask@#1\endcsname\space gs}%
+ }%
+ \pgftransforminvert%
+ \pgflowlevelsynccm%
+ }%
+ \fi
+}
+
+\def\pgf@sys@pdf@install@mask#1{%
+ \setbox\pgfutil@tempboxa=\hbox{\useboxresource\csname pgfsmaskxform@#1\endcsname}
+ \immediate\saveboxresource%
+ attr {
+ /Group
+ <<
+ /S /Transparency
+ /CS /DeviceGray
+ >>
+ }% <<
+ \pgfutil@tempboxa%
+ \pgfutil@addpdfresource@extgs{%
+ /pgfsmask\the\lastsavedboxresourceindex\space
+ <<
+ /SMask
+ <<
+ /S /Luminosity
+ /G \the\lastsavedboxresourceindex\space 0 R
+ >>
+ >> } %<<
+ \expandafter\xdef\csname pgfsmask@#1\endcsname{\the\lastsavedboxresourceindex}%
+}
+
+%
+% Transparency groups
+%
+\def\pgfsys@transparencygroupfrombox#1{%
+ \pgf@sys@pdf@check@resources%
+ \saveboxresource
+ attr { /Group << /S /Transparency
+ /I \ifpgfsys@transparency@group@isolated true \else false \fi
+ /K \ifpgfsys@transparency@group@knockout true \else false \fi >> } %<<
+ resources { \pgf@sys@pdf@possible@resources }
+ #1%
+ \setbox#1=\hbox{\useboxresource\lastsavedboxresourceindex}%
+}
+
+
+
+
+%
+% Resource management
+%
+
+\def\pgf@sys@setuppdfresources@plain{%
+ % This command will setup pdf resource in plain and in latex
+ % mode. ConTeXt has its own handler
+ % Page resources (they are kept in objects and only written at the
+ % very end)
+ \pdfextension obj reserveobjnum \edef\pgf@sys@pdf@extgs@objnum{\the\numexpr\pdffeedback lastobj\relax}
+ \pdfextension obj reserveobjnum \edef\pgf@sys@pdf@pattern@objnum{\the\numexpr\pdffeedback lastobj\relax}
+ \pdfextension obj reserveobjnum \edef\pgf@sys@pdf@colrospaces@objnum{\the\numexpr\pdffeedback lastobj\relax}
+ \def\pgf@sys@pdf@possible@resources{%
+ /ColorSpace \pgf@sys@pdf@colrospaces@objnum\space 0 R
+ /Pattern \pgf@sys@pdf@pattern@objnum\space 0 R
+ /ExtGState \pgf@sys@pdf@extgs@objnum\space 0 R
+ }
+ \let\pgf@sys@pdf@check@resources=\relax%
+ \def\pgf@sys@pdf@install@pageresources{
+ {
+ \edef\temp{
+ \pgf@sys@pdf@possible@resources
+ }
+ \expandafter\global\expandafter\pdfvariable pageresources\expandafter{\temp}
+ }
+ }
+ \pgf@sys@pdf@install@pageresources
+ \expandafter\pgfutil@everybye\expandafter{%
+ \the\pgfutil@everybye%
+ \immediate \pdfextension obj useobjnum \pgf@sys@pdf@extgs@objnum {<<\pgf@sys@pgf@resource@list@extgs>>}%<<
+ \immediate \pdfextension obj useobjnum \pgf@sys@pdf@pattern@objnum {<<\pgf@sys@pgf@resource@list@patterns>>}%<<
+ \immediate \pdfextension obj useobjnum \pgf@sys@pdf@colrospaces@objnum {<<\pgf@sys@pgf@resource@list@colorspaces>>}%<<
+ }
+ \let\pgf@sys@pgf@resource@list@extgs=\pgfutil@empty%
+ \let\pgf@sys@pgf@resource@list@patterns=\pgfutil@empty%
+ \let\pgf@sys@pgf@resource@list@colorspaces=\pgfutil@empty%
+ \def\pgf@sys@addpdfresource@extgs@plain##1{\xdef\pgf@sys@pgf@resource@list@extgs{\pgf@sys@pgf@resource@list@extgs\space##1}}
+ \def\pgf@sys@addpdfresource@patterns@plain##1{\xdef\pgf@sys@pgf@resource@list@patterns{\pgf@sys@pgf@resource@list@patterns\space##1}}
+ \def\pgf@sys@addpdfresource@colorspaces@plain##1{\xdef\pgf@sys@pgf@resource@list@colorspaces{\pgf@sys@pgf@resource@list@colorspaces\space##1}}
+}
+\pgfutil@setuppdfresources % possibly call the above
+
+\pgfutil@addpdfresource@colorspaces{ /pgfprgb [/Pattern /DeviceRGB] }
+
+\def\pgfsys@color@unstacked#1{%
+ \pdfextension literal{\csname\string\color@#1\endcsname}%
+}
+
+\endinput
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-pdftex.def b/graphics/pgf/base/tex/pgfsys-pdftex.def
new file mode 100644
index 0000000000..b74e005a75
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-pdftex.def
@@ -0,0 +1,398 @@
+% Copyright 2006 by Till Tantau
+% CMYK and grayscale shadings adaptation copyright 2019 by David Purton
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-pdftex.def}
+
+
+% Driver commands for pdf
+
+%
+% Load common pdf commands:
+%
+\input pgfsys-common-pdf.def
+
+%
+% pdftex-specific stuff:
+%
+\def\pgfsys@invoke#1{\pdfliteral{#1}}
+
+% Synced hboxes
+\def\pgfsys@hboxsynced#1{%
+ {%
+ \pgfsys@begin@idscope%
+ \pgfsys@beginscope%
+ \setbox\pgf@hbox=\hbox{%
+ \hskip\pgf@pt@x%
+ \raise\pgf@pt@y\hbox{%
+ \pgf@pt@x=0pt%
+ \pgf@pt@y=0pt%
+ \pgflowlevelsynccm%
+ \pgfsys@hbox#1}%
+ \hss%
+ }%
+ \wd\pgf@hbox=0pt%
+ \ht\pgf@hbox=0pt%
+ \dp\pgf@hbox=0pt%
+ \box\pgf@hbox%
+ \pgfsys@endscope%
+ \pgfsys@end@idscope%
+ }%
+}
+
+
+
+\def\pgfsys@imagesuffixlist{.pdf:.jpg:.jpeg:.png:}
+\def\pgfsys@defineimage{% width, height, page number
+ \ifx\pgf@imagewidth\pgfutil@empty\else\edef\pgf@imagewidth{ width \pgf@imagewidth }\fi%
+ \ifx\pgf@imageheight\pgfutil@empty\else\edef\pgf@imageheight{ height \pgf@imageheight }\fi%
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{ page \pgf@imagepage }\fi%
+ \ifx\pdfximage\@undefined% old version of pdflatex
+ \ifx\pgf@imagepage\pgfutil@empty\else%
+ \pgfwarning{Page selection not supported. Ignoring page selection}%
+ \fi%
+ \setbox\pgfutil@tempboxa=\hbox{%
+ \pdfimage \pgf@imageheight \pgf@imagewidth {\pgf@filename}}%
+ \pdfform\pgfutil@tempboxa%
+ \edef\pgf@image{\noexpand\pdfrefform\the\pdflastform}%
+ \else% new version
+ {\pdfximage \pgf@imageheight \pgf@imagewidth attr
+ {/Interpolate \pgf@imageinterpolate\space\pgf@imagemask} \pgf@imagepage
+ {\pgf@filename}}%
+ \edef\pgf@image{\noexpand\pdfrefximage\the\pdflastximage}%
+ \fi
+}%
+\def\pgfsys@definemask#1{%
+ \ifx\pgf@maskmatte\pgfutil@empty%
+ \else%
+ \edef\pgf@maskmatte{/Matte [\pgf@maskmatte]}%
+ \fi%
+ \edef\pgf@attr{{\pgf@maskmatte\space /Decode [1 0]}}%
+ \immediate\pdfximage attr \pgf@attr {\pgf@filename}%
+ \edef\pgf@mask{/SMask \the\pdflastximage\space 0 R}%
+}
+\def\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}}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [\pgf@doma\space0 \pgf@domb\space0]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \xdef\pgfutil@tempa{\hbox{\noexpand\pdfrefxform\the\pdflastxform}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\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}}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 2
+ /ColorSpace \pgf@shading@device\space
+ /Domain [\pgf@pdfparseddomain]
+ /Coords [0 \pgf@doma\space0 \pgf@domb]
+ /Function \pgf@pdfparsedfunction
+ /Extend [false false] >> >>}\pgfutil@tempboxa% <<
+ \xdef\pgfutil@tempa{\hbox{\noexpand\pdfrefxform\the\pdflastxform}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+\def\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}%
+ \immediate\pdfxform resources {%
+ /Shading << /Sh << /ShadingType 3
+ /ColorSpace \pgf@shading@device\space
+ /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% <<
+ \xdef\pgfutil@tempa{\hbox{\noexpand\pdfrefxform\the\pdflastxform}}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}%
+\def\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 [\pgf@shading@functional@range]
+ }
+ {{#4}}%
+ \edef\pgf@temp@num{\the\pdflastobj}%
+ \pdfxform resources {%
+ /Shading << /Sh << /ShadingType 1
+ /ColorSpace \pgf@shading@device\space
+ /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% <<
+ \xdef\pgfutil@tempa{\hbox{%
+ \noexpand\pdfrefxform\the\pdflastxform%
+ \noexpand\pdfrefobj\pgf@temp@num%
+ }}%
+ }%
+ \global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@tempa
+}
+
+
+
+% Patterns
+
+\def\pgfsys@declarepattern#1#2#3#4#5#6#7{%
+ % Start building the pattern dictionary:
+ \pgf@xa=#2\relax%
+ \pgf@ya=#3\relax%
+ \pgf@xb=#4\relax%
+ \pgf@yb=#5\relax%
+ \pgf@xc=#6\relax%
+ \pgf@yc=#7\relax%
+ \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@sys@bp@correct\pgf@xc%
+ \pgf@sys@bp@correct\pgf@yc%
+ \pgfsys@@declarepattern{#1}%
+}
+
+\def\pgfsys@@declarepattern#1#2#3#4#5#6#7#8#9{%
+ \pgfutil@tempdima=#6\relax%
+ \pgfutil@tempdimb=#7\relax%
+ \pgf@sys@bp@correct\pgfutil@tempdima%
+ \pgf@sys@bp@correct\pgfutil@tempdimb%
+ % Now create the pattern object:
+ \immediate\pdfobj stream
+ attr
+ {
+ /Type /Pattern
+ /PatternType 1
+ /PaintType \ifnum#9=0 2 \else 1 \fi
+ /TilingType 1
+ /BBox [\pgf@sys@tonumber\pgf@xa\space\pgf@sys@tonumber\pgf@ya\space\pgf@sys@tonumber\pgf@xb\space\pgf@sys@tonumber\pgf@yb]
+ /XStep \pgf@sys@tonumber\pgf@xc\space
+ /YStep \pgf@sys@tonumber\pgf@yc\space
+ /Matrix [#2\space#3\space#4\space#5\space\pgf@sys@tonumber\pgfutil@tempdima\space\pgf@sys@tonumber\pgfutil@tempdimb]
+ /Resources << >> %<<
+ }
+ {#8}%
+ \pgfutil@addpdfresource@patterns{/pgfpat#1\space \the\pdflastobj\space 0 R}%
+}
+
+\def\pgfsys@setpatternuncolored#1#2#3#4{%
+ \pgfsysprotocol@literal{/pgfprgb cs #2 #3 #4 /pgfpat#1\space scn}%
+}
+
+\def\pgfsys@setpatterncolored#1{%
+ \pgfsysprotocol@literal{/Pattern cs /pgfpat#1\space scn}%
+}
+
+
+
+\def\pgfsys@papersize#1#2{\pdfpageheight#2\relax\pdfpagewidth#1\relax}
+
+\def\pgfsys@global@papersize#1#2{\global\pdfpageheight#2\relax\global\pdfpagewidth#1\relax}
+
+\ifx\paperheight\@undefined
+ \def\pgfsys@thepageheight{\pdfpageheight}
+ \def\pgfsys@thepagewidth{\pdfpagewidth}
+\fi
+
+
+%
+% Position tracking
+%
+\def\pgfsys@markposition#1{%
+ \pdfsavepos%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@writetoaux\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\pdflastxpos}{\the\pdflastypos}}%
+}
+
+\def\pgfsyspdfmark#1#2#3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@#1\endcsname{\pgfqpoint{#2sp}{#3sp}}%
+ \pgfutil@check@rerun{#1}{{#2}{#3}}%
+}
+
+\def\pgfsys@getposition#1#2{%
+ \edef\pgf@marshal{\let\noexpand#2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@#1\endcsname}%
+ \pgf@marshal%
+}
+
+\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{\hoffset}{\voffset}}
+
+
+%
+% Opacity masks
+%
+\def\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}%
+ }%
+}
+\def\pgfsys@usefading#1#2#3#4#5#6#7{%
+ \expandafter\ifx\csname pgfsmaskxform@#1\endcsname\relax%
+ \pgferror{Undefined fading '#1'}%
+ \else%
+ {%
+ \expandafter\ifx\csname pgfsmaks@#1\endcsname\relax%
+ \pgf@sys@pdf@install@mask{#1}%
+ \fi%
+ \pgftransformreset%
+ \pgftransformcm{#2}{#3}{#4}{#5}{\pgfpoint{#6}{#7}}%
+ \csname pgfsmasktrans@#1\endcsname%
+ {%
+ \pgflowlevelsynccm%
+ \pgfsys@invoke{/pgfsmask\csname pgfsmask@#1\endcsname\space gs}%
+ }%
+ \pgftransforminvert%
+ \pgflowlevelsynccm%
+ }%
+ \fi
+}
+
+\def\pgf@sys@pdf@install@mask#1{%
+ \setbox\pgfutil@tempboxa=\hbox{\pdfrefxform\csname pgfsmaskxform@#1\endcsname}
+ \immediate\pdfxform%
+ attr {
+ /Group
+ <<
+ /S /Transparency
+ /CS /DeviceGray
+ >>
+ }% <<
+ \pgfutil@tempboxa%
+ \pgfutil@addpdfresource@extgs{%
+ /pgfsmask\the\pdflastxform\space
+ <<
+ /SMask
+ <<
+ /S /Luminosity
+ /G \the\pdflastxform\space 0 R
+ >>
+ >> } %<<
+ \expandafter\xdef\csname pgfsmask@#1\endcsname{\the\pdflastxform}%
+}
+
+%
+% Transparency groups
+%
+\def\pgfsys@transparencygroupfrombox#1{%
+ \pgf@sys@pdf@check@resources%
+ \pdfxform
+ attr { /Group << /S /Transparency
+ /I \ifpgfsys@transparency@group@isolated true \else false \fi
+ /K \ifpgfsys@transparency@group@knockout true \else false \fi >> } %<<
+ resources { \pgf@sys@pdf@possible@resources }
+ #1%
+ \setbox#1=\hbox{\pdfrefxform\pdflastxform}%
+}
+
+
+
+
+%
+% Resource management
+%
+
+\def\pgf@sys@setuppdfresources@plain{%
+ % This command will setup pdf resource in plain and in latex
+ % mode. ConTeXt has its own handler
+ % Page resources (they are kept in objects and only written at the
+ % very end)
+ \pdfobj reserveobjnum \edef\pgf@sys@pdf@extgs@objnum{\the\pdflastobj}
+ \pdfobj reserveobjnum \edef\pgf@sys@pdf@pattern@objnum{\the\pdflastobj}
+ \pdfobj reserveobjnum \edef\pgf@sys@pdf@colrospaces@objnum{\the\pdflastobj}
+ \def\pgf@sys@pdf@possible@resources{%
+ /ColorSpace \pgf@sys@pdf@colrospaces@objnum\space 0 R
+ /Pattern \pgf@sys@pdf@pattern@objnum\space 0 R
+ /ExtGState \pgf@sys@pdf@extgs@objnum\space 0 R
+ }
+ \let\pgf@sys@pdf@check@resources=\relax%
+ \def\pgf@sys@pdf@install@pageresources{
+ {
+ \edef\temp{
+ \pgf@sys@pdf@possible@resources
+ }
+ \expandafter\global\expandafter\pdfpageresources\expandafter{\temp}
+ }
+ }
+ \pgf@sys@pdf@install@pageresources
+ \expandafter\pgfutil@everybye\expandafter{%
+ \the\pgfutil@everybye%
+ \immediate \pdfobj useobjnum \pgf@sys@pdf@extgs@objnum {<<\pgf@sys@pgf@resource@list@extgs>>}%<<
+ \immediate \pdfobj useobjnum \pgf@sys@pdf@pattern@objnum {<<\pgf@sys@pgf@resource@list@patterns>>}%<<
+ \immediate \pdfobj useobjnum \pgf@sys@pdf@colrospaces@objnum {<<\pgf@sys@pgf@resource@list@colorspaces>>}%<<
+ }
+ \let\pgf@sys@pgf@resource@list@extgs=\pgfutil@empty%
+ \let\pgf@sys@pgf@resource@list@patterns=\pgfutil@empty%
+ \let\pgf@sys@pgf@resource@list@colorspaces=\pgfutil@empty%
+ \def\pgf@sys@addpdfresource@extgs@plain##1{\xdef\pgf@sys@pgf@resource@list@extgs{\pgf@sys@pgf@resource@list@extgs\space##1}}
+ \def\pgf@sys@addpdfresource@patterns@plain##1{\xdef\pgf@sys@pgf@resource@list@patterns{\pgf@sys@pgf@resource@list@patterns\space##1}}
+ \def\pgf@sys@addpdfresource@colorspaces@plain##1{\xdef\pgf@sys@pgf@resource@list@colorspaces{\pgf@sys@pgf@resource@list@colorspaces\space##1}}
+}
+\pgfutil@setuppdfresources % possibly call the above
+
+\pgfutil@addpdfresource@colorspaces{ /pgfprgb [/Pattern /DeviceRGB] }
+
+\def\pgfsys@color@unstacked#1{%
+ \pdfliteral{\csname\string\color@#1\endcsname}%
+}
+
+\endinput
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-tex4ht.def b/graphics/pgf/base/tex/pgfsys-tex4ht.def
new file mode 100644
index 0000000000..1f8c09d0c1
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-tex4ht.def
@@ -0,0 +1,487 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-tex4ht.def}
+
+
+
+% Driver commands for tex4ht
+
+%
+% Load common pdf commands:
+%
+\input pgfsys-common-svg.def
+
+%
+% tex4ht-specific stuff:
+%
+\def\pgfsys@invoke#1{\pgf@sys@fail{svg code in preamble}}
+\def\pgfsys@body@invoke#1{\HCode{#1}}
+
+\newcount\pgf@sys@svg@picnum
+
+\def\pgfsys@pictureboxsynced#1{%
+ \pgfsys@beginscope\pgflowlevelsynccm\box#1\pgfsys@endscope%
+}
+
+
+%%
+%% initial support of Mathml and xhtml inside svg through the svg:foreignelement tag
+%%
+%% it'll allow us to have complicated text nodes in the tex4ht driver
+%%
+
+
+%Example (to improve the display, you have to use css)
+%
+%\tikzpicture[svg text only=false]
+%\draw (0,0) node[inner sep=0pt,draw] {tight}
+%(0cm,2em) node[inner sep=5pt,draw] {loose}
+%(0cm,4em) node[fill=red!20] {default};
+%\draw (3,0) node[inner sep=0pt,draw] {TIGHT}
+%(3cm,2em) node[inner sep=5pt,draw] {LOOSE}
+%(3cm,4em) node[fill=red!20] {DEFAULT};
+%\draw (6,0) node[inner sep=0pt,draw] {$tight$}
+%(6cm,2em) node[inner sep=5pt,draw] {$loose$}
+%(6cm,4em) node[fill=red!20] {$default$};
+%\draw (9,0) node[inner sep=0pt,draw] {$TIGHT$}
+%(9cm,2em) node[inner sep=5pt,draw] {$LOOSE$}
+%(9cm,4em) node[fill=red!20] {$Default$};
+%\endtikzpicture
+%
+% you can use the options "svg text css=filename", "svg text id=idname", "svg text class=classname" to customize the display through the use of css
+%
+
+
+
+
+
+
+
+%\def\pgfsys@beginpicture{%
+% % \Configure{[]}{$}{$} these two lines aren't needed for tex4ht and moreother they produce errors with plain tex !
+% % \Configure{()}{$}{$}
+% \Configure{$$}{}{}{}%$$
+% \Configure{$}{}{}{}%$
+% \Configure{SUB}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}
+% \Configure{SUP}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}
+% \Configure{SUBSUP}{}{}{}
+% \Configure{htf}
+% {0}{+}{<tspan font-family="}
+% {\%s}{" font-size="\%s}{}{}
+% {">}{</tspan>}
+%}
+
+
+
+%\def\pgfsys@endpicture{%
+% % undo:
+% \Configure{htf}{0}{+}{<span\Hnewline
+% class="}{\%s}{-\%s}{x-x-\%d}{}{">}{</span>}
+%}
+
+\def\pgfsys@svg@newline{^^J}
+
+% we don't want tex4ht putting <p> and </p> tags automatically in our svg code and causing invalid xhtml in our svg pictures
+\newif\ifpgfsys@CssIncluded@\pgfsys@CssIncluded@false
+\def\pgfsys@beginpicture{%
+ \pgfsys@svg@boxmodefalse%
+ \EndP\HtmlParOff%
+ \pgfkeys{/pgf/tex4ht node/escape=false}%
+ % text only nodes are the default. Advantage : pure svg pictures are
+ % the default, nicer for text only nodes.
+ % Disadvantages : this rendering methods produce more invalid or degraded svg pictures than with the foreignelement tag
+ %% we use css to control the display of foreignelement rendered text nodes
+ \ifpgfsys@CssIncluded@
+ \else
+ \Css{
+ .foreignobject {%
+ line-height:100\%;
+ font-size:120\%; % this is the trick....a font of size 100% in
+ % a box scaled down to half size makes it a
+ % half size font.
+ % you'll have to double the size of things
+ % that you want to have a regular size in
+ % this half-scaled box though
+ font-family:STIXgeneral,Times,Symbol,cmr10,CMSY10,CMEX10;%
+ % can't wait for the stix font...the cmr10, etc font are
+ % available from the mozilla site, times and symbols should be
+ % okey
+ padding:0;
+ margin:0;
+ % background-color:\#12ff55; usefull for debugging positioning
+ text-align:center; % good for centered text nodes...will have to improve that later on...with more integration with pgf options for text nodes
+ }
+ }%
+ \Css{%
+ math {%, math[mode="inline"] {
+ vertical-align:baseline;
+ line-height:100\%;
+ font-size:100\%;
+ font-family:STIXGeneral,Times,Symbol, cmr10,cmsy10,cmex10,cmmi10;
+ font-style: normal;
+ margin:0;
+ % background-color:\#99ff99;
+ padding:0;
+ }%
+ }%
+ \pgfsys@CssIncluded@true
+ \fi
+}%
+
+\def\pgfsys@endpicture{%
+ \HtmlParOn
+ \par% FIXME : was '\Par' but that seems to be undefined!?
+}%
+
+% this is okay for both rendering methods for text nodes (mtext or foreignelement)...
+\def\pgfsys@typesetpicturebox#1{%
+ \global\advance\pgf@sys@svg@picnum by 1\relax%
+ % Ok, compute width/height
+ \pgf@xa=\pgf@picminx%
+ \pgf@ya=\pgf@picminy%
+ \pgf@xb=\pgf@picmaxx%
+ \pgf@yb=\pgf@picmaxy%
+ \pgf@x=\pgf@xb%
+ \advance\pgf@x by-\pgf@xa%
+ \pgf@y=\pgf@yb%
+ \advance\pgf@y by-\pgf@ya%
+ \ifdim\pgf@y<1pt%
+ \pgf@y=1pt%
+ \fi%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfsysprotocol@flushcurrentprotocol%
+ \HCode{<object data="\jobname-\the\pgf@sys@svg@picnum.svg" width="}%
+ % Calculate pixel coordinates (this does not really make sense, but
+ % we have to do it anyway). Assume 96dpi.
+ \pgf@x=1.3333333\pgf@x%
+ \pgf@y=1.3333333\pgf@y%
+ % Add one pixel for security:
+ \advance\pgf@x by1pt%
+ \advance\pgf@y by1pt%
+ \pgf@sys@pt\pgf@x%
+ \pgfsysprotocol@flushcurrentprotocol%
+ \pgfsys@invoke{" height="}%
+ \pgf@sys@pt\pgf@y%
+ \pgfsysprotocol@flushcurrentprotocol%
+ \pgfsys@invoke{" type="image/svg+xml"><p>SVG-Viewer needed.</p></object>}%
+ \special{t4ht>\jobname-\the\pgf@sys@svg@picnum.svg}%
+ %%%%%%%% This is necessary to control the svg through css
+ \pgfkeys{%
+ /pgf/tex4ht node/css/.get=\pgfsys@foreignobject@css
+ }%
+ \pgfsys@invoke{<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>\Hnewline% added that
+ <?xml-stylesheet href="\pgfsys@foreignobject@css.css" type="text/css"?>\Hnewline}% added that
+%%%%%%%%%%%%%%% maybee I should add an option to change the css, for the whole picture
+ \pgfsys@invoke{<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="\the\pgf@xc"
+ height="\the\pgf@yc" viewBox="}%
+ \pgf@sys@pt{\pgf@xa}\pgf@sys@pt{\pgf@ya}\pgf@sys@pt{\pgf@xc}\pgf@sys@pt{\pgf@yc}%
+ \pgfsysprotocol@flushcurrentprotocol%
+ \pgf@ya=-\pgf@ya%
+ \pgfsys@invoke{">\Hnewline <g transform="translate(0,}
+ \pgf@sys@pt\pgf@yb\pgfsysprotocol@flushcurrentprotocol%
+ \pgfsys@invoke{) scale(1,-1) translate(0,}%
+ \pgf@sys@pt\pgf@ya\pgfsysprotocol@flushcurrentprotocol%
+ \pgfsys@invoke{)">\Hnewline }%
+ %
+ \pgf@ya=\pgf@shift@baseline\relax%
+ \advance\pgf@ya by-\pgf@picminy\relax%
+ %
+ %
+ \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height
+ \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width
+ \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}%
+ \ht#1=\pgf@picmaxy%
+ \wd#1=\pgf@picmaxx%
+ \dp#1=0pt%
+ \leavevmode
+ \pgf@xa=\pgf@trimleft@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi
+ \raise-\pgf@ya\box#1%
+ \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi
+ \pgfsys@invoke{</g>\Hnewline </svg>\Hnewline }%
+ \special{t4ht<\jobname-\the\pgf@sys@svg@picnum.svg}%
+}%
+
+%% we'll use this hbox for the mtext rendering method (the "text only=true" option)
+\def\pgfsys@hbox#1{%
+ \pgf@x=.5\wd#1%
+ \ifx\tikz@textcolor\relax\else\ifx\tikz@textcolor\@undefined\else%
+ \ifx\tikz@textcolor\pgfutil@empty%
+ \pgfsetfillcolor{.}%
+ \else%
+ \pgfsetfillcolor{\tikz@textcolor}%
+ \fi%
+ \fi\fi% tweak for TikZ
+ \HCode{<text
+ style="stroke:none"
+ transform="scale(1,-1) translate(\pgf@sys@tonumber{\pgf@x},0)"
+ text-anchor="middle"
+ }%
+ \ifpgfutil@format@is@latex%
+ \ifx\f@size\pgfutil@empty%
+ \else%
+ \HCode{ font-size="\f@size"}%
+ \fi%
+ \fi%
+ \HCode{>\Hnewline }%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1
+ \HCode{</text>\Hnewline }%
+}%
+
+%% we save this definition
+\let\pgfsys@mtext@hbox\pgfsys@hbox
+
+%% we have to use some "evil" ^^ tex4ht hackery
+% tex4ht hackery
+{% grouping necessary cause we change the catcode of ":"
+ \catcode`:=11\relax
+ %%% this is necessary to calculate the size of text nodes with
+ %%% inline maths
+ % (it is an improvement of tex4ht, got to ask eitan gurary if he
+ % could put it in the tex4ht code)
+ \gdef\DviMathAlt{%
+ \a:DviMath\leavevmode \MathClass
+ \ht:special{t4ht@(}\hbox\bgroup{\expandafter\ifx\csname
+ ht:everypar\endcsname\relax\expandafter\everypar\else
+ \expandafter\ht:everypar\fi{}\leavevmode\ht:special{t4ht@)}}\DviSend
+ }%
+ % these are configures for the foreignelement rendering method of text nodes : we let tex4ht write xhtml and mathml in the svg picture
+ %
+ \gdef\pgfsys@foreignobject@configure{%
+ \Configure{$}{\Configure{@math}{%\a:mathml
+ display="inline" }\DviMathAlt}{\EndDviMath}{}%%% we REALLY need to use \DviMathAlt here instead of \DviMath see above remark
+ \Configure{$$}{\Configure{@math}{%\a:mathml
+ display="block" }\IgnorePar
+ \ifvmode\else \HCode{<!--tex4ht:inline-->}\fi\EndP
+ \DviMath}{\EndDviMath\ShowPar\pgfsys@foreignobject@par{\csname HCondtrue\endcsname\noindent}
+ }{\DisplayMathtrue}%
+ \Configure{SUB}{\Send{BACK}{<\a:mathml msub><\a:mathml mrow\Hnewline>}%
+ \Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msub\Hnewline>}%
+ \Configure{SUP}{\Send{BACK}{<\a:mathml msup><\a:mathml mrow\Hnewline>}%
+ \Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msup\Hnewline>}%
+ \Configure{SUBSUP}{\Send{BACK}{<\a:mathml msubsup><\a:mathml mrow\Hnewline>}%
+ \Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\Tg<\a:mathml mrow\Hnewline>\trap:base}{\Tg</\a:mathml mrow>\TG</\a:mathml msubsup\Hnewline>}%
+ \Configure{htf}{0}{+}{<span\Hnewline
+ class="}{\%s}{-\%s}{x-x-\%d}{}{">}{</span>}%
+ }%
+ \global\let\pgfsys@foreignobject@par=\par % use this instead of \par
+ % -- \Configure is no \long macro (at
+ % least in one of the older
+ % versions).
+
+ % these are the configures for the mtext rendering method of text
+ % nodes : we turn everything into regular character (don't want math
+ % modes or subsup)
+ % and we hope it works (it doesn't if the text nodes aren't simple)
+ \gdef\pgfsys@mtext@configure{%
+ % no configures for \(\) and \[\] those might be needed for
+ % context or Latex. Let me know !
+ \Configure{$$}{}{}{}% no block maths
+ \Configure{$}{}{}{}%$ no inline maths
+ \Configure{SUB}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}%
+ \Configure{SUP}{\HCode{<tspan baseline-shift="sub">}}{\HCode{</tspan>}}%
+ \Configure{SUBSUP}{}{}{}% not both sub and sup
+ \Configure{htf} {0}{+}{<tspan font-family="}{\%s}{" font-size="\%s}{}{}{">}{</tspan>}%
+ }%
+}%
+
+% a counter to produce unique ids for each text node rendered with foreign element
+\newcount\pgf@sys@svg@nodenum
+
+
+% pgfutil@minipage
+%
+% I had to change it to make it play nice with the way tex4ht puts <p> and <\p> tags
+%
+
+\newif\ifpgfsys@textonly
+\def\pgfutil@minipage[#1]#2{%
+ \hbox to#2\bgroup
+ \hsize=#2\relax
+ \vbox\bgroup
+% though it works, I'm desabling the above-mentioned hack to make tex4ht behave with <p> <\p>, because it blurps the positioning
+% (I''l try to fix that later, it's a css thing)
+%
+% \ifpgfsys@textonly\else\HtmlParOn\fi
+%
+% \noindent is better as it doesn't produce indentation AND it makes you leave vertical mode
+ \noindent%\leavevmode
+}%
+\def\pgfutil@endminipage{%
+% same thing here
+%
+% \ifpgfsys@textonly\else\EndP\HtmlParOff\fi
+ \egroup\egroup
+}%
+
+
+% I'll have to fix those names later
+\newbox\pgfsys@foreignobject@Box
+\newdimen\pgf@s
+\newdimen\pgf@t
+% this is the alternate hbox routine that renders text nodes through the foreignobject tag
+\def\pgfsys@foreignobject@hbox#1{%
+ % Compute box y translation (x translation is correct).
+ \pgf@y=-\ht#1\relax
+ \HCode{<g transform="scale(1,-1) translate(0,\pgf@sys@tonumber{\pgf@y}) % got to translate in y
+ scale(0.5,0.5)">\Hnewline}% scaling work around (damn dumb browsers !)
+ % Compute box size (scaled 2 times)
+ % this is necessary to make the browser scale the font down 50% (the STUPID browsers won't make font-size:50% happen,
+ % so we have to work around this by making svg scale the things down 50%, doubling the size of the text node frame (i.e. no changement there)
+ \pgf@x=2\wd#1\relax
+ \pgf@y=2\ht#1\relax
+ \advance\pgf@y by 2\dp#1\relax
+ % this is to adjust the y translation to compensate for the differences between the TeX and the Html models for lines
+ \setbox\pgfsys@foreignobject@Box=\hbox{abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ $abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZf_1^1\overline D)_1^1\vec i\vec j$}%
+ \pgf@t=\ht#1\relax
+ \advance\pgf@t by -\ht\pgfsys@foreignobject@Box\relax
+ \pgf@s=\pgf@t\relax
+ \advance\pgf@s by \dp#1\relax
+ \advance\pgf@s by -\dp\pgfsys@foreignobject@Box\relax
+ \ifnum\pgf@s>0\relax
+ \pgf@s=0pt
+ \pgf@t=0pt
+ \else
+ \advance \pgf@y by -2\pgf@s\relax
+ \pgf@t=2\pgf@t\relax
+ \fi
+ %
+ \HCode{<foreignObject x="0" y="\pgf@sys@tonumber{\pgf@t}"
+ width="\pgf@sys@tonumber{\pgf@x}" height="\pgf@sys@tonumber{\pgf@y}">}%
+ % this is to make use of the css, class and id options through which you can control the way things display
+ \pgfkeys{%
+ /pgf/tex4ht node/css/.get=\pgfsys@foreignobject@css,%
+ /pgf/tex4ht node/class/.get=\pgfsys@foreignobject@class,%
+ /pgf/tex4ht node/id/.get=\pgfsys@foreignobject@id
+ }%
+ \HCode{<head>\Hnewline
+ <link rel="stylesheet" type="text/css" href="\pgfsys@foreignobject@css.css" />\Hnewline
+ </head>\Hnewline
+ % I'll have to look into this, perhaps there are better
+ % doctype....&nbsp; aren't recognised and produces invalid svg
+ % pictures a workaround (not implemented yet) would be to make
+ % them into entities of the svg picture.
+ <body id="\pgfsys@foreignobject@id" class="\pgfsys@foreignobject@class" xmlns="http://www.w3.org/1999/xhtml" >\Hnewline
+ <div>\Hnewline
+ }%
+ \box#1%
+ \HCode{%
+ </div>\Hnewline
+ </body>\Hnewline
+ </foreignObject>\Hnewline
+ }%
+ % debug positioning not needed but it would be nice to let it there to control things later on
+ % \HCode{<rect x="0" y="0" width="\pgf@sys@tonumber{\pgf@x}" height="\pgf@sys@tonumber{\pgf@y}"
+ % style="fill:yellow;stroke:red; fill-opacity:0.5;stroke-opacity:0.5"/>}
+ \HCode{</g>\Hnewline}%
+ \global\advance\pgf@sys@svg@nodenum by 1\relax
+}%
+
+% the options and the code that controls it all (switches between \pgfsys@mtext@hbox and \pgfsys@foreignelement@hbox)
+
+\pgfkeys{%
+ /pgf/.cd,
+ tex4ht node/escape/.is choice,
+ tex4ht node/escape/false/.code={\let\pgfsys@hbox\pgfsys@mtext@hbox\pgfsys@mtext@configure\pgfsys@textonlytrue},
+ tex4ht node/escape/true/.code={\let\pgfsys@hbox\pgfsys@foreignobject@hbox\pgfsys@foreignobject@configure\pgfsys@textonlyfalse},
+ tex4ht node/css/.initial=\jobname,
+ tex4ht node/class/.initial=foreignobject,
+ tex4ht node/id/.initial=\jobname\the\pgf@sys@svg@picnum-\the\pgf@sys@svg@nodenum
+}%
+
+
+
+
+
+
+% this might be needed
+%\font\SvgText=cmr10\relax
+
+
+
+
+% There is something rellay wrong with the way "%" chars are used in here... you should code "}%" to avoid unnecessary spaces
+% and it is unnecessary to code \cs%
+% got to be carefull with numbers though, cf the texbook...2\relax and 2 % are okey
+
+\def\pgfsys@outerinvoke{\ifpgfpicture\expandafter\pgfsys@invoke\else\expandafter\pgfutil@gobble\fi}
+
+\def\pgfsys@shadingoutsidepgfpicture#1{\pgf@sys@fail{svg code in preamble}}
+\def\pgfsys@shadinginsidepgfpicture#1{\pgf@sys@fail{svg code in preamble}}
+
+\def\pgfsys@body@shadingoutsidepgfpicture#1{%
+ \begingroup%
+ #1%
+ \setbox\pgfpic=\hbox to0pt{%
+ \pgfsys@beginpicture%
+ \pgfsys@beginscope%
+ \pgf@sys@svg@sh@defs%
+ \pgf@sys@svg@sh%
+ \pgfsys@endscope%
+ \pgfsys@endpicture%
+ \hss%
+ }%
+ \pgf@process{\pgf@sys@svg@pos}%
+ \pgf@picminx=0pt%
+ \pgf@picminy=0pt%
+ \pgf@picmaxx=\pgf@x%
+ \pgf@picmaxy=\pgf@y%
+ \def\pgf@trimleft@final{0pt}%
+ \def\pgf@trimright@final{0pt}%
+ \def\pgf@shift@baseline{0pt}%
+ \pgfsys@typesetpicturebox\pgfpic%
+ \endgroup%
+}
+
+\def\pgfsys@body@shadinginsidepgfpicture#1{%
+ #1%
+ \pgf@sys@svg@sh@defs% hmmm....
+ \pgf@process{\pgf@sys@svg@pos}
+ \pgf@xa=-.5\pgf@x%
+ \pgf@ya=-.5\pgf@y%
+ \pgfsysprotocol@literal{<g transform="translate(\pgf@sys@tonumber{\pgf@xa},\pgf@sys@tonumber{\pgf@ya})">\Hnewline}%
+ \pgf@sys@svg@sh%
+ \pgfsysprotocol@literal{</g>\Hnewline}%
+}
+
+
+\ifpgfutil@format@is@latex
+ % Protect against color.4ht evil meddling with xcolor:
+ \RequirePackage{xcolor}
+ \let\pgf@xcolor@declaredcolor=\@declaredcolor
+ \let\pgf@xcolor@undeclaredcolor=\@undeclaredcolor
+\fi
+
+\AtBeginDocument{
+ \let\pgfsys@invoke=\pgfsys@body@invoke
+ \let\pgfsys@shadingoutsidepgfpicture=\pgfsys@body@shadingoutsidepgfpicture
+ \let\pgfsys@shadinginsidepgfpicture=\pgfsys@body@shadinginsidepgfpicture
+ \ifpgfutil@format@is@latex
+ \let\pgf@texht@declaredcolor=\@declaredcolor
+ \let\pgf@texht@undeclaredcolor=\@undeclaredcolor
+ \def\@declaredcolor{\ifpgfpicture\expandafter\pgf@xcolor@declaredcolor\else\expandafter\pgf@texht@declaredcolor\fi}
+ \def\@undeclaredcolor{\ifpgfpicture\expandafter\pgf@xcolor@undeclaredcolor\else\expandafter\pgf@texht@undeclaredcolor\fi}
+ \fi
+ \def\pgfutil@color{\pgfsetcolor}
+ % \ConfigureEnv{pgfpicture}{}{}{}{} there is no environment in plain TeX and this produces errors
+ % this might be needed for context or latex though....let me know !
+}%
+
+\endinput
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-textures.def b/graphics/pgf/base/tex/pgfsys-textures.def
new file mode 100644
index 0000000000..1a01a6f8f1
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-textures.def
@@ -0,0 +1,91 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-textures.def}
+
+
+% Driver commands for textures driver
+
+
+\def\pgfsys@invoke#1{\special{rawpostscript #1}}
+\def\pgf@sys@postscript@header#1{\special{prepostscript #1}}
+\def\pgf@sys@postscript@object#1{\special{rawpostscript #1}}
+
+
+%
+% Load common postscript commands:
+%
+\input pgfsys-common-postscript.def
+
+
+%
+% textures-specific stuff:
+%
+
+\def\pgfsys@beginpicture{%
+ \special{rawpostscript save}%
+ \special{rawpostscript save pgfgetcoords}%
+ \special{postscript}% here come the coordinates
+ \special{rawpostscript restore}%
+ \special{rawpostscript pgfbeginpicture}}
+\def\pgfsys@endpicture{\special{rawpostscript restore}}
+\def\pgfsys@hbox#1{%
+ \pgfsys@begin@idscope%
+ \pgfsys@invoke{save pgfbeginhbox}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1%
+ \pgfsys@invoke{restore}%
+ \pgfsys@end@idscope%
+}
+\def\pgfsys@begininvisible{%
+ \special{rawpostscript gsave nulldevice}%
+}
+\def\pgfsys@endinvisible{%
+ \special{rawpostscript grestore}%
+}
+\def\pgfsys@color@unstacked#1{\special{rawpostscript \XC@usecolor{#1}}}
+
+\def\pgfsys@imagesuffixlist{.epsi:.eps:.ps:}
+
+\AtBeginDocument{
+ % Always present specials.
+ \special{prepostscript
+ /pgfsc{}bind def% stroke color is empty by default
+ /pgffc{}bind def% fill color is empty by default
+ /pgfe{moveto dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}bind def% rectangle
+ /pgfstr{stroke}bind def%
+ /pgffill{fill}bind def%
+ /pgfeofill{eofill}bind def%
+ /pgfw{setlinewidth}bind def% setlinewidth
+ /pgfgetcoords{/sps{globaldict begin /pgfgy exch def /pgfgx exch def
+ end pop pop}def/eps{}def userdict begin}bind def
+ /pgfbeginpicture{/pgfx pgfgx def /pgfy pgfgy def pgfx pgfy translate 1 1 72.27 72 div mul2 neg scale}bind def
+ /pgfbeginhbox{1 1 72 72.27 div mul2 neg scale
+ pgfx neg pgfy neg translate
+ pgffoa .setopacityalpha}bind def% save
+ /.setopacityalpha where {pop} {/.setopacityalpha{pop}def} ifelse % install .setopacityalpha
+ /.pgfsetfillopacityalpha{/pgffoa exch def
+ /pgffill{gsave pgffoa .setopacityalpha fill 1 .setopacityalpha
+ newpath fill grestore newpath}bind def
+ /pgfeofill{gsave pgffoa .setopacityalpha eofill1
+ .setopacityalpha newpath eofill grestore newpath}bind def}bind def
+ /.pgfsetstrokeopacityalpha{/pgfsoa exch def
+ /pgfstr{gsave pgfsoa .setopacityalpha stroke grestore newpath}bind def}bind def
+ /pgffoa 1 def
+ /pgfsoa 1 def
+ }
+}
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-vtex.def b/graphics/pgf/base/tex/pgfsys-vtex.def
new file mode 100644
index 0000000000..cce6e4a344
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-vtex.def
@@ -0,0 +1,106 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-vtex.def}
+
+
+% Driver commands for vtex
+
+% Invoking things:
+\def\pgfsys@invoke#1{\special{pS: grestore #1 gsave}} % to protect against things happeing in between
+\def\pgfsys@outerinvoke#1{\special{pS: #1}}
+\def\pgf@sys@postscript@header#1{\immediate\special{pS: #1}}
+\def\pgf@sys@postscript@object#1{\immediate\special{pS: #1}}
+
+
+%
+% Load common postscript commands:
+%
+\input pgfsys-common-postscript.def
+
+
+%
+% vtex-specific stuff:
+%
+
+
+% Starting and ending a picture:
+\def\pgfsys@beginpicture{\special{pS:
+ save
+ /pgfx currentpoint /pgfy exch def def
+ currentpoint translate
+ gsave}%
+ \let\set@color=\pgf@sys@vtex@set@color%
+ \let\reset@color=\pgf@sys@vtex@reset@color%
+}
+\def\pgf@sys@vtex@setcolor#1{%
+ \pgfutil@colorlet{pgf@tempcolor}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@tempcolor}}%
+ \expandafter\expandafter\expandafter\pgf@sys@vtex@@setcolor\csname\string\color@pgf@tempcolor\endcsname%
+}
+\def\pgf@sys@vtex@@setcolor#1#2#3#4#5{%
+ \pgfsysps@color@resetnow%
+ \expandafter\ifx\csname pgfsys@color@#4\endcsname\relax%
+ \pgferror{Unsupported color model `#4'. Sorry}%
+ \else%
+ \edef\pgf@colmarshal{\expandafter\noexpand\csname pgfsys@color@#4\endcsname}%
+ \pgf@uncomma#5,,%
+ \pgf@colmarshal%
+ \fi}
+\def\pgf@sys@vtex@set@color{\pgf@sys@vtex@setcolor{.}\aftergroup\reset@color}
+\def\pgf@sys@vtex@reset@color{\pgf@sys@vtex@setcolor{.}}
+\def\pgfsys@endpicture{\special{pS:
+ newpath
+ grestore
+ newpath
+ restore}}
+
+% Graphics:
+\def\pgfsys@imagesuffixlist{.epsi:.eps:.ps:.pdf:}
+
+% Starting and ending a box:
+\def\pgfsys@hbox#1{%
+ \pgfsys@invoke{save pgfx neg pgfy neg translate}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1
+ \pgfsys@invoke{restore}%
+}
+
+\def\pgfsys@color@unstacked#1{\special{pS: \XC@usecolor{#1}}}
+
+\def\pgfsys@fill@opacity#1{\pgf@sys@fail{opacity}}
+\def\pgfsys@stroke@opacity#1{\pgf@sys@fail{opacity}}
+
+\AtBeginDocument{
+ % Always present specials.
+ \immediate\special{pS:
+ /pgfsc{} bind def% stroke color is empty by default
+ /pgffc{} bind def% fill color is empty by default
+ /pgfstr{stroke} bind def%
+ /pgffill{fill} bind def%
+ /pgfeofill{eofill} bind def%
+ /pgfe{moveto dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath} bind def% rectangle
+ /pgfw{setlinewidth} bind def % setlinewidth
+ }
+}
+
+% vtex commands for changing the paper size
+\def\pgfsys@papersize#1#2{\mediawidth#1\mediaheight#2}
+
+
+
+
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfsys-xetex.def b/graphics/pgf/base/tex/pgfsys-xetex.def
new file mode 100644
index 0000000000..5147214ef9
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys-xetex.def
@@ -0,0 +1,75 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsys-xetex.def}
+
+\input pgfsys-dvipdfmx.def
+
+\def\pgfsys@dvipdfmx@patternobj#1{%
+ % I have NO idea why this is necessary for xdvipdfmx - but without
+ % it, it crashes.
+ \pgfutil@insertatbegincurrentpagefrombox{#1}%
+}%
+
+% XeTeX supports pdftex commands for paper size
+\def\pgfsys@papersize#1#2{%
+ \pdfpageheight#2\relax%
+ \pdfpagewidth#1\relax}
+
+\def\pgfsys@global@papersize#1#2{%
+ \global\pdfpageheight#2\relax%
+ \global\pdfpagewidth#1\relax}
+
+
+% Xetex does not support interpolate and not mask
+\def\pgfsys@defineimage{% width, height, page number
+ \ifx\includegraphics\undefined
+ \ifx\pgf@imagewidth\pgfutil@empty\edef\pgf@imagewidth{1bp}\fi% width?
+ \ifx\pgf@imageheight\pgfutil@empty\edef\pgf@imageheight{1bp}\fi% height?
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{ page \pgf@imagepage}\fi%
+ \ifx\pgf@imageinterpolate\pgfutil@empty\else\edef\pgf@imageinterpolate{ /Interpolate\space\pgf@imageinterpolate}\fi%
+ \ifx\pgf@imagemask\pgfutil@empty\else\xdef\pgf@imagemask{ /SMask @\pgf@imagemask}\fi%
+ \edef\pgf@image{\noexpand\hbox to \pgf@imagewidth{\vbox to \pgf@imageheight{\vfil\special{pdf:image width \pgf@imagewidth\space height \pgf@imageheight\space\pgf@imagepage\space(\pgf@filename) <<\pgf@imageinterpolate\pgf@imagemask\space>>}}\hfil}}%
+ \else
+ \ifx\pgf@imagewidth\pgfutil@empty\else\edef\pgf@imagewidth{width=\pgf@imagewidth,}\fi%
+ \ifx\pgf@imageheight\pgfutil@empty\else\edef\pgf@imageheight{height=\pgf@imageheight,}\fi%
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{page=\pgf@imagepage,}\fi%
+ \edef\pgf@image{\noexpand\includegraphics[\pgf@imageheight\pgf@imagewidth\pgf@imagepage]{\pgf@filename}}%
+ \fi%
+}
+
+% XeTeX supports position tracking, now
+\def\pgfsys@markposition#1{%
+ \pdfsavepos%
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutil@writetoaux\expandafter{%
+ \expandafter\noexpand\expandafter\pgfsyspdfmark\expandafter{\pgf@temp}{\the\pdflastxpos}{\the\pdflastypos}}%
+}
+
+\def\pgfsyspdfmark#1#2#3{%
+ \expandafter\gdef\csname pgf@sys@pdf@mark@pos@#1\endcsname{\pgfqpoint{#2sp}{#3sp}}%
+ \pgfutil@check@rerun{#1}{{#2}{#3}}%
+}
+
+\def\pgfsys@getposition#1#2{%
+ \edef\pgf@marshal{\let\noexpand#2=\expandafter\noexpand\csname pgf@sys@pdf@mark@pos@#1\endcsname}%
+ \pgf@marshal%
+}
+
+\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{2\hoffset}{0pt}}
+
+\ifx\paperheight\@undefined
+\else
+ \pdfpagewidth\paperwidth
+ \pdfpageheight\paperheight % this is to work around a positioning problem in xetex.
+\fi
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsys.code.tex b/graphics/pgf/base/tex/pgfsys.code.tex
new file mode 100644
index 0000000000..e3e8a5ff83
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys.code.tex
@@ -0,0 +1,1745 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesPackageRCS{pgfsys.code.tex}
+
+
+% Load key mechanism
+\input pgfkeys.code.tex
+
+% "pgf" is a family
+\pgfkeys{/pgf/.is family}
+\def\pgfset{\pgfqkeys{/pgf}}
+
+% This if is needed *very* early
+\newif\ifpgfpicture
+
+
+%
+% The following conversion functions are used to convert from TeX
+% dimensions to postscript/pdf points.
+%
+{\catcode`\p=12\catcode`\t=12\gdef\Pgf@geT#1pt{#1}}
+
+\def\pgf@sys@tonumber#1{\expandafter\Pgf@geT\the#1}
+
+\def\pgf@sys@bp@correct#1{#1=0.99627#1}
+
+\def\pgf@sys@bp#1{%
+ {%
+ \pgf@x=#1\relax%
+ \pgf@x=0.99627\pgf@x%
+ \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}%
+ \pgfutil@toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}%
+ \xdef\pgfsysprotocol@currentprotocol{\the\pgfutil@toks@}%
+ }%
+}
+\def\pgf@sys@pt#1{%
+ {%
+ \pgf@x=#1\relax%
+ \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}%
+ \pgfutil@toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}%
+ \xdef\pgfsysprotocol@currentprotocol{\the\pgfutil@toks@}%
+ }%
+}
+
+
+% internal dimensions that are always present when pgsys is loaded.
+\newdimen\pgf@x
+\newdimen\pgf@y
+\newdimen\pgf@xa
+\newdimen\pgf@ya
+\newdimen\pgf@xb
+\newdimen\pgf@yb
+\newdimen\pgf@xc
+\newdimen\pgf@yc
+\newdimen\pgf@xd
+\newdimen\pgf@yd
+
+\newwrite\w@pgf@writea
+\newread\r@pgf@reada
+\let\pgfutil@inputcheck=\r@pgf@reada
+
+% internal counters that are always present when pgfsys is loaded
+\newcount\c@pgf@counta
+\newcount\c@pgf@countb
+\newcount\c@pgf@countc
+\newcount\c@pgf@countd
+
+\newtoks\t@pgf@toka
+\newtoks\t@pgf@tokb
+\newtoks\t@pgf@tokc
+
+% Ensure that math registers are the same (math is broken in case it
+% is loaded first)
+\let\pgfmath@x\pgf@x
+\let\pgfmath@xa\pgf@xa
+\let\pgfmath@xb\pgf@xb
+\let\pgfmath@xc\pgf@xc
+
+\let\pgfmath@y\pgf@y
+\let\pgfmath@ya\pgf@ya
+\let\pgfmath@yb\pgf@yb
+\let\pgfmath@yc\pgf@yc
+
+\let\c@pgfmath@counta\c@pgf@counta
+\let\c@pgfmath@countb\c@pgf@countb
+\let\c@pgfmath@countc\c@pgf@countc
+\let\c@pgfmath@countd\c@pgf@countd
+
+
+
+
+
+% In the following dummy definitions of the pgf system commands are
+% given. The individual drivers must overwrite these definitions,
+% preferably all of them. If some system command is used that has not
+% been overwritten, the command fails with a warning.
+%
+% In some cases, some pgf system commands are just shorthands for a
+% series of more complicated commands. In this case, a default
+% implementation is given in this file, but a driver may choose to
+% overwrite this default implementation with a more efficient
+% version. For example, a closestroke is the same as a closepath
+% followed by a stroking, but in pdf there is a special shorthand for
+% this. So, the pdf driver overwrites \pgfsys@closestroke, while the
+% postscript driver does not.
+%
+% The commands for which default implementations are available are
+% given at the end.
+
+\def\pgf@sys@fail#1{%
+ \expandafter\ifx\csname pgf@sys@fail@#1\endcsname\pgfutil@empty%
+ \else%
+ \expandafter\global\expandafter\let\csname pgf@sys@fail@#1\endcsname=\pgfutil@empty%
+ \pgfwarning{Your graphic driver \pgfsysdriver\space does not support #1. This warning is given only once}%
+ \fi%
+}
+
+
+
+%
+% Invocation commands
+%
+
+\def\pgfsys@invoke{\pgf@sys@fail{invoking specials}}
+% This command is used whenever some literal text needs to be inserted
+% into the resulting .pdf, .ps, or .dvi file. Note that most
+% \pgfsys@xxxx commands will not directly call this command, but,
+% rather, use the protocolling mechanism to record their literal
+% text. It is then left to the discretion of the protocolling
+% mechanism to insert the literal text at some appropriate, later
+% time.
+%
+% This command should only be called when \pgfsys@beginpicture has
+% been called previously and when the picture has not been suspended
+% using \pgfsys@beginhbox.
+
+\def\pgfsys@outerinvoke{\pgfsys@invoke}
+% This command can be used to insert protocolled graphic commands
+% outside any picture. This is extremely dangerous, but sometimes
+% useful. By default, this command does the same as inside pictures.
+
+
+
+%
+%
+% Path construction commands
+%
+%
+
+\def\pgfsys@moveto#1#2{\pgf@sys@fail{path constructions}}
+% This command is used to start a path at a specific point (#1,#2)
+% or to move the current point of the current path to (#1,#2)
+% without drawing anything upon stroking (the current path is
+% `interrupted').
+%
+% The arguments must be dimensions (like |10pt|).
+%
+% Example:
+%
+% \pgfsys@moveto{10pt}{10pt}
+% \pgfsys@lineto{0pt}{0pt}
+% \pgfsys@stroke
+%
+% This will draw a line from (10pt,10pt) to the origin of the picture.
+
+\def\pgfsys@lineto#1#2{\pgf@sys@fail{path constructions}}
+% Continue the current path to (#1,#2) with a line.
+
+\def\pgfsys@curveto#1#2#3#4#5#6{\pgf@sys@fail{path constructions}}
+% Continue the current path with a bezier curve to (#5,#6). The
+% control points of the curve are at (#1,#2) and (#3,#4).
+
+\def\pgfsys@rect#1#2#3#4{\pgf@sys@fail{path constructions}}
+% Append a rectangle to the current path whose lower left corner is at
+% (#1,#2) and whose width/height is given by (#3,#4).
+%
+% This command can be `mapped back' to moveto and lineto commands, but
+% it is included since pdf has a special, quick version of this command.
+
+\def\pgfsys@closepath{\pgf@sys@fail{path constructions}}
+% Close the current path. This results in joining the current point of
+% the path with the point specified by the last moveto
+% operation. Typically, this is preferable over using lineto to the
+% last point specified by a moveto, since the line starting at this
+% point and the line ending at this point will be smoothly joined by
+% closepath.
+%
+% Example:
+%
+% \pgfsys@moveto{0}{0}
+% \pgfsys@lineto{10}{10}
+% \pgfsys@lineto{0}{10}
+% \pgfsys@closepath
+% \pgfsys@stroke
+%
+% versus
+%
+% \pgfsys@moveto{0}{0}
+% \pgfsys@lineto{10}{10}
+% \pgfsys@lineto{0}{10}
+% \pgfsys@lineto{0}{0}
+% \pgfsys@stroke
+%
+% The difference between the above will be that in the second triangle
+% the corner at the origin will be wrong; it will just be the overlay
+% of two lines going in different directions, not a sharp pointed
+% corner.
+
+
+
+
+
+
+%
+%
+% Stroking and filling commands
+%
+%
+
+\def\pgfsys@stroke{\pgf@sys@fail{path usage}}
+% Stroke the current path (as if it were drawn with a pen). A number
+% of so-called graphic state parameters influence this, which can be
+% set in different ways:
+%
+% - linewidth
+% The `thickness' of the line. A width of 0 is the thinnest width
+% renderable on the device. On a high-resolution printer this may
+% become invisible and should be avoided. A good choice is 0.4pt,
+% which is the default.
+%
+% - stroke color
+% This special color is used for stroking. If it is not set, the
+% current color is used.
+%
+% - cap
+% The cap describes how the endings of lines a drawn. A round cap
+% adds a little half circle to these endings. A butt cap ends the
+% lines exactly at the end (or start) point without anything
+% added. A rectangular cap ends the lines like the butt cap, but the
+% lines protrude over the endpoint by the line thickness. (See also
+% the pdf or postscript manual). If the path has been closed, no cap
+% is drawn.
+%
+% - join
+% This describes how a bend (a join) in a path is rendered. A round
+% join draws bends using small arcs. A bevel join just draws the two
+% lines and then fills the join minimally so that it becomes
+% convex. A miter join extends the lines so that they form a single
+% sharp corner, but only up to a certain miter limit. (See the pdf
+% or postscript manual once more).
+%
+% - dash
+% The line may be dashed according to a dashing pattern.
+%
+% - clipping area
+% If a clipping area is established, only those parts of the path
+% that are inside the clipping area will be drawn.
+%
+% In addition to stroking a path, the path may also be used for
+% clipping after it has been stroked. This will happen if the
+% \pgfsys@clipnext is used prior to this command, see there for
+% details.
+
+\def\pgfsys@fill{\pgf@sys@fail{path usage}}
+% This command fills the area surrounded by the current path. If the
+% path has not yet been closed, it is closed prior to filling. The
+% path itself is not stroked. For self-intersecting paths or paths
+% consisting of multiple parts, the nonzero winding number rule is
+% used to determine whether a point is inside or outside the
+% path, except if \ifpgfsys@eorule holds -- in which case the even-odd
+% rule should be used. (See the pdf or postscript manual for details.)
+%
+% The following graphic state parameters influence the filling:
+%
+% - fill color
+% If the fill color is not especially set, the current color is
+% used.
+%
+% - clipping area
+% If a clipping area is established, only those parts of the filling
+% area that are inside the clipping area will be drawn.
+%
+% In addition to filling the path, the path will also be used for
+% clipping if \pgfsys@clipnext is used prior to this command.
+
+\def\pgfsys@fillstroke{\pgf@sys@fail{path usage}}
+% First, the path is filled, then the path is stroked. If the fill and
+% stroke colors are the same (or if they are not specified and the
+% current color is used), this yields almost the same as a
+% \pgfsys@fill. However, due to the line thickness of the stroked
+% path, the fillstroked area will be slightly larger.
+%
+% In addition to stroking and filling the path, the path will also be
+% used for clipping if \pgfsys@clipnext is used prior to this command.
+
+\def\pgfsys@clipnext{\pgf@sys@fail{path usage}}
+% This command should be issued after a path has been constructed, but
+% before it has been stroked and/or filled or discarded. When the
+% command is used, the next stroking/filling/discarding command will
+% first be executed normally. Then, afterwards, the just-used path
+% will be used for subsequent clipping. If there has already been a
+% clipping region, this region is intersected with the new clipping
+% path (the clipping cannot get bigger). The nonzero winding number
+% rule is used to determine whether a point is inside or outside the
+% clipping area or the even-odd rule, depending on whether
+% \ifpgfsys@eorule holds.
+
+\def\pgfsys@discardpath{\pgf@sys@fail{path usage}}
+% Normally, this command should `throw away' the current path.
+% However, after \pgfsys@clipnext has been called, the current path
+% should subsequently be used for clipping. See \pgfsys@clipnext for
+% details.
+
+\def\pgfsys@closestroke{\pgfsys@closepath\pgfsys@stroke}
+% This command should have the same effect as first closing the path
+% and then stroking it.
+
+\newif\ifpgfsys@eorule
+% Decides, whether even-odd filling and clipping is
+% to be used or normal the non-zero winding number rule. See the
+% pdf-documentation for details on what these rules are.
+
+
+
+
+%
+%
+% Stroking options
+%
+%
+\def\pgfsys@setlinewidth#1{\pgf@sys@fail{setting the line width}}
+% Sets the width of lines, when stroked, to #1, which must be a TeX
+% dimension (as text).
+
+\def\pgfsys@buttcap{\pgf@sys@fail{setting the line cap}}
+% Sets the cap to a butt cap. See \pgfsys@stroke.
+
+\def\pgfsys@roundcap{\pgf@sys@fail{setting the line cap}}
+% Sets the cap to a round cap. See \pgfsys@stroke.
+
+\def\pgfsys@rectcap{\pgf@sys@fail{setting the line cap}}
+% Sets the cap to a rectangular cap. See \pgfsys@stroke.
+
+\def\pgfsys@miterjoin{\pgf@sys@fail{setting the line join}}
+% Sets the join to a miter join. See \pgfsys@stroke.
+
+\def\pgfsys@setmiterlimit#1{\pgf@sys@fail{setting the line cap}}
+% Sets the miter limit of lines to #1. See the pdf or postscript
+% documentation.
+
+\def\pgfsys@roundjoin{\pgf@sys@fail{setting the line cap}}
+% Sets the join to a round join. See \pgfsys@stroke.
+
+\def\pgfsys@beveljoin{\pgf@sys@fail{setting the line cap}}
+% Sets the join to a bevel join. See \pgfsys@stroke.
+
+\def\pgfsys@setdash#1#2{\pgf@sys@fail{setting the dashing pattern}}
+% Sets the dashing patter. #1 should be a list of lengths separated by
+% commas. #2 should be a single dimension.
+%
+% The list of values in #1 is used to determine the lengths of the
+% `on' phases of the dashing and of the `off' phases. For example, if
+% #1 is `3pt,4pt', then the dashing pattern is `3pt on followed by 4pt
+% off, followed by 3pt on, followed by 4pt off, and so on'. A pattern
+% of `.5pt,4pt,3pt,1.5pt' means `.5pt on, 4pt off, 3pt on, 1.5pt off, .5pt on,
+% ...'. If the number of entries is odd, the last one is used twice,
+% so `3pt' means `3pt on, 3pt off, 3pt on, 3pt off,...'. An empty list
+% means `always on'.
+%
+% The second argument determines the `phase' of the pattern. For
+% example, for a pattern of `3pt,4pt' and a phase of `1pt', the pattern
+% would start: `2pt on, 4pt off, 3pt on, 4pt off, 3pt on, 4pt off...'.
+
+
+
+
+
+%
+%
+% Color stuff
+%
+%
+
+\def\pgfsys@color@rgb@stroke#1#2#3{\pgf@sys@fail{color}}
+% Sets the color used for stroking operations to the given rgb tuple
+% (numbers between 0 and 1).
+%
+% Example: Make stroked text dark red: \pgfsys@color@rgb@stroke{0.5}{0}{0}
+%
+% The special stroking color is only used if the stroking color has
+% been set since the last \pgfutil@color command. Thus, each \pgfutil@color command
+% should reset both the stroking and filling colors.
+
+\def\pgfsys@color@rgb@fill#1#2#3{\pgf@sys@fail{color}}
+% Sets the color used for filling operations to the given rgb tuple
+% (numbers between 0 and 1). This color may be different from the
+% stroking color.
+
+\def\pgfsys@color@rgb#1#2#3{\pgfsys@color@rgb@stroke{#1}{#2}{#3}\pgfsys@color@rgb@fill{#1}{#2}{#3}}
+% Sets the color used for filling and stroking operations. This is a
+% ``low-level'' version of the \pgfutil@color command. It is currently only
+% used by the plain tex version to support colors.
+
+\def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgf@sys@fail{color}}
+% Sets the color used for stroking operations to the given cymk tuple
+% (numbers between 0 and 1).
+
+\def\pgfsys@color@cmyk@fill#1#2#3#4{\pgf@sys@fail{color}}
+% Sets the color used for filling operations to the given cymk tuple
+% (numbers between 0 and 1).
+
+\def\pgfsys@color@cmyk#1#2#3#4{\pgfsys@color@cmyk@stroke{#1}{#2}{#3}{#4}\pgfsys@color@cmyk@fill{#1}{#2}{#3}{#4}}
+% Sets the color used for filling and stroking operations.
+
+\def\pgfsys@color@cmy@stroke#1#2#3{\pgf@sys@fail{color}}
+% Sets the color used for stroking operations to the given cym tuple
+% (numbers between 0 and 1).
+
+\def\pgfsys@color@cmy@fill#1#2#3{\pgf@sys@fail{color}}
+% Sets the color used for filling operations to the given cym tuple
+% (numbers between 0 and 1).
+
+\def\pgfsys@color@cmy#1#2#3{\pgfsys@color@cmy@stroke{#1}{#2}{#3}\pgfsys@color@cmy@fill{#1}{#2}{#3}}
+% Sets the color used for filling and stroking operations.
+
+\def\pgfsys@color@gray@stroke#1{\pgf@sys@fail{color}}
+% Sets the color used for stroking operations to the given gray level
+% (number between 0 and 1).
+
+\def\pgfsys@color@gray@fill#1{\pgf@sys@fail{color}}
+% Sets the color used for filling operations to the given gray level
+% (number between 0 and 1).
+
+\def\pgfsys@color@gray#1{\pgfsys@color@gray@stroke{#1}\pgfsys@color@gray@fill{#1}}
+% Sets the color used for filling and stroking operations.
+
+\newif\ifpgfsys@color@reset@inorder
+% This if decides whether the color resetting of the
+% \pgfsys@color@reset command may assume that all color commands are
+% given ``in order.'' This means that this command will not be called,
+% say, at the beginning of a box that is later inserted at a point
+% where a fill color was actively set. This may allow the command to
+% produce more compact code when it ``knows'' that no special fill or
+% stroke color has been set.
+\pgfsys@color@reset@inordertrue
+
+
+\def\pgfsys@color@reset{}
+% This command will be called when the \pgfutil@color command is used. It
+% should purge any internal settings of stroking and filling
+% color. After this call, till the next use of a command like
+% \pgfsys@color@rgb@fill, the current color installed by the \pgfutil@color
+% command should be used.
+
+\def\pgfsys@color@unstacked#1{}
+% This slightly obscure command causes the color stack to be
+% tricked. When called, this command should set the current color to
+% #1 without causing any change in the color stack.
+
+\def\pgfsys@text@to@black@hook{}
+% Another slightly obscure command that allows tikz to hack into
+% dvisvgm's color management inside text nodes. The problem is that
+% the color "black" is special for dvisvgm.
+
+
+
+%
+%
+% Coordinate system transformations
+%
+%
+
+\def\pgfsys@transformcm#1#2#3#4#5#6{\pgf@sys@fail{transformations}}
+% Perform a concatenation of the low-level current transformation
+% matrix with the matrix given by the values #1 to #6. The
+% transformation matrix is a transformation on a homogeneous
+% 2D-coordinate system. See the pdf or postscript manual for details.
+
+\def\pgfsys@transformshift#1#2{\pgfsys@transformcm{1}{0}{0}{1}{#1}{#2}}
+% This command will change the origin of the low-level coordinate
+% system to (#1,#2).
+
+\def\pgfsys@transformxyscale#1#2{\pgfsys@transformcm{#1}{0}{0}{#2}{0bp}{0bp}}
+% This command will scale the low-level coordinate system (and
+% everything that is drawn) by a factor of #1 in x-directed and #2 in
+% y-direction. Note that this applies to everything, including
+% lines. So a scaled line will have a different width and may even
+% have a different width when going along the x-axis and when going
+% along the y-axis, if the scaling is different in these directions.
+
+\def\pgfsys@viewboxmeet#1#2#3#4#5#6#7#8{\pgfsys@beginscope\pgf@sys@default@viewbox@impl{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{<}}
+% Consider the two rectangles R with lower left corner
+% (#5,#6) and upper right (#7,#8) and S with lower left corner
+% (#1,#2) and upper right (#3,#4). Now, consider the transformation
+% that scales and translates R so that the result T has the same
+% center as S and has maximal size while still being inside S. This
+% transformation gets installed in a new graphics group, which must be
+% ended with a corresponding \pgfsys@endviewbox.
+
+\def\pgfsys@viewboxslice#1#2#3#4#5#6#7#8{\pgfsys@beginscope\pgf@sys@default@viewbox@impl{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{>}}
+% Works like \pgfsys@viewboxmeet, but R3 will have minimal size so
+% that in contains all of R2.
+
+\def\pgfsys@endviewbox{\pgfsys@endscope}
+% Ends a viewbox scope started by either of the previous two commands.
+
+
+\def\pgf@sys@default@viewbox@impl#1#2#3#4#5#6#7#8#9{{%
+ \pgf@x#1%
+ \pgf@y#2%
+ \pgf@xa#3%
+ \pgf@ya#4%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \pgfmathdivide@\pgf@xa\pgf@ya%
+ \let\aspectr\pgfmathresult%
+ \pgf@xb#5%
+ \pgf@yb#6%
+ \pgf@xc#7%
+ \pgf@yc#8%
+ \advance\pgf@xc by-\pgf@xb%
+ \advance\pgf@yc by-\pgf@yb%
+ \pgfmathdivide@\pgf@xc\pgf@yc%
+ \let\aspects\pgfmathresult%
+ \ifdim\aspectr pt#9\aspects pt%
+ \pgfmathdivide@\pgf@xa\pgf@xc%
+ \else%
+ \pgfmathdivide@\pgf@ya\pgf@yc%
+ \fi%
+ \advance\pgf@x by.5\pgf@xa%
+ \advance\pgf@xb by.5\pgf@xc%
+ \advance\pgf@y by.5\pgf@ya%
+ \advance\pgf@yb by.5\pgf@yc%
+ \pgfsys@transformcm{\pgfmathresult}{0}{0}{\pgfmathresult}{\pgf@x}{\pgf@y}%
+ \pgfsys@transformcm{1}{0}{0}{1}{-\pgf@xb}{-\pgf@yb}%
+ }%
+}
+
+
+
+
+%
+%
+% Graphic state saving and restoring.
+%
+%
+
+\def\pgfsys@beginscope{\pgf@sys@fail{scoping}}
+% Saves the current graphic state on a graphic state stack. All
+% changes to the graphic state parameters mentioned for \pgfsys@stroke
+% and \pgfsys@fill will be local to the current graphic state and will
+% the old values will be restored after endscope is used.
+%
+% WARNING: pdf and postscript differ with respect to the question of
+% whether the current path is part of the graphic state or not. For
+% this reason, you should never use this command unless the path is
+% currently empty. For example, it might be a good idea to use
+% discardpath prior to calling this command.
+
+\def\pgfsys@endscope{\pgf@sys@fail{scoping}}
+% Restores the last saved graphic state.
+
+\def\pgfsys@begin@idscope{%
+ \begingroup%
+ \edef\pgf@sys@cacheref{\pgfsys@id@refcurrent}%
+ \expandafter\let\expandafter\pgfsys@beg@save\csname pgf@sys@att@beg@\pgf@sys@cacheref\endcsname%
+ \expandafter\let\expandafter\pgfsys@end@save\csname pgf@sys@att@end@\pgf@sys@cacheref\endcsname%
+ \ifx\pgfsys@beg@save\relax%
+ \ifx\pgfsys@end@save\relax%
+ \else%
+ \pgfsys@call@save%
+ \fi%
+ \else%
+ \pgfsys@call@save%
+ \fi%
+ \pgfsys@invalidate@currentid%
+ \begingroup%
+}
+% Starts an "id scope" where the current value of \pgfsys@use@id and
+% \pgfsys@use@type is used. If the combination has been used before,
+% nothing happens. Otherwise, depending of the driver, a graphic
+% scope may or may not be created. To ensure that a graphic scope is
+% created, use \pgfsys@beginscope additionally.
+
+\def\pgfsys@call@save{%
+ \pgfsys@beginscope%
+ \pgfsys@beg@save%
+ \expandafter\global\expandafter\let\csname pgf@sys@att@beg@\pgfsys@id@refcurrent\endcsname\relax%
+ \expandafter\global\expandafter\let\csname pgf@sys@att@end@\pgfsys@id@refcurrent\endcsname\relax%
+}
+
+\def\pgfsys@end@idscope{
+ \endgroup%
+ \ifx\pgfsys@beg@save\relax%
+ \ifx\pgfsys@end@save\relax%
+ \else%
+ \pgfsys@call@end%
+ \fi%
+ \else%
+ \pgfsys@call@end%
+ \fi%
+ \endgroup
+}
+% Ends an id scope.
+
+\def\pgfsys@call@end{%
+ \pgfsys@end@save%
+ \pgfsys@endscope%
+}
+
+
+\def\pgfsys@begin@text{}
+% Inside a text box you should not use graphics command. However, TikZ
+% needs to insert some color commands at the beginnings of text
+% boxes. For most drivers, this is not a problem; except for SVG,
+% where every change of the graphics state opens a scope and needs a
+% closing scope. This command should be used at the beginning of text
+% boxes containing such color commands and the matching
+% \pgfsys@end@text at the end. If the box does not contain commands
+% that change the graphics state, this command is not needed.
+
+\def\pgfsys@end@text{}
+% Closes a \pgfsys@begin@text.
+
+
+
+%
+%
+% Id management (all of these commands have a default implementation
+% any typically need not be redefined by a driver)
+%
+%
+
+% The id count
+\newcount\pgf@sys@id@count
+
+\def\pgfsys@new@id#1{%
+ \edef#1{pgf\the\pgf@sys@id@count}%
+ \global\advance\pgf@sys@id@count by1\relax%
+}
+% Creates a new id and stores it in the macro #1.
+
+\def\pgfsys@use@id#1{%
+ \edef\pgf@sys@id@current@id{#1}%
+ \let\pgfsys@current@type\pgfutil@empty%
+}
+\let\pgf@sys@id@current@id\pgfutil@empty
+% Sets the id to be used for the next graphic object (group, box, or
+% path). The type is reset to be empty. #1 must be a macro name that
+% has previously been set using \pgfsys@new@id.
+%
+% Each combination of id and type can be used only once, on a second
+% use nothing happens.
+
+\def\pgfsys@clear@id{%
+ \let\pgf@sys@id@current@id\pgfutil@empty%
+}
+% Clears the current id, so nothing can be referenced.
+
+\def\pgfsys@use@type#1{%
+ \edef\pgfsys@current@type{#1}%
+ \pgfsys@register@type\pgfsys@current@type%
+}
+\let\pgfsys@current@type\pgfutil@empty
+% Sets the type to be used for the next graphic object.
+
+\def\pgfsys@append@type#1{%
+ \ifx\pgfsys@current@type\pgfutil@empty%
+ \pgfsys@use@type{#1}%
+ \else%
+ \pgfsys@use@type{\pgfsys@current@type.#1}%
+ \fi%
+}
+% Appends something to the current type
+
+\def\pgfsys@register@type#1{%
+ \expandafter\let\expandafter\pgf@sys@temp\csname pgf@sys@reg@type@#1\endcsname%
+ \ifx\pgf@sys@temp\relax%
+ {%
+ \c@pgf@counta\pgf@sys@type@count\relax%
+ \global\advance\c@pgf@counta by1\relax%
+ \edef\pgf@sys@type@count{\the\c@pgf@counta}%
+ \expandafter\xdef\csname pgf@sys@reg@type@#1\endcsname{y\the\c@pgf@counta}%
+ }%
+ \fi%
+}
+% Registers a type with the system. Must be called before any use of
+% the type
+\def\pgf@sys@reg@type@{}
+\def\pgf@sys@reg@type@background{b}
+\def\pgf@sys@reg@type@path{p}
+\def\pgf@sys@reg@type@text{t}
+\expandafter\def\csname pgf@sys@reg@type@background.path\endcsname{bp}
+\def\pgf@sys@type@count{0}
+
+\def\pgfsys@push@type{%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@sys@typestack%
+ \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsys@current@type%
+ \expandafter\expandafter\expandafter{\expandafter\pgfsys@current@type\expandafter}%
+ \expandafter\def\expandafter\pgf@sys@typestack\expandafter{\pgf@sys@typestack}}%
+}
+\let\pgf@sys@typestack\pgfutil@empty
+% Pushes the current type onto a global stack. This is useful for
+% temporarily changing the type without creating \TeX scopes.
+
+\def\pgfsys@pop@type{\pgf@sys@typestack}
+% Pops the last id from the stack.
+
+\def\pgfsys@id@ref#1#2{#1\csname pgf@sys@reg@type@#2\endcsname}
+% Expands to a text that can be inserted as a reference. #1 must be a
+% reference created \pgfsys@new@id, #2 must be a type that has been
+% registered using \pgfsys@id@register@type.
+
+\def\pgfsys@id@refcurrent{\pgfsys@id@ref{\pgf@sys@id@current@id}{\pgfsys@current@type}}
+% Expands to a text that can be inserted as a reference to the current
+% id-type pair in use.
+
+\def\pgfsys@invalidate@currentid{%
+ \expandafter\global\expandafter\let\csname pgf@sys@id@keylist@\pgfsys@id@refcurrent\endcsname\pgfutil@empty%
+}
+% Mark the current id-type pair as used.
+
+\def\pgfsys@attach@to@id#1#2#3#4{%
+ \pgfsys@register@type{#2}%
+ \expandafter\def\expandafter\pgf@sys@tempbeg\expandafter{\csname pgf@sys@att@beg@\pgfsys@id@ref{#1}{#2}\endcsname}%
+ \expandafter\def\expandafter\pgf@sys@tempend\expandafter{\csname pgf@sys@att@end@\pgfsys@id@ref{#1}{#2}\endcsname}%
+ \expandafter\ifx\pgf@sys@tempbeg\relax%
+ \expandafter\let\pgf@sys@tempbeg\pgfutil@empty%
+ \fi%
+ \expandafter\ifx\pgf@sys@tempend\relax%
+ \expandafter\let\pgf@sys@tempend\pgfutil@empty%
+ \fi%
+ \expandafter\let\expandafter\pgf@sys@tempbeg@cont\pgf@sys@tempbeg%
+ \expandafter\let\expandafter\pgf@sys@tempend@cont\pgf@sys@tempend%
+ \expandafter\expandafter\expandafter\gdef\expandafter\pgf@sys@tempbeg\expandafter{\pgf@sys@tempbeg@cont#3}%
+ \def\pgf@sys@temp{#4}%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\pgf@sys@tempend\expandafter\expandafter\expandafter{\expandafter\pgf@sys@temp\pgf@sys@tempend@cont}%
+}
+% Attaches some code to an id-type pair so that when the id's scope
+% gets created, #3 is added at the beginning and #4 is added at the
+% end.
+
+\def\pgfsys@if@fresh@id#1#2#3#4{%
+ \edef\pgf@sys@temp{#1}%
+ \ifx\pgf@sys@temp\pgfutil@empty% empty id always counts as "has been used"
+ #4%
+ \else%
+ \pgfsys@register@type{#2}%
+ \expandafter\ifx\csname pgf@sys@id@keylist@\pgfsys@id@ref{#1}{#2}\endcsname\pgfutil@empty%
+ % has already been used!
+ #4%
+ \else%
+ #3%
+ \fi%
+ \fi%
+}
+% Checks whether a given id-type pair #1-#2 has not been used, yet. If
+% so, #3 is executed, otherwise #4.
+
+\def\pgfsys@if@fresh@currentid#1#2{%
+ \ifx\pgf@sys@id@current@id\pgfutil@empty% empty id always counts as "has been used"
+ #2%
+ \else%
+ \expandafter\ifx\csname pgf@sys@id@keylist@\pgfsys@id@refcurrent\endcsname\pgfutil@empty%
+ % has already been used!
+ #2%
+ \else%
+ #1%
+ \fi%
+ \fi%
+}
+% Checks whether the current id-type pair in use has not been used,
+% yet. If so, #1 is executed, otherwise #2.
+
+
+
+
+%
+%
+% Special commands
+%
+%
+
+\def\pgfsys@imagesuffixlist{}
+% A list of suffixes, separated by `:', that will be tried when
+% searching for an image.
+
+
+
+%
+%
+% Transparency
+%
+%
+
+\def\pgfsys@opacity#1{\pgfsys@stroke@opacity{#1}\pgfsys@fill@opacity{#1}}
+% Ideally, this should sets the opacity of all operations, treating
+% the group as a transparency group with 1 meaning fully opaque, 0
+% meaning fully transparent. Since most drivers do not support this,
+% the fallback is to set the stroke and fill opacity at the same
+% time. This is not quite the same, however.
+
+\def\pgfsys@stroke@opacity#1{\pgf@sys@fail{opacity}}
+% Sets the opacity of stroking operations. 1 means fully opaque, 0
+% means fully transparent.
+
+\def\pgfsys@fill@opacity#1{\pgf@sys@fail{opacity}}
+% Sets the opacity of filling operations. 1 means fully opaque, 0
+% means fully transparent.
+
+\def\pgfsys@transparencygroupfrombox#1{\pgf@sys@fail{transparency groups}}
+% This takes a TeX box and converts it into a transparency
+% group. This means that any transparency settings apply to the box as
+% a whole. For instance, if a box contains two overlapping black
+% circles and you draw them normally with 50% transparency, then the
+% overlap will be darker than the rest. By comparison, if the circles
+% are part of a transparency group, the overlap will get the same
+% color as the rest.
+%
+% The following settings modify the behaviour of a transparency group:
+
+\newif\ifpgfsys@transparency@group@isolated
+\newif\ifpgfsys@transparency@group@knockout
+
+
+\def\pgfsys@blend@mode#1{\pgf@sys@fail{blend mode}}
+% Sets the current blend mode. See the PDF specification for details
+% on blend modes.
+
+
+\def\pgfsys@definemask{\pgf@sys@fail{image masks}}
+% This command declares a mask for usage with images. It works similar
+% to \pgfsys@defineimage: Certain macros are set when the command is
+% called. The result should be to set the macro \pgf@mask to a pdf
+% object count that can subsequently be used as a soft mask. The
+% following macros will be set when this command is invoked:
+%
+% - \pgf@filename
+% File name of the mask to be defined.
+%
+% - \pgf@maskmatte
+% The so-called matte of the mask (see the pdf documentation for
+% details). The matte is a color specification consisting of 1, 3 or
+% 4 numbers between 0 and 1. The number of numbers depends on the
+% number of color channels in the image (not in the mask!). It will
+% be assumed that the image has been preblended with this color.
+
+\def\pgfsys@fadingfrombox#1#2{\pgf@sys@fail{fadings}}
+% Declares an fading named #1. The parameter #2 must be a
+% box. Its contents luminosity determines the opacity of the resulting
+% mask.
+
+\def\pgfsys@usefading#1#2#3#4#5#6#7{\pgf@sys@fail{fadings}}
+% Installs a previously declared fading #1 in the current graphics
+% state. Parameters #2 to #7 specify a transformation cm that should
+% be applied to the mask before it is used.
+
+
+
+%
+%
+% Shading commands
+%
+%
+
+\def\pgfsys@horishading#1#2#3{\pgf@sys@fail{shadings}\pgf@sys@noshading{#1}}
+% Declares a horizontal shading for later use. The effect of this
+% command should be the definition of a macro called `@pgfshading#1!'
+% (or \csname @pdfshading#1!\endcsname, to be precise). When invoked,
+% this new macro should insert a shading at the current position.
+%
+% #1 is the name of the shading, which is also used in the output
+% macro name. #2 is the height of the shading and must be given as a
+% TeX dimension like `2cm' or `10pt'. #3 is a shading color
+% specification as specified in the pgfuserguide. The shading
+% specification implicitly fixes the width of the shading.
+%
+% When `@pgfshading#1!' is invoked, it should insert a box of height
+% #2 and the width implicit in the shading declaration.
+
+\def\pgfsys@vertshading#1#2#3{\pgf@sys@fail{shadings}\pgf@sys@noshading{#1}}
+% Like horishading, only for vertical shadings. This time, the height
+% of the shading is implicit in #3 and the width is given as #2.
+
+\def\pgfsys@radialshading#1#2#3{\pgf@sys@fail{shadings}\pgf@sys@noshading{#1}}
+% Declares a radial shading. Like the previous macros, this command
+% should setup the macro `@pgfshading#1!', which upon invocation
+% should insert a radial shading whose size is implicit in #3.
+%
+% The parameter #2 is a pgf point specification if the starting point
+% of the shading. See the pgfuserguide for details.
+
+\def\pgfsys@functionalshading#1#2#3#4{\pgf@sys@fail{shadings (functional)}\pgf@sys@noshading{#1}}
+% Declares a shading using a PostScript-like function that provides a
+% color for each point. Like the previous macros, this command
+% should setup the macro `@pgfshading#1!' so that it will produce a
+% box containing the desired shading.
+%
+% Parameter #1 is the name of the shading. Parameter #4 is a
+% Postscript-like function (type 4 function of the PDF specification)
+% as described in Section 3.9.4 of the PDF Specification version 1.7.
+% Parameter #2 and #3 are pgf point specifications that specifies the
+% lower left and upper right coordinate.
+%
+% When function #4 is evaluated, the coordinate of the current
+% point will be on the (virtual) PostScript stack in bp units. After
+% the function has been evaluated, the stack should consist of three
+% numbers (not integers! - the Apple PDF renderer is broken in this
+% regard, so add cvr's at the end if needed) that represent the red,
+% green, and blue components of the color.
+%
+% A buggy #4 will result is *totally unpredictable chaos* during
+% rendering.
+
+\def\pgf@sys@noshading#1{\expandafter\global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@empty}
+
+
+
+
+%
+%
+% Pattern stuff
+%
+%
+
+\def\pgfsys@declarepattern#1#2#3#4#5#6#7#8#9{\pgf@sys@fail{patterns}}
+% This command declares a new colored or uncolored pattern. Uncolored
+% patterns have no inherent color, the color is provided when they are
+% set. Colored patters have an inherent color.
+% #1 = name of the pattern (must be a plain suffix for use in
+% postscript/pdf/etc.)
+% #2 to #5 = four coordinates describing the corners of a bounding box
+% of pattern cells
+% #6 = x-step
+% #7 = y-step
+% #8 = pattern code
+% #9 = 0 if uncolored patter, 1 if colored pattern.
+
+\def\pgfsys@setpatternuncolored#1#2#3#4{\pgf@sys@fail{patterns}}
+% Sets an uncolored pattern #1 as filling color. The numbers #2, #3,
+% #4 must be an rgb-value to be used as the color of the pattern.
+
+\def\pgfsys@setpatterncolored#1{\pgf@sys@fail{patterns}}
+% Sets an colored pattern #1 as filling color.
+
+
+
+
+
+%
+%
+% Animations
+%
+%
+
+
+\newif\ifpgfsysanimationsupported
+% Will be set to true by a driver when animations are supported. Note
+% that snapshots are always supported.
+
+
+\def\pgfsys@animate#1{\pgf@sys@fail{animations}}
+% Adds an animation of the attribute #1 to the current scope.
+% The configuration of the animation (like start times, etc.) is taken
+% from the current values of the animation keys, which are configured
+% using calls to \pgfsys@animation@..., which setup an animation
+% key for the local scope. This means that you typically setup these
+% keys in a scope and at the end of the scope call \pgfsys@animate.
+%
+% Some keys accumulate (like begin or keytime), most do not. In those
+% cases, the last call overrides the previous one.
+%
+% Not all value types make sense or are allowed, it depends on the
+% specific \pgfsys@animate call.
+%
+% Example:
+%
+% {
+% \pgfsys@animation@offset{10}{begin}%
+% \pgfsys@animation@event{}{click}{1}{begin}%
+% \pgfsys@animation@time{5}{1}{1}{0}{0}
+% \pgfsys@animation@val@scalar{1}
+% \pgfsys@animation@time{8}{1}{1}{0}{0}
+% \pgfsys@animation@val@scalar{0.5}
+% \pgfsys@animation@sum%
+% \pgfsys@animate{fillopacity}%
+% }
+%
+% When a driver does not support a specific attribute #1, it should
+% issue a \pgf@sys@fail. Typical attributes are things like "opacity"
+% or "linewidth" or "dash".
+%
+% The following values are permissible for "#1":
+%
+% "opacity" adds an animation of the opacity.
+% Type: scalar
+%
+% "fillopacity" adds an animation of the fill opacity.
+% Type: scalar
+%
+% "strokeopacity" adds an animation of the stroke opacity.
+% Type: scalar
+%
+% "visibility" adds an animation of the visibility.
+% Type: text ("visible" or "hidden")
+%
+% "linewidth" adds an animation of the line width.
+% Type: dimension
+%
+% "dash" adds an animation of the dash.
+% Type: dash
+%
+% "translate" adds an animation of the transformation.
+% Type: translate
+%
+% "scale" adds an animation of the transformation.
+% Type: scale
+%
+% "rotate" adds an animation of the transformation.
+% Type: scalar
+%
+% "skewx" adds an animation of the transformation.
+% Type: scalar
+%
+% "skewy" adds an animation of the transformation.
+% Type: scalar
+%
+% "motion" adds a movement along a path.
+% Type: motion
+%
+% "strokecolor" adds an animation of the stroke color.
+% Type: color
+%
+% "fillcolor" adds an animation of the fill color.
+% Type: color
+%
+% "viewbox" adds an animation of the view box.
+% Type: view box
+%
+% "path" adds an animation of the path to the path specified by
+% \pgfsys@animation@whom
+% Type: path
+%
+% "syncbase" adds a sync base to the animation. A sync base does not animate
+% anything by itself, but other animations can begin and end relative
+% to it.
+%
+% "none" suppresses the animation
+% Type: any
+
+
+
+
+% Animation timing :
+%
+% You specify an animation using a timeline. A timeline consists of a
+% sequence of times together with values for these times. The times
+% must be given in increasing order. You use the command
+% \pgfsys@animation@time to specify a time and
+% \pgfsys@animation@val@... to specify a value. The time must be
+% specified first, the time--value is created when the value command is
+% used.
+%
+% Times are given in seconds (so 0.01 is one hundredth of a second).
+%
+% The animation's timeline will start with the first time mentioned
+% (not necessarily zero and not necessarily a positive value) and ends
+% with the last value. The duration is the difference between these
+% two values.
+
+\def\pgfsys@animation@restart@always{}
+% Specifies that the animation can always restart
+
+\def\pgfsys@animation@restart@never{}
+% Specifies that the animation should never restart
+
+\def\pgfsys@animation@restart@whennotactive{}
+% Specifies that the animation should only restart when it is not active
+
+\def\pgfsys@animation@repeat#1{}
+% #1 must be a number
+
+\def\pgfsys@animation@repeat@indefinite{}
+% Repeats forever
+
+\def\pgfsys@animation@repeat@dur#1{}
+% #1 must be a clock value
+
+\def\pgfsys@animation@freezeatend{}
+% Specifies that the last value of the animation remains in force at
+% the end
+
+\def\pgfsys@animation@removeatend{}
+% Specifies that the effect of the animation is removed at the end
+
+\def\pgfsys@animation@time#1#2#3#4#5{}
+% Specifies a time together with spline control points for the entry
+% and the exit to this time. The value #1 is a time in seconds (so 60
+% means 1 minute, 0.001 means one millisecond). The values #2 and #3
+% specify the control point of the spline *entering* the time point,
+% while the values #4 and #5 specify the control point of the spline
+% *leaving* the time point. They are all dimensionless values between
+% 0 and 1. For a linear animation, set the first two to 1 and the last
+% two to 0.
+%
+% Example:
+% \pgfsys@animation@time{5}{1}{1}{0.25}{0.1}
+% \pgfsys@animation@val@scalar{80}
+% \pgfsys@animation@time{8}{.75}{1}{0}{0}
+% \pgfsys@animation@val@scalar{90}
+%
+% In SVG, this will create the following entries:
+% begin = +5s
+% duration = 3s
+% keyTimes = 0;1
+% values = 80;90
+% keySpline = 0.25 0.1 0.75 1
+%
+% For the key spline, note that the entry spline controls of the first
+% time and the exit spline controls of the last point are dropped.
+%
+%
+% When the exit spline takes the special values #4="stay" and #5="0",
+% the attribute's value "stays" until the next value for the next time
+% (it "jumps" to the next value then). This corresponds, roughly, to
+% an "infinite" #4.
+%
+% Similarly, when the entry spline takes the special value #2="jump"
+% and #3="1", the value immediately jumps from the previous value to
+% the next value when the previous value was "created".
+
+\def\pgfsys@stay@text{{stay}{0}}
+\def\pgfsys@jump@text{{jump}{1}}
+
+\def\pgfsys@animation@base{}
+% Think of this command as setting the value of the attribute in the
+% timeline before the timeline starts. Normally, an animation only
+% influences the timeline while the animation is running (which may be
+% forever) and before and after the animation is running, the
+% attribute's value is not modified by the animation (so, it is just
+% inherited from the surrounding scope). When a base value is set,
+% while the animation is not running, this value is used. For most
+% attributes you can achieve the same effect by surrounding the
+% to-be-animated object by a scope and setting the value there, but
+% using bases is often more convenient and, for instance for the
+% visibility attribute, it is necessary to use a base.
+%
+% Note that when a backend driver does not support animations, base
+% values will not be depicted unless a snapshot is used explicitly.
+
+\def\pgfsys@animation@offset#1#2{}
+% #1 must be a value in seconds, #2 is the target "begin" or "end" to
+% which this offset is appended.
+
+\def\pgfsys@animation@syncbegin#1#2#3#4{}
+% #1 is the id of a sync base (obtained by
+% \pgfsys@new@id), #2 is the id type (or empty), #3 is an optional
+% offset, #4 is the target.
+
+\def\pgfsys@animation@syncend#1#2#3#4{}
+% Like the previous command.
+
+\def\pgfsys@animation@event#1#2#3#4#5{}
+% #1 is the optional id of another element (obtained by
+% \pgfsys@new@id), #2 is the optional type of the id, #3 is an event
+% name, #4 is an optional offset, #5 is the target.
+
+\def\pgfsys@animation@repeat@event#1#2#3#4#5{}
+% #1 is the optional id of another element, #2 is the type, #3 is a
+% repeat count, and #4 is an optional offset, #5 is the target.
+
+\def\pgfsys@animation@accesskey#1#2#3{}
+% #1 is a character, #2 is an optional offset, #3 is the target.
+
+\def\pgf@sys@begin@text{begin}
+
+
+% Accumulation
+
+\def\pgfsys@animation@accumulate{}
+% Corresponds to accumulate="sum" in SVG
+
+\def\pgfsys@animation@noaccumulate{}
+% Corresponds to accumulate="none" in SVG
+
+
+% Targeting
+
+\def\pgfsys@animation@whom#1#2{}
+% Sets the target of the animation. #1 must be an id previously
+% created using \pgfsys@new@id and #2 must be empty or a type
+% previously created using \pgfsys@new@id@type
+
+
+% Attribute definitions
+
+\def\pgfsys@animation@rotatealong{}
+% Applicable only to motion animations. Indicates that the
+% to-be-animated group should be rotated automatically so that it
+% points along the path as time progresses.
+
+\def\pgfsys@animation@norotatealong{}
+% Corresponds to rotate="0"
+
+\def\pgfsys@animation@movealong#1{}
+% Applicable only to motion animations. #1 is a softpath along which
+% the movement will be done.
+
+\def\pgfsys@animation@tip@markers#1#2{}
+% Applicable only to path animations. #1 and #2 are markers (declared
+% using \pgfsys@marker@declare) that store marker symbols to be added
+% at the start and at the end of the to-be-animated path. If empty, no
+% markers are added.
+
+\def\pgfsys@animation@canvas@transform#1#2{}
+% #1 is some code that may call \pgfsys@transformcm at most once. It
+% will be executed when a canvas transformation animation is
+% installed for a scope id. #2 is some further codes that may also
+% call \pgfsys@transformcm at most once. It will be installed right
+% after the animation.
+%
+% Typically, #1 is some pgf coordinate shift followed by
+% {\pgflowlevelsynccm} and #2 is \pgftransforminvert followed by
+% \pgflowlevelsynccm.
+
+
+
+% Values
+
+\def\pgfsys@animation@val@current{}
+% The current value of the attribute. At least with SVG, this can only
+% be used for the first value and, then, only if there is only one
+% other value.
+
+\def\pgfsys@animation@val@text#1{}
+% #1 should be some text.
+
+\def\pgfsys@animation@val@scalar#1{}
+% #1 should be a single value.
+
+\def\pgfsys@animation@val@dimension#1{}
+% #1 must be a dimension.
+
+\def\pgfsys@animation@val@color@rgb#1#2#3{}
+% #1,#2,#3 must be an rgb tuple
+
+\def\pgfsys@animation@val@color@cmyk#1#2#3#4{}
+% #1,#2,#3,#4 must be an cmyk tuple
+
+\def\pgfsys@animation@val@color@cmy#1#2#3{}
+% #1,#2,#3 must be an cmy tuple
+
+\def\pgfsys@animation@val@color@gray#1{}
+% #1 must be a gray value
+
+\def\pgfsys@animation@val@path#1{}
+% #1 must consist of path-construction tokens (as returned by the
+% softpath layer)
+
+\def\pgfsys@animation@val@translate#1#2{}
+% #1,#2 must be dimensions
+
+\def\pgfsys@animation@val@scale#1#2{}
+% #1,#2 must be dimensionless
+
+\def\pgfsys@animation@val@viewbox#1#2#3#4{}
+% #1,#2 describe the lower left, #3,#4 the upper right corner of the
+% view box.
+
+\def\pgfsys@animation@val@dash#1#2{}
+% #1,#2 have the syntax of \pgfsys@setdash.
+
+
+
+%
+%
+% Markers
+%
+%
+
+\def\pgfsys@marker@declare#1#2{%
+ {%
+ \pgfpicturetrue%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@marker@temp%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsys@beginscope%
+ #2%
+ \pgfsys@endscope%
+ \xdef#1{\the\pgf@sys@id@count}%
+ \expandafter\expandafter\expandafter\global\expandafter\pgfsysprotocol@getcurrentprotocol\csname pgf@sys@marker@prot@#1\endcsname%
+ \pgfsys@marker@declare@% curtesy hook
+ \pgfsysprotocol@setcurrentprotocol\pgfsys@marker@temp%
+ \global\advance\pgf@sys@id@count by1\relax%
+ }%
+}
+\let\pgfsys@marker@declare@\relax
+% Declares a new marker symbol whose code is in #2. #1 should be a
+% macro name, which will be set to a unique
+% value by which the marker can be referenced later on. #2 should be
+% code that, when executed, produces recordable code.
+
+\def\pgfsys@marker@use#1{%
+ \pgfsysprotocol@literal{\csname pgf@sys@marker@prot@#1\endcsname}%
+}
+% Draws the marker symbol not at the end of a path, but simply with
+% the current transformation matrix
+
+
+
+
+
+
+%
+%
+% RDF
+%
+%
+
+\def\pgfsys@rdf@about#1{\pgf@sys@fail{rdf}}
+% Adds the rdf attribute "about" with value #1 to the next
+% idscope. The RDF-spec says: "a SafeCURIEorCURIEorIRI, used for
+% stating what the data is about (a 'subject' in RDF terminology);"
+
+\def\pgfsys@rdf@content#1{\pgf@sys@fail{rdf}}
+% Adds the rdf attribute content with value #1 to the next
+% idscope. The RDF-spec says: "a CDATA string, for supplying
+% machine-readable content for a literal (a 'literal object', in RDF
+% terminology);"
+
+\def\pgfsys@rdf@datatype#1{\pgf@sys@fail{rdf}}
+% Adds the rdf attribute datatype with value #1 to the next
+% idscope. The RDF-spec says: "a TERMorCURIEorAbsIRI representing a
+% datatype, to express the datatype of a literal;"
+
+\def\pgfsys@rdf@href#1{\pgf@sys@fail{rdf}}
+% Adds the rdf attribute href with value #1 to the next idscope
+% The RDF-spec says: "a traditionally navigable IRI for
+% expressing the partner resource of a relationship (a 'resource
+% object', in RDF terminology);"
+
+\def\pgfsys@rdf@inlist{\pgf@sys@fail{rdf}}
+% Adds the rdf attribute inlist to the next idscope. The
+% RDF-spec says: "An attribute used to indicate that the object
+% associated with a rel or property attribute on the same element is
+% to be added to the list for that predicate. The value of this
+% attribute must be ignored. Presence of this attribute causes a list
+% to be created if it does not already exist."
+
+\def\pgfsys@rdf@prefix#1{\pgf@sys@fail{rdf}}
+% Adds #1 to the list of the rdf prefix attribute to the next
+% idscope. Can be called several times, in which case all values of #1
+% are concatenated with whitespaces. The RDF-spec says: "a white space
+% separated list of prefix-name IRI pairs of the form NCName ':' ' '+
+% xsd:anyURI"
+
+\def\pgfsys@rdf@property#1{\pgf@sys@fail{rdf}}
+% Adds #1 to the list of the rdf property attribute to the next
+% idscope. Can be called repeatedly. The RDF-spec says: "a white space
+% separated list of TERMorCURIEorAbsIRIs, used for expressing
+% relationships between a subject and either a resource object if
+% given or some literal text (also a 'predicate');"
+
+\def\pgfsys@rdf@rel#1{\pgf@sys@fail{rdf}}
+% Adds #1 to the list of the rdf rel attribute to the next
+% next idscope. Can be called repeatedly. The
+% RDF-spec says: "a white space separated list of
+% TERMorCURIEorAbsIRIs, used for expressing relationships between two
+% resources ('predicates' in RDF terminology);"
+
+\def\pgfsys@rdf@resource#1{\pgf@sys@fail{rdf}}
+% Adds the rdf attribute resource with value #1 to the next idscope. The
+% RDF-spec says: "a SafeCURIEorCURIEorIRI for expressing the partner
+% resource of a relationship that is not intended to be navigable
+% (e.g., a 'clickable' link) (also an 'object');"
+
+\def\pgfsys@rdf@rev#1{\pgf@sys@fail{rdf}}
+% Adds #1 to the list of the rdf rev attribute to the next
+% idscope. Can be called repeatedly. The
+% RDF-spec says: "a white space separated list of
+% TERMorCURIEorAbsIRIs, used for expressing reverse relationships
+% between two resources (also 'predicates');
+
+\def\pgfsys@rdf@src#1{\pgf@sys@fail{rdf}}
+% Adds an rdf attribute src with value #1 to the next idscope. The
+% RDF-spec says: "an IRI for expressing the partner resource of a
+% relationship when the resource is embedded (also a 'resource
+% object');"
+
+\def\pgfsys@rdf@typeof#1{\pgf@sys@fail{rdf}}
+% Adds #1 to the list of the rdf typeof attribute to the next
+% idscope. Can be called repeatedly. The
+% RDF-spec says: "a white space separated list of TERMorCURIEorAbsIRIs
+% that indicate the RDF type(s) to associate with a subject;"
+
+\def\pgfsys@rdf@vocab#1{\pgf@sys@fail{rdf}}
+% Adds an rdf attribute vocab with value #1 to the next idscope. The
+% RDF-spec says: "an IRI that defines the mapping to use when a TERM
+% is referenced in an attribute value. See General Use of Terms in
+% Attributes and the section on Vocabulary Expansion."
+
+
+
+%
+%
+% Page size stuff
+%
+%
+
+\def\pgfsys@papersize#1#2{\pgf@sys@fail{papersize}}
+% This command sets the paper size in a portable way. It tries to do
+% so "locally" for the current page, but what really happens depends
+% strongly on the driver. For instance, dvips will use whatever is
+% used with the first call to this command that is part of the
+% shipped-out document and will ignore all other uses. In contrast,
+% pdftex will use the current value of the papersize for each page
+% and, additionally, setting the papersize is local to the current TeX
+% group.
+% #1 = width
+% #2 = height
+
+\def\pgfsys@global@papersize#1#2{\pgfsys@papersize{#1}{#2}}
+% This command does the same as the papersize command, only for
+% drivers that support this, \global is used to set the papersize.
+% #1 = width
+% #2 = height
+
+\def\pgfsys@prepare@papersize#1#2{\pgfsys@papersize{#1}{#2}}
+% Like \pgfsys@papersize, this prepares the paper size in a portable
+% way -- but it is supposed to be a preparation step before the
+% document has started. Drivers may decide to postpone the action
+% until the document has started.
+%
+% The root cause why I added this method is that image externalization
+% seems to suffer from the fact that some drivers need a "prepared"
+% routine whereas others must not have a prepared routine and have to
+% apply the action right-away. This method is the solution for image
+% externalization.
+% #1 = width
+% #2 = height
+
+\ifx\paperheight\@undefined
+ \def\pgfsys@thepageheight{\the\vsize} % this is wrong, but I do not
+ % know how to compute the page height
+ % in plain tex.
+ \def\pgfsys@thepagewidth{\the\hsize}
+\else
+ \def\pgfsys@thepageheight{\paperheight}
+ \def\pgfsys@thepagewidth{\paperwidth}
+\fi
+
+
+%
+%
+% Position tracking commands
+%
+%
+
+% Marks the current position on the page. This position can later be
+% referenced using \pgfsys@getposition
+\def\pgfsys@markposition#1{\pgf@sys@fail{marking the current position}}
+
+% Sets #2 to a pgfpoint macro that returns the position #1 is
+% returned in a coordinate system where the x-axis goes right and the
+% y-axis goes up. The origin of this coordinate system may or may not
+% lie in the lower left corner; you should shift the coordinate system
+% to the position "pgfpageorigin" to make sure that the origin is at
+% the lower left corner. Typically, getting this position
+% requires two runs of TeX. On the first run, the macro will be set to
+% \relax, indicating that the position is not available.
+%
+% If #1 is set to the special position "pgfpageorigin", the position
+% of the the lower left page corner is returned.
+
+\def\pgfsys@getposition#1#2{\let#2=\relax}
+
+
+
+%
+%
+% Commands having a default implementation. These commands only need
+% not be implemented by drivers if this results in a better
+% performance.
+%
+%
+
+
+\def\pgfsys@shadingoutsidepgfpicture#1{%
+ #1%
+}
+% This command gets the definition of a shading (@pgfshadingxxxx!) as
+% an argument and should insert this shading into the normal text.
+%
+% This command has a default implementation.
+
+
+\def\pgfsys@shadinginsidepgfpicture#1{%
+ \pgf@makehbox{#1}%
+ \setbox\pgf@hbox=\hbox{\hskip-.5\wd\pgf@hbox\lower.5\ht\pgf@hbox\hbox{\box\pgf@hbox}}%
+ \pgfqbox{\pgf@hbox}%
+}
+% This command works like \pgfsys@shadingoutsidepgfpicture, only it is
+% called when a shading should be inserted inside a picture. This
+% command should insert the shading centered on the origin (which will
+% typically have been low-level translated somewhere else.)
+%
+% This command has a default implementation.
+
+
+\def\pgfsys@hbox#1{%
+ \pgfsys@begin@idscope%
+ \pgfsys@beginscope%
+ \setbox#1=\hbox{\box#1}%
+ \wd#1=0pt%
+ \ht#1=0pt%
+ \dp#1=0pt%
+ \box#1%
+ \pgfsys@endscope%
+ \pgfsys@end@idscope%
+}
+% Called to insert a TeX hbox into a pgfpicture.
+
+\def\pgfsys@hboxsynced#1{%
+ \pgfsys@beginscope\pgflowlevelsynccm\pgfsys@hbox#1\pgfsys@endscope%
+}%
+% Called to insert box #1 into a pgfpicture, but with the current
+% coordinate transformation matrix synced with the canvas
+% transformation matrix and surrounded by a scope.
+%
+% In essence, this command does the same as if you first said
+% \pgflowlevelsynccm and then \pgfsys@hbox#1. However, a
+% ``TeX-translation'' is used for the translation part of the
+% transformation cm. This will ensure that hyperlinks ``survive'' at
+% least translations.
+
+\def\pgfsys@pictureboxsynced#1{%
+ {%
+ \setbox0=\hbox{\pgfsys@beginpicture\box#1\pgfsys@endpicture}%
+ \pgfsys@hboxsynced0%
+ }%
+}
+% Basically, this should do the same as doing a (scoped) low level sync
+% followed by inserting the box #1 directly into the output
+% stream. However, the default implementation uses \pgfsys@hboxsynced
+% in conjunction with \pgfsys@beginpicture to ensure that, if
+% possible, hyperlinks survive in pdfs. Drivers that are sensitive to
+% picture-in-picture scopes should replace this implementation by
+% \pgfsys@beginscope\pgflowlevelsynccm\box#1\pgfsys@endscope
+
+\def\pgfsys@beginpicture{}
+% Called at the beginning of a pgfpicture. Used to setup things.
+
+\def\pgfsys@endpicture{}
+% Called at the end of a pgfpicture.
+
+\def\pgfsys@typesetpicturebox#1{%
+ \pgf@ya=\pgf@shift@baseline\relax%
+ \advance\pgf@ya by-\pgf@picminy\relax%
+ %
+ %
+ \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height
+ \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width
+ \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}%
+ \ht#1=\pgf@picmaxy%
+ \wd#1=\pgf@picmaxx%
+ \dp#1=0pt%
+ \leavevmode%
+ \pgf@xa=\pgf@trimleft@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi
+ \raise-\pgf@ya\box#1%
+ \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi
+}
+% Called after a picture has been typeset in box #1. This
+% command should insert the box into the normal TeX code. The box #1
+% will still be a ``raw'' box that contains only the \special's. The
+% job of this command is to resize and shift this box according to the
+% baseline shift and the size of the box.
+%
+% This command has a default implementation.
+
+\def\pgfsys@beginpurepicture{\pgfsys@beginpicture}
+% This version of the beginpicture command can be used for pictures
+% that are guaranteed not to contain any hboxes. In this case, a
+% driver might provide a more compact version of the command.
+
+\def\pgfsys@endpurepicture{\pgfsys@endpicture}
+% Called at the end of a ``pure'' pgfpicture.
+
+\def\pgfsys@defineimage{%
+ \ifx\pgf@imagewidth\pgfutil@empty\else\edef\pgf@imagewidth{width=\pgf@imagewidth,}\fi%
+ \ifx\pgf@imageheight\pgfutil@empty\else\edef\pgf@imageheight{height=\pgf@imageheight,}\fi%
+ \ifx\pgf@imagepage\pgfutil@empty\else\edef\pgf@imagepage{page=\pgf@imagepage,}\fi%
+ \edef\pgf@image{\noexpand\includegraphics[\pgf@imageheight\pgf@imagewidth]{\pgf@filename}}%
+}
+% Called, when an image should be defined.
+%
+% This command does not take any parameters. Instead, certain macros
+% will be preinstalled with appropriate values when this command is
+% invoked. These are:
+%
+% - \pgf@filename
+% File name of the image to be defined.
+%
+% - \pgf@imagewidth
+% Will be set to the desired (scaled) width of the image.
+%
+% - \pgf@imageheight
+% Will be set to the desired (scaled) height of the image.
+%
+% If this macro and also the height macro are empty, the image
+% should have its `natural' size.
+%
+% If exactly only of them is specified, the undefined value the
+% image is scaled so that the aspect ratio is kept.
+%
+% If both are set, the image is scaled in both directions
+% independently, possibly changing the aspect ratio.
+%
+%
+% The following macros presumable mostly make sense for drivers that
+% can handle pdf:
+%
+% - \pgf@imagepage
+% The desired page number to be extracted from a multi-page
+% `image'.
+%
+% - \pgf@imagemask
+% If set, it will be set to `/SMask x 0 R', where x is the pdf
+% object number of a soft mask to be applied to the image.
+%
+% - \pgf@imageinterpolate
+% If set, it will be set to `/Interpolate true' or `/Interpolate
+% false', indicating whether the image should be interpolated in
+% pdf.
+%
+%
+% The command should now setup the macro \pgf@image such that calling
+% this macro will result in typesetting the image. Thus, \pgf@image is
+% the `return value' of the command.
+
+
+\def\pgfsys@defobject#1#2#3#4{%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
+ {%
+ \pgfpicturetrue%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsys@beginscope%
+ #4%
+ \pgfsys@endscope%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@@temp%
+ \expandafter\global\expandafter\let\csname #1\endcsname=\pgfsys@@temp%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfsys@temp%
+}
+% Declares an object for later use. The idea is that the object can be
+% precached in some way and then be rendered more quickly when used
+% several times. For example, an arrow head might be defined and
+% prerendered in this way.
+%
+% The parameter #1 is the name for later use. #2 and #3 are pgf points
+% specifying a bounding box for the object. #4 is the code for the
+% object. The code may only contain protocolable code.
+
+
+\def\pgfsys@useobject#1#2{%
+ \pgfsysprotocol@getcurrentprotocol\pgfsys@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedfalse%
+ #2%
+ \expandafter\pgfsysprotocol@setcurrentprotocol\csname #1\endcsname%
+ \pgfsysprotocol@invokecurrentprotocol%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfsys@temp%
+}
+% Renders a previously declared object. The first parameter is the
+% name of the object. The second parameter is extra code that
+% should be executed right *before* the object is rendered. Typically,
+% this will be some transformation code.
+
+
+\def\pgfsys@begininvisible{\pgfsys@transformcm{1}{0}{0}{1}{2000bp}{2000bp}}
+% Between this command and the closing endinvisible, all output should
+% be suppressed. Nothing should be drawn at all, which includes all
+% paths, images and shadings. This command typically should not open a
+% graphic scope.
+
+\def\pgfsys@endinvisible{\pgfsys@transformcm{1}{0}{0}{1}{-2000bp}{-2000bp}}
+% Ends the invisibility section, unless invisibility blocks have been
+% nested. In this case, only the `last' one restores visibility.
+
+\def\pgfsys@begininvisiblescope{\pgfsys@beginscope\pgfsys@begininvisible}
+% Works like pgfsys@begininvisible, but it may open a graphics scope.
+
+\def\pgfsys@endinvisiblescope{\pgfsys@endinvisible\pgfsys@endscope}
+% Closes the invisibility scope.
+
+
+\def\pgfsys@atbegindocument{}
+% This command will be executed at the begin of the document. If for
+% whatever reason this is not done, you may wish to execute this
+% command yourself. It will setup certain specials that need to be
+% inserted into the resulting .pdf/.ps/.xxx file.
+
+
+
+
+
+% Discern the driver:
+
+% Default driver:
+\ifx\pgfsysdriver\@undefined
+ \pgfutil@guessdriver
+\fi
+
+\input pgf.cfg
+
+\immediate\write-1{Driver file for pgf: \pgfsysdriver}
+\pgfutil@InputIfFileExists{\pgfsysdriver}{}{%
+ \pgferror{Driver file ``\pgfsysdriver'' not found.}}
+
+
+
+% This will insert always-present-specials at the beginning of the
+% code.
+\AtBeginDocument{
+ \pgfsys@atbegindocument
+ \let\pgfsys@atbegindocument=\pgfutil@empty
+}
+
+
+
+% Read aux file in plain and context mode:
+
+\pgfutil@aux@read@hook
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsys.sty b/graphics/pgf/base/tex/pgfsys.sty
new file mode 100644
index 0000000000..6f9c2b8b93
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys.sty
@@ -0,0 +1,20 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\RequirePackage{pgfrcs}
+
+\DeclareOption{dvisvgm}{\def\pgfsysdriver{pgfsys-dvisvgm.def}}
+
+\ProcessOptions
+
+\input{pgfsys.code.tex}
+\input{pgfsyssoftpath.code.tex}
+\input{pgfsysprotocol.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsys.tex b/graphics/pgf/base/tex/pgfsys.tex
new file mode 100644
index 0000000000..1ca8bba358
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsys.tex
@@ -0,0 +1,28 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+% This file is pgfsys.tex
+
+\ifx\pgfsysincluded\undefined
+\def\pgfsysincluded{}
+
+\edef\pgfsysatcode{\the\catcode`\@}
+\catcode`\@=11
+
+\input pgfrcs.tex
+
+\input pgfsys.code.tex
+\input pgfsyssoftpath.code.tex
+\input pgfsysprotocol.code.tex
+
+\catcode`\@=\pgfsysatcode\relax
+
+\fi
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsysanimations.code.tex b/graphics/pgf/base/tex/pgfsysanimations.code.tex
new file mode 100644
index 0000000000..06bd9934bf
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsysanimations.code.tex
@@ -0,0 +1,2009 @@
+% Copyright 2016 by Till Tantau
+%
+% 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.
+
+
+
+% Guard against reading twice
+\ifx\pgfsysanimationsloaded\pgfutil@undefined
+ \let\pgfsysanimationsloaded=\relax
+\else
+ \expandafter\endinput
+\fi
+
+
+% We need some support:
+\usepgfmodule{decorations}
+
+
+% Animation abstraction layer
+%
+% This layer provides an abstraction of the
+% \pgfsys@anim... commands. The idea is to provide an interface that
+% can map animation commands either to "real" animations (for instance
+% in the sense of SVG) or to "snapshots" of animations, which are
+% especially useful for printing. For these snapshots, instead of
+% adding an animation property to a scope, the property is actually
+% set to a certain value computed by \TeX.
+%
+% For each \pgfsys@animation@... command there is a corresponding
+% \pgfsysanim command.
+
+
+% Set the current time to a snapshot time
+%
+% #1 = a global snapshot time (a dimensionless number, measured in
+% seconds).
+%
+% Description:
+%
+% When this command is used in a scope, instead of creating an
+% animation, pgf will insert appropriate commands that show the state
+% of the animation at the given time.
+%
+% The value #1 can be thought of as the "global time", which can be
+% thought of as the time that elapsed since the "onload" event.
+%
+% The command \pgfsysanimsnapshotafter works the same way as
+% pgfsysanimsnapshot, only the time #1 is interpreted as "global time
+% #1 + epsilon". This means that when two or more values are specified
+% for time #1, the last of them is used rather than the
+% first. Likewise, when a non-freezing timeline ends at time #1,
+% \pgfsysanimsnapshot will set the value to the last value in the
+% timeline, while \pgfsysanimsnapshotafter removes the animation.
+%
+% The following commands and effect for animations are ignored / not
+% implemented for snapshots (meaning that even if the "real" animation
+% would look in a certain way because of one of the following commands
+% or effects, the snapshot will not reflect this):
+%
+% - Events and restarts are ignored. For the snapshot, all animations
+% start at global time 0, except if the command
+% \pgfsysanimkeysnapshotstart is used to specify a different
+% start for a specific animation.
+% - The "current value" as starting value (pgf has no real chance of
+% determining the correct value of this). Using this with a snapshot
+% will raise an error.
+%
+% Example:
+%
+% {
+% \pgfsyssnapshot{2}%
+% \pgfsysanimkeytime{0}{1}{1}{0}{0}
+% \pgfsysanimvalscalar{1}
+% \pgfsysanimkeytime{5}{1}{1}{0}{0}
+% \pgfsysanimvalscalar{0}
+% \pgfsysanimkeywhom{\someid}{}
+% \pgfsysanimate{fillopacity}%
+% % Will set the opacity of \someid to 0.6
+% }
+
+\def\pgfsysanimsnapshot#1{%
+ \def\pgfsysanim@snaptime{#1}%
+ \pgfsysanim@snap@firsttrue%
+ \pgfsysanim@is@snaptrue%
+}
+\def\pgfsysanimsnapshotafter#1{%
+ \def\pgfsysanim@snaptime{#1}%
+ \pgfsysanim@snap@firstfalse%
+ \pgfsysanim@is@snaptrue%
+}
+\newif\ifpgfsysanim@is@snap
+\newif\ifpgfsysanim@snap@first
+
+
+
+% Companion for \pgfsys@animate
+%
+% #1 = attribute
+%
+% Description:
+%
+% If not snapshot is set, \pgfsys@animate is simply called. Otherwise,
+% appropriate code is generated that sets the specified attribute of
+% the whom object to the value it would have during the animation at
+% the moment of the snapshot.
+
+\def\pgfsysanimate#1{%
+ \csname pgfsysanim@checks@#1\endcsname%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@do@snap{#1}%
+ \else%
+ \pgfsys@animate{#1}%
+ \fi%
+}
+
+\def\pgfsysanim@do@snap#1{%
+ {%
+ \expandafter\ifx\csname pgfsysanim@prep@attr@#1\endcsname\pgfutil@undefined%
+ \else%
+ % First, compute time frame:
+ \pgfsysanim@compute@interval%
+ % Second, compute code:
+ \let\pgfsysanim@code@begin\relax%
+ \let\pgfsysanim@code@end\pgfutil@empty%
+ \csname pgfsysanim@prep@attr@#1\endcsname%
+ \ifx\pgfsysanim@code@begin\relax%
+ \else%
+ % Attach to object:
+ \expandafter\expandafter\expandafter\pgfsysanim@call@attacher%
+ \expandafter\expandafter\expandafter{\expandafter\pgfsysanim@code@begin\expandafter}\expandafter{\pgfsysanim@code@end}{}%
+ \fi%
+ \fi%
+ }%
+}
+\def\pgfsysanim@call@attacher{\pgfsys@attach@to@id{\pgfsysanim@whom@id}{\pgfsysanim@whom@type}}
+
+
+% Do some checks:
+\def\pgfsysanim@checks@path{%
+ \expandafter\global\expandafter\let\csname pgfsysanim@path@is@animated@\pgfsysanim@whom@id @\pgfsysanim@whom@type\endcsname\pgfutil@empty%
+}
+
+
+% Companions for \pgfsys@animation@restart@...
+%
+% Description:
+%
+% These commands just call \pgfsys@animation@restart@... and they are
+% *ignored* when it comes to snapshots.
+
+\def\pgfsysanimkeyrestartalways{\pgfsys@animation@restart@always}
+\def\pgfsysanimkeyrestartnever{\pgfsys@animation@restart@never}
+\def\pgfsysanimkeyrestartwhennotactive{\pgfsys@animation@restart@whennotactive}
+
+
+
+% Companions for \pgfsys@animation@repeat...
+%
+% Description:
+%
+% These commands call \pgfsys@animation@repeat... and, if there is a
+% snapshot installed, the passed values are taken into consideration.
+
+\def\pgfsysanimkeyrepeat#1{%
+ \pgfsys@animation@repeat{#1}%
+ % Snapshot
+ \let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@normal%
+ {%
+ \pgf@x#1pt\relax%
+ \expandafter}%
+ \expandafter\def\expandafter\pgfsysanim@snap@repeat@arg\expandafter{\the\pgf@x}%
+}
+\def\pgfsysanimkeyrepeatindefinite{%
+ \pgfsys@animation@repeat@indefinite%
+ % Snapshot
+ \let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@indefinite%
+ \let\pgfsysanim@snap@repeat@arg\pgfutil@empty%
+}
+\def\pgfsysanimkeyrepeatdur#1{%
+ \pgfsys@animation@repeat@dur{#1}%
+ % Snapshot
+ \let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@dur%
+ {%
+ \pgf@x#1pt\relax%
+ \expandafter}%
+ \expandafter\def\expandafter\pgfsysanim@snap@repeat@arg\expandafter{\the\pgf@x}%
+}
+\def\pgfsysanim@snap@repeat@none{n}%
+\def\pgfsysanim@snap@repeat@normal{m}%
+\def\pgfsysanim@snap@repeat@indefinite{i}%
+\def\pgfsysanim@snap@repeat@dur{d}%
+\let\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@none
+\let\pgfsysanim@snap@repeat@arg\pgfutil@empty
+
+
+
+% Companions for \pgfsys@animation@freezeatend and
+% \pgfsys@animation@removeatend
+%
+% Description:
+%
+% These commands call the two system commands and, if there is a
+% snapshot installed, the settings are taken into consideration.
+
+\def\pgfsysanimkeyfreezeatend{\pgfsys@animation@freezeatend\pgfsysanim@freezeatendtrue}
+\def\pgfsysanimkeyremoveatend{\pgfsys@animation@removeatend\pgfsysanim@freezeatendfalse}
+\newif\ifpgfsysanim@freezeatend
+
+
+
+% Companion for \pgfsys@animation@time
+%
+% #1 to #5 = as in \pgfsys@animation@time
+%
+% Description:
+%
+% Calls \pgfsys@animation@time. Furthermore, the specified times are
+% recorded so that they can later be analysed for the computation
+% needed for a snapshot.
+
+\def\pgfsysanimkeytime#1#2#3#4#5{%
+ % Setup animation
+ \pgfsys@animation@time{#1}{#2}{#3}{#4}{#5}%
+ % and remember for snapshots
+ \def\pgfsysanim@time{{#1}{#2}{#3}{#4}{#5}}%
+}
+
+
+% Sets the base value
+%
+% Description:
+%
+% This will set the "base" value for an animation, which is installed
+% prior to any animation of the attribute.
+
+\def\pgfsysanimkeybase{%
+ \pgfsys@animation@base%
+ \let\pgfsysanim@time\pgfsysanim@base@text%
+}
+\def\pgfsysanim@base@text{base}%
+
+% Sets the beginning of the timeline for snapshots
+%
+% #1 = a time (a scalar)
+%
+% Description:
+%
+% Sets the start of current animation to #1 for snapshots. For
+% instance, if #1 is 5 (=five seconds), and you say
+% \pgfsysanimsnapshot{6}, the attribute will be set to whatever the
+% animation specifies after one second.
+
+\def\pgfsysanimkeysnapshotstart#1{%
+ \def\pgfsysanim@snapshotstart{#1}%
+}
+\def\pgfsysanim@snapshotstart{0}
+
+
+% Companion for \pgfsys@animation@offset
+%
+% #1, #2 = as in \pgfsys@animation@offset
+%
+% Description:
+%
+% Calls \pgfsys@animation@offset.
+
+\def\pgfsysanimkeyoffset#1#2{%
+ \pgfsys@animation@offset{#1}{#2}%
+}
+
+
+% Companion for \pgfsys@animation@sync(begin|end)
+%
+% #1 to #4 = as in \pgfsys@animation@sync(begin|end)
+%
+% Description:
+%
+% Calls \pgfsys@animation@sync(begin|end).
+
+\def\pgfsysanimkeysyncbegin#1#2#3#4{%
+ \pgfsys@animation@syncbegin{#1}{#2}{#3}{#4}%
+}
+
+\def\pgfsysanimkeysyncend#1#2#3#4{%
+ \pgfsys@animation@syncend{#1}{#2}{#3}{#4}%
+}
+
+
+% Companion for \pgfsys@animation@event
+%
+% #1 to #5 = as in \pgfsys@animation@event
+%
+% Description:
+%
+% Calls \pgfsys@animation@event.
+
+\def\pgfsysanimkeyevent#1#2#3#4#5{%
+ \pgfsys@animation@event{#1}{#2}{#3}{#4}{#5}%
+}
+
+
+% Companion for \pgfsys@animation@repeat@event
+%
+% #1 to #5 = as in \pgfsys@animation@repeat@event
+%
+% Description:
+%
+% Calls \pgfsys@animation@repeat@event.
+
+\def\pgfsysanimkeyrepeatevent#1#2#3#4#5{%
+ \pgfsys@animation@repeat@event{#1}{#2}{#3}{#4}{#5}%
+}
+
+
+
+% Companion for \pgfsys@animation@accesskey
+%
+% #1 to #3 = as in \pgfsys@animation@accesskey
+%
+% Description:
+%
+% Calls \pgfsys@animation@accesskey.
+
+\def\pgfsysanimkeyaccesskey#1#2#3{%
+ \pgfsys@animation@accesskey{#1}{#2}{#3}%
+}
+
+
+
+
+% Companions for \pgfsys@animation@(no)accumulate
+%
+% Description:
+%
+% Calls \pgfsys@animaion@(no)accumulate and records the setting for
+% snapshots.
+
+\def\pgfsysanimkeyaccumulate{\pgfsys@animation@accumulate\pgfsysanim@accumulatetrue}
+\def\pgfsysanimkeynoaccumulate{\pgfsys@animation@noaccumulate\pgfsysanim@accumulatefalse}
+\newif\ifpgfsysanim@accumulate
+
+
+
+
+% Companion for \pgfsys@animation@whom
+%
+% #1 and #2 = as for \pgfsys@animation@whom
+%
+% Description:
+%
+% Calls \pgfsys@animation@whom and records the setting for snapshots.
+
+\def\pgfsysanimkeywhom#1#2{%
+ \pgfsys@register@type{#2}%
+ \pgfsys@animation@whom{#1}{#2}%
+ % Snapshots
+ \def\pgfsysanim@whom@id{#1}%
+ \def\pgfsysanim@whom@type{#2}%
+}
+
+
+
+
+
+% Companions for \pgfsys@animation@rotatealong and
+% \pgfsys@animation@norotatealong
+%
+% Description:
+%
+% Calls the system layer command and records the setting for
+% snapshots.
+
+\def\pgfsysanimkeyrotatealong{\pgfsys@animation@rotatealong\pgfsysanim@rotatealongtrue}
+\def\pgfsysanimkeynorotatealong{\pgfsys@animation@norotatealong\pgfsysanim@rotatealongfalse}
+\newif\ifpgfsysanim@rotatealong
+
+
+% Companion for \pgfsys@animation@movealong
+%
+% #1 = the path
+%
+% Description:
+%
+% Calls the system layer command and records the setting for
+% snapshots.
+
+\def\pgfsysanimkeymovealong#1{%
+ \pgfsys@animation@movealong{#1}%
+ % Snapshot
+ \def\pgfsysanim@snap@movealong{#1}%
+}
+
+
+
+
+% Companion for \pgfsys@animation@tip@markers
+%
+% #1, #2 = the markers
+%
+% Description:
+%
+% Calls the system layer command and records the setting for
+% snapshots.
+
+\def\pgfsysanimkeytipmarkers#1#2{%
+ \pgfsys@animation@tip@markers{#1}{#2}%
+ % Snapshot
+ \def\pgfsysanim@snap@tip@start{#1}%
+ \def\pgfsysanim@snap@tip@end{#2}%
+}
+\let\pgfsysanim@snap@tip@start\pgfutil@empty%
+\let\pgfsysanim@snap@tip@end\pgfutil@empty%
+
+
+% Companion for \pgfsys@animation@canvas@transform
+%
+% Description:
+%
+% Calls the system layer command and records the setting for
+% snapshots.
+
+\def\pgfsysanimkeycanvastransform#1#2{%
+ \pgfsys@animation@canvas@transform{#1}{#2}%
+ % Snapshot
+ \def\pgfsysanim@snap@canvas@transform@pre{#1}%
+ \def\pgfsysanim@snap@canvas@transform@post{#2}%
+}
+\let\pgfsysanim@snap@canvas@transform@pre\relax
+\let\pgfsysanim@snap@canvas@transform@post\relax
+
+
+
+% Companion for \pgfsys@animation@val@current
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% an error results.
+
+\def\pgfsysanimvalcurrent{%
+ \pgfsys@animation@val@current%
+ \ifpgfsysanim@is@snap%
+ \pgferror{You may not use "current value" with an animation snapshot}%
+ \fi%
+}
+
+
+% Suppresses the animation value
+%
+% Description:
+%
+% The animation value is simply ignored.
+
+\def\pgfsysanimvalnone{%
+}
+
+
+
+% Companion for \pgfsys@animation@val@text
+%
+% #1 = as for \pgfsys@animation@val@text
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvaltext#1{%
+ \pgfsys@animation@val@text{#1}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{#1}%
+ \fi%
+}
+
+
+
+
+% Companion for \pgfsys@animation@val@scalar
+%
+% #1 = as for \pgfsys@animation@val@scalar
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalscalar#1{%
+ \pgfsys@animation@val@scalar{#1}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{#1}%
+ \fi%
+}
+
+
+
+% Companion for \pgfsys@animation@val@dimension
+%
+% #1 = as for \pgfsys@animation@val@dimension
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvaldimension#1{%
+ \pgfsys@animation@val@dimension{#1}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{#1}%
+ \fi%
+}
+
+
+
+% Dispatcher for different color values
+%
+% #1 = a color value (like "red" or "black!20")
+%
+% Description:
+%
+% This macro transforms #1 into its correct color model and, then,
+% calls the correct \pgfsysanimcolor... macro.
+
+\def\pgfsysanimvalcolor#1{%
+ \pgfutil@colorlet{pgf@anim@temp}{#1}%
+ \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@anim@temp}}%
+ \expandafter\let\expandafter\pgf@sys@temp\csname\string\color@pgf@anim@temp\endcsname
+ \expandafter\pgfanim@parse@type@color@\pgf@sys@temp%
+}
+\def\pgfanim@parse@type@color@#1#2#3#4#5{%
+ \expandafter\ifx\csname pgfsysanimvalcolor#4\endcsname\relax%
+ \pgferror{Unsupported color model `#4'}%
+ \else%
+ \edef\pgf@sys@colmarshal{\expandafter\noexpand\csname pgfsysanimvalcolor#4\endcsname}%
+ \pgf@sys@uncomma#5,,%
+ \pgf@sys@colmarshal%
+ \fi%
+}
+
+\def\pgf@sys@uncomma#1,{%
+ \def\pgf@sys@coltest{#1}%
+ \ifx\pgf@sys@coltest\pgfutil@empty%
+ \else%
+ \expandafter\def\expandafter\pgf@sys@colmarshal\expandafter{\pgf@sys@colmarshal{#1}}%
+ \expandafter\pgf@sys@uncomma%
+ \fi%
+}
+
+
+
+
+% Companion for \pgfsys@animation@val@color@rgb
+%
+% #1, #2, #3 = as for \pgfsys@animation@val@color@rgb
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalcolorrgb#1#2#3{%
+ \pgfsys@animation@val@color@rgb{#1}{#2}{#3}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{{#1}{#2}{#3}}%
+ \fi%
+}
+
+
+
+% Companion for \pgfsys@animation@val@color@cmyk
+%
+% #1, #2, #3, #4 = as for \pgfsys@animation@val@color@cmyk
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalcolorcmyk#1#2#3#4{%
+ \pgfsys@animation@val@color@cmyk{#1}{#2}{#3}{#4}%
+ \ifpgfsysanim@is@snap%
+ {%
+ \pgf@xa=1pt%
+ \advance\pgf@xa by-#1pt%
+ \advance\pgf@xa by-#4pt\relax%
+ \ifdim\pgf@xa<0pt\pgf@xa0pt\fi%
+ \pgf@xb=1pt%
+ \advance\pgf@xb by-#1pt%
+ \advance\pgf@xb by-#4pt\relax%
+ \ifdim\pgf@xb<0pt\pgf@xb0pt\fi%
+ \pgf@xc=1pt%
+ \advance\pgf@xc by-#1pt%
+ \advance\pgf@xc by-#4pt\relax%
+ \ifdim\pgf@xc<0pt\pgf@xc0pt\fi%
+ \edef\pgfsys@temp{{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xc}}%
+ \expandafter}%
+ \expandafter\pgfsysanim@esnap@record\expandafter{\pgfsys@temp}%
+ \fi%
+}
+
+
+% Companion for \pgfsys@animation@val@color@cmy
+%
+% #1, #2, #3 = as for \pgfsys@animation@val@color@cmy
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalcolorcmy#1#2#3{%
+ \pgfsys@animation@val@color@cmy{#1}{#2}{#3}%
+ \ifpgfsysanim@is@snap%
+ {%
+ \pgf@xa=1pt%
+ \advance\pgf@xa by-#1pt%
+ \pgf@xb=1pt%
+ \advance\pgf@xb by-#1pt%
+ \pgf@xc=1pt%
+ \advance\pgf@xc by-#1pt%
+ \edef\pgfsys@temp{{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xc}}%
+ \expandafter}%
+ \expandafter\pgfsysanim@esnap@record\expandafter{\pgfsys@temp}%
+ \fi%
+}
+
+
+
+% Companion for \pgfsys@animation@val@color@gray
+%
+% #1 = as for \pgfsys@animation@val@color@gray
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalcolorgray#1{%
+ \pgfsys@animation@val@color@gray{#1}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{{#1}{#1}{#1}}%
+ \fi%
+}
+
+
+
+% Special companion for \pgfsys@animation@val@path
+%
+% #1 = as for \pgfsys@animation@val@path
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalpath#1{%
+ \pgfsys@animation@val@path{#1}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@snap@record{#1}%
+ \fi%
+}
+
+
+% Companion for \pgfsys@animation@val@translate
+%
+% #1, #2 = as for \pgfsys@animation@val@translate
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvaltranslate#1#2{%
+ \pgfsys@animation@val@translate{#1}{#2}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{{#1}{#2}}%
+ \fi%
+}
+
+
+
+% Companion for \pgfsys@animation@val@scale
+%
+% #1, #2 = as for \pgfsys@animation@val@scale
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalscale#1#2{%
+ \pgfsys@animation@val@scale{#1}{#2}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{{#1}{#2}}%
+ \fi%
+}
+
+
+
+% Companion for \pgfsys@animation@val@viewbox
+%
+% #1, #2, #3, #4 = as for \pgfsys@animation@val@viewbox
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvalviewbox#1#2#3#4{%
+ \pgfsys@animation@val@viewbox{#1}{#2}{#3}{#4}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{{#1}{#2}{#3}{#4}}%
+ \fi%
+}
+
+
+
+
+% Companion for \pgfsys@animation@val@dash
+%
+% #1, #2 = as for \pgfsys@animation@val@dash
+%
+% Description:
+%
+% Calls the system layer command. If a snapshot is currently active,
+% the value is recorded in the timeline.
+
+\def\pgfsysanimvaldash#1#2{%
+ \pgfsys@animation@val@dash{#1}{#2}%
+ \ifpgfsysanim@is@snap%
+ \pgfsysanim@esnap@record{{#1}{#2}}%
+ \fi%
+}
+
+
+
+
+
+%
+% Recording mechanism: We record entries in an array.
+%
+
+\def\pgfsysanim@esnap@record#1{% records a new entry for the timeline
+ \edef\pgfsysanim@temp{#1}%
+ \expandafter\pgfsysanim@snap@record\expandafter{\pgfsysanim@temp}%
+}
+\def\pgfsysanim@snap@record#1{% records a new entry for the timeline
+ \ifx\pgfsysanim@time\pgfsysanim@base@text%
+ \def\pgfsysanim@base@value{#1}%
+ \else%
+ \advance\pgfsysanim@snap@count by1\relax%
+ \expandafter\def\expandafter\pgfsysanim@temp\expandafter{\pgfsysanim@time{#1}}%
+ \expandafter\let\csname pgfsysanim@snap@\the\pgfsysanim@snap@count\endcsname\pgfsysanim@temp%
+ \fi%
+}
+\newcount\pgfsysanim@snap@count
+\let\pgfsysanim@base@value\pgfutil@empty%
+
+
+% Compute the time-value interval of the snapshot: Based on the value of \pgfsysanim@snaptime,
+% computes the interval containing the specified time. This interval
+% will start at \pgfsysanim@prev@time and end at
+% \pgfsysanim@next@time. The values will be \pgfsysanim@prev@val and
+% \pgfsysanim@next@val.
+%
+\def\pgfsysanim@compute@interval{%
+ \let\pgfsysanim@prev@val\relax%
+ \let\pgfsysanim@prev@time\relax%
+ \let\pgfsysanim@prev@spline\pgfsysanim@default@spline%
+ \let\pgfsysanim@next@val\relax%
+ \let\pgfsysanim@next@time\relax%
+ \let\pgfsysanim@next@spline\pgfsysanim@default@spline%
+ \let\pgfsysanim@first@time\relax%
+ \let\pgfsysanim@last@time\relax%
+ \let\pgfsysanim@last@val\relax%
+ \ifnum\pgfsysanim@snap@count>0\relax%
+ \pgf@xc\pgfsysanim@snaptime pt\relax%
+ \pgf@x\pgfsysanim@snapshotstart pt\relax%
+ \advance\pgf@xc-\pgf@x\relax%
+ % Compute the start and end times:
+ \pgfsysanim@compute@start@end%
+ \pgfsysanim@compute@value%
+ \fi%
+ % Test whether a valid interval has been found:
+ \pgfsysanim@valid@snapshot@timefalse%
+ \ifx\pgfsysanim@prev@time\relax%
+ \else\ifx\pgfsysanim@next@time\relax%
+ \else\pgfsysanim@valid@snapshot@timetrue%
+ \fi\fi%
+ \ifpgfsysanim@valid@snapshot@time%
+ % ok, computed later
+ \else%
+ \ifx\pgfsysanim@base@value\pgfutil@empty%
+ \else%
+ % Ah, use base value!
+ \let\pgfsysanim@prev@val\pgfsysanim@base@value%
+ \def\pgfsysanim@prev@time{0}%
+ \let\pgfsysanim@prev@spline\pgfsysanim@default@spline%
+ \let\pgfsysanim@next@val\pgfsysanim@base@value%
+ \let\pgfsysanim@next@time\pgfsysanim@prev@time%
+ \let\pgfsysanim@next@spline\pgfsysanim@default@spline%
+ \def\pgfsysanim@first@time{-16382}%
+ \let\pgfsysanim@last@time\pgfsysanim@prev@time%
+ \let\pgfsysanim@last@val\pgfsysanim@base@value%
+ \def\pgfsysanim@frac@a{1}%
+ \def\pgfsysanim@frac@b{0}%
+ \pgfsysanim@valid@snapshot@timetrue% counts as valid!
+ \fi%
+ \fi%
+}
+\newif\ifpgfsysanim@cont%
+\newif\ifpgfsysanim@valid@snapshot@time
+\def\pgfsysanim@default@spline{{0}{0}{1}{1}}
+
+\def\pgfsysanim@compute@start@end{%
+ \expandafter\expandafter\expandafter\pgfsysanim@compute@start\csname pgfsysanim@snap@1\endcsname%
+ \expandafter\expandafter\expandafter\pgfsysanim@compute@end\csname pgfsysanim@snap@\the\pgfsysanim@snap@count\endcsname%
+}
+\def\pgfsysanim@compute@start#1#2#3#4#5#6{%
+ \def\pgfsysanim@first@time{#1}%
+}
+\def\pgfsysanim@compute@end#1#2#3#4#5#6{%
+ \def\pgfsysanim@last@time{#1}%
+ \def\pgfsysanim@last@val{#6}%
+}
+
+
+\def\pgfsysanim@compute@value{%
+ % First, are we before start?
+ \ifdim\pgf@xc<\pgfsysanim@first@time pt\relax%
+ % snapshot time (xc) is before start of animation. So, nothing happens:
+ \else%
+ \ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@none%
+ \pgfsysanim@handle@repeat@none%
+ \else\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@normal%
+ \pgfsysanim@handle@repeat@normal%
+ \else\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@indefinite%
+ \pgfsysanim@handle@repeat@indefinite%
+ \else\ifx\pgfsysanim@snap@repeat@kind\pgfsysanim@snap@repeat@dur%
+ \pgfsysanim@handle@repeat@dur%
+ \fi\fi\fi\fi%
+ \fi%
+}
+
+\def\pgfsysanim@handle@repeat@none{%
+ \ifdim\pgf@xc<\pgfsysanim@last@time pt\relax%
+ \pgfsysanim@compute@time%
+ \else%
+ \ifdim\pgf@xc=\pgfsysanim@last@time pt\relax%
+ % A bit tricky:
+ \ifpgfsysanim@snap@first%
+ \pgfsysanim@compute@time%
+ \else%
+ \ifpgfsysanim@freezeatend%
+ \let\pgfsysanim@prev@val\pgfsysanim@last@val%
+ \let\pgfsysanim@prev@time\pgfsysanim@last@time%
+ \let\pgfsysanim@next@val\pgfsysanim@last@val%
+ \let\pgfsysanim@next@time\pgfsysanim@last@time%
+ \fi%
+ \fi%
+ \else%
+ % Called when we are past the end.
+ \ifpgfsysanim@freezeatend%
+ \let\pgfsysanim@prev@val\pgfsysanim@last@val%
+ \let\pgfsysanim@prev@time\pgfsysanim@last@time%
+ \let\pgfsysanim@next@val\pgfsysanim@last@val%
+ \let\pgfsysanim@next@time\pgfsysanim@last@time%
+ \fi%
+ \fi%
+ \fi%
+}
+
+
+\def\pgfsysanim@handle@repeat@indefinite{%
+ \ifdim\pgf@xc<\pgfsysanim@last@time pt\relax%
+ \pgfsysanim@compute@time%
+ \else%
+ % Compute interval length
+ \pgf@xa=\pgfsysanim@last@time pt%
+ \pgf@xb=\pgfsysanim@first@time pt%
+ \advance\pgf@xa by-\pgf@xb%
+ % Compute repeat count and fraction:
+ \pgf@ya\pgf@xc%
+ \advance\pgf@ya by-\pgf@xb%
+ \ifdim\pgf@xa<0.01pt\relax%
+ % Interval too small: Goto end of interval
+ \def\pgfmathresult{1.0}%
+ \else%
+ \pgfmathdivide@{\pgf@ya}{\pgf@xa}%
+ \fi%
+ \pgf@x\pgfmathresult pt\relax%
+ \expandafter\pgfsysanim@splitter\the\pgf@x%
+ \pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
+ \advance\pgf@xc by\pgf@xb%
+ \pgfsysanim@compute@time%
+ \fi%
+}
+{\catcode`\p=12\catcode`\t=12\gdef\Pgfsysanim@sPliTTer#1.#2pt{\Pgfsysanim@seTTer{#1}{#2}}}
+\let\pgfsysanim@splitter\Pgfsysanim@sPliTTer
+\def\Pgfsysanim@seTTer#1#2{%
+ \def\pgfsysanim@repeat@decimal{#1}%
+ \def\pgfsysanim@repeat@frac{.#2}%
+ \ifdim\pgfsysanim@repeat@frac pt=0pt% goto one before:
+ \c@pgf@counta\pgfsysanim@repeat@decimal%
+ \advance\c@pgf@counta by-1\relax%
+ \edef\pgfsysanim@repeat@decimal{\the\c@pgf@counta}%
+ \def\pgfsysanim@repeat@frac{1}%
+ \fi%
+}
+\def\pgfsysanim@repeat@decimal{0}%
+
+
+\def\pgfsysanim@handle@repeat@normal{%
+ % Compute interval length
+ \pgf@xa=\pgfsysanim@last@time pt%
+ \pgf@xb=\pgfsysanim@first@time pt%
+ \advance\pgf@xa by-\pgf@xb%
+ % Compute repeat count and fraction:
+ \pgf@ya\pgf@xc%
+ \advance\pgf@ya by-\pgf@xb%
+ \ifdim\pgf@xa<0.01pt\relax%
+ % Interval too small: Goto end of interval
+ \def\pgfmathresult{1.0}%
+ \else%
+ \pgfmathdivide@{\pgf@ya}{\pgf@xa}%
+ \fi%
+ \pgf@x\pgfmathresult pt\relax%
+ \expandafter\pgfsysanim@splitter\the\pgf@x%
+ % Cases:
+ \ifdim\pgfmathresult pt<\pgfsysanim@snap@repeat@arg\relax%
+ % Ok! Compute!
+ \pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
+ \advance\pgf@xc by\pgf@xb%
+ \pgfsysanim@compute@time%
+ \else%
+ % Hmm. Freeze?
+ \ifpgfsysanim@freezeatend%
+ \expandafter\pgfsysanim@splitter\pgfsysanim@snap@repeat@arg%
+ \pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
+ \advance\pgf@xc by\pgf@xb%
+ \pgfsysanim@compute@time%
+ \else%
+ \ifdim\pgfmathresult pt=\pgfsysanim@snap@repeat@arg\relax%
+ \ifpgfsysanim@snap@first%
+ \expandafter\pgfsysanim@splitter\pgfsysanim@snap@repeat@arg%
+ \pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
+ \advance\pgf@xc by\pgf@xb%
+ \pgfsysanim@compute@time%
+ \fi%
+ % else: nothing!
+ \fi%
+ \fi%
+ \fi%
+}
+
+\def\pgfsysanim@handle@repeat@dur{%
+ \pgf@yb=\pgfsysanim@first@time pt%
+ \advance\pgf@yb by\pgfsysanim@snap@repeat@arg\relax%
+ \ifdim\pgf@xc<\pgf@yb% inside interval
+ \pgf@xa=\pgfsysanim@last@time pt%
+ \pgf@xb=\pgfsysanim@first@time pt%
+ \advance\pgf@xa by-\pgf@xb%
+ % Compute repeat count and fraction:
+ \pgf@ya\pgf@xc%
+ \advance\pgf@ya by-\pgf@xb%
+ \ifdim\pgf@xa<0.01pt\relax%
+ % Interval too small: Goto end of interval
+ \def\pgfmathresult{1.0}%
+ \else%
+ \pgfmathdivide@{\pgf@ya}{\pgf@xa}%
+ \fi%
+ \pgf@x\pgfmathresult pt\relax%
+ \expandafter\pgfsysanim@splitter\the\pgf@x%
+ %
+ \pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
+ \advance\pgf@xc by\pgf@xb%
+ \pgfsysanim@compute@time%
+ \else%
+ \ifpgfsysanim@freezeatend%
+ \pgfsysanim@handle@repeat@dur@freeze%
+ \else%
+ \ifdim\pgf@xc=\pgf@yb%
+ \ifpgfsysanim@snap@first%
+ \pgfsysanim@handle@repeat@dur@freeze%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+}
+
+\def\pgfsysanim@handle@repeat@dur@freeze{%
+ \pgf@xa=\pgfsysanim@last@time pt%
+ \pgf@xb=\pgfsysanim@first@time pt%
+ \advance\pgf@xa by-\pgf@xb%
+ % Compute repeat count and fraction:
+ \ifdim\pgf@xa<0.01pt\relax%
+ % Interval too small: Goto end of interval
+ \def\pgfmathresult{1.0}%
+ \else%
+ \pgfmathdivide@{\pgfsysanim@snap@repeat@arg}{\pgf@xa}%
+ \fi%
+ \pgf@x\pgfmathresult pt\relax%
+ \expandafter\pgfsysanim@splitter\the\pgf@x%
+ %
+ \pgf@xc=\pgfsysanim@repeat@frac\pgf@xa%
+ \advance\pgf@xc by\pgf@xb%
+ \pgfsysanim@compute@time%
+}
+
+
+
+
+
+\def\pgfsysanim@compute@time{%
+ % Ok, let us iterate over all points of time.
+ \pgfutil@tempcnta=1\relax%
+ \pgfsysanim@conttrue%
+ \pgfutil@loop%
+ \ifnum\pgfutil@tempcnta>\pgfsysanim@snap@count%
+ \pgfsysanim@contfalse%
+ \else%
+ \expandafter\let\expandafter\pgfsys@temp\csname pgfsysanim@snap@\the\pgfutil@tempcnta\endcsname%
+ \expandafter\pgfsysanim@test@time\pgfsys@temp%
+ \fi%
+ \ifpgfsysanim@cont%
+ \advance\pgfutil@tempcnta by1\relax%
+ \pgfutil@repeat%
+}
+
+
+\def\pgfsysanim@test@time#1#2#3#4#5#6{%
+ % #1 = time in seconds
+ % #2 to #5 = spline controls
+ % #6 = value
+ \ifdim#1pt<\pgf@xc%
+ % snap time not yet reached. Update previous:
+ \def\pgfsysanim@prev@val{#6}%
+ \def\pgfsysanim@prev@time{#1}%
+ \def\pgfsysanim@prev@spline{{#2}{#3}{#4}{#5}}%
+ \else%
+ \ifdim#1pt=\pgf@xc%
+ \ifpgfsysanim@snap@first%
+ \ifx\pgfsysanim@next@val\relax%
+ % first? Save!
+ \def\pgfsysanim@prev@val{#6}%
+ \def\pgfsysanim@prev@time{#1}%
+ \def\pgfsysanim@prev@spline{{#2}{#3}{#4}{#5}}%
+ \let\pgfsysanim@next@val\pgfsysanim@prev@val%
+ \let\pgfsysanim@next@time\pgfsysanim@prev@time%
+ \let\pgfsysanim@next@spline\pgfsysanim@prev@spline%
+ \pgfsysanim@contfalse%
+ % else, do nothing
+ \fi
+ \else%
+ % always overwrite:
+ \def\pgfsysanim@prev@val{#6}%
+ \def\pgfsysanim@prev@time{#1}%
+ \def\pgfsysanim@prev@spline{{#2}{#3}{#4}{#5}}%
+ \let\pgfsysanim@next@val\pgfsysanim@prev@val%
+ \let\pgfsysanim@next@time\pgfsysanim@prev@time%
+ \let\pgfsysanim@next@spline\pgfsysanim@prev@spline%
+ \fi%
+ \else%
+ % we passed the time!
+ \ifx\pgfsysanim@next@val\relax%
+ % first? Then save!
+ \def\pgfsysanim@next@val{#6}%
+ \def\pgfsysanim@next@time{#1}%
+ \def\pgfsysanim@next@spline{{#2}{#3}{#4}{#5}}%
+ \else%
+ % ignore later times!
+ \pgfsysanim@contfalse%
+ \fi%
+ \fi%
+ \fi%
+}
+
+\let\pgfsysanim@prev@val\relax%
+\let\pgfsysanim@prev@time\relax%
+\let\pgfsysanim@next@val\relax%
+\let\pgfsysanim@next@time\relax%
+
+% Help function
+\def\pgfsysanim@attach#1#2#3{%
+ \expandafter\pgfsysanim@prep@beg\expandafter{\pgfsysanim@first@time}{#2}{#3}%
+ \expandafter\def\expandafter\pgfsysanim@code@main\expandafter{\csname pgfsysanim@main@of@\pgfsysanim@whom@id @\pgfsysanim@whom@type @#1\endcsname}%
+ \expandafter\ifx\pgfsysanim@code@main\relax%
+ \edef\pgfsysanim@code@begin{%
+ \let\noexpand\pgfsysanim@c@begin\noexpand\pgfutil@empty%
+ \let\noexpand\pgfsysanim@c@end\noexpand\pgfutil@empty%
+ \pgfsysanim@lasttime-16383pt\relax%
+ \expandafter\noexpand\pgfsysanim@code@main%
+ \global\let\expandafter\noexpand\pgfsysanim@code@main\relax%
+ \noexpand\pgfsysanim@c@begin%
+ }%
+ \let\pgfsysanim@code@end\pgfsysanim@code@closer%
+ \expandafter\global\expandafter\let\pgfsysanim@code@main\pgfutil@empty%
+ \else%
+ \let\pgfsysanim@code@begin\relax%
+ \let\pgfsysanim@code@end\relax%
+ \fi%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfsysanim@new@main%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@code@main\pgfsysanim@add@main}
+ \expandafter\global\expandafter\let\pgfsysanim@code@main\pgfsysanim@new@main%
+}
+\def\pgfsysanim@code@closer{\pgfsysanim@c@end}
+
+\def\pgfsysanim@prep@beg#1#2#3{%
+ \edef\pgfsysanim@add@main{%
+ \noexpand\ifdim\pgfsysanim@lasttime>#1pt%
+ % ignore!
+ \noexpand\else%
+ \pgfsysanim@lasttime#1pt%
+ \def\noexpand\pgfsysanim@c@begin{#2}%
+ \def\noexpand\pgfsysanim@c@end{#3}%
+ \noexpand\fi%
+ }
+}
+
+\def\pgfsysanim@prep@beg@special#1#2{%
+ \def\pgfsysanim@add@main{%
+ \ifdim\pgfsysanim@lasttime>#1pt%
+ % ignore!
+ \else%
+ \pgfsysanim@lasttime#1pt%
+ \def\pgfsysanim@c@begin{#2}%
+ \fi%
+ }
+}
+
+
+
+\def\pgfsysanim@attach@special#1#2{%
+ \expandafter\expandafter\expandafter\pgfsysanim@prep@beg@special\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@first@time\expandafter}\expandafter{#2}%
+ \ifx#1\relax%
+ \def#1{%
+ \pgfsysanim@lasttime-16383pt\relax%
+ \let\pgfsysanim@c@begin\pgfutil@empty%
+ }%
+ \fi%
+ \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{\expandafter#1\pgfsysanim@add@main}%
+}
+
+
+
+\newdimen\pgfsysanim@lasttime
+
+
+\def\pgfsysanim@add@trans{%
+ \ifx\pgfsysanim@snap@canvas@transform@pre\relax%
+ \else%
+ \ifx\pgfsysanim@code@begin\relax%
+ \let\pgfsysanim@code@begin\pgfutil@empty%
+ \fi%
+ \pgfsysanim@add@trans@%
+ \fi%
+}
+\def\pgfsysanim@add@trans@{%
+ \toks0\expandafter{\pgfsysanim@snap@canvas@transform@pre}%
+ \toks1\expandafter{\pgfsysanim@code@begin}%
+ \toks2\expandafter{\pgfsysanim@snap@canvas@transform@post}%
+ \edef\pgfsysanim@code@begin{{\the\toks0 \the\toks1 \the\toks2}}%
+}
+
+% The code for the different attributes
+
+\def\pgfsysanim@prep@attr@opacity{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scalar%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
+ \pgfsysanim@attach{opacity}{\noexpand\pgfsys@opacity{\pgfsysanim@x@val}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@fillopacity{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scalar%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
+ \pgfsysanim@attach{fillopacity}{\noexpand\pgfsys@fill@opacity{\pgfsysanim@x@val}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@strokeopacity{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scalar%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
+ \pgfsysanim@attach{strokeopacity}{\noexpand\pgfsys@stroke@opacity{\pgfsysanim@x@val}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@visibility{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@text%
+ \ifx\pgfsysanim@text@val\pgf@hidden@text%
+ \pgfsysanim@attach{visibility}{\noexpand\pgfsys@begininvisiblescope}{\noexpand\pgfsys@endinvisiblescope}%
+ \else%
+ \pgfsysanim@attach{visibility}{}{}%
+ \fi%
+ \fi%
+}
+\def\pgf@hidden@text{hidden}
+
+\def\pgfsysanim@prep@attr@linewidth{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@dimension%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{16382}%
+ \pgfsysanim@attach{linewidth}{\noexpand\pgfsys@setlinewidth{\pgfsysanim@x@val pt}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@dash{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@dash%
+ \pgfsysanim@attach{dash}{\noexpand\pgfsys@setdash{\pgfsysanim@dash@vals}{\pgfsysanim@x@val pt}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@translate{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@translate%
+ \edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformshift{\pgfsysanim@x@val pt}{\pgfsysanim@y@val pt}}%
+ \fi%
+ \pgfsysanim@add@trans%
+}
+
+
+\def\pgfsysanim@prep@attr@scale{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scale%
+ \edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformxyscale{\pgfsysanim@x@val}{\pgfsysanim@y@val}}%
+ \fi%
+ \pgfsysanim@add@trans%
+}
+
+\def\pgfsysanim@prep@attr@rotate{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scalar%
+ {%
+ \pgfmathsin@{\pgfsysanim@x@val}%
+ \let\pgftransform@sin=\pgfmathresult%
+ \pgfmathcos@{\pgfsysanim@x@val}%
+ \let\pgftransform@cos=\pgfmathresult%
+ \pgf@x=\pgftransform@sin pt%
+ \pgf@xa=-\pgf@x%
+ \edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformcm{\pgftransform@cos}{\pgftransform@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgftransform@cos}{0pt}{0pt}}%
+ \expandafter}%
+ \expandafter\def\expandafter\pgfsysanim@code@begin\expandafter{\pgfsysanim@code@begin}%
+ \fi%
+ \pgfsysanim@add@trans%
+}
+
+\def\pgfsysanim@prep@attr@skewx{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scalar%
+ {%
+ \pgfmathtan@{\pgfsysanim@x@val}%
+ \edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformcm{1}{0}{\pgfmathresult}{1}{0pt}{0pt}}%
+ \expandafter}%
+ \expandafter\def\expandafter\pgfsysanim@code@begin\expandafter{\pgfsysanim@code@begin}%
+ \fi%
+ \pgfsysanim@add@trans%
+}
+
+\def\pgfsysanim@prep@attr@skewy{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@scalar%
+ {%
+ \pgfmathtan@{\pgfsysanim@x@val}%
+ \edef\pgfsysanim@code@begin{\noexpand\pgfsys@transformcm{1}{\pgfmathresult}{0}{1}{0pt}{0pt}}%
+ \expandafter}%
+ \expandafter\def\expandafter\pgfsysanim@code@begin\expandafter{\pgfsysanim@code@begin}%
+ \fi%
+ \pgfsysanim@add@trans%
+}
+
+\def\pgfsysanim@prep@attr@motion{%
+ \ifx\pgfsysanim@base@value\pgfutil@empty%
+ \else%
+ \pgferror{You may not provide a base value for a motion}%
+ \let\pgfsysanim@base@value\pgfutil@empty%
+ \fi%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@motion%
+ \expandafter\pgfsysanim@prep@attr@motion@\pgfsysanim@motion@trans%
+ \fi%
+ \pgfsysanim@add@trans%
+}
+\def\pgfsysanim@prep@attr@motion@#1#2#3#4#5#6{%
+ \ifpgfsysanim@rotatealong%
+ \def\pgfsysanim@code@begin{\pgfsys@transformcm{#1}{#2}{#3}{#4}{#5}{#6}}%
+ \else%
+ \def\pgfsysanim@code@begin{\pgfsys@transformshift{#5}{#6}}%
+ \fi%
+}
+
+
+\def\pgfsysanim@prep@attr@strokecolor{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@color%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
+ \pgfsysanim@cap@scalar{\pgfsysanim@y@val}{0}{1}%
+ \pgfsysanim@cap@scalar{\pgfsysanim@z@val}{0}{1}%
+ \pgfsysanim@attach{strokecolor}{\noexpand\pgfsys@color@rgb@stroke{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@fillcolor{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@color%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
+ \pgfsysanim@cap@scalar{\pgfsysanim@y@val}{0}{1}%
+ \pgfsysanim@cap@scalar{\pgfsysanim@z@val}{0}{1}%
+ \pgfsysanim@attach{fillcolor}{\noexpand\pgfsys@color@rgb@fill{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}}{}%
+ \fi%
+}
+
+\def\pgfsysanim@prep@attr@color{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@color%
+ \pgfsysanim@cap@scalar{\pgfsysanim@x@val}{0}{1}%
+ \pgfsysanim@cap@scalar{\pgfsysanim@y@val}{0}{1}%
+ \pgfsysanim@cap@scalar{\pgfsysanim@z@val}{0}{1}%
+ \pgfsysanim@attach{color}{\noexpand\pgfsys@color@rgb{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}}{}%
+ \fi%
+}
+
+\newif\ifpgfsys@animation@view@hooked
+
+\def\pgfsysanim@prep@attr@viewbox{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@viewbox%
+ \pgfsys@attach@to@id{\pgfsysanim@whom@id}{}{%
+ \ifpgfsys@animation@view@hooked%
+ \else%
+ % Hook into viewbox systems layer commands
+ \let\pgfsys@viewboxmeet@orig\pgfsys@viewboxmeet%
+ \let\pgfsys@viewboxmeet\pgfsysanim@hooked@viewboxmeet%
+ \let\pgfsys@viewboxslice@orig\pgfsys@viewboxslice%
+ \let\pgfsys@viewboxslice\pgfsysanim@hooked@viewboxslice%
+ \pgfsys@animation@view@hookedtrue%
+ \fi%
+ }{}{}%
+ \edef\pgfsysanim@temp{{\pgfsysanim@x@val}{\pgfsysanim@y@val}{\pgfsysanim@z@val}{\pgfsysanim@w@val}}%
+ \expandafter\pgfsysanim@attach@special\csname pgfsysanim@hook@for@\pgfsys@id@ref{\pgfsysanim@whom@id}{\pgfsysanim@whom@type}\endcsname\pgfsysanim@temp%
+ \fi%
+}
+\def\pgfsysanim@hooked@viewboxmeet#1#2#3#4#5#6#7#8{%
+ \expandafter\ifx\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
+ \pgfsys@viewboxmeet@orig{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ \else%
+ \csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname%
+ \ifx\pgfsysanim@c@begin\pgfutil@empty%
+ % should not happen, but, then, ignore
+ \else%
+ \expandafter\pgfsysanim@hooked@viewboxmeet@\pgfsysanim@c@begin{#1}{#2}{#3}{#4}%
+ \fi%
+ \expandafter\global\expandafter\let\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
+ \fi%
+}
+\def\pgfsysanim@hooked@viewboxmeet@#1#2#3#4#5#6#7#8{%
+ \pgfsys@viewboxmeet@orig{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
+}
+\def\pgfsysanim@hooked@viewboxslice#1#2#3#4#5#6#7#8{%
+ \expandafter\ifx\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
+ \pgfsys@viewboxslice@orig{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ \else%
+ \csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname%
+ \expandafter\pgfsysanim@hooked@viewboxslice@\pgfsysanim@c@begin{#1}{#2}{#3}{#4}%
+ \expandafter\global\expandafter\let\csname pgfsysanim@hook@for@\pgfsys@id@refcurrent\endcsname\relax%
+ \fi%
+}
+\def\pgfsysanim@hooked@viewboxslice@#1#2#3#4#5#6#7#8{%
+ \pgfsys@viewboxslice@orig{#5}{#6}{#7}{#8}{#1}{#2}{#3}{#4}%
+}
+
+
+\newif\ifpgfsys@animation@path@hooked
+
+\def\pgfsysanim@prep@attr@path{%
+ \ifpgfsysanim@valid@snapshot@time%
+ \pgfsysanim@comp@path%
+ \pgfsys@attach@to@id{\pgfsysanim@whom@id}{}{%
+ \ifpgfsys@animation@path@hooked%
+ \else%
+ % Hook into path systems layer commands
+ \let\pgfsys@discardpath@orig\pgfsys@discardpath%
+ \let\pgfsys@stroke@orig\pgfsys@stroke%
+ \let\pgfsys@fill@orig\pgfsys@fill%
+ \let\pgfsys@fillstroke@orig\pgfsys@fillstroke%
+ \let\pgfsys@closestroke@orig\pgfsys@closestroke%
+ \let\pgfsys@discardpath\pgfsys@discardpath@hook%
+ \let\pgfsys@stroke\pgfsys@stroke@hook%
+ \let\pgfsys@fill\pgfsys@fill@hook%
+ \let\pgfsys@fillstroke\pgfsys@fillstroke@hook%
+ \let\pgfsys@closestroke\pgfsys@closestroke@hook%
+ \pgfsys@animation@path@hookedtrue%
+ \fi%
+ }{}{}%
+ \expandafter\pgfsysanim@attach@special\csname pgfsysanim@phook@for@\pgfsys@id@ref{\pgfsysanim@whom@id}{\pgfsysanim@whom@type}\endcsname\pgfsysanim@path@all%
+ \fi%
+}
+\def\pgfsys@stroke@hook{\pgfsysanim@with@tipstrue\pgfsysanim@path@hooks\pgfsys@stroke@orig}
+\def\pgfsys@fill@hook{\pgfsysanim@with@tipsfalse\pgfsysanim@path@hooks\pgfsys@fill@orig}
+\def\pgfsys@fillstroke@hook{\pgfsysanim@with@tipstrue\pgfsysanim@path@hooks\pgfsys@fillstroke@orig}
+\def\pgfsys@closestroke@hook{\pgfsysanim@with@tipsfalse\pgfsysanim@path@hooks\pgfsys@closestroke@orig}
+\def\pgfsys@discardpath@hook{\pgfsysanim@with@tipsfalse\pgfsysanim@path@hooks\pgfsys@discardpath@orig}
+
+\newif\ifpgfsysanim@with@tips
+
+\def\pgfsysanim@path@hooks#1{%
+ {%
+ \expandafter\ifx\csname pgfsysanim@phook@for@\pgfsys@id@refcurrent\endcsname\relax%
+ #1%
+ \else%
+ \pgfsys@discardpath@orig%
+ \csname pgfsysanim@phook@for@\pgfsys@id@refcurrent\endcsname%
+ \pgfsysanim@c@begin%
+ \pgfsysanim@path@val%
+ #1%
+ \ifpgfsysanim@with@tips%
+ \ifx\pgfsysanim@path@val\pgfutil@empty\else%
+ \pgfsysanim@prepare@end@of@path%
+ \begingroup%
+ \pgfsysanim@prepare@start@of@path%
+ \pgfsysanim@add@marker@at@start%
+ \endgroup%
+ \pgfsysanim@add@marker@at@end%
+ \fi%
+ \fi%
+ \expandafter\global\expandafter\let\csname pgfsysanim@phook@for@\pgfsys@id@refcurrent\endcsname\relax%
+ \fi%
+ }%
+}
+
+
+\def\pgfsysanim@prepare@start@of@path{%
+ \ifx\pgfsysanim@snap@tip@start\pgfutil@empty\else
+ %
+ % Step 1: Split
+ %
+ \ifx\pgfprocessresultpathsuffix\relax%
+ % Ok, still need to compute the split:
+ \pgfprocesssplitpath{\pgf@arrowpath}%
+ \fi%
+ %
+ % Step 2: extract
+ %
+ \expandafter\pgf@parse@start\pgfprocessresultpathsuffix\pgf@stop\pgf@stop\pgf@stop%
+ %
+ % Step 3: prep
+ %
+ \pgf@prep@start%
+ \fi%
+}
+\def\pgfsysanim@add@marker@at@start{%
+ \ifx\pgfsysanim@snap@tip@start\pgfutil@empty\else
+ %
+ % Step 4: draw
+ %
+ {%
+ \pgftransformreset%
+ \pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgfsys@beginscope%
+ \pgflowlevelsynccm%
+ \pgfsys@marker@use{\pgfsysanim@snap@tip@start}%
+ \pgfsys@endscope%
+ }%
+ \fi%
+}
+
+
+\def\pgfsysanim@prepare@end@of@path{%
+ \let\pgfprocessresultpathsuffix\relax% flag that nothing has happened...
+ \let\pgfprocessresultsubpathsuffix\relax%
+ \pgf@precise@shorteningfalse%
+ \edef\pgf@path@shortening@distance{0pt}%
+ \ifx\pgfsysanim@snap@tip@end\pgfutil@empty\else
+ %
+ % Step 1: Split
+ %
+ \pgfprocesssplitpath{\pgfsysanim@path@val}%
+ \pgfprocesssplitsubpath{\pgfprocessresultpathsuffix}%
+ %
+ % Step 2: extract
+ %
+ \expandafter\pgf@parse@end\pgfprocessresultsubpathsuffix\pgf@stop\pgf@stop\pgf@stop%
+ %
+ % Step 3: prep
+ %
+ \pgf@prep@end%
+ \fi%
+}
+\def\pgfsysanim@add@marker@at@end{%
+ \ifx\pgfsysanim@snap@tip@end\pgfutil@empty\else
+ %
+ % Step 4: draw
+ %
+ {%
+ \pgftransformreset%
+ \pgftransformarrow{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgfsys@beginscope%
+ \pgflowlevelsynccm%
+ \pgfsys@marker@use{\pgfsysanim@snap@tip@end}%
+ \pgfsys@endscope%
+ }%
+ \fi%
+}
+
+
+
+%
+% Interpolation functions
+%
+
+% Scalar interpolation
+
+\def\pgfsysanim@comp@scalar{%
+ \pgfsysanim@compute@fractions%
+ \pgfsysanim@mix@scalar%
+ \ifpgfsysanim@accumulate%
+ \ifnum\pgfsysanim@repeat@decimal=0\else%
+ \let\pgfsysanim@frac@b\pgfsysanim@one%
+ \let\pgfsysanim@prev@val\pgfsysanim@x@val%
+ \let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
+ \let\pgfsysanim@next@val\pgfsysanim@last@val%
+ \pgfsysanim@mix@scalar%
+ \fi%
+ \fi%
+}
+\def\pgfsysanim@one{1}
+
+\def\pgfsysanim@mix@scalar{%
+ \pgf@x\pgfsysanim@prev@val pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y\pgfsysanim@next@val pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+}
+\def\pgfsysanim@cap@scalar#1#2#3{%
+ \ifdim#1 pt<#2 pt%
+ \def#1{#2}%
+ \else\ifdim#1 pt>#3 pt%
+ \def#1{#3}%
+ \fi\fi%
+}
+
+
+% Scale interpolation
+
+\def\pgfsysanim@comp@scale{%
+ \pgfsysanim@compute@fractions%
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@scale\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
+ \ifpgfsysanim@accumulate%
+ \ifnum\pgfsysanim@repeat@decimal=0\else%
+ \let\pgfsysanim@frac@b\pgfsysanim@one%
+ \let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
+ \expandafter\pgfsysanim@mix@scale\expandafter\pgfsysanim@x@val\expandafter\pgfsysanim@y@val\pgfsysanim@last@val%
+ \fi%
+ \fi%
+}
+\def\pgfsysanim@mix@scale#1#2#3#4{%
+ \pgf@x#1pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#3pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+ \pgf@x#2pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#4pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@y@val{\pgf@sys@tonumber\pgf@x}%
+}
+
+
+% Dimension interpolation
+
+\def\pgfsysanim@comp@dimension{%
+ \pgfsysanim@compute@fractions%
+ \pgfsysanim@mix@dimension%
+ \ifpgfsysanim@accumulate%
+ \ifnum\pgfsysanim@repeat@decimal=0\else%
+ \let\pgfsysanim@frac@b\pgfsysanim@one%
+ \def\pgfsysanim@prev@val{\pgfsysanim@x@val pt}%
+ \let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
+ \let\pgfsysanim@next@val\pgfsysanim@last@val%
+ \pgfsysanim@mix@dimension%
+ \fi%
+ \fi%
+}
+\def\pgfsysanim@mix@dimension{%
+ \pgf@x\pgfsysanim@prev@val%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y\pgfsysanim@next@val%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+}
+
+
+
+% Translate interpolation
+
+\def\pgfsysanim@comp@translate{%
+ \pgfsysanim@compute@fractions%
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@translate\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
+ \ifpgfsysanim@accumulate%
+ \ifnum\pgfsysanim@repeat@decimal=0\else%
+ \let\pgfsysanim@frac@b\pgfsysanim@one%
+ \let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
+ \edef\pgfsysanim@prev@val{{\pgfsysanim@x@val pt}{\pgfsysanim@y@val pt}}
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@translate\expandafter\pgfsysanim@prev@val\pgfsysanim@last@val%
+ \fi%
+ \fi%
+}
+\def\pgfsysanim@mix@translate#1#2#3#4{%
+ \pgf@x#1%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#3%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+ \pgf@x#2%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#4%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@y@val{\pgf@sys@tonumber\pgf@x}%
+}
+
+
+
+% Color interpolation
+
+\def\pgfsysanim@comp@color{%
+ \pgfsysanim@compute@fractions%
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@color\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
+ \ifpgfsysanim@accumulate%
+ \ifnum\pgfsysanim@repeat@decimal=0\else%
+ \let\pgfsysanim@frac@b\pgfsysanim@one%
+ \let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
+ \expandafter\pgfsysanim@mix@color\expandafter\pgfsysanim@x@val\expandafter\pgfsysanim@y@val\expandafter\pgfsysanim@z@val\pgfsysanim@last@val%
+ \fi%
+ \fi%
+}
+\def\pgfsysanim@mix@color#1#2#3#4#5#6{%
+ \pgf@x#1pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#4pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+ \pgf@x#2pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#5pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@y@val{\pgf@sys@tonumber\pgf@x}%
+ \pgf@x#3pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#6pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@z@val{\pgf@sys@tonumber\pgf@x}%
+}
+
+
+% Text interpolation
+
+\def\pgfsysanim@comp@text{%
+ \let\pgfsysanim@text@val\pgfsysanim@prev@val%
+}
+
+
+
+% Dash interpolation
+
+\def\pgfsysanim@comp@dash{%
+ \pgfsysanim@compute@fractions%
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@dash\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
+ \ifpgfsysanim@accumulate%
+ \ifnum\pgfsysanim@repeat@decimal=0\else%
+ \let\pgfsysanim@frac@b\pgfsysanim@one%
+ \let\pgfsysanim@frac@a\pgfsysanim@repeat@decimal%
+ \edef\pgfsysanim@prev@val{{\pgfsysanim@dash@vals}{\pgfsysanim@x@val pt}}%
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@dash\expandafter\pgfsysanim@prev@val\pgfsysanim@last@val%
+ \fi%
+ \fi%
+}
+\def\pgfsysanim@mix@dash#1#2#3#4{%
+ \pgf@x#2\relax%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#4\relax%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+ \let\pgfsysanim@dash@vals\pgfutil@empty%
+ \pgfsysanim@parse@dash#1,\pgf@stop#3,\pgf@stop%
+}
+\def\pgfsysanim@parse@dash{\pgfutil@ifnextchar\pgf@stop\pgfsysanim@parse@dash@done\pgfsysanim@parse@dash@first}
+\def\pgfsysanim@parse@dash@done\pgf@stop\pgf@stop{}%
+\def\pgfsysanim@parse@dash@first#1,#2\pgf@stop#3\pgf@stop{%
+ \pgf@x#1\relax%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgfsysanim@parse@dash@second#3\pgf@stop{#2}%
+}
+\def\pgfsysanim@parse@dash@second#1,#2\pgf@stop#3{%
+ \pgf@y#1\relax%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \def\pgfsys@temp{#2}%
+ \edef\pgfsysanim@dash@vals{\pgfsysanim@dash@vals\the\pgf@x\ifx\pgfsys@temp\pgfutil@empty\else,\fi}%
+ \pgfsysanim@parse@dash#3\pgf@stop#2\pgf@stop%
+}
+
+
+
+
+% Viewbox interpolation
+
+\def\pgfsysanim@comp@viewbox{%
+ \pgfsysanim@compute@fractions%
+ \expandafter\expandafter\expandafter\pgfsysanim@mix@viewbox\expandafter\pgfsysanim@prev@val\pgfsysanim@next@val%
+ \ifpgfsysanim@accumulate%
+ \pgferror{viewbox animations cannot accumulate / add}%
+ \fi%
+}
+\def\pgfsysanim@mix@viewbox#1#2#3#4#5#6#7#8{%
+ \pgf@x#1%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#5%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\the\pgf@x}%
+ \pgf@x#2%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#6%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@y@val{\the\pgf@x}%
+ \pgf@x#3%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#7%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@z@val{\the\pgf@x}%
+ \pgf@x#4%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#8%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@w@val{\the\pgf@x}%
+}
+
+
+
+
+% Path interpolation
+
+\def\pgfsysanim@comp@path{%
+ \pgfsysanim@compute@fractions%
+ \edef\pgfsysanim@path@tips{%
+ \def\noexpand\pgfsysanim@snap@tip@start{\pgfsysanim@snap@tip@start}%
+ \def\noexpand\pgfsysanim@snap@tip@end{\pgfsysanim@snap@tip@end}%
+ }%
+ \let\pgfsysanim@path@val\pgfutil@empty%
+ \expandafter\expandafter\expandafter\pgfsysanim@parse@path\expandafter\pgfsysanim@prev@val\expandafter\pgf@stop\expandafter\relax\pgfsysanim@next@val\pgf@stop\relax%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsysanim@path@all\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsysanim@path@val\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@path@val\expandafter}\pgfsysanim@path@tips}%
+ \ifpgfsysanim@accumulate%
+ \pgferror{path animations cannot accumulate / add}%
+ \fi%
+}
+\def\pgfsysanim@parse@path{\pgfutil@ifnextchar\pgf@stop\pgfsysanim@parse@path@done\pgfsysanim@parse@path@first}
+\def\pgfsysanim@parse@path@done\pgf@stop\relax\pgf@stop\relax{}%
+\def\pgfsysanim@parse@path@first{\pgfutil@ifnextchar\bgroup\pgfsysanim@parse@path@first@num\pgfsysanim@parse@path@token}
+\def\pgfsysanim@parse@path@token#1#2\relax#3#4\relax{%
+ \expandafter\def\expandafter\pgfsysanim@path@val\expandafter{\pgfsysanim@path@val#1}%
+ \pgfsysanim@parse@path#2\relax#4\relax%
+}
+\def\pgfsysanim@parse@path@first@num#1#2\relax#3#4\relax{%
+ \pgf@x#1%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y#3%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgfsysanim@path@val\expandafter\expandafter\expandafter{\expandafter\pgfsysanim@path@val\expandafter{\the\pgf@x}}%
+ \pgfsysanim@parse@path#2\relax#4\relax%
+}
+
+
+
+% Motion interpolation
+
+\def\pgfsysanim@comp@motion{%
+ \pgfsysanim@compute@fractions%
+ \pgf@x\pgfsysanim@prev@val pt%
+ \pgf@x\pgfsysanim@frac@b\pgf@x%
+ \pgf@y\pgfsysanim@next@val pt%
+ \advance\pgf@x by\pgfsysanim@frac@a\pgf@y%
+ \edef\pgfsysanim@x@val{\pgf@sys@tonumber\pgf@x}%
+ \ifdim\pgfsysanim@x@val pt=1pt%
+ \def\pgfsysanim@x@val{0.9999}% because of rounding problems in decorations
+ \fi%
+ \pgf@relevantforpicturesizefalse%
+ \pgfdecoratepath{pgfsysanim@motion}{%
+ \pgfsyssoftpath@setcurrentpath\pgfsysanim@snap@movealong%
+ }%
+ \ifpgfsysanim@accumulate%
+ \pgferror{motion animations cannot accumulate / add}%
+ \fi%
+}
+\pgfdeclaredecoration{pgfsysanim@motion}{s}{%
+ \state{s}[width=\pgfsysanim@x@val\pgfdecoratedremainingdistance,next state=final]{}%
+ \state{final}{\pgfgettransform\pgfsysanim@motion@trans\global\let\pgfsysanim@motion@trans\pgfsysanim@motion@trans}%
+}
+
+
+
+
+
+
+% Compute fractions and splines:
+
+\def\pgfsysanim@compute@fractions{%
+ \ifdim\pgf@xc=\pgfsysanim@prev@time pt%
+ \def\pgfsysanim@frac@a{0}%
+ \def\pgfsysanim@frac@b{1}%
+ \else%
+ \pgfmathsubtract@{\pgfsysanim@next@time}{\pgfsysanim@prev@time}%
+ \ifdim\pgfmathresult pt<0.01pt%
+ \def\pgfsysanim@frac@a{0}%
+ \def\pgfsysanim@frac@b{1}%
+ \else%
+ \let\pgfsysanim@divby\pgfmathresult%
+ \pgfmathsubtract@{\pgf@xc}{\pgfsysanim@prev@time}%
+ \pgfmathdivide@{\pgfmathresult}{\pgfsysanim@divby}%
+ \ifdim\pgfmathresult pt<0pt\def\pgfmathresult{0}\fi%
+ \ifdim\pgfmathresult pt>1pt\def\pgfmathresult{1}\fi%
+ \let\pgfsysanim@frac@a\pgfmathresult%
+ \pgfmathsubtract@{1}{\pgfmathresult}%
+ \let\pgfsysanim@frac@b\pgfmathresult%
+ \fi%
+ \fi%
+ \ifdim\pgfsysanim@frac@a pt=0pt%
+ \else\ifdim\pgfsysanim@frac@b pt=0pt%
+ \else%
+ \expandafter\expandafter\expandafter\pgfsysanim@apply@spline\expandafter\pgfsysanim@prev@spline\pgfsysanim@next@spline%
+ \fi\fi%
+}
+
+
+\def\pgfsysanim@apply@spline#1#2#3#4#5#6#7#8{%
+ \edef\pgfsys@temp{#3,#5,#4,#6}%
+ \ifx\pgfsys@temp\pgfsysanim@id@spline%
+ \else%
+ \def\pgfsysanim@prev@out@time{{#3}{#4}}%
+ \def\pgfsysanim@next@in@time{{#5}{#6}}%
+ \ifx\pgfsysanim@prev@out@time\pgfsys@stay@text%
+ \pgfsysanim@jump@splines%
+ \else\ifx\pgfsysanim@next@in@time\pgfsys@jump@text%
+ \pgfsysanim@jump@splines%
+ \else%
+ \pgf@xa#3pt%
+ \pgf@xb#5pt%
+ % #4 is val support a
+ % #6 is val support b
+ % our first approximation
+ \let\pgfsysanim@t\pgfsysanim@frac@a%
+ \let\pgfsysanim@s\pgfsysanim@frac@b%
+ \pgfsysanim@eval@spline%
+ \edef\pgfsysanim@ft{\the\pgf@x}%
+ \pgf@x\pgfsysanim@t pt%
+ \advance\pgf@x by256sp%
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
+ \pgfsysanim@eval@spline%
+ % Ok, now do Newton one step
+ \advance\pgf@x by-\pgfsysanim@ft%
+ \pgf@x256\pgf@x%
+ % \pgf@x is f'(t)
+ % must compute t - (f(t)-frac@a)/f'(t)
+ \pgf@ya\pgfsysanim@ft%
+ \advance\pgf@ya by-\pgfsysanim@frac@a pt%
+ \pgf@yb\pgf@x
+ \pgfmathreciprocal@{\pgf@yb}%
+ \ifdim\pgfmathresult pt>2.5pt%
+ \def\pgfmathresult{2.5}%
+ \fi%
+ \ifdim\pgfmathresult pt<-2.5pt%
+ \def\pgfmathresult{-2.5}%
+ \fi%
+ \pgf@x\pgfsysanim@t pt%
+ \advance\pgf@x by-\pgfmathresult\pgf@ya%
+ % \pgf@x is new t:
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
+ \pgfsysanim@eval@spline%
+ \edef\pgfsysanim@ft{\the\pgf@x}%
+ \pgf@x\pgfsysanim@t pt%
+ \advance\pgf@x by256sp%
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
+ \pgfsysanim@eval@spline%
+ % Ok, now do Newton one step2
+ \advance\pgf@x by-\pgfsysanim@ft%
+ \pgf@x256\pgf@x%
+ % \pgf@x is f'(t)
+ % must compute t - (f(t)-frac@a)/f'(t)
+ \pgf@ya\pgfsysanim@ft%
+ \advance\pgf@ya by-\pgfsysanim@frac@a pt%
+ \pgf@yb\pgf@x
+ \pgfmathreciprocal@{\pgf@yb}%
+ \ifdim\pgfmathresult pt>2.5pt%
+ \def\pgfmathresult{2.5}%
+ \fi%
+ \ifdim\pgfmathresult pt<-2.5pt%
+ \def\pgfmathresult{-2.5}%
+ \fi%
+ \pgf@x\pgfsysanim@t pt%
+ \advance\pgf@x by-\pgfmathresult\pgf@ya%
+ % \pgf@x is new t:
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
+ % Third Newton:
+ \pgfsysanim@eval@spline%
+ \edef\pgfsysanim@ft{\the\pgf@x}%
+ \pgf@x\pgfsysanim@t pt%
+ \advance\pgf@x by256sp%
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
+ \pgfsysanim@eval@spline%
+ % Ok, now do Newton one step2
+ \advance\pgf@x by-\pgfsysanim@ft%
+ \pgf@x256\pgf@x%
+ % \pgf@x is f'(t)
+ % must compute t - (f(t)-frac@a)/f'(t)
+ \pgf@ya\pgfsysanim@ft%
+ \advance\pgf@ya by-\pgfsysanim@frac@a pt%
+ \pgf@yb\pgf@x
+ \pgfmathreciprocal@{\pgf@yb}%
+ \ifdim\pgfmathresult pt>2.5pt%
+ \def\pgfmathresult{2.5}%
+ \fi%
+ \ifdim\pgfmathresult pt<-2.5pt%
+ \def\pgfmathresult{-2.5}%
+ \fi%
+ \pgf@x\pgfsysanim@t pt%
+ \advance\pgf@x by-\pgfmathresult\pgf@ya%
+ % \pgf@x is new t:
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@t{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@s{\pgf@sys@tonumber\pgf@y}%
+ % now, evaluate target:
+ \pgf@xa#4pt%
+ \pgf@xb#6pt%
+ \pgfsysanim@eval@spline%
+ % \pgf@x is result:
+ \pgf@y1pt%
+ \advance\pgf@y by-\pgf@x%
+ \edef\pgfsysanim@frac@a{\pgf@sys@tonumber\pgf@x}%
+ \edef\pgfsysanim@frac@b{\pgf@sys@tonumber\pgf@y}%
+ \fi\fi%
+ \fi%
+}
+\def\pgfsysanim@id@spline{0,1,0,1}
+
+\def\pgfsysanim@eval@spline{%
+ % Iteration one: (0,#1,#2,1) reduced to (ya,yb,yc)
+ \pgf@ya\pgfsysanim@t\pgf@xa%
+ \pgf@yb\pgfsysanim@t\pgf@xb%
+ \advance\pgf@yb by\pgfsysanim@s\pgf@xa%
+ \pgf@yc\pgfsysanim@t pt%
+ \advance\pgf@yc by\pgfsysanim@s\pgf@xb%
+ % Iteration two: (ya,yb,yc) reduced to (y,xc)
+ \pgf@y\pgfsysanim@t\pgf@yb%
+ \advance\pgf@y by\pgfsysanim@s\pgf@ya%
+ \pgf@xc\pgfsysanim@t\pgf@yc%
+ \advance\pgf@xc by\pgfsysanim@s\pgf@yb%
+ % Iteration three: (y,xc) reduced to (x)
+ \pgf@x\pgfsysanim@t\pgf@xc%
+ \advance\pgf@x by\pgfsysanim@s\pgf@y%
+}
+
+\def\pgfsysanim@jump@splines{%
+ \ifx\pgfsysanim@prev@out@time\pgfsys@stay@text%
+ \ifx\pgfsysanim@next@in@time\pgfsys@jump@text%
+ \ifdim\pgfsysanim@frac@a pt<0.5pt%
+ \def\pgfsysanim@frac@a{0}%
+ \def\pgfsysanim@frac@b{1}%
+ \else%
+ \def\pgfsysanim@frac@a{1}%
+ \def\pgfsysanim@frac@b{0}%
+ \fi%
+ \else%
+ % Only stay, so go to begin
+ \def\pgfsysanim@frac@a{0}%
+ \def\pgfsysanim@frac@b{1}%
+ \fi%
+ \else
+ % Only jump, so go to end
+ \def\pgfsysanim@frac@a{1}%
+ \def\pgfsysanim@frac@b{0}%
+ \fi%
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsysprotocol.code.tex b/graphics/pgf/base/tex/pgfsysprotocol.code.tex
new file mode 100644
index 0000000000..3625abbb57
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsysprotocol.code.tex
@@ -0,0 +1,70 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsysprotocol.code.tex}
+
+
+
+% This package provides the pgf system protocol layer. Protocolling is
+% used to record a bunch of graphic operations so that they can be
+% reused quickly at a later point.
+%
+% Basically, all ``recordable'' \pgfsys@xxxx commands call
+% \pgfsysprotocol@protocol for their protocolable literal
+% specials. The literal text will either be stored in the current
+% protocol. At a later point (actually, normally this happens
+% immediately afterwards), the accumulated protocolled text is invoked
+% using pgfsys@invokeprotocol.
+
+
+
+\let\pgfsysprotocol@currentprotocol=\pgfutil@empty
+\newif\ifpgfsysprotocol@buffered
+
+
+% Add to the protocol buffered
+\def\pgfsysprotocol@literalbuffered#1{%
+ \edef\pgfsysprotocol@temp{{#1\space}}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\pgfsysprotocol@currentprotocol\pgfsysprotocol@temp%
+}
+
+% Add to the protocol
+\def\pgfsysprotocol@literal#1{%
+ \pgfsysprotocol@literalbuffered{#1}%
+ \ifpgfsysprotocol@buffered%
+ \else%
+ \pgfsysprotocol@flushcurrentprotocol%
+ \fi%
+}
+
+% Getting and setting the current protocol
+\def\pgfsysprotocol@getcurrentprotocol#1{%
+ \let#1=\pgfsysprotocol@currentprotocol%
+}
+
+\def\pgfsysprotocol@setcurrentprotocol#1{%
+ \global\let\pgfsysprotocol@currentprotocol=#1%
+}
+
+
+% Invoking the current protocol
+\def\pgfsysprotocol@invokecurrentprotocol{%
+ \ifx\pgfsysprotocol@currentprotocol\pgfutil@empty%
+ \else%
+ \expandafter\pgfsys@invoke\expandafter{\pgfsysprotocol@currentprotocol}%
+ \fi%
+}
+
+\def\pgfsysprotocol@flushcurrentprotocol{%
+ \pgfsysprotocol@invokecurrentprotocol%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfsyssoftpath.code.tex b/graphics/pgf/base/tex/pgfsyssoftpath.code.tex
new file mode 100644
index 0000000000..d04eb02288
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfsyssoftpath.code.tex
@@ -0,0 +1,204 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{pgfsyssoftpath.code.tex}
+
+
+% This package provides the pgf system path abstraction layer. This
+% layer is used to construct paths first ``abstractly.'' These
+% abstract paths can still be modified, before they are ``made
+% concrete.''
+%
+% An abstract path consists of a sequence of basic building blocks,
+% each of which is a tuple consisting of two numbers (specifying a
+% coordinate) and a token. Possible tokens are:
+%
+% 1. moveto
+% 2. lineto
+% 3. rectcorner
+% 4. rectsize
+% 5. curvetosupporta
+% 6. curvetosupportb
+% 7. curveto
+% 8. closepath
+% 9. specialround
+%
+% A curveto must always be preceded by a curvetosupporta and a
+% curvetosupportb. A non-empty path must always begin with a
+% moveto. The coordinates of a closepath are non-specified, currently,
+% but they might be set to the coordinate of the path segment start,
+% in the future.
+
+
+% Access to the current path:
+%
+% Lots of stuff is added to the current path and it can get very long
+% (containing literally tens of thousands of tokens). For such macros,
+% adding things using a simple "g@addtomacro" takes more and more
+% time, resulting in quadratic runtime. To avoid this, ideally, one
+% would collect things in an array and then use a divide and conquer
+% merger. A simple intermediate solution is the following, implemented
+% here: We have the path and two buffers. New tokens are added to the
+% first buffer, which is quite small. When it overflow, its contents
+% is added to the second buffer, which is large. If that buffer
+% overflow, the contents is finally added to the main path (which can
+% have arbitrary length). Whenever the main path is set or read, the
+% buffers are flushed.
+%
+% Because of this buffering, it is imperative that the main path is
+% accessed only via appropriate interface macros.
+
+
+
+% The current path
+\let\pgfsyssoftpath@thepath=\pgfutil@empty
+\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+\newcount\pgfsyssoftpath@smallbuffer@items
+\newcount\pgfsyssoftpath@bigbuffer@items
+
+\def\pgfsyssoftpath@flushbuffers{%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfsyssoftpath@thepath%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\pgfsyssoftpath@thepath%
+ \expandafter\pgfsyssoftpath@bigbuffer\pgfsyssoftpath@smallbuffer}%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+ \global\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+ \global\pgfsyssoftpath@bigbuffer@items0\relax%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+}
+
+% Getting and setting the current path
+\def\pgfsyssoftpath@getcurrentpath#1{%
+ \pgfsyssoftpath@flushbuffers%
+ \let#1=\pgfsyssoftpath@thepath%
+}
+
+\def\pgfsyssoftpath@setcurrentpath#1{%
+ \global\let\pgfsyssoftpath@thepath=#1%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+ \global\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+ \global\pgfsyssoftpath@bigbuffer@items0\relax%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+}
+
+
+% Invoking the current path (slightly optimized)
+\def\pgfsyssoftpath@invokecurrentpath{%
+ \pgfsyssoftpath@thepath%
+ \pgfsyssoftpath@bigbuffer%
+ \pgfsyssoftpath@smallbuffer%
+}
+
+\def\pgfsyssoftpath@flushcurrentpath{%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+}
+
+% Add an item at the end
+\def\pgfsyssoftpath@addtocurrentpath#1{%
+ \global\advance\pgfsyssoftpath@smallbuffer@items by1\relax%
+ \ifnum\pgfsyssoftpath@smallbuffer@items<40\relax% good number?
+ \expandafter\gdef\expandafter\pgfsyssoftpath@smallbuffer\expandafter{\pgfsyssoftpath@smallbuffer#1}%
+ \else%
+ \pgfsyssoftpath@smalloverflow{#1}%
+ \fi%
+}
+\def\pgfsyssoftpath@smalloverflow#1{%
+ \global\advance\pgfsyssoftpath@bigbuffer@items by1\relax%
+ \ifnum\pgfsyssoftpath@bigbuffer@items<30\relax% good number?
+ \expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\pgfsyssoftpath@bigbuffer%
+ \expandafter\expandafter\expandafter{\expandafter\pgfsyssoftpath@bigbuffer\pgfsyssoftpath@smallbuffer#1}%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+ \else%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfsyssoftpath@thepath%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\pgfsyssoftpath@thepath
+ \expandafter\pgfsyssoftpath@bigbuffer\pgfsyssoftpath@smallbuffer#1}%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+ \global\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+ \global\pgfsyssoftpath@bigbuffer@items0\relax%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+ \fi%
+}
+
+
+
+\def\pgfsyssoftpath@lastmoveto{{0pt}{0pt}}
+
+\newif\ifpgfsyssoftpathmovetorelevant
+\pgfsyssoftpathmovetorelevanttrue
+
+% Add a moveto element to the current path
+\def\pgfsyssoftpath@moveto#1#2{%
+ \edef\pgfsyssoftpath@coord{{#1}{#2}}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\expandafter{\expandafter\pgfsyssoftpath@movetotoken\pgfsyssoftpath@coord}%
+ \ifpgfsyssoftpathmovetorelevant%
+ \global\let\pgfsyssoftpath@lastmoveto\pgfsyssoftpath@coord%
+ \fi%
+}
+
+% Add a lineto element to the current path
+\def\pgfsyssoftpath@lineto#1#2{%
+ \edef\pgfsyssoftpath@coord{{#1}{#2}}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\expandafter{\expandafter\pgfsyssoftpath@linetotoken\pgfsyssoftpath@coord}%
+}
+
+
+% Add curveto elements to the current path
+\def\pgfsyssoftpath@curveto#1#2#3#4#5#6{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@curvetosupportatoken{#1}{#2}%
+ \noexpand\pgfsyssoftpath@curvetosupportbtoken{#3}{#4}%
+ \noexpand\pgfsyssoftpath@curvetotoken{#5}{#6}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+
+% Add rectangle elements to the current path
+\def\pgfsyssoftpath@rect#1#2#3#4{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@rectcornertoken{#1}{#2}%
+ \noexpand\pgfsyssoftpath@rectsizetoken{#3}{#4}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+% Add closepath element to the current path
+\def\pgfsyssoftpath@closepath{%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\expandafter{\expandafter\pgfsyssoftpath@closepathtoken\pgfsyssoftpath@lastmoveto}%
+}
+
+% Add special element to the current path
+\def\pgfsyssoftpath@specialround#1#2{%
+ \edef\pgfsyssoftpath@temp{{#1}{#2}}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\expandafter{\expandafter\pgfsyssoftpath@specialroundtoken\pgfsyssoftpath@temp}%
+}
+
+% Marshallers
+\def\pgfsyssoftpath@movetotoken#1#2{\pgfsys@moveto{#1}{#2}}
+\def\pgfsyssoftpath@linetotoken#1#2{\pgfsys@lineto{#1}{#2}}
+\def\pgfsyssoftpath@rectcornertoken#1#2#3#4#5{\pgfsys@rect{#1}{#2}{#4}{#5}} % #3 = \pgfsyssoftpath@rectsizetoken
+\def\pgfsyssoftpath@curvetosupportatoken#1#2#3#4#5#6#7#8{\pgfsys@curveto{#1}{#2}{#4}{#5}{#7}{#8}}
+\def\pgfsyssoftpath@closepathtoken#1#2{\pgfsys@closepath}
+\let\pgfsyssoftpath@specialroundtoken=\pgfutil@gobbletwo
+\def\pgfsyssoftpath@curvetosupportbtoken#1#2{curvetotokenb} % make sure this \ifx-equal only to itself
+\def\pgfsyssoftpath@curvetotoken#1#2{curvetotoken}% make sure this \ifx-equal only to itself
+
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End:
diff --git a/graphics/pgf/base/tex/pgfutil-common-lists.tex b/graphics/pgf/base/tex/pgfutil-common-lists.tex
new file mode 100644
index 0000000000..d3b817a00f
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfutil-common-lists.tex
@@ -0,0 +1,159 @@
+% Copyright 2013 by Christian Feuersaenger
+%
+% 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.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
+%
+% This list here is a general re-implementation of the list used in
+% the PGF system layer.
+% It employs two collect-buffers to reduce the runtime.
+%
+% - It has pre-asymptotical runtime O(N), but is O(N^2) asymptotically.
+% - It requires only 5 macros per list.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Usage:
+% \pgfapplistnewempty\macro
+\def\pgfapplistnewempty#1{%
+ \expandafter\let\csname pgfapp@#1\endcsname=\pgfutil@empty
+ \expandafter\let\csname pgfapp@#1@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\let\csname pgfapp@#1@bigbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfapp@#1@smallbuf@c\endcsname{0}%
+ \expandafter\def\csname pgfapp@#1@bigbuf@c\endcsname{0}%
+}%
+
+% #1: the item to append
+% #2: the list as macro name
+\long\def\pgfapplistpushback#1\to#2{%
+ \begingroup
+ \c@pgf@counta=\csname pgfapp@#2@smallbuf@c\endcsname\relax
+ \advance\c@pgf@counta by1
+ \xdef\pgf@glob@TMPa{\the\c@pgf@counta}%
+ \endgroup
+ \expandafter\let\csname pgfapp@#2@smallbuf@c\endcsname=\pgf@glob@TMPa
+ \ifnum\csname pgfapp@#2@smallbuf@c\endcsname<40
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfapp@#2@smallbuf\endcsname#1}%
+ \expandafter\edef\csname pgfapp@#2@smallbuf\endcsname{\the\t@pgf@toka}%
+ \else
+ \pgfapplistpushback@smallbufoverfl{#1}{#2}%
+ \fi
+}%
+\long\def\pgfapplistpushback@smallbufoverfl#1#2{%
+ \begingroup
+ \c@pgf@counta=\csname pgfapp@#2@bigbuf@c\endcsname\relax
+ \advance\c@pgf@counta by1
+ \xdef\pgf@glob@TMPa{\the\c@pgf@counta}%
+ \endgroup
+ \expandafter\let\csname pgfapp@#2@bigbuf@c\endcsname=\pgf@glob@TMPa
+ %
+ \ifnum\csname pgfapp@#2@bigbuf@c\endcsname<30
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfapp@#2@bigbuf\endcsname}%
+ \t@pgf@tokb=\expandafter\expandafter\expandafter{\csname pgfapp@#2@smallbuf\endcsname#1}%
+ \expandafter\edef\csname pgfapp@#2@bigbuf\endcsname{\the\t@pgf@toka\the\t@pgf@tokb}%
+ \expandafter\let\csname pgfapp@#2@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfapp@#2@smallbuf@c\endcsname{0}%
+ \else%
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfapp@#2\endcsname}%
+ \t@pgf@tokb=\expandafter\expandafter\expandafter{\csname pgfapp@#2@bigbuf\endcsname}%
+ \t@pgf@tokc=\expandafter\expandafter\expandafter{\csname pgfapp@#2@smallbuf\endcsname#1}%
+ \expandafter\edef\csname pgfapp@#2\endcsname{\the\t@pgf@toka\the\t@pgf@tokb\the\t@pgf@tokc}%
+ \expandafter\let\csname pgfapp@#2@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfapp@#2@smallbuf@c\endcsname{0}%
+ \expandafter\let\csname pgfapp@#2@bigbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfapp@#2@bigbuf@c\endcsname{0}%
+ \fi%
+}%
+\def\pgfapplist@flushbuffers#1{%
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfapp@#1\endcsname}%
+ \t@pgf@tokb=\expandafter\expandafter\expandafter{\csname pgfapp@#1@bigbuf\endcsname}%
+ \t@pgf@tokc=\expandafter\expandafter\expandafter{\csname pgfapp@#1@smallbuf\endcsname}%
+ \expandafter\edef\csname pgfapp@#1\endcsname{\the\t@pgf@toka\the\t@pgf@tokb\the\t@pgf@tokc}%
+ \expandafter\let\csname pgfapp@#1@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfapp@#1@smallbuf@c\endcsname{0}%
+ \expandafter\let\csname pgfapp@#1@bigbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfapp@#1@bigbuf@c\endcsname{0}%
+}%
+
+\def\pgfapplistlet#1=#2{%
+ \pgfapplist@flushbuffers{#2}%
+ \expandafter\let\expandafter#1\csname pgfapp@#2\endcsname
+}%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% A variant of applist which has the same runtime requirements, but
+% does PUSH FRONT only.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% Usage:
+% \pgfprependlistnewempty{list}
+\def\pgfprependlistnewempty#1{%
+ \expandafter\let\csname pgfpPRP@#1\endcsname=\pgfutil@empty
+ \expandafter\let\csname pgfpPRP@#1@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\let\csname pgfpPRP@#1@bigbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfpPRP@#1@smallbuf@c\endcsname{0}%
+ \expandafter\def\csname pgfpPRP@#1@bigbuf@c\endcsname{0}%
+}%
+
+% #1: the item to append
+% #2: the list as macro name
+\long\def\pgfprependlistpushfront#1\to#2{%
+ \begingroup
+ \c@pgf@counta=\csname pgfpPRP@#2@smallbuf@c\endcsname\relax
+ \advance\c@pgf@counta by1
+ \xdef\pgf@glob@TMPa{\the\c@pgf@counta}%
+ \endgroup
+ \expandafter\let\csname pgfpPRP@#2@smallbuf@c\endcsname=\pgf@glob@TMPa
+ \ifnum\csname pgfpPRP@#2@smallbuf@c\endcsname<40
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfpPRP@#2@smallbuf\endcsname}%
+ \t@pgf@tokb={#1}%
+ \expandafter\edef\csname pgfpPRP@#2@smallbuf\endcsname{\the\t@pgf@tokb\the\t@pgf@toka}%
+ \else
+ \pgfprependlistpushfront@smallbufoverfl{#1}{#2}%
+ \fi
+}%
+\long\def\pgfprependlistpushfront@smallbufoverfl#1#2{%
+ \begingroup
+ \c@pgf@counta=\csname pgfpPRP@#2@bigbuf@c\endcsname\relax
+ \advance\c@pgf@counta by1
+ \xdef\pgf@glob@TMPa{\the\c@pgf@counta}%
+ \endgroup
+ \expandafter\let\csname pgfpPRP@#2@bigbuf@c\endcsname=\pgf@glob@TMPa
+ %
+ \ifnum\csname pgfpPRP@#2@bigbuf@c\endcsname<30
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfpPRP@#2@bigbuf\endcsname}%
+ \t@pgf@tokb=\expandafter\expandafter\expandafter{\csname pgfpPRP@#2@smallbuf\endcsname}%
+ \t@pgf@tokc={#1}%
+ \expandafter\edef\csname pgfpPRP@#2@bigbuf\endcsname{\the\t@pgf@tokc\the\t@pgf@tokb\the\t@pgf@toka}%
+ \expandafter\let\csname pgfpPRP@#2@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfpPRP@#2@smallbuf@c\endcsname{0}%
+ \else%
+ \pgfprependlist@flushbuffers{#2}%
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfpPRP@#2\endcsname}%
+ \t@pgf@tokb={#1}%
+ \expandafter\edef\csname pgfpPRP@#2\endcsname{\the\t@pgf@tokb\the\t@pgf@toka}%
+ \fi%
+}%
+\def\pgfprependlist@flushbuffers#1{%
+ \t@pgf@toka=\expandafter\expandafter\expandafter{\csname pgfpPRP@#1\endcsname}%
+ \t@pgf@tokb=\expandafter\expandafter\expandafter{\csname pgfpPRP@#1@bigbuf\endcsname}%
+ \t@pgf@tokc=\expandafter\expandafter\expandafter{\csname pgfpPRP@#1@smallbuf\endcsname}%
+ \expandafter\edef\csname pgfpPRP@#1\endcsname{\the\t@pgf@tokc\the\t@pgf@tokb\the\t@pgf@toka}%
+ \expandafter\let\csname pgfpPRP@#1@smallbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfpPRP@#1@smallbuf@c\endcsname{0}%
+ \expandafter\let\csname pgfpPRP@#1@bigbuf\endcsname=\pgfutil@empty
+ \expandafter\def\csname pgfpPRP@#1@bigbuf@c\endcsname{0}%
+}%
+\def\pgfprependlistlet#1=#2{%
+ \pgfprependlist@flushbuffers{#2}%
+ \expandafter\let\expandafter#1\csname pgfpPRP@#2\endcsname
+}%
diff --git a/graphics/pgf/base/tex/pgfutil-common.tex b/graphics/pgf/base/tex/pgfutil-common.tex
new file mode 100644
index 0000000000..6fbaf2687b
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfutil-common.tex
@@ -0,0 +1,839 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+%
+% This file provides utility commands that are used throughout pgf.
+%
+% For most commands, the definition of these commands is just given
+% below. We cannot use the LaTeX definition of these commands since
+% LaTeX may not be the current format and since LaTeX packages tend to
+% redefine these commands.
+%
+% For some commands the actual definition of the format (like latex or
+% context) is to be preferred over the generic definition below. In
+% this case, the definition of the format is installed when the file
+% pgfutil-XXXX.tex is read, where XXXX is the format name (latex,
+% plain, or context).
+
+
+
+\catcode`\@=11\relax
+
+
+% Which format is loaded?
+\newif\ifpgfutil@format@is@latex
+\newif\ifpgfutil@format@is@plain
+\newif\ifpgfutil@format@is@context
+
+
+% Simple stuff
+
+% \pgfutil@trimspaces{<token list>}
+%
+% Removes spaces on both sides of <token list>. Same as trimspaces.sty
+\catcode`\Q=3
+\def\pgfutil@trimspaces#1{%
+ \romannumeral-`0\pgfutil@trimspaces@\noexpand#1Q Q}
+\def\pgfutil@trimspaces@#1 Q{\pgfutil@trimspaces@@#1Q}
+\def\pgfutil@trimspaces@@#1Q#2{#1}
+\catcode`\Q=11
+
+% \pgfutil@ifundefined{<macro name with backslash>}
+% {<is undefined code>}{<is defined code>}
+%
+% This will let #1 to \relax if it undefined.
+%
+% This macro is expandable.
+\def\pgfutil@ifundefined#1{%
+ \expandafter\ifx\csname#1\endcsname\relax
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi}
+
+% A variant of \pgfutil@ifundefined which will NOT let #1 to \relax it
+% is undefined. However, this macro is not expandable.
+\def\pgfutil@IfUndefined#1{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname#1\endcsname\relax
+ \expandafter\pgfutil@firstoftwo
+ \else
+ \expandafter\pgfutil@secondoftwo
+ \fi
+}
+\long\def\pgfutil@firstofone#1{#1}
+\long\def\pgfutil@firstoftwo#1#2{#1}
+\long\def\pgfutil@letfirst#1#2{\pgfutil@letfirst@#1#2\pgfutil@letfirst@end}
+\long\def\pgfutil@letfirst@#1#2#3\pgfutil@letfirst@end{\let#1=#2}
+\def\pgfutil@letfirst@end{}
+\long\def\pgfutil@secondoftwo#1#2{#2}
+\def\pgfutil@empty{}
+\long\def\pgfutil@gobble@until@relax#1\relax{}
+\long\def\pgfutil@gobble#1{}
+\long\def\pgfutil@gobbletwo#1#2{}
+\def\pgfutil@namedef#1{\expandafter\def\csname #1\endcsname}
+\def\pgfutil@namelet#1{\expandafter\pgfutil@@namelet\csname#1\endcsname}
+\def\pgfutil@@namelet#1#2{\expandafter\let\expandafter#1\csname#2\endcsname}
+\long\def\pgfutil@g@addto@macro#1#2{%
+ \begingroup
+ \pgfutil@toks@\expandafter{#1#2}%
+ \xdef#1{\the\pgfutil@toks@}%
+ \endgroup}
+\newif\ifpgfutil@tempswa
+\newif\ifpgfutil@tempswb
+
+% \pgfutil@pushmacro
+% \pgfutil@popmacro
+%
+% Macro stack. Allows pushing a macro over \egroup. Taken from ConTeXt
+
+\let\pgfutil@pushmacro@string\pgfutil@empty
+
+\def\pgfutil@pushmacro#1{%
+ \xdef\pgfutil@pushmacro@string{\string#1}%
+ \ifcsname pgfutil@pushedmacro@\pgfutil@pushmacro@string\endcsname\else
+ % \newcount is \outer in Plain
+ \csname newcount\expandafter\endcsname\csname pgfutil@pushedmacro@\pgfutil@pushmacro@string\endcsname
+ \fi
+ \global\advance\csname pgfutil@pushedmacro@\pgfutil@pushmacro@string\endcsname 1\relax
+ \expandafter\glet\csname\the\csname pgfutil@pushedmacro@\pgfutil@pushmacro@string\endcsname\pgfutil@pushmacro@string\endcsname#1%
+}
+
+\def\pgfutil@popmacro#1{%
+ \xdef\pgfutil@pushmacro@string{\string#1}%
+ \expandafter\let\expandafter#1\csname\the\csname pgfutil@pushedmacro@\pgfutil@pushmacro@string\endcsname\pgfutil@pushmacro@string\endcsname
+ \global\advance\csname pgfutil@pushedmacro@\pgfutil@pushmacro@string\endcsname -1\relax
+}
+
+% pgfutil@ifnextchar
+
+\long\def\pgfutil@ifnextchar#1#2#3{%
+ \let\pgfutil@reserved@d=#1%
+ \def\pgfutil@reserved@a{#2}%
+ \def\pgfutil@reserved@b{#3}%
+ \futurelet\pgfutil@let@token\pgfutil@ifnch}
+\def\pgfutil@ifnch{%
+ \ifx\pgfutil@let@token\pgfutil@sptoken
+ \let\pgfutil@reserved@c\pgfutil@xifnch
+ \else
+ \ifx\pgfutil@let@token\pgfutil@reserved@d
+ \let\pgfutil@reserved@c\pgfutil@reserved@a
+ \else
+ \let\pgfutil@reserved@c\pgfutil@reserved@b
+ \fi
+ \fi
+ \pgfutil@reserved@c}
+{%
+ \def\:{\global\let\pgfutil@sptoken= } \:
+ \def\:{\pgfutil@xifnch} \expandafter\gdef\: {\futurelet\pgfutil@let@token\pgfutil@ifnch}
+}
+
+% pgfutil@ignorespaces
+
+\def\pgfutil@ignorespaces
+ {\ifx\pgfutil@let@token\pgfutil@sptoken
+ \expandafter\pgfutil@ignorespaces@helper
+ \else
+ \expandafter\pgfutil@next
+ \fi}
+
+{
+ \def\:{\pgfutil@ignorespaces@helper}
+ \expandafter\gdef\: {\futurelet\pgfutil@let@token\pgfutil@ignorespaces}
+}
+
+% pgfutil@in@
+
+\newif\ifpgfutil@in@
+
+% Usage:
+% \pgfutil@in@{one}{three two one}
+% \ifpgfutil@in@
+% -> will be true!
+% \else
+% \fi
+%
+% \pgfutil@in@{,}{1234,456567}
+% \ifpgfutil@in@
+% -> will be true!
+% \else
+% \fi
+\def\pgfutil@in@#1#2{%
+ \def\pgfutil@in@@##1#1##2##3\pgfutil@in@@{%
+ \ifx\pgfutil@in@##2\pgfutil@in@false\else\pgfutil@in@true\fi}%
+ \pgfutil@in@@#2#1\pgfutil@in@\pgfutil@in@@}
+
+
+% pgfutil@for
+
+\def\pgfutil@nnil{\pgfutil@nil}
+\def\pgfutil@fornoop#1\@@#2#3{}
+\long\def\pgfutil@for#1:=#2\do#3{%
+ \expandafter\def\expandafter\pgfutil@fortmp\expandafter{#2}%
+ \ifx\pgfutil@fortmp\pgfutil@empty \else
+ \expandafter\pgfutil@forloop#2,\pgfutil@nil,\pgfutil@nil\@@#1{#3}\fi}
+\long\def\pgfutil@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\pgfutil@nnil \else
+ #5\def#4{#2}\ifx #4\pgfutil@nnil \else#5\pgfutil@iforloop #3\@@#4{#5}\fi\fi}
+\long\def\pgfutil@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\pgfutil@nnil
+ \expandafter\pgfutil@fornoop \else
+ #4\relax\expandafter\pgfutil@iforloop\fi#2\@@#3{#4}}
+\def\pgfutil@tfor#1:={\pgfutil@tf@r#1 }
+\long\def\pgfutil@tf@r#1#2\do#3{\def\pgfutil@fortmp{#2}\ifx\pgfutil@fortmp\pgfutil@space\else
+ \pgfutil@tforloop#2\pgfutil@nil\pgfutil@nil\@@#1{#3}\fi}
+\long\def\pgfutil@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\pgfutil@nnil
+ \expandafter\pgfutil@fornoop \else
+ #4\relax\expandafter\pgfutil@tforloop\fi#2\@@#3{#4}}
+
+\def\pgfutil@space{ }
+
+% pgfutil@IfFileExists
+
+\chardef\pgfutil@inputcheck0
+\def\pgfutil@IfFileExists#1#2#3{%
+ \openin\pgfutil@inputcheck=#1 %
+ \ifeof\pgfutil@inputcheck
+ #3\relax
+ \else
+ #2\relax
+ \fi
+ \closein\pgfutil@inputcheck}
+
+\def\pgfutil@InputIfFileExists#1#2#3{\pgfutil@IfFileExists{#1}{\input #1\relax#2}{#3}}%
+
+
+% pgfutil@loop (from plain.tex)
+
+\def\pgfutil@loop#1\pgfutil@repeat{\def\pgfutil@body{#1}\pgfutil@iterate}
+\def\pgfutil@iterate{\pgfutil@body \let\pgfutil@next\pgfutil@iterate \else\let\pgfutil@next\relax\fi \pgfutil@next}
+\let\pgfutil@repeat=\fi % this makes \loop...\if...\repeat skippable
+
+
+% aux-read-hook
+
+\let\pgfutil@aux@read@hook=\relax
+
+
+% Tokens for the end of the typesetting -- they will be added at the
+% end of every job (hopefully...).
+
+\newtoks\pgfutil@everybye
+
+
+%
+% PDF-Resource management -- might seem strange that this is here, but
+% it turns out to be the correct place since latex and context handle
+% this stuff quite differently
+%
+
+% Adding something to the pdf-resources:
+
+\def\pgfutil@addpdfresource@extgs#1{\pgf@sys@addpdfresource@extgs@plain{#1}}
+\def\pgfutil@addpdfresource@colorspaces#1{\pgf@sys@addpdfresource@colorspaces@plain{#1}}
+\def\pgfutil@addpdfresource@patterns#1{\pgf@sys@addpdfresource@patterns@plain{#1}}
+\def\pgfutil@setuppdfresources{\pgf@sys@setuppdfresources@plain}
+
+
+% Inserts the argument at the begin of the current page (hopefully)
+
+\let\pgfutil@insertatbegincurrentpage=\relax
+
+
+% Ragged left and ragged right
+
+\def\pgfutil@raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\pgfutil@raggedleft{\leftskip\z@ plus2em \rightskip\z@ \spaceskip.3333em \xspaceskip.5em\parfillskip0pt\relax}
+
+
+% Error Messages
+\def\pgfutil@packageerror#1#2#3{\errhelp{#3}\errmessage{Package #1 Error: #2}}
+\def\pgfutil@packagewarning#1#2{\immediate\write17{Package #1: Warning! #2.}}
+\def\pgferror#1{\pgfutil@packageerror{pgf}{#1}{}}
+\def\pgfwarning#1{\pgfutil@packagewarning{pgf}{#1}}
+
+
+% Library files inclusion
+
+
+% Include a library file.
+%
+% #1 = List of names of library file.
+%
+% Description:
+%
+% This command includes a list of library files. For each file X in the
+% list, the file pgflibraryX.code.tex is included, provided this has
+% not been done earlier.
+%
+% For the convenience of Context users, both round and square brackets
+% are possible for the argument.
+%
+% Example:
+%
+% \usepgflibrary{arrows}
+% \usepgflibrary[patterns,snakes]
+
+\def\usepgflibrary{\pgfutil@ifnextchar[{\use@pgflibrary}{\use@@pgflibrary}}%}
+\def\use@pgflibrary[#1]{\use@@pgflibrary{#1}}
+\def\use@@pgflibrary#1{%
+ \edef\pgf@list{#1}%
+ \pgfutil@for\pgf@temp:=\pgf@list\do{%
+ \expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}%
+ \ifx\pgf@temp\pgfutil@empty
+ \else
+ \expandafter\ifx\csname pgf@library@\pgf@temp @loaded\endcsname\relax%
+ \expandafter\let\csname pgf@library@\pgf@temp @loaded\endcsname=\pgfutil@empty%
+ \expandafter\edef\csname pgf@library@#1@atcode\endcsname{\the\catcode`\@}
+ \expandafter\edef\csname pgf@library@#1@barcode\endcsname{\the\catcode`\|}
+ \expandafter\edef\csname pgf@library@#1@dollarcode\endcsname{\the\catcode`\$}
+ \catcode`\@=11
+ \catcode`\|=12
+ \catcode`\$=3
+ \pgfutil@InputIfFileExists{pgflibrary\pgf@temp.code.tex}{}{%
+ \pgferror{I did not find the pgf library
+ '\pgf@temp'. I looked for the file named
+ pgflibrary\pgf@temp.code.tex, but could not find it in in
+ the current texmf trees.}
+ }%
+ \catcode`\@=\csname pgf@library@#1@atcode\endcsname
+ \catcode`\|=\csname pgf@library@#1@barcode\endcsname
+ \catcode`\$=\csname pgf@library@#1@dollarcode\endcsname
+ \fi%
+ \fi
+ }%
+}
+
+
+% Include a module file.
+%
+% #1 = List of names of module files.
+%
+% Description:
+%
+% This command includes a list of module files. For each file X in the
+% list, the file pgfmoduleX.code.tex is included, provided this has
+% not been done earlier.
+%
+% For the convenience of Context users, both round and square brackets
+% are possible for the argument.
+%
+% Example:
+%
+% \usepgfmodule{matrix}
+
+\def\usepgfmodule{\pgfutil@ifnextchar[{\use@pgfmodule}{\use@@pgfmodule}}%}
+\def\use@pgfmodule[#1]{\use@@pgfmodule{#1}}
+\def\use@@pgfmodule#1{%
+ \edef\pgf@list{#1}%
+ \pgfutil@for\pgf@temp:=\pgf@list\do{%
+ \expandafter\ifx\csname pgf@module@\pgf@temp @loaded\endcsname\relax%
+ \expandafter\let\csname pgf@module@\pgf@temp @loaded\endcsname=\pgfutil@empty%
+ \expandafter\edef\csname pgf@module@#1@atcode\endcsname{\the\catcode`\@}
+ \expandafter\edef\csname pgf@module@#1@barcode\endcsname{\the\catcode`\|}
+ \expandafter\edef\csname pgf@module@#1@dollarcode\endcsname{\the\catcode`\$}
+ \catcode`\@=11
+ \catcode`\|=12
+ \catcode`\$=3
+ \input pgfmodule\pgf@temp.code.tex
+ \catcode`\@=\csname pgf@module@#1@atcode\endcsname
+ \catcode`\|=\csname pgf@module@#1@barcode\endcsname
+ \catcode`\$=\csname pgf@module@#1@dollarcode\endcsname
+ \fi%
+ }%
+}
+
+\def\pgfutilensuremath#1{%
+ \ifmmode#1\else$#1$\fi
+}
+
+
+%
+% Guess the driver:
+%
+
+\begingroup
+ \catcode`\"=12
+ \edef\pgf@loc@TMPa{"}%
+ %
+ % prepares file names by checking for double colons.
+ %
+ % If '#1' is a usual file name without anything fancy, \pgfretval
+ % will simply contain it. However, if '#1' contains double colons
+ % (introduces, for example, by pdftex because there are white
+ % spaces in '#1'), the routine
+ % - removes the double colons,
+ % - re-inserts them outside of the string.
+ %
+ % \pgfutilpreparefilename{file.tex} -> file.tex
+ % \pgfutilpreparefilename{"A file name".file} -> "A file name.file"
+ %
+ % The resulting file name is returned in '\pgfretval',
+ % furthermore, a *quoted* version of the file name is returned in
+ % \pgfretvalquoted. The latter result is to have some sort of
+ % output normalisation: if the file name as such contains double
+ % quotes, we don't want to insert another set of them.
+ %
+ % This special handling has the following purposes:
+ % 1. Both, treatment of white spaces and double colons is not
+ % properly defined in TeX. Thus, we should only work with them if
+ % necessary and maintain backwards compatibility as far as
+ % possible.
+ % 2. It *should* work if there are spaces.
+ %
+ \gdef\pgfutilpreparefilename#1{%
+ \begingroup
+ \ifnum\the\catcode`\"=13
+ \pgfutilconvertdcolon
+ \fi
+ \xdef\pgf@temp{#1}%
+ \endgroup
+ \expandafter\pgfutil@in@\expandafter"\expandafter{\pgf@temp}%
+ \ifpgfutil@in@
+ \def\pgf@loc@TMPa{\pgfutilstrreplace{"}{}}%
+ \expandafter\pgf@loc@TMPa\expandafter{\pgf@temp}%
+ \edef\pgfretval{"\pgfretval"}% re-insert quotes! Otherwise, TeX can't use the file name.
+ \let\pgfretvalquoted=\pgfretval
+ \else
+ \let\pgfretval=\pgf@temp
+ \edef\pgfretvalquoted{"\pgfretval"}%
+ \fi
+ }%
+ \catcode`\"=13
+ \xdef\pgfutilconvertdcolon{%
+ \noexpand\def\noexpand"{\pgf@loc@TMPa}%
+ }%
+\endgroup
+
+% Converts an arbitrary command (without arguments) to a string in which all characters
+% have category 12.
+%
+% #1: a macro name (which takes no arguments)
+% #2: a macro name which will be assigned to '#1' converted to string.
+%
+% This uses '\meaning#1' hackery.
+\def\pgfutil@command@to@string#1#2{%
+ \expandafter\pgfutil@command@to@string@@\meaning#1\pgfutil@EOI{#2}%
+}%
+\xdef\pgfutil@glob@TMPa{\meaning\pgfutil@empty}%
+\expandafter\def\expandafter\pgfutil@command@to@string@@\pgfutil@glob@TMPa#1\pgfutil@EOI#2{%
+ \def#2{#1}%
+}%
+\begingroup
+\catcode`\|=0
+\catcode`\\=12
+|gdef|pgfutil@backslash@as@other{\}%
+|endgroup
+
+% Checks if the token sequence #1 (unexpanded) contains a macro and
+% invokes #2 if so and #3 if not.
+\def\pgfutilifcontainsmacro#1#2#3{%
+ \def\pgf@marshal{#1}%
+ \pgfutil@command@to@string\pgf@marshal\pgf@marshal
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{\pgfutil@backslash@as@other}{\pgf@marshal}}%
+ \pgf@marshal
+ \ifpgfutil@in@
+ \def\pgf@marshal{#2}%
+ \else
+ \def\pgf@marshal{#3}%
+ \fi
+ \pgf@marshal
+}%
+
+% Tests if string '#2' starts with pattern '#1'.
+%
+% If so, it executes #3 and defines \pgfretval to contain the
+% suffix which is not equal to #1. Otherwise it executes #4.
+\def\pgfutilifstartswith#1#2#3#4{%
+ \def\pgfutilifstartswith@ ##1#1##2\pgf@EOI{%
+ \def\pgfutil@tmp{##1}%
+ \ifx\pgfutil@tmp\pgfutil@empty
+ % Ah - a hit!
+ %
+ % define \pgfretval to be the suffix...
+ \def\pgfutil@tmp#1####1\pgf@EOI{%
+ \def\pgfretval{####1}%
+ }%
+ \pgfutil@tmp#2\pgf@EOI%
+ %
+ % ... and execute the <true> code:
+ #3\relax%
+ \else
+ % hm. No such prefix.
+ #4\relax%
+ \fi
+ }%
+ \pgfutilifstartswith@#2--#1\pgf@EOI%
+}%
+
+% Usage:
+% \pgfutilstrreplace{<token>}{<replacement>}{<string>}
+%
+% -> will assign the modified string into \pgfretval.
+%
+% #1: the string to search (one or more tokens)
+% #2: zero, one or more tokens which will be inserted instead of '#1'.
+% #3: the string to search in
+\long\def\pgfutilstrreplace#1#2#3{%
+ \def\pgfretval{}%
+ \long\def\pgfutil@search@and@replace@@##1#1##2\pgf@EOI{%
+ \expandafter\def\expandafter\pgfretval\expandafter{\pgfretval ##1#2}%
+ \pgfutil@search@and@replace@loop{#1}{##2}%
+ }%
+ \pgfutil@search@and@replace@loop{#1}{#3}%
+}
+\long\def\pgfutil@search@and@replace@loop#1#2{%
+ \pgfutil@in@{#1}{#2}%
+ \ifpgfutil@in@
+ \def\pgf@loc@TMPa{\pgfutil@search@and@replace@@ #2\pgf@EOI}%
+ \else
+ \expandafter\def\expandafter\pgfretval\expandafter{\pgfretval #2}%
+ \let\pgf@loc@TMPa=\relax
+ \fi
+ \pgf@loc@TMPa
+}%
+
+% Solves a linear equation system of size 2x2 using gauss elimination.
+%
+% It employs TeX register arithmetics to do so.
+% #1: should contain 4 sets of braces with matrix entries,
+% {<a11>}{<a12>}
+% {<a21>}{<a22>}
+% where each entry should be a number without unit.
+% It is acceptable if '#1' is a macro which expands to the expected
+% format.
+% #2: should contain 2 sets of braces with the right-hand-side,
+% {<r1>}{<r2>}
+% where each entry should be a number without unit.
+% It is acceptable if '#2' is a macro which expands to the expected
+% format.
+%
+% It will assign \pgfmathresult to contain two sets of braces with the
+% result.
+%
+% Example:
+% \pgfutilsolvetwotwoleq{
+% {0.24}{1}
+% {-0.97}{0}
+% }{
+% {-7}
+% {18}
+% }
+% -> yields \pgfmathresult={−18.55618}{−2.54642}
+%
+% The algorithm employs column pivotisation.
+%
+% If the matrix is singular, the routine will return {}.
+\def\pgfutilsolvetwotwoleq#1#2{%
+ \begingroup
+ \dimendef\aa=0
+ \dimendef\ab=1
+ \dimendef\ba=2
+ \dimendef\bb=3
+ \dimendef\ra=4
+ \dimendef\rb=5
+ \dimendef\tmpa=6
+ \dimendef\tmpb=7
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutilsolvetwotwoleq@A\pgf@temp
+ \edef\pgf@temp{#2}%
+ \expandafter\pgfutilsolvetwotwoleq@r\pgf@temp
+ %
+ \pgfutilsolvetwotwoleq@ifislarger\aa\ba{%
+ % identity "permutation":
+ \def\Pa{a}%
+ \def\Pb{b}%
+ }{%
+ % permutation matrix: switch rows!
+ \def\Pa{b}%
+ \def\Pb{a}%
+ }%
+ % \pivot := 1/aa
+ \tmpa=\csname m\Pa a\endcsname pt %
+ \ifdim\tmpa<0pt \tmpa=-\tmpa\fi
+ \ifdim\tmpa<0.0001pt
+ % singular matrix!
+ \let\pgfmathresult=\pgfutil@empty
+ \else
+ \pgfmathreciprocal@
+ {\csname m\Pa a\endcsname}%
+ \let\pivot=\pgfmathresult
+ %
+ % \factor := 1/aa * ba
+ \csname \Pb a\endcsname=\pivot\csname \Pb a\endcsname
+ \edef\factor{\expandafter\pgf@sys@tonumber\csname \Pb a\endcsname}%
+ %
+ % bb -= ba/aa * ab
+ \tmpa=-\factor\csname \Pa b\endcsname
+ \advance\csname \Pb b\endcsname by\tmpa
+ %
+ % rb -= ba/aa * ra
+ \tmpa=-\factor\csname r\Pa\endcsname
+ \advance\csname r\Pb\endcsname by\tmpa
+ %
+ \tmpa=\csname \Pb b\endcsname%
+ \ifdim\tmpa<0pt \tmpa=-\tmpa\fi
+ \ifdim\tmpa<0.0001pt
+ % singular matrix!
+ \let\pgfmathresult=\pgfutil@empty
+ \else
+ % xb := rb / bb (the modified rb and modified bb!)
+ \pgfmathdivide@
+ {\expandafter\pgf@sys@tonumber\csname r\Pb\endcsname}
+ {\expandafter\pgf@sys@tonumber\csname \Pb b\endcsname}%
+ \expandafter\let\csname pgfmathresult\Pb\endcsname=\pgfmathresult
+ %
+ % ra := ra - xb * ab
+ \tmpa=\csname pgfmathresult\Pb\endcsname\csname \Pa b\endcsname
+ \advance\csname r\Pa\endcsname by-\tmpa
+ %
+ % xa := 1/aa * ra (the modified ra!)
+ \tmpa=\pivot\csname r\Pa\endcsname
+ \expandafter\edef\csname pgfmathresult\Pa\endcsname{\pgf@sys@tonumber\tmpa}%
+ %
+ \edef\pgfmathresult{%
+ {\csname pgfmathresult\Pa\endcsname}%
+ {\csname pgfmathresult\Pb\endcsname}%
+ }%
+ \fi
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+\def\pgfutilsolvetwotwoleq@ifislarger#1#2#3#4{%
+ \tmpa=#1
+ \ifdim\tmpa<0pt
+ \multiply\tmpa by-1
+ \fi
+ \tmpb=#2
+ \ifdim\tmpb<0pt
+ \multiply\tmpb by-1
+ \fi
+ \ifdim\tmpa>\tmpb
+ #3%
+ \else
+ #4%
+ \fi
+}%
+
+\def\pgfutilsolvetwotwoleqfloat@ifislarger#1#2#3#4{%
+ \pgfmathfloatabs@{#1}\let\tmpa=\pgfmathresult
+ \pgfmathfloatabs@{#2}\let\tmpb=\pgfmathresult
+ \pgfmathfloatlessthan@{\tmpb}{\tmpa}%
+ \ifpgfmathfloatcomparison
+ #3%
+ \else
+ #4%
+ \fi
+}%
+\def\pgfutilsolvetwotwoleq@A#1#2#3#4{%
+ \def\maa{#1}\def\mab{#2}%
+ \def\mba{#3}\def\mbb{#3}%
+ \aa=#1pt \ab=#2pt
+ \ba=#3pt \bb=#4pt
+}
+\def\pgfutilsolvetwotwoleq@r#1#2{%
+ \ra=#1pt \rb=#2pt
+}%
+\def\pgfutilsolvetwotwoleqfloat@A#1#2#3#4{%
+ \pgfmathfloatparsenumber{#1}\let\maa=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}\let\mab=\pgfmathresult
+ \pgfmathfloatparsenumber{#3}\let\mba=\pgfmathresult
+ \pgfmathfloatparsenumber{#4}\let\mbb=\pgfmathresult
+}
+\def\pgfutilsolvetwotwoleqfloat@r#1#2{%
+ \pgfmathfloatparsenumber{#1}\let\ra=\pgfmathresult
+ \pgfmathfloatparsenumber{#2}\let\rb=\pgfmathresult
+}%
+
+% Same as \pgfutilsolvetwotwoleq, but using floating point
+% arithmetics. The return value is still in fixed point.
+\def\pgfutilsolvetwotwoleqfloat#1#2{%
+ \begingroup
+ \pgfmathfloatcreate{1}{1.0}{-4}% FIXME : use a smaller threshold for FPU?
+ \let\thresh=\pgfmathresult
+ %
+ \edef\pgf@temp{#1}%
+ \expandafter\pgfutilsolvetwotwoleqfloat@A\pgf@temp
+ \edef\pgf@temp{#2}%
+ \expandafter\pgfutilsolvetwotwoleqfloat@r\pgf@temp
+ %
+ \pgfutilsolvetwotwoleqfloat@ifislarger\maa\mba{%
+ % identity "permutation":
+ \def\Pa{a}%
+ \def\Pb{b}%
+ }{%
+ % permutation matrix: switch rows!
+ \def\Pa{b}%
+ \def\Pb{a}%
+ }%
+ % \pivot := 1/aa
+ \expandafter\pgfmathfloatabs@\expandafter{\csname m\Pa a\endcsname}%
+ \let\tmpa=\pgfmathresult
+ \pgfmathfloatlessthan@{\tmpa}{\thresh}%
+ \ifpgfmathfloatcomparison
+ % singular matrix!
+ \let\pgfmathresult=\pgfutil@empty
+ \else
+ \expandafter\pgfmathfloatreciprocal@\expandafter{\csname m\Pa a\endcsname}%
+ \let\pivot=\pgfmathresult
+ %
+ % \factor := 1/aa * ba
+ \expandafter\pgfmathfloatmultiply@\expandafter{\csname m\Pb a\endcsname}{\pivot}%
+ \let\factor=\pgfmathresult
+ \expandafter\let\csname m\Pb a\endcsname=\factor
+ %
+ % bb -= ba/aa * ab
+ \expandafter\pgfmathfloatmultiply@\expandafter{\csname m\Pa b\endcsname}{\factor}%
+ \let\tmpa=\pgfmathresult
+ \expandafter\pgfmathfloatsubtract@\expandafter{\csname m\Pb b\endcsname}{\tmpa}%
+ \expandafter\let\csname m\Pb b\endcsname=\pgfmathresult
+ %
+ % rb -= ba/aa * ra
+ \expandafter\pgfmathfloatmultiply@\expandafter{\csname r\Pa\endcsname}{\factor}%
+ \let\tmpa=\pgfmathresult
+ \expandafter\pgfmathfloatsubtract@\expandafter{\csname r\Pb\endcsname}{\tmpa}%
+ \expandafter\let\csname r\Pb\endcsname=\pgfmathresult
+ %
+ \expandafter\pgfmathfloatabs@\expandafter{\csname m\Pb b\endcsname}%
+ \let\tmpa=\pgfmathresult
+ \pgfmathfloatlessthan@{\tmpa}{\thresh}%
+ \ifpgfmathfloatcomparison
+ % singular matrix!
+ \let\pgfmathresult=\pgfutil@empty
+ \else
+ % xb := rb / bb (the modified rb and modified bb!)
+ \edef\pgf@marshal{
+ \noexpand\pgfmathfloatdivide@
+ {\csname r\Pb\endcsname}
+ {\csname m\Pb b\endcsname}%
+ }%
+ \pgf@marshal
+ \expandafter\let\csname pgfmathresult\Pb\endcsname=\pgfmathresult
+ \let\tmpa=\pgfmathresult
+ %
+ % ra := ra - xb * ab
+ \expandafter\pgfmathfloatmultiply@\expandafter{\csname m\Pa b\endcsname}{\tmpa}%
+ \let\tmpa=\pgfmathresult
+ \expandafter\pgfmathfloatsubtract@\expandafter{\csname r\Pa\endcsname}{\tmpa}%
+ \expandafter\let\csname r\Pa\endcsname=\pgfmathresult
+ %
+ % xa := 1/aa * ra (the modified ra!)
+ \expandafter\pgfmathfloatmultiply@\expandafter{\csname r\Pa\endcsname}{\pivot}%
+ \expandafter\let\csname pgfmathresult\Pa\endcsname=\pgfmathresult
+ %
+ \edef\pgfmathresult{%
+ {\csname pgfmathresult\Pa\endcsname}%
+ {\csname pgfmathresult\Pb\endcsname}%
+ }%
+ \expandafter\pgfutilsolvetwotwoleqfloat@to@pgf@range\pgfmathresult
+ \fi
+ \fi
+ \pgfmath@smuggleone\pgfmathresult
+ \endgroup
+}%
+
+
+\def\pgfutilsolvetwotwoleqfloat@to@pgf@range#1#2{%
+ \pgfmathfloatcreate{1}{1.6}{4}\let\pgfutilsolvetwotwoleqfloat@to@pgf@range@max=\pgfmathresult
+ \pgfmathfloatabs@{#1}%
+ \expandafter\pgfmathfloatlessthan@\expandafter{\pgfmathresult}{\pgfutilsolvetwotwoleqfloat@to@pgf@range@max}%
+ \ifpgfmathfloatcomparison
+ \pgfmathfloatabs@{#2}%
+ \expandafter\pgfmathfloatlessthan@\expandafter{\pgfmathresult}{\pgfutilsolvetwotwoleqfloat@to@pgf@range@max}%
+ \ifpgfmathfloatcomparison
+ % ok.
+ \pgfmathfloattofixed{#1}\let\tmpa=\pgfmathresult
+ \pgfmathfloattofixed{#2}%
+ \edef\pgfmathresult{{\tmpa}{\pgfmathresult}}%
+ \else
+ % singular (because PGF cannot represent its result
+ \let\pgfmathresult=\pgfutil@empty
+ \fi
+ \else
+ % singular (because PGF cannot represent its result
+ \let\pgfmathresult=\pgfutil@empty
+ \fi
+}%
+
+% there are funny programs which overwrite \read and \write (like
+% tabularx).
+\let\pgfutil@write=\write
+\let\pgfutil@read=\read
+
+% curtesy for latex:
+\let\pgfutil@protect\relax
+
+% Used by latex for doing reruns
+% #1 = an internal label
+% #2 = a to-be-tested text
+\def\pgfutil@check@rerun#1#2{}
+
+% new tempdims:
+\newdimen\pgfutil@tempdima
+\newdimen\pgfutil@tempdimb
+
+
+% luatex stuff
+% We assume luatex version > 0.39:
+% - \directlua <general text> will work
+% - \directlua is the only luatex primitive that we can assume
+% accessible without being prefixed by the format via
+% tex.enableprimitives.
+% Ideas taken from the ifluatex package (Heiko Oberdiek)
+\let\pgfutil@ifluatex\iffalse
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname directlua\endcsname\relax
+\else
+ \expandafter\let\csname pgfutil@ifluatex\expandafter\endcsname
+ \csname iftrue\endcsname
+\fi
+
+\pgfutil@ifluatex
+ \let\pgfutil@directlua\directlua
+ \pgfutil@directlua{%
+ tex.enableprimitives('pgfutil@',{'luaescapestring'})}
+\else
+ \def\pgfutil@directlua#1{}
+ \def\pgfutil@luaescapestring#1{}
+\fi
+
+
+\def\pgfutil@shellescape@lua@eightseven#1{%
+ \pgfutil@directlua{os.execute("\pgfutil@luaescapestring{#1}")}%
+}%
+\def\pgfutil@shellescape#1{%
+ \immediate\write18{#1}%
+}%
+\pgfutil@IfUndefined{directlua}{%
+}{%
+ \pgfutil@IfUndefined{lastsavedimageresourcepages}{%
+ % Ah - an old version of luatex. It still supports \write18
+ }{%
+ % take the new variant...
+ \let\pgfutil@shellescape=\pgfutil@shellescape@lua@eightseven
+ }%
+}%
+
+% End of luatex stuff
+
+% Advances a number stored in a macro and writes the result back into
+% the macro.
+% #1 is a macro containing a number.
+\def\pgfutil@advancestringcounter#1{%
+ \begingroup
+ \c@pgf@counta=#1\relax
+ \advance\c@pgf@counta by1
+ \edef#1{\the\c@pgf@counta}%
+ \pgfmath@smuggleone#1%
+ \endgroup
+}%
+\input pgfutil-common-lists.tex
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfutil-context.def b/graphics/pgf/base/tex/pgfutil-context.def
new file mode 100644
index 0000000000..bf7e43a298
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfutil-context.def
@@ -0,0 +1,375 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+%
+% Adapted for colors and pdf resources by Hans Hagen. There can be a few more
+% optimizations but they are not critital.
+
+\pgfutil@format@is@contexttrue
+
+
+% The aux files, needed for reading back coordinates
+\def\pgfutil@aux@read@hook{%
+ \pgfutil@IfFileExists{\jobname.pgf}{\input \jobname.pgf\relax}{}
+ \csname newwrite\endcsname\pgfutil@auxout
+ \immediate\csname openout\endcsname\pgfutil@auxout\jobname.pgf\relax
+}
+\def\pgfutil@writetoaux#1{\write\pgfutil@auxout{#1}}
+
+% XColor-like support for ConTeXt
+
+\def\pgfutil@definecolor#1#2#3{\csname pgfutil@emu@#2\endcsname{#1}#3\@nil}
+
+\def\pgfutil@emu@rgb#1#2,#3,#4\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{rgb}{#2,#3,#4}}}
+\def\pgfutil@emu@gray#1#2\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{rgb}{#2,#2,#2}}}
+\def\pgfutil@emu@cmyk#1#2,#3,#4,#5\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{cmyk}{#2,#3,#4,#5}}}
+
+
+% no need for x colors (users can load it if needed)
+%\pgfutil@definecolor{white}{gray}{1}
+%\pgfutil@definecolor{black}{gray}{0}
+%\pgfutil@definecolor{gray}{gray}{0.5}
+%\pgfutil@definecolor{red}{rgb}{1,0,0}
+%\pgfutil@definecolor{green}{rgb}{0,1,0}
+%\pgfutil@definecolor{blue}{rgb}{0,0,1}
+%\pgfutil@definecolor{cyan}{rgb}{0,1,1}
+%\pgfutil@definecolor{magenta}{rgb}{1,0,1}
+%\pgfutil@definecolor{yellow}{rgb}{1,1,0}
+%\pgfutil@definecolor{orange}{rgb}{1,0.5,0}
+%\pgfutil@definecolor{violet}{rgb}{0.5,0,0.5}
+%\pgfutil@definecolor{purple}{rgb}{0.75,0,0.25}
+%\pgfutil@definecolor{brown}{rgb}{0.75,0.5,0.25}
+
+\def\pgfutil@color#1{%
+ \pgfutil@colorlet{.}{#1}%
+ \pgfsysprotocol@getcurrentprotocol\pgfutil@emu@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsetcolor{.}%
+ \expandafter\pgfsys@outerinvoke\expandafter{\pgfsysprotocol@currentprotocol}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@emu@temp%
+ \aftergroup\pgfutil@reset@color%
+}
+
+\def\pgfutil@extractcolorspec#1#2{%
+ \def#2{{#1}}%
+}
+
+\def\pgfutil@convertcolorspec#1#2#3{%
+ \edef#3{\expandafter\expandafter\expandafter\pgfutil@emu@select\csname\string\color@#1\endcsname}%
+}
+
+\def\pgfutil@doifcolorelse#1#2#3{%
+ \expandafter\ifx\csname\string\color@#1\endcsname\relax%
+ \doifcolorelse{#1}{\let\pgf@next=\pgfutil@firstoftwo}{\let\pgf@next=\pgfutil@secondoftwo}%
+ \else
+ \let\pgf@next=\pgfutil@firstoftwo%
+ \fi%
+ \pgf@next{#2}{#3}%
+}
+
+\def\pgfutil@reset@color{%
+ \pgfsysprotocol@getcurrentprotocol\pgfutil@emu@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsetcolor{.}%
+ \expandafter\pgfsys@outerinvoke\expandafter{\pgfsysprotocol@currentprotocol}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@emu@temp%
+}
+
+\expandafter\def\csname\string\color@.\endcsname{\xcolor@{}{}{rgb}{0,0,0}}
+
+\def\pgfutil@colorlet#1#2{%
+ \edef\pgf@marshal{#2}%
+ \expandafter\pgfutil@in@\expandafter!\expandafter{\pgf@marshal}%
+ \ifpgfutil@in@%
+ % compute mixture
+ {%
+ \expandafter\pgfutil@emu@mix\pgf@marshal!white!\@nil%
+ \xdef\pgf@marshal{\noexpand\def\expandafter\noexpand\csname\string\color@#1\endcsname{%
+ \noexpand\xcolor@{}{}{rgb}{\pgf@sys@tonumber\pgf@xa,\pgf@sys@tonumber\pgf@xb,\pgf@sys@tonumber\pgf@xc}}}%
+ }%
+ \pgf@marshal%
+ \else%
+ \expandafter\ifx\csname\string\color@#2\endcsname\relax%
+ \pgfutil@registercolor{#2}%
+ \fi%
+ \edef\pgf@marshal{\noexpand\let\expandafter\noexpand\csname\string\color@#1\endcsname=%
+ \expandafter\noexpand\csname\string\color@#2\endcsname}%
+ \pgf@marshal%
+ \fi%
+}
+
+\def\pgfutil@emu@mix#1!#2!#3!#4\@nil{%
+ \expandafter\ifx\csname\string\color@#1\endcsname\relax%
+ \pgfutil@registerrgb{#1}%
+ \fi%
+ \expandafter\ifx\csname\string\color@#3\endcsname\relax%
+ \pgfutil@registerrgb{#3}%
+ \fi%
+ \expandafter\expandafter\expandafter\pgfutil@emu@unpack\csname\string\color@#1\endcsname%
+ \pgf@ya=\pgf@xa%
+ \pgf@yb=\pgf@xb%
+ \pgf@yc=\pgf@xc%
+ \expandafter\expandafter\expandafter\pgfutil@emu@unpack\csname\string\color@#3\endcsname%
+ \c@pgf@counta=#2\relax%
+ \c@pgf@countb=100\relax%
+ \advance\c@pgf@countb by-\c@pgf@counta\relax%
+ \pgf@xa=\c@pgf@countb\pgf@xa%
+ \advance\pgf@xa by\c@pgf@counta\pgf@ya%
+ \divide\pgf@xa by 100\relax%
+ \pgf@xb=\c@pgf@countb\pgf@xb%
+ \advance\pgf@xb by\c@pgf@counta\pgf@yb%
+ \divide\pgf@xb by 100\relax%
+ \pgf@xc=\c@pgf@countb\pgf@xc%
+ \advance\pgf@xc by\c@pgf@counta\pgf@yc%
+ \divide\pgf@xc by 100\relax%
+}
+
+\def\pgfutil@emu@unpack#1#2#3#4#5{%
+ \pgfutil@emu@@unpack#5\@nil%
+}
+
+\def\pgfutil@emu@@unpack#1,#2,#3\@nil{%
+ \pgf@xa=#1pt%
+ \pgf@xb=#2pt%
+ \pgf@xc=#3pt%
+}
+
+\def\pgfutil@emu@select#1#2#3#4#5{#5}
+
+\def\XC@tgt@mod#1{#1}
+\def\XC@sdef#1#2{\edef#1{#2}}
+\def\XC@mod@cmyk{cmyk}
+\def\XC@mod@rgb{rgb}
+
+% goody
+
+\let\colorlet=\pgfutil@colorlet
+
+% latex stuff
+
+\newskip\pgfutil@flushglue
+\pgfutil@flushglue=0pt plus 1fil
+
+
+% pgfutil@minipage
+
+\def\pgfutil@minipage[#1]#2{%
+ \hbox to#2\bgroup
+ \hsize=#2\relax
+ \vbox\bgroup\leavevmode
+}
+
+\def\pgfutil@endminipage{%
+ \egroup
+ \egroup
+}
+
+% global colors
+
+\let\pgfutil@globalcolorsfalse\relax
+\let\pgfutil@globalcolorstrue \relax
+
+% font stuff
+
+\def\pgfutil@font@tiny {\tfxx}
+\def\pgfutil@font@scriptsize {\tfxx}
+\def\pgfutil@font@footnotesize{\tfx}
+\def\pgfutil@font@small {\tfx}
+\def\pgfutil@font@normalsize {\tf}
+\def\pgfutil@font@large {\tfa}
+\def\pgfutil@font@Large {\tfb}
+\def\pgfutil@font@huge {\tfc}
+\def\pgfutil@font@Huge {\tfc}
+\def\pgfutil@font@itshape {\it}
+\def\pgfutil@font@bfseries {\bf}
+\def\pgfutil@font@normalfont {\tf}
+\def\pgfutil@selectfont {\tf}
+
+% registers
+
+\newcount\pgfutil@tempcnta
+\newcount\pgfutil@tempcntb
+
+\newbox \pgfutil@tempboxa
+
+\newbox \pgfutil@voidb@x
+\newtoks \pgfutil@toks@
+
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempcnta\pgfutil@tempcnta
+\let\pgfmath@tempcntb\pgfutil@tempcntb
+
+% module stuff
+
+\def\pgfutil@usemodule#1{\usemodule[#1]}
+
+% more adaptions
+
+\let\pgfutil@insertatbegincurrentpagefrombox\flushatshipout
+\let\pgfutil@insertatbegincurrentpage \flushatshipout
+\def\pgfutil@insertatbegineverypage #1{\appendtoks#1\to\everyshipout} % space removed after #1
+
+\let\pgfutil@setuppdfresources \relax
+
+\doifmodeelse {mkiv} {
+
+ \def\pgfsysdriver{pgfsys-pdftex.def}
+
+ \def\pgfutil@driver@if@in#1#2{%
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{#1}{\preloadedspecials}}%
+ \pgf@marshal
+ \ifpgfutil@in@
+ \def\pgfsysdriver{#2}%
+ \fi
+ }
+
+ \def\pgf@sys@pdf@pdfbackendset@one#1#2%
+ {\normalexpanded{\noexpand\pgf@sys@pdf@pdfbackendset@two\noexpand#1#2\relax}}
+
+ \def\pgf@sys@pdf@pdfbackendset@two#1/#2 #3\relax
+ {#1{#2}{#3}}
+
+ \def\pgf@sys@pdf@addtopageresource@pattern {\pgf@sys@pdf@pdfbackendset@one\pdfbackendsetpattern}
+ \def\pgf@sys@pdf@addtopageresource@colorspace{\pgf@sys@pdf@pdfbackendset@one\pdfbackendsetcolorspace}
+ \def\pgf@sys@pdf@addtopageresource@extgstate {\pgf@sys@pdf@pdfbackendset@one\pdfbackendsetextgstate}
+ \def\pgf@sys@pdf@possible@resources {\pdfbackendcurrentresources}
+ \def\pgf@sys@pdf@check@resources {}
+
+ \let\pgfutil@registercolor\pgf@context@registercolor
+ \let\pgfutil@registerrgb \pgf@context@registerrgb
+ \let\pgfutil@registercmyk \pgf@context@registercmyk
+ \let\pgfutil@registergray \pgf@context@registergray
+
+} {
+ \def\pgf@sys@pdf@addtopageresource@extgstate {\appendtoPDFdocumentextgstates }
+ \def\pgf@sys@pdf@addtopageresource@colorspace {\appendtoPDFdocumentcolorspaces}
+ \def\pgf@sys@pdf@addtopageresource@pattern {\appendtoPDFdocumentpatterns }
+ \def\pgf@sys@pdf@possible@resources {\currentPDFresources}
+ \def\pgf@sys@pdf@check@resources {}
+
+
+ \ifx\pdfoutput\undefined\newcount\pdfoutput\fi
+ \ifx\pdfoutput\relax \newcount\pdfoutput\fi
+
+ \def\pgfutil@guessdriver{
+ \ifx\XeTeXversion\@undefined
+ \ifx\preloadedspecials\@undefined%
+ \ifcase\pdfoutput%
+ \def\pgfsysdriver{pgfsys-dvips.def}%
+ \else%
+ \def\pgfsysdriver{pgfsys-pdftex.def}% pdfTeX & LuaTeX
+ \fi%
+ \else%
+ \pgfutil@driver@if@in{postscript}{pgfsys-dvips.def}
+ \pgfutil@driver@if@in{tpd}{pgfsys-pdftex.def}
+ \pgfutil@driver@if@in{dpm}{pgfsys-dvipdfm.def}
+ \pgfutil@driver@if@in{dpx}{pgfsys-dvipdfmx.def}
+ \pgfutil@driver@if@in{xetex}{pgfsys-xetex.def}
+ \ifx\pgfsysdriver\relax%
+ \PackageWarning{pgf}{I was not able to discern the driver, the
+ preloaded specials were \preloadedspecials. I am going to use
+ pgfsys-dvips.def}%
+ \def\pgfsysdriver{pgfsys-dvips.def}
+ \fi%
+ \fi
+ \else
+ \def\pgfsysdriver{pgfsys-xetex.def}% should be right
+ \fi
+ }
+
+ \def\pgfutil@driver@if@in#1#2{%
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{#1}{\preloadedspecials}}%
+ \pgf@marshal
+ \ifpgfutil@in@
+ \def\pgfsysdriver{#2}%
+ \fi
+ }
+
+ % The cmyk part is from Joseph Wright.
+ % See tex.stackexchange.com/questions/27952/cmyk-context-colors-in-tikz
+ \def\pgfutil@registercolor#1{%
+ \edef\pgf@temp{\PDFcolor{#1}}%
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{rg}{\pgf@temp}}%
+ \pgf@marshal
+ \ifpgfutil@in@
+ \expandafter\pgfutil@context@parse@rgb\pgf@temp\pgf@stop{#1}%
+ \else
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{g}{\pgf@temp}}%
+ \pgf@marshal
+ \ifpgfutil@in@
+ \expandafter\pgfutil@context@parse@gray\pgf@temp\pgf@stop{#1}%
+ \else
+ \edef\pgf@marshal{\noexpand\pgfutil@in@{k}{\pgf@temp}}%
+ \pgf@marshal
+ \ifpgfutil@in@
+ \expandafter\pgfutil@context@parse@cmyk\pgf@temp\pgf@stop{#1}%
+ \else
+ \pgferror{Color #1 has an unsupported color model.}%
+ \pgfutil@definecolor{#1}{gray}{0}%
+ \fi
+ \fi
+ \fi
+ }
+
+ \def\pgfutil@context@parse@gray#1 g#2\pgf@stop#3{%
+ \pgfutil@definecolor{#3}{gray}{#1}
+ }
+
+ \def\pgfutil@context@parse@rgb#1 #2 #3 rg#4\pgf@stop#5{%
+ \pgfutil@definecolor{#5}{rgb}{#1,#2,#3}
+ }
+
+ \def\pgfutil@context@parse@cmyk#1 #2 #3 #4k#5\pgf@stop #6{%
+ \pgfutil@definecolor{#6}{cmyk}{#1,#2,#3,#4}%
+ }
+
+ \def\pgfutil@emu@cmyk#1#2,#3,#4,#5\@nil{%
+ \expandafter\def\csname\string\color@#1\endcsname
+ {\xcolor@{}{}{cmyk}{#2,#3,#4,#5}}%
+ }
+
+ \let\pgfutil@registerrgb \pgfutil@registercolor
+ \let\pgfutil@registercmyk \pgfutil@registercolor
+ \let\pgfutil@registergray \pgfutil@registercolor
+
+
+}
+
+\let\pgf@sys@addpdfresource@extgs@plain \pgf@sys@pdf@addtopageresource@extgstate
+\let\pgf@sys@addpdfresource@patterns@plain \pgf@sys@pdf@addtopageresource@pattern
+\let\pgf@sys@addpdfresource@colorspaces@plain\pgf@sys@pdf@addtopageresource@colorspace
+\let\pgf@sys@pdf@check@resources@plain \pgf@sys@pdf@check@resources
+
+\pgf@sys@addpdfresource@colorspaces@plain{/pgfprgb [/Pattern /DeviceRGB]}
+
+% do something at the end of a job
+
+\appendtoks \the\pgfutil@everybye \to \everybye
+
+\long\def\AtBeginDocument#1{#1}%
+
+% pgfcalendar uses translations
+
+\def\pgfutil@translate#1{#1} % \translate works very different in ConTeXt
+
+% e-TeX primitives
+
+\pgfutil@IfUndefined{normalprotected}{%
+ \def\pgfutil@protected{}%
+}{%
+ \let\pgfutil@protected\normalprotected
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfutil-latex.def b/graphics/pgf/base/tex/pgfutil-latex.def
new file mode 100644
index 0000000000..2ac8ec4212
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfutil-latex.def
@@ -0,0 +1,205 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\catcode`\@=11\relax
+
+\pgfutil@format@is@latextrue
+
+\let\pgfutil@auxout=\@auxout
+\def\pgfutil@writetoaux#1{\if@filesw\write\pgfutil@auxout{#1}\fi}
+
+\let\pgfutil@tempcnta=\@tempcnta
+\let\pgfutil@tempcntb=\@tempcntb
+\let\pgfutil@voidb@x=\voidb@x
+\let\pgfutil@toks@=\toks@
+
+\let\pgfutil@packageerror=\PackageError
+\let\pgfutil@packagewarning=\PackageWarning
+
+\def\pgfutil@protect{\protect}
+
+
+\def\pgfutil@definecolor{\definecolor}
+\def\pgfutil@color{\color}
+\def\pgfutil@colorlet#1#2{%
+ % If the color is a defined named color, we have to use the [named]
+ % option for colorlet to force xcolor to perform color model
+ % conversion.
+ \expandafter\ifx\csname\expandafter\string\csname color@#2\endcsname\endcsname\relax
+ \colorlet{#1}{#2}%
+ \else
+ \colorlet[named]{#1}{#2}%
+ \fi
+}
+
+\def\pgfutil@extractcolorspec{\extractcolorspec}
+\def\pgfutil@convertcolorspec{\convertcolorspec}
+
+\def\pgfutil@globalcolorsfalse{\let\ifglobalcolors\iffalse}
+\def\pgfutil@globalcolorstrue{\let\ifglobalcolors\iftrue}
+
+\let\pgfutil@minipage=\minipage
+\let\pgfutil@endminipage=\endminipage
+
+\def\pgfutil@doifcolorelse#1#2#3{%
+ \expandafter\ifx\csname\string\color@#1\endcsname\relax%
+ \let\pgf@next=\pgfutil@secondoftwo%
+ \else
+ \let\pgf@next=\pgfutil@firstoftwo%
+ \fi%
+ \pgf@next{#2}{#3}%
+}
+
+\let\pgfutil@raggedleft\raggedleft
+\let\pgfutil@raggedright\raggedright
+
+\let\pgfutil@flushglue=\@flushglue
+
+\def\pgfutil@font@tiny{\tiny}
+\def\pgfutil@font@scriptsize{\scriptsize}
+\def\pgfutil@font@footnotesize{\footnotesize}
+\def\pgfutil@font@small{\small}
+\def\pgfutil@font@normalsize{\normalsize}
+\def\pgfutil@font@large{\large}
+\def\pgfutil@font@Large{\Large}
+\def\pgfutil@font@huge{\huge}
+\def\pgfutil@font@Huge{\Huge}
+
+\def\pgfutil@font@itshape{\itshape}
+\def\pgfutil@font@bfseries{\bfseries}
+
+\def\pgfutil@font@normalfont{\normalfont}
+
+\def\pgfutil@usemodule#1{\usepackage{#1}}
+
+\let\pgfutil@selectfont=\selectfont
+
+\let\pgfutil@tempboxa=\@tempboxa
+
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempcnta\pgfutil@tempcnta
+\let\pgfmath@tempcntb\pgfutil@tempcntb
+
+\def\pgfutil@check@rerun#1#2{\@newl@bel{pgf@lab}{#1}{#2}}
+
+\AtBeginDocument{\AtEndDocument{\clearpage\the\pgfutil@everybye}}
+
+\def\pgfutil@insertatbegincurrentpagefrombox#1{%
+ \edef\pgf@temp{\the\wd\pgfutil@abb}%
+ \global\setbox\pgfutil@abb\hbox{%
+ \unhbox\pgfutil@abb%
+ %
+ % the order in which \pgfutil@insertatbegincurrentpagefrombox
+ % matters unless we make the following -shift!
+ % To see this, consider writing two such statements. The second
+ % one will (naturally) be placed more to the right, although there
+ % is no apparent reason why it should.
+ %
+ % CF observed problems when placing patterns in XObjects without
+ % this skip (dvipdfmx driver for pgfplots shader=interp)
+ \hskip-\pgf@temp\relax%
+ #1%
+ }%
+}
+\newbox\pgfutil@abb%
+\def\pgfutil@insertatbegincurrentpage#1{%
+ \expandafter\gdef\expandafter\pgfutil@abc\expandafter{\pgfutil@abc#1}%
+}
+\let\pgfutil@abc\pgfutil@empty%
+\def\pgfutil@insertatbegineverypage#1{%
+ \expandafter\gdef\expandafter\pgfutil@abe\expandafter{\pgfutil@abe#1}%
+}
+\let\pgfutil@abe\pgfutil@empty%
+
+\RequirePackage{everyshi}
+\EveryShipout{%
+ % Add at begin page stuff
+ \setbox\@cclv=\vbox{%
+ \setbox\z@=\hbox{%
+ % the boxes \pgfutil@abe ("every page") and \pgfutil@abb ("current page")
+ % are used to generate pdf objects / dictionaries which are
+ % required for the graphics which are somewhere in the "real"
+ % page content.
+ % BUT: these pdf objects MUST NOT be affected by text layout
+ % shifts! Consequently, we have to undo \hoffset and \voffset
+ % (which are h/v shifts to the page layout).
+ %
+ % Note that this of importance for shadings. To be more
+ % specific: try out shadings with standalone (which uses
+ % \hoffset) and with xdvipdfmx (which appears to be more
+ % fragile than pdflatex) - they break unless we undo \hoffset
+ % and \voffset.
+ \ifdim\hoffset=0pt \else \hskip-\hoffset\fi
+ \pgfutil@abe\unhbox\pgfutil@abb\pgfutil@abc\global\let\pgfutil@abc\pgfutil@empty
+ \ifdim\hoffset=0pt \else \hskip+\hoffset\fi
+ }%
+ \wd\z@=\z@%
+ \ht\z@=\z@%
+ \dp\z@=\z@%
+ % ... see remark above regarding \hoffset/\voffset:
+ \ifdim\voffset=0pt \else \vskip-\voffset\fi
+ \box\z@%
+ \ifdim\voffset=0pt \else \vskip+\voffset\fi
+ %
+ % if TeX changes into vertical mode, it inserts \parskip and
+ % \lineskip. Disable it here:
+ \nointerlineskip%
+ \ifvbox\@cclv \unvbox\@cclv \else\hsize=\wd\@cclv \noindent\unhbox\@cclv \fi%
+ %\box\@cclv
+ % using \box instead of \unhbox or \unvbox
+ % has the advantage that glue settings won't be
+ % altered (as for \unhbox/\unvbox). But \box breaks compatibility
+ % with the 'remember picture' feature.
+ }%
+}
+
+% Preview hack: preview.sty hacks into \shipout (which is ok), but
+% does not honour everyshi.sty (which is not ok). This causes everyshi
+% material to get lost.
+\AtBeginDocument{
+ \@ifpackageloaded{preview}{%
+ % Ok, package loaded. Swap definitions of everyshi.sty's shipout
+ % and preview.sty's shipout:
+ \ifPreview
+ \let\shipout\@EveryShipout@Org@Shipout%This is the null version of \shipout, created by preview and saved by everyshi
+ \let\@EveryShipout@Org@Shipout\pr@shipout% This is the original shipout
+ \let\pr@shipout\@EveryShipout@Shipout%
+ \fi
+ }{}%
+}
+
+% Guess the driver:
+
+\def\pgfutil@guessdriver{
+ \ifx\HCode\@undefined%
+ \edef\pgfsysdriver{pgfsys-\Gin@driver}% should be right
+ \else%
+ \def\pgfsysdriver{pgfsys-tex4ht.def}% should be right
+ \fi%
+}
+
+% pgfcalendar uses translations
+
+\ifx\translate\@undefined % check if \translate is available
+ \def\pgfutil@translate#1{#1}
+\else
+ \def\pgfutil@translate#1{\translate{#1}}
+\fi
+
+% e-TeX primitives
+
+\pgfutil@IfUndefined{protected}{%
+ \def\pgfutil@protected{}%
+}{%
+ \let\pgfutil@protected\protected
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/pgfutil-plain.def b/graphics/pgf/base/tex/pgfutil-plain.def
new file mode 100644
index 0000000000..090fcaeb5a
--- /dev/null
+++ b/graphics/pgf/base/tex/pgfutil-plain.def
@@ -0,0 +1,337 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+
+\pgfutil@format@is@plaintrue
+
+
+% The aux files, needed for reading back coordinates
+\def\pgfutil@aux@read@hook{
+ \pgfutil@IfFileExists{\jobname.pgf}{\input \jobname.pgf\relax}{}
+ \csname newwrite\endcsname\pgfutil@auxout
+ \immediate\csname openout\endcsname\pgfutil@auxout\jobname.pgf
+}
+\def\pgfutil@writetoaux#1{\write\pgfutil@auxout{#1}}
+
+% XColor-like support for plain TeX
+
+\def\pgfutil@definecolor#1#2#3{\csname pgfutil@emu@#2\endcsname{#1}#3\@nil}
+
+\def\pgfutil@emu@rgb#1#2,#3,#4\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{rgb}{#2,#3,#4}}}
+\def\pgfutil@emu@gray#1#2\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{rgb}{#2,#2,#2}}}
+
+\pgfutil@definecolor{white}{gray}{1}
+\pgfutil@definecolor{black}{gray}{0}
+\pgfutil@definecolor{gray}{gray}{0.5}
+\pgfutil@definecolor{red}{rgb}{1,0,0}
+\pgfutil@definecolor{green}{rgb}{0,1,0}
+\pgfutil@definecolor{blue}{rgb}{0,0,1}
+\pgfutil@definecolor{cyan}{rgb}{0,1,1}
+\pgfutil@definecolor{magenta}{rgb}{1,0,1}
+\pgfutil@definecolor{yellow}{rgb}{1,1,0}
+\pgfutil@definecolor{orange}{rgb}{1,0.5,0}
+\pgfutil@definecolor{violet}{rgb}{0.5,0,0.5}
+\pgfutil@definecolor{purple}{rgb}{0.75,0,0.25}
+\pgfutil@definecolor{brown}{rgb}{0.75,0.5,0.25}
+
+\def\pgfutil@color#1{%
+ \pgfutil@colorlet{.}{#1}%
+ \pgfsysprotocol@getcurrentprotocol\pgfutil@emu@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsetcolor{.}%
+ \expandafter\pgfsys@outerinvoke\expandafter{\pgfsysprotocol@currentprotocol}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@emu@temp%
+ \aftergroup\pgfutil@reset@color%
+}
+
+\def\pgfutil@extractcolorspec#1#2{%
+ \def#2{{#1}}%
+}
+
+\def\pgfutil@convertcolorspec#1#2#3{%
+ \edef#3{\expandafter\expandafter\expandafter\pgfutil@emu@select\csname\string\color@#1\endcsname}%
+}
+
+
+\def\pgfutil@doifcolorelse#1#2#3{%
+ \expandafter\ifx\csname\string\color@#1\endcsname\relax%
+ \let\pgf@next=\pgfutil@secondoftwo%
+ \else
+ \let\pgf@next=\pgfutil@firstoftwo%
+ \fi%
+ \pgf@next{#2}{#3}%
+}
+
+
+\def\pgfutil@reset@color{%
+ \pgfsysprotocol@getcurrentprotocol\pgfutil@emu@temp%
+ {%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
+ \pgfsysprotocol@bufferedtrue%
+ \pgfsetcolor{.}%
+ \expandafter\pgfsys@outerinvoke\expandafter{\pgfsysprotocol@currentprotocol}%
+ }%
+ \pgfsysprotocol@setcurrentprotocol\pgfutil@emu@temp%
+}
+\expandafter\def\csname\string\color@.\endcsname{\xcolor@{}{}{rgb}{0,0,0}}
+
+\def\pgfutil@colorlet#1#2{%
+ \edef\pgf@marshal{#2}%
+ \expandafter\pgfutil@in@\expandafter!\expandafter{\pgf@marshal}%
+ \ifpgfutil@in@%
+ % compute mixture
+ {%
+ \expandafter\pgfutil@emu@mix\pgf@marshal!white!\@nil%
+ \xdef\pgf@marshal{\noexpand\def\expandafter\noexpand\csname\string\color@#1\endcsname{%
+ \noexpand\xcolor@{}{}{rgb}{\pgf@sys@tonumber\pgf@xa,\pgf@sys@tonumber\pgf@xb,\pgf@sys@tonumber\pgf@xc}}}%
+ }%
+ \pgf@marshal%
+ \else%
+ \edef\pgf@marshal{\noexpand\let\expandafter\noexpand\csname\string\color@#1\endcsname=%
+ \expandafter\noexpand\csname\string\color@#2\endcsname}%
+ \pgf@marshal%
+ \fi%
+}
+\def\pgfutil@emu@mix#1!#2!#3!#4\@nil{%
+ \expandafter\expandafter\expandafter\pgfutil@emu@unpack\csname\string\color@#1\endcsname%
+ \pgf@ya=\pgf@xa%
+ \pgf@yb=\pgf@xb%
+ \pgf@yc=\pgf@xc%
+ \expandafter\expandafter\expandafter\pgfutil@emu@unpack\csname\string\color@#3\endcsname%
+ \c@pgf@counta=#2\relax%
+ \c@pgf@countb=100\relax%
+ \advance\c@pgf@countb by-\c@pgf@counta\relax%
+ \pgf@xa=\c@pgf@countb\pgf@xa%
+ \advance\pgf@xa by\c@pgf@counta\pgf@ya%
+ \divide\pgf@xa by 100\relax%
+ \pgf@xb=\c@pgf@countb\pgf@xb%
+ \advance\pgf@xb by\c@pgf@counta\pgf@yb%
+ \divide\pgf@xb by 100\relax%
+ \pgf@xc=\c@pgf@countb\pgf@xc%
+ \advance\pgf@xc by\c@pgf@counta\pgf@yc%
+ \divide\pgf@xc by 100\relax%
+}
+\def\pgfutil@emu@unpack#1#2#3#4#5{%
+ \pgfutil@emu@@unpack#5\@nil%
+}
+\def\pgfutil@emu@@unpack#1,#2,#3\@nil{%
+ \pgf@xa=#1pt%
+ \pgf@xb=#2pt%
+ \pgf@xc=#3pt%
+}
+
+\def\pgfutil@emu@select#1#2#3#4#5{#5}
+
+
+
+\let\definecolor=\pgfutil@definecolor
+\let\color=\pgfutil@color
+\let\colorlet=\pgfutil@colorlet
+\let\extractcolorspec=\pgfutil@extractcolorspec
+\let\convertcolorspec=\pgfutil@convertcolorspec
+
+\def\XC@tgt@mod#1{#1}
+\def\XC@sdef#1#2{\edef#1{#2}}
+\def\XC@mod@cmyk{cmyk}
+\def\XC@mod@rgb{rgb}
+
+
+% pgfutil@minipage
+
+\def\pgfutil@minipage[#1]#2{%
+ \hbox to#2\bgroup%
+ \hsize=#2\relax%
+ \vbox\bgroup\noindent%
+}
+\def\pgfutil@endminipage{\egroup\egroup}
+
+
+
+% Driver detector (not so good):
+
+\ifx\pdfoutput\@undefined\alloc@0\count\countdef\insc@unt\pdfoutput\fi
+\ifx\pdfoutput\relax\alloc@0\count\countdef\insc@unt\pdfoutput\fi
+
+\def\pgfutil@guessdriver{
+ \ifx\directlua\@undefined
+ \ifx\HCode\@undefined%
+ \ifcase\pdfoutput%
+ \ifx\XeTeXversion\@undefined
+ \def\pgfsysdriver{pgfsys-dvips.def}% hopefully
+ \else
+ \def\pgfsysdriver{pgfsys-xetex.def}% should be right
+ \fi
+ \else%
+ \def\pgfsysdriver{pgfsys-pdftex.def}% should be right
+ \fi%
+ \else%
+ \def\pgfsysdriver{pgfsys-tex4ht.def}% should be right
+ \fi%
+ \else
+ \def\pgfsysdriver{pgfsys-luatex.def}%
+ \fi
+}
+
+
+
+% Global colors
+
+\let\pgfutil@globalcolorsfalse=\relax
+\let\pgfutil@globalcolorstrue=\relax
+
+
+
+% Font stuff
+
+\def\pgfutil@font@tiny{\fam\z@\fiverm} % How to do this correctly?
+\def\pgfutil@font@scriptsize{\fam\z@\sevenrm}
+\def\pgfutil@font@footnotesize{\rm}
+\def\pgfutil@font@small{\fam\z@\ninerm}
+\def\pgfutil@font@normalsize{\rm}
+\def\pgfutil@font@large{\rm}
+\def\pgfutil@font@Large{\rm}
+\def\pgfutil@font@huge{\rm}
+\def\pgfutil@font@Huge{\rm}
+
+\def\pgfutil@font@itshape{\it}
+\def\pgfutil@font@bfseries{\bf}
+
+\let\pgfutil@font@normalfont=\rm
+
+\let\pgfutil@selectfont=\rm
+
+
+% Extra counters, registers, boxes
+
+\newcount\pgfutil@tempcnta
+\newcount\pgfutil@tempcntb
+
+\newbox\pgfutil@tempboxa
+
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempdima\pgfutil@tempdima
+\let\pgfmath@tempcnta\pgfutil@tempcnta
+\let\pgfmath@tempcntb\pgfutil@tempcntb
+
+% From LaTeX
+\newskip\pgfutil@flushglue
+\pgfutil@flushglue=0pt plus 1fil
+
+% Module stuff
+
+\def\pgfutil@usemodule#1{\input #1.tex}
+
+
+
+% End of file stuff
+
+\let\pgfutil@origend=\end
+\def\end{\the\pgfutil@everybye\pgfutil@origend}
+
+% Link to existing stuff
+\let\pgfutil@voidb@x\voidb@x
+\let\pgfutil@toks@\toks@
+
+
+
+
+% Hack shipout. Now use atbegshi
+
+\def\pgfutil@insertatbegincurrentpagefrombox#1{%
+ \edef\pgf@temp{\the\wd\pgfutil@abb}%
+ \global\setbox\pgfutil@abb\hbox{%
+ \unhbox\pgfutil@abb
+ %
+ % the order in which \pgfutil@insertatbegincurrentpagefrombox
+ % matters unless we make the following -shift!
+ % To see this, consider writing two such statements. The second
+ % one will (naturally) be placed more to the right, although there
+ % is no apparent reason why it should.
+ %
+ % CF observed problems when placing patterns in XObjects without
+ % this skip (dvipdfmx driver for pgfplots shader=interp)
+ \hskip-\pgf@temp\relax
+ #1%
+ }%
+}
+\newbox\pgfutil@abb%
+\def\pgfutil@insertatbegincurrentpage#1{%
+ \expandafter\gdef\expandafter\pgfutil@abc\expandafter{\pgfutil@abc#1}%
+}
+\let\pgfutil@abc\pgfutil@empty%
+\def\pgfutil@insertatbegineverypage#1{%
+ \expandafter\gdef\expandafter\pgfutil@abe\expandafter{\pgfutil@abe#1}%
+}
+\let\pgfutil@abe\pgfutil@empty%
+
+% Code by Heiko Oberdiek on ctt
+\input atbegshi.sty\relax
+\AtBeginShipout{%
+ \setbox\AtBeginShipoutBox=\vbox{%
+ \setbox0=\hbox{%
+ \begingroup
+ % the boxes \pgfutil@abe ("every page") and \pgfutil@abb ("current page")
+ % are used to generate pdf objects / dictionaries which are
+ % required for the graphics which are somewhere in the "real"
+ % page content.
+ % BUT: these pdf objects MUST NOT be affected by text layout
+ % shifts! Consequently, we have to undo \hoffset and \voffset
+ % (which are h/v shifts to the page layout).
+ %
+ % Note that this of importance for shadings. To be more
+ % specific: try out shadings with standalone (which uses
+ % \hoffset) and with xdvipdfmx (which appears to be more
+ % fragile than pdflatex) - they break unless we undo \hoffset
+ % and \voffset.
+ \ifdim\hoffset=0pt \else \hskip-\hoffset\fi
+ \pgfutil@abe
+ \unhbox\pgfutil@abb
+ \pgfutil@abc
+ \global\let\pgfutil@abc\pgfutil@empty
+ \ifdim\hoffset=0pt \else \hskip+\hoffset\fi
+ \endgroup
+ }%
+ \wd0=0pt\relax
+ \ht0=0pt\relax
+ \dp0=0pt\relax
+ % ... see remark above regarding \hoffset/\voffset:
+ \ifdim\voffset=0pt \else \vskip-\voffset\fi
+ \box0 %
+ \ifdim\voffset=0pt \else \vskip+\voffset\fi
+ \nointerlineskip
+ \box\AtBeginShipoutBox
+ }%
+}%
+% End of HO code
+
+% The following is still messy and needs to be cleanup up (everything
+% prefixed by pgfutil@):
+
+%\def\PackageInfo#1#2{}
+%\def\PackageWarning#1#2{\immediate\write17{Package #1: Warning! #2.}}%
+%\def\PackageError#1#2#3{\immediate\write17{Package #1: Error! #2.}}%
+\long\def\AtBeginDocument#1{#1}%
+
+% pgfcalendar uses translations
+
+\def\pgfutil@translate#1{#1} % is there a translator package for plain?
+
+% e-TeX primitives
+
+\pgfutil@IfUndefined{protected}{
+ \def\pgfutil@protected{}%
+}{%
+ \let\pgfutil@protected\protected
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgf.tex b/graphics/pgf/base/tex/t-pgf.tex
new file mode 100644
index 0000000000..333d7c3d14
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgf.tex
@@ -0,0 +1,34 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgf.
+
+\writestatus{loading}{ConTeXt User Module / pgf}
+
+\unprotect
+
+
+\ifx\pgfdefined\undefined
+\let\pgfdefined=\relax
+
+\input t-pgfcor.tex
+
+\usepgfmodule[shapes,plot]
+
+%\input t-pgfbsn.tex
+%\input t-pgfbde.tex
+%\input t-pgfbma.tex
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfbim.tex b/graphics/pgf/base/tex/t-pgfbim.tex
new file mode 100644
index 0000000000..943a34cf83
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbim.tex
@@ -0,0 +1,22 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbaseimage.
+\writestatus{loading}{ConTeXt User Module / pgfbim}
+
+\unprotect
+
+
+\PackageWarning{pgf}{This module is obsolete and no longer needed}
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfbla.tex b/graphics/pgf/base/tex/t-pgfbla.tex
new file mode 100644
index 0000000000..982d83e4d5
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbla.tex
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbaselayers.
+
+\PackageWarning{pgf}{This module is obsolete and no longer needed}
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/base/tex/t-pgfbma.tex b/graphics/pgf/base/tex/t-pgfbma.tex
new file mode 100644
index 0000000000..a326d04902
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbma.tex
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbasematrix.
+
+\PackageWarning{pgf}{This module is obsolete. Use \string\usepgfmodule[matrix] instead}
+
+\usepgfmodule[matrix]
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/base/tex/t-pgfbpl.tex b/graphics/pgf/base/tex/t-pgfbpl.tex
new file mode 100644
index 0000000000..be25da0217
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbpl.tex
@@ -0,0 +1,18 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbaseplot.
+
+\PackageWarning{pgf}{This module is obsolete. Use \string\usepgfmodule[plot] instead}
+
+\usepgfmodule[plot]
+
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/base/tex/t-pgfbpt.tex b/graphics/pgf/base/tex/t-pgfbpt.tex
new file mode 100644
index 0000000000..ce33b46c67
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbpt.tex
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbasepatterns.
+
+\PackageWarning{pgf}{This module is obsolete and no longer needed}
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/base/tex/t-pgfbsh.tex b/graphics/pgf/base/tex/t-pgfbsh.tex
new file mode 100644
index 0000000000..e7d83ce0c4
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbsh.tex
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbaseshapes.
+
+\PackageWarning{pgf}{This module is obsolete. Use \string\usepgfmodule[shapes] instead}
+
+\usepgfmodule[shapes]
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/base/tex/t-pgfbsn.tex b/graphics/pgf/base/tex/t-pgfbsn.tex
new file mode 100644
index 0000000000..037108b1d6
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfbsn.tex
@@ -0,0 +1,18 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfbasesnakes.
+
+\PackageWarning{pgf}{This module is obsolete. Use \string\usepgfmodule[decorations] instead}
+
+\usepgfmodule[decorations]
+
+
+\endinput \ No newline at end of file
diff --git a/graphics/pgf/base/tex/t-pgfcal.tex b/graphics/pgf/base/tex/t-pgfcal.tex
new file mode 100644
index 0000000000..4651a99cf9
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfcal.tex
@@ -0,0 +1,36 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+% ConTeXt module pgfcalendar.
+\writestatus{loading}{ConTeXt User Module / pgfcalendar}
+
+\unprotect
+
+
+\ifx\pgfcalendardefined\undefined
+\let\pgfcalendardefined=\relax
+
+\input t-pgfrcs.tex
+
+\edef\pgfcalendaratcode{\the\catcode`\@}
+\edef\pgfcalendarbarcode{\the\catcode`\|}
+\catcode`\@=11
+\catcode`\|=12
+
+\input pgfcalendar.code.tex
+
+\catcode`\@=\pgfcalendaratcode
+\catcode`\|=\pgfcalendarbarcode
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfcor.tex b/graphics/pgf/base/tex/t-pgfcor.tex
new file mode 100644
index 0000000000..975bfc252c
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfcor.tex
@@ -0,0 +1,60 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfcore.
+\writestatus{loading}{ConTeXt User Module / pgfcor}
+
+\unprotect
+
+
+
+\ifx\pgfcoredefined\undefined
+\let\pgfcoredefined=\relax
+
+\input t-pgfsys.tex
+
+\edef\pgfcoreatcode{\the\catcode`\@}
+\edef\pgfcorebarcode{\the\catcode`\|}
+\edef\pgfcoreexclaimcode{\the\catcode`\!}
+\catcode`\@=11
+\catcode`\|=12
+\catcode`\!=12
+
+
+\input pgfcore.code.tex
+
+\catcode`\@=\pgfcoreatcode
+\catcode`\|=\pgfcorebarcode
+\catcode`\!=\pgfcoreexclaimcode
+
+\let\startpgfpicture=\pgfpicture
+\let\stoppgfpicture=\endpgfpicture
+
+\let\startpgfscope=\pgfscope
+\let\stoppgfscope=\endpgfscope
+
+\let\startpgflowlevelscope=\pgflowlevelscope
+\let\stoppgflowlevelscope=\endpgflowlevelscope
+
+\let\startpgfinterruptpath=\pgfinterruptpath
+\let\stoppgfinterruptpath=\endpgfinterruptpath
+
+\let\startpgfinterruptpicture=\pgfinterruptpicture
+\let\stoppgfinterruptpicture=\endpgfinterruptpicture
+
+\let\startpgfinterruptboundingbox=\pgfinterruptboundinbox
+\let\stoppgfinterruptboudingbox=\endpgfinterruptboundingbox
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgffor.tex b/graphics/pgf/base/tex/t-pgffor.tex
new file mode 100644
index 0000000000..390e9dccde
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgffor.tex
@@ -0,0 +1,37 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+% ConTeXt module pgffor.
+\writestatus{loading}{ConTeXt User Module / pgffor}
+
+\unprotect
+
+
+\ifx\pgffordefined\undefined
+\let\pgffordefined=\relax
+
+\input t-pgfrcs.tex
+\input t-pgfkey.tex
+
+\edef\pgfforatcode{\the\catcode`\@}
+\edef\pgfforbarcode{\the\catcode`\|}
+\catcode`\@=11
+\catcode`\|=12
+
+\input pgffor.code.tex
+
+\catcode`\@=\pgfforatcode
+\catcode`\|=\pgfforbarcode
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfkey.tex b/graphics/pgf/base/tex/t-pgfkey.tex
new file mode 100644
index 0000000000..291384bc58
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfkey.tex
@@ -0,0 +1,34 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+% ConTeXt module pgfkeys.
+\writestatus{loading}{ConTeXt User Module / pgfkey}
+
+\unprotect
+
+
+\ifx\pgfkeysdefined\undefined
+\let\pgfkeysdefined=\relax
+
+\edef\pgfkeysatcode{\the\catcode`\@}
+\edef\pgfkeysbarcode{\the\catcode`\|}
+\catcode`\@=11
+\catcode`\|=12
+
+\input pgfkeys.code.tex
+
+\catcode`\@=\pgfkeysatcode
+\catcode`\|=\pgfkeysbarcode
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfmat.tex b/graphics/pgf/base/tex/t-pgfmat.tex
new file mode 100644
index 0000000000..bdc8e6569d
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfmat.tex
@@ -0,0 +1,38 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfmath.
+\writestatus{loading}{ConTeXt User Module / pgfmath}
+
+\unprotect
+
+
+\ifx\pgfmathdefined\undefined
+\let\pgfmathdefined=\relax
+
+\edef\pgfmathatcode{\the\catcode`\@}
+\edef\pgfmathbarcode{\the\catcode`\|}
+\edef\pgfmathexclaimcode{\the\catcode`\!}
+\catcode`\@=11
+\catcode`\|=12
+\catcode`\!=12
+
+\input pgfmath.code.tex
+
+\catcode`\@=\pgfmathatcode
+\catcode`\|=\pgfmathbarcode
+\catcode`\!=\pgfmathexclaimcode
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfmod.tex b/graphics/pgf/base/tex/t-pgfmod.tex
new file mode 100644
index 0000000000..d8c0fa39c8
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfmod.tex
@@ -0,0 +1,51 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\writestatus{loading}{ConTeXt User Module / pgfmodules}
+
+\unprotect
+
+
+% ConTeXt module pgfmodules.
+
+% This module defines the correct names for the context modules.
+%
+% This is necessary because context cuts down all module names to 6
+% characters.
+%
+% One starts to wonder whether context was already used in the Apollo
+% missions...
+
+\ifx\pgfmoddefined\undefined
+\let\pgfmoddefined=\relax
+
+\definefilesynonym [pgfmath] [pgfmat]
+\definefilesynonym [pgfkeys] [pgfkey]
+
+\definefilesynonym [pgfcore] [pgfcor]
+
+\definefilesynonym [pgfbasesnakes] [pgfbsn]
+\definefilesynonym [pgfbaseshapes] [pgfbsh]
+\definefilesynonym [pgfbaseplots] [pgfbpl]
+\definefilesynonym [pgfbaselayers] [pgfbla]
+\definefilesynonym [pgfbaseimage] [pgfbim]
+\definefilesynonym [pgfbasepatterns] [pgfbpt]
+\definefilesynonym [pgfbasematrix] [pgfbma]
+\definefilesynonym [pgfbasetransparency] [pgfbtr]
+
+\definefilesynonym [pgfcalendar] [pgfcal]
+
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfrcs.tex b/graphics/pgf/base/tex/t-pgfrcs.tex
new file mode 100644
index 0000000000..b4bb290b16
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfrcs.tex
@@ -0,0 +1,42 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+% ConTeXt module pgfrcs.
+\writestatus{loading}{ConTeXt User Module / pgfrcs}
+
+\unprotect
+
+
+\ifx\pgfrcsdefined\undefined
+\let\pgfrcsdefined=\relax
+
+\input t-pgfmod.tex
+
+\edef\pgfrcsatcode{\the\catcode`\@}
+\edef\pgfrcsbarcode{\the\catcode`\|}
+\edef\pgfrcsexclaimcode{\the\catcode`\!}
+\catcode`\@=11
+\catcode`\|=12
+\catcode`\!=12
+
+\input pgfutil-common.tex
+\input pgfutil-context.def
+
+\input pgfrcs.code.tex
+
+\catcode`\@=\pgfrcsatcode
+\catcode`\|=\pgfrcsbarcode
+\catcode`\!=\pgfrcsexclaimcode
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-pgfsys.tex b/graphics/pgf/base/tex/t-pgfsys.tex
new file mode 100644
index 0000000000..5d78653282
--- /dev/null
+++ b/graphics/pgf/base/tex/t-pgfsys.tex
@@ -0,0 +1,42 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module pgfsys.
+\writestatus{loading}{ConTeXt User Module / pgfsys}
+
+\unprotect
+
+
+\ifx\pgfsysdefined\undefined
+\let\pgfsysdefined=\relax
+
+\input t-pgfrcs.tex
+
+\edef\pgfsysatcode{\the\catcode`\@}
+\edef\pgfsysbarcode{\the\catcode`\|}
+\edef\pgfsysexclaimcode{\the\catcode`\!}
+\catcode`\@=11
+\catcode`\|=12
+\catcode`\!=12
+
+\input pgfsys.code.tex
+\input pgfsyssoftpath.code.tex
+\input pgfsysprotocol.code.tex
+
+\catcode`\@=\pgfsysatcode
+\catcode`\|=\pgfsysbarcode
+\catcode`\!=\pgfsysexclaimcode
+
+\fi
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/t-tikz.tex b/graphics/pgf/base/tex/t-tikz.tex
new file mode 100644
index 0000000000..85c6fcf2f0
--- /dev/null
+++ b/graphics/pgf/base/tex/t-tikz.tex
@@ -0,0 +1,41 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+% ConTeXt module tikz.
+\writestatus{loading}{ConTeXt User Module / tikz}
+
+\unprotect
+
+
+% \input xkeyval.tex % no longer used/needed
+
+\input t-pgf.tex
+\input t-pgffor.tex
+
+\edef\tikzatcode{\the\catcode`\@}
+\edef\tikzbarcode{\the\catcode`\|}
+\edef\tikzexclaimcode{\the\catcode`\!}
+\catcode`\@=11
+\catcode`\|=12
+\catcode`\!=12
+
+\input tikz.code.tex
+
+\catcode`\@=\tikzatcode
+\catcode`\|=\tikzbarcode
+\catcode`\!=\tikzexclaimcode
+
+\let\starttikzpicture=\tikzpicture
+\let\stoptikzpicture=\endtikzpicture
+
+\stopmodule
+
+\protect
+\endinput
diff --git a/graphics/pgf/base/tex/tikz.code.tex b/graphics/pgf/base/tex/tikz.code.tex
new file mode 100644
index 0000000000..5f67167ad3
--- /dev/null
+++ b/graphics/pgf/base/tex/tikz.code.tex
@@ -0,0 +1,5588 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesPackageRCS{tikz.code.tex}
+
+
+\def\tikzerror#1{\pgfutil@packageerror{tikz}{#1}{}}
+
+% Always-present libraries (|\usepgflibrary| defined in
+% \file{pgfutil-common.tex}).
+\usepgflibrary{plothandlers}
+
+\newdimen\tikz@lastx
+\newdimen\tikz@lasty
+\newdimen\tikz@lastxsaved
+\newdimen\tikz@lastysaved
+\newdimen\tikz@lastmovetox
+\newdimen\tikz@lastmovetoy
+
+\newdimen\tikzleveldistance
+\newdimen\tikzsiblingdistance
+
+\newbox\tikz@figbox
+\newbox\tikz@figbox@bg
+\newbox\tikz@tempbox
+\newbox\tikz@tempbox@bg
+
+\newcount\tikztreelevel
+\newcount\tikznumberofchildren
+\newcount\tikznumberofcurrentchild
+
+\newcount\tikz@fig@count
+
+\newif\iftikz@node@is@a@label
+\newif\iftikz@snaked
+\newif\iftikz@decoratepath
+
+\let\tikz@options\pgfutil@empty
+% |\tikz@addoption| adds \texttt{#1} at the end of the replacement
+% text of |\tikz@options| without expansion.
+\def\tikz@addoption#1{%
+ \expandafter\def\expandafter\tikz@options\expandafter{\tikz@options#1}}%
+% Same as |tikz@addoption| for |\tikz@mode|. Note that |\tikz@mode| is
+% initially let to |\pgfutil@empty| later (see path usage options).
+\def\tikz@addmode#1{%
+ \expandafter\def\expandafter\tikz@mode\expandafter{\tikz@mode#1}}%
+% Same as |tikz@addoption| for |\tikz@transform|. Works even if
+% |\tikz@transform| is not defined. In that case, nothing is added to
+% |\tikz@transform|: \texttt{#1} is expanded.
+\def\tikz@addtransform#1{%
+ \ifx\tikz@transform\relax
+ #1%
+ \else
+ \expandafter\def\expandafter\tikz@transform\expandafter{\tikz@transform#1}%
+ \fi
+}%
+
+
+% TikZ options management.
+
+% Setting up the tikz key family (key management needs
+% \file{pgfkeys.code.tex});
+\pgfkeys{/tikz/.is family}%
+
+% |\tikzset| is a shortcut to set keys that belongs to the tikz
+% family.
+\def\tikzset{\pgfqkeys{/tikz}}%
+
+% Note: |\tikzoption| is supported for compatibility only. |\tikzset|
+% should be used instead.
+\def\tikzoption#1{%
+ \pgfutil@ifnextchar[%]
+ {\tikzoption@opt{#1}}{\tikzoption@noopt{#1}}}%
+\def\tikzoption@opt#1[#2]#3{%
+ \pgfkeysdef{/tikz/#1}{#3}%
+ \pgfkeyssetvalue{/tikz/#1/.@def}{#2}}%
+\def\tikzoption@noopt#1#2{%
+ \pgfkeysdef{/tikz/#1}{#2}%
+ \pgfkeyssetvalue{/tikz/#1/.@def}{\pgfkeysvaluerequired}}%
+
+% Baseline options
+\tikzoption{baseline}[0pt]{%
+ \pgfutil@ifnextchar(%)
+ {\tikz@baseline@coordinate}{\tikz@baseline@simple}#1\@nil}%
+\def\tikz@baseline@simple#1\@nil{\pgfsetbaseline{#1}}%
+\def\tikz@baseline@coordinate#1\@nil{%
+ \pgfsetbaselinepointlater{\tikz@scan@one@point\pgfutil@firstofone#1}}%
+
+\tikzoption{trim left}[0pt]{\pgfutil@ifnextchar({\tikz@trim@coordinate{left}}{\tikz@trim@simple{left}}#1\@nil}%)%
+\tikzoption{trim right}{\pgfutil@ifnextchar({\tikz@trim@coordinate{right}}{\tikz@trim@simple{right}}#1\@nil}%)%
+\def\tikz@trim@simple#1#2\@nil{\csname pgfsettrim#1\endcsname{#2}}%
+\def\tikz@trim@coordinate#1#2\@nil{\csname pgfsettrim#1pointlater\endcsname{\tikz@scan@one@point\pgfutil@firstofone#2}}%
+
+% Draw options
+\tikzoption{line width}{\tikz@semiaddlinewidth{#1}}%
+
+\def\tikz@semiaddlinewidth#1{\tikz@addoption{\pgfsetlinewidth{#1}}\pgfmathsetlength\pgflinewidth{#1}}%
+
+\tikzoption{cap}{\tikz@addoption{\csname pgfset#1cap\endcsname}}%
+\tikzoption{join}{\tikz@addoption{\csname pgfset#1join\endcsname}}%
+\tikzoption{line cap}{\tikz@addoption{\csname pgfset#1cap\endcsname}}%
+\tikzoption{line join}{\tikz@addoption{\csname pgfset#1join\endcsname}}%
+\tikzoption{miter limit}{\tikz@addoption{\pgfsetmiterlimit{#1}}}%
+
+\tikzoption{dash pattern}{% syntax: on 2pt off 3pt on 4pt ...
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \def\tikz@dashpattern{}%
+ \tikz@addoption{\pgfsetdash{}{0pt}}%
+ \else%
+ \def\tikz@dashpattern{}%
+ \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
+ \edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
+ \expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
+ \fi}%
+\tikzoption{dash phase}{%
+ \def\tikz@dashphase{#1}%
+ \edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
+ \expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
+}%
+\tikzoption{dash}{\tikz@parse@full@dash#1\pgf@stop}%
+\def\tikz@parse@full@dash#1phase#2\pgf@stop{%
+ \def\tikz@dashphase{#2}%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \def\tikz@dashpattern{}%
+ \tikz@addoption{\pgfsetdash{}{0pt}}%
+ \else%
+ \def\tikz@dashpattern{}%
+ \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
+ \edef\tikz@temp{{\tikz@dashpattern}{\noexpand\tikz@dashphase}}%
+ \expandafter\tikz@addoption\expandafter{\expandafter\pgfsetdash\tikz@temp}%
+ \fi%
+}%
+\def\tikz@dashphase{0pt}%
+\def\tikz@dashpattern{}%
+
+\def\tikz@scandashon n#1o{%
+ \expandafter\def\expandafter\tikz@dashpattern\expandafter{\tikz@dashpattern{#1}}%
+ \pgfutil@ifnextchar\@nil{\pgfutil@gobble}{\tikz@scandashoff}}%
+\def\tikz@scandashoff ff#1o{%
+ \expandafter\def\expandafter\tikz@dashpattern\expandafter{\tikz@dashpattern{#1}}%
+ \pgfutil@ifnextchar\@nil{\pgfutil@gobble}{\tikz@scandashon}}%
+
+% use a decoration to expand the `off' section of a dash pattern.
+% https://tex.stackexchange.com/a/133357
+\tikzset{
+ dash expand off/.code={%
+ \ifcsname tikz@library@decorations@loaded\endcsname\else
+ \tikzerror{You need \string\usetikzlibrary{decorations} for ``dash offexpand''}%
+ \fi
+ \tikz@addoption{%
+ \pgfgetpath\currentpath
+ \pgfprocessround{\currentpath}{\currentpath}%
+ \pgf@decorate@parsesoftpath{\currentpath}{\currentpath}%
+ % Parse \on and \off from the current path
+ \edef\on{\expandafter\pgfutil@firstoftwo\tikz@dashpattern}%
+ \edef\off{\expandafter\pgfutil@secondoftwo\tikz@dashpattern}%
+ % \dashphase = max(\on - \dashphase, 0)
+ \pgfmathsubtract@{\on}{\tikz@dashphase}%
+ \pgfmathmax@{\pgfmathresult}{0}%
+ \edef\dashphase{\the\dimexpr\pgfmathresult pt\relax}%
+ % \rest = \pgf@decorate@totalpathlength - \on
+ \edef\rest{\expandafter\pgf@sys@tonumber\dimexpr\pgf@decorate@totalpathlength - \on + 2\dimexpr\dashphase\relax\relax}%
+ % \onoff = \on + \off
+ \edef\onoff{\expandafter\pgf@sys@tonumber\dimexpr\on+\off\relax}%
+ % \nfullonoff = max(floor(\rest/\onoff), 1)
+ \pgfmathdivide@{\rest}{\onoff}%
+ \pgfmathfloor@{\pgfmathresult}%
+ \pgfmathmax@{\pgfmathresult}{1}%
+ % \offexpand = max(\rest/\nfullonoff - \on, \off)
+ \pgfmathdivide@{\rest}{\pgfmathresult}%
+ \pgfmathsubtract@{\pgfmathresult}{\on}%
+ \pgfmathmax@{\pgfmathresult}{\off}%
+ \edef\tikz@marshal{\noexpand\pgfsetdash{{\on}{\pgfmathresult}}{\dashphase}}%
+ \tikz@marshal
+ }%
+ }
+}
+
+\tikzoption{draw opacity}{\tikz@addoption{\pgfsetstrokeopacity{#1}}}%
+
+% Double draw options
+\tikzoption{double}[]{%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@doublefalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \pgfsetinnerstrokecolor{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@doubletrue}%
+ \tikzset{every double/.try}%
+ \fi}%
+\tikzoption{double distance}{%
+ \pgfmathsetlength{\pgf@x}{#1}%
+ \edef\tikz@double@setup{%
+ \pgf@x=\the\pgf@x%
+ \advance\pgf@x by2\pgflinewidth%
+ \pgflinewidth=\pgf@x%
+ \noexpand\pgfsetlinewidth{\pgflinewidth}%
+ \noexpand\pgfsetinnerlinewidth{\the\pgf@x}%
+ }%
+ \tikzset{double}}%
+\def\tikz@double@setup{%
+ \pgf@x=2\pgflinewidth%
+ \advance\pgf@x by0.6pt%
+ \pgflinewidth=\pgf@x%
+ \pgfsetlinewidth{\pgflinewidth}%
+ \pgfsetinnerlinewidth{0.6pt}%
+}%
+\tikzset{double distance between line centers/.code={
+ \pgfmathsetlength{\pgf@x}{#1}%
+ \edef\tikz@double@setup{%
+ \pgf@x=\pgflinewidth%
+ \pgf@xa=\the\pgf@x%
+ \advance\pgf@x by\pgf@xa%
+ \advance\pgf@xa by-\pgflinewidth%
+ \pgflinewidth=\pgf@x%
+ \noexpand\pgfsetlinewidth{\pgflinewidth}%
+ \noexpand\pgfsetinnerlinewidth{\pgf@xa}%
+ }%
+ \tikzset{double}}}%
+\tikzset{double equal sign distance/.style={double distance between line centers=0.45ex}}%
+
+
+
+
+% Fill options
+
+\tikzoption{even odd rule}[]{\tikz@addoption{\pgfseteorule}}%
+\tikzoption{nonzero rule}[]{\tikz@addoption{\pgfsetnonzerorule}}%
+
+\tikzoption{fill opacity}{\tikz@addoption{\pgfsetfillopacity{#1}}}%
+
+
+% Joined fill/draw options
+
+\tikzoption{opacity}{\tikz@addoption{\pgfsetstrokeopacity{#1}\pgfsetfillopacity{#1}}}%
+
+
+% Blend mode
+
+\tikzset{blend mode/.code={\tikz@addoption{\pgfsetblendmode{#1}}}}%
+
+
+% Main color options
+\tikzoption{color}{%
+ \tikz@addoption{%
+ \ifx\tikz@fillcolor\pgfutil@empty%
+ \ifx\tikz@strokecolor\pgfutil@empty%
+ \else%
+ \pgfsys@color@reset@inorderfalse%
+ \let\tikz@strokecolor\pgfutil@empty%
+ \let\tikz@fillcolor\pgfutil@empty%
+ \fi%
+ \else%
+ \pgfsys@color@reset@inorderfalse%
+ \let\tikz@strokecolor\pgfutil@empty%
+ \let\tikz@fillcolor\pgfutil@empty%
+ \fi%
+ \pgfutil@colorlet{tikz@color}{#1}%
+ \pgfutil@colorlet{.}{tikz@color}%
+ %
+ \pgfsetcolor{.}%
+ \pgfsys@color@reset@inordertrue%
+ }%
+ \def\tikz@textcolor{#1}}%
+
+
+
+% Rounding options
+\tikzoption{rounded corners}[4pt]{\pgfsetcornersarced{\pgfpoint{#1}{#1}}}%
+\tikzoption{sharp corners}[]{\pgfsetcornersarced{\pgfpointorigin}}%
+
+% Radii and arc options
+\tikzset{x radius/.initial=0pt}%
+\tikzset{y radius/.initial=0pt}%
+\tikzset{radius/.style={/tikz/x radius=#1,/tikz/y radius=#1}}%
+\tikzset{start angle/.initial=}%
+\tikzset{end angle/.initial=}%
+\tikzset{delta angle/.initial=}%
+
+
+% Coordinate options
+\tikzoption{x}{\tikz@handle@vec{\pgfsetxvec}{\tikz@handle@x}#1\relax}%
+\tikzoption{y}{\tikz@handle@vec{\pgfsetyvec}{\tikz@handle@y}#1\relax}%
+\tikzoption{z}{\tikz@handle@vec{\pgfsetzvec}{\tikz@handle@z}#1\relax}%
+
+\def\tikz@handle@vec#1#2{\pgfutil@ifnextchar({\tikz@handle@coordinate#1}{\tikz@handle@single#2}}%
+\def\tikz@handle@coordinate#1{\tikz@scan@one@point#1}%
+\def\tikz@handle@single#1#2\relax{#1{#2}}%
+\def\tikz@handle@x#1{\pgfsetxvec{\pgfpoint{#1}{0pt}}}%
+\def\tikz@handle@y#1{\pgfsetyvec{\pgfpoint{0pt}{#1}}}%
+\def\tikz@handle@z#1{\pgfsetzvec{\pgfpoint{#1}{#1}}}%
+
+
+% Transformation options
+\tikzoption{scale}{\tikz@addtransform{\pgftransformscale{#1}}}%
+\tikzoption{scale around}{\tikz@addtransform{\def\tikz@aroundaction{\pgftransformscale}\tikz@doaround{#1}}}%
+\tikzoption{xscale}{\tikz@addtransform{\pgftransformxscale{#1}}}%
+\tikzoption{xslant}{\tikz@addtransform{\pgftransformxslant{#1}}}%
+\tikzoption{yscale}{\tikz@addtransform{\pgftransformyscale{#1}}}%
+\tikzoption{yslant}{\tikz@addtransform{\pgftransformyslant{#1}}}%
+\tikzoption{rotate}{\tikz@addtransform{\pgftransformrotate{#1}}}%
+\tikzoption{rotate around}{\tikz@addtransform{\def\tikz@aroundaction{\pgftransformrotate}\tikz@doaround{#1}}}%
+\def\tikz@doaround#1{%
+ \edef\tikz@temp{#1}% get rid of active stuff
+ \expandafter\tikz@doparseA\tikz@temp%
+}%
+\def\tikz@doparseA#1:{%
+ \def\tikz@temp@rot{#1}%
+ \tikz@scan@one@point\tikz@doparseB%
+}%
+\def\tikz@doparseB#1{%
+ \pgf@process{#1}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \tikz@aroundaction{\tikz@temp@rot}%
+ \pgftransformshift{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
+}%
+
+\tikzoption{shift}{\tikz@addtransform{\tikz@scan@one@point\pgftransformshift#1\relax}}%
+\tikzoption{xshift}{\tikz@addtransform{\pgftransformxshift{#1}}}%
+\tikzoption{yshift}{\tikz@addtransform{\pgftransformyshift{#1}}}%
+\tikzoption{cm}{\tikz@addtransform{\tikz@parse@cm#1\relax}}%
+\tikzoption{reset cm}[]{\tikz@addtransform{\pgftransformreset}}%
+\tikzoption{shift only}[]{\tikz@addtransform{\pgftransformresetnontranslations}}%
+
+\def\tikz@parse@cm#1,#2,#3,#4,{%
+ \def\tikz@p@cm{{#1}{#2}{#3}{#4}}%
+ \tikz@scan@one@point\tikz@parse@cmA}%
+\def\tikz@parse@cmA#1{%
+ \expandafter\pgftransformcm\tikz@p@cm{#1}%
+}%
+
+\tikzset{transform canvas/.code=%
+ {%
+ \tikz@addoption
+ {%
+ {%
+ \pgftransformreset%
+ \let\tikz@transform=\relax%
+ \tikzset{#1}%
+ \pgflowlevelsynccm%
+ }%
+ \pgf@relevantforpicturesizefalse%
+ }%
+ }%
+}%
+
+\tikzset{turn/.code={%
+ \pgf@x=0pt%
+ \pgf@y\pgf@x%
+ \pgf@process{\tikz@tangent}%
+ \advance\pgf@x by-\tikz@lastx%
+ \advance\pgf@y by-\tikz@lasty%
+ \pgfpointnormalised{}% x/y = normalised vector
+ \pgf@x=-\pgf@x%
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm%
+ {\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@ya}}%
+ {\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@x}}{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
+ }%
+}%
+
+\def\tikz@tangent@lookup{%
+ \pgfgetpath\tikz@temp%
+ \pgfprocesspathextractpoints\tikz@temp%
+ \pgfpointsecondlastonpath%
+}%
+
+% Code for rotating the xyz coordinate system
+% around the x, y, or z vector.
+%
+\def\tikz@xyz@rotate@let{%
+ \let\pgf@z=\pgf@yc%
+ \let\pgf@za=\pgf@xc%
+}%
+
+\def\tikz@xyz@rotate@xyz@xaxis#1#2#3#4{%
+ \tikz@xyz@rotate@let%
+ \pgf@x=#1\relax%
+ \pgf@ya=#2\relax%
+ \pgf@za=#3\relax%
+ \pgfmathsin@{#4}\let\tikz@xyz@sin=\pgfmathresult%
+ \pgfmathcos@{#4}\let\tikz@xyz@cos=\pgfmathresult%
+ \pgf@y=\tikz@xyz@cos\pgf@ya%
+ \advance\pgf@y by-\tikz@xyz@sin\pgf@za%
+ \pgf@z=\tikz@xyz@sin\pgf@ya%
+ \advance\pgf@z by\tikz@xyz@cos\pgf@za%
+}%
+
+\def\tikz@xyz@rotate@xyz@yaxis#1#2#3#4{%
+ \tikz@xyz@rotate@let%
+ \pgf@xa=#1\relax%
+ \pgf@y=#2\relax%
+ \pgf@za=#3\relax%
+ \pgfmathsin@{#4}\let\tikz@xyz@sin=\pgfmathresult%
+ \pgfmathcos@{#4}\let\tikz@xyz@cos=\pgfmathresult%
+ \pgf@x=\tikz@xyz@cos\pgf@xa%
+ \advance\pgf@x by\tikz@xyz@sin\pgf@za%
+ \pgf@z=-\tikz@xyz@sin\pgf@xa%
+ \advance\pgf@z by\tikz@xyz@cos\pgf@za%
+}%
+
+\def\tikz@xyz@rotate@xyz@zaxis#1#2#3#4{%
+ \tikz@xyz@rotate@let%
+ \pgf@xa=#1\relax%
+ \pgf@ya=#2\relax%
+ \pgf@z=#3\relax%
+ \pgfmathsin@{#4}\let\tikz@xyz@sin=\pgfmathresult%
+ \pgfmathcos@{#4}\let\tikz@xyz@cos=\pgfmathresult%
+ \pgf@x=\tikz@xyz@cos\pgf@xa%
+ \advance\pgf@x by-\tikz@xyz@sin\pgf@ya%
+ \pgf@y=\tikz@xyz@sin\pgf@xa%
+ \advance\pgf@y by\tikz@xyz@cos\pgf@ya%
+}%
+
+\tikzset{rotate around x/.code={%
+ \tikz@xyz@rotate@let%
+ \pgfmathparse{#1}\let\tikz@xyz@angle=\pgfmathresult%
+ \tikz@xyz@rotate@xyz@xaxis{0pt}{1pt}{0pt}{\tikz@xyz@angle}%
+ \pgfextract@process\tikz@xyz@rotate@yvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
+ \tikz@xyz@rotate@xyz@xaxis{0pt}{0pt}{1pt}{\tikz@xyz@angle}%
+ \pgfsetzvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
+ \pgfsetyvec{\tikz@xyz@rotate@yvec}%
+ },
+ rotate around y/.code={%
+ \tikz@xyz@rotate@let%
+ \pgfmathparse{#1}\let\tikz@xyz@angle=\pgfmathresult%
+ \tikz@xyz@rotate@xyz@yaxis{1pt}{0pt}{0pt}{\tikz@xyz@angle}%
+ \pgfextract@process\tikz@xyz@rotate@xvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
+ \tikz@xyz@rotate@xyz@yaxis{0pt}{0pt}{1pt}{\tikz@xyz@angle}%
+ \pgfsetzvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
+ \pgfsetxvec{\tikz@xyz@rotate@xvec}%
+ },
+ rotate around z/.code={%
+ \tikz@xyz@rotate@let%
+ \pgfmathparse{#1}\let\tikz@xyz@angle=\pgfmathresult%
+ \tikz@xyz@rotate@xyz@zaxis{1pt}{0pt}{0pt}{\tikz@xyz@angle}%
+ \pgfextract@process\tikz@xyz@rotate@xvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
+ \tikz@xyz@rotate@xyz@zaxis{0pt}{1pt}{0pt}{\tikz@xyz@angle}%
+ \pgfsetyvec{\pgfpointxyz{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@z}}}%
+ \pgfsetxvec{\tikz@xyz@rotate@xvec}%
+ },
+}%
+
+% Grid options
+\tikzoption{xstep}{\def\tikz@grid@x{#1}}%
+\tikzoption{ystep}{\def\tikz@grid@y{#1}}%
+\tikzoption{step}{\tikz@handle@vec{\tikz@step@point}{\tikz@step@single}#1\relax}%
+\def\tikz@step@single#1{\def\tikz@grid@x{#1}\def\tikz@grid@y{#1}}%
+\def\tikz@step@point#1{\pgf@process{#1}\edef\tikz@grid@x{\the\pgf@x}\edef\tikz@grid@y{\the\pgf@y}}%
+
+\def\tikz@grid@x{1cm}%
+\def\tikz@grid@y{1cm}%
+
+
+% Current point updates
+\newif\iftikz@current@point@local
+\tikzset{current point is local/.is if=tikz@current@point@local}%
+
+% Path usage options
+\newif\iftikz@mode@double
+\newif\iftikz@mode@fill
+\newif\iftikz@mode@draw
+\newif\iftikz@mode@clip
+\newif\iftikz@mode@boundary
+\newif\iftikz@mode@shade
+\newif\iftikz@mode@fade@path
+\newif\iftikz@mode@fade@scope
+\let\tikz@mode=\pgfutil@empty
+
+\def\tikz@nonetext{none}%
+
+\tikzoption{path only}[]{\let\tikz@mode=\pgfutil@empty}%
+\tikzset{
+ shade/.is choice,
+ shade/.default=true,
+ shade/true/.code=\tikz@addmode{\tikz@mode@shadetrue},
+ shade/false/.code=\tikz@addmode{\tikz@mode@shadefalse},
+ shade/none/.code=\tikz@addmode{\tikz@mode@shadefalse},
+}%
+
+\tikzoption{fill}[]{%
+ \edef\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@fillfalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \tikz@addoption{\pgfsetfillcolor{#1}}%
+ \def\tikz@fillcolor{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@filltrue}%
+ \fi%
+}%
+\tikzoption{draw}[]{%
+ \edef\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@drawfalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \tikz@addoption{\pgfsetstrokecolor{#1}}%
+ \def\tikz@strokecolor{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@drawtrue}%
+ \fi%
+}%
+\tikzoption{clip}[]{\tikz@addmode{\tikz@mode@cliptrue}}%
+\tikzoption{use as bounding box}[]{\tikz@addmode{\tikz@mode@boundarytrue}}%
+
+\tikzoption{save path}{\tikz@addmode{\pgfsyssoftpath@getcurrentpath#1\global\let#1=#1}}%
+\tikzoption{use path}{\tikz@addmode{\pgfsyssoftpath@setcurrentpath#1}}%
+
+\let\tikz@fillcolor=\pgfutil@empty
+\let\tikz@strokecolor=\pgfutil@empty
+
+% Insert a path using an option
+\tikzset{insert path/.code=\tikz@scan@next@command#1\pgf@stop}%
+
+% Pattern options
+\tikzset{pattern/.code=\tikzerror{You need to say \string\usetikzlibrary{patterns}},
+ pattern color/.style=pattern}%
+
+% Path pictures
+\tikzset{path picture/.code=\tikz@addmode{\def\tikz@path@picture{#1}}}%
+
+% Fading options
+\tikzset{path fading/.code={
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@fade@pathfalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \def\tikz@path@fading{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@fade@pathtrue}%
+ \fi%
+ },
+ path fading/.default=,
+ scope fading/.code={
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@fade@scopefalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \def\tikz@scope@fading{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@fade@scopetrue}%
+ \fi%
+ },
+ scope fading/.default=}%
+\tikzset{fit fading/.is if=tikz@fade@adjust}%
+\tikzset{fading transform/.store in=\tikz@fade@transform}%
+\tikzset{fading angle/.style={fading transform={rotate=#1}}}%
+
+\newif\iftikz@fade@adjust%
+\tikz@fade@adjusttrue%
+\let\tikz@fade@transform\pgfutil@empty%
+
+\pgfutil@colorlet{transparent}{pgftransparent}%
+\def\tikz@do@fade@transform{\let\tikz@transform=\relax\expandafter\tikzset\expandafter{\tikz@fade@transform}}%
+
+
+
+% Transparency groups
+\newif\iftikz@transparency@group%
+\tikzset{/tikz/transparency group/.code=\tikz@transparency@grouptrue\def\tikz@transparency@group@options{isolated=true,#1}\let\tikz@blend@group\pgfutil@empty}%
+\tikzset{/tikz/blend group/.code=\tikz@transparency@grouptrue\def\tikz@transparency@group@options{isolated=true}\def\tikz@blend@group{\pgfsetblendmode{#1}}}%
+
+\let\tikz@blend@group\pgfutil@empty
+
+% Shading options
+\tikzoption{shading}{\def\tikz@shading{#1}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{shading angle}{\def\tikz@shade@angle{#1}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{top color}{%
+ \pgfutil@colorlet{tikz@axis@top}{#1}%
+ \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
+ \def\tikz@shading{axis}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{bottom color}{%
+ \pgfutil@colorlet{tikz@axis@bottom}{#1}%
+ \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
+ \def\tikz@shading{axis}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{middle color}{%
+ \pgfutil@colorlet{tikz@axis@middle}{#1}%
+ \def\tikz@shading{axis}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{left color}{%
+ \pgfutil@colorlet{tikz@axis@top}{#1}%
+ \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
+ \def\tikz@shading{axis}\def\tikz@shade@angle{90}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{right color}{%
+ \pgfutil@colorlet{tikz@axis@bottom}{#1}%
+ \pgfutil@colorlet{tikz@axis@middle}{tikz@axis@top!50!tikz@axis@bottom}%
+ \def\tikz@shading{axis}\def\tikz@shade@angle{90}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{ball color}{\pgfutil@colorlet{tikz@ball}{#1}\def\tikz@shading{ball}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{inner color}{\pgfutil@colorlet{tikz@radial@inner}{#1}\def\tikz@shading{radial}\tikz@addmode{\tikz@mode@shadetrue}}%
+\tikzoption{outer color}{\pgfutil@colorlet{tikz@radial@outer}{#1}\def\tikz@shading{radial}\tikz@addmode{\tikz@mode@shadetrue}}%
+
+\def\tikz@shading{axis}%
+\def\tikz@shade@angle{0}%
+
+\pgfdeclareverticalshading[tikz@axis@top,tikz@axis@middle,tikz@axis@bottom]{axis}{100bp}{%
+ color(0bp)=(tikz@axis@bottom);
+ color(25bp)=(tikz@axis@bottom);
+ color(50bp)=(tikz@axis@middle);
+ color(75bp)=(tikz@axis@top);
+ color(100bp)=(tikz@axis@top)}%
+
+\pgfutil@colorlet{tikz@axis@top}{gray}%
+\pgfutil@colorlet{tikz@axis@middle}{gray!50!white}%
+\pgfutil@colorlet{tikz@axis@bottom}{white}%
+
+\pgfdeclareradialshading[tikz@ball]{ball}{\pgfqpoint{-10bp}{10bp}}{%
+ color(0bp)=(tikz@ball!15!white);
+ color(9bp)=(tikz@ball!75!white);
+ color(18bp)=(tikz@ball!70!black);
+ color(25bp)=(tikz@ball!50!black);
+ color(50bp)=(black)}%
+
+\pgfutil@colorlet{tikz@ball}{blue}%
+
+\pgfdeclareradialshading[tikz@radial@inner,tikz@radial@outer]{radial}{\pgfpointorigin}{%
+ color(0bp)=(tikz@radial@inner);
+ color(25bp)=(tikz@radial@outer);
+ color(50bp)=(tikz@radial@outer)}%
+
+\pgfutil@colorlet{tikz@radial@inner}{gray}%
+\pgfutil@colorlet{tikz@radial@outer}{white}%
+
+
+% Pin options
+\tikzset{
+ pin distance/.store in=\tikz@pin@distance,
+ pin distance=3ex,
+ pin position/.store in=\tikz@pin@default@pos,
+ pin position=above,
+ pin edge/.store in=\tikz@pin@edge@style,
+ pin edge={},
+ tikz@pin@post/.code={\global\let\tikz@pin@edge@style@smuggle=\tikz@pin@edge@style},
+ tikz@pre@pin@edge/.code={%
+ \toks0=\expandafter{\tikz@pin@edge@style@smuggle}%
+ \edef\pgf@marshal{\noexpand\tikzset{tikz@pin@options/.style={\the\toks0}}}%
+ \pgf@marshal
+ },%
+}%
+
+\tikzset{%
+ pin/.code={%
+ \begingroup
+ \ifnum\the\catcode`\:=\active\relax
+ \def\tikz@next{%
+ \endgroup
+ \tikz@parse@pin@active@i{#1}}%
+ \else
+ \def\tikz@next{%
+ \endgroup
+ \pgfutil@ifnextchar[%]
+ {\tikz@parse@pin@nonactive}
+ {\tikz@parse@pin@nonactive[]}#1:\pgf@nil}%
+ \fi
+ \tikz@next}}%
+
+\begingroup
+ \catcode`\:=\active\relax
+
+ \gdef\tikz@parse@pin@active@i#1{%
+ \pgfutil@ifnextchar[%]
+ {\tikz@parse@pin@active}
+ {\tikz@parse@pin@active[]}#1:\pgf@nil}%
+
+ \long\gdef\tikz@parse@pin@active[#1]#2:#3\pgf@nil{%
+ \def\tikz@temp{#3}%
+ \ifx\tikz@temp\pgfutil@empty
+ % no position, use default
+ \tikz@@parse@pin@active[#1]\tikz@pin@default@pos:#2:\pgf@nil%
+ \else
+ \tikz@@parse@pin@active[#1]#2:#3\pgf@nil%
+ \fi}%
+
+ \long\gdef\tikz@@parse@pin@active[#1]#2:#3:\pgf@nil{%
+ \tikzset{%
+ append after command = {%
+ \bgroup
+ [current point is local = true]
+ \pgfextra{\let\tikz@save@last@node=\tikzlastnode\tikz@node@is@a@labelfalse}%
+ node [every pin,
+ tikz@label@angle = #2,
+ anchor=@auto,
+ #1,
+ append after command = {%
+ (\tikz@save@last@node)
+ edge [every pin edge,
+ tikz@pre@pin@edge,
+ tikz@pin@options]
+ (\tikzlastnode)},
+ tikz@label@post = \tikz@pin@distance,
+ tikz@pin@post] {#3}
+ \egroup}}}%
+\endgroup
+
+\long\def\tikz@parse@pin@nonactive[#1]#2:#3\pgf@nil{%
+ \def\tikz@temp{#3}%
+ \ifx\tikz@temp\pgfutil@empty
+ % no position, use default
+ \tikz@@parse@pin@nonactive[#1]\tikz@pin@default@pos:#2:\pgf@nil%
+ \else
+ \tikz@@parse@pin@nonactive[#1]#2:#3\pgf@nil%
+ \fi}%
+
+\long\def\tikz@@parse@pin@nonactive[#1]#2:#3:\pgf@nil{%
+ \tikzset{%
+ append after command = {%
+ \bgroup
+ [current point is local = true]
+ \pgfextra{\let\tikz@save@last@node=\tikzlastnode\tikz@node@is@a@labelfalse}%
+ node [every pin,
+ tikz@label@angle = #2,
+ anchor=@auto,
+ #1,
+ append after command = {%
+ (\tikz@save@last@node)
+ edge [every pin edge,
+ tikz@pre@pin@edge,
+ tikz@pin@options]
+ (\tikzlastnode)},
+ tikz@label@post = \tikz@pin@distance,
+ tikz@pin@post] {#3}
+ \egroup}}}%
+
+% Label and pin options
+
+\tikzset{
+ label distance/.store in=\tikz@label@distance,
+ label distance=0pt,
+ label position/.store in=\tikz@label@default@pos,
+ label position=above,
+ absolute/.is if=tikz@absolute,
+ tikz@label@angle/.store in=\tikz@label@angle
+}%
+
+\newif\iftikz@absolute
+\def\tikz@on@text{center}%
+
+\tikzset{tikz@label@post/.code 2 args={
+ \edef\tikz@label@angle{\tikz@label@angle}%
+ \expandafter\pgfkeys@spdef\expandafter\tikz@label@angle\expandafter{\tikz@label@angle}%
+ \csname tikz@label@angle@is@\tikz@label@angle\endcsname
+ \ifx\tikz@label@angle\tikz@on@text%
+ \def\tikz@node@at{\pgfpointanchor{\tikzlastnode}{center}}%
+ \def\tikz@anchor{center}%
+ \else%
+ \iftikz@absolute%
+ \pgftransformreset%
+ \pgf@process{%
+ \pgfpointshapeborder{\tikzlastnode}%
+ {\pgfpointadd{\pgfpointanchor{\tikzlastnode}{center}}{\pgfpointpolar{\tikz@label@angle}{1pt}}}}%
+ \edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \tikz@compute@direction{\tikz@label@angle}%
+ \tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@label@angle}{#1}}}%
+ \else%
+ \pgf@process{\pgfpointanchor{\tikzlastnode}{\tikz@label@angle}}%
+ \edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{\pgfpointanchor{\tikzlastnode}{center}}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \tikz@label@simplefalse%
+ \iftikz@fullytransformed%
+ \tikz@label@simpletrue%
+ \else
+ \ifdim\pgf@xc=\pgf@xb\relax%
+ \ifdim\pgf@yc=\pgf@yb\relax%
+ \tikz@label@simpletrue%
+ \fi%
+ \fi%
+ \fi%
+ \iftikz@label@simple%
+ \tikz@compute@direction{\tikz@label@angle}%
+ \tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@label@angle}{#1}}}%
+ \else%
+ \pgf@process{\pgfpointnormalised{%
+ \pgfpointdiff{\pgfpointtransformed{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgfpointtransformed{\pgfqpoint{\pgf@xb}{\pgf@yb}}}}}%
+ \edef\pgf@marshal{%
+ \noexpand\tikz@addtransform{\noexpand\pgftransformshift{\noexpand\pgfpointscale{#1}{
+ \noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}}}%
+ \pgf@marshal%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@x=\pgf@yc%
+ \pgf@y=-\pgf@xc%
+ \ifx\tikz@anchor\tikz@auto@text%
+ \tikz@auto@anchor%
+ \fi%
+ \fi%
+ \fi%
+ \fi}
+}%
+
+\newif\iftikz@label@simple%
+
+\tikzset{%
+ label/.code={%
+ \begingroup
+ \ifnum\the\catcode`\:=\active\relax
+ \def\tikz@next{%
+ \endgroup
+ \tikz@parse@label@active@i{#1}}%
+ \else
+ \def\tikz@next{%
+ \endgroup
+ \pgfutil@ifnextchar[%]
+ {\tikz@parse@label@nonactive}
+ {\tikz@parse@label@nonactive[]}#1:\pgf@nil}%
+ \fi
+ \tikz@next}}%
+
+\begingroup
+ \catcode`\:=\active\relax
+
+ \gdef\tikz@parse@label@active@i#1{%
+ \pgfutil@ifnextchar[%]
+ {\tikz@parse@label@active}
+ {\tikz@parse@label@active[]}#1:\pgf@nil}%
+
+ \gdef\tikz@parse@label@active[#1]#2:#3\pgf@nil{%
+ \def\tikz@temp{#3}%
+ \ifx\tikz@temp\pgfutil@empty
+ % no position, use default
+ \tikz@@parse@label@active[#1]\tikz@label@default@pos:#2:\pgf@nil%
+ \else
+ \def\tikz@temp{#2}%
+ \ifx\tikz@temp\pgfutil@empty
+ \tikz@@parse@label@active[#1]\tikz@label@default@pos:#3\pgf@nil%
+ \else
+ \tikz@@parse@label@active[#1]#2:#3\pgf@nil%
+ \fi
+ \fi
+ }%
+
+ \gdef\tikz@@parse@label@active[#1]#2:#3:\pgf@nil{%
+ \tikzset{%
+ append after command = {%
+ \bgroup
+ [current point is local=true]
+ \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name\tikz@node@is@a@labelfalse}
+ node [every label,
+ tikz@label@angle = #2,
+ anchor=@auto,
+ #1,
+ tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\noexpand}}
+ \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
+ \egroup}}}%
+\endgroup
+
+\def\tikz@parse@label@nonactive[#1]#2:#3\pgf@nil{%
+ \def\tikz@temp{#3}%
+ \ifx\tikz@temp\pgfutil@empty
+ % no position, use default
+ \tikz@@parse@label@nonactive[#1]\tikz@label@default@pos:#2:\pgf@nil%
+ \else
+ \def\tikz@temp{#2}%
+ \ifx\tikz@temp\pgfutil@empty
+ \tikz@@parse@label@nonactive[#1]\tikz@label@default@pos:#3\pgf@nil%
+ \else
+ \tikz@@parse@label@nonactive[#1]#2:#3\pgf@nil%
+ \fi
+ \fi
+}%
+
+\def\tikz@@parse@label@nonactive[#1]#2:#3:\pgf@nil{%
+ \tikzset{%
+ append after command = {%
+ \bgroup
+ [current point is local=true]
+ \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name\tikz@node@is@a@labelfalse}
+ node [every label,
+ tikz@label@angle = #2,
+ anchor=@auto,
+ #1,
+ tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\noexpand}}
+ \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
+ \egroup}}}%
+
+\expandafter\def\csname tikz@label@angle@is@right\endcsname{\def\tikz@label@angle{0}}%
+\expandafter\def\csname tikz@label@angle@is@above right\endcsname{\def\tikz@label@angle{45}}%
+\expandafter\def\csname tikz@label@angle@is@above\endcsname{\def\tikz@label@angle{90}}%
+\expandafter\def\csname tikz@label@angle@is@above left\endcsname{\def\tikz@label@angle{135}}%
+\expandafter\def\csname tikz@label@angle@is@left\endcsname{\def\tikz@label@angle{180}}%
+\expandafter\def\csname tikz@label@angle@is@below left\endcsname{\def\tikz@label@angle{225}}%
+\expandafter\def\csname tikz@label@angle@is@below\endcsname{\def\tikz@label@angle{270}}%
+\expandafter\def\csname tikz@label@angle@is@below right\endcsname{\def\tikz@label@angle{315}}%
+
+\def\tikz@compute@direction#1{%
+ \ifx\tikz@anchor\tikz@auto@text%
+ \let\tikz@do@auto@anchor=\relax
+ \pgfmathsetcount{\c@pgf@counta}{#1}%
+ \ifnum\c@pgf@counta<0\relax
+ \advance\c@pgf@counta by 360\relax%
+ \fi%
+ \ifnum\c@pgf@counta>359\relax
+ \advance\c@pgf@counta by-360\relax%
+ \fi%
+ \ifnum\c@pgf@counta<4\relax%
+ \def\tikz@anchor{west}%
+ \else\ifnum\c@pgf@counta<87\relax%
+ \def\tikz@anchor{south west}%
+ \else\ifnum\c@pgf@counta<94\relax%
+ \def\tikz@anchor{south}%
+ \else\ifnum\c@pgf@counta<177\relax%
+ \def\tikz@anchor{south east}%
+ \else\ifnum\c@pgf@counta<184\relax%
+ \def\tikz@anchor{east}%
+ \else\ifnum\c@pgf@counta<267\relax%
+ \def\tikz@anchor{north east}%
+ \else\ifnum\c@pgf@counta<274\relax%
+ \def\tikz@anchor{north}%
+ \else\ifnum\c@pgf@counta<357\relax%
+ \def\tikz@anchor{north west}%
+ \else%
+ \def\tikz@anchor{west}%
+ \fi\fi\fi\fi\fi\fi\fi\fi%
+ \fi%
+}%
+\def\tikz@auto@text{@auto}%
+
+% General node options
+\tikzset{
+ name/.code={\edef\tikz@fig@name{\tikz@pp@name{#1}}\let\tikz@id@name\tikz@fig@name},%
+ name prefix/.initial=,%
+ name suffix/.initial=%
+}%
+\def\tikz@pp@name#1{\csname pgfk@/tikz/name prefix\endcsname#1\csname pgfk@/tikz/name suffix\endcsname}%
+
+
+\tikzset{
+ node contents/.code=\def\tikz@node@content{#1},
+ pic type/.code=\def\tikz@node@content{#1}, % alias
+}%
+
+\tikzset{
+ behind path/.code=\def\tikz@whichbox{\tikz@figbox@bg},
+ in front of path/.code=\def\tikz@whichbox{\tikz@figbox}
+}%
+\def\tikz@whichbox{\tikz@figbox}%
+
+\tikzoption{at}{\tikz@scan@one@point\tikz@set@at#1}%
+\def\tikz@set@at#1{\def\tikz@node@at{#1}}%
+
+\tikzoption{shape}{\edef\tikz@shape{#1}}%
+
+\tikzoption{nodes}{\tikzset{every node/.append style={#1}}}%
+
+\tikzset{alias/.code={%
+ \tikz@fig@mustbenamed
+ \begingroup
+ \toks0=\expandafter{\tikz@alias}%
+ \edef\pgf@temp{\noexpand\pgfnodealias{\tikz@pp@name{#1}}{\noexpand\tikz@fig@name}}%
+ \toks1=\expandafter{\pgf@temp}%
+ \xdef\pgf@marshal{%
+ \noexpand\def\noexpand\tikz@alias{\the\toks0 \the\toks1 }%
+ }%
+ \endgroup
+ \pgf@marshal
+}}%
+
+% deprecated:
+\def\tikzaddafternodepathoption#1{#1\tikzset{prefix after command={\pgfextra{#1}}}}%
+\tikzset{after node path/.style={append after command={#1}}}%
+
+
+% Pic options
+\newif\iftikz@node@is@pic
+\tikzset{pic text/.store in=\tikzpictext}%
+\let\tikzpictext\relax
+\tikzset{pic text options/.store in=\tikzpictextoptions}%
+\let\tikzpictextoptions\pgfutil@empty
+
+
+% Anchoring
+
+\tikzoption{anchor}{\def\tikz@anchor{#1}\let\tikz@do@auto@anchor=\relax}%
+
+\tikzoption{left}[]{\def\tikz@anchor{east}\tikz@possibly@transform{x}{-}{#1}}%
+\tikzoption{right}[]{\def\tikz@anchor{west}\tikz@possibly@transform{x}{}{#1}}%
+\tikzoption{above}[]{\def\tikz@anchor{south}\tikz@possibly@transform{y}{}{#1}}%
+\tikzoption{below}[]{\def\tikz@anchor{north}\tikz@possibly@transform{y}{-}{#1}}%
+\tikzoption{above left}[]%
+ {\def\tikz@anchor{south east}%
+ \tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{}{#1}}%
+\tikzoption{above right}[]%
+ {\def\tikz@anchor{south west}%
+ \tikz@possibly@transform{x}{}{#1}\tikz@possibly@transform{y}{}{#1}}%
+\tikzoption{below left}[]%
+ {\def\tikz@anchor{north east}%
+ \tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{-}{#1}}%
+\tikzoption{below right}[]%
+ {\def\tikz@anchor{north west}%
+ \tikz@possibly@transform{x}{}{#1}\tikz@possibly@transform{y}{-}{#1}}%
+\tikzset{centered/.code=\def\tikz@anchor{center}}%
+
+\tikzoption{node distance}{\def\tikz@node@distance{#1}}%
+\def\tikz@node@distance{1cm}%
+
+% The following are deprecated:
+\tikzoption{above of}{\tikz@of{#1}{90}}%
+\tikzoption{below of}{\tikz@of{#1}{-90}}%
+\tikzoption{left of}{\tikz@of{#1}{180}}%
+\tikzoption{right of}{\tikz@of{#1}{0}}%
+\tikzoption{above left of}{\tikz@of{#1}{135}}%
+\tikzoption{below left of}{\tikz@of{#1}{-135}}%
+\tikzoption{above right of}{\tikz@of{#1}{45}}%
+\tikzoption{below right of}{\tikz@of{#1}{-45}}%
+\def\tikz@of#1#2{%
+ \def\tikz@anchor{center}%
+ \let\tikz@do@auto@anchor=\relax%
+ \tikz@addtransform{%
+ \expandafter\tikz@extract@node@dist\tikz@node@distance and\pgf@stop%
+ \pgftransformshift{\pgfpointpolar{#2}{\tikz@extracted@node@distance}}}%
+ \def\tikz@node@at{\pgfpointanchor{#1}{center}}}%
+\def\tikz@extract@node@dist#1and#2\pgf@stop{%
+ \def\tikz@extracted@node@distance{#1}}%
+
+\tikzset{
+ transform shape nonlinear/.is choice,
+ transform shape nonlinear/.default=true,
+ transform shape nonlinear/true/.code=\let\tikz@nlt\relax,
+ transform shape nonlinear/false/.code=\def\tikz@nlt{\pgfapproximatenonlineartranslation},
+ transform shape nonlinear=false,
+}%
+
+
+\tikzoption{transform shape}[true]{%
+ \csname tikz@fullytransformed#1\endcsname%
+ \iftikz@fullytransformed%
+ \pgfresetnontranslationattimefalse%
+ \else%
+ \pgfresetnontranslationattimetrue%
+ \fi%
+}%
+
+\newif\iftikz@fullytransformed
+\pgfresetnontranslationattimetrue%
+
+\def\tikz@anchor{center}%
+\def\tikz@shape{rectangle}%
+
+\def\tikz@possibly@transform#1#2#3{%
+ \let\tikz@do@auto@anchor=\relax%
+ \def\tikz@test{#3}%
+ \ifx\tikz@test\pgfutil@empty%
+ \else%
+ \pgfmathsetlength{\pgf@x}{#3}%
+ \pgf@x=#2\pgf@x\relax%
+ \edef\tikz@marshal{\noexpand\tikz@addtransform{%
+ \expandafter\noexpand\csname pgftransform#1shift\endcsname{\the\pgf@x}}}%
+ \tikz@marshal%
+ \fi%
+}%
+
+
+% Inter-picture options
+\tikzoption{remember picture}[true]{\csname pgfrememberpicturepositiononpage#1\endcsname}
+\tikzset{
+ overlay/.is choice,
+ overlay/true/.code={\pgf@relevantforpicturesizefalse},
+ overlay/false/.code={\pgf@relevantforpicturesizetrue},
+ overlay/.default=true
+}
+
+
+
+% Line/curve label placement options
+\tikzoption{sloped}[true]{\csname pgfslopedattime#1\endcsname}%
+\tikzoption{allow upside down}[true]{\csname pgfallowupsidedownattime#1\endcsname}%
+
+\tikzoption{pos}{\edef\tikz@time{#1}\ifx\tikz@time\pgfutil@empty\else\pgfmathsetmacro\tikz@time{\tikz@time}\fi}%
+
+\tikzoption{auto}[]{\csname tikz@install@auto@anchor@#1\endcsname}%
+\tikzoption{swap}[]{%
+ \def\tikz@temp{left}%
+ \ifx\tikz@auto@anchor@direction\tikz@temp%
+ \def\tikz@auto@anchor@direction{right}%
+ \else%
+ \def\tikz@auto@anchor@direction{left}%
+ \fi%
+}%
+\tikzset{'/.style=swap}% shorthand
+
+
+\def\tikz@install@auto@anchor@{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on}%
+\def\tikz@install@auto@anchor@false{\let\tikz@do@auto@anchor=\relax}%
+\def\tikz@install@auto@anchor@left{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{left}}%
+\def\tikz@install@auto@anchor@right{\let\tikz@do@auto@anchor=\tikz@auto@anchor@on\def\tikz@auto@anchor@direction{right}}%
+
+\let\tikz@do@auto@anchor=\relax%
+
+\def\tikz@auto@anchor@on{\csname tikz@auto@anchor@\tikz@auto@anchor@direction\endcsname}
+
+\def\tikz@auto@anchor@left{\tikz@auto@pre\tikz@auto@anchor\tikz@auto@post}%
+\def\tikz@auto@anchor@right{\tikz@auto@pre\tikz@auto@anchor@prime\tikz@auto@post}%
+
+\def\tikz@auto@anchor@direction{left}%
+
+% Text options
+\tikzoption{text}{\def\tikz@textcolor{#1}}%
+\tikzoption{font}{\def\tikz@textfont{#1}}%
+\tikzoption{node font}{\def\tikz@node@textfont{#1}}%
+\tikzoption{text opacity}{\def\tikz@textopacity{#1}}%
+\tikzoption{text width}{\def\tikz@text@width{#1}}%
+\tikzoption{text height}{\def\tikz@text@height{#1}}%
+\tikzoption{text depth}{\def\tikz@text@depth{#1}}%
+\tikzoption{text ragged}[]%
+{\def\tikz@text@action{\pgfutil@raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}%
+\tikzoption{text badly ragged}[]{\def\tikz@text@action{\pgfutil@raggedright\relax}}%
+\tikzoption{text ragged left}[]%
+{\def\tikz@text@action{\pgfutil@raggedleft\leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}%
+\tikzoption{text badly ragged left}[]{\def\tikz@text@action{\pgfutil@raggedleft\relax}}%
+\tikzoption{text justified}[]{\def\tikz@text@action{\leftskip0pt\rightskip0pt\relax}}%
+\tikzoption{text centered}[]{\def\tikz@text@action{%
+ \leftskip0pt plus2em%
+ \rightskip0pt plus2em%
+ \spaceskip.3333em \xspaceskip.5em%
+ \parfillskip=0pt%
+ \iftikz@warn@for@narrow@centered\else\hbadness10000\fi%
+ \let\\=\@centercr% for latex
+ \relax}}%
+\tikzoption{text badly centered}[]%
+{\def\tikz@text@action{%
+ \let\\=\@centercr% for latex
+ \parfillskip=0pt%
+ \rightskip\pgfutil@flushglue%
+ \leftskip\pgfutil@flushglue\relax}}%
+\tikzset{badness warnings for centered text/.is if=tikz@warn@for@narrow@centered}%
+\newif\iftikz@warn@for@narrow@centered
+
+\let\tikz@text@width=\pgfutil@empty
+\let\tikz@text@height=\pgfutil@empty
+\let\tikz@text@depth=\pgfutil@empty
+\let\tikz@textcolor=\pgfutil@empty
+\let\tikz@textfont=\pgfutil@empty
+\let\tikz@textopacity=\pgfutil@empty
+\let\tikz@node@textfont=\pgfutil@empty
+
+\def\tikz@text@action{\pgfutil@raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}%
+
+
+% Alignment
+\tikzset{
+ node halign header/.initial=,
+ align/.is choice,
+ align/left/.style ={text ragged,node halign header=\tikz@align@left@header},
+ align/flush left/.style ={text badly ragged,node halign header=\tikz@align@left@header},
+ align/right/.style ={text ragged left,node halign header=\tikz@align@right@header},
+ align/flush right/.style ={text badly ragged left,node halign header=\tikz@align@right@header},
+ align/center/.style={text centered,node halign header=\tikz@align@center@header},
+ align/flush center/.style={text badly centered,node halign header=\tikz@align@center@header},
+ align/justify/.style ={text justified,node halign header=\tikz@align@left@header},
+ align/none/.style ={text justified,node halign header=},
+}%
+\def\tikz@align@left@header{##\hfil\cr}%
+\def\tikz@align@right@header{\hfil##\cr}%
+\def\tikz@align@center@header{\hfil##\hfil\cr}%
+
+
+
+% Arrow options
+\tikzoption{arrows}{\tikz@processarrows{#1}}%
+
+
+\tikzoption{>}{\pgfdeclarearrow{name=<->,means={#1}}}%
+\pgfdeclarearrow{name=|<->|, means={>[sep=0pt].|}}%
+
+\tikzoption{shorten <}{\pgfsetshortenstart{#1}}%
+\tikzoption{shorten >}{\pgfsetshortenend{#1}}%
+
+\def\tikz@processarrows#1{%
+ \def\tikz@current@arrows{#1}%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \pgfsetarrows{#1}%
+ \fi%
+}%
+
+\def\tikz@current@arrows{-}%
+
+% Parabola options
+\tikzoption{bend}{\tikz@scan@one@point\tikz@set@parabola@bend#1\relax}%
+\tikzoption{bend pos}{\def\tikz@parabola@bend@factor{#1}}%
+\tikzoption{parabola height}{%
+ \def\tikz@parabola@bend@factor{.5}%
+ \def\tikz@parabola@bend{\pgfpointadd{\pgfpoint{0pt}{#1}}{\tikz@last@position@saved}}}%
+
+\def\tikz@parabola@bend{\tikz@last@position@saved}%
+\def\tikz@parabola@bend@factor{0}%
+
+\def\tikz@set@parabola@bend#1{\def\tikz@parabola@bend{#1}}%
+
+% Axis options
+\tikzoption{domain}{\edef\tikz@plot@domain{#1}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax}%
+\tikzoption{range}{\def\tikz@plot@range{#1}}%
+\tikzoption{yrange}{\def\tikz@plot@range{#1}}%
+\let\tikz@plot@range=\pgfutil@empty
+\tikzoption{xrange}{\def\tikz@plot@xrange{#1}}%
+\let\tikz@plot@xrange=\pgfutil@empty
+
+% Plot options
+\tikzoption{smooth}[]{\let\tikz@plot@handler=\pgfplothandlercurveto}%
+\tikzoption{smooth cycle}[]{\let\tikz@plot@handler=\pgfplothandlerclosedcurve}%
+\tikzoption{sharp plot}[]{\let\tikz@plot@handler\pgfplothandlerlineto}%
+\tikzoption{sharp cycle}[]{\let\tikz@plot@handler\pgfplothandlerpolygon}%
+
+\tikzoption{tension}{\pgfsetplottension{#1}}%
+
+\tikzoption{xcomb}[]{\let\tikz@plot@handler=\pgfplothandlerxcomb}%
+\tikzoption{ycomb}[]{\let\tikz@plot@handler=\pgfplothandlerycomb}%
+\tikzoption{polar comb}[]{\let\tikz@plot@handler=\pgfplothandlerpolarcomb}%
+\tikzoption{ybar}[]{\let\tikz@plot@handler=\pgfplothandlerybar}%
+\tikzoption{ybar interval}[]{\let\tikz@plot@handler=\pgfplothandlerybarinterval}%
+\tikzoption{xbar interval}[]{\let\tikz@plot@handler=\pgfplothandlerxbarinterval}%
+\tikzoption{xbar}[]{\let\tikz@plot@handler=\pgfplothandlerxbar}%
+\tikzoption{const plot}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlineto}%
+\tikzoption{const plot mark left}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlineto}%
+\tikzoption{const plot mark right}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlinetomarkright}%
+\tikzoption{const plot mark mid}[]{\let\tikz@plot@handler=\pgfplothandlerconstantlinetomarkmid}%
+\tikzoption{jump mark right}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkright}%
+\tikzoption{jump mark mid}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkmid}%
+\tikzoption{jump mark left}[]{\let\tikz@plot@handler=\pgfplothandlerjumpmarkleft}%
+
+\tikzoption{raw gnuplot}[true]{\csname tikz@plot@raw@gnuplot#1\endcsname}%
+\tikzoption{prefix}{\def\tikz@plot@prefix{#1}}%
+\tikzoption{id}{\def\tikz@plot@id{#1}}%
+
+\tikzoption{samples}{\pgfmathsetmacro\tikz@plot@samples{max(2,#1)}\expandafter\tikz@plot@samples@recalc\tikz@plot@domain\relax}%
+\tikzoption{samples at}{\def\tikz@plot@samplesat{#1}}%
+\tikzoption{parametric}[true]{\csname tikz@plot@parametric#1\endcsname}%
+
+\tikzoption{variable}{\def\tikz@plot@var{#1}}%
+
+\tikzoption{only marks}[]{\let\tikz@plot@handler\pgfplothandlerdiscard}%
+
+\tikzoption{mark}{%
+ \def\tikz@plot@mark{#1}%
+ \def\tikz@temp{none}%
+ \ifx\tikz@temp\tikz@plot@mark
+ \let\tikz@plot@mark=\pgfutil@empty
+ \fi
+}%
+\tikzset{
+ no marks/.style={mark=none},%
+ no markers/.style={mark=none},%
+ every mark/.style={},
+ mark options/.style={%
+ every mark/.style={#1}%
+ }}%
+\tikzoption{mark size}{\pgfsetplotmarksize{#1}}%
+
+\tikzoption{mark indices}{\def\tikz@mark@list{#1}}%
+\tikzoption{mark phase}{\pgfsetplotmarkphase{#1}}%
+\tikzoption{mark repeat}{\pgfsetplotmarkrepeat{#1}}%
+
+\let\tikz@mark@list=\pgfutil@empty
+
+\let\tikz@plot@handler=\pgfplothandlerlineto
+\let\tikz@plot@mark=\pgfutil@empty
+
+\def\tikz@plot@samples{25}%
+\def\tikz@plot@domain{-5:5}%
+\def\tikz@plot@var{\x}%
+\def\tikz@plot@samplesat{-5,-4.5833333,...,5}%
+\def\tikz@plot@samples@recalc#1:#2\relax{%
+ \begingroup
+ \pgfmathparse{#1}%
+ \let\tikz@temp@start=\pgfmathresult%
+ \pgfmathparse{#2}%
+ \let\tikz@temp@end=\pgfmathresult%
+ \pgfmathsetmacro\tikz@temp@diff{(\tikz@temp@end-\tikz@temp@start)/(\tikz@plot@samples-1)}%
+ %
+ % this particular item is for backwards compatibility.
+ % Pgfplots <= 1.8 called 'samples' in a context where the 'fpu' was
+ % active... and I fear there is no simple solution to replace the
+ % new \ifdim below. Sorry.
+ \pgfkeys{/pgf/fpu/output format/fixed/.try}%
+ %
+ \pgfmathsetmacro\tikz@temp@diff@abs{abs(\tikz@temp@diff)}%
+ \ifdim\tikz@temp@diff@abs pt<0.0001pt\relax%
+ \edef\tikz@plot@samplesat{\tikz@temp@start,\tikz@temp@end}%
+ \else%
+ \pgfmathparse{\tikz@temp@start+\tikz@temp@diff}%
+ \edef\tikz@plot@samplesat{\tikz@temp@start,\pgfmathresult,...,\tikz@temp@end}%
+ \fi%
+ \pgfmath@smuggleone\tikz@plot@samplesat
+ \endgroup
+}%
+
+
+\def\tikz@plot@prefix{\jobname.}%
+\def\tikz@plot@id{pgf-plot}%
+
+\newif\iftikz@plot@parametric
+\newif\iftikz@plot@raw@gnuplot
+
+
+%
+% To and edge options
+%
+\tikzoption{to path}{\def\tikz@to@path{#1}}%
+
+\def\tikz@to@path{-- (\tikztotarget) \tikztonodes}%
+
+\tikzset{edge macro/.store in=\tikz@edge@macro}%
+\let\tikz@edge@macro\pgfutil@empty
+
+\tikzset{
+ edge node/.code={
+ \expandafter\def\expandafter\tikz@tonodes\expandafter{\tikz@tonodes #1}
+ },
+ edge label/.style={/tikz/edge node={node[auto]{#1}}},
+ edge label'/.style={/tikz/edge node={node[auto,swap]{#1}}},
+}%
+
+
+% After command options
+\tikzset{
+ append after command/.code=\expandafter\def\expandafter\tikz@after@path\expandafter{\tikz@after@path#1},
+ prefix after command/.code={%
+ \def\tikz@temp{#1}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@after@path%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\tikz@temp\tikz@after@path}%
+ },
+}%
+\let\tikz@after@path\pgfutil@empty
+
+
+% Tree options
+\newif\iftikz@child@missing
+\pgfkeys{/tikz/missing/.is if=tikz@child@missing}%
+
+\tikzset{edge from parent macro/.initial=\tikz@edge@from@parent@macro}%
+\def\tikz@edge@from@parent@macro#1#2{
+ [style=edge from parent, #1, /utils/exec=\tikz@node@is@a@labeltrue] \tikz@edge@to@parent@path #2}%
+
+\tikzoption{edge from parent path}{\def\tikz@edge@to@parent@path{#1}}%
+
+\tikzoption{parent anchor}{\def\tikzparentanchor{.#1}\ifx\tikzparentanchor\tikz@border@text\let\tikzparentanchor\pgfutil@empty\fi}%
+\tikzoption{child anchor}{\def\tikzchildanchor{.#1}\ifx\tikzchildanchor\tikz@border@text\let\tikzchildanchor\pgfutil@empty\fi}%
+
+\tikzoption{level distance}{\pgfmathsetlength\tikzleveldistance{#1}}%
+\tikzoption{sibling distance}{\pgfmathsetlength\tikzsiblingdistance{#1}}%
+
+\tikzoption{growth function}{\let\tikz@grow=#1}%
+
+\tikzset{grow siblings on line/.style={growth function=\tikz@grow@direction}}%
+
+\tikzoption{growth parent anchor}{\def\tikz@growth@anchor{#1}}%
+\tikzoption{grow}{\tikz@set@growth{#1}\edef\tikz@special@level{\the\tikztreelevel}}%
+\tikzoption{grow'}{\tikz@set@growth{#1}\tikz@swap@growth\edef\tikz@special@level{\the\tikztreelevel}}%
+
+\def\tikz@growth@anchor{center}%
+
+\def\tikz@special@level{-1}% never
+
+\def\tikz@swap@growth{%
+ % Swap left and right
+ \let\tikz@temp=\tikz@angle@grow@right%
+ \let\tikz@angle@grow@right=\tikz@angle@grow@left%
+ \let\tikz@angle@grow@left=\tikz@temp%
+}%
+
+\def\tikz@set@growth#1{%
+ \let\tikz@grow=\tikz@grow@direction%
+ \expandafter\ifx\csname tikz@grow@direction@#1\endcsname\relax%
+ \c@pgf@counta=#1\relax%
+ \else%
+ \c@pgf@counta=\csname tikz@grow@direction@#1\endcsname%
+ \fi%
+ \edef\tikz@angle@grow{\the\c@pgf@counta}%
+ \advance\c@pgf@counta by-90\relax%
+ \edef\tikz@angle@grow@left{\the\c@pgf@counta}%
+ \advance\c@pgf@counta by180\relax%
+ \edef\tikz@angle@grow@right{\the\c@pgf@counta}%
+}%
+
+\def\tikz@border@text{.border}%
+\let\tikzparentanchor=\pgfutil@empty
+\let\tikzchildanchor=\pgfutil@empty
+\def\tikz@edge@to@parent@path{(\tikzparentnode\tikzparentanchor) -- (\tikzchildnode\tikzchildanchor)}%
+
+\tikzleveldistance=15mm%
+\tikzsiblingdistance=15mm%
+
+\def\tikz@grow@direction@down{-90}%
+\def\tikz@grow@direction@up{90}%
+\def\tikz@grow@direction@left{180}%
+\def\tikz@grow@direction@right{0}%
+
+\def\tikz@grow@direction@south{-90}%
+\def\tikz@grow@direction@north{90}%
+\def\tikz@grow@direction@west{180}%
+\def\tikz@grow@direction@east{0}%
+
+\expandafter\def\csname tikz@grow@direction@north east\endcsname{45}%
+\expandafter\def\csname tikz@grow@direction@north west\endcsname{135}%
+\expandafter\def\csname tikz@grow@direction@south east\endcsname{-45}%
+\expandafter\def\csname tikz@grow@direction@south west\endcsname{-135}%
+
+\def\tikz@grow@direction{%
+ \pgftransformshift{\pgfpointpolar{\tikz@angle@grow}{\tikzleveldistance}}%
+ \ifnum\tikztreelevel=\tikz@special@level%
+ \else%
+ \pgf@xc=.5\tikzsiblingdistance%
+ \c@pgf@counta=\tikznumberofchildren%
+ \advance\c@pgf@counta by1\relax%
+ \pgfutil@tempdima=\c@pgf@counta\pgf@xc%
+ \pgftransformshift{\pgfpointpolar{\tikz@angle@grow@left}{\pgfutil@tempdima}}%
+ \pgftransformshift{\pgfpointpolar{\tikz@angle@grow@right}{\tikznumberofcurrentchild\tikzsiblingdistance}}%
+ \fi%
+}%
+
+\tikzset{grow=down}%
+
+
+% Snakes are in a lib:
+\tikzset{snake/.code=\tikzerror{You need to say \string\usetikzlibrary{snakes}}}%
+
+% Decorations
+\tikzset{decorate/.code=\tikzerror{You need to load a decoration library}}%
+
+% Matrix options
+\usepgfmodule{matrix}%
+
+\tikzoption{matrix}[true]{\csname tikz@is@matrix#1\endcsname}%
+
+\tikzoption{matrix anchor}{\def\tikz@matrix@anchor{#1}}%
+
+\tikzoption{column sep}{\def\pgfmatrixcolumnsep{#1}}%
+\tikzoption{row sep}{\def\pgfmatrixrowsep{#1}}%
+
+\tikzoption{cells}{\tikzset{every cell/.append style={#1}}}%
+
+\tikzoption{ampersand replacement}{\def\tikz@ampersand@replacement{#1}}%
+
+\newif\iftikz@is@matrix
+\let\tikz@matrix@anchor=\pgfutil@empty
+\let\tikz@ampersand@replacement=\pgfutil@empty
+
+
+% Automatic shorthand management
+\tikzset{%
+ handle active characters in code/.is if=tikz@handle@active@code,
+ handle active characters in nodes/.is if=tikz@handle@active@nodes,
+}%
+\newif\iftikz@handle@active@code
+\newif\iftikz@handle@active@nodes
+
+
+% Execute option
+\tikzoption{execute at begin picture}{\expandafter\def\expandafter\tikz@atbegin@picture\expandafter{\tikz@atbegin@picture#1}}%
+\tikzoption{execute at end picture}{\expandafter\def\expandafter\tikz@atend@picture\expandafter{\tikz@atend@picture#1}}%
+\tikzoption{execute at begin scope}{\expandafter\def\expandafter\tikz@atbegin@scope\expandafter{\tikz@atbegin@scope#1}}%
+\tikzoption{execute at end scope}{\expandafter\def\expandafter\tikz@atend@scope\expandafter{\tikz@atend@scope#1}}%
+\tikzoption{execute at begin to}{\expandafter\def\expandafter\tikz@atbegin@to\expandafter{\tikz@atbegin@to#1}}%
+\tikzoption{execute at end to}{\expandafter\def\expandafter\tikz@atend@to\expandafter{\tikz@atend@to#1}}%
+\tikzoption{execute at begin node}{\expandafter\def\expandafter\tikz@atbegin@node\expandafter{\tikz@atbegin@node#1}}%
+\tikzoption{execute at end node}{\expandafter\def\expandafter\tikz@atend@node\expandafter{\tikz@atend@node#1}}%
+\tikzoption{execute at begin matrix}{\expandafter\def\expandafter\tikz@atbegin@matrix\expandafter{\tikz@atbegin@matrix#1}}%
+\tikzoption{execute at end matrix}{\expandafter\def\expandafter\tikz@atend@matrix\expandafter{\tikz@atend@matrix#1}}%
+\tikzoption{execute at begin cell}{\expandafter\def\expandafter\tikz@atbegin@cell\expandafter{\tikz@atbegin@cell#1}}%
+\tikzoption{execute at end cell}{\expandafter\def\expandafter\tikz@atend@cell\expandafter{\tikz@atend@cell#1}}%
+\tikzoption{execute at empty cell}{\expandafter\def\expandafter\tikz@at@emptycell\expandafter{\tikz@at@emptycell#1}}%
+
+\let\tikz@atbegin@picture=\pgfutil@empty
+\let\tikz@atend@picture=\pgfutil@empty
+\let\tikz@atbegin@scope=\pgfutil@empty
+\let\tikz@atend@scope=\pgfutil@empty
+\let\tikz@atbegin@to=\pgfutil@empty
+\let\tikz@atend@to=\pgfutil@empty
+\let\tikz@atbegin@node=\pgfutil@empty
+\let\tikz@atend@node=\pgfutil@empty
+\let\tikz@atbegin@cell=\pgfutil@empty
+\let\tikz@atend@cell=\pgfutil@empty
+\let\tikz@at@emptycell=\pgfutil@empty
+\let\tikz@atbegin@matrix=\pgfutil@empty
+\let\tikz@atend@matrix=\pgfutil@empty
+
+
+% Pre and post actions
+\tikzset{preaction/.code=\expandafter\def\expandafter\tikz@preactions\expandafter{\tikz@preactions\tikz@extra@preaction{#1}}}%
+\tikzset{postaction/.code=\expandafter\def\expandafter\tikz@postactions\expandafter{\tikz@postactions\tikz@extra@postaction{#1}}}%
+\let\tikz@preactions=\pgfutil@empty
+\let\tikz@postactions=\pgfutil@empty
+
+% Styles
+\tikzoption{set style}{\tikzstyle#1}%
+
+% Handled in a special way.
+\def\tikzstyle{\pgfutil@ifnextchar\bgroup\tikz@style@parseA\tikz@style@parseB}%
+\def\tikz@style@parseB#1={\tikz@style@parseA{#1}=}%
+\def\tikz@style@parseA#1#2=#3[#4]{% check for an optional argument
+ \pgfutil@in@[{#2}%]
+ \ifpgfutil@in@%
+ \tikz@style@parseC{#1}#2={#4}%
+ \else%
+ \tikz@style@parseD{#1}#2={#4}%
+ \fi%
+}%
+
+\def\tikz@style@parseC#1[#2]#3=#4{%
+ \pgfkeys{/tikz/#1/.default={#2}}%
+ \pgfutil@in@+{#3}%
+ \ifpgfutil@in@%
+ \pgfkeys{/tikz/#1/.append style={#4}}%
+ \else%
+ \pgfkeys{/tikz/#1/.style={#4}}%
+ \fi}%
+\def\tikz@style@parseD#1#2=#3{%
+ \pgfutil@in@+{#2}%
+ \ifpgfutil@in@%
+ \pgfkeys{/tikz/#1/.append style={#3}}%
+ \else%
+ \pgfkeys{/tikz/#1/.style={#3}}%
+ \fi}%
+
+
+%
+%
+% Predefined styles
+%
+%
+
+\tikzset{help lines/.style= {color=gray,line width=0.2pt}}%
+
+\tikzset{every picture/.style= {}}%
+\tikzset{every path/.style= {}}%
+\tikzset{every scope/.style= {}}%
+\tikzset{every plot/.style= {}}%
+\tikzset{every node/.style= {}}%
+\tikzset{every child/.style= {}}%
+\tikzset{every child node/.style= {}}%
+\tikzset{every to/.style= {}}%
+\tikzset{every cell/.style= {}}%
+\tikzset{every matrix/.style= {}}%
+\tikzset{every edge/.style= {draw}}%
+\tikzset{every label/.style= {draw=none,fill=none}}%
+\tikzset{every pin/.style= {draw=none,fill=none}}%
+\tikzset{every pin edge/.style= {help lines}}%
+
+\tikzset{ultra thin/.style= {line width=0.1pt}}%
+\tikzset{very thin/.style= {line width=0.2pt}}%
+\tikzset{thin/.style= {line width=0.4pt}}%
+\tikzset{semithick/.style= {line width=0.6pt}}%
+\tikzset{thick/.style= {line width=0.8pt}}%
+\tikzset{very thick/.style= {line width=1.2pt}}%
+\tikzset{ultra thick/.style= {line width=1.6pt}}%
+
+\tikzset{solid/.style= {dash pattern=}}%
+\tikzset{dotted/.style= {dash pattern=on \pgflinewidth off 2pt}}%
+\tikzset{densely dotted/.style= {dash pattern=on \pgflinewidth off 1pt}}%
+\tikzset{loosely dotted/.style= {dash pattern=on \pgflinewidth off 4pt}}%
+\tikzset{dashed/.style= {dash pattern=on 3pt off 3pt}}%
+\tikzset{densely dashed/.style= {dash pattern=on 3pt off 2pt}}%
+\tikzset{loosely dashed/.style= {dash pattern=on 3pt off 6pt}}%
+\tikzset{dashdotted/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt}}%
+\tikzset{dash dot/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt}}%
+\tikzset{densely dashdotted/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt}}%
+\tikzset{densely dash dot/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt}}%
+\tikzset{loosely dashdotted/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt}}%
+\tikzset{loosely dash dot/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt}}%
+\tikzset{dashdotdotted/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt on \the\pgflinewidth off 2pt}}%
+\tikzset{densely dashdotdotted/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt on \the\pgflinewidth off 1pt}}%
+\tikzset{loosely dashdotdotted/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt on \the\pgflinewidth off 4pt}}%
+\tikzset{dash dot dot/.style= {dash pattern=on 3pt off 2pt on \the\pgflinewidth off 2pt on \the\pgflinewidth off 2pt}}%
+\tikzset{densely dash dot dot/.style= {dash pattern=on 3pt off 1pt on \the\pgflinewidth off 1pt on \the\pgflinewidth off 1pt}}%
+\tikzset{loosely dash dot dot/.style= {dash pattern=on 3pt off 4pt on \the\pgflinewidth off 4pt on \the\pgflinewidth off 4pt}}%
+
+
+\tikzset{transparent/.style= {opacity=0}}%
+\tikzset{ultra nearly transparent/.style={opacity=0.05}}%
+\tikzset{very nearly transparent/.style= {opacity=0.1}}%
+\tikzset{nearly transparent/.style= {opacity=0.25}}%
+\tikzset{semitransparent/.style= {opacity=0.5}}%
+\tikzset{nearly opaque/.style= {opacity=0.75}}%
+\tikzset{very nearly opaque/.style= {opacity=0.9}}%
+\tikzset{ultra nearly opaque/.style= {opacity=0.95}}%
+\tikzset{opaque/.style= {opacity=1}}%
+
+\tikzset{at start/.style= {pos=0}}%
+\tikzset{very near start/.style= {pos=0.125}}%
+\tikzset{near start/.style= {pos=0.25}}%
+\tikzset{midway/.style= {pos=0.5}}%
+\tikzset{near end/.style= {pos=0.75}}%
+\tikzset{very near end/.style= {pos=0.875}}%
+\tikzset{at end/.style= {pos=1}}%
+
+\tikzset{bend at start/.style= {bend pos=0,bend={+(0,0)}}}%
+\tikzset{bend at end/.style= {bend pos=1,bend={+(0,0)}}}%
+
+\tikzset{edge from parent/.style= {draw}}%
+
+
+
+% Animation callbacks
+\tikzset{
+ animate/.code=\tikzerror{You need to say \string\usetikzlibrary{animations} to use animations}
+}
+
+% ID callbacks
+\newif\iftikz@is@node
+\let\tikz@id@name\pgfutil@empty
+\let\tikz@id@hook\pgfutil@empty
+\def\tikz@call@id@hook{\ifx\tikz@id@hook\pgfutil@empty\else\tikz@id@hook\pgfuseid{\tikz@id@name}\fi}%
+
+
+% RDF stuff
+\let\tikz@clear@rdf@options\relax
+\let\tikz@do@rdf@post@options\relax
+\let\tikz@do@rdf@pre@options\relax
+
+
+%
+% Setting keys
+%
+
+\pgfkeys{/tikz/style/.style=#1}%
+
+\pgfkeys{/tikz/.unknown/.code=%
+ % Is it a pgf key?
+ \let\tikz@key\pgfkeyscurrentname%
+ \pgfkeys{/pgf/\tikz@key/.try={#1}}%
+ \ifpgfkeyssuccess%
+ \else%
+ \expandafter\pgfutil@in@\expandafter!\expandafter{\tikz@key}%
+ \ifpgfutil@in@%
+ % this is a color!
+ \expandafter\tikz@addoption\expandafter{\expandafter\tikz@compat@color@set\expandafter{\tikz@key}}%
+ \edef\tikz@textcolor{\tikz@key}%
+ \else%
+ \pgfutil@doifcolorelse{\tikz@key}
+ {%
+ \expandafter\tikz@addoption\expandafter{\expandafter\tikz@compat@color@set\expandafter{\tikz@key}}%
+ \edef\tikz@textcolor{\tikz@key}%
+ }%
+ {%
+ % Ok, second chance: This might be an arrow specification:
+ \expandafter\pgfutil@in@\expandafter-\expandafter{\tikz@key}%
+ \ifpgfutil@in@%
+ % Ah, an arrow spec!
+ \expandafter\tikz@processarrows\expandafter{\tikz@key}%
+ \else%
+ % Ok, third chance: A shape!
+ \expandafter\ifx\csname pgf@sh@s@\tikz@key\endcsname\relax%
+ \pgfkeys{/errors/unknown key/.expand
+ once=\expandafter{\expandafter/\expandafter t\expandafter i\expandafter k\expandafter z\expandafter/\tikz@key}{#1}}%
+ \else%
+ \edef\tikz@shape{\tikz@key}%
+ \fi%
+ \fi%
+ }%
+ \fi%
+ \fi%
+}%
+\def\tikz@compat@color@set#1{%
+ \pgfutil@color{#1}\pgfutil@colorlet{pgffillcolor}{#1}%
+ \expandafter\let\expandafter\pgf@temp\csname\string\color@pgffillcolor\endcsname%
+ % for arrow tips:
+ \global\let\pgf@strokecolor@global=\pgf@temp
+ \global\let\pgf@fillcolor@global=\pgf@temp
+}%
+
+\def\tikz@startup@env{%
+ \ifnum\the\catcode`\;=\active\relax\expandafter\let\expandafter\tikz@origsemi\expandafter=\tikz@activesemicolon\fi%
+ \ifnum\the\catcode`\:=\active\relax\expandafter\let\expandafter\tikz@origcolon\expandafter=\tikz@activecolon\fi%
+ \ifnum\the\catcode`\|=\active\relax\expandafter\let\expandafter\tikz@origbar\expandafter=\tikz@activebar\fi%
+ \tikz@deactivatthings%
+ \iftikz@handle@active@code%
+ \tikz@switchoff@shorthands%
+ \fi%
+}%
+
+%
+% Main TikZ Environment
+%
+\newif\iftikz@inside@picture
+\tikz@inside@picturefalse
+\def\tikz@check@inside@picture{%
+ \iftikz@inside@picture%
+ \pgfwarning{Nesting tikzpictures is NOT supported}%
+ \fi%
+ \tikz@inside@picturetrue%
+}
+
+\def\tikzpicture{%
+ \begingroup%
+ \tikz@startup@env%
+ \tikz@collect@scope@anims\tikz@picture}%
+\def\tikz@picture[#1]{%
+ %\tikz@check@inside@picture%
+ \pgfpicture%
+ \let\tikz@atbegin@picture=\pgfutil@empty%
+ \let\tikz@atend@picture=\pgfutil@empty%
+ \let\tikz@transform=\relax%
+ \def\tikz@time{.5}%
+ \tikz@installcommands%
+ \scope[every picture,#1]%
+ \iftikz@handle@active@code%
+ \tikz@switchoff@shorthands%
+ \fi%
+ \expandafter\tikz@atbegin@picture%
+ \tikz@lib@scope@check%
+}%
+\def\endtikzpicture{%
+ \tikz@atend@picture%
+ \global\let\pgf@shift@baseline@smuggle=\pgf@baseline%
+ \global\let\pgf@trimleft@final@smuggle=\pgf@trimleft%
+ \global\let\pgf@trimright@final@smuggle=\pgf@trimright%
+ \global\let\pgf@remember@smuggle=\ifpgfrememberpicturepositiononpage%
+ \pgf@remember@layerlist@globally
+ \endscope%
+ \let\pgf@baseline=\pgf@shift@baseline@smuggle%
+ \let\pgf@trimleft=\pgf@trimleft@final@smuggle%
+ \let\pgf@trimright=\pgf@trimright@final@smuggle%
+ \let\ifpgfrememberpicturepositiononpage=\pgf@remember@smuggle%
+ \pgf@restore@layerlist@from@global
+ \endpgfpicture\endgroup}%
+
+
+% Inlined picture
+%
+% #1 - some code to be put in a tikzpicture environment.
+%
+% If the command is not followed by braces, everything up to the next
+% semicolon is used as argument.
+%
+% Example:
+%
+% The rectangle \tikz{\draw (0,0) rectangle (1em,1ex)} has width 1em and
+% height 1ex.
+
+
+\def\tikz{%
+ \begingroup%
+ \tikz@startup@env%
+ \tikz@collect@scope@anims\tikz@opt}%
+\def\tikz@opt[#1]{\tikzpicture[#1]\pgfutil@ifnextchar\bgroup{\tikz@}{\tikz@@single}}%
+\def\tikz@{\bgroup\tikz@auto@end@pathtrue\aftergroup\endtikzpicture\aftergroup\endgroup\let\pgf@temp=}%
+\def\tikz@@single#1{%
+ \expandafter\ifx\csname tikz@protected@command\string#1\endcsname\relax%
+ \expandafter\tikz@@%
+ \else%
+ \begingroup\def\tikz@path@do@at@end{\endgroup\endtikzpicture\endgroup}%
+ \fi%
+ #1%
+}%
+
+\expandafter\let\csname tikz@protected@command\string\draw\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\pattern\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\fill\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\filldraw\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\shade\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\shadedraw\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\clip\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\graph\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\useasboundingbox\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\node\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\coordinate\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\matrix\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\datavisualization\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\path\endcsname\pgfutil@empty%
+\expandafter\let\csname tikz@protected@command\string\pic\endcsname\pgfutil@empty%
+
+% Comment by TT: I hope I fixed the \tikz \foreach problem. The new
+% version will take a conservative approach and will only do fancy
+% stuff when the next keyword after \tikz is one of the following:
+% \draw, \fill, \filldraw, \graph, \matrix,
+\def\tikz@@{%
+ \let\tikz@next=\tikz@collectnormalsemicolon%
+ \ifnum\the\catcode`\;=\active\relax%
+ \let\tikz@next=\tikz@collectactivesemicolon%
+ \fi%
+ \tikz@next}%
+\def\tikz@collectnormalsemicolon#1;{#1;\endtikzpicture\endgroup}
+{
+ \catcode`\;=\active
+ \gdef\tikz@collectactivesemicolon#1;{#1;\endtikzpicture\endgroup}
+}%
+% End old code
+
+% Invokes '#1' if the command is invoked within a tikzpicture and
+% '#2' if not.
+\def\tikzifinpicture#1#2{%
+ \pgfutil@ifundefined{filldraw}{#2}{#1}% TT: This is a wrong
+ % test! Who uses this?...
+}%
+
+
+\def\tikz@collect@scope@anims#1{%
+ \pgfutil@ifnextchar[#1{#1[]}%]
+}%
+
+%
+% Environment for scoping graphic state settings
+%
+\def\tikz@scope@env{%
+ \pgfscope%
+ \begingroup%
+ \let\tikz@atbegin@scope=\pgfutil@empty%
+ \let\tikz@atend@scope=\pgfutil@empty%
+ \let\tikz@options=\pgfutil@empty%
+ \tikz@clear@rdf@options%
+ \let\tikz@mode=\pgfutil@empty%
+ \let\tikz@id@name=\pgfutil@empty%
+ \tikz@transparency@groupfalse%
+ \tikzset{every scope/.try}%
+ \tikz@collect@scope@anims\tikz@scope@opt%
+}%
+\def\tikz@scope@opt[#1]{%
+ \tikzset{#1}%
+ \tikz@options%
+ \tikz@do@rdf@pre@options%
+ \iftikz@transparency@group\expandafter\pgftransparencygroup\expandafter[\tikz@transparency@group@options]\tikz@blend@group\fi%
+ \tikz@is@nodefalse%
+ \tikz@call@id@hook%
+ \pgfidscope%
+ \tikz@do@rdf@post@options%
+ \begingroup%
+ \let\tikz@id@name\pgfutil@empty%
+ \expandafter\tikz@atbegin@scope%
+ \expandafter\pgfclearid%
+ \tikz@lib@scope@check%
+}%
+\def\endtikz@scope@env{%
+ \tikz@atend@scope%
+ \endgroup%
+ \endpgfidscope%
+ \iftikz@transparency@group\endpgftransparencygroup\fi%
+ \endgroup%
+ \endpgfscope%
+ \tikz@lib@scope@check%
+}%
+
+
+\def\tikz@scoped{\tikz@collect@scope@anims\tikz@scoped@opt}%
+\def\tikz@scoped@opt[#1]{\scope[#1]\pgfutil@ifnextchar\bgroup{\tikz@scoped@}{\tikz@scoped@@single}}%
+\def\tikz@scoped@{\bgroup\tikz@auto@end@pathtrue\aftergroup\endscope\let\pgf@temp=}%
+\def\tikz@scoped@@single#1{%
+ \expandafter\ifx\csname tikz@scoped@protected@command\string#1\endcsname\relax%
+ \expandafter\tikz@scoped@@%
+ \else%
+ \begingroup\def\tikz@scoped@path@do@at@end{\endgroup\endscope}%
+ \fi%
+ #1%
+}%
+\def\tikz@scoped@@{%
+ \let\tikz@scoped@next=\tikz@scoped@collectnormalsemicolon%
+ \ifnum\the\catcode`\;=\active\relax%
+ \let\tikz@scoped@next=\tikz@scoped@collectactivesemicolon%
+ \fi%
+ \tikz@scoped@next}%
+\def\tikz@scoped@collectnormalsemicolon#1;{#1;\endscope}
+{
+ \catcode`\;=\active
+ \gdef\tikz@scoped@collectactivesemicolon#1;{#1;\endscope}
+}%
+
+
+% Install a shortcut command which is only valid inside of a
+% tikzpicture.
+%
+% It works in the same way as the '\path' shortcut does: it introduces
+% a \let#1=#2 at the beginning of tikzpicture.
+%
+% #1: shortcut command inside of tikzpicture
+% #2: real command name
+\def\tikzaddtikzonlycommandshortcutlet#1#2{%
+ \expandafter\def\expandafter\tikz@installcommands\expandafter{\tikz@installcommands
+ \let#1=#2%
+ }%
+}%
+
+% Has the same effect as \tikzaddtikzonlycommandshortcutlet but uses
+% \def#1{#2} instead of \let.
+\def\tikzaddtikzonlycommandshortcutdef#1#2{%
+ \expandafter\def\expandafter\tikz@installcommands\expandafter{\tikz@installcommands
+ \def#1{#2}%
+ }%
+}%
+
+%
+% Install the abbreviated commands
+%
+\def\tikz@installcommands{%
+ \let\tikz@origscope=\scope%
+ \let\tikz@origscoped=\scoped%
+ \let\tikz@origendscope=\endscope%
+ \let\tikz@origstartscope=\startscope%
+ \let\tikz@origstopscope=\stopscope%
+ \let\tikz@origpath=\path%
+ \let\tikz@origagainpath=\againpath%
+ \let\tikz@origdraw=\draw%
+ \let\tikz@origpattern=\pattern%
+ \let\tikz@origfill=\fill%
+ \let\tikz@origfilldraw=\filldraw%
+ \let\tikz@origshade=\shade%
+ \let\tikz@origshadedraw=\shadedraw%
+ \let\tikz@origclip=\clip%
+ \let\tikz@origuseasboundingbox=\useasboundingbox%
+ \let\tikz@orignode=\node%
+ \let\tikz@origpic=\pic%
+ \let\tikz@origcoordinate=\coordinate%
+ \let\tikz@origmatrix=\matrix%
+ \let\tikz@origcalendar=\calendar%
+ \let\tikz@origdv=\datavisualization%
+ \let\tikz@origgraph=\graph%
+ %
+ \let\scope=\tikz@scope@env%
+ \let\scoped=\tikz@scoped%
+ \let\endscope=\endtikz@scope@env%
+ \let\startscope=\scope%
+ \let\stopscope=\endscope%
+ \let\path=\tikz@command@path%
+ \let\againpath=\tikz@command@againpath%
+ %
+ \def\draw{\path[draw]}%
+ \def\pattern{\path[pattern]}%
+ \def\fill{\path[fill]}%
+ \def\filldraw{\path[fill,draw]}%
+ \def\shade{\path[shade]}%
+ \def\shadedraw{\path[shade,draw]}%
+ \def\clip{\path[clip]}%
+ \def\graph{\path graph}%
+ \def\useasboundingbox{\path[use as bounding box]}%
+ \def\node{\tikz@path@overlay{node}}%
+ \def\pic{\tikz@path@overlay{pic}}%
+ \def\coordinate{\tikz@path@overlay{coordinate}}%
+ \def\matrix{\tikz@path@overlay{node[matrix]}}%
+ \def\calendar{\tikz@lib@cal@calendar}%
+ \def\datavisualization{\tikz@lib@datavisualization}%
+}%
+\ifx\tikz@lib@cal@calendar\@undefined
+\def\tikz@lib@cal@calendar{\tikzerror{You need to say \string\usetikzlibrary{calendar} to use the \string\calendar{} command}}%
+\fi
+\ifx\tikz@lib@datavisualization\@undefined
+\def\tikz@lib@datavisualization{\tikzerror{You need to say \string\usetikzlibrary{datavisualization} to use the \string\datavisualization{} command}}%
+\fi
+
+\def\tikz@path@overlay#1{%
+ \let\tikz@signal@path=\tikz@signal@path% for detection at begin of matrix cell
+ \pgfutil@ifnextchar<{\tikz@path@overlayed{#1}}{\path #1}}%
+\def\tikz@path@overlayed#1<#2>{\path<#2> #1}%
+
+\def\tikz@uninstallcommands{%
+ \let\scope=\tikz@origscope%
+ \let\scoped=\tikz@origscoped%
+ \let\endscope=\tikz@origendscope%
+ \let\startscope=\tikz@origstartscope%
+ \let\stopscope=\tikz@origstopscope%
+ \let\path=\tikz@origpath%
+ \let\againpath=\tikz@origagainpath%
+ \let\draw=\tikz@origdraw%
+ \let\pattern=\tikz@origpattern%
+ \let\fill=\tikz@origfill%
+ \let\filldraw=\tikz@origfilldraw%
+ \let\shade=\tikz@origshade%
+ \let\shadedraw=\tikz@origshadedraw%
+ \let\clip=\tikz@origclip%
+ \let\useasboundingbox=\tikz@origuseasboundingbox%
+ \let\node=\tikz@orignode%
+ \let\pic=\tikz@origpic%
+ \let\coordinate=\tikz@origcoordinate%
+ \let\matrix=\tikz@origmatrix%
+ \let\calendar=\tikz@origcalendar%
+ \let\datavisualization=\tikz@origdv%
+ \let\graph=\tikz@origgraph%
+}%
+
+
+{%
+ \catcode`\;=12
+ \gdef\tikz@nonactivesemicolon{;}%
+ \catcode`\:=12
+ \gdef\tikz@nonactivecolon{:}%
+ \catcode`\|=12
+ \gdef\tikz@nonactivebar{|}%
+ \catcode`\!=12
+ \gdef\tikz@nonactiveexlmark{!}%
+ \catcode`\;=\active
+ \catcode`\:=\active
+ \catcode`\|=\active
+ \catcode`\"=\active
+ \catcode`\!=\active
+ \gdef\tikz@activesemicolon{;}%
+ \gdef\tikz@activecolon{:}%
+ \gdef\tikz@activebar{|}%
+ \gdef\tikz@activequotes{"}%
+ \global\let\tikz@active@quotes@token="%
+ \gdef\tikz@activeexlmark{!}%
+ \gdef\tikz@deactivatthings{%
+ \def;{\tikz@nonactivesemicolon}%
+ \def:{\tikz@nonactivecolon}%
+ \def|{\tikz@nonactivebar}%
+ \def!{\tikz@nonactiveexlmark}%
+ }%
+}%
+
+\let\tikz@orig@shorthands\pgfutil@empty
+\def\tikz@switchoff@shorthands{%
+ \ifx\tikz@orig@shorthands\pgfutil@empty%
+ \edef\tikz@orig@shorthands{%
+ \catcode\noexpand`\noexpand\;\the\catcode`\;\relax%
+ \catcode\noexpand`\noexpand\:\the\catcode`\:\relax%
+ \catcode\noexpand`\noexpand\|\the\catcode`\|\relax%
+ \catcode\noexpand`\noexpand\!\the\catcode`\!\relax%
+ \catcode\noexpand`\noexpand\,\the\catcode`\,\relax%
+ \catcode\noexpand`\noexpand\<\the\catcode`\<\relax%
+ \catcode\noexpand`\noexpand\>\the\catcode`\>\relax%
+ \catcode\noexpand`\noexpand\"\the\catcode`\"\relax%
+ \catcode\noexpand`\noexpand\'\the\catcode`\'\relax%
+ \catcode\noexpand`\noexpand\-\the\catcode`\-\relax%
+ \catcode\noexpand`\noexpand\=\the\catcode`\=\relax%
+ \catcode\noexpand`\noexpand\.\the\catcode`\.\relax%
+ \catcode\noexpand`\noexpand\$\the\catcode`\$\relax%
+ }%
+ \catcode`\;12\relax%
+ \catcode`\:12\relax%
+ \catcode`\|12\relax%
+ \catcode`\!12\relax%
+ \catcode`\,12\relax%
+ \catcode`\<12\relax%
+ \catcode`\>12\relax%
+ \catcode`\"12\relax%
+ \catcode`\'12\relax%
+ \catcode`\-12\relax%
+ \catcode`\=12\relax%
+ \catcode`\.12\relax%
+ \catcode`\$3\relax%
+ \fi%
+}%
+
+
+
+% Constructs a path and draws/fills them according to the current
+% settings.
+
+\def\tikz@command@path{%
+ \global\let\tikz@intersect@namedpaths=\pgfutil@empty% clear intersections
+ \let\tikz@signal@path=\tikz@signal@path% for detection at begin of matrix cell
+ \pgfutil@ifnextchar[{\tikz@check@earg}%]
+ {\pgfutil@ifnextchar<{\tikz@doopt}{\tikz@@command@path}}}%
+\pgfutil@protected\def\tikz@signal@path{\tikz@signal@path}%
+\def\tikz@check@earg[#1]{%
+ \pgfutil@ifnextchar<{\tikz@swap@args[#1]}{\tikz@@command@path[#1]}}
+\def\tikz@swap@args[#1]<#2>{\tikz@command@path<#2>[#1]}%
+
+\def\tikz@doopt{%
+ \let\tikz@next=\tikz@eargnormalsemicolon%
+ \ifnum\the\catcode`\;=\active\relax%
+ \let\tikz@next=\tikz@eargactivesemicolon%
+ \fi%
+ \tikz@next}%
+\long\def\tikz@eargnormalsemicolon<#1>#2;{\alt<#1>{\tikz@@command@path#2;}{\tikz@path@do@at@end}}%
+{
+ \catcode`\;=\active
+ \long\global\def\tikz@eargactivesemicolon<#1>#2;{\alt<#1>{\tikz@@command@path#2;}{\tikz@path@do@at@end}}%
+}
+
+\def\tikz@@command@path{%
+ \edef\tikzscope@linewidth{\the\pgflinewidth}%
+ \begingroup%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \let\tikz@path@do@at@end=\tikz@lib@scope@check%
+ \let\tikz@options=\pgfutil@empty%
+ \tikz@clear@rdf@options%
+ \let\tikz@mode=\pgfutil@empty%
+ \let\tikz@moveto@waiting=\relax%
+ \let\tikz@timer=\relax%
+ \let\tikz@tangent=\relax%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \let\tikz@preactions=\pgfutil@empty%
+ \let\tikz@postactions=\pgfutil@empty%
+ \tikz@snakedfalse%
+ \tikz@decoratepathfalse%
+ \tikz@node@is@a@labelfalse%
+ \tikz@expandcount=100\relax%
+ \pgf@path@lastx=0pt%
+ \pgf@path@lasty=0pt%
+ \tikz@lastx=0pt%
+ \tikz@lasty=0pt%
+ \tikz@lastxsaved=0pt%
+ \tikz@lastysaved=0pt%
+ \tikzset{every path/.try}%
+ \tikz@scan@next@command%
+}%
+\def\tikz@scan@next@command{%
+ \ifx\tikz@collected@onpath\pgfutil@empty%
+ \else%
+ \tikz@invoke@collected@onpath%
+ \fi%
+ \afterassignment\tikz@handle\let\pgf@let@token=%
+}%
+\newcount\tikz@expandcount
+\let\tikz@collected@onpath=\pgfutil@empty%
+
+% Central dispatcher for commands
+\def\tikz@handle{%
+ \let\pgfutil@next=\tikz@expand%
+ \ifx\pgf@let@token(%)
+ \let\pgfutil@next=\tikz@movetoabs%
+ \else%
+ \ifx\pgf@let@token+%
+ \let\pgfutil@next=\tikz@movetorel%
+ \else%
+ \ifx\pgf@let@token-%
+ \let\pgfutil@next=\tikz@lineto%
+ \else%
+ \ifx\pgf@let@token.%
+ \let\pgfutil@next=\tikz@dot%
+ \else%
+ \ifx\pgf@let@token r%
+ \let\pgfutil@next=\tikz@rect%
+ \else%
+ \ifx\pgf@let@token n%
+ \let\pgfutil@next=\tikz@fig%
+ \else%
+ \ifx\pgf@let@token[%]
+ \let\pgfutil@next=\tikz@parse@options%
+ \else%
+ \ifx\pgf@let@token c%
+ \let\pgfutil@next=\tikz@cchar%
+ \else%
+ \ifx\pgf@let@token\bgroup%
+ \let\pgfutil@next=\tikz@beginscope%
+ \else%
+ \ifx\pgf@let@token\egroup%
+ \let\pgfutil@next=\tikz@endscope%
+ \else%
+ \ifx\pgf@let@token;%
+ \let\pgfutil@next=\tikz@finish%
+ \else%
+ \let\pgfutil@next=\tikz@handle@more%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfutil@next%
+}%
+
+% Continued...
+\def\tikz@handle@more{%
+ \ifx\pgf@let@token a%
+ \let\pgfutil@next=\tikz@a@char%
+ \else%
+ \ifx\pgf@let@token e%
+ \let\pgfutil@next=\tikz@e@char%
+ \else%
+ \ifx\pgf@let@token g%
+ \let\pgfutil@next=\tikz@g@char%
+ \else%
+ \ifx\pgf@let@token s%
+ \let\pgfutil@next=\tikz@schar%
+ \else%
+ \ifx\pgf@let@token |%
+ \let\pgfutil@next=\tikz@vh@lineto%
+ \else%
+ \ifx\pgf@let@token p%
+ \let\pgfutil@next=\tikz@pchar%
+ \pgfsetmovetofirstplotpoint%
+ \else%
+ \ifx\pgf@let@token t%
+ \let\pgfutil@next=\tikz@to%
+ \else%
+ \ifx\pgf@let@token\pgfextra%
+ \let\pgfutil@next=\tikz@extra%
+ \else%
+ \ifx\pgf@let@token\foreach%
+ \let\pgfutil@next=\tikz@foreach%
+ \else%
+ \ifx\pgf@let@token f%
+ \let\pgfutil@next=\tikz@fchar%
+ \else%
+ \ifx\pgf@let@token\pgf@stop%
+ \let\pgfutil@next=\relax%
+ \else%
+ \ifx\pgf@let@token\par%
+ \let\pgfutil@next=\tikz@scan@next@command%
+ \else%
+ \ifx\pgf@let@token d%
+ \let\pgfutil@next=\tikz@decoration%
+ \else%
+ \ifx\pgf@let@token l%
+ \let\pgfutil@next=\tikz@l@char%
+ \else%
+ \ifx\pgf@let@token:%
+ \let\pgfutil@next=\tikz@colon@char%
+ \else%
+ \let\pgfutil@next=\tikz@expand%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \ifx\pgfutil@next\tikz@expand\else\tikz@expandcount=100\relax\fi%
+ \pgfutil@next%
+}%
+
+\def\tikz@l@char{%
+ \pgfutil@ifnextchar e{\tikz@let@command}{%
+ \pgfutil@ifnextchar i{\tikz@lsystem}{%
+ \pgfutil@ifnextchar-{\tikz@@lsystem}{\tikz@expand}%
+ }%
+ }%
+}%
+
+\def\tikz@lsystem{%
+ \tikzerror{You need to say \string\usetikzlibrary{lindenmayersystems} to draw Lindenmayer systems}
+}%
+
+\def\tikz@@lsystem{%
+ \tikzerror{You need to say \string\usetikzlibrary{lindenmayersystems} to draw L-systems}
+}%
+
+\def\tikz@pchar{\pgfutil@ifnextchar l{\tikz@plot}{\pgfutil@ifnextchar i{\tikz@subpicture}{\tikz@parabola}}}%
+\def\tikz@cchar{%
+ \pgfutil@ifnextchar i{\tikz@circle}%
+ {\pgfutil@ifnextchar h{\tikz@children}{\tikz@cochar}}}%
+\def\tikz@cochar o{%
+ \pgfutil@ifnextchar o{\tikz@coordinate}{\tikz@cosine}}%
+\def\tikz@e@char{%
+ \pgfutil@ifnextchar l{\tikz@ellipse}{\tikz@@e@char}}%
+\def\tikz@a@char{%
+ \pgfutil@ifnextchar r{\tikz@arcA}{\tikzerror{Arc expected}}}%
+\def\tikz@@e@char dge{%
+ \pgfutil@ifnextchar f{\tikz@edgetoparent}{\tikz@edge@plain}}%
+
+\def\tikz@schar{\pgfutil@ifnextchar i{\tikz@sine}{\tikz@svg@path}}%
+
+\def\tikz@g@char r{\pgfutil@ifnextchar i{\tikz@grid}{\tikz@graph}}%
+
+% svg syntax
+% svg[options] {...}
+
+\def\tikz@svg@path{%
+ \tikzerror{You need to say \string\usetikzlibrary{svg.path} to use the svg path command}
+}%
+
+
+\def\tikz@finish{%
+ % Rendering pipeline
+ %
+ % Step 1: The path background box
+ %
+ \box\tikz@figbox@bg%
+ %
+ % Step 2: Decorate path
+ %
+ \iftikz@decoratepath%
+ \tikz@lib@dec@decorate@path%
+ \fi%
+ %
+ % Step 3: Preactions
+ %
+ \pgfsyssoftpath@getcurrentpath\tikz@actions@path%
+ \edef\tikz@restorepathsize{%
+ \global\pgf@pathmaxx=\the\pgf@pathmaxx%
+ \global\pgf@pathmaxy=\the\pgf@pathmaxy%
+ \global\pgf@pathminx=\the\pgf@pathminx%
+ \global\pgf@pathminy=\the\pgf@pathminy%
+ }%
+ \tikz@preactions%
+ %
+ % Step 4: Reset modes
+ %
+ \let\tikz@path@picture=\pgfutil@empty%
+ \tikz@mode@fillfalse%
+ \tikz@mode@drawfalse%
+ \tikz@mode@doublefalse%
+ \tikz@mode@clipfalse%
+ \tikz@mode@boundaryfalse%
+ \tikz@mode@fade@pathfalse%
+ \tikz@mode@fade@scopefalse%
+ \edef\tikz@pathextend{%
+ {\noexpand\pgfqpoint{\the\pgf@pathminx}{\the\pgf@pathminy}}%
+ {\noexpand\pgfqpoint{\the\pgf@pathmaxx}{\the\pgf@pathmaxy}}%
+ }%
+ \tikz@mode% installs the mode settings
+ % Path fading counts as an option:
+ \iftikz@mode@fade@path%
+ \tikz@addoption{%
+ \iftikz@fade@adjust%
+ \iftikz@mode@draw%
+ \pgfsetfadingforcurrentpathstroked{\tikz@path@fading}{\tikz@do@fade@transform}%
+ \else%
+ \pgfsetfadingforcurrentpath{\tikz@path@fading}{\tikz@do@fade@transform}%
+ \fi%
+ \else%
+ \pgfsetfading{\tikz@path@fading}{\tikz@do@fade@transform}%
+ \fi%
+ \tikz@mode@fade@pathfalse% no more fading...
+ }%
+ \fi%
+ %
+ % Step 5: Install scope fading
+ %
+ \iftikz@mode@fade@scope%
+ \iftikz@fade@adjust%
+ \iftikz@mode@draw%
+ \pgfsetfadingforcurrentpathstroked{\tikz@scope@fading}{\tikz@do@fade@transform}%
+ \else%
+ \pgfsetfadingforcurrentpath{\tikz@scope@fading}{\tikz@do@fade@transform}%
+ \fi%
+ \else%
+ \pgfsetfading{\tikz@scope@fading}{\tikz@do@fade@transform}%
+ \fi%
+ \tikz@mode@fade@scopefalse%
+ \fi%
+ %
+ % Step 5': Setup options
+ %
+ \ifx\tikz@options\pgfutil@empty%
+ \else%
+ \pgfsys@beginscope%
+ \let\pgfscope@stroke@color=\pgf@strokecolor@global%
+ \let\pgfscope@fill@color=\pgf@fillcolor@global%
+ \begingroup%
+ \tikz@options%
+ \fi%
+ \tikz@do@rdf@pre@options%
+ %
+ % Step 5'': Setup animations
+ %
+ \tikz@is@nodefalse%
+ \tikz@call@id@hook%
+ \iftikz@mode@clip\else%
+ \pgfidscope%
+ \tikz@do@rdf@post@options%
+ \begingroup%
+ \fi% open an animation scope here, unless clipping is done
+ %
+ % Step 6: Do a fill if shade or a path picture follows.
+ %
+ \iftikz@mode@fill%
+ \iftikz@mode@shade%
+ \pgfsyssoftpath@getcurrentpath\tikz@temppath
+ \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
+ \pgfsyssoftpath@setcurrentpath\tikz@temppath%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfpushtype%
+ \pgfusetype{.path fill}%
+ \pgfsys@fill%
+ \pgfpoptype%
+ \tikz@mode@fillfalse% no more filling...
+ \else%
+ \ifx\tikz@path@picture\pgfutil@empty%
+ \else%
+ \pgfsyssoftpath@getcurrentpath\tikz@temppath
+ \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
+ \pgfsyssoftpath@setcurrentpath\tikz@temppath%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfpushtype%
+ \pgfusetype{.path fill}%
+ \pgfsys@fill%
+ \pgfpoptype%
+ \tikz@mode@fillfalse% no more filling...
+ \fi%
+ \fi%
+ \fi%
+ %
+ % Step 7: Do a shade if necessary.
+ %
+ \iftikz@mode@shade%
+ \pgfsyssoftpath@getcurrentpath\tikz@temppath
+ \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
+ \pgfsyssoftpath@setcurrentpath\tikz@temppath%
+ \pgfpushtype%
+ \pgfusetype{.path shade}%
+ \pgfshadepath{\tikz@shading}{\tikz@shade@angle}%
+ \pgfpoptype%
+ \tikz@mode@shadefalse% no more shading...
+ \fi%
+ %
+ % Step 8: Do a path picture if necessary.
+ %
+ \ifx\tikz@path@picture\pgfutil@empty%
+ \else%
+ \begingroup%
+ \pgfusetype{.path picture}%
+ \pgfidscope%
+ \pgfsys@beginscope%
+ \let\tikz@id@name\pgfutil@empty%
+ \pgfclearid%
+ \pgfsyssoftpath@getcurrentpath\tikz@temppath
+ \pgfprocessround{\tikz@temppath}{\tikz@temppath}% change the path
+ \pgfsyssoftpath@setcurrentpath\tikz@temppath%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsys@clipnext%
+ \pgfsys@discardpath%
+ \pgf@relevantforpicturesizefalse%
+ \expandafter\def\csname pgf@sh@ns@path picture bounding box\endcsname{rectangle}
+ \expandafter\edef\csname pgf@sh@np@path picture bounding box\endcsname{%
+ \def\noexpand\southwest{\noexpand\pgfqpoint{\the\pgf@pathminx}{\the\pgf@pathminy}}%
+ \def\noexpand\northeast{\noexpand\pgfqpoint{\the\pgf@pathmaxx}{\the\pgf@pathmaxy}}%
+ }
+ \expandafter\def\csname pgf@sh@nt@path picture bounding box\endcsname{{1}{0}{0}{1}{0pt}{0pt}}
+ \expandafter\def\csname pgf@sh@pi@path picture bounding box\endcsname{\pgfpictureid}
+ \pgfinterruptpath%
+ \tikz@path@picture%
+ \endpgfinterruptpath%
+ \pgfsys@endscope%
+ \endpgfidscope%
+ \endgroup%
+ \let\tikz@path@picture=\pgfutil@empty%
+ \fi%
+ %
+ % Step 9: Double stroke, if necessary
+ %
+ \iftikz@mode@draw%
+ \iftikz@mode@double%
+ % Change line width
+ \begingroup%
+ \pgfsys@beginscope%
+ \tikz@double@setup%
+ \fi%
+ \fi%
+ %
+ % Step 10: Do stroke/fill/clip as needed
+ %
+ \pgfpushtype%
+ \edef\tikz@temp{\noexpand\pgfusepath{%
+ \iftikz@mode@fill fill,\fi%
+ \iftikz@mode@draw draw,\fi%
+ \iftikz@mode@clip clip\fi%
+ }}%
+ \pgfusetype{.path}%
+ \tikz@temp%
+ \pgfpoptype%
+ \tikz@mode@fillfalse% no more filling
+ %
+ % Step 11: Double stroke, if necessary
+ %
+ \iftikz@mode@draw%
+ \iftikz@mode@double%
+ \pgfsys@endscope%
+ \endgroup%
+ \fi%
+ \fi%
+ \tikz@mode@drawfalse% no more stroking
+ %
+ % Step 12: Postactions
+ %
+ \tikz@postactions%
+ %
+ % Step 13: Add labels and nodes
+ %
+ \box\tikz@figbox%
+ %
+ % Step 14: Close animations
+ %
+ \iftikz@mode@clip\else\endgroup\endpgfidscope\fi%
+ %
+ % Step 14: Close option brace
+ %
+ \ifx\tikz@options\pgfutil@empty%
+ \else%
+ \endgroup%
+ \global\let\pgf@strokecolor@global=\pgfscope@stroke@color%
+ \global\let\pgf@fillcolor@global=\pgfscope@fill@color%
+ \pgfsys@endscope%
+ \iftikz@mode@clip%
+ \tikzerror{Extra options not allowed for clipping path command.}%
+ \fi%
+ \fi%
+ \iftikz@mode@clip%
+ \aftergroup\pgf@relevantforpicturesizefalse%
+ \fi%
+ \iftikz@mode@boundary%
+ \aftergroup\pgf@relevantforpicturesizefalse%
+ \fi%
+ \endgroup%
+ \global\pgflinewidth=\tikzscope@linewidth%
+ \tikz@path@do@at@end%
+}%
+\let\tikz@lib@scope@check\pgfutil@empty% this is a hook for the scopes library
+\def\tikz@path@do@at@end{\tikz@lib@scope@check}%
+\def\tikz@@pathtext{@path}%
+
+\def\pgf@outer@auto@adjust@hook{%
+ {%
+ \tikz@mode@drawfalse%
+ \tikz@mode%
+ \expandafter%
+ }%
+ \iftikz@mode@draw\else%
+ \pgfkeyslet{/pgf/outer xsep}\pgf@zero@text
+ \pgfkeyslet{/pgf/outer ysep}\pgf@zero@text
+ \fi%
+}%
+
+% Extra actions
+
+\def\tikz@extra@preaction#1{%
+ {%
+ \pgfsys@beginscope%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \path[#1];% do extra path
+ \pgfsyssoftpath@setcurrentpath\tikz@actions@path% restore
+ \tikz@restorepathsize%
+ \pgfsys@endscope%
+ }%
+}%
+
+\def\tikz@extra@postaction#1{%
+ {%
+ \pgfsys@beginscope%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \tikz@restorepathsize%
+ \path[#1]\pgfextra{\pgfsyssoftpath@setcurrentpath\tikz@actions@path};% do extra path
+ \pgf@resetpathsizes%
+ \pgfsys@endscope%
+ }%
+}%
+
+
+
+\def\tikz@skip#1{\tikz@scan@next@command#1}%
+\def\tikz@expand{%
+ \advance\tikz@expandcount by -1%
+ \ifnum\tikz@expandcount<0\relax%
+ \tikzerror{Giving up on this path. Did you forget a semicolon?}%
+ \let\pgfutil@next=\tikz@finish%
+ \else%
+ \let\pgfutil@next=\tikz@@expand
+ \fi%
+ \pgfutil@next}%
+
+\def\tikz@@expand{%
+ \expandafter\tikz@scan@next@command\pgf@let@token}%
+
+
+
+% Syntax for scopes:
+% {scoped path commands}
+
+\newif\iftikz@auto@end@path
+
+\def\tikz@beginscope{\begingroup\tikz@auto@end@pathfalse\tikz@scan@next@command}%
+\def\tikz@endscope{%
+ \iftikz@auto@end@path\expandafter\tikz@finish\expandafter\egroup\else\expandafter\tikz@@endscope\fi%
+}%
+\def\tikz@@endscope{%
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \global\let\tikz@tangent@temp\tikz@tangent%
+ \edef\tikz@marshal{%
+ \tikz@lastx=\the\tikz@lastx%
+ \tikz@lasty=\the\tikz@lasty%
+ \iftikz@current@point@local%
+ \else%
+ \tikz@lastxsaved=\the\tikz@lastxsaved%
+ \tikz@lastysaved=\the\tikz@lastysaved%
+ \ifx\tikz@moveto@waiting\relax%
+ \let\tikz@moveto@waiting\relax%
+ \else%
+ \def\noexpand\tikz@moveto@waiting{\tikz@moveto@waiting}%
+ \fi%
+ \iftikz@shapeborder%
+ \noexpand\tikz@shapebordertrue%
+ \def\noexpand\tikz@shapeborder@name{\tikz@shapeborder@name}%
+ \else%
+ \noexpand\tikz@shapeborderfalse%
+ \fi%
+ \fi%
+ }%
+ \expandafter%
+ \endgroup\tikz@marshal%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \let\tikz@tangent\tikz@tangent@temp%
+ \tikz@scan@next@command}%
+
+
+% Syntax for pgfextra:
+% \pgfextra {normal tex text}
+% \pgfextra normal tex text \endpgfextra
+
+\def\tikz@extra{\pgfutil@ifnextchar\bgroup\tikz@@extra\relax}%
+\long\def\tikz@@extra#1{#1\tikz@scan@next@command}%
+\let\endpgfextra=\tikz@scan@next@command
+
+\def\pgfextra{pgfextra}%
+
+
+% Syntax for foreach:
+%
+% foreach \var in {list} {path text}
+%
+% or
+%
+% \foreach \var in {list} {path text}
+%
+% Example:
+%
+% \draw (0,0) \foreach \x in {1,2,3} {-- (\x,0) circle (1cm)} -- (5,5);
+
+\def\tikz@fchar oreach{\tikz@foreach}%
+
+\def\tikz@foreach{%
+ \def\pgffor@beginhook{%
+ \tikz@lastx=\tikz@foreach@save@lastx%
+ \tikz@lasty=\tikz@foreach@save@lasty%
+ \tikz@lastxsaved=\tikz@foreach@save@lastxsaved%
+ \tikz@lastysaved=\tikz@foreach@save@lastysaved%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \expandafter\tikz@scan@next@command\pgfutil@firstofone}%
+ \def\pgffor@endhook{\pgfextra{%
+ \xdef\tikz@foreach@save@lastx{\the\tikz@lastx}%
+ \xdef\tikz@foreach@save@lasty{\the\tikz@lasty}%
+ \xdef\tikz@foreach@save@lastxsaved{\the\tikz@lastxsaved}%
+ \xdef\tikz@foreach@save@lastysaved{\the\tikz@lastysaved}%
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \pgfutil@gobble}}%
+ \def\pgffor@afterhook{%
+ \tikz@lastx=\tikz@foreach@save@lastx%
+ \tikz@lasty=\tikz@foreach@save@lasty%
+ \tikz@lastxsaved=\tikz@foreach@save@lastxsaved%
+ \tikz@lastysaved=\tikz@foreach@save@lastysaved%
+ \let\pgffor@beginhook\relax%
+ \let\pgffor@endhook\relax%
+ \let\pgffor@afterhook\relax%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \tikz@scan@next@command}%
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \xdef\tikz@foreach@save@lastx{\the\tikz@lastx}%
+ \xdef\tikz@foreach@save@lasty{\the\tikz@lasty}%
+ \xdef\tikz@foreach@save@lastxsaved{\the\tikz@lastxsaved}%
+ \xdef\tikz@foreach@save@lastysaved{\the\tikz@lastysaved}%
+ \foreach}%
+
+
+% Syntax for againpath:
+% \againpath \somepathname
+
+\def\tikz@command@againpath#1{%
+ \pgfextra{%
+ \pgfsyssoftpath@getcurrentpath\tikz@temp%
+ \expandafter\pgfutil@g@addto@macro\expandafter\tikz@temp\expandafter{#1}%
+ \pgfsyssoftpath@setcurrentpath\tikz@temp%
+ }%
+}%
+
+
+% animation syntax
+% :attribute = {...}
+
+\def\tikz@colon@char#1=#2{%
+ \tikz@scan@next@command{[animate={myself:{#1}={#2}}]}%
+}%
+
+
+
+%
+% When this if is set, a just-scanned point is a shape and its border
+% position still needs to be determined, depending on subsequent
+% commands.
+%
+
+\newif\iftikz@shapeborder
+
+
+% Syntax for moveto:
+% <point>
+\def\tikz@movetoabs{\tikz@moveto(}%
+\def\tikz@movetorel{\tikz@moveto+}%
+\def\tikz@moveto{%
+ \tikz@scan@one@point{\tikz@@moveto}}%
+\def\tikz@@moveto#1{%
+ \tikz@make@last@position{#1}%
+ \iftikz@shapeborder%
+ % ok, the moveto will have to wait. flag that we have a moveto in
+ % waiting:
+ \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
+ \else%
+ \tikz@@movetosave{\tikz@last@position}%
+ \let\tikz@moveto@waiting=\relax%
+ \fi%
+ \tikz@scan@next@command%
+}%
+
+ % Wrapper around \pgfpathmoveto that adds a save
+\def\tikz@@movetosave#1{%
+ {\pgftransformreset
+ \pgf@process{#1}%
+ \xdef\tikz@marshal{%
+ \tikz@lastmovetox=\the\pgf@x\relax%
+ \tikz@lastmovetoy=\the\pgf@y\relax%
+ }%
+ }%
+ \tikz@marshal
+ \pgfpathmoveto{#1}%
+}%
+
+
+\let\tikz@moveto@waiting=\relax % normally, nothing is waiting...
+
+\def\tikz@flush@moveto{%
+ \ifx\tikz@moveto@waiting\relax%
+ \else%
+ \tikz@@movetosave{\tikz@last@position}%
+ \fi%
+ \let\tikz@moveto@waiting=\relax%
+}%
+
+
+\def\tikz@flush@moveto@toward#1#2#3{%
+ % #1 = a point towards which the last moveto should be corrected
+ % #2 = a dimension to which the corrected x-coordinate should be stored
+ % #3 = a dimension for the corrected y-coordinate
+ \ifx\tikz@moveto@waiting\relax%
+ % do nothing
+ \else%
+ \pgf@process{\pgfpointshapeborder{\tikz@moveto@waiting}{#1}}%
+ #2=\pgf@x%
+ #3=\pgf@y%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \tikz@@movetosave{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \fi%
+ \let\tikz@moveto@waiting=\relax%
+}%
+
+
+%
+% Collecting labels on the path
+%
+
+\def\tikz@collect@coordinate@onpath#1c{%
+ \pgfutil@ifnextchar y{\tikz@cycle@expander@add#1}{\tikz@collect@coordinate@onpath@{#1}}}%
+\def\tikz@collect@coordinate@onpath@#1oordinate{%
+ \pgfutil@ifnextchar[{\tikz@@collect@coordinate@opt#1}{\tikz@@collect@coordinate@opt#1[]}}%}%
+\def\tikz@@collect@coordinate@opt#1[#2]{%
+ \pgfutil@ifnextchar({\tikz@@collect@coordinate#1[#2]}{%
+ \tikz@collect@label@onpath#1node[shape=coordinate,#2]{}}}%}%
+\def\tikz@@collect@coordinate#1[#2](#3){%
+ \tikz@collect@label@onpath#1node[shape=coordinate,#2](#3){}}%
+
+\newif\iftikz@collect@pic
+
+\def\tikz@collect@label@onpath#1node{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath node}%
+ \let\tikz@collect@cont#1%
+ \tikz@collect@picfalse%
+ \tikz@collect@label@scan}%
+
+\def\tikz@collect@pic@onpath#1pic{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath pic}%
+ \let\tikz@collect@cont#1
+ \tikz@collect@pictrue%
+ \tikz@collect@label@scan}%
+
+\def\tikz@collect@label@scan{%
+ \pgfutil@ifnextchar f{\tikz@collect@nodes}{%
+ \pgfutil@ifnextchar({\tikz@collect@paran}%
+ {\pgfutil@ifnextchar[{\tikz@collect@options}%
+ {\pgfutil@ifnextchar:{\tikz@collect@animation}%
+ {\pgfutil@ifnextchar\bgroup{\tikz@collect@arg}%
+ {\tikz@collect@cont}}}}}%
+}%}}%
+
+\def\tikz@collect@nodes foreach#1in{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath foreach#1in}%
+ \pgfutil@ifnextchar\bgroup\tikz@collect@nodes@group\tikz@collect@nodes@one%
+}%
+\def\tikz@collect@nodes@one#1{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath #1}%
+ \tikz@collect@label@scan%
+}%
+\def\tikz@collect@nodes@group#1{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#1}}%
+ \tikz@collect@label@scan%
+}%
+
+\def\tikz@collect@animation#1=#2{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath#1={#2}}%
+ \tikz@collect@label@scan%
+}%
+\def\tikz@collect@paran#1){%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath#1)}%
+ \tikz@collect@label@scan%
+}%
+\def\tikz@collect@options#1]{%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath#1]}%
+ \tikz@collect@label@scan%
+}%
+\def\tikz@collect@arg#1{%
+ \iftikz@handle@active@nodes%
+ \iftikz@collect@pic%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#1}}%
+ \else%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{\scantokens{#1}}}%
+ \fi%
+ \else%
+ \expandafter\def\expandafter\tikz@collected@onpath\expandafter{\tikz@collected@onpath{#1}}%
+ \fi%
+ \tikz@collect@cont%
+}%
+
+\def\tikz@invoke@collected@onpath{%
+ \tikz@node@is@a@labeltrue%
+ \let\tikz@temp=\tikz@collected@onpath%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \expandafter\tikz@scan@next@command\tikz@temp\pgf@stop%
+ \tikz@node@is@a@labelfalse%
+}%
+
+
+%
+% Macros for the cycle command
+%
+
+\def\tikz@cycle@expander#1{\pgfutil@ifnextchar c{\tikz@cycle@expander@{#1}}{#1}}%
+\def\tikz@cycle@expander@#1c{\pgfutil@ifnextchar y{\tikz@cycle@expander@add{#1}}{#1c}}%
+\def\tikz@cycle@expander@add#1ycle{#1(current subpath start)--cycle}%
+
+
+
+
+% Syntax for lineto:
+% -- <point>
+
+\def\tikz@lineto{%
+ \pgfutil@ifnextchar |%
+ {\expandafter\tikz@hv@lineto\pgfutil@gobble}%
+ {\expandafter\pgfutil@ifnextchar\tikz@activebar{\expandafter\tikz@hv@lineto\pgfutil@gobble}%
+ {\expandafter\tikz@lineto@mid\pgfutil@gobble}}}%
+\def\tikz@lineto@mid{%
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@lineto@mid}%
+ {%
+ \pgfutil@ifnextchar c{\tikz@close}{%
+ \pgfutil@ifnextchar p{\tikz@lineto@plot@or@pic}{\tikz@scan@one@point{\tikz@@lineto}}}}}%
+\def\tikz@lineto@plot@or@pic p{%
+ \pgfutil@ifnextchar i{\tikz@collect@pic@onpath\tikz@lineto@mid p}{%
+ \pgfsetlinetofirstplotpoint\tikz@plot}%
+}%
+\def\tikz@@lineto#1{%
+ % Record the starting point for later labels on the path:
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}
+ \iftikz@shapeborder%
+ % ok, target is a shape. recalculate end
+ \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\tikz@last@position}}%
+ \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \tikz@flush@moveto@toward{\tikz@last@position}\pgf@x\pgf@y%
+ \tikz@path@lineto{\tikz@last@position}%
+ \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \tikz@make@last@position{#1}%
+ \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
+ \else%
+ % target is a reasonable point...
+ % Record the starting point for later labels on the path:
+ \tikz@make@last@position{#1}%
+ \tikz@flush@moveto@toward{\tikz@last@position}\pgf@x\pgf@y%
+ \tikz@path@lineto{\tikz@last@position}%
+ \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \fi%
+ \let\tikz@timer=\tikz@timer@line%
+ \let\tikz@tangent\tikz@timer@start%
+ \tikz@scan@next@command%
+}%
+
+% snake or lineto?
+\def\tikz@path@lineto#1{%
+ \iftikz@snaked%
+ {
+ \pgfsyssoftpathmovetorelevantfalse%
+ \pgfpathsnakesto{\tikz@presnake,{\tikz@snake}{\tikz@mainsnakelength}{\noexpand\tikz@snake@install@trans}{},\tikz@postsnake}{#1}%
+ }
+ \else%
+ \pgfpathlineto{#1}%
+ \fi%
+}%
+
+% snake or lineto?
+\def\tikz@path@close#1{%
+ \iftikz@snaked%
+ {%
+ \pgftransformreset%
+ \pgfpathsnakesto{\tikz@presnake,{\tikz@snake}{\tikz@mainsnakelength}{\noexpand\tikz@snake@install@trans}{},\tikz@postsnake}{#1}%
+ }%
+ \fi%
+ \pgfpathclose%
+}%
+
+
+% Syntax for lineto horizontal/vertical:
+% -| <point>
+
+\def\tikz@hv@lineto{%
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@hv@lineto}{
+ \pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@hv@lineto}%
+ {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@hv@lineto}%
+ {\tikz@scan@one@point{\tikz@@hv@lineto}}}}}%
+\def\tikz@@hv@lineto#1{%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \pgf@yc=\tikz@lasty%
+ \tikz@make@last@position{#1}%
+ \edef\tikz@tangent{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\pgf@yc}}%
+ \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\pgf@yc}}\pgf@x\pgf@yc%
+ \iftikz@shapeborder%
+ % ok, target is a shape. have to work now:
+ {%
+ \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\tikz@lastx}{\pgf@yc}}}%
+ \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@yc}}%
+ \tikz@path@lineto{\tikz@last@position}%
+ \xdef\tikz@timer@end@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
+ }%
+ \let\tikz@timer@end=\tikz@timer@end@temp%
+ \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
+ \else%
+ \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@yc}}%
+ \tikz@path@lineto{\tikz@last@position}%
+ \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
+ \fi%
+ \let\tikz@timer=\tikz@timer@hvline%
+ \tikz@scan@next@command%
+}%
+
+% Syntax for lineto vertical/horizontal:
+% |- <point>
+
+\def\tikz@vh@lineto-{\tikz@vh@lineto@next}%
+\def\tikz@vh@lineto@next{%
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@vh@lineto@next}{%
+ \pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@vh@lineto@next}%
+ {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@vh@lineto@next}%
+ {\tikz@scan@one@point\tikz@@vh@lineto}}}}%
+\def\tikz@@vh@lineto#1{%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \pgf@xc=\tikz@lastx%
+ \tikz@make@last@position{#1}%
+ \edef\tikz@tangent{\noexpand\pgfqpoint{\the\pgf@xc}{\the\tikz@lasty}}%
+ \tikz@flush@moveto@toward{\pgfqpoint{\pgf@xc}{\tikz@lasty}}\pgf@xc\pgf@y%
+ \iftikz@shapeborder%
+ % ok, target is a shape. have to work now:
+ {%
+ \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@xc}{\tikz@lasty}}}%
+ \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \tikz@path@lineto{\pgfqpoint{\pgf@xc}{\tikz@lasty}}%
+ \tikz@path@lineto{\tikz@last@position}%
+ \xdef\tikz@timer@end@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% move out of group
+ }%
+ \let\tikz@timer@end=\tikz@timer@end@temp%
+ \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
+ \else%
+ \tikz@path@lineto{\pgfqpoint{\pgf@xc}{\tikz@lasty}}%
+ \tikz@path@lineto{\tikz@last@position}%
+ \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \fi%
+ \let\tikz@timer=\tikz@timer@vhline%
+ \tikz@scan@next@command%
+}%
+
+% Syntax for cycle:
+% -- cycle
+\def\tikz@close c{%
+ \pgfutil@ifnextchar o{\tikz@collect@coordinate@onpath\tikz@lineto@mid c}% oops, a coordinate
+ {\tikz@@close c}}%
+\def\tikz@@close cycle{%
+ \tikz@flush@moveto%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}
+ \tikz@make@last@position{\expandafter\pgfpoint\pgfsyssoftpath@lastmoveto}%
+ \tikz@path@close{\expandafter\pgfpoint\pgfsyssoftpath@lastmoveto}%
+ \def\pgfstrokehook{}%
+ \edef\tikz@timer@end{%\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \noexpand\pgfqpoint{\the\tikz@lastmovetox}{\the\tikz@lastmovetoy}}%
+ \let\tikz@timer=\tikz@timer@line%
+ \let\tikz@tangent\tikz@timer@start%
+ \tikz@scan@next@command%
+}%
+
+
+% Syntax for options:
+% [options]
+\def\tikz@parse@options#1]{%
+ \tikzset{#1}%
+ \tikz@scan@next@command%
+}%
+
+% Syntax for edges:
+% edge [options] (coordinate)
+% edge [options] node {node text} (coordinate)
+% edge :attribute={...} [options] node {node text} (coordinate)
+\def\tikz@edge@plain{%
+ \begingroup%
+ \ifx\tikz@to@use@whom\pgfutil@undefined\else\tikz@to@use@whom\fi
+ \let\tikz@to@or@edge@function=\tikz@do@edge%
+ \let\tikz@@to@local@options\pgfutil@empty%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \tikz@to@or@edge}%
+
+% Syntax for to paths:
+% to [options] (coordinate)
+% to [options] node {node text} (coordinate)
+% to :attribute={...} [options] node {node text} (coordinate)
+\def\tikz@to o{%
+ \tikz@to@use@last@coordinate%
+ \let\tikz@to@or@edge@function=\tikz@do@to%
+ \let\tikz@@to@local@options\pgfutil@empty%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \tikz@to@or@edge}%
+
+\def\tikz@to@or@edge{%
+ \pgfutil@ifnextchar[{\tikz@to@or@edge@option}{%
+ \pgfutil@ifnextchar:{\tikz@to@or@edge@animation}{%
+ \tikz@@to@collect}}%]
+}%
+\def\tikz@to@or@edge@option[#1]{%
+ \expandafter\def\expandafter\tikz@@to@local@options\expandafter{\tikz@@to@local@options,#1}%
+ \tikz@to@or@edge%
+}%
+\def\tikz@to@or@edge@animation:#1=#2{%
+ \expandafter\def\expandafter\tikz@@to@local@options\expandafter{\tikz@@to@local@options,%
+ animate={myself:{#1}={#2}}}%
+ \tikz@to@or@edge%
+}%
+\def\tikz@@to@collect{%
+ \pgfutil@ifnextchar(\tikz@@to@or@edge@coordinate%)
+ {\pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@to@collect}%
+ {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@@to@collect}%
+ {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@to@collect}%
+ {\pgfutil@ifnextchar +{\tikz@scan@one@point\tikz@@to@or@edge@math}%
+ {\tikzerror{(, +, coordinate, pic, or node expected}%)
+ \tikz@@to@or@edge@coordinate()}}}}}%
+}%
+
+\def\tikz@@to@or@edge@coordinate({%
+ \pgfutil@ifnextchar${%$
+ % Ok, parse directly
+ \tikz@scan@one@point\tikz@@to@or@edge@math(%
+ }{%
+ \pgfutil@ifnextchar[{%]
+ \tikz@scan@one@point\tikz@@to@or@edge@math(%
+ }{%
+ \tikz@@to@or@edge@@coordinate(%
+ }%
+ }%
+}%
+\def\tikz@@to@or@edge@math#1{%
+ \pgf@process{#1}%
+ \edef\tikztotarget{\the\pgf@x,\the\pgf@y}%
+ \tikz@to@or@edge@function%
+}%
+
+\def\tikz@@to@or@edge@@coordinate(#1){%
+ \def\tikztotarget{#1}%
+ \tikz@to@or@edge@function%
+}%
+
+\def\tikz@do@edge{%
+ \ifx\tikz@edge@macro\pgfutil@empty%
+ \setbox\tikz@whichbox=\hbox\bgroup%
+ \unhbox\tikz@whichbox%
+ \hbox\bgroup
+ \bgroup%
+ \pgfinterruptpath%
+ \pgfscope%
+ \let\tikz@transform=\pgfutil@empty%
+ \let\tikz@options=\pgfutil@empty%
+ \tikz@clear@rdf@options%
+ \let\tikz@tonodes=\tikz@collected@onpath%
+ \def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \tikz@options%
+ \tikz@do@rdf@pre@options%
+ \pgfidscope%
+ \tikz@do@rdf@post@options%
+ \tikz@transform%
+ \let\tikz@transform=\relax%
+ % Typeset node:
+ \let\tikz@after@path\pgfutil@empty%
+ \tikz@atbegin@to%
+ \tikz@enable@edge@quotes%
+ \path[style=every edge]\expandafter[\tikz@@to@local@options](\tikztostart)\tikz@to@path
+ \pgfextra{\global\let\tikz@after@path@smuggle=\tikz@after@path};%
+ \tikz@atend@to%
+ \endpgfidscope%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ \egroup
+ \egroup%
+ \egroup%
+ \global\setbox\tikz@tempbox=\box\tikz@whichbox%
+ \expandafter\endgroup%
+ \expandafter\setbox\tikz@whichbox=\box\tikz@tempbox%
+ \else%
+ \expandafter\expandafter\expandafter\tikz@edge@macro%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@@to@local@options\expandafter}\expandafter{\tikz@collected@onpath}%
+ \endgroup%
+ \let\tikz@after@path@smuggle=\pgfutil@empty%
+ \fi%
+ \expandafter\tikz@scan@next@command\tikz@after@path@smuggle%
+}%
+
+\def\tikz@do@to{%
+ \let\tikz@tonodes=\tikz@collected@onpath%
+ \def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \tikz@scan@next@command%
+ {%
+ \pgfextra{\let\tikz@after@path\pgfutil@empty}%
+ \pgfextra{\tikz@atbegin@to}%
+ \pgfextra{\tikz@enable@edge@quotes}%
+ [style=every to]\expandafter[\tikz@@to@local@options]\tikz@to@path%
+ \pgfextra{\tikz@atend@to}%
+ \pgf@stop%
+ \expandafter\tikz@scan@next@command\expandafter%
+ }\tikz@after@path%
+}%
+
+
+\def\tikz@to@use@last@coordinate{%
+ \iftikz@shapeborder%
+ \edef\tikztostart{\tikz@shapeborder@name}%
+ \else%
+ \edef\tikztostart{\the\tikz@lastx,\the\tikz@lasty}%
+ \fi%
+}%
+\def\tikz@to@use@last@fig@name{%
+ \edef\tikztostart{\tikz@to@last@fig@name}%
+}%
+
+
+
+% Syntax for graph path command:
+% graph [options] {...}
+% See the graph library for details
+
+\def\tikz@graph aph{\tikz@lib@graph@parser}%
+
+\def\tikz@lib@graph@parser{\pgfutil@ifnextchar[\tikz@graph@error{\tikz@graph@error[]}}%]%
+\def\tikz@graph@error[#1]#2{%
+ \tikzerror{You need to say \string\usetikzlibrary{graphs} in order to use the graph syntax}%
+ \tikz@lib@graph@parser@done%
+}%
+
+\def\tikz@lib@graph@parser@done{%
+ \tikz@scan@next@command%
+}%
+
+
+
+
+% Syntax for edge from parent:
+% edge from parent [options]
+\def\tikz@edgetoparent from parent{\pgfutil@ifnextchar[\tikz@@edgetoparent{\tikz@@edgetoparent[]}}%}%
+\def\tikz@@edgetoparent[#1]{%
+ \let\tikz@edge@to@parent@needed=\pgfutil@empty%
+ \def\tikz@edgetoparent@options{#1}%
+ \begingroup%
+ \let\tikz@collected@onpath=\pgfutil@empty%
+ \tikz@edgetoparentcollect%
+}%
+\def\tikz@edgetoparentcollect{
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@edgetoparentcollect}%
+ {%
+ \expandafter%
+ \endgroup%
+ \expandafter\tikz@edgetoparent@rollout\expandafter{\tikz@collected@onpath}%
+ }
+}%
+
+\def\tikz@edgetoparent@rollout#1{%
+ \pgfkeysgetvalue{/tikz/edge from parent macro}\tikz@etop@temp
+ \expandafter\tikz@scan@next@command\expandafter\tikz@etop@temp\expandafter{\tikz@edgetoparent@options}{#1}%
+}%
+
+
+% Syntax for bezier curves
+% .. controls(point) and (point) .. (target)
+% .. controls(point) .. (target)
+% .. (target) % currently not supported
+
+\def\tikz@dot.{\tikz@@dot}%
+\def\tikz@@dot{%
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@dot}{%
+ \pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@@dot}%
+ {\pgfutil@ifnextchar c{\tikz@curveto@double}{\tikz@curveto@auto}}}%
+}%
+
+\def\tikz@curveto@double co{%
+ \pgfutil@ifnextchar o{\tikz@collect@coordinate@onpath\tikz@@dot co}
+ {\tikz@cureveto@@double}}%
+\def\tikz@cureveto@@double ntrols#1{%
+ \tikz@scan@one@point\tikz@curveA#1%
+}%
+\def\tikz@curveA#1{%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ {%
+ \tikz@lastxsaved=\tikz@lastx%
+ \tikz@lastysaved=\tikz@lasty%
+ \tikz@make@last@position{#1}%
+ \xdef\tikz@curve@first{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ }%
+ \pgfutil@ifnextchar a
+ {\tikz@curveBand}%
+ {\let\tikz@curve@second\tikz@curve@first\tikz@curveCdots}%
+}%
+\def\tikz@curveBand and{%
+ \tikz@scan@one@point\tikz@curveB%
+}%
+\def\tikz@curveB#1{%
+ \def\tikz@curve@second{#1}%
+ \tikz@curveCdots}
+\def\tikz@curveCdots{%
+ \afterassignment\tikz@curveCdot\let\pgfutil@next=}%
+\def\tikz@curveCdot.{%
+ \ifx\pgfutil@next.%
+ \else%
+ \tikzerror{Dot expected}%
+ \fi%
+ \tikz@updatecurrenttrue%
+ \tikz@curveCcheck%
+}%
+\def\tikz@curveCcheck{%
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@curveCcheck}{%
+ \pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@curveCcheck}%
+ {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@curveCcheck}
+ {\tikz@scan@one@point\tikz@curveC}}}%
+}%
+\def\tikz@curveC#1{%
+ \tikz@make@last@position{#1}%
+ \edef\tikz@curve@third{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ {%
+ \tikz@lastxsaved=\tikz@lastx%
+ \tikz@lastysaved=\tikz@lasty%
+ \tikz@make@last@position{\tikz@curve@second}%
+ \xdef\tikz@curve@second{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ }%
+ %
+ % Start recalculating things in case start and end are shapes.
+ %
+ % First, the start:
+ \ifx\tikz@moveto@waiting\relax%
+ \else%
+ \pgf@process{\pgfpointshapeborder{\tikz@moveto@waiting}{\tikz@curve@first}}%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \tikz@@movetosave{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \fi%
+ \let\tikz@timer@cont@one=\tikz@curve@first%
+ \let\tikz@timer@cont@two=\tikz@curve@second%
+ % Second, the end:
+ \iftikz@shapeborder%
+ % ok, target is a shape. recalculate third
+ {%
+ \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\tikz@curve@second}}%
+ \tikz@make@last@position{\pgfqpoint{\pgf@x}{\pgf@y}}%
+ \edef\tikz@curve@third{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \pgfpathcurveto{\tikz@curve@first}{\tikz@curve@second}{\tikz@curve@third}%
+ \global\let\tikz@timer@end@temp=\tikz@curve@third% move out of group
+ }%
+ \let\tikz@timer@end=\tikz@timer@end@temp%
+ \edef\tikz@moveto@waiting{\tikz@shapeborder@name}%
+ \else%
+ \pgfpathcurveto{\tikz@curve@first}{\tikz@curve@second}{\tikz@curve@third}%
+ \let\tikz@timer@end=\tikz@curve@third
+ \let\tikz@moveto@waiting=\relax%
+ \fi%
+ \let\tikz@timer=\tikz@timer@curve%
+ \let\tikz@tangent=\tikz@curve@second%
+ \tikz@scan@next@command%
+}%
+
+
+% Syntax for rectangles:
+% rectangle <corner point>
+\def\tikz@rect ectangle{%
+ \tikz@flush@moveto%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \tikz@@rect}%
+\def\tikz@@rect{%
+ \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikz@@rect}{%
+ \pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikz@@rect}%
+ {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikz@@rect}%
+ {
+ \pgf@xa=\tikz@lastx\relax%
+ \pgf@ya=\tikz@lasty\relax%
+ \tikz@scan@one@point\tikz@rectB}}}}%
+\def\tikz@rectB#1{%
+ \tikz@make@last@position{#1}%
+ \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \let\tikz@timer=\tikz@timer@line%
+ \tikz@@movetosave{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \tikz@path@lineto{\pgfqpoint{\pgf@xa}{\tikz@lasty}}%
+ \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
+ \tikz@path@lineto{\pgfqpoint{\tikz@lastx}{\pgf@ya}}%
+ \iftikz@snaked%
+ \tikz@path@lineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
+ \fi%
+ \pgfpathclose%
+ \tikz@@movetosave{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
+ \def\pgfstrokehook{}%
+ \let\tikz@tangent\relax%
+ \tikz@scan@next@command%
+}%
+
+
+
+% Syntax for grids:
+% grid <corner point>
+\def\tikz@grid id{%
+ \tikz@flush@moveto%
+ \pgf@xa=\tikz@lastx\relax%
+ \pgf@ya=\tikz@lasty\relax%
+ \pgfutil@ifnextchar[{\tikz@gridA}{\tikz@gridA[]}}%}%
+\def\tikz@gridA[#1]{%
+ \def\tikz@grid@options{#1}%
+ \tikz@cycle@expander{\tikz@scan@one@point\tikz@gridB}}%
+\def\tikz@gridB#1{%
+ \tikz@make@last@position{#1}%
+ \let\tikz@tangent\relax%
+ {%
+ \let\tikz@after@path\pgfutil@empty%
+ \expandafter\tikzset\expandafter{\tikz@grid@options}
+ \tikz@checkunit{\tikz@grid@x}%
+ \iftikz@isdimension%
+ \pgf@process{\pgfpoint{\tikz@grid@x}{0pt}}%
+ \else%
+ \pgf@process{\pgfpointxy{\tikz@grid@x}{0}}%
+ \fi%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \tikz@checkunit{\tikz@grid@y}%
+ \iftikz@isdimension%
+ \pgf@process{\pgfpoint{0pt}{\tikz@grid@y}}%
+ \else%
+ \pgf@process{\pgfpointxy{0}{\tikz@grid@y}}%
+ \fi%
+ \advance\pgf@xb by\pgf@x%
+ \advance\pgf@yb by\pgf@y%
+ \pgfpathgrid[stepx=\pgf@xb,stepy=\pgf@yb]%
+ {\pgfqpoint{\pgf@xa}{\pgf@ya}}{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
+ \expandafter}%
+ \expandafter\tikz@scan@next@command\tikz@after@path%
+}%
+
+
+
+% Syntax for plot:
+% plot [local options] ... % starts with a moveto
+% -- plot [local options] ... % starts with a lineto
+\def\tikz@plot lot{%
+ \tikz@flush@moveto%
+ \pgfutil@ifnextchar[{\tikz@@plot}{\tikz@@plot[]}}%}%
+\def\tikz@@plot[#1]{%
+ \let\tikz@tangent\tikz@tangent@lookup%
+ \begingroup%
+ \let\tikz@after@path\pgfutil@empty%
+ \let\tikz@options=\pgfutil@empty%
+ \tikzset{every plot/.try}%
+ \tikzset{#1}%
+ \pgfutil@ifnextchar f{\tikz@plot@f}%
+ {\pgfutil@ifnextchar c{\tikz@plot@scan@points}%
+ {\pgfutil@ifnextchar ({\tikz@plot@expression}{%
+ \tikzerror{Cannot parse this plotting data}%
+ \endgroup}}}}%
+\def\tikz@plot@f f{\pgfutil@ifnextchar i{\tikz@plot@file}{\tikz@plot@function}}%
+
+\def\tikz@plot@file ile#1{\def\tikz@plot@data{\pgfplotxyfile{#1}}\tikz@@@plot}%
+\def\tikz@plot@scan@points coordinates#1{%
+ \pgfplothandlerrecord\tikz@plot@data%
+ \pgfplotstreamstart%
+ \pgfutil@ifnextchar\pgf@stop{\pgfplotstreamend\expandafter\tikz@@@plot\pgfutil@gobble}
+ {\tikz@scan@one@point\tikz@plot@next@point}%
+ #1\pgf@stop%
+}%
+\def\tikz@plot@next@point#1{%
+ \pgfplotstreampoint{#1}%
+ \pgfutil@ifnextchar\pgf@stop{\pgfplotstreamend\expandafter\tikz@@@plot\pgfutil@gobble}%
+ {\tikz@scan@one@point\tikz@plot@next@point}%
+}%
+\def\tikz@plot@function unction#1{%
+ \def\tikz@plot@filename{\tikz@plot@prefix\tikz@plot@id}%
+ \iftikz@plot@raw@gnuplot%
+ \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{#1}}%
+ \else%
+ \iftikz@plot@parametric%
+ \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{%
+ set samples \tikz@plot@samples;
+ set parametric;
+ plot [t=\tikz@plot@domain]
+ [\tikz@plot@xrange]
+ [\tikz@plot@range]
+ #1}}%
+ \else%
+ \def\tikz@plot@data{\pgfplotgnuplot[\tikz@plot@filename]{%
+ set samples \tikz@plot@samples;
+ plot [x=\tikz@plot@domain]
+ \ifx\tikz@plot@range\pgfutil@empty\else[\tikz@plot@range]\fi
+ #1}}%
+ \fi%
+ \fi%
+ \tikz@@@plot%
+}%
+
+\def\tikz@plot@no@resample{%
+ \pgfutil@IfFileExists{\tikz@plot@filename.table}%
+ {\def\tikz@plot@data{\pgfplotxyfile{\tikz@plot@filename.table}}}%
+ {}%
+}%
+
+\def\tikz@plot@expression(#1){%
+ \edef\tikz@plot@data{\noexpand\pgfplotfunction{\expandafter\noexpand\tikz@plot@var}{\tikz@plot@samplesat}}%
+ \expandafter\def\expandafter\tikz@plot@data\expandafter{\tikz@plot@data{\tikz@scan@one@point\pgfutil@firstofone(#1)}}%
+ \tikz@@@plot%
+}%
+
+\def\tikz@@@plot{%
+ \def\pgfplotlastpoint{\pgfpointorigin}%
+ \tikz@plot@handler%
+ \tikz@plot@data%
+ \global\let\tikz@@@temp=\pgfplotlastpoint%
+ \ifx\tikz@plot@mark\pgfutil@empty%
+ \else%
+ % Marks are drawn after the path.
+ \setbox\tikz@whichbox=\hbox{%
+ \unhbox\tikz@whichbox%
+ \hbox{{%
+ \pgfinterruptpath%
+ \pgfscope%
+ \let\tikz@options=\pgfutil@empty%
+ \let\tikz@transform=\pgfutil@empty%
+ \tikzset{every mark}%
+ \tikz@options%
+ \ifx\tikz@mark@list\pgfutil@empty%
+ \pgfplothandlermark{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}%
+ \else
+ \pgfplothandlermarklisted{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}{\tikz@mark@list}%
+ \fi
+ \tikz@plot@data%
+ \endpgfscope
+ \endpgfinterruptpath%
+ }}%
+ }%
+ \fi%
+ \global\setbox\tikz@tempbox=\box\tikz@whichbox%
+ \global\let\tikz@after@path@smuggle=\tikz@after@path
+ \expandafter\endgroup%
+ \expandafter\setbox\tikz@whichbox=\box\tikz@tempbox%
+ \tikz@make@last@position{\tikz@@@temp}%
+ \expandafter\tikz@scan@next@command\tikz@after@path@smuggle%
+}%
+
+
+\pgfdeclareplotmark{ball}
+{%
+ \def\tikz@shading{ball}%
+ \shade (0pt,0pt) circle (\pgfplotmarksize);%
+}%
+
+
+
+
+% Syntax for cosine curves:
+% cos <end of quarter-period>
+\def\tikz@cosine s{\tikz@cycle@expander{\tikz@scan@one@point\tikz@@cosine}}
+\def\tikz@@cosine#1{%
+ \let\tikz@tangent\tikz@tangent@lookup%
+ \tikz@flush@moveto%
+ \pgf@process{#1}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xc by-\tikz@lastx%
+ \advance\pgf@yc by-\tikz@lasty%
+ \advance\tikz@lastx by\pgf@xc%
+ \advance\tikz@lasty by\pgf@yc%
+ \tikz@lastxsaved=\tikz@lastx%
+ \tikz@lastysaved=\tikz@lasty%
+ \tikz@updatecurrenttrue%
+ \pgfpathcosine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \tikz@scan@next@command%
+}%
+
+% Syntax for sine curves:
+% sin <end of quarter-period>
+\def\tikz@sine in{\tikz@cycle@expander{\tikz@scan@one@point\tikz@@sine}}
+\def\tikz@@sine#1{%
+ \let\tikz@tangent\tikz@tangent@lookup%
+ \tikz@flush@moveto%
+ \pgf@process{#1}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xc by-\tikz@lastx%
+ \advance\pgf@yc by-\tikz@lasty%
+ \advance\tikz@lastx by\pgf@xc%
+ \advance\tikz@lasty by\pgf@yc%
+ \tikz@lastxsaved=\tikz@lastx%
+ \tikz@lastysaved=\tikz@lasty%
+ \tikz@updatecurrenttrue%
+ \pgfpathsine{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \tikz@scan@next@command%
+}%
+
+% Syntax for parabolas:
+% parabola[options] bend <coordinate> <coordinate>
+\def\tikz@parabola arabola{%
+ \let\tikz@tangent\tikz@tangent@lookup%
+ \pgfutil@ifnextchar[{\tikz@parabola@options}{\tikz@parabola@options[]}}%}%
+
+\def\tikz@parabola@options[#1]{%
+ \def\tikz@parabola@option{#1}%
+ \pgfutil@ifnextchar b{\tikz@parabola@scan@bend}{\tikz@cycle@expander{\tikz@scan@one@point\tikz@parabola@semifinal}}}%
+\def\tikz@parabola@scan@bend bend{\tikz@scan@one@point\tikz@parabola@scan@bendB}%
+\def\tikz@parabola@scan@bendB#1{%
+ \def\tikz@parabola@bend{#1}%
+ \tikz@cycle@expander{\tikz@scan@one@point\tikz@parabola@semifinal}%
+}%
+\def\tikz@parabola@semifinal#1{%
+ \tikz@flush@moveto%
+ % Save original start:
+ \pgf@xb=\tikz@lastx%
+ \pgf@yb=\tikz@lasty%
+ \tikz@make@last@position{#1}%
+ \pgf@xc=\tikz@lastx%
+ \pgf@yc=\tikz@lasty%
+ \begingroup% now calculate bend:
+ \let\tikz@after@path\pgfutil@empty%
+ \expandafter\tikzset\expandafter{\tikz@parabola@option}%
+ \tikz@lastxsaved=\tikz@parabola@bend@factor\tikz@lastx%
+ \tikz@lastysaved=\tikz@parabola@bend@factor\tikz@lasty%
+ \advance\tikz@lastxsaved by\pgf@xb%
+ \advance\tikz@lastysaved by\pgf@yb%
+ \advance\tikz@lastxsaved by-\tikz@parabola@bend@factor\pgf@xb%
+ \advance\tikz@lastysaved by-\tikz@parabola@bend@factor\pgf@yb%
+ \expandafter\tikz@make@last@position\expandafter{\tikz@parabola@bend}%
+ % Calculate delta from bend
+ \advance\pgf@xc by-\tikz@lastx%
+ \advance\pgf@yc by-\tikz@lasty%
+ % Ok, now calculate delta to bend
+ \advance\tikz@lastx by-\pgf@xb%
+ \advance\tikz@lasty by-\pgf@yb%
+ \xdef\tikz@parabola@b{{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}}%
+ \expandafter\endgroup%
+ \expandafter\expandafter\expandafter\pgfpathparabola\expandafter\tikz@parabola@b%
+ \expandafter\tikz@scan@next@command\tikz@after@path%
+}%
+
+
+% Syntax for circles:
+% circle [options] % where options should set, at least, radius
+% circle (radius) % deprecated
+%
+% Syntax for ellipses:
+% ellipse [options] % identical to circle.
+% ellipse (x-radius and y-radius) % deprecated
+%
+% radii can be dimensionless, then they are in the xy-system
+\def\tikz@circle ircle{\tikz@flush@moveto\tikz@@circle}%
+\def\tikz@ellipse llipse{\tikz@flush@moveto\tikz@@circle}%
+\def\tikz@@circle{%
+ \let\tikz@tangent\relax%
+ \pgfutil@ifnextchar(\tikz@@@circle
+ {\pgfutil@ifnextchar[\tikz@circle@opt{%])
+ \advance\tikz@expandcount by -10\relax% go down quickly
+ \ifnum\tikz@expandcount<0\relax%
+ \let\pgfutil@next=\tikz@@circle@normal%
+ \else%
+ \let\pgfutil@next=\tikz@@circle@scanexpand%
+ \fi%
+ \pgfutil@next%
+ }}%
+}%
+\def\tikz@@circle@scanexpand{\expandafter\tikz@@circle}%
+\def\tikz@@circle@normal{\tikz@circle@opt[]}%
+
+\def\tikz@circle@opt[#1]{%
+ {%
+ \def\tikz@node@at{\tikz@last@position}%
+ \let\tikz@transform=\pgfutil@empty%
+ \tikzset{every circle/.try,#1}%
+ \pgftransformshift{\tikz@node@at}%
+ \tikz@transform%
+ \tikz@do@circle{\pgfkeysvalueof{/tikz/x radius}}{\pgfkeysvalueof{/tikz/y radius}}
+ }%
+ \tikz@scan@next@command%
+}%
+
+\def\tikz@@@circle(#1){%
+ {%
+ \pgftransformshift{\tikz@last@position}%
+ \pgfutil@in@{ and }{#1}%
+ \ifpgfutil@in@%
+ \tikz@@ellipseB(#1)%
+ \else%
+ \tikz@do@circle{#1}{#1}%
+ \fi%
+ }%
+ \tikz@scan@next@command%
+}%
+\def\tikz@@ellipseB(#1 and #2){%
+ \tikz@do@circle{#1}{#2}
+}%
+\def\tikz@do@circle#1#2{
+ \pgfmathparse{#1}%
+ \let\tikz@ellipse@x=\pgfmathresult%
+ \ifpgfmathunitsdeclared%
+ \pgfmathparse{#2}%
+ \let\tikz@ellipse@y=\pgfmathresult%
+ \ifpgfmathunitsdeclared%
+ \pgfpathellipse{\pgfpointorigin}{%
+ \pgfqpoint{\tikz@ellipse@x pt}{0pt}}{\pgfpoint{0pt}{\tikz@ellipse@y pt}}%
+ \else%
+ \tikzerror{You cannot mix dimensions and dimensionless values in an ellipse}%
+ \fi%
+ \else%
+ \pgfmathparse{#2}%
+ \let\tikz@ellipse@y=\pgfmathresult%
+ \ifpgfmathunitsdeclared%
+ \tikzerror{You cannot mix dimensions and dimensionless values in an ellipse}%
+ \else%
+ \pgfpathellipse{\pgfpointorigin}{%
+ \pgfpointxy{\tikz@ellipse@x}{0}}{\pgfpointxy{0}{\tikz@ellipse@y}}%
+ \fi%
+ \fi%
+}%
+
+% Syntax for arcs:
+% arc [options]
+%
+% (The syntax with parentheses is deprecated.)
+\def\tikz@arcA rc{\tikz@flush@moveto\tikz@arc@cont}%
+\def\tikz@arc@cont{%
+ \pgfutil@ifnextchar(%)
+ {\tikz@@arcto}{%
+ \pgfutil@ifnextchar[%]
+ {\tikz@arc@opt}%
+ {%
+ \advance\tikz@expandcount by -10\relax% go down quickly
+ \ifnum\tikz@expandcount<0\relax%
+ \let\pgfutil@next=\tikz@@arc@normal%
+ \else%
+ \let\pgfutil@next=\tikz@@arc@scanexpand%
+ \fi%
+ \pgfutil@next%
+ }%
+ }%
+}%
+\def\tikz@@arc@scanexpand{\expandafter\tikz@arc@cont}%
+\def\tikz@@arc@normal{\tikz@arc@opt[]}%
+
+
+\def\tikz@arc@opt[#1]{%
+ {%
+ \tikzset{every arc/.try,#1}%
+ \pgfkeysgetvalue{/tikz/start angle}\tikz@s
+ \pgfkeysgetvalue{/tikz/end angle}\tikz@e
+ \pgfkeysgetvalue{/tikz/delta angle}\tikz@d
+ \ifx\tikz@s\pgfutil@empty%
+ \pgfmathsetmacro\tikz@s{\tikz@e-\tikz@d}
+ \else
+ \ifx\tikz@e\pgfutil@empty%
+ \pgfmathsetmacro\tikz@e{\tikz@s+\tikz@d}
+ \fi%
+ \fi%
+ \xdef\pgf@marshal{\noexpand%
+ \tikz@do@arc{\tikz@s}{\tikz@e}
+ {\pgfkeysvalueof{/tikz/x radius}}
+ {\pgfkeysvalueof{/tikz/y radius}}}%
+ }%
+ \pgf@marshal%
+ \tikz@arcfinal%
+}%
+
+\def\tikz@@arcto(#1){%
+ \edef\tikz@temp{(#1)}%
+ \expandafter\tikz@@@arcto@check@slashand\tikz@temp%
+}%
+
+\def\tikz@@@arcto@check@slashand(#1:#2:#3){%
+ \pgfutil@in@{ and }{#3}%
+ \ifpgfutil@in@%
+ \tikz@parse@arc@and(#1:#2:#3)%
+ \else%
+ \tikz@parse@arc@and(#1:#2:{#3} and {#3})%
+ \fi%
+ \tikz@arcfinal%
+}%
+
+\def\tikz@parse@arc@and(#1:#2:#3 and #4){%
+ \tikz@do@arc{#1}{#2}{#3}{#4}%
+}%
+\def\tikz@do@arc#1#2#3#4{%
+ \let\tikz@tangent\tikz@tangent@lookup%
+ \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \pgfmathsetmacro\tikz@timer@start@angle{#1}%
+ \pgfmathsetmacro\tikz@timer@end@angle{#2}%
+ \pgfmathparse{#3}%
+ \let\tikz@arc@x=\pgfmathresult%
+ \ifpgfmathunitsdeclared%
+ \pgfmathparse{#4}%
+ \let\tikz@arc@y=\pgfmathresult%
+ \ifpgfmathunitsdeclared%
+ \tikz@@@arcfinal{\pgfpatharc{\tikz@timer@start@angle}{\tikz@timer@end@angle}{\tikz@arc@x pt and \tikz@arc@y pt}}
+ {\pgfpointpolar{\tikz@timer@start@angle}{\tikz@arc@x pt and \tikz@arc@y pt}}
+ {\pgfpointpolar{\tikz@timer@end@angle}{\tikz@arc@x pt and \tikz@arc@y pt}}%
+ \edef\tikz@timer@zero@axis{\noexpand\pgfqpoint{\tikz@arc@x pt}{0pt}}
+ \edef\tikz@timer@ninety@axis{\noexpand\pgfqpoint{0pt}{\tikz@arc@y pt}}
+ \else%
+ \tikzerror{You cannot mix dimensions and dimensionless values in an arc}%
+ \fi%
+ \else%
+ \pgfmathparse{#4}%
+ \let\tikz@arc@y=\pgfmathresult%
+ \ifpgfmathunitsdeclared%
+ \tikzerror{You cannot mix dimensions and dimensionless values in an arc}%
+ \else%
+ \tikz@@@arcfinal{\pgfpatharcaxes{\tikz@timer@start@angle}{\tikz@timer@end@angle}{\pgfpointxy{\tikz@arc@x}{0}}{\pgfpointxy{0}{\tikz@arc@y}}}
+ {\pgfpointpolarxy{\tikz@timer@start@angle}{\tikz@arc@x and \tikz@arc@y}}{\pgfpointpolarxy{\tikz@timer@end@angle}{\tikz@arc@x and \tikz@arc@y}}%
+ \pgf@process{\pgfpointxy{\tikz@arc@x}{0}}
+ \edef\tikz@timer@zero@axis{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \pgf@process{\pgfpointxy{0}{\tikz@arc@y}}
+ \edef\tikz@timer@ninety@axis{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \fi%
+ \fi%
+}%
+
+\def\tikz@@@arcfinal#1#2#3{%
+ #1%
+ \pgf@process{#2}
+ \xdef\tikz@arc@save@first{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgf@process{#3}
+ \xdef\tikz@arc@save@second{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+}%
+
+\def\tikz@arcfinal{%
+ \pgf@process{\tikz@arc@save@first}%
+ \advance\tikz@lastx by-\pgf@x%
+ \advance\tikz@lasty by-\pgf@y%
+ \pgf@process{\tikz@arc@save@second}%
+ \advance\tikz@lastx by\pgf@x%
+ \advance\tikz@lasty by\pgf@y%
+ \tikz@lastxsaved=\tikz@lastx%
+ \tikz@lastysaved=\tikz@lasty%
+ \let\tikz@timer=\tikz@timer@arc%
+ \tikz@scan@next@command%
+}%
+
+
+% Syntax for coordinates:
+% coordinate[options] (coordinate name) at (point)
+% where ``at (point)'' is optional
+\def\tikz@coordinate ordinate{%
+ \pgfutil@ifnextchar[{\tikz@@coordinate@opt}{\tikz@@coordinate@opt[]}}%
+\def\tikz@@coordinate@opt[#1]{%
+ \pgfutil@ifnextchar({\tikz@@coordinate[#1]}
+ {\tikz@fig ode[shape=coordinate,#1]{}}}%}%
+\def\tikz@@coordinate[#1](#2){%
+ \pgfutil@ifnextchar a{\tikz@@coordinate@at[#1](#2)}
+ {\tikz@fig ode[shape=coordinate,#1](#2){}}}%
+\def\tikz@@coordinate@at[#1](#2)a{%
+ \pgfutil@ifnextchar t{\tikz@@coordinate@@at[#1](#2)a}%
+ {\tikz@fig ode[shape=coordinate,#1](#2){}a}%
+}%
+\def\tikz@@coordinate@@at[#1](#2)at#3({%
+ \def\tikz@coordinate@caller{\tikz@fig ode[shape=coordinate,#1](#2)at}%
+ \tikz@scan@one@point\tikz@@coordinate@at@math(%
+}%
+\def\tikz@@coordinate@at@math#1{%
+ \pgf@process{#1}%
+ \edef\tikz@temp{(\the\pgf@x,\the\pgf@y)}%
+ \expandafter\tikz@coordinate@caller\tikz@temp{}%
+}%
+
+
+
+% Syntax for nodes:
+% node foreach \var in {list} ... :attribute={...} [options] (node name) at (pos) {label text}
+%
+% all of :attribute, [options], (node name), at(pos), and foreach are
+% optional. There can be multiple options and the ordering is not
+% important as in node[draw] (a) [rotate=10] {text}, *except* that all
+% foreach statements must come first.
+%
+% A label text always ``ends'' the node.
+%
+\def\tikz@fig ode{%
+ \pgfutil@ifnextchar a\tikz@test@also{
+ \pgfutil@ifnextchar f{\tikz@nodes@start}\tikz@normal@fig}}%
+\def\tikz@test@also a{\pgfutil@ifnextchar l\tikz@node@also{\tikz@normal@fig a}}%
+\def\tikz@normal@fig{%
+ \edef\tikz@save@line@width{\the\pgflinewidth}%
+ \begingroup%
+ \let\tikz@fig@name=\pgfutil@empty%
+ \begingroup%
+ \tikz@is@matrixfalse%
+ \let\nodepart=\tikz@nodepart%
+ \let\tikz@atbegin@scope=\pgfutil@empty%
+ \let\tikz@atend@scope=\pgfutil@empty%
+ \let\tikz@do@after@node=\tikz@scan@next@command%
+ \let\tikz@options=\pgfutil@empty%
+ \tikz@clear@rdf@options%
+ \let\tikz@id@name=\pgfutil@empty%
+ \let\tikz@after@path=\pgfutil@empty%
+ \let\tikz@transform=\pgfutil@empty%
+ \let\tikz@mode=\pgfutil@empty%
+ \tikz@decoratepathfalse%
+ \let\tikz@preactions=\pgfutil@empty%
+ \let\tikz@postactions=\pgfutil@empty%
+ \let\tikz@alias=\pgfutil@empty%
+ \def\tikz@node@at{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
+ \let\tikz@time@for@matrix\tikz@time%
+ \let\tikz@node@content\relax%
+ \pgfgetpath\tikzpathuptonow%
+ \iftikz@node@is@a@label%
+ \else%
+ \let\tikz@time\pgfutil@empty%
+ \fi%
+ \tikz@node@reset@hook%
+ \tikzset{every node/.try}%
+ \tikz@@scan@fig}%
+\def\tikz@@scan@fig{%
+ \pgfutil@ifnextchar a{\tikz@fig@scan@at}
+ {\pgfutil@ifnextchar({\tikz@fig@scan@name}
+ {\pgfutil@ifnextchar[{\tikz@fig@scan@options}%
+ {\pgfutil@ifnextchar:{\tikz@fig@scan@animation}%
+ {\pgfutil@ifnextchar\bgroup{\tikz@fig@main}%
+ {\tikzerror{A node must have a (possibly empty) label text}%
+ \tikz@fig@main{}}}}}}}%}}%
+\def\tikz@fig@scan@at at{%
+ \tikz@scan@one@point\tikz@@fig@scan@at}%
+\def\tikz@@fig@scan@at#1{%
+ \def\tikz@node@at{#1}\tikz@@scan@fig}%
+\def\tikz@fig@scan@name(#1){%
+ \pgfkeysvalueof{/tikz/name/.@cmd}#1\pgfeov% CF : this is now ALWAYS consistent with 'name=' option; allows overrides.
+ \tikz@@scan@fig}%
+% make it \long to allow \par in "pin" options etc:
+\long\def\tikz@fig@scan@options[#1]{\iftikz@node@is@pic\tikz@enable@pic@quotes\else\tikz@enable@node@quotes\fi\tikzset{#1}\ifx\tikz@node@content\relax\expandafter\tikz@@scan@fig\else\tikz@expand@node@contents\fi}%
+\def\tikz@fig@scan@animation:#1=#2{\tikzset{animate={myself:{#1}={#2}}}\tikz@@scan@fig}%
+\def\tikz@expand@node@contents{%
+ \expandafter\tikz@@scan@fig\expandafter{\tikz@node@content}%
+}%
+\let\tikz@node@reset@hook=\pgfutil@empty%
+\let\tikz@node@begin@hook=\pgfutil@empty%
+\def\tikz@fig@main{%
+ \iftikz@node@is@pic%
+ \tikz@node@is@picfalse%
+ \expandafter\tikz@subpicture@handle%
+ \else%
+ \afterassignment\tikz@@fig@main\expandafter\let\expandafter\next\expandafter=%
+ \fi}%
+\def\tikz@@fig@main{%
+ \pgfutil@ifundefined{pgf@sh@s@\tikz@shape}%
+ {\tikzerror{Unknown shape ``\tikz@shape.'' Using ``rectangle'' instead}%
+ \def\tikz@shape{rectangle}}%
+ {}%
+ \expandafter\xdef\csname tikz@dcl@coord@\tikz@fig@name\endcsname{%
+ \csname tikz@scan@point@coordinate\endcsname}%
+ \tikzset{every \tikz@shape\space node/.try}%
+ \tikz@node@textfont%
+ \tikz@node@begin@hook%
+ \iftikz@is@matrix%
+ \let\tikz@next=\tikz@do@matrix%
+ \else%
+ \let\tikz@next=\tikz@do@fig%
+ \fi%
+ \tikz@next%
+}%
+\let\tikz@nodepart@list\pgfutil@empty
+\def\tikz@do@fig{%
+ % Ok, reset all node part boxes
+ \pgfutil@for\tikz@temp:=\tikz@nodepart@list\do{%
+ \expandafter\setbox\csname pgfnodepart\tikz@temp box\endcsname=\box\pgfutil@voidb@x%
+ }%
+ \setbox\pgfnodeparttextbox=\hbox%
+ \bgroup%
+ \pgfinterruptpicture%
+ \pgfsys@begin@text%
+ \pgfsys@text@to@black@hook%
+ \tikzset{every text node part/.try}%
+ \ifx\tikz@textopacity\pgfutil@empty%
+ \else%
+ \pgfsetfillopacity{\tikz@textopacity}%
+ \pgfsetstrokeopacity{\tikz@textopacity}%
+ \fi%
+ \ifx\tikz@text@width\pgfutil@empty%
+ \tikz@textfont%
+ \else%
+ \begingroup%
+ \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
+ \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
+ \tikz@textfont%
+ \tikz@text@action%
+ \fi%
+ \tikz@atbegin@node%
+ \bgroup%
+ \aftergroup\unskip%
+ % Some color stuff has been moved from here to outside; this is
+ % necessary for support of dvisvgm and of animation
+ % snapshots.
+ \ifx\tikz@textcolor\pgfutil@empty%
+ \else%
+ \pgfutil@colorlet{.}{\tikz@textcolor}%
+ \fi%
+ % FIXME : this here is the proposed solution for <https://sourceforge.net/p/pgf/bugs/362/>
+ % but it caused <https://sourceforge.net/p/pgf/bugs/503/>.
+ % \pgfutil@color{.}%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \tikz@uninstallcommands%
+ \iftikz@handle@active@code%
+ \tikz@orig@shorthands%
+ \let\tikz@orig@shorthands\pgfutil@empty%
+ \fi%
+ \ifnum\the\catcode`\;=\active\relax\expandafter\let\tikz@activesemicolon=\tikz@origsemi\fi%
+ \ifnum\the\catcode`\:=\active\relax\expandafter\let\tikz@activecolon=\tikz@origcolon\fi%
+ \ifnum\the\catcode`\|=\active\relax\expandafter\let\tikz@activebar=\tikz@origbar\fi%
+ \aftergroup\tikz@fig@collectresetcolor%
+ \tikz@halign@check%
+ \ignorespaces%
+}%
+\def\tikz@fig@collectresetcolor{%
+ % Hacks for special packages that mess with \aftergroup
+ \pgfutil@ifnextchar\reset@color% hack for color package
+ {\reset@color\afterassignment\tikz@fig@collectresetcolor\let\tikz@temp=}\tikz@fig@boxdone%
+}%
+\def\tikz@fig@boxdone{%
+ \tikz@atend@node%
+ \ifx\tikz@text@width\pgfutil@empty%
+ \else%
+ \pgfutil@endminipage%
+ \endgroup%
+ \fi%
+ \pgfsys@end@text%
+ \endpgfinterruptpicture%
+ \egroup%
+ \pgfutil@ifnextchar c{\tikz@fig@mustbenamed\tikz@fig@continue}%
+ {\pgfutil@ifnextchar[{\tikz@fig@mustbenamed\tikz@fig@continue}%
+ {\pgfutil@ifnextchar t{\tikz@fig@mustbenamed\tikz@fig@continue}
+ {\pgfutil@ifnextchar e{\tikz@fig@mustbenamed\tikz@fig@continue}
+ {\ifx\tikz@after@path\pgfutil@empty\expandafter\tikz@fig@continue\else\expandafter\tikz@fig@mustbenamed\expandafter\tikz@fig@continue\fi}}}}}%}%
+
+\def\tikz@do@matrix{%
+ \tikzset{every matrix/.try}%
+ \tikz@node@transformations%
+ \tikz@fig@mustbenamed%
+ \setbox\tikz@whichbox=\hbox\bgroup%
+ \unhbox\tikz@whichbox%
+ \hbox\bgroup\bgroup%
+ \pgfinterruptpath%
+ \pgfscope%
+ \ifx\tikz@time\pgfutil@empty\let\tikz@time\tikz@time@for@matrix\fi%
+ \tikz@options%
+ \tikz@do@rdf@pre@options%
+ \tikz@is@nodefalse%
+ \tikz@call@id@hook%
+ \pgfidscope%
+ \tikz@do@rdf@post@options%
+ \begingroup%
+ \let\tikz@id@name\pgfutil@empty%
+ \pgfclearid%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \let\tikzmatrixname=\tikz@fig@name%
+ \edef\tikz@m@anchor{\ifx\tikz@matrix@anchor\pgfutil@empty\tikz@anchor\else\tikz@matrix@anchor\fi}%
+ \expandafter\pgfutil@in@\expandafter{\expandafter.\expandafter}\expandafter{\tikz@m@anchor}%
+ \ifpgfutil@in@%
+ \expandafter\tikz@matrix@split\tikz@m@anchor\relax%
+ \else%
+ \def\tikz@matrix@shift{\pgfpointorigin}%
+ \fi%
+ \let\tikz@transform=\relax%
+ \pgfmatrix%
+ {\tikz@shape}%
+ {\tikz@m@anchor}%
+ {\tikz@fig@name}%
+ {%
+ \pgfutil@tempdima=\pgflinewidth%
+ {\begingroup\tikz@finish}%
+ \global\pgflinewidth=\pgfutil@tempdima%
+ }%
+ {\tikz@matrix@shift}%
+ {%
+ \tikz@matrix@make@active@ampersand%
+ \def\pgfmatrixbegincode{%
+ \pgfsys@beginscope%
+ \tikz@common@matrix@code%
+ \tikz@atbegin@cell%
+ }%
+ \def\tikz@common@matrix@code{%
+ \let\tikz@options=\pgfutil@empty%
+ \let\tikz@mode=\pgfutil@empty%
+ \tikzset{every cell/.try={\the\pgfmatrixcurrentrow}{\the\pgfmatrixcurrentcolumn}}%
+ \tikzset{column \the\pgfmatrixcurrentcolumn/.try}%
+ \ifodd\pgfmatrixcurrentcolumn%
+ \tikzset{every odd column/.try}%
+ \else%
+ \tikzset{every even column/.try}%
+ \fi%
+ \tikzset{row \the\pgfmatrixcurrentrow/.try}%
+ \ifodd\pgfmatrixcurrentrow%
+ \tikzset{every odd row/.try}%
+ \else%
+ \tikzset{every even row/.try}%
+ \fi%
+ \tikzset{row \the\pgfmatrixcurrentrow\space column \the\pgfmatrixcurrentcolumn/.try}%
+ \tikz@options%
+ }%
+ \def\pgfmatrixendcode{%
+ \tikz@atend@cell%
+ \pgfsys@endscope%
+ }%
+ \def\pgfmatrixemptycode{%
+ \pgfsys@beginscope%
+ \tikz@common@matrix@code%
+ \tikz@at@emptycell%
+ \pgfsys@endscope%
+ }%
+ \tikz@atbegin@matrix%
+ \aftergroup\tikz@do@matrix@cont}%
+ \bgroup%
+}%
+\def\tikz@do@matrix@cont{%
+ \tikz@atend@matrix%
+ \endgroup%
+ \endpgfidscope%
+ \endpgfscope
+ \endpgfinterruptpath%
+ \egroup\egroup%
+ \egroup%
+ %
+ \tikz@node@finish%
+}%
+{%
+ \catcode`\&=13
+ \gdef\tikz@matrix@make@active@ampersand{%
+ \ifx\tikz@ampersand@replacement\pgfutil@empty%
+ \catcode`\&=13%
+ \let&=\pgfmatrixnextcell%
+ \else%
+ \expandafter\let\tikz@ampersand@replacement=\pgfmatrixnextcell%
+ \fi%
+ }%
+}%
+
+
+\def\tikz@matrix@split#1.#2\relax{%
+ \def\tikz@m@anchor{text}%
+ \def\tikz@matrix@shift{\pgfpointanchor{#1}{#2}}%
+}%
+
+\def\tikz@fig@continue{%
+ \ifx\tikz@text@width\pgfutil@empty%
+ \else%
+ \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
+ \wd\pgfnodeparttextbox=\pgf@x%
+ \fi%
+ \ifx\tikz@text@height\pgfutil@empty%
+ \else%
+ \pgfmathsetlength{\pgf@x}{\tikz@text@height}%
+ \ht\pgfnodeparttextbox=\pgf@x%
+ \fi%
+ \ifx\tikz@text@depth\pgfutil@empty%
+ \else%
+ \pgfmathsetlength{\pgf@x}{\tikz@text@depth}%
+ \dp\pgfnodeparttextbox=\pgf@x%
+ \fi%
+ %
+ % Node transformation
+ %
+ \tikz@node@transformations%
+ \tikz@nlt%
+ %
+ \setbox\tikz@whichbox=\hbox{%
+ \unhbox\tikz@whichbox%
+ \hbox{{%
+ \pgfinterruptpath%
+ \pgfscope%
+ \tikz@options%
+ \tikz@do@rdf@pre@options%
+ \tikz@is@nodetrue%
+ \tikz@call@id@hook%
+ \pgfidscope%
+ \tikz@do@rdf@post@options%
+ \let\tikz@id@name\pgfutil@empty%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ % Add color modifications to text box
+ \setbox\pgfnodeparttextbox=\hbox{{%
+ \pgfsys@begin@text% Colors moved here...
+ \ifx\tikz@textcolor\pgfutil@empty%
+ \else%
+ \pgfutil@colorlet{.}{\tikz@textcolor}%
+ \fi%
+ \pgfsetcolor{.}%
+ \pgfusetype{.text}%
+ \pgfidscope%
+ \box\pgfnodeparttextbox%
+ \endpgfidscope%
+ \pgfsys@end@text%
+ }}%
+ \pgfmultipartnode{\tikz@shape}{\tikz@anchor}{\tikz@fig@name}{%
+ \pgfutil@tempdima=\pgflinewidth%
+ {\begingroup\tikz@finish}%
+ \global\pgflinewidth=\pgfutil@tempdima%
+ }%
+ \endpgfidscope%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ }}%
+ }%
+ %
+ \tikz@alias%
+ \tikz@node@finish%
+}%
+
+
+\def\tikz@fig@mustbenamed{%
+ \ifx\tikz@fig@name\pgfutil@empty%
+ % Assign a dummy name
+ \global\advance\tikz@fig@count by1\relax
+ \edef\tikz@fig@name{tikz@f@\the\tikz@fig@count}%
+ \let\tikz@id@name\tikz@fig@name%
+ \fi%
+}%
+
+\def\tikz@node@transformations{%
+ %
+ % Possibly, we are ``online''
+ %
+ \ifx\tikz@time\pgfutil@empty%
+ \pgftransformshift{\tikz@node@at}%
+ \iftikz@fullytransformed%
+ \else%
+ \pgftransformresetnontranslations%
+ \fi%
+ \else%
+ \tikz@do@auto@anchor%
+ \tikz@timer%
+ \fi%
+ % Invoke local transformations
+ \tikz@transform%
+}%
+
+\def\tikz@node@finish{%
+ \global\let\tikz@last@fig@name=\tikz@fig@name%
+ \global\let\tikz@after@path@smuggle=\tikz@after@path%
+ % shift box outside group
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \endgroup\endgroup%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \global\pgflinewidth=\tikz@save@line@width%
+ \tikz@do@after@path@smuggle%
+ \tikz@node@is@picfalse
+ \tikz@do@after@node%
+}%
+\let\tikz@fig@continue@orig=\tikz@fig@continue
+
+\def\tikz@do@after@node{\tikz@scan@next@command}%
+
+\def\tikz@do@after@path@smuggle{%
+ \let\tikz@to@last@fig@name=\tikz@last@fig@name%
+ \let\tikz@to@use@whom=\tikz@to@use@last@fig@name%
+ \let\tikzlastnode=\tikz@last@fig@name%
+ \ifx\tikz@after@path@smuggle\pgfutil@empty%
+ \else%
+ \ifpgflatenodepositioning%
+ \expandafter\expandafter\expandafter\tikz@call@late%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@last@fig@name\expandafter}\expandafter{\tikz@after@path@smuggle}%
+ \else%
+ \tikz@scan@next@command{\tikz@after@path@smuggle}\pgf@stop%
+ \fi%
+ \fi%
+}%
+
+\def\tikz@call@late#1#2{\pgfnodepostsetupcode{#1}{\path[late options={name={#1},append after command={#2}}];}}%
+
+\newif\iftikz@do@align
+
+% Alignment handling
+\def\tikz@halign@check{%
+ \tikz@do@alignfalse
+ \ifx\tikz@text@width\pgfutil@empty%
+ \pgfkeysgetvalue{/tikz/node halign header}\tikz@align@header%
+ \ifx\tikz@align@header\pgfutil@empty%
+ \else%
+ \tikz@do@aligntrue%
+ \fi%
+ \fi%
+ \iftikz@do@align%
+ % Bingo
+ \setbox\tikz@align@aligned@box=\box\pgfutil@voidb@x% void
+ \let\\=\tikz@align@newline%
+ \expandafter\tikz@start@align%
+ \fi%
+}%
+\def\tikz@align@newline{\pgfutil@protect\tikz@align@newline@}%
+\def\tikz@align@newline@{\unskip\pgfutil@ifnextchar[\tikz@@align@newline{\tikz@@align@newline[0pt]}}%}%
+\def\tikz@@align@newline[#1]{\egroup\tikz@align@continue\pgfmathparse{#1}\let\tikz@align@temp=\pgfmathresult\tikz@start@align}%
+% Two safe boxes for alignment:
+\let\tikz@align@aligned@box=\pgfnodeparttextbox
+\let\tikz@align@line@box=\tikz@figbox
+
+\def\tikz@start@align{%
+ % Start collecting text:
+ \setbox\tikz@align@line@box=\hbox\bgroup\bgroup%
+ \aftergroup\tikz@align@collectresetcolor\ignorespaces%
+}%
+\def\tikz@align@collectresetcolor{%
+ \pgfutil@ifnextchar\reset@color%
+ {\reset@color\afterassignment\tikz@align@collectresetcolor\let\tikz@temp=}%
+ {\tikz@align@end@check}%
+}%
+\def\tikz@align@end@check{%
+ \egroup%
+ \ifvoid\tikz@align@aligned@box%
+ \setbox\tikz@align@aligned@box=\box\tikz@align@line@box%
+ \else%
+ \setbox\tikz@align@aligned@box=\vbox{%
+ \expandafter\expandafter\expandafter\halign\expandafter\expandafter\expandafter{\tikz@align@header%
+ \box\tikz@align@aligned@box\cr%
+ \noalign{\vskip\tikz@align@temp pt}%
+ \unhbox\tikz@align@line@box\unskip\cr}}%
+ \fi%
+ \pgfutil@ifnextchar\tikz@align@continue{}
+ {%
+ % Main continue
+ \box\tikz@align@aligned@box%
+ \egroup%
+ }%
+}%
+\def\tikz@align@continue{\tikz@@align@continue}%
+\let\tikz@@align@continue=\pgfutil@empty
+
+
+\def\tikz@node@also lso{\pgfutil@ifnextchar[\tikz@node@also@opt{\tikz@node@also@opt[]}}%
+\def\tikz@node@also@opt[#1]{
+ \pgfutil@ifnextchar(%)
+ {\tikz@node@also@opt@cont[#1]}%
+ {\tikzerror{Syntax error in node also: ``('' expected.}%
+ \tikz@scan@next@command}%
+}%
+\def\tikz@node@also@opt@cont[#1](#2){\tikzset{late options={name=#2,#1}}\tikz@scan@next@command}%
+
+
+
+% Syntax for parts of nodes:
+% node ... {... \nodepart[options]{name} ... \nodepart{name} ...}
+
+\def\tikz@nodepart{\pgfutil@ifnextchar[\tikz@@nodepart{\tikz@@nodepart[]}}%}%
+\def\tikz@@nodepart[#1]#2{%
+ \tikz@atend@node%
+ \unskip%
+ \gdef\tikz@nodepart@options{#1}%
+ \gdef\tikz@nodepart@name{#2}%
+ \global\let\tikz@fig@continue=\tikz@nodepart@continue%
+ \pgfutil@ifnextchar x{\egroup\relax}{\egroup\relax}% gobble spaces
+}%
+\def\tikz@nodepart@continue{%
+ \global\let\tikz@fig@continue=\tikz@fig@continue@orig%
+ \ifx\tikz@nodepart@list\pgfutil@empty%
+ \let\tikz@nodepart@list\tikz@nodepart@name%
+ \else%
+ \edef\tikz@nodepart@list{\tikz@nodepart@list,\tikz@nodepart@name}%
+ \fi%
+ % Now start new box:
+ \expandafter\setbox\csname pgfnodepart\tikz@nodepart@name box\endcsname=\hbox%
+ \bgroup%
+ \pgfinterruptpicture%
+ \pgfsys@begin@text%
+ \pgfsys@text@to@black@hook%
+ \tikzset{every \tikz@nodepart@name\space node part/.try}%
+ \expandafter\tikzset\expandafter{\tikz@nodepart@options}%
+ \ifx\tikz@textopacity\pgfutil@empty%
+ \else%
+ \pgfsetfillopacity{\tikz@textopacity}%
+ \pgfsetstrokeopacity{\tikz@textopacity}%
+ \fi%
+ % Colors moved here...
+ \ifx\tikz@textcolor\pgfutil@empty%
+ \else%
+ \pgfutil@colorlet{.}{\tikz@textcolor}%
+ \fi%
+ \pgfsetcolor{.}%
+ \ifx\tikz@text@width\pgfutil@empty%
+ \tikz@textfont%
+ \else%
+ \begingroup%
+ \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
+ \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
+ \tikz@textfont%
+ \tikz@text@action%
+ \fi%
+ \bgroup%
+ \aftergroup\unskip%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \tikz@uninstallcommands%
+ \iftikz@handle@active@code%
+ \tikz@orig@shorthands%
+ \let\tikz@orig@shorthands\pgfutil@empty%
+ \fi%
+ \ifnum\the\catcode`\;=\active\relax\expandafter\let\tikz@activesemicolon=\tikz@origsemi\fi%
+ \ifnum\the\catcode`\:=\active\relax\expandafter\let\tikz@activecolon=\tikz@origcolon\fi%
+ \ifnum\the\catcode`\|=\active\relax\expandafter\let\tikz@activebar=\tikz@origbar\fi%
+ \tikz@atbegin@node%
+ \aftergroup\tikz@fig@collectresetcolor%
+ \tikz@halign@check%
+ \ignorespaces%
+}%
+
+
+%
+% Node foreach
+%
+
+\def\tikz@nodes@start{%
+ \let\tikz@nodes@list\pgfutil@empty%
+ \iftikz@node@is@pic%
+ \def\tikz@nodes@collect{pic }%
+ \else%
+ \def\tikz@nodes@collect{node }%
+ \fi%
+ \tikz@nodes%
+}%
+\def\tikz@nodes foreach{\pgfutil@ifnextchar x\tikz@nodes@\tikz@nodes@}% get rid of spaces
+\def\tikz@nodes@#1in{%
+ \expandafter\def\expandafter\tikz@nodes@list\expandafter{\tikz@nodes@list\foreach#1in}%
+ \pgfutil@ifnextchar\bgroup\tikz@nodes@group\tikz@nodes@one%
+}%
+\def\tikz@nodes@one#1{%
+ \expandafter\def\expandafter\tikz@nodes@list\expandafter{\tikz@nodes@list#1}%
+ \pgfutil@ifnextchar f\tikz@nodes\tikz@nodes@scan%
+}%
+\def\tikz@nodes@group#1{%
+ \expandafter\def\expandafter\tikz@nodes@list\expandafter{\tikz@nodes@list{#1}}%
+ \pgfutil@ifnextchar f\tikz@nodes\tikz@nodes@scan%
+}%
+\def\tikz@nodes@scan{%
+ \pgfutil@ifnextchar a{\tikz@nodes@at}%
+ {\pgfutil@ifnextchar({\tikz@nodes@name}%
+ {\pgfutil@ifnextchar[{\tikz@nodes@opt}%
+ {\pgfutil@ifnextchar\bgroup{\tikz@nodes@main}%
+ {\tikzerror{Nodes must have a (possibly empty) label text}%
+ \tikz@fig@main{}}}}}}%}}%
+\def\tikz@nodes@at at#1){%
+ \expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect at#1)}%
+ \tikz@nodes@scan}%
+\def\tikz@nodes@name#1){%
+ \expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect#1)}%
+ \tikz@nodes@scan}%
+\def\tikz@nodes@opt#1]{%
+ \expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect#1]}%
+ \tikz@nodes@scan}%
+\def\tikz@nodes@main#1{%
+ \iftikz@handle@active@nodes%
+ \iftikz@node@is@pic%
+ \expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect{#1}}%
+ \else%
+ \expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect{\scantokens{#1}}}%
+ \fi%
+ \else%
+ \expandafter\def\expandafter\tikz@nodes@collect\expandafter{\tikz@nodes@collect{#1}}%
+ \fi%
+ % Ok, got everything.
+ % Now, start building parse text.
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \tikz@nodes@list{%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \expandafter\tikz@scan@next@command\tikz@nodes@collect\pgfextra\relax%
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ }%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \tikz@scan@next@command%
+}%
+
+
+
+%
+% "late" options can be used to "redo" a node
+%
+\tikzset{late options/.code=\tikz@late@options{#1}}%
+\def\tikz@late@options#1{%
+ % Do a "virtual" node:
+ \begingroup%
+ \iftikz@shapeborder%
+ \let\tikz@fig@name=\tikz@shapeborder@name%
+ \else%
+ \let\tikz@fig@name=\pgfutil@empty%
+ \fi%
+ \tikz@is@matrixfalse%
+ \let\tikz@options=\pgfutil@empty%
+ \tikz@clear@rdf@options%
+ \let\tikz@after@path=\pgfutil@empty%
+ \let\tikz@afternodepathoptions=\pgfutil@empty%
+ \let\tikz@alias=\pgfutil@empty%
+ \let\tikz@transform=\pgfutil@empty%
+ \tikz@decoratepathfalse%
+ \tikz@node@reset@hook%
+ \tikz@enable@node@quotes%
+ \tikzset{every node/.try,#1}%
+ \ifx\tikz@fig@name\pgfutil@empty%
+ \tikzerror{Late options must reference some existing node}%
+ \fi%
+ \tikz@node@begin@hook%
+ \tikz@alias%
+ \tikzgdlatenodeoptionacallback{\tikz@fig@name}%
+ \global\let\tikz@last@fig@name=\tikz@fig@name%
+ \global\let\tikz@after@path@smuggle=\tikz@after@path%
+ \endgroup%
+ \tikz@do@after@path@smuggle%
+}%
+
+
+% Auto placement
+
+\def\tikz@auto@pre{%
+ \begingroup
+ \pgfresetnontranslationattimefalse
+ \ifpgfslopedattime
+ \pgfslopedattimefalse%
+ \else
+ \pgfslopedattimetrue%
+ \fi
+ \pgfallowupsidedownattimetrue%
+ \tikz@timer%
+ \pgf@x=\pgf@pt@aa pt%
+ \pgf@y=\pgf@pt@ab pt%
+ \pgfpointnormalised{}%
+}%
+
+\def\tikz@auto@post{%
+ \global\let\tikz@anchor@smuggle=\tikz@anchor%
+ \endgroup%
+ \let\tikz@anchor=\tikz@anchor@smuggle%
+}%
+
+\def\tikz@auto@anchor{%
+ \ifdim\pgf@x>0.05pt%
+ \ifdim\pgf@y>0.05pt%
+ \def\tikz@anchor{south east}%
+ \else\ifdim\pgf@y<-0.05pt%
+ \def\tikz@anchor{south west}%
+ \else
+ \def\tikz@anchor{south}%
+ \fi\fi%
+ \else\ifdim\pgf@x<-0.05pt%
+ \ifdim\pgf@y>0.05pt%
+ \def\tikz@anchor{north east}%
+ \else\ifdim\pgf@y<-0.05pt%
+ \def\tikz@anchor{north west}%
+ \else
+ \def\tikz@anchor{north}%
+ \fi\fi%
+ \else%
+ \ifdim\pgf@y>0pt%
+ \def\tikz@anchor{east}%
+ \else%
+ \def\tikz@anchor{west}%
+ \fi%
+ \fi\fi%
+}%
+
+\def\tikz@auto@anchor@prime{%
+ \ifdim\pgf@x>0.05pt%
+ \ifdim\pgf@y>0.05pt%
+ \def\tikz@anchor{north west}%
+ \else\ifdim\pgf@y<-0.05pt%
+ \def\tikz@anchor{north east}%
+ \else
+ \def\tikz@anchor{north}%
+ \fi\fi%
+ \else\ifdim\pgf@x<-0.05pt%
+ \ifdim\pgf@y>0.05pt%
+ \def\tikz@anchor{south west}%
+ \else\ifdim\pgf@y<-0.05pt%
+ \def\tikz@anchor{south east}%
+ \else
+ \def\tikz@anchor{south}%
+ \fi\fi%
+ \else%
+ \ifdim\pgf@y>0pt%
+ \def\tikz@anchor{west}%
+ \else%
+ \def\tikz@anchor{east}%
+ \fi%
+ \fi\fi%
+}%
+
+
+%
+% Callbacks: Please see the documentation of the graph drawing
+% lib for info on these callbacks
+%
+\def\tikzgdeventcallback#1#2{}%
+\def\tikzgdeventgroupcallback#1{}%
+\def\tikzgdlatenodeoptionacallback#1{}%
+
+% Syntax for trees:
+% node {...} child [options] {...} child [options] {...} ...
+% node {...} child [options] foreach \var in {list} [options] {...} ...
+
+\def\tikz@children{%
+ % Start collecting the children:
+ \let\tikz@children@list=\pgfutil@empty%
+ \tikznumberofchildren=0\relax%
+ \tikz@collect@children c}%
+
+\def\tikz@collect@children{\pgfutil@ifnextchar c{\tikz@collect@children@cchar}{\tikz@children@collected}}%
+\def\tikz@collect@children@cchar c{\pgfutil@ifnextchar h{\tikz@collect@child}{\tikz@children@collected c}}%
+\def\tikz@collect@child hild{\pgfutil@ifnextchar[{\tikz@collect@childA}{\tikz@collect@childA[]}}%}%
+\def\tikz@collect@childA[#1]{\pgfutil@ifnextchar f{\tikz@collect@children@foreach[#1]}{\tikz@collect@childB[#1]}}%
+\def\tikz@collect@childB[#1]{%
+ \advance\tikznumberofchildren by1\relax
+ \expandafter\def\expandafter\tikz@children@list\expandafter{\tikz@children@list \tikz@childnode[#1]}%
+ \pgfutil@ifnextchar\bgroup{\tikz@collect@child@code}{\tikz@collect@child@code{}}}%
+\def\tikz@collect@child@code#1{%
+ \expandafter\def\expandafter\tikz@children@list\expandafter{\tikz@children@list{#1}}%
+ \tikz@collect@children%
+}%
+\def\tikz@collect@children@foreach[#1]foreach#2in#3{%
+ \pgfutil@ifnextchar\bgroup{\tikz@collect@children@foreachA{#1}{#2}{#3}}{\tikz@collect@children@foreachA{#1}{#2}{#3}{}}}%
+\def\tikz@collect@children@foreachA#1#2#3#4{%
+ \expandafter\def\expandafter\tikz@children@list\expandafter
+ {\tikz@children@list\tikz@childrennodes[#1]{#2}{#3}{#4}}%
+ \c@pgf@counta=\tikznumberofchildren%
+ \foreach#2in{#3}%
+ {%
+ \global\advance\c@pgf@counta by1\relax%
+ }%
+ \tikznumberofchildren=\c@pgf@counta%
+ \tikz@collect@children%
+}%
+\long\def\tikz@children@collected{%
+ \begingroup%
+ \advance\tikztreelevel by 1\relax%
+ \tikzgdeventgroupcallback{descendants}%
+ \let\tikz@options=\pgfutil@empty%
+ \tikz@clear@rdf@options%
+ \let\tikz@transform=\pgfutil@empty%
+ \tikzset{level/.try=\the\tikztreelevel,level \the\tikztreelevel/.try}%
+ \tikz@transform%
+ \let\tikz@transform=\relax%
+ \let\tikzparentnode=\tikz@last@fig@name%
+ \ifx\tikz@grow\relax\else%
+ % Transform to center of node
+ \pgftransformshift{\pgfpointanchor{\tikzparentnode}{\tikz@growth@anchor}}%
+ \fi%
+ \tikznumberofcurrentchild=0\relax%
+ \tikz@children@list%
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \endgroup%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \tikz@scan@next@command%
+}%
+
+% Syntax for children:
+%
+% child [all children options] foreach \var in {values} [child options] {...}
+\def\tikz@childrennodes[#1]#2#3#4{%
+ \c@pgf@counta=\tikznumberofcurrentchild\relax%
+ \setbox\tikz@tempbox=\box\tikz@figbox%
+ \setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ \foreach#2in{#3}{%
+ \tikznumberofcurrentchild=\c@pgf@counta\relax%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+ \tikz@childnode[#1]{#4}%
+ % we must now make the current child number and the figbox survive
+ % the group
+ \global\c@pgf@counta=\tikznumberofcurrentchild\relax%
+ \global\setbox\tikz@tempbox=\box\tikz@figbox%
+ \global\setbox\tikz@tempbox@bg=\box\tikz@figbox@bg%
+ }%
+ \tikznumberofcurrentchild=\c@pgf@counta\relax%
+ \setbox\tikz@figbox=\box\tikz@tempbox%
+ \setbox\tikz@figbox@bg=\box\tikz@tempbox@bg%
+}%
+
+
+% Syntax for child:
+%
+% child
+%
+% child[options]
+%
+% child[options] {node (name) {child node text} ...
+% edge from parent[options] node {label text} node {label text}}
+
+\def\tikz@childnode[#1]#2{%
+ \advance\tikznumberofcurrentchild by1\relax%
+ {\tikzset{every child/.try,#1}\expandafter}%
+ \iftikz@child@missing%
+ \tikzgdeventcallback{node}{}%
+ \else%
+ \setbox\tikz@whichbox=\hbox\bgroup%
+ \unhbox\tikz@whichbox%
+ \hbox\bgroup\bgroup%
+ \pgfinterruptpath%
+ \pgfscope%
+ \let\tikz@transform=\pgfutil@empty%
+ \tikzset{every child/.try,#1}%
+ \tikz@options%
+ \tikz@transform%
+ \let\tikz@transform=\relax%
+ \tikz@grow%
+ % Typeset node:
+ \edef\tikz@parent@node@name{[name=\tikzparentnode-\the\tikznumberofcurrentchild,style=every child node]}%
+ \def\tikz@child@node@text{[shape=coordinate]{}}
+ \tikz@parse@child@node#2\pgf@stop%
+ \expandafter\expandafter\expandafter\node
+ \expandafter\tikz@parent@node@name
+ \tikz@child@node@text
+ \pgfextra{\global\let\tikz@childnode@name=\tikz@last@fig@name};%
+ \let\tikzchildnode=\tikz@childnode@name%
+ {%
+ \def\tikz@edge@to@parent@needed{edge from parent}
+ \ifx\tikz@child@node@rest\pgfutil@empty%
+ \path edge from parent;%
+ \else%
+ \path \tikz@child@node@rest \tikz@edge@to@parent@needed;%
+ \fi%
+ }%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ \egroup\egroup%
+ \egroup%
+ \fi%
+}%
+
+\def\tikz@parse@child@node{%
+ \pgfutil@ifnextchar n{\tikz@parse@child@node@n}%
+ {\pgfutil@ifnextchar c{\tikz@parse@child@node@c}%
+ {\pgfutil@ifnextchar\pgf@stop\tikz@parse@child@node@rest\tikz@parse@child@node@expand}}}%
+\def\tikz@parse@child@node@expand{%
+ \advance\tikz@expandcount by-1\relax%
+ \ifnum\tikz@expandcount<0\relax%
+ \expandafter\tikz@parse@child@node@rest%
+ \else%
+ \expandafter\expandafter\expandafter\tikz@parse@child@node%
+ \fi%
+}%
+\def\tikz@parse@child@node@rest#1\pgf@stop{\tikz@expandcount=100\relax\def\tikz@child@node@rest{#1}}%
+\def\tikz@parse@child@node@c c{\tikz@expandcount=100\pgfutil@ifnextchar o{\tikz@parse@child@node@co}{\tikz@parse@child@node@rest c}}%
+\def\tikz@parse@child@node@co o{\pgfutil@ifnextchar o{\tikz@parse@child@node@coordinate}{\tikz@parse@child@node@rest co}}%
+\def\tikz@parse@child@node@coordinate ordinate{%
+ \pgfutil@ifnextchar ({\tikz@@parse@child@node@coordinate}{%
+ \def\tikz@child@node@text{[shape=coordinate]{}}%
+ \tikz@parse@child@node@rest}}%}%
+\def\tikz@@parse@child@node@coordinate(#1){%
+ \pgfutil@ifnextchar a{\tikz@p@c@n@c@at(#1)}{%
+ \def\tikz@child@node@text{[shape=coordinate,name=#1]{}}%
+ \tikz@parse@child@node@rest}}%
+\def\tikz@p@c@n@c@at(#1)at#2({%
+ \def\tikz@child@node@text@pre{[shape=coordinate,name=#1]at}%
+ \tikz@scan@one@point\tikz@p@c@n@c@at@math(%
+}%
+\def\tikz@p@c@n@c@at@math#1{%
+ \pgf@process{#1}%
+ \edef\tikz@marshal{(\the\pgf@x,\the\pgf@y){}}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@child@node@text%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@child@node@text@pre\tikz@marshal}%
+ \tikz@parse@child@node@rest%
+}%
+\def\tikz@parse@child@node@n node{\tikz@expandcount=100%
+ \let\tikz@child@node@text=\pgfutil@empty%
+ \tikz@p@c@s}%
+\def\tikz@p@c@s{%
+ \pgfutil@ifnextchar a{\tikz@p@c@s@at}
+ {\pgfutil@ifnextchar ({\tikz@p@c@s@paran}
+ {\pgfutil@ifnextchar [{\tikz@p@c@s@bra}
+ {\pgfutil@ifnextchar \bgroup{\tikz@p@c@s@group}
+ {\tikzerror{Cannot parse this node}}}}}}%}}%
+\def\tikz@p@c@s@at at#1({%
+ \tikz@scan@one@point\tikz@p@c@s@at@math(%
+}%
+\def\tikz@p@c@s@at@math#1{%
+ \pgf@process{#1}%
+ \edef\tikz@marshal{ at(\the\pgf@x,\the\pgf@y)}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@child@node@text%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@child@node@text\tikz@marshal}
+ \tikz@p@c@s}%
+\def\tikz@p@c@s@paran(#1){%
+ \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text(#1)}
+ \tikz@p@c@s}%
+\def\tikz@p@c@s@bra[#1]{%
+ \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text[#1]}
+ \tikz@p@c@s}%
+\def\tikz@p@c@s@group#1{%
+ \iftikz@handle@active@nodes%
+ \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text{\scantokens{#1}}}%
+ \else%
+ \expandafter\def\expandafter\tikz@child@node@text\expandafter{\tikz@child@node@text{#1}}
+ \fi%
+ \tikz@parse@child@node@rest%
+}%
+
+
+
+%
+% Syntax for decorated subpaths:
+%
+% decorate [option] { subpath }
+%
+\def\tikz@decoration ecorate{%
+ \pgfutil@ifnextchar[{\tikz@lib@decoration}{\tikz@lib@decoration[]}%]
+}%
+
+\def\tikz@lib@decoration[#1]#2{\tikzerror{You need to load a decoration library}}%
+
+% The decorate path command:
+\def\tikz@lib@dec@decorate@path{\tikzerror{You need to load a decoration library}}%
+
+
+
+%
+% Syntax for let :
+%
+% let \p1 = (coordinate), \p2 = (coordinate),... in
+%
+\def\tikz@let@command et#1in{%
+ \tikzerror{You need to say \string\usetikzlibrary{calc} to use the let command}%
+ \tikz@scan@next@command%
+}%
+
+
+%
+% Syntax for pictures:
+%
+% as for nodes, but with "pic" instead of "node"
+%
+\newif\iftikz@node@is@pic
+\def\tikz@subpicture ic{\tikz@node@is@pictrue\tikz@scan@next@command node}%
+\def\tikz@subpicture@handle#1{%
+ \pgfkeys@spdef\tikz@temp{#1}%
+ \expandafter\tikz@subpicture@handle@\expandafter{\tikz@temp}%
+}%
+\def\tikz@subpicture@handle@#1{
+ \pgfkeys{/tikz/pics/.cd,#1}%
+ \tikz@node@transformations%
+ \let\tikz@transform=\relax%
+ \let\tikz@picmode\tikz@mode%
+ \tikzset{name prefix ../.style/.expanded={/tikz/name prefix=\pgfkeysvalueof{/tikz/name prefix}}}%
+ \ifx\tikz@fig@name\pgfutil@empty\else%
+ \tikzset{name prefix/.prefix/.expanded=\tikz@fig@name}%
+ \fi%
+ \pgfkeysvalueof{/tikz/pics/setup code}%
+ \pgfkeysgetvalue{/tikz/pics/code}{\tikz@pic@code}
+ \ifx\tikz@pic@code\pgfutil@empty\else%
+ \setbox\tikz@whichbox=\hbox\bgroup%
+ \unhbox\tikz@whichbox%
+ \hbox\bgroup
+ \bgroup%
+ \pgfinterruptpath%
+ \pgfscope%
+ \tikz@options%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \tikz@atbegin@scope%
+ \scope[every pic/.try]%
+ \tikz@pic@code%
+ \endscope%
+ \tikz@atend@scope%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ \egroup
+ \egroup%
+ \egroup%
+ \fi%
+ \pgfkeysgetvalue{/tikz/pics/foreground code}{\tikz@pic@code}
+ \ifx\tikz@pic@code\pgfutil@empty\else%
+ \setbox\tikz@figbox=\hbox\bgroup%
+ \unhbox\tikz@figbox%
+ \hbox\bgroup
+ \bgroup%
+ \pgfinterruptpath%
+ \pgfscope%
+ \tikz@options%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \tikz@atbegin@scope%
+ \scope[every front pic/.try]%
+ \tikz@pic@code%
+ \endscope%
+ \tikz@atend@scope%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ \egroup
+ \egroup%
+ \egroup%
+ \fi%
+ \pgfkeysgetvalue{/tikz/pics/background code}{\tikz@pic@code}
+ \ifx\tikz@pic@code\pgfutil@empty\else%
+ \setbox\tikz@figbox@bg=\hbox\bgroup%
+ \unhbox\tikz@figbox@bg%
+ \hbox\bgroup
+ \bgroup%
+ \pgfinterruptpath%
+ \pgfscope%
+ \tikz@options%
+ \setbox\tikz@figbox=\box\pgfutil@voidb@x%
+ \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
+ \tikz@atbegin@scope%
+ \scope[every behind pic/.try]%
+ \tikz@pic@code%
+ \endscope%
+ \tikz@atend@scope%
+ \endpgfscope%
+ \endpgfinterruptpath%
+ \egroup
+ \egroup%
+ \egroup%
+ \fi%
+ \tikz@node@finish%
+}%
+\tikzset{
+ pic actions/.code=\tikz@addmode{\tikz@picmode}
+}%
+
+% Setting up the picture codes:
+\tikzset{
+ pics/setup code/.initial=,
+ pics/code/.initial=,
+ pics/background code/.initial=,
+ pics/foreground code/.initial=
+}%
+
+% Defining pictures:
+
+\def\tikzdeclarepic#1#2{\pgfkeys{/tikz/#1/.cd,#2}}%
+
+\pgfkeysdef{/handlers/.pic}{%
+ \edef\pgf@temp{\pgfkeyscurrentpath}%
+ \edef\pgf@temp{\expandafter\tikz@smuggle@pics@in\pgf@temp\pgf@stop}%
+ \expandafter\pgfkeys\expandafter{\pgf@temp/.style={code={#1}}}%
+}%
+\def\tikz@smuggle@pics@in/tikz/#1\pgf@stop{/tikz/pics/#1}%
+
+%
+% Timers
+%
+
+\def\tikz@timer@line{%
+ \pgftransformlineattime{\tikz@time}{\tikz@timer@start}{\tikz@timer@end}%
+}%
+
+\def\tikz@timer@vhline{%
+ \ifdim\tikz@time pt<0.5pt% first half
+ \pgf@process{\tikz@timer@start}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@timer@end}%
+ \pgf@xb=\tikz@time pt%
+ \pgf@xb=2\pgf@xb%
+ \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
+ \noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}}%
+ \tikz@marshal%
+ \else% second half
+ \pgf@process{\tikz@timer@start}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@timer@end}%
+ \pgf@xb=\tikz@time pt%
+ \pgf@xb=2\pgf@xb%
+ \advance\pgf@xb by-1pt%
+ \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
+ {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}{\noexpand\tikz@timer@end}}%
+ \tikz@marshal%
+ \fi%
+}%
+
+\def\tikz@timer@hvline{%
+ \ifdim\tikz@time pt<0.5pt% first half
+ \pgf@process{\tikz@timer@start}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@timer@end}%
+ \pgf@xb=\tikz@time pt%
+ \pgf@xb=2\pgf@xb%
+ \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
+ \noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}}%
+ \tikz@marshal%
+ \else% second half
+ \pgf@process{\tikz@timer@start}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@timer@end}%
+ \pgf@xb=\tikz@time pt%
+ \pgf@xb=2\pgf@xb%
+ \advance\pgf@xb by-1pt%
+ \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
+ {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}{\noexpand\tikz@timer@end}}%
+ \tikz@marshal%
+ \fi%
+}%
+
+\def\tikz@timer@curve{%
+ \pgftransformcurveattime{\tikz@time}{\tikz@timer@start}{\tikz@timer@cont@one}{\tikz@timer@cont@two}{\tikz@timer@end}%
+}%
+
+
+\def\tikz@timer@arc{%
+ \pgfmathcos@{\tikz@timer@start@angle}%
+ \let\tikz@angle@cos\pgfmathresult%
+ \pgfmathsin@{\tikz@timer@start@angle}%
+ \let\tikz@angle@sin\pgfmathresult%
+ \pgftransformarcaxesattime{\tikz@time}{%
+ \pgfpointdiff{%
+ \pgfpointadd{%
+ \pgfpointscale{\tikz@angle@cos}{\tikz@timer@zero@axis}%
+ }{%
+ \pgfpointscale{\tikz@angle@sin}{\tikz@timer@ninety@axis}%
+ }%
+ }%
+ {\tikz@timer@start}%
+ }%
+ {\tikz@timer@zero@axis}%
+ {\tikz@timer@ninety@axis}%
+ {\tikz@timer@start@angle}{\tikz@timer@end@angle}%
+}%
+
+
+
+%
+% Coordinate systems
+%
+
+\def\tikzdeclarecoordinatesystem#1#2{%
+ \expandafter\def\csname tikz@parse@cs@#1\endcsname(##1){%
+ \pgf@process{%
+ #2%
+ \global\let\tikz@smubble@b=\tikz@shapeborder@name%
+ }%
+ \let\tikz@shapeborder@name=\tikz@smubble@b%
+ \edef\tikz@return@coordinate{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+}%
+\def\tikzaliascoordinatesystem#1#2{%
+ \edef\pgf@marshal{\noexpand\let\expandafter\noexpand\csname
+ tikz@parse@cs@#1\endcsname=\expandafter\noexpand\csname
+ tikz@parse@cs@#2\endcsname}%
+ \pgf@marshal%
+}%
+
+
+% Default coordinate systems:
+
+\tikzdeclarecoordinatesystem{canvas}
+{%
+ \tikzset{cs/.cd,x=0pt,y=0pt,#1}%
+ \pgfpoint{\tikz@cs@x}{\tikz@cs@y}%
+}%
+
+\tikzdeclarecoordinatesystem{canvas polar}
+{%
+ \tikzset{cs/.cd,angle=0,radius=0cm,#1}%
+ \pgfpointpolar{\tikz@cs@angle}{\tikz@cs@xradius and \tikz@cs@yradius}%
+}%
+
+\tikzdeclarecoordinatesystem{xyz}
+{%
+ \tikzset{cs/.cd,x=0,y=0,z=0,#1}%
+ \pgfpointxyz{\tikz@cs@x}{\tikz@cs@y}{\tikz@cs@z}%
+}%
+
+\tikzdeclarecoordinatesystem{xyz polar}
+{%
+ \tikzset{cs/.cd,angle=0,radius=0,#1}%
+ \pgfpointpolarxy{\tikz@cs@angle}{\tikz@cs@xradius and \tikz@cs@yradius}%
+}%
+\tikzaliascoordinatesystem{xy polar}{xyz polar}%
+
+
+\tikzdeclarecoordinatesystem{node}
+{%
+ \tikzset{cs/.cd,name=,anchor=none,angle=none,#1}%
+ \ifx\tikz@cs@anchor\tikz@nonetext%
+ \ifx\tikz@cs@angle\tikz@nonetext%
+ \expandafter\ifx\csname pgf@sh@ns@\tikz@cs@node\endcsname\tikz@coordinate@text%
+ \else
+ \aftergroup\tikz@shapebordertrue%
+ \edef\tikz@shapeborder@name{\tikz@pp@name{\tikz@cs@node}}%
+ \fi%
+ \pgfpointanchor{\tikz@pp@name{\tikz@cs@node}}{center}%
+ \else%
+ \pgfpointanchor{\tikz@pp@name{\tikz@cs@node}}{\tikz@cs@angle}%
+ \fi%
+ \else%
+ \pgfpointanchor{\tikz@pp@name{\tikz@cs@node}}{\tikz@cs@anchor}%
+ \fi%
+}%
+
+% Intersection coordinates
+\tikzset{cs/first line/.code=\def\tikz@cs@line@a{#1}\def\tikz@cs@type@a{line}}%
+\tikzset{cs/second line/.code=\def\tikz@cs@line@b{#1}\def\tikz@cs@type@b{line}}%
+
+\tikzset{cs/first node/.code=\tikz@cs@unpack{\tikz@cs@node@a}{\tikz@cs@type@a}{#1}}%
+\tikzset{cs/second node/.code=\tikz@cs@unpack{\tikz@cs@node@b}{\tikz@cs@type@b}{#1}}%
+
+\def\tikz@cs@unpack#1#2#3{%
+ \expandafter\ifx\csname pgf@sh@ns@#3\endcsname\relax%
+ \tikzerror{Undefined node ``#3''}%
+ \else%
+ \def#1{#3}%
+ \edef#2{\csname pgf@sh@ns@#3\endcsname}%
+ \fi%
+}%
+
+\tikzset{cs/solution/.initial=1}%
+
+\tikzset{cs/horizontal line through/.store in=\tikz@cs@hori@line}%
+\tikzset{cs/vertical line through/.store in=\tikz@cs@vert@line}%
+
+\tikzdeclarecoordinatesystem{intersection}
+{%
+ \tikzset{cs/.cd,#1}%
+ \expandafter\ifx\csname tikz@intersect@\tikz@cs@type@a @and@\tikz@cs@type@b\endcsname\relax%
+ \tikzerror{I do not know how to compute the intersection
+ of a \tikz@cs@type@a and a \tikz@cs@type@b. Try saying
+ \string\usetikzlibrary{calc}}%
+ \pgfpointorigin%
+ \else%
+ \csname tikz@intersect@\tikz@cs@type@a @and@\tikz@cs@type@b\endcsname%
+ \fi%
+}%
+
+\def\tikz@intersect@line@and@line{%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@a%
+ \pgf@xa=\pgf@xc%
+ \pgf@ya=\pgf@yc%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@b%
+ \edef\pgf@marshal{%
+ {\noexpand\pgfpointintersectionoflines%
+ {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
+ {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
+ {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}}%
+ \pgf@marshal%
+}%
+
+\def\tikz@parse@line#1--{%
+ \pgf@process{#1}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \tikz@scan@one@point\pgf@process%
+}%
+
+
+\tikzdeclarecoordinatesystem{perpendicular}
+{%
+ \tikzset{cs/.cd,#1}%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@parse@intersection@a\tikz@cs@hori@line%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@parse@intersection@b\tikz@cs@vert@line%
+ \pgfqpoint{\the\pgf@xb}{\the\pgf@ya}
+}%
+
+\tikzdeclarecoordinatesystem{barycentric}
+{%
+ {%
+ \pgf@xa=0pt% point
+ \pgf@ya=0pt%
+ \pgf@xb=0pt% sum
+ \tikz@bary@dolist#1,=,%
+ \pgfmathparse{1/\the\pgf@xb}%
+ \global\pgf@x=\pgfmathresult\pgf@xa%
+ \global\pgf@y=\pgfmathresult\pgf@ya%
+ }%
+}%
+
+\def\tikz@bary@dolist#1=#2,{%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else
+ \pgf@process{\pgfpointanchor{#1}{center}}%
+ \pgfmathparse{#2}%
+ \advance\pgf@xa by\pgfmathresult\pgf@x%
+ \advance\pgf@ya by\pgfmathresult\pgf@y%
+ \advance\pgf@xb by\pgfmathresult pt%
+ \expandafter\tikz@bary@dolist%
+ \fi%
+}%
+
+\tikzset{cs/x/.store in=\tikz@cs@x}%
+\tikzset{cs/y/.store in=\tikz@cs@y}%
+\tikzset{cs/z/.store in=\tikz@cs@z}%
+\tikzset{cs/angle/.store in=\tikz@cs@angle}%
+\tikzset{cs/x radius/.store in=\tikz@cs@xradius}%
+\tikzset{cs/y radius/.store in=\tikz@cs@yradius}%
+\tikzset{cs/radius/.style={/tikz/cs/x radius=#1,/tikz/cs/y radius=#1}}%
+\tikzset{cs/name/.store in=\tikz@cs@node}%
+\tikzset{cs/anchor/.store in=\tikz@cs@anchor}%
+
+
+
+%
+% Coordinate management
+%
+
+
+% Last position visited
+\def\tikz@last@position{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}%
+\def\tikz@last@position@saved{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}%
+
+% Make given point the last position visited
+\def\tikz@make@last@position#1{%
+ \pgf@process{#1}%
+ \tikz@lastx=\pgf@x\relax%
+ \tikz@lasty=\pgf@y\relax%
+ \iftikz@updatecurrent%
+ \tikz@lastxsaved=\pgf@x\relax%
+ \tikz@lastysaved=\pgf@y\relax%
+ \fi%
+ \tikz@updatecurrenttrue%
+}%
+
+\newif\iftikz@updatecurrent
+\tikz@updatecurrenttrue
+
+
+
+% Scanner: Scans a point or a relative point.
+% It then calls the first parameter with the argument set to an
+% appropriate pgf command representing that point.
+
+\def\tikz@scan@one@point#1{%
+ \let\tikz@to@use@whom=\tikz@to@use@last@coordinate%
+ \tikz@shapeborderfalse%
+ \pgfutil@ifnextchar+{\tikz@scan@relative#1}{\tikz@scan@absolute#1}}%
+\def\tikz@scan@absolute#1{%
+ \pgfutil@ifnextchar({\tikz@scan@@absolute#1}%)
+ {%
+ \advance\tikz@expandcount by -1%
+ \ifnum\tikz@expandcount<0\relax%
+ \let\pgfutil@next=\tikz@@scangiveup%
+ \else%
+ \let\pgfutil@next=\tikz@@scanexpand%
+ \fi%
+ \pgfutil@next{#1}%
+ }%
+}%
+\def\tikz@@scanexpand#1{\expandafter\tikz@scan@one@point\expandafter#1}%
+\def\tikz@@scangiveup#1{\tikzerror{Cannot parse this coordinate}#1{\pgfpointorigin}}%
+\def\tikz@scan@@absolute#1({%
+ \pgfutil@ifnextchar[% uhoh... options!
+ {\def\tikz@scan@point@recall{#1}\tikz@scan@options}%
+ {\tikz@@@scan@@absolute#1(}%
+}%
+
+\def\tikz@scan@options[#1]#2{%
+ \def\tikz@scan@point@options{#1}%
+ \tikz@@@scan@@absolute\tikz@scan@handle@options(#2%
+}%
+
+\def\tikz@scan@handle@options#1{%
+ {%
+ % Ok, compute point with options set and zero transformation
+ % matrix:
+ \pgftransformreset%
+ \let\tikz@transform=\pgfutil@empty%
+ \expandafter\tikzset\expandafter{\tikz@scan@point@options}%
+ \tikz@transform%
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \xdef\tikz@marshal{\expandafter\noexpand\tikz@scan@point@recall{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ }%
+ \tikz@marshal%
+}%
+
+\def\tikz@ensure@dollar@catcode{%
+ \ifnum\catcode`\$=3 %
+ \else
+ \tikzerror{Sorry, some package has redefined the meaning of the
+ math-mode dollar sign. This is incompatible with tikz and its calc
+ library and might cause unrecoverable errors}%
+ % only show error once:
+ \global\let\tikz@ensure@dollar@catcode=\relax
+ \fi
+}%
+
+\def\tikz@@@scan@@absolute#1({%
+ \tikz@ensure@dollar@catcode
+ \pgfutil@ifnextchar{$}%$
+ {\tikz@parse@calculator#1(}
+ {\tikz@scan@no@calculator#1(}%
+}%
+\def\tikz@scan@no@calculator#1(#2){%
+ \edef\tikz@scan@point@coordinate{(#2)}%
+ \expandafter\tikz@@scan@@no@calculator\expandafter#1\tikz@scan@point@coordinate%
+}%
+\def\tikz@@scan@@no@calculator#1(#2){%
+ \pgfutil@in@{cs:}{#2}%
+ \ifpgfutil@in@%
+ \let\pgfutil@next\tikz@parse@coordinatesystem%
+ \else%
+ \pgfutil@in@{intersection }{#2}%
+ \ifpgfutil@in@%
+ \let\pgfutil@next\tikz@parse@intersection%
+ \else%
+ \pgfutil@in@|{#2}%
+ \ifpgfutil@in@
+ \pgfutil@in@{-|}{#2}%
+ \ifpgfutil@in@
+ \let\pgfutil@next\tikz@parse@hv%
+ \else%
+ \let\pgfutil@next\tikz@parse@vh%
+ \fi%
+ \else%
+ \pgfutil@in@:{#2}%
+ \ifpgfutil@in@
+ \let\pgfutil@next\tikz@parse@polar%
+ \else%
+ \pgfutil@in@,{#2}%
+ \ifpgfutil@in@%
+ \let\pgfutil@next\tikz@parse@regular%
+ \else%
+ \let\pgfutil@next\tikz@parse@node%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfutil@next#1(#2)%
+}%
+
+\def\tikz@parse@calculator#1($#2$){%
+ \tikzerror{You need to say \string\usetikzlibrary{calc} for coordinate calculation}%
+ #1{\pgfpointorigin}%
+}%
+
+\def\tikz@parse@coordinatesystem#1(#2 cs:#3){%
+ \let\tikz@return@coordinate=\pgfpointorigin%
+ \pgfutil@ifundefined{tikz@parse@cs@#2}
+ {\tikzerror{Unknown coordinate system '#2'}}
+ {\csname tikz@parse@cs@#2\endcsname(#3)}%
+ \expandafter#1\expandafter{\tikz@return@coordinate}%
+}%
+
+
+\newif\iftikz@isdimension
+\def\tikz@checkunit#1{%
+ \pgfmathparse{#1}%
+ \let\iftikz@isdimension=\ifpgfmathunitsdeclared%
+}%
+
+\def\tikz@parse@polar#1(#2:#3){%
+ \pgfutil@ifundefined{tikz@polar@dir@#2}
+ {\tikz@@parse@polar#1({#2}:{#3})}
+ {\tikz@@parse@polar#1(\csname tikz@polar@dir@#2\endcsname:{#3})}%
+}%
+\def\tikz@@parse@polar#1(#2:#3){%
+ \pgfutil@in@{ and }{#3}%
+ \ifpgfutil@in@%
+ \edef\tikz@args{({#2}:#3)}%
+ \else%
+ \edef\tikz@args{({#2}:{#3} and {#3})}%
+ \fi%
+ \expandafter\tikz@@@parse@polar\expandafter#1\tikz@args%
+}%
+\def\tikz@@@parse@polar#1(#2:#3 and #4){%
+ \tikz@checkunit{#3}%
+ \iftikz@isdimension%
+ \tikz@checkunit{#4}%
+ \iftikz@isdimension%
+ \def\tikz@next{#1{\pgfpointpolar{#2}{#3 and #4}}}%
+ \else%
+ \tikzerror{You cannot mix dimension and dimensionless values for polar coordinates}
+ \def\tikz@next{#1{\pgfpointorigin}}%
+ \fi%
+ \else%
+ \tikz@checkunit{#4}%
+ \iftikz@isdimension%
+ \tikzerror{You cannot mix dimension and dimensionless values for polar coordinates}
+ \def\tikz@next{#1{\pgfpointorigin}}%
+ \else%
+ \def\tikz@next{#1{\pgfpointpolarxy{#2}{#3 and #4}}}%
+ \fi%
+ \fi%
+ \tikz@next%
+}%
+\def\tikz@polar@dir@up{90}%
+\def\tikz@polar@dir@down{-90}%
+\def\tikz@polar@dir@left{180}%
+\def\tikz@polar@dir@right{0}%
+\def\tikz@polar@dir@north{90}%
+\def\tikz@polar@dir@south{-90}%
+\def\tikz@polar@dir@east{0}%
+\def\tikz@polar@dir@west{180}%
+\expandafter\def\csname tikz@polar@dir@north east\endcsname{45}%
+\expandafter\def\csname tikz@polar@dir@north west\endcsname{135}%
+\expandafter\def\csname tikz@polar@dir@south east\endcsname{-45}%
+\expandafter\def\csname tikz@polar@dir@south west\endcsname{-135}%
+
+
+% MW:
+% Check to see if the y-coordinate is inside {}. If it is, scan it and
+% reinsert it into the stream inside an extra group.
+%
+\def\tikz@parse@regular#1(#2,{%
+ \pgfutil@ifnextchar\bgroup{\tikz@@parse@regular#1{#2}}{\tikz@@@parse@regular#1{#2}}%
+}%
+\def\tikz@@parse@regular#1#2#3{%
+ \pgfutil@ifnextchar[{% Uh oh! An array index.
+ \tikz@@@parse@regular#1{#2}{#3}}%
+ {\tikz@@@parse@regular#1{#2}{{#3}}}}%
+
+% Originally \def\tikz@parse@regular#1(#2,#3){%
+%
+\def\tikz@@@parse@regular#1#2#3){%
+ \pgfutil@in@,{#3}%
+ \ifpgfutil@in@%
+ \tikz@parse@splitxyz{#1}{#2}#3,%
+ \else%
+ \tikz@checkunit{#2}%
+ \iftikz@isdimension%
+ \tikz@checkunit{#3}%
+ \iftikz@isdimension%
+ \def\pgfutil@next{#1{\pgfpoint{#2}{#3}}}%
+ \else%
+ \def\pgfutil@next{#1{\pgfpointadd{\pgfpoint{#2}{0pt}}{\pgfpointxy{0}{#3}}}}%
+ \fi%
+ \else%
+ \tikz@checkunit{#3}%
+ \iftikz@isdimension%
+ \def\pgfutil@next{#1{\pgfpointadd{\pgfpoint{0pt}{#3}}{\pgfpointxy{#2}{0}}}}%
+ \else%
+ \def\pgfutil@next{#1{\pgfpointxy{#2}{#3}}}%
+ \fi%
+ \fi%
+ \fi%
+ \pgfutil@next%
+}%
+
+\def\tikz@parse@splitxyz#1#2#3,#4,{%
+ \def\pgfutil@next{#1{\pgfpointxyz{#2}{#3}{#4}}}%
+}%
+
+\def\tikz@coordinate@text{coordinate}%
+
+\def\tikz@parse@node#1(#2){%
+ \pgfutil@in@.{#2}% Ok, flag this
+ \ifpgfutil@in@
+ \tikz@calc@anchor#2\tikz@stop%
+ \else%
+ \tikz@calc@anchor#2.center\tikz@stop% to be on the save side, in
+ % case iftikz@shapeborder is ignored...
+ \expandafter\ifx\csname pgf@sh@ns@\tikz@pp@name{#2}\endcsname\tikz@coordinate@text%
+ \else
+ \tikz@shapebordertrue%
+ \def\tikz@shapeborder@name{\tikz@pp@name{#2}}%
+ \fi%
+ \fi%
+ \expandafter\let\expandafter\tikz@declared@coordinate\csname tikz@dcl@coord@\tikz@pp@name{#2}\endcsname
+ \edef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \tikz@marshal%
+}%
+
+\def\tikz@calc@anchor#1.#2\tikz@stop{%
+ \pgfpointanchor{\tikz@pp@name{#1}}{#2}%
+}%
+
+
+\def\tikz@parse@hv#1(#2){%
+ \pgfutil@in@{ -| }{#2}%
+ \ifpgfutil@in@%
+ \let\tikz@next=\tikz@parse@hvboth%
+ \else%
+ \pgfutil@in@{ -|}{#2}%
+ \ifpgfutil@in@%
+ \let\tikz@next=\tikz@parse@hvleft%
+ \else%
+ \pgfutil@in@{-| }{#2}%
+ \ifpgfutil@in@%
+ \let\tikz@next=\tikz@parse@hvright%
+ \else%
+ \let\tikz@next=\tikz@parse@hvdone%
+ \fi%
+ \fi%
+ \fi%
+ \tikz@next#1(#2)}%
+\def\tikz@parse@hvboth#1(#2 -| #3){\tikz@parse@vhdone#1({#3}|-{#2})}%
+\def\tikz@parse@hvleft#1(#2 -|#3){\tikz@parse@vhdone#1({#3}|-{#2})}%
+\def\tikz@parse@hvright#1(#2-| #3){\tikz@parse@vhdone#1({#3}|-{#2})}%
+\def\tikz@parse@hvdone#1(#2-|#3){\tikz@parse@vhdone#1({#3}|-{#2})}%
+
+\def\tikz@parse@vh#1(#2){%
+ \pgfutil@in@{ |- }{#2}%
+ \ifpgfutil@in@%
+ \let\tikz@next=\tikz@parse@vhboth%
+ \else%
+ \pgfutil@in@{ |-}{#2}%
+ \ifpgfutil@in@%
+ \let\tikz@next=\tikz@parse@vhleft%
+ \else%
+ \pgfutil@in@{|- }{#2}%
+ \ifpgfutil@in@%
+ \let\tikz@next=\tikz@parse@vhright%
+ \else%
+ \let\tikz@next=\tikz@parse@vhdone%
+ \fi%
+ \fi%
+ \fi%
+ \tikz@next#1(#2)}%
+\def\tikz@parse@vhboth#1(#2 |- #3){\tikz@parse@vhdone#1({#2}|-{#3})}%
+\def\tikz@parse@vhleft#1(#2 |-#3){\tikz@parse@vhdone#1({#2}|-{#3})}%
+\def\tikz@parse@vhright#1(#2|- #3){\tikz@parse@vhdone#1({#2}|-{#3})}%
+\def\tikz@parse@vhdone#1(#2|-#3){%
+ {%
+ \tikz@@@scan@@absolute\tikz@parse@vh@mid(#2)%
+ \tikz@@@scan@@absolute\tikz@parse@vh@end(#3)%
+ \xdef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}}%
+ }%
+ \tikz@marshal%
+}%
+\def\tikz@parse@vh@mid#1{\pgf@process{#1}\pgf@xa=\pgf@x}%
+\def\tikz@parse@vh@end#1{\pgf@process{#1}\pgf@ya=\pgf@y}%
+
+\def\tikz@parse@intersection#1(intersection{%
+ \pgfutil@ifnextchar o{%
+ \tikz@parse@main@intersection#1 1%
+ }{%
+ \tikz@parse@main@intersection#1%
+ }%
+}%
+\def\tikz@parse@main@intersection#1#2of #3 and #4){%
+ \tikzset{cs/solution=#2}%
+ \pgfutil@in@{--}{#3}%
+ \ifpgfutil@in@%
+ \tikz@reparse@line{first}#3\pgf@stop%
+ \else%
+ \tikzset{cs/first node=#3}%
+ \fi%
+ \pgfutil@in@{--}{#4}%
+ \ifpgfutil@in@%
+ \tikz@reparse@line{second}#4\pgf@stop%
+ \else%
+ \tikzset{cs/second node=#4}%
+ \fi%
+ \tikz@parse@cs@intersection()% advanced hackery...
+ \edef\pgf@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \pgf@marshal%
+}%
+\def\tikz@reparse@line#1#2--#3\pgf@stop{%
+ \tikzset{cs/#1 line={(#2)--(#3)}}%
+}%
+
+
+\def\tikz@parse@intersection@a#1{\pgf@process{#1}\pgf@xa=\pgf@x\pgf@ya=\pgf@y}%
+\def\tikz@parse@intersection@b#1{\pgf@process{#1}\pgf@xb=\pgf@x\pgf@yb=\pgf@y}%
+
+\def\tikz@scan@relative#1+{%
+ \pgfutil@ifnextchar+{\tikz@scan@plusplus#1}{\tikz@scan@oneplus#1}}%
+
+\def\tikz@scan@plusplus#1+{%
+ \def\tikz@doafter{#1}%
+ \tikz@scan@absolute\tikz@add%
+}%
+\def\tikz@add#1{%
+ \tikz@doafter{\pgfpointadd{#1}{\tikz@last@position@saved}}%
+}%
+\def\tikz@scan@oneplus#1{%
+ \def\tikz@doafter{#1}%
+ \tikz@updatecurrentfalse%
+ \tikz@scan@absolute\tikz@add%
+}%
+
+
+
+%
+% Quote handling
+%
+
+\let\tikz@enable@node@quotes\relax
+\let\tikz@enable@edge@quotes\relax
+\let\tikz@enable@pic@quotes\relax
+
+
+
+% Loading further libraries
+
+% Include a library file.
+%
+% #1 = List of names of library file.
+%
+% Description:
+%
+% This command includes a list of TikZ library files. For each file X in the
+% list, the file tikzlibraryX.code.tex is included, provided this has
+% not been done earlier.
+%
+% For the convenience of Context users, both round and square brackets
+% are possible for the argument.
+%
+% If no file tikzlibraryX.code.tex exists, the file
+% pgflibraryX.code.tex is tried instead. If this file, also, does not
+% exist, an error message is printed.
+%
+% Example:
+%
+% \usetikzlibrary{arrows}
+% \usetikzlibrary[patterns,topaths]
+
+\def\usetikzlibrary{\pgfutil@ifnextchar[{\use@tikzlibrary}{\use@@tikzlibrary}}%}%
+\def\use@tikzlibrary[#1]{\use@@tikzlibrary{#1}}%
+\def\use@@tikzlibrary#1{%
+ \edef\pgf@list{#1}%
+ \pgfutil@for\pgf@temp:=\pgf@list\do{%
+ \expandafter\pgfkeys@spdef\expandafter\pgf@temp\expandafter{\pgf@temp}%
+ \ifx\pgf@temp\pgfutil@empty
+ \else
+ \expandafter\ifx\csname tikz@library@\pgf@temp @loaded\endcsname\relax%
+ \expandafter\global\expandafter\let\csname tikz@library@\pgf@temp @loaded\endcsname=\pgfutil@empty%
+ \expandafter\edef\csname tikz@library@#1@atcode\endcsname{\the\catcode`\@}
+ \expandafter\edef\csname tikz@library@#1@barcode\endcsname{\the\catcode`\|}
+ \expandafter\edef\csname tikz@library@#1@dollarcode\endcsname{\the\catcode`\$}
+ \catcode`\@=11
+ \catcode`\|=12
+ \catcode`\$=3
+ \pgfutil@InputIfFileExists{tikzlibrary\pgf@temp.code.tex}{}{
+ \pgfutil@IfFileExists{pgflibrary\pgf@temp.code.tex}{%
+ \expandafter\usepgflibrary\expandafter{\pgf@temp}%
+ }{%
+ \tikzerror{I did not find the tikz library
+ '\pgf@temp'. I looked for files named
+ tikzlibrary\pgf@temp.code.tex and
+ pgflibrary\pgf@temp.code.tex, but neither
+ could be found in the current texmf trees.}
+ }}%
+ \catcode`\@=\csname tikz@library@#1@atcode\endcsname
+ \catcode`\|=\csname tikz@library@#1@barcode\endcsname
+ \catcode`\$=\csname tikz@library@#1@dollarcode\endcsname
+ \fi%
+ \fi
+ }%
+}%
+
+
+% Always-present libraries:
+
+\usetikzlibrary{topaths}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikz.sty b/graphics/pgf/base/tex/tikz.sty
new file mode 100644
index 0000000000..d3b8ed6e7f
--- /dev/null
+++ b/graphics/pgf/base/tex/tikz.sty
@@ -0,0 +1,15 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+
+\RequirePackage{pgf,pgffor} % calc and xkeyval have been removed!
+
+\input{tikz.code.tex}
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikz.tex b/graphics/pgf/base/tex/tikz.tex
new file mode 100644
index 0000000000..30aa11fa07
--- /dev/null
+++ b/graphics/pgf/base/tex/tikz.tex
@@ -0,0 +1,23 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+% This file is tikz.tex
+
+\edef\tikzatcode{\the\catcode`\@}
+\catcode`\@=11
+
+%\input xkeyval.tex % no longer used/needed
+
+\input pgf.tex
+\input pgffor.tex
+\input tikz.code.tex
+
+\catcode`\@=\tikzatcode
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzexternal.sty b/graphics/pgf/base/tex/tikzexternal.sty
new file mode 100644
index 0000000000..4f9d31572f
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzexternal.sty
@@ -0,0 +1,143 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% 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.
+%
+% In addition to the above licenses, this particular file may also be
+% directly inlined into other documents and this copyright notice may
+% be removed. Additionally, when you inline this file, you may modify
+% it as needed and you may remove comments.
+%
+% This file is intended to be distributed or even inlined into a file
+% when a document needs to be typeset on a system that does not have
+% pgf/TikZ installed.
+%
+% It replaces \tikzpicture/ \endtikzpicture and \tikz and invokes the
+% \includegraphics with the correct file name instead.
+
+\RequirePackage{graphicx}
+
+\toksdef\t@tikzexternal@tmpa=0
+\toksdef\t@tikzexternal@tmpb=1
+
+\def\tikzexternalize{\@ifnextchar[{\tikzexternalize@opt}{\tikzexternalize@opt[]}}%
+\def\tikzexternalize@opt[#1]{\@ifnextchar\bgroup{\def\tikzexternal@realjob}{\let\tikzexternal@realjob=\jobname}}%
+
+\def\tikzsetnextfilename#1{\gdef\tikzexternal@nextfile{#1}}
+\def\tikzsetexternalprefix#1{\def\tikzexternal@filenameprefix{#1}}
+\def\tikzsetfigurename#1{\def\tikzexternal@figurename{#1}}%
+\def\tikzappendtofigurename#1{\expandafter\def\expandafter\tikzexternal@figurename\expandafter{\tikzexternal@figurename #1}}%
+\tikzsetnextfilename{}
+\tikzsetexternalprefix{}
+\tikzsetfigurename{\tikzexternal@realjob-figure}%
+
+\long\def\tikzpicture#1\end#2{% collect every thing up to \end{tikzpicture}
+ \def\tikzexternal@laTeX@collectpicture@@{#2}%
+ \ifx\tikzexternal@laTeX@collectpicture@@\tikzexternal@laTeX@tikzpicturestring
+ \tikzexternal@image
+ \end{tikzpicture}%
+ \else
+ \expandafter
+ \tikzpicture
+ \fi
+}%
+\def\endtikzpicture{}
+\def\tikzexternal@laTeX@tikzpicturestring{tikzpicture}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Replacement for \tikz short command:
+\def\tikz{\@ifnextchar[{\tikz@opt}{\tikz@opt[]}}
+\def\tikz@opt[#1]{\@ifnextchar\bgroup{\tikz@opt@{#1}}{\tikz@opt@@{#1}}}
+\def\tikz@opt@#1#2{\tikz@opt@process{#1}{#2}}
+\def\tikz@opt@@#1{%
+ \def\tikz@next{\tikz@collectnormalsemicolon{#1}}%
+ \ifnum\the\catcode`\;=\active\relax%
+ \def\tikz@next{\tikz@collectactivesemicolon{#1}}%
+ \fi%
+ \tikz@next}
+\def\tikz@collectnormalsemicolon#1#2;{\tikz@opt@process{#1}{#2;}}
+{
+ \catcode`\;=\active
+ \gdef\tikz@collectactivesemicolon#1#2;{%
+ \tikz@opt@process{#1}{#2;}%
+ }
+}
+\def\tikz@opt@process#1#2{\tikzexternal@image}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\tikzexternal@image{%
+ \leavevmode
+ \begingroup
+ \t@tikzexternal@tmpa=\expandafter{\tikzexternal@filenameprefix}%
+ \ifx\tikzexternal@nextfile\empty
+ \expandafter\ifx\csname c@tikzext@no@\tikzexternal@figurename\endcsname\relax
+ \expandafter\gdef\csname c@tikzext@no@\tikzexternal@figurename\endcsname{0}%
+ \fi
+ \t@tikzexternal@tmpb=\expandafter{\tikzexternal@figurename}%
+ \count0=\csname c@tikzext@no@\tikzexternal@figurename\endcsname
+ \xdef\tikzexternal@curfilename{\the\t@tikzexternal@tmpa\the\t@tikzexternal@tmpb\the\count0 }%
+ \advance\count0 by1\relax
+ \expandafter\xdef\csname c@tikzext@no@\tikzexternal@figurename\endcsname{\the\count0 }%
+ \else
+ \t@tikzexternal@tmpb=\expandafter{\tikzexternal@nextfile}%
+ \xdef\tikzexternal@curfilename{\the\t@tikzexternal@tmpa\the\t@tikzexternal@tmpb}%
+ \fi
+ \endgroup
+ \global\let\tikzexternal@nextfile=\empty
+ \pgfincludeexternalgraphics\tikzexternal@curfilename
+}%
+\def\tikzset#1{}\def\pgfkeys#1{}\def\pgfqkeys#1#2{}
+\long\def\beginpgfgraphicnamed#1#2\endpgfgraphicnamed{\pgfincludeexternalgraphics{#1}}
+\def\tikzifinpicture#1#2{#2}
+\def\pgfincludeexternalgraphics#1{%
+ \begingroup
+ \pgfexternalreaddpth{#1}%
+ \setbox1=\hbox{\includegraphics{#1}}%
+ \ifdim\pgfretval=0pt
+ \box1
+ \else
+ \dimen0=\pgfretval\relax
+ \hbox{\lower\dimen0 \box1 }%
+ \fi
+ \endgroup
+}
+\newread\r@pgf@reada
+\def\pgfexternalreaddpth#1{%
+ \edef\pgfexternalreaddpth@restore{%
+ \noexpand\endlinechar=\the\endlinechar\space
+ \noexpand\catcode`\noexpand\@=\the\catcode`\@\space
+ }%
+ \def\pgfretval{0pt}%
+ \endlinechar=-1 % suppress white space at end
+ \catcode`\@=11
+ \openin\r@pgf@reada=#1.dpth
+ \pgfincludeexternalgraphics@read@dpth
+ \pgfexternalreaddpth@restore
+}%
+\def\pgfincludeexternalgraphics@read@dpth{%
+ \ifeof\r@pgf@reada
+ \closein\r@pgf@reada
+ \else
+ \read\r@pgf@reada to\pgfincludeexternalgraphics@auxline
+ \ifx\pgfincludeexternalgraphics@auxline\empty
+ \else
+ \expandafter\pgfincludeexternalgraphics@read@dpth@line\pgfincludeexternalgraphics@auxline\pgfincludeexternalgraphics@read@dpth@line@EOI
+ \fi
+ \expandafter\pgfincludeexternalgraphics@read@dpth
+ \fi
+}%
+\long\def\pgfincludeexternalgraphics@read@dpth@line#1#2\pgfincludeexternalgraphics@read@dpth@line@EOI{%
+ \ifcat\noexpand#1\relax
+ \if@filesw
+ {\toks0={#1#2}%
+ \immediate\write\@auxout{\noexpand\def\noexpand\dpthimport{\the\toks0 }\noexpand\dpthimport }%
+ }%
+ \fi
+ \else%
+ \def\pgfretval{#1#2}%
+ \fi
+}%
diff --git a/graphics/pgf/base/tex/tikzexternalshared.code.tex b/graphics/pgf/base/tex/tikzexternalshared.code.tex
new file mode 100644
index 0000000000..55b387f13c
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzexternalshared.code.tex
@@ -0,0 +1,1711 @@
+% Copyright 2008-2010 by Christian Feuersaenger
+%
+% 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.
+%
+% ******************************
+% This here is the shared implementation of TeX-dialect specific files
+% tikzlibraryexternal.code.tex
+% ******************************
+%
+%
+% This file provides a high-level automatic export feature for tikz pictures.
+% It allows to export EACH SINGLE FIGURE into a separate PDF.
+%
+% The simplest way is to use the 'convert with system call' option; it simply converts every figure using the write18 method. If that is not possible, a list of figure file names is generated and you need to generate these figures manually (or with a script).
+%
+%
+% It replaces \tikzpicture/ \endtikzpicture and \tikz and invokes \beginpgfgraphicnamed ... \endpgfgraphicnamed
+% commands if necessary.
+
+% handle with extreme care and only in small, local groups:
+\toksdef\t@tikzexternal@tmpa=0
+\toksdef\t@tikzexternal@tmpb=1
+
+\newif\iftikzexternal@nestedflag
+\newif\iftikzexternal@verboseuptodate
+\newif\iftikzexternal@verboseio
+\newif\iftikzexternal@genfigurelist
+\newif\iftikzexternal@onlynamed
+\newif\iftikzexternal@file@isuptodate
+\newif\iftikzexternal@force@remake
+\newif\iftikzexternal@optimize
+\newif\iftikzexternal@export@enabled
+\tikzexternal@export@enabledtrue
+
+% must be numeric!
+\gdef\c@tikzexternal@version{2}
+
+% This 'if' can be used as part of the public user interface.
+%
+% It is set by the 'remake next' key.
+%
+% It disables any up-to-date checks for the *next* picture, forcing a
+% remake of it.
+%
+% It applies only to *one* picture.
+\newif\iftikzexternalremakenext
+\newif\iftikzexternal@verbose@optimize
+\tikzexternal@verbose@optimizetrue
+
+% A global boolean which can be used to skip single figures.
+\newif\iftikzexternalexportnext
+\tikzexternalexportnexttrue
+
+% Invokes '#1' if the external lib is currently externalizing
+% something and '#2' if not.
+%
+% This command must be called *after* \tikzexternalize.
+\def\tikzifexternalizing#1#2{%
+ \ifpgf@external@grabshipout #1\else #2\fi
+}%
+% Invokes '#1' if the external lib is currently externalizing the NEXT FOLLOWING
+% tikzpicture. It invokes '#2' if that is not the case.
+\def\tikzifexternalizingnext#1#2{%
+ \ifpgf@external@grabshipout
+ \tikzexternalgetnextfilename\tikzexternal@temp
+ \tikzifexternaljobnamematches\tikzexternal@temp{#1}{#2}%
+ \else
+ #2%
+ \fi
+}%
+% Invokes '#1' if the external lib is currently externalizing the
+% current picture. It invokes '#2' if that is not the case.
+%
+% If the command is invoked outside of a picture, '#2' will be
+% invoked.
+\def\tikzifexternalizingcurrent#1#2{%
+ \ifpgf@external@grabshipout
+ \tikzexternalgetcurrentfilename\tikzexternal@temp
+ \ifx\tikzexternal@temp\pgfutil@empty
+ #2%
+ \else
+ \tikzifexternaljobnamematches\tikzexternal@temp{#1}{#2}%
+ \fi
+ \else
+ #2%
+ \fi
+}%
+
+% Invokes '#2' if \jobname equals '#1' and '#3' if not.
+% I suppose that '#1' is a macro containing the file name.
+%
+\def\tikzifexternaljobnamematches#1#2#3{%
+ \edef\pgf@tempa{\expandafter\string\csname#1\endcsname}%
+ \edef\pgf@tempb{\expandafter\string\csname\pgfactualjobname\endcsname}%
+ \ifx\pgf@tempa\pgf@tempb #2\else#3 \fi%
+}%
+
+
+\pgfutil@IfUndefined{pdfshellescape}{%
+ % let's hope that \usepackage{pdftexcmds} has been used...
+ \pgfutil@IfUndefined{pdf@shellescape}{%
+ \def\tikzexternalcheckshellescape{0}%
+ }{%
+ \let\tikzexternalcheckshellescape=\pdf@shellescape
+ }%
+}{%
+ \let\tikzexternalcheckshellescape=\pdfshellescape
+}%
+\ifnum\tikzexternalcheckshellescape=1
+ \def\tikzexternalcheckshellescape{\pgfkeysvalueof{/tikz/external/shell escape}\space}%
+\else
+ \def\tikzexternalcheckshellescape{}%
+\fi
+
+\newif\iftikzexternal@auto@detect@jobname
+
+\pgfqkeys{/tikz/external}{
+ figure list/.is if=tikzexternal@genfigurelist,
+ aux in dpth/.style={/pgf/images/aux in dpth=#1},%
+ disable dependency files/.code={%
+ \let\tikzexternalfiledependsonfile@ACTIVE=\tikzexternalfiledependsonfile
+ },
+ % 'mode' applies only if \jobname==real job name.
+ mode/.is choice,
+ mode/only graphics/.code = {%
+ \def\tikzexternal@opmode{0}%
+ \pgfkeysalso{/pgf/images/aux in dpth=true}%
+ },
+ mode/no graphics/.code = {\def\tikzexternal@opmode{1}},
+ % an alias for 'no graphics:'
+ mode/only pictures/.code = {\def\tikzexternal@opmode{1}},
+ mode/graphics if exists/.code= {%
+ \def\tikzexternal@opmode{2}%
+ \pgfkeysalso{/pgf/images/aux in dpth=true}%
+ },
+ mode/list only/.code = {\def\tikzexternal@opmode{3}\tikzexternal@genfigurelisttrue},
+ mode/convert with system call/.code={%
+ \def\tikzexternal@opmode{4}%
+ \pgfkeysalso{/tikz/external/figure list=false,/pgf/images/aux in dpth=true}%
+ },
+ mode/list and make/.code = {%
+ \def\tikzexternal@opmode{5}%
+ \pgfkeysalso{/tikz/external/figure list=true,/pgf/images/aux in dpth=true}%
+ },
+ mode=convert with system call,
+ force remake/.is if=tikzexternal@force@remake,
+ force remake/.default=true,
+ %
+ % DEPRECATED: this here will work out-of-the box (provided that
+ % 'aux in dpth' is active):
+ failed ref warnings for/.initial={\ref,\cite,\pageref},
+ export next/.is if=tikzexternalexportnext,
+ export/.is if=tikzexternal@export@enabled,
+ remake next/.is if=tikzexternalremakenext,
+ remake next/.default=true,
+ verbose IO/.is if=tikzexternal@verboseio,
+ verbose IO/.default=true,
+ verbose IO=true,
+ verbose optimize/.is if=tikzexternal@verbose@optimize,
+ verbose up to date/.is if=tikzexternal@verboseuptodate,
+ verbose/.style={
+ verbose IO=#1,
+ verbose optimize=#1,
+ verbose up to date=#1,
+ },
+ shell escape/.initial=-shell-escape,
+ read main aux/.is if=pgfexternalreadmainaux,
+ image discarded text/.initial={%
+ [[ \textsc{Image Discarded Due To} \texttt{`/tikz/external/%
+ \ifcase\tikzexternal@opmode\relax
+ mode=only graphics%
+ \or
+ mode=no graphics%
+ \or
+ mode=graphics if exists%
+ \or
+ mode=list only%
+ \or
+ mode=convert with system call%
+ \or
+ mode=list and make%
+ \fi
+ '}~]]%
+ \pgfutil@ifundefined{tikzexternal@warning@at@end}{%
+ \pgfutil@ifundefined{AtEndDocument}{}{%
+ \AtEndDocument{%
+ \message{! Package tikz Warning: Some images are not up-to-date and need to be generated. }%
+ }%
+ }%
+ \gdef\tikzexternal@warning@at@end{1}%
+ }{}%
+ },
+ optimize/.is choice,
+ optimize/true/.code={%
+ \tikzexternal@optimizetrue
+ \iftikzexternal@optimize
+ \ifpgf@external@grabshipout
+ % we have already started the externalization! Install
+ % optimization commands to activate the new one:
+ \tikzexternal@optimize@REPLACE
+ \fi
+ \fi
+ },
+ optimize/false/.code={%
+ \tikzexternal@optimizefalse%
+ \tikzexternal@optimize@RESTORE
+ },%
+ optimize=true,
+ optimize away text/.code={[ \textsc{\string#1\ optimized away because it does not contribute to exported PDF}]},
+ optimize/install/.code={},%
+ optimize/restore/.code={},%
+ % Expects two arguments, the command name and (optionally) a count
+ % of expected arguments.
+ % Example:
+ % 'optimize command away=\includegraphics'
+ % 'optimize command away={\mycommand}{3}'
+ %
+ % It accepts commands which have '[]' arguments and whose first
+ % argument always begins with '{'.
+ %
+ % #1: the command name
+ % #2: either empty or a number of EXPECTED arguments. It will be checked
+ % for one optional argument in square brackets as well.
+ optimize command away/.code 2 args={%
+ \expandafter\global\expandafter\let\csname\string#1@ORIG\endcsname=#1%
+ \pgfkeysalso{%
+ /tikz/external/optimize/install/.append code={%
+ \def#1{\tikzexternal@optimize@away@cmd{#1}{#2}}%
+ },
+ /tikz/external/optimize/restore/.append code={%
+ \expandafter\let\expandafter#1\csname\string#1@ORIG\endcsname
+ }
+ }%
+ \iftikzexternal@optimize
+ \ifpgf@external@grabshipout
+ % we have already started the externalization! Install
+ % optimization commands to activate the new one:
+ \tikzexternal@optimize@REPLACE
+ \fi
+ \fi
+ },
+ optimize command away=\includegraphics,
+ optimize command away=\pgfincludeexternalgraphics,
+ % EXPERIMENTAL (UNTESTED):
+ optimize latex env away/.code={%
+ \expandafter\let\expandafter\pgf@tempa\csname #1\endcsname
+ \expandafter\global\expandafter\let\csname #1@ORIG\endcsname=\pgf@tempa%
+ \pgfkeysalso{%
+ /tikz/external/optimize/install/.append code={%
+ \pgfutil@namedef{#1}{\tikzexternal@optimize@away@latex@env{#1}}%
+ },
+ /tikz/external/optimize/restore/.append code={%
+ \pgfutil@namelet{#1}{#1@ORIG}%
+ }%
+ }%
+ },
+ only named/.is if=tikzexternal@onlynamed,
+ only named/.default=true,
+ figure name/.initial=\tikzexternal@realjob-figure,
+ reset counter/.code={%
+ \expandafter\gdef\csname c@tikzext@no@#1\endcsname{0}%
+ },%
+ prefix/.code={\tikzsetexternalprefix{#1}},
+ up to date check/.is choice,
+ up to date check/simple/.code={\def\tikzexternal@uptodate@mode{0}},
+ % md5 relies on \pdfmdfivesum of pdftex. It uses 'diff' as fallback if we do not have that command.
+ up to date check/md5/.code={\def\tikzexternal@uptodate@mode{1}},
+ up to date check/diff/.code={\def\tikzexternal@uptodate@mode{2}},
+ up to date check=md5,
+}
+
+\expandafter\def\csname tikzexternal@driver@pgfsys-luatex.def\endcsname{%
+ \pgfkeyssetvalue{/tikz/external/system call}{%
+ lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"%
+ }%
+}%
+\expandafter\def\csname tikzexternal@driver@pgfsys-pdftex.def\endcsname{%
+ \pgfutil@IfUndefined{directlua}{%
+ \pgfkeyssetvalue{/tikz/external/system call}{%
+ pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"%
+ }%
+ }{%
+ \pgfkeyssetvalue{/tikz/external/system call}{%
+ lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"%
+ }%
+ }%
+}%
+%--------------------------------------------------
+% \expandafter\def\csname tikzexternal@driver@pgfsys-dvipdfm.def\endcsname{%
+% \pgfkeyssetvalue{/tikz/external/system call}{%
+% latex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"%
+% && dvipdfm "\image".dvi %
+% }%
+% }%
+%--------------------------------------------------
+\expandafter\def\csname tikzexternal@driver@pgfsys-xetex.def\endcsname{%
+ \pgfkeyssetvalue{/tikz/external/system call}{%
+ xelatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"%
+ }%
+}%
+\expandafter\def\csname tikzexternal@driver@pgfsys-dvips.def\endcsname{%
+ \pgfkeyssetvalue{/tikz/external/system call}{%
+ latex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource" %
+ && dvips -o "\image".ps "\image".dvi %
+ }%
+}%
+
+% Auto-select a suitable default value fo 'system call':
+\pgfutil@ifundefined{tikzexternal@driver@\pgfsysdriver}{%
+ % fallback. We do not know the driver here.
+ \csname tikzexternal@driver@pgfsys-pdftex.def\endcsname
+}{%
+ \csname tikzexternal@driver@\pgfsysdriver\endcsname
+}%
+
+
+\def\tikzsetfigurename#1{\pgfkeyssetvalue{/tikz/external/figure name}{#1}}%
+\def\tikzappendtofigurename#1{\pgfkeys{/tikz/external/figure name/.add={}{#1}}}
+
+% This method sets the file name prefix used for every import/export.
+%
+% It is invoked by the '/tikz/external/prefix' key.
+\def\tikzsetexternalprefix#1{\def\tikzexternal@filenameprefix{#1}}
+\tikzsetexternalprefix{}
+
+% This method initialises automatic externalization.
+%
+% The command does need any argument, but it has two optional ones:
+%
+% 1. \tikzexternalize[<options>]
+%
+% 2. \tikzexternalize{<real job's name>}
+%
+% 3. \tikzexternalize[<options>]{<real job's name>}
+%
+% The <real job's name> is the job's file name, without the suffix
+% .tex .
+% If the <real job's name> is omitted, it will be deduced
+% automatically.
+%
+% The effect is:
+% 1. automatically surround EVERY tikzpicture by \beginpgfgraphicnamed % sections.
+% 2. in case that the job's real name and the current \jobname differ,
+% it will process ONLY the matching tikzpicture.
+\def\tikzexternalize{%
+ \pgfutil@ifnextchar[{%
+ \tikzexternalize@opt
+ }{%
+ \tikzexternalize@opt[]%
+ }%
+}%
+\def\tikzexternalize@opt[#1]{%
+ \pgfutil@ifnextchar\bgroup{%
+ \tikzexternal@auto@detect@jobnamefalse
+ \tikzexternalize@opt@withname[#1]%
+ }{%
+ \tikzexternal@auto@detect@jobnametrue
+ \pgfutil@ifundefined{tikzexternalrealjob}{%
+ % ok, \tikzexternalrealjob is not known.
+ % Assume we are currently *not* externalizing.
+ \let\tikzexternalrealjob=\jobname
+ }{}%
+ \def\pgf@tempa{\tikzexternalize@opt@withname[#1]}%
+ \expandafter\pgf@tempa\expandafter{\tikzexternalrealjob}%
+ }%
+}%
+\def\tikzexternalize@opt@withname[#1]#2{%
+ \gdef\tikzexternalrealjob{#2}%
+ \if1\tikzexternalize@hasbeencalled
+ \else
+ \pgfqkeys{/tikz/external}{#1}%
+ \def\tikzexternal@realjob{#2}%
+ \tikzexternalauxlock@init
+ \pgfrealjobname{#2}%
+ \def\tikzexternalize@hasbeencalled{1}%
+ \tikzexternalenable
+ \def\tikzexternal@determineimgextension##1:##2\relax{\gdef\tikzexternalimgextension{##1}}%
+ \xdef\pgf@tempa{\pgfsys@imagesuffixlist}%
+ \expandafter\tikzexternal@determineimgextension\pgf@tempa:\relax
+ \pgfutil@ifundefined{includegraphics}{%
+ \let\tikzexternal@orig@includegraphics=\relax
+ }{%
+ \let\tikzexternal@orig@includegraphics=\includegraphics
+ }%
+ \let\tikzexternalfiledependsonfile=\tikzexternalfiledependsonfile@ACTIVE
+ \let\tikzpicturedependsonfile=\tikzpicturedependsonfile@ACTIVE
+ \fi
+}
+\def\tikzexternalize@hasbeencalled{0}%
+
+\def\tikzifexternalizehasbeencalled#1#2{%
+ \if1\tikzexternalize@hasbeencalled
+ #1%
+ \else
+ #2%
+ \fi
+}%
+
+% If mode=`convert with system call', the boolean \ifpgfexternalreadmainaux
+% will be set depending on the current lock file.
+%
+% The idea is as follows: Suppose
+% pdflatex -shell-escape mainjob.tex
+% is running.
+%
+% While it runs,
+% a) it modifies its mainjob.aux file,
+% b) it issues pdflatex -jobname mainjob-figure0 mainjob.tex .
+%
+% The call (b) will try to read mainjob.aux in order to resolve \ref
+% commands. This may fail since the aux
+% file is not complete; it may be subject to output buffering. To
+% avoid such failure, a locking mechanism is established.
+%
+% The locking mechanisms causes (a) to write a lock command into
+% mainjob.auxlock
+% just before (b) is called. Then, (b) will check it. After (b) has
+% completed, the lock will be reset.
+%
+% Thus: mode=convert with system call does NOT support \ref commands
+% inside of images. You will need to call the externalization command
+% manually. In this case, it should work.
+%
+% The lock file allows to detect automatically whether an image is created by
+% 'convert with system call' or if the user issued the required command manually.
+%
+% @PRECONDITION : this command must be invoked AFTER
+% \tikzexternal@realjob has been defined but BEFORE \pgfrealjobname is
+% called.
+%
+% @POSTCONDITION : If \ifpgfexternalreadmainaux=\iffalse, we won't do
+% anything. Otherwise, it will be changed depending for 'mode=convert
+% with system call' if necessary.
+\def\tikzexternalauxlock@init{%
+ \if4\tikzexternal@opmode
+ % mode=convert with system call
+ \ifpgfexternalreadmainaux
+ % ohoh. This case needs care because the main.aux might
+ % not be ready at this time!
+ % check.
+ %
+ \edef\pgf@tempa{\expandafter\string\csname\tikzexternal@realjob\endcsname}%
+ \edef\pgf@tempb{\expandafter\string\csname\jobname\endcsname}%
+ \ifx\pgf@tempa\pgf@tempb
+ % we are *not* externalizing. Set lock into its
+ % initial "unlocked" state.
+ \tikzexternalauxlock@setlock{0}%
+ \else
+ % we are externalizing. Query the lock's value:
+ \tikzexternalauxlock@getlockvalue
+ \if1\tikzexternallocked
+ \pgfexternalreadmainauxfalse
+ % the main .aux file won't be read right now.
+ \else
+ \pgfexternalreadmainauxtrue
+ \fi
+ \fi
+ \else
+ % NO-OP. We won't read the main aux file anyway.
+ \def\tikzexternalauxlock@setlock##1{}%
+ \fi
+ \fi
+}
+% defines \tikzexternallocked to be either 0 or 1, depending on the
+% lock file.
+\def\tikzexternalauxlock@getlockvalue{%
+ \openin\r@pgf@reada=\tikzexternal@realjob.auxlock
+ \ifeof\r@pgf@reada
+ % no lock file. Unlock.
+ \def\tikzexternallocked{0}%
+ \else
+ % read first line...
+ \read\r@pgf@reada to\pgf@tempa
+ % ... and execute it.
+ \pgf@tempa
+ % it should contain a definition of \tikzexternallocked. If
+ % not, lock it anyway.
+ \pgfutil@ifundefined
+ {tikzexternallocked}
+ {\def\tikzexternallocked{1}}%
+ {}%
+ \fi
+ \closein\r@pgf@reada
+}%
+\def\tikzexternalauxlock@setlock#1{%
+ \immediate\openout\w@pgf@writea=\tikzexternal@realjob.auxlock
+ \immediate\write\w@pgf@writea{\noexpand\def\noexpand\tikzexternallocked{#1}}%
+ \immediate\closeout\w@pgf@writea
+}
+
+
+% this is a hook into pgfcoreexternal.code.tex:
+\def\pgf@external@grab@refundefinedtrue@code{%
+ \gdef\noexpand\tikzexternal@systemcall@reschedule@to@end@document{1}%
+}%
+
+% Expands to the default image extension (it is set by
+% \tikzexternalize).
+%
+% This image extension may not resemble the correct one; you may need
+% to overwrite this macro *after* \tikzexternalize in this case.
+%
+% The default setting uses the first registered image extension.
+\def\tikzexternalimgextension{}%
+
+% can be used to (temporarily) disable the externalization.
+\def\tikzexternaldisable{%
+ \let\tikz=\tikzexternal@origtikz
+ \tikzexternal@TEXDIALECT@restore@picture
+ \pgfutil@ifundefined{tikzexternal@orig@tikzfadingfrompicture}
+ {}% NOP
+ {%
+ \let\tikzfadingfrompicture=\tikzexternal@orig@tikzfadingfrompicture
+ \let\endtikzfadingfrompicture=\tikzexternal@orig@endtikzfadingfrompicture
+ \let\tikzfading=\tikzexternal@orig@tikzfading
+ }%
+ \iftikzexternal@optimize
+ \ifpgf@external@grabshipout
+ \tikzexternal@optimize@RESTORE
+ \fi
+ \fi
+}%
+% re-enables externalization after a \tikzexternalizedisable.
+\def\tikzexternalenable{%
+ \if\tikzexternalize@hasbeencalled1%
+ \let\tikz=\tikzexternal@tikz@replacement
+ \tikzexternal@TEXDIALECT@installreplacement@picture
+ \pgfutil@ifundefined{tikzfadingfrompicture}%
+ {}% no special handling for 'fading lib'
+ {%
+ % oh, ok -- patch fading lib!
+ \pgfutil@ifundefined{tikzexternal@orig@tikzfadingfrompicture}{%
+ \let\tikzexternal@orig@tikzfadingfrompicture=\tikzfadingfrompicture
+ \let\tikzexternal@orig@endtikzfadingfrompicture=\endtikzfadingfrompicture
+ \let\tikzexternal@orig@tikzfading=\tikzfading
+ }{}%
+ \def\tikzfadingfrompicture{%
+ \begingroup
+ \tikzexternaldisable
+ \tikzexternal@orig@tikzfadingfrompicture}%
+ \def\endtikzfadingfrompicture{%
+ \tikzexternal@orig@endtikzfadingfrompicture
+ \endgroup}%
+ \def\tikzfading[##1]{%
+ \begingroup
+ \tikzexternaldisable
+ \tikzexternal@orig@tikzfading[##1]%
+ \endgroup}%
+ }%
+ \iftikzexternal@optimize
+ \ifpgf@external@grabshipout
+ \tikzexternal@optimize@REPLACE
+ \fi
+ \fi
+ \fi
+}%
+
+% Sets the filename for the next tikzpicture or \tikz shortcommand.
+%
+% It will *only* be used for the next picture.
+%
+% If you don't call \tikzsetnextfilename for a picture, a file name
+% will be assembled automatically.
+%
+% Please note that the global file prefix will be prepended anyway.
+\def\tikzsetnextfilename#1{\gdef\tikzexternal@nextfile{#1}}
+\tikzsetnextfilename{}
+
+
+% These are few TeX dialect-specific commands which need to be overridden when used with
+% something different than plain TeX:
+%
+% 1. this command collects a complete image into a macro, up to (but not including) the
+% final TeX-dialect specific end-image command.
+% This is really difficult for LaTeX because \end{tikzpicture} either involves dirty
+% catcode-hacks to parse the braces or an ugly loop which loops until it
+% finds \end followed by {tikzpicture}.
+%
+% #1: a macro which will be called with the collected environment contents.
+% all following tokens: the environment contents.
+\long\gdef\tikzexternal@TEXDIALECT@collectpicture#1#2\endtikzpicture{#1{#2}}
+%
+% 2. the following commands should expand to the TeX-dialect specific begin and end image command, i.e.
+% \tikzpicture / \endtikzpicture
+% or
+% \begin{tikzpicture} / \end{tikzpicture}
+% or
+% \starttikzpicture / \stoptikzpicture
+\def\tikzexternal@TEXDIALECT@begpicture{\tikzpicture}
+\def\tikzexternal@TEXDIALECT@endpicture{\endtikzpicture}%
+%
+% 3. This installs the replacement macros:
+\def\tikzexternal@TEXDIALECT@installreplacement@picture{%
+ \let\tikzpicture=\tikzexternal@tikzpicture@replacement
+}%
+\def\tikzexternal@TEXDIALECT@restore@picture{%
+ \let\tikzpicture=\tikzexternal@origpicture
+}%
+
+
+
+
+\let\tikzexternal@origtikz=\tikz
+\let\tikzexternal@origpicture=\tikzpicture
+\let\tikzexternal@origendpicture=\endtikzpicture
+\let\tikzexternal@curfilename=\relax
+
+% Replacement for '\tikzpicture'.
+%
+% There are two different states in which this method is applied:
+% - normal typesetting. Then, the 'mode' key controls its behavior.
+% - externalize mode (i.e. jobname != real job name). Then, it will
+% externalize the picture selected by 'jobname' (and only this picture).
+\def\tikzexternal@tikzpicture@replacement{%
+ \leavevmode
+ \global\tikzexternal@file@isuptodatetrue% may be set to false during checks.
+ \tikzexternal@getnextfilename\tikzexternal@curfilename
+ \ifx\tikzexternal@curfilename\pgfutil@empty
+ \ifpgf@external@grabshipout
+ % This picture won't be externalized.
+ % But maybe we can optimize it away:
+ \iftikzexternal@optimize
+ % -> it won't be shipped out anyway, so save typesetting time!
+ \let\tikzexternal@next=\tikzexternal@skipfigure
+ \else
+ % include this graphics into the output (even if
+ % it will be discarded anyway).
+ \let\tikzexternal@next=\tikzexternal@normalpicture@nographics
+ \fi
+ \else
+ \let\tikzexternal@next=\tikzexternal@normalpicture@nographics
+ \fi
+ \else
+ \ifpgf@external@grabshipout
+ \tikzifexternaljobnamematches\tikzexternal@curfilename{%
+ % ok, this here IS the picture for which
+ % pdflatex --jobname <my name>
+ % has been invoked.
+ \let\tikzexternal@next=\tikzexternal@externalizefig
+ }{%
+ \iftikzexternal@optimize
+ % No, another picture should be exported. Simply skip this one
+ % -> it won't be shipped out anyway, so save typesetting time!
+ \let\tikzexternal@next=\tikzexternal@skipfigure
+ \else
+ % include this graphics into the output (even it
+ % it will be discarded anyway).
+ \let\tikzexternal@next=\tikzexternal@normalpicture@nographics
+ \fi
+ }%
+ \else
+ \ifcase\tikzexternal@opmode\relax
+ % 'mode=only graphics'
+ \let\tikzexternal@next=\tikzexternal@forcegraphics
+ \or
+ % 'mode=no graphics'
+ \let\tikzexternal@next=\tikzexternal@normalpicture@nographics
+ \or
+ % 'mode=graphics if exists'
+ \let\tikzexternal@next=\tikzexternal@externalizefig
+ \or
+ % 'mode=list only'
+ \let\tikzexternal@next=\tikzexternal@listmodepicture
+ \or
+ % 'mode=convert with system call'
+ \let\tikzexternal@next=\tikzexternal@externalizefig@systemcall
+ \or
+ % 'mode=list and make'
+ \let\tikzexternal@next=\tikzexternal@list@and@makefile@mode@picture
+ \fi
+ \fi
+ \fi
+ \tikzexternal@next
+}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Replacement for \tikz short command:
+\def\tikzexternal@tikz@replacement{%
+ \pgfutil@ifnextchar[{\tikzexternal@tikz@replacement@opt}{\tikzexternal@tikz@replacement@opt[]}%
+}%
+\def\tikzexternal@tikz@replacement@opt[#1]{%
+ \pgfutil@ifnextchar\bgroup{\tikzexternal@tikz@replacement@opt@{#1}}{\tikzexternal@tikz@replacement@opt@@{#1}}%
+}
+\long\def\tikzexternal@tikz@replacement@opt@#1#2{%
+ \tikzexternal@tikz@replacement@opt@process{#1}{#2}%
+}%
+\def\tikzexternal@tikz@replacement@opt@@#1{%
+ \def\tikz@next{\tikzexternal@tikz@replacement@collectnormalsemicolon{#1}}%
+ \ifnum\the\catcode`\;=\active\relax%
+ \def\tikz@next{\tikzexternal@tikz@replacement@collectactivesemicolon{#1}}%
+ \fi%
+ \tikz@next}
+\long\def\tikzexternal@tikz@replacement@collectnormalsemicolon#1#2;{%
+ \tikzexternal@tikz@replacement@opt@process{#1}{#2;}%
+}%
+{
+ \catcode`\;=\active
+ \long\gdef\tikzexternal@tikz@replacement@collectactivesemicolon#1#2;{%
+ \tikzexternal@tikz@replacement@opt@process{#1}{#2;}%
+ }
+}
+\long\def\tikzexternal@tikz@replacement@opt@process#1#2{%
+ \begingroup
+ \t@tikzexternal@tmpa=\expandafter{\tikzexternal@TEXDIALECT@begpicture[#1]#2}%
+ \t@tikzexternal@tmpb=\expandafter{\tikzexternal@TEXDIALECT@endpicture}%
+ \xdef\pgf@tempa{\the\t@tikzexternal@tmpa\the\t@tikzexternal@tmpb}%
+ \endgroup
+ \pgf@tempa
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\tikzexternal@getnextfilename@advancecount{%
+ \begingroup
+ \c@pgf@counta=\csname c@tikzext@no@\tikzexternal@figurename\endcsname\relax
+ \advance\c@pgf@counta by1
+ \expandafter\xdef\csname c@tikzext@no@\tikzexternal@figurename\endcsname{\the\c@pgf@counta}%
+ \endgroup
+}%
+
+% Returns the file name which will be used for the next tikzpicture (based on the currently available information only, of course).
+\def\tikzexternalgetnextfilename#1{%
+ \begingroup
+ \let\tikzexternal@getnextfilename@advancecount\relax% NOP
+ \let\tikzexternal@getnextfilename@resetglobals=\relax% NOP
+ \def\tikzexternal@protocol@to@file##1{}% NOP
+ \tikzexternal@getnextfilename#1%
+ \pgfmath@smuggleone#1%
+ \endgroup
+}%
+
+% Returns the file name of the current picture.
+%
+% It returns the empty string in case the command is invoked outside
+% of a picture.
+% #1 the macro which will contain the file name.
+% @see \tikzexternalgetnextfilename
+\def\tikzexternalgetcurrentfilename#1{%
+ \ifx\tikzexternal@curfilename\relax
+ % we are outside of a picture.
+ \let#1=\pgfutil@empty
+ \else
+ % we are inside of a picture.
+ \let#1=\tikzexternal@curfilename
+ \fi
+}
+
+% Fills #1 with a filename for the current picture.
+%
+% The filename will be generated automatically by appending '-figure<number>' to the real jobname.
+%
+% This method deals with
+% - \tikzsetnextfilename
+% - \tikzexternalexportnextfalse
+%
+% It returns #1={} if the current figure shall NOT be exported.
+%
+% Please note that both, \tikzsetnextfilename and \tikzexternalexportnextfalse
+% affect only ONE picture. They will be reset afterwards.
+\def\tikzexternal@getnextfilename#1{%
+ \let#1=\pgfutil@empty
+ % determine next file name:
+ \iftikzexternal@export@enabled
+ \iftikzexternalexportnext
+ \begingroup
+ \t@tikzexternal@tmpa=\expandafter{\tikzexternal@filenameprefix}%
+ \ifx\tikzexternal@nextfile\pgfutil@empty
+ \iftikzexternal@onlynamed
+ \xdef\pgf@tempa{}%
+ \else
+ \pgfkeysgetvalue{/tikz/external/figure name}\tikzexternal@figurename
+ \pgfutil@ifundefined{c@tikzext@no@\tikzexternal@figurename}{%
+ % initialise on first usage:
+ \expandafter\gdef\csname c@tikzext@no@\tikzexternal@figurename\endcsname{0}%
+ }{}%
+ \t@tikzexternal@tmpb=\expandafter{\tikzexternal@figurename}%
+ \xdef\pgf@tempa{\the\t@tikzexternal@tmpa\the\t@tikzexternal@tmpb\csname c@tikzext@no@\tikzexternal@figurename\endcsname}%
+ % advance the counter for 'figure name':
+ \tikzexternal@getnextfilename@advancecount
+ \fi
+ \else
+ \t@tikzexternal@tmpb=\expandafter{\tikzexternal@nextfile}%
+ \xdef\pgf@tempa{\the\t@tikzexternal@tmpa\the\t@tikzexternal@tmpb}%
+ \fi
+ \endgroup
+ \let#1=\pgf@tempa
+ \fi
+ \fi
+ %
+ \tikzexternal@getnextfilename@resetglobals%
+ %
+ \tikzexternal@protocol@to@file#1%
+}%
+
+\def\tikzexternal@getnextfilename@resetglobals{%
+ % Reset global flags:
+ \global\let\tikzexternal@nextfile=\pgfutil@empty
+ \global\tikzexternalexportnexttrue
+}%
+
+% #1: the image file name which should be protocolled. (can be a
+% macro)
+\def\tikzexternal@protocol@to@file#1{%
+ \ifpgf@external@grabshipout%
+ \else
+ \iftikzexternal@genfigurelist
+ \edef\tikzexternal@temp{#1}%
+ \ifx\tikzexternal@temp\pgfutil@empty
+ \else
+ \pgfutil@ifundefined{tikzexternal@listmode@openedfile}{%
+ \message{Opening '\tikzexternal@realjob.figlist' for writing.}%
+ \begingroup
+ \globaldefs=1
+ % this gets round '\outer\newwrite' in plain TeX:
+ \csname newwrite\endcsname\tikzexternal@outfile
+ \endgroup
+ \immediate\openout\tikzexternal@outfile=\tikzexternal@realjob.figlist\relax
+ \gdef\tikzexternal@listmode@openedfile{1}%
+ \if\tikzexternal@opmode5% mode='list and make'
+ \tikzexternal@list@and@make@prepare
+ \fi
+ }{}%
+ \iftikzexternal@verboseio
+ \pgf@typeout{Writing '#1' to '\tikzexternal@realjob.figlist'.}%
+ \fi
+ \immediate\write\tikzexternal@outfile{#1}%
+ \if\tikzexternal@opmode5% mode='list and make'
+ \tikzexternal@list@and@make@gentarget{#1}%
+ \fi
+ \fi
+ \fi
+ \fi
+}%
+
+\def\tikzexternal@list@and@make@gentarget#1{%
+ \tikzexternal@assemble@systemcall{#1}{\pgf@tempa}%
+ \def\tikzexternal@tempb{\pgfutilstrreplace{^^J}{^^J\tikzexternal@TABchar}}%
+ \expandafter\tikzexternal@tempb\expandafter{\pgf@tempa}%
+ \let\pgf@tempa=\pgfretval
+ \iftikzexternal@verboseio
+ \pgf@typeout{Writing '#1' to '\tikzexternal@realjob.makefile'.}%
+ \fi
+ \global\tikzexternal@file@isuptodatetrue% only check for force remake:
+ \tikzexternal@checkforceremake%
+ \immediate\write\tikzexternal@outmakefile{#1\tikzexternalimgextension: \iftikzexternal@file@isuptodate\else FORCEREMAKE\fi}%
+ \immediate\write\tikzexternal@outmakefile{\tikzexternal@TABchar\pgf@tempa}%
+ \immediate\write\tikzexternal@outmakefile{}%
+}
+
+\def\tikzexternal@list@and@make@prepare{%
+ \iftikzexternal@verboseio
+ \pgf@typeout{Opening '\tikzexternal@realjob.makefile' for writing.}%
+ \fi
+ \begingroup
+ % this makes \tikzexternal@outmakefile global:
+ \globaldefs=1
+ % this gets round '\outer\newwrite' in plain TeX:
+ \csname newwrite\endcsname\tikzexternal@outmakefile
+ \endgroup
+ \immediate\openout\tikzexternal@outmakefile=\tikzexternal@realjob.makefile\relax
+ \immediate\write\tikzexternal@outmakefile{ALL_FIGURE_NAMES=\tikzexternal@DOLLARchar(shell cat \tikzexternal@realjob.figlist)}%
+ \immediate\write\tikzexternal@outmakefile{ALL_FIGURES=\tikzexternal@DOLLARchar(ALL_FIGURE_NAMES:\tikzexternal@PERCENTchar=\tikzexternal@PERCENTchar\tikzexternalimgextension)}%
+ \immediate\write\tikzexternal@outmakefile{}%
+ \immediate\write\tikzexternal@outmakefile{allimages: \tikzexternal@DOLLARchar(ALL_FIGURES)}%
+ \immediate\write\tikzexternal@outmakefile{\tikzexternal@TABchar @echo All images exist now. Use make -B to re-generate them.}%
+ \immediate\write\tikzexternal@outmakefile{}%
+ \immediate\write\tikzexternal@outmakefile{FORCEREMAKE:}%
+ \immediate\write\tikzexternal@outmakefile{}%
+ %
+ % support for .dep files and auto-dependencies:
+ \immediate\write\tikzexternal@outmakefile{include $(ALL_FIGURE_NAMES:\tikzexternal@PERCENTchar=\tikzexternal@PERCENTchar.\tikzexternaldepext)}%
+ \immediate\write\tikzexternal@outmakefile{}%
+ \tikzexternalmakefiledefaultdeprule
+ \immediate\write\tikzexternal@outmakefile{}%
+ \tikzexternal@outmakefile@pendingcommands
+ \pgfutil@ifundefined{AtEndDocument}{}{%
+ \AtEndDocument{\pgf@typeout{===== mode=`list and make': Use 'make -f \tikzexternal@realjob.makefile' to generate all images. Then, re-run (pdf)latex \tikzexternal@realjob. =====}}%
+ }%
+}%
+\def\tikzexternaldepext{dep}
+
+\def\tikzexternalmakefiledefaultdeprule{%
+ \immediate\write\tikzexternal@outmakefile{\tikzexternal@PERCENTchar.\tikzexternaldepext:}%
+ \immediate\write\tikzexternal@outmakefile{\tikzexternal@TABchar mkdir -p \tikzexternal@normal@dq $(dir $@)\tikzexternal@normal@dq}%
+ \immediate\write\tikzexternal@outmakefile{\tikzexternal@TABchar touch \tikzexternal@normal@dq $@\tikzexternal@normal@dq\space \tikzexternal@HASHchar\space will be filled later.}%
+}%
+
+% Invokes '#1' if a makefile is to be written and '#2' if not.
+\def\tikzexternalifwritesmakefile#1#2{%
+ \if5\tikzexternal@opmode #1\else #2\fi
+}%
+\def\tikzexternal@outmakefile@pendingcommands{}%
+
+% Will write something to the make file. If the makefile is not yet
+% opened, #1 will be written as soon as it *is* opened.
+\def\tikzexternalwritetomakefile#1{%
+ \if\tikzexternal@opmode5% mode='list and make'
+ \pgfutil@ifundefined{tikzexternal@outmakefile}{%
+ \expandafter\gdef\expandafter\tikzexternal@outmakefile@pendingcommands\expandafter{%
+ \tikzexternal@outmakefile@pendingcommands
+ \immediate\write\tikzexternal@outmakefile{#1}%
+ }%
+ }{%
+ \immediate\write\tikzexternal@outmakefile{#1}%
+ }%
+ \fi
+}%
+
+\def\tikzexternal@dep@file@name{}
+
+% Adds a dependency for the externalized picture file name `#1',
+% namely another file `#2'.
+%
+% #1: the fully qualified path name (without image extension) of the
+% external graphics for which we are adding a dependency.
+% #2: a file name. If this file gets changed, #1 shall be remade.
+%
+% This command will be activated as soon as \tikzexternalize has been
+% called.
+\def\tikzexternalfiledependsonfile@ACTIVE#1#2{%
+ \begingroup
+ \def\tikzpicturedependsonfile@name{#1}%
+ \ifx\tikzpicturedependsonfile@name\pgfutil@empty
+ % could be auto-generated: empty file name means "picture
+ % won't be externalized". Skip it.
+ \else
+ % if we encounter any dependencies while we externalize a
+ % picture, we have to write these things into the image's .dep
+ % file.
+ \tikzifexternalizingcurrent
+ {\tikzexternalfiledependsonfile@append@to@dep@file{#1}{#2}}%
+ {\tikzexternalfiledependsonfile@append@to@makefile{#1}{#2}}%
+ \fi
+ \endgroup
+}%
+\def\tikzexternalfiledependsonfile#1#2{}% NO-OP until \tikzexternalize has been called.
+
+% sub-routine of \tikzexternalfiledependsonfile which appends stuff to
+% the pictures .dep file.
+%
+% The file #1.dep is generated during the externalization of #1. If
+% you change and/or overwrite it in any other context, its information
+% might get lost (because #1 won't be regenerated).
+%
+% Consequently, this here has to be called if and only if #1 is about
+% to be externalized.
+\def\tikzexternalfiledependsonfile@append@to@dep@file#1#2{%
+ % write every dependency which is defined *INSIDE* of the current
+ % picture into the .dep file of the current picture:
+ \tikzexternalgetcurrentfilename\tikzpicturedependsonfile@name
+ \edef\tikzpicturedependsonfile@name{\tikzpicturedependsonfile@name.\tikzexternaldepext}%
+ %\edef\tikzpicturedependsonfile@name{#1.\tikzexternaldepext}%
+ \ifx\tikzexternal@dep@file@name\tikzpicturedependsonfile@name
+ % file is open and ready.
+ \else
+ % create new output file.
+ \pgfutil@ifundefined{tikzexternal@dep@file}{%
+ \begingroup
+ % this makes \tikzexternal@dep@file global:
+ \globaldefs=1
+ % this gets round '\outer\newwrite' in plain TeX:
+ \csname newwrite\endcsname\tikzexternal@dep@file
+ \endgroup
+ }{}%
+ \ifx\tikzexternal@dep@file@name\pgfutil@empty
+ \else
+ % it is already open. Close it.
+ \immediate\closeout\tikzexternal@dep@file
+ \fi
+ \global\let\tikzexternal@dep@file@name=\tikzpicturedependsonfile@name
+ \immediate\openout\tikzexternal@dep@file=\tikzexternal@dep@file@name\relax
+ \fi
+ \immediate\write\tikzexternal@dep@file{#1\tikzexternalimgextension: #2}%
+}
+
+% sub-routine of \tikzexternalfiledependsonfile which appends stuff to
+% the makefile of the current \jobname .
+%
+% This is used for dependencies which are recomputed by every run of
+% tex; we must not write them into #1.dep (for reasons explained in
+% the documentation of
+% \tikzexternalfiledependsonfile@append@to@dep@file)
+\def\tikzexternalfiledependsonfile@append@to@makefile#1#2{%
+ \edef\tikzexternal@temp{#1\tikzexternalimgextension: #2}%
+ \expandafter\tikzexternalwritetomakefile\expandafter{\tikzexternal@temp}%
+}
+
+% Adds a dependency for the NEXT picture which is about to be
+% externalized. If we are currently inside of a picture, the
+% dependency is added for this current picture.
+%
+% #1: a file name. If this file gets changed, the tikzpicture's
+% externalized graphics shall be remade.
+%
+% This command will be activated as soon as \tikzexternalize has been
+% called.
+\def\tikzpicturedependsonfile@ACTIVE#1{%
+ \begingroup
+ \tikzexternalgetcurrentfilename\tikzpicturedependsonfile@name
+ \ifx\tikzpicturedependsonfile@name\pgfutil@empty
+ \tikzexternalgetnextfilename\tikzpicturedependsonfile@name
+ \fi
+ \expandafter\tikzexternalfiledependsonfile\expandafter{\tikzpicturedependsonfile@name}{#1}%
+ \endgroup
+}%
+\def\tikzpicturedependsonfile#1{}% NO-OP until \tikzexternalize has been called.
+
+
+% This command is invoked
+% if and only if ( (grab mode && --jobname matches) || 'mode=graphics if exists' )
+%
+% It converts the current tikzpicture into an image in grab mode
+% or processes the 'graphics if exist' mode.
+\def\tikzexternal@externalizefig{%
+ \ifpgf@external@grabshipout%
+ % In this case, we already KNOW that the filename matches.
+ \expandafter\tikzexternal@externalizefig@GRAB%
+ \else
+ \expandafter\tikzexternal@externalizefig@mode@graphics@if@exists
+ \fi%
+}
+\def\tikzexternal@externalizefig@mode@graphics@if@exists{%
+ % check if there is already a file.
+ % In that case, use it. If not, typeset the picture normally.
+ \gdef\pgf@filename{}%
+ \xdef\pgf@tempa{\noexpand\pgf@findfile\pgfsys@imagesuffixlist:+{\tikzexternal@curfilename}}%
+ \pgf@tempa
+ \ifx\pgf@filename\pgfutil@empty%
+ % Note: since we have no 'GRAB' mode, we do not have to deal with optimization.
+ % there is no graphics.
+ \expandafter\tikzexternal@normalpicture@nographics
+ \else
+ \expandafter\tikzexternal@forcegraphics
+ \fi
+}%
+
+
+% Used by the optimization code.
+% It will be called if GRAB mode is on.
+% See the 'optimize command away' key.
+\def\tikzexternal@optimize@away@cmd#1#2{%
+ \pgfutil@ifnextchar[{%
+ \tikzexternal@optimize@away@cmd@{#1}{#2}%
+ }{%
+ \tikzexternal@optimize@away@cmd@{#1}{#2}[]%
+ }%
+}%
+\def\tikzexternal@optimize@away@cmd@#1#2[#3]{%
+ \def\tikz@temp{#2}%
+ \ifx\tikz@temp\pgfutil@empty
+ \def\tikz@temp{\tikzexternal@optimize@away@cmd@auto{#1}{#3}}%
+ \else
+ \ifcase#2\relax
+ \def\tikzexternal@optimize@away@cmd@manual{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3##4{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}{##4}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3##4##5{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}{##4}{##5}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3##4##5##6{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}{##4}{##5}{##6}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3##4##5##6##7{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}{##4}{##5}{##6}{##7}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3##4##5##6##7##8{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}}%
+ }%
+ \or
+ \def\tikzexternal@optimize@away@cmd@manual##1##2##3##4##5##6##7##8##9{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#3}{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}{##9}}%
+ }%
+ \fi
+ \def\tikz@temp{\tikzexternal@optimize@away@cmd@manual}%
+ \fi
+ \tikz@temp
+}%
+\def\tikzexternal@optimize@away@cmd@auto#1#2{%
+ \pgfutil@ifnextchar\bgroup{%
+ \tikzexternal@optimize@away@cmd@auto@{#1}{#2}%
+ }{%
+ \tikzexternal@optimize@away@cmd@auto@{#1}{#2}{<no argument in curly braces>}% give empty argument.
+ }
+}%
+
+\def\tikzexternal@optimize@away@cmd@auto@#1#2#3{%
+ \tikzexternal@optimize@away@cmd@@@{#1}{#2}{{#3}}% <-- provide braces
+}%
+\def\tikzexternal@optimize@away@cmd@@@#1#2#3{%
+ \begingroup
+ \toks0={#1[#2]#3}%
+ \iftikzexternal@verbose@optimize
+ \pgf@typeout{The command '\the\toks0' has been optimized away. Use '/tikz/external/optimize=false' to disable this.}%
+ \fi
+ \endgroup
+ \begingroup
+ \pgfkeysvalueof{/tikz/external/optimize away text/.@cmd}#1\pgfeov%
+ \endgroup
+}%
+
+\def\tikzexternal@optimize@away@latex@env#1{%
+ \def\tikzexternal@optimize@away@latex@env@{#1}%
+ \begingroup
+ \def\tikzexternal@laTeX@collect@until@end@tikzpicturetikzpicturestring{#1}%
+ \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@optimize@away@latex@env@close
+}%
+\long\def\tikzexternal@optimize@away@latex@env@close#1{%
+ \iftikzexternal@verbose@optimize
+ \pgf@typeout{The complete contents of \string\begin{tikzexternal@optimize@away@latex@env@} up to the next \end{tikzexternal@optimize@away@latex@env@} has been optimized away because it does not contribute to the exported PDF. Use '/tikz/external/optimize=false' to disable this.}%
+ \fi
+ \endgroup
+ % we still need to invoke \end{<name>} in latex because \begin{<name>}
+ % starts a local group - that must be closed properly. Make sure then \end<name> does nothing:
+ \expandafter\let\csname end\tikzexternal@optimize@away@latex@env@\endcsname=\relax
+ \expandafter\end\expandafter{\tikzexternal@optimize@away@latex@env@}%
+}%
+
+\def\tikzexternal@optimize@REPLACE{%
+ \pgfkeysvalueof{/tikz/external/optimize/install/.@cmd}\pgfeov
+}%
+
+\def\tikzexternal@optimize@RESTORE{%
+ \pgfkeysvalueof{/tikz/external/optimize/restore/.@cmd}\pgfeov
+}%
+
+% Closes one 'tikzpicture' environment. This is only used for LaTeX,
+% because the '\end{tikzpicture}' command would raise an exception otherwise.
+% It does *not* call \endtikzpicture.
+\def\tikzexternal@closeenvironments{%
+ \let\endtikzpicture=\relax
+ \tikzexternal@TEXDIALECT@endpicture
+ \let\endtikzpicture=\tikzexternal@origendpicture
+ \let\tikzexternal@curfilename=\relax
+}
+
+% Throws a tikzpicture away - without further notice.
+% Used if we are currently converting *another* picture. No need to waste time
+% with expensive pictures if they are not shipped out anyway.
+%
+% See the 'optimize' key to disable this.
+\def\tikzexternal@skipfigure{%
+ \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@skipfigure@@
+}
+\long\def\tikzexternal@skipfigure@@#1{%
+ \iftikzexternal@verbose@optimize
+ \pgf@typeout{A tikzpicture has been optimized away. Use '/tikz/external/optimize=false' to disable this.}%
+ \fi
+ \tikzexternal@closeenvironments
+ \pgfkeysvalueof{/tikz/external/optimize away text/.@cmd}tikzpicture\pgfeov%
+}
+
+% Processes tikzpicture normally; without any externalization.
+%
+% We need to do further work here to deal with NESTED tikzpicture environments
+% because all of them shall also be typeset normally.
+%
+% Idea:
+% 1. restore the original \tikzpicture macro
+% 2. install the replacement \tikzpicture in \end{tikzpicture}.
+% and keep track of nesting.
+%
+% FIXME: could it be possible that nested tikzpictures use other code anyway?
+\def\tikzexternal@normalpicture@nographics{%
+ \tikzexternal@nestedflagfalse
+ \let\tikzpicture=\tikzexternal@normalpicture@begreplace
+ \let\endtikzpicture=\tikzexternal@normalpicture@endreplace
+ \tikzpicture
+}
+\def\tikzexternal@normalpicture@begreplace{%
+ \begingroup
+ \tikzexternal@nestedflagtrue
+ \tikzexternal@origpicture
+}
+\def\tikzexternal@normalpicture@endreplace{%
+ \tikzexternal@origendpicture
+ \endgroup
+ \iftikzexternal@nestedflag
+ \else
+ \let\tikzpicture=\tikzexternal@tikzpicture@replacement
+ \let\endtikzpicture=\tikzexternal@origendpicture
+ \fi
+}%
+
+% Assumes there is an image on disk and reads it. The tikzpicture is thrown away.
+\def\tikzexternal@forcegraphics{%
+ \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@forcegraphics@@
+}
+\long\def\tikzexternal@forcegraphics@@#1{\tikzexternal@forcegraphics@@@}%
+\def\tikzexternal@forcegraphics@@@{%
+ \if5\tikzexternal@opmode
+ \let\tikz@refundefinedtrue@@=\G@refundefinedtrue
+ \gdef\G@refundefinedtrue{%
+ \tikz@refundefinedtrue@@
+ \tikzexternal@forceremake@undefined@reference@handler
+ }%
+ \fi
+ \expandafter\pgfincludeexternalgraphics\expandafter{\tikzexternal@curfilename}%
+ \if5\tikzexternal@opmode
+ \global\let\G@refundefinedtrue=\tikz@refundefinedtrue@@
+ \fi
+ \tikzexternal@closeenvironments
+}
+
+\def\tikzexternal@forceremake@undefined@reference@handler{%
+ \pgf@typeout{===== 'mode=list and make': encountered undefined reference in current picture. Adding dependency to FORCEREMAKE. Rerun make to update the picture.' ========^^J}%
+ \tikzpicturedependsonfile{FORCEREMAKE}%
+}%
+
+% Simply replaces the complete picture by some placeholder text.
+% It is used by 'mode=list only' to reduce runtime.
+\def\tikzexternal@listmodepicture{%
+ \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@listmodepicture@@
+}
+\long\def\tikzexternal@listmodepicture@@#1{\tikzexternal@listmodepicture@@@}
+\def\tikzexternal@listmodepicture@@@{%
+ \pgfkeysvalueof{/tikz/external/image discarded text}%
+ \tikzexternal@closeenvironments
+}
+
+% check if there is already a file.
+% In that case, use it. If not, skip it.
+\def\tikzexternal@list@and@makefile@mode@picture{%
+ \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@list@and@makefile@mode@picture@
+}%
+\long\def\tikzexternal@list@and@makefile@mode@picture@#1{%
+ %
+ \tikzexternal@check@uptodate@mode{#1}%
+ %
+ \gdef\pgf@filename{}%
+ \xdef\pgf@tempa{\noexpand\pgf@findfile\pgfsys@imagesuffixlist:+{\tikzexternal@curfilename}}%
+ \pgf@tempa
+ \ifx\pgf@filename\pgfutil@empty%
+ % Note: since we have no 'GRAB' mode, we do not have to deal with optimization.
+ % there is no graphics.
+ \expandafter\tikzexternal@listmodepicture@@@
+ \else
+ \expandafter\tikzexternal@forcegraphics@@@
+ \fi
+}%
+
+\def\tikzexternal@externalizefig@before@grab{%
+ \pgfutil@IfUndefined{TP@holdbox}{%
+ }{%
+ % \usepackage[absolute]{textpos}
+ % populates this box -- and would inject unwanted material into our images. Reset it:
+ \global\setbox\TP@holdbox\vbox{}%
+ }%
+}%
+
+\def\tikzexternal@externalizefig@GRAB{%
+ \ifpgf@external@grabshipout
+ \iftikzexternal@optimize
+ \tikzexternal@optimize@RESTORE
+ \fi
+ \tikzexternal@externalizefig@before@grab
+ \fi
+ \def\tikzpicture{%
+ \def\tikzpicture{% make sure that nested \tikzpicture are processed normally.
+ \begingroup
+ \def\endtikzpicture{%
+ \tikzexternal@origendpicture
+ \endgroup
+ }%
+ \tikzexternal@origpicture
+ }%
+ \pgf@external@grab{\tikzexternal@curfilename}%
+ \tikzexternal@origpicture
+ }%
+ \def\endtikzpicture{%
+ \tikzexternal@origendpicture
+ \pgf@externalend
+ %
+ \tikzexternal@ensure@nonempty@floats
+ %
+ \let\tikzpicture=\tikzexternal@tikzpicture@replacement
+ \let\endtikzpicture=\tikzexternal@origendpicture
+ \iftikzexternal@optimize
+ \ifpgf@external@grabshipout
+ \tikzexternal@optimize@REPLACE
+ \fi
+ \fi
+ }%
+ \tikzpicture
+}%
+
+% If a sequence of floats containing JUST tikzpictures is
+% externalized, this results in EMPTY floats. Empty floats, in turn,
+% can confuse latex; it thinks it did something wrong.
+%
+% Solution: Avoid empty floats by writing junk into it.
+%
+% Note that this method is only invoked if \ifpgf@external@grabshipout
+% is true and if the text is OUTSIDE of the original shipout routine.
+% In other words: this text is being thrown away.
+%
+% see
+% http://tex.stackexchange.com/questions/54625/why-is-fixltx2e-incompatible-with-tikzexternalize
+\def\tikzexternal@ensure@nonempty@floats{%
+ tikzexternal: picture has been externalized. This text is required to avoid empty floats.
+}%
+
+% 1. Discards the current picture in this document.
+% 2. Checks whether an image exists already. If that is the case: acquire it.
+% 3. If no image exists: call '/tikz/external/system call'. This will
+% process \tikzexternal@externalizefig.
+% 4. Assert that finally an image exists and use it.
+\def\tikzexternal@externalizefig@systemcall{%
+ \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@externalizefig@systemcall@@
+}
+
+{
+\catcode`\"=12
+\catcode`\'=12
+\catcode`\;=12
+\catcode`\&=12
+\catcode`\-=12
+\xdef\tikzexternal@normal@dq{"}
+\xdef\tikzexternal@normal@sq{'}
+\xdef\tikzexternal@normal@semic{;}
+\xdef\tikzexternal@normal@and{&}
+\xdef\tikzexternal@normal@dash{-}
+\catcode`\"=13
+\catcode`\'=13
+\catcode`\;=13
+\catcode`\&=13
+\catcode`\-=13
+\gdef\tikzexternal@activate@normal@dq{\let"=\tikzexternal@normal@dq}
+\gdef\tikzexternal@activate@normal@sq{\let'=\tikzexternal@normal@sq}
+\gdef\tikzexternal@activate@normal@semic{\let;=\tikzexternal@normal@semic}
+\gdef\tikzexternal@activate@normal@and{\let&=\tikzexternal@normal@and}
+\gdef\tikzexternal@activate@normal@dash{\let-=\tikzexternal@normal@dash}
+\catcode`\|=0
+\catcode`\\=12
+|xdef|tikzexternal@normal@backslash{\}%
+}
+{
+\catcode`\^^I=12
+\catcode`\$=12
+\catcode`\%=12
+\catcode`\#=12
+\gdef\tikzexternal@HASHchar{#}
+\gdef\tikzexternal@TABchar{^^I}\gdef\tikzexternal@PERCENTchar{%}\xdef\tikzexternal@DOLLARchar{$}}
+
+% Creates the '/tikz/external/system call' command as string and
+% returns it into the (global!) macro #2.
+% #1: the image file name (as returned by
+% \tikzexternalgetnextfilename)
+% #2: the global return value macro
+%
+\def\tikzexternal@assemble@systemcall#1#2{%
+ \begingroup
+ \def\image{#1}%
+ \iftikzexternal@auto@detect@jobname
+ \edef\texsource{\string\def\string\tikzexternalrealjob{\tikzexternal@realjob}\string\input{\tikzexternal@realjob}}%
+ \else
+ \let\texsource=\tikzexternal@realjob
+ \fi
+ \ifnum\the\catcode`\"=13 \tikzexternal@activate@normal@dq\fi
+ \ifnum\the\catcode`\'=13 \tikzexternal@activate@normal@sq\fi
+ \ifnum\the\catcode`\;=13 \tikzexternal@activate@normal@semic\fi
+ \ifnum\the\catcode`\-=13 \tikzexternal@activate@normal@dash\fi
+ \let\\=\tikzexternal@normal@backslash
+ \xdef#2{\pgfkeysvalueof{/tikz/external/system call}}%
+ \endgroup
+}%
+\long\def\tikzexternal@externalizefig@systemcall@@#1{%
+ \tikzexternal@externalizefig@systemcall@uptodatecheck{#1}%
+ \tikzexternal@assemble@systemcall{\tikzexternal@curfilename}{\pgf@tempa}%
+ \global\let\tikzexternal@cursyscall=\pgf@tempa
+ \gdef\tikzexternal@typeset@picture@on@failure{1}%
+ \iftikzexternal@file@isuptodate
+ \iftikzexternal@verboseio
+ \pgf@typeout{===== Image '\tikzexternal@curfilename' is up-to-date. ======}%
+ \fi
+ \let\pgf@filename=\tikzexternal@curfilename
+ \else
+ \begingroup
+ % no such image. Generate it!
+ %
+ \tikzexternalauxlock@setlock1%
+ \tikzexternal@externalizefig@systemcall@call{\tikzexternal@cursyscall}%
+ \tikzexternalauxlock@setlock0%
+ \expandafter\tikzexternal@externalizefig@systemcall@assertsuccess\expandafter{\tikzexternal@cursyscall}%
+ \pgfmath@smuggleone\pgf@filename
+ \endgroup
+ \fi
+ \ifx\pgf@filename\pgfutil@empty
+ \if1\tikzexternal@typeset@picture@on@failure
+ % error recovery: something did not work! Try to load it
+ % anyway. Perhaps it was just that shell-escape wasn't
+ % enabled.
+ \begingroup
+ \toks0={%
+ \tikzexternaldisable
+ }%
+ % FIXME : THIS WILL FAIL IF THERE IS '##' INSIDE OF '#1'!
+ % for example something like /.style={#1} in the picture environment *will* fail.
+ \toks1={%
+ \tikzpicture
+ #1%
+ }%
+ \toks2={%
+ \tikzexternal@TEXDIALECT@endpicture
+ \tikzexternalenable
+ }%
+ \xdef\tikzexternal@externalizefig@systemcall@next{%
+ \the\toks0
+ % try reading them again as if they were in the input file.
+ \noexpand\scantokens{\the\toks1 }%
+ \the\toks2
+ }%
+ \endgroup
+ \else
+ % Ah -- this picture failed, but the failure has already
+ % been handled somehow. Do not typeset it again!
+ %
+ % A use-case is that the picture has been rescheduled for
+ % \end{document}.
+ \gdef\tikzexternal@externalizefig@systemcall@next{\tikzexternal@closeenvironments}%
+ \fi
+ \else
+ % ok, take the image!
+ \gdef\tikzexternal@systemcall@reschedule@to@end@document{0}%
+ \expandafter\pgfincludeexternalgraphics\expandafter{\tikzexternal@curfilename}%
+ \if1\tikzexternal@systemcall@reschedule@to@end@document
+ \pgfutil@IfUndefined{AtVeryEndDocument}{%
+ }{%
+ \pgf@typeout{===== The previous system call resulted in undefined references inside of the output file. Rescheduling it for \string\end{document}. ========}%
+ \expandafter\tikzexternal@externalizefig@systemcall@reschedule\expandafter{\tikzexternal@cursyscall}%
+ }%
+ \fi
+ \gdef\tikzexternal@externalizefig@systemcall@next{\tikzexternal@closeenvironments}%
+ \fi
+ \tikzexternal@externalizefig@systemcall@next
+}%
+
+\def\tikzexternal@externalizefig@systemcall@call#1{%
+ \iftikzexternal@verboseio
+ \pgf@typeout{===== 'mode=convert with system call': Invoking '#1' ========}%
+ \fi
+ \pgfutil@shellescape{#1}%
+}%
+
+% Sets \iftikzexternal@file@isuptodate to false if one of the "force
+% remake" things is active.
+\def\tikzexternal@checkforceremake{%
+ \iftikzexternal@force@remake
+ \global\tikzexternal@file@isuptodatefalse
+ \else
+ \iftikzexternalremakenext
+ \global\tikzexternal@file@isuptodatefalse
+ \global\tikzexternalremakenextfalse
+ \fi
+ \fi
+}
+
+\pgfutil@IfUndefined{pdfmdfivesum}{%
+}{%
+ % predefine to this value. This does only make sense for pdftex.
+ % note that the latex library for 'external' loads \usepackage{pdftexcmds} which \let's this to \pdf@mdfivesum:
+ \let\tikzexternal@mdfivesum=\pdfmdfivesum
+}%
+
+\long\def\tikzexternal@computemdfivesum#1{%
+ \t@tikzexternal@tmpb={#1}%
+ \edef\tikzexternal@temp{\the\t@tikzexternal@tmpb}%
+ % \meaning results in a string of catcode 12 - which is expandable.
+ \edef\pgfretval{\tikzexternal@mdfivesum{\meaning\tikzexternal@temp}}%
+}
+\long\def\tikzexternal@computemdfivesum@diff@fallback#1{%
+ \t@tikzexternal@tmpb={#1}%
+ \edef\tikzexternal@temp{\the\t@tikzexternal@tmpb}%
+ % \meaning results in a string of catcode 12 - which is expandable.
+ \edef\pgfretval{\meaning\tikzexternal@temp}%
+}
+
+% Will be set dynamically, depending on 'up to date check'.
+%
+% It expands to code such that \tikzexternallastkey contains the
+% serialized version of '#1'.
+%
+% It is used as argument for \write{..}
+%
+% #1 the hash key to serialize.
+% \def\tikzexternal@hashfct@serialize
+\long\def\tikzexternal@hashfct@serialize@std#1{%
+ \noexpand\def\noexpand\tikzexternallastkey{#1}%
+}%
+
+% serializes using temporary token registers. Necessary if #1 contains
+% executable code.
+\long\def\tikzexternal@hashfct@serialize@tok#1{%
+ \noexpand\begingroup
+ % in order to allow '#' inside of the body, we have to use token registers:
+ \noexpand\toks0={#1}%
+ \noexpand\xdef\noexpand\tikzexternallastkey{\noexpand\the\noexpand\toks0 }%
+ \noexpand\endgroup
+}%
+
+\def\tikzexternal@check@uptodate@ext{.md5}
+
+\def\tikzexternal@check@uptodate@mode@warn@fallback{%
+ \message{Package tikz Warning: The key 'up to date check=md5' is impossible, there is no macro to compute MD5. Falling back to 'up to date check=diff'.}%
+ %
+ % warn only once:
+ \global\let\tikzexternal@check@uptodate@mode@warn@fallback=\relax
+}%
+
+% assigns the boolean \iftikzexternal@file@isuptodate
+\long\def\tikzexternal@check@uptodate@mode#1{%
+ \if1\tikzexternal@uptodate@mode
+ % up to date check=md5:
+ % check if we CAN compute MD5 sums:
+ \pgfutil@IfUndefined{tikzexternal@mdfivesum}{%
+ % we cannot compute md5 sums - fallback to diff.
+ \tikzexternal@check@uptodate@mode@warn@fallback
+ \def\tikzexternal@uptodate@mode{2}%
+ }{}%
+ \fi
+ %
+ \ifcase\tikzexternal@uptodate@mode
+ % up to date check=simple
+ % nothing to do -- file existence is checked anyway.
+ \let\tikzexternal@hashfct=\pgfutil@empty
+ \let\tikzexternal@hashfct@serialize=\pgfutil@empty
+ \or
+ % up to date check=md5
+ \let\tikzexternal@hashfct=\tikzexternal@computemdfivesum
+ \let\tikzexternal@hashfct@serialize=\tikzexternal@hashfct@serialize@std
+ \or
+ \let\tikzexternal@hashfct=\tikzexternal@computemdfivesum@diff@fallback
+ \let\tikzexternal@hashfct@serialize=\tikzexternal@hashfct@serialize@tok
+ \fi
+ \ifx\tikzexternal@hashfct\pgfutil@empty
+ \else
+ \tikzpicturedependsonfile{\tikzexternal@curfilename\tikzexternal@check@uptodate@ext}%
+ \tikzexternal@hashfct{#1}%
+ \let\tikzexternal@lastkey@new=\pgfretval
+ \begingroup
+ % no '@' token in this macro: avoid messing up the catcodes in input files:
+ \global\let\tikzexternallastkey=\pgfutil@empty
+ \openin\r@pgf@reada=\tikzexternal@curfilename\tikzexternal@check@uptodate@ext\relax %
+ \ifeof\r@pgf@reada
+ \else
+ % read first line...
+ \endlinechar=-1 % older versions did not have a '%' at the end-of-line. Avoid spurious spaces.
+ \read\r@pgf@reada to\pgf@tempa
+ % ... and execute it.
+ \pgf@tempa
+ % it should contain a definition of \tikzexternallastkey.
+ \fi
+ \closein\r@pgf@reada
+ %
+ \let\tikzexternal@lastkey=\tikzexternallastkey
+ \pgfmath@smuggleone\tikzexternal@lastkey
+ \endgroup
+ % normalize catcodes. Unfortunately, they cannot be expected to be the same.
+ % \meaning will use catcode 12 for each token:
+ \edef\tikzexternal@lastkey@normalized{\meaning\tikzexternal@lastkey}%
+ \edef\tikzexternal@lastkey@new@normalized{\meaning\tikzexternal@lastkey@new}%
+ \iftikzexternal@verboseuptodate
+ \pgf@typeout{Up-to-date check of \tikzexternal@curfilename: new \tikzexternal@lastkey@new@normalized; old \tikzexternal@lastkey@normalized.^^J}%
+ \fi
+ \ifx\tikzexternal@lastkey@normalized\tikzexternal@lastkey@new@normalized
+ \tikzexternal@file@isuptodatetrue
+ \else
+ \tikzexternal@file@isuptodatefalse
+ \immediate\openout\w@pgf@writea=\tikzexternal@curfilename\tikzexternal@check@uptodate@ext\relax%
+ \immediate\write\w@pgf@writea{\tikzexternal@hashfct@serialize{\tikzexternal@lastkey@new}\tikzexternal@PERCENTchar}%
+ \immediate\closeout\w@pgf@writea
+ \fi
+ \fi
+}
+
+% Checks whether the current picture needs to be externalized.
+%
+% This is the case if
+% a) there is no external image yet,
+% b) the picture has been invalidated manually.
+%
+% It returns \iftikzexternal@file@isuptodate accordingly.
+% #1: the picture-content
+\long\def\tikzexternal@externalizefig@systemcall@uptodatecheck#1{%
+ \tikzexternal@check@uptodate@mode{#1}%
+ \tikzexternal@checkforceremake
+ \iftikzexternal@file@isuptodate
+ % check if there is already a file.
+ % In that case, use it. If that is not the case, generate it and include it afterwards.
+ \gdef\pgf@filename{}%
+ \xdef\pgf@tempa{\noexpand\pgf@findfile\pgfsys@imagesuffixlist:+{\tikzexternal@curfilename}}%
+ \pgf@tempa
+ \ifx\pgf@filename\pgfutil@empty%
+ \global\tikzexternal@file@isuptodatefalse
+ \fi
+ \fi
+}%
+
+% \pgf@filename will be empty if the assertion failed.
+\def\tikzexternal@externalizefig@systemcall@assertsuccess#1{%
+ % check if there is a file now and raise an error message if not.
+ \gdef\pgf@filename{}%
+ \xdef\pgf@tempa{\noexpand\pgf@findfile\pgfsys@imagesuffixlist:+{\tikzexternal@curfilename}}%
+ \pgf@tempa
+ \ifx\pgf@filename\pgfutil@empty%
+ \tikzexternal@externalizefig@systemcall@handleexception{#1}%
+ \fi
+}%
+\def\tikzexternal@externalizefig@systemcall@handleexception@msg#1{%
+ \tikzerror{Sorry, the system call '#1' did NOT result in a usable output file '\tikzexternal@curfilename' (expected one of \pgfsys@imagesuffixlist). Please verify that you have enabled system calls. For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is also named 'write 18' or something like that. Or maybe the command simply failed? Error messages can be found in '\tikzexternal@curfilename.log'. If you continue now, I'll try to typeset the picture}{}%
+}
+\def\tikzexternal@externalizefig@systemcall@handleexception@retry@later#1{%
+ \gdef\tikzexternal@systemcall@reschedule@to@end@document{0}%
+ \expandafter\pgfexternalreaddpth\expandafter{\tikzexternal@curfilename}%
+ \if1\tikzexternal@systemcall@reschedule@to@end@document
+ \pgfutil@IfUndefined{AtVeryEndDocument}{%
+ \tikzexternal@externalizefig@systemcall@handleexception@msg{#1}%
+ }{%
+ \pgf@typeout{===== The last system call resulted in an EMPTY output file. Maybe it is part of \string\ref. Rescheduling it for \string\end{document}. ========}%
+ \gdef\tikzexternal@typeset@picture@on@failure{0}%
+ \tikzexternal@externalizefig@systemcall@reschedule{#1}%
+ }%
+ \else
+ \tikzexternal@externalizefig@systemcall@handleexception@msg{#1}%
+ \fi
+}
+
+% reschedules the externalization of the current file to
+% \AtVeryEndDocument.
+%
+% This hook allows to execute code AFTER the main .aux file is
+% finished; it will even re-read the main aux file.
+\def\tikzexternal@externalizefig@systemcall@reschedule#1{%
+ \t@tikzexternal@tmpb={%
+ \global\let\tikzexternal@externalizefig@systemcall@handleexception=\tikzexternal@externalizefig@systemcall@handleexception@msg%
+ % ... no auxlocks!
+ \tikzexternal@externalizefig@systemcall@call{#1}%
+ \tikzexternal@externalizefig@systemcall@assertsuccess{#1}%
+ }%
+ \xdef\pgfutil@tempa{%
+ \noexpand\def\noexpand\tikzexternal@curfilename{\tikzexternal@curfilename}%
+ \the\t@tikzexternal@tmpb
+ }%
+ \expandafter\AtVeryEndDocument\expandafter{\pgfutil@tempa}%
+ \gdef\tikzexternal@has@rescheduled@something{1}%
+}%
+\let\tikzexternal@externalizefig@systemcall@handleexception=\tikzexternal@externalizefig@systemcall@handleexception@retry@later%
+
+\def\tikzexternal@has@rescheduled@something{0}%
+\pgfutil@IfUndefined{AtVeryEndDocument}{}{%
+ \AtVeryEndDocument{%
+ \if1\tikzexternal@has@rescheduled@something
+ \pgf@typeout{===== tikzexternal: \string\end{document} reached. Working on rescheduled images to resolve references... ========}%
+ \fi
+ }%
+}
+
+% Overwrite error message of pgf.
+% This happens if the generated image was empty, i.e. if there was no \shipout.
+\def\pgfexternal@error@no@shipout{%
+ \begingroup
+ \begingroup
+ % overwrite .dpth file in order to flag the file as "need to be scheduled
+ % for \AtVeryEndDocument" :
+ \immediate\openout\pgf@plotwrite=\pgfactualjobname.dpth
+ \let\w@pgfexternal@auxout=\pgf@plotwrite
+ \pgfexternalstorecommand@isexporting{\gdef\noexpand\tikzexternal@systemcall@reschedule@to@end@document{1}}%
+ \immediate\closeout\pgf@plotwrite
+ \endgroup
+ \tikzexternal@assemble@systemcall{\pgfactualjobname}{\pgf@tempa}%
+ \toks0=\expandafter{\pgf@tempa}%
+ \tikzerror{Sorry, image externalization failed: the resulting image was EMPTY. I tried to externalize '\pgfactualjobname', but it seems there is no such image in the document!?
+ \if\tikzexternal@opmode4 ^^J
+\space\space You are currently using 'mode=convert with system call'. This problem can happen if the image (or one of the images preceding it) was declared inside of a \string\label{} (i.e. in the .aux file): 'convert with system call' has no access to the main aux file.^^J
+\space\space Possible solutions in this case:^^J
+\space\space (a) Try using 'mode=list and make',^^J
+\space\space (b) Issue the externalization command '\the\toks0' *manually* (also check the preceding externalized images, perhaps the file name sequence is not correct).^^J
+\space\space Repeat: the resulting image was EMPTY, your attention is required
+\else
+ \if\tikzexternal@opmode5 ^^J
+\space\space You are currently using 'mode=list and make'. Possible solutions:^^J
+\space\space (a) Try to delete `\tikzexternal@realjob.makefile'. Perhaps it is not up-to-date.^^J
+\space\space (b) Perhaps pictures are declared inside of \string\label{} and the .aux file is not up-to-date. Re-run latex, perhaps re-generate the graphics as well.^^J
+\space\space Repeat: the resulting image was EMPTY, your attention is required
+ \fi
+\fi}%
+ \endgroup
+}%
diff --git a/graphics/pgf/base/tex/tikzlibrary3d.code.tex b/graphics/pgf/base/tex/tikzlibrary3d.code.tex
new file mode 100644
index 0000000000..aee687e274
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrary3d.code.tex
@@ -0,0 +1,108 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrary3d.code.tex}
+
+
+
+% New coordinate systems:
+
+\tikzdeclarecoordinatesystem{xyz cylindrical}
+{%
+ \pgfset{/tikz/cs/.cd,angle=0,radius=0,z=0,#1}%
+ \pgfpointcylindrical{\tikz@cs@angle}{\tikz@cs@xradius}{\tikz@cs@z}%
+}%
+
+\tikzdeclarecoordinatesystem{xyz spherical}
+{%
+ \pgfset{/tikz/cs/.cd,angle=0,radius=0,latitude=0,longitude=0,#1}%
+ \pgfpointspherical{\tikz@cs@angle}{\tikz@cs@latitude}{\tikz@cs@xradius}%
+}%
+
+\pgfset{/tikz/cs/longitude/.store in=\tikz@cs@angle}%
+\pgfset{/tikz/cs/latitude/.store in=\tikz@cs@latitude}%
+
+
+% Options for transforming into a plane:
+
+\tikzoption{plane origin}{\def\tikz@plane@origin{\tikz@scan@one@point\pgfutil@firstofone#1}}%
+\tikzoption{plane x}{\def\tikz@plane@x{\tikz@scan@one@point\pgfutil@firstofone#1}}%
+\tikzoption{plane y}{\def\tikz@plane@y{\tikz@scan@one@point\pgfutil@firstofone#1}}%
+
+\let\tikz@plane@origin=\pgfpointorigin
+\def\tikz@plane@x{\pgfpointxy{1}{0}}%
+\def\tikz@plane@y{\pgfpointxy{0}{1}}%
+
+\tikzoption{canvas is plane}[]{
+ \tikz@canvas@is@plane
+}%
+\tikzoption{canvas is xy plane at z}[]{%
+ \def\tikz@plane@origin{\pgfpointxyz{0}{0}{#1}}%
+ \def\tikz@plane@x{\pgfpointxyz{1}{0}{#1}}%
+ \def\tikz@plane@y{\pgfpointxyz{0}{1}{#1}}%
+ \tikz@canvas@is@plane
+}%
+\tikzoption{canvas is yx plane at z}[]{%
+ \def\tikz@plane@origin{\pgfpointxyz{0}{0}{#1}}%
+ \def\tikz@plane@x{\pgfpointxyz{0}{1}{#1}}%
+ \def\tikz@plane@y{\pgfpointxyz{1}{0}{#1}}%
+ \tikz@canvas@is@plane
+}%
+\tikzoption{canvas is xz plane at y}[]{%
+ \def\tikz@plane@origin{\pgfpointxyz{0}{#1}{0}}%
+ \def\tikz@plane@x{\pgfpointxyz{1}{#1}{0}}%
+ \def\tikz@plane@y{\pgfpointxyz{0}{#1}{1}}%
+ \tikz@canvas@is@plane
+}%
+\tikzoption{canvas is zx plane at y}[]{%
+ \def\tikz@plane@origin{\pgfpointxyz{0}{#1}{0}}%
+ \def\tikz@plane@x{\pgfpointxyz{0}{#1}{1}}%
+ \def\tikz@plane@y{\pgfpointxyz{1}{#1}{0}}%
+ \tikz@canvas@is@plane
+}%
+\tikzoption{canvas is yz plane at x}[]{%
+ \def\tikz@plane@origin{\pgfpointxyz{#1}{0}{0}}%
+ \def\tikz@plane@x{\pgfpointxyz{#1}{1}{0}}%
+ \def\tikz@plane@y{\pgfpointxyz{#1}{0}{1}}%
+ \tikz@canvas@is@plane
+}%
+\tikzoption{canvas is zy plane at x}[]{%
+ \def\tikz@plane@origin{\pgfpointxyz{#1}{0}{0}}%
+ \def\tikz@plane@x{\pgfpointxyz{#1}{0}{1}}%
+ \def\tikz@plane@y{\pgfpointxyz{#1}{1}{0}}%
+ \tikz@canvas@is@plane
+}%
+
+
+
+% Transformation code
+
+\def\tikz@canvas@is@plane{
+ \pgf@process{\tikz@plane@x}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@plane@y}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{\tikz@plane@origin}%
+ \edef\pgf@marshal{\noexpand\tikz@addtransform{%
+ \noexpand\pgftransformtriangle
+ {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}
+ {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}
+ \noexpand\pgftransformscale{0.035146}%
+ \noexpand\pgfsetxvec{\noexpand\pgfpoint{1cm}{0cm}}%
+ \noexpand\pgfsetyvec{\noexpand\pgfpoint{0cm}{1cm}}%
+ \noexpand\pgfsetzvec{\noexpand\pgfpoint{0cm}{0cm}}%
+ }}%
+ \pgf@marshal%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryangles.code.tex b/graphics/pgf/base/tex/tikzlibraryangles.code.tex
new file mode 100644
index 0000000000..5a89e4defd
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryangles.code.tex
@@ -0,0 +1,98 @@
+% Copyright 2013 by Till Tantau
+% Copyright 2018 by Kroum Tzanev
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryangles.code.tex}
+
+
+\tikzset{
+ pics/angle/.style = {
+ setup code = \tikz@lib@angle@parse#1\pgf@stop,
+ background code = \tikz@lib@angle@background#1\pgf@stop,
+ foreground code = \tikz@lib@angle@foreground#1\pgf@stop,
+ },
+ pics/right angle/.style = {
+ setup code = \tikz@lib@angle@parse#1\pgf@stop,
+ background code = \tikz@lib@rightangle@background#1\pgf@stop,
+ foreground code = \tikz@lib@rightangle@foreground#1\pgf@stop,
+ },
+ pics/angle/.default=A--B--C,
+ angle eccentricity/.initial=.6,
+ angle radius/.initial=5mm,
+}%
+
+\def\tikz@lib@angle@background#1--#2--#3\pgf@stop{%
+ \path [name prefix ..] [pic actions, draw=none] (#2.center)
+ -- ++(\tikz@start@angle@temp:\tikz@lib@angle@rad pt)
+ arc [start angle=\tikz@start@angle@temp, end
+ angle=\tikz@end@angle@temp, radius=\tikz@lib@angle@rad pt] -- cycle;
+}%
+
+\def\tikz@lib@angle@foreground#1--#2--#3\pgf@stop{%
+ \path [name prefix ..] [pic actions, fill=none, shade=none]
+ ([shift={(\tikz@start@angle@temp:\tikz@lib@angle@rad pt)}]#2.center)
+ arc [start angle=\tikz@start@angle@temp, end
+ angle=\tikz@end@angle@temp, radius=\tikz@lib@angle@rad pt];
+ \ifx\tikzpictext\relax\else%
+ \def\pgf@temp{\node()[name prefix
+ ..,at={([shift={({.5*\tikz@start@angle@temp+.5*\tikz@end@angle@temp}:\pgfkeysvalueof{/tikz/angle
+ eccentricity}*\tikz@lib@angle@rad pt)}]#2.center)}]}
+ \expandafter\pgf@temp\expandafter[\tikzpictextoptions]{\tikzpictext};%
+ \fi
+}%
+
+\def\tikz@lib@rightangle@background#1--#2--#3\pgf@stop{%
+ \path [name prefix ..] [pic actions, draw=none] (#2.center)
+ -- ++(\tikz@start@angle@temp:\tikz@lib@angle@rad pt)
+ -- ++(\tikz@end@angle@temp:\tikz@lib@angle@rad pt)
+ -- ++(\tikz@start@angle@temp:-\tikz@lib@angle@rad pt)
+ -- cycle;
+}%
+
+\def\tikz@lib@rightangle@foreground#1--#2--#3\pgf@stop{%
+ \path [name prefix ..] [pic actions, fill=none, shade=none]
+ ([shift={(\tikz@start@angle@temp:\tikz@lib@angle@rad pt)}]#2.center)
+ -- ++(\tikz@end@angle@temp:\tikz@lib@angle@rad pt)
+ -- ++(\tikz@start@angle@temp:-\tikz@lib@angle@rad pt);
+ \ifx\tikzpictext\relax\else%
+ \def\pgf@temp{\node()[name prefix
+ ..,at={([shift={({.5*\tikz@start@angle@temp+.5*\tikz@end@angle@temp}:\pgfkeysvalueof{/tikz/angle
+ eccentricity}*1.4142136*\tikz@lib@angle@rad pt)}]#2.center)}]}
+ \expandafter\pgf@temp\expandafter[\tikzpictextoptions]{\tikzpictext};%
+ \fi
+}%
+
+\def\tikz@lib@angle@parse#1--#2--#3\pgf@stop{%
+ % Compute radius:
+ \pgfmathsetmacro\tikz@lib@angle@rad{\pgfkeysvalueof{/tikz/angle radius}}
+ \ifdim\tikz@lib@angle@rad pt>0pt\else\def\tikz@lib@angle@rad{12}\fi%
+ % Compute first coordinate:
+ \pgf@process{\pgfpointanchor{#2}{center}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointanchor{#1}{center}}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{\pgfpointanchor{#3}{center}}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \advance\pgf@xc by-\pgf@xa%
+ \advance\pgf@yc by-\pgf@ya%
+ \pgfmathsetmacro{\tikz@start@angle@temp}{atan2(\the\pgf@yb,\the\pgf@xb)}
+ \pgfmathsetmacro{\tikz@end@angle@temp}{atan2(\the\pgf@yc,\the\pgf@xc)}
+ \ifdim\tikz@end@angle@temp pt<\tikz@start@angle@temp pt%
+ \pgfmathsetmacro{\tikz@start@angle@temp}{\tikz@start@angle@temp-360}%
+ \fi%
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryanimations.code.tex b/graphics/pgf/base/tex/tikzlibraryanimations.code.tex
new file mode 100644
index 0000000000..f4dd171693
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryanimations.code.tex
@@ -0,0 +1,904 @@
+% Copyright 2016 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryanimations.code.tex}
+
+\usepgfmodule{animations}%
+
+
+
+% Scope syntax extension:
+
+\def\tikz@collect@scope@anims#1{%
+ \let\tikz@scope@anims\pgfutil@empty%
+ \let\tikz@collect@command#1%
+ \tikz@collect@scope@anims@parse%
+}%
+\def\tikz@collect@scope@anims@parse{%
+ \pgfutil@ifnextchar[{\tikz@collect@scope@anims@opt}{%
+ \pgfutil@ifnextchar:{\tikz@collect@scope@anims@go}{%
+ \tikz@collect@scope@anims@done}}%]
+}%
+\def\tikz@collect@scope@anims@done{%
+ \expandafter\tikz@collect@command\expandafter[\tikz@scope@anims]%
+}%
+\def\tikz@collect@scope@anims@opt[{%]
+ \expandafter\tikz@collect@command\expandafter[\tikz@scope@anims%]
+}%
+\def\tikz@collect@scope@anims@go:#1=#2{%
+ \expandafter\def\expandafter\tikz@scope@anims\expandafter{\tikz@scope@anims animate={myself:={:{#1}={#2}}},}%
+ \tikz@collect@scope@anims@parse%
+}%
+
+
+
+
+%
+% The main keys:
+%
+
+\def\tikzanimateset{\pgfqkeys{/tikz/animate}}%
+\tikzanimateset{
+ .code={
+ \pgfkeys{/handlers/first char syntax=true}
+ \pgfkeyssetvalue{/handlers/first char syntax/the character "}{\tikz@animation@value}%
+ \def\tikz@anim@t{0}%
+ \def\tikz@anim@t@base{0}%
+ \def\tikz@anim@t@current{0}%
+ \tikzanimateset{#1}
+ },
+ scope/.code=\tikz@anim@scope{#1}{}{},
+ sync/.code=\tikz@anim@sync@scope{#1}{}{},
+ entry/.code=\tikz@anim@make@entry,
+ object/.code=\tikz@anim@set@object{#1},
+ attribute/.code=\tikz@anim@set@attr{#1},
+ id/.code=\tikz@anim@set@id{#1},
+ time/.code=\tikz@anim@set@time{#1},
+ value/.code=\tikz@anim@add{\tikz@anim@value{#1}},%
+ remember/.code=\pgfmathadd@{\tikz@anim@t}{\tikz@anim@t@base}\global\let#1\pgfmathresult,
+ resume/.code=\tikz@anim@resume{#1},
+ fork/.code={\tikz@anim@parse@time{#1}\pgfmathadd@\tikz@anim@t\tikz@anim@t@base\let\tikz@anim@t@base\pgfmathresult\def\tikz@anim@t{0}},
+ fork/.default = 0later,
+ base/.style={scope={/utils/exec=\let\tikz@animation@time\tikz@anim@base@text,#1,entry}},
+}%
+
+\tikzset{
+ make snapshot of/.code=\edef\tikz@temp{#1}\ifx\tikz@temp\pgfutil@empty\else\pgfsnapshot{#1}\fi,
+ make snapshot after/.code=\edef\tikz@temp{#1}\ifx\tikz@temp\pgfutil@empty\else\pgfsnapshotafter{#1}\fi,
+ make snapshot if necessary/.code=\ifpgfsysanimationsupported\else\pgfsnapshot{#1}\fi,
+ make snapshot if necessary/.default=0s,
+}%
+
+\def\tikz@anim@scope#1#2#3{%
+ {#2\tikzanimateset{#1}#3}%
+}%
+\def\tikz@anim@sync@scope#1#2#3{%
+ {%
+ #2%
+ \tikzanimateset{#1}%
+ #3%
+ \pgfmathadd@{\tikz@anim@t}{\tikz@anim@t@base}%
+ \expandafter%
+ }\expandafter\pgfmathsubtract@\expandafter{\pgfmathresult}{\tikz@anim@t@base}%
+ \tikz@anim@set@time{\pgfmathresult}%
+}%
+
+\def\tikz@anim@set@time#1{%
+ \tikz@anim@parse@time{#1}%
+ \let\tikz@anim@t@current\tikz@anim@t%
+ \pgfmathadd@\tikz@anim@t\tikz@anim@t@base%
+ \let\tikz@animation@time\pgfmathresult%
+}%
+
+\def\tikz@anim@value#1{%
+ \def\tikz@anim@result{#1}
+ \ifx\tikz@anim@result\pgf@special@current@text%
+ \else%
+ \ifx\tikz@animation@parser\relax%
+ \else%
+ \tikz@animation@parser{#1}%
+ \fi%
+ \fi%
+}%
+
+
+\def\tikz@anim@resume#1{%
+ \pgfparsetime{#1}%
+ \pgfmathsubtract@{\pgftimeresult}{\tikz@anim@t@base}%
+ \tikz@anim@set@time{\pgfmathresult}%
+}%
+
+
+% The object--attribute entries are of the following forms:
+%
+% objects:attributes
+% objects:attributes_id
+%
+
+\def\tikz@animation@syntax@check#1#2{%
+ \def\tikz@animation@rest{#1}%
+ \expandafter\pgfutil@in@\expandafter:\expandafter{\tikz@key}%
+ \ifpgfutil@in@%
+ \expandafter\tikz@anim@parse@colon\tikz@key\pgf@stop%
+ \else%
+ #2%
+ \fi%
+}%
+
+\def\tikz@anim@parse@colon#1:#2\pgf@stop{%
+ \expandafter\tikz@anim@sync@scope\expandafter{\tikz@animation@rest}{%
+ \tikz@anim@set@object{#1}%
+ \pgfutil@in@_{#2}%
+ \ifpgfutil@in@%
+ \tikz@anim@parse@under#2\pgf@stop%
+ \else%
+ \tikz@anim@parse@under#2_\pgf@stop%
+ \fi%
+ }{\tikz@anim@make@entry}%
+}%
+
+\def\tikz@anim@parse@under#1_#2\pgf@stop{%
+ \tikz@anim@set@attr{#1}%
+ \tikz@anim@set@id{#2}%
+}%
+
+\def\tikz@anim@set@attr#1{%
+ \pgfkeys@spdef\tikz@anim@a{#1}%
+ \ifx\tikz@anim@a\pgfutil@empty%
+ \else%
+ \let\tikz@anim@tl@attributes\tikz@anim@a%
+ \fi%
+}%
+
+\def\tikz@anim@set@id#1{%
+ \pgfkeys@spdef\tikz@anim@a{#1}%
+ \ifx\tikz@anim@a\pgfutil@empty%
+ \else%
+ \let\tikz@anim@tl@id\tikz@anim@a%
+ \fi%
+}%
+
+\def\tikz@anim@set@object#1{%
+ \pgfkeys@spdef\tikz@anim@a{#1}%
+ \ifx\tikz@anim@a\pgfutil@empty%
+ \else%
+ \let\tikz@anim@tl@objects\tikz@anim@a%
+ \fi%
+}%
+
+
+%
+% Parsing of values
+%
+
+\def\tikz@animation@value#1{%
+ \tikz@animation@value@parser#1\pgf@stop%
+}%
+
+\def\tikz@animation@value@parser"#1"{%
+ \def\tikz@animation@value@head{#1}%
+ \pgfutil@ifnextchar\pgf@stop{\tikz@animation@value@rest=}{%
+ \pgfutil@ifnextchar b\tikz@animation@value@rest@base\tikz@animation@value@rest%
+ }%
+}%
+\def\tikz@animation@value@rest=#1\pgf@stop{%
+ \tikz@anim@sync@scope{#1}{\expandafter\tikz@anim@add\expandafter{\expandafter\tikz@anim@value\expandafter{\tikz@animation@value@head}}}{\tikz@anim@make@entry}%
+}%
+
+\def\tikz@animation@value@rest@base base{%
+ \tikz@anim@sync@scope{}{/utils/exec=\let\tikz@animation@time\tikz@anim@base@text\expandafter\tikz@anim@add\expandafter{\expandafter\tikz@anim@value\expandafter{\tikz@animation@value@head}}}{\tikz@anim@make@entry}%
+ \pgfutil@ifnextchar\pgf@stop{\tikz@animation@value@rest=}{\tikz@animation@value@rest}%
+}%
+
+
+
+
+%
+% The parsers
+%
+
+\def\tikz@anim@simple@parse#1{} % nothing to do, \def\tikz@anim@result{#1} is already done
+
+\def\tikz@anim@slant@parse#1{\pgfmathsetmacro\tikz@anim@result{atan(#1)}}%
+
+\def\tikz@anim@dashpattern@parse#1{%
+ \pgfmathsetmacro\tikz@anim@dash@phase{\tikz@dashphase}%
+ \def\tikz@dashpattern{}%
+ \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
+ \edef\tikz@anim@result{{\tikz@dashpattern}{\tikz@anim@dash@phase pt}}%
+}%
+\def\tikz@anim@dashoffset@parse#1{%
+ \pgfmathparse{#1}%
+ \edef\tikz@anim@result{{\tikz@dashpattern}{\pgfmathresult pt}}%
+}%
+\def\tikz@anim@dash@parse#1{%
+ \tikz@anim@dash@parse@#1\pgf@stop%
+}%
+\def\tikz@anim@dash@parse@#1phase#2\pgf@stop{%
+ \pgfmathsetmacro\tikz@anim@dash@phase{#2}%
+ \def\tikz@dashpattern{}%
+ \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
+ \edef\tikz@anim@result{{\tikz@dashpattern}{\tikz@anim@dash@phase pt}}%
+}%
+
+\def\tikz@anim@xshift@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{\noexpand\pgfqpoint{\pgfmathresult pt}{0pt}}}%
+\def\tikz@anim@yshift@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{\noexpand\pgfqpoint{0pt}{\pgfmathresult pt}}}%
+
+\def\tikz@anim@xscale@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{\pgfmathresult,1}}%
+\def\tikz@anim@yscale@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{1,\pgfmathresult}}%
+
+\def\tikz@anim@shift@parse#1{\tikz@scan@one@point\tikz@anim@do@shift#1}%
+\def\tikz@anim@do@shift#1{\def\tikz@anim@result{#1}}%
+
+\def\tikz@anim@position@parse#1{%
+ \begingroup%
+ \let\tikz@transform=\relax%
+ \pgf@xc-\pgf@pt@x%
+ \pgf@yc-\pgf@pt@y%
+ \pgfsettransform\tikz@anim@saved@transform%
+ \tikz@scan@one@point\tikz@anim@do@position#1}%
+\def\tikz@anim@do@position#1{%
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \xdef\tikz@anim@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \endgroup%
+ \let\tikz@anim@result\tikz@anim@temp%
+}%
+
+\def\tikz@anim@view@parse#1{\tikz@anim@view@parse@#1\pgf@stop}%
+\def\tikz@anim@view@parse@{%
+ \pgfutil@ifnextchar({\tikz@scan@one@point\tikz@anim@view@parse@a}{\tikz@anim@view@node}%
+}%
+\def\tikz@anim@view@parse@a#1{%
+ \def\tikz@anim@result{{#1}}%
+ \pgfutil@ifnextchar r{\tikz@anim@view@parsed@rec}{\tikz@scan@one@point\tikz@anim@view@parse@b}%
+}%
+\def\tikz@anim@view@parsed@rec rectangle{\tikz@scan@one@point\tikz@anim@view@parse@b}%
+\def\tikz@anim@view@parse@b#1{%
+ \expandafter\def\expandafter\tikz@anim@result\expandafter{\tikz@anim@result{#1}}%
+ \pgfutil@ifnextchar\pgf@stop\pgfutil@gobble{\tikzerror{Wrong view syntax}}%
+}%
+\def\tikz@anim@view@node#1\pgf@stop{%
+ \expandafter\ifx\csname pgf@sh@ns@#1\endcsname\relax%
+ \tikzerror{Undefined node '#1'}%
+ \else%
+ % Compute a bounding box for the node:
+ {%
+ \pgf@process{\pgfpointanchor{#1}{west}}%
+ \pgf@xa\pgf@x \pgf@ya\pgf@y
+ \pgf@xb\pgf@x \pgf@yb\pgf@y
+ \pgf@process{\pgfpointanchor{#1}{north}}%
+ \ifdim\pgf@x<\pgf@xa \pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@xb \pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya \pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@yb \pgf@yb=\pgf@y\fi%
+ \pgf@process{\pgfpointanchor{#1}{south}}%
+ \ifdim\pgf@x<\pgf@xa \pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@xb \pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya \pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@yb \pgf@yb=\pgf@y\fi%
+ \pgf@process{\pgfpointanchor{#1}{east}}%
+ \ifdim\pgf@x<\pgf@xa \pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@xb \pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya \pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@yb \pgf@yb=\pgf@y\fi%
+ \xdef\tikz@anim@result{{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}}
+ }%
+ \fi%
+}%
+
+\def\tikz@anim@path@parse#1{%
+ {%
+ \setbox0=\hbox{{% protext against side effects
+ \pgfinterruptpath%
+ \expandafter\tikz@scan@next@command#1\pgf@stop%
+ \pgfsyssoftpath@getcurrentpath\tikz@anim@result%
+ \pgfprocessround{\tikz@anim@result}{\tikz@anim@result}%
+ \global\let\tikz@anim@result\tikz@anim@result%
+ \endpgfinterruptpath%
+ }}%
+ }%
+}%
+
+% The special along parser
+
+
+\def\tikz@anim@along#1#2{%
+ % Parse the path...
+ {%
+ \setbox0=\hbox{{% protect against side effects
+ \pgfinterruptpath%
+ \pgf@relevantforpicturesizefalse%
+ \iftikz@anim@is@position%
+ \let\tikz@transform=\relax%
+ \pgf@x-\pgf@pt@x%
+ \pgf@y-\pgf@pt@y%
+ \edef\tikz@anim@along@shift{\pgf@xc\the\pgf@x\pgf@yc\the\pgf@y}%
+ \pgfsettransformentries#1%
+ \else%
+ \pgftransformreset%
+ \fi
+ \tikz@scan@next@command#2\pgf@stop%
+ \pgfsyssoftpath@getcurrentpath\tikz@anim@parsed@path%
+ \pgfprocessround{\tikz@anim@parsed@path}{\tikz@anim@parsed@path}%
+ \iftikz@anim@is@position%
+ \tikz@anim@shift@path%
+ \global\let\tikz@anim@parsed@path\tikz@anim@patched@path%
+ \else%
+ \global\let\tikz@anim@parsed@path\tikz@anim@parsed@path%
+ \fi%
+ \endpgfinterruptpath%
+ }}%
+ }%
+ \pgfanimationset{along softpath/.expand once=\tikz@anim@parsed@path}%
+}%
+
+\def\tikz@anim@shift@path{%
+ \let\tikz@anim@patched@path\pgfutil@empty%
+ \tikz@anim@along@shift%
+ \expandafter\tikz@anim@shift@path@\tikz@anim@parsed@path\pgf@stop%
+}%
+\def\tikz@anim@shift@path@{%
+ \pgfutil@ifnextchar\pgf@stop\pgfutil@gobble{%
+ \pgfutil@ifnextchar\bgroup\tikz@anim@shift@path@sub\tikz@anim@shift@path@copy}%
+}%
+\def\tikz@anim@shift@path@copy#1{%
+ \expandafter\def\expandafter\tikz@anim@patched@path\expandafter{\tikz@anim@patched@path#1}%
+ \tikz@anim@shift@path@%
+}%
+\def\tikz@anim@shift@path@sub#1#2{%
+ \pgf@x#1%
+ \pgf@y#2%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \edef\tikz@temp{{\the\pgf@x}{\the\pgf@y}}%
+ \expandafter\tikz@anim@shift@path@copy\expandafter{\tikz@temp}%
+}%
+
+
+
+\def\tikz@anim@parse@origin#1{%
+ \tikz@scan@one@point\tikz@anim@parse@origin@#1\relax%
+}%
+\def\tikz@anim@parse@origin@#1{\tikz@anim@add{\pgfanimationset{origin={#1}}}}%
+
+
+% Internals
+
+\def\tikz@anim@tl@objects{}%
+\def\tikz@anim@tl@attributes{}%
+\def\tikz@anim@tl@id{default}%
+
+\let\tikz@anim@tl@exec@options\pgfutil@empty
+\let\tikz@anim@tl@early@options\pgfutil@empty
+
+\def\tikz@anim@add@early#1{\expandafter\def\expandafter\tikz@anim@tl@early@options\expandafter{\tikz@anim@tl@early@options#1}}%
+\def\tikz@anim@add@once@early#1{%
+ \global\advance\tikz@anim@once@count by1\relax%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\tikz@anim@tl@early@options%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@anim@tl@early@options\expandafter\tikz@anim@exec@once\expandafter{\the\tikz@anim@once@count}{#1}}%
+}%
+\def\tikz@anim@add#1{\expandafter\def\expandafter\tikz@anim@tl@exec@options\expandafter{\tikz@anim@tl@exec@options#1}}%
+\def\tikz@anim@add@once#1{%
+ \global\advance\tikz@anim@once@count by1\relax%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\tikz@anim@tl@exec@options%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@anim@tl@exec@options\expandafter\tikz@anim@exec@once\expandafter{\the\tikz@anim@once@count}{#1}}%
+}%
+\newcount\tikz@anim@once@count%
+\def\tikz@anim@exec@once#1#2{%
+ \expandafter\ifx\csname tikz@anim@once@#1\endcsname\pgf@stop%
+ \else%
+ \expandafter\let\csname tikz@anim@once@#1\endcsname\pgf@stop%
+ #2%
+ \fi%
+}%
+
+\newif\iftikz@anim@do@entry
+
+\def\tikz@anim@make@entry{%
+ \tikz@anim@do@entrytrue%
+ \ifx\tikz@anim@tl@objects\pgfutil@empty\tikz@anim@do@entryfalse\fi%
+ \ifx\tikz@anim@tl@attributes\pgfutil@empty\tikz@anim@do@entryfalse\fi%
+ \ifx\tikz@anim@tl@exec@options\pgfutil@empty\ifx\tikz@anim@tl@early@options\pgfutil@empty\tikz@anim@do@entryfalse\fi\fi%
+ \iftikz@anim@do@entry%
+ \foreach\tikz@anim@tl@object in\tikz@anim@tl@objects{%
+ \expandafter\tikzanimationattributesset\expandafter{\tikz@anim@tl@attributes}%
+ }%
+ \fi%
+}%
+
+\def\tikzanimationattributesset#1{\pgfqkeys{/tikz/animate/attributes}{#1}}%
+
+\tikzanimationattributesset{
+ .unknown/.code={
+ \let\tikz@anim@attribute@name\pgfkeyscurrentname
+ \expandafter\let\expandafter\pgf@temp\csname tikz@anim@def@pgf@attr@\tikz@anim@attribute@name\endcsname%
+ \ifx\pgf@temp\relax%
+ \tikzerror{Unknown animation attribute '\tikz@anim@attribute@name'}%
+ \else%
+ \expandafter\tikz@timeline@config\expandafter\tikz@anim@tl@object\expandafter\tikz@anim@attribute@name\expandafter\tikz@anim@tl@id\expandafter{\tikz@anim@configs}%
+ \edef\pgf@marshal{\noexpand\tikz@timeline@entry{\tikz@anim@tl@object}{\tikz@anim@attribute@name}{\tikz@anim@tl@id}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgf@marshal\expandafter{\tikz@anim@tl@early@options}}%
+ \expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\tikz@anim@entry\expandafter\expandafter\expandafter{\expandafter\tikz@anim@tl@exec@options\expandafter\def\expandafter\tikz@animation@time\expandafter{\tikz@animation@time}}}%
+ \fi%
+ }
+}%
+\let\tikz@anim@configs\pgfutil@empty
+
+\def\tikz@anim@entry#1{%
+ % Reset splines and value:
+ \let\tikz@anim@result\pgfutil@empty%
+ \pgf@anim@reset@linear%
+ #1%
+ \ifx\tikz@anim@result\pgfutil@empty%
+ \else%
+ \ifx\tikz@animation@time\pgfutil@empty%
+ \else%
+ \ifx\tikz@animation@time\tikz@anim@base@text%
+ \expandafter\pgf@anim@base\expandafter{\tikz@anim@result}%
+ \else%
+ \expandafter\expandafter\expandafter\pgf@anim@entry%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@animation@time\expandafter}\expandafter{\tikz@anim@result}%
+ \fi%
+ \fi%
+ \fi%
+}%
+\let\tikz@animation@time\pgfutil@empty%
+\def\tikz@anim@base@text{base}%
+
+\tikzanimateset{
+ .unknown/.code={%
+ \let\tikz@key\pgfkeyscurrentname%
+ \tikz@animation@syntax@check{#1}{\tikz@anim@options{#1}}%
+ }
+}%
+
+
+\def\tikz@anim@options#1{
+ \let\tikz@anim@key\pgfkeyscurrentname%
+ \pgfqkeys{/tikz/animate/options}{\tikz@anim@key/.try={#1}}%
+ \ifpgfkeyssuccess%
+ \else%
+ \def\tikz@anim@unparsed@value{#1}%
+ \expandafter\tikz@anim@time@test\tikz@anim@key\pgf@stop%
+ \fi%
+}%
+
+\tikzanimateset{
+ options/.cd,
+ name/.code=\tikz@anim@add{\pgfanimationset{name={#1}}},
+ forever/.code=\tikz@anim@add{\pgfanimationset{freeze at end}},
+ freeze/.code=\tikz@anim@add{\pgfanimationset{freeze at end}},
+ restart/.code=\tikz@anim@add{\pgfanimationset{restart={#1}}},
+ repeats/.code=\tikz@anim@add{\pgfanimationset{repeats={#1}}},
+ repeats/.default=,
+ repeat/.code=\tikz@anim@add{\pgfanimationset{repeats={#1}}},
+ repeat/.default=,
+ begin/.code=\tikz@anim@add@once{\pgfanimationset{begin={#1}}},
+ end/.code=\tikz@anim@add@once{\pgfanimationset{end={#1}}},
+ begin on/.code=\tikz@anim@event{begin}{#1},
+ end on/.code=\tikz@anim@event{begin}{#1},
+ begin snapshot/.code=\tikz@anim@add{\pgfanimationset{begin snapshot={#1}}},
+ origin/.code=\tikz@anim@parse@origin{#1},
+ transform/.code=\tikz@anim@add{\pgfanimationset{transform={\let\tikz@transform\relax\tikzset{#1}}}},
+ along/.code=\tikz@anim@handle@along#1\pgf@stop,
+ entry control/.code=\tikz@anim@add{\pgfanimationset{entry control=#1}},
+ exit control/.code=\tikz@anim@add{\pgfanimationset{exit control=#1}},
+ stay/.code=\tikz@anim@add{\pgfanimationset{stay}},
+ jump/.code=\tikz@anim@add{\pgfanimationset{jump}},
+ ease/.style={
+ entry control={1-(#1)}{1},
+ exit control={#1}{0}
+ },
+ ease/.default=0.5,
+ ease in/.style={
+ entry control={1-(#1)}{1},
+ },
+ ease in/.default=0.5,
+ ease out/.style={
+ exit control={#1}{0},
+ },
+ ease out/.default=0.5,
+ arrows/.code=\tikz@anim@add@early{\pgfanimationset{arrows={#1}}},
+ shorten >/.code=\tikz@anim@add@early{\pgfanimationset{shorten >={#1}}},
+ shorten </.code=\tikz@anim@add@early{\pgfanimationset{snorten <={#1}}},
+}%
+\newif\iftikz@anim@along
+
+\def\tikz@anim@t{0}%
+
+\def\tikz@anim@handle@along#1{%
+ \pgfutil@ifnextchar s{\tikz@anim@handle@sloped{#1}}{\tikz@anim@handle@upright{#1}}%
+}%
+\def\tikz@anim@handle@sloped#1sloped{%
+ \pgfgettransform\tikz@anim@trans@pre%
+ \expandafter\tikz@anim@add@once%
+ \expandafter{%
+ \expandafter\tikz@anim@along\expandafter{\tikz@anim@trans@pre}{#1}%
+ \pgfsysanimkeycanvastransform{%
+ \pgf@xc\pgf@pt@x%
+ \pgf@yc\pgf@pt@y%
+ \pgftransformreset%
+ \pgf@pt@x\pgf@xc%
+ \pgf@pt@y\pgf@yc%
+ {\pgflowlevelsynccm}%
+ }{\pgftransforminvert\pgflowlevelsynccm}%
+ \pgfanimationset{rotate along=true}%
+ }%
+ \def\tikz@anim@configs{\tikz@anim@alongtrue}%
+ \tikz@anim@handle@in%
+}%
+\def\tikz@anim@handle@upright#1upright{%
+ \pgfgettransform\tikz@anim@trans@pre%
+ \expandafter\tikz@anim@add@once%
+ \expandafter{%
+ \expandafter\tikz@anim@along\expandafter{\tikz@anim@trans@pre}{#1}%
+ \pgfsysanimkeycanvastransform{}{}%
+ }%
+ \def\tikz@anim@configs{\tikz@anim@alongtrue}%
+ \tikz@anim@handle@in%
+}%
+\def\tikz@anim@handle@in{%
+ \pgfutil@ifnextchar i{\tikz@anim@handle@in@yes}{\tikz@anim@handle@in@no}%
+}%
+\def\tikz@anim@handle@in@no\pgf@stop{}%
+\def\tikz@anim@handle@in@yes in#1\pgf@stop{%
+ \tikzanimateset{scope={time=0,value=0,entry,time=#1,value=1,entry}}%
+}%
+
+
+
+\def\tikz@anim@event#1#2{%
+ {%
+ % evaluate #2 once to determine the id now
+ \let\pgf@anim@id\pgfutil@empty%
+ \pgfqkeys{/pgf/animation/events}{#2}%
+ \expandafter}%
+ \expandafter\def\expandafter\tikz@anim@temp@id\expandafter{\pgf@anim@id}%
+ \ifx\tikz@anim@temp@id\pgfutil@empty%
+ \def\tikz@temp{#1 on={of id=\tikz@anim@current@id,#2}}%
+ \else
+ \expandafter\tikz@anim@event@setter\expandafter{\tikz@anim@temp@id}{#1}{#2}%
+ \fi%
+ \expandafter\tikz@anim@add@once\expandafter{\expandafter\pgfanimationset\expandafter{\tikz@temp}}%
+}%
+\def\tikz@anim@event@setter#1#2#3{%
+ \def\tikz@temp{#2 on={#3,of id=#1}}%
+}%
+
+\def\tikz@anim@time@test#1#2\pgf@stop{%
+ \edef\tikz@temp{\meaning#1}%
+ \expandafter\ifx\csname tikz@anim@test@\tikz@temp\endcsname\relax%
+ \tikzerror{I do not know the timing key '#1#2' to which you passed '\tikz@anim@unparsed@value'}%
+ \else%
+ \expandafter\tikz@anim@sync@scope\expandafter{\tikz@anim@unparsed@value}{\tikz@anim@set@time{#1#2}}{\tikz@anim@make@entry}%
+ \fi%
+}%
+
+\def\tikz@anim@parse@time#1{%
+ \pgfutil@in@{later\pgf@stop}{#1\pgf@stop}%
+ \ifpgfutil@in@%
+ \tikz@anim@parse@later#1\pgf@stop%
+ \else%
+ \pgfparsetime{#1}\let\tikz@anim@t\pgftimeresult%
+ \fi%
+}%
+\def\tikz@anim@parse@later#1later\pgf@stop{%
+ \pgfparsetime{#1+\tikz@anim@t@current}\let\tikz@anim@t\pgftimeresult%
+}%
+
+\expandafter\let\csname tikz@anim@test@the character 0\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 1\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 2\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 3\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 4\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 5\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 6\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 7\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 8\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 9\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character -\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character +\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character .\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character (\endcsname\pgfutil@empty
+
+
+
+
+
+% Configure an animation attribute
+%
+% #1 = tikz attribute name
+% #2 = configuration
+%
+% Description:
+%
+% Sets up internals for the tikz attribute.
+
+\def\tikzanimationdefineattribute#1#2{%
+ \expandafter\def\csname tikz@anim@def@pgf@attr@#1\endcsname{#1}%
+ \expandafter\let\csname tikz@anim@def@no@node@#1\endcsname\pgfutil@empty
+ \expandafter\let\csname tikz@anim@def@is@node@#1\endcsname\pgfutil@empty
+ \expandafter\let\csname tikz@anim@def@code@#1\endcsname\pgfutil@empty
+ \expandafter\let\csname tikz@anim@def@parser@#1\endcsname\tikz@anim@simple@parse
+ \def\tikz@anim@attr{#1}%
+ \pgfkeys{/tikz/animate/@attrdef/.cd,#2}%
+}%
+
+\pgfkeys{/tikz/animate/@attrdef/.cd,
+ pgf attribute name/.code=\expandafter\def\csname tikz@anim@def@pgf@attr@\tikz@anim@attr\endcsname{#1},
+ pgf attribute name scope/.code=\expandafter\def\csname tikz@anim@def@pgf@attr@@scope@\tikz@anim@attr\endcsname{#1},
+ pgf attribute name node/.code=\expandafter\def\csname tikz@anim@def@pgf@attr@@node@\tikz@anim@attr\endcsname{#1},
+ scope type/.code=\expandafter\def\csname tikz@anim@def@no@node@\tikz@anim@attr\endcsname{#1},
+ node type/.code=\expandafter\def\csname tikz@anim@def@is@node@\tikz@anim@attr\endcsname{#1},
+ code/.code=\expandafter\def\csname tikz@anim@def@code@\tikz@anim@attr\endcsname{#1},
+ setup/.code=\expandafter\def\csname tikz@anim@def@setup@\tikz@anim@attr\endcsname{#1},
+ parser/.code=\expandafter\def\csname tikz@anim@def@parser@\tikz@anim@attr\endcsname{#1},
+}%
+
+
+% Configure an animation attribute list
+%
+% #1 = tikz attribute list name
+% #2 = list of tikz attributes
+%
+% Description:
+%
+% Sets up internals for the tikz attribute.
+
+\def\tikzanimationdefineattributelist#1#2{%
+ \tikzanimationattributesset{#1/.style={#2}}%
+}%
+
+
+
+
+% Definition of the tikz attributes
+
+
+\tikzanimationdefineattributelist{color}{@color,text}%
+\tikzanimationdefineattribute{@color}{pgf attribute name=color,node type=.background}%
+\tikzanimationdefineattribute{dash pattern}{pgf attribute name=dash,parser=dashpattern, node type=.background}%
+\tikzanimationdefineattribute{dash phase}{pgf attribute name=dash,parser=dashoffset, node type=.background}%
+\tikzanimationdefineattribute{dash}{parser=dash, node type=.background}%
+\tikzanimationdefineattribute{draw opacity}{pgf attribute name=stroke opacity}%
+\tikzanimationdefineattribute{draw}{pgf attribute name=stroke, node type=.background}%
+\tikzanimationdefineattribute{fill opacity}{}%
+\tikzanimationdefineattribute{fill}{node type=.background}%
+\tikzanimationdefineattribute{line width}{node type=.background}%
+\tikzanimationdefineattribute{path}{pgf attribute name=softpath, scope type=.path, node type=.background.path, parser=path}%
+\tikzanimationdefineattribute{opacity}{}%
+\tikzanimationdefineattribute{position}{%
+ pgf attribute name=\iftikz@anim@along motion\else translate\fi,
+ parser=\iftikz@anim@along simple\else position\fi,
+ setup=\tikz@anim@position@setup,
+}%
+\tikzanimationdefineattribute{rotate}{}%
+\tikzanimationdefineattribute{scale}{}%
+\tikzanimationdefineattribute{shift}{
+ pgf attribute name=\iftikz@anim@along motion\else translate\fi,
+ parser=\iftikz@anim@along simple\else shift\fi
+}%
+\tikzanimationdefineattribute{stage}{}%
+\tikzanimationdefineattribute{text opacity}{pgf attribute name=fill opacity, node type=.text, pgf attribute name scope=none}%
+\tikzanimationdefineattribute{text}{pgf attribute name=color, node type=.text, pgf attribute name scope=none}%
+\tikzanimationdefineattribute{view}{scope type=.view, parser=view}%
+\tikzanimationdefineattribute{visible}{}%
+\tikzanimationdefineattribute{xshift}{pgf attribute name=translate, parser=xshift}%
+\tikzanimationdefineattribute{xscale}{pgf attribute name=scale, parser=xscale}%
+\tikzanimationdefineattribute{xskew}{}%
+\tikzanimationdefineattribute{xslant}{pgf attribute name=xskew, parser=slant}%
+\tikzanimationdefineattribute{yshift}{pgf attribute name=translate, parser=yshift}%
+\tikzanimationdefineattribute{yskew}{}%
+\tikzanimationdefineattribute{yslant}{pgf attribute name=yskew, parser=slant}%
+\tikzanimationdefineattribute{yscale}{pgf attribute name=scale, parser=yscale}%
+
+
+\def\tikz@anim@position@setup{%
+ \pgfgettransform\tikz@anim@saved@transform%
+ \expandafter\def\expandafter\tikz@temp\expandafter{%
+ \expandafter\def\expandafter\tikz@anim@saved@transform\expandafter{\tikz@anim@saved@transform}%
+ \pgfsysanimkeycanvastransform{}{}%
+ \tikz@anim@is@positiontrue%
+ }%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@anim@initial@options%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@temp\tikz@anim@initial@options}%
+}%
+\newif\iftikz@anim@is@position
+
+
+% The TikZ animation callbacks
+%
+% Description:
+%
+% The callbacks called by tikz.code.tex whenever an object is
+% created. These callbacks will add the accumulated animation code.
+
+\def\tikz@anim@id@hook{%
+ \expandafter\ifx\csname tikz@anim@att@\tikz@id@name\endcsname\relax%
+ % No named animation:
+ % Now, check for auto animation:
+ \expandafter\ifx\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+ \else%
+ % Auto animation%
+ \ifx\tikz@id@name\pgfutil@empty% Id set?
+ % No, so set it
+ \def\tikz@id@name{@auto}%
+ \fi%
+ \pgfidrefnextuse\tikz@anim@current@id\tikz@id@name%
+ \csname tikz@anim@att@\tikz@auto@id\endcsname%
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+ \fi%
+ \else%
+ % Named animation:
+ \pgfidrefnextuse\tikz@anim@current@id\tikz@id@name%
+ \csname tikz@anim@att@\tikz@id@name\endcsname%
+ \csname tikz@anim@att@\tikz@auto@id\endcsname% and unnamed animation
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@id@name\endcsname\relax%
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+ \fi%
+}%
+
+% Add hook:
+\expandafter\def\expandafter\tikz@id@hook\expandafter{\tikz@id@hook\tikz@anim@id@hook}%
+
+
+
+% Attaches an animation to a named object (named in tikz)
+%
+% #1 = name of the object. If equal to the special text "myself", the
+% next created object is meant.
+% #2 = Animation code. When this code is executed, the following
+% things will be setup:
+%
+% \iftikz@is@node will be set to true or false
+% depending on whether the name references a node.
+%
+% \tikz@id@name will be set to the name of the object,
+% typically #1, except when #1 was ".", in this case another
+% name may have been used by the user, which will be used
+% instead.
+%
+% Description:
+%
+% After the call, the next time an object named #1 is created in TikZ
+% (using name=#1), the code #2 will be executed inside a scope to
+% create an animation of the object.
+
+\def\tikzanimationattachto#1#2{%
+ {%
+ \def\tikz@anim@name{#1}%
+ \ifx\tikz@anim@name\pgfutil@empty%
+ \tikzerror{Trying to attach an animation to an unnamed object. This should not happen.}%
+ \else%
+ \expandafter\ifx\csname tikz@anim@att@\tikz@anim@name\endcsname\relax%
+ \expandafter\gdef\csname tikz@anim@att@\tikz@anim@name\endcsname{#2}%
+ \else%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@att@\tikz@anim@name\endcsname%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\tikz@temp#2}%
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@anim@name\endcsname\tikz@temp%
+ \fi%
+ \fi%
+ }%
+}%
+\def\tikz@auto@id{myself}%
+\expandafter\let\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+
+
+% Add config code to a timeline
+%
+% #1 = The object (may be "myself")
+% #2 = The attribute (see pgfanimateattribute)
+% #3 = Timeline sequence identifier
+% #4 = code
+%
+% Description:
+%
+% This commands adds the code to the timeline configuration, which is
+% code that gets executed before the rest of entries of the timeline
+% are executed.
+
+\def\tikz@timeline@config#1#2#3#4{%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\csname tikz@a@conf@#1@#2@#3\endcsname}%
+ \expandafter\ifx\tikz@temp\relax%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\tikz@temp\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\global\expandafter\let\tikz@temp\relax}%
+ \fi%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\tikz@temp\expandafter\expandafter\expandafter{\tikz@temp#4}%
+}%
+
+
+
+% Add a timeline entry
+%
+% #1 = The object (may be "myself")
+% #2 = The attribute (see pgfanimateattribute)
+% #3 = Timeline sequence identifier
+% #4 = early code
+% #5 = later code
+%
+% Description:
+%
+% This command stores an option with a timeline of an object. For each
+% object--attribute--identifier tuple a timeline can be created, for
+% which the values of #4 and #5 are collected. Later on, \pgfanimateattribute
+% will be called for the pgf attribute associated with tikz attribute,
+% the type associated with it and initial code, followed by the
+% accumulated values of #4 and then the accumulated values of #5.
+
+\def\tikz@timeline@entry#1#2#3#4#5{%
+ % First, does the object have an animation already attached?
+ \expandafter\ifx\csname tikz@a@tlo@#1\endcsname\relax%
+ % No, first entry!
+ % Create call:
+ \edef\pgf@marshal{\noexpand\tikzanimationattachto{#1}{\expandafter\noexpand\csname tikz@a@tlo@#1\endcsname}}%
+ \pgf@marshal%
+ \expandafter\gdef\csname tikz@a@tlo@#1\endcsname{\tikz@anim@cleanup{#1}}%
+ \fi%
+ % Second, does the timeline exist?
+ \expandafter\ifx\csname tikz@a@tlc@#1@#2@#3\endcsname\relax%
+ % No, first entry!
+ \def\tikz@anim@initial@early@options{#4}%
+ \def\tikz@anim@initial@options{#5}%
+ \csname tikz@anim@def@setup@#2\endcsname%
+ % Create timeline...
+ \expandafter\global\expandafter\let\csname tikz@a@tlc@#1@#2@#3\endcsname\tikz@anim@initial@options%
+ \expandafter\global\expandafter\let\csname tikz@a@tld@#1@#2@#3\endcsname\tikz@anim@initial@early@options%
+ % ...and add to calls
+ \expandafter\let\expandafter\pgf@temp\csname tikz@a@tlo@#1\endcsname%
+ \expandafter\def\expandafter\pgf@temp@name\expandafter{\tikz@anim@create{#1}{#2}{#3}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@temp\expandafter\expandafter\expandafter{\expandafter\pgf@temp\pgf@temp@name}%
+ \expandafter\global\expandafter\let\csname tikz@a@tlo@#1\endcsname\pgf@temp%
+ \else%
+ % Add to timeline:
+ \expandafter\let\expandafter\pgf@temp\csname tikz@a@tld@#1@#2@#3\endcsname%
+ \expandafter\def\expandafter\pgf@temp\expandafter{\pgf@temp#4}%
+ \expandafter\global\expandafter\let\csname tikz@a@tld@#1@#2@#3\endcsname\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\csname tikz@a@tlc@#1@#2@#3\endcsname%
+ \expandafter\def\expandafter\pgf@temp\expandafter{\pgf@temp#5}%
+ \expandafter\global\expandafter\let\csname tikz@a@tlc@#1@#2@#3\endcsname\pgf@temp%
+ \fi%
+}%
+
+
+\def\tikz@anim@cleanup#1{%
+ \expandafter\global\expandafter\let\csname tikz@a@tlo@#1\endcsname\relax%
+}%
+
+\def\tikz@anim@create#1#2#3{%
+ \csname tikz@a@conf@#1@#2@#3\endcsname%
+ \iftikz@is@node%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@def@pgf@attr@@node@#2\endcsname%
+ \else%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@def@pgf@attr@@scope@#2\endcsname%
+ \fi%
+ \ifx\tikz@temp\relax%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@def@pgf@attr@#2\endcsname%
+ \fi%
+ \expandafter\pgfanimateattributecode\expandafter{\tikz@temp}{%
+ \iftikz@is@node%
+ \edef\tikz@anim@whom{\tikz@id@name\csname tikz@anim@def@is@node@#2\endcsname}%
+ \else%
+ \edef\tikz@anim@whom{\tikz@id@name\csname tikz@anim@def@no@node@#2\endcsname}%
+ \fi%
+ \pgfanimationset{whom=\tikz@anim@whom}%
+ \expandafter\let\expandafter\tikz@animation@parser\csname tikz@anim@\csname tikz@anim@def@parser@#2\endcsname @parse\endcsname%
+ \csname tikz@anim@def@code@#2\endcsname%
+ \csname tikz@a@tld@#1@#2@#3\endcsname%
+ \csname tikz@a@tlc@#1@#2@#3\endcsname%
+ }%
+ \expandafter\global\expandafter\let\csname tikz@a@tlc@#1@#2@#3\endcsname\relax%
+ \expandafter\global\expandafter\let\csname tikz@a@tld@#1@#2@#3\endcsname\relax%
+}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryarrows.code.tex b/graphics/pgf/base/tex/tikzlibraryarrows.code.tex
new file mode 100644
index 0000000000..946f87455e
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryarrows.code.tex
@@ -0,0 +1,14 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryarrows.code.tex}
+
+\usepgflibrary{arrows}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryautomata.code.tex b/graphics/pgf/base/tex/tikzlibraryautomata.code.tex
new file mode 100644
index 0000000000..93dc77be77
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryautomata.code.tex
@@ -0,0 +1,105 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryautomata.code.tex}
+
+\usetikzlibrary{shapes.multipart}%
+
+% Styles for states:
+
+\tikzset{every state/.style= {}}%
+
+\tikzset{state without output/.style= {circle,draw,minimum size=2.5em,every state}}%
+\tikzset{state with output/.style= {circle split,draw,minimum size=2.5em,every state}}%
+
+\tikzset{accepting by arrow/.style= {after node path=
+{
+ {
+ [to path=
+ {
+ [->,double=none,every accepting by arrow]
+ --
+ ([shift=(\tikz@accepting@angle:\tikz@accepting@distance)]\tikztostart.\tikz@accepting@angle)
+ node [shape=rectangle,anchor=\tikz@accepting@anchor] {\tikz@accepting@text}
+ }]
+ edge ()
+ }
+}}}%
+\tikzset{every accepting by arrow/.style={}}%
+\tikzset{accepting by double/.style= {double,outer sep=.5\pgflinewidth+.3pt}} % .3pt is half double width distance
+
+\tikzset{initial by arrow/.style= {after node path=
+{
+ {
+ [to path=
+ {
+ [->,double=none,every initial by arrow]
+ ([shift=(\tikz@initial@angle:\tikz@initial@distance)]\tikztostart.\tikz@initial@angle)
+ node [shape=rectangle,anchor=\tikz@initial@anchor] {\tikz@initial@text}
+ -- (\tikztostart)}]
+ edge ()
+ }
+}}}%
+\tikzset{every initial by arrow/.style={}}%
+
+\tikzset{initial by diamond/.style={shape=diamond}}%
+
+
+\tikzoption{initial text}{\tikzaddafternodepathoption{\def\tikz@initial@text{#1}}}%
+\tikzoption{accepting text}{\tikzaddafternodepathoption{\def\tikz@accepting@text{#1}}}%
+
+\tikzoption{initial where}{\tikzaddafternodepathoption{\csname tikz@initial@compute@#1\endcsname}}%
+\tikzoption{accepting where}{\tikzaddafternodepathoption{\csname tikz@accepting@compute@#1\endcsname}}%
+
+\tikzoption{initial distance}{\tikzaddafternodepathoption{\def\tikz@initial@distance{#1}}}%
+\tikzoption{accepting distance}{\tikzaddafternodepathoption{\def\tikz@accepting@distance{#1}}}%
+
+\def\tikz@initial@text{start}%
+\def\tikz@accepting@text{}%
+
+\def\tikz@initial@distance{3ex}%
+\def\tikz@accepting@distance{3ex}%
+
+\def\tikz@initial@compute@above{\def\tikz@initial@angle{90}\def\tikz@initial@anchor{south}}%
+\def\tikz@initial@compute@below{\def\tikz@initial@angle{270}\def\tikz@initial@anchor{north}}%
+\def\tikz@initial@compute@left{\def\tikz@initial@angle{180}\def\tikz@initial@anchor{east}}%
+\def\tikz@initial@compute@right{\def\tikz@initial@angle{0}\def\tikz@initial@anchor{west}}%
+
+\def\tikz@initial@angle{180}%
+\def\tikz@initial@anchor{east}%
+
+\def\tikz@accepting@compute@above{\def\tikz@accepting@angle{90}\def\tikz@accepting@anchor{south}}%
+\def\tikz@accepting@compute@below{\def\tikz@accepting@angle{270}\def\tikz@accepting@anchor{north}}%
+\def\tikz@accepting@compute@left{\def\tikz@accepting@angle{180}\def\tikz@accepting@anchor{east}}%
+\def\tikz@accepting@compute@right{\def\tikz@accepting@angle{0}\def\tikz@accepting@anchor{west}}%
+
+\def\tikz@accepting@angle{0}%
+\def\tikz@accepting@anchor{west}%
+
+
+\tikzset{initial above/.style= {initial by arrow,initial where=above}}%
+\tikzset{initial below/.style= {initial by arrow,initial where=below}}%
+\tikzset{initial left/.style= {initial by arrow,initial where=left}}%
+\tikzset{initial right/.style= {initial by arrow,initial where=right}}%
+
+\tikzset{accepting above/.style= {accepting by arrow,accepting where=above}}%
+\tikzset{accepting below/.style= {accepting by arrow,accepting where=below}}%
+\tikzset{accepting left/.style= {accepting by arrow,accepting where=left}}%
+\tikzset{accepting right/.style= {accepting by arrow,accepting where=right}}%
+
+
+% Defaults:
+
+\tikzset{state/.style= {state without output}}%
+\tikzset{accepting/.style= {accepting by double}}%
+\tikzset{initial/.style= {initial by arrow}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarybabel.code.tex b/graphics/pgf/base/tex/tikzlibrarybabel.code.tex
new file mode 100644
index 0000000000..cf307cf6a8
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarybabel.code.tex
@@ -0,0 +1,17 @@
+% Copyright 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarybabel.code.tex}
+
+\tikzset{
+ handle active characters in code,
+ handle active characters in nodes,
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarybackgrounds.code.tex b/graphics/pgf/base/tex/tikzlibrarybackgrounds.code.tex
new file mode 100644
index 0000000000..690953b805
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarybackgrounds.code.tex
@@ -0,0 +1,148 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarybackgrounds.code.tex}
+
+
+% Layers
+
+\pgfdeclarelayer{background}%
+\pgfsetlayers{background,main}%
+
+
+% Switch command
+\tikzset{on background layer/.style={
+ execute at begin scope={%
+ \pgfonlayer{background}%
+ \let\tikz@options=\pgfutil@empty%
+ \tikzset{every on background layer/.try,#1}%
+ \tikz@options},
+ execute at end scope={\endpgfonlayer}
+ }
+}%
+
+
+% Main style
+
+\tikzset{background rectangle/.style= {draw}}%
+\tikzset{background top/.style= {draw}}%
+\tikzset{background bottom/.style= {draw}}%
+\tikzset{background left/.style= {draw}}%
+\tikzset{background right/.style= {draw}}%
+\tikzset{background grid/.style= {help lines,draw}}%
+
+\tikzoption{inner frame sep}{\def\tikz@framexsep{#1}\def\tikz@frameysep{#1}}%
+\tikzoption{inner frame xsep}{\def\tikz@framexsep{#1}}%
+\tikzoption{inner frame ysep}{\def\tikz@frameysep{#1}}%
+\def\tikz@framexsep{1ex}%
+\def\tikz@frameysep{1ex}%
+
+\tikzoption{outer frame sep}{\def\tikz@outerframexsep{#1}\def\tikz@outerframeysep{#1}}%
+\tikzoption{outer frame xsep}{\def\tikz@outerframexsep{#1}}%
+\tikzoption{outer frame ysep}{\def\tikz@outerframeysep{#1}}%
+\def\tikz@outerframexsep{0ex}%
+\def\tikz@outerframeysep{0ex}%
+
+
+% Looseness
+
+\tikzset{loose background/.style= {inner frame sep=2ex}}%
+\tikzset{tight background/.style= {inner frame sep=0ex}}%
+
+
+
+% Showing background styles
+
+\tikzset{framed/.style= {style=show background rectangle}}%
+\tikzset{gridded/.style= {style=show background grid}}%
+
+\tikzset{show background rectangle/.style={execute at end picture=\tikz@background@framed}}%
+\tikzset{show background top/.style= {execute at end picture=\tikz@background@top}}%
+\tikzset{show background bottom/.style= {execute at end picture=\tikz@background@bottom}}%
+\tikzset{show background left/.style= {execute at end picture=\tikz@background@left}}%
+\tikzset{show background right/.style= {execute at end picture=\tikz@background@right}}%
+\tikzset{show background grid/.style= {execute at end picture=\tikz@background@grid}}%
+
+
+% Implementation
+
+\def\tikz@background@save{%
+ \pgftransformreset%
+ \ifx\tikz@bg@minx\@undefined%
+ \pgf@xb=\pgf@picminx%
+ \pgf@yb=\pgf@picminy%
+ \pgf@xc=\pgf@picmaxx%
+ \pgf@yc=\pgf@picmaxy%
+ \pgfmathsetlength{\pgf@x}{\tikz@framexsep}%
+ \pgfmathsetlength{\pgf@y}{\tikz@frameysep}%
+ \advance\pgf@xb by-\pgf@x%
+ \advance\pgf@yb by-\pgf@y%
+ \advance\pgf@xc by\pgf@x%
+ \advance\pgf@yc by\pgf@y%
+ \edef\tikz@bg@minx{\the\pgf@xb}%
+ \edef\tikz@bg@miny{\the\pgf@yb}%
+ \edef\tikz@bg@maxx{\the\pgf@xc}%
+ \edef\tikz@bg@maxy{\the\pgf@yc}%
+ \pgfmathsetlength{\pgf@x}{\tikz@outerframexsep}%
+ \pgfmathsetlength{\pgf@y}{\tikz@outerframeysep}%
+ \advance\pgf@xb by-\pgf@x%
+ \advance\pgf@yb by-\pgf@y%
+ \advance\pgf@xc by\pgf@x%
+ \advance\pgf@yc by\pgf@y%
+ \edef\tikz@bg@outerminx{\the\pgf@xb}%
+ \edef\tikz@bg@outerminy{\the\pgf@yb}%
+ \edef\tikz@bg@outermaxx{\the\pgf@xc}%
+ \edef\tikz@bg@outermaxy{\the\pgf@yc}%
+ \fi%
+}%
+
+\def\tikz@background@framed{%
+ \tikz@background@save%
+ \pgfonlayer{background}
+ \path[style=background rectangle] (\tikz@bg@minx,\tikz@bg@miny) rectangle (\tikz@bg@maxx,\tikz@bg@maxy);
+ \endpgfonlayer
+}%
+
+\def\tikz@background@top{%
+ \tikz@background@save%
+ \pgfonlayer{background}
+ \path[style=background top] (\tikz@bg@outerminx,\tikz@bg@maxy) -- (\tikz@bg@outermaxx,\tikz@bg@maxy);
+ \endpgfonlayer
+}%
+
+\def\tikz@background@bottom{%
+ \tikz@background@save%
+ \pgfonlayer{background}
+ \path[style=background bottom] (\tikz@bg@outerminx,\tikz@bg@miny) -- (\tikz@bg@outermaxx,\tikz@bg@miny);
+ \endpgfonlayer
+}%
+
+\def\tikz@background@left{%
+ \tikz@background@save%
+ \pgfonlayer{background}
+ \path[style=background left] (\tikz@bg@minx,\tikz@bg@outerminy) -- (\tikz@bg@minx,\tikz@bg@outermaxy);
+ \endpgfonlayer
+}%
+
+\def\tikz@background@right{%
+ \tikz@background@save%
+ \pgfonlayer{background}
+ \path[style=background right] (\tikz@bg@maxx,\tikz@bg@outerminy) -- (\tikz@bg@maxx,\tikz@bg@outermaxy);
+ \endpgfonlayer
+}%
+
+\def\tikz@background@grid{%
+ \tikz@background@save%
+ \pgfonlayer{background}
+ \path[style=background grid] (\tikz@bg@minx,\tikz@bg@miny) grid (\tikz@bg@maxx,\tikz@bg@maxy);
+ \endpgfonlayer
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarybending.code.tex b/graphics/pgf/base/tex/tikzlibrarybending.code.tex
new file mode 100644
index 0000000000..be9c8bb707
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarybending.code.tex
@@ -0,0 +1,15 @@
+% Copyright 2013 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarybending.code.tex}
+
+\usepgfmodule{bending}%
+\tikzset{arrows=[flex]}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycalc.code.tex b/graphics/pgf/base/tex/tikzlibrarycalc.code.tex
new file mode 100644
index 0000000000..594ccc6c49
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycalc.code.tex
@@ -0,0 +1,637 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarycalc.code.tex}
+
+%
+%
+% Part I: The let path command
+%
+%
+
+
+%
+% Syntax: let \p{name1} = (coord), \p{name2} = (coord), ... in ...
+%
+% Currently (this may get more fancy in the future), the (coord)s are
+% evaluated one by one. If the first evaluates to, say, (10pt,20pt),
+% the macro \p{name1} is set to "10pt,20pt" (without parentheses), the
+% macro \x{name1} is set to "10pt" and the macro \y{name1} is set to
+% "20pt".
+%
+% If you use a number for {name}, you need no parentheses, so you
+% could write:
+%
+% \draw let
+% \p1 = (1,1),
+% \p2 = ($ 2.5*(3,2) $)
+% in
+% (\x1,\x2) -- (\y1,\y2);
+
+\def\tikz@let@command et{%
+ \let\p=\tikz@cc@dop%
+ \let\x=\tikz@cc@dox%
+ \let\y=\tikz@cc@doy%
+ \let\n=\tikz@cc@don%
+ \let\rawx=\tikz@cc@dotempx%
+ \let\rawy=\tikz@cc@dotempy%
+ \let\rawz=\tikz@cc@dotempz%
+ \let\coord=\tikz@cc@docoord%
+ \pgfutil@ifnextchar i{\tikz@cc@stop@let}{\tikz@cc@handle@line}%
+}%
+\def\tikz@cc@handle@line{%
+ \pgfutil@ifnextchar\p{%
+ \tikz@cc@handle@coor%
+ }{%
+ \pgfutil@ifnextchar\n{%
+ \tikz@cc@handle@num%
+ }{%
+ \pgfutil@ifnextchar i{%
+ \tikz@cc@stop@let
+ }{%
+ \tikzerror{``\string\p'' or ``\string\n'' expected}%
+ }%
+ }%
+ }%
+}%
+\def\tikz@cc@handle@num\n#1#2=#3{%
+ \pgfmathparse{#3}%
+ \expandafter\edef\csname tikz@cc@n@#1\endcsname{\pgfmathresult\ifpgfmathunitsdeclared pt\fi}
+ \pgfutil@ifnextchar,{\tikz@cc@handle@nextline}{\tikz@cc@stop@let}%
+}%
+\def\tikz@cc@handle@coor\p#1#2={%
+ \def\tikz@cc@coord@name{#1}%
+ \tikz@scan@one@point\tikz@cc@dolet%
+}%
+\def\tikz@cc@dolet#1{%
+ \pgf@process{#1}%
+ \expandafter\edef\csname tikz@cc@p@\tikz@cc@coord@name\endcsname{\the\pgf@x,\the\pgf@y}%
+ \expandafter\edef\csname tikz@cc@x@\tikz@cc@coord@name\endcsname{\the\pgf@x}%
+ \expandafter\edef\csname tikz@cc@y@\tikz@cc@coord@name\endcsname{\the\pgf@y}%
+ \pgfutil@letfirst\pgfutil@next{#1}%
+ \ifx\pgfutil@next\pgfpointxyz
+ \expandafter\edef\csname tikz@cc@tempx@\tikz@cc@coord@name\endcsname{\pgftemp@x}%
+ \expandafter\edef\csname tikz@cc@tempy@\tikz@cc@coord@name\endcsname{\pgftemp@y}%
+ \expandafter\edef\csname tikz@cc@tempz@\tikz@cc@coord@name\endcsname{\pgftemp@z}%
+ \else
+ \expandafter\edef\csname tikz@cc@tempx@\tikz@cc@coord@name\endcsname{}%
+ \expandafter\edef\csname tikz@cc@tempy@\tikz@cc@coord@name\endcsname{}%
+ \expandafter\edef\csname tikz@cc@tempz@\tikz@cc@coord@name\endcsname{}%
+ \fi
+ \expandafter\edef\csname tikz@cc@coord@\tikz@cc@coord@name\endcsname{\csname tikz@declared@coordinate\endcsname}%
+ \pgfutil@ifnextchar,{\tikz@cc@handle@nextline}{\tikz@cc@stop@let}%
+}%
+\def\tikz@cc@handle@nextline,{%
+ \tikz@cc@handle@line%
+}%
+\def\tikz@cc@stop@let in{%
+ \tikz@scan@next@command%
+}%
+
+\def\tikz@cc@dop#1{\csname tikz@cc@p@#1\endcsname}%
+\def\tikz@cc@dox#1{\csname tikz@cc@x@#1\endcsname}%
+\def\tikz@cc@doy#1{\csname tikz@cc@y@#1\endcsname}%
+\def\tikz@cc@don#1{\csname tikz@cc@n@#1\endcsname}%
+\def\tikz@cc@dotempx#1{\csname tikz@cc@tempx@#1\endcsname}%
+\def\tikz@cc@dotempy#1{\csname tikz@cc@tempy@#1\endcsname}%
+\def\tikz@cc@dotempz#1{\csname tikz@cc@tempz@#1\endcsname}%
+\def\tikz@cc@docoord#1{\csname tikz@cc@coord@#1\endcsname}%
+
+
+
+%
+%
+% Part II: The ($...$) parser
+%
+%
+
+\def\tikz@parse@calculator#1(${%$
+ \def\tikz@cc@command{#1}%
+ \begingroup%
+ %
+ % Parse main computation. It's a series of optional factors in front
+ % of coordinates.
+ %
+ \pgf@xa=0pt% We accumulate the result in here.
+ \pgf@ya=0pt%
+ \tikz@cc@parse+%
+}%
+
+\def\tikz@cc@parse{%
+ \pgfutil@ifnextchar${%$
+ % Ok, we found the end...
+ \tikz@cc@end%
+ }
+ {\pgfutil@ifnextchar+{%
+ % Ok, we found a coordinate...
+ \tikz@cc@add%
+ }{%
+ \pgfutil@ifnextchar-{%
+ \tikz@cc@sub%
+ }{%
+ \tikzerror{+ or - expected}%
+ \tikz@cc@end$%$
+ }%
+ }%
+ }%
+}%
+
+%
+% The end is reached with $
+%
+\def\tikz@cc@end$#1){%$
+ \xdef\tikz@marshal{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \endgroup%
+ \expandafter\tikz@cc@command\expandafter{\tikz@marshal}%
+}%
+
+
+%
+% Another coordinate with +/-, possibly with a factor
+%
+\def\tikz@cc@add+{%
+ \def\tikz@cc@factor{1}%
+ \tikz@cc@factororcoordinate%
+}%
+\def\tikz@cc@sub-{%
+ \def\tikz@cc@factor{-1}%
+ \tikz@cc@factororcoordinate%
+}%
+
+%
+% Check for a factor: If we see a (, its a coordinate...
+%
+\def\tikz@cc@factororcoordinate{%
+ \pgfutil@ifnextchar({%)
+ % Ok, found coordinate
+ \tikz@cc@coordinate%
+ }{%
+ \tikz@cc@parse@factor%
+ }%
+}%
+
+%
+% ... otherwise it's a factor. It ends at ...*(
+%
+\def\tikz@cc@parse@factor#1*({%
+ \pgfmathparse{#1*\tikz@cc@factor}%
+ \let\tikz@cc@factor=\pgfmathresult%
+ \tikz@cc@coordinate(%)
+}%
+
+\def\tikz@cc@coordinate{%
+ \tikz@scan@absolute\tikz@cc@after@coordinate%
+}%
+\def\tikz@cc@after@coordinate#1{%
+ \pgf@process{#1}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \tikz@cc@mid@checks%
+}%
+
+
+%
+% A coordinate can be followed by !...!(...)
+%
+
+\def\tikz@cc@mid@checks{%
+ \ifnum\the\catcode`\!=\active\relax
+ \expandafter\tikz@cc@mid@checks@active
+ \else
+ \expandafter\tikz@cc@mid@checks@nonactive
+ \fi
+}%
+
+\def\tikz@cc@mid@checks@nonactive{%
+ \pgfutil@ifnextchar!{%
+ \tikz@cc@mid@nonactive%
+ }{%
+ \advance\pgf@xa by\tikz@cc@factor\pgf@xb
+ \advance\pgf@ya by\tikz@cc@factor\pgf@yb
+ \tikz@cc@parse%
+ }%
+}%
+
+\def\tikz@cc@mid@nonactive!{%
+ \pgfutil@ifnextchar({%
+ \tikz@scan@one@point\tikz@cc@project%
+ }{%
+ \tikz@cc@mid@num@nonactive%
+ }%
+}%
+
+\begingroup
+ \catcode`\!=\active
+ \gdef\tikz@cc@mid@checks@active{%
+ \pgfutil@ifnextchar!{%
+ \tikz@cc@mid@active%
+ }{%
+ \advance\pgf@xa by\tikz@cc@factor\pgf@xb
+ \advance\pgf@ya by\tikz@cc@factor\pgf@yb
+ \tikz@cc@parse%
+ }%
+ }%
+
+ \gdef\tikz@cc@mid@active!{%
+ \pgfutil@ifnextchar({%
+ \tikz@scan@one@point\tikz@cc@project%
+ }{%
+ \tikz@cc@mid@num@active%
+ }%
+ }%
+\endgroup
+
+%
+% Partway case: (coord a)!number!(coord b)
+%
+% Returns the position that is at <number> fraction on the way from a
+% to b. This, (a)!0!(b) is (a), (a)!.5!(b) is the middle and (a)!1!(b)
+% is (b)
+%
+
+\def\tikz@cc@mid@num@nonactive#1!{\tikz@cc@mid@num{#1}}%
+
+\begingroup
+ \catcode`\!=\active
+ \gdef\tikz@cc@mid@num@active#1!{\tikz@cc@mid@num{#1}}%
+\endgroup
+
+\def\tikz@cc@mid@num#1{%
+ \pgfmathparse{#1}%
+ \ifpgfmathunitsdeclared%
+ \let\tikz@cc@mid@unit=\pgfmathresult%
+ \expandafter\tikz@cc@scan@rot\expandafter\tikz@cc@after@unit%
+ \else%
+ \let\tikz@cc@mid@factor=\pgfmathresult%
+ \pgfmathparse{1-\tikz@cc@mid@factor}%
+ \let\tikz@cc@mid@factor@one=\pgfmathresult%
+ \expandafter\tikz@cc@scan@rot\expandafter\tikz@cc@after@num%
+ \fi%
+}%
+
+\def\tikz@cc@after@num#1{%
+ \pgf@process{#1}%
+ \pgf@xb=\tikz@cc@mid@factor@one\pgf@xb%
+ \pgf@yb=\tikz@cc@mid@factor@one\pgf@yb%
+ \advance\pgf@xb by\tikz@cc@mid@factor\pgf@x%
+ \advance\pgf@yb by\tikz@cc@mid@factor\pgf@y%
+ \tikz@cc@mid@checks%
+}%
+
+
+
+%
+% Distance case: (coord a)!dimension!(coord b)
+%
+% Returns the position that is at <dimension> removed from (coord a)
+% in the direction of (coord b).
+%
+
+\def\tikz@cc@after@unit#1{%
+ \pgf@process{#1}%
+ \advance\pgf@x by-\pgf@xb%
+ \advance\pgf@y by-\pgf@yb%
+ \pgf@process{\pgfpointnormalised{}}%
+ \advance\pgf@xb by\tikz@cc@mid@unit\pgf@x%
+ \advance\pgf@yb by\tikz@cc@mid@unit\pgf@y%
+ \tikz@cc@mid@checks%
+}%
+
+%
+% Projection case: (a)!(p)!(b)
+%
+% Projection of p on line from a to b
+%
+\def\tikz@cc@project#1{%
+ \pgf@process{#1}%
+ % Save in c
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \begingroup
+ \ifnum\the\catcode`\!=\active
+ \def\tikz@next{%
+ \endgroup
+ \expandafter\tikz@cc@scan@rot\expandafter\tikz@cc@after@project
+ \tikz@cc@scan@ex@active}%
+ \else
+ \def\tikz@next{%
+ \endgroup
+ \expandafter\tikz@cc@scan@rot\expandafter\tikz@cc@after@project
+ \tikz@cc@scan@ex@nonactive}%
+ \fi
+ \tikz@next%
+}%
+
+\def\tikz@cc@scan@ex@nonactive!{}%
+
+\begingroup
+ \catcode`\!=\active
+ \gdef\tikz@cc@scan@ex@active!{}%
+\endgroup
+
+\def\tikz@cc@after@project#1{%
+ \pgf@process{#1}%
+ % Ok, now we need to project (xc,yc) on the line (xb,xc) to (x,y)
+ \advance\pgf@x by-\pgf@xb%
+ \advance\pgf@y by-\pgf@yb%
+ \advance\pgf@xc by-\pgf@xb%
+ \advance\pgf@yc by-\pgf@yb%
+ \pgf@process{\pgfpointnormalised{}}%
+ % Scalar product
+ \pgf@xc=\pgf@sys@tonumber{\pgf@xc}\pgf@x%
+ \advance\pgf@xc by\pgf@sys@tonumber{\pgf@yc}\pgf@y%
+ % and add
+ \advance\pgf@xb by\pgf@sys@tonumber{\pgf@xc}\pgf@x%
+ \advance\pgf@yb by\pgf@sys@tonumber{\pgf@xc}\pgf@y%
+ \tikz@cc@mid@checks%
+}%
+
+%
+% Rotational scanner: radius:(x)
+%
+
+\def\tikz@cc@scan@rot#1{%
+ \pgfutil@ifnextchar({%)
+ \tikz@scan@one@point#1% normal
+ }%
+ {%
+ \def\tikz@cc@scan@rot@cmd{#1}%
+ \ifnum\the\catcode`\:=\active\relax
+ \expandafter\tikz@cc@scan@one@rot@active%
+ \else
+ \expandafter\tikz@cc@scan@one@rot@nonactive%
+ \fi
+ }%
+}%
+
+\def\tikz@cc@scan@one@rot@nonactive#1:{%
+ \def\tikz@cc@scan@rot@angle{#1}%
+ \tikz@scan@one@point\tikz@cc@handle@rot%
+}%
+
+\begingroup
+ \catcode`\:=\active
+ \gdef\tikz@cc@scan@one@rot@active#1:{%
+ \def\tikz@cc@scan@rot@angle{#1}%
+ \tikz@scan@one@point\tikz@cc@handle@rot%
+ }%
+\endgroup
+
+\def\tikz@cc@handle@rot#1{%
+ \pgf@process{#1}%
+ % Ok, now we need to rotate x/y around xb/xb by ...rot@angle
+ {%
+ \pgftransformreset%
+ % Save them...
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgftransformshift{\pgfqpoint{\pgf@xb}{\pgf@yb}}%
+ \pgftransformrotate{\tikz@cc@scan@rot@angle}%
+ \pgftransformshift{\pgfqpoint{-\pgf@xb}{-\pgf@yb}}%
+ \pgfpointtransformed{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \expandafter
+ }%
+ \edef\tikz@marshal{\noexpand\tikz@cc@scan@rot@cmd{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \tikz@marshal%
+}%
+
+
+
+
+%
+%
+% Part III: Calculation coordinate systems
+%
+%
+
+% Tangent cs: Keys are a node and a point. Depending on the type of
+% node, the appropriate tangent computation should be done.
+
+\tikzdeclarecoordinatesystem{tangent}
+{%
+ \tikzset{cs/.cd,#1}%
+ \expandafter\ifx\csname tikz@tangent@\tikz@cs@type\endcsname\relax%
+ \tikzerror{I do not know how to compute the tangent to
+ a \tikz@cs@type}%
+ \pgfpointorigin%
+ \else%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@lib@do@tangent\tikz@cs@point%
+ \fi%
+}%
+
+\tikzset{cs/node/.code=\tikz@cs@unpack{\tikz@cs@node}{\tikz@cs@type}{#1}}%
+\tikzset{cs/point/.store in=\tikz@cs@point}%
+
+\def\tikz@lib@do@tangent{\csname tikz@tangent@\tikz@cs@type\endcsname}%
+
+\def\tikz@tangent@coordinate#1{%
+ \pgfpointanchor{\tikz@cs@node}{center}%
+}%
+
+\def\tikz@tangent@circle#1{%
+ {%
+ % Step 1: Compute the transformed position of the input:
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ %
+ % Step 2: Compute vector from center of circle to transformed #1
+ %
+ \pgf@process{\pgfpointtransformed{\pgfpointanchor{\tikz@cs@node}{center}}}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ %
+ % Step 2: Reset transformations, they distract...
+ %
+ \pgftransformreset%
+ %
+ % Step 3: Transform to the center of the circle.
+ %
+ \pgftransformshift{\pgfpointanchor{\tikz@cs@node}{center}}%
+ %
+ % Step 4: Compute the radius
+ %
+ \pgf@process{\pgfpointanchor{\tikz@cs@node}{east}}%
+ \pgf@xc=\pgf@x%
+ %
+ % Now, (xa,ya) is a point. Compute the tangent from this point to
+ % a circle around the origin of radius xc.
+ %
+ % acos(radius/veclen(xa,ya)) is the angle of the tangent.
+ \pgfmathparse{veclen(\the\pgf@xa,\the\pgf@ya)}
+ \pgfmathparse{acos(\the\pgf@xc/\pgfmathresult)}
+ \ifnum\pgfkeysvalueof{/tikz/cs/solution}>1\relax%
+ \pgfmathparse{0-\pgfmathresult}%
+ \fi%
+ \let\tikz@lib@temp=\pgfmathresult%
+ %
+ % Now \pgfmathparse contains the desired angle. Use this to
+ % compute the correct position on the circle...
+ %
+ % But, first, rotate to the point.
+ \pgf@process{\pgfpointnormalised{\pgfqpoint{\pgf@xa}{\pgf@ya}}}%
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
+ % Finally, rotate...
+ \pgf@process{\pgfpointtransformed{\pgfpointpolar{\tikz@lib@temp}{\the\pgf@xc}}}%
+ %
+ % Ok, undo transformations...
+ }%
+ % \pgf@x, \pgf@y have been smuggled outside by \pgf@process
+ {%
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{}}%
+ }%
+}%
+
+
+% Implementation of intersections
+
+
+\def\tikz@intersect@circle@and@circle{%
+ {%
+ \pgftransformreset% transformations only confuse us, here...
+ %
+ % Compute origin and radius of first circle
+ %
+ \pgf@process{\pgfpointanchor{\tikz@cs@node@a}{center}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointanchor{\tikz@cs@node@a}{east}}%
+ \advance\pgf@x by-\pgf@xa%
+ \pgf@xc=\pgf@x% ok, pgf@xc is first radius, (xa,ya) is center
+ %
+ % Compute origin and radius of second circle
+ %
+ \pgf@process{\pgfpointanchor{\tikz@cs@node@b}{center}}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{\pgfpointanchor{\tikz@cs@node@b}{east}}%
+ \advance\pgf@x by-\pgf@xb%
+ \pgf@yc=\pgf@x% \pgf@yc is second radius, (xb,yb) is center
+ %
+ \pgf@process{%
+ \pgfpointintersectionofcircles{\pgfqpoint{\pgf@xa}{\pgf@ya}}{\pgfqpoint{\pgf@xb}{\pgf@yb}}{\pgf@xc}{\pgf@yc}{\pgfkeysvalueof{/tikz/cs/solution}}%
+ }%
+ }%
+ % \pgf@x, \pgf@y have been smuggled outside by \pgf@process,
+ % reinstall transformations...
+ {%
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{}}%
+ }%
+}%
+
+
+\def\tikz@intersect@line@and@circle{%
+ {%
+ %
+ % Step 1: Get line
+ %
+ \expandafter\tikz@scan@one@point\expandafter\tikz@parse@line\tikz@cs@line@a%
+ \pgf@process{\pgfpointtransformed{}}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@xc}{\pgf@yc}}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ %
+ % Step 2: Subtract center of circle
+ %
+ \pgf@process{\pgfpointtransformed{\pgfpointanchor{\tikz@cs@node@b}{center}}}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \advance\pgf@xb by-\pgf@x%
+ \advance\pgf@yb by-\pgf@y%
+ %
+ % Step 3: Reset transformations, they distract...
+ %
+ \pgftransformreset%
+ %
+ % Step 4: Transform to the center of the circle.
+ %
+ \pgftransformshift{\pgfpointanchor{\tikz@cs@node@b}{center}}%
+ %
+ % Step 5: Compute the radius
+ %
+ \pgf@process{\pgfpointanchor{\tikz@cs@node@b}{east}}%
+ \edef\tikz@lib@saved@radius{\pgf@sys@tonumber{\pgf@x}}%
+ %
+ % Step 6: Compute projection of origin on line (xa,ya) -- (xb,yb),
+ % store in (xa,ya)
+ \pgf@x=\pgf@xb%
+ \pgf@y=\pgf@yb%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \pgf@process{\pgfpointnormalised{}}%
+ % Scalar product
+ \pgf@xc=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
+ \advance\pgf@xc by\pgf@sys@tonumber{\pgf@ya}\pgf@y%
+ \pgf@xc=-\pgf@xc%
+ % and add
+ \advance\pgf@xa by\pgf@sys@tonumber{\pgf@xc}\pgf@x%
+ \advance\pgf@ya by\pgf@sys@tonumber{\pgf@xc}\pgf@y%
+ %
+ % Now, we have a triangle with a right angle at (xa,ya). The
+ % second point of the triangle is the origin. The third point is
+ % sought.
+ % Save x/y
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ % Square radius
+ \pgf@xb=\tikz@lib@saved@radius pt%
+ %
+ % First, make numbers smaller, in case they are too large
+ %
+ \c@pgf@counta=1\relax%
+ \loop%
+ \ifdim\pgf@xb>50pt%
+ \multiply\c@pgf@counta by2\relax%
+ \divide\pgf@xa by2\relax%
+ \divide\pgf@ya by2\relax%
+ \divide\pgf@xb by2\relax%
+ \repeat%
+ \pgf@xb=\pgf@sys@tonumber{\pgf@xb}\pgf@xb%
+ % Subtract xa^2 + ya^2
+ \pgf@yb=\pgf@sys@tonumber{\pgf@xa}\pgf@xa%
+ \advance\pgf@xb by-\pgf@yb%
+ \pgf@yb=\pgf@sys@tonumber{\pgf@ya}\pgf@ya%
+ \advance\pgf@xb by-\pgf@yb%
+ % Square root
+ \ifdim\pgf@xb<0pt%
+ \pgf@xb=0pt%
+ \fi%
+ \pgfmathsqrt@{\pgf@sys@tonumber{\pgf@xb}}%
+ \pgfmathmultiply@{\pgfmathresult}{\the\c@pgf@counta}%
+ \multiply\pgf@xa by\c@pgf@counta\relax%
+ \multiply\pgf@ya by\c@pgf@counta\relax%
+ \ifnum\pgfkeysvalueof{/tikz/cs/solution}>1\relax%
+ \pgfmathsubtract{0}{\pgfmathresult}%
+ \fi%
+ % Ok, now add things...
+ \advance\pgf@xa by \pgfmathresult\pgf@xc%
+ \advance\pgf@ya by \pgfmathresult\pgf@yc%
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@xa}{\pgf@ya}}}%
+ % Ok, undo transformations...
+ }%
+ % \pgf@x, \pgf@y have been smuggled outside by \pgf@process
+ {%
+ \pgftransforminvert%
+ \pgf@process{\pgfpointtransformed{}}%
+ }%
+}%
+
+\def\tikz@intersect@circle@and@line{%
+ % Swap
+ {%
+ \let\tikz@cs@node@b=\tikz@cs@node@a%
+ \let\tikz@cs@line@a=\tikz@cs@line@b%
+ \tikz@intersect@line@and@circle%
+ }%
+}%
diff --git a/graphics/pgf/base/tex/tikzlibrarycalendar.code.tex b/graphics/pgf/base/tex/tikzlibrarycalendar.code.tex
new file mode 100644
index 0000000000..f3e8439491
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycalendar.code.tex
@@ -0,0 +1,458 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarycalendar.code.tex}
+
+
+\pgfutil@usemodule{pgfcalendar}
+
+
+%
+% General options (these options affect all calendars typeset unsind \calendar):
+%
+% Start, end, and code executed for each current date
+%
+
+\tikzoption{dates}{\tikz@lib@cal@parse#1\relax}
+\def\tikz@lib@cal@parse#1to#2\relax{%
+ \def\tikz@lib@cal@start{#1}
+ \def\tikz@lib@cal@end{#2}%
+}
+\tikzoption{execute at begin day scope}{\expandafter\def\expandafter\tikz@atbegin@day\expandafter{\tikz@atbegin@day#1}}
+\tikzoption{execute at end day scope}{%
+ \def\pgf@temp{#1}%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@atend@day%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@temp\tikz@atend@day}}
+\tikzoption{execute before day scope}{\expandafter\def\expandafter\tikz@before@day\expandafter{\tikz@before@day#1}}
+\tikzoption{execute after day scope}{\expandafter\def\expandafter\tikz@after@day\expandafter{\tikz@after@day#1}}
+
+\let\tikz@atbegin@day=\pgfutil@empty
+\let\tikz@atend@day=\pgfutil@empty
+\let\tikz@before@day=\pgfutil@empty
+\let\tikz@after@day=\pgfutil@empty
+
+
+
+%
+% Options affecting some calendars:
+%
+
+%
+% Shifts and skips
+%
+
+% Shift between days
+
+\tikzoption{day xshift}{\def\tikz@lib@cal@xshift{#1}}
+\tikzoption{day yshift}{\def\tikz@lib@cal@yshift{#1}}
+
+\def\tikz@lib@cal@yshift{3ex}
+\def\tikz@lib@cal@xshift{3.5ex}
+
+
+% Shift between months
+
+\tikzoption{month xshift}{\def\tikz@lib@cal@month@xshift{#1}}
+\tikzoption{month yshift}{\def\tikz@lib@cal@month@yshift{#1}}
+
+\def\tikz@lib@cal@month@yshift{9ex}
+\def\tikz@lib@cal@month@xshift{9ex}
+
+
+
+
+% Templates for typesetting days, month, years
+
+\tikzoption{day code}{\def\tikzdaycode{#1}}
+\tikzoption{day text}{\def\tikzdaytext{#1}}
+\tikzoption{days}{\tikzset{every day/.append style={#1}}}
+\tikzset{every day/.style={anchor=base east}}
+
+\tikzoption{month code}{\def\tikzmonthcode{#1}}
+\tikzoption{month text}{\def\tikzmonthtext{#1}}
+\tikzset{every month/.style={}}
+
+\tikzoption{year code}{\def\tikzyearcode{#1}}
+\tikzoption{year text}{\def\tikzyeartext{#1}}
+\tikzset{every year/.style={}}
+
+\def\tikzdaycode{\node[name=\pgfcalendarsuggestedname,every day]{\tikzdaytext};}
+\def\tikzmonthcode{\node[every month]{\tikzmonthtext};}
+\def\tikzyearcode{\node[every year]{\tikzyeartext};}
+
+\def\tikzdaytext{\%d-}
+\def\tikzmonthtext{\%mt}
+\def\tikzyeartext{\%y0}
+
+
+% Internal option for storing the "width" of a calendar as a number of
+% days
+
+\tikzoption{tikz@lib@cal@width}{\def\tikz@lib@cal@width{#1}}
+
+\def\tikz@lib@cal@width{1}
+
+%
+% Days on a line
+%
+
+\tikzset{day list downward/.style={%
+ execute before day scope={
+ \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
+ {%
+ % On first of month, except when first date in calendar.
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@month@yshift}%
+ \pgftransformyshift{-\pgf@y}
+ }%
+ }{}%
+ },
+ execute after day scope={\pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}\pgftransformyshift{-\pgf@y}},
+ tikz@lib@cal@width=1
+}}
+\tikzset{day list upward/.style={%
+ execute before day scope={
+ \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
+ {%
+ % On first of month, except when first date in calendar.
+ \pgftransformyshift{\tikz@lib@cal@month@yshift}%
+ }%
+ }{}%
+ },
+ execute after day scope={\pgftransformyshift\tikz@lib@cal@yshift},
+ tikz@lib@cal@width=1
+}}
+\tikzset{day list right/.style={%
+ execute before day scope={
+ \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
+ {%
+ % On first of month, except when first date in calendar.
+ \pgftransformxshift{\tikz@lib@cal@month@xshift}%
+ }%
+ }{}%
+ },
+ execute after day scope={\pgftransformxshift\tikz@lib@cal@xshift},
+ tikz@lib@cal@width=30% not quite right, but close enough in most cases...
+}}
+
+\tikzset{day list left/.style={%
+ execute before day scope={
+ \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
+ {%
+ % On first of month, except when first date in calendar.
+ \pgfmathsetlength{\pgf@x}{\tikz@lib@cal@month@xshift}
+ \pgftransformxshift{-\pgf@x}%
+ }%
+ }{}%
+ },
+ execute after day scope={
+ \pgfmathsetlength{\pgf@x}{\tikz@lib@cal@xshift}
+ \pgftransformxshift{-\pgf@x}%
+ },
+ tikz@lib@cal@width=30% not quite right, but close enough in most cases...
+}}
+
+
+
+%
+% Week list
+%
+
+\tikzset{week list/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
+ {%
+ % On first of month, except when first date in calendar.
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@month@yshift}%
+ \pgftransformyshift{-\pgf@y}
+ }%
+ }{}%
+ },
+ execute at begin day scope={%
+ \pgfmathsetlength\pgf@x{\tikz@lib@cal@xshift}%
+ \pgf@x=\pgfcalendarcurrentweekday\pgf@x%
+ \pgftransformxshift{\pgf@x}%
+ },
+ execute after day scope={%
+ \ifdate{Sunday}{%
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
+ \pgftransformyshift{-\pgf@y}
+ }{}%
+ },
+ tikz@lib@cal@width=7
+}}
+
+
+
+%
+% Month list
+%
+
+\tikzset{month list/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}
+ {%
+ % On first of month, except when first date in calendar.
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@month@yshift}%
+ \pgftransformyshift{-\pgf@y}
+ }%
+ }{}%
+ \ifdate{day of month=1}
+ {%
+ \edef\tikz@lib@cal@month@list@start{\pgfcalendarcurrentweekday}%
+ }{}%
+ \ifdate{equals=\pgfcalendarbeginiso}%
+ {%
+ % Computer day of week for start of month
+ {%
+ \c@pgf@counta=\pgfcalendarcurrentjulian%
+ \advance\c@pgf@counta by-\pgfcalendarcurrentday%
+ \advance\c@pgf@counta by1\relax%
+ \pgfcalendarjuliantoweekday{\c@pgf@counta}{\c@pgf@countb}%
+ \xdef\pgf@temp{\the\c@pgf@countb}%
+ }%
+ \let\tikz@lib@cal@month@list@start=\pgf@temp%
+ }{}%
+ },
+ execute at begin day scope={%
+ \pgfmathsetlength\pgf@xa{\tikz@lib@cal@xshift}%
+ \pgf@xb=\pgfcalendarcurrentday\pgf@xa%
+ \advance\pgf@xb by\tikz@lib@cal@month@list@start\pgf@xa%
+ \advance\pgf@xb by-\pgf@xa\relax%
+ \pgftransformxshift{\pgf@xb}%
+ },
+ tikz@lib@cal@width=37
+}}
+
+
+
+
+%
+% Month labels
+%
+
+\tikzset{month label left/.style={%
+ execute before day scope={\ifdate{day of month=1}{\tikzmonthcode}{}},
+ every month/.append style={anchor=base east,xshift=-3.5ex}
+}}
+
+\tikzset{month label left vertical/.style={%
+ execute before day scope={\ifdate{day of month=1}{\tikzmonthcode}{}},
+ every month/.append style={anchor=base east,xshift=-4.5ex,yshift=2.25ex,rotate=90}
+}}
+
+\tikzset{month label right/.style={%
+execute before day scope={\ifdate{day of month=1}{%
+ {%
+ \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
+ \pgftransformxshift{\tikz@lib@cal@width\pgf@xa}%
+ \pgftransformxshift{-\pgf@xa}%
+ \tikzmonthcode%
+ }}{}},
+ every month/.append style={anchor=base west,xshift=1ex}
+}}
+
+\tikzset{month label right vertical/.style={%
+ execute before day scope={\ifdate{day of month=1}{%
+ {%
+ \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
+ \pgftransformxshift{\tikz@lib@cal@width\pgf@xa}%
+ \pgftransformxshift{-\pgf@xa}%
+ \tikzmonthcode%
+ }}{}},
+ every month/.append style={anchor=base west,xshift=2ex,yshift=2.25ex,rotate=-90}
+}}
+
+\tikzset{month label above centered/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ {
+ \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
+ \pgf@xb=\tikz@lib@cal@width\pgf@xa%
+ \advance\pgf@xb by-\pgf@xa%
+ \pgf@xb=.5\pgf@xb%
+ \pgftransformxshift{\pgf@xb}%
+ \pgftransformxshift{-1.5ex}%
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
+ \pgftransformyshift{1.25\pgf@y}
+ \tikzmonthcode%
+ }
+ }{}},
+ every month/.append style={anchor=base}
+}}
+
+\tikzset{month label above left/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ {
+ \pgftransformxshift{-3.25ex}%
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
+ \pgftransformyshift{1.25\pgf@y}
+ \tikzmonthcode%
+ }
+ }{}},
+ every month/.append style={anchor=base west}
+}}
+
+
+
+\tikzset{month label above right/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ {
+ \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
+ \pgf@xb=\tikz@lib@cal@width\pgf@xa%
+ \advance\pgf@xb by-\pgf@xa%
+ \pgftransformxshift{\pgf@xb}%
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
+ \pgftransformyshift{1.25\pgf@y}
+ \tikzmonthcode%
+ }
+ }{}},
+ every month/.append style={anchor=base east}
+}}
+
+\tikzset{month label below centered/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ {
+ \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}%
+ \pgf@xb=\tikz@lib@cal@width\pgf@xa%
+ \advance\pgf@xb by-\pgf@xa%
+ \pgf@xb=.5\pgf@xb%
+ \pgftransformxshift{\pgf@xb}%
+ \pgftransformxshift{-1.5ex}%
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
+ \pgftransformyshift{-1.25\pgf@y}
+ \tikzmonthcode%
+ }
+ }{}},
+ every month/.append style={anchor=base}
+}}
+
+\tikzset{month label below left/.style={%
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ {
+ \pgftransformxshift{-3.25ex}%
+ \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}%
+ \pgftransformyshift{-1.25\pgf@y}
+ \tikzmonthcode%
+ }
+ }{}},
+ every month/.append style={anchor=base west}
+}}
+
+
+
+%
+% Code of the actual \calendar command (tikz.code.tex contains \let\calendar=\tikz@lib@cal@calendar):
+%
+
+\def\tikz@lib@cal@calendar{%
+ \begingroup%
+ \let\tikz@lib@cal@ifs=\pgfutil@empty%
+ \tikz@expandcount=1000\relax%
+ \tikzset{name=,at={(0,0)}}%
+ \let\%=\pgfcalendarshorthand%
+ \tikzset{every calendar/.try}%
+ \tikz@lib@cal@scanner%
+}
+
+\def\tikz@lib@cal@scanner{%
+ \afterassignment\tikz@lib@cal@handle\let\pgf@let@token=%
+}
+
+\def\tikz@lib@cal@handle{%
+ \let\pgfutil@next=\tikz@lib@cal@expand%
+ \ifx\pgf@let@token;%
+ \let\pgfutil@next=\tikz@lib@cal@stop%
+ \else%
+ \ifx\pgf@let@token(%)
+ \let\pgfutil@next=\tikz@lib@cal@name%
+ \else%
+ \ifx\pgf@let@token a%
+ \let\pgfutil@next=\tikz@lib@cal@at%
+ \else%
+ \ifx\pgf@let@token[%
+ \let\pgfutil@next=\tikz@lib@cal@option%
+ \else%
+ \ifx\pgf@let@token i%
+ \let\pgfutil@next=\tikz@lib@cal@if%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \pgfutil@next%
+}
+\def\tikz@lib@cal@expand{%
+ \advance\tikz@expandcount by -1%
+ \ifnum\tikz@expandcount<0\relax%
+ \tikzerror{Giving up on this calendar}%
+ \let\pgfutil@next=\tikz@lib@cal@end%
+ \else%
+ \let\pgfutil@next=\tikz@lib@cal@@expand
+ \fi%
+ \pgfutil@next}
+
+\def\tikz@lib@cal@@expand{\expandafter\tikz@lib@cal@scanner\pgf@let@token}
+
+
+\def\tikz@lib@cal@name#1){%
+ \tikzset{name=#1}%
+ \tikz@lib@cal@scanner%
+}
+\def\tikz@lib@cal@at t#1(#2){%
+ \tikzset{at={(#2)}}%
+ \tikz@lib@cal@scanner%
+}
+\def\tikz@lib@cal@option#1]{%
+ \tikzset{#1}%
+ \tikz@lib@cal@scanner%
+}
+\def\tikz@lib@cal@if f#1(#2){%
+ \pgfutil@ifnextchar[{\tikz@lib@cal@if@opt{#2}}{\tikz@lib@cal@if@code{#2}}}%}
+
+\def\tikz@lib@cal@if@opt#1[#2]{\tikz@lib@cal@if@code{#1}{\tikzset{#2}}}
+\def\tikz@lib@cal@if@code#1#2{%
+ \pgfutil@ifnextchar e{\tikz@lib@cal@if@else{#1}{#2}}{\tikz@lib@cal@if@else{#1}{#2}else{}}}
+
+\def\tikz@lib@cal@if@else#1#2else{%
+ \pgfutil@ifnextchar[{\tikz@lib@cal@if@else@opt{#1}{#2}}{\tikz@lib@cal@if@else@code{#1}{#2}}}%}
+\def\tikz@lib@cal@if@else@opt#1#2[#3]{\tikz@lib@cal@if@else@code{#1}{#2}{\tikzset{#3}}}
+\def\tikz@lib@cal@if@else@code#1#2#3{%
+ \expandafter\def\expandafter\tikz@lib@cal@ifs\expandafter{\tikz@lib@cal@ifs\ifdate{#1}{#2}{#3}}%
+ \tikz@lib@cal@scanner%
+}
+\def\tikz@lib@cal@stop{%
+ \pgftransformshift{\tikz@node@at}%
+ \expandafter\pgfcalendar\expandafter{\tikz@fig@name}{\tikz@lib@cal@start}{\tikz@lib@cal@end}%
+ {%
+ \tikz@before@day%
+ \scope%
+ \tikz@atbegin@day%
+ \tikz@lib@cal@ifs%
+ \tikzdaycode%
+ \tikz@atend@day%
+ \endscope%
+ \tikz@after@day%
+ }%
+ \endgroup%
+}
+
+\tikzoption{if}{%
+ \let\tikz@lib@cal@scanner@orig=\tikz@lib@cal@scanner%
+ \let\tikz@lib@cal@scanner=\relax%
+ \tikz@lib@cal@if f#1\relax%
+ \let\tikz@lib@cal@scanner=\tikz@lib@cal@scanner@orig}
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarychains.code.tex b/graphics/pgf/base/tex/tikzlibrarychains.code.tex
new file mode 100644
index 0000000000..c02f520704
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarychains.code.tex
@@ -0,0 +1,214 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarychains.code.tex}
+
+\usetikzlibrary{positioning}%
+
+\tikzset{start chain/.default=,
+ start chain/.code={%
+ \tikz@lib@chain@parse{#1}%
+ \ifx\tikz@lib@chain@name\pgfutil@empty%
+ \def\tikz@lib@chain@name{chain}%
+ \fi%
+ \ifx\tikz@lib@chain@direction\relax%
+ \let\tikz@lib@chain@direction=\tikz@lib@chain@default@direction%
+ \fi%
+ \expandafter\ifx\csname tikz@lib@chain@active@\tikz@lib@chain@name\endcsname\relax%
+ \expandafter\let\csname tikz@lib@chain@active@\tikz@lib@chain@name\endcsname=\pgfutil@empty% does not matter
+ \expandafter\global\expandafter\let\csname tikz@lib@chain@exists@\tikz@lib@chain@name\endcsname=\pgfutil@empty% does not matter
+ % Setup chain parameters
+ \expandafter\gdef\csname tikz@lib@chain@count@\tikz@lib@chain@name\endcsname{0}%
+ \expandafter\global\expandafter\let\csname tikz@lib@chain@dir@\tikz@lib@chain@name\endcsname\tikz@lib@chain@direction%
+ \let\tikz@lib@current@chain=\tikz@lib@chain@name%
+ \let\chainin=\tikz@lib@chainin%
+ \else%
+ \tikzerror{Chain ``\tikz@lib@chain@name'' is already active}%
+ \fi%
+ },
+ continue chain/.default=,
+ continue chain/.code={%
+ \tikz@lib@chain@parse{#1}%
+ \ifx\tikz@lib@chain@name\pgfutil@empty%
+ \let\tikz@lib@chain@name\tikz@lib@current@chain%
+ \fi%
+ \expandafter\ifx\csname tikz@lib@chain@exists@\tikz@lib@chain@name\endcsname\relax%
+ \tikzerror{Unknown chain ``#1''}%
+ \else%
+ \let\tikz@lib@current@chain=\tikz@lib@chain@name%
+ \expandafter\let\csname tikz@lib@chain@active@\tikz@lib@chain@name\endcsname=\pgfutil@empty% does not matter
+ \ifx\tikz@lib@chain@direction\relax%
+ % Just restart...
+ \else%
+ % Setup chain parameters
+ \expandafter\global\expandafter\let\csname tikz@lib@chain@dir@\tikz@lib@chain@name\endcsname\tikz@lib@chain@direction%
+ \fi%
+ \fi%
+ },
+ join/.code=\tikz@lib@parse@join{#1},
+ join/.default={}%
+}%
+
+\def\tikz@lib@chain@parse#1{%
+ \pgfutil@in@{going }{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@chain@going#1\pgf@stop%
+ \else%
+ \pgfutil@in@{placed }{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@chain@positioning#1\pgf@stop%
+ \else%
+ \def\tikz@lib@chain@name{#1}%
+ \let\tikz@lib@chain@direction\relax%
+ \fi%
+ \fi%
+}%
+
+\def\tikz@lib@chain@going#1going #2\pgf@stop{%
+ \def\tikz@lib@chain@name{#1}%
+ \ifx\tikz@lib@chain@name\pgfutil@empty%
+ \else%
+ \tikz@lib@chain@strip#1\pgf@stop%%
+ \fi%
+ \tikz@lib@chain@is@goingtrue%
+ \def\tikz@lib@chain@direction{%
+ \ifx\tikzchainprevious\pgfutil@empty%
+ \else%
+ \tikz@lib@chain@place{#2}%
+ \fi%
+ }%
+}%
+
+\def\tikz@lib@chain@positioning#1placed #2\pgf@stop{%
+ \def\tikz@lib@chain@name{#1}%
+ \ifx\tikz@lib@chain@name\pgfutil@empty%
+ \else%
+ \tikz@lib@chain@strip#1\pgf@stop%%
+ \fi%
+ \tikz@lib@chain@is@goingfalse%
+ \def\tikz@lib@chain@direction{\tikz@lib@chain@place{#2}}%
+}%
+\newif\iftikz@lib@chain@is@going
+
+
+\tikzset{/tikz/chain default direction/.code=%
+ {%
+ \tikz@lib@chain@parse{#1}%
+ \let\tikz@lib@chain@default@direction=\tikz@lib@chain@direction%
+ },%
+ /tikz/chain default direction=going right
+}%
+
+\def\tikz@lib@current@chain{chain}%
+
+\pgfutil@g@addto@macro\tikz@node@reset@hook{\let\tikz@lib@chain@caller=\relax}%
+\pgfutil@g@addto@macro\tikz@node@begin@hook{\tikz@lib@chain@caller}%
+
+\tikzset{
+ on chain/.default=,
+ on chain/.code=\tikz@lib@on@chain{#1}%
+}%
+\def\tikz@lib@on@chain#1{%
+ \tikz@lib@chain@parse{#1}%
+ \ifx\tikz@lib@chain@name\pgfutil@empty%
+ \let\tikz@lib@chain@name\tikz@lib@current@chain%
+ \fi%
+ \expandafter\ifx\csname tikz@lib@chain@exists@\tikz@lib@chain@name\endcsname\relax%
+ \tikzerror{Unknown chain ``\tikz@lib@chain@name''}%
+ \else%
+ \c@pgf@counta\csname tikz@lib@chain@count@\tikz@lib@chain@name\endcsname\relax%
+ \ifnum\c@pgf@counta=0\relax%
+ \global\let\tikzchainprevious=\pgfutil@empty%
+ \else
+ \xdef\tikzchainprevious{\tikz@lib@chain@name-\the\c@pgf@counta}%
+ \fi%
+ \advance\c@pgf@counta by1\relax%
+ \xdef\tikzchaincount{\the\c@pgf@counta}%
+ \ifx\tikz@lib@chain@direction\relax%
+ \csname tikz@lib@chain@dir@\tikz@lib@chain@name\endcsname% use default
+ \else%
+ \tikz@lib@chain@direction%
+ \fi%
+ \edef\tikz@lib@chain@caller{\noexpand\tikz@lib@chain@last@found{\tikz@lib@chain@name}}%
+ \fi%
+}%
+\def\tikz@lib@chain@last@found#1{%
+ % Increase the count and set name, if necessary.
+ \c@pgf@counta\csname tikz@lib@chain@count@#1\endcsname\relax%
+ \advance\c@pgf@counta by1\relax%
+ \xdef\tikzchaincurrent{#1-\the\c@pgf@counta}%
+ \expandafter\xdef\csname tikz@lib@chain@count@#1\endcsname{\the\c@pgf@counta}%
+ \ifnum\c@pgf@counta=1\relax%
+ \tikzset{alias/.expanded=#1-begin} % Define pseudostart
+ \fi%
+ \tikzset{alias/.expanded=#1-end} % Define pseudostart
+ \tikzset{alias/.expanded=#1-\the\c@pgf@counta} % Define pseudostart
+ \tikz@lib@chain@direction%
+ \tikzset{every on chain/.try}%
+}%
+
+
+\def\tikz@lib@chain@place#1{%
+ \pgfutil@in@{=}{#1}%
+ \ifpgfutil@in@%
+ \tikzset{#1}%
+ \else%
+ \tikzset{#1=of \tikzchainprevious}%
+ \fi%
+}%
+
+\def\tikz@lib@chain@strip#1 \pgf@stop{%
+ \def\tikz@lib@chain@name{#1}%
+}%
+
+\def\tikz@lib@parse@join#1{%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \tikz@lib@parse@join@by by \pgf@stop%
+ \else%
+ \pgfutil@in@{with }{#1}%
+ \ifpgfutil@in@%
+ \pgfutil@in@{by }{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@parse@join@with@by#1\pgf@stop%
+ \else%
+ \tikz@lib@parse@join@with@by#1 by \pgf@stop%
+ \fi%
+ \else%
+ \tikz@lib@parse@join@by#1\pgf@stop%
+ \fi%
+ \fi%
+}%
+\def\tikz@lib@parse@join@with@by with #1 by #2\pgf@stop{%
+ \tikzset{after node path={(#1)edge[every join,#2](\tikzchaincurrent)}}%
+}%
+\def\tikz@lib@parse@join@by by #1\pgf@stop{%
+ \tikzset{after node path={\ifx\tikzchainprevious\pgfutil@empty\else (\tikzchainprevious)edge[every join,#1](\tikzchaincurrent)\fi}}%
+}%
+\tikzset{every join/.style=}%
+
+
+\def\tikz@lib@chainin#1(#2){\pgfutil@ifnextchar[{\tikz@lib@chainin@{#2}}{\tikz@lib@chainin@{#2}[]}}%]%
+\def\tikz@lib@chainin@#1[#2]{\path[late options={name=#1,on chain,every chain in/.try,#2}]}%
+
+
+%
+% Branches
+%
+
+\tikzset{start branch/.code={%
+ % save last node on current chain:
+ \let\tikz@lib@save@current\tikz@lib@current@chain%
+ \pgfkeysalso{/tikz/start chain/.expand once=\tikz@lib@current@chain/#1}%
+ \path[late options={name=\tikz@lib@save@current-end,on chain}];%
+ }%
+}%
+\tikzset{continue branch/.style={continue chain/.expand once=\tikz@lib@current@chain/#1}}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.code.tex
new file mode 100644
index 0000000000..ed9644ac87
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.code.tex
@@ -0,0 +1,264 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+\usetikzlibrary{calc,decorations.markings}%
+
+
+%
+% Indicate that the picture contains a circuit
+%
+\tikzset{
+ circuit/.style={
+ every circuit/.try,
+ /utils/exec=\tikz@lib@circ@on@tofalse,
+ execute at begin to={
+ \tikz@lib@circ@on@totrue
+ \let\tikz@lib@circ@start@node\pgfutil@empty
+ \def\tikz@lib@circ@end{-- (\tikztotarget) \tikztonodes}
+ }
+ }
+}%
+
+\newif\iftikz@lib@circ@on@to
+
+
+%
+% General management
+%
+
+\tikzset{
+ circuit handle symbol/.code={%
+ \global\advance\tikz@lib@circ@count by1\relax%
+ \iftikz@lib@circ@on@to
+ {%
+ % Compute the tikz@time...
+ \pgfkeys{
+ /pgf/key filters/active families or no family/.install key filter={/pgf/key filters/false}{/pgf/key filters/false},
+ /tikz/circuits/pos grabber/.activate family}
+ \pgfqkeysfiltered{/tikz}{pos=.5,#1}%
+ \expandafter%
+ }%
+ \expandafter\def\expandafter\tikz@lib@circ@pos\expandafter{\tikz@time}%
+ \pgfkeysalso{to path={
+ \pgfextra{\tikz@lib@circ@on@tofalse}
+ decorate [decoration={markings,mark connection node=mark node}]
+ {
+ \tikz@lib@circ@start@node
+ \tikz@lib@circ@end
+ }
+ }}
+ \ifdim\tikz@lib@circ@pos pt=0pt\relax%
+ \def\tikz@lib@circ@start@node{%
+ {\pgfextra{\tikz@lib@circ@compute@direction{\tikz@lib@circ@start}}%
+ node[alias=tikz@lib@circ@node@start,at={(0,0)},#1,pos=]{}}(tikz@lib@circ@node@start)}%
+ \else%
+ \ifdim\tikz@lib@circ@pos pt=1pt\relax%
+ \def\tikz@lib@circ@end{
+ {\pgfextra{\tikz@lib@circ@compute@direction{\tikz@lib@circ@target}}%
+ node[alias=tikz@lib@circ@node\the\tikz@lib@circ@count,at={(0,0)},#1,pos=]{}}
+ --(tikz@lib@circ@node\the\tikz@lib@circ@count)\tikztonodes
+ }%
+ \else%
+ \edef\tikz@marshal{mark=at position \tikz@lib@circ@pos\space with}%
+ \def\tikz@marshala{decoration=}%
+ \expandafter\expandafter\expandafter\tikzset%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@marshala\expandafter{\tikz@marshal{\node[alias=mark node,#1,pos=]{};}}}
+ \fi%
+ \fi%
+ \else
+ \pgfkeysalso{#1}
+ \fi
+ }
+}%
+\newcount\tikz@lib@circ@count
+
+\def\tikz@lib@circ@compute@direction#1{%
+ \tikz@scan@one@point\tikz@lib@circ@save@start(\tikztostart)%
+ \tikz@scan@one@point\tikz@lib@circ@save@target(\tikztotarget)%
+ \pgf@process{\pgfpointnormalised{\pgfpointdiff{\tikz@lib@circ@start}{\tikz@lib@circ@target}}}%
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm{\the\pgf@x}{\the\pgf@y}{\the\pgf@ya}{\the\pgf@x}{#1}%
+}%
+\def\tikz@lib@circ@save@start#1{\def\tikz@lib@circ@start{#1}}%
+\def\tikz@lib@circ@save@target#1{\def\tikz@lib@circ@target{#1}}%
+
+\tikzset{
+ circuits/pos grabber/.is family,
+ pos/.belongs to family=/tikz/circuits/pos grabber,
+ at start/.belongs to family=/tikz/circuits/pos grabber,
+ very near start/.belongs to family=/tikz/circuits/pos grabber,
+ near start/.belongs to family=/tikz/circuits/pos grabber,
+ midway/.belongs to family=/tikz/circuits/pos grabber,
+ near end/.belongs to family=/tikz/circuits/pos grabber,
+ very near end/.belongs to family=/tikz/circuits/pos grabber,
+ at end/.belongs to family=/tikz/circuits/pos grabber
+}%
+
+
+%
+% Declaring a new symbol
+%
+\tikzset{
+ circuit declare symbol/.style args={#1}{
+ % Declares a new circuit symbol.
+ %
+ % #1 = name
+ % #2 = factor for default minimum width
+ % #3 = factor for default minimum height
+ %
+ % The following styles are defined:
+ %
+ % #1
+ % Can be given as an option to a "node" command or to a "to"
+ % command. It takes a set of options as parameter that will be
+ % passed to the option.
+ %
+ % set #1 graphic
+ % This keys can be set to the necessary options to make a normal
+ % node look like the symbol. For instance, for a resistor that is
+ % rendered as a rectangle, this keys can be set, basically, to
+ % "rectangle,draw". Set this key to use a different appearance for
+ % symbols of kind #1.
+ %
+ % every #1
+ % This style will be included with every symbols of this kind and
+ % can be used to configure them further.
+ %
+ % every circuit symbol
+ % This style is also included with every symbol.
+ #1/.style={circuit handle symbol={
+ inner sep=0.5pt,
+ every circuit symbol,
+ #1/graphic,
+ every #1/.try,
+ ##1}
+ },
+ #1/graphic/.style={},
+ set #1 graphic/.style={#1/graphic/.style={##1}}
+ },
+ circuit symbol unit/.code=\pgfmathsetlength\tikzcircuitssizeunit{#1},
+ circuit symbol size/.style args={width #1 height #2}{
+ minimum width=#1*\tikzcircuitssizeunit,
+ minimum height=#2*\tikzcircuitssizeunit
+ },
+ huge circuit symbols/.style={circuit symbol unit=10pt},
+ large circuit symbols/.style={circuit symbol unit=8pt},
+ medium circuit symbols/.style={circuit symbol unit=7pt},
+ small circuit symbols/.style={circuit symbol unit=6pt},
+ tiny circuit symbols/.style={circuit symbol unit=5pt},
+}%
+
+\newdimen\tikzcircuitssizeunit
+\tikzcircuitssizeunit=7pt
+
+
+%
+% Annotations
+%
+
+\tikzset{
+ circuit declare annotation/.style args={#1#2#3}{%
+ #1/.style={
+ append after command={%
+ \bgroup
+ [current point is local=true]
+ [every circuit annotation/.try]
+ [every #1/.try]
+ [shift={(\tikzlastnode.north)}]
+ [annotation arrow,->]
+ [label distance=#2,##1]
+ #3
+ \tikz@after@path%
+ \egroup%
+ }
+ },
+ #1'/.style={
+ append after command={%
+ \bgroup
+ [current point is local=true]
+ [every circuit annotation/.try]
+ [every #1/.try]
+ [shift={(\tikzlastnode.south)},yscale=-1]
+ [annotation arrow,->]
+ [label distance=#2,##1]
+ #3
+ \tikz@after@path%
+ \egroup%
+ }
+ }
+ },
+ annotation arrow/.style = {
+ /utils/exec={\pgfsetarrowoptions{direction ee}{.4*\the\tikzcircuitssizeunit+.3*\the\pgflinewidth}},
+ >=direction ee
+ }
+}%
+
+
+
+%
+% Rotating symbols
+%
+\tikzset{
+ point up/.style={rotate=90},
+ point down/.style={rotate=-90},
+ point left/.style={rotate=180},
+ point right/.style={}
+}%
+
+
+
+%
+% Basic theming
+%
+
+\tikzset{
+ every circuit symbol/.style={},
+ circuit symbol open/.style={draw},
+ circuit symbol filled/.style={draw,fill=black},
+ circuit symbol lines/.style={draw},
+ circuit symbol wires/.style={draw},
+}%
+
+
+
+
+
+%
+% Labels
+%
+
+\tikzset{
+ info/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@plain{\tikz@lib@circ@lab@plain[]}#1\pgf@stop},%}
+ info'/.code={\pgfutil@ifnextchar[\tikz@lib@circ@labp@plain{\tikz@lib@circ@labp@plain[]}#1\pgf@stop},%}
+ info sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@sloped@plain{\tikz@lib@circ@lab@sloped@plain[]}#1\pgf@stop},%}
+ info' sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@slopedp@plain{\tikz@lib@circ@lab@slopedp@plain[]}#1\pgf@stop},%}
+ circuit declare unit/.style 2 args={
+ %
+ % Defines four styles that can be used to add labels to a node.
+ %
+ #1/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab{\tikz@lib@circ@lab[]}##1\pgf@stop{#2}{#1}},%}
+ #1 sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@sloped{\tikz@lib@circ@lab@sloped[]}##1\pgf@stop{#2}{#1}},%}
+ #1'/.code={\pgfutil@ifnextchar[\tikz@lib@circ@labp{\tikz@lib@circ@labp[]}##1\pgf@stop{#2}{#1}},%}
+ #1' sloped/.code={\pgfutil@ifnextchar[\tikz@lib@circ@lab@slopedp{\tikz@lib@circ@lab@slopedp[]}##1\pgf@stop{#2}{#1}}%}
+ }
+}%
+
+\def\tikz@lib@circ@lab[#1]#2\pgf@stop#3#4{\tikzset{label={[every info/.try,every #4/.try,#1]$\mathrm{#2#3}$}}}%
+\def\tikz@lib@circ@lab@sloped[#1]#2\pgf@stop#3#4{\tikzset{label={[every info/.try,every #4/.try,transform shape,#1]$\mathrm{#2#3}$}}}%
+\def\tikz@lib@circ@labp[#1]#2\pgf@stop#3#4{\tikzset{label={[label position=below,every info/.try,every #4/.try,#1]$\mathrm{#2#3}$}}}%
+\def\tikz@lib@circ@lab@slopedp[#1]#2\pgf@stop#3#4{\tikzset{label={[label position=below,every info/.try,every #4/.try,transform shape,#1]$\mathrm{#2#3}$}}}%
+
+\def\tikz@lib@circ@lab@plain[#1]#2\pgf@stop{\tikzset{label={[every info/.try,#1]#2}}}%
+\def\tikz@lib@circ@lab@sloped@plain[#1]#2\pgf@stop{\tikzset{label={[every info/.try,transform shape,#1]#2}}}%
+\def\tikz@lib@circ@labp@plain[#1]#2\pgf@stop{\tikzset{label={[label position=below,every info/.try,#1]#2}}}%
+\def\tikz@lib@circ@lab@slopedp@plain[#1]#2\pgf@stop{\tikzset{label={[label position=below,every info/.try,transform shape,#1]#2}}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.ee.IEC.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.ee.IEC.code.tex
new file mode 100644
index 0000000000..6647be0777
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.ee.IEC.code.tex
@@ -0,0 +1,442 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+\usetikzlibrary{arrows}%
+\usetikzlibrary{circuits.ee}%
+
+\usepgflibrary{shapes.gates.ee.IEC}%
+
+
+%
+% When this lib is loaded, all symbols default to IEC
+%
+
+\tikzset{
+ circuit ee IEC/.style=
+ {
+ circuit ee,
+ set resistor graphic = resistor IEC graphic,
+ set inductor graphic = inductor IEC graphic,
+ set capacitor graphic = capacitor IEC graphic,
+ set contact graphic = contact IEC graphic,
+ set ground graphic = ground IEC graphic,
+ set battery graphic = battery IEC graphic,
+ set diode graphic = diode IEC graphic,
+ set Zener diode graphic = Zener diode IEC graphic,
+ set tunnel diode graphic = tunnel diode IEC graphic,
+ set backward diode graphic = backward diode IEC graphic,
+ set Schottky diode graphic = Schottky diode IEC graphic,
+ set breakdown diode graphic = breakdown diode IEC graphic,
+ set bulb graphic = bulb IEC graphic,
+ set voltage source graphic = voltage source IEC graphic,
+ set current source graphic = current source IEC graphic,
+ set make contact graphic = make contact IEC graphic,
+ set break contact graphic = break contact IEC graphic,
+ set amperemeter graphic = amperemeter graphic,
+ set voltmeter graphic = voltmeter graphic,
+ set ohmmeter graphic = ohmmeter graphic,
+ set ac source graphic = ac source graphic,
+ set dc source graphic = dc source graphic,
+ },
+}%
+
+
+%
+% Resistors
+%
+
+\tikzset{
+ resistor IEC graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 4 height 1,
+ shape=rectangle ee,
+ transform shape,
+ },
+ var resistor IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 4.8 height 0.8,
+ shape=var resistor IEC,
+ transform shape,
+ outer sep=0pt,
+ cap=round,
+ },
+}%
+
+
+
+%
+% Inductors
+%
+
+\tikzset{
+ inductor IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 4 height .5,
+ transform shape,
+ shape=inductor IEC,
+ outer sep=0pt,
+ cap=round,
+ },
+ var inductor IEC graphic/.style={
+ circuit symbol filled,
+ circuit symbol size=width 4 height 1,
+ transform shape,
+ shape=rectangle ee,
+ },
+}%
+
+
+
+%
+% Capacitors
+%
+
+\tikzset{
+ capacitor IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width .5 height 2,
+ transform shape,
+ shape=capacitor IEC,
+ },
+}%
+
+
+
+%
+% Ground
+%
+
+\tikzset{
+ ground IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width .75 height 2,
+ transform shape,
+ shape=ground IEC,
+ },
+}%
+
+
+
+
+%
+% Battery
+%
+
+\tikzset{
+ battery IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width .5 height 2.5,
+ transform shape,
+ shape=battery IEC,
+ transform shape,
+ },
+}%
+
+
+
+%
+% Diodes
+%
+
+\tikzset{
+ %
+ % normal diode
+ %
+ diode IEC graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 1.25 height 1.25,
+ transform shape,
+ shape=generic diode IEC,
+ /pgf/generic diode IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfusepathqstroke
+ },
+ },
+ var diode IEC graphic/.style={
+ diode IEC graphic,
+ circuit symbol filled,
+ },
+}%
+
+\tikzset{
+ %
+ % Zener diode
+ %
+ Zener diode IEC graphic/.style={
+ diode IEC graphic,
+ /pgf/generic diode IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfusepathqstroke
+ },
+ },
+ var Zener diode IEC graphic/.style={
+ Zener diode IEC graphic,
+ circuit symbol filled,
+ },
+}%
+
+\tikzset{
+ %
+ % Schottky diode
+ %
+ Schottky diode IEC graphic/.style={
+ diode IEC graphic,
+ /pgf/generic diode IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{-.4pt}{-.6pt}}
+ \pgfpathlineto{\pgfqpoint{-.4pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfpathlineto{\pgfqpoint{.4pt}{1pt}}
+ \pgfpathlineto{\pgfqpoint{.4pt}{.6pt}}
+ \pgfusepathqstroke
+ },
+ },
+ var Schottky diode IEC graphic/.style={
+ Schottky diode IEC graphic,
+ circuit symbol filled,
+ },
+}%
+
+\tikzset{
+ %
+ % tunnel diode
+ %
+ tunnel diode IEC graphic/.style={
+ diode IEC graphic,
+ /pgf/generic diode IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfpathlineto{\pgfqpoint{-.5pt}{1pt}}
+ \pgfusepathqstroke
+ },
+ },
+ var tunnel diode IEC graphic/.style={
+ tunnel diode IEC graphic,
+ circuit symbol filled,
+ },
+}%
+
+\tikzset{
+ %
+ % backward diode
+ %
+ backward diode IEC graphic/.style={
+ diode IEC graphic,
+ /pgf/generic diode IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{.5pt}{-1pt}}
+ \pgfpathmoveto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfpathmoveto{\pgfqpoint{-.5pt}{1pt}}
+ \pgfpathlineto{\pgfqpoint{.5pt}{1pt}}
+ \pgfusepathqstroke
+ },
+ },
+ var backward diode IEC graphic/.style={
+ backward diode IEC graphic,
+ circuit symbol filled,
+ },
+}%
+
+
+\tikzset{
+ %
+ % breakdown diode
+ %
+ breakdown diode IEC graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 2.5 height 1.25,
+ transform shape,
+ shape=breakdown diode IEC,
+ },
+ var breakdown diode IEC graphic/.style={
+ breakdown diode IEC graphic,
+ circuit symbol filled,
+ },
+}%
+
+
+
+%
+% Contacts
+%
+
+\tikzset{
+ contact IEC graphic/.style={
+ circuit symbol filled,
+ circuit symbol size=width .5 height .5,
+ shape=circle ee,
+ outer sep=.25\pgflinewidth,
+ },
+% connection IEC graphic/.style={
+% circuit symbol open,
+% circuit symbol size=width 1 height 1,
+% shape=circle ee,
+% outer sep=.25\pgflinewidth,
+% },
+}%
+
+
+%
+% Bulbs
+%
+
+\tikzset{
+ bulb IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 1.5 height 1.5,
+ shape=generic circle IEC,
+ /pgf/generic circle IEC/before background={
+ \pgfpathmoveto{\pgfpointpolar{-135}{1pt}}
+ \pgfpathlineto{\pgfpointpolar{45}{1pt}}
+ \pgfpathmoveto{\pgfpointpolar{-45}{1pt}}
+ \pgfpathlineto{\pgfpointpolar{135}{1pt}}
+ \pgfusepathqstroke
+ },
+ transform shape,
+ },
+}%
+
+
+%
+% Current and voltage sources
+%
+
+\tikzset{
+ current source IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 2 height 2,
+ shape=generic circle IEC,
+ /pgf/generic circle IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{0pt}{-1pt}}
+ \pgfpathlineto{\pgfqpoint{0pt}{1pt}}
+ \pgfusepathqstroke
+ },
+ transform shape,
+ },
+ voltage source IEC graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 2 height 2,
+ shape=generic circle IEC,
+ /pgf/generic circle IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{-1pt}{0pt}}
+ \pgfpathlineto{\pgfqpoint{1pt}{0pt}}
+ \pgfusepathqstroke
+ },
+ transform shape,
+ },
+}%
+
+
+
+%
+% Contacts
+%
+
+\tikzset{
+ make contact IEC graphic/.style={
+ circuit symbol wires,
+ circuit symbol size=width 2 height 1,
+ transform shape,
+ shape=make contact IEC,
+ outer sep=0pt,
+ cap=round,
+ },
+ var make contact IEC graphic/.style={
+ circuit symbol wires,
+ circuit symbol size=width 2.4 height 1,
+ transform shape,
+ shape=var make contact IEC,
+ outer sep=0pt,
+ cap=round,
+ },
+}%
+
+
+\tikzset{
+ break contact IEC graphic/.style={
+ circuit symbol wires,
+ circuit symbol size=width 2 height 1,
+ transform shape,
+ shape=break contact IEC,
+ outer sep=0pt,
+ cap=round,
+ },
+}%
+
+
+
+%
+% Measurement devices
+%
+
+\tikzset{
+ amperemeter graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 2 height 2,
+ transform shape,
+ shape=generic circle IEC,
+ info=center:A,
+ },
+ voltmeter graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 2 height 2,
+ transform shape,
+ shape=generic circle IEC,
+ info=center:V,
+ },
+ ohmmeter graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 2 height 2,
+ transform shape,
+ shape=generic circle IEC,
+ info=center:$\Omega$,
+ },
+}%
+
+
+
+%
+% AC/DC
+%
+
+\tikzset{
+ ac source graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 2 height 2,
+ shape=generic circle IEC,
+ /pgf/generic circle IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{0.7pt}{0pt}}
+ \pgfpathquadraticcurveto{\pgfqpoint{ 0.35pt}{-0.5pt}}{\pgfqpoint{0pt}{0pt}}
+ \pgfpathquadraticcurveto{\pgfqpoint{-0.35pt}{ 0.5pt}}{\pgfqpoint{-0.7pt}{0pt}}
+ \pgfusepathqstroke
+ },
+ transform shape,
+ },
+ dc source graphic/.style={
+ circuit symbol lines,
+ circuit symbol size=width 2 height 2,
+ shape=generic circle IEC,
+ /pgf/generic circle IEC/before background={
+ \pgfpathmoveto{\pgfqpoint{ 0.7pt}{ 0.2pt}}
+ \pgfpathlineto{\pgfqpoint{-0.7pt}{ 0.2pt}}
+ \pgfusepathqstroke
+ \pgfpathmoveto{\pgfqpoint{ 0.7pt}{-0.2pt}}
+ \pgfpathlineto{\pgfqpoint{-0.7pt}{-0.2pt}}
+ \pgfusepathqstroke
+ },
+ transform shape,
+ },
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.ee.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.ee.code.tex
new file mode 100644
index 0000000000..21eeec02b6
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.ee.code.tex
@@ -0,0 +1,148 @@
+
+% Copyright 2008 by Till Tantau and others 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.
+
+\usetikzlibrary{circuits}%
+\usepgflibrary{shapes.gates.ee}%
+
+
+%
+% Setting up an ee circuit
+%
+\tikzset{
+ circuit ee/.style={
+ circuit,
+ every circuit ee/.try
+ }
+}%
+
+
+%
+% The default symbols (you need to load a sublib to install the actual rendering).
+%
+
+\tikzset{
+ circuit declare symbol = resistor,
+ circuit declare symbol = inductor,
+ circuit declare symbol = capacitor,
+ circuit declare symbol = contact,
+ circuit declare symbol = ground,
+ circuit declare symbol = battery,
+ circuit declare symbol = diode,
+ circuit declare symbol = Zener diode,
+ circuit declare symbol = Schottky diode,
+ circuit declare symbol = tunnel diode,
+ circuit declare symbol = backward diode,
+ circuit declare symbol = breakdown diode,
+ circuit declare symbol = bulb,
+ circuit declare symbol = current source,
+ circuit declare symbol = voltage source,
+ circuit declare symbol = current direction,
+ circuit declare symbol = current direction',
+ circuit declare symbol = make contact,
+ circuit declare symbol = break contact,
+ circuit declare symbol = amperemeter,
+ circuit declare symbol = voltmeter,
+ circuit declare symbol = ohmmeter,
+ circuit declare symbol = ac source,
+ circuit declare symbol = dc source,
+ %
+ set current direction graphic = current direction ee graphic,
+ set current direction' graphic = current direction' ee graphic,
+}%
+
+
+%
+% The default labels
+%
+
+\tikzset{
+ circuit declare unit={ampere}{A},
+ circuit declare unit={volt}{V},
+ circuit declare unit={ohm}{\Omega},
+ circuit declare unit={siemens}{S},
+ circuit declare unit={henry}{H},
+ circuit declare unit={farad}{F},
+ circuit declare unit={coulomb}{C},
+ circuit declare unit={voltampere}{VA},
+ circuit declare unit={watt}{W},
+ circuit declare unit={hertz}{Hz},
+}%
+
+
+
+%
+% The direction and arrow settings
+%
+
+\tikzset{
+ % These styles should set the end-arrow.
+ %
+ % This arrow will generally be used to indicate current directions in a circuit:
+ current direction arrow/.style = {
+ /utils/exec={\pgfsetarrowoptions{direction ee}{1.3065*.5*\the\tikzcircuitssizeunit+1.3065*.3*\the\pgflinewidth}},
+ >=direction ee,
+ direction ee arrow = direction ee,
+ }
+}%
+
+
+
+
+\tikzset{
+ current direction ee graphic/.style = {
+ shape=direction ee,
+ circuit symbol filled,
+ current direction arrow,
+ minimum width = .5*\the\tikzcircuitssizeunit+.3*\the\pgflinewidth,
+ minimum height = .5*\the\tikzcircuitssizeunit+.3*\the\pgflinewidth,
+ transform shape
+ },
+ current direction' ee graphic/.style = {
+ current direction ee graphic,
+ rotate=180
+ }
+}%
+
+
+
+%
+% Annotations
+%
+
+\tikzset{
+ circuit declare annotation={direction info}{.5\tikzcircuitssizeunit}
+ {
+ (-1.25\tikzcircuitssizeunit,.3333\tikzcircuitssizeunit) edge[line to] (1.25\tikzcircuitssizeunit,.3333\tikzcircuitssizeunit)
+ },
+ circuit declare annotation={light emitting}{1.75\tikzcircuitssizeunit}
+ {
+ (-.2\tikzcircuitssizeunit,.65\tikzcircuitssizeunit) edge[line to] ++(45:1.25\tikzcircuitssizeunit)
+ (.2\tikzcircuitssizeunit,.25\tikzcircuitssizeunit) edge[line to] ++(45:1.25\tikzcircuitssizeunit)
+ },
+ circuit declare annotation={light dependent}{1.75\tikzcircuitssizeunit}
+ {
+ [shift=(135:1.25\tikzcircuitssizeunit)]
+ (.2\tikzcircuitssizeunit,.65\tikzcircuitssizeunit) edge[line to] ++(-45:1.25\tikzcircuitssizeunit)
+ (-.2\tikzcircuitssizeunit,.25\tikzcircuitssizeunit) edge[line to] ++(-45:1.25\tikzcircuitssizeunit)
+ },
+ circuit declare annotation={adjustable}{1.5\tikzcircuitssizeunit}
+ {
+ [shift=(\tikzlastnode.center)]
+ (-1.5\tikzcircuitssizeunit,-1.5\tikzcircuitssizeunit) edge[line to] (1.5\tikzcircuitssizeunit,1.5\tikzcircuitssizeunit)
+ },
+ circuit declare annotation={adjustable'}{1.5\tikzcircuitssizeunit}
+ {
+ [shift=(\tikzlastnode.center)]
+ (-1.5\tikzcircuitssizeunit,1.5\tikzcircuitssizeunit) edge[line to] (1.5\tikzcircuitssizeunit,-1.5\tikzcircuitssizeunit)
+ }
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.logic.CDH.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.CDH.code.tex
new file mode 100644
index 0000000000..c016899253
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.CDH.code.tex
@@ -0,0 +1,28 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+\usetikzlibrary{circuits.logic.US}%
+
+\tikzset{
+ circuit logic CDH/.style =
+ {
+ circuit logic US,
+ set and gate graphic = and gate CDH graphic,
+ set nand gate graphic = nand gate CDH graphic,
+ }
+}%
+
+\tikzset{
+ circuit logic US make graphic=and gate CDH,
+ circuit logic US make graphic=nand gate CDH,
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.logic.IEC.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.IEC.code.tex
new file mode 100644
index 0000000000..54a1068eb4
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.IEC.code.tex
@@ -0,0 +1,75 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+\usetikzlibrary{circuits.logic}%
+\usepgflibrary{shapes.gates.logic.IEC}%
+
+
+%
+% When this lib is loaded, all symbols default to IEC
+%
+
+\tikzset{
+ circuit logic IEC/.style=
+ {
+ circuit logic,
+ set and gate graphic = and gate IEC graphic,
+ set nand gate graphic = nand gate IEC graphic,
+ set or gate graphic = or gate IEC graphic,
+ set nor gate graphic = nor gate IEC graphic,
+ set xor gate graphic = xor gate IEC graphic,
+ set xnor gate graphic = xnor gate IEC graphic,
+ set not gate graphic = not gate IEC graphic,
+ set buffer gate graphic = buffer gate IEC graphic,
+ %
+ and gate IEC symbol = {$\scriptstyle\char`\&$},
+ nand gate IEC symbol = {$\scriptstyle\char`\&$},
+ or gate IEC symbol = {$\scriptstyle\geq1$},
+ nor gate IEC symbol = {$\scriptstyle\geq1$},
+ xor gate IEC symbol = {$\scriptstyle=1$},
+ xnor gate IEC symbol = {$\scriptstyle=1$},
+ not gate IEC symbol = {$\scriptstyle1$},
+ buffer gate IEC symbol = {$\scriptstyle1$},
+ },
+}%
+
+
+%
+% The logical gate graphics are all nearly identical, so we provide a
+% simple style for creating them:
+%
+\tikzset{
+ circuit logic IEC make graphic/.style=
+ {
+ #1 graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 2.5 height 4,
+ shape=#1,
+ inner sep=.5ex
+ }
+ }
+}%
+
+
+\tikzset{
+ circuit logic IEC make graphic=and gate IEC,
+ circuit logic IEC make graphic=nand gate IEC,
+ circuit logic IEC make graphic=or gate IEC,
+ circuit logic IEC make graphic=nor gate IEC,
+ circuit logic IEC make graphic=xor gate IEC,
+ circuit logic IEC make graphic=xnor gate IEC,
+ circuit logic IEC make graphic=not gate IEC,
+ circuit logic IEC make graphic=buffer gate IEC,
+ circuit logic IEC make graphic=and gate CDH,
+ circuit logic IEC make graphic=nand gate CDH,
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.logic.US.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.US.code.tex
new file mode 100644
index 0000000000..76d48c863a
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.US.code.tex
@@ -0,0 +1,64 @@
+% Copyright 2008 by Till Tantau and others 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.
+
+\usetikzlibrary{circuits.logic}%
+\usepgflibrary{shapes.gates.logic.US}%
+
+
+%
+% When this lib is loaded, all symbols default to IEC
+%
+
+\tikzset{
+ circuit logic US/.style=
+ {
+ circuit logic,
+ set and gate graphic = and gate US graphic,
+ set nand gate graphic = nand gate US graphic,
+ set or gate graphic = or gate US graphic,
+ set nor gate graphic = nor gate US graphic,
+ set xor gate graphic = xor gate US graphic,
+ set xnor gate graphic = xnor gate US graphic,
+ set not gate graphic = not gate US graphic,
+ set buffer gate graphic = buffer gate US graphic
+ }
+}%
+
+
+%
+% The logical gate graphics are all nearly identical, so we provide a
+% simple style for creating them:
+%
+\tikzset{
+ circuit logic US make graphic/.style=
+ {
+ #1 graphic/.style={
+ circuit symbol open,
+ circuit symbol size=width 0 height 2.5,
+ shape=#1,
+ transform shape
+ }
+ }
+}%
+
+
+\tikzset{
+ circuit logic US make graphic=and gate US,
+ circuit logic US make graphic=nand gate US,
+ circuit logic US make graphic=or gate US,
+ circuit logic US make graphic=nor gate US,
+ circuit logic US make graphic=xor gate US,
+ circuit logic US make graphic=xnor gate US,
+ circuit logic US make graphic=not gate US,
+ circuit logic US make graphic=buffer gate US,
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarycircuits.logic.code.tex b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.code.tex
new file mode 100644
index 0000000000..fb896e6a06
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarycircuits.logic.code.tex
@@ -0,0 +1,45 @@
+% Copyright 2008 by Till Tantau and 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.
+
+\usetikzlibrary{circuits}%
+
+
+
+%
+% Provides a shortcut to the "logic gates inputs" key.
+%
+
+\tikzset{
+ circuit logic/.style={
+ circuit,
+ inputs/.style={logic gate inputs={##1}},
+ logic gate inverted radius=.25\tikzcircuitssizeunit,
+ every circuit logic/.try,
+ }
+}%
+
+
+
+%
+% The default symbols (you need to load a sublib to install the actual rendering).
+%
+
+\tikzset{
+ circuit declare symbol = and gate,
+ circuit declare symbol = nand gate,
+ circuit declare symbol = or gate,
+ circuit declare symbol = nor gate,
+ circuit declare symbol = xor gate,
+ circuit declare symbol = xnor gate,
+ circuit declare symbol = not gate,
+ circuit declare symbol = buffer gate
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydatavisualization.3d.code.tex b/graphics/pgf/base/tex/tikzlibrarydatavisualization.3d.code.tex
new file mode 100644
index 0000000000..a01a5720c5
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydatavisualization.3d.code.tex
@@ -0,0 +1,79 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarydatavisualization.3d.code.tex}
+
+\usetikzlibrary{datavisualization}%
+
+
+
+% The following is not yet really implement. But you might get the idea...
+
+
+
+% A 3d version of the school book plot
+
+\tikzdatavisualizationset{
+ school book 3d plot/.style={
+ xyz Cartesian,
+ x axis={
+ visualize axis={y axis={goto=0},z axis={goto=0},styling/.style=->},
+ visualize ticks={common={y axis={goto=0},z axis={goto=0},direction axis=y axis},only ticks={tick text at min extend}},
+% visualize ticks={common={y axis={goto=0},z axis={goto=0},direction axis=z axis}},
+ },
+ y axis={
+ visualize axis={x axis={goto=0},z axis={goto=0},styling/.style=->},
+ visualize ticks={common={x axis={goto=0},z axis={goto=0},direction axis=x axis},only ticks={tick text at min extend}},
+% visualize ticks={common={x axis={goto=0},z axis={goto=0},direction axis=z axis}},
+ },
+ z axis={
+ visualize axis={x axis={goto=0},y axis={goto=0},styling/.style=->},
+ visualize ticks={common={x axis={goto=0},y axis={goto=0},direction axis=x axis},only ticks={tick text at min extend}},
+% visualize ticks={common={x axis={goto=0},y axis={goto=0},direction axis=y axis}}
+ },
+ new line plot,
+ every school book plot/.try,
+ },
+}%
+
+
+% A 3d version of the scientific plot
+%
+% Here, a "length" is used for the length of the three
+% axes, rather than a predetermined rectangle (this does not really
+% make sense for the z-axis. You overrule these settings easily.
+
+\tikzdatavisualizationset{
+ scientific 3d plot/length/.initial=100pt,
+ scientific 3d plot/.style={
+ xyz Cartesian,
+ x axis={
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific 3d plot/length},
+ visualize axis={y axis={goto=min},z axis={goto=min}},
+ visualize axis={y axis={goto=max},z axis={goto=min}},
+ visualize axis={y axis={goto=min},z axis={goto=max}},
+ visualize axis={y axis={goto=max},z axis={goto=max}},
+ },
+ y axis={
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific 3d plot/length},
+ visualize axis={x axis={goto=min},z axis={goto=min}},
+ visualize axis={x axis={goto=max},z axis={goto=min}},
+ visualize axis={x axis={goto=min},z axis={goto=max}},
+ visualize axis={x axis={goto=max},z axis={goto=max}},
+ },
+ z axis={
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific 3d plot/length},
+ visualize axis={x axis={goto=min},y axis={goto=min}},
+ visualize axis={x axis={goto=max},y axis={goto=min}},
+ visualize axis={x axis={goto=min},y axis={goto=max}},
+ visualize axis={x axis={goto=max},y axis={goto=max}},
+ },
+ new line plot,
+ },
+}%
diff --git a/graphics/pgf/base/tex/tikzlibrarydatavisualization.barcharts.code.tex b/graphics/pgf/base/tex/tikzlibrarydatavisualization.barcharts.code.tex
new file mode 100644
index 0000000000..3eefe0f81a
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydatavisualization.barcharts.code.tex
@@ -0,0 +1,43 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarydatavisualization.barcharts.code.tex}
+
+\usetikzlibrary{datavisualization}%
+\usepgflibrary{datavisualization.barcharts}%
+
+
+\tikzdatavisualizationset{%
+ candle stick plot/.style={
+ new object={
+ store=/tikz/data visualization/count,
+ class=count,
+ arg1=day
+ },
+ new axis=y axis,
+ y axis/source=dax,
+ y axis/source max=100,
+ y axis/vec=\pgfqpoint{0cm}{1cm},
+ new object={
+ store=/tikz/data visualization/x line trans,
+ class=line transformer,
+ arg1=day,
+ arg2=\pgfqpoint{3mm}{0mm}
+ },
+ new object={
+ store=/tikz/data visualization/index,
+ class=candle stick visualizer,
+ arg1 from key=index/source
+ },
+ },
+ index/source/.initial=index,
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydatavisualization.code.tex b/graphics/pgf/base/tex/tikzlibrarydatavisualization.code.tex
new file mode 100644
index 0000000000..7f26cc0017
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydatavisualization.code.tex
@@ -0,0 +1,2729 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarydatavisualization.code.tex}
+
+\usepgfmodule{datavisualization}%
+\usetikzlibrary{backgrounds}%
+
+
+\tikzset{/tikz/data visualization/.is family,
+ /tikz/data visualization/.unknown/.code={
+ \let\tikz@dv@key\pgfkeyscurrentname%
+ \pgfkeys{/tikz/\tikz@dv@key/.try={#1}}%
+ \ifpgfkeyssuccess%
+ \else%
+ \edef\pgf@temp{/errors/unknown key={/tikz/data visualization/\tikz@dv@key}}%
+ \expandafter\pgfkeys\expandafter{\pgf@temp{#1}}%
+ \fi%
+ },
+ /tikz/data visualization/data/.unknown/.code={%
+ % Redirect to /pgf/data
+ \let\tikz@dv@key\pgfkeyscurrentname%
+ \pgfkeys{/pgf/data/\tikz@dv@key/.try={#1}}%
+ \ifpgfkeyssuccess%
+ \else%
+ \edef\pgf@temp{/errors/unknown key={/pgf/data/\tikz@dv@key}}%
+ \expandafter\pgfkeys\expandafter{\pgf@temp{#1}}%
+ \fi%
+ },
+}%
+
+\def\tikzdatavisualizationset{\pgfqkeys{/tikz/data visualization}}%
+
+
+
+
+% The main \datavisualization command
+%
+% This command must, as always, be given inside a tikz picture. It
+% will add a data visualization to the picture; use "shift" option and
+% friends to place the data visualization somewhere other than at the
+% origin.
+%
+% The \datavisualization is followed by a sequence of blocks and ended
+% with a semicolon. Each block may be one of the following:
+%
+% "data" blocks.
+%
+% Syntax: data [options] % options specify an external source
+% Syntax: data [options] { inline data }
+%
+% The optional arguments may either specify an
+% external data source or the data may follow inline.
+%
+% The options are executed for the path /pgf/data. The style
+% /tikz/every data is executed for each data, which can be useful to
+% generally set, say, a certain data format.
+%
+%
+% "data set" blocks.
+%
+% Syntax: data set [options] {name} = { ... }
+% Syntax: data set [options] {name} += { ... }
+% Syntax: data set [options] {name}
+%
+% The first syntax allows you to define a data set. The data block
+% inside {...} will be stored inside the data set
+% "name". Subsequently, the data set can be referenced by using the
+% third syntax. The second syntax allows you to extend the
+% definition of an already defined data set.
+%
+%
+% "info" and "info'" blocks.
+%
+% Syntax: info [options] {code}
+% Syntax: info' [options] {code}
+%
+% A block starting with "info" or "info'" may contain any code. It
+% will be executed after the visualization (info) or before the
+% visualization (info').
+%
+%
+% Options blocks.
+%
+% Syntax: [options]
+%
+% The options will be executed immediately.
+%
+% Scope blocks.
+%
+% Syntax: scope[options] { blocks }
+%
+% The blocks are executed inside a scope for which the options are
+% set. This can be used to group data blocks.
+%
+% Examples:
+%
+% \datavisualization[schoolbook plot]
+% data [source=my_data_file.csv]
+% ;
+%
+% \datavisualization[schoolbook plot]
+% data [format=key value pairs]
+% {
+% x=0, y=0
+% x=1, y=1
+% x=2, y=4
+% x=3, y=9
+% };
+%
+% \datavisualization[schoolbook plot]
+% data [format=function]
+% {
+% var x: interval [0:3];
+% func y = \value x*\value x;
+% }
+% [at begin visualization={
+% \fill [black!10] (visualization cs:x=0,y=0) -- (visualization cs:x=3,y=9);
+% }]
+% info[red]
+% {
+% \draw (visualization cs:x=0,y=0) -- (visualization cs:x=3,y=9);
+% };
+%
+% \datavisualization[schoolbook plot]
+% data [/data point/label=first experiment,source=file_1]
+% data [/data point/label=second experiment,source=file_2]
+% data [/data point/label=third experiment,source=file_3]
+% data [/data point/label=prediction,format=function]
+% { var x: interval [0,1]; func y = rand(\value x); }
+% ;
+
+\def\tikz@lib@datavisualization{
+ \begingroup%
+ \let\tikz@path@do@at@end=\relax%
+ % Ok, first, start a new data visualization
+ \pgfoonew \tikz@main@dv=new data visualization()%
+ % Next, create a scope for the dv
+ \pgfset{local bounding box=data visualization bounding box}%
+ % Clear the axis list
+ \pgfkeyslet{/tikz/data visualization/axes list}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/axes actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/label actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/legend actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/grid actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/major grid actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/minor grid actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/subminor grid actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/ticks actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/major ticks actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/minor ticks actions}\pgfutil@empty%
+ \pgfkeyslet{/tikz/data visualization/subminor ticks actions}\pgfutil@empty%
+ \tikz@main@dv.before visualization(%
+ )%
+ \tikz@main@dv.after visualization(%
+ \tikz@lib@dv@alias@dv@bb
+ \pgfkeysvalueof{/tikz/data visualization/grid actions}
+ \pgfkeysvalueof{/tikz/data visualization/subminor grid actions}
+ \pgfkeysvalueof{/tikz/data visualization/minor grid actions}
+ \pgfkeysvalueof{/tikz/data visualization/major grid actions}
+ \pgfkeysvalueof{/tikz/data visualization/ticks actions}
+ \pgfkeysvalueof{/tikz/data visualization/subminor ticks actions}
+ \pgfkeysvalueof{/tikz/data visualization/minor ticks actions}
+ \pgfkeysvalueof{/tikz/data visualization/major ticks actions}
+ \pgfkeysvalueof{/tikz/data visualization/axes actions}
+ \pgfkeysvalueof{/tikz/data visualization/label actions}
+ \pgfkeysvalueof{/tikz/data visualization/legend actions}
+ )%
+ %
+ \pgfset{/pgf/data/continue code=\tikz@lib@dv@parse@loop}%
+ % Now enter parse loop
+ \tikz@lib@dv@parse@loop
+}%
+
+\def\tikz@lib@dv@parse@loop{%
+ \pgfutil@ifnextchar d\tikz@lib@dv@handle@data{%
+ \pgfutil@ifnextchar ;\tikz@lib@dv@parse@end{%
+ \pgfutil@ifnextchar \par\tikz@lib@dv@handle@par{%
+ \pgfutil@ifnextchar s\tikz@lib@dv@handle@beginscope{%
+ \pgfutil@ifnextchar i\tikz@lib@dv@handle@info{%
+ \pgfutil@ifnextchar [\tikz@lib@dv@handle@options{%
+ \pgfutil@ifnextchar \egroup\tikz@lib@dv@handle@endscope{%
+ \tikzerror{Semicolon expected}%
+ \endgroup%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}%
+\def\tikz@lib@dv@parse@end;{%
+ % Go!
+ \tikz@main@dv.survey()%
+ \tikz@main@dv.visualize()%
+ \endgroup%
+ \tikz@path@do@at@end%
+}%
+\def\tikz@lib@dv@handle@par\par{\tikz@lib@dv@parse@loop}%
+
+\def\tikz@lib@dv@handle@options[#1]{%
+ \tikzdatavisualizationset{#1}%
+ \tikz@lib@dv@parse@loop%
+}%
+
+\def\tikz@lib@dv@handle@beginscope scope{%
+ \begingroup%
+ \pgfutil@ifnextchar[\tikz@lib@dv@beg@opt{\tikz@lib@dv@beg@opt[]}%}
+}%
+\def\tikz@lib@dv@beg@opt[#1]{%
+ \pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\begingroup\pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}}})}%
+ \pgfutil@ifnextchar\bgroup{
+ \afterassignment\tikz@lib@dv@parse@loop%
+ \let\tikz@dummy=%get rid of \bgroup
+ }{%
+ \tikzerror{Opening brace expected}%
+ \tikz@lib@dv@parse@loop%
+ }%
+}%
+\def\tikz@lib@dv@handle@endscope{%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data(\endgroup)}%
+ \endgroup%
+ \afterassignment\tikz@lib@dv@parse@loop%
+ \let\tikz@dummy=%get rid of \egroup
+}%
+
+\def\tikz@lib@dv@handle@data data{%
+ \pgfutil@ifnextchar g{\tikz@lib@dv@handle@data@group}{%
+ \pgfutil@ifnextchar p{\tikz@lib@dv@handle@data@point}{%
+ \pgfdata}}}%
+
+\def\tikz@lib@dv@handle@data@group group{\pgfutil@ifnextchar[{\tikz@lib@dv@handle@data@group@opt}{\tikz@lib@dv@handle@data@group@opt[]}}%}%
+
+\def\tikz@lib@dv@handle@data@group@opt[#1]#2{%
+ \pgfutil@ifnextchar={\tikz@lib@dv@handle@data@group@def{#1}{#2}}{%
+ \pgfutil@ifnextchar+{\tikz@lib@dv@handle@data@group@extend{#1}{#2}}{%
+ \tikz@lib@dv@handle@data@group@use{#1}{#2}}}}%
+
+\def\tikz@lib@dv@handle@data@group@def#1#2={%
+ \pgfkeys{/pgf/data/new group=#2}%
+ \tikz@lib@dv@handle@data@group@extend{#1}{#2}+=%
+}%
+
+\def\tikz@lib@dv@handle@data@group@extend#1#2+={%
+ \pgfutil@ifnextchar\bgroup{
+ \begingroup%
+ \pgfkeys{/pgf/data/store in group=#2}%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\begingroup\pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}}})}%
+ \afterassignment\tikz@lib@dv@parse@loop%
+ \let\tikz@dummy=%get rid of \bgroup
+ }{%
+ \tikzerror{Opening brace expected}%
+ \tikz@lib@dv@parse@loop%
+ }%
+}%
+
+\def\tikz@lib@dv@handle@data@group@use#1#2{%
+ \pgfdata[#1,use group=#2]%
+}%
+
+\def\tikz@lib@dv@handle@data@point point{\pgfutil@ifnextchar[{\tikz@lib@dv@handle@data@point@opt}{\tikz@lib@dv@handle@data@point@opt[]}}%]%
+\def\tikz@lib@dv@handle@data@point@opt[#1]{%
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\bgroup\pgfkeys{/data point/.cd,#1}\pgfdatapoint\egroup}})}%
+ \tikz@lib@dv@parse@loop%
+}%
+
+\def\tikz@lib@dv@handle@info info{%
+ \pgfutil@ifnextchar'{\tikz@lib@dv@handle@info@prime}{\tikz@lib@dv@handle@info@noprime}}%
+\def\tikz@lib@dv@handle@info@noprime{%
+ \pgfutil@ifnextchar[{\tikz@lib@dv@handle@info@block@opt}{\tikz@lib@dv@handle@info@block@opt[]}}%}%
+\def\tikz@lib@dv@handle@info@block@opt[#1]#2{%
+ \tikz@main@dv.after visualization({\scope[#1]#2\endscope})%
+ \tikz@lib@dv@parse@loop
+}%
+\def\tikz@lib@dv@handle@info@prime'{%
+ \pgfutil@ifnextchar[{\tikz@lib@dv@handle@info@block@opt@prime}{\tikz@lib@dv@handle@info@block@opt@prime[]}}%}%
+\def\tikz@lib@dv@handle@info@block@opt@prime[#1]#2{%
+ \tikz@main@dv.before visualization({\scope[#1]#2\endscope})%
+ \tikz@lib@dv@parse@loop
+}%
+
+
+\pgfset{/pgf/every data/.style={/tikz/every data/.try,/tikz/data visualization/every data/.try}}%
+
+
+%
+% Performing before/after stuff via keys
+%
+
+\tikzdatavisualizationset{
+ before survey/.code=\tikz@main@dv.before survey({#1}),
+ after survey/.code=\tikz@main@dv.after survey({#1}),
+ before visualization/.code=\tikz@main@dv.before visualization({#1}),
+ after visualization/.code=\tikz@main@dv.after visualization({#1}),
+ at start survey/.code=\tikz@main@dv.at start survey({#1}),
+ at end survey/.code=\tikz@main@dv.at end survey({#1}),
+ at start visualization/.code=\tikz@main@dv.at start visualization({#1}),
+ at end visualization/.code=\tikz@main@dv.at end visualization({#1}),
+}%
+
+
+\def\tikz@lib@dv@alias@dv@bb{
+ \pgfnodealias{data bounding box}{data visualization bounding box}%
+ \pgfkeys{/pgf/freeze local bounding box=data bounding box}%
+}%
+
+%
+% The data point key
+%
+\tikzdatavisualizationset{
+ data point/.code={
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\bgroup\pgfkeys{/data point/.cd,#1}\pgfdatapoint\egroup}})}%
+ }
+}%
+
+
+%
+% Object setup
+%
+
+% The following key is used to create objects for the rendering
+% pipeline. They cannot be created "directly" because when it is known
+% that the objects needs to be created, in principle, many keys may
+% not yet be known.
+%
+% The following options are used:
+%
+% store = key that will store the object (handle)
+% class = class of the object
+% arg1 = argument1 of the constructor
+% ...
+% arg8 = argument8 of the constructor
+% when = specifies when the object will be created. Defaults to
+% "before survey", other possible values are "after survey" and
+% "before/after visualization"
+% before creation = code to be executed just before the object is
+% created
+% after creation = code to be executed just after the object has been created
+%
+% The following styles may be useful:
+%
+% arg1 from key = use the contents of the given key as arg1. Similar
+% for other args
+% arg1 handle from key = the contents of the given key should contain
+% an object. Then arg1 will be a handle to this
+% object. Similar for other args
+
+\tikzdatavisualizationset{%
+ new object/.code={%
+ \def\tikz@dv@grabbed@when{before survey}%
+ \let\tikz@dv@grabbed@store\pgfutil@empty
+ \pgfkeys{/tikz/data visualization/new object/grab/.cd,#1}%
+ \ifx\tikz@dv@grabbed@store\pgfutil@empty
+ \else
+ \pgfkeyslet{\tikz@dv@grabbed@store}\pgfutil@empty%
+ \fi
+ \edef\tikz@marshal{\noexpand\tikz@main@dv.\tikz@dv@grabbed@when(\noexpand\tikz@dv@newobject{\tikz@dv@grabbed@store}}%
+ \tikz@marshal{#1})%
+ },
+ new object/grab/store/.store in=\tikz@dv@grabbed@store,
+ new object/grab/when/.store in=\tikz@dv@grabbed@when,
+ new object/grab/.unknown/.code={},%ignore
+}%
+
+\def\tikz@dv@newobject#1#2{%
+ \def\tikz@dv@new@obj@store{#1}%
+ \ifx\tikz@dv@new@obj@store\pgfutil@empty%
+ \let\tikz@dv@new@obj=\pgfutil@empty%
+ \else%
+ \pgfkeysgetvalue\tikz@dv@new@obj@store\tikz@dv@new@obj%
+ \fi%
+ \ifx\tikz@dv@new@obj\pgfutil@empty
+ \let\tikz@dv@arg@a=\tikz@lib@notused%
+ \let\tikz@dv@arg@b=\tikz@lib@notused%
+ \let\tikz@dv@arg@c=\tikz@lib@notused%
+ \let\tikz@dv@arg@d=\tikz@lib@notused%
+ \let\tikz@dv@arg@e=\tikz@lib@notused%
+ \let\tikz@dv@arg@f=\tikz@lib@notused%
+ \let\tikz@dv@arg@g=\tikz@lib@notused%
+ \let\tikz@dv@arg@h=\tikz@lib@notused%
+ \let\tikz@dv@new@after=\relax%
+ \pgfkeys{/tikz/data visualization/new object/parse/.cd,#2}
+ \edef\pgf@marshal{\noexpand\pgfoonew\noexpand\tikzdvobj=new \tikz@dv@new@class(}%
+ \tikz@dv@add@arg{}\tikz@dv@arg@a%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@b%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@c%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@d%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@e%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@f%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@g%
+ \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@h%
+ \expandafter\def\expandafter\pgf@marshal\expandafter{\pgf@marshal)}%
+ \pgf@marshal%
+ \tikzdvobj.default connects()%
+ \ifx\tikz@dv@new@obj@store\pgfutil@empty%
+ \else%
+ \pgfkeyslet\tikz@dv@new@obj@store\tikzdvobj%
+ \fi%
+ \tikz@dv@new@after%
+ \fi
+}%
+\def\tikz@lib@notused{\tikz@lib@notused}%
+
+\def\tikz@dv@add@arg#1#2{%
+ \ifx#2\tikz@lib@notused%
+ \else%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@marshal%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@marshal#1#2}%
+ \fi%
+}%
+
+\tikzdatavisualizationset{%
+ new object/parse/.cd,
+ store/.code=,% ignore
+ when/.code=,% ignore
+ class/.store in=\tikz@dv@new@class,
+ before creation/.code=#1,
+ after creation/.store in=\tikz@dv@new@after,
+ arg1/.store in=\tikz@dv@arg@a,
+ arg2/.store in=\tikz@dv@arg@b,
+ arg3/.store in=\tikz@dv@arg@c,
+ arg4/.store in=\tikz@dv@arg@d,
+ arg5/.store in=\tikz@dv@arg@e,
+ arg6/.store in=\tikz@dv@arg@f,
+ arg7/.store in=\tikz@dv@arg@g,
+ arg8/.store in=\tikz@dv@arg@h,
+ arg1 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@a},
+ arg2 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@b},
+ arg3 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@c},
+ arg4 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@d},
+ arg5 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@e},
+ arg6 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@f},
+ arg7 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@g},
+ arg8 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@h}
+ arg1 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@a}{\tikz@dv@arg@a},
+ arg2 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@b}{\tikz@dv@arg@b},
+ arg3 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@c}{\tikz@dv@arg@c},
+ arg4 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@d}{\tikz@dv@arg@d},
+ arg5 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@e}{\tikz@dv@arg@e},
+ arg6 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@f}{\tikz@dv@arg@f},
+ arg7 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@g}{\tikz@dv@arg@g},
+ arg8 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@h}{\tikz@dv@arg@h}
+}%
+
+\def\tikz@dv@handle@from@key#1#2#3{%
+ \pgfkeysvalueof{#1}.get handle(#2)%
+ \def#3{#2}%
+}%
+
+
+
+
+%
+% Data visualization coordinate system
+%
+%
+% This cs is used to refer to points in a datavisualization. The
+% parameters are keys that are set in the /data point key
+% directory. Then, a (virtual) data point is created and the
+% calculated position is returned
+
+\tikzdeclarecoordinatesystem{visualization}
+{%
+ \tikzset{/data point/.cd,#1}%
+ \pgfpointdvlocaldatapoint%
+}%
+
+
+
+
+%
+%
+% Axes
+%
+%
+
+
+
+%
+% Axis base
+%
+
+\tikzdatavisualizationset{%
+ new axis base/.style={
+ new object={
+ class=scaling mapper,
+ store=/tikz/data visualization/#1/scaling mapper,
+ before creation={
+ \pgfkeysgetvalue{/tikz/data visualization/#1/scaling}\tikz@temp
+ \ifx\tikz@temp\pgfutil@empty%
+ \pgfkeysgetvalue{/tikz/data visualization/#1/scaling/default}\tikz@temp
+ \fi
+ \expandafter\tikz@dv@lib@parse@scaling\tikz@temp\pgf@stop%
+ \pgfkeyslet{/tikz/data visualization/#1/scaling}\tikz@temp
+ },
+ arg1 from key=/tikz/data visualization/#1/attribute,
+ arg2/.expanded=\pgfkeysvalueof{/tikz/data visualization/#1/attribute}/scaled,
+ arg3 from key=/tikz/data visualization/#1/scaling,
+ arg4 from key=/tikz/data visualization/#1/function
+ },
+ #1/attribute/.initial=#1,
+ #1/function/.initial=,
+ #1/scaling/.initial=,
+ #1/scaling/default/.initial=0 at 0 and 1 at 1,
+ #1/ticks at/.initial=,
+ #1/default ticks at/.initial=,
+ #1/major ticks/.initial=,
+ #1/minor ticks/.initial=,
+ #1/subminor ticks/.initial=,
+ #1/grid at/.initial=,
+ #1/default grid at/.initial=,
+ #1/major grid/.initial=,
+ #1/minor grid/.initial=,
+ #1/subminor grid/.initial=,
+ #1/label/.initial=,
+ #1/padding min/.initial=,
+ #1/padding max/.initial=,
+ #1/.code={
+ \let\tikz@temp\tikz@dv@axis%
+ \def\tikz@dv@axis{/tikz/data visualization/#1}%
+ \expandafter\tikz@do@axis@options\expandafter{\tikz@temp}{##1}%
+ },
+ #1/@compute at positions/.initial=\tikz@lib@dv@compute@at@linear,
+ axes list/.append={\tikz@lib@dv@do@axis{#1}}
+ },
+ all axes/.code={
+ \def\tikz@lib@dv@args{#1}%
+ \pgfkeysvalueof{/tikz/data visualization/axes list}%
+ },
+ % General styling
+ styling/.style=,
+ style/.style={styling/.append style={#1}},
+ @node styling/.initial=,
+ node styling/.style={%
+ /utils/exec={\pgfkeysgetvalue{/tikz/data visualization/@node styling}\tikz@temp\expandafter\tikzset\expandafter{\tikz@temp}}},
+ node style/.style={/tikz/data visualization/@node styling/.append={,#1}},
+ % General extends (both axes, grid and ticks)
+ low/.initial=0,
+ high/.initial=0,
+ padded/.style={low=padded min,high=padded max},
+ tick length/.style={low={-#1},high={#1}},
+ % General tick and grid keys:
+ common/.initial=,
+ major/.initial=,
+ minor/.initial=,
+ subminor/.initial=,
+ @setup at setters/.style={
+ common/.code=\tikz@lib@dv@add@{common}{##1},
+ major/.code=\tikz@lib@dv@add@{major}{##1},
+ minor/.code=\tikz@lib@dv@add@{minor}{##1},
+ subminor/.code=\tikz@lib@dv@add@{subminor}{##1}
+ },
+ @setup at setters,
+ % Tick keys
+ direction axis/.initial=,
+ % Tick text modifiers
+ tick text low even padding/.initial=0pt,
+ tick text high even padding/.initial=0pt,
+ tick text low odd padding/.initial=0pt,
+ tick text high odd padding/.initial=0pt,
+ tick text odd padding/.style={tick text low odd padding={-#1},tick text high odd padding={#1}},
+ tick text even padding/.style={tick text low even padding={-#1},tick text high even padding={#1}},
+ tick text padding/.style={tick text odd padding={#1},tick text even padding={#1}},
+ stack/.style={tick text even padding={#1}},
+ stack'/.style={tick text odd padding={#1}},
+ stack/.default=1em,
+ stack'/.default=1em,
+ tick text at low/.is if=tikz@dv@min@tick@node,
+ tick text at high/.is if=tikz@dv@max@tick@node,
+ no tick text/.style={tick text at low=false,tick text at high=false},
+ %
+ every major ticks/.style={style={line cap=round},tick length=2pt},
+ every minor ticks/.style={style={solid, help lines,thin,line cap=round},tick length=1.4pt},
+ every subminor ticks/.style={style={solid, help lines,line cap=round},tick length=0.8pt},
+ clean ticks/.style={node style={fill=white}},
+ % Default grid styles
+ every grid/.style={high=max,low=min},
+ every major grid/.style={style={solid, help lines,thin,black!25}},
+ every minor grid/.style={style={solid, help lines,black!25}},
+ every subminor grid/.style={style={solid, help lines,black!10}},
+ at default ticks/.code={%
+ \expandafter\pgfkeysalso\expandafter{\tikz@lib@dv@ticks@default@at}},
+ at ticks/.code={%
+ \expandafter\pgfkeysalso\expandafter{\tikz@lib@dv@ticks@default@at}%
+ \expandafter\pgfkeysalso\expandafter{\tikz@lib@dv@ticks@at}},
+}%
+
+\def\tikz@lib@dv@add@#1#2{\pgfkeysaddvalue{/tikz/data visualization/#1}{}{,#2}}%
+
+\def\tikz@dv@lib@parse@scaling#1 at#2and #3 at#4\pgf@stop{%
+ \pgfmathsetmacro{\tikz@dv@lib@min@at}{#2}
+ \pgfmathsetmacro{\tikz@dv@lib@max@at}{#4}
+ \edef\tikz@temp{#1 at \tikz@dv@lib@min@at and #3 at \tikz@dv@lib@max@at}%
+}%
+
+
+% Ticks at
+\tikzdatavisualizationset{
+ at/.code={\def\tikz@dv@at@list{#1}},
+ also at/.code={\expandafter\def\expandafter\tikz@dv@at@list\expandafter{\tikz@dv@at@list,#1}},
+ major at/.style={major={at={#1}}},
+ minor at/.style={minor={at={#1}}},
+ subminor at/.style={subminor={at={#1}}},
+ major also at/.style={major={also at={#1}}},
+ minor also at/.style={minor={also at={#1}}},
+ subminor also at/.style={subminor={also at={#1}}},
+ options at/.code={\expandafter\def\expandafter\tikz@dv@style@at@list\expandafter{\tikz@dv@style@at@list,{#1}}},
+ no tick text at/.style={options at={#1 as [no tick text]}}
+}%
+
+
+\def\tikz@lib@dv@do@axis#1{%
+ \def\tikz@marshal{#1=}
+ \expandafter\expandafter\expandafter\tikzdatavisualizationset%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@marshal\expandafter{\tikz@lib@dv@args}}
+}%
+
+\def\tikz@do@axis@options#1#2{
+ \pgfkeys{/tikz/data visualization/axis options/.cd,#2}
+ \def\tikz@dv@axis{#1}
+}%
+\let\tikz@dv@axis\pgfutil@empty
+
+\tikzdatavisualizationset{
+ every ticks/.style={
+ node style={%
+ font=\pgfutil@font@footnotesize,
+ inner sep=1pt,
+ outer sep=.1666em,
+ rounded corners=1.5pt
+ }
+ },
+ every data set label/.style={
+ every ticks,
+ node style={
+ font=\pgfutil@font@small,
+ }
+ },
+ @color of visualizer labels/.style={text=black},
+ every label in legend/.style={
+ node style={
+ fill=none,
+ }
+ },
+ every axis label/.style={
+ node style={%
+ font=\pgfutil@font@small,
+ }
+ }
+}%
+
+
+\tikzset{
+ /tikz/data visualization/axis options/.cd,
+ %
+ % Basic setters
+ %
+ attribute/.style={\tikz@dv@axis/attribute={#1}},
+ function/.style={\tikz@dv@axis/function={#1}},
+ scaling/.style={\tikz@dv@axis/scaling={#1}},
+ padding min/.style={\tikz@dv@axis/padding min={#1}},
+ padding max/.style={\tikz@dv@axis/padding max={#1}},
+ padding/.style={padding min={-#1},padding max={#1}},
+ label/.code={%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\tikz@lib@dv@auto@attribute%
+ \tikzdatavisualizationset{\tikz@dv@axis/label/.expanded=$\noexpand\mathit{\pgfkeysvalueof{\tikz@dv@axis/attribute}}$}%
+ \else
+ \tikzdatavisualizationset{\tikz@dv@axis/label={#1}}%
+ \fi
+ },
+ label/.default=\tikz@lib@dv@auto@attribute,
+ %
+ % Strategies
+ %
+ tick placement strategy/.style={\tikz@dv@axis/@compute at positions={#1}},
+ linear steps/.style={tick placement strategy=\tikz@lib@dv@compute@at@linear},
+ %
+ % Attribute setter
+ %
+ goto/.code={\tikz@dv@goto{\tikz@dv@axis}{#1}},
+ goto pos/.code={\tikz@dv@goto@pos{\tikz@dv@axis}{#1}},
+ anchor at min/.code={\tikz@lib@dv@special@at{\tikz@dv@axis}{\tikz@dv@min@anchor}},
+ anchor at max/.code={\tikz@lib@dv@special@at{\tikz@dv@axis}{\tikz@dv@max@anchor}},
+ %
+ % Visualization setters
+ %
+ visualize axis/.code=\expandafter\tikz@lib@dv@av\expandafter{\tikz@dv@axis}{#1},
+ %
+ % Ticks settings
+ %
+ ticks/.style={\tikz@dv@axis/ticks at/.append={,#1}},
+ ticks/.default=some,
+ visualize ticks/.code=\expandafter\tikz@lib@dv@tv\expandafter{\tikz@dv@axis}{#1},
+ %
+ % Grid settings
+ %
+ grid/.style={\tikz@dv@axis/grid at/.append={,#1}},
+ grid/.default=at default ticks,
+ visualize grid/.code=\expandafter\tikz@lib@dv@gv\expandafter{\tikz@dv@axis}{#1},
+ %
+ ticks and grid/.style={\tikz@dv@axis/ticks at/.append={,#1},\tikz@dv@axis/grid at/.append={,#1}},
+ %
+ % Visualizing axis labels
+ %
+ visualize label/.code=\expandafter\tikz@lib@dv@lv\expandafter{\tikz@dv@axis}{#1},
+}%
+
+\def\tikz@lib@dv@auto@attribute{\tikz@lib@dv@auto@attribute}%
+
+
+% Range options
+\tikzdatavisualizationset{
+ axis options/.cd,
+ %
+ % Including a value in the range
+ %
+ include value/.style={%
+ /tikz/data visualization/before survey/.expanded={%
+ \noexpand\pgfkeysgetvalue{\tikz@dv@axis/scaling mapper}\noexpand\tikz@dv@axis@mapper%
+ \noexpand\foreach \noexpand\tikz@lib@dv@temp in {#1} {%
+ \noexpand\tikz@dv@axis@mapper.include in value(\noexpand\tikz@lib@dv@temp)%
+ }%
+ }%
+ },
+ %
+ % Directly setting the min or max
+ %
+ min value/.style={
+ /tikz/data visualization/at end survey/.expanded={%
+ \noexpand\pgfkeysgetvalue{\tikz@dv@axis/scaling mapper}\noexpand\tikz@dv@axis@mapper%
+ \noexpand\tikz@lib@dv@set\noexpand\tikz@dv@axis@mapper{#1}{min}%
+ }
+ },
+ max value/.style={
+ /tikz/data visualization/at end survey/.expanded={%
+ \noexpand\pgfkeysgetvalue{\tikz@dv@axis/scaling mapper}\noexpand\tikz@dv@axis@mapper%
+ \noexpand\tikz@lib@dv@set\noexpand\tikz@dv@axis@mapper{#1}{max}%
+ }
+ },
+}%
+
+\def\tikz@lib@dv@set#1#2#3{%
+ \pgfdvmathenter{\pgf@dv@value}{#2}%
+ #1.get in range interval()%
+ \pgfdvinrangeinterval.let #3(\pgf@dv@value)%
+}%
+
+% Layer options
+\tikzdatavisualizationset{
+ axis layer/.style=on background layer,
+ ticks layer/.style=on background layer,
+ ticks node layer/.style=,
+ grid layer/.style=on background layer,
+}%
+
+
+% Axis visualization
+%
+% #1 = name of the to-be-visualized axis name
+% #2 = options for the visualization
+
+\def\tikz@lib@dv@av#1#2{
+ \tikzdatavisualizationset{
+ axes actions/.append={\tikz@lib@dv@show@axis{#1}{#2}}
+ }
+}%
+
+\def\tikz@lib@dv@show@axis#1#2{%
+ \scope[data visualization/axis layer,/tikz/data visualization/.cd,low=min,high=max,every axis/.try,#2]
+ \pgfkeysgetvalue{#1/scaling mapper}\tikz@dv@axis@mapper%
+ % Ok, calculate direction vector:
+ \tikzpointandanchordirection{\tikz@dv@axis@mapper.set in to(min)}{\tikz@dv@axis@mapper.set in to(max)}
+ \xdef\tikz@dv@axis@dir{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ \path[draw,/tikz/data visualization/styling]
+ \pgfextra{
+ {
+ \tikz@dv@goto{#1}{\pgfkeysvalueof{/tikz/data visualization/low}}%
+ \pgfpathdvmoveto%
+ }
+ {
+ \tikz@dv@goto{#1}{\pgfkeysvalueof{/tikz/data visualization/high}}%
+ \pgfpathdvlineto%
+ }
+ };
+ \endscope
+}%
+
+\def\tikz@dv@goto#1#2{%
+ \edef\pgf@@temp{#2}%
+ \ifx\pgf@@temp\tikz@lib@dv@padded@min@text%
+ \pgfkeysvalueof{#1/scaling mapper}.set in to(min)%
+ \pgfkeysvalueof{#1/scaling mapper}.get out()%
+ \pgfkeysgetvalue{#1/padding min}\pgf@temp%
+ \pgfmathparse{\pgf@temp}%
+ \pgfkeyslet{/data point/\pgfdvout/offset}\pgfmathresult%
+ \else%
+ \ifx\pgf@@temp\tikz@lib@dv@padded@max@text%
+ \pgfkeysvalueof{#1/scaling mapper}.set in to(max)%
+ \pgfkeysvalueof{#1/scaling mapper}.get out()%
+ \pgfkeysgetvalue{#1/padding max}\pgf@temp%
+ \pgfmathparse{\pgf@temp}%
+ \pgfkeyslet{/data point/\pgfdvout/offset}\pgfmathresult%
+ \else%
+ \pgfkeysvalueof{#1/scaling mapper}.set in to(#2)%
+ \fi%
+ \fi%
+}%
+
+\def\tikz@dv@goto@pos#1#2{%
+ \pgfkeyssetvalue{/data point/\pgfkeysvalueof{#1/attribute}/out pos}{#2}%
+}%
+
+\def\tikz@lib@dv@padded@min@text{padded min}%
+\def\tikz@lib@dv@padded@max@text{padded max}%
+
+\def\tikz@lib@dv@special@at#1#2{%
+ % Ok, calculate direction vector:
+ \tikzpointandanchordirection{\pgfkeysvalueof{#1/scaling mapper}.set in to(min)}{\pgfkeysvalueof{#1/scaling mapper}.set in to(max)}
+ \tikzset{anchor/.expanded=#2}
+}%
+
+
+% Ticks visualization
+%
+% #1 = name of axis on which ticks should be shown
+% #2 = options for the visualization
+
+\def\tikz@lib@dv@tv#1#2{
+ \tikzdatavisualizationset{
+ ticks actions/.append={\tikz@lib@dv@default@action{ticks}{#1}{#2}},
+ major ticks actions/.append={\tikz@lib@dv@show@ticks{major}{#1}{#2}},
+ minor ticks actions/.append={\tikz@lib@dv@show@ticks{minor}{#1}{#2}},
+ subminor ticks actions/.append={\tikz@lib@dv@show@ticks{subminor}{#1}{#2}}
+ }
+}%
+
+\def\tikz@lib@dv@default@action#1#2#3{%
+ \let\tikz@marshal\pgfutil@empty%
+ {%
+ \let\tikz@lib@dv@ticks@at\pgfutil@empty%
+ \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@ticks@default@at%
+ \pgfkeysgetvalue{#2/#1 at}\tikz@lib@dv@settings%
+ \pgfkeysgetvalue{#2/scaling mapper}\tikz@lib@dv@mapper
+ % Normal minor etc. have no effect.
+ \tikzdatavisualizationset{major/.code=,minor/.code=,subminor/.code=,common/.code=}
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@settings}%
+ \tikzdatavisualizationset{@setup at setters}%
+ \pgfkeysgetvalue{/tikz/data visualization/compute step}\tikz@temp@step%
+ \ifx\tikz@temp@step\pgfutil@empty%
+ % do nothing
+ \else%
+ \pgfkeysvalueof{#2/@compute at positions}%
+ \xdef\tikz@marshal{
+ major={\pgfkeysvalueof{/tikz/data visualization/major}},
+ minor={\pgfkeysvalueof{/tikz/data visualization/minor}},
+ subminor={\pgfkeysvalueof{/tikz/data visualization/subminor}}}
+ \fi
+ }%
+ \pgfkeyslet{#2/default #1 at}\tikz@marshal
+}%
+
+\def\tikz@lib@dv@show@ticks#1#2#3{%
+ % First, check whether there is anything to do at all:
+ \pgfkeysgetvalue{#2/default ticks at}\tikz@lib@dv@default@settings%
+ \ifx\tikz@lib@dv@default@settings\pgfutil@empty%
+ \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@settings%
+ \else%
+ \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@settings%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@dv@settings%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@dv@default@settings\expandafter,\tikz@lib@dv@settings}
+ \fi%
+ \ifx\tikz@lib@dv@settings\pgfutil@empty%
+ % Great, nothing to do
+ \else
+ {%
+ \let\tikz@dv@at@list\pgfutil@empty%
+ \let\tikz@dv@style@at@list\pgfutil@empty%
+ \pgfkeysgetvalue{#2/scaling mapper}\tikz@lib@dv@mapper
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@settings}%
+ \scope[/tikz/data visualization/.cd,every ticks/.try,every #1 ticks/.try,#3]%
+ % Setup options
+ \pgfkeysgetvalue{/tikz/data visualization/common}\tikz@temp
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp}
+ \pgfkeysgetvalue{/tikz/data visualization/#1}\tikz@temp
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp}
+ \pgfkeysgetvalue{/tikz/data visualization/\pgfkeysvalueof{/tikz/data visualization/direction axis}/scaling mapper}\pgf@dv@tick@dir@mapper
+ % Ok, now it's time to draw the ticks!
+ \foreach \tikz@dv@tick@pos[count=\tikz@dv@tick@count] in \tikz@dv@at@list
+ {
+ \ifx\tikz@dv@tick@pos\pgfutil@empty
+ \c@pgf@counta=\tikz@dv@tick@count\relax%
+ \advance\c@pgf@counta by-1\relax%
+ \edef\tikz@dv@tick@count{\the\c@pgf@counta}%
+ \else
+ \expandafter\tikz@lib@dv@parse\tikz@dv@tick@pos\pgf@stop%
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@tick@opt}%
+ \tikz@lib@dv@mapper.set in to(\tikz@dv@tick@pos)%
+ % First, compute position of tick:
+ \pgf@process{\pgfpointdvlocaldatapoint}
+ \xdef\pgf@dv@tick@origin{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ % Ok, calculate direction vector:
+ \tikzpointandanchordirection{\pgf@dv@tick@dir@mapper.set in to(min)}{\pgf@dv@tick@dir@mapper.set in to(max)}
+ \xdef\pgf@dv@tick@dir{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ % Now, show something:
+ \tikz@lib@handle@at@style%
+ \pgfkeysgetvalue{/tikz/data visualization/high}\tikz@dv@max@val%
+ \pgfkeysgetvalue{/tikz/data visualization/low}\tikz@dv@min@val%
+ \iftikz@dv@max@tick@node\pgfmathsetmacro\tikz@dv@max@val{%
+ \tikz@dv@max@val+(\pgfkeysvalueof{%
+ /tikz/data visualization/tick text high
+ \ifodd\tikz@dv@tick@count odd \else even \fi padding}%
+ )}%
+ \fi%
+ \iftikz@dv@min@tick@node\pgfmathsetmacro\tikz@dv@min@val{%
+ \tikz@dv@min@val+(\pgfkeysvalueof{%
+ /tikz/data visualization/tick text low
+ \ifodd\tikz@dv@tick@count odd \else even \fi padding}%
+ )}%
+ \fi%
+ \pgf@process{\pgfpointadd{\pgf@dv@tick@origin}{\pgfpointscale{\tikz@dv@max@val}{\pgf@dv@tick@dir}}}
+ \xdef\tikz@dv@max@tick{\the\pgf@x,\the\pgf@y}
+ \pgf@process{\pgfpointadd{\pgf@dv@tick@origin}{\pgfpointscale{\tikz@dv@min@val}{\pgf@dv@tick@dir}}}
+ \xdef\tikz@dv@min@tick{\the\pgf@x,\the\pgf@y}
+ \scope[data visualization/ticks layer]
+ \tikzdatavisualizationset{every \ifodd\tikz@dv@tick@count odd \else even \fi tick/.try}
+ \draw [/tikz/data visualization/styling] (\tikz@dv@min@tick) -- (\tikz@dv@max@tick);
+ \endscope
+ \iftikz@dv@min@tick@node
+ \scope[data visualization/ticks node layer]
+ \tikzdatavisualizationset{every \ifodd\tikz@dv@tick@count odd \else even \fi tick/.try}
+ \path [/tikz/data visualization/styling] (\tikz@dv@min@tick) \tikz@dv@handle@tick{\tikz@dv@min@anchor};
+ \endscope
+ \fi
+ \iftikz@dv@max@tick@node
+ \scope[data visualization/ticks node layer]
+ \tikzdatavisualizationset{every \ifodd\tikz@dv@tick@count odd \else even \fi tick/.try}
+ \path [/tikz/data visualization/styling] (\tikz@dv@max@tick) \tikz@dv@handle@tick{\tikz@dv@max@anchor};
+ \endscope
+ \fi
+ \fi
+ }
+ \endscope
+ }
+ \fi
+}%
+
+\def\tikz@lib@dv@parse#1\pgf@stop{%
+ \pgfutil@in@{as}{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@dv@parse@as#1\pgf@stop%
+ \else%
+ \tikz@lib@dv@parse@as#1as\tikz@lib@dv@typeset\pgf@stop%
+ \fi%
+}%
+\def\tikz@lib@dv@parse@as#1as{%
+ \def\tikz@dv@tick@pos{#1}%
+ \pgfutil@ifnextchar[{\tikz@lib@dv@parse@as@opt}{\tikz@lib@dv@parse@as@opt[]}%]
+}%
+\def\tikz@lib@dv@parse@as@opt[#1]{%
+ \def\tikz@lib@dv@tick@opt{#1}%
+ \pgfutil@ifnextchar\pgf@stop{\tikz@lib@dv@parse@as@text\tikz@lib@dv@typeset}{\tikz@lib@dv@parse@as@text}
+}%
+\def\tikz@lib@dv@parse@as@text#1\pgf@stop{%
+ \def\tikz@lib@dv@tick@text{#1}%
+}%
+
+\def\tikz@lib@dv@typeset{%
+ \pgfdvmathenter{\tikz@lib@dv@typesetnum}{\tikz@dv@tick@pos}%
+ \pgfdvmathexitbyscientificformat{\tikz@lib@dv@typesetnum}{\tikz@lib@dv@typesetnum}% hmm... not sure about this...
+ \pgfkeysvalueof{/tikz/data visualization/tick prefix}%
+ \pgfkeys{/tikz/data visualization/tick typesetter=\tikz@lib@dv@typesetnum}%
+ \pgfkeysvalueof{/tikz/data visualization/tick suffix}%
+}%
+
+\newif\iftikz@dv@min@tick@node
+\newif\iftikz@dv@max@tick@node
+
+\def\tikz@dv@handle@tick#1{%
+ \pgfextra{
+ \ifx\tikz@lib@dv@tick@text\pgfutil@empty%
+ \global\let\tikz@dv@tick@marshal=\pgfutil@empty% Skip!
+ \else
+ \def\tikz@dv@tick@marshal{node[anchor=#1,/tikz/data visualization/node styling]}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\tikz@dv@tick@marshal\expandafter{\expandafter{\tikz@lib@dv@tick@text}}
+ \fi
+ \expandafter}%
+ \tikz@dv@tick@marshal
+}%
+
+
+\def\tikz@lib@handle@at@style{%
+ \ifx\tikz@dv@style@at@list\pgfutil@empty% nothing to do
+ \else%
+ \let\tikz@dv@lib@this@at@style=\pgfutil@empty%
+ \pgfdvmathenter{\tikz@temp}{\tikz@dv@tick@pos}%
+ \pgfdvmathexitbyscientificformat{\tikz@dv@compare@to}{\tikz@temp}%
+ \foreach \tikz@dv@at@style in \tikz@dv@style@at@list {%
+ \ifx\tikz@dv@at@style\pgfutil@empty%
+ \else%
+ \expandafter\tikz@dv@lib@handle@one@at@style\tikz@dv@at@style\tikz@stop%
+ \fi%
+ }
+ \ifx\tikz@dv@lib@this@at@style\pgfutil@empty%
+ \else%
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@dv@lib@this@at@style}%
+ \fi%
+ \fi%
+}%
+
+\def\tikz@dv@lib@handle@one@at@style#1as#2[#3]#4\tikz@stop{%
+ \pgfdvmathenter{\tikz@lib@dv@at@math@var}{#1}%
+ \pgfdvmathexitbyscientificformat{\tikz@dv@temp}{\tikz@lib@dv@at@math@var}%
+ \ifx\tikz@dv@temp\tikz@dv@compare@to%
+ % Bingo!
+ \expandafter\gdef\expandafter\tikz@dv@lib@this@at@style\expandafter{\tikz@dv@lib@this@at@style,#3}%
+ \fi%
+}%
+
+
+% Help function
+\def\tikzpointandanchordirection#1#2{%
+ % This function works like pgfpointdvdirection, but also computes
+ % appropriate "min" and "max" anchors.
+ \pgf@process{\pgfpointdvdirection{#1}{#2}}
+ {
+ \pgf@ya=\pgf@y
+ \pgf@y=-\pgf@x
+ \pgf@x=\pgf@ya
+ \tikz@auto@anchor
+ \xdef\tikz@dv@max@anchor{\tikz@anchor}
+ \tikz@auto@anchor@prime
+ \xdef\tikz@dv@min@anchor{\tikz@anchor}
+ }
+}%
+
+
+
+
+% Grid visualization
+%
+% #1 = name of axis on which grid lines should be shown
+% #2 = options for the visualization
+
+\def\tikz@lib@dv@gv#1#2{
+ \tikzdatavisualizationset{
+ grid actions/.append={\tikz@lib@dv@default@action{grid}{#1}{#2}},
+ major grid actions/.append={\tikz@lib@dv@show@grid{major}{#1}{#2}},
+ minor grid actions/.append={\tikz@lib@dv@show@grid{minor}{#1}{#2}},
+ subminor grid actions/.append={\tikz@lib@dv@show@grid{subminor}{#1}{#2}},
+ }
+}%
+
+\def\tikz@lib@dv@show@grid#1#2#3{%
+ % First, check whether there is anything to do at all:
+ \pgfkeysgetvalue{#2/default grid at}\tikz@lib@dv@default@settings%
+ \ifx\tikz@lib@dv@default@settings\pgfutil@empty%
+ \pgfkeysgetvalue{#2/grid at}\tikz@lib@dv@settings%
+ \else%
+ \pgfkeysgetvalue{#2/grid at}\tikz@lib@dv@settings%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@dv@settings%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@dv@default@settings\expandafter,\tikz@lib@dv@settings}
+ \fi%
+ \ifx\tikz@lib@dv@settings\pgfutil@empty%
+ % Great, nothing to do
+ \else
+ {%
+ \let\tikz@dv@at@list\pgfutil@empty
+ \let\tikz@dv@style@at@list\pgfutil@empty
+ \pgfkeysgetvalue{#2/scaling mapper}\tikz@lib@dv@mapper
+ \let\tikz@lib@dv@ticks@default@at\pgfutil@empty%
+ \scope[data visualization/grid layer,/tikz/data visualization/.cd,every grid,every #1 grid/.try,#3]
+ % Setup options
+ \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@ticks@at%
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@settings}%
+ \pgfkeysgetvalue{/tikz/data visualization/common}\tikz@temp
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp}
+ \pgfkeysgetvalue{/tikz/data visualization/#1}\tikz@temp
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp}
+ \edef\tikz@lib@dv@dir@axis{/tikz/data visualization/\pgfkeysvalueof{/tikz/data visualization/direction axis}}%
+ % Ok, now it's time to draw the grid!
+ \foreach \tikz@dv@grid@pos in \tikz@dv@at@list
+ {
+ \ifx\tikz@dv@grid@pos\pgfutil@empty
+ \else
+ \expandafter\tikz@lib@dv@parse\tikz@dv@grid@pos\pgf@stop%
+ \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@tick@opt}%
+ \tikz@lib@dv@mapper.set in to(\tikz@dv@tick@pos)%
+ \draw[/tikz/data visualization/styling]
+ \pgfextra{
+ % First, compute start of grid:
+ \tikz@dv@goto{\tikz@lib@dv@dir@axis}{\pgfkeysvalueof{/tikz/data visualization/low}}%
+ \pgfpathdvmoveto%
+ \tikz@dv@goto{\tikz@lib@dv@dir@axis}{\pgfkeysvalueof{/tikz/data visualization/high}}%
+ \pgfpathdvlineto%
+ };
+ \fi
+ }
+ \endscope
+ }
+ \fi
+}%
+
+
+
+
+
+
+
+
+
+%
+% Label visualization
+%
+
+\def\tikz@lib@dv@lv#1#2{
+ \tikzdatavisualizationset{
+ label actions/.append={\tikz@lib@dv@show@label{#1}{#2}}
+ }
+}%
+
+\def\tikz@lib@dv@show@label#1#2{%
+ % First, check whether there is anything to do at all:
+ \pgfkeysgetvalue{#1/label}\tikz@dv@lib@label%
+ \ifx\tikz@dv@lib@label\pgfutil@empty%
+ % Great, nothing to do
+ \else
+ \scope[anchor=center,/tikz/data visualization/.cd,every axis label/.try,#2]
+ \expandafter\tikz@lib@dv@parse@node\tikz@dv@lib@label\pgf@stop
+ \endscope
+ \fi
+}%
+
+\def\tikz@lib@dv@parse@node{\pgfutil@ifnextchar[\tikz@lib@dv@parse@node@opt{\tikz@lib@dv@parse@node@opt[]}}%}%
+\def\tikz@lib@dv@parse@node@opt[#1]#2\pgf@stop{
+ \tikzdatavisualizationset{#1}
+ \pgftransformshift{\pgfpointdvlocaldatapoint}%
+ \node [/tikz/data visualization/node styling] {#2};
+}%
+
+
+
+%
+% Tick placement strategies
+%
+
+\tikzdatavisualizationset{
+ compute step/.initial=,
+ step/.style={compute step=\def\tikz@lib@dv@step{#1}},
+ minor steps between steps/.initial=,
+ minor steps between steps/.default=9,
+ phase/.initial=0,
+ tick typesetter/.code=\pgfmathprintnumber{#1},
+ tick prefix/.initial=,
+ tick suffix/.initial=,
+ tick unit/.style={tick suffix={$\,\pgfutil@font@normalfont#1$}},% this is an alias
+}%
+
+\def\tikz@lib@dv@compute@at@linear{%
+ % Setup about:
+ \let\tikz@lib@dv@compute@about=\tikz@lib@dv@about@linear%
+ \let\tikz@lib@dv@step\relax%
+ \pgfkeysvalueof{/tikz/data visualization/compute step}
+ \ifx\tikz@lib@dv@step\relax%
+ \else%
+ % Gather interesting values
+ \tikz@lib@dv@mapper.get in range interval()%
+ \pgfdvinrangeinterval.get min and max()%
+ \pgfkeysgetvalue{/tikz/data visualization/phase}\tikz@temp
+ \pgfdvmathenter{\tikz@dv@lib@phase}{\tikz@temp}
+ \pgfdvmathenter{\tikz@dv@lib@step}{\tikz@lib@dv@step}
+ \pgfdvmathifless{\pgfdvmathalwayszero}{\tikz@dv@lib@step}{%
+ % Compute start:
+ \pgfdvmathsub{\tikz@dv@lib@temp}{\pgfdvmin}{\tikz@dv@lib@phase}% temp = dvmin - phase
+ \pgfdvmathdiv{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% temp = temp/step
+ \pgfdvmathfloor{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}% temp = floor(temp)
+ \pgfdvmathmul{\tikz@lib@dv@current}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% current = temp*step ...
+ \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@phase}% + phase
+ \let\tikz@lib@dv@ats\pgfutil@empty%
+ \let\tikz@lib@dv@minor@ats\pgfutil@empty%
+ \tikz@lib@dv@mapper.get function(\tikz@temp)%
+ \ifx\tikz@temp\pgfutil@empty%
+ \pgfdvmathenter{\tikz@one@hundreth}{0.001}%
+ \pgfdvmathsub{\tikz@lib@temp}{\pgfdvmax}{\pgfdvmin}%
+ \pgfdvmathmul{\tikz@lib@dv@epsilon}{\tikz@lib@temp}{\tikz@one@hundreth}% epsilon = (max - min)/1000
+ \else
+ \let\tikz@lib@dv@epsilon\pgfdvmathalwayszero
+ \fi
+ \pgfdvmathsub{\tikz@lib@dv@min@minus@epsilon}{\pgfdvmin}{\tikz@lib@dv@epsilon}%
+ \pgfdvmathadd{\tikz@lib@dv@max@plus@epsilon}{\pgfdvmax}{\tikz@lib@dv@epsilon}%
+ \pgfkeysgetvalue{/tikz/data visualization/minor steps between steps}\tikz@lib@dv@substeps%
+ \ifx\tikz@lib@dv@substeps\pgfutil@empty
+ \else
+ \pgfmathsetmacro\tikz@temp{\tikz@lib@dv@substeps+1}%
+ \pgfdvmathenter{\tikz@dv@lib@substeps}{\tikz@temp}%
+ \pgfdvmathdiv{\tikz@lib@dv@substep}{\tikz@dv@lib@step}{\tikz@dv@lib@substeps}%
+ \fi
+ \loop%
+ \ifx\tikz@lib@dv@substeps\pgfutil@empty%
+ \else%
+ \let\tikz@lib@dv@subcurrent=\tikz@lib@dv@current%
+ \pgfmathsetcount{\c@pgf@counta}{\tikz@lib@dv@substeps}%
+ \let\tikz@lib@dv@next=\tikz@lib@dv@subloop%
+ \tikz@lib@dv@subloop
+ \fi%
+ \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@min@minus@epsilon}{}{%
+ \pgfdvmathexitbyserializing{\tikz@temp}{\tikz@lib@dv@current}%
+ \edef\tikz@lib@dv@ats{\tikz@lib@dv@ats,\tikz@temp}%
+ }
+ \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@step}%
+ \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@max@plus@epsilon}{\tikz@lib@dv@continuetrue}{\tikz@lib@dv@continuefalse}%
+ \iftikz@lib@dv@continue%
+ \repeat%
+ \tikzdatavisualizationset{major/.expanded={at={\tikz@lib@dv@ats}},minor/.expanded={at={\tikz@lib@dv@minor@ats}}}%
+ }{%
+ \pgfdvmathexitbyserializing{\tikz@temp}{\pgfdvmin}%
+ \tikzdatavisualizationset{major/.expanded={at={\tikz@temp}}}%
+ }%
+ \fi%
+}%
+\newif\iftikz@lib@dv@continue
+
+\def\tikz@lib@dv@subloop{
+ \pgfdvmathadd{\tikz@lib@dv@subcurrent}{\tikz@lib@dv@subcurrent}{\tikz@lib@dv@substep}%
+ \pgfdvmathifless{\tikz@lib@dv@subcurrent}{\pgfdvmin}{}{%
+ \pgfdvmathifless{\tikz@lib@dv@subcurrent}{\pgfdvmax}{%
+ \pgfdvmathexitbyserializing{\tikz@temp}{\tikz@lib@dv@subcurrent}%
+ \edef\tikz@lib@dv@minor@ats{\tikz@lib@dv@minor@ats,\tikz@temp}
+ }{}}
+ \advance\c@pgf@counta by-1\relax%
+ \ifnum\c@pgf@counta=0\relax%
+ \let\tikz@lib@dv@next=\relax
+ \fi
+ \tikz@lib@dv@next
+}%
+
+
+
+%
+% Ticks about settings
+%
+
+\tikzdatavisualizationset{
+ about/.style={compute step=\tikz@lib@dv@compute@about{#1}},
+ about strategy/.initial=,
+ standard about strategy/.style={about strategy={1.5/1.0,2.3/2.0,4/2.5,7/5,11/10}},
+ standard about strategy,
+ euro about strategy/.style={about strategy={1.5/1.0,3/2.0,7/5,11/10}},
+ decimal about strategy/.style={about strategy={3/1.0,11/10}},
+ half about strategy/.style={about strategy={2/1.0,7/5,11/10}},
+ quarter about strategy/.style={about strategy={1.8/1.0,4/2.5,7/5,11/10}},
+ int about strategy/.style={about strategy={1.5/1.0,2.5/2.0,3.5/3.0,4.5/4.0,7/5,11/10}},
+ none/.style={compute step=},
+ few/.style={about=3},
+ some/.style={about=5},
+ many/.style={about=10},
+}%
+
+\def\tikz@lib@dv@about@linear#1{%
+ \tikz@lib@dv@mapper.get in range interval()%
+ \pgfdvinrangeinterval.get min and max()%
+ \pgfdvmathsub{\tikz@lib@dv@diff}{\pgfdvmax}{\pgfdvmin}
+ \pgfdvmathenter{\tikz@lib@dv@about@val}{#1}%
+ \pgfdvmathdiv{\tikz@lib@dv@around}{\tikz@lib@dv@diff}{\tikz@lib@dv@about@val}%
+ % Make mantisse sensible
+ \pgfmathfloattomacro{\tikz@lib@dv@around}{\tikz@lib@dv@flags}{\tikz@lib@dv@mant}{\tikz@lib@dv@exp}%
+ \pgf@xc=\tikz@lib@dv@mant pt %
+ \pgfkeysgetvalue{/tikz/data visualization/about strategy}\tikz@lib@dv@strat
+ \foreach \tikz@lib@dv@threshold/\tikz@lib@replace in \tikz@lib@dv@strat
+ {
+ \ifdim\pgf@xc<\tikz@lib@dv@threshold pt%
+ \global\pgf@xc=\tikz@lib@replace pt%
+ \breakforeach
+ \fi
+ }%
+ \ifdim\pgf@xc<10pt%
+ \pgfmathfloatcreate{\tikz@lib@dv@flags}{\pgf@sys@tonumber{\pgf@xc}}{\tikz@lib@dv@exp}%
+ \else
+ \begingroup
+ \c@pgf@countd=\tikz@lib@dv@exp
+ \advance\c@pgf@countd by1
+ \edef\tikz@lib@dv@exp{\the\c@pgf@countd}%
+ \pgfmath@smuggleone\tikz@lib@dv@exp
+ \endgroup
+ \divide\pgf@xc by 10\relax
+ \pgfmathfloatcreate{\tikz@lib@dv@flags}{\pgf@sys@tonumber{\pgf@xc}}{\tikz@lib@dv@exp}%
+ \fi
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \let\tikz@lib@dv@step=\pgfmathresult
+}%
+
+
+
+
+
+%
+% Logarithmic axes
+%
+
+\tikzset{
+ /tikz/data visualization/axis options/.cd,
+ exponential steps/.style={tick placement strategy=\tikz@lib@dv@compute@at@log},
+ %
+ % Basic setters
+ %
+ logarithmic/.style={
+ \tikz@dv@axis/function=\pgfdvmathln{\pgfvalue}{\pgfvalue},
+ \tikz@dv@axis/scaling/default=1 at 0 and 10 at 1,
+ exponential steps
+ }
+}%
+
+\def\tikz@lib@dv@compute@at@log{%
+ % Setup about:
+ \let\tikz@lib@dv@compute@about=\tikz@lib@dv@about@log%
+ \let\tikz@lib@dv@step\relax%
+ \pgfkeysvalueof{/tikz/data visualization/compute step}
+ \ifx\tikz@lib@dv@step\relax%
+ \else%
+ % Gather interesting values
+ \tikz@lib@dv@mapper.get in range interval()%
+ \pgfdvinrangeinterval.get min and max()%
+ \pgfdvmathlog{\pgfdvminlog}{\pgfdvmin}%
+ \pgfdvmathlog{\pgfdvmaxlog}{\pgfdvmax}%
+ \pgfkeysgetvalue{/tikz/data visualization/phase}\tikz@temp
+ \pgfdvmathenter{\tikz@dv@lib@phase}{\tikz@temp}
+ \pgfdvmathenter{\tikz@dv@lib@step}{\tikz@lib@dv@step}
+ % Compute start:
+ \pgfdvmathsub{\tikz@dv@lib@temp}{\pgfdvminlog}{\tikz@dv@lib@phase}% temp = dvmin - phase
+ \pgfdvmathdiv{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% temp = temp/step
+ \pgfdvmathfloor{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}% temp = floor(temp)
+ \pgfdvmathmul{\tikz@lib@dv@current}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% current = temp*step ...
+ \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@phase}% + phase
+ \let\tikz@lib@dv@ats\pgfutil@empty%
+ \let\tikz@lib@dv@minor@ats\pgfutil@empty%
+ \pgfdvmathenter{\tikz@one@hundreth}{0.001}%
+ \pgfdvmathsub{\tikz@lib@temp}{\pgfdvmaxlog}{\pgfdvminlog}%
+ \pgfdvmathmul{\tikz@lib@dv@epsilon}{\tikz@lib@temp}{\tikz@one@hundreth}% epsilon = (max - min)/100
+ \pgfdvmathsub{\tikz@lib@dv@min@minus@epsilon}{\pgfdvminlog}{\tikz@lib@dv@epsilon}%
+ \pgfdvmathadd{\tikz@lib@dv@max@plus@epsilon}{\pgfdvmaxlog}{\tikz@lib@dv@epsilon}%
+ \pgfkeysgetvalue{/tikz/data visualization/minor steps between steps}\tikz@lib@dv@substeps%
+ \ifx\tikz@lib@dv@substeps\pgfutil@empty
+ \else
+ \pgfmathsetmacro\tikz@temp{\tikz@lib@dv@substeps+1}%
+ \pgfdvmathenter{\tikz@dv@lib@substeps}{\tikz@temp}%
+ \fi
+ \loop%
+ \ifx\tikz@lib@dv@substeps\pgfutil@empty%
+ \else%
+ \let\tikz@lib@dv@subcurrent=\tikz@lib@dv@current%
+ \pgfdvmathadd{\tikz@lib@dv@subcurrent@next}{\tikz@lib@dv@subcurrent}{\tikz@dv@lib@step}%
+ \pgfdvmathpowten{\tikz@lib@dv@subcurrent}{\tikz@lib@dv@subcurrent}%
+ \pgfdvmathpowten{\tikz@lib@dv@subcurrent@max}{\tikz@lib@dv@subcurrent@next}%
+ \pgfdvmathsub{\tikz@lib@dv@subcurrent@diff}{\tikz@lib@dv@subcurrent@max}{\tikz@lib@dv@subcurrent}%
+ \pgfdvmathdiv{\tikz@lib@dv@substep}{\tikz@lib@dv@subcurrent@diff}{\tikz@dv@lib@substeps}%
+ \pgfmathsetcount{\c@pgf@counta}{\tikz@lib@dv@substeps}%
+ \let\tikz@lib@dv@next=\tikz@lib@dv@subloop%
+ \tikz@lib@dv@subloop
+ \fi%
+ \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@min@minus@epsilon}{}{%
+ \pgfdvmathpowten{\tikz@lib@dv@current@pow}{\tikz@lib@dv@current}%
+ \pgfdvmathexitbyserializing{\tikz@temp}{\tikz@lib@dv@current@pow}%
+ \edef\tikz@lib@dv@ats{\tikz@lib@dv@ats,\tikz@temp}%
+ }
+ \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@step}%
+ \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@max@plus@epsilon}{\tikz@lib@dv@continuetrue}{\tikz@lib@dv@continuefalse}%
+ \iftikz@lib@dv@continue%
+ \repeat%
+ \tikzdatavisualizationset{major/.expanded={at={\tikz@lib@dv@ats}},minor/.expanded={at={\tikz@lib@dv@minor@ats}}}%
+ \fi%
+}%
+\newif\iftikz@lib@dv@continue
+
+
+\def\tikz@lib@dv@about@log#1{%
+ \tikz@lib@dv@mapper.get in range interval()%
+ \pgfdvinrangeinterval.get min and max()%
+ \pgfdvmathlog{\pgfdvmin}{\pgfdvmin}%
+ \pgfdvmathlog{\pgfdvmax}{\pgfdvmax}%
+ \pgfdvmathsub{\tikz@lib@dv@diff}{\pgfdvmax}{\pgfdvmin}
+ \pgfdvmathenter{\tikz@lib@dv@about@val}{#1}%
+ \pgfdvmathdiv{\tikz@lib@dv@around}{\tikz@lib@dv@diff}{\tikz@lib@dv@about@val}%
+ % Make mantisse sensible
+ \pgfmathfloattomacro{\tikz@lib@dv@around}{\tikz@lib@dv@flags}{\tikz@lib@dv@mant}{\tikz@lib@dv@exp}
+ \ifdim\tikz@lib@dv@exp pt<0pt%
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \else
+ \pgf@xc=\tikz@lib@dv@mant pt\relax%
+ \ifdim\pgf@xc<2.5pt
+ \pgfmathfloatcreate{1}{1.0}{\tikz@lib@dv@exp}
+ \else\ifdim\pgf@xc<5.1pt
+ \pgfmathfloatcreate{1}{3.0}{\tikz@lib@dv@exp}
+ \else
+ \pgfmathfloatcreate{1}{6.0}{\tikz@lib@dv@exp}
+ \fi\fi
+ \fi%
+ \pgfmathfloattofixed{\pgfmathresult}
+ \let\tikz@lib@dv@step=\pgfmathresult
+}%
+
+
+
+
+
+
+
+%
+% Cartesian axes
+%
+
+\tikzdatavisualizationset{%
+ new Cartesian axis/.style={
+ new axis base={#1},
+ new object={
+ class=linear transformer,
+ store=/tikz/data visualization/#1/linear transformer,
+ arg1/.expanded=\pgfkeysvalueof{/tikz/data visualization/#1/attribute}/scaled,
+ arg2 from key=/tikz/data visualization/#1/unit vector,
+ },
+ #1/scaling/default/.initial=0 at 0 and 1 at 1cm,
+ #1/unit vector/.initial=\pgfqpoint{1pt}{0pt},
+ }
+}%
+
+\tikzset{
+ /tikz/data visualization/axis options/.cd,
+ unit vector/.code=\tikz@scan@one@point\tikz@lib@dv@uv#1,
+ length/.style={\tikz@dv@axis/scaling=min at 0 and max at #1},
+ unit length/.code={\tikz@dv@parse@unit@length{#1}},
+ power unit length/.style={\tikz@dv@axis/scaling=1 at 0 and 10 at #1}
+}%
+
+\def\tikz@lib@dv@uv#1{%
+ \pgfkeyssetvalue{\tikz@dv@axis/unit vector}{#1}
+}%
+
+\def\tikz@dv@parse@unit@length#1{
+ \pgfutil@in@{per}{#1}
+ \ifpgfutil@in@%
+ \tikz@dv@parse@unit@length@#1\pgf@stop%
+ \else%
+ \tikz@dv@parse@unit@length@#1per1units\pgf@stop%
+ \fi%
+}%
+\def\tikz@dv@parse@unit@length@#1per#2units\pgf@stop{
+ \pgfkeysalso{\tikz@dv@axis/scaling=0 at 0 and #2 at #1}
+}%
+
+
+%
+% Common visualizer interface
+%
+
+\tikzdatavisualizationset{
+ new visualizer/.style n args={3}{
+ #1/.code={
+ \def\tikz@visualizer{#1}%
+ \pgfkeys{/tikz/data visualization/visualizer options/.cd,##1}
+ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data(\pgfkeys{/data point/set=#1})}%
+ },
+ /utils/exec={
+ \advance\tikzdvvisualizercounter by 1\relax
+ \edef\tikz@temp{/data point/set/#1/.initial=\the\tikzdvvisualizercounter}
+ \expandafter\tikzset\expandafter{\tikz@temp}
+ },
+ /data point/#1/execute at begin/.initial={
+ \pgfkeyssetvalue{/data point/set}{#1}
+ \scope[
+ #2,
+ /tikz/data visualization/every visualizer/.try,
+ /tikz/data visualization/visualizers/#1/signal,
+ /tikz/data visualization/visualizers/#1/styling/.try]
+ },
+ /data point/#1/execute at end/.initial={
+ \path; % invokes every path implicitly
+ \endscope
+ },
+ /tikz/data visualization/visualizers/#1/signal/.code=\pgf@signalstyle.emit(),
+ /tikz/data visualization/visualizers/#1/styling/.style=,
+ /tikz/data visualization/visualizers/#1/label in legend options/.style={#3},
+ },
+ style sheet/.style={/data point/set/.style sheet={#1}},
+ /pgf/data/set/.style={/data point/set=#1},
+}%
+
+\tikzdatavisualizationset{
+ new sub visualizer/.style n args={4}{
+ #4/#1/.code={
+ \def\tikz@visualizer{#4/#1}%
+ \pgfkeys{/tikz/data visualization/visualizer options/.cd,##1}
+ },
+ /data point/#4/#1/execute at begin/.initial={
+ \pgfkeyssetvalue{/data point/set}{#4}
+ \scope[
+ #2,
+ /tikz/data visualization/every visualizer/.try,
+ /tikz/data visualization/visualizers/#4/signal,
+ /tikz/data visualization/visualizers/#4/styling/.try,
+ /tikz/data visualization/visualizers/#4/#1/styling/.try]
+ },
+ /data point/#4/#1/execute at end/.initial={
+ \path; % invokes every path implicitly
+ \endscope
+ },
+ /tikz/data visualization/visualizers/#4/#1/styling/.style=,
+ /tikz/data visualization/visualizers/#4/#1/label in legend options/.style={#3},
+ }
+}%
+
+
+\def\tikz@do@visualizer#1#2{%
+ \tikzdatavisualizationset{
+ #2=#1
+ }
+}%
+
+\newcount\tikzdvvisualizercounter
+
+\newif\iftikz@dv@visualizer@label@inline
+
+\tikzdatavisualizationset{visualizer options/.cd,
+ @set/.style 2 args={
+ /tikz/data visualization/visualizers/\tikz@visualizer/styling/.append style={/utils/exec={\let\tikz@dv@plot@handler=#1}},
+ /tikz/data visualization/visualizers/\tikz@visualizer/label in legend options/.append style={#2}
+ },
+ no lines/.style={@set={\pgfplothandlerdiscard}{default label in legend mark}},
+ smooth line/.style={@set={\pgfplothandlercurveto}{default label in legend path}},
+ smooth cycle/.style={@set={\pgfplothandlerclosedcurve}{default label in legend closed path}},
+ straight line/.style={@set={\pgfplothandlerlineto}{default label in legend path}},
+ straight cycle/.style={@set={\pgfplothandlerpolygon}{default label in legend closed path}},
+ polygon/.style={straight cycle},% alias
+ gap line/.style={@set={\pgfplothandlergaplineto}{default label in legend path}},
+ gap cycle/.style={@set={\pgfplothandlergapcycle}{gap circular label in legend line}}
+}%
+
+
+
+%
+% Label visualizer
+%
+
+\tikzdatavisualizationset{
+ new label visualizer/.style 2 args={
+ new object={
+ when=before visualization,
+ class=label visualizer,
+ before creation={
+ \begingroup
+ \def\tikz@visualizer{#1}%
+ \pgfkeys{/tikz/data visualization/visualizer label options/.cd,
+ #2}
+ \pgfkeysgetvalue{/tikz/data visualization/visualizer label options/text}\tikz@dv@temp@lab
+ \def\tikz@tempa{
+ \scope[
+ /utils/exec=\def\tikz@visualizer{#1},%
+ /tikz/data visualization/visualizer label options/.cd,
+ #2]
+ \tikzdatavisualizationset{every data set label/.try}
+ \path [
+ /data point/set=#1,/utils/exec=\pgf@signalstyle.emit(),
+ /tikz/data visualization/.cd,every label in data/.try]
+ (label visualizer coordinate') --
+ (label visualizer coordinate)
+ node [
+ auto,
+ at end,
+ /tikz/data visualization/node styling]
+ }
+ \expandafter\def\expandafter\tikz@tempb\expandafter{\expandafter{\tikz@dv@temp@lab};}%
+ \expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\tikz@dv@label@code%
+ \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\relax%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@tempa\tikz@tempb\endscope}}
+ \global\let\tikz@dv@label@attribute=\tikz@dv@label@attribute
+ \global\let\tikz@dv@label@threshold=\tikz@dv@label@threshold
+ \endgroup
+ },
+ arg1/.expand once=\tikz@dv@label@attribute,
+ arg2=\tikz@dv@label@threshold,
+ arg3/.expand once=\tikz@dv@label@code,
+ arg4=\pgfdvvisualizerfilter{#1}
+ },
+ /utils/exec=\tikz@create@label@count{#1}
+ },
+ % Label style
+ text colored/.style={node style={text=visualizer color}}
+}%
+
+\def\tikz@create@label@count#1{
+ \tikzdatavisualizationset{
+ new object={
+ when=before survey,
+ store=/tikz/data visualization/visualizers/#1/count/obj,
+ class=count,
+ arg1=set/#1/count,
+ after creation={\tikzdvobj.set filter(\pgfdvvisualizerfilter{#1})}
+ }
+ }
+}%
+
+\pgfkeys{
+ /tikz/data visualization/visualizer label options/.cd,
+ when/.code args={#1 is#2}{%
+ \def\tikz@dv@label@attribute{#1}%
+ \def\tikz@dv@label@threshold{#2}%
+ },
+ index/.code={%
+ \edef\tikz@dv@label@attribute{set/\tikz@visualizer/count}%
+ \def\tikz@dv@label@threshold{#1}%
+ },
+ pos/.code={%
+ \edef\tikz@dv@label@attribute{set/\tikz@visualizer/count}%
+ \pgfkeysvalueof{/tikz/data visualization/visualizers/\tikz@visualizer/count/obj}.get max(\tikz@lib@max)
+ \edef\tikz@dv@label@threshold{(#1*\tikz@lib@max)}%
+ },
+ auto/.code={%
+ \edef\tikz@dv@label@attribute{set/\tikz@visualizer/count}%
+ \pgfkeysvalueof{/tikz/data visualization/visualizers/\tikz@visualizer/count/obj}.get max(\tikz@lib@max)
+ \edef\tikz@dv@label@threshold{({(\pgfkeysvalueof{/data point/set/\tikz@visualizer}-0.5)/\the\tikzdvvisualizercounter*\tikz@lib@max})}
+ },
+ text/.initial=,
+ text'/.style={text={#1},node style=swap,/utils/exec=\def\tikz@lib@dv@pin@sign{-}},
+ node style/.style={/tikz/data visualization/node style={#1}},
+ text colored/.style=/tikz/data visualization/text colored,
+ pin angle/.store in=\tikz@lib@dv@pin@dir,
+ pin length/.style={node style={pin distance={#1}}},
+}%
+
+\let\tikz@lib@dv@pin@sign\pgfutil@empty
+
+\let\tikz@dv@label@attribute\pgfutil@empty
+\let\tikz@dv@label@threshold\pgfutil@empty
+\let\tikz@dv@label@code\pgfutil@empty
+
+
+
+
+%
+% Legend handling
+%
+
+\tikzdatavisualizationset{
+ new legend/.code={
+ \pgfkeysifdefined{/tikz/data visualization/#1/at}{}
+ {\tikzdatavisualizationset{
+ new object={
+ class=legend,
+ store=/tikz/data visualization/#1/obj,
+ arg1 from key=/tikz/data visualization/#1/@columns or rows,
+ arg2 from key=/tikz/data visualization/#1/@ideal,
+ arg3 from key=/tikz/data visualization/#1/max entries,
+ arg4 from key=/tikz/data visualization/#1/@strategy,
+ after creation={
+ \tikzdatavisualizationset{
+ legend actions/.append={
+ \pgfkeysgetvalue{/tikz/data visualization/#1/obj}\pgf@dv@legend%
+ {
+ \pgf@dv@legend.get arrangement(\pgf@dv@temp)%
+ \pgfkeysgetvalue{/tikz/data visualization/#1/at}\pgf@dv@at%
+ \pgfkeysgetvalue{/tikz/data visualization/#1/anchor}\pgf@dv@anchor%
+ \let\pgfdvnextcell=\pgfmatrixnextcell%
+ \let\pgfdvendrow=\pgfmatrixendrow%
+ \def\pgf@marshal{
+ \matrix[at/.expand once=\pgf@dv@at,matrix anchor/.expand
+ once=\pgf@dv@anchor,/tikz/data visualization/#1/matrix node styling]
+ }
+ \expandafter\pgf@marshal\expandafter{\pgf@dv@temp};
+ }
+ }
+ }
+ }
+ },
+ #1/@columns or rows/.initial=columns,
+ #1/@ideal/.initial=1,
+ #1/max entries/.initial=100,
+ #1/@strategy/.initial=down then right,
+ #1/anchor/.initial=west,
+ #1/at/.initial=(data visualization bounding box.east),
+ #1/matrix node styling/.style={row sep=0pt,column sep=.8em},
+ %
+ %
+ %
+ #1/.code={
+ \let\tikz@temp\tikz@dv@legend%
+ \def\tikz@dv@legend{/tikz/data visualization/#1}%
+ \expandafter\tikz@do@legend@options\expandafter{\tikz@temp}{##1}%
+ },
+ #1={every new legend}
+ }}},
+ new legend/.default=main legend,
+ legend/.style={
+ new legend,
+ main legend={#1}
+ }
+}%
+
+\def\tikz@do@legend@options#1#2{
+ \pgfkeys{/tikz/data visualization/legend options/.cd,#2}
+ \def\tikz@dv@legend{#1}
+}%
+\let\tikz@dv@legend\pgfutil@empty
+
+
+\tikzset{
+ /tikz/data visualization/legend options/.cd,
+ %
+ % How to arrange the entries in the legend
+ %
+ ideal number of columns/.style={\tikz@dv@legend/@columns or rows=columns,\tikz@dv@legend/@ideal={#1}},
+ ideal number of rows/.style={\tikz@dv@legend/@columns or rows=rows,\tikz@dv@legend/@ideal={#1}},
+ columns/.style={ideal number of columns={#1}},% alias
+ rows/.style={ideal number of rows={#1}},% alias
+ max rows/.style={\tikz@dv@legend/@columns or rows=columns,\tikz@dv@legend/max entries={#1}},
+ max columns/.style={\tikz@dv@legend/@columns or rows=rows,\tikz@dv@legend/max entries={#1}},
+ down then right/.style={\tikz@dv@legend/@strategy=down then right},
+ down then left/.style={\tikz@dv@legend/@strategy=down then left},
+ up then right/.style={\tikz@dv@legend/@strategy=up then right},
+ up then left/.style={\tikz@dv@legend/@strategy=up then left},
+ right then down/.style={\tikz@dv@legend/@strategy=right then down},
+ left then down/.style={\tikz@dv@legend/@strategy=left then down},
+ right then up/.style={\tikz@dv@legend/@strategy=right then up},
+ left then up/.style={\tikz@dv@legend/@strategy=left then up},
+ %
+ % Where to put the legend
+ %
+ anchor/.style={\tikz@dv@legend/anchor={#1}},
+ at/.style={\tikz@dv@legend/at={#1}},
+ % Outer placements
+ right/.style={east outside},
+ left/.style={west outside},
+ above/.style={north outside},
+ below/.style={south outside},
+ east outside/.style={
+ columns=1,
+ at={([xshift=.8em]data visualization bounding box.east)},
+ anchor=west,
+ },
+ north east outside/.style={
+ columns=1,
+ at={([xshift=.8em]data visualization bounding box.north east|-
+ data bounding box.north)},
+ anchor=north west,
+ },
+ south east outside/.style={
+ columns=1,
+ at={([xshift=.8em]data visualization bounding box.south east |-
+ data bounding box.south)},
+ anchor=south west,
+ },
+ west outside/.style={
+ columns=1,
+ label style=text left,
+ at={([xshift=-.8em]data visualization bounding box.west)},
+ anchor=east,
+ },
+ north west outside/.style={
+ columns=1,
+ label style=text left,
+ at={([xshift=-.8em]data visualization bounding box.north west |-
+ data bounding box.north)},
+ anchor=north east,
+ },
+ south west outside/.style={
+ columns=1,
+ label style=text left,
+ at={([xshift=-.8em]data visualization bounding box.south west |-
+ data bounding box.south)},
+ anchor=south east,
+ },
+ south outside/.style={
+ rows=1,
+ at={([yshift=-.5em]data visualization bounding box.south)},
+ anchor=north,
+ },
+ north outside/.style={
+ rows=1,
+ at={([yshift=.5em]data visualization bounding box.north)},
+ anchor=south,
+ },
+ every new legend/.style={east outside,label style=text right},
+ %
+ % Inner placements
+ %
+ % First, styling
+ every legend inside/.style={
+ opaque=white,
+ label style={node style={font=\pgfutil@font@footnotesize}}
+ },
+ opaque/.style={
+ matrix node style={
+ inner sep=.333ex,
+ outer sep=.5ex,
+ rounded corners=3pt,
+ execute at begin cell={\tikzset{sharp corners}}, % get rid of
+ % rounded corners in cells of the
+ % legend matrix
+ fill=#1
+ },
+ },
+ opaque/.default=white,
+ transparent/.style={matrix node style={fill=none}},
+ % Second, the placements
+ north east inside/.style={
+ columns=1,
+ at={([xshift=-.3em]data bounding box.north east)},
+ anchor=north east,
+ every legend inside
+ },
+ south west inside/.style={
+ columns=1,
+ at={([xshift=.3em]data bounding box.south west)},
+ anchor=south west,
+ every legend inside
+ },
+ north west inside/.style={
+ columns=1,
+ at={([xshift=.3em]data bounding box.north west)},
+ anchor=north west,
+ every legend inside
+ },
+ south east inside/.style={
+ columns=1,
+ at={([xshift=-.3em]data bounding box.south east)},
+ anchor=south east,
+ every legend inside
+ },
+ west inside/.style={
+ columns=1,
+ at={([xshift=.3em]data bounding box.west)},
+ anchor=west,
+ every legend inside
+ },
+ east inside/.style={
+ columns=1,
+ at={([xshift=.3em]data bounding box.east)},
+ anchor=east,
+ every legend inside
+ },
+ north inside/.style={
+ rows=1,
+ at={(data bounding box.north)},
+ anchor=north,
+ every legend inside
+ },
+ south inside/.style={
+ rows=1,
+ at={(data bounding box.south)},
+ anchor=south,
+ every legend inside
+ },
+ % Additional inner placements
+ at values/.style={
+ at={(visualization cs:#1)},
+ anchor=center,
+ every legend inside
+ },
+ right of/.style={
+ at={(visualization cs:#1)},
+ anchor=west,
+ every legend inside
+ },
+ left of/.style={
+ at={(visualization cs:#1)},
+ anchor=east,
+ every legend inside
+ },
+ above of/.style={
+ at={(visualization cs:#1)},
+ anchor=south,
+ every legend inside
+ },
+ below of/.style={
+ at={(visualization cs:#1)},
+ anchor=north,
+ every legend inside
+ },
+ above right of/.style={
+ at={(visualization cs:#1)},
+ anchor=south west,
+ every legend inside
+ },
+ above left of/.style={
+ at={(visualization cs:#1)},
+ anchor=south east,
+ every legend inside
+ },
+ below right of/.style={
+ at={(visualization cs:#1)},
+ anchor=north west,
+ every legend inside
+ },
+ below left of/.style={
+ at={(visualization cs:#1)},
+ anchor=north east,
+ every legend inside
+ },
+ %
+ %
+ %
+ % Label text styling
+ %
+ label style/.style={
+ matrix node style={/tikz/data visualization/every label in legend/.append style={#1}}
+ },
+ %
+ % Styling
+ %
+ matrix node style/.style={\tikz@dv@legend/matrix node styling/.append style={#1}},
+}%
+
+
+\tikzdatavisualizationset{
+ new legend entry/.code={
+ \begingroup
+ \pgfkeys{/tikz/data visualization/legend entry options/.cd,#1}
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/legend}\tikz@dv@temp@legend
+ \global\let\tikz@dv@temp@legend\tikz@dv@temp@legend
+ \endgroup
+ \tikzdatavisualizationset{new legend/.expanded=\tikz@dv@temp@legend}%
+ \expandafter\tikz@dv@add@legend@entry\expandafter{\tikz@dv@temp@legend}{#1}
+ }
+}%
+
+\def\tikz@dv@add@legend@entry#1#2{
+ \tikz@main@dv.at start survey({
+ \pgfkeysgetvalue{/tikz/data visualization/#1/obj}\pgf@temp
+ \pgf@temp.add entry(\tikz@dv@render@legend@entry{legend=#1,#2})
+ })
+}%
+
+\def\tikz@dv@render@legend@entry#1{
+ \pgfkeys{/tikz/data visualization/.cd,every data set label}
+ \pgfkeys{/tikz/data visualization/legend entry options/.cd,
+ /tikz/data visualization/every label in legend,#1}%
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/text}\tikz@dv@temp@lab
+ \pgfkeysgetvalue{/tikz/data visualization/@node styling}\tikz@dv@temp@style
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/setup}\tikz@dv@temp@setup
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/visualizer in legend styling}\tikz@dv@temp@visual@styling
+ \scope[/utils/exec=\expandafter\pgfkeysalso\expandafter{\tikz@dv@temp@setup},
+ /utils/exec=\pgf@signalstyle.emit()]
+ \node[/tikz/data visualization/node styling,
+ /utils/exec=\expandafter\pgfkeysalso\expandafter{\tikz@dv@temp@style}]
+ {\tikz@dv@pre@height\tikz@dv@temp@lab\tikz@dv@post@height};
+ \scope[/utils/exec=\expandafter\pgfkeysalso\expandafter{\tikz@dv@temp@visual@styling}]
+ \iftikz@lib@dv@text@only
+ \else
+ \pgfkeysvalueof{/tikz/data visualization/legend entry options/visualizer in legend}
+ \fi
+ \endscope
+ \endscope
+}%
+
+\def\tikz@dv@pre@height{\hbox{\vrule height .75em width0pt}}%
+\def\tikz@dv@post@height{\hbox{\vrule depth .25em width0pt}}%
+
+
+
+\pgfkeys{
+ /tikz/data visualization/legend entry options/.cd,
+ %
+ % General options
+ %
+ text/.initial=,
+ node style/.style={/tikz/data visualization/node style={#1}},
+ legend/.initial=main legend,
+ setup/.initial=,
+ visualizer in legend/.initial=,
+ visualizer in legend styling/.initial=,
+ visualizer in legend style/.style={visualizer in legend styling/.append={,#1}},
+ %
+ % Legend visualizers for plots
+ %
+ text right/.style={
+ node style={anchor=mid west,inner ysep=1pt,inner xsep=0pt,reset cm,xshift=.333em},
+ visualizer in legend style={reset cm},
+ },
+ text left/.style={
+ node style={anchor=mid east,inner ysep=1pt,inner xsep=0pt,reset
+ cm,xshift=-.333em,align=right},
+ visualizer in legend style={reset cm,xscale=-1},
+ },
+ text only/.style={
+ node style={anchor=mid west,inner ysep=1pt,inner xsep=0pt,reset cm,text=visualizer color},
+ /utils/exec=\tikz@lib@dv@text@onlytrue
+ },
+ text colored/.style=/tikz/data visualization/text colored,
+}%
+\let\tikz@lib@dv@pin@dir\pgfutil@empty
+\newif\iftikz@lib@dv@text@only
+
+\pgfkeys{
+ /tikz/data visualization/visualizer options/.cd,
+ label in legend/.code={\expandafter\tikz@dv@new@label@in@legend@for@visualizer\expandafter{\tikz@visualizer}{#1}},
+ label in data/.code=\tikzdatavisualizationset{new label visualizer/.expand once=\expandafter{\tikz@visualizer}{auto,#1}},
+ pin in data/.style={label in data={%
+ node style={%
+ /utils/exec={
+ \ifx\tikz@lib@dv@pin@dir\pgfutil@empty
+ \pgf@process{\pgfpointnormalised{%
+ \pgfpointdiff%
+ {\pgfpointanchor{label visualizer coordinate}{center}}%
+ {\pgfpointanchor{label visualizer coordinate'}{center}}}}%
+ \pgf@x=-\pgf@x\relax%
+ \edef\tikz@lib@dv@temp@rot{\noexpand\pgfqpoint{\the\pgf@y}{\the\pgf@x}}%
+ \tikz@addtransform{\pgftransformshift{\pgfpointscale{\tikz@lib@dv@pin@sign\tikz@pin@distance}{\tikz@lib@dv@temp@rot}}}
+ \else%
+ \tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@lib@dv@pin@dir}{\tikz@lib@dv@pin@sign\tikz@pin@distance}}}
+ \fi%
+ },
+ append after command={
+ \bgroup
+ [current point is local=true]
+ (\tikzlastnode) edge [solid, every pin edge] (label visualizer coordinate)
+ \egroup%
+ }},
+ ,#1}},
+ style/.style={/tikz/data visualization/visualizers/\tikz@visualizer/styling/.append style={,#1}},
+ label in legend options/.style={/tikz/data visualization/visualizers/\tikz@visualizer/label in legend options/.append style={,#1}},
+ ignore style sheets/.style={/tikz/data visualization/visualizers/\tikz@visualizer/signal/.code=,/utils/exec=\advance\tikzdvvisualizercounter by -1\relax},
+}%
+
+\def\tikz@dv@new@label@in@legend@for@visualizer#1#2{
+ \tikzdatavisualizationset{
+ new legend entry={
+ visualizer in legend style={/tikz/data visualization/visualizers/#1/styling/.try},
+ /tikz/data visualization/every label in legend/.try,
+ /tikz/.cd,
+ every label/.try,
+ /tikz/data visualization/legend entry options/.cd,
+ setup={/data point/set=#1},
+ /tikz/data visualization/visualizers/#1/label in legend options/.try,
+ #2,
+ }
+ }
+}%
+
+\def\tikz@dv@legend@entry@as@example{
+ \pgfkeysgetvalue{/data point/set}{\tikz@visualizer}
+ \pgfkeysvalueof{/data point/\tikz@visualizer/execute at begin}
+ \tikz@dv@plot@handler
+ \pgfplotstreamstart
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/label in legend line coordinates}{\tikz@dv@temp}
+ \foreach \coordinate in \tikz@dv@temp
+ { \pgfplotstreampoint{\expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\coordinate} }
+ \pgfplotstreamend
+ \pgfkeysvalueof{/data point/\tikz@visualizer/execute at end}
+ \pgfkeysvalueof{/data point/\tikz@visualizer/execute at begin}
+ \tikz@dv@plot@mark@maker
+ \pgfplotstreamstart
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/label in legend mark coordinates}{\tikz@dv@temp}
+ \foreach \coordinate in \tikz@dv@temp
+ { \pgfplotstreampoint{\expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\coordinate} }
+ \pgfplotstreamend
+ \pgfkeysvalueof{/data point/\tikz@visualizer/execute at end}
+}%
+
+
+\tikzdatavisualizationset{
+ legend entry options/.cd,
+ label in legend line coordinates/.initial=,
+ label in legend rectangle coordinates/.initial={(-1ex,-.5ex),(-1ex,0.968ex),(0ex,0.968ex),(0ex,-.5ex)},
+ label in legend mark coordinates/.initial=,
+ label in legend one mark/.style={
+ label in legend line coordinates={},
+ label in legend mark coordinates={(0,0)},
+ },
+ label in legend three marks/.style={
+ label in legend line coordinates={},
+ label in legend mark coordinates={(-3ex,-.3ex),(-1.5ex,.3ex),(0,0)},
+ },
+ straight label in legend line/.style={
+ label in legend line coordinates={(-2em,0),(-1.5em,0),(-.5em,0),(0,0)},
+ label in legend mark coordinates={(-1.5em,0),(-.5em,0)},
+ },
+ zig zag label in legend line/.style={
+ label in legend line coordinates={(-2em,0),(-1.5em,.3ex),(-.5em,-.3ex),(0,0)},
+ label in legend mark coordinates={(-1.5em,.3ex),(-.5em,-.3ex)},
+ },
+ circular label in legend line/.style={
+ label in legend line coordinates={%
+ ([xshift=-1em]0:.9em and .35ex),%
+ ([xshift=-1em]45:.9em and .35ex),%
+ ([xshift=-1em]90:.9em and .35ex),%
+ ([xshift=-1em]135:.9em and .35ex),%
+ ([xshift=-1em]180:.9em and .35ex),%
+ ([xshift=-1em]225:.9em and .35ex),%
+ ([xshift=-1em]270:.9em and .35ex),%
+ ([xshift=-1em]315:.9em and .35ex)},%
+ label in legend mark coordinates={([xshift=-1em]120:.9em and .35ex),([xshift=-1em]-60:.9em and .35ex)},
+ },
+ gap circular label in legend line/.style={
+ label in legend line coordinates={%
+ ([xshift=-1em,yshift=.2ex]90:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]162:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]234:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]306:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]18:1.4ex and 0.9ex)},
+ label in legend mark coordinates={
+ ([xshift=-1em,yshift=.2ex]90:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]162:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]234:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]306:1.4ex and 0.9ex),%
+ ([xshift=-1em,yshift=.2ex]18:1.4ex and 0.9ex)}
+ },
+ default label in legend path/.style={zig zag label in legend line},
+ default label in legend closed path/.style={circular label in legend line},
+ default label in legend mark/.style={label in legend one mark},
+}%
+
+
+\def\tikz@dv@legend@entry@visualizer@visualizer{
+}%
+
+
+
+%
+% Basic visualizers
+%
+
+\tikzdatavisualizationset{
+ visualize as line/.style={
+ new object={
+ when=after survey,
+ store=/tikz/data visualization/visualizers/#1,
+ class=plot handler visualizer,
+ arg1=#1,
+ arg2={\tikz@dv@plot@handler,\tikz@dv@plot@mark@maker}
+ },
+ new visualizer={#1}{%
+ every path/.style={draw},
+ style={every mark/.append style={color=visualizer color}},
+ mark size=2pt,
+ semithick,
+ color=visualizer color,
+ mark=none,
+ /tikz/data visualization/every visualize as line/.try,
+ }{visualizer in legend=\tikz@dv@legend@entry@as@example},
+ #1={straight line}
+ },
+ visualize as line/.default=line,
+ visualize as smooth line/.style={
+ visualize as line={#1},
+ #1={smooth line}
+ },
+ visualize as smooth line/.default=line,
+ visualize as scatter/.style={
+ new object={
+ when=after survey,
+ store=/tikz/data visualization/visualizers/#1,
+ class=plot handler visualizer,
+ arg1=#1,
+ arg2={\tikz@dv@plot@mark@maker}
+ },
+ new visualizer={#1}{%
+ mark=x,
+ mark size=2pt,
+ style={every mark/.append style={color=visualizer color}},
+ /tikz/data visualization/every visualize as scatter/.try,
+ }{visualizer in legend=\tikz@dv@legend@entry@as@example},
+ #1={no lines}
+ },
+ visualize as scatter/.default=scatter
+}%
+
+\def\tikz@dv@plot@mark@maker{
+ \let\tikz@options=\pgfutil@empty%
+ \let\tikz@transform=\pgfutil@empty%
+ \tikzset{solid,shift only,every mark}%
+ \tikz@options%
+ \ifx\tikz@plot@mark\pgfutil@empty%
+ \pgfplothandlerdiscard
+ \else
+ \pgfplothandlermark{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}}
+ \fi
+}%
+
+
+
+%
+% Rectangle visualizers
+%
+
+
+\tikzdatavisualizationset{
+ visualize as rectangles/.style={
+ new object={
+ when=before survey,
+ store=/tikz/data visualization/visualizers/#1,
+ class=rectangle visualizer,
+ arg1=#1
+ },
+ /data point/#1/attribute 1/.initial=x,
+ /data point/#1/attribute 2/.initial=y,
+ new visualizer={#1}{%
+ every path/.style={draw},
+ semithick,
+ color=visualizer color,
+ /tikz/data visualization/every visualize as rectangles/.try,
+ }{visualizer in legend=\tikz@dv@legend@entry@as@rectangle},
+ #1={}
+ },
+ visualize as rectangles/.default=rectangles,
+ %
+ %
+ %
+ visualizer options/.cd,
+ attribute 1/.style={/data point/\tikz@visualizer/attribute 1=#1},
+ attribute 2/.style={/data point/\tikz@visualizer/attribute 2=#1},
+}%
+
+
+
+\def\tikz@dv@legend@entry@as@rectangle{
+ \pgfkeysgetvalue{/data point/set}{\tikz@visualizer}
+ \pgfkeysvalueof{/data point/\tikz@visualizer/execute at begin}
+ \pgfplothandlerpolygon
+ \pgfplotstreamstart
+ \pgfkeysgetvalue{/tikz/data visualization/legend entry options/label in legend rectangle coordinates}{\tikz@dv@temp}
+ \foreach \coordinate in \tikz@dv@temp
+ { \pgfplotstreampoint{\expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\coordinate} }
+ \pgfplotstreamend
+ \pgfkeysvalueof{/data point/\tikz@visualizer/execute at end}
+}%
+
+
+
+
+%
+% Style sheets
+%
+
+% Style sheet handler
+
+\pgfkeysdef{/handlers/.style sheet}{%
+ \edef\pgf@marshal{
+ \noexpand \pgfoonew \noexpand\tikz@dv@temp=new style attribute(\pgfkeyscurrentpath,#1)
+ \noexpand \tikz@dv@temp.default connects()
+ }
+ \pgf@marshal
+}%
+
+\tikzset{
+ visualizer color/.code=\colorlet{visualizer color}{#1},
+ visualizer color=black
+}%
+
+% Default style sheets
+
+\pgfdvdeclarestylesheet{vary thickness}
+{
+ default style/.style={line width={0.3pt+#1*0.2pt}}
+}%
+
+\pgfdvdeclarestylesheet{vary dashing}
+{
+ default style/.style=solid,
+ 1/.style=solid,
+ 2/.style={dash pattern=on 5\pgflinewidth off 2\pgflinewidth},
+ 3/.style={dash pattern=on 1.5\pgflinewidth off 1.5\pgflinewidth},
+ 4/.style={dash pattern=on 5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth},
+ 5/.style={dash pattern=on 10\pgflinewidth off 3\pgflinewidth},
+ 6/.style={dash pattern=on 10\pgflinewidth off 2\pgflinewidth on 2\pgflinewidth off 2\pgflinewidth},
+ 7/.style={dash pattern=on 8\pgflinewidth off 2\pgflinewidth on
+ 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off
+ 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth}
+}%
+
+\pgfdvdeclarestylesheet{vary thickness and dashing}
+{
+ default style/.style=thin,
+ 1/.style=thin,
+ 2/.style=thick,
+ 3/.style={
+ dash pattern=on 5\pgflinewidth off 2\pgflinewidth,
+ thin
+ },
+ 4/.style={
+ dash pattern=on 5\pgflinewidth off 2\pgflinewidth,
+ thick,
+ },
+ 5/.style={
+ dash pattern=on 1.5\pgflinewidth off 1.5\pgflinewidth,
+ thin
+ },
+ 6/.style={
+ dash pattern=on 1.5\pgflinewidth off 1.5\pgflinewidth,
+ thick
+ },
+ 7/.style={
+ dash pattern=on 5\pgflinewidth off 1.5\pgflinewidth on
+ 1.5\pgflinewidth off 1.5\pgflinewidth,
+ thin
+ },
+ 8/.style={
+ dash pattern=on 5\pgflinewidth off 1.5\pgflinewidth on
+ 1.5\pgflinewidth off 1.5\pgflinewidth,
+ thick
+ },
+ 9/.style={
+ dash pattern=on 10\pgflinewidth off 3\pgflinewidth,
+ thin
+ },
+ 10/.style={
+ dash pattern=on 10\pgflinewidth off 3\pgflinewidth,
+ thick
+ },
+ 11/.style={
+ dash pattern=on 10\pgflinewidth off 2\pgflinewidth on
+ 2\pgflinewidth off 2\pgflinewidth,
+ thin
+ },
+ 12/.style={
+ dash pattern=on 10\pgflinewidth off 2\pgflinewidth on
+ 2\pgflinewidth off 2\pgflinewidth,
+ thick
+ },
+ 13/.style={
+ dash pattern=on 8\pgflinewidth off 2\pgflinewidth on
+ 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off
+ 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth,
+ thin
+ },
+ 14/.style={
+ dash pattern=on 8\pgflinewidth off 2\pgflinewidth on
+ 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off
+ 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth,
+ thick
+ }
+}%
+
+
+\pgfdvdeclarestylesheet{strong colors}
+{
+ default style/.style={visualizer color=black},
+ 1/.style={visualizer color=black},
+ 2/.style={visualizer color=red!80!black},
+ 3/.style={visualizer color=blue!80!black},
+ 4/.style={visualizer color=green!60!black},
+ 5/.style={visualizer color=orange!80!black},
+ 6/.style={visualizer color=black!60}
+}%
+
+
+\pgfdvdeclarestylesheet{cross marks}
+{
+ default style/.style={mark=x,every mark/.append style=thin,mark size=2pt},
+ 1/.style={mark=x,every mark/.append style=thin,mark size=2pt},
+ 2/.style={mark=+,every mark/.append style=thin,mark size=2pt},
+ 3/.style={mark=Mercedes star,every mark/.append style=thin,mark size=2pt},
+ 4/.style={mark=Mercedes star flipped,every mark/.append style=thin,mark size=2pt},
+ 5/.style={mark=star,every mark/.append style=thin,mark size=2pt},
+ 6/.style={mark=10-pointed star,every mark/.append style={line width=.3pt,mark size=1.8pt}}
+}%
+
+
+\pgfdvdeclarestylesheet{* mark}
+{
+ default style/.style={mark=*,every mark/.append style=thin,mark size=1.4pt},
+}%
+
+\pgfdvdeclarestylesheet{dot mark}
+{
+ default style/.style={mark=*,every mark/.append style=thin,mark size=0.6pt},
+}%
+
+
+\pgfdvdeclarestylesheet{o mark}
+{
+ default style/.style={mark=o,every mark/.append style=thin,mark size=1.4pt},
+}%
+
+
+
+% Declare a color series style sheet
+%
+% #1 = name of the style sheet
+% #2 = color model
+% #3 = initial color
+% #4 = step
+%
+% Description:
+%
+% This function declares a style sheet that changes colors according
+% to the value of the attribute. No test is made that the attribute is
+% a number.
+
+\def\tikzdvdeclarestylesheetcolorseries#1#2#3#4{%
+ \definecolorseries{tikzdvcolorseries#1}{#2}{step}[#2]{#3}{#4}%
+ \resetcolorseries{tikzdvcolorseries#1}%
+ \pgfdvdeclarestylesheet{#1}
+ {
+ default style/.style={
+ /utils/exec=\colorlet{tikz@dv@temp}[rgb]{tikzdvcolorseries#1!![##1]},
+ visualizer color=tikz@dv@temp
+ }
+ }%
+}%
+
+\tikzdvdeclarestylesheetcolorseries{vary hue}{hsb}{.4,0.9,0.8}{.213,0,0}%
+\tikzdvdeclarestylesheetcolorseries{shades of blue}{hsb}{.65,1.4,1}{0,-.4,-.0}%
+\tikzdvdeclarestylesheetcolorseries{shades of red}{hsb}{0,1.4,1}{0,-.4,-.0}%
+\tikzdvdeclarestylesheetcolorseries{gray scale}{hsb}{0,0,-.34}{0,0,.34}%
+
+
+
+
+
+%
+% Basic Axes & Coordinate Systems
+%
+
+
+%
+%
+% Basic axis systems
+%
+%
+
+\tikzdatavisualizationset{
+ xy Cartesian/.style={
+ new Cartesian axis=x axis,
+ x axis={attribute=x,unit vector={(1pt,0cm)}},
+ new Cartesian axis=y axis,
+ y axis={attribute=y,unit vector={(0cm,1pt)}}
+ },
+ Xy axes/.style={x axis={#1},y axis={#1}},
+ uv Cartesian/.style={
+ new Cartesian axis=u axis,
+ u axis={attribute=u,unit vector={(1pt,0cm)}},
+ new Cartesian axis=v axis,
+ v axis={attribute=v,unit vector={(0cm,1pt)}}
+ },
+ uv axes/.style={u axis={#1},v axis={#1}},
+}%
+
+\tikzdatavisualizationset{
+ xyz Cartesian cabinet/.style={
+ xy Cartesian,
+ new Cartesian axis=z axis,
+ z axis={attribute=z,unit vector={(-0.353553pt,-0.353553pt)}}
+ },
+ xyz axes/.style={x axis={#1},y axis={#1},z axis={#1}},
+ uvw Cartesian cabinet/.style={
+ uv Cartesian,
+ new Cartesian axis=w axis,
+ w axis={attribute=w,unit vector={(-0.353553pt,-0.353553pt)}}
+ }
+ uvw axes/.style={u axis={#1},v axis={#1},w axis={#1}},
+}%
+
+
+
+%
+% Create a new axis system
+%
+
+\tikzdatavisualizationset{
+ new axis system/.style n args={4}{
+ #1/.style={
+ #2,
+ #1/.cd,
+ #3,
+ /tikz/data visualization/every #1/.try,
+ ##1,
+ /tikz/data visualization/.cd,
+ #4,
+ }
+ }
+}%
+
+
+% The school book axes
+%
+% This coordinate system can be used to create plots that look like
+% plots in a typical school book: There are two axes called "x axis"
+% and "y axis" that meet at the origin, there are arrows at the ends
+% of the axes, pointing in the directions of the positive axes. No
+% scaling is done by default, rather one unit equals one 1cm. This
+% ensures that the even when multiple plots are created, the same
+% scaling will be used each time.
+%
+% To change the scaling, say "all axes={unit length=1mm}" for
+% instance.
+
+\tikzdatavisualizationset{
+ new axis system={school book axes}{%
+ xy Cartesian,
+ x axis={
+ include value=0,
+ scaling=0 at 0 and \pgfkeysvalueof{/tikz/data visualization/school book axes/unit} at 1cm,
+ visualize axis={y axis={goto=0},style=->,padded},
+ visualize ticks={common={y axis={goto=0},direction axis=y axis},
+ major={tick text at low,
+ options at=0 as [{style={draw=none},no tick text}]
+ }},
+ visualize grid={common={direction axis=y axis,padded}},
+ ticks={step=\pgfkeysvalueof{/tikz/data visualization/school book axes/unit}},
+ padding=0.75em
+ },
+ y axis={
+ include value=0,
+ scaling=0 at 0 and \pgfkeysvalueof{/tikz/data visualization/school book axes/unit} at 1cm,
+ visualize axis={x axis={goto=0},style=->,padded},
+ visualize ticks={
+ common={x axis={goto=0},direction axis=x axis},
+ major={tick text at low,options at=0 as [{high=0,low=0,style={draw=none},node style={anchor=north east}}]}
+ },
+ visualize grid={common={direction axis=x axis,padded}},
+ ticks={step=\pgfkeysvalueof{/tikz/data visualization/school book axes/unit}},
+ padding=0.75em
+ }
+ }{%
+ standard labels
+ }{%
+ @make labels
+ },
+ school book axes/.cd,
+ % Possible axis positionings:
+ %
+ % Place labels at the ends of the axes
+ %
+ standard labels/.style={
+ /tikz/data visualization/@make labels/.style={
+ x axis={
+ visualize label={
+ x axis={goto=padded max, anchor at max},
+ y axis={goto=0}
+ }
+ },
+ y axis={
+ visualize label={
+ y axis={goto=padded max, anchor at max},
+ x axis={goto=0}
+ }
+ }
+ }
+ },
+ %
+ % Basic unit
+ %
+ unit/.initial=1,
+}%
+
+
+
+
+% The scientific axes
+%
+% The scientific axes is a 2d plot that has a predetermined width and
+% height. The data is then scaled in such a way that it fits inside
+% this given rectangle.
+
+\tikzdatavisualizationset{
+ new axis system={scientific axes}{%
+ xy Cartesian,
+ every axis/.append style={style={draw=black!50}},
+ every ticks/.append style={style={draw=black!50}},
+ x axis={
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width},
+ ticks
+ },
+ y axis={
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height},
+ ticks
+ }
+ }{%
+ standard labels,
+ outer ticks,
+ }{%
+ @make axes,
+ @make labels
+ },
+ scientific axes/.cd,
+ width/.initial=5cm,
+ height/.initial=0.618*\pgfkeysvalueof{/tikz/data visualization/scientific axes/width},% golden ratio...
+ outer ticks/.style={
+ /tikz/data visualization/@make axes/.style={
+ x axis={
+ visualize ticks={common={y axis={goto=padded min},direction axis=y axis,high=0pt},major={tick text at low}},
+ visualize ticks={common={y axis={goto=padded max},direction axis=y axis,low=0pt}},
+ visualize axis={y axis={goto=padded min},padded},
+ visualize axis={y axis={goto=padded max},padded},
+ visualize grid={common={direction axis=y axis,padded}},
+ },
+ y axis={
+ visualize ticks={common={x axis={goto=padded min},direction axis=x axis,high=0pt},major={tick text at low}},
+ visualize ticks={common={x axis={goto=padded max},direction axis=x axis,low=0pt}},
+ visualize axis={x axis={goto=padded min},padded},
+ visualize axis={x axis={goto=padded max},padded},
+ visualize grid={common={direction axis=x axis,padded}},
+ }
+ }
+ },
+ inner ticks/.style={
+ /tikz/data visualization/@make axes/.style={
+ x axis={
+ visualize ticks={common={y axis={goto=padded min},direction axis=y axis,low=0pt},major={tick text at low}},
+ visualize ticks={common={y axis={goto=padded max},direction axis=y axis,high=0pt}},
+ visualize axis={y axis={goto=padded min},padded},
+ visualize axis={y axis={goto=padded max},padded},
+ visualize grid={common={direction axis=y axis,padded}},
+ },
+ y axis={
+ visualize ticks={common={x axis={goto=padded min},direction axis=x axis,low=0pt},major={tick text at low}},
+ visualize ticks={common={x axis={goto=padded max},direction axis=x axis,high=0pt}},
+ visualize axis={x axis={goto=padded min},padded},
+ visualize axis={x axis={goto=padded max},padded},
+ visualize grid={common={direction axis=x axis,padded}},
+ }
+ }
+ },
+ clean/.style={
+ /tikz/data visualization/@make axes/.style={
+ x axis={
+ visualize ticks={common={y axis={goto=padded min},direction axis=y axis,high=0pt},major={tick text at low}},
+ visualize axis={y axis={goto=padded min}},
+ visualize axis={y axis={goto=min}, style={black!25, line cap=rect}},
+ visualize axis={y axis={goto=max}, style={black!25, line cap=rect}},
+ visualize grid={common={direction axis=y axis}},
+ padding=.5em,
+ },
+ y axis={
+ visualize ticks={common={x axis={goto=padded min},direction axis=x axis,high=0pt},major={tick text at low}},
+ visualize axis={x axis={goto=padded min}},
+ visualize axis={x axis={goto=min}, style={black!25, line cap=rect}},
+ visualize axis={x axis={goto=max}, style={black!25, line cap=rect}},
+ visualize grid={common={direction axis=x axis}},
+ padding=.5em
+ },
+ }
+ },
+ % Possible axis positionings:
+ %
+ % Place axes labels below and left, where left label is rotated
+ %
+ standard labels/.style={
+ /tikz/data visualization/@make labels/.style={
+ x axis={
+ visualize label={
+ x axis={goto pos=.5},
+ % Vertical position comes from bounding box:
+ node style={
+ at={(0,0 |- data visualization bounding box.south)},
+ below
+ }
+ }
+ },
+ y axis={
+ visualize label={
+ y axis={goto pos=.5},
+ % Horizontal position comes from bounding box:
+ node style={
+ at={(0,0 -| data visualization bounding box.west)},
+ rotate=90,
+ above}
+ }
+ }
+ }
+ },
+ %
+ % Place axes labels below and left, no rotation
+ %
+ upright labels/.style={
+ /tikz/data visualization/@make labels/.style={
+ x axis={
+ visualize label={
+ x axis={goto pos=.5},
+ % Vertical position comes from bounding box:
+ node style={
+ at={(0,0 |- data visualization bounding box.south)},
+ below
+ }
+ }
+ },
+ y axis={
+ visualize label={
+ y axis={goto pos=.5},
+ % Horizontal position comes from bounding box:
+ node style={
+ at={(0,0 -| data visualization bounding box.west)},
+ left
+ }
+ }
+ }
+ }
+ },
+ %
+ % Place axes at the ends of the axes
+ %
+ end labels/.style={
+ /tikz/data visualization/@make labels/.style={
+ x axis={
+ visualize label={
+ y axis={goto=padded min},
+ % Vertical position comes from bounding box:
+ node style={
+ at={(0,0 -| data visualization bounding box.east)},
+ right
+ }
+ }
+ },
+ y axis={
+ visualize label={
+ x axis={goto=padded min},
+ % Horizontal position comes from bounding box:
+ node style={
+ at={(0,0 |- data visualization bounding box.north)},
+ above
+ }
+ }
+ }
+ }
+ }
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydatavisualization.formats.functions.code.tex b/graphics/pgf/base/tex/tikzlibrarydatavisualization.formats.functions.code.tex
new file mode 100644
index 0000000000..40632212a0
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydatavisualization.formats.functions.code.tex
@@ -0,0 +1,16 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarydatavisualization.formats.functions.code.tex}
+
+\usetikzlibrary{datavisualization}%
+\usepgflibrary{datavisualization.formats.functions}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydatavisualization.polar.code.tex b/graphics/pgf/base/tex/tikzlibrarydatavisualization.polar.code.tex
new file mode 100644
index 0000000000..137e9964cb
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydatavisualization.polar.code.tex
@@ -0,0 +1,565 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarydatavisualization.polar.code.tex}
+
+\usetikzlibrary{datavisualization}%
+\usepgflibrary{datavisualization.polar}%
+
+
+\tikzdatavisualizationset{%
+ new polar axes/.style 2 args={
+ new axis base=#1,
+ #1={attribute=angle},
+ new axis base=#2,
+ #2={attribute=radius},
+ #2/scaling/default=0 at 0 and 1 at 1cm,
+ new object={
+ store=/tikz/data visualization/#1/polar transformer,
+ class=polar transformer,
+ arg1/.expanded=\pgfkeysvalueof{/tikz/data visualization/angle axis/attribute}/scaled,
+ arg2/.expanded=\pgfkeysvalueof{/tikz/data visualization/radius axis/attribute}/scaled,
+ arg3 from key=/tikz/data visualization/#1/unit vector 0 degrees,
+ arg4 from key=/tikz/data visualization/#1/unit vector 90 degrees
+ },
+ /tikz/data visualization/#1/unit vector 0 degrees/.initial=\pgfqpoint{1pt}{0pt},
+ /tikz/data visualization/#1/unit vector 90 degrees/.initial=\pgfqpoint{0pt}{1pt},
+ },
+ new polar axes/.default={angle axis}{radius axis}
+}%
+\def\tikz@lib@dv@polar@a#1{
+ \pgfkeyssetvalue{\tikz@dv@axis/unit vector 0 degrees}{#1}
+}%
+\def\tikz@lib@dv@polar@b#1{
+ \pgfkeyssetvalue{\tikz@dv@axis/unit vector 90 degrees}{#1}
+}%
+
+
+
+%
+% Scientific polar axes
+%
+
+\tikzset{
+ /tikz/data visualization/axis options/.cd,
+ unit vectors/.code 2 args={
+ \tikz@scan@one@point\tikz@lib@dv@polar@a#1
+ \tikz@scan@one@point\tikz@lib@dv@polar@b#2
+ },
+ degrees/.style={\tikz@dv@axis/scaling=0 at 0 and 1 at 1},
+ radians/.style={\tikz@dv@axis/scaling=0 at 0 and 0.03141592653589793 at 1.8},
+}%
+
+
+
+\tikzdatavisualizationset{
+ new axis system={scientific polar axes}{%
+ new polar axes,
+ angle axis={attribute=angle},
+ radius axis={attribute=radius},
+ every axis/.append style={style={draw=black!50}},
+ every ticks/.append style={style={draw=black!50}},
+ }{%
+ 0 to 360,%
+ outer ticks,
+ }{%
+ @make axes,
+ scientific polar axes/@setup axes,
+ /utils/exec={
+ \edef\pgf@marshal{\noexpand\tikzdatavisualizationset{\pgfkeysvalueof{/tikz/data visualization/@which visualize radius axis}/.list={\pgfkeysvalueof{/tikz/data visualization/\pgfkeysvalueof{/tikz/data visualization/@which radius axes at}}}}}
+ \pgf@marshal
+ },
+ @make labels
+ },
+ @which radius axes at/.initial=@inner radius axes at,
+ @which visualize radius axis/.initial=@visualize radius axis,
+ @inner radius axes at/.initial=,
+ @clean radius axes at/.initial=,
+ @visualize radius axis/.style 2 args={
+ radius axis={
+ visualize axis={angle axis={goto=#1},high=padded max,low=0},
+ visualize ticks={
+ common={angle axis={goto=#1}, direction axis=angle axis},
+ major={tick text at #2,
+ options at=0 as [{style={draw=none},no tick text}]
+ }
+ }
+ }
+ },
+ @visualize clean radius axis/.style n args={5}{
+ radius axis={
+ visualize axis={angle
+ axis={goto=#1},high=max,low=0,style={black!25,line cap=rect}},
+ visualize axis={angle
+ axis={goto=#1},high=max,low=0,style={line cap=rect,#4}},
+ visualize ticks={
+ style={#4},
+ common={angle axis={goto=#1}, direction axis=angle axis, #3=0},
+ major={tick text at #2,#5}
+ }
+ }
+ },
+ @visualize zero/.style={@inner visualize zero={#1}},
+ @clean visualize zero/.style={},
+ @inner visualize zero/.style={
+ radius axis={
+ visualize ticks={
+ common={angle axis={goto=0}, direction axis=angle axis},
+ major={tick text at low,low=0,high=0,at=0 as
+ [{style={draw=none},node style={anchor=#1}}]
+ }
+ }
+ }
+ },
+ @degrees/.style={
+ angle axis={degrees, ticks={step=15, tick suffix=$^\circ$, major={
+ options at=360 as [{style={draw=none},no tick text}],
+ options at=-180 as [{style={draw=none},no tick text}]}}}
+ },
+ @rad/.style={
+ angle axis={radians, ticks={
+ step=(pi/12),
+ node style={
+ /pgf/number format/frac,
+ /pgf/number format/frac shift={1}
+ },
+ tick typesetter/.code={%
+ \pgfmathsetmacro{\tikz@lib@dv@pol}{round(####1*3.819718634205488)/12}%
+ \pgfmathapproxequalto{\tikz@lib@dv@pol}{0}%
+ \ifdim\pgfmathresult pt=1.0pt%
+ $0$%
+ \else%
+ \pgfmathapproxequalto{\tikz@lib@dv@pol}{1}%
+ \ifdim\pgfmathresult pt=1.0pt%
+ $\pi$%
+ \else
+ \pgfmathapproxequalto{\tikz@lib@dv@pol}{-1}%
+ \ifdim\pgfmathresult pt=1.0pt%
+ $-\pi$%
+ \else%
+ \pgfmathprintnumber{\tikz@lib@dv@pol}$\pi$%
+ \fi%
+ \fi%
+ \fi%
+ },
+ major={
+ options at=6.2831985e0 as [{style={draw=none},no tick text}],
+ options at=6.2831192e0 as [{style={draw=none},no tick text}],
+ options at=6.2830794e0 as [{style={draw=none},no tick text}],
+ options at=6.2828787e0 as [{style={draw=none},no tick text}],
+ options at=6.2831598e0 as [{style={draw=none},no tick text}],
+ options at=-3.1415991e0 as [{style={draw=none},no tick text}],
+ options at=-3.1415802e0 as [{style={draw=none},no tick text}],
+ options at=-3.1415602e0 as [{style={draw=none},no tick text}],
+ options at=-3.14153961e0 as [{style={draw=none},no tick text}],
+ options at=-3.1414406e0 as [{style={draw=none},no tick text}],
+ }
+ }
+ }
+ },
+ @make labels/.style={},
+}%
+
+\tikzdatavisualizationset{
+ scientific polar axes/.cd,
+ %
+ %
+ %
+ outer ticks/.style={
+ /tikz/data visualization/@make axes/.style={
+ radius axis={
+ min value=0,
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific polar axes/radius},
+ padding=0em,
+ ticks={few},
+ visualize grid={common={direction axis=angle axis,low=min,high=max}},
+ },
+ angle axis={
+ visualize axis={radius axis={goto=padded max},low=min,high=max},
+ visualize ticks={common={radius axis={goto=padded max},direction
+ axis=radius axis},common={low=0},major={tick text at high}},
+ visualize grid={common={direction axis=radius axis},low=0,high=padded max},
+ }
+ },
+ /tikz/data visualization/@which radius axes at=@inner radius axes at,
+ /tikz/data visualization/@which visualize radius axis=@visualize radius axis,
+ /tikz/data visualization/@visualize zero/.style={@inner visualize zero={##1}},
+ },
+ inner ticks/.style={
+ /tikz/data visualization/@make axes/.style={
+ radius axis={
+ min value=0,
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific polar axes/radius},
+ padding=0em,
+ ticks={few},
+ visualize grid={common={direction axis=angle axis,low=min,high=max}},
+ },
+ angle axis={
+ visualize axis={radius axis={goto=padded max},low=min,high=max},
+ visualize ticks={common={radius axis={goto=padded max},direction
+ axis=radius axis},common={high=0},major={tick text at high}},
+ visualize grid={common={direction axis=radius axis},low=0,high=padded max},
+ }
+ },
+ /tikz/data visualization/@which radius axes at=@inner radius axes at,
+ /tikz/data visualization/@which visualize radius axis=@visualize radius axis,
+ /tikz/data visualization/@visualize zero/.style={@inner visualize zero={##1}},
+ },
+ clean/.style={
+ /tikz/data visualization/@make axes/.style={
+ radius axis={
+ min value=0,
+ length=\pgfkeysvalueof{/tikz/data visualization/scientific polar axes/radius},
+ padding=.5em,
+ ticks={few},
+ visualize grid={common={direction axis=angle axis,low=min,high=max}},
+ },
+ angle axis={
+ padding=.5em,
+ visualize axis={radius axis={goto=max}, style={black!25, line cap=rect},low=min,high=max},
+ visualize axis={radius axis={goto=padded max}, style={line cap=rect}, low=min,high=max},
+ visualize ticks={common={radius axis={goto=padded max}, direction axis=radius axis},common={low=0},major={tick text at high}},
+ visualize grid={common={direction axis=radius axis},low=0,high=max},
+ }
+ },
+ /tikz/data visualization/@which radius axes at=@clean radius axes at,
+ /tikz/data visualization/@which visualize radius axis=@visualize clean radius axis,
+ /tikz/data visualization/@visualize zero/.style={@clean visualize zero={##1}},
+ },
+ radius/.initial=3.25cm,
+ %
+ % First quadrant
+ %
+ 0 to pi half/.style={
+ @setup axes/.style={
+ angle axis={min value=0, max value=1.570796326794897},
+ @rad,
+ @visualize zero=north east,
+ @inner radius axes at={{0}{low},{1.570796326794897}{high}},
+ @clean radius axes at={%
+ {0}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {1.570796326794897}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ 0 to 90/.style={
+ @setup axes/.style={
+ angle axis={min value=0, max value=90},
+ @degrees,
+ @visualize zero=north east,
+ @inner radius axes at={{0}{low},{90}{high}},
+ @clean radius axes at={%
+ {0}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {90}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ quadrant/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 0 and max at 90, ticks},
+ @visualize zero=north east,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ quadrant clockwise/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 90 and max at 0, ticks},
+ @visualize zero=north east,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {max}{high}{low}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {min}{low}{high}{xshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ %
+ % Fourth quadrant
+ %
+ -pi half to 0/.style={
+ @setup axes/.style={
+ angle axis={min value=-1.570796326794897, max value=0},
+ @rad,
+ @visualize zero=south east,
+ @inner radius axes at={{-1.570796326794897}{low},{0}{high}},
+ @clean radius axes at={%
+ {-1.570796326794897}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {0}{high}{low}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ -90 to 0/.style={
+ @setup axes/.style={
+ angle axis={min value=-90, max value=0},
+ @degrees,
+ @visualize zero=south east,
+ @inner radius axes at={{-90}{low},{0}{high}},
+ @clean radius axes at={%
+ {-90}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {0}{high}{low}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ fourth quadrant/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at -90 and max at 0, ticks},
+ @visualize zero=south east,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ fourth quadrant clockwise/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 0 and max at -90, ticks},
+ @visualize zero=south east,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {max}{high}{low}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {min}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding max}}{}
+ }
+ }
+ },
+ %
+ % Upper half
+ %
+ 0 to pi/.style={
+ @setup axes/.style={
+ angle axis={min value=0, max value=3.141592653589793},
+ @rad,
+ @visualize zero=north,
+ @inner radius axes at={{0}{low},{1.570796326794897}{high},{3.141592653589793}{high}},
+ @clean radius axes at={%
+ {0}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {3.141592653589793}{high}{low}{yshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ 0 to 180/.style={
+ @setup axes/.style={
+ angle axis={min value=0, max value=180},
+ @degrees,
+ @visualize zero=north,
+ @inner radius axes at={{0}{low},{90}{high},{180}{high}},
+ @clean radius axes at={%
+ {0}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {180}{high}{low}{yshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ upper half/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 0 and max at 180, ticks},
+ @visualize zero=north,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{yshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ upper half clockwise/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 180 and max at 0, ticks},
+ @visualize zero=north,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{yshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{yshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ %
+ % Lower half
+ %
+ lower half/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at -180 and max at 0, ticks},
+ @visualize zero=south,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{yshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{yshift=\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ lower half clockwise/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 0 and max at -180, ticks},
+ @visualize zero=south,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{yshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{yshift=\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ %
+ % Right half
+ %
+ -pi half to pi half/.style={
+ @setup axes/.style={
+ @rad,
+ angle axis={min value=-1.570796326794897, max value=1.570796326794897},
+ @visualize zero=east,
+ @inner radius axes at={{0}{low},{1.570796326794897}{low},{-1.570796326794897}{high}},
+ @clean radius axes at={%
+ {-1.570796326794897}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {1.570796326794897}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ -90 to 90/.style={
+ @setup axes/.style={
+ angle axis={min value=-90, max value=90},
+ @degrees,
+ @visualize zero=east,
+ @inner radius axes at={{-90}{low},{0}{low},{90}{high}},
+ @clean radius axes at={%
+ {-90}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {90}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ right half/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at -90 and max at 90, ticks},
+ @visualize zero=east,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ right half clockwise/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 90 and max at -90, ticks},
+ @visualize zero=east,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{xshift=\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{xshift=-\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ %
+ % Left half
+ %
+ left half/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 90 and max at 270, ticks},
+ @visualize zero=west,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{xshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{xshift=\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ left half clockwise/.style={
+ @setup axes/.style={
+ angle axis={scaling=min at 270 and max at 90, ticks},
+ @visualize zero=west,
+ @inner radius axes at={{min}{low},{max}{high}},
+ @clean radius axes at={%
+ {min}{low}{high}{xshift=-\pgfkeysvalueof{/tikz/data visualization/angle axis/padding min}}{},%
+ {max}{high}{low}{xshift=\pgfkeysvalueof{/tikz/data
+ visualization/angle axis/padding max}}{options at=0 as
+ [{style={draw=none}, no tick text}]}
+ }
+ }
+ },
+ %
+ % Full circle
+ %
+ 0 to 2pi/.style={
+ @setup axes/.style={
+ angle axis={min value=0, max value=6.283185307179586},
+ @rad,
+ @visualize zero=north east,
+ @inner radius axes at={{0}{low},{1.570796326794897}{high},{3.141592653589793}{high},{4.71238898038469}{low}},
+ @clean radius axes at={{0}{low}{high}{}{}}
+ }
+ },
+ -pi to pi/.style={
+ @setup axes/.style={
+ angle axis={min value=-3.141592653589793, max value=3.141592653589793},
+ @rad,
+ @visualize zero=north east,
+ @inner radius axes at={{0}{low},{1.570796326794897}{high},{3.141592653589793}{high},{-1.57079632679489}{low}},
+ @clean radius axes at={{0}{low}{high}{}{}}
+ }
+ },
+ 0 to 360/.style={
+ @setup axes/.style={
+ angle axis={min value=0, max value=360},
+ @degrees,
+ @visualize zero=north east,
+ @inner radius axes at={{0}{low},{90}{high},{180}{high},{270}{low}},
+ @clean radius axes at={{0}{low}{high}{}{}}
+ }
+ },
+ -180 to 180/.style={
+ @setup axes/.style={
+ angle axis={min value=-180, max value=180},
+ @degrees,
+ @visualize zero=north east,
+ @inner radius axes at={{0}{low},{90}{high},{180}{high},{-90}{low}},
+ @clean radius axes at={{0}{low}{high}{}{}}
+ }
+ },
+}%
+
+
+
+
+%
+% Pie-charts -- still under construction...
+%
+
+\tikzset{
+ /tikz/data visualization/axis options/.cd,
+ percent/.style={\tikz@dv@axis/scaling=0 at 0 and 1 at 3.6},
+ full circle/.style={\tikz@dv@axis/scaling=min at 0 and max at 360},
+ half circle/.style={\tikz@dv@axis/scaling=min at 0 and max at 180},
+ quarter circle/.style={\tikz@dv@axis/scaling=min at 0 and max at 90}
+}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydatavisualization.sparklines.code.tex b/graphics/pgf/base/tex/tikzlibrarydatavisualization.sparklines.code.tex
new file mode 100644
index 0000000000..127b9805f2
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydatavisualization.sparklines.code.tex
@@ -0,0 +1,37 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarydatavisualization.sparklines.code.tex}
+
+\usetikzlibrary{datavisualization}%
+
+
+
+
+%
+% Sparklines (not yet usable...)
+%
+
+\tikzdatavisualizationset{
+ spark line/.style={
+ xy Cartesian,
+ x axis={
+ unit length={1pt}
+ },
+ y axis={
+ scaling={min at -0.2em and max at 0.8em}
+ },
+ new line plot,
+ every spark line plot/.try
+ }
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.code.tex
new file mode 100644
index 0000000000..4e61360ee3
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.code.tex
@@ -0,0 +1,192 @@
+% Copyright 2008 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.
+
+\usepgfmodule{decorations}%
+
+% Define the basic decoration stuff for tikz. Load more libraries to
+% "actually use" decorations
+
+\tikzset{decorate/.is if=tikz@decoratepath,
+ /pgf/decoration/name/.store in=\tikz@decoration@name,
+ /pgf/decoration/.unknown/.code=%
+ \pgfifdecoration{\pgfkeyscurrentname}{\edef\tikz@decoration@name{\pgfkeyscurrentname}}
+ {\pgfifmetadecoration{\pgfkeyscurrentname}{\edef\tikz@decoration@name{\pgfkeyscurrentname}}
+ {\pgfkeys{/errors/unknown
+ key={/pgf/decoration/\pgfkeyscurrentname}{#1}}}},%
+ /pgf/decoration/raise/.code={\def\tikz@dec@shift{\pgftransformyshift{#1}}\tikz@dec@trans},
+ /pgf/decoration/mirror/.code={%
+ \csname if#1\endcsname
+ \def\tikz@dec@mirror{\pgftransformyscale{-1}}%
+ \else%
+ \let\tikz@dec@mirror=\relax%
+ \fi%
+ \tikz@dec@trans%
+ },
+ /pgf/decoration/mirror/.default=true,
+ /pgf/decoration/transform/.code={%
+ {%
+ \pgftransformreset%
+ \def\tikz@transform{}%
+ \pgfkeysalso{/tikz/.cd, #1}%
+ \expandafter\gdef\expandafter\tikz@g@temptransform\expandafter{\tikz@transform}%
+ }%
+ \let\tikz@dec@user@transform=\tikz@g@temptransform%
+ \tikz@dec@trans%
+ },%
+ /pgf/decoration/pre/.initial=lineto,
+ /pgf/decoration/post/.initial=lineto,
+ /pgf/decoration/pre length/.initial=0pt,
+ /pgf/decoration/post length/.initial=0pt,
+}%
+
+\let\tikz@decoration@name=\tikz@nonetext
+
+\def\tikz@dec@trans{\pgfsetdecorationsegmenttransformation{\tikz@dec@user@transform\tikz@dec@mirror\tikz@dec@shift}}%
+\let\tikz@dec@user@transform=\relax
+\let\tikz@dec@shift=\relax
+\let\tikz@dec@mirror=\relax
+
+\pgfdeclaremetadecoration{tikz@internal}{pre}{%
+ \state{pre}[width=\pgfkeysvalueof{/pgf/decoration/pre length}, next state=main]
+ {
+ \tikz@dec@trans
+ \decoration{\pgfkeysvalueof{/pgf/decoration/pre}}
+ }%
+ \state{main}[width=\pgfmetadecoratedremainingdistance-\pgfkeysvalueof{/pgf/decoration/post length}, next state=final]
+ {
+ \tikz@dec@trans
+ \decoration{\tikz@decoration@name}
+ }%
+ \state{final}
+ {
+ \tikz@dec@trans
+ \decoration{\pgfkeysvalueof{/pgf/decoration/post}}
+ }%
+}%
+
+
+\newif\iftikz@metadecoration
+
+\def\tikz@lib@dec@addtomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}%
+
+\def\tikz@lib@decoration[#1]{%
+ \begingroup%
+ % Just to be on the save side...
+ %
+ % Now, let's parse the options:
+ \tikzset{#1}%
+ %
+ \ifx\tikz@decoration@name\tikz@nonetext%
+ % Ok, let's forget about this decoration stuff...
+ \else
+ \expandafter\tikz@lib@do@dec%
+ \fi%
+ % Now, we expect a brace.
+ \pgfutil@ifnextchar\bgroup{%
+ \begingroup%
+ \tikz@auto@end@pathfalse%
+ \aftergroup\tikz@enddecoration%
+ \afterassignment\tikz@scan@next@command%
+ \let\tikz@lib@next% gobble \bgroup%
+ }%
+ {%
+ \tikzerror{A decoration must begin with a brace}%
+ \tikz@enddecoration%
+ }%
+}%
+\def\tikz@lib@do@dec{%
+ % Ok, now what?
+ \pgfifmetadecoration{\tikz@decoration@name}%
+ {\expandafter\pgfmetadecoration\expandafter{\tikz@decoration@name}}%
+ {%
+ \pgfifdecoration{\tikz@decoration@name}%
+ {\tikz@lib@dec@startdecoration}%
+ {\tikzerror{Unknown (meta-)decoration '\tikz@decoration@name'. Perhaps you
+ misspelled it?}}%
+ }%
+ \ifx\pgfdecorateexistingpath\pgfutil@empty%
+ \pgfpathmoveto{\pgfqpoint{\the\tikz@lastxsaved}{\the\tikz@lastysaved}}%
+ \fi%
+}%
+\newbox\tikz@lib@dec@box
+\def\tikz@enddecoration{%
+ \global\setbox\tikz@lib@dec@box=\box\tikz@tempbox%
+ \ifx\tikz@decoration@name\tikz@nonetext%
+ % ignore this.
+ \else
+ % Ok, now what?
+ \iftikz@metadecoration%
+ \endpgfmetadecoration%
+ \else%
+ \tikz@lib@dec@stopdecoration%
+ \fi%
+ \fi
+ \endgroup%
+ \setbox\tikz@tempbox=\box\tikz@lib@dec@box%
+}%
+
+
+\def\tikz@lib@dec@decorate@path{%
+ \ifx\tikz@decoration@name\tikz@nonetext%
+ \else%
+ \pgfgetpath\tikz@lib@dec@currentpath%
+ \pgfsetpath\pgfutil@empty%
+ \pgfifmetadecoration{\tikz@decoration@name}
+ {
+ \expandafter\pgfmetadecoration\expandafter{\tikz@decoration@name}%
+ \pgfsetpath\tikz@lib@dec@currentpath%
+ \endpgfmetadecoration%
+ }
+ {
+ \pgfifdecoration{\tikz@decoration@name}
+ {
+ \tikz@lib@dec@startdecoration%
+ \pgfsetpath\tikz@lib@dec@currentpath%
+ \tikz@lib@dec@stopdecoration%
+ }
+ {
+ \tikzerror{Unknown (meta-)decoration '\tikz@decoration@name'. Perhaps
+ you misspelled it?}
+ }
+ }
+ \fi%
+}%
+
+\def\tikz@lib@dec@zpttext{0pt}%
+
+\newif\iftikz@lib@dec@temp
+\def\tikz@lib@dec@startdecoration{%
+ \pgfkeysgetvalue{/pgf/decoration/pre length}{\tikz@lib@pre}%
+ \pgfkeysgetvalue{/pgf/decoration/post length}{\tikz@lib@post}%
+ \tikz@lib@dec@tempfalse%
+ \ifx\tikz@lib@pre\tikz@lib@dec@zpttext%
+ \ifx\tikz@lib@post\tikz@lib@dec@zpttext%
+ \else%
+ \tikz@lib@dec@temptrue%
+ \fi%
+ \else%
+ \tikz@lib@dec@temptrue%
+ \fi%
+ \iftikz@lib@dec@temp%
+ \pgfmetadecoration{tikz@internal}%
+ \else%
+ \expandafter\pgfdecoration\expandafter{\expandafter{\tikz@decoration@name}{\pgfdecoratedpathlength}{}{}}%
+ \fi%
+}%
+
+\def\tikz@lib@dec@stopdecoration{%
+ \iftikz@lib@dec@temp%
+ \endpgfmetadecoration%
+ \else%
+ \endpgfdecoration%
+ \fi%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.footprints.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.footprints.code.tex
new file mode 100644
index 0000000000..fe42e8b09b
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.footprints.code.tex
@@ -0,0 +1,13 @@
+% Copyright 2008 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.footprints}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.fractals.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.fractals.code.tex
new file mode 100644
index 0000000000..9bd837911b
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.fractals.code.tex
@@ -0,0 +1,13 @@
+% Copyright 2008 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.fractals}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.markings.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.markings.code.tex
new file mode 100644
index 0000000000..23dcf61da7
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.markings.code.tex
@@ -0,0 +1,31 @@
+% Copyright 2008 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.markings}%
+
+% Upgrade \arrow command
+\def\pgf@lib@dec@doarrowhead{%
+ \pgfutil@ifnextchar[{\tikz@lib@dec@doarrowhead}{\tikz@lib@dec@doarrowhead[]}%]
+}%
+\def\tikz@lib@dec@doarrowhead[#1]#2{%
+ \scope[#1]
+ \pgf@lib@dec@arrowhead{1}{#2}%
+ \endscope
+}%
+\def\pgf@lib@dec@doarrowheadrev{%
+ \pgfutil@ifnextchar[{\tikz@lib@dec@doarrowheadrev}{\tikz@lib@dec@doarrowheadrev[]}%]
+}%
+\def\tikz@lib@dec@doarrowheadrev[#1]#2{%
+ \scope[#1]
+ \pgf@lib@dec@arrowhead{-1}{#2}%
+ \endscope
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.pathmorphing.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.pathmorphing.code.tex
new file mode 100644
index 0000000000..4d0eb26dd7
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.pathmorphing.code.tex
@@ -0,0 +1,13 @@
+% Copyright 2008 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.pathmorphing}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.pathreplacing.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.pathreplacing.code.tex
new file mode 100644
index 0000000000..cef15dcc5e
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.pathreplacing.code.tex
@@ -0,0 +1,36 @@
+% Copyright 2008 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.pathreplacing}%
+
+
+\def\tikz@lib@dec@installinputsegmentpoints{%
+ \pgf@process{\pgf@decorate@inputsegment@first}%
+ \edef\tikzinputsegmentfirst{\the\pgf@x,\the\pgf@y}%
+ %
+ \pgf@process{\pgf@decorate@inputsegment@last}%
+ \edef\tikzinputsegmentlast{\the\pgf@x,\the\pgf@y}%
+ %
+ \pgf@process{\pgf@decorate@inputsegment@supporta}%
+ \edef\tikzinputsegmentsupporta{\the\pgf@x,\the\pgf@y}%
+ %
+ \pgf@process{\pgf@decorate@inputsegment@supportb}%
+ \edef\tikzinputsegmentsupportb{\the\pgf@x,\the\pgf@y}%
+}%
+
+\pgfkeys{
+ /pgf/decoration/.cd,
+ moveto code/.code=\def\pgfdecoratedinputsegmentmovetocode{\tikz@lib@dec@installinputsegmentpoints#1},
+ lineto code/.code=\def\pgfdecoratedinputsegmentlinetocode{\tikz@lib@dec@installinputsegmentpoints#1},
+ curveto code/.code=\def\pgfdecoratedinputsegmentcurvetocode{\tikz@lib@dec@installinputsegmentpoints#1},
+ closepath code/.code=\def\pgfdecoratedinputsegmentclosepathcode{\tikz@lib@dec@installinputsegmentpoints#1}
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.shapes.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.shapes.code.tex
new file mode 100644
index 0000000000..e1ad8a5e12
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.shapes.code.tex
@@ -0,0 +1,13 @@
+% Copyright 2008 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.shapes}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarydecorations.text.code.tex b/graphics/pgf/base/tex/tikzlibrarydecorations.text.code.tex
new file mode 100644
index 0000000000..50b9ebcba6
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarydecorations.text.code.tex
@@ -0,0 +1,704 @@
+% Copyright 2013 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.
+
+\usetikzlibrary{decorations}%
+\usepgflibrary{decorations.text}%
+
+
+% Code for the `text effects along path' decoration
+
+% Some text constants
+% To do: merge these with existing text constants
+\def\tikz@lib@dec@te@space@text{space}%
+\def\tikz@lib@dec@align@left@text{left}%
+\def\tikz@lib@dec@align@right@text{right}%
+\def\tikz@lib@dec@align@center@text{center}%
+\def\tikz@lib@dec@te@none@text{none}%
+
+% Some ifs
+\newif\iftikz@lib@dec@te@pathfromtext%
+\newif\iftikz@lib@dec@te@segmentfromwidth%
+\newif\iftikz@lib@dec@te@scaletexttopath%
+\newif\iftikz@lib@dec@te@fittexttopath%
+\newif\iftikz@lib@dec@te@wordsep%
+\newif\iftikz@lib@dec@te@finalletter%
+
+
+% Utility macros
+% To do: integrate with existing pgf macros
+\def\tikz@lib@dec@te@addto@macro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}%
+
+\def\tikz@lib@dec@te@namelet#1#2{%
+ \expandafter\expandafter\expandafter\let\expandafter\expandafter\csname\expandafter#1\expandafter\endcsname\expandafter=\csname#2\endcsname%
+}%
+
+\def\tikz@lib@dec@te@advancecountmacro#1#2{%
+ \pgfutil@tempcnta=#1\relax%
+ \advance\pgfutil@tempcnta by#2\relax%
+ \edef#1{\the\pgfutil@tempcnta}%
+}%
+
+\def\tikz@lib@dec@te@advancedimenmacro#1#2{%
+ \pgf@x=#1\relax%
+ \advance\pgf@x by#2\relax%
+ \edef#1{\the\pgf@x}%
+}%
+
+% Macros for defining and updating text parameters
+\def\tikz@lib@dec@te@start@parameters#1{%
+ \expandafter\let\csname tikz@lib@dec@te@character@#1\endcsname=\pgfutil@empty%
+}%
+
+\def\tikz@lib@dec@te@addto@parameters#1#2{%
+ \expandafter\tikz@lib@dec@te@addto@macro\expandafter%
+ {\csname tikz@lib@dec@te@character@#1\endcsname}{#2}%
+}%
+\def\tikz@lib@dec@te@addmacroto@parameters#1#2{%
+ \def\tikz@lib@dec@te@marshal{\expandafter\tikz@lib@dec@te@addto@macro\expandafter%
+ {\csname tikz@lib@dec@te@character@#1\endcsname}}%
+ \expandafter\tikz@lib@dec@te@marshal\expandafter{\expandafter\def\expandafter#2\expandafter{#2}}%
+}%
+
+\def\tikz@lib@dec@te@getparameters#1{\csname tikz@lib@dec@te@character@#1\endcsname}%
+
+
+
+\let\tikz@lib@dec@te@textoptions=\pgfutil@empty
+\let\tikz@lib@dec@te@widthoptions=\pgfutil@empty
+\let\tikz@lib@dec@te@charactercountvar=\pgfutil@empty
+\let\tikz@lib@dec@te@charactertotalvar=\pgfutil@empty
+\let\tikz@lib@dec@te@lettercountvar=\pgfutil@empty
+\let\tikz@lib@dec@te@lettertotalvar=\pgfutil@empty
+\let\tikz@lib@dec@te@wordcountvar=\pgfutil@empty
+\let\tikz@lib@dec@te@wordctotalvar=\pgfutil@empty
+\let\tikz@lib@dec@te@transformtext=\pgfutil@empty%
+
+
+% Keys... lots of them...
+\pgfkeys{/pgf/decoration/text effects/.cd,
+ .unknown/.code={\let\tikz@lib@dec@te@key@tmp=\pgfkeyscurrentname%
+ \pgfkeysalso{/tikz/\tikz@lib@dec@te@key@tmp={#1}}},
+ path from text/.is if=tikz@lib@dec@te@pathfromtext,
+ path from text angle/.store in=\tikz@lib@dec@te@pathfromtextangle,
+ path from text angle=0,
+ fit text to path/.is if=tikz@lib@dec@te@fittexttopath,
+ characters/.style={/pgf/decoration/text effects/every character/.style={#1}},
+ characters/.append/.code={\pgfkeysalso{/pgf/decoration/text effects/every character/.append style={#1}}},
+ character widths/.code={\pgfkeysalso{/pgf/decoration/text effects/every character width/.style={#1}}},
+ character widths/.append/.code={\pgfkeysalso{/pgf/decoration/text effects/every character width/.append style={#1}}},
+ character count/.store in=\tikz@lib@dec@te@charactercountvar,
+ character count=,
+ character total/.store in=\tikz@lib@dec@te@charactertotalvar,
+ character total=,
+ letter count/.store in=\tikz@lib@dec@te@lettercountvar,
+ letter count=,
+ letter total/.store in=\tikz@lib@dec@te@lettertotalvar,
+ letter total=,
+ word count/.store in=\tikz@lib@dec@te@wordcountvar,
+ word count=,
+ word total/.store in=\tikz@lib@dec@te@wordtotalvar,
+ word total=,
+ %
+ style characters/.code args={#1 with #2}{\tikz@lib@dec@te@parse@stylecharacters{#1}{#2}},
+ text along path/.style={
+ inner xsep=0pt,
+ anchor=base,
+ transform shape
+ },
+ segment from width/.is if=tikz@lib@dec@te@segmentfromwidth,
+ segment from width=true,
+ word separator/.code={%
+ \def\tikz@lib@dec@te@tmp{#1}%
+ \ifx\tikz@lib@dec@te@tmp\tikz@lib@dec@te@space@text%
+ \let\tikz@lib@dec@te@wordsep=\tikz@lib@dec@te@spacetoken%
+ \else%
+ \def\tikz@lib@dec@te@wordsep{#1}
+ \fi},
+ word separator=space,
+ character command/.code={%
+ \def\tikz@lib@dec@te@tmp{#1}%
+ \ifx\tikz@lib@dec@te@tmp\pgfutil@empty%
+ \def\tikz@lib@dec@te@charactercommand{\tikz@lib@dec@te@charactertypesetonly}%
+ \else%
+ \def\tikz@lib@dec@te@charactercommand{#1}%
+ \fi%
+ },
+ character command=,
+ every character width/.style={/pgf/decoration/text effects/every character/.try},
+ every character/.style={},
+ reverse text/.code={\tikz@lib@dec@te@addto@macro\tikz@lib@dec@te@transformtext%
+ {\tikz@lib@dec@te@reversetext}},
+ group letters into words/.code={\tikz@lib@dec@te@addto@macro\tikz@lib@dec@te@transformtext%
+ {\tikz@lib@dec@te@groupletters}},
+ group letters/.code={\tikz@lib@dec@te@addto@macro\tikz@lib@dec@te@transformtext%
+ {\tikz@lib@dec@te@groupletters}},
+ replace characters/.code args={#1 with #2}{\tikz@lib@dec@te@parse@replacecharacters{#1}{#2}},
+ scale text to path/.is if=tikz@lib@dec@te@scaletexttopath,
+ fit text to path/.is if=tikz@lib@dec@te@fittexttopath,
+ repeat text/.store in=\tikz@lib@dec@te@repeattext,
+ repeat text/.default=-1,
+ repeat text=0,
+}%
+
+
+\def\tikz@lib@dec@te@charactertypesetonly#1{#1}%
+
+\tikzset{%
+ text effects/.code={\pgfkeysalso{/pgf/decoration/text effects/.cd,#1}},
+}%
+
+
+
+
+
+
+% Prepare the decoration text
+%
+% This sets up all the character/letter/word, counts/totals
+% and calculates the default width of the characters/text
+% (which may be modified later).
+%
+\def\tikz@lib@dec@te@preparetext{%
+ % Step 1: scan all the characters in the decoration text
+ \let\tikz@lib@dec@te@text=\pgfdecorationtext%
+ \tikz@lib@dec@te@scancharacters{%
+ \expandafter\let\csname tikz@lib@dec@te@character@\tikz@lib@dec@te@scancount @token\endcsname=%
+ \tikz@lib@dec@te@character%
+ }%
+ \let\tikz@lib@dec@te@charactertotalcount=\tikz@lib@dec@te@scancount%
+ % Step 2: reverse and/or group characters/letters.
+ \ifx\tikz@lib@dec@te@transformtext\pgfutil@empty%
+ \else%
+ \tikz@lib@dec@te@transformtext%
+ \fi%
+ % Step 3: get the character/letter/word counts
+ \def\tikz@lib@dec@te@charactercount{0}%
+ \def\tikz@lib@dec@te@wordcount{0}%
+ \def\tikz@lib@dec@te@wordsepcount{0}%
+ \def\tikz@lib@dec@te@lettercount{0}%
+ \def\tikz@lib@dec@te@lastcharacter{0}%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount%
+ \ifnum\tikz@lib@dec@te@lettercount>0\relax%
+ \tikz@lib@dec@te@addto@parameters{\tikz@lib@dec@te@lastcharactercount}{\tikz@lib@dec@te@finallettertrue}%
+ \fi
+ \else%
+ \expandafter\let\expandafter\tikz@lib@dec@te@character\expandafter=\csname tikz@lib@dec@te@character@\pgfmathcounter @token\endcsname%
+ \tikz@lib@dec@te@advancecountmacro{\tikz@lib@dec@te@charactercount}{1}%
+ \tikz@lib@dec@te@start@parameters{\tikz@lib@dec@te@charactercount}%
+ \tikz@lib@dec@te@addmacroto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@charactercount}%
+ \ifx\tikz@lib@dec@te@character\tikz@lib@dec@te@wordsep%
+ \tikz@lib@dec@te@advancecountmacro{\tikz@lib@dec@te@wordsepcount}{1}%
+ \ifnum\tikz@lib@dec@te@lettercount>0\relax%
+ \tikz@lib@dec@te@addto@parameters{\tikz@lib@dec@te@lastcharactercount}{\tikz@lib@dec@te@finallettertrue}%
+ \fi
+ \def\tikz@lib@dec@te@lettercount{0}%
+ \tikz@lib@dec@te@addto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@wordseptrue}%
+ \else
+ \ifnum\tikz@lib@dec@te@lettercount=0\relax%
+ \tikz@lib@dec@te@advancecountmacro\tikz@lib@dec@te@wordcount{1}%
+ \fi%
+ \tikz@lib@dec@te@addto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@finalletterfalse}%
+ \tikz@lib@dec@te@advancecountmacro{\tikz@lib@dec@te@lettercount}{1}%
+ \tikz@lib@dec@te@addto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@wordsepfalse}%
+ \expandafter\let\csname tikz@lib@dec@te@word \tikz@lib@dec@te@wordcount @lettercount\endcsname=\tikz@lib@dec@te@lettercount%
+ \fi%
+ \tikz@lib@dec@te@addmacroto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@lettercount}%
+ \tikz@lib@dec@te@addmacroto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@wordcount}%
+ \tikz@lib@dec@te@addmacroto@parameters{\tikz@lib@dec@te@charactercount}{\tikz@lib@dec@te@character}%
+ \let\tikz@lib@dec@te@lastcharactercount=\pgfmathcounter%
+ \repeatpgfmathloop%
+ \let\tikz@lib@dec@te@wordtotal=\tikz@lib@dec@te@wordcount%
+ % Step 4: add character/letter/word totals
+ \pgfmathloop
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount%
+ \else%
+ \tikz@lib@dec@te@addmacroto@parameters{\pgfmathcounter}{\tikz@lib@dec@te@charactertotalcount}%
+ \tikz@lib@dec@te@addmacroto@parameters{\pgfmathcounter}{\tikz@lib@dec@te@wordtotal}%
+ \expandafter\let\expandafter\tikz@lib@dec@te@lettertotalcount\expandafter=\csname tikz@lib@dec@te@word \tikz@lib@dec@te@wordcount @lettercount\endcsname%
+ \tikz@lib@dec@te@addmacroto@parameters{\pgfmathcounter}{\tikz@lib@dec@te@lettertotalcount}%
+ \repeatpgfmathloop%
+ % Step 5: calculate the the text and character width
+ % but do not add to the parameters yet.
+ \def\tikz@lib@dec@te@textwidth{0pt}%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount%
+ \else%
+ \def\tikz@lib@dec@te@characterwidth{0pt}%
+ \tikz@lib@dec@te@getcharacterwidth{\pgfmathcounter}%
+ \expandafter\let\csname tikz@lib@dec@te@character@\pgfmathcounter @width\endcsname=\tikz@lib@dec@te@characterwidth%
+ \pgf@x=\tikz@lib@dec@te@characterwidth\relax%
+ \pgf@x=0.5\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\pgfmathcounter @prewidth\endcsname{\the\pgf@x}%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\pgfmathcounter @postwidth\endcsname{\the\pgf@x}%
+ \tikz@lib@dec@te@advancedimenmacro{\tikz@lib@dec@te@textwidth}{\tikz@lib@dec@te@characterwidth}%
+ \repeatpgfmathloop%
+}%
+
+% Does the category code of the space matter?
+\def\tikz@lib@dec@te@spacetoken{ }%
+
+\let\tikz@lib@dec@te@wordsep=\tikz@lib@dec@te@spacetoken
+
+
+% Scan and count the characters in \tikz@lib@dec@te@text
+%
+% Create macros \tikz@lib@dec@te@character@<n>@token containing
+% the nth character.
+%
+% Total number of characters is store in
+% \tikz@lib@dec@te@chractertotal@count
+%
+\def\tikz@lib@dec@te@scancharacters#1{%
+ \def\tikz@lib@dec@te@@@scancharacters@process{#1}%
+ \def\tikz@lib@dec@te@scancount{0}%
+ \expandafter\tikz@lib@dec@te@@scancharacters\tikz@lib@dec@te@text\tikz@lib@dec@te@scancharacters}%
+
+\def\tikz@lib@dec@te@@scancharacters{%
+ \futurelet\tikz@lib@dec@te@token\tikz@lib@dec@te@@@scancharacters}%
+
+\def\tikz@lib@dec@te@@@scancharacters{%
+ \ifx\tikz@lib@dec@te@token\tikz@lib@dec@te@scancharacters%
+ \let\tikz@lib@dec@te@next=\tikz@lib@dec@te@@@@scancharacters%
+ \else%
+ \tikz@lib@dec@te@advancecountmacro\tikz@lib@dec@te@scancount{1}%
+ \ifx\tikz@lib@dec@te@token\pgfutil@sptoken%
+ \let\tikz@lib@dec@te@next=\tikz@lib@dec@te@@@scancharacters@space%
+ \else%
+ \ifx\tikz@lib@dec@te@token\bgroup%
+ \let\tikz@lib@dec@te@next=\tikz@lib@dec@te@@@scancharacters@bgroup%
+ \else%
+ \let\tikz@lib@dec@te@next=\tikz@lib@dec@te@@@scancharacters@normal%
+ \fi%
+ \fi%
+ \fi%
+ \tikz@lib@dec@te@next%
+}%
+
+\def\tikz@lib@dec@te@@@scancharacters@space{%
+ \let\tikz@lib@dec@te@character=\tikz@lib@dec@te@spacetoken%
+ \tikz@lib@dec@te@@@scancharacters@process%
+ \pgfutil@ifnextchar x\tikz@lib@dec@te@@scancharacters\tikz@lib@dec@te@@scancharacters%
+}%
+
+\def\tikz@lib@dec@te@@@scancharacters@bgroup#1{%
+ \def\tikz@lib@dec@te@character{{#1}}%
+ \tikz@lib@dec@te@@@scancharacters@process%
+ \tikz@lib@dec@te@@scancharacters%
+}%
+
+\def\tikz@lib@dec@te@@@scancharacters@normal#1{%
+ \def\tikz@lib@dec@te@character{#1}%
+ \tikz@lib@dec@te@@@scancharacters@process%
+ \tikz@lib@dec@te@@scancharacters%
+}%
+
+
+\def\tikz@lib@dec@te@@@@scancharacters#1\tikz@lib@dec@te@scancharacters{}%
+
+
+% Reverse the order of the scanned characters in the text
+% (Actually reverse the ordering of the macros containing the characters)
+\def\tikz@lib@dec@te@reversetext{%
+ \c@pgf@counta=\tikz@lib@dec@te@charactertotalcount%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\c@pgf@counta%
+ \else%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@tmp}{tikz@lib@dec@te@character@\pgfmathcounter @token}%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@character@\pgfmathcounter @token}{tikz@lib@dec@te@character@\the\c@pgf@counta @token}%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@character@\the\c@pgf@counta @token}{tikz@lib@dec@te@tmp}%
+ \advance\c@pgf@counta by-1\relax%
+ \repeatpgfmathloop%
+}%
+
+% Group letters (i.e., anything that isn't the word separator)
+% as single characters (words).
+\def\tikz@lib@dec@te@groupletters{%
+ \c@pgf@counta=0\relax%
+ \let\tikz@lib@dec@te@tmp=\pgfutil@empty%
+ \let\tikz@lib@dec@te@@tmp=\pgfutil@empty%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount%
+ \ifx\tikz@lib@dec@te@@tmp\pgfutil@empty%
+ \else%
+ \advance\c@pgf@counta by1\relax%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@character@\the\c@pgf@counta @token}{tikz@lib@dec@te@@tmp}%
+ \fi%
+ \else%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@tmp}{tikz@lib@dec@te@character@\pgfmathcounter @token}%
+ \ifx\tikz@lib@dec@te@tmp\tikz@lib@dec@te@wordsep%
+ \advance\c@pgf@counta by1\relax%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@character@\the\c@pgf@counta @token}{tikz@lib@dec@te@@tmp}%
+ \let\tikz@lib@dec@te@@tmp=\pgfutil@empty%
+ \advance\c@pgf@counta by1\relax%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@character@\the\c@pgf@counta @token}{tikz@lib@dec@te@wordsep}%
+ \else%
+ \expandafter\tikz@lib@dec@te@addto@macro\expandafter{\expandafter\tikz@lib@dec@te@@tmp\expandafter}\expandafter{\tikz@lib@dec@te@tmp}%
+ \fi%
+ \repeatpgfmathloop%
+ \edef\tikz@lib@dec@te@charactertotalcount{\the\c@pgf@counta}%
+}%
+
+
+% Get width of node containing only the current character.
+\def\tikz@lib@dec@te@getcharacterwidth#1{%
+ \csname tikz@lib@dec@te@character@#1\endcsname%
+ \tikz@lib@dec@te@getoptions{every character width/.try}%
+ \let\tikz@lib@dec@te@lastcharacterwidth=\tikz@lib@dec@te@characterwidth%
+ \pgfpositionnodelater\tikz@lib@dec@te@@getcharacterwidth%
+ \pgfutil@ifundefined{tikz@lib@dec@te@character@replacements@\meaning\tikz@lib@dec@te@character @code}{%
+ \expandafter\node\expandafter[\tikz@lib@dec@te@options,scale=\tikz@lib@dec@scaledcharacterwidthfactor]%
+ {\hbox{\tikz@lib@dec@te@charactercommand{\tikz@lib@dec@te@character}}};%
+ \let\tikz@lib@dec@te@characterwidth=\tikz@lib@dec@te@characterwidth@tmp%
+ }{%
+ \tikz@lib@dec@te@getcharacter@replacementwidth{\tikz@lib@dec@te@character}%
+ \let\tikz@lib@dec@te@characterwidth=\tikz@lib@dec@te@character@replacementwidth%
+ }%
+}%
+
+% Update the character parameters with the widths.
+\def\tikz@lib@dec@te@addwidthstoparameters{%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount%
+ \else%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@characterwidth}{tikz@lib@dec@te@character@\pgfmathcounter @width}%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@characterprewidth}{tikz@lib@dec@te@character@\pgfmathcounter @prewidth}%
+ \tikz@lib@dec@te@namelet{tikz@lib@dec@te@characterpostwidth}{tikz@lib@dec@te@character@\pgfmathcounter @postwidth}%
+ \tikz@lib@dec@te@addmacroto@parameters{\pgfmathcounter}{\tikz@lib@dec@te@characterwidth}%
+ \tikz@lib@dec@te@addmacroto@parameters{\pgfmathcounter}{\tikz@lib@dec@te@characterprewidth}%
+ \tikz@lib@dec@te@addmacroto@parameters{\pgfmathcounter}{\tikz@lib@dec@te@characterpostwidth}%
+ \repeatpgfmathloop%
+}%
+
+% Get the options to applied to a character node.
+
+\def\tikz@lib@dec@te@addoptions#1{%
+ \expandafter\def\expandafter\tikz@lib@dec@te@options\expandafter{\tikz@lib@dec@te@options,#1}%
+}%
+
+\def\tikz@lib@dec@te@getoptions#1{%
+ \let\tikz@lib@dec@te@lastcharactercommand=\tikz@lib@dec@te@charactercommand%
+ \def\tikz@lib@dec@te@options{/pgf/decoration/text effects/.cd}%
+ \tikz@lib@dec@te@addoptions{#1}%
+ \let\tikzdecorationcharactercount=\tikz@lib@dec@te@charactercount%
+ \let\tikzdecorationcharactertotal=\tikz@lib@dec@te@charactertotalcount%
+ \let\tikzdecorationlettercount=\tikz@lib@dec@te@lettercount%
+ \let\tikzdecorationlettertotal=\tikz@lib@dec@te@lettertotalcount%
+ \let\tikzdecorationwordcount=\tikz@lib@dec@te@wordcount%
+ \let\tikzdecorationwordtotal=\tikz@lib@dec@te@wordtotal%
+ \let\tikzdecorationcharacter=\tikz@lib@dec@te@character%
+ %
+ % Define the count variables (if required)
+ \ifx\tikz@lib@dec@te@charactercountvar\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@lib@dec@te@charactercountvar=\tikz@lib@dec@te@charactercount%
+ \fi%
+ %
+ \ifx\tikz@lib@dec@te@charactertotalvar\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@lib@dec@te@charactertotalvar=\tikz@lib@dec@te@charactertotalcount%
+ \fi%
+ %
+ \ifx\tikz@lib@dec@te@wordcountvar\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@lib@dec@te@wordcountvar=\tikz@lib@dec@te@wordcount%
+ \fi%
+ %
+ \ifx\tikz@lib@dec@te@wordtotalvar\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@lib@dec@te@wordtotalvar=\tikz@lib@dec@te@wordtotal%
+ \fi%
+ %
+ \ifx\tikz@lib@dec@te@lettercountvar\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@lib@dec@te@lettercountvar=\tikz@lib@dec@te@lettercount%
+ \fi%
+ %
+ \ifx\tikz@lib@dec@te@lettertotalvar\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@lib@dec@te@lettertotalvar=\tikz@lib@dec@te@lettetotal%
+ \fi%
+ %
+ \edef\tikz@lib@dec@te@tmp{character \tikz@lib@dec@te@charactercount/.try,%
+ character {\meaning\tikz@lib@dec@te@character}/.try}%
+ \expandafter\tikz@lib@dec@te@addoptions\expandafter{\tikz@lib@dec@te@tmp}%
+ \ifx\tikz@lib@dec@te@character\tikz@lib@dec@te@wordsep%
+ \tikz@lib@dec@te@addoptions{/pgf/decoration/text effects/every word separator/.try}%
+ \else%
+ \ifnum\tikz@lib@dec@te@wordcount>0\relax%
+ \edef\tikz@lib@dec@te@tmp{every word/.try, word \tikz@lib@dec@te@wordcount/.try}%
+ \expandafter\tikz@lib@dec@te@addoptions\expandafter{\tikz@lib@dec@te@tmp}%
+ \ifnum\tikz@lib@dec@te@lettercount>0\relax%
+ \edef\tikz@lib@dec@te@tmp{every letter/.try,every \tikz@lib@dec@te@lettercount\space letter/.try}%
+ \expandafter\tikz@lib@dec@te@addoptions\expandafter{\tikz@lib@dec@te@tmp}%
+ \ifnum\tikz@lib@dec@te@lettercount=1\relax%
+ \edef\tikz@lib@dec@te@tmp{every first letter/.try}%
+ \expandafter\tikz@lib@dec@te@addoptions\expandafter{\tikz@lib@dec@te@tmp}%
+ \fi%
+ \iftikz@lib@dec@te@finalletter%
+ \tikz@lib@dec@te@addoptions{every final letter/.try}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+% Called by `late positioning' of the node
+% to get the width of the bounding box
+% of a character.
+\def\tikz@lib@dec@te@@getcharacterwidth{%
+ \iftikz@lib@dec@te@segmentfromwidth%
+ \pgf@x=\pgfpositionnodelatermaxx\relax%
+ \advance\pgf@x by-\pgfpositionnodelaterminx\relax%
+ \else%
+ \pgf@x=\pgfpositionnodelatermaxy\relax%
+ \advance\pgf@x by-\pgfpositionnodelaterminy\relax%
+ \fi%
+ \xdef\tikz@lib@dec@te@characterwidth@tmp{\the\pgf@x}%
+}%
+
+
+\def\tikz@lib@dec@te@drawcharacter{%
+ \csname tikz@lib@dec@te@character@\tikz@lib@dec@te@charactercount\endcsname%
+ \tikz@lib@dec@te@getoptions{every character/.try}%
+ \pgfpositionnodelater\relax%
+ \pgfutil@ifundefined{tikz@lib@dec@te@character@replacements@\meaning\tikz@lib@dec@te@character @code}{%
+ \expandafter\node\expandafter[\tikz@lib@dec@te@options, scale=\tikz@lib@dec@scaledcharacterwidthfactor]{\hbox{\tikz@lib@dec@te@charactercommand{\tikz@lib@dec@te@character}}};%
+ }{\tikz@lib@dec@te@drawcharacter@replacement{\tikz@lib@dec@te@character}}%
+}%
+
+% Replace the character #1 with a character@replacement
+%
+\def\tikz@lib@dec@te@drawcharacter@replacement#1{%
+ \pgfscope%
+ \expandafter\tikzset\expandafter{\tikz@lib@dec@te@options}%
+ \csname tikz@lib@dec@te@character@replacements@\meaning#1@code\endcsname%
+ \endpgfscope%
+}%
+
+% Get the width of the character@replacement associated with
+% the character #1
+%
+\newbox\tikz@lib@dec@te@box
+\def\tikz@lib@dec@te@getcharacter@replacementwidth#1{%
+ \pgfinterruptpicture%
+ \setbox\tikz@lib@dec@te@box=\hbox{%
+ \pgfpicture
+ \expandafter\tikzset\expandafter{\tikz@lib@dec@te@options}%
+ \csname tikz@lib@dec@te@character@replacements@\meaning#1@code\endcsname%
+ \endpgfpicture}%
+ \xdef\tikz@lib@dec@te@character@replacementwidth{\the\wd\tikz@lib@dec@te@box}%
+ \endpgfinterruptpicture%
+}%
+
+\def\tikz@lib@dec@scaledcharacterwidthfactor{1}%
+
+% Set up the decoration
+\def\tikz@lib@dec@te@state@setup@precomputation{%
+ \def\tikz@lib@te@alignshift{0pt}%
+ \iftikz@lib@dec@te@pathfromtext%
+ % The width of the text and characters has already been calculated.
+ \else%
+ \let\tikz@lib@dec@te@text=\pgfdecorationtext%
+ % Get the character tokens and the total number of characters.
+ \tikz@lib@dec@te@preparetext%
+ \iftikz@lib@dec@te@scaletexttopath%
+ % OK, *scaling* text to path is easy.
+ % Simply divide the path length by the text width to
+ % obtain the scaling factor which will be applied
+ % "at the last minute"...
+ \pgfmathdivide{\pgfdecoratedpathlength}{\tikz@lib@dec@te@textwidth}%
+ \let\tikz@lib@dec@scaledcharacterwidthfactor=\pgfmathresult%
+ \expandafter\pgfkeys\expandafter{\tikz@lib@dec@te@tmp}%
+ % ... and recalculate the (pre and post) widths.
+ \pgfmathloop
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount%
+ \else%
+ \pgf@x=\csname tikz@lib@dec@te@character@\pgfmathcounter @prewidth\endcsname\relax%
+ \pgf@x=\tikz@lib@dec@scaledcharacterwidthfactor\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\pgfmathcounter @prewidth\endcsname{\the\pgf@x}%
+ %
+ \pgf@x=\csname tikz@lib@dec@te@character@\pgfmathcounter @postwidth\endcsname\relax%
+ \pgf@x=\tikz@lib@dec@scaledcharacterwidthfactor\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\pgfmathcounter @postwidth\endcsname{\the\pgf@x}%
+ \repeatpgfmathloop%
+ % Update parameters with thewidths.
+ \tikz@lib@dec@te@addwidthstoparameters%
+ \let\tikz@lib@dec@te@textwidth=\pgfdecoratedpathlength%
+ \else%
+ \iftikz@lib@dec@te@fittexttopath%
+ % *Fitting* text is less easy.
+ % The pre and post width of all except the first and last characters
+ % must be recalculated.
+ % Only the post width of the first character and the pre width
+ % of the final character are scaled as these characters should be
+ % fixed and the start and end of the path, respectively.
+ %
+ % We hope that the decoration engine is accurate enough to position
+ % the last word correctly.
+ \pgf@x=\pgfdecoratedpathlength%
+ \pgf@xa=\csname tikz@lib@dec@te@character@1@postwidth\endcsname\relax%
+ \pgf@xb=\csname tikz@lib@dec@te@character@\tikz@lib@dec@te@charactertotalcount @prewidth\endcsname\relax%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@x by-\pgf@xb%
+ \pgf@y=\tikz@lib@dec@te@textwidth\relax%
+ \advance\pgf@y by-\pgf@xa%
+ \advance\pgf@y by-\pgf@xb%
+ %
+ \pgfmathdivide{\the\pgf@x}{\the\pgf@y}%
+ \let\tikz@lib@dec@characterwidthscale=\pgfmathresult%
+ \pgfmathloop
+ \ifnum\pgfmathcounter>\tikz@lib@dec@te@charactertotalcount\relax%
+ \else%
+ \ifnum\pgfmathcounter>1\relax%
+ \pgf@x=\csname tikz@lib@dec@te@character@\pgfmathcounter @prewidth\endcsname\relax%
+ \pgf@x=\tikz@lib@dec@characterwidthscale\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\pgfmathcounter @prewidth\endcsname{\the\pgf@x}%
+ \fi%
+ \ifnum\pgfmathcounter<\tikz@lib@dec@te@charactertotalcount\relax%
+ \pgf@x=\csname tikz@lib@dec@te@character@\pgfmathcounter @postwidth\endcsname\relax%
+ \pgf@x=\tikz@lib@dec@characterwidthscale\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\pgfmathcounter @postwidth\endcsname{\the\pgf@x}%
+ \fi%
+ \repeatpgfmathloop%
+ % Update parameters with widths.
+ \tikz@lib@dec@te@addwidthstoparameters%
+ \let\tikz@lib@dec@te@textwidth=\pgfdecoratedpathlength%
+ \else%
+ % Calculate the distance to move along the path for alignment.
+ \pgfkeysgetvalue{/pgf/decoration/text align/align}{\tikz@lib@dec@align}%
+ \ifx\tikz@lib@dec@align\tikz@lib@dec@align@center@text%
+ \pgf@x=\pgfdecoratedpathlength\relax%
+ \advance\pgf@x by-\tikz@lib@dec@te@textwidth\relax%
+ \ifdim\pgf@x<0pt\relax%
+ \pgf@x=0pt\relax%
+ \fi%
+ \divide\pgf@x by2\relax%
+ % Adjust the pre-width of the first character...
+ \pgf@xa=\csname tikz@lib@dec@te@character@1@prewidth\endcsname\relax%
+ \advance\pgf@xa by\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@1@prewidth\endcsname{\the\pgf@xa}%
+ % ...and the post-width of the last character.
+ \pgf@xa=\csname tikz@lib@dec@te@character@\tikz@lib@dec@te@charactertotalcount @postwidth\endcsname\relax%
+ \advance\pgf@xa by\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@\tikz@lib@dec@te@charactertotalcount @postwidth\endcsname{\the\pgf@xa}%
+ \else%
+ \ifx\tikz@lib@dec@align\tikz@lib@dec@align@right@text%
+ \pgf@x=\pgfdecoratedpathlength\relax%
+ \advance\pgf@x by-\tikz@lib@dec@te@textwidth\relax%
+ \ifdim\pgf@x<0pt\relax%
+ \pgf@x=0pt\relax%
+ \fi%
+ % Adjust the pre-width of the first character...
+ \pgf@xa=\csname tikz@lib@dec@te@character@1@prewidth\endcsname\relax%
+ \advance\pgf@xa by\pgf@x%
+ \expandafter\edef\csname tikz@lib@dec@te@character@1@prewidth\endcsname{\the\pgf@xa}%
+ \fi%
+ \fi%
+ \tikz@lib@dec@te@addwidthstoparameters%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+
+% Evil hack into the decoration code.
+%
+% If the path contains single move to and the `path from text'
+% key is set to true. The width of the text is calculated here
+% and the (straight line) path automatically calculated.
+%
+\def\pgf@decorate@path@check@moveto#1{%
+ \expandafter\pgf@decorate@path@@check@moveto#1\pgf@decorate@stop\pgf@decorate@@stop}%
+
+\def\pgf@decorate@token@stop{\pgf@decorate@stop}%
+\def\pgf@decorate@path@@check@moveto#1#2#3#4\pgf@decorate@@stop#5#6{%
+ \def\pgf@decorate@temp{#4}%
+ \pgf@x=#2\relax%
+ \pgf@y=#3\relax%
+ \ifx\pgf@decorate@temp\pgf@decorate@token@stop%
+ \iftikz@lib@dec@te@pathfromtext%
+ % Get the start position...
+ \pgfextract@process\tikz@lib@dec@te@pathstart{}%
+ \tikz@lib@dec@te@preparetext%
+ \tikz@lib@dec@te@addwidthstoparameters%
+ % ... and create a lineto path of the correct length.
+ \pgfsetpath\pgfutil@empty%
+ \pgfpathmoveto{\tikz@lib@dec@te@pathstart}%
+ \pgfpathlineto{\pgfpointadd{\tikz@lib@dec@te@pathstart}%
+ {\pgfpointpolar{\tikz@lib@dec@te@pathfromtextangle}{\tikz@lib@dec@te@textwidth}}}%
+ \pgfgetpath\pgfdecoratedpath%
+ \pgfsetpath\pgfutil@empty%
+ \else%
+ #5%
+ \fi%
+ \else%
+ \tikz@lib@dec@te@pathfromtextfalse%
+ #6%
+ \fi%
+}%
+
+
+\pgfdeclaredecoration{text effects along path}{setup}{%
+ \state{setup}[width=+0pt, next state=scan, persistent precomputation={%
+ \tikz@lib@dec@te@state@setup@precomputation%
+ \def\tikz@lib@dec@te@charactercount{0}%
+ }]{}%
+ %
+\state{scan}[width=+0pt, next state=pre token, persistent precomputation={%
+ \tikz@lib@dec@te@advancecountmacro\tikz@lib@dec@te@charactercount{1}%
+ % Usual switch to final state is based on distance.
+ % Here we also need it to be on the number of the
+ % current character.
+ \ifnum\tikz@lib@dec@te@charactercount>\tikz@lib@dec@te@charactertotalcount\relax%
+ \ifnum\tikz@lib@dec@te@repeattext=0\relax%
+ \def\pgf@decorate@next@state{final}%
+ \else%
+ \tikz@lib@dec@te@advancecountmacro\tikz@lib@dec@te@repeattext{-1}%
+ \def\tikz@lib@dec@te@charactercount{1}%
+ \fi%
+ \fi%
+ % Install parameters for this character.
+ \csname tikz@lib@dec@te@character@\tikz@lib@dec@te@charactercount\endcsname%
+}]{}%
+%
+\state{pre token}[width=+\tikz@lib@dec@te@characterprewidth, next state=token]{}%
+\state{token}[width=+0pt, next state=post token]
+{%
+ \tikz@lib@dec@te@drawcharacter%
+}%
+\state{post token}[width=+\tikz@lib@dec@te@characterpostwidth, next state=scan]{}%
+}%
+
+
+% Parse styles for individual characters
+% #1 a string of characters (e.g., aieou{\"U}{\"a"})
+% #2 the options for to apply to each character.
+%
+\def\tikz@lib@dec@te@parse@stylecharacters#1#2{%
+ \def\tikz@lib@dec@te@text{#1}%
+ \tikz@lib@dec@te@scancharacters{%
+ \pgfkeysalso{/pgf/decoration/text effects/character {\meaning\tikz@lib@dec@te@character}/.style={#2}}%
+ }%
+}%
+
+% Parse replacement code for for individual characters
+% #1 a string of characters (e.g., aieou{\"U}{\"a"})
+% #2 the code to execute to each character.
+%
+\def\tikz@lib@dec@te@parse@replacecharacters#1#2{%
+ \def\tikz@lib@dec@te@text{#1}%
+ \tikz@lib@dec@te@scancharacters{%
+ \expandafter\def\csname tikz@lib@dec@te@character@replacements@\meaning\tikz@lib@dec@te@character @code\endcsname{#2}%
+ }%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryer.code.tex b/graphics/pgf/base/tex/tikzlibraryer.code.tex
new file mode 100644
index 0000000000..a2a80a5f49
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryer.code.tex
@@ -0,0 +1,40 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryer.code.tex}
+
+\usetikzlibrary{shapes.geometric}%
+
+% Styles for entity types:
+
+\tikzset{every entity/.style= {}}%
+\tikzset{entity/.style= {rectangle,draw,
+ minimum height=2\baselineskip,
+ minimum width=4\baselineskip,every entity}}%
+
+
+% Styles for relationship types:
+
+\tikzset{every relationship/.style= {}}%
+\tikzset{relationship/.style= {diamond,draw,
+ minimum size=1.5\baselineskip,
+ inner sep=1pt,
+ every relationship}}%
+
+
+% Styles for relationship types:
+
+\tikzset{every attribute/.style= {}}%
+\tikzset{attribute/.style= {minimum size=1.5\baselineskip,ellipse,draw,every attribute}}%
+\tikzset{key attribute/.style= {font=\itshape,attribute}}%
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryexternal.code.tex b/graphics/pgf/base/tex/tikzlibraryexternal.code.tex
new file mode 100644
index 0000000000..dc1fc05b93
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryexternal.code.tex
@@ -0,0 +1,107 @@
+% Copyright 2008 by Christian Feuersaenger
+%
+% 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.
+%
+%
+% This file provides a high-level automatic export feature for tikz pictures.
+% It allows to export EACH SINGLE FIGURE into a separate PDF.
+%
+% The simplest way is to use
+%
+% \tikzexternalize{myarticle}
+%
+% it simply converts every figure using the write18 method. If that is not possible,
+% you need to reconfigure \tikzexternalize: it can generate a list of figure file names
+% and you need to generate these figures manually (or with a script).
+%
+% It replaces \tikzpicture/ \endtikzpicture and \tikz and invokes \beginpgfgraphicnamed ... \endpgfgraphicnamed
+% commands if necessary.
+
+% load this package in order to get \pdf@mdfivesum .
+% \pdf@mdfivesum is available for pdftex and lualatex and computes the
+% md5 sum. Note that pdftex has \pdfmdfivesum, but lualatex does not
+% have it.
+%
+% ... also used for \pdf@shellescape.
+\usepackage{pdftexcmds}
+\pgfutil@IfFileExists{atveryend.sty}{%
+ \usepackage{atveryend}%
+}{%
+ \message{! Package tikz Warning: \string\usepackage{atveryend} impossible. Automatic resolving of references within external files impossible.}%
+}%
+
+% source generic implementation:
+\input tikzexternalshared.code.tex
+
+\pgfutil@IfUndefined{pdf@mdfivesum}{}{%
+ \let\tikzexternal@mdfivesum=\pdf@mdfivesum
+}%
+
+\def\tikzexternal@TEXDIALECT@begpicture{\begin{tikzpicture}}
+\def\tikzexternal@TEXDIALECT@endpicture{\end{tikzpicture}}%
+
+% this latex specific this assumes it starts at the beginning of an
+% environment. The environment is named
+% '\tikzexternal@laTeX@collect@until@end@tikzpicturetikzpicturestring'.
+%
+% Everything up to \end{<name>} will be collected and passed as
+% argument to the macro '#1'.
+%
+% This does also work if <name> is NOT tikzpicture!
+\def\tikzexternal@TEXDIALECT@collectpicture#1{%
+ \begingroup
+ \t@tikzexternal@tmpa={}%
+ \tikzexternal@laTeX@collect@until@end@tikzpicture{#1}%
+}
+
+% Loop until we find '\end{tikzpicture}'. We have to make sure that
+% even strings like '#1' are allowed inside of the collected argument.
+\long\def\tikzexternal@laTeX@collect@until@end@tikzpicture#1#2\end#3{%
+ \def\tikzexternal@laTeX@collect@until@end@tikzpicture@{#3}%
+ \ifx\tikzexternal@laTeX@collect@until@end@tikzpicture@\tikzexternal@laTeX@collect@until@end@tikzpicturetikzpicturestring
+ \t@tikzexternal@tmpa=\expandafter{\the\t@tikzexternal@tmpa #2}%
+ \edef\tikzexternal@TEXDIALECT@collectpicture@next{%
+ \noexpand\endgroup
+ \noexpand#1{\the\t@tikzexternal@tmpa}%
+ }%
+ \t@tikzexternal@tmpa={}% release memory.
+ \else
+ \t@tikzexternal@tmpa=\expandafter{\the\t@tikzexternal@tmpa #2\end{#3}}%
+ \def\tikzexternal@TEXDIALECT@collectpicture@next{%
+ \tikzexternal@laTeX@collect@until@end@tikzpicture{#1}}%
+ \fi
+ \tikzexternal@TEXDIALECT@collectpicture@next
+}%
+\def\tikzexternal@laTeX@collect@until@end@tikzpicturetikzpicturestring{tikzpicture}%
+
+\def\tikzexternal@handle@landscape{%
+ \ltx@ifpackageloaded{pdflscape}{%
+ % Work around a bug in conjunction with pdflscape and
+ % external: without this optimize-away-instruction, the
+ % externalized image would be rotated - and it will be rotated
+ % once more again when it is included.
+ %
+ % if we "optimize it away", the landscape stuff will be
+ % omitted. I hope this is enough... might not be entirely
+ % fool-proof; perhaps we need to set it to \relax. For now, it
+ % will probably do the job
+ \tikzset{
+ external/.cd,
+ optimize command away=\landscape,
+ optimize command away=\endlandscape
+ }%
+ }{%
+ }%
+}%
+
+\AtBeginDocument{%
+ \pgfutil@ifundefined{tikzexternalrealjob}{%
+ \global\let\tikzexternalrealjob=\jobname
+ }{}%
+ \tikzexternal@handle@landscape
+}%
diff --git a/graphics/pgf/base/tex/tikzlibraryfadings.code.tex b/graphics/pgf/base/tex/tikzlibraryfadings.code.tex
new file mode 100644
index 0000000000..bec6487b98
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryfadings.code.tex
@@ -0,0 +1,48 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryfadings.code.tex}
+
+\usepgflibrary{fadings}%
+
+%
+% Environments for creating fadings
+%
+
+\def\tikzfadingfrompicture{%
+ \begingroup%
+ \setbox\pgfpic=\hbox\bgroup%
+ \tikzpicture%
+}%
+\def\endtikzfadingfrompicture{%
+ \global\let\tikz@smuggle=\tikz@fig@name%
+ \endtikzpicture
+ \egroup%
+ \pgfdeclarefading{\tikz@smuggle}{\box\pgfpic}%
+ \endgroup%
+}%
+
+% This makes it easier to maintain compatibility with the external lib:
+\def\starttikzfadingfrompicture{\tikzfadingfrompicture}%
+\def\stopttikzfadingfrompicture{\endtikzfadingfrompicture}%
+
+\def\tikzfading[#1]{%
+ {%
+ \setbox\pgfpic=\hbox{%
+ \tikzset{#1}%
+ \global\let\tikz@smuggle=\tikz@fig@name%
+ \tikz{%
+ \useasboundingbox(0,0) (100bp,100bp);
+ \node at (50bp,50bp) [rotate=\tikz@shade@angle]
+ {\pgfuseshading{\tikz@shading}};
+ }%
+ }%
+ \pgfdeclarefading{\tikz@smuggle}{\box\pgfpic}%
+ }%
+}%
diff --git a/graphics/pgf/base/tex/tikzlibraryfit.code.tex b/graphics/pgf/base/tex/tikzlibraryfit.code.tex
new file mode 100644
index 0000000000..4f3dc6be3d
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryfit.code.tex
@@ -0,0 +1,130 @@
+% Copyright 2007 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryfit.code.tex}
+
+\pgfkeys{/tikz/fit/.code=\tikz@lib@fit{#1},
+ /tikz/rotate fit/.code=\def\tikz@lib@fit@rotate{#1}\pgfkeysalso{/tikz/rotate=#1}
+}%
+
+\def\tikz@lib@fit@rotate{0}%
+
+\def\tikz@lib@fit#1{%
+ \pgf@xb=-16000pt\relax%
+ \pgf@xa=16000pt\relax%
+ \pgf@yb=-16000pt\relax%
+ \pgf@ya=16000pt\relax%
+ %
+ \pgfmathsetmacro\tikz@lib@fit@rotate{\tikz@lib@fit@rotate}%
+ %
+ % Now iterate over the coordinates
+ \tikz@lib@fit@scan#1\pgf@stop%
+ % Now, let's see what has happened
+ \ifdim\pgf@xa>\pgf@xa%
+ % Nothing... Ok, let's just ignore this.
+ \else%
+ % Ok, compute center and width and height
+ \pgf@x=\pgf@xb%
+ \advance\pgf@x by-\pgf@xa%
+ \pgf@y=\pgf@yb%
+ \advance\pgf@y by-\pgf@ya%
+ \advance\pgf@xa by.5\pgf@x%
+ \advance\pgf@ya by.5\pgf@y%
+ \ifdim\tikz@lib@fit@rotate pt=0pt\relax%
+ {%
+ \pgftransforminvert%
+ \pgf@pos@transform{\pgf@xa}{\pgf@ya}%
+ \global\pgf@xa\pgf@xa
+ \global\pgf@ya\pgf@ya
+ }
+ \else%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ {%
+ \pgf@xc=\pgf@xa%
+ \pgf@yc=\pgf@ya%
+ \pgftransforminvert%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}%
+ \pgftransformreset%
+ \pgftransformrotate{\tikz@lib@fit@rotate}%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}%
+ \global\pgf@x=\pgf@xc%
+ \global\pgf@y=\pgf@yc%
+ }%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@x=\pgf@xc%
+ \pgf@y=\pgf@yc%
+ \fi%
+ \edef\tikz@node@at{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
+ \pgfkeysalso{/tikz/anchor=center,/tikz/text badly centered}%
+ \pgfkeysalso{/tikz/text width/.expanded=\the\pgf@x}%
+ \pgf@x=\pgf@y%
+ \pgf@y=.5\pgf@y%
+ \pgfkeysalso{
+ /tikz/transform shape=false,
+ /tikz/text height/.expanded=\the\pgf@y-.5\dp\pgfnodeparttextbox,
+ /tikz/text depth/.expanded=\the\pgf@x-\noexpand\the\ht\pgfnodeparttextbox}%
+ \pgfkeysalso{every fit/.try}%
+ \fi%
+}%
+
+\def\tikz@lib@fit@scan{%
+ \pgfutil@ifnextchar\pgf@stop{\pgfutil@gobble}
+ {\tikz@scan@one@point\tikz@lib@fit@scan@handle}}%
+
+\def\tikz@lib@fit@scan@handle#1{%
+ \iftikz@shapeborder%
+ % Ok, fit all four external anchors, if they exist
+ \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{west}}%
+ \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{east}}%
+ \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{north}}%
+ \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{south}}%
+ \else%
+ \tikz@lib@fit@adjust{#1}%
+ \fi%
+ \tikz@lib@fit@scan%
+}%
+
+\def\tikz@lib@fit@adjust#1{%
+ \ifdim\tikz@lib@fit@rotate pt=0pt\relax%
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \else%
+ {%
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfgettransform\tikz@lib@fit@transform%
+ \pgftransforminvert%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}%
+ \pgftransformreset%
+ \pgftransformrotate{-\tikz@lib@fit@rotate}%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}%
+ \pgfsettransform\tikz@lib@fit@transform%
+ \pgf@pos@transform{\pgf@xc}{\pgf@yc}%
+ \global\pgf@x=\pgf@xc%
+ \global\pgf@y=\pgf@yc%
+ }%
+ \fi%
+ \ifdim\pgf@x<\pgf@xa%
+ \pgf@xa=\pgf@x%
+ \fi%
+ \ifdim\pgf@y<\pgf@ya%
+ \pgf@ya=\pgf@y%
+ \fi%
+ \ifdim\pgf@x>\pgf@xb%
+ \pgf@xb=\pgf@x%
+ \fi%
+ \ifdim\pgf@y>\pgf@yb%
+ \pgf@yb=\pgf@y%
+ \fi%
+}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryfixedpointarithmetic.code.tex b/graphics/pgf/base/tex/tikzlibraryfixedpointarithmetic.code.tex
new file mode 100644
index 0000000000..8560ecfb59
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryfixedpointarithmetic.code.tex
@@ -0,0 +1,10 @@
+% Copyright 2008 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.
+
+\usepgflibrary{fixedpointarithmetic}%
diff --git a/graphics/pgf/base/tex/tikzlibraryfolding.code.tex b/graphics/pgf/base/tex/tikzlibraryfolding.code.tex
new file mode 100644
index 0000000000..143acd9e9e
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryfolding.code.tex
@@ -0,0 +1,2078 @@
+% Copyright 2006 by Till Tantau
+% Copyright 2013 by Nico Van Cleemput
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryfolding.code.tex}
+
+
+%
+% Length of a standard line in a folding
+%
+
+\tikzoption{folding line length}{\pgfmathsetlength\tikz@lib@fold@length{#1}}%
+\newdimen\tikz@lib@fold@length
+\tikz@lib@fold@length=2cm
+
+
+% Faces
+% -----
+
+\def\tikz@lib@fold@triangle#1#2#3#4{%
+ \scope[xshift=.5\tikz@lib@fold@length,yshift=.28868\tikz@lib@fold@length]
+ #1
+ \endscope
+ \scope[shift={(60:\tikz@lib@fold@length)},rotate=-60]
+ #2
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,rotate=180]
+ #3
+ \endscope
+ \scope[rotate=60]
+ #4
+ \endscope
+}%
+
+\def\tikz@lib@fold@square#1#2#3#4#5{%
+ \scope[xshift=.5\tikz@lib@fold@length,yshift=.5\tikz@lib@fold@length]
+ #1
+ \endscope
+ \scope[yshift=\tikz@lib@fold@length]
+ #2
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,yshift=\tikz@lib@fold@length,rotate=-90]
+ #3
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,rotate=180]
+ #4
+ \endscope
+ \scope[rotate=90]
+ #5
+ \endscope
+}%
+
+\def\tikz@lib@fold@pentagon#1#2#3#4#5#6{%
+ \scope[xshift=.5\tikz@lib@fold@length,yshift=0.68819\tikz@lib@fold@length]
+ #1
+ \endscope
+ \scope[shift={(108:\tikz@lib@fold@length)},shift={(36:\tikz@lib@fold@length)},rotate=-36]
+ #2
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,shift={(72:\tikz@lib@fold@length)},rotate=-108]
+ #3
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,rotate=180]
+ #4
+ \endscope
+ \scope[rotate=108]
+ #5
+ \endscope
+ \scope[shift={(108:\tikz@lib@fold@length)},rotate=36]
+ #6
+ \endscope
+}%
+
+\def\tikz@lib@fold@hexagon#1#2#3#4#5#6#7{%
+ \scope
+ [shift={(60:\tikz@lib@fold@length)}]
+ #1
+ \endscope
+ \scope
+ [shift={(120:\tikz@lib@fold@length)},
+ shift={(60:\tikz@lib@fold@length)}]
+ #2
+ \endscope
+ \scope
+ [shift={(120:\tikz@lib@fold@length)},
+ shift={(60:\tikz@lib@fold@length)},
+ xshift=\tikz@lib@fold@length,
+ rotate=-60]
+ #3
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ shift={(60:\tikz@lib@fold@length)},
+ rotate=-120]
+ #4
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ rotate=180]
+ #5
+ \endscope
+ \scope
+ [rotate=120]
+ #6
+ \endscope
+ \scope
+ [shift={(120:\tikz@lib@fold@length)},
+ rotate=60]
+ #7
+ \endscope
+}%
+
+\def\tikz@lib@fold@octagon#1#2#3#4#5#6#7#8#9{%
+ \scope[xshift=.5\tikz@lib@fold@length,yshift=1.20711\tikz@lib@fold@length]
+ #1
+ \endscope
+ \scope[yshift=2.41421\tikz@lib@fold@length]
+ #2
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,yshift=2.41421\tikz@lib@fold@length,rotate=-45]
+ #3
+ \endscope
+ \scope[xshift=1.70711\tikz@lib@fold@length,yshift=1.70711\tikz@lib@fold@length,rotate=-90]
+ #4
+ \endscope
+ \scope[xshift=1.70711\tikz@lib@fold@length,yshift=.70711\tikz@lib@fold@length,rotate=-135]
+ #5
+ \endscope
+ \scope[xshift=\tikz@lib@fold@length,rotate=180]
+ #6
+ \endscope
+ \scope[rotate=135]
+ #7
+ \endscope
+ \scope[xshift=-.70711\tikz@lib@fold@length,yshift=.70711\tikz@lib@fold@length,rotate=90]
+ #8
+ \endscope
+ \scope[xshift=-.70711\tikz@lib@fold@length,yshift=1.70711\tikz@lib@fold@length,rotate=45]
+ #9
+ \endscope
+}%
+
+\def\tikz@lib@fold@decagon#1#2#3#4#5#6#7{%
+ \scope[shift={(72:1.61803\tikz@lib@fold@length)}] %decagon inside a circle with radius the golden ratio has side length 1
+ #1
+ \endscope
+ \scope
+ [shift={(36:\tikz@lib@fold@length)},
+ shift={(72:\tikz@lib@fold@length)},
+ shift={(108:\tikz@lib@fold@length)},
+ shift={(144:\tikz@lib@fold@length)}]
+ #2
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ shift={(36:\tikz@lib@fold@length)},
+ shift={(72:\tikz@lib@fold@length)},
+ shift={(108:\tikz@lib@fold@length)},
+ shift={(144:\tikz@lib@fold@length)},
+ rotate=-36]
+ #3
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ shift={(36:\tikz@lib@fold@length)},
+ shift={(72:\tikz@lib@fold@length)},
+ shift={(108:\tikz@lib@fold@length)},
+ rotate=-72]
+ #4
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ shift={(36:\tikz@lib@fold@length)},
+ shift={(72:\tikz@lib@fold@length)},
+ rotate=-108]
+ #5
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ shift={(36:\tikz@lib@fold@length)},
+ rotate=-144]
+ #6
+ \endscope
+ \scope
+ [xshift=\tikz@lib@fold@length,
+ rotate=180]
+ #7
+ \endscope
+ \tikz@lib@fold@decagonbis
+}%
+
+\def\tikz@lib@fold@decagonbis#1#2#3#4{%
+ \scope
+ [rotate=144]
+ #1
+ \endscope
+ \scope
+ [shift={(144:\tikz@lib@fold@length)},
+ rotate=108]
+ #2
+ \endscope
+ \scope
+ [shift={(144:\tikz@lib@fold@length)},
+ shift={(108:\tikz@lib@fold@length)},
+ rotate=72]
+ #3
+ \endscope
+ \scope
+ [shift={(144:\tikz@lib@fold@length)},
+ shift={(108:\tikz@lib@fold@length)},
+ shift={(72:\tikz@lib@fold@length)},
+ rotate=36]
+ #4
+ \endscope
+}%
+
+\def\tikz@lib@fold@path{\draw[every fold](0,0) -- (\tikz@lib@fold@length,0pt);}%
+\def\tikz@lib@fold@cut@path{\draw[every cut](0,0) -- (\tikz@lib@fold@length,0pt);}%
+\def\tikz@lib@fold@ear@path{
+ \path[every ear] (0,0) -- (.5\tikz@lib@fold@length,.2\tikz@lib@fold@length) --(\tikz@lib@fold@length,0pt) --(0,0) -- cycle;
+ \draw[every fold](0,0) -- (\tikz@lib@fold@length,0pt);
+ \draw[every cut] (0,0) -- (.5\tikz@lib@fold@length,.2\tikz@lib@fold@length) --(\tikz@lib@fold@length,0pt);}%
+\def\tikz@lib@fold@ear@custom@left@path#1{
+ \path[every ear] (0,0) -- (#1:.66\tikz@lib@fold@length) -- (\tikz@lib@fold@length,0pt) --(0,0) -- cycle;
+ \draw[every fold](0,0) -- (\tikz@lib@fold@length,0pt);
+ \draw[every cut] (0,0) -- (#1:.66\tikz@lib@fold@length) -- (\tikz@lib@fold@length,0pt);}%
+\def\tikz@lib@fold@ear@custom@right@path#1{
+ \path[every ear] (0,0) -- (\tikz@lib@fold@length,0pt) -- ++(-#1:-.66\tikz@lib@fold@length) --(0,0) -- cycle;
+ \draw[every fold](0,0) -- (\tikz@lib@fold@length,0pt);
+ \draw[every cut] (\tikz@lib@fold@length,0pt) -- ++(-#1:-.66\tikz@lib@fold@length) -- (0,0);}%
+
+\tikzset{every ear/.style={}}%
+\tikzset{every cut/.style={}}%
+\tikzset{every fold/.style={help lines}}%
+
+\tikzoption{face 1}{\def\tikz@lib@fold@face@A{#1}}%
+\tikzoption{face 2}{\def\tikz@lib@fold@face@B{#1}}%
+\tikzoption{face 3}{\def\tikz@lib@fold@face@C{#1}}%
+\tikzoption{face 4}{\def\tikz@lib@fold@face@D{#1}}%
+\tikzoption{face 5}{\def\tikz@lib@fold@face@E{#1}}%
+\tikzoption{face 6}{\def\tikz@lib@fold@face@F{#1}}%
+\tikzoption{face 7}{\def\tikz@lib@fold@face@G{#1}}%
+\tikzoption{face 8}{\def\tikz@lib@fold@face@H{#1}}%
+\tikzoption{face 9}{\def\tikz@lib@fold@face@I{#1}}%
+\tikzoption{face 10}{\def\tikz@lib@fold@face@J{#1}}%
+\tikzoption{face 11}{\def\tikz@lib@fold@face@K{#1}}%
+\tikzoption{face 12}{\def\tikz@lib@fold@face@L{#1}}%
+\tikzoption{face 13}{\def\tikz@lib@fold@face@M{#1}}%
+\tikzoption{face 14}{\def\tikz@lib@fold@face@N{#1}}%
+\tikzoption{face 15}{\def\tikz@lib@fold@face@O{#1}}%
+\tikzoption{face 16}{\def\tikz@lib@fold@face@P{#1}}%
+\tikzoption{face 17}{\def\tikz@lib@fold@face@Q{#1}}%
+\tikzoption{face 18}{\def\tikz@lib@fold@face@R{#1}}%
+\tikzoption{face 19}{\def\tikz@lib@fold@face@S{#1}}%
+\tikzoption{face 20}{\def\tikz@lib@fold@face@T{#1}}%
+\tikzoption{face 21}{\def\tikz@lib@fold@face@U{#1}}%
+\tikzoption{face 22}{\def\tikz@lib@fold@face@V{#1}}%
+\tikzoption{face 23}{\def\tikz@lib@fold@face@W{#1}}%
+\tikzoption{face 24}{\def\tikz@lib@fold@face@X{#1}}%
+\tikzoption{face 25}{\def\tikz@lib@fold@face@Y{#1}}%
+\tikzoption{face 26}{\def\tikz@lib@fold@face@Z{#1}}%
+\tikzoption{face 27}{\def\tikz@lib@fold@face@AA{#1}}%
+\tikzoption{face 28}{\def\tikz@lib@fold@face@AB{#1}}%
+\tikzoption{face 29}{\def\tikz@lib@fold@face@AC{#1}}%
+\tikzoption{face 30}{\def\tikz@lib@fold@face@AD{#1}}%
+\tikzoption{face 31}{\def\tikz@lib@fold@face@AE{#1}}%
+\tikzoption{face 32}{\def\tikz@lib@fold@face@AF{#1}}%
+\tikzoption{face 33}{\def\tikz@lib@fold@face@AG{#1}}%
+\tikzoption{face 34}{\def\tikz@lib@fold@face@AH{#1}}%
+\tikzoption{face 35}{\def\tikz@lib@fold@face@AI{#1}}%
+\tikzoption{face 36}{\def\tikz@lib@fold@face@AJ{#1}}%
+\tikzoption{face 37}{\def\tikz@lib@fold@face@AK{#1}}%
+\tikzoption{face 38}{\def\tikz@lib@fold@face@AL{#1}}%
+\tikzoption{face 39}{\def\tikz@lib@fold@face@AM{#1}}%
+\tikzoption{face 40}{\def\tikz@lib@fold@face@AN{#1}}%
+\tikzoption{face 41}{\def\tikz@lib@fold@face@AO{#1}}%
+\tikzoption{face 42}{\def\tikz@lib@fold@face@AP{#1}}%
+\tikzoption{face 43}{\def\tikz@lib@fold@face@AQ{#1}}%
+\tikzoption{face 44}{\def\tikz@lib@fold@face@AR{#1}}%
+\tikzoption{face 45}{\def\tikz@lib@fold@face@AS{#1}}%
+\tikzoption{face 46}{\def\tikz@lib@fold@face@AT{#1}}%
+\tikzoption{face 47}{\def\tikz@lib@fold@face@AU{#1}}%
+\tikzoption{face 48}{\def\tikz@lib@fold@face@AV{#1}}%
+\tikzoption{face 49}{\def\tikz@lib@fold@face@AW{#1}}%
+\tikzoption{face 50}{\def\tikz@lib@fold@face@AX{#1}}%
+\tikzoption{face 51}{\def\tikz@lib@fold@face@AY{#1}}%
+\tikzoption{face 52}{\def\tikz@lib@fold@face@AZ{#1}}%
+\tikzoption{face 53}{\def\tikz@lib@fold@face@BA{#1}}%
+\tikzoption{face 54}{\def\tikz@lib@fold@face@BB{#1}}%
+\tikzoption{face 55}{\def\tikz@lib@fold@face@BC{#1}}%
+\tikzoption{face 56}{\def\tikz@lib@fold@face@BD{#1}}%
+\tikzoption{face 57}{\def\tikz@lib@fold@face@BE{#1}}%
+\tikzoption{face 58}{\def\tikz@lib@fold@face@BF{#1}}%
+\tikzoption{face 59}{\def\tikz@lib@fold@face@BG{#1}}%
+\tikzoption{face 60}{\def\tikz@lib@fold@face@BH{#1}}%
+\tikzoption{face 61}{\def\tikz@lib@fold@face@BI{#1}}%
+\tikzoption{face 62}{\def\tikz@lib@fold@face@BJ{#1}}%
+\tikzoption{face 63}{\def\tikz@lib@fold@face@BK{#1}}%
+\tikzoption{face 64}{\def\tikz@lib@fold@face@BL{#1}}%
+\tikzoption{face 65}{\def\tikz@lib@fold@face@BM{#1}}%
+\tikzoption{face 66}{\def\tikz@lib@fold@face@BN{#1}}%
+\tikzoption{face 67}{\def\tikz@lib@fold@face@BO{#1}}%
+\tikzoption{face 68}{\def\tikz@lib@fold@face@BP{#1}}%
+\tikzoption{face 69}{\def\tikz@lib@fold@face@BQ{#1}}%
+\tikzoption{face 70}{\def\tikz@lib@fold@face@BR{#1}}%
+\tikzoption{face 71}{\def\tikz@lib@fold@face@BS{#1}}%
+\tikzoption{face 72}{\def\tikz@lib@fold@face@BT{#1}}%
+\tikzoption{face 73}{\def\tikz@lib@fold@face@BU{#1}}%
+\tikzoption{face 74}{\def\tikz@lib@fold@face@BV{#1}}%
+\tikzoption{face 75}{\def\tikz@lib@fold@face@BW{#1}}%
+\tikzoption{face 76}{\def\tikz@lib@fold@face@BX{#1}}%
+\tikzoption{face 77}{\def\tikz@lib@fold@face@BY{#1}}%
+\tikzoption{face 78}{\def\tikz@lib@fold@face@BZ{#1}}%
+\tikzoption{face 79}{\def\tikz@lib@fold@face@CA{#1}}%
+\tikzoption{face 80}{\def\tikz@lib@fold@face@CB{#1}}%
+\tikzoption{face 81}{\def\tikz@lib@fold@face@CC{#1}}%
+\tikzoption{face 82}{\def\tikz@lib@fold@face@CD{#1}}%
+\tikzoption{face 83}{\def\tikz@lib@fold@face@CE{#1}}%
+\tikzoption{face 84}{\def\tikz@lib@fold@face@CF{#1}}%
+\tikzoption{face 85}{\def\tikz@lib@fold@face@CG{#1}}%
+\tikzoption{face 86}{\def\tikz@lib@fold@face@CH{#1}}%
+\tikzoption{face 87}{\def\tikz@lib@fold@face@CI{#1}}%
+\tikzoption{face 88}{\def\tikz@lib@fold@face@CJ{#1}}%
+\tikzoption{face 89}{\def\tikz@lib@fold@face@CK{#1}}%
+\tikzoption{face 90}{\def\tikz@lib@fold@face@CL{#1}}%
+\tikzoption{face 91}{\def\tikz@lib@fold@face@CM{#1}}%
+\tikzoption{face 92}{\def\tikz@lib@fold@face@CN{#1}}%
+
+
+\let\tikz@lib@fold@face@A=\pgfutil@empty
+\let\tikz@lib@fold@face@B=\pgfutil@empty
+\let\tikz@lib@fold@face@C=\pgfutil@empty
+\let\tikz@lib@fold@face@D=\pgfutil@empty
+\let\tikz@lib@fold@face@E=\pgfutil@empty
+\let\tikz@lib@fold@face@F=\pgfutil@empty
+\let\tikz@lib@fold@face@G=\pgfutil@empty
+\let\tikz@lib@fold@face@H=\pgfutil@empty
+\let\tikz@lib@fold@face@I=\pgfutil@empty
+\let\tikz@lib@fold@face@J=\pgfutil@empty
+\let\tikz@lib@fold@face@K=\pgfutil@empty
+\let\tikz@lib@fold@face@L=\pgfutil@empty
+\let\tikz@lib@fold@face@M=\pgfutil@empty
+\let\tikz@lib@fold@face@N=\pgfutil@empty
+\let\tikz@lib@fold@face@O=\pgfutil@empty
+\let\tikz@lib@fold@face@P=\pgfutil@empty
+\let\tikz@lib@fold@face@Q=\pgfutil@empty
+\let\tikz@lib@fold@face@R=\pgfutil@empty
+\let\tikz@lib@fold@face@S=\pgfutil@empty
+\let\tikz@lib@fold@face@T=\pgfutil@empty
+\let\tikz@lib@fold@face@U=\pgfutil@empty
+\let\tikz@lib@fold@face@V=\pgfutil@empty
+\let\tikz@lib@fold@face@W=\pgfutil@empty
+\let\tikz@lib@fold@face@X=\pgfutil@empty
+\let\tikz@lib@fold@face@Y=\pgfutil@empty
+\let\tikz@lib@fold@face@Z=\pgfutil@empty
+\let\tikz@lib@fold@face@AA=\pgfutil@empty
+\let\tikz@lib@fold@face@AB=\pgfutil@empty
+\let\tikz@lib@fold@face@AC=\pgfutil@empty
+\let\tikz@lib@fold@face@AD=\pgfutil@empty
+\let\tikz@lib@fold@face@AE=\pgfutil@empty
+\let\tikz@lib@fold@face@AF=\pgfutil@empty
+\let\tikz@lib@fold@face@AG=\pgfutil@empty
+\let\tikz@lib@fold@face@AH=\pgfutil@empty
+\let\tikz@lib@fold@face@AI=\pgfutil@empty
+\let\tikz@lib@fold@face@AJ=\pgfutil@empty
+\let\tikz@lib@fold@face@AK=\pgfutil@empty
+\let\tikz@lib@fold@face@AL=\pgfutil@empty
+\let\tikz@lib@fold@face@AM=\pgfutil@empty
+\let\tikz@lib@fold@face@AN=\pgfutil@empty
+\let\tikz@lib@fold@face@AO=\pgfutil@empty
+\let\tikz@lib@fold@face@AP=\pgfutil@empty
+\let\tikz@lib@fold@face@AQ=\pgfutil@empty
+\let\tikz@lib@fold@face@AR=\pgfutil@empty
+\let\tikz@lib@fold@face@AS=\pgfutil@empty
+\let\tikz@lib@fold@face@AT=\pgfutil@empty
+\let\tikz@lib@fold@face@AU=\pgfutil@empty
+\let\tikz@lib@fold@face@AV=\pgfutil@empty
+\let\tikz@lib@fold@face@AW=\pgfutil@empty
+\let\tikz@lib@fold@face@AX=\pgfutil@empty
+\let\tikz@lib@fold@face@AY=\pgfutil@empty
+\let\tikz@lib@fold@face@AZ=\pgfutil@empty
+\let\tikz@lib@fold@face@BA=\pgfutil@empty
+\let\tikz@lib@fold@face@BB=\pgfutil@empty
+\let\tikz@lib@fold@face@BC=\pgfutil@empty
+\let\tikz@lib@fold@face@BD=\pgfutil@empty
+\let\tikz@lib@fold@face@BE=\pgfutil@empty
+\let\tikz@lib@fold@face@BF=\pgfutil@empty
+\let\tikz@lib@fold@face@BG=\pgfutil@empty
+\let\tikz@lib@fold@face@BH=\pgfutil@empty
+\let\tikz@lib@fold@face@BI=\pgfutil@empty
+\let\tikz@lib@fold@face@BJ=\pgfutil@empty
+\let\tikz@lib@fold@face@BK=\pgfutil@empty
+\let\tikz@lib@fold@face@BL=\pgfutil@empty
+\let\tikz@lib@fold@face@BM=\pgfutil@empty
+\let\tikz@lib@fold@face@BN=\pgfutil@empty
+\let\tikz@lib@fold@face@BO=\pgfutil@empty
+\let\tikz@lib@fold@face@BP=\pgfutil@empty
+\let\tikz@lib@fold@face@BQ=\pgfutil@empty
+\let\tikz@lib@fold@face@BR=\pgfutil@empty
+\let\tikz@lib@fold@face@BS=\pgfutil@empty
+\let\tikz@lib@fold@face@BT=\pgfutil@empty
+\let\tikz@lib@fold@face@BU=\pgfutil@empty
+\let\tikz@lib@fold@face@BV=\pgfutil@empty
+\let\tikz@lib@fold@face@BW=\pgfutil@empty
+\let\tikz@lib@fold@face@BX=\pgfutil@empty
+\let\tikz@lib@fold@face@BY=\pgfutil@empty
+\let\tikz@lib@fold@face@BZ=\pgfutil@empty
+\let\tikz@lib@fold@face@CA=\pgfutil@empty
+\let\tikz@lib@fold@face@CB=\pgfutil@empty
+\let\tikz@lib@fold@face@CC=\pgfutil@empty
+\let\tikz@lib@fold@face@CD=\pgfutil@empty
+\let\tikz@lib@fold@face@CE=\pgfutil@empty
+\let\tikz@lib@fold@face@CF=\pgfutil@empty
+\let\tikz@lib@fold@face@CG=\pgfutil@empty
+\let\tikz@lib@fold@face@CH=\pgfutil@empty
+\let\tikz@lib@fold@face@CI=\pgfutil@empty
+\let\tikz@lib@fold@face@CJ=\pgfutil@empty
+\let\tikz@lib@fold@face@CK=\pgfutil@empty
+\let\tikz@lib@fold@face@CL=\pgfutil@empty
+\let\tikz@lib@fold@face@CM=\pgfutil@empty
+\let\tikz@lib@fold@face@CN=\pgfutil@empty
+
+
+\tikzset{numbered faces/.style={%
+ face 1={\node{1};},
+ face 2={\node{2};},
+ face 3={\node{3};},
+ face 4={\node{4};},
+ face 5={\node{5};},
+ face 6={\node{6};},
+ face 7={\node{7};},
+ face 8={\node{8};},
+ face 9={\node{9};},
+ face 10={\node{10};},
+ face 11={\node{11};},
+ face 12={\node{12};},
+ face 13={\node{13};},
+ face 14={\node{14};},
+ face 15={\node{15};},
+ face 16={\node{16};},
+ face 17={\node{17};},
+ face 18={\node{18};},
+ face 19={\node{19};},
+ face 20={\node{20};},
+ face 21={\node{21};},
+ face 22={\node{22};},
+ face 23={\node{23};},
+ face 24={\node{24};},
+ face 25={\node{25};},
+ face 26={\node{26};},
+ face 27={\node{27};},
+ face 28={\node{28};},
+ face 29={\node{29};},
+ face 30={\node{30};},
+ face 31={\node{31};},
+ face 32={\node{32};},
+ face 33={\node{33};},
+ face 34={\node{34};},
+ face 35={\node{35};},
+ face 36={\node{36};},
+ face 37={\node{37};},
+ face 38={\node{38};},
+ face 39={\node{39};},
+ face 40={\node{40};},
+ face 41={\node{41};},
+ face 42={\node{42};},
+ face 43={\node{43};},
+ face 44={\node{44};},
+ face 45={\node{45};},
+ face 46={\node{46};},
+ face 47={\node{47};},
+ face 48={\node{48};},
+ face 49={\node{49};},
+ face 50={\node{50};},
+ face 51={\node{51};},
+ face 52={\node{52};},
+ face 53={\node{53};},
+ face 54={\node{54};},
+ face 55={\node{55};},
+ face 56={\node{56};},
+ face 57={\node{57};},
+ face 58={\node{58};},
+ face 59={\node{59};},
+ face 60={\node{60};},
+ face 61={\node{61};},
+ face 62={\node{62};},
+ face 63={\node{63};},
+ face 64={\node{64};},
+ face 65={\node{65};},
+ face 66={\node{66};},
+ face 67={\node{67};},
+ face 68={\node{68};},
+ face 69={\node{69};},
+ face 70={\node{70};},
+ face 71={\node{71};},
+ face 72={\node{72};},
+ face 73={\node{73};},
+ face 74={\node{74};},
+ face 75={\node{75};},
+ face 76={\node{76};},
+ face 77={\node{77};},
+ face 78={\node{78};},
+ face 79={\node{79};},
+ face 80={\node{80};},
+ face 81={\node{81};},
+ face 82={\node{82};},
+ face 83={\node{83};},
+ face 84={\node{84};},
+ face 85={\node{85};},
+ face 86={\node{86};},
+ face 87={\node{87};},
+ face 88={\node{88};},
+ face 89={\node{89};},
+ face 90={\node{90};},
+ face 91={\node{91};},
+ face 92={\node{92};}}}%
+
+% The foldings defined here:
+
+\tikzset{
+ pics/dodecahedron folding/.style = {code=\tikzfoldingdodecahedron[];},
+ pics/tetrahedron folding/.style = {code=\tikzfoldingtetrahedron[];},
+ pics/tetrahedron truncated folding/.style = {code=\tikzfoldingtruncatedtetrahedron[];},
+ pics/cube folding/.style = {code=\tikzfoldingcube[];},
+ pics/cube truncated folding/.style = {code=\tikzfoldingtruncatedcube[];},
+ pics/octahedron folding/.style = {code=\tikzfoldingoctahedron[];},
+ pics/octahedron truncated folding/.style = {code=\tikzfoldingtruncatedoctahedron[];},
+ pics/dodecahedron folding/.style = {code=\tikzfoldingdodecahedron[];},
+ pics/dodecahedron' folding/.style = {code=\tikzfoldingalternatedodecahedron[];},
+ pics/cuboctahedron folding/.style = {code=\tikzfoldingcuboctahedron[];},
+ pics/cuboctahedron truncated folding/.style = {code=\tikzfoldingtruncatedcuboctahedron[];},
+ pics/icosahedron folding/.style = {code=\tikzfoldingicosahedron[];},
+ pics/rhombicuboctahedron folding/.style = {code=\tikzfoldingrhombicuboctahedron[];},
+ pics/snub cube folding/.style = {code=\tikzfoldingsnubcube[];},
+ pics/icosidodecahedron folding/.style = {code=\tikzfoldingicosidodecahedron[];}
+}%
+
+
+
+% Platonic solids
+% ---------------
+
+\def\tikzfoldingdodecahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
+
+%alternative dodecahedron: larger format possible
+
+\def\tikzfoldingalternatedodecahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@pentagon
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ \endgroup
+}%
+
+
+%tetrahedron
+
+\def\tikzfoldingtetrahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
+
+%cube
+
+\def\tikzfoldingcube#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@square{\tikz@lib@fold@face@A}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@D}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
+
+
+%octahedron
+
+\def\tikzfoldingoctahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ \endgroup
+}%
+
+
+%icosahedron
+
+\def\tikzfoldingicosahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@O}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@P}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@Q}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@R}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@S}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@T}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ \endgroup
+}%
+
+% Archimedean solids
+% ------------------
+
+%truncated tetrahedron
+
+\def\tikzfoldingtruncatedtetrahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
+
+%cuboctahedron
+
+\def\tikzfoldingcuboctahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@square
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
+
+%truncated cube
+
+\def\tikzfoldingtruncatedcube#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ \endgroup
+}%
+
+
+%truncated octahedron
+
+\def\tikzfoldingtruncatedoctahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ \endgroup
+}%
+
+
+%rhombicuboctahedron
+
+\def\tikzfoldingrhombicuboctahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@square
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@O}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@P}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@Q}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@R}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@S}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@T}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@U}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@V}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@W}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@triangle
+ {\tikz@lib@fold@face@X}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@Y}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@Z}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ \endgroup
+}%
+
+%truncated cuboctahedron
+
+\def\tikzfoldingtruncatedcuboctahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@square
+ {\tikz@lib@fold@face@A}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@B}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@C}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@F}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@L}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@O}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@P}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@Q}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@R}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@S}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@T}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@U}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@V}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@W}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@square
+ {\tikz@lib@fold@face@X}
+ {\tikz@lib@fold@octagon
+ {\tikz@lib@fold@face@Y}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@hexagon
+ {\tikz@lib@fold@face@Z}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{15}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@custom@left@path{15}}
+ {\tikz@lib@fold@ear@path}
+ }
+ \endgroup
+}%
+
+%snub cube
+
+\def\tikzfoldingsnubcube#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@square{\tikz@lib@fold@face@A}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@B}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@C}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@E}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@F}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@K}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@L}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@M}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@N}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@O}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@P}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@Q}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@R}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@S}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@T}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@U}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@V}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@W}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@X}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@Y}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@Z}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AA}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AB}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AC}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AD}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AE}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@AF}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AG}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AH}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AI}
+ {
+ \tikz@lib@fold@square{\tikz@lib@fold@face@AJ}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AK}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AL}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
+
+% icosidodecahedron
+
+\def\tikzfoldingicosidodecahedron#1[#2]#3;{%
+ \begingroup%
+ \tikzset{#2}%
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@A}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@B}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@C}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@D}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@E}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@F}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@G}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@H}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@I}
+ {\tikz@lib@fold@ear@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@J}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@K}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@L}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@M}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@N}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@O}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@P}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@Q}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@R}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@S}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@T}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@U}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@V}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@ear@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@W}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@X}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@Y}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@Z}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ }
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AA}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@AB}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AC}
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {
+ \tikz@lib@fold@pentagon{\tikz@lib@fold@face@AD}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AE}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ {\tikz@lib@fold@ear@path}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ {
+ \tikz@lib@fold@triangle{\tikz@lib@fold@face@AF}
+ {\tikz@lib@fold@ear@custom@right@path{24}}
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ }
+ {\tikz@lib@fold@path}
+ {\tikz@lib@fold@cut@path}
+ }
+ \endgroup
+}%
diff --git a/graphics/pgf/base/tex/tikzlibraryfpu.code.tex b/graphics/pgf/base/tex/tikzlibraryfpu.code.tex
new file mode 100644
index 0000000000..ad8d2671ee
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryfpu.code.tex
@@ -0,0 +1,10 @@
+% Copyright 2008/2009 by Christian Feuersaenger
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU General Public License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\usepgflibrary{fpu}%
diff --git a/graphics/pgf/base/tex/tikzlibrarygraphdrawing.code.tex b/graphics/pgf/base/tex/tikzlibrarygraphdrawing.code.tex
new file mode 100644
index 0000000000..0967f817d2
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarygraphdrawing.code.tex
@@ -0,0 +1,257 @@
+% Copyright 2010 by Renée Ahrens, Olof Frahm, Jens Kluttig, Matthias Schulz, Stephan Schuster
+% Copyright 2011 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarygraphdrawing.code.tex}
+
+\usepgflibrary{graphdrawing}%
+
+\def\tikz@lib@ensure@gd@loaded{}%
+
+
+% Patch the level and sibling distances so that gd and plain tikz are
+% in sync
+\tikzset{level distance=1cm, sibling distance=1cm}%
+
+% Patch node distance because of its special syntax.
+
+\pgfkeysgetvalue{/graph drawing/node distance/.@cmd}\tikz@lib@gd@node@dist@path
+\pgfkeyslet{/graph drawing/node distance/orig/.@cmd}\tikz@lib@gd@node@dist@path
+
+\pgfkeysdef{/graph drawing/node distance}{
+ \pgfutil@in@{ and }{#1}%
+ \ifpgfutil@in@%
+ \tikz@gd@convert@and#1\pgf@stop%
+ \else%
+ \tikz@gd@convert@and#1 and #1\pgf@stop%
+ \fi%
+}%
+\def\tikz@gd@convert@and#1 and #2\pgf@stop{\pgfkeys{/graph drawing/node distance/orig={#1}}}%
+
+
+
+
+%
+% Setup graph drawing for tikz
+%
+
+\def\tikz@gd@request@callback#1#2{%
+ \tikzset{
+ execute at begin scope={
+ \tikzset{
+ --/.style={arrows=-},
+ -!-/.style={draw=none,fill=none},
+ }
+ \pgfgdsetedgecallback{\pgfgdtikzedgecallback}%
+ %
+ % Setup for plain syntax
+ %
+ \pgfgdaddspecificationhook{\tikz@lib@gd@spec@hook}%
+ #1
+ \let\tikzgdeventcallback\pgfgdevent%
+ \let\tikzgdeventgroupcallback\pgfgdeventgroup%
+ \let\tikzgdlatenodeoptionacallback\pgfgdsetlatenodeoption%
+ },
+ execute at end scope={%
+ #2%
+ }
+ }%
+}%
+
+\pgfgdsetrequestcallback\tikz@gd@request@callback
+
+
+
+\pgfgdappendtoforwardinglist{/tikz/,/tikz/graphs/}%
+
+\def\tikz@lib@gd@spec@hook{%
+ \tikzset{
+ edge macro=\tikz@gd@plain@edge@macro,
+ /tikz/at/.style={/graph drawing/desired at={##1}},
+ %
+ % Setup for the tree syntax (do this late so that grow options
+ % are still valid after a layout has been chosen)
+ %
+ /tikz/growth function=\relax,
+ /tikz/edge from parent macro=\tikz@gd@edge@from@parent@macro,
+ %
+ % Setup for the graphs syntax
+ %
+ /tikz/graphs/new ->/.code n args={4}{\pgfgdedge{##1}{##2}{->}{/tikz,##3}{##4}},
+ /tikz/graphs/new <-/.code n args={4}{\pgfgdedge{##1}{##2}{<-}{/tikz,##3}{##4}},
+ /tikz/graphs/new --/.code n args={4}{\pgfgdedge{##1}{##2}{--}{/tikz,##3}{##4}},
+ /tikz/graphs/new <->/.code n args={4}{\pgfgdedge{##1}{##2}{<->}{/tikz,##3}{##4}},
+ /tikz/graphs/new -!-/.code n args={4}{\pgfgdedge{##1}{##2}{-!-}{/tikz,##3}{##4}},
+ /tikz/graphs/placement/compute position/.code=,%
+ }
+}%
+
+\pgfgdaddprepareedgehook{
+ \tikz@enable@edge@quotes%
+ \let\tikz@transform=\pgfutil@empty%
+ \let\tikz@options=\pgfutil@empty%
+ \let\tikz@tonodes=\pgfutil@empty%
+}%
+
+
+\tikzset{
+ parent anchor/.forward to=/graph drawing/tail anchor,
+ child anchor/.forward to=/graph drawing/head anchor
+}%
+
+\def\pgfgdtikzedgecallback#1#2#3#4#5#6#7#8{%
+ \def\pgf@temp{#8}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgfscope%
+ \pgfset{every graphdrawing animation/.try}%
+ \pgfset{every graphdrawing edge animation/.try}%
+ #8%
+ \pgfuseid{pgf@gd}%
+ \pgfidscope%
+ \fi%
+ \begingroup
+ \draw (#1)
+ edge [to path={#7 \tikztonodes},#3,#4,/graph drawing/.cd,#6,/tikz/.cd]
+ #5
+ (#2);
+ \endgroup
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \endpgfidscope%
+ \endpgfscope%
+ \fi%
+}%
+
+\def\tikz@gd@edge@from@parent@macro#1#2{
+ [/utils/exec=\pgfgdedge{\tikzparentnode}{\tikzchildnode}{--}{/tikz,#1}{#2}]
+}%
+
+\def\tikz@gd@plain@edge@macro#1#2{
+ \pgfgdedge{\tikztostart}{\tikztotarget}{--}{/tikz,#1}{#2}
+}%
+
+
+
+%
+% Conversions: Convert coordinates into pairs of values surrounded by
+% braces.
+%
+
+\pgfgdset{
+ conversions/canvas coordinate/.code={%
+ \tikz@scan@one@point\pgf@process#1%
+ \pgfmathsetmacro{\tikz@gd@temp@x}{\pgf@x}
+ \pgfmathsetmacro{\tikz@gd@temp@y}{\pgf@y}
+ \edef\pgfgdresult{pgf.gd.model.Coordinate.new(\tikz@gd@temp@x,\tikz@gd@temp@y)}
+ },
+ conversions/coordinate/.code={%
+ \tikz@scan@one@point\pgf@process#1%
+ \pgfmathsetmacro{\tikz@gd@temp@x}{\pgf@x}
+ \pgfmathsetmacro{\tikz@gd@temp@y}{\pgf@y}
+ \edef\pgfgdresult{pgf.gd.model.Coordinate.new(\tikz@gd@temp@x,\tikz@gd@temp@y)}
+ }
+}%
+
+
+
+%
+% Overwrite node callback
+%
+
+\def\pgfgdcallbackcreatevertex#1#2#3#4{%
+ \node[every generated node/.try,name={#1},shape={#2},/graph drawing/.cd,#3]{#4};%
+}%
+
+
+%
+% Subgraph handling
+%
+
+% "General" text placement for subgraph nodes that works with all node
+% kinds.
+
+\tikzset{
+ subgraph text top/.code=\tikz@lg@simple@contents@top{#1},%
+ subgraph text top/.default=text ragged,
+ subgraph text bottom/.code=\tikz@lg@simple@contents@bottom{#1},%
+ subgraph text bottom/.default=text ragged,
+ subgraph text sep/.initial=.1em,
+ subgraph text none/.code={
+ \def\pgfgdsubgraphnodecontents##1{%
+ \pgf@y=\pgfkeysvalueof{/graph drawing/subgraph bounding box height}\relax%
+ \hbox to \pgfkeysvalueof{/graph drawing/subgraph bounding box width}{%
+ \vrule width0pt height.5\pgf@y depth.5\pgf@y\hfil}%
+ }%
+ },
+}%
+
+\def\tikz@lg@simple@contents@top#1{%
+ \def\pgfgdsubgraphnodecontents##1{%
+ \vbox{%
+ \def\pgf@temp{##1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \ifx\pgf@temp\pgfutil@sptoken%
+ \else%
+ \hbox to \pgfkeysvalueof{/graph drawing/subgraph bounding box width}{%
+ \hsize=\pgfkeysvalueof{/graph drawing/subgraph bounding box width}\relax%
+ \vbox{\noindent\strut\tikzset{#1}\tikz@text@action\pgf@temp}%
+ }%
+ \fi%
+ \fi%
+ \pgfmathparse{\pgfkeysvalueof{/tikz/subgraph text sep}}%
+ \kern\pgfmathresult pt\relax%
+ \pgf@y=\pgfkeysvalueof{/graph drawing/subgraph bounding box height}\relax%
+ \hbox to \pgfkeysvalueof{/graph drawing/subgraph bounding box width}{%
+ \vrule width0pt height.5\pgf@y depth.5\pgf@y\hfil}%
+ }%
+ }%
+}%
+
+\def\tikz@lg@simple@contents@bottom#1{%
+ \def\pgfgdsubgraphnodecontents##1{%
+ {%
+ \pgf@y=\pgfkeysvalueof{/graph drawing/subgraph bounding box height}\relax%
+ \setbox0=\vbox{%
+ \hbox to \pgfkeysvalueof{/graph drawing/subgraph bounding box width}{\vrule width0pt height\pgf@y\hfil}%
+ \pgfmathparse{\pgfkeysvalueof{/tikz/subgraph text sep}}%
+ \kern\pgfmathresult pt\relax%
+ \def\pgf@temp{##1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \ifx\pgf@temp\pgfutil@sptoken%
+ \else%
+ \hbox to \pgfkeysvalueof{/graph drawing/subgraph bounding box width}{%
+ \hsize=\pgfkeysvalueof{/graph drawing/subgraph bounding box width}\relax%
+ \vbox{\noindent\strut\tikzset{#1}\tikz@text@action\pgf@temp}%
+ }%
+ \fi%
+ \fi%
+ }%
+ \pgf@ya=\ht0\relax%
+ \advance\pgf@ya by-.5\pgf@y\relax%
+ \ht0=.5\pgf@y\relax%
+ \dp0=\pgf@ya\relax%
+ \box0\relax%
+ }%
+ }%
+}%
+
+\tikzset{subgraph text top}%
+
+\tikzset{
+ subgraph nodes/.style={/tikz/every subgraph node/.style={#1}},
+ graphs/subgraph nodes/.style={/tikz/every subgraph node/.style={#1}},
+ graphs/@graph drawing setup/.style={/graph drawing/anchor at={(\tikz@lastx,\tikz@lasty)}}
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarygraphdrawing.evolving.code.tex b/graphics/pgf/base/tex/tikzlibrarygraphdrawing.evolving.code.tex
new file mode 100644
index 0000000000..9d9055dfe9
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarygraphdrawing.evolving.code.tex
@@ -0,0 +1,21 @@
+% Copyright 2016 by Malte Skambath
+%
+% 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.
+
+\usepgflibrary{graphdrawing}
+
+\usegdlibrary{evolving}
+
+\newcount\mycount
+\tikzgraphsset{
+ nodes = {supernode/.expanded=\tikzgraphnodename},
+ when/.code = {\pgfparsetime{#1}\mycount=\pgftimeresult pt\tikzgraphsset{name/.expanded=\the\mycount,snapshot/.expanded=\the\mycount}}
+}
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarygraphs.code.tex b/graphics/pgf/base/tex/tikzlibrarygraphs.code.tex
new file mode 100644
index 0000000000..74fe15c7ea
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarygraphs.code.tex
@@ -0,0 +1,2671 @@
+% Copyright 2010 by Till Tantau
+% Copyright 2011 by Jannis Pohlmann
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarygraphs.code.tex}
+
+
+%
+% Interface keys
+%
+
+\def\tikzgraphsset{\pgfqkeys{/tikz/graphs}}%
+
+\tikzgraphsset{
+ new ->/.code n args={4}{%
+ \path [->,every new ->/.try]
+ (#1\tikzgraphleftanchor)
+ edge[#3] #4
+ (#2\tikzgraphrightanchor);},
+ new --/.code n args={4}{
+ \path [-,every new --/.try]
+ (#1\tikzgraphleftanchor)
+ edge[#3] #4
+ (#2\tikzgraphrightanchor);},
+ new <->/.code n args={4}{
+ \path [<->,every new <->/.try]
+ (#1\tikzgraphleftanchor)
+ edge[#3] #4
+ (#2\tikzgraphrightanchor);},
+ new -!-/.code n args={4}{},
+ new <-/.code n args={4}{%
+ \path [<-,every new <-/.try]
+ (#1\tikzgraphleftanchor)
+ edge[#3] #4
+ (#2\tikzgraphrightanchor);
+ }
+}%
+
+
+\def\tikz@lib@graph@store@anchor#1#2{%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \let#2\tikz@temp%
+ \else%
+ \def\tikz@temp{.#1}%
+ \let#2\tikz@temp%
+ \fi%
+}%
+
+\tikzgraphsset{
+ default edge kind/.initial=--,
+ --/.style={default edge kind=--},
+ ->/.style={default edge kind=->},
+ <-/.style={default edge kind=<-},
+ <->/.style={default edge kind=<->},
+ -!-/.style={default edge kind=-!-},
+ default edge operator/.initial=matching and star,
+ left anchor/.code=\tikz@lib@graph@store@anchor{#1}{\tikzgraphleftanchor},
+ right anchor/.code=\tikz@lib@graph@store@anchor{#1}{\tikzgraphrightanchor},
+ left anchor=,
+ right anchor=
+}%
+
+
+%
+% Keys for using nodes declared outside a graph inside a graph as if
+% it were declared there
+%
+
+\tikzgraphsset{
+ use existing nodes/.is if=tikz@lib@graph@all
+}%
+
+\tikzset{
+ new set/.code={
+ \expandafter\global\expandafter\let\csname tikz@lg@node@set #1\endcsname\pgfutil@empty%
+ },
+ set/.code={
+ \tikz@fig@mustbenamed%
+ \expandafter\def\expandafter\tikz@alias\expandafter{\tikz@alias%
+ \expandafter\def\expandafter\pgf@temp\expandafter{\csname tikz@lg@node@set #1\endcsname}%
+ \expandafter\expandafter\expandafter\pgfutil@g@addto@macro\expandafter\pgf@temp\expandafter{\expandafter\tikz@lg@do\expandafter{\tikz@fig@name}}%
+ }%
+ },%
+}%
+
+\newif\iftikz@lib@graph@all
+
+
+%
+% Simple versus multi graphs
+%
+\tikzgraphsset{
+ simple/.code={
+ \iftikz@lib@graph@simple%
+ % is already simple, ignore
+ \else
+ \tikz@lib@graph@simpletrue%
+ \pgfkeysalso{operator=\tikz@lib@graph@simple@done}%
+ \fi%
+ },
+ multi/.code={
+ \tikz@lib@graph@simplefalse%
+ }
+}%
+
+\newif\iftikz@lib@graph@simple
+
+\def\tikz@lib@graph@set@simple@edge#1#2#3#4#5{%
+ % #1 = kind (<-, ->, ...)
+ % #2 = from
+ % #3 = to
+ % #4 = options
+ % #5 = edge nodes
+ %
+ % Ok, first, test, whether edge exists:
+ \ifcsname tikz@lg@e@#3@#2\endcsname%
+ \expandafter\global\expandafter\let\csname tikz@lg@e@#3@#2\endcsname\relax% reset
+ \fi%
+ \expandafter\gdef\csname tikz@lg@e@#2@#3\endcsname{\tikz@lib@graph@make@simple@edge{#1}{#2}{#3}{#4}{#5}}%
+}%
+
+\def\tikz@lib@graph@make@simple@edge#1#2#3#4#5{%
+ \pgfqkeys{/tikz/graphs}{new #1={#2}{#3}{#4}{#5}}%
+}%
+
+
+\def\tikz@lib@graph@simple@done{%
+ \tikz@lib@graph@pack@node@list%
+ {%
+ \let\tikz@lg@do\tikz@lib@graph@simple@node%
+ \tikz@lib@graph@node@list
+ }%
+}%
+
+\def\tikz@lib@graph@simple@node#1{%
+ {%
+ \def\tikz@lib@graph@simple@from@node{#1}%
+ \let\tikz@lg@do\tikz@lib@graph@simple@other@node%
+ \tikz@lib@graph@node@list%
+ }%
+}%
+
+\def\tikz@lib@graph@simple@other@node#1{%
+ \ifcsname tikz@lg@e@\tikz@lib@graph@simple@from@node @#1\endcsname%
+ \csname tikz@lg@e@\tikz@lib@graph@simple@from@node @#1\endcsname%
+ \expandafter\global\expandafter\let\csname tikz@lg@e@\tikz@lib@graph@simple@from@node @#1\endcsname\relax%
+ \fi%
+}%
+
+
+%
+% Basic options
+%
+
+\tikzgraphsset{
+ @nodes styling/.style=,
+ nodes/.style={/tikz/graphs/@nodes styling/.append style={,#1}},
+ @edges styling/.initial=,
+ edges/.style={/tikz/graphs/@edges styling/.append={,#1}},
+ edge/.style={edges={#1}},
+ @edges node/.initial=,
+ edge node/.style={/tikz/graphs/@edges node/.append={#1}},
+ edge label/.style={/tikz/graphs/@edges node/.append={node[auto]{#1}}},
+ edge label'/.style={/tikz/graphs/@edges node/.append={node[auto,swap]{#1}}},
+ @operators/.initial=,
+ operator/.style={/tikz/graphs/@operators/.append={#1}},
+ @extra group options/.style=,
+}%
+
+
+\def\tikzgraphinvokeoperator#1{%
+ {%
+ \pgfkeyslet{/tikz/graphs/@operators}\pgfutil@empty%
+ \pgfkeys{/tikz/graphs/.cd,#1}%
+ \pgfkeysgetvalue{/tikz/graphs/@operators}\tikz@lib@graph@temp%
+ \global\let\tikz@lib@graph@temp\tikz@lib@graph@temp%
+ }%
+ \tikz@lib@graph@temp%
+ \global\let\tikz@lib@graph@temp\relax%
+}%
+
+
+%
+% The parser
+%
+
+\def\tikz@lib@graph@parser{%
+ \pgfutil@ifnextchar[{\tikz@lib@graph@parser@}{\tikz@lib@graph@parser@[]}%]
+}%
+
+\def\tikz@lib@graph@parser@[#1]{%
+ \setbox\tikz@whichbox=\hbox\bgroup%
+ \unhbox\tikz@whichbox%
+ \hbox\bgroup
+ \bgroup%
+ \pgfinterruptpath%
+ \scope[graphs/.cd,@graph drawing setup/.try,@operators=,every graph/.try,#1]%
+ \begingroup%
+ \iftikz@graph@quick%
+ \expandafter\tikz@lib@graphs@parse@quick@graph%
+ \else%
+ \expandafter\tikz@lib@graphs@normal@main%
+ \fi%
+}%
+
+\long\def\tikz@lib@graphs@normal@main#1{%
+ \pgfkeysgetvalue{/tikz/graphs/@operators}\tikz@lib@graph@outer@operators%
+ \let\tikz@lib@graph@options\pgfutil@empty%
+ \let\tikz@lib@graph@node@list\pgfutil@empty%
+ \pgfkeyssetvalue{/tikz/graphs/placement/depth}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/width}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/level}{0}%
+ \tikz@lib@graph@start@hint@group%
+ \tikz@lib@graph@parse@group{#1}%
+ \tikz@lib@graph@end@hint@group
+ \tikz@lib@graph@outer@operators%
+ \let\tikz@lg@do=\tikz@lib@graph@cleanup%
+ \tikz@lib@graph@node@list%
+ \tikz@lib@graph@main@done%
+}%
+
+\def\tikz@lib@graph@main@done{%
+ \endgroup%
+ \endscope%
+ \endpgfinterruptpath%
+ \egroup
+ \egroup%
+ \egroup%
+ \tikz@lib@graph@parser@done%
+}%
+
+
+
+
+
+\def\tikz@lib@graph@start@hint@group{%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local depth}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local width}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/chain count}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/element count}{0}%
+}%
+
+\def\tikz@lib@graph@end@hint@group{%
+ % Get local depth and width outside
+ \xdef\tikz@lib@graph@group@depth{\pgfkeysvalueof{/tikz/graphs/placement/local depth}}
+ \xdef\tikz@lib@graph@group@width{\pgfkeysvalueof{/tikz/graphs/placement/local width}}
+}%
+
+\def\tikz@lib@graph@hint@aftergroup{%
+ \pgfkeysgetvalue{/tikz/graphs/placement/width}\tikz@temp@h%
+ \pgfkeysgetvalue{/tikz/graphs/placement/local width}\tikz@temp@lh%
+ \pgfkeysgetvalue{/tikz/graphs/placement/local depth}\tikz@temp@lw%
+ \pgfmathsetmacro\tikz@temp@h{\tikz@lib@graph@group@width+\tikz@temp@h}
+ \pgfmathsetmacro\tikz@temp@lh{\tikz@lib@graph@group@width+\tikz@temp@lh}
+ \pgfmathsetmacro\tikz@temp@lw{max(\tikz@lib@graph@group@depth,\tikz@temp@lw)}
+ \pgfkeyslet{/tikz/graphs/placement/width}\tikz@temp@h%
+ \pgfkeyslet{/tikz/graphs/placement/local width}\tikz@temp@lh%
+ \pgfkeyslet{/tikz/graphs/placement/local depth}\tikz@temp@lw%
+ %
+ \pgfkeysgetvalue{/tikz/graphs/placement/element count}\tikz@temp%
+ \c@pgf@counta=\tikz@temp\relax%
+ \advance\c@pgf@counta by1\relax%
+ \edef\tikz@temp{\the\c@pgf@counta}%
+ \pgfkeyslet{/tikz/graphs/placement/element count}\tikz@temp%
+}%
+
+\def\tikz@lib@graph@placement@update{%
+ \pgfkeys{/tikz/graphs/placement/logical node depth/.expand once=\tikz@lib@graph@name}
+ \let\tikz@lib@graph@node@depth\pgfmathresult
+ \pgfkeys{/tikz/graphs/placement/logical node width/.expand once=\tikz@lib@graph@name}
+ \let\tikz@lib@graph@node@width\pgfmathresult
+ % This is a single node, so update the lengths accordingly
+ \pgfkeysgetvalue{/tikz/graphs/placement/width}\tikz@temp@h%
+ \pgfkeysgetvalue{/tikz/graphs/placement/local width}\tikz@temp@lh%
+ \pgfkeysgetvalue{/tikz/graphs/placement/local depth}\tikz@temp@lw%
+ \pgfmathsetmacro\tikz@temp@h{\tikz@lib@graph@node@width+\tikz@temp@h}
+ \pgfmathsetmacro\tikz@temp@lh{\tikz@lib@graph@node@width+\tikz@temp@lh}
+ \pgfmathsetmacro\tikz@temp@lw{max(\tikz@lib@graph@node@depth,\tikz@temp@lw)}
+ \pgfkeyslet{/tikz/graphs/placement/width}\tikz@temp@h%
+ \pgfkeyslet{/tikz/graphs/placement/local width}\tikz@temp@lh%
+ \pgfkeyslet{/tikz/graphs/placement/local depth}\tikz@temp@lw%
+ %
+ \pgfkeysgetvalue{/tikz/graphs/placement/element count}\tikz@temp%
+ \c@pgf@counta=\tikz@temp\relax%
+ \advance\c@pgf@counta by1\relax%
+ \edef\tikz@temp{\the\c@pgf@counta}%
+ \pgfkeyslet{/tikz/graphs/placement/element count}\tikz@temp%
+}%
+
+\def\tikz@lib@graph@placement@after@chain@update{%
+ \pgfkeysgetvalue{/tikz/graphs/placement/depth}\tikz@temp@w%
+ \pgfkeysgetvalue{/tikz/graphs/placement/local width}\tikz@temp@lh%
+ \pgfkeysgetvalue{/tikz/graphs/placement/local depth}\tikz@temp@lw%
+ \pgfmathsetmacro\tikz@temp@w{\tikz@lib@graph@chain@depth+\tikz@temp@w}%
+ \pgfmathsetmacro\tikz@temp@lw{\tikz@lib@graph@chain@depth+\tikz@temp@lw}%
+ \pgfmathsetmacro\tikz@temp@lh{max(\tikz@lib@graph@chain@width,\tikz@temp@lh)}%
+ \pgfkeyslet{/tikz/graphs/placement/depth}\tikz@temp@w%
+ \pgfkeyslet{/tikz/graphs/placement/local width}\tikz@temp@lh%
+ \pgfkeyslet{/tikz/graphs/placement/local depth}\tikz@temp@lw%
+ %
+ \pgfkeysgetvalue{/tikz/graphs/placement/chain count}\tikz@temp%
+ \c@pgf@counta=\tikz@temp\relax%
+ \advance\c@pgf@counta by1\relax%
+ \edef\tikz@temp{\the\c@pgf@counta}%
+ \pgfkeyslet{/tikz/graphs/placement/chain count}\tikz@temp%
+}%
+
+
+%
+% Parse a group
+%
+
+\long\def\tikz@lib@graph@parse@group#1{
+ \let\tikz@lib@graph@group@qa\pgfutil@empty%
+ \let\tikz@lib@graph@group@q\pgfutil@empty%
+ \let\tikz@lib@graph@group@c\pgfutil@empty%
+ \let\tikz@lib@graph@group@cont\pgfutil@empty%
+ \let\tikz@lib@graph@group@conta\pgfutil@empty%
+ \tikz@lib@graph@group@check#1\par\pgf@stop@eogroup%
+}%
+
+
+
+%
+% Start of a group
+%
+\def\tikz@lib@graph@group@check{%
+ \pgfutil@ifnextchar[\tikz@lib@graph@group@opt{\tikz@lib@graph@group@opt[]}%]
+}%
+
+\def\tikz@lib@graph@group@opt[#1]{%
+ \let\tikz@lib@graph@parse@extras\pgfutil@empty%
+ \tikzgraphsset{
+ @operators=,
+ every group/.try,
+ @extra group options,
+ @extra group options/.style=,%
+ #1}%
+ \expandafter\tikz@lib@graph@par\tikz@lib@graph@parse@extras%
+}%
+
+\tikzgraphsset{
+ parse/.code={\expandafter\def\expandafter\tikz@lib@graph@parse@extras\expandafter{\tikz@lib@graph@parse@extras#1}},
+}%
+
+
+
+%
+% Remove \par
+%
+
+\def\tikz@lib@graph@par{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@par@@}{\tikz@lib@graph@par@}%
+}%
+\long\def\tikz@lib@graph@par@#1\par{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \expandafter\tikz@lib@graph@quotes\tikz@lib@graph@group@c#1"}{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@c\expandafter{\tikz@lib@graph@group@c#1}%
+ \tikz@lib@graph@par%
+ }%
+}%
+\long\def\tikz@lib@graph@par@@#1{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@c\expandafter{\tikz@lib@graph@group@c{#1}}%
+ \tikz@lib@graph@par
+}%
+
+
+
+%
+% Replace ..."..."... by ..."{...}"...
+%
+\def\tikz@lib@graph@quotes{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@quotes@@}{\tikz@lib@graph@quotes@}%
+}%
+\def\tikz@lib@graph@quotes@#1"{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \tikz@lib@graph@passon{#1}%
+ }{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@q\expandafter{\tikz@lib@graph@group@q#1"}%
+ \tikz@lib@graph@quotes@cont%
+ }%
+}%
+
+\def\tikz@lib@graph@quotes@cont#1"#2"{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \tikz@lib@graph@passon{{#1}"#2}}{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@q\expandafter{\tikz@lib@graph@group@q{#1}"#2"}%
+ \tikz@lib@graph@quotes@cont}%
+}%
+
+\def\tikz@lib@graph@quotes@@#1{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@q\expandafter{\tikz@lib@graph@group@q{#1}}%
+ \tikz@lib@graph@quotes%
+}%
+
+
+
+%
+% Replace ..."..."... by ..."{...}"... (active version)
+%
+{%
+ \catcode`\"=13\relax
+
+ \gdef\tikz@lib@graph@passon#1{\expandafter\tikz@lib@graph@quotesactive\tikz@lib@graph@group@q#1"}%
+
+ \gdef\tikz@lib@graph@quotesactive{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@quotesactive@@}{\tikz@lib@graph@quotesactive@}%
+ }%
+ \gdef\tikz@lib@graph@quotesactive@#1"{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \expandafter\tikz@lib@graph@encloser\tikz@lib@graph@group@qa#1[%
+ }{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@qa\expandafter{\tikz@lib@graph@group@qa#1"}%
+ \tikz@lib@graph@quotesactive@cont%
+ }%
+ }%
+
+ \gdef\tikz@lib@graph@quotesactive@cont#1"#2"{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \expandafter\tikz@lib@graph@encloser\tikz@lib@graph@group@qa{#1}"#2[}{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@qa\expandafter{\tikz@lib@graph@group@qa{#1}"#2"}%
+ \tikz@lib@graph@quotesactive@cont}%
+ }%
+
+ \gdef\tikz@lib@graph@quotesactive@@#1{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@qa\expandafter{\tikz@lib@graph@group@qa{#1}}%
+ \tikz@lib@graph@quotesactive%
+ }%
+}%
+
+
+
+
+%
+% Replace ...[...]... by ...[{...}]...
+%
+\def\tikz@lib@graph@encloser{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@encloser@@}{\tikz@lib@graph@encloser@}%
+}%
+\def\tikz@lib@graph@encloser@#1[{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \expandafter\tikz@lib@graph@semi\tikz@lib@graph@group@cont#1;%
+ }{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@cont\expandafter{\tikz@lib@graph@group@cont#1[}%]
+ \tikz@lib@graph@encloser@cont%
+ }%
+}%
+
+\def\tikz@lib@graph@encloser@cont#1]#2[{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \expandafter\tikz@lib@graph@semi\tikz@lib@graph@group@cont{#1}]#2;}{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@cont\expandafter{\tikz@lib@graph@group@cont{#1}]#2[}%
+ \tikz@lib@graph@encloser@cont}%
+}%
+
+\def\tikz@lib@graph@encloser@@#1{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@cont\expandafter{\tikz@lib@graph@group@cont{#1}}%
+ \tikz@lib@graph@encloser%
+}%
+
+
+
+
+%
+% Replace ; by ,
+%
+
+\def\tikz@lib@graph@semi{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@semi@@}{\tikz@lib@graph@semi@}%
+}%
+\def\tikz@lib@graph@semi@#1;{%
+ \pgfutil@ifnextchar\pgf@stop@eogroup{%
+ \expandafter\tikz@lib@graph@main@parser\tikz@lib@graph@group@conta#1,}{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@conta\expandafter{\tikz@lib@graph@group@conta#1,}%
+ \tikz@lib@graph@semi%
+ }%
+}%
+\def\tikz@lib@graph@semi@@#1{%
+ \expandafter\def\expandafter\tikz@lib@graph@group@conta\expandafter{\tikz@lib@graph@group@conta{#1}}%
+ \tikz@lib@graph@semi%
+}%
+
+
+%
+% Main parse
+%
+
+\def\tikz@lib@graph@main@parser{%
+ \begingroup%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local depth}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local width}{0}%
+ \let\tikz@lib@graph@stored@actions\pgfutil@empty%
+ \let\tikz@lib@graph@node@list\pgfutil@empty% reset
+ \tikz@lib@graph@main@parser@start%
+}%
+\def\tikz@lib@graph@main@parser@start{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@protect@group}{\tikz@lib@graph@main@parser@cont}%
+}%
+
+\def\tikz@lib@graph@protect@group#1{% skip space
+ \pgfutil@ifnextchar\relax{\tikz@lib@graph@main@parser@cont{{#1}}}{\tikz@lib@graph@main@parser@cont{{#1}}}%
+}%
+
+\def\tikz@lib@graph@main@parser@cont{\tikz@lib@graph@check@quotes\tikz@lib@graph@main@parser@cont@normal}%
+\def\tikz@lib@graph@main@parser@cont@normal#1,{%
+ \tikz@lib@graph@parse@one#1-\pgf@stop@eodashes%
+}%
+
+\def\tikz@lib@graph@parse@one{%
+ \pgfutil@ifnextchar\bgroup\tikz@lib@graph@scope\tikz@lib@graph@node%
+}%
+
+
+
+% Special quoted nodes
+
+\def\tikz@lib@graph@check@quotes#1{%
+ \let\tikz@lib@graph@cont@quote#1%
+ \pgfutil@ifnextchar"{\begingroup\pgfkeys@temptoks{}\pgfutil@empty\tikz@lib@graph@quote@parser}{\tikz@lib@graph@check@quotes@active}%
+}%
+{%
+ \catcode`\"=13\relax
+ \gdef\tikz@lib@graph@check@quotes@active{%
+ \pgfutil@ifnextchar"{\begingroup\pgfkeys@temptoks{}\pgfutil@empty\tikz@lib@graph@quote@parser@active}{\tikz@lib@graph@cont@quote}%
+ }%
+ \gdef\tikz@lib@graph@quote@parser@active"#1"{%
+ \pgfkeys@temptoks\expandafter{\the\pgfkeys@temptoks #1}%
+ \pgfutil@ifnextchar"{\pgfkeys@temptoks\expandafter{\the\pgfkeys@temptoks "}\tikz@lib@graph@quote@parser@active}{\tikz@lib@graph@quote@parser@done}%
+ }%
+}%
+
+\def\tikz@lib@graph@quote@parser"#1"{%
+ \pgfkeys@temptoks\expandafter{\the\pgfkeys@temptoks #1}%
+ \pgfutil@ifnextchar"{\pgfkeys@temptoks\expandafter{\the\pgfkeys@temptoks "}\tikz@lib@graph@quote@parser}{\tikz@lib@graph@quote@parser@done}%
+}%
+
+\def\tikz@lib@graph@quote@parser@done{%
+ {\expandafter\scantokens\expandafter{%
+ \expandafter\expandafter\expandafter\tikzlibgraphactivations\expandafter\expandafter\expandafter\tikzlibgraphdoedef\expandafter{\the\pgfkeys@temptoks}%
+ }}%
+ {\expandafter\scantokens\expandafter{\expandafter\tikzlibgraphactivationsbrace\expandafter\xdef\expandafter\tikzlibgraphreplaced\expandafter<\tikzlibgraphreplaced>\catcode`\}=2\relax}}%
+ \edef\tikzlibgraphreplaced{\expandafter\detokenize\expandafter{\tikzlibgraphreplaced}}
+ \pgfutil@ifnextchar/\tikz@lib@graph@quotes@slash\tikz@lib@graph@quotes@no@slash%
+}%
+\def\tikz@lib@graph@quotes@no@slash{%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter%
+ \tikz@smuggle\expandafter\expandafter\expandafter{\expandafter\tikzlibgraphreplaced\expandafter/\expandafter{\the\pgfkeys@temptoks}}%
+ \expandafter\endgroup\expandafter\tikz@lib@graph@cont@quote\tikz@smuggle%
+}%
+\def\tikz@lib@graph@quotes@slash/{%
+ \pgfutil@ifnextchar/% Ah, double slash...
+ {\tikz@lib@graph@quotes@no@slash/}{\expandafter\endgroup\expandafter\tikz@lib@graph@cont@quote\tikzlibgraphreplaced/}%
+}%
+\def\tikzlibgraphdoedef{\xdef\tikzlibgraphreplaced}%
+
+\def\tikz@lib@prepare@active#1#2#3{%
+ {%
+ \catcode`#1=13\relax%
+ \scantokens{\gdef\tikzlibgraphactivator{\def#2{@#3@}}}%
+ }%
+ \pgfutil@g@addto@macro\tikzlibgraphactivations{\catcode`#1=13\relax}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\tikzlibgraphactivations\expandafter{\tikzlibgraphactivator}%
+}%
+
+\let\tikzlibgraphactivations\pgfutil@empty
+
+%
+% Remove \outer from \+ for plain TeX
+%
+
+\outer\def\tikz@lib@outer@test{\tabalign}%
+\ifx\+\tikz@lib@outer@test
+ \def\+{\tabalign}
+\fi
+
+\tikz@lib@prepare@active{\$}{$}{DOLLAR SIGN}% $
+\tikz@lib@prepare@active{\&}{&}{AMPERSAND}%
+\tikz@lib@prepare@active{\^}{^}{CIRCUMFLEX ACCENT}%
+\tikz@lib@prepare@active{\~}{~}{TILDE}%
+\tikz@lib@prepare@active{\_}{_}{LOW LINE}%
+\tikz@lib@prepare@active{\|}{|}{VERTICAL LINE}%
+\tikz@lib@prepare@active{\[}{[}{LEFT SQUARE BRACKET}%
+\tikz@lib@prepare@active{\]}{]}{RIGHT SQUARE BRACKET}%
+\tikz@lib@prepare@active{\(}{(}{LEFT PARENTHESIS}%
+\tikz@lib@prepare@active{\)}{)}{RIGHT PARENTHESIS}%
+\tikz@lib@prepare@active{\/}{/}{SOLIDUS}%
+\tikz@lib@prepare@active{\.}{.}{FULL STOP}%
+\tikz@lib@prepare@active{\-}{-}{HYPHEN MINUS}%
+\tikz@lib@prepare@active{\,}{,}{COMMA}%
+\tikz@lib@prepare@active{\+}{+}{PLUS SIGN}%
+\tikz@lib@prepare@active{\*}{*}{ASTERISK}%
+\tikz@lib@prepare@active{\'}{'}{APOSTROPHE}%
+\tikz@lib@prepare@active{\!}{!}{EXCLAMATION MARK}%
+\tikz@lib@prepare@active{\"}{"}{QUOTATION MARK}%
+\tikz@lib@prepare@active{\:}{:}{COLON}%
+\tikz@lib@prepare@active{\;}{;}{SEMINCOLON}%
+\tikz@lib@prepare@active{\<}{<}{LESS THAN SIGN}%
+\tikz@lib@prepare@active{\=}{=}{EQUALS SIGN}%
+\tikz@lib@prepare@active{\>}{>}{GREATER THAN SIGN}%
+\tikz@lib@prepare@active{\?}{?}{QUESTION MARK}%
+%\tikz@lib@prepare@active{\@}{@}{COMMERCIAL AT}%
+\tikz@lib@prepare@active{\`}{`}{GRAVE ACCENT}%
+{\catcode`\%=11\catcode`\#=11
+\tikz@lib@prepare@active{\%}{%}{PERCENT SIGN}
+\tikz@lib@prepare@active{\#}{#}{NUMBER SIGN}
+}
+
+\pgfutil@g@addto@macro\tikzlibgraphactivations{\catcode`\\=13\relax}%
+{%
+ \catcode`\|=0\relax
+ \catcode`\\=13\relax
+ |pgfutil@g@addto@macro|tikzlibgraphactivations{|def\{@REVERSE SOLIDUS@}}%
+}%
+{%
+ \gdef\tikzlibgraphscommercialat{@COMMERCIAL AT@}%
+ \let\g=\pgfutil@g@addto@macro
+ \catcode`\@=13\relax
+ \g\tikzlibgraphactivations{\catcode`\@=13\relax\let@=\tikzlibgraphscommercialat}%
+}%
+
+\def\tikzlibgraphactivationsbrace{%
+ \catcode`\{=13\relax%
+ \catcode`\}=13\relax%
+ \catcode`\<=1\relax%
+ \catcode`\>=2\relax%
+}%
+{%
+ \catcode`\{=13\relax%
+ \catcode`\}=13\relax%
+ \catcode`\<=1\relax%
+ \catcode`\>=2\relax%
+ \pgfutil@g@addto@macro\tikzlibgraphactivationsbrace<\def{<@LEFT CURLY BRACE@>> %}
+ \pgfutil@g@addto@macro\tikzlibgraphactivationsbrace<\def}<@RIGHT CURLY BRACE@>> %{
+>%
+
+% A normal node
+
+% First, check for special quote syntax:
+
+\def\tikz@lib@graph@node{\tikz@lib@graph@check@quotes\tikz@lib@graph@node@normal}%
+
+\def\tikz@lib@graph@node@normal{%
+ \pgfutil@ifnextchar({\tikz@lib@graph@node@dressed}{\tikz@lib@graph@node@naked}%
+}%
+
+\def\tikz@lib@graph@node@dressed(#1){%
+ % Add extra braces around nodes to protect dashes
+ \tikz@lib@graph@node@naked{(#1)}%
+}%
+
+\def\tikz@lib@graph@node@naked#1-{%
+ % Detect trailing <
+ \tikz@lib@graph@@node#1<\pgf@stop%
+}%
+
+\def\tikz@lib@graph@@node#1<#2\pgf@stop%
+{
+ %
+ % #1 will be a node (not a group)
+ %
+ % Syntax: node name [options]
+ %
+ % Grab node name
+ \tikz@lib@graph@grab@name#1\pgf@stop%
+ \tikz@lib@graph@stored@actions%
+ \pgfutil@ifnextchar\pgf@stop@eodashes{%
+ \tikz@lib@graph@graph@done%
+ }{%
+ %
+ % Now, get arrow kind
+ %
+ \def\pgf@test{#2}%
+ \ifx\pgf@test\pgfutil@empty%
+ \expandafter\tikz@lib@graph@no@back@arrow%
+ \else%
+ \expandafter\tikz@lib@graph@back@arrow%
+ \fi%
+ }%
+}%
+
+\def\tikz@lib@graph@no@back@arrow{%
+ \pgfutil@ifnextchar>\tikz@lib@graph@forward@arrow{%
+ \pgfutil@ifnextchar-\tikz@lib@graph@undirected@arrow{%
+ \pgfutil@ifnextchar!\tikz@lib@graph@no@arrow{%
+ \tikzerror{One of the arrow types <-, --, ->, -!- or <-> expected}%
+ \tikz@lib@graph@undirected@arrow%
+ }%
+ }%
+ }%
+}%
+
+\def\tikz@lib@graph@undirected@arrow-{%
+ \def\tikz@lib@graph@arrow@type{--}%
+ \tikz@lib@graph@after@arrow%
+}%
+
+\def\tikz@lib@graph@forward@arrow>{%
+ \def\tikz@lib@graph@arrow@type{->}%
+ \tikz@lib@graph@after@arrow%
+}%
+
+\def\tikz@lib@graph@bi@arrow>{%
+ \def\tikz@lib@graph@arrow@type{<->}%
+ \tikz@lib@graph@after@arrow%
+}%
+
+\def\tikz@lib@graph@no@arrow!-{%
+ \def\tikz@lib@graph@arrow@type{-!-}%
+ \tikz@lib@graph@after@arrow%
+}%
+
+\def\tikz@lib@graph@back@arrow{%
+ \pgfutil@ifnextchar>{\tikz@lib@graph@bi@arrow}{%
+ \def\tikz@lib@graph@arrow@type{<-}%
+ \tikz@lib@graph@after@arrow%
+ }%
+}%
+
+\def\tikz@lib@graph@after@arrow{%
+ \pgfutil@ifnextchar[{\tikz@lib@graph@after@arrow@opt}{\tikz@lib@graph@after@arrow@opt[]}%]
+}%
+
+\def\tikz@lib@graph@after@arrow@opt[#1]{%
+ %
+ % Ok, first recolor
+ %
+ \tikzgraphinvokeoperator{recolor source by=source''}
+ \tikzgraphinvokeoperator{recolor target by=target'}
+ % Save action for next node
+ \expandafter\def\expandafter\tikz@lib@graph@stored@actions\expandafter{%
+ \expandafter\tikz@lib@graph@joiner\expandafter{\tikz@lib@graph@arrow@type}{#1}}%
+ %
+ \tikzgdeventgroupcallback{descendants}%
+ \tikz@lib@graph@parse@one%
+}%
+
+\def\tikz@lib@graph@joiner#1#2{%
+ \tikzgraphinvokeoperator{recolor source by=source'}
+ \tikzgraphinvokeoperator{recolor source'' by=source}
+ {%
+ \tikz@enable@edge@quotes%
+ \pgfkeyssetvalue{/tikz/graphs/default edge kind}{#1}%
+ \pgfkeys{/tikz/graphs/.cd,@operators=,%
+ /tikz/graphs/.unknown/.code=\tikz@lib@graph@unknown@edge@option{##1},#2}%
+ \pgfkeysgetvalue{/tikz/graphs/@operators}\pgf@temp%
+ \ifx\pgf@temp\pgfutil@empty%
+ \edef\pgf@temp{\noexpand\pgfkeys{/tikz/graphs/.cd,\pgfkeysvalueof{/tikz/graphs/default edge operator}}}%
+ \pgf@temp%
+ \pgfkeysgetvalue{/tikz/graphs/@operators}\pgf@temp%
+ \fi%
+ \pgf@temp%
+ }%
+ \tikzgraphinvokeoperator{not source',not target'}
+}%
+
+\def\tikz@lib@graph@unknown@edge@option#1{%
+ \def\tikz@temp{/tikz/graphs/@edges styling/.append=}
+ \expandafter\expandafter\expandafter\pgfkeys%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@temp\expandafter{\expandafter,\pgfkeyscurrentname={#1}}}
+}%
+
+\def\tikz@lib@graph@graph@done\pgf@stop@eodashes{%
+ % Get local depth and width outside
+ \xdef\tikz@lib@graph@chain@depth{\pgfkeysvalueof{/tikz/graphs/placement/local depth}}
+ \xdef\tikz@lib@graph@chain@width{\pgfkeysvalueof{/tikz/graphs/placement/local width}}
+ % Get node list outside...
+ \expandafter%
+ \endgroup%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@graph@node@list\tikz@lib@graph@node@list}%
+ % Compute new local depth and width of group...
+ \tikz@lib@graph@placement@after@chain@update
+ %
+ \pgfutil@ifnextchar\pgf@stop@eogroup%
+ \tikz@lib@graph@graph@group@done%
+ \tikz@lib@graph@main@parser%
+}%
+
+\def\tikz@lib@graph@graph@group@done\pgf@stop@eogroup{%
+ \pgfkeysvalueof{/tikz/graphs/@operators}%
+}%
+
+
+
+%
+% Handle node
+%
+\def\tikz@lib@graph@grab@name{%
+ \pgfutil@ifnextchar\foreach\tikz@lib@graph@do@foreach\tikz@lib@graph@parse@node@text%
+}%
+
+\def\tikz@lib@graph@do@foreach\foreach#1in{%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@graph@do@foreach@normal{#1}}{\def\tikz@temp{#1}\tikz@lib@graph@do@foreach@macro}%
+}%
+\def\tikz@lib@graph@do@foreach@macro#1{%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@do@foreach@normal\expandafter\tikz@temp\expandafter{#1}%
+}%
+
+\def\tikz@lib@graph@do@foreach@normal#1#2#3\pgf@stop{%
+ % Ok, we do a parse on a foreach loop.
+ \begingroup
+ \let\tikz@lib@graph@node@list@saved\pgfutil@empty%
+ \xdef\tikz@lib@graph@saved@placement{%
+ {\pgfkeysvalueof{/tikz/graphs/placement/local depth}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/local width}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/chain count}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/element count}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/width}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/depth}}%
+ }%
+ \foreach #1 in {#2}%
+ {%
+ \let\tikz@lib@graph@node@list\tikz@lib@graph@node@list@saved%
+ \expandafter\tikz@lib@graph@setup@placement\tikz@lib@graph@saved@placement%
+ \tikz@lib@graph@parse@group{#3}%
+ \xdef\tikz@lib@graph@saved@placement{%
+ {\pgfkeysvalueof{/tikz/graphs/placement/local depth}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/local width}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/chain count}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/element count}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/width}}%
+ {\pgfkeysvalueof{/tikz/graphs/placement/depth}}%
+ }%
+ % TODO: Need to also save hints!
+ \global\let\tikz@lib@graph@node@list@saved\tikz@lib@graph@node@list%
+ }%
+ \expandafter%
+ \endgroup%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@graph@node@list\tikz@lib@graph@node@list@saved}%
+ \expandafter\tikz@lib@graph@setup@placement\tikz@lib@graph@saved@placement%
+}%
+
+\def\tikz@lib@graph@setup@placement#1#2#3#4#5#6{%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local depth}{#1}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local width}{#2}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/chain count}{#3}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/element count}{#4}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/width}{#5}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/depth}{#6}%
+}%
+
+\def\tikz@lib@graph@parse@node@text#1\pgf@stop{%
+ %
+ % Ok, first test whether #1 contains "//"
+ %
+ \pgfutil@in@{//}{#1 }
+ \ifpgfutil@in@%
+ % Ok, a layout node:
+ \tikz@lib@parse@layout@node#1\pgf@stop%
+ \else%
+ \tikz@lib@graph@fake@nodefalse
+ \let\tikz@lib@graph@node@parsed\tikz@lib@graph@node@opt@normal%
+ \def\tikz@lib@graph@empty@node@parsed{\tikzgdeventcallback{node}{}}%
+ \tikz@lib@parse@normal@node#1[\pgf@stop%
+ \fi%
+}%
+
+\newif\iftikzgraphsautonumbernodes
+\newcount\tikz@lib@auto@number
+
+\def\tikz@lib@do@autonumber{%
+ \ifx\tikz@lib@graph@name@only\pgfutil@empty%
+ \else%
+ \edef\tikz@lib@graph@name@only{\tikz@lib@graph@name@only\tikz@lib@auto@sep\the\tikz@lib@auto@number}%
+ \global\advance\tikz@lib@auto@number by1\relax%
+ \fi%
+}%
+
+%
+% Parse the normal part of a node (name and, possibly, text after slash)
+%
+
+\def\tikz@lib@parse@normal@node#1[{
+ %
+ % Test whether #1 contains "/" or "__"
+ %
+ \pgfutil@in@{/}{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@parse@node@with@slash#1\pgf@stop%
+ \else
+ \pgfutil@in@{__}{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@parse@node@with@doubleunder#1\pgf@stop%
+ \else
+ \edef\pgf@marshal{\noexpand\pgfkeys@spdef\noexpand\tikz@lib@graph@name@only{#1}}%
+ \pgf@marshal%
+ \let\tikz@lib@graph@node@text\tikz@lib@graph@name@only%
+ \edef\tikz@lib@graph@name{\tikz@lib@graph@path\tikz@lib@graph@name@only}%
+ \fi%
+ \fi%
+ \tikz@lib@graph@handle@node@cont%
+}%
+
+\def\tikz@lib@parse@node@with@slash#1/{
+ \pgfkeys@spdef\tikz@lib@graph@name@only{#1}%
+ \ifx\tikz@lib@graph@name@only\pgfutil@empty%
+ \global\advance\tikz@fig@count by1\relax
+ \edef\tikz@lib@graph@name@only{tikz@f@\the\tikz@fig@count}%
+ \fi%
+ \edef\tikz@lib@graph@name{\tikz@lib@graph@path\tikz@lib@graph@name@only}%
+ \pgfutil@ifnextchar"\tikz@lg@slash@quote{\pgfutil@ifnextchar\tikz@active@quotes@token\tikz@lg@slash@quote@active\tikz@lg@slash@cont}
+}%
+\def\tikz@lg@slash@quote"#1"#2\pgf@stop{%
+ \iftikz@handle@active@nodes%
+ \def\tikz@lib@graph@node@text{\scantokens{#1}}%
+ \else
+ \def\tikz@lib@graph@node@text{#1}%
+ \fi%
+}%
+{\catcode`\"=13\relax
+ \gdef\tikz@lg@slash@quote@active"#1"#2\pgf@stop{%
+ \iftikz@handle@active@nodes%
+ \def\tikz@lib@graph@node@text{\scantokens{#1}}%
+ \else
+ \def\tikz@lib@graph@node@text{#1}%
+ \fi%
+ }%
+}%
+\def\tikz@lg@slash@cont#1\pgf@stop{%
+ \iftikz@handle@active@nodes%
+ \def\tikz@lib@graph@node@text{\scantokens{#1}}%
+ \else
+ \def\tikz@lib@graph@node@text{#1}%
+ \fi%
+}%
+
+\def\tikz@lib@parse@node@with@doubleunder#1__{\tikz@lib@parse@node@with@slash{#1}/}%
+
+\def\tikz@lg@find@fresh@name{%
+ \edef\tikz@lib@graph@name@only{\tikz@lib@graph@name@only'}%
+ \edef\tikz@lib@graph@name{\tikz@lib@graph@path\tikz@lib@graph@name@only}%
+ \tikz@lg@if@local@node{\tikz@lib@graph@name}{\tikz@lg@find@fresh@name}{}%
+}%
+
+
+%
+% We have now parsed everything up to the opening "[". We continue
+%
+
+\def\tikz@lib@graph@handle@node@cont{%
+ \iftikzgraphsautonumbernodes%
+ \tikz@lib@do@autonumber%
+ \fi%
+ \iftikz@lib@graph@fresh@node%
+ \tikz@lg@if@local@node{\tikz@lib@graph@name}{\tikz@lg@find@fresh@name}{}%
+ \fi%
+ \let\tikzgraphnodeas\tikzgraphnodeas@default%
+ \pgfutil@ifnextchar\pgf@stop{%
+ \ifx\tikz@lib@graph@name@only\pgfutil@empty%
+ \expandafter\tikz@lib@graph@node@empty@done%
+ \else
+ \expandafter\tikz@lib@graph@node@opt\expandafter[\expandafter]\expandafter[%
+ \fi%
+ }{\tikz@lib@graph@node@opt[}%
+}%
+
+\def\tikzgraphnodeas@default{%
+ \tikz@lib@graph@typesetter%
+}%
+
+\let\tikz@lib@graph@empty@node@parsed\relax%
+
+\def\tikz@lib@graph@node@opt[#1]#2[\pgf@stop{%
+ \tikz@lib@graph@node@parsed{#1}%
+}%
+
+\def\tikz@lib@graph@node@empty@done\pgf@stop{\tikz@lib@graph@empty@node@parsed}%
+
+%
+% Parse a layout node
+%
+
+\def\tikz@lib@parse@layout@node#1//{%
+ \pgf@lib@graph@empty@layout@nodefalse%
+ \let\tikz@lib@graph@node@parsed\tikz@lib@layout@node@parsed%
+ \let\tikz@lib@graph@empty@node@parsed\tikz@lib@graph@empty@layout@node@parsed
+ \tikz@lib@parse@normal@node#1[\pgf@stop%
+}%
+
+\newif\ifpgf@lib@graph@empty@layout@node
+
+\def\tikz@lib@layout@node@parsed{%
+ \tikz@lib@layout@parse@rest%
+}%
+
+\def\tikz@lib@graph@empty@layout@node@parsed{%
+ \pgf@lib@graph@empty@layout@nodetrue
+ \tikz@lib@layout@parse@rest{}%
+}%
+
+\def\tikz@lib@layout@parse@rest#1{%
+ \def\tikz@lib@layout@node@options{#1}%
+ \pgfutil@ifnextchar[{\tikz@lib@layout@node@opt}{\tikz@lib@layout@node@opt[]}%}
+}%
+
+\def\tikz@lib@layout@node@parsed#1{%
+ \def\tikz@lib@layout@node@options{#1}%
+ \pgfutil@ifnextchar[{\tikz@lib@layout@node@opt}{\tikz@lib@layout@node@opt[]}%}
+}%
+
+\def\tikz@lib@layout@node@opt[#1]{%
+ \def\tikz@lib@layout@options{#1}%
+ \pgfutil@ifnextchar\bgroup{\tikz@lib@layout@start}{\tikzerror{Opening brace at beginning of sublayout expected}}%
+}%
+
+
+%
+% Typeset a normal node
+%
+
+\def\tikz@lib@graph@node@opt@normal#1{%
+ \expandafter\tikz@lib@graph@test@use@list\tikz@lib@graph@name@only\pgf@stop
+ \iftikz@lib@graph@use@list%
+ % Ok, make a list of the nodes stored in #1:
+ \let\tikz@lg@temp\pgfutil@empty%
+ \foreach \tikz@lg@node@name in \tikz@lib@graph@use@list {\expandafter\tikz@lib@graph@handle@use\expandafter{\tikz@lg@node@name}}
+ % Ok, now add the nodes to the node list
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\tikz@lib@graph@node@list\tikz@lg@temp}%
+ % Then color and initialize them:
+ \let\tikz@lg@do\tikz@lib@graph@do@use%
+ \tikz@lg@temp%
+ \else%
+ \edef\tikz@lib@graph@name{\tikz@lib@graph@path\tikz@lib@graph@name@only}%
+ \expandafter\ifx\csname tikz@lib@graph@def@\tikz@lib@graph@name@only\endcsname\relax%
+ \pgfkeysgetvalue{/tikz/graphs/placement/level}\tikz@temp%
+ \c@pgf@counta=\tikz@temp\relax%
+ \advance\c@pgf@counta by1\relax%
+ \edef\tikz@temp{\the\c@pgf@counta}%
+ \pgfkeyslet{/tikz/graphs/placement/level}\tikz@temp%
+ \tikzgraphsset{
+ level/.try=\pgfkeysvalueof{/tikz/graphs/placement/level},
+ level \pgfkeysvalueof{/tikz/graphs/placement/level}/.try
+ }
+ {%
+ \edef\tikz@lib@graph@node@list{\noexpand\tikz@lg@do{\tikz@lib@graph@name}}%
+ \global\tikz@lib@graph@node@createdfalse%
+ \pgfkeyslet{/tikz/graphs/@operators}\pgfutil@empty%
+ \tikz@lib@activate@source@target@edge@syntax%
+ \tikz@lg@if@local@node{\tikz@lib@graph@name}%
+ {\tikz@lg@local@node@handle{#1}}%
+ {%
+ \tikz@lg@init@color{\tikz@lib@graph@name}{\tikz@lgc@all@true\tikz@lgc@source@true\tikz@lgc@target@true}%
+ \iftikz@lib@graph@all%
+ \tikzgraphsset{#1}\pgfkeysvalueof{/tikz/graphs/@operators}%
+ \else%
+ \pgfkeys{/tikz/graphs/placement/place}%
+ \let\tikzgraphnodetext\tikz@lib@graph@node@text%
+ \let\tikzgraphnodename\tikz@lib@graph@name@only%
+ \let\tikzgraphnodepath\tikz@lib@graph@path%
+ \let\tikzgraphnodefullname\tikz@lib@graph@name%
+ \iftikz@lib@graph@fake@node%
+ {% run options in protected mode...
+ \pgfkeys{
+ /tikz/graphs/.cd,%
+ .unknown/.code=,
+ /tikz/graphs/@nodes styling,%
+ #1}%
+ \pgfkeysgetvalue{/tikz/graphs/@operators}\tikz@lib@graph@op@save%
+ \global\let\tikz@lib@graph@op@save\tikz@lib@graph@op@save%
+ }%
+ \else%
+ \node [%
+ name=\tikz@lib@graph@name,%
+ execute at end node={%
+ \pgfkeysgetvalue{/tikz/graphs/@operators}\tikz@lib@graph@op@save%
+ \global\let\tikz@lib@graph@op@save\tikz@lib@graph@op@save%
+ },%
+ graphs/redirect unknown to tikz,
+ /tikz/graphs/.cd,%
+ /tikz/graphs/@nodes styling,%
+ #1]%
+ {%
+ \tikzgraphnodeas%
+ };%
+ \fi%
+ \tikz@lib@graph@op@save\global\let\tikz@lib@graph@op@save\relax%%
+ \global\tikz@lib@graph@node@createdtrue%
+ \fi
+ }%
+ }%
+ \iftikz@lib@graph@node@created\tikz@lib@graph@placement@update\fi%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\tikz@lib@graph@node@list\expandafter\tikz@lg@do\expandafter{\tikz@lib@graph@name}}%
+ \iftikz@lib@graph@trie\tikzgraphsset{name=\tikz@lib@graph@name@only}\fi%
+ \else
+ % The name of the node is a graph name
+ \tikz@lib@graph@handle@graph{#1}%
+ \fi
+ \fi%
+}%
+
+\newif\iftikz@lib@graph@fake@node
+
+\newif\iftikz@lib@graph@use@list
+\def\tikz@lib@graph@test@use@list{%
+ \pgfutil@ifnextchar({\tikz@lib@graph@use@list@grap}{\tikz@lib@graph@test@use@list@done}%)
+}%
+
+\def\tikz@lib@graph@test@use@list@done#1\pgf@stop{\tikz@lib@graph@use@listfalse}%
+\def\tikz@lib@graph@use@list@grap(#1)\pgf@stop{\def\tikz@lib@graph@use@list{#1}\tikz@lib@graph@use@listtrue}%
+
+
+%
+% Typeset a layout node
+%
+
+\def\tikz@lib@layout@start#1#2\pgf@stop{%
+ \tikz@lib@ensure@gd@loaded%
+ % Parameters are:
+ %
+ % Node name is \tikz@lib@graph@name@only
+ % Node text is \tikz@lib@graph@node@text
+ % Node options are \tikz@lib@layout@node@options
+ % Layout options are \tikz@lib@layout@options
+ % Layout is #1
+ % Rest is #2 (should be empty or just whitespace)
+ \tikz@lib@graph@fake@nodefalse%
+ \ifpgf@lib@graph@empty@layout@node%
+ \else%
+ \ifx\tikz@lib@graph@name\pgfutil@empty%
+ \tikzerror{Internal error: Node has no name, but it should!}%
+ \else
+ \tikz@lib@graph@fake@nodetrue%
+ \expandafter\tikz@lib@graph@node@opt@normal\expandafter{\tikz@lib@layout@node@options}%
+ \fi%
+ \fi%
+ \edef\tikz@lib@graph@name{\tikz@lib@graph@path\tikz@lib@graph@name@only}%
+ %
+ % Prepare tikz node options
+ %
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@layout@node@options\expandafter\expandafter\expandafter{\expandafter\tikz@lib@layout@startup@node@options\tikz@lib@layout@node@options,}%
+ \begingroup
+ % Create a subgraph node, if name is given.
+ \iftikz@lib@graph@fake@node%
+ \expandafter\expandafter\expandafter%
+ \expandafter\expandafter\expandafter\expandafter\tikz@lib@make@subgraph@node%
+ \expandafter\expandafter\expandafter%
+ \expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@name%
+ \expandafter\expandafter\expandafter}%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\tikz@lib@graph@node@text\expandafter}\expandafter{\tikz@lib@layout@node@options}
+ \fi%
+ %
+ % Here comes the scope:
+ %
+ \expandafter\expandafter\expandafter\scope\expandafter\expandafter\expandafter[\expandafter\tikz@lib@layout@node@options@prefix\tikz@lib@layout@options]
+ \tikzgdeventgroupcallback{array}%
+ \let\tikz@lib@graph@node@list\pgfutil@empty%
+ \tikz@lib@graph@start@hint@group%
+ \tikz@lib@graph@parse@group{#1}%
+ \tikz@lib@graph@end@hint@group%
+ \def\tikz@lg@old@col{\tikz@lgc@source@true}%
+ \let\tikz@lg@new@col\pgfutil@empty%
+ \let\tikz@lg@do\tikz@lg@change@color%
+ \tikz@lib@graph@node@list%
+ \def\tikz@lg@old@col{\tikz@lgc@target@true}%
+ \tikz@lib@graph@node@list%
+ \expandafter%
+ \endscope\expandafter%
+ \endgroup%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@graph@node@list\tikz@lib@graph@node@list}%
+ \tikz@lib@graph@hint@aftergroup%
+}%
+\def\tikz@lib@make@subgraph@node#1#2#3{%
+ \pgfgdsubgraphnode{#1}{#3}{\pgfgdsubgraphnodecontents{#2}}%
+}%
+\def\tikz@lib@layout@startup@node@options{%
+ /utils/exec=\tikzlibignorecomparisonsINTERNAL,
+ /tikz/graphs/.cd,%
+ redirect unknown to tikz,%
+ anchor=base,%
+ /tikz/every subgraph node/.try,%
+}%
+\def\tikzlibignorecomparisonsINTERNAL{%
+ \pgfkeys{/handlers/first char syntax=true}
+ \pgfkeyssetvalue{/handlers/first char syntax/the character >}{\pgfutil@gobble}%
+ \pgfkeyssetvalue{/handlers/first char syntax/the character <}{\pgfutil@gobble}%
+}%
+\def\tikz@lib@layout@node@options@prefix{graphs/.cd,}%
+
+\ifx\tikz@lib@ensure@gd@loaded\pgfutil@undefined%
+\def\tikz@lib@ensure@gd@loaded{\tikzerror{You must say \string\usetikzlibrary{graphdrawing} to use the (sub)layout syntax}}%
+\fi
+
+\def\tikz@lg@local@node@handle#1{%
+ %
+ % Handle late options and operators
+ \tikzgraphsset{source,target,.unknown/.code=,#1}%
+ \tikzgdlatenodeoptionacallback{\tikz@lib@graph@name}%
+ \node also[graphs/redirect unknown to tikz,/tikz/graphs/.cd,#1](\tikz@lib@graph@name);%
+ \pgfkeysvalueof{/tikz/graphs/@operators}%
+}%
+
+\tikzgraphsset{redirect unknown to tikz/.style={
+ /tikz/graphs/.unknown/.code={%
+ \let\tikz@key\pgfkeyscurrentname%
+ \pgfkeys{tikz/.cd,\tikz@key={##1},/tikz/graphs/.cd}%
+ }}
+}%
+
+\def\tikz@lib@activate@source@target@edge@syntax{%
+ \pgfkeys{/handlers/first char syntax=true}
+ \pgfkeyssetvalue{/handlers/first char syntax/the character >}{\tikz@lg@parse@more}%
+ \pgfkeyssetvalue{/handlers/first char syntax/the character <}{\tikz@lg@parse@less}%
+}%
+
+\def\tikz@lg@parse@less#1{\tikz@lg@parse@less@#1\pgf@stop}%
+\def\tikz@lg@parse@less@<{\pgfutil@ifnextchar"{\tikz@lg@parse@quote{source}}{\tikz@lg@parse@noquote{source}}}%
+\def\tikz@lg@parse@more#1{\tikz@lg@parse@more@#1\pgf@stop}%
+\def\tikz@lg@parse@more@>{\pgfutil@ifnextchar"{\tikz@lg@parse@quote{target}}{\tikz@lg@parse@noquote{target}}}%
+
+\def\tikz@lg@parse@noquote#1#2\pgf@stop{{\tikzgraphsset{#1 edge style={#2}}}}%
+\def\tikz@lg@parse@quote#1#2\pgf@stop{%
+ {\tikzgraphsset{/tikz/node quotes mean={#1 edge node={node [every edge quotes,##2]{##1}}},/utils/exec=\tikz@enable@node@quotes,#2}}%
+}%
+
+\tikzgraphsset{
+ clear >/.style=target edge clear,
+ clear </.style=source edge clear
+}%
+
+
+% Positioning
+
+\def\tikz@lib@graph@x{0}%
+\def\tikz@lib@graph@y{0}%
+
+\tikzgraphsset{
+ x/.code=\def\tikz@lib@graph@x{#1}\tikz@lib@graphs@check@at,
+ y/.code=\def\tikz@lib@graph@y{#1}\tikz@lib@graphs@check@at
+}%
+\def\tikz@lib@graphs@check@at{%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@temp%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter(%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@graph@x\expandafter}%
+ \expandafter,\expandafter{\tikz@lib@graph@y})}%
+ \pgfqkeys{/tikz}{at/.expand once=\tikz@temp}%
+}%
+
+
+\newif\iftikz@lib@graph@trie
+\tikzgraphsset{
+ trie/.is if=tikz@lib@graph@trie,
+ put node text on incoming
+ edges/.style={nodes={/utils/exec=\tikz@lg@make@edge@node{target}{#1}}},
+ put node text on outgoing
+ edges/.style={nodes={/utils/exec=\tikz@lg@make@edge@node{source}{#1}}},
+ edge quotes/.style={/tikz/every edge quotes/.style={#1}},
+ edge quotes center/.style={edge quotes={anchor=center}},
+ edge quotes mid/.style={edge quotes={anchor=mid}}
+}%
+
+\def\tikz@lg@make@edge@node#1#2{%
+ \def\pgf@marshal{node[#2]}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgf@marshal\expandafter{\tikzgraphnodetext}}%
+ \pgfkeysalso{#1 edge node/.expand once=\pgf@marshal,as=}%
+}%
+
+\newif\iftikz@lib@graph@fresh@node
+\tikzgraphsset{fresh nodes/.is if=tikz@lib@graph@fresh@node}%
+
+\tikzgraphsset{number nodes/.code=%
+ \pgfmathsetcount\tikz@lib@auto@number{#1}%
+ \tikzgraphsautonumbernodestrue,%
+ number nodes/.default=1,%
+ number nodes sep/.code=\def\tikz@lib@auto@sep{#1}
+}%
+\def\tikz@lib@auto@sep{\space}%
+
+\newif\iftikz@lib@graph@node@created
+
+\def\tikz@lib@graph@handle@use#1{%
+ % Is #1 the name of a node set?
+ \expandafter\let\expandafter\pgf@temp\csname tikz@lg@node@set #1\endcsname
+ \ifx\pgf@temp\relax
+ \pgfutil@g@addto@macro\tikz@lg@temp{\tikz@lg@do{#1}}
+ \else%
+ \expandafter\pgfutil@g@addto@macro\expandafter\tikz@lg@temp\expandafter{\pgf@temp}
+ \fi
+}%
+
+\def\tikz@lib@graph@do@use#1{%
+ \tikz@lg@init@color{#1}{\tikz@lgc@all@true\tikz@lgc@source@true\tikz@lgc@target@true}%
+}%
+
+\tikzgraphsset{
+ typeset/.store in=\tikz@lib@graph@typesetter,
+ math nodes/.style={/tikz/graphs/typeset=$\tikzgraphnodetext$},
+ empty nodes/.style={/tikz/graphs/typeset=},
+ typeset=\tikzgraphnodetext
+}%
+
+
+%
+% Handle scope
+%
+\def\tikz@lib@graph@scope#1{
+ \begingroup%
+ \tikzgdeventgroupcallback{array}%
+ \let\tikz@lib@graph@node@list\pgfutil@empty%
+ \tikz@lib@graph@start@hint@group%
+ \tikz@lib@graph@parse@group{#1}%
+ \tikz@lib@graph@end@hint@group%
+ \expandafter%
+ \endgroup%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@graph@node@list\tikz@lib@graph@node@list}%
+ \tikz@lib@graph@hint@aftergroup%
+ \tikz@lib@graph@stored@actions%
+ \pgfutil@ifnextchar-{\tikz@lib@graph@scope@minus}{%
+ \pgfutil@ifnextchar<{\tikz@lib@graph@scope@less}{%
+ \tikzerror{One of the arrow types <-, --, ->, -!-, or <-> expected}%
+ }%
+ }%
+}%
+
+\def\tikz@lib@graph@scope@minus-{
+ \pgfutil@ifnextchar>\tikz@lib@graph@forward@arrow{%
+ \pgfutil@ifnextchar-\tikz@lib@graph@undirected@arrow{%
+ \pgfutil@ifnextchar!\tikz@lib@graph@no@arrow{%
+ \pgfutil@ifnextchar\pgf@stop@eodashes\tikz@lib@graph@graph@done{%
+ \tikzerror{One of the arrow types <-, --, ->, -!-, or <-> expected}%
+ \tikz@lib@graph@undirected@arrow%
+ }%
+ }%
+ }%
+ }%
+}%
+
+\def\tikz@lib@graph@scope@less<-{\tikz@lib@graph@back@arrow}%
+
+
+
+
+%
+% Predefining graphs
+%
+
+\tikzgraphsset{
+ declare/.code 2 args={\expandafter\def\csname tikz@lib@graph@def@#1\endcsname{\tikz@lib@graph@do@graph{#2}}}%
+}%
+
+\def\tikz@lib@graph@handle@graph#1{%
+ \begingroup%
+ \let\tikz@lib@graph@node@list\pgfutil@empty%
+ \tikzgraphsset{@extra group options/.style={#1}}%
+ \tikz@lib@graph@start@hint@group%
+ \csname tikz@lib@graph@def@\tikz@lib@graph@name@only\endcsname%
+ \tikz@lib@graph@end@hint@group%
+ \expandafter%
+ \endgroup%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@node@list%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@lib@graph@node@list\tikz@lib@graph@node@list}%
+ \tikz@lib@graph@hint@aftergroup%
+}%
+
+\def\tikz@lib@graph@do@graph#1{%
+ \tikz@lib@graph@parse@group{#1}%
+}%
+
+\let\tikz@lib@graph@path\pgfutil@empty
+
+\tikzgraphsset{
+ name separator/.store in=\tikz@lib@graph@name@separator,
+ name separator=\space,
+ name/.code={%
+ \edef\tikz@lib@graph@path{\tikz@lib@graph@path#1\tikz@lib@graph@name@separator}%
+ }%
+}%
+
+
+%
+% Colors
+%
+\def\tikz@lg@newif{\csname newif\endcsname}%
+\tikzgraphsset{
+ as/.code=\def\tikzgraphnodeas{#1},%
+ color class/.style={%
+ /utils/exec=\expandafter\tikz@lg@newif\csname iftikz@lgc@#1@\endcsname,
+ #1/.style={operator={%
+ \edef\tikz@lg@col{\expandafter\noexpand\csname tikz@lgc@#1@true\endcsname}%
+ \let\tikz@lg@do\tikz@lg@colorize%
+ \tikz@lib@graph@node@list%
+ }},
+ not #1/.style={operator={%
+ \edef\tikz@lg@old@col{\expandafter\noexpand\csname tikz@lgc@#1@true\endcsname}%
+ \let\tikz@lg@new@col\pgfutil@empty%
+ \let\tikz@lg@do\tikz@lg@change@color%
+ \tikz@lib@graph@node@list%
+ }},
+ recolor #1 by/.style={operator={%
+ \edef\tikz@lg@old@col{\expandafter\noexpand\csname tikz@lgc@#1@true\endcsname}%
+ \edef\tikz@lg@new@col{\expandafter\noexpand\csname tikz@lgc@##1@true\endcsname}%
+ \let\tikz@lg@do\tikz@lg@change@color%
+ \tikz@lib@graph@node@list%
+ }},
+ !#1/.style=not #1,
+ },
+ color class=source,
+ color class=source',
+ color class=source'',
+ color class=target,
+ color class=target',
+ color class=all
+}%
+
+\def\tikz@lg@init@color#1#2{%
+ \expandafter\gdef\csname tikz@lgc@#1\endcsname{#2}%
+}%
+
+\def\tikz@lib@graph@cleanup#1{%
+ \expandafter\global\expandafter\let\csname tikz@lgc@#1\endcsname\relax%
+ \ifcsname tikz@lgca@@#1\endcsname\expandafter\global\expandafter\let\csname tikz@lgca@@#1\endcsname\relax\fi%
+ \ifcsname tikz@lgcb@@#1\endcsname\expandafter\global\expandafter\let\csname tikz@lgcb@@#1\endcsname\relax\fi%
+}%
+
+\def\tikz@lg@colorize#1{%
+ \expandafter\let\expandafter\pgf@temp\csname tikz@lgc@#1\endcsname%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@temp%
+ \expandafter\expandafter\expandafter{%
+ \expandafter\tikz@lg@col\pgf@temp}%
+ \expandafter\global\expandafter\let\csname tikz@lgc@#1\endcsname\pgf@temp%
+}%
+
+\def\tikz@lg@change@color#1{%
+ \def\tikz@lg@temp@save{#1}%
+ \let\tikz@lg@collect\pgfutil@empty%
+ \expandafter\let\expandafter\pgf@temp\csname tikz@lgc@#1\endcsname%
+ \expandafter\tikz@lg@change@check\pgf@temp\pgf@stop%
+}%
+\def\tikz@lg@change@check#1{%
+ \ifx#1\pgf@stop%
+ \tikz@lg@change@write@back%
+ \else%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\tikz@lg@old@col%
+ \expandafter\tikz@lg@change@add\expandafter{\tikz@lg@new@col}% Found!
+ \else%
+ \tikz@lg@change@add{#1}%
+ \fi%
+ \expandafter\tikz@lg@change@check
+ \fi%
+}%
+\def\tikz@lg@change@add#1{%
+ \expandafter\def\expandafter\tikz@lg@collect\expandafter{\tikz@lg@collect#1}%
+}%
+
+\def\tikz@lg@change@write@back{%
+ \expandafter\global\expandafter\let\csname tikz@lgc@\tikz@lg@temp@save\endcsname\tikz@lg@collect%
+}%
+
+
+
+\def\tikz@lg@if@has@color#1#2#3#4{%
+ {%
+ \csname tikz@lgc@#1\endcsname%
+ \expandafter\let\expandafter\pgf@temp\csname iftikz@lgc@#2@\endcsname%
+ \ifx\pgf@temp\relax%
+ \tikz@lib@reset@temp%
+ \fi%
+ \pgf@temp%
+ \global\tikz@color@testtrue%
+ \else%
+ \global\tikz@color@testfalse%
+ \fi%
+ }%
+ \iftikz@color@test#3\else#4\fi%
+}%
+\newif\iftikz@color@test
+
+\def\tikz@lg@if@local@node#1#2#3{\expandafter\ifx\csname tikz@lgc@#1\endcsname\relax#3\else#2\fi}%
+
+\def\tikz@lib@reset@temp{\let\pgf@temp\iffalse}%
+
+%
+% Handle connection annotations
+%
+\def\tikz@lib@annotate@#1#2#3#4{%
+ \expandafter\ifx\csname tikz@lgc#1@@#2\endcsname\relax%
+ \expandafter\gdef\csname tikz@lgc#1@@#2\endcsname{{#3}{#4}}%
+ \else%
+ \expandafter\expandafter\expandafter\tikz@lib@annotate@read\csname tikz@lgc#1@@#2\endcsname{#3}{#4}%
+ \expandafter\global\expandafter\let\csname tikz@lgc#1@@#2\endcsname\pgf@temp%
+ \fi%
+}%
+\def\tikz@lib@annotate@read#1#2#3#4{\def\pgf@temp{{#1,#3}{#2#4}}}%
+
+\tikzgraphsset{
+ source edge style/.code=\tikz@lib@annotate@{a}{\tikz@lib@graph@name}{#1}{},
+ source edge node/.code=\tikz@lib@annotate@{a}{\tikz@lib@graph@name}{}{#1},
+ source edge clear/.code={
+ \expandafter\global\expandafter\let\csname tikz@lgca@@\tikz@lib@graph@name\endcsname\relax%
+ },
+ target edge style/.code=\tikz@lib@annotate@{b}{\tikz@lib@graph@name}{#1}{},
+ target edge node/.code=\tikz@lib@annotate@{b}{\tikz@lib@graph@name}{}{#1},
+ target edge clear/.code={%
+ \expandafter\global\expandafter\let\csname tikz@lgcb@@\tikz@lib@graph@name\endcsname\relax%
+ }
+}%
+
+
+
+% Packing a node list: Replace the node list by a new node list where
+% each node is mentioned at most once.
+
+\def\tikz@lib@graph@pack@node@list{%
+ {%
+ \let\tikz@lg@packed\pgfutil@empty%
+ \let\tikz@lg@do\tikz@lg@packer%
+ \tikz@lib@graph@node@list%
+ \expandafter
+ }\expandafter%
+ \def\expandafter\tikz@lib@graph@node@list\expandafter{\tikz@lg@packed}%
+}%
+
+\def\tikz@lg@packer#1{%
+ \expandafter\ifx\csname tikz@lg@p@#1\endcsname\pgf@stop%
+ \else%
+ \expandafter\let\csname tikz@lg@p@#1\endcsname\pgf@stop%
+ \expandafter\def\expandafter\tikz@lg@packed\expandafter{\tikz@lg@packed\tikz@lg@do{#1}}
+ \fi
+}%
+
+%
+% Color functions
+%
+
+% Do something for all nodes having a certain color
+%
+% #1 = the color name
+% #2 = a macro
+%
+% Description:
+%
+% For each node having color #1, the macro #2 will be called. This
+% macro should take a single parameter, which will be set
+% to the node's name.
+
+\def\tikzgraphforeachcolorednode#1#2{%
+ \tikz@lib@graph@pack@node@list%
+ \expandafter\def\expandafter\iftikz@lib@graph@color@picker\expandafter{\csname iftikz@lgc@#1@\endcsname}%
+ \let\tikz@lib@graph@action#2%
+ \let\tikz@lg@do\tikz@lg@pick%
+ \tikz@lib@graph@node@list%
+}%
+\def\tikz@lg@pick#1{
+ {%
+ \csname tikz@lgc@#1\endcsname%
+ \iftikz@lib@graph@color@picker
+ \global\tikz@color@testtrue%
+ \else%
+ \global\tikz@color@testfalse%
+ \fi%
+ }%
+ \iftikz@color@test\tikz@lib@graph@action{#1}\fi%
+}%
+
+
+
+% Prepare a color
+%
+% #1 is the color name
+% #2 is a counter
+% #3 is a prefix
+%
+% Description:
+%
+% You can call this function inside a connector. It will do the
+% following: First, its counts how many nodes exist that have color
+% #1. This number is stored in the counter passed as #2. Furthermore,
+% let <name> be the name of the <i>-th vertex that has color #1. Then, a
+% macro called \#3<i> will store <name>. For instance, if #1 is "red"
+% and the third red node is called foo and if #3 is "bar", then a
+% macro called "\bar3" is set to "foo" as if you had said
+% "\expandafter\def\csname bar3\endcsname{foo}".
+%
+% The bottom line of all this is that after a preparation you can
+% easily iterate over nodes having a certain color. If you wish to
+% iterate over a single color, it will be quicker and easier to call
+% \tikzgraphforeachcolorednode, but if you need to iterate over two
+% colors simultaneously, it will be better to first prepare the color.
+
+\def\tikzgraphpreparecolor#1#2#3{%
+ \let\tikz@lib@graph@count#2%
+ \tikz@lib@graph@count0\relax
+ \def\tikz@lib@graph@prefix{#3}%
+ \tikzgraphforeachcolorednode{#1}\tikz@lib@graph@prepare%
+}%
+
+\def\tikz@lib@graph@prepare#1{%
+ \advance\tikz@lib@graph@count by1\relax%
+ \expandafter\def\csname\tikz@lib@graph@prefix\the\tikz@lib@graph@count\endcsname{#1}%
+}%
+
+
+
+
+%
+% The bipartite connector
+%
+
+\tikzgraphsset{
+ complete bipartite/.style 2 args={operator={
+ \def\tikz@lg@shoreb{#2}%
+ \tikzgraphforeachcolorednode{#1}\tikz@lib@graph@bipartite@outer
+ }},
+ complete bipartite/.default={target'}{source'},
+ induced complete bipartite/.style 2 args={
+ induced independent set={#1},
+ induced independent set={#2},
+ complete bipartite={#1}{#2}
+ },
+ induced complete bipartite/.default={target'}{source'},
+}%
+
+\def\tikz@lib@graph@bipartite@outer#1{%
+ \def\tikz@lib@graph@from{#1}%
+ {%
+ \tikzgraphforeachcolorednode{\tikz@lg@shoreb}\tikz@lib@graph@bipartite@inner%
+ }%
+}%
+
+\def\tikz@lib@graph@bipartite@inner#1{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\tikz@lib@graph@from\else%
+ \tikz@lib@graph@default@new@edge{\tikz@lib@graph@from}{#1}%
+ \fi%
+}%
+
+\def\tikz@lib@graph@default@new@edge#1#2{%
+ \pgfkeysgetvalue{/tikz/graphs/@edges styling}\pgf@temp
+ \pgfkeysgetvalue{/tikz/graphs/@edges node}\pgf@temp@b
+ \let\tikz@lib@add@temp\pgfutil@empty%
+ \tikz@lib@graph@add@edge@annotations{a}{#1}
+ \tikz@lib@graph@add@edge@annotations{b}{#2}
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\pgf@temp%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@temp\tikz@lib@add@temp}%
+ \expandafter\expandafter\expandafter\tikz@lib@graph@default@new@edge@%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@temp\expandafter}\expandafter{\pgf@temp@b}{#1}{#2}%
+}%
+\def\tikz@lib@graph@default@new@edge@#1#2#3#4{%
+ \iftikz@lib@graph@simple%
+ \edef\tikz@temp{{\pgfkeysvalueof{/tikz/graphs/default edge kind}}{#3}{#4}}
+ \expandafter\tikz@lib@graph@set@simple@edge\tikz@temp{#1}{#2}%
+ \else%
+ \pgfkeys{/tikz/graphs/.cd,new \pgfkeysvalueof{/tikz/graphs/default edge kind}={#3}{#4}{#1}{#2}}%
+ \fi%
+}%
+\def\tikz@lib@graph@add@edge@annotations#1#2{%
+ \ifcsname tikz@lgc#1@@#2\endcsname%
+ \expandafter\let\expandafter\tikz@lg@temp@\csname tikz@lgc#1@@#2\endcsname%
+ \ifx\tikz@lg@temp@\relax\else
+ \expandafter\tikz@lib@graph@add@edge@annotations@\tikz@lg@temp@%
+ \let\tikz@lib@add@temp\tikz@lib@final@edge@style
+ \fi%
+ \fi%
+}%
+\def\tikz@lib@graph@add@edge@annotations@#1#2{
+ \expandafter\def\expandafter\pgf@temp\expandafter{\pgf@temp,#1}%
+ \expandafter\def\expandafter\pgf@temp@b\expandafter{\pgf@temp@b#2}%
+}%
+\def\tikz@lib@final@edge@style{,after source and target edge/.try}%
+
+%
+% The clique connector
+%
+
+\tikzgraphsset{
+ clique/.style={operator={
+ \tikzgraphpreparecolor{#1}\c@pgf@counta{tikz@lg}%
+ \tikz@lg@clique@loop%
+ }},
+ clique/.default=all
+}%
+
+\def\tikz@lg@clique@loop{%
+ \ifnum\c@pgf@counta=0\relax%
+ \else
+ \c@pgf@countb=\c@pgf@counta\relax%
+ \tikz@lg@clique@loop@inner%
+ \advance\c@pgf@counta by-1\relax%
+ \expandafter\tikz@lg@clique@loop%
+ \fi%
+}%
+
+\def\tikz@lg@clique@loop@inner{%
+ \advance\c@pgf@countb by-1\relax%
+ \ifnum\c@pgf@countb>0\relax%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@countb\endcsname}{\csname tikz@lg\the\c@pgf@counta\endcsname}%
+ \expandafter\tikz@lg@clique@loop@inner%
+ \fi%
+}%
+
+
+%
+% The independent set connector
+%
+
+\tikzgraphsset{
+ induced independent set/.style={operator={
+ \pgfkeysgetvalue{/tikz/graphs/default edge kind}\tikz@lg@default%
+ \pgfkeyssetvalue{/tikz/graphs/default edge kind}{-!-}%
+ \tikzgraphpreparecolor{#1}\c@pgf@counta{tikz@lg}%
+ \tikz@lg@indep@loop%
+ \pgfkeyslet{/tikz/graphs/default edge kind}\tikz@lg@default%
+ }},
+ induced independent set/.default=all
+}%
+
+\def\tikz@lg@indep@loop{%
+ \ifnum\c@pgf@counta=0\relax%
+ \else
+ \c@pgf@countb=\c@pgf@counta\relax%
+ \tikz@lg@indep@loop@inner%
+ \advance\c@pgf@counta by-1\relax%
+ \expandafter\tikz@lg@indep@loop%
+ \fi%
+}%
+
+\def\tikz@lg@indep@loop@inner{%
+ \advance\c@pgf@countb by-1\relax%
+ \ifnum\c@pgf@countb>0\relax%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@counta\endcsname}{\csname tikz@lg\the\c@pgf@countb\endcsname}%
+ \expandafter\tikz@lg@indep@loop@inner%
+ \fi%
+}%
+
+
+%
+% The path connector
+%
+
+\tikzgraphsset{
+ path/.style={operator={%
+ \let\tikz@lg@prev\relax%
+ \tikzgraphforeachcolorednode{#1}\tikz@lib@graph@path@do%
+ }},
+ path/.default=all,
+ induced path/.style={induced independent set={#1},path={#1}},
+ induced path/.default=all,
+}%
+
+\def\tikz@lib@graph@path@do#1{%
+ \ifx\tikz@lg@prev\relax%
+ \else%
+ \tikz@lib@graph@default@new@edge{\tikz@lg@prev}{#1}%
+ \fi
+ \def\tikz@lg@prev{#1}%
+}%
+
+
+%
+% The cycle connector
+%
+
+\tikzgraphsset{
+ cycle/.style={operator={%
+ \let\tikz@lg@prev\relax%
+ \let\tikz@lg@first\relax%
+ \tikzgraphforeachcolorednode{#1}\tikz@lib@graph@cycle@do%
+ \ifx\tikz@lg@first\relax%
+ \else%
+ \tikz@lib@graph@default@new@edge{\tikz@lg@prev}{\tikz@lg@first}%
+ \fi%
+ }},
+ cycle/.default=all,
+ induced cycle/.style={induced independent set={#1},cycle={#1}},
+ induced cycle/.default=all,
+}%
+
+\def\tikz@lib@graph@cycle@do#1{%
+ \ifx\tikz@lg@prev\relax%
+ \def\tikz@lg@prev{#1}%
+ \let\tikz@lg@first\tikz@lg@prev%
+ \else%
+ \tikz@lib@graph@default@new@edge{\tikz@lg@prev}{#1}%
+ \def\tikz@lg@prev{#1}%
+ \fi%
+}%
+
+
+
+
+%
+% The matching and star connector
+%
+
+\tikzgraphsset{
+ matching and star/.style 2 args={operator=%
+ {%
+ \tikzgraphpreparecolor{#1}\c@pgf@counta{tikz@lg}
+ \c@pgf@countb=0\relax%
+ \let\tikz@lg@prev\relax
+ \tikzgraphforeachcolorednode{#2}\tikz@lib@graph@flow@do%
+ \tikz@lib@graph@flow@rest%
+ }%
+ },
+ matching and star/.default={target'}{source'}
+}%
+
+\def\tikz@lib@graph@flow@do#1{%
+ \advance\c@pgf@countb by1\relax%
+ \ifnum\c@pgf@countb>\c@pgf@counta\relax%
+ \c@pgf@countb=\c@pgf@counta\relax%
+ \fi%
+ \ifnum\c@pgf@countb>0\relax%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@countb\endcsname}{#1}%
+ \fi%
+ \def\tikz@lg@prev{#1}%
+}%
+
+\def\tikz@lib@graph@flow@rest{%
+ \ifnum\c@pgf@countb<\c@pgf@counta\relax%
+ \ifnum\c@pgf@countb>0\relax%
+ \advance\c@pgf@countb by1\relax%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@countb\endcsname}{\tikz@lg@prev}%
+ \expandafter\tikz@lib@graph@flow@rest%
+ \fi%
+ \fi%
+}%
+
+
+
+%
+% The matching connector
+%
+
+\tikzgraphsset{
+ matching/.style 2 args={operator=
+ {%
+ \tikzgraphpreparecolor{#1}\c@pgf@counta{tikz@lg}
+ \c@pgf@countb=0\relax%
+ \tikzgraphforeachcolorednode{#2}\tikz@lib@graph@matching@do%
+ }%
+ },
+ matching/.default={target'}{source'}
+}%
+
+\def\tikz@lib@graph@matching@do#1{%
+ \advance\c@pgf@countb by1\relax%
+ \ifnum\c@pgf@countb>\c@pgf@counta\relax%
+ \else%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@countb\endcsname}{#1}%
+ \fi%
+}%
+
+
+
+
+
+%
+% The butterfly connector
+%
+
+\tikzgraphsset{
+ butterfly/.style={operator=
+ {}{%
+ \pgfkeys{/tikz/graphs/butterfly/.cd,#1}%
+ \ifnum\pgfkeysvalueof{/tikz/graphs/butterfly/level}=0\relax%
+ \tikzgraphinvokeoperator{matching and star={\pgfkeysvalueof{/tikz/graphs/butterfly/from}}{\pgfkeysvalueof{/tikz/graphs/butterfly/to}}}%
+ \else%
+ {%
+ \tikzgraphpreparecolor{\pgfkeysvalueof{/tikz/graphs/butterfly/from}}\c@pgf@counta{tikz@lg}
+ \c@pgf@countb=0\relax%
+ \tikzgraphforeachcolorednode{\pgfkeysvalueof{/tikz/graphs/butterfly/to}}\tikz@lib@graph@butterfly@do%
+ }%
+ \iftikz@butterfly@prime\else\tikzgraphinvokeoperator{matching and star={\pgfkeysvalueof{/tikz/graphs/butterfly/from}}{\pgfkeysvalueof{/tikz/graphs/butterfly/to}}}\fi%
+ \fi%
+ }%
+ },
+ butterfly/.default=,
+ butterfly/level/.initial=1,
+ butterfly/from/.initial=target',
+ butterfly/to/.initial=source',
+ butterfly'/.style={operator={}{\tikz@butterfly@primetrue\pgfkeysalso{butterfly={#1}}}},
+ butterfly'/.default=,
+}%
+
+\newif\iftikz@butterfly@prime
+
+\def\tikz@lib@graph@butterfly@do#1{%
+ \advance\c@pgf@countb by1\relax%
+ % Compute other side...
+ \c@pgf@countc=\pgfkeysvalueof{/tikz/graphs/butterfly/level}\relax%
+ {%
+ % Computer countb mod (2level)
+ \count0=\c@pgf@countc\relax%
+ \multiply\count0 by2\relax%
+ \count1=\c@pgf@countb\relax%
+ \advance\count1 by-1\relax%
+ \count2=\count1\relax%
+ \count3=\count1\relax%
+ \divide\count1 by\count0\relax%
+ \multiply\count1 by\count0\relax%
+ \advance\count2 by-\count1\relax%
+ % count0 = 2*level
+ % count2 = countb mod (2level) (starting with 0)
+ % count1 = countb - count2 (starting with 0)
+ \ifnum\count2<\c@pgf@countc\relax%
+ \advance\count3 by \c@pgf@countc\relax%
+ \else%
+ \advance\count3 by -\c@pgf@countc\relax%
+ \fi%
+ \expandafter%
+ }%
+ \expandafter\c@pgf@countc\the\count3\relax%
+ \advance\c@pgf@countc by1\relax%
+ \ifnum\c@pgf@countc>\c@pgf@counta\relax%
+ \c@pgf@countc=\c@pgf@counta\relax%
+ \fi%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@countc\endcsname}{#1}%
+}%
+
+
+
+
+%
+% The no edges connector
+%
+\tikzgraphsset{no edges/.style={operator=\relax}}%
+
+
+
+
+%
+% The grid connector
+%
+\tikzgraphsset{
+ grid/.style={operator={
+ \tikzgraphpreparecolor{#1}\c@pgf@counta{tikz@lg}%
+ \c@pgf@countb=0\relax%
+ \tikzgraphpreparewrapafter%
+ \tikz@lg@grid@loop%
+ }%
+ },
+ grid/.default=all
+}%
+
+\def\tikzgraphpreparewrapafter{%
+ \pgfkeysgetvalue{/tikz/graphs/wrap after}\tikz@temp%
+ \ifnum\tikz@temp=0\relax%
+ \pgfmathparse{sqrt(\tikzgraphVnum)}%
+ \pgfmathint{\pgfmathresult}%
+ \edef\tikzgraphwrapafter{\pgfmathresult}%
+ \else%
+ \edef\tikzgraphwrapafter{\tikz@temp}
+ \fi%
+}%
+
+\def\tikz@lg@grid@loop{%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \advance\c@pgf@countb by 1\relax%
+ \pgfmathmod{\c@pgf@countb-1}{\tikzgraphwrapafter}%
+ \pgfmathint{\pgfmathresult}%
+ \ifnum\pgfmathresult>0%
+ \pgfmathsubtract{\c@pgf@countb}{1}%
+ \pgfmathint{\pgfmathresult}%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\the\c@pgf@countb\endcsname}{\csname tikz@lg\pgfmathresult\endcsname}%
+ \fi%
+ \pgfmathparse{\c@pgf@countb <= \tikzgraphwrapafter}%
+ \ifnum\pgfmathresult=0%
+ \pgfmathsubtract{\c@pgf@countb}{\tikzgraphwrapafter}%
+ \pgfmathint{\pgfmathresult}%
+ \tikz@lib@graph@default@new@edge{\csname tikz@lg\pgfmathresult\endcsname}{\csname tikz@lg\the\c@pgf@countb\endcsname}%
+ \fi%
+ \advance\c@pgf@counta by-1\relax%
+ \expandafter\tikz@lg@grid@loop%
+ \fi%
+}%
+
+
+
+
+% Positioning
+%
+% It is not the job of the graph library to compute good positions for
+% nodes in a graph. However, some basic support is provided for simple
+% cases.
+%
+% The idea is at follows: Graphs are specified hierarchically. For
+% instance, consider the following graph specification:
+%
+% graph { a, b, c -> d -> {e -> f -> g, h} -> i, j -> k }
+%
+% Here, we have the *group* {e->f->g,h} inside the larger graph
+% specification. Each group consists of sequence of *chains* like
+% e->f->g or j->k.
+%
+% In order to facilitate the automatic positioning of nodes, the graph
+% library will provide you with information about the position of
+% nodes inside their groups and chains.
+%
+% As a chain is being parsed, a counter stored in
+% /tikz/graphs/placement/element count is available that is advanced for
+% each element in the chain.
+%
+% Additionally, a counter stored in placement/width is
+% available. This "logical" width is defined recursively as follows: The
+% width of a single node is computed by calling the key
+% placement/logical node width, which should return a real or logical
+% width of the node passed as a parameter in the macro \pgfmathresult. The
+% width of a chain is the sum of the widths of its elements. The
+% width of a group is the maximum of the widths of its elements.
+%
+%
+% Symmetrically, as a group is being constructed, a counter stored in
+% placement/chain count is available that is advanced for each chain
+% in the group. The number placement/depth is the defined
+% recursively as follows: For a single node, the depth is
+% computed by the key placement/logical node depth. The depth
+% of a group is the sum of the depths of its elements. The depth of a
+% chain is the maximum of the depth of its elements.
+%
+%
+% The above keys get updated automatically. You should setup the key
+% placement/compute position such that it uses the above keys to
+% compute a good position for a new node based on the above
+% keys. Typically, this key should execute node={shift=(...)} to setup
+% the necessary shift for a new node.
+%
+% The key placement/compute position should not be called
+% directly. Instead, the key placement/place should be used. This key
+% has two effects: First, it calls placement/compute position. Second,
+% it resets the length and normal counters. It will setup a completely
+% new counting of lengths and counters inside the current scope.
+%
+% The placmenet/place key is executed automatically whenever a new
+% node is automatically created. Furthermore, placement strategies
+% will call this key.
+
+\tikzgraphsset{
+ placement/.cd,
+ compute position/.code=\tikz@lib@graph@linear@pos,
+ place/.code={%
+ \pgfkeys{/tikz/graphs/placement/compute position}%
+ \aftergroup\tikz@lib@graph@reset@locals%
+ \pgfkeyssetvalue{/tikz/graphs/placement/element count}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/chain count}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/depth}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/width}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local depth}{0}%
+ \pgfkeyssetvalue{/tikz/graphs/placement/local width}{0}%
+ },
+ element count/.initial=0,
+ chain count/.initial=0,
+ depth/.initial=0,
+ width/.initial=0,
+ level/.initial=0,
+ logical node depth/.code=\def\pgfmathresult{1},
+ logical node width/.code=\def\pgfmathresult{1},
+}%
+
+\def\tikz@lib@graph@reset@locals{%
+ \gdef\tikz@lib@graph@group@depth{0}%
+ \gdef\tikz@lib@graph@group@width{0}%
+}%
+
+
+% Arrange nodes evenly
+%
+% This strategy works as follows: You specify a "chain shift vector"
+% and a "group shift vector". Then each new element on a chain is
+% shifted by the chain shift vector relative to the previous element
+% on the chain. Similarly for each new element of a group.
+
+\tikzgraphsset{
+ Cartesian placement/.style={
+ placement/place,
+ placement/compute position/.code=\tikz@lib@graph@linear@pos%
+ },
+ chain shift/.initial={(1,0)},
+ group shift/.initial={(0,-1)},
+ grow right/.style={
+ placement/place,
+ chain shift={(#1,0)},
+ @auto anchor horizontal=center,
+ placement/logical node width/.code=\def\pgfmathresult{1}
+ },
+ grow right/.default=1,
+ grow left/.style={
+ placement/place,
+ chain shift={(-#1,0)},
+ @auto anchor horizontal=center,
+ placement/logical node width/.code=\def\pgfmathresult{1}
+ },
+ grow left/.default=1,
+ grow up/.style={
+ placement/place,
+ chain shift={(0,#1)},
+ @auto anchor horizontal=center,
+ placement/logical node width/.code=\def\pgfmathresult{1}
+ },
+ grow up/.default=1,
+ grow down/.style={
+ placement/place,
+ chain shift={(0,-#1)},
+ @auto anchor vertical=center,
+ placement/logical node width/.code=\def\pgfmathresult{1}
+ },
+ grow down/.default=1,
+ branch right/.style={
+ placement/place,
+ group shift={(#1,0)},
+ @auto anchor horizontal=center,
+ placement/logical node depth/.code=\def\pgfmathresult{1}
+ },
+ branch right/.default=1,
+ branch left/.style={
+ placement/place,
+ group shift={(-#1,0)},
+ @auto anchor horizontal=center,
+ placement/logical node depth/.code=\def\pgfmathresult{1}
+ },
+ branch left/.default=1,
+ branch up/.style={
+ placement/place,
+ group shift={(0,#1)},
+ @auto anchor vertical=center,
+ placement/logical node depth/.code=\def\pgfmathresult{1}
+ },
+ branch up/.default=1,
+ branch down/.style={
+ placement/place,
+ group shift={(0,-#1)},
+ @auto anchor vertical=center,
+ placement/logical node depth/.code=\def\pgfmathresult{1}
+ },
+ branch down/.default=1,
+ %
+ % Sep shifts
+ %
+ grow right sep/.style={
+ Cartesian placement,
+ chain shift={(1pt,0)},
+ @auto anchor horizontal=west,
+ placement/logical node width/.code=\tikz@lib@graph@width@sep{##1}{#1}
+ },
+ grow right sep/.default=1em,
+ grow left sep/.style={
+ Cartesian placement,
+ chain shift={(-1pt,0)},
+ @auto anchor horizontal=east,
+ placement/logical node width/.code=\tikz@lib@graph@width@sep{##1}{#1}
+ },
+ grow left sep/.default=1em,
+ grow up sep/.style={
+ Cartesian placement,
+ chain shift={(0,1pt)},
+ @auto anchor vertical=south,
+ placement/logical node width/.code=\tikz@lib@graph@depth@sep{##1}{#1}
+ },
+ grow up sep/.default=1em,
+ grow down sep/.style={
+ Cartesian placement,
+ chain shift={(0,-1pt)},
+ @auto anchor vertical=north,
+ placement/logical node width/.code=\tikz@lib@graph@depth@sep{##1}{#1}
+ },
+ grow down sep/.default=1em,
+ grow right sep/.style={
+ Cartesian placement,
+ chain shift={(1pt,0)},
+ @auto anchor horizontal=west,
+ placement/logical node width/.code=\tikz@lib@graph@width@sep{##1}{#1}
+ },
+ %
+ branch right sep/.style={
+ Cartesian placement,
+ group shift={(1pt,0)},
+ @auto anchor horizontal=west,
+ placement/logical node depth/.code=\tikz@lib@graph@width@sep{##1}{#1}
+ },
+ branch right sep/.default=1em,
+ branch left sep/.style={
+ Cartesian placement,
+ group shift={(-1pt,0)},
+ @auto anchor horizontal=east,
+ placement/logical node depth/.code=\tikz@lib@graph@width@sep{##1}{#1}
+ },
+ branch left sep/.default=1em,
+ branch up sep/.style={
+ Cartesian placement,
+ group shift={(0,1pt)},
+ @auto anchor vertical=south,
+ placement/logical node depth/.code=\tikz@lib@graph@depth@sep{##1}{#1}
+ },
+ branch up sep/.default=1em,
+ branch down sep/.style={
+ Cartesian placement,
+ group shift={(0,-1pt)},
+ @auto anchor vertical=north,
+ placement/logical node depth/.code=\tikz@lib@graph@depth@sep{##1}{#1}
+ },
+ branch down sep/.default=1em,
+ %
+ @auto anchor horizontal/.style={
+ nodes={anchor=\csname tikz@lib@graph@auto@\tikz@lib@graph@auto@h @\tikz@lib@graph@auto@v\endcsname},
+ /utils/exec=\def\tikz@lib@graph@auto@h{#1}
+ },
+ @auto anchor vertical/.style={
+ nodes={anchor=\csname tikz@lib@graph@auto@\tikz@lib@graph@auto@h @\tikz@lib@graph@auto@v\endcsname},
+ /utils/exec=\def\tikz@lib@graph@auto@v{#1}
+ },
+ %
+ %
+ no placement/.style={
+ placement/place,
+ placement/compute position/.code=%
+ }
+}%
+
+\def\tikz@lib@graph@auto@h{center}%
+\def\tikz@lib@graph@auto@v{center}%
+
+\def\tikz@lib@graph@auto@center@center{center}%
+\def\tikz@lib@graph@auto@west@center{west}%
+\def\tikz@lib@graph@auto@east@center{east}%
+\def\tikz@lib@graph@auto@center@north{north}%
+\def\tikz@lib@graph@auto@west@north{north west}%
+\def\tikz@lib@graph@auto@east@north{north east}%
+\def\tikz@lib@graph@auto@center@south{south}%
+\def\tikz@lib@graph@auto@west@south{south west}%
+\def\tikz@lib@graph@auto@east@south{south east}%
+
+\def\tikz@lib@graph@linear@pos{%
+ \pgfkeysgetvalue{/tikz/graphs/chain shift}\tikz@temp
+ \expandafter\tikz@scan@one@point\expandafter\pgf@process\tikz@temp
+ \pgf@process{\pgfpointscale{\pgfkeysvalueof{/tikz/graphs/placement/width}}{}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfkeysgetvalue{/tikz/graphs/group shift}\tikz@temp
+ \expandafter\tikz@scan@one@point\expandafter\pgf@process\tikz@temp
+ \pgf@process{\pgfpointscale{\pgfkeysvalueof{/tikz/graphs/placement/depth}}{}}%
+ \advance\pgf@xa by\pgf@x%
+ \advance\pgf@ya by\pgf@y%
+ \edef\tikz@lib@graph@shift{(\the\pgf@xa,\the\pgf@ya)}
+ \pgfkeys{/tikz/graphs/nodes/.expanded={shift={\tikz@lib@graph@shift}}}
+}%
+
+
+\def\tikz@lib@graph@width@sep#1#2{%
+ \pgf@process{\pgfpointdiff{\pgfpointanchor{#1}{west}}{\pgfpointanchor{#1}{east}}}%
+ \pgfmathparse{#2+\the\pgf@x}%
+}%
+
+\def\tikz@lib@graph@depth@sep#1#2{%
+ \pgf@process{\pgfpointdiff{\pgfpointanchor{#1}{south}}{\pgfpointanchor{#1}{north}}}%
+ \pgfmathparse{#2+\the\pgf@y}%
+}%
+
+
+% Circular arrangements
+%
+% This strategy works a bit like the arrange evenly strategy, but in
+% polar coordinates. Both for the chains and the groups you specify a
+% polar shift, which must be in the form "(delta degree:delta
+% distance)". For each element in a chain, the delta degree is added
+% to the chain degree, likewise for each element the delta distance is
+% added. Similarly for groups.
+%
+% There is an initial degree and radius, stored in the key "phase" and
+% "radius".
+
+\tikzgraphsset{,
+ circular placement/.style={
+ placement/place,
+ placement/compute position/.code=\tikz@lib@graph@circular@pos,%
+ placement/logical node depth/.code=\def\pgfmathresult{1},
+ placement/logical node width/.code=\def\pgfmathresult{1},
+ },
+ clockwise/.style={
+ circular placement,
+ group polar shift={(-360/#1:0)}
+ },
+ clockwise/.default=\tikzgraphVnum,
+ counterclockwise/.style={
+ circular placement,
+ group polar shift={(360/#1:0)}
+ },
+ counterclockwise/.default=\tikzgraphVnum,
+ chain polar shift/.initial={(0:1cm)},
+ group polar shift/.initial={(60:0)},
+ radius/.initial=1cm,
+ phase/.initial=90,
+}%
+
+\def\tikz@lib@graph@circular@pos{%
+ \pgfkeysgetvalue{/tikz/graphs/chain polar shift}\tikz@temp
+ \expandafter\tikz@lib@graph@decompose@polar\tikz@temp%
+ \pgf@process{\pgfpointscale{\pgfkeysvalueof{/tikz/graphs/placement/width}}{}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgfkeysgetvalue{/tikz/graphs/group polar shift}\tikz@temp
+ \expandafter\tikz@lib@graph@decompose@polar\tikz@temp%
+ \pgf@process{\pgfpointscale{\pgfkeysvalueof{/tikz/graphs/placement/depth}}{}}%
+ \advance\pgf@xa by\pgf@x%
+ \advance\pgf@ya by\pgf@y%
+ \pgfmathparse{\pgfkeysvalueof{/tikz/graphs/radius}}%
+ \advance\pgf@ya by\pgfmathresult pt%
+ \pgfmathsetmacro\tikz@temp{\the\pgf@xa+\pgfkeysvalueof{/tikz/graphs/phase}}%
+ \edef\tikz@lib@graph@shift{(\tikz@temp:\the\pgf@ya)}
+ \pgfkeys{/tikz/graphs/nodes/.expanded={shift={\tikz@lib@graph@shift}}}
+}%
+
+
+\def\tikz@lib@graph@decompose@polar(#1:#2){%
+ \pgfmathsetlength\pgf@x{#1}%
+ \pgfmathsetlength\pgf@y{#2}%
+}%
+
+
+% Grid arrangements
+%
+\tikzgraphsset{
+ grid placement/.style={
+ placement/place,
+ placement/compute position/.code=\tikz@lib@graph@grid@pos,%
+ },
+}%
+
+
+\def\tikz@lib@graph@grid@pos{%
+ %
+ % Make sure to set \tikzgraphwrapafter before we compute
+ % the positions of nodes in the grid
+ %
+ \tikzgraphpreparewrapafter%
+ %
+ % find out the coordinate in the grid
+ %
+ \pgfkeysgetvalue{/tikz/graphs/placement/depth}\tikz@temp@depth%
+ \pgfkeysgetvalue{/tikz/graphs/placement/width}\tikz@temp@width%
+ \pgfmathsetmacro{\tikz@temp}{max(\tikz@temp@depth, \tikz@temp@width)}%
+ \pgfmathsetmacro{\tikz@temp@col}{mod(\tikz@temp,\tikzgraphwrapafter)}%
+ \pgfmathsetmacro{\tikz@temp@row}{div(\tikz@temp,\tikzgraphwrapafter)}%
+ %
+ % multiply row by the group shift and col by the chain shift
+ %
+ \pgfkeysgetvalue{/tikz/graphs/group shift}\tikz@temp%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@lib@graph@grid@pos@a\tikz@temp%
+ \pgfkeysgetvalue{/tikz/graphs/chain shift}\tikz@temp%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@lib@graph@grid@pos@b\tikz@temp%
+ %
+ % apply the shift
+ %
+ \edef\tikz@lib@graph@shift{(\the\pgf@xa,\the\pgf@ya)}
+ \pgfkeys{/tikz/graphs/nodes/.expanded={shift={\tikz@lib@graph@shift}}}
+}%
+
+\def\tikz@lib@graph@grid@pos@a#1{\pgf@process{\pgfpointscale{\tikz@temp@row}{#1}}\pgf@xa=\pgf@x\relax\pgf@ya=\pgf@y\relax}%
+\def\tikz@lib@graph@grid@pos@b#1{\pgf@process{\pgfpointscale{\tikz@temp@col}{#1}}%
+ \advance\pgf@xa by\pgf@x\relax
+ \advance\pgf@ya by\pgf@y\relax}%
+
+\tikzgraphsset{
+ % Grids:
+ wrap after/.initial=0,
+ % Node sets:
+ V/.code={%
+ \def\tikzgraphV{#1}%
+ \c@pgf@counta=0\foreach \tikz@dummy in {#1} {\global\advance\c@pgf@counta by1\relax}%
+ \edef\tikzgraphVnum{\the\c@pgf@counta}
+ },
+ V={1},
+ n/.style={V={1,...,#1},name shore V/.style={name=V}},
+ W/.code={%
+ \def\tikzgraphW{#1}%
+ \c@pgf@counta=0\foreach \tikz@dummy in {#1} {\global\advance\c@pgf@counta by1\relax}%
+ \edef\tikzgraphWnum{\the\c@pgf@counta}
+ },
+ W={1},
+ m/.style={W={1,...,#1},name shore W/.style={name=W}},
+ % Shores:
+ name shore V/.style=,
+ name shore W/.style=,
+}%
+
+
+
+%
+% Quick graphs
+%
+% Parsing the graph syntax can take a lot of time for large
+% graphs. This is mainly due to the transformation of commas and
+% semicolons and all the internal bookkeeping.
+%
+% For large graphs, the quick graph syntax offers a greatly reduced
+% syntax that will be processed much more quickly. This syntax is
+% compatible with the normal graph syntax in the sense that all
+% specifications written in the reduced syntax are also legal in the
+% normal syntax, but not the other way round.
+%
+% The following rules apply:
+%
+% 1) A quick graph consists of a sequence of either nodes, edges sequences, or
+% groups. These are separated by commas or semicolons.
+%
+% 2) Every node is of the form
+%
+% "node name"/"node text"[options]
+%
+% Here, the quotation marks are mandatory. The part '/"node text"' may
+% be missing, in which case the node name is used as the node
+% text. The options may also be missing. The node name may not contain
+% any "funny" characters (unlike in the normal graph command).
+%
+% 3) Every edge is of the form
+%
+% <node spec> <connector> <node spec> <connector> <node spec> ... <connector> <node spec>;
+%
+% Here, the <node spec> are node specifications as described above,
+% the <connector> is one of the four connectors "->", "<-", "--", and
+% "<->", followed by optional options in square
+% brackets. The semicolon may be replaced by a comma.
+%
+% 4) Every group is of the form
+%
+% { [options] lines };
+%
+% The options are compulsory, the lines must be a sequence of nodes,
+% edges, and groups as described above. The semicolon can, again, be
+% replaced by a comma.
+%
+%
+% Things that are allowed in the normal syntax, but not in the quick
+% syntax, include:
+%
+% - Connecting a node and a group as in a->{b,c}.
+% - Node names without quotation marks.
+% - Using subgraphs (graph macros).
+% - Using graph sets.
+% - Using graph color classes.
+% - Using anonymous nodes.
+% - Using the "fresh nodes" option.
+% - Using sublayouts.
+% - Using the -!- edge connector.
+% - Using the "simple" option.
+% - Using edge annotations.
+%
+% Example:
+%
+% \graph [quick] {
+% "a"/"$a$"[red] -> "b"[blue] -> "c";
+% "b" -> "d";
+% "c" ->[thick] "e";
+% { [same layer] "c", "d" };
+% };
+%
+%
+
+\tikzgraphsset{quick/.is if=tikz@graph@quick}%
+\newif\iftikz@graph@quick
+
+\def\tikz@lib@graphs@parse@quick@graph{
+ % Ok, we are before the initial brace. We open a group and start
+ % setting up some bookkeeping
+ \begingroup%
+ \global\tikz@qnode@count0\relax%
+ \let\tikzgraphnodepath\pgfutil@empty%
+ \tikz@q@outertrue%
+ \afterassignment\tikz@lib@graphs@quick@main\let\pgf@temp=%
+}%
+
+\newcount\tikz@qnode@count
+\newif\iftikz@q@outer
+
+\def\tikz@lib@graphs@quick@main{%
+ \afterassignment\tikz@lib@graphs@quick@handle\let\pgf@let@token=%
+}%
+\def\tikz@lib@graphs@quick@handle{%
+ \ifx\pgf@let@token"%
+ \expandafter\tikz@lib@graphs@quick@first@node%
+ \else%
+ \expandafter\tikz@lib@graphs@quick@other%
+ \fi%
+}%
+\def\tikz@lib@graphs@quick@other{%
+ \let\tikz@next\tikz@lib@graphs@quick@error%
+ \ifx\pgf@let@token\egroup%
+ \let\tikz@next\tikz@lib@graphs@quick@end@group%
+ \else%
+ \ifx\pgf@let@token\bgroup%
+ \let\tikz@next\tikz@lib@graphs@quick@start@group%
+ \else%
+ \ifx\pgf@let@token\par%
+ \let\tikz@next\tikz@lib@graphs@quick@main%
+ \fi%
+ \fi
+ \fi%
+ \tikz@next%
+}%
+
+\def\tikz@lib@graphs@quick@error#1{\tikzerror{Unexpected token '\string#1' in quick graph syntax}\tikz@lib@graphs@quick@main}%
+\def\tikz@lib@graphs@quick@start@group{%
+ \pgfutil@ifnextchar[\tikz@lib@graphs@quick@start@group@{\tikzerror{Group
+ in quick graph syntax must start with options.}}
+}%
+
+\def\tikz@lib@graphs@quick@start@group@[#1]{%
+ \begingroup%
+ \tikz@q@outerfalse%
+ \tikzgraphsset{#1}%
+ \tikz@lib@graphs@quick@main%
+}%
+\def\tikz@lib@graphs@quick@end@group{%
+ \iftikz@q@outer%
+ \endgroup%
+ % Ok, cleanup!
+ \pgfutil@loop%
+ \ifnum\tikz@qnode@count>0\relax%
+ \expandafter\global\expandafter\let\csname tikz@gr@q@@\csname tikz@gr@qn@@\the\tikz@qnode@count\endcsname\endcsname\relax%
+ \expandafter\global\expandafter\let\csname tikz@gr@qn@@\the\tikz@qnode@count\endcsname\relax%
+ \global\advance\tikz@qnode@count by-1\relax%
+ \pgfutil@repeat%
+ \expandafter\tikz@lib@graph@main@done%
+ \else%
+ \endgroup%
+ \expandafter\tikz@lib@graphs@end@group@%
+ \fi%
+}%
+\def\tikz@lib@graphs@end@group@{%
+ \pgfutil@ifnextchar;{\expandafter\tikz@lib@graphs@quick@main\pgfutil@gobble}{%
+ \pgfutil@ifnextchar,{\expandafter\tikz@lib@graphs@quick@main\pgfutil@gobble}{%
+ \tikzerror{Graph groups in quick syntax must be followed by a semicolon or a comma.}%
+ }%
+ }%
+}%
+
+
+\def\tikz@lib@graphs@quick@first@node{%
+ \let\tikz@quick@prev@node\relax%
+ \tikz@lib@graphs@quick@node%
+}%
+
+\def\tikz@lib@graphs@quick@node#1"{%
+ \def\tikzgraphnodename{#1}%
+ \let\tikzgraphnodetext\tikzgraphnodename%
+ \iftikzgraphsautonumbernodes
+ \edef\tikzgraphnodename{\tikzgraphnodename\tikz@lib@auto@sep\the\tikz@lib@auto@number}%
+ \global\advance\tikz@lib@auto@number by1\relax%
+ \fi
+ \pgfutil@ifnextchar/\tikz@lib@graphs@quick@text\tikz@lib@graphs@quick@opt%
+}%
+\def\tikz@lib@graphs@quick@text/"#1"{%
+ \def\tikzgraphnodetext{#1}%
+ \tikz@lib@graphs@quick@opt%
+}%
+\def\tikz@lib@graphs@quick@opt{%
+ \pgfutil@ifnextchar[\tikz@lib@graphs@quick@withopt{\tikz@lib@graphs@quick@withopt[]}%]
+}%
+\def\tikz@lib@graphs@quick@withopt[#1]{%
+ % Test, whether node already exists
+ \expandafter\ifx\csname tikz@gr@q@@\tikzgraphnodename\endcsname\relax%
+ % New node
+ \global\advance\tikz@qnode@count by1\relax%
+ \expandafter\global\expandafter\let\csname tikz@gr@q@@\tikzgraphnodename\endcsname\pgfutil@empty% not relax
+ \expandafter\global\expandafter\let\csname tikz@gr@qn@@\the\tikz@qnode@count\endcsname\tikzgraphnodename% back pointer
+ \let\tikzgraphnodefullname\tikzgraphnodename%
+ \let\tikzgraphnodeas\tikzgraphnodeas@default%
+ \node [%
+ name=\tikzgraphnodename,%
+ graphs/redirect unknown to tikz,
+ /tikz/graphs/.cd,%
+ /tikz/graphs/@nodes styling,%
+ #1]%
+ {%
+ \tikzgraphnodeas%
+ };%
+ \else%
+ %
+ % Handle late options and operators
+ \tikzgdlatenodeoptionacallback{\tikzgraphnodename}%
+ \node also[graphs/redirect unknown to tikz,/tikz/graphs/.cd,#1](\tikzgraphnodename);%
+ \fi%
+ % Connect, if necessary
+ \tikz@lig@graph@quikc@make@edge@if@necessary%
+ \tikz@lib@graphs@quick@scan@after@node%
+}%
+
+\def\tikz@lig@graph@quikc@make@edge@if@necessary{%
+ \ifx\tikz@quick@prev@node\relax%
+ \else%
+ \tikz@lib@graphs@quick@make@edge%
+ \fi%
+}%
+
+\def\tikz@lib@graphs@quick@scan@after@node{%
+ \pgfutil@ifnextchar,\tikz@lib@graphs@quick@comma{%
+ \pgfutil@ifnextchar;\tikz@lib@graphs@quick@semi{%
+ \pgfutil@ifnextchar\egroup{\tikz@lib@graphs@quick@semi;}{%
+ \pgfutil@ifnextchar\par{\expandafter\tikz@lib@graphs@quick@scan@after@node\tikz@lib@graphs@quick@gobble@par}%
+ \tikz@lib@graphs@quick@connector}}}%
+}%
+\long\def\tikz@lib@graphs@quick@gobble@par#1{}%
+
+\def\tikz@lib@graphs@quick@comma,{\tikz@lib@graphs@quick@main}%
+\def\tikz@lib@graphs@quick@semi;{\tikz@lib@graphs@quick@main}%
+\def\tikz@lib@graphs@quick@connector#1#2{%
+ \def\tikz@lib@graphs@quick@edge@kind{#1#2}%
+ \pgfutil@ifnextchar>\tikz@lib@graphs@back@edge{%
+ \pgfutil@ifnextchar[\tikz@lib@graphs@quick@connector@handle@opt{\tikz@lib@graphs@quick@connector@handle@opt[]}%]
+ }%
+}%
+\def\tikz@lib@graphs@back@edge#1{%
+ \expandafter\def\expandafter\tikz@lib@graphs@quick@edge@kind\expandafter{\tikz@lib@graphs@quick@edge@kind#1}%
+ \pgfutil@ifnextchar[\tikz@lib@graphs@quick@connector@handle@opt{\tikz@lib@graphs@quick@connector@handle@opt[]}%]
+}%
+\def\tikz@lib@graphs@quick@connector@handle@opt[#1]{%
+ \def\tikz@lib@graphs@quick@edge@options{#1}%
+ \let\tikz@quick@prev@node\tikzgraphnodename%
+ \tikz@lib@graphs@quick@scan@after@connector%
+}%
+\def\tikz@lib@graphs@quick@scan@after@connector{%
+ \pgfutil@ifnextchar\par{\expandafter\tikz@lib@graphs@quick@scan@after@connector\tikz@lib@graphs@quick@gobble@par}{%
+ \pgfutil@ifnextchar"{\expandafter\tikz@lib@graphs@quick@node\pgfutil@gobble}{%
+ \tikzerror{Quotation marks expected after edge connector}%
+ }%
+ }%
+}%
+
+\def\tikz@lib@graphs@quick@make@edge{%
+ {
+ \expandafter\tikz@lib@graphs@quick@make@edge@styling\expandafter{\tikz@lib@graphs@quick@edge@options}%
+ \expandafter\expandafter\expandafter\tikz@lib@graphs@quick@make@edge@for%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@quick@prev@node\expandafter}\expandafter{\tikzgraphnodename}%
+ }
+}%
+
+\def\tikz@lib@graphs@quick@make@edge@styling#1{%
+ \tikz@enable@edge@quotes%
+ \tikzgraphsset{.unknown/.code=\tikz@lib@graph@unknown@edge@option{##1},#1}%
+}%
+
+\def\tikz@lib@graphs@quick@make@edge@for#1#2{%
+ \pgfkeysgetvalue{/tikz/graphs/@edges styling}\pgf@tempa
+ \pgfkeysgetvalue{/tikz/graphs/@edges node}\pgf@temp@b
+ \expandafter\expandafter\expandafter\tikz@lib@graphs@quick@make@edge@for@with%
+ \expandafter\expandafter\expandafter{\expandafter\pgf@tempa\expandafter}\expandafter{\pgf@temp@b}{#1}{#2}%
+}%
+
+\def\tikz@lib@graphs@quick@make@edge@for@with#1#2#3#4{%
+ \tikzgraphsset{new \tikz@lib@graphs@quick@edge@kind={#3}{#4}{#1}{#2}}%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarygraphs.standard.code.tex b/graphics/pgf/base/tex/tikzlibrarygraphs.standard.code.tex
new file mode 100644
index 0000000000..bfceb3769a
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarygraphs.standard.code.tex
@@ -0,0 +1,108 @@
+% Copyright 2010 by Till Tantau
+% Copyright 2011 by Jannis Pohlmann
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarygraphs.standard.code.tex}
+
+
+%
+% Basic graphs
+%
+
+
+\tikzgraphsset{
+ %
+ % An independent set $V$ of nodes.
+ %
+ declare={subgraph I_n}%
+ {
+ \foreach \tikz@lib@graph@node@num in \tikzgraphV
+ { \tikz@lib@graph@node@num }
+ },
+ %
+ % An two-shore independent set $V$ with shores V and W.
+ %
+ declare={subgraph I_nm}%
+ {
+ subgraph I_n [name shore V] -- [no edges]
+ subgraph I_n [name shore W, V/.expand once=\tikzgraphW]
+ },
+ %
+ % The complete clique on $V$.
+ %
+ declare={subgraph K_n}%
+ {
+ [clique]
+ subgraph I_n
+ },
+ %
+ % A complete bipartite graph with shores V and W.
+ %
+ declare={subgraph K_nm}%
+ {
+ [color class=shore V,
+ color class=shore W,
+ complete bipartite={shore V}{shore W}]
+ subgraph I_n [name shore V, shore V] -- [no edges]
+ subgraph I_n [name shore W, V/.expand once=\tikzgraphW, shore W]
+ },
+ %
+ % A cycle with n nodes.
+ %
+ declare={subgraph C_n}%
+ {
+ [cycle]
+ subgraph I_n
+ },
+ %
+ % A path with n nodes.
+ %
+ declare={subgraph P_n}%
+ {
+ [path]
+ subgraph I_n
+ },
+ %
+ % A grid with n nodes.
+ %
+ declare={subgraph Grid_n}%
+ {
+ [grid]
+ subgraph I_n
+ },
+ %
+ % A random graph according to the G_{n,p} model: For each pair of
+ % vertices there is an edge between them with probability p.
+ %
+ p/.initial=0.5,
+ declare={subgraph G_np}%
+ {
+ [/utils/exec={
+ \pgfmathsetmacro\tikz@lib@lg@p{\pgfkeysvalueof{/tikz/graphs/p}}
+ \let\tikz@lib@gnp@edges\pgfutil@empty%
+ \foreach \tikz@lib@graph@node@a [count=\tikz@lib@g@count@a] in \tikzgraphV
+ \foreach \tikz@lib@graph@node@b [count=\tikz@lib@g@count@b] in \tikzgraphV
+ {
+ \ifnum\tikz@lib@g@count@a<\tikz@lib@g@count@b\relax
+ \pgfmathparse{rnd}
+ \ifdim\pgfmathresult pt<\tikz@lib@lg@p pt%
+ \ifx\tikz@lib@gnp@edges\pgfutil@empty
+ \xdef\tikz@lib@gnp@edges{\tikz@lib@graph@node@a--\tikz@lib@graph@node@b}%
+ \else
+ \xdef\tikz@lib@gnp@edges{\tikz@lib@gnp@edges,\tikz@lib@graph@node@a--\tikz@lib@graph@node@b}%
+ \fi
+ \fi
+ \fi
+ }
+ }]
+ \foreach \tikz@lg@temp in \tikz@lib@gnp@edges {
+ [parse/.expand once=\tikz@lg@temp]
+ }
+ },
+}%
diff --git a/graphics/pgf/base/tex/tikzlibraryintersections.code.tex b/graphics/pgf/base/tex/tikzlibraryintersections.code.tex
new file mode 100644
index 0000000000..5b0e83d5ee
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryintersections.code.tex
@@ -0,0 +1,144 @@
+% Copyright 2008 by Mark Wibrow
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Free Documentation License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\usepgflibrary{intersections}%
+
+% FIXME : the 'name path global' is not reset properly - and some
+% following 'name path' will append to it rather that reset it.
+
+\pgfkeys{%
+ /tikz/name path global/.code={%
+ % reset any "old" variables inherited from some other path
+ % - we do not accidentally want to append to an old path with the
+ % same name (or if someone provided the option twice)...
+ \expandafter\global\expandafter\let\csname tikz@intersect@path@name@#1\endcsname=\relax
+ \tikz@key@name@path{#1}{\gdef}%
+ },
+ /tikz/name path local/.code={%
+ \pgfkeys{/tikz/name path={#1}}%
+ },
+ /tikz/name path/.code={%
+ % hm. Do we need this "reset old option" as in 'name path global'
+ % for this case as well?
+ \tikz@key@name@path{#1}{\def}%
+ },
+}%
+
+% #1: the name to assign.
+% #2: one of '\def' or '\gdef'.
+\def\tikz@key@name@path#1#2{%
+ \tikz@addmode{%
+ \pgfsyssoftpath@getcurrentpath\tikz@intersect@temppath@round%
+ \pgfprocessround\tikz@intersect@temppath@round\tikz@intersect@temppath%
+ \ifx\tikz@intersect@namedpaths\pgfutil@empty%
+ \else%
+ \tikz@intersect@namedpaths%
+ \fi%
+ \tikz@intersect@addto@path@names{#1}{#2}%
+ }%
+}%
+
+% #1: the name to assign.
+% #2: one of '\def' or '\gdef'.
+\def\tikz@intersect@addto@path@names#1#2{%
+ \edef\tikz@marshal{#2\expandafter\noexpand\csname tikz@intersect@path@name@#1\endcsname}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\tikz@marshal%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@marshal\expandafter{\tikz@intersect@temppath}}%
+ \expandafter\pgfutil@g@addto@macro\expandafter\tikz@intersect@namedpaths\expandafter{\tikz@marshal}%
+}%
+
+% at the end of evey \path command ...
+\let\tikz@finish@orig=\tikz@finish
+\def\tikz@finish{%
+ \tikz@finish@orig%
+ \tikz@intersect@finish%
+}%
+
+% ... make the named path variables available
+\def\tikz@intersect@finish{%
+ \tikz@intersect@namedpaths%
+}%
+
+\let\tikz@intersect@namedpaths=\pgfutil@empty
+\let\tikz@intersect@path@a=\pgfutil@empty
+\let\tikz@intersect@path@b=\pgfutil@empty
+\let\tikz@intersect@name=\pgfutil@empty
+\let\tikz@intersect@total=\pgfutil@empty
+
+\tikzset{
+ name intersections/.code={%
+ \tikzset{/tikz/intersection/.cd,
+ by=,
+ #1}%
+ \pgfutil@ifundefined{tikz@intersect@path@name@\tikz@intersect@path@a}{%
+ \tikzerror{I do not know the path named `\tikz@intersect@path@a'. Perhaps you misspelt it}}%
+ {\pgfutil@ifundefined{tikz@intersect@path@name@\tikz@intersect@path@b}{%
+ \tikzerror{I do not know the path named `\tikz@intersect@path@b'. Perhaps you misspelt it}}%
+ {%
+ \pgfintersectionofpaths%
+ {%
+ \expandafter\pgfsetpath\csname tikz@intersect@path@name@\tikz@intersect@path@a\endcsname%
+ }%
+ {%
+ \expandafter\pgfsetpath\csname tikz@intersect@path@name@\tikz@intersect@path@b\endcsname%
+ }%
+ \ifx\tikz@intersect@total\pgfutil@empty%
+ \else%
+ \expandafter\let\tikz@intersect@total=\pgfintersectionsolutions%
+ \fi%
+ \ifx\tikz@intersect@name\pgfutil@empty%
+ \def\tikz@intersect@@name{intersection}%
+ \else%
+ \let\tikz@intersect@@name=\tikz@intersect@name%
+ \fi%
+ \pgfmathloop%
+ \ifnum\pgfmathcounter>\pgfintersectionsolutions\relax%
+ \else%
+ \path[reset cm]\pgfextra{\pgftransformshift{\pgfpointintersectionsolution{\pgfmathcounter}}}%
+ coordinate (\tikz@intersect@@name-\pgfmathcounter);
+ \repeatpgfmathloop%
+ \ifx\tikz@intersect@by\pgfutil@empty%
+ \else%
+ \foreach\tikz@intersect@name[count=\tikz@intersection@count] in \tikz@intersect@by%
+ {\expandafter\tikz@intersect@name@parse\tikz@intersect@name\pgf@stop}%
+ \fi%
+ }%
+ }%
+ },%
+ intersection/.cd,
+ of/.code=\tikz@intersect@path@names@parse#1\tikz@stop,%
+ name/.store in=\tikz@intersect@name,
+ total/.store in=\tikz@intersect@total,
+ by/.store in=\tikz@intersect@by,
+ sort by/.code=\edef\tikz@intersect@sort@by{#1}\tikz@intersect@check@sort@by%
+}%
+
+
+\def\tikz@intersect@check@sort@by{%
+ \ifx\tikz@intersect@sort@by\tikz@intersect@path@a%
+ \pgfintersectionsortbyfirstpath%
+ \else%
+ \ifx\tikz@intersect@sort@by\tikz@intersect@path@b%
+ \pgfintersectionsortbysecondpath%
+ \else%
+ \pgf@intersect@sortfalse%
+ \fi%
+ \fi%
+}%
+\def\tikz@intersect@path@names@parse#1 and #2\tikz@stop{%
+ \def\tikz@intersect@path@a{#1}%
+ \def\tikz@intersect@path@b{#2}%
+}%
+
+\def\tikz@intersect@name@parse{\pgfutil@ifnextchar[\tikz@intersect@name@parse@opt{\tikz@intersect@name@parse@opt[]}}%}
+\def\tikz@intersect@name@parse@opt[#1]#2\pgf@stop{%
+ \coordinate [#1] (#2) at (\tikz@intersect@@name-\tikz@intersection@count);
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarylindenmayersystems.code.tex b/graphics/pgf/base/tex/tikzlibrarylindenmayersystems.code.tex
new file mode 100644
index 0000000000..89807c8e04
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarylindenmayersystems.code.tex
@@ -0,0 +1,81 @@
+% Copyright 2008 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.
+
+\usepgflibrary{lindenmayersystems}%
+
+\def\tikz@@lsystem-system{%
+ \pgfutil@ifnextchar[{\tikz@lsystem@options}{\tikz@lsystem@options[]}}%
+
+\def\tikz@lsystem indenmayer system{%
+ \pgfutil@ifnextchar[{\tikz@lsystem@options}{\tikz@lsystem@options[]}}%
+
+\def\tikz@lsystem@options[#1]{%
+ \tikzset{#1}%
+ \ifx\tikz@lsystem@rules\pgfutil@empty%
+ \else%
+ \tikz@lsystem@declare%
+ \def\tikz@lsystem@name{tikz@temp}%
+ \fi%
+ \ifx\tikz@lsystem@anchor\pgfutil@empty%
+ \pgfpathmoveto{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}%
+ \pgflindenmayersystem{\tikz@lsystem@name}{\tikz@lsystem@axiom}{\tikz@lsystem@order}%
+ \else%
+ \pgfextract@process\tikz@lsystem@pos{\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}%
+ \setbox\pgfnodeparttextbox=\hbox{%
+ \pgfinterruptpicture%
+ \pgfpicture%
+ \pgfpathmoveto{\pgfpointorigin}%
+ \pgflindenmayersystem{\tikz@lsystem@name}{\tikz@lsystem@axiom}{\tikz@lsystem@order}%
+ \begingroup%
+ \tikz@finish%
+ \endpgfpicture%
+ \endpgfinterruptpicture%
+ }%
+ {%
+ \pgftransformshift{\tikz@lsystem@pos}%
+ \tikzset{inner sep=0pt, outer sep=0pt, minimum size=0pt}%
+ \pgfmultipartnode{rectangle}{\tikz@lsystem@anchor}{lindenmayer system}{\pgfusepath{discard}}%
+ }%
+ \fi%
+ \tikz@scan@next@command}%
+
+\tikzset{%
+ lindenmayer system/.style={/pgf/lindenmayer system/.cd, #1,/tikz/.cd},
+ l-system/.style={lindenmayer system={#1}},
+}%
+\pgfkeys{/pgf/lindenmayer system/.cd,
+ name/.code=\edef\tikz@lsystem@name{#1}\let\tikz@lsystem@rules=\pgfutil@empty,%
+ axiom/.store in=\tikz@lsystem@axiom,%
+ order/.store in=\tikz@lsystem@order,
+ .unknown/.code={%
+ \pgfutil@ifundefined{pgf@lsystem@\pgfkeyscurrentname}{%
+ \pgfkeys{/errors/unknown key={/pgf/lindenmayer system/\pgfkeyscurrentname}{#1}}%
+ \let\tikz@lsystem@name=\pgfutil@empty%
+ }%
+ {\edef\tikz@lsystem@name{\pgfkeyscurrentname}}
+ },%
+ anchor/.store in=\tikz@lsystem@anchor,%
+ rule set/.store in=\tikz@lsystem@rules
+}%
+\let\tikz@lsystem@anchor=\pgfutil@empty%
+\let\tikz@lsystem@rules=\pgfutil@empty%
+
+\def\tikz@lsystem@declare{%
+ \expandafter\let\csname pgf@lsystem@tikz@temp\endcsname=\relax%
+ \pgfdeclarelindenmayersystem{tikz@temp}{%
+ \expandafter\tikz@lsystem@parse@rules\tikz@lsystem@rules,\tikz@stop,%
+ }%
+}%
+\def\tikz@lsystem@parse@rules#1,{%
+ \ifx#1\tikz@stop%
+ \else%
+ \rule{#1}%
+ \expandafter\tikz@lsystem@parse@rules%
+ \fi%
+}%
diff --git a/graphics/pgf/base/tex/tikzlibrarymath.code.tex b/graphics/pgf/base/tex/tikzlibrarymath.code.tex
new file mode 100644
index 0000000000..fd876f5d73
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarymath.code.tex
@@ -0,0 +1,731 @@
+% Copyright 2013 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.
+
+\usetikzlibrary{fpu}
+
+\edef\tikz@math@at@catcode{\the\catcode`\@}%
+\catcode`\@=11
+
+\def\tikz@math@gobblespaces#1{\pgfutil@ifnextchar x{#1}{#1}}%
+
+\def\tikz@math@meaning@macro{macro}%
+\def\tikz@math@meaning@dimen{dimen}%
+\def\tikz@math@meaning@count{count}%
+\def\tikz@math@meaning@null{null}%
+
+\def\tikz@math@getmeaning#1{\expandafter\tikz@math@@getmeaning\meaning#1\tikz@math@getmeaning@stop}%
+
+\def\tikz@math@@getmeaning#1#2#3#4#5\tikz@math@getmeaning@stop{%
+ \if#1u% undefined
+ \let\tikz@math@meaning=\tikz@math@meaning@macro%
+ \else%
+ \if#1m%
+ \let\tikz@math@meaning=\tikz@math@meaning@macro%
+ \else%
+ \if#2d%
+ \let\tikz@math@meaning=\tikz@math@meaning@dimen%
+ \else%
+ \if#2c%
+ \let\tikz@math@meaning=\tikz@math@meaning@count%
+ \else%
+ \if#3k% A skip. Treat like a dimen.
+ \let\tikz@math@meaning=\tikz@math@meaning@dimen%
+ \else%
+ \let\tikz@math@meaning=\tikz@math@meaning@null%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+\def\tikz@math@firstoftwo#1#2{#1}%
+\def\tikz@math@secondoftwo#1#2{#2}%
+
+
+\def\tikz@math@getvarstring#1{%
+ \begingroup%
+ \escapechar=-1\relax%
+ \expandafter\tikz@math@@getvarstring\string#1\tikz@math}%
+
+\def\tikz@math@@getvarstring#1\tikz@math#2{%
+ \endgroup%
+ \def#2{#1}%
+}%
+
+\long\def\tikz@math@collecttosemicolon@other#1#2;{%
+ \def\tikz@math@collected{#2}#1}%
+\def\tikz@math@semicolon@other{;}%
+
+{\catcode`\;=13
+\long\gdef\tikz@math@collecttosemicolon@active#1#2;{%
+ \def\tikz@math@collected{#2}#1}%
+\gdef\tikz@math@semicolon@active{;}%
+}%
+
+
+\def\tikz@math@setvartype#1#2{%
+ \expandafter\let\csname tikz@math@var@vartype@\string#1\endcsname=#2%
+}%
+
+
+\def\tikz@math@getvartype#1#2{%
+ \def\tikz@math@marshal{\let#1=}%
+ \expandafter\tikz@math@marshal\csname
+ tikz@math@var@vartype@\string#2\endcsname%
+}%
+
+
+
+\def\tikz@math@ifvarcoordinate#1{%
+ \expandafter\ifx\csname
+ tikz@math@var@vartype@\string#1\endcsname\tikz@math@keyword@coordinate%
+ \let\tikz@math@next=\tikz@math@firstoftwo%
+ \else%
+ \let\tikz@math@next=\tikz@math@secondoftwo%
+ \fi%
+ \tikz@math@next%
+}%
+
+\def\tikz@math@ifvarinteger#1{%
+ \expandafter\ifx\csname
+ tikz@math@var@vartype@\string#1\endcsname\tikz@math@keyword@integer%
+ \let\tikz@math@next=\tikz@math@firstoftwo%
+ \else%
+ \let\tikz@math@next=\tikz@math@secondoftwo%
+ \fi%
+ \tikz@math@next%
+}%
+
+
+\def\tikz@math@setvarindexed#1{%
+ \expandafter\let\csname
+ tikz@math@var@subtype@\string#1\endcsname=\tikz@math@subtype@indexed%
+}%
+
+\def\tikz@math@clearvarindexed#1{%
+ \expandafter\let\csname tikz@math@var@subtype@\string#1\endcsname=\relax%
+}%
+
+\def\tikz@math@ifvarindexed#1{%
+ \expandafter\ifx\csname tikz@math@var@subtype@\string#1\endcsname\relax%
+ \let\tikz@math@next=\tikz@math@secondoftwo%
+ \else%
+ \let\tikz@math@next=\tikz@math@firstoftwo%
+ \fi%
+ \tikz@math@next%
+}%
+
+\def\tikz@math@stop{@}%
+
+\let\tikz@math@parse@hook@before=\pgfutil@empty
+\let\tikz@math@parse@hook@after=\pgfutil@empty
+
+\def\tikz@math{%
+ \ifnum\catcode`\;=13\relax%
+ \let\tikz@math@semicolon=\tikz@math@semicolon@active%
+ \let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@active%
+ \else%
+ \let\tikz@math@semicolon=\tikz@math@semicolon@other%
+ \let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@other%
+ \fi%
+ \tikz@math@parse@hook@before%
+ \tikz@@math}%
+
+
+
+
+\long\def\tikz@@math#1{%
+ \def\tikz@math@marshal{\tikz@math@parse#1}%
+ \expandafter\expandafter\expandafter\tikz@math@marshal\expandafter\tikz@math@stop\tikz@math@semicolon}%
+
+\def\tikz@math@parse{\pgfutil@ifnextchar\bgroup\tikz@math@@parse@bgroup\tikz@math@@parse@nobgroup}%
+
+
+\def\tikz@math@@parse@bgroup{%
+ \tikz@math@collecttosemicolon{%
+ % MW: Don't know how reliable this test is.
+ \ifx\pgf@selectfontorig\tikz@math@undefined%
+ \begingroup\tikz@math@collected\endgroup%
+ \else%
+ \begingroup\csname nullfont\endcsname\tikz@math@collected\endgroup%
+ \fi\tikz@math@parse}}%
+
+
+
+\def\tikz@math@@parse@nobgroup{\tikz@math@collecttosemicolon{\tikz@math@@parse@@nobgroup}}%
+
+\def\tikz@math@@parse@@nobgroup{%
+ \let\tikz@math@tmp=\tikz@math@collected%
+ \ifx\tikz@math@tmp\tikz@math@stop%
+ \def\tikz@math@next{\expandafter\tikz@math@parse@finish\tikz@math@semicolon}%
+ \else%
+ \def\tikz@math@next{\expandafter\expandafter\expandafter\tikz@math@parse@keyword@check\expandafter\tikz@math@tmp\tikz@math@semicolon}%
+ \fi%
+ \tikz@math@next%
+}%
+
+\def\tikz@math@parse@finish{%
+ \tikz@math@collecttosemicolon{\tikz@math@parse@hook@after}%
+}%
+
+
+
+\newif\iftikz@math@let
+\def\tikz@math@parse@keyword@check#1{%
+ \tikz@math@letfalse%
+ \tikz@math@getmeaning{#1}%
+ \ifx\tikz@math@meaning\tikz@math@meaning@null%
+ \let\tikz@math@next=\tikz@math@parse@keyword%
+ \else%
+ \let\tikz@math@next=\tikz@math@parse@nokeyword%
+ \fi%
+ \tikz@math@next#1}%
+
+
+\def\tikz@math@parse@keyword{%
+ \let\tikz@math@parsed@keyword=\pgfutil@empty%
+ \futurelet\tikz@math@parse@token\tikz@math@@parse@keyword}%
+
+\def\tikz@math@@parse@keyword{%
+ \ifx\tikz@math@parse@token\pgfutil@sptoken%
+ \let\tikz@math@next=\tikz@math@@@parse@keyword%
+ \else%
+ \ifx\tikz@math@parse@token(%
+ \let\tikz@math@next=\tikz@math@@@parse@keyword%
+ \else%
+ \ifx\tikz@math@parse@token\bgroup%
+ \let\tikz@math@next=\tikz@math@@@parse@keyword%
+ \else%
+ \let\tikz@math@next=\tikz@math@@@@parse@keyword%
+ \fi%
+ \fi%
+ \fi%
+ \tikz@math@next}%
+
+\def\tikz@math@error#1{\pgfutil@packageerror{tikz}{tikz math library: #1}{}}%
+
+\def\tikz@math@@@parse@keyword{%
+ \expandafter\ifx\csname tikz@math@process@keyword@\tikz@math@parsed@keyword\endcsname\relax%
+ \expandafter\ifx\csname pgfmath\tikz@math@parsed@keyword\endcsname\relax%
+ \tikz@math@error{Unknown function or keyword '\tikz@math@parsed@keyword'}%
+ \else%
+ \def\tikz@math@next{\tikz@math@collecttosemicolon{\tikz@math@function@noassign}}%
+ \fi%
+ \else%
+ \expandafter\def\expandafter\tikz@math@next\expandafter{\csname tikz@math@process@keyword@\tikz@math@parsed@keyword\endcsname}%
+ \fi%
+ \tikz@math@next}%
+
+\def\tikz@math@@@@parse@keyword#1{%
+ \edef\tikz@math@parsed@keyword{\tikz@math@parsed@keyword#1}%
+ \futurelet\tikz@math@parse@token\tikz@math@@parse@keyword%
+}%
+
+\def\tikz@math@function@noassign{%
+ \pgfmathparse{\tikz@math@parsed@keyword\tikz@math@collected}%
+ \tikz@math@parse%
+}%
+
+
+
+
+\def\tikz@math@process@keyword@count{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@count}}%
+\def\tikz@math@process@keyword@@count{%
+\def\tikz@math@assign@register{\csname newcount\endcsname}%
+\expandafter\tikz@math@gobblespaces\expandafter\tikz@math@process@registers\tikz@math@collected,@,}%
+
+\def\tikz@math@process@keyword@length{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@length}}%
+\def\tikz@math@process@keyword@@length{%
+\def\tikz@math@assign@register{\csname newdimen\endcsname}%
+\show\tikz@math@collected
+\expandafter\tikz@math@gobblespaces\expandafter\tikz@math@process@registers\tikz@math@collected,@,}%
+
+
+\def\tikz@math@process@registers#1#2,{%
+ \def\tikz@math@var{#1}%
+ \ifx\tikz@math@var\tikz@math@stop%
+ \let\tikz@math@next=\tikz@math@parse%
+ \else%
+ \tikz@math@assign@register#1\relax%
+ \let\tikz@math@next=\tikz@math@process@registers%
+ \fi%
+ \tikz@math@gobblespaces\tikz@math@next%
+}%
+
+
+\def\tikz@math@process@keyword@if#1then{%
+ \def\tikz@math@if@condition{#1}%
+ \tikz@math@gobblespaces\tikz@math@parse@if@iftrue%
+}%
+\def\tikz@math@parse@if@iftrue#1{%
+ \def\tikz@math@if@trueaction{#1}%
+ \pgfutil@ifnextchar e{\tikz@math@parse@else}{\tikz@math@if@doif}}%
+
+\def\tikz@math@parse@else else{\tikz@math@gobblespaces\tikz@math@if@doifelse}%
+
+\def\tikz@math@if@doif{\tikz@math@collecttosemicolon{\tikz@math@if@@doif}}%
+
+\def\tikz@math@if@@doif{%
+ \pgfmathparse{\tikz@math@if@condition}%
+ \ifpgfmathfloatparseactive%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \fi%
+ \ifdim\pgfmathresult pt=0pt\relax%
+ \else%
+ \expandafter\tikz@math\expandafter{\tikz@math@if@trueaction}%
+ \fi%
+ \tikz@math@parse%
+}%
+\def\tikz@math@if@doifelse{\tikz@math@collecttosemicolon{\tikz@math@if@@doifelse}}%
+\def\tikz@math@if@@doifelse{%
+ \pgfmathparse{\tikz@math@if@condition}%
+ \ifpgfmathfloatparseactive%
+ \pgfmathfloattofixed{\pgfmathresult}%
+ \fi%
+ \let\tikz@math@if@falseaction=\tikz@math@collected%
+ \ifdim\pgfmathresult pt=0pt\relax%
+ \expandafter\tikz@math\expandafter{\tikz@math@if@falseaction}%
+ \else%
+ \expandafter\tikz@math\expandafter{\tikz@math@if@trueaction}%
+ \fi%
+ \tikz@math@parse%
+}%
+\def\tikz@math@process@keyword@let{%
+ \tikz@math@lettrue%
+ \tikz@math@gobblespaces\tikz@math@parse@nokeyword%
+}%
+
+
+\def\tikz@math@parse@nokeyword#1{%
+ \def\tikz@math@var{#1}%
+ \tikz@math@getvarstring{#1}\tikz@math@varstring%
+ \let\tikz@math@vartype=\pgfutil@empty%
+ \ifx\tikz@math@var\tikz@math@stop%
+ \let\tikz@math@next=\tikz@math@parse@finish%
+ \else%
+ \ifx\tikz@math@semicolon\tikz@math@var%
+ \let\tikz@math@next=\tikz@math@parse%
+ \else%
+ \let\tikz@math@next=\tikz@math@parse@index@check%
+ \fi%
+ \fi%
+ \tikz@math@next}%
+
+\def\tikz@math@parse@index@check{%
+ \pgfutil@ifnextchar={\tikz@math@parse@noindex}{\tikz@math@parse@index}}%
+
+\def\tikz@math@parse@noindex{%
+ \expandafter\tikz@math@clearvarindexed\tikz@math@var%
+ \let\tikz@math@current@index=\pgfutil@empty%
+ \tikz@math@parse@afterindex%
+}%
+
+\def\tikz@math@parse@index#1{%
+ \def\tikz@math@tmp{#1}%
+ \expandafter\tikz@math@setvarindexed\tikz@math@var% {}
+ \edef\tikz@math@current@index{#1}%
+ \tikz@math@parse@afterindex%
+}%
+\def\tikz@math@parse@afterindex#1={\tikz@math@gobblespaces\tikz@math@parse@assignment}%
+
+\def\tikz@math@parse@assignment{\tikz@math@collecttosemicolon{\tikz@math@parse@@assignment}}%
+\def\tikz@math@parse@@assignment{%
+ \expandafter\expandafter\expandafter\tikz@math@doassignment\expandafter\expandafter\expandafter%
+ {\expandafter\tikz@math@var\expandafter}\expandafter{\tikz@math@collected}%
+ \tikz@math@parse%
+}%
+
+\def\tikz@math@dollar@char{$}%
+\def\tikz@math@dollar@char{$}% For annoying syntax highlighters
+
+\def\tikz@math@doassignment#1#2{%
+ \tikz@math@ifvarcoordinate{#1}{%
+ \def\tikz@math@var{#1}% Unfortunately, we must do this again.
+ \tikz@math@getvarstring{#1}\tikz@math@varstring% And this
+ \expandafter\pgfutil@in@\tikz@math@dollar@char{#2}%
+ \edef\tikz@math@expression{#2}%
+ \ifpgfutil@in@%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@math@assign@coordinate\tikz@math@expression%
+ \else%
+ \expandafter\ifx\csname tikz@library@calc@loaded\endcsname\relax%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@math@assign@coordinate\tikz@math@expression%
+ \else%
+ \expandafter\tikz@scan@one@point\expandafter\tikz@math@assign@coordinate\expandafter%
+ (\expandafter$\tikz@math@expression$)%
+ \fi%
+ \fi%
+ }{%
+ \iftikz@math@let% Not really a let
+ \ifx\tikz@math@current@index\pgfutil@empty%
+ \edef#1{#2}%
+ \else%
+ \edef\tikz@math@tmp{#2}%
+ \expandafter\expandafter\expandafter\tikz@math@assign@index\expandafter\expandafter\expandafter%
+ {\expandafter\tikz@math@varstring\expandafter}\expandafter{\tikz@math@tmp}%
+ \fi%
+ \tikz@math@letfalse%
+ \else%
+ \ifx\tikz@math@current@index\pgfutil@empty%
+ \tikz@math@getmeaning{#1}%
+ \ifx\tikz@math@meaning\tikz@math@meaning@dimen%
+ \pgfmathsetlength{#1}{#2}%
+ \let\tikz@math@last@assigned@value=\pgfmathresult%
+ \else%
+ \ifx\tikz@math@meaning\tikz@math@meaning@count%
+ \pgfmathsetcount{#1}{#2}%
+ \let\tikz@math@last@assigned@value=\pgfmathresult%
+ \else%
+ \tikz@math@ifvarinteger{#1}{\pgfmathparse{int(#2)}}{\pgfmathparse{#2}}%
+ \let\tikz@math@last@assigned@value=\pgfmathresult%
+ \let#1=\pgfmathresult%
+ \fi%
+ \fi%
+ \else%
+ \tikz@math@ifvarinteger{#1}{\pgfmathparse{int(#2)}}{\pgfmathparse{#2}}%
+ \expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring}\pgfmathresult%
+ \let\tikz@math@last@assigned@value=\pgfmathresult%
+ \fi%
+ \fi%
+ }%
+}%
+
+
+
+\def\tikz@math@assign@index#1#2{%
+ \expandafter\def\csname#1\endcsname##1{\csname
+ tikz@math@var@indexed@#1@##1\endcsname}%
+ \expandafter\edef\csname
+ tikz@math@var@indexed@#1@\tikz@math@current@index\endcsname{#2}\relax%
+}%
+
+
+
+\def\tikz@math@assign@coordinate#1{%
+ \pgf@process{#1}%
+ \ifx\tikz@math@current@index\pgfutil@empty%
+ \expandafter\edef\csname\tikz@math@varstring\endcsname{\the\pgf@x,\the\pgf@y}%
+ \expandafter\edef\csname\tikz@math@varstring x\endcsname{\the\pgf@x}%
+ \expandafter\edef\csname\tikz@math@varstring y\endcsname{\the\pgf@y}%
+ \else%
+ \expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring}{\the\pgf@x,\the\pgf@y}%
+ \expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring x}{\the\pgf@x}%
+ \expandafter\tikz@math@assign@index\expandafter{\tikz@math@varstring y}{\the\pgf@y}%
+ \fi%
+}%
+
+
+
+\def\tikz@math@keyword@coordinate{coordinate}%
+\def\tikz@math@process@keyword@coordinate{%
+ \let\tikz@math@vartype=\tikz@math@keyword@coordinate%
+ \tikz@math@gobblespaces\tikz@math@process@vartypes%
+}%
+
+\def\tikz@math@keyword@integer{integer}%
+\def\tikz@math@process@keyword@integer{%
+ \let\tikz@math@vartype=\tikz@math@keyword@integer%
+ \tikz@math@gobblespaces\tikz@math@process@vartypes%
+}%
+\def\tikz@math@process@keyword@int{%
+ \tikz@math@process@keyword@integer%
+}%
+
+\def\tikz@math@keyword@real{real}%
+\def\tikz@math@process@keyword@real{%
+ \let\tikz@math@vartype=\tikz@math@keyword@real%
+ \tikz@math@gobblespaces\tikz@math@process@vartypes%
+}%
+
+\def\tikz@math@process@keyword@point{\tikz@math@process@keyword@coordinate}%
+
+
+\def\tikz@math@process@vartypes{\tikz@math@collecttosemicolon{\tikz@math@process@@vartypes}}%
+
+\def\tikz@math@process@@vartypes{%
+ \expandafter\tikz@math@@process@vartypes\tikz@math@collected,@,\tikz@math%
+}%
+
+\def\tikz@math@@process@vartypes#1#2,{%
+ \def\tikz@math@var{#1}%
+ \tikz@math@getvarstring{#1}\tikz@math@varstring%
+ \ifx\tikz@math@var\tikz@math@stop%
+ \let\tikz@math@next=\tikz@math@@@process@vartypes%
+ \else%
+ \expandafter\tikz@math@setvartype\tikz@math@var\tikz@math@vartype%
+ \def\tikz@math@next{\tikz@math@gobblespaces\tikz@math@@process@vartypes}%
+ \fi%
+ \tikz@math@next%
+}%
+
+\def\tikz@math@process@keyword@print{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@print}}%
+\def\tikz@math@process@keyword@@print{%
+ \begingroup\tikz@math@collected\endgroup\tikz@math@parse%
+}%
+
+\def\tikz@math@@@process@vartypes#1\tikz@math{%
+ \tikz@math@parse%
+}%
+
+\newcount\tikz@math@for@depth
+
+\def\tikz@math@for@namedef#1{\expandafter\def\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}%
+\def\tikz@math@for@nameedef#1{\expandafter\edef\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}%
+\def\tikz@math@for@namelet#1{\expandafter\let\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}%
+
+\def\tikz@math@for@namegetvalue#1#2{%
+ \def\tikz@math@marshal{\let#2=}%
+ \expandafter\tikz@math@marshal\csname tikz@math@for@def@#1@\the\tikz@math@for@depth\endcsname}%
+
+\def\tikz@math@process@keyword@for{%
+ \tikz@math@for%
+}%
+
+\def\tikz@math@for@external{%
+ \ifnum\catcode`\;=13\relax%
+ \let\tikz@math@semicolon=\tikz@math@semicolon@active%
+ \let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@active%
+ \else%
+ \let\tikz@math@semicolon=\tikz@math@semicolon@other%
+ \let\tikz@math@collecttosemicolon=\tikz@math@collecttosemicolon@other%
+ \fi
+ \advance\tikz@math@for@depth by1\relax%
+ \tikz@math@for@namedef{execute}{\tikz@math@for@external@execute}%
+ \tikz@math@for@namedef{finished}{\relax}%
+ \tikz@math@gobblespaces\tikz@math@for@parsevar}%
+
+\def\tikz@math@for@external@execute#1{#1}%
+
+\def\tikz@math@for{%
+ \advance\tikz@math@for@depth by1\relax%
+ \tikz@math@for@namedef{execute}{\tikz@math}%
+ \tikz@math@for@namedef{finished}{\tikz@math@parse}%
+ \tikz@math@gobblespaces\tikz@math@for@parsevar}%
+
+
+\def\tikz@math@for@parsevar#1{%
+ \tikz@math@for@namedef{var}{#1}%
+ \tikz@math@for@parsein}%
+
+\def\tikz@math@getindex#1{%
+ \tikz@math@@getindex#1\tikz@math@getindex\tikz@math@@getindex%
+}%
+
+\def\tikz@math@@getindex#1#2\tikz@math@@getindex{#1}%
+
+\def\tikz@math@for@parsein#1in{%
+ \def\tikz@math@tmp{#1}%
+ \ifx\tikz@math@tmp\pgfutil@empty%
+ \tikz@math@for@namedef{index}{}%
+ \else%
+ \tikz@math@for@nameedef{index}{\tikz@math@getindex{#1}}%
+ \fi%
+ \tikz@math@gobblespaces\tikz@math@for@parselist%
+}%
+
+
+\long\def\tikz@math@for@parselist#1{%
+ \edef\tikz@math@for@list{#1}%
+ \tikz@math@collecttosemicolon{\tikz@math@for@parseaction}}%
+
+\def\tikz@math@for@parseaction{%
+ \tikz@math@for@namedef{prevvalue}{}%
+ \tikz@math@for@namedef{prevprevvalue}{}%
+ \tikz@math@for@namelet{action}=\tikz@math@collected%
+ \expandafter\tikz@math@for@scan\tikz@math@for@list,\tikz@math,\tikz@@math%
+}%
+
+\def\tikz@math@token{\tikz@math}%
+
+
+\def\tikz@math@for@scan#1,{%
+ \def\tikz@math@for@value{#1}%
+ \ifx\tikz@math@for@value\tikz@math@token%
+ \let\tikz@math@next=\tikz@math@for@scan@end%
+ \else%
+ \ifx\tikz@math@for@value\pgfutil@empty%
+ \let\tikz@math@next=\tikz@math@for@scan@end%
+ \else%
+ \pgfutil@in@{...}{#1}%
+ \ifpgfutil@in@%
+ \let\tikz@math@next=\tikz@math@for@scan@dots%
+ \else%
+ \tikz@math@for@namegetvalue{var}{\tikz@math@var}%
+ \tikz@math@for@namegetvalue{index}{\tikz@math@current@index}%
+ \tikz@math@for@namegetvalue{action}{\tikz@math@action}%
+ \expandafter\tikz@math@getvarstring\expandafter{\tikz@math@var}\tikz@math@varstring%
+ \expandafter\tikz@math@doassignment\expandafter{\tikz@math@var}{#1}%
+ \tikz@math@for@namelet{value}=\tikz@math@last@assigned@value%
+ \tikz@math@for@namegetvalue{execute}{\tikz@math@execute}%
+ \expandafter\tikz@math@execute\expandafter{\tikz@math@action}%
+ \tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
+ \tikz@math@for@namelet{prevprevvalue}=\tikz@math@prevvalue%
+ \tikz@math@for@namegetvalue{value}{\tikz@math@value}%
+ \tikz@math@for@namelet{prevvalue}=\tikz@math@value%
+ \let\tikz@math@next=\tikz@math@for@scan%
+ \fi%
+ \fi%
+ \fi%
+ \tikz@math@next%
+}%
+
+\newdimen\tikz@math@dimen
+
+\def\tikz@math@for@scan@dots#1,{%
+ \pgfmathparse{#1}\let\tikz@math@value=\pgfmathresult%
+ \tikz@math@for@nameedef{endvalue}{\tikz@math@value}%
+ \tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
+ \tikz@math@for@namegetvalue{prevprevvalue}{\tikz@math@prevprevvalue}%
+ \tikz@math@dimen=\tikz@math@prevvalue pt\relax%
+ \ifx\tikz@math@prevprevvalue\pgfutil@empty%
+ \ifdim\tikz@math@prevvalue pt<\tikz@math@value pt\relax%%
+ \def\tikz@math@step{1pt}%
+ \else%
+ \def\tikz@math@step{-1pt}%
+ \fi%
+ \else%
+ \tikz@math@dimen=\tikz@math@prevvalue pt\relax%
+ \advance\tikz@math@dimen by-\tikz@math@prevprevvalue pt\relax%
+ \edef\tikz@math@step{\the\tikz@math@dimen}%
+ \fi%
+ \ifdim\tikz@math@step<0pt\relax%
+ \tikz@math@for@namedef{comparitor}{<}%
+ \else%
+ \tikz@math@for@namedef{comparitor}{>}%
+ \fi%
+ \tikz@math@for@nameedef{step}{\tikz@math@step}%
+ \tikz@math@for@doloop%
+}%
+
+\def\tikz@math@for@doloop{%
+ \tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
+ \tikz@math@for@namegetvalue{step}{\tikz@math@step}%
+ \tikz@math@for@namegetvalue{comparitor}{\tikz@math@comparitor}%
+ \tikz@math@for@namegetvalue{endvalue}{\tikz@math@endvalue}%
+ \tikz@math@dimen=\tikz@math@prevvalue pt\relax%
+ \advance\tikz@math@dimen by\tikz@math@step\relax%
+ \ifdim\tikz@math@dimen\tikz@math@comparitor\tikz@math@endvalue pt\relax%
+ \let\tikz@math@next=\tikz@math@for@endloop%
+ \else%
+ \tikz@math@for@nameedef{value}{\pgfmath@tonumber{\tikz@math@dimen}}%
+ \tikz@math@for@namegetvalue{var}{\tikz@math@var}%
+ \expandafter\tikz@math@getvarstring\expandafter{\tikz@math@var}\tikz@math@varstring%
+ \tikz@math@for@namegetvalue{index}{\tikz@math@current@index}%
+ \tikz@math@for@namegetvalue{action}{\tikz@math@action}%
+ \tikz@math@for@namegetvalue{value}{\tikz@math@value}%
+ \expandafter\expandafter\expandafter\tikz@math@doassignment\expandafter\expandafter\expandafter%
+ {\expandafter\tikz@math@var\expandafter}\expandafter{\tikz@math@value}%
+ \tikz@math@for@namegetvalue{execute}{\tikz@math@execute}%
+ \expandafter\tikz@math@execute\expandafter{\tikz@math@action}%
+ \tikz@math@for@namegetvalue{prevvalue}{\tikz@math@prevvalue}%
+ \tikz@math@for@namelet{prevprevvalue}=\tikz@math@prevvalue%
+ \tikz@math@for@namegetvalue{value}{\tikz@math@value}%
+ \tikz@math@for@namelet{prevvalue}=\tikz@math@value%
+ \let\tikz@math@next=\tikz@math@for@doloop%
+ \fi%
+ \tikz@math@next%
+}%
+
+\def\tikz@math@for@endloop{%
+\tikz@math@for@scan}%
+
+
+
+
+\def\tikz@math@for@scan@end#1\tikz@@math{%
+\tikz@math@for@namegetvalue{finished}{\tikz@math@next}%
+\advance\tikz@math@for@depth by-1\relax%
+\tikz@math@next}%
+
+
+
+
+
+\def\tikz@math@process@keyword@return{%
+ \tikz@math@collecttosemicolon{\pgfmathparse{\tikz@math@collected}\tikz@math@parse}}%
+
+\def\tikz@math@process@keyword@function{\tikz@math@collecttosemicolon{\tikz@math@process@keyword@@function}}%
+\def\tikz@math@process@keyword@@function{%
+ \let\tikz@math@function@name=\pgfutil@empty%
+ \let\tikz@math@function@arguments=\pgfutil@empty%
+ \let\tikz@math@function@body=\pgfutil@empty%
+ \expandafter\expandafter\expandafter\tikz@math@@declarefunction\expandafter\tikz@math@collected\tikz@math@semicolon%
+}%
+
+\def\tikz@math@@declarefunction{%
+ \pgfutil@ifnextchar\bgroup\tikz@math@@@collectbody\tikz@math@@@declarefunction}%
+
+
+\def\tikz@math@@@declarefunction#1{%
+ \if#1(%)
+ \let\tikz@math@next=\tikz@math@@@collectarguments%
+ \else%
+ \expandafter\def\expandafter\tikz@math@function@name\expandafter{\tikz@math@function@name#1}%
+ \let\tikz@math@next=\tikz@math@@declarefunction%
+ \fi%
+ \tikz@math@next%
+}%
+\def\tikz@math@@@collectarguments#1){%
+ \def\tikz@math@function@arguments{#1}%
+ \tikz@math@@declarefunction%
+}%
+
+\newtoks\tikz@math@toks
+\tikz@math@toks={#}%
+\edef\tikz@math@char@hash{\the\tikz@math@toks}%
+\tikz@math@toks={}%
+
+\def\tikz@math@@@collectbody{\tikz@math@collecttosemicolon{\tikz@math@@@@collectbody}}%
+
+\def\tikz@math@@@@collectbody{%
+ \tikz@math@toks={}%
+ \c@pgf@counta=0\relax%
+ \ifx\tikz@math@function@arguments\pgfutil@empty%
+ \else%
+ \expandafter\tikz@math@createargumentlist\tikz@math@function@arguments,,%
+ \expandafter\tikz@math@addto@toks\expandafter{\tikz@math@collected}%
+ \fi%
+ \edef\tikz@math@local@temp{%
+ \noexpand\pgfmathdeclarefunction{\tikz@math@function@name}{\the\c@pgf@counta}%
+ {\noexpand\def\noexpand\return{0}\noexpand\tikz@math{\the\tikz@math@toks}}%
+ }%
+ \tikz@math@local@temp
+ \tikz@math@parse%
+}%
+
+\def\tikz@math@addto@toks#1{%
+ \expandafter\tikz@math@toks\expandafter{\the\tikz@math@toks#1}}%
+
+\def\tikz@math@createargumentlist{%
+ \pgfutil@ifnextchar
+ x\tikz@math@@createargumentlist\tikz@math@@createargumentlist}%
+
+\def\tikz@math@comma{,}%
+\def\tikz@math@@createargumentlist#1,{%
+ \def\tikz@math@tmp{#1}%
+ \ifx\tikz@math@tmp\pgfutil@empty%
+ \let\tikz@math@next=\relax%
+ \else%
+ \advance\c@pgf@counta by1\relax%
+ \tikz@math@addto@toks{#1=}%
+ \expandafter\expandafter\expandafter\tikz@math@addto@toks\expandafter\expandafter\expandafter%
+ {\expandafter\tikz@math@char@hash\the\c@pgf@counta;}%
+ \let\tikz@math@next=\tikz@math@createargumentlist%
+ \fi%
+ \tikz@math@next%
+}%
+
+
+
+\let\tikzmath=\tikz@math
+\tikzset{evaluate/.code={\tikz@math{#1}}}%
+\let\tikzmathfor=\tikz@math@for@external
+
+
+\catcode`\@=\tikz@math@at@catcode\relax
diff --git a/graphics/pgf/base/tex/tikzlibrarymatrix.code.tex b/graphics/pgf/base/tex/tikzlibrarymatrix.code.tex
new file mode 100644
index 0000000000..90894ff206
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarymatrix.code.tex
@@ -0,0 +1,144 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarymatrix.code.tex}
+
+
+% A matrix of nodes contains a node in each cell.
+
+\tikzset{matrix of nodes/.style={%
+ matrix,%
+ cells={anchor=base},%
+ execute at begin cell=\tikz@lib@matrix@start@cell,%
+ execute at end cell=\tikz@lib@matrix@end@cell,%
+ execute at empty cell=\tikz@lib@matrix@empty@cell,
+ execute at begin matrix=\iftikz@handle@active@code\tikz@orig@shorthands\fi,%
+}}%
+
+\def\tikz@lib@matrix@empty@cell{\iftikz@lib@matrix@empty\node[name=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn]{};\fi}%
+
+\newif\iftikz@lib@matrix@plain
+
+\def\tikz@lib@matrix@start@cell{%
+ \pgfutil@ifnextchar|{\tikz@lib@matrix@with@options}{\tikz@lib@matrix@normal@start@cell}}%
+
+\def\tikz@lib@matrix@with@options|#1|{\tikz@lib@matrix@plainfalse\node%
+ [name=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn]#1\bgroup\tikz@lib@matrix@startup}%
+
+
+\def\tikz@lib@matrix@normal@start@cell{\pgfutil@ifnextchar\let{\tikz@lib@matrix@check}{\tikz@lib@matrix@plainfalse\node
+ [name=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn]\bgroup\tikz@lib@matrix@startup}}%
+
+\def\tikz@lib@matrix@check#1{% evil hackery to find out about start of path
+ \pgfutil@ifnextchar\tikz@signal@path{\tikz@lib@matrix@plaintrue\let}{\tikz@lib@matrix@plainfalse\node
+ [name=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn]\bgroup\tikz@lib@matrix@startup\let}%
+}%
+
+\def\tikz@lib@matrix@end@cell{%
+ \iftikz@lib@matrix@plain%
+ \else%
+ \expandafter\egroup\expandafter;%
+ \fi%
+}%
+
+\def\tikz@lib@matrix@startup{%
+ \pgfutil@ifnextchar\bgroup{%
+ % Save meaning of \\:
+ \let\tikz@lib@matrix@saved@eol=\\%
+ % Now smuggle meaning inside following group.
+ \let\\=\pgfmatrixendrow%
+ \afterassignment\tikz@lib@matrix@smuggle%
+ \let\tikz@next}
+ {\let\\=\pgfmatrixendrow}%
+}%
+\def\tikz@lib@matrix@smuggle{%
+ \bgroup%
+ \let\\=\tikz@lib@matrix@saved@eol%
+}%
+
+
+% Fill empty nodes in a matrix of nodes
+
+\newif\iftikz@lib@matrix@empty
+
+\tikzoption{nodes in empty cells}[true]{\csname tikz@lib@matrix@empty#1\endcsname}%
+
+
+% Same as a matrix of nodes, but switch on math mode in each cell
+\tikzset{matrix of math nodes/.style={%
+ matrix of nodes,
+ nodes={%
+ execute at begin node=$,%
+ execute at end node=$%
+ }%
+}}%
+
+
+
+% Provide a delimiter
+
+\tikzoption{left delimiter}{\tikzset{append after command={\tikz@delimiter%
+ {south east}%
+ {south west}%
+ {every delimiter,every left delimiter}%
+ {south}%
+ {north}%
+ {#1}%
+ {.}%
+ {\pgf@y}}}}%
+
+\tikzoption{right delimiter}{\tikzset{append after command={\tikz@delimiter%
+ {south west}%
+ {south east}%
+ {every delimiter,every right delimiter}%
+ {south}%
+ {north}%
+ {.}%
+ {#1}%
+ {\pgf@y}}}}%
+
+\tikzoption{above delimiter}{\tikzset{append after command={\tikz@delimiter%
+ {south east}%
+ {north west}%
+ {every delimiter,every above delimiter,rotate=-90}%
+ {west}%
+ {east}%
+ {#1}%
+ {.}%
+ {\pgf@x}}}}%
+
+\tikzoption{below delimiter}{\tikzset{append after command={\tikz@delimiter%
+ {south west}%
+ {south west}%
+ {every delimiter,every below delimiter,rotate=-90}%
+ {west}%
+ {east}%
+ {.}%
+ {#1}%
+ {\pgf@x}}}}%
+
+\def\tikz@delimiter#1#2#3#4#5#6#7#8{%
+ \bgroup
+ \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}%
+ node[outer sep=0pt,inner sep=0pt,draw=none,fill=none,anchor=#1,at=(\tikz@last@fig@name.#2),#3]
+ {%
+ {\nullfont\pgf@process{\pgfpointdiff{\pgfpointanchor{\tikz@last@fig@name}{#4}}{\pgfpointanchor{\tikz@last@fig@name}{#5}}}}%
+ $\left#6\vcenter{\hrule height .5#8 depth .5#8 width0pt}\right#7$%
+ }
+ \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}%
+ \egroup%
+}%
+
+\tikzset{every delimiter/.style={}}%
+\tikzset{every left delimiter/.style={}}%
+\tikzset{every right delimiter/.style={}}%
+\tikzset{every above delimiter/.style={}}%
+\tikzset{every below delimiter/.style={}}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarymindmap.code.tex b/graphics/pgf/base/tex/tikzlibrarymindmap.code.tex
new file mode 100644
index 0000000000..4dc97d1aac
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarymindmap.code.tex
@@ -0,0 +1,417 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarymindmap.code.tex}
+
+
+\usetikzlibrary{trees,decorations}%
+
+
+% A decoration for connecting circle nodes
+%
+% Parameters: start radius, end radius, amplitude, angle
+
+\pgfdeclaredecoration{circle connection bar}{initial}
+{%
+ \state{initial}[width=0pt,next state=bar]
+ {
+ {
+ \pgftransformxshift{-\pgfkeysvalueof{/pgf/decoration/start radius}}%
+ \pgfpathmoveto{\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}}
+ \pgfpatharc{\pgfdecorationsegmentangle}{-\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}
+ \pgfutil@tempcnta=-\pgfdecorationsegmentangle\relax
+ \advance\pgfutil@tempcnta by90\relax
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/decoration/start radius}}
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfdecorationsegmentamplitude}
+ \pgfpathcurveto
+ {\pgfpointadd
+ {\pgfpointpolar{-\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}}
+ {\pgfpointpolar{\the\pgfutil@tempcnta}{.25\pgfutil@tempdima}}}
+ {\pgfqpoint{1.25\pgfutil@tempdima}{-.5\pgfutil@tempdimb}}
+ {\pgfqpoint{1.5\pgfutil@tempdima}{-.5\pgfutil@tempdimb}}
+ \pgfpathlineto{\pgfpoint{1.5\pgfutil@tempdima}{.5\pgfutil@tempdimb}}
+ \pgfutil@tempcnta=\pgfdecorationsegmentangle\relax
+ \advance\pgfutil@tempcnta by-90\relax
+ \pgfpathcurveto
+ {\pgfpoint{1.25\pgfutil@tempdima}{.5\pgfutil@tempdimb}}
+ {\pgfpointadd
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}}
+ {\pgfpointpolar{\the\pgfutil@tempcnta}{.25\pgfutil@tempdima}}}
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/start radius}}}
+ \pgfpathclose
+ }
+ }%
+ \state{bar}[width=0pt,next state=end]
+ {
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/decoration/start radius}}%
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/decoration/end radius}}%
+ \pgfmathsetlength\pgf@xc{\pgfdecorationsegmentamplitude}%
+ \pgfpathrectangle
+ {\pgfqpoint{.5\pgfutil@tempdima}{-.5\pgf@xc}}
+ {\pgfpoint{\pgfdecoratedremainingdistance+-.5\pgfutil@tempdimb+-.5\pgfutil@tempdima}{\pgf@xc}}
+ }%
+ \state{end}[width=0pt,next state=final]
+ {
+ {
+ \pgftransformxshift{\pgfdecoratedremainingdistance}%
+ \pgftransformxscale{-1}%
+ \pgftransformxshift{-\pgfkeysvalueof{/pgf/decoration/end radius}}%
+ \pgfpathmoveto{\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/end radius}}}
+ \pgfpatharc{\pgfdecorationsegmentangle}{-\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/end radius}}
+ \pgfutil@tempcnta=-\pgfdecorationsegmentangle\relax
+ \advance\pgfutil@tempcnta by90\relax
+ \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/decoration/end radius}}
+ \pgfmathsetlength\pgfutil@tempdimb{\pgfdecorationsegmentamplitude}%
+ \pgfpathcurveto
+ {\pgfpointadd
+ {\pgfpointpolar{-\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/end radius}}}
+ {\pgfpointpolar{\the\pgfutil@tempcnta}{.25\pgfutil@tempdima}}}
+ {\pgfqpoint{1.25\pgfutil@tempdima}{-.5\pgfutil@tempdimb}}
+ {\pgfqpoint{1.5\pgfutil@tempdima}{-.5\pgfutil@tempdimb}}
+ \pgfpathlineto{\pgfpoint{1.5\pgfutil@tempdima}{.5\pgfutil@tempdimb}}
+ \pgfutil@tempcnta=\pgfdecorationsegmentangle\relax
+ \advance\pgfutil@tempcnta by-90\relax
+ \pgfpathcurveto
+ {\pgfpoint{1.25\pgfutil@tempdima}{.5\pgfutil@tempdimb}}
+ {\pgfpointadd
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/end radius}}}
+ {\pgfpointpolar{\the\pgfutil@tempcnta}{.25\pgfutil@tempdima}}}
+ {\pgfpointpolar{\pgfdecorationsegmentangle}{\pgfkeysvalueof{/pgf/decoration/end radius}}}
+ \pgfpathclose
+ }
+ }%
+ \state{final}
+ {}%
+}%
+
+
+
+\pgfkeys{/pgf/decoration/angle=20}%
+
+% To paths for connecting circle nodes
+
+\tikzset{circle connection bar/.style=
+{to path={
+ \pgfextra{%
+ \tikz@lib@mindmap@check{\tikztostart}%
+ \tikz@compute@circle@radii\tikz@compute@segmentamplitude%
+ }
+ [every circle connection bar]
+ decorate [decoration=circle connection bar]
+ { -- (\tikztotarget) \tikztonodes}
+},
+append after command={[fill=\tikz@concept@color,draw=none]}
+}}%
+\tikzset{every circle connection bar/.style={}}%
+
+\def\tikz@compute@circle@radii{%
+ \pgf@process{\pgfpointtransformed{\pgfpointanchor{\tikztostart}{center}}}%
+ \pgf@xa=\pgf@x%
+ \pgf@process{\pgfpointtransformed{\pgfpointanchor{\tikztostart}{west}}}%
+ \advance\pgf@xa by-\pgf@x%
+ \pgfkeys{/pgf/decoration/start radius/.expanded=\the\pgf@xa}%
+ \pgf@process{\pgfpointtransformed{\pgfpointanchor{\tikztotarget}{center}}}%
+ \pgf@xa=\pgf@x%
+ \pgf@process{\pgfpointtransformed{\pgfpointanchor{\tikztotarget}{west}}}%
+ \advance\pgf@xa by-\pgf@x%
+ \pgfkeys{/pgf/decoration/end radius/.expanded=\the\pgf@xa}%
+}%
+\def\tikz@compute@segmentamplitude{%
+ \pgf@x=\pgfkeysvalueof{/pgf/decoration/start radius}\relax%
+ \ifdim\pgf@x>\pgfkeysvalueof{/pgf/decoration/end radius}\relax%
+ \pgf@x=\pgfkeysvalueof{/pgf/decoration/end radius}\relax%
+ \fi%
+ \pgf@x=.175\pgf@x\relax%
+ \edef\pgfdecorationsegmentamplitude{\the\pgf@x}%
+}%
+
+
+
+% Check whether start and end are nodes!
+
+\def\tikz@lib@mindmap@check#1{%
+ \pgfutil@ifundefined{pgf@sh@ns@#1}%
+ {\tikzerror{You are attempting to connect two things by a circle
+ connection bar where one is not a node}}{%
+ \expandafter\ifx\csname pgf@sh@ns@#1\endcsname\tikz@lib@coordinate@text%
+ \tikzerror{You are attempting to connect node of shape
+ 'coordinate' by a circle connection bar. The shape should be
+ 'circle' or something similar, instead.}
+ \fi%
+ }
+}%
+
+\def\tikz@lib@coordinate@text{coordinate}%
+
+
+% Switch color in a mindmap
+
+\tikzoption{circle connection bar switch color}{\tikz@parse@switch#1\pgf@unique}%
+\def\tikz@parse@switch from (#1) to (#2)\pgf@unique{%
+ \tikzset{to path={%
+ \pgfextra{%
+ \tikz@lib@mindmap@check{\tikztostart}%
+ \tikz@compute@circle@radii\tikz@compute@segmentamplitude%
+ \global\let\tikz@lib@save@start=\tikztostart%
+ \global\let\tikz@lib@save@target=\tikztotarget%
+ \pgfkeysgetvalue{/pgf/decoration/start radius}\pgf@temp%
+ \global\let\tikz@lib@saved@start@radius=\pgf@temp%
+ \pgfkeysgetvalue{/pgf/decoration/end radius}\pgf@temp%
+ \global\let\tikz@lib@saved@end@radius=\pgf@temp%
+ }%
+ [every circle connection bar]
+ decorate [decoration=circle connection bar]
+ { -- (\tikztotarget) \tikztonodes}
+ },
+ append after command={
+ [fill=none,draw=none,path picture=\tikz@lib@shade@pic]
+ \pgfextra{
+ \pgfutil@colorlet{tikz@switch@from}{#1}%
+ \pgfutil@colorlet{tikz@switch@to}{#2}%
+ }}
+ }
+}%
+
+\def\tikz@lib@shade@pic{%
+ % We have to draw the shading...
+ % compute start point:
+ \pgftransformreset%
+ \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgfpointanchor{\tikz@lib@save@start}{center}}{\pgfpointanchor{\tikz@lib@save@target}{center}}}}%
+ \edef\tikz@lib@mm@vec{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfmathsetlength\pgf@xc{\tikz@lib@saved@start@radius}
+ \pgf@process{\pgfpointadd{\pgfpointtransformed{\pgfpointanchor{\tikz@lib@save@start}{center}}}
+ {\pgfpointscale{\pgf@sys@tonumber{\pgf@xc}}{\tikz@lib@mm@vec}}}
+ \edef\tikz@lib@mm@start{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgfmathsetlength\pgf@xc{\tikz@lib@saved@end@radius}
+ \pgf@process{\pgfpointdiff{\tikz@lib@mm@start}{\pgfpointadd{\pgfpointtransformed{\pgfpointanchor{\tikz@lib@save@target}{center}}}
+ {\pgfpointscale{-\pgf@sys@tonumber{\pgf@xc}}{\tikz@lib@mm@vec}}}}
+ \edef\tikz@lib@mm@end{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \pgftransformshift{\tikz@lib@mm@start}
+ \pgflowlevelsynccm
+ \pgf@process{\tikz@lib@mm@vec}
+ {
+ \pgf@xa=-\pgf@x%
+ \pgftransformcm{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
+ {\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@xa}}%
+ {\pgfpointorigin}%
+ \pgf@process{\pgfpointtransformed{\tikz@lib@mm@end}}%
+ \expandafter
+ }
+ \edef\tikz@lib@mm@length{\the\pgf@x}%
+ \pgf@process{\tikz@lib@mm@vec}
+ \pgf@ya=-\pgf@y%
+ \pgftransformcm{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
+ {\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}%
+ {\pgfpointorigin}%
+ % Y scale:
+ \pgfmathsetlength\pgf@y{\tikz@lib@saved@start@radius}%
+ \pgfmathsetlength\pgf@ya{\tikz@lib@saved@end@radius}%
+ \ifdim\pgf@y<\pgf@ya%
+ \pgf@y=\pgf@ya%
+ \fi%
+ \pgf@y=0.01992528\pgf@y%
+ \pgftransformyscale{\pgf@sys@tonumber{\pgf@y}}%
+ \pgfpathrectanglecorners
+ {\pgfpoint{-\tikz@lib@saved@start@radius}{-50bp}}
+ {\pgfpoint{1pt}{50bp}}
+ \pgfsetfillcolor{tikz@switch@from}
+ \pgfusepath{fill}
+ \pgfpathrectanglecorners
+ {\pgfpoint{\tikz@lib@mm@length+\tikz@lib@saved@end@radius}{-50bp}}
+ {\pgfpoint{\tikz@lib@mm@length-1pt}{50bp}}
+ \pgfsetfillcolor{tikz@switch@to}
+ \pgfusepath{fill}
+ % X scale:
+ \pgf@x=\tikz@lib@mm@length%
+ \pgf@x=0.009962\pgf@x%
+ \pgftransformxscale{\pgf@sys@tonumber{\pgf@x}}%
+ \pgftransformxshift{50bp}
+ \pgflowlevelsynccm%
+ \pgfuseshading{tikz@shade@bar}
+}%
+
+\tikzoption{concept color}{%
+ \let\tikz@old@concept@color=\tikz@concept@color%
+ \def\tikz@edge@to@parent@path{
+ (\tikzparentnode)
+ to[circle connection bar switch color=from (\tikz@old@concept@color) to (#1)]
+ (\tikzchildnode)}
+ \def\tikz@concept@color{#1}%
+}%
+
+\pgfdeclarehorizontalshading[tikz@switch@from,tikz@switch@to]{tikz@shade@bar}{100bp}{%
+ color(0pt)=(tikz@switch@from);
+ color(100bp)=(tikz@switch@to)}%
+
+
+
+
+% A concept node
+
+\tikzset{concept/.style= {circle,fill=\tikz@concept@color,draw=\tikz@concept@color,every concept}}%
+\tikzset{every concept/.style= {}}%
+
+\def\tikz@concept@color{black}%
+
+\tikzset{tikz@concept@setting/.style={edge from parent path={(\tikzparentnode) to [circle connection bar] (\tikzchildnode)}}}%
+\tikzset{tikz@concept@color@set/.style={}}%
+
+
+\tikzset{extra concept/.style= {concept color=black!50,level 2 concept,concept,every extra concept}}%
+\tikzset{every extra concept/.style={}}%
+
+\tikzset{concept connection/.style={line width=1mm,shorten <=2mm,shorten >=2mm,cap=round,draw=black!50}}%
+
+
+% A mindmap
+
+\tikzset{mindmap/.style=
+ {fill,draw,very thick,outer sep=0pt,inner sep=1pt,%
+ every child/.append style={style=tikz@concept@setting,style=tikz@concept@color@set},%
+ root concept,
+ level 1/.append style={level 1 concept},
+ level 2/.append style={level 2 concept},
+ level 3/.append style={level 3 concept},
+ level 4/.append style={level 4 concept},
+ text centered,%
+ segment angle=20,
+ style=every mindmap,
+ }}%
+\tikzset{every mindmap/.style={}}%
+
+
+\tikzset{root concept/.style= {minimum size=4cm,text width=3.5cm,font=\pgfutil@font@large}}%
+\tikzset{level 1 concept/.style={minimum size=2.25cm,
+ level distance=5cm,
+ text width=2cm,
+ sibling angle=60,
+ font=\pgfutil@font@small}}%
+\tikzset{level 2 concept/.style={minimum size=1.75cm,%
+ level distance=2.9cm,%
+ text width=1.5cm,%
+ sibling angle=60,%
+ font=\pgfutil@font@footnotesize}}%
+\tikzset{level 3 concept/.style={minimum size=1.15cm,%
+ text width=1cm,%
+ level distance=2.4cm,%
+ sibling angle=30,%
+ font=\pgfutil@font@tiny}}%
+\tikzset{level 4 concept/.style={minimum size=0.9cm,%
+ text width=0.7cm,
+ level distance=1.85cm,%
+ sibling angle=30,%
+ font=\pgfutil@font@tiny}}%
+
+\tikzset{small mindmap/.style=
+ {%
+ root concept/.style={minimum size=2.3cm,text width=2.1cm,font=\pgfutil@font@footnotesize},
+ level 1 concept/.style={%
+ minimum size=1.5cm,
+ level distance=2.8cm,
+ text width=1.4cm,
+ sibling angle=75,
+ font=\pgfutil@font@scriptsize},%
+ level 2 concept/.style={%
+ minimum size=1.1cm,%
+ level distance=2.2cm,%
+ text width=1.1cm,%
+ sibling angle=60,%
+ font=\pgfutil@font@tiny},%
+ level 3 concept/.style={%
+ level 2 concept,
+ sibling angle=30,%
+ font=\pgfutil@font@tiny},%
+ level 4 concept/.style={%
+ level 3 concept,
+ },
+ mindmap,%
+ line width=2pt,
+ }}%
+
+\tikzset{large mindmap/.style=
+ {%
+ root concept/.style={minimum size=5.6cm,text width=4.5cm,font=\pgfutil@font@Large},
+ level 1 concept/.style={%
+ minimum size=3.2cm,
+ level distance=7cm,
+ text width=2.8cm,
+ sibling angle=60,
+ font=},%
+ level 2 concept/.style={%
+ minimum size=2.45cm,%
+ level distance=4cm,%
+ text width=2.2cm,%
+ sibling angle=60,%
+ font=\pgfutil@font@small%
+ },%
+ level 3 concept/.style={%
+ minimum size=1.63cm,%
+ text width=1.4cm,%
+ level distance=3.38cm,%
+ sibling angle=30,%
+ font=\pgfutil@font@scriptsize},%
+ level 4 concept/.style={%
+ minimum size=1.27cm,%
+ text width=1cm,
+ level distance=2.60cm,%
+ sibling angle=30,%
+ font=\pgfutil@font@tiny},%
+ mindmap,%
+ line width=2pt,
+ }}%
+
+\tikzset{huge mindmap/.style=
+ {%
+ root concept/.style={minimum size=8cm,text width=7cm,font=\pgfutil@font@huge},
+ level 1 concept/.style={%
+ minimum size=4.5cm,
+ level distance=10cm,
+ text width=4cm,
+ sibling angle=60,
+ font=\pgfutil@font@large},%
+ level 2 concept/.style={%
+ minimum size=3.5cm,%
+ level distance=5.8cm,%
+ text width=3cm,%
+ sibling angle=60,%
+ font=%
+ },%
+ level 3 concept/.style={%
+ minimum size=2.3cm,%
+ text width=2cm,%
+ level distance=4.8cm,%
+ sibling angle=30,%
+ font=\pgfutil@font@footnotesize},%
+ level 4 concept/.style={%
+ minimum size=1.7cm,%
+ text width=1.4cm,
+ level distance=3.7cm,%
+ sibling angle=30,%
+ font=\pgfutil@font@scriptsize},%
+ mindmap,%
+ line width=3pt,
+ }}%
+
+
+% Annotations
+
+\tikzset{annotation/.style={shape=rectangle,
+ minimum size=0pt,
+ text width=3.5cm,
+ outer sep=1.5mm,
+ inner sep=1mm,
+ text badly ragged,
+ rounded corners,
+ font=\pgfutil@font@tiny,
+ every annotation}}%
+\tikzset{every annotation/.style={}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarypatterns.code.tex b/graphics/pgf/base/tex/tikzlibrarypatterns.code.tex
new file mode 100644
index 0000000000..22ce51d8cb
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarypatterns.code.tex
@@ -0,0 +1,31 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarypatterns.code.tex}
+
+\usepgflibrary{patterns}%
+
+\tikzoption{pattern color}{\edef\tikz@pattern@color{#1}}%
+\tikzoption{pattern}[]{%
+ \edef\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@fillfalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \tikz@addoption{\pgfsetfillpattern{#1}{\tikz@pattern@color}}%
+ \def\tikz@pattern{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@filltrue}%
+ \fi%
+}%
+\def\tikz@pattern@color{black}%
+\def\tikz@pattern{dots}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarypatterns.meta.code.tex b/graphics/pgf/base/tex/tikzlibrarypatterns.meta.code.tex
new file mode 100644
index 0000000000..4327768186
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarypatterns.meta.code.tex
@@ -0,0 +1,98 @@
+% Copyright 2015 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.
+
+\usepgflibrary{patterns.meta}%
+
+\tikzset{%
+ pattern color/.code=\edef\tikz@pattern@color{#1},
+ pattern/.code={%
+ \edef\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@nonetext%
+ \tikz@addmode{\tikz@mode@fillfalse}%
+ \else%
+ \ifx\tikz@temp\pgfutil@empty%
+ \else%
+ \tikz@addoption{\pgfsetfillpattern{#1}{\tikz@pattern@color}}%
+ \def\tikz@pattern{#1}%
+ \fi%
+ \tikz@addmode{\tikz@mode@filltrue}%
+ \fi%
+ }
+}%
+
+\def\tikz@pattern@color{black}%
+\def\tikz@pattern{}%
+
+\tikzset{patterns/.cd,
+ .unknown/.code={%
+ \let\tikz@pat@key=\pgfkeyscurrentname%
+ \pgfkeys{/pgf/patterns/\tikz@pat@key/.try={#1}}%
+ },
+ bottom left/.style={/pgf/patterns/bottom left={\tikz@scan@one@point\pgf@pat@process#1}},
+ top right/.style={/pgf/patterns/top right={\tikz@scan@one@point\pgf@pat@process#1}},
+ bounding box/.style args={#1(#2)#3and#4(#5)#6}{%
+ /tikz/patterns/bottom left={(#2)},
+ /tikz/patterns/top right={#4(#5)},
+ },
+ tile size/.style={/pgf/patterns/tile size={\tikz@scan@one@point\pgf@pat@process#1}},
+ tile transformation/.style={/pgf/patterns/tile transformation={%
+ \let\tikz@transform=\relax\pgfkeys{/tikz/.cd,#1}}%
+ },
+ infer tile bounding box/.code={
+ \def\pgf@pat@codeafter{%
+ \xdef\tikz@pat@installbb{%
+ \noexpand\pgfkeys{/tikz/patterns/bounding box={%
+ (\the\pgf@picminx-#1,\the\pgf@picminy-#1) and
+ (\the\pgf@picmaxx+#1,\the\pgf@picmaxy+#1)
+ },
+ /tikz/patterns/tile size={%
+ (\the\pgf@picmaxx-\the\pgf@picminx,
+ \the\pgf@picmaxy-\the\pgf@picminy)}}}%
+ }%
+ \let\pgf@pat@declarepost=\tikz@pat@installbb%
+ },
+ infer tile bounding box/.default=0pt,
+}%
+
+\def\tikzdeclarepattern#1{%
+ \begingroup%
+ \def\pgf@pat@codebefore{%
+ \let\tikz@transform=\relax%
+ \pgftransformreset% <- Hmm?
+ \tikz@declarepattern@install%
+ \ifnum\pgf@pat@type=0\relax%
+ \let\pgfsetstrokecolor=\pgfutil@gobble%
+ \let\pgfsetfillcolor=\pgfutil@gobble%
+ \fi%
+ \def\tikz@fig{%
+ \tikzerror{You cannot use nodes inside a pattern}%
+ }%
+ \tikzset{pattern/.code={\tikzerror{You cannot nest patterns}},
+ pattern color/.style={pattern}}%
+ }%
+ \pgfdeclarepattern{/tikz/patterns/.cd,#1}%
+ \endgroup%
+ }%
+
+\def\tikz@declarepattern@install{%
+ \let\tikz@compat@color@set=\tikz@compat@color@set@insidepatttern%
+ \tikz@installcommands%
+}%
+
+\let\tikz@compat@color@set@orig=\tikz@compat@color@set
+\def\tikz@compat@color@set@insidepatttern#1{%
+ \tikz@compat@color@set@orig{#1}%
+ \pgfsetfillcolor{#1}\pgfsetstrokecolor{#1}%
+}%
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/graphics/pgf/base/tex/tikzlibraryperspective.code.tex b/graphics/pgf/base/tex/tikzlibraryperspective.code.tex
new file mode 100644
index 0000000000..61a8016057
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryperspective.code.tex
@@ -0,0 +1,111 @@
+% Copyright 2019 by Max Snippe
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryperspective.code.tex}
+
+% Initialize affine transformation matrix for perspective view
+% [aa ab ac 0]
+% [ba bb bc 0]
+% [ca cb cc 0]
+% [da db dc 1]
+\pgfmathsetmacro\pgf@H@tpp@aa{+1}
+ \pgfmathsetmacro\pgf@H@tpp@ab{+0}
+ \pgfmathsetmacro\pgf@H@tpp@ac{+0}
+\pgfmathsetmacro\pgf@H@tpp@ba{+0}
+ \pgfmathsetmacro\pgf@H@tpp@bb{+1}
+ \pgfmathsetmacro\pgf@H@tpp@bc{+0}
+\pgfmathsetmacro\pgf@H@tpp@ca{+0}
+ \pgfmathsetmacro\pgf@H@tpp@cb{+0}
+ \pgfmathsetmacro\pgf@H@tpp@cc{+1}
+\pgfmathsetmacro\pgf@H@tpp@da{+0}
+ \pgfmathsetmacro\pgf@H@tpp@db{+0}
+ \pgfmathsetmacro\pgf@H@tpp@dc{+0}
+
+\def\pgfpointperspectivexyz#1#2#3{%
+ \pgfmathsetmacro\pgf@pp@w%
+ { \pgf@H@tpp@da*(#1) + \pgf@H@tpp@db*(#2) + \pgf@H@tpp@dc*(#3) + 1}
+ \pgfmathsetmacro\pgf@pp@x%
+ {(\pgf@H@tpp@aa*(#1) + \pgf@H@tpp@ab*(#2) + \pgf@H@tpp@ac*(#3))/\pgf@pp@w}
+ \pgfmathsetmacro\pgf@pp@y%
+ {(\pgf@H@tpp@ba*(#1) + \pgf@H@tpp@bb*(#2) + \pgf@H@tpp@bc*(#3))/\pgf@pp@w}
+ \pgfmathsetmacro\pgf@pp@z%
+ {(\pgf@H@tpp@ca*(#1) + \pgf@H@tpp@cb*(#2) + \pgf@H@tpp@cc*(#3))/\pgf@pp@w}
+%
+ \pgf@x=\pgf@pp@x\pgf@xx%
+ \advance\pgf@x by \pgf@pp@y\pgf@yx%
+ \advance\pgf@x by \pgf@pp@z\pgf@zx%
+ \pgf@y=\pgf@pp@x\pgf@xy%
+ \advance\pgf@y by \pgf@pp@y\pgf@yy%
+ \advance\pgf@y by \pgf@pp@z\pgf@zy}
+
+\tikzdeclarecoordinatesystem{three point perspective}
+{%
+ \tikzset{cs/.cd,x=0,y=0,z=0,#1}%
+ \pgfpointperspectivexyz{\tikz@cs@x}{\tikz@cs@y}{\tikz@cs@z}
+}
+\tikzaliascoordinatesystem{tpp}{three point perspective}
+
+\pgfkeys{
+ /perspective/.cd,
+ p/.code args={(#1,#2,#3)}{
+ \pgfmathparse{ifthenelse(#1,int(1),int(0))}
+ \ifnum\pgfmathresult=0\else
+ \pgfmathsetmacro\pgf@H@tpp@ba{#2/#1}
+ \pgfmathsetmacro\pgf@H@tpp@ca{#3/#1}
+ \pgfmathsetmacro\pgf@H@tpp@da{ 1/#1}
+ \fi
+ },
+ q/.code args={(#1,#2,#3)}{
+ \pgfmathparse{ifthenelse(#2,int(1),int(0))}
+ \ifnum\pgfmathresult=0\else
+ \pgfmathsetmacro\pgf@H@tpp@ab{#1/#2}
+ \pgfmathsetmacro\pgf@H@tpp@cb{#3/#2}
+ \pgfmathsetmacro\pgf@H@tpp@db{ 1/#2}
+ \fi
+ },
+ r/.code args={(#1,#2,#3)}{
+ \pgfmathparse{ifthenelse(#3,int(1),int(0))}
+ \ifnum\pgfmathresult=0\else
+ \pgfmathsetmacro\pgf@H@tpp@ac{#1/#3}
+ \pgfmathsetmacro\pgf@H@tpp@bc{#2/#3}
+ \pgfmathsetmacro\pgf@H@tpp@dc{ 1/#3}
+ \fi
+ },
+}
+
+\tikzset{
+ perspective/.append code={\pgfkeys{/perspective/.cd,#1}},
+ perspective/.default={
+ p={(10,0,0)},
+ q={(0,10,0)},
+ r={(0,0,20)}},
+}
+
+\tikzset{
+ 3d view/.code 2 args={
+ % Set elevation and azimuth angles
+ \pgfmathsetmacro\pgf@view@az{#1}
+ \pgfmathsetmacro\pgf@view@el{#2}
+ % Calculate projections of rotation matrix
+ \pgfmathsetmacro\pgf@xvec@x{cos(\pgf@view@az)}
+ \pgfmathsetmacro\pgf@xvec@y{-sin(\pgf@view@az)*sin(\pgf@view@el)}
+ \pgfmathsetmacro\pgf@yvec@x{sin(\pgf@view@az)}
+ \pgfmathsetmacro\pgf@yvec@y{cos(\pgf@view@az)*sin(\pgf@view@el)}
+ \pgfmathsetmacro\pgf@zvec@x{+0}
+ \pgfmathsetmacro\pgf@zvec@y{cos(\pgf@view@el)}
+ % Set base vectors
+ \pgfsetxvec{\pgfpoint{\pgf@xvec@x cm}{\pgf@xvec@y cm}}
+ \pgfsetyvec{\pgfpoint{\pgf@yvec@x cm}{\pgf@yvec@y cm}}
+ \pgfsetzvec{\pgfpoint{\pgf@zvec@x cm}{\pgf@zvec@y cm}}
+ },
+ 3d view/.default={-30}{15},
+ isometric view/.style={3d view={-45}{atan(1/sqrt(2))}},
+}
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarypetri.code.tex b/graphics/pgf/base/tex/tikzlibrarypetri.code.tex
new file mode 100644
index 0000000000..7241394d80
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarypetri.code.tex
@@ -0,0 +1,146 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarypetri.code.tex}
+
+
+% Styles for places:
+
+\tikzset{every place/.style= {}}%
+\tikzset{place/.style= {circle,draw,inner sep=0pt,
+ minimum size=5ex,
+ every place}}%
+
+
+% Styles for transition:
+
+\tikzset{every transition/.style= {}}%
+\tikzset{transition/.style= {rectangle,draw,inner sep=0pt,
+ minimum size=4mm,
+ every transition}}%
+
+
+% Styles for relationship types:
+
+\tikzset{pre/.style= {<-,shorten <=1pt}}%
+\tikzset{post/.style= {->,shorten >=1pt}}%
+\tikzset{pre and post/.style= {<->,shorten >=1pt,shorten <=1pt}}%
+
+
+
+% Styles for marks:
+
+\tikzset{every token/.style= {}}%
+\tikzset{token/.style= {fill=black,draw=none,circle,
+ inner sep=0.5pt,minimum size=1ex,
+ text=white,font=\pgfutil@font@tiny,every token}}%
+
+\tikzoption{token distance}{\def\tikz@token@distance{#1}}%
+\def\tikz@token@distance{1.5ex}%
+
+\tikzset{children are tokens/.style= {growth function=\tikz@grow@tokens,edge from parent path=}}%
+
+\tikzoption{tokens}{%
+ \ifnum#1>0\relax%
+ \tikzset{append after command={}
+ {[children are tokens]child foreach \tikz@dummy in {1,...,#1} {node[token]{}}}}%
+ \fi}%
+
+\tikzoption{colored tokens}{%
+ \tikzset{append after command={}%
+ {[children are tokens]child foreach \tikz@child@color in {#1} {node[token,\tikz@child@color]{}}}}%
+ }%
+
+\tikzoption{structured tokens}{%
+ \tikzset{append after command={}%
+ {[children are tokens]child foreach \tikzpetrichildname in {#1} {node[token]{\tikzpetrichildname}}}}%
+ }%
+
+
+\def\tikz@grow@tokens{%
+ \pgfmathsetlength{\pgf@xa}{\tikz@token@distance}%
+ \pgfmathsetlength{\pgf@ya}{\tikz@token@distance}%
+ \pgf@xc=0pt%
+ \pgf@yc=0pt%
+ \csname tikz@grow@tokens@placer@\the\tikznumberofchildren @\the\tikznumberofcurrentchild\endcsname%
+ \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+}%
+
+\def\tikz@def@grow@tokens#1#2#3#4{%
+ \expandafter\def\csname tikz@grow@tokens@placer@#1@#2\endcsname{%
+ \pgf@xc=#3\pgf@xa%
+ \pgf@yc=#4\pgf@ya}%
+}%
+
+
+% Single token
+\tikz@def@grow@tokens{1}{1}{0}{0}%
+
+% Two tokens
+\tikz@def@grow@tokens{2}{1}{-.5}{0}%
+\tikz@def@grow@tokens{2}{2}{.5}{0}%
+
+% Three tokens
+\tikz@def@grow@tokens{3}{1}{0} {0.57}%
+\tikz@def@grow@tokens{3}{2}{-.5}{-.306025}%
+\tikz@def@grow@tokens{3}{3}{.5} {-.306025}%
+
+% Four tokens
+\tikz@def@grow@tokens{4}{1}{-.5}{.5}%
+\tikz@def@grow@tokens{4}{2}{.5}{.5}%
+\tikz@def@grow@tokens{4}{3}{-.5}{-.5}%
+\tikz@def@grow@tokens{4}{4}{.5}{-.5}%
+
+% Five tokens
+\tikz@def@grow@tokens{5}{1}{0}{.85}%
+\tikz@def@grow@tokens{5}{2}{-0.808398}{0.26266}%
+\tikz@def@grow@tokens{5}{3}{0.808398}{0.26266}%
+\tikz@def@grow@tokens{5}{4}{-0.499617}{-0.687664}%
+\tikz@def@grow@tokens{5}{5}{0.499617}{-0.687664}%
+
+% Six tokens
+\tikz@def@grow@tokens{6}{1}{-1}{.5}%
+\tikz@def@grow@tokens{6}{2}{0}{.5}%
+\tikz@def@grow@tokens{6}{3}{1}{.5}%
+\tikz@def@grow@tokens{6}{4}{-1}{-.5}%
+\tikz@def@grow@tokens{6}{5}{0}{-.5}%
+\tikz@def@grow@tokens{6}{6}{1}{-.5}%
+
+% Seven tokens
+\tikz@def@grow@tokens{7}{1}{0}{1}%
+\tikz@def@grow@tokens{7}{2}{-1}{.5}%
+\tikz@def@grow@tokens{7}{3}{0}{0}%
+\tikz@def@grow@tokens{7}{4}{1}{.5}%
+\tikz@def@grow@tokens{7}{5}{-1}{-.5}%
+\tikz@def@grow@tokens{7}{6}{0}{-1}%
+\tikz@def@grow@tokens{7}{7}{1}{-.5}%
+
+% Eight tokens
+\tikz@def@grow@tokens{8}{1}{-.5}{1}%
+\tikz@def@grow@tokens{8}{2}{.5}{1}%
+\tikz@def@grow@tokens{8}{3}{-1}{0}%
+\tikz@def@grow@tokens{8}{4}{0}{0}%
+\tikz@def@grow@tokens{8}{5}{1}{0}%
+\tikz@def@grow@tokens{8}{6}{-1}{-1}%
+\tikz@def@grow@tokens{8}{7}{0}{-1}%
+\tikz@def@grow@tokens{8}{8}{1}{-1}%
+
+% Eight tokens
+\tikz@def@grow@tokens{9}{1}{-1}{1}%
+\tikz@def@grow@tokens{9}{2}{0}{1}%
+\tikz@def@grow@tokens{9}{3}{1}{1}%
+\tikz@def@grow@tokens{9}{4}{-1}{0}%
+\tikz@def@grow@tokens{9}{5}{0}{0}%
+\tikz@def@grow@tokens{9}{6}{1}{0}%
+\tikz@def@grow@tokens{9}{7}{-1}{-1}%
+\tikz@def@grow@tokens{9}{8}{0}{-1}%
+\tikz@def@grow@tokens{9}{9}{1}{-1}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryplothandlers.code.tex b/graphics/pgf/base/tex/tikzlibraryplothandlers.code.tex
new file mode 100644
index 0000000000..6e1b497b65
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryplothandlers.code.tex
@@ -0,0 +1,14 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryplothandlers.code.tex}
+
+\usepgflibrary{plothandlers}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryplotmarks.code.tex b/graphics/pgf/base/tex/tikzlibraryplotmarks.code.tex
new file mode 100644
index 0000000000..3b2caac869
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryplotmarks.code.tex
@@ -0,0 +1,14 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryplotmarks.code.tex}
+
+\usepgflibrary{plotmarks}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarypositioning.code.tex b/graphics/pgf/base/tex/tikzlibrarypositioning.code.tex
new file mode 100644
index 0000000000..830212928d
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarypositioning.code.tex
@@ -0,0 +1,118 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarypositioning.code.tex}
+
+
+\tikzset{above/.code=\tikz@lib@place@handle@{#1}{south}{0}{1}{north}{1}}%
+\tikzset{above left/.code=\tikz@lib@place@handle@{#1}{south east}{-1}{1}{north west}{0.707106781}}%
+\tikzset{above right/.code=\tikz@lib@place@handle@{#1}{south west}{1}{1}{north east}{0.707106781}}%
+\tikzset{base left/.code =\tikz@lib@place@handle@{#1}{base east}{-1}{0}{base west}{1}}%
+\tikzset{base right/.code=\tikz@lib@place@handle@{#1}{base west}{1}{0}{base east}{1}}%
+\tikzset{below/.code=\tikz@lib@place@handle@{#1}{north}{0}{-1}{south}{1}}%
+\tikzset{below left/.code=\tikz@lib@place@handle@{#1}{north east}{-1}{-1}{south west}{0.707106781}}%
+\tikzset{below right/.code=\tikz@lib@place@handle@{#1}{north west}{1}{-1}{south east}{0.707106781}}%
+\tikzset{left/.code =\tikz@lib@place@handle@{#1}{east}{-1}{0}{west}{1}}%
+\tikzset{mid left/.code =\tikz@lib@place@handle@{#1}{mid east}{-1}{0}{mid west}{1}}%
+\tikzset{mid right/.code=\tikz@lib@place@handle@{#1}{mid west}{1}{0}{mid east}{1}}%
+\tikzset{right/.code=\tikz@lib@place@handle@{#1}{west}{1}{0}{east}{1}}%
+
+\newif\iftikz@lib@ignore@size
+
+% Hook into resets:
+\pgfutil@g@addto@macro\tikz@node@reset@hook{\tikz@addtransform{\tikz@lib@pos@call}\let\tikz@lib@pos@call=\relax}%
+
+\tikzset{on grid/.is if=tikz@lib@ignore@size}%
+
+\tikzset{node distance=1cm and 1cm}%
+
+\def\tikz@lib@place@handle@#1#2#3#4#5#6{%
+ \def\tikz@anchor{#2}%
+ \let\tikz@do@auto@anchor=\relax%
+ \edef\tikz@temp{#1}%
+ \def\tikz@lib@place@single@factor{#6}%
+ \expandafter\tikz@lib@place@handle@@\expandafter{\tikz@temp}{#3}{#4}{#5}%
+}%
+\def\tikz@lib@place@handle@@#1#2#3#4{%
+ \pgfutil@in@{of }{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@place@of#1\tikz@stop{#4}%
+ \else%
+ \edef\tikz@lib@place@nums{#1}%
+ \fi%
+ \ifx\tikz@lib@place@nums\pgfutil@empty%
+ % Ok, nothing to do, we have set the anchor and we are happy...
+ \else%
+ \expandafter\tikz@lib@place@parse@nums\expandafter{\tikz@lib@place@nums}%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#3\pgf@y%
+ \edef\tikz@lib@pos@call{\noexpand\pgftransformshift{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
+ \fi%
+}%
+
+\def\tikz@lib@place@parse@nums#1{%
+ \pgfutil@in@{and}{#1}%
+ \ifpgfutil@in@%
+ \tikz@lib@place@parse@nums@#1\tikz@stop%
+ \else%
+ \tikz@lib@place@parse@nums@#1and#1\tikz@stop%
+ \pgf@x=\tikz@lib@place@single@factor\pgf@x%
+ \pgf@y=\tikz@lib@place@single@factor\pgf@y%
+ \fi
+}%
+\def\tikz@lib@place@parse@nums@#1and#2\tikz@stop{%
+ \pgfmathparse{#2}%
+ \ifpgfmathunitsdeclared%
+ \pgf@xa=\pgfmathresult pt%
+ \pgf@ya=0pt%
+ \else%
+ \let\tikz@lib@temp=\pgfmathresult%
+ \pgf@process{\pgfpointxy{\tikz@lib@temp}{0}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \fi%
+ \pgfmathparse{#1}%
+ \ifpgfmathunitsdeclared%
+ \advance\pgf@ya by\pgfmathresult pt%
+ \else%
+ \let\tikz@lib@temp=\pgfmathresult%
+ \pgf@process{\pgfpointxy{0}{\tikz@lib@temp}}%
+ \advance\pgf@xa by\pgf@x%
+ \advance\pgf@ya by\pgf@y%
+ \fi%
+ \pgf@x=\pgf@xa%
+ \pgf@y=\pgf@ya%
+}%
+
+\def\tikz@lib@place@of#1of #2\tikz@stop#3{%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\pgfutil@empty%
+ \tikz@lib@place@of@{\tikz@node@distance}{#2}{#3}%
+ \else%
+ \tikz@lib@place@of@{#1}{#2}{#3}%
+ \fi%
+}%
+\def\tikz@lib@place@of@#1#2#3{%
+ \tikz@scan@one@point\tikz@lib@place@remember(#2)%
+ \iftikz@shapeborder%
+ % Ok, this is relative to a border.
+ \iftikz@lib@ignore@size%
+ \edef\tikz@node@at{\noexpand\pgfpointanchor{\tikz@shapeborder@name}{center}}%
+ \def\tikz@anchor{center}%
+ \else%
+ \edef\tikz@node@at{\noexpand\pgfpointanchor{\tikz@shapeborder@name}{#3}}%
+ \fi%
+ \fi%
+ \edef\tikz@lib@place@nums{#1}%
+}%
+\def\tikz@lib@place@remember#1{\def\tikz@node@at{#1}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryquotes.code.tex b/graphics/pgf/base/tex/tikzlibraryquotes.code.tex
new file mode 100644
index 0000000000..99efbfeeca
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryquotes.code.tex
@@ -0,0 +1,90 @@
+% Copyright 2011 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryquotes.code.tex}
+
+\def\tikz@quote@parser#1{\tikz@quote@@parser#1\pgf@stop}%
+\def\tikz@quote@@parser"#1"{%
+ \pgfutil@ifnextchar\bgroup{%
+ \tikz@quote@@parser@group{#1}}{%
+ \pgfutil@ifnextchar'{%
+ \tikz@quote@@parser@apo{#1}}{%
+ \tikz@quote@@parser@normal{#1}}}}%
+\def\tikz@quote@@parser@apo#1'{%
+ \pgfutil@ifnextchar\bgroup{\tikz@quote@@parser@apo@group{#1}}{\tikz@quote@@parser@apo@normal{#1}}}%
+\def\tikz@quote@@parser@group#1#2#3\pgf@stop{%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\tikz@quotes@as{#1}{#2}}%
+ \expandafter\pgfkeysalso\expandafter{\tikz@temp}%
+}%
+\def\tikz@quote@@parser@normal#1#2\pgf@stop{%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\tikz@quotes@as{#1}{#2}}%
+ \expandafter\pgfkeysalso\expandafter{\tikz@temp}%
+}%
+\def\tikz@quote@@parser@apo@group#1#2#3\pgf@stop{%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\tikz@quotes@as{#1}{',#2}}%
+ \expandafter\pgfkeysalso\expandafter{\tikz@temp}%
+}%
+\def\tikz@quote@@parser@apo@normal#1#2\pgf@stop{%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\tikz@quotes@as{#1}{',#2}}%
+ \expandafter\pgfkeysalso\expandafter{\tikz@temp}%
+}%
+
+\pgfkeys{/handlers/first char syntax=true}%
+
+\def\tikz@enable@node@quotes{%
+ \pgfkeyssetvalue{/handlers/first char syntax/the character "}{\tikz@quote@parser}%
+ \let\tikz@quotes@as\tikz@node@quotes@as%
+}%
+\def\tikz@enable@edge@quotes{%
+ \pgfkeyssetvalue{/handlers/first char syntax/the character "}{\tikz@quote@parser}%
+ \let\tikz@quotes@as\tikz@edge@quotes@as%
+}%
+\def\tikz@enable@pic@quotes{%
+ \pgfkeyssetvalue{/handlers/first char syntax/the character "}{\tikz@quote@parser}%
+ \let\tikz@quotes@as\tikz@pic@quotes@as%
+}%
+
+\tikzset{
+ node quotes mean/.code={\def\tikz@node@quotes@as##1##2{#1}},
+ edge quotes mean/.code={\def\tikz@edge@quotes@as##1##2{#1}},
+ pic quotes mean/.code={\def\tikz@pic@quotes@as##1##2{#1}},
+ quotes mean pin/.style={node quotes mean={
+ pin={[direction shorthands,every pin quotes/.try,##2]##1}}},
+ quotes mean label/.style={node quotes mean={
+ label={[direction shorthands,every label quotes/.try,##2]##1}}},
+ quotes mean label,
+ edge quotes mean={edge node={node [every edge quotes,#2]{#1}}},
+ pic quotes mean={pic text={#1},pic text options={every pic quotes/.try,#2}},
+ every edge quotes/.style={auto},
+ direction shorthands/.code={%
+ \pgfkeyslet{/tikz/centered/.@cmd}\tikz@label@@centered
+ \pgfkeyslet{/tikz/above/.@cmd}\tikz@label@@above
+ \pgfkeyslet{/tikz/below/.@cmd}\tikz@label@@below
+ \pgfkeyslet{/tikz/left/.@cmd}\tikz@label@@left
+ \pgfkeyslet{/tikz/right/.@cmd}\tikz@label@@right
+ \pgfkeyslet{/tikz/above left/.@cmd}\tikz@label@@above@left
+ \pgfkeyslet{/tikz/above right/.@cmd}\tikz@label@@above@right
+ \pgfkeyslet{/tikz/below left/.@cmd}\tikz@label@@below@left
+ \pgfkeyslet{/tikz/below right/.@cmd}\tikz@label@@below@right
+ }
+}%
+
+\def\tikz@label@@centered#1\pgfeov{\pgfkeysalso{label position=center,pin position=center}}%
+\def\tikz@label@@above#1\pgfeov{\pgfkeysalso{label position=90,pin position=90}}%
+\def\tikz@label@@below#1\pgfeov{\pgfkeysalso{label position=-90,pin position=-90}}%
+\def\tikz@label@@left#1\pgfeov{\pgfkeysalso{label position=180,pin position=180}}%
+\def\tikz@label@@right#1\pgfeov{\pgfkeysalso{label position=0,pin position=0}}%
+\def\tikz@label@@above@left#1\pgfeov{\pgfkeysalso{label position=135,pin position=135}}%
+\def\tikz@label@@below@left#1\pgfeov{\pgfkeysalso{label position=-135,pin position=-135}}%
+\def\tikz@label@@above@right#1\pgfeov{\pgfkeysalso{label position=45,pin position=45}}%
+\def\tikz@label@@below@right#1\pgfeov{\pgfkeysalso{label position=-45,pin position=-45}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryrdf.code.tex b/graphics/pgf/base/tex/tikzlibraryrdf.code.tex
new file mode 100644
index 0000000000..60c87f0dff
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryrdf.code.tex
@@ -0,0 +1,291 @@
+% Copyright 2016 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryrdf.code.tex}
+
+
+
+\def\tikz@add@rdf@pre@option#1{\expandafter\def\expandafter\tikz@rdf@pre@options\expandafter{\tikz@rdf@pre@options#1}}%
+\def\tikz@add@rdf@post@option#1{\expandafter\def\expandafter\tikz@rdf@post@options\expandafter{\tikz@rdf@post@options#1}}%
+
+\let\tikz@rdf@pre@options\pgfutil@empty
+\let\tikz@rdf@post@options\pgfutil@empty
+
+\tikzset{
+ %
+ % Switching on the engine
+ %
+ rdf engine on/.code={%
+ \def\tikz@clear@rdf@options{\let\tikz@rdf@pre@options\pgfutil@empty\let\tikz@rdf@post@options\pgfutil@empty}%
+ \def\tikz@do@rdf@pre@options{\tikz@rdf@pre@options\let\tikz@rdf@pre@options\pgfutil@empty}%
+ \def\tikz@do@rdf@post@options{\tikz@rdf@post@options\let\tikz@rdf@post@options\pgfutil@empty}%
+ \pgfkeys{/tikz/rdf engine/.code=\tikz@add@rdf@pre@option{\pgfqkeys{/tikz/rdf engine}{##1}}}%
+ },
+ rdf engine/.cd,
+ %
+ every statement/.style=,
+ %
+ % Namespaces
+ %
+ prefix/.code=\pgfrdfprefix{#1},
+ %
+ % Core commands
+ %
+ statement/.code={%
+ {%
+ \pgfkeys{/tikz/rdf engine/every statement}%
+ \pgfqkeys{/tikz/rdf engine/statements}{#1}%
+ \iftikz@rdf@is@a@container\tikz@rdf@init@container\fi%
+ \iftikz@rdf@is@a@member\tikz@rdf@make@member\fi%
+ \tikz@rdf@make@triple%
+ \expandafter}\tikz@rdf@action%
+ },
+ get scope curie/.code={%
+ \ifx\tikz@id@name\pgfutil@empty%
+ \def\tikz@id@name{@rdf}%
+ \fi%
+ \pgfidrefnextuse\tikz@temp{\tikz@id@name}%
+ \edef#1{\tikzrdfhashmark\tikz@temp}%
+ },
+ get new resource curie/.code={%
+ \pgfsys@new@id\tikz@temp%
+ \edef#1{\tikzrdfhashmark\tikz@temp}%
+ },
+ scope is new context/.style={get scope curie=\tikzrdfcontext}
+}%
+
+\def\tikzrdfcontext{\tikzrdfhashmark}%empty by default
+
+\tikzset{
+ rdf engine/statements/.cd,
+ %
+ % Core properties of statements
+ %
+ subject/.code={%
+ \def\tikz@rdf@target{\tikz@rdf@subject}%
+ \tikz@rdf@parse{#1}%
+ },
+ predicate/.code={%
+ \def\tikz@rdf@target{\tikz@rdf@predicate}%
+ \tikz@rdf@parse{#1}%
+ },
+ object/.code={%
+ \let\tikz@rdf@object@literal\relax%
+ \let\tikz@rdf@object\relax%
+ \def\tikz@temp{#1}%
+ \ifx\tikz@temp\tikz@rdf@current@scope@text%
+ \tikz@rdf@object@scope@contenttrue%
+ \else%
+ \tikz@rdf@object@scope@contentfalse%
+ \def\tikz@rdf@target{\tikz@rdf@object}%
+ \tikz@rdf@parse{#1}%
+ \fi%
+ },
+ %
+ % Shorthands
+ %
+ has type/.style={predicate=rdf:type,object={#1}},
+ %
+ % Containers
+ %
+ is a bag/.style={has type=rdf:Bag, is a container},
+ is a sequence/.style={has type=rdf:Seq, is a container},
+ is an alternative/.style={has type=rdf:Alt, is a container},
+ %
+ is a container/.code={\tikz@rdf@is@a@containertrue},
+ %
+ has as member/.code={\tikz@rdf@is@a@membertrue},%
+}%
+
+\def\tikz@rdf@current@scope@text{scope content}%
+
+\let\tikz@rdf@subject\relax
+\let\tikz@rdf@predicate\pgfutil@empty
+\let\tikz@rdf@object\relax
+\let\tikz@rdf@object@literal\relax
+\let\tikz@rdf@container\relax
+
+\newif\iftikz@rdf@object@scope@content
+\newif\iftikz@rdf@is@a@container
+\newif\iftikz@rdf@is@a@member
+
+
+\def\tikz@rdf@parse#1{%
+ \edef\tikz@temp{#1}%
+ \expandafter\tikz@rdf@parse@#1\relax%
+}%
+
+\def\tikz@rdf@parse@{%
+ \pgfutil@ifnextchar({\tikz@rdf@parse@name}{%)
+ \pgfutil@ifnextchar"{\tikz@rdf@parse@literals}{%
+ \tikz@rdf@parse@curie%
+ }%
+ }%
+}%
+
+\def\tikz@rdf@parse@name(#1)\relax{%
+ \pgfidrefprevuse\tikz@rdf@the@id{#1}\expandafter\edef\tikz@rdf@target{\tikzrdfhashmark\tikz@rdf@the@id}%
+}%
+\def\tikz@rdf@parse@literals"#1"{%
+ \ifx\tikz@rdf@target\tikz@rdf@object@name%
+ \def\tikz@rdf@object@literal{#1}%
+ \else%
+ \tikzerror{Only RDF objects can be literals}%
+ \fi%
+ \pgfutil@ifnextchar\relax\pgfutil@gobble\tikz@rdf@parse@literals@rest%
+}%
+\def\tikz@rdf@parse@literals@rest and scope content\relax{%
+ \tikz@rdf@object@scope@contenttrue%
+}%
+
+\def\tikz@rdf@object@name{\tikz@rdf@object}%
+\def\tikz@rdf@parse@curie#1\relax{%
+ \expandafter\def\tikz@rdf@target{#1}%
+}%
+
+{%
+ \catcode`\#=11
+ \gdef\tikzrdfhashmark{#}%
+}%
+
+
+\def\tikz@rdf@make@triple{%
+ % First, ensure that subject, predicate and object are set:
+ \ifx\tikz@rdf@subject\relax%
+ \tikzerror{RDF statement misses subject}%
+ \else%
+ \ifx\tikz@rdf@predicate\relax%
+ \tikzerror{RDF statement misses predicate}%
+ \else%
+ \iftikz@rdf@object@scope@content%
+ \edef\tikz@marshal{\noexpand\tikz@rdf@make@content@triple{\tikz@rdf@subject}{\tikz@rdf@predicate}{\tikz@rdf@object@literal}}%
+ \tikz@marshal%
+ \else%
+ \ifx\tikz@rdf@object\relax%
+ \ifx\tikz@rdf@object@literal\relax%
+ \tikzerror{RDF statement misses object}%
+ \else%
+ \edef\tikz@marshal{\noexpand\tikz@rdf@make@literal@triple{\tikz@rdf@subject}{\tikz@rdf@predicate}{\tikz@rdf@object@literal}}%
+ \tikz@marshal%
+ \fi%
+ \else%
+ \edef\tikz@marshal{\noexpand\tikz@rdf@make@normal@triple{\tikz@rdf@subject}{\tikz@rdf@predicate}{\tikz@rdf@object}}%
+ \tikz@marshal%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+}%
+
+\def\tikz@rdf@make@content@triple#1#2#3{%
+ \def\tikz@rdf@action{%
+ \def\tikz@rdf@invoke@code{%
+ \def\tikz@temp{#3}%
+ \ifx\tikz@temp\tikz@rdf@object@literal@text\else%
+ \pgfrdfcontent{#3}%
+ \fi%
+ \pgfrdfabout{#1}%
+ \pgfrdfdatatype{rdf:XMLLiteral}%
+ \foreach \tikz@rdf@pred in {#2}{%
+ \ifx\tikz@rdf@pred\pgfutil@empty\else%
+ \expandafter\pgfrdfproperty\expandafter{\tikz@rdf@pred}%
+ \fi%
+ }%
+ }%
+ }%
+}%
+
+\def\tikz@rdf@make@literal@triple#1#2#3{%
+ \def\tikz@rdf@action{%
+ \tikz@add@rdf@post@option{%
+ {%
+ \pgfrdfabout{#1}%
+ \foreach \tikz@rdf@pred in {#2}{%
+ \ifx\tikz@rdf@pred\pgfutil@empty\else%
+ \expandafter\pgfrdfproperty\expandafter{\tikz@rdf@pred}%
+ \fi%
+ }%
+ \pgfrdfcontent{#3}%
+ \pgfidscope%
+ \endpgfidscope%
+ }%
+ }%
+ }%
+}%
+
+\def\tikz@rdf@make@normal@triple#1#2#3{%
+ \def\tikz@rdf@action{%
+ \tikz@add@rdf@post@option{%
+ {%
+ \pgfrdfabout{#1}%
+ \foreach \tikz@rdf@pred in {#2}{%
+ \ifx\tikz@rdf@pred\pgfutil@empty\else%
+ \expandafter\pgfrdfproperty\expandafter{\tikz@rdf@pred}%
+ \fi%
+ }%
+ \pgfrdfresource{#3}%
+ \pgfidscope%
+ \endpgfidscope%
+ }%
+ }%
+ }%
+}%
+
+\def\tikz@rdf@object@literal@text{\tikz@rdf@object@literal}%
+
+
+
+
+% Containers
+
+\def\tikz@rdf@init@container{%
+ \ifx\tikz@rdf@subject\relax%
+ \tikzerror{RDF statement misses subject}%
+ \else%
+ \expandafter\gdef\csname tikz@rdf@c@\tikz@rdf@subject\endcsname{0}%
+ \fi%
+}%
+
+
+\def\tikz@rdf@make@member{%
+ \ifx\tikz@rdf@subject\relax%
+ \tikzerror{RDF statement misses subject}%
+ \else%
+ % Get number:
+ \expandafter\let\expandafter\tikz@temp\csname tikz@rdf@c@\tikz@rdf@subject\endcsname%
+ \ifx\tikz@temp\relax%
+ \tikzerror{RDF subject is not a container}%
+ \else%
+ \c@pgf@counta\tikz@temp%
+ \advance\c@pgf@counta by1\relax%
+ \expandafter\xdef\csname tikz@rdf@c@\tikz@rdf@subject\endcsname{\the\c@pgf@counta}%
+ \edef\tikz@rdf@predicate{rdf:_\the\c@pgf@counta}%
+ \fi%
+ \fi%
+}%
+
+
+
+
+
+% Hooks:
+
+\let\tikz@rdf@invoke@code\relax
+
+\def\tikz@rdf@id@hook{%
+ \tikz@rdf@invoke@code%
+ \let\tikz@rdf@invoke@code\relax%
+}%
+
+% Add hook:
+\expandafter\def\expandafter\tikz@id@hook\expandafter{\tikz@id@hook\tikz@rdf@id@hook}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryscopes.code.tex b/graphics/pgf/base/tex/tikzlibraryscopes.code.tex
new file mode 100644
index 0000000000..6245bf8ec1
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryscopes.code.tex
@@ -0,0 +1,42 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryscopes.code.tex}
+
+% Redefine the after command hook...
+
+\def\tikz@lib@scope@check{%
+ \pgfutil@ifnextchar\tikz@intersect@finish{%
+ \tikz@intersect@finish\afterassignment\tikz@lib@scope@check\let\tikz@next%
+ }{%
+ \pgfutil@ifnextchar\par{%
+ \afterassignment\tikz@lib@scope@check\let\tikz@next%
+ }%
+ {\pgfutil@ifnextchar\bgroup{%gotcha
+ \afterassignment\tikz@lib@scope@gotcha\let\tikz@next%
+ }%
+ {}%
+ }%
+ }%
+}%
+
+\def\tikz@lib@scope@gotcha{%
+ \pgfutil@ifnextchar[{%]
+ \tikz@lib@scope@action%
+ }{%
+ % false alarm
+ \bgroup%
+ }%
+}%
+\def\tikz@lib@scope@action[#1]{%
+ \scope[#1]\bgroup\aftergroup\endscope%
+ \tikz@lib@scope@check%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshadings.code.tex b/graphics/pgf/base/tex/tikzlibraryshadings.code.tex
new file mode 100644
index 0000000000..c84fb46769
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshadings.code.tex
@@ -0,0 +1,21 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshadings.code.tex}
+
+\usepgflibrary{shadings}%
+
+\tikzset{
+ lower left/.style={shading=bilinear interpolation,/utils/exec=\colorlet{lower left}{#1}},
+ upper left/.style={shading=bilinear interpolation,/utils/exec=\colorlet{upper left}{#1}},
+ lower right/.style={shading=bilinear interpolation,/utils/exec=\colorlet{lower right}{#1}},
+ upper right/.style={shading=bilinear interpolation,/utils/exec=\colorlet{upper right}{#1}}
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshadows.code.tex b/graphics/pgf/base/tex/tikzlibraryshadows.code.tex
new file mode 100644
index 0000000000..ebb2abf74c
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshadows.code.tex
@@ -0,0 +1,146 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshadows.code.tex}
+
+\usetikzlibrary{fadings}%
+
+
+% General options
+\tikzset{
+ /tikz/shadow scale/.initial=1,
+ /tikz/shadow xshift/.initial=0pt,
+ /tikz/shadow yshift/.initial=0pt,
+}%
+
+% Basic shadow style
+\tikzset{
+ general shadow/.style={
+ preaction={
+ #1,
+ transform canvas={
+ scale around=\pgfkeysvalueof{/tikz/shadow scale}:(current path bounding box.center),
+ shift={(\pgfkeysvalueof{/tikz/shadow xshift},\pgfkeysvalueof{/tikz/shadow yshift})}
+ },
+ }
+ },
+ every shadow/.style={}
+}%
+
+
+
+%
+% Adds a simple drop shadow to a path
+%
+
+\tikzset{
+ /tikz/drop shadow/.style={
+ general shadow={%
+ shadow scale=1,
+ shadow xshift=.5ex,
+ shadow yshift=-.5ex,
+ opacity=.5,
+ fill=black!50,
+ every shadow,
+ #1
+ }
+ }
+}%
+
+
+%
+% Adds a circular drop shadow to a path
+%
+
+\tikzset{
+ /tikz/circular drop shadow/.style={
+ general shadow={%
+ shadow scale=1.1,
+ shadow xshift=.3ex,
+ shadow yshift=-.3ex,
+ fill=black!50,
+ path fading={circle with fuzzy edge 15 percent},
+ every shadow,
+ #1
+ }
+ }
+}%
+
+
+
+%
+% Adds a circular glow to a path
+%
+
+\tikzset{
+ /tikz/circular glow/.style={
+ general shadow={%
+ shadow scale=1.25,
+ shadow xshift=0pt,
+ shadow yshift=0pt,
+ fill=black!50,
+ path fading={circle with fuzzy edge 15 percent},
+ every shadow,
+ #1,
+ }
+ }
+}%
+
+
+
+
+
+%
+% Adds a "copy" version of the path behind it.
+%
+
+\tikzset{
+ /tikz/copy shadow/.style={
+ general shadow={%
+ /utils/exec={\let\tikz@lib@shadow@fill=\tikz@fillcolor\let\tikz@lib@shadow@draw=\tikz@strokecolor},
+ shadow scale=1,
+ shadow xshift=.5ex,
+ shadow yshift=.5ex,
+ fill=\tikz@lib@shadow@fill,
+ draw=\tikz@lib@shadow@draw,
+ every shadow,
+ #1
+ }
+ }
+}%
+
+
+%
+% Adds two "copies" of the path behind it.
+%
+
+\tikzset{
+ /tikz/double copy shadow/.style={
+ general shadow={%
+ /utils/exec={\let\tikz@lib@shadow@fill=\tikz@fillcolor\let\tikz@lib@shadow@draw=\tikz@strokecolor},
+ shadow scale=1,
+ shadow xshift=.5ex,
+ shadow yshift=.5ex,
+ fill=\tikz@lib@shadow@fill,
+ draw=\tikz@lib@shadow@draw,
+ #1,
+ shadow xshift/.expanded=2*\pgfkeysvalueof{/tikz/shadow xshift},
+ shadow yshift/.expanded=2*\pgfkeysvalueof{/tikz/shadow yshift},
+ },
+ general shadow={%
+ /utils/exec={\let\tikz@lib@shadow@fill=\tikz@fillcolor\let\tikz@lib@shadow@draw=\tikz@strokecolor},
+ shadow scale=1,
+ shadow xshift=.5ex,
+ shadow yshift=.5ex,
+ fill=\tikz@lib@shadow@fill,
+ draw=\tikz@lib@shadow@draw,
+ #1,
+ },
+ }
+}%
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.arrows.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.arrows.code.tex
new file mode 100644
index 0000000000..20e2022c11
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.arrows.code.tex
@@ -0,0 +1,16 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.arrows.code.tex}
+
+\usepgflibrary{shapes.arrows}%
+
+\pgfkeys{/tikz/arrow box arrows/.code={\pgf@lib@arrowbox@parsearrows{#1}}}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.callouts.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.callouts.code.tex
new file mode 100644
index 0000000000..12b4953349
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.callouts.code.tex
@@ -0,0 +1,35 @@
+% Copyright 2006 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.
+
+\usepgflibrary{shapes.callouts}%
+
+\pgfkeys{/tikz/callout absolute pointer/.code={%
+ \tikz@scan@one@point\tikz@lib@callout@checkforplus#1\relax%
+ }%
+}%
+
+\def\tikz@lib@callout@checkforplus#1{%
+ \pgfutil@ifnextchar+{\def\tikz@lib@callout@originalpoint{#1}\tikz@lib@callout@scan@relative}%
+ {\pgf@lib@callout@makeabsolutepointer{#1}}}%
+
+\def\tikz@lib@callout@scan@relative+{%
+ \pgfutil@ifnextchar+{\tikz@lib@callout@scan@plusplus}{\tikz@lib@callout@scan@plus}}%
+\def\tikz@lib@callout@scan@plusplus+{\tikz@scan@one@point\tikz@lib@callout@add}%
+\def\tikz@lib@callout@scan@plus{\tikz@scan@one@point\tikz@lib@callout@add}%
+\def\tikz@lib@callout@add#1{%
+ \expandafter\pgf@lib@callout@makeabsolutepointer\expandafter{%
+ \expandafter\pgfpointadd\expandafter{\tikz@lib@callout@originalpoint}{#1}}%
+}%
+
+\pgfkeys{/tikz/callout relative pointer/.code={%
+ \tikz@scan@one@point\pgf@lib@callout@makerelativepointer#1\relax%
+ }%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.code.tex
new file mode 100644
index 0000000000..0e1c84a287
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.code.tex
@@ -0,0 +1,19 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.code.tex}
+
+\usetikzlibrary{shapes.geometric}%
+\usetikzlibrary{shapes.misc}%
+\usetikzlibrary{shapes.symbols}%
+\usetikzlibrary{shapes.arrows}%
+\usetikzlibrary{shapes.callouts}%
+\usetikzlibrary{shapes.multipart}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.IEC.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.IEC.code.tex
new file mode 100644
index 0000000000..e41ddf83a0
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.IEC.code.tex
@@ -0,0 +1,38 @@
+% Copyright 2008 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.gates.logic.IEC.code.tex}
+
+\usepgflibrary{shapes.gates.logic.IEC}%
+
+\tikzset{%
+ use IEC style logic gates/.code={%
+ \tikzset{%
+ and gate/.style={shape=and gate IEC},
+ nand gate/.style={shape=nand gate IEC},
+ or gate/.style={shape=or gate IEC},
+ nor gate/.style={shape=nor gate IEC},
+ xor gate/.style={shape=xor gate IEC},
+ xnor gate/.style={shape=xnor gate IEC},
+ not gate/.style={shape=not gate IEC},
+ buffer gate/.style={shape=buffer gate IEC},
+ and gate symbol/.style={and gate IEC symbol={##1}},
+ nand gate symbol/.style={nand gate IEC symbol={##1}},
+ or gate symbol/.style={or gate IEC symbol={##1}},
+ nor gate symbol/.style={nor gate IEC symbol={##1}},
+ xor gate symbol/.style={xor gate IEC symbol={##1}},
+ xnor gate symbol/.style={xnor gate IEC symbol={##1}},
+ not gate symbol/.style={not gate IEC symbol={##1}},
+ buffer gate symbol/.style={buffer gate IEC symbol={##1}},
+ logic gate symbol align/.style={/pgf/logic gate IEC symbol align={##1}},
+ logic gate symbol color/.style={/pgf/logic gate IEC symbol color={##1}}
+ }%
+ }%
+}%
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.US.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.US.code.tex
new file mode 100644
index 0000000000..99411f2b12
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.gates.logic.US.code.tex
@@ -0,0 +1,40 @@
+% Copyright 2008 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.gates.logic.US.code.tex}
+
+\usepgflibrary{shapes.gates.logic.US}%
+
+\tikzset{%
+ use US style logic gates/.code={%
+ \tikzset{%
+ and gate/.style={shape=and gate US},
+ nand gate/.style={shape=nand gate US},
+ or gate/.style={shape=or gate US},
+ nor gate/.style={shape=nor gate US},
+ xor gate/.style={shape=xor gate US},
+ xnor gate/.style={shape=xnor gate US},
+ not gate/.style={shape=not gate US},
+ buffer gate/.style={shape=buffer gate US}
+ }%
+ },
+ use CDH style logic gates/.code={%
+ \tikzset{%
+ and gate/.style={shape=and gate CDH},
+ nand gate/.style={shape=nand gate CDH},
+ or gate/.style={shape=or gate US},
+ nor gate/.style={shape=nor gate US},
+ xor gate/.style={shape=xor gate US},
+ xnor gate/.style={shape=xnor gate US},
+ not gate/.style={shape=not gate US},
+ buffer gate/.style={shape=buffer gate US}
+ }
+ }
+}%
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.geometric.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.geometric.code.tex
new file mode 100644
index 0000000000..ae3d6c7feb
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.geometric.code.tex
@@ -0,0 +1,14 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.geometric.code.tex}
+
+\usepgflibrary{shapes.geometric}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.misc.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.misc.code.tex
new file mode 100644
index 0000000000..9a8c13f622
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.misc.code.tex
@@ -0,0 +1,14 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.misc.code.tex}
+
+\usepgflibrary{shapes.misc}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.multipart.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.multipart.code.tex
new file mode 100644
index 0000000000..797a0e2552
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.multipart.code.tex
@@ -0,0 +1,36 @@
+% Copyright 2007 by Till Tantau and 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.multipart.code.tex}
+
+\usepgflibrary{shapes.multipart}%
+
+\pgfkeys{/tikz/rectangle split/parts/.code={%
+ \pgfkeys{/pgf/rectangle split parts=#1}%
+ }%
+}%
+
+\pgfkeys{/tikz/rectangle split use custom fill/.code={%
+ \pgfkeys{/pgf/rectangle split use custom fill=#1}%
+ \pgfkeys{/tikz/fill=none}}%
+}%
+
+\pgfkeys{/tikz/rectangle split draw splits/.is if=pgfrectanglesplitdrawsplits}%
+
+\pgfkeys{/tikz/rectangle split part align/.code={%
+ \pgfkeys{/pgf/rectangle split part align={#1}}%
+ }%
+}%
+
+\pgfkeys{/tikz/rectangle split part fill/.code={%
+ \pgfkeys{/pgf/rectangle split part fill={#1}}%
+ }%
+}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryshapes.symbols.code.tex b/graphics/pgf/base/tex/tikzlibraryshapes.symbols.code.tex
new file mode 100644
index 0000000000..6927d8dea4
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryshapes.symbols.code.tex
@@ -0,0 +1,17 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryshapes.symbols.code.tex}
+
+\pgfkeysifdefined{/tikz/shape border uses incircle}{}{%
+ \pgfkeys{/tikz/shape border uses incircle/.is if=pgfshapeborderusesincircle}}%
+
+\usepgflibrary{shapes.symbols}%
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarysnakes.code.tex b/graphics/pgf/base/tex/tikzlibrarysnakes.code.tex
new file mode 100644
index 0000000000..64d6fc44f8
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarysnakes.code.tex
@@ -0,0 +1,77 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarysnakes.code.tex}
+
+\pgfwarning{Snakes have been superseded by
+decorations. Please use the decoration libraries instead of the snakes
+library}%
+
+\usetikzlibrary{decorations.pathmorphing,decorations.pathreplacing,decorations.shapes}%
+
+
+% Old snakes stuff:
+
+\tikzoption{snake}[]{%
+ \def\tikz@@snake{#1}%
+ \ifx\tikz@@snake\pgfutil@empty%
+ \tikz@snakedtrue%
+ \else%
+ \ifx\tikz@@snake\tikz@nonetext%
+ \tikz@snakedfalse%
+ \else%
+ \tikz@snakedtrue%
+ \let\tikz@snake=\tikz@@snake%
+ \fi%
+ \fi}%
+
+\tikzoption{raise snake}{\def\pgf@snake@raise{\pgftransformyshift{#1}}}%
+\tikzoption{mirror snake}[true]{%
+ \csname if#1\endcsname
+ \def\pgf@snake@mirror{\pgftransformyscale{-1}}%
+ \else%
+ \let\pgf@snake@mirror=\pgfutil@empty%
+ \fi
+}%
+
+\tikzoption{gap before snake}{\def\tikz@presnake{{moveto}{#1}{\noexpand\tikz@snake@install@trans}{}}}%
+\tikzoption{line before snake}{\def\tikz@presnake{{lineto}{#1}{\noexpand\tikz@snake@install@trans}{}}}%
+
+\tikzoption{gap after snake}{\def\tikz@postsnake{{moveto}{#1}{\noexpand\tikz@snake@install@trans}{}}\def\tikz@mainsnakelength{\pgfsnakeremainingdistance-#1}}%
+\tikzoption{line after snake}{\def\tikz@postsnake{{lineto}{#1}{\noexpand\tikz@snake@install@trans}{}}\def\tikz@mainsnakelength{\pgfsnakeremainingdistance-#1}}%
+
+\tikzoption{gap around snake}{%
+ \def\tikz@presnake{{moveto}{#1}{\noexpand\tikz@snake@install@trans}{}}%
+ \def\tikz@postsnake{{moveto}{#1}{\noexpand\tikz@snake@install@trans}{}}%
+ \def\tikz@mainsnakelength{\pgfsnakeremainingdistance-#1}%
+}%
+\tikzoption{line around snake}{%
+ \def\tikz@presnake{{lineto}{#1}{\noexpand\tikz@snake@install@trans}{}}%
+ \def\tikz@postsnake{{lineto}{#1}{\noexpand\tikz@snake@install@trans}{}}%
+ \def\tikz@mainsnakelength{\pgfsnakeremainingdistance-#1}%
+}%
+\let\pgf@snake@mirror=\pgfutil@empty
+\let\pgf@snake@raise=\pgfutil@empty
+
+\def\tikz@snake@install@trans{\pgfsetsnakesegmenttransformation{\pgf@snake@mirror\pgf@snake@raise}}%
+
+\def\tikz@snake{zigzag}%
+
+\let\tikz@presnake=\pgfutil@empty
+\let\tikz@postsnake=\pgfutil@empty
+\def\tikz@mainsnakelength{\pgfsnakeremainingdistance}%
+
+
+\tikzset{snake triangles 45/.style= {snake=triangles,segment object length=2.41421356\pgfsnakesegmentamplitude}}%
+\tikzset{snake triangles 60/.style= {snake=triangles,segment object length=1.73205081\pgfsnakesegmentamplitude}}%
+\tikzset{snake triangles 90/.style= {snake=triangles,segment object length=\pgfsnakesegmentamplitude}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryspy.code.tex b/graphics/pgf/base/tex/tikzlibraryspy.code.tex
new file mode 100644
index 0000000000..b23cf08caf
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryspy.code.tex
@@ -0,0 +1,124 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryspy.code.tex}
+
+
+
+% Spy styles
+
+\tikzset{
+ spy using outlines/.style={
+ spy scope={
+ every spy on node/.style={very thin,draw},
+ every spy in node/.style={thick,draw},
+ #1
+ }
+ },
+ spy using overlays/.style={
+ spy scope={
+ every spy on node/.style={fill,fill opacity=0.2,text opacity=1},
+ every spy in node/.style={fill,fill opacity=0.2,text opacity=1},
+ #1
+ }
+ },
+ connect spies/.style={
+ spy connection path={\draw[thin] (tikzspyonnode) -- (tikzspyinnode);}
+ }
+}%
+
+\newbox\tikz@lib@spybox
+
+\let\tikz@lib@spy@collection=\pgfutil@empty%
+
+\tikzset{spy scope/.style={
+ size/.style={minimum size=##1},
+ height/.style={minimum height=##1},
+ width/.style={minimum width=##1},
+ execute at begin scope={%
+ \let\tikz@lib@spy@save=\tikz@lib@spy@collection%
+ \setbox\tikz@lib@spybox=\hbox\bgroup\bgroup%
+ \let\spy=\tikz@lib@spy@parse},
+ execute at end scope={%
+ \egroup\egroup%
+ {%
+ \copy\tikz@lib@spybox%
+ \tikz@lib@spy@collection%
+ }%
+ \global\let\tikz@lib@spy@collection=\tikz@lib@spy@save%
+ },%
+ tikz@lib@spy@style/.style={#1},
+ tikz@lib@reset@gs
+ },
+ lens/.store in=\tikz@lib@spy@lens,
+ lens=,
+ magnification/.style={lens={scale=#1}},
+ spy connection path/.store in=\tikz@lib@spy@path,
+ spy connection path=
+}%
+
+\tikzset{
+ tikz@lib@reset@gs/.style={black,thin,solid,opaque,line cap=butt,line join=miter}
+}%
+
+\def\tikz@lib@spy@parse{%
+ \pgfutil@ifnextchar[{\tikz@lib@spy@parse@opt}{\tikz@lib@spy@parse@opt[]}%]
+}%
+\def\tikz@lib@spy@parse@opt[#1]{
+ \pgfutil@ifnextchar x{\tikz@lib@spy@parse@opta[#1]}{\tikz@lib@spy@parse@opta[#1]}%]
+}%
+\def\tikz@lib@spy@parse@opta[#1]on#2in node#3;{%
+ \pgfutil@g@addto@macro\tikz@lib@spy@collection{\tikz@lib@spy@do{#1}{#2}{#3}}%
+}%
+
+\def\tikz@lib@spy@do#1#2#3{%
+ \scope[tikz@lib@spy@style,#1]
+ \node [alias=tikzspyonnode,inner sep=0pt,outer sep=0pt,every spy on node/.try,
+ /utils/exec={
+ {%
+ \let\tikz@transform=\relax
+ \pgftransformreset%
+ \expandafter\tikzset\expandafter{\tikz@lib@spy@lens}
+ \pgftransforminvert%
+ \pgfgettransformentries\a\b\c\d\e\f%
+ \global\let\pgf@lib@svg@a=\a%
+ \global\let\pgf@lib@svg@b=\b%
+ \global\let\pgf@lib@svg@c=\c%
+ \global\let\pgf@lib@svg@d=\d%
+ }%
+ \tikz@addtransform{%
+ \tikz@scan@one@point\pgftransformshift#2%
+ \pgftransformcm{\pgf@lib@svg@a}{\pgf@lib@svg@b}{\pgf@lib@svg@c}{\pgf@lib@svg@d}{\pgfpointorigin}%
+ }
+ }]{};
+ \node [alias=tikzspyinnode,inner sep=0pt,outer sep=0pt,at={#2},every spy in node/.try,
+ path picture={\node[anchor=center,tikz@lib@reset@gs]{\nullfont%
+ \pgfpicture\relax\pgfsetbaseline{default}\pgfsettrimleft{default}\pgfsettrimright{default}%
+ \pgftransformreset%
+ \let\tikz@transform=\relax%
+ \expandafter\tikzset\expandafter{\tikz@lib@spy@lens}%
+ \pgflowlevelsynccm%
+ \tikz@scan@one@point\tikz@lib@spy@shift#2%
+ \pgflowlevelsynccm%
+ \copy\tikz@lib@spybox%
+ \endpgfpicture};}]#3{};
+ \tikz@lib@spy@path
+ \endscope
+}%
+
+\def\tikz@lib@spy@shift#1{%
+ \pgf@process{#1}%
+ \pgf@x=-\pgf@x%
+ \pgf@y=-\pgf@y%
+ \pgftransformshift{}%
+}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarysvg.path.code.tex b/graphics/pgf/base/tex/tikzlibrarysvg.path.code.tex
new file mode 100644
index 0000000000..8b64ccc3ce
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarysvg.path.code.tex
@@ -0,0 +1,33 @@
+% Copyright 2009 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarysvg.path.code.tex}
+
+\usepgflibrary{svg.path}%
+
+\def\tikz@svg@path vg{\pgfutil@ifnextchar[\tikz@svg@@path{\tikz@svg@@path[]}}%}%
+
+\def\tikz@svg@@path[#1]{\pgfutil@ifnextchar"{\tikz@svg@@path@old{#1}}{\tikz@svg@@path@new{#1}}}%
+\def\tikz@svg@@path@new#1#2{\tikz@svg@@path@old{#1}"#2"}%
+\def\tikz@svg@@path@old#1"#2"{
+ {%
+ \tikzset{#1}%
+ \pgfpathsvg{#2}%
+ }%
+ {
+ \pgftransforminvert
+ \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@path@lastx}{\pgf@path@lasty}}}
+ }
+ \tikz@lastx=\pgf@x%
+ \tikz@lasty=\pgf@y%
+ \tikz@lastxsaved=\tikz@lastx%
+ \tikz@lastysaved=\tikz@lasty%
+ \tikz@updatecurrenttrue%
+ \tikz@scan@next@command
+}%
diff --git a/graphics/pgf/base/tex/tikzlibrarythrough.code.tex b/graphics/pgf/base/tex/tikzlibrarythrough.code.tex
new file mode 100644
index 0000000000..cb63424532
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarythrough.code.tex
@@ -0,0 +1,36 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarythrough.code.tex}
+
+
+
+\tikzset{circle through/.code={%
+ \pgfkeysalso{shape=circle,inner sep=0pt,outer sep=0pt}%
+ % Save transformations (correct?)
+ \pgfgettransform{\tikz@lib@saved@transform}%
+ \tikz@scan@one@point\tikz@lib@circle@through#1%
+ }}%
+
+\def\tikz@lib@circle@through#1{%
+ \tikz@addoption{%
+ {%
+ \pgfsettransform{\tikz@lib@saved@transform}%
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\pgfpointtransformed{\tikz@node@at}}%
+ \advance\pgf@xa by-\pgf@x%
+ \advance\pgf@ya by-\pgf@y%
+ \pgfmathparse{2*veclen(\the\pgf@xa,\the\pgf@ya)}%
+ \global\let\tikz@lib@circle@size=\pgfmathresult%
+ }%
+ \pgfset{/pgf/minimum size/.expanded=\tikz@lib@circle@size}%
+ }%
+}%
diff --git a/graphics/pgf/base/tex/tikzlibrarytopaths.code.tex b/graphics/pgf/base/tex/tikzlibrarytopaths.code.tex
new file mode 100644
index 0000000000..2051fce8fd
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarytopaths.code.tex
@@ -0,0 +1,382 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarytopaths.code.tex}
+
+
+% Move to
+
+\tikzset{move to/.style= {to path={(\tikztotarget) \tikztonodes}}}
+
+
+% Straight to
+
+\tikzset{line to/.style= {to path={-- (\tikztotarget) \tikztonodes}}}
+
+
+% Curved to
+
+\tikzset{every curve to/.style= {}}
+\tikzset{curve to/.style= {to path=\tikz@to@curve@path}}
+
+\tikzoption{bend angle}{\pgfmathsetmacro\tikz@to@bend{#1}}
+
+\tikzoption{bend left}[]{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgfmathsetmacro\tikz@to@bend{#1}%
+ \fi%
+ \let\tikz@to@out=\tikz@to@bend%
+ \pgfmathsetmacro\tikz@to@in{180-\tikz@to@out}%
+ \tikz@to@switch@on%
+ \tikz@to@relativetrue%
+}
+
+\tikzoption{bend right}[]{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty%
+ \else%
+ \pgfmathsetmacro\tikz@to@bend{#1}%
+ \fi%
+ % Now, negate
+ \pgfmathsetmacro\tikz@to@out{\tikz@to@bend}
+ \c@pgf@counta=\tikz@to@bend\relax%
+ \c@pgf@counta=-\c@pgf@counta\relax%
+ \edef\tikz@to@out{\the\c@pgf@counta}%
+ \c@pgf@counta=180\relax%
+ \advance\c@pgf@counta by-\tikz@to@out\relax%
+ \edef\tikz@to@in{\the\c@pgf@counta}%
+ \tikz@to@switch@on%
+ \tikz@to@relativetrue%
+}
+
+\tikzoption{relative}[true]{\csname tikz@to@relative#1\endcsname}
+\newif\iftikz@to@relative
+\tikz@to@relativefalse
+
+\tikzoption{in}{\def\tikz@to@in{#1}\tikz@to@switch@on}
+\tikzoption{out}{\def\tikz@to@out{#1}\tikz@to@switch@on}
+
+\tikzoption{in looseness}{\tikz@to@set@in@looseness{#1}}
+\tikzoption{out looseness}{\tikz@to@set@out@looseness{#1}}
+\tikzoption{looseness}{\tikz@to@set@in@looseness{#1}\tikz@to@set@out@looseness{#1}}
+
+\tikzoption{in control}{\tikz@to@set@in@control{#1}}
+\tikzoption{out control}{\tikz@to@set@out@control{#1}}
+\tikzoption{controls}{\tikz@to@parse@controls#1\pgf@stop}
+
+\tikzoption{in min distance}{\tikz@to@set@distances{#1}{}{}{}}
+\tikzoption{in max distance}{\tikz@to@set@distances{}{#1}{}{}}
+\tikzoption{in distance}{\tikz@to@set@distances{#1}{#1}{}{}}
+\tikzoption{out min distance}{\tikz@to@set@distances{}{}{#1}{}}
+\tikzoption{out max distance}{\tikz@to@set@distances{}{}{}{#1}}
+\tikzoption{out distance}{\tikz@to@set@distances{}{}{#1}{#1}}
+\tikzoption{min distance}{\tikz@to@set@distances{#1}{}{#1}{}}
+\tikzoption{max distance}{\tikz@to@set@distances{}{#1}{}{#1}}
+\tikzoption{distance}{\tikz@to@set@distances{#1}{#1}{#1}{#1}}
+
+\def\tikz@to@set@distances#1#2#3#4{%
+ \tikz@to@setifnotempy{#1}{\tikz@to@in@min}{\let\tikz@to@end@compute=\tikz@to@end@compute@looseness}%
+ \tikz@to@setifnotempy{#2}{\tikz@to@in@max}{\let\tikz@to@end@compute=\tikz@to@end@compute@looseness}%
+ \tikz@to@setifnotempy{#3}{\tikz@to@out@min}{\let\tikz@to@start@compute=\tikz@to@start@compute@looseness}%
+ \tikz@to@setifnotempy{#4}{\tikz@to@out@max}{\let\tikz@to@start@compute=\tikz@to@start@compute@looseness}%
+ \tikz@to@switch@on%
+}
+
+\def\tikz@to@setifnotempy#1#2#3{%
+ \def\pgf@temp{#1}%
+ \ifx\pgf@temp\pgfutil@empty\else\def#2{#1}#3\fi%
+}
+
+
+\def\tikz@to@set@in@looseness#1{%
+ \def\tikz@to@in@looseness{#1}%
+ \let\tikz@to@end@compute=\tikz@to@end@compute@looseness%
+ \tikz@to@switch@on%
+}
+\def\tikz@to@set@out@looseness#1{%
+ \def\tikz@to@out@looseness{#1}%
+ \let\tikz@to@start@compute=\tikz@to@start@compute@looseness%
+ \tikz@to@switch@on%
+}
+
+\def\tikz@to@parse@controls#1and#2\pgf@stop{\tikz@to@set@in@control{#2}\tikz@to@set@out@control{#1}}
+
+\def\tikz@to@set@in@control#1{%
+ \def\tikz@to@in@control{#1}%
+ \let\tikz@to@end@compute=\tikz@to@end@compute@control%
+ \tikz@to@switch@on%
+}
+\def\tikz@to@set@out@control#1{%
+ \def\tikz@to@out@control{#1}%
+ \let\tikz@to@start@compute=\tikz@to@start@compute@control%
+ \tikz@to@switch@on%
+}
+
+
+\def\tikz@to@bend{30}
+
+\def\tikz@to@out{45}
+\def\tikz@to@in{135}
+
+\def\tikz@to@out@looseness{1}
+\def\tikz@to@in@looseness{1}
+
+\def\tikz@to@in@min{0pt}
+\def\tikz@to@in@max{10000pt}
+\def\tikz@to@out@min{0pt}
+\def\tikz@to@out@max{10000pt}
+
+\def\tikz@to@switch@on{\let\tikz@to@path=\tikz@to@curve@path}
+
+\def\tikz@to@curve@path{%
+ [every curve to]
+ \pgfextra{\iftikz@to@relative\tikz@to@compute@relative\else\tikz@to@compute\fi}
+ \tikz@computed@path
+ \tikztonodes%
+}
+
+\def\tikz@to@modify#1#2{%
+ \pgfutil@ifundefined{pgf@sh@ns@#1}
+ {}%
+ {\edef#1{#1.#2}}
+}%
+
+\def\tikz@to@compute{%
+ \let\tikz@tofrom=\tikztostart%
+ \let\tikz@toto=\tikztotarget%
+ \tikz@to@modify\tikz@tofrom\tikz@to@out%
+ \tikz@to@modify\tikz@toto\tikz@to@in%
+ \ifx\tikz@to@start@compute\tikz@to@start@compute@looseness%
+ \tikz@to@compute@distance%
+ \else%
+ \ifx\tikz@from@start@compute\tikz@to@start@compute@looseness%
+ \tikz@to@compute@distance%
+ \fi%
+ \fi%
+ \tikz@to@start@compute%
+ \tikz@to@end@compute%
+ \edef\tikz@computed@path{.. controls \tikz@computed@start and \tikz@computed@end .. (\tikz@toto)}
+}
+
+\def\tikz@to@compute@distance{\tikz@scan@one@point\tikz@@to@compute@distance(\tikz@tofrom)}
+\def\tikz@@to@compute@distance#1{%
+ \def\tikz@first@point{#1}%
+ \tikz@scan@one@point\tikz@@@to@compute@distance(\tikz@toto)}
+\def\tikz@@@to@compute@distance#1{%
+ \def\tikz@second@point{#1}%
+ \tikz@to@compute@distance@main%
+}
+\def\tikz@to@compute@distance@main{%
+ \pgf@process{\pgfpointdiff{\tikz@first@point}{\tikz@second@point}}%
+ \ifdim\pgf@x<0pt\pgf@xa=-\pgf@x\else\pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@y<0pt\pgf@ya=-\pgf@y\else\pgf@ya=\pgf@y\fi%
+ %
+ % Calculate length of second to first vector:
+ %
+ \pgf@process{\pgfpointnormalised{\pgfqpoint{\pgf@xa}{\pgf@ya}}}%
+ \ifdim\pgf@x>\pgf@y%
+ \c@pgf@counta=\pgf@x%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \divide\c@pgf@counta by 255\relax%
+ \pgf@xa=16\pgf@xa\relax%
+ \divide\pgf@xa by\c@pgf@counta%
+ \pgf@xa=16\pgf@xa\relax%
+ \fi%
+ \else%
+ \c@pgf@counta=\pgf@y%
+ \ifnum\c@pgf@counta=0\relax%
+ \else%
+ \divide\c@pgf@counta by 255\relax%
+ \pgf@ya=16\pgf@ya\relax%
+ \divide\pgf@ya by\c@pgf@counta%
+ \pgf@xa=16\pgf@ya\relax%
+ \fi%
+ \fi%
+ \pgf@x=0.3915\pgf@xa%
+ \pgf@xa=\tikz@to@out@looseness\pgf@x%
+ \pgf@xb=\tikz@to@in@looseness\pgf@x%
+ % Adjust as necessary
+ \pgfmathsetlength{\pgf@ya}{\tikz@to@out@min}
+ \ifdim\pgf@xa<\pgf@ya%
+ \pgf@xa=\pgf@ya%
+ \fi%
+ \pgfmathsetlength{\pgf@ya}{\tikz@to@out@max}
+ \ifdim\pgf@xa>\pgf@ya%
+ \pgf@xa=\pgf@ya%
+ \fi%
+ \pgfmathsetlength{\pgf@ya}{\tikz@to@in@min}
+ \ifdim\pgf@xb<\pgf@ya%
+ \pgf@xb=\pgf@ya%
+ \fi%
+ \pgfmathsetlength{\pgf@ya}{\tikz@to@in@max}
+ \ifdim\pgf@xb>\pgf@ya%
+ \pgf@xb=\pgf@ya%
+ \fi%
+}
+
+\def\tikz@to@start@compute@looseness{%
+ \edef\tikz@computed@start{([shift=(\tikz@to@out:\the\pgf@xa)]\tikz@tofrom)}%
+}
+\def\tikz@to@end@compute@looseness{%
+ \edef\tikz@computed@end{([shift=(\tikz@to@in:\the\pgf@xb)]\tikz@toto)}%
+}
+\def\tikz@to@start@compute@control{%
+ \let\tikz@computed@start=\tikz@to@out@control%
+}
+\def\tikz@to@end@compute@control{%
+ \let\tikz@computed@end=\tikz@to@in@control%
+}
+
+\let\tikz@to@start@compute=\tikz@to@start@compute@looseness%
+\let\tikz@to@end@compute=\tikz@to@end@compute@looseness%
+
+
+
+
+% Relative curves
+
+\def\tikz@to@compute@relative{%
+ \tikz@scan@one@point\tikz@@to@compute@relative(\tikztostart)%
+}
+\def\tikz@@to@compute@relative#1{%
+ \def\tikz@tofrom{#1}%
+ \tikz@scan@one@point\tikz@@@to@compute@relative(\tikztotarget)%
+}
+\def\tikz@@@to@compute@relative#1{%
+ \def\tikz@toto{#1}%
+ \begingroup
+ %
+ % Adjust start and target so that they lie on the border in the
+ % rotated coordinate system.
+ %
+ \pgfutil@ifundefined{pgf@sh@ns@\tikztostart}
+ {%
+ \let\tikz@first@point=\tikz@tofrom%
+ \let\tikz@tostart@tikz=\pgfutil@empty
+ }%
+ {%
+ % Start computation of new start.
+ {%
+ \tikz@tofrom%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ {%
+ \pgftransformreset%
+ \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \pgftransformrotate{\tikz@to@out}%
+ \pgftransformshift{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
+ \pgf@process{\pgfpointtransformed{\tikz@toto}}%
+ }%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfpointshapeborder{\tikztostart}{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \xdef\tikz@tofrom@smuggle{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ }%
+ \let\tikz@first@point=\tikz@tofrom@smuggle%
+ \tikz@first@point%
+ \edef\tikz@tostart@tikz{(\the\pgf@x,\the\pgf@y)}%
+ }%
+ \pgfutil@ifundefined{pgf@sh@ns@\tikztotarget}
+ {%
+ \let\tikz@second@point=\tikz@toto%
+ }%
+ {%
+ % Start computation of new target.
+ {%
+ \tikz@toto%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ {%
+ \pgftransformreset%
+ \pgftransformshift{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \pgftransformrotate{180}%
+ \pgftransformrotate{\tikz@to@in}%
+ \pgftransformshift{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
+ \pgf@process{\pgfpointtransformed{\tikz@tofrom}}%
+ }%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfpointshapeborder{\tikztotarget}{\pgfqpoint{\pgf@xc}{\pgf@yc}}%
+ \xdef\tikz@toto@smuggle{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}
+ }%
+ \let\tikz@second@point=\tikz@toto@smuggle%
+ }%
+ \tikz@second@point%
+ \edef\tikz@totarget@tikz{(\the\pgf@x,\the\pgf@y)}%
+ %
+ % Compute distances
+ %
+ \tikz@to@compute@distance@main%
+ \edef\tikz@to@first@distance{\the\pgf@xa}%
+ \edef\tikz@to@second@distance{\the\pgf@xb}%
+ %
+ % Next step: Establish a transformed coordinate system so that the (modified)
+ % start is at the origin and the (modified) target is at (1,0)
+ %
+ \pgftransformreset%
+ \pgf@process{\tikz@first@point}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@second@point}%
+ \advance\pgf@x by-\pgf@xa%
+ \advance\pgf@y by-\pgf@ya%
+ \pgfpointnormalised{}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgf@xb=-\pgf@x%
+ \pgf@yb=-\pgf@y%
+ %
+ % Now compute the control points.
+ %
+ {%
+ \pgftransformshift{\tikz@first@point}%
+ \pgftransformcm{\pgf@sys@tonumber\pgf@xc}{\pgf@sys@tonumber\pgf@yc}{\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@xc}%
+ {\pgfpointorigin}%
+ \pgf@process{\pgfpointtransformed{\pgfpointpolar{\tikz@to@out}{\tikz@to@first@distance}}}%
+ \xdef\tikz@computed@start{(\the\pgf@x,\the\pgf@y)}%
+ }
+ {%
+ \pgftransformshift{\tikz@second@point}%
+ \pgftransformcm{\pgf@sys@tonumber\pgf@xc}{\pgf@sys@tonumber\pgf@yc}{\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@xc}%
+ {\pgfpointorigin}%
+ \pgf@process{\pgfpointtransformed{\pgfpointpolar{\tikz@to@in}{\tikz@to@second@distance}}}%
+ \xdef\tikz@computed@end{(\the\pgf@x,\the\pgf@y)}%
+ }
+ \xdef\tikz@computed@path{
+ \tikz@tostart@tikz
+ .. controls \tikz@computed@start and \tikz@computed@end ..
+ \tikz@totarget@tikz}%
+ \endgroup
+}
+
+
+
+% Loops
+
+\tikzset{loop/.style= {to path={
+ \pgfextra{\let\tikztotarget=\tikztostart}
+ [looseness=8,min distance=5mm,every loop]
+ \tikz@to@curve@path
+ }}}
+
+\tikzset{every loop/.style= {->,shorten >=1pt}}
+
+\tikzset{loop right/.style= {right,out=15,in=-15,loop}}
+\tikzset{loop above/.style= {above,out=105,in=75,loop}}
+\tikzset{loop left/.style= {left,out=195,in=165,loop}}
+\tikzset{loop below/.style= {below,out=285,in=255,loop}}
+
+
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibrarytrees.code.tex b/graphics/pgf/base/tex/tikzlibrarytrees.code.tex
new file mode 100644
index 0000000000..830435a029
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibrarytrees.code.tex
@@ -0,0 +1,104 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibrarytrees.code.tex}
+
+
+
+%
+% Three point growth
+%
+
+\tikzoption{grow via three points}{\let\tikz@grow=\tikz@grow@three\tikz@parse@three#1}%
+
+\def\tikz@parse@three one child at#1(#2)#3and two children at#4(#5)#6and#7(#8){%
+ \def\tikz@tree@one@child{\tikz@scan@one@point\pgf@process(#2)}
+ \def\tikz@tree@left@child{\tikz@scan@one@point\pgf@process(#5)}
+ \def\tikz@tree@right@child{\tikz@scan@one@point\pgf@process(#8)}
+}%
+
+\def\tikz@grow@three{%
+ \pgf@process{\tikz@tree@one@child}%
+ \pgf@xa=\pgf@x%
+ \pgf@ya=\pgf@y%
+ \pgf@process{\tikz@tree@left@child}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \advance\pgf@xb by-\pgf@xa%
+ \advance\pgf@yb by-\pgf@ya%
+ \pgf@process{\tikz@tree@right@child}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \advance\pgf@xc by-\pgf@xa%
+ \advance\pgf@yc by-\pgf@ya%
+ \advance\pgf@xc by-\pgf@xb%
+ \advance\pgf@yc by-\pgf@yb%
+ \advance\tikznumberofchildren by-1\relax%
+ \pgf@xb=\tikznumberofchildren\pgf@xb\relax%
+ \pgf@yb=\tikznumberofchildren\pgf@yb\relax%
+ \advance\tikznumberofcurrentchild by-1\relax%
+ \pgf@xc=\tikznumberofcurrentchild\pgf@xc\relax%
+ \pgf@yc=\tikznumberofcurrentchild\pgf@yc\relax%
+ \advance\pgf@xa by\pgf@xb%
+ \advance\pgf@xa by\pgf@xc%
+ \advance\pgf@ya by\pgf@yb%
+ \advance\pgf@ya by\pgf@yc%
+ \edef\pgf@temp{\noexpand\pgftransformshift{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}}%
+ \pgf@temp%
+}%
+
+
+
+%
+% Circle grow
+%
+
+\tikzset{grow cyclic/.style={growth function=\tikz@grow@circle}}%
+
+\tikzset{sibling angle/.initial=20}%
+
+\def\tikz@grow@circle{%
+ \pgftransformrotate{%
+ (\pgfkeysvalueof{/tikz/sibling angle})*(-.5-.5*\tikznumberofchildren+\tikznumberofcurrentchild)}%
+ \pgftransformxshift{\the\tikzleveldistance}%
+}%
+
+\tikzoption{counterclockwise from}{\let\tikz@grow=\tikz@grow@circle@from\def\tikz@grow@circle@from@start{#1}}%
+
+\def\tikz@grow@circle@from{%
+ \pgftransformshift{\pgfpointpolar{\tikz@grow@circle@from@start+(\pgfkeysvalueof{/tikz/sibling angle})*(\tikznumberofcurrentchild-1)}{\the\tikzleveldistance}}%
+}%
+
+\tikzoption{clockwise from}{\let\tikz@grow=\tikz@grow@circle@from@\def\tikz@grow@circle@from@start{#1}}%
+
+\def\tikz@grow@circle@from@{%
+ \pgftransformshift{\pgfpointpolar{\tikz@grow@circle@from@start-(\pgfkeysvalueof{/tikz/sibling angle})*(\tikznumberofcurrentchild-1)}{\the\tikzleveldistance}}%
+}%
+
+
+
+%
+% Connections
+%
+
+\tikzset{edge from parent fork down/.style=
+ {edge from parent path={(\tikzparentnode\tikzparentanchor) -- +(0pt,-.5\tikzleveldistance) -| (\tikzchildnode\tikzchildanchor)}}}%
+
+\tikzset{edge from parent fork up/.style=
+ {edge from parent path={(\tikzparentnode\tikzparentanchor) -- +(0pt,.5\tikzleveldistance) -| (\tikzchildnode\tikzchildanchor)}}}%
+
+\tikzset{edge from parent fork left/.style=
+ {edge from parent path={(\tikzparentnode\tikzparentanchor) -- +(-.5\tikzleveldistance,0pt) |- (\tikzchildnode\tikzchildanchor)}}}%
+
+\tikzset{edge from parent fork right/.style=
+ {edge from parent path={(\tikzparentnode\tikzparentanchor) -- +(.5\tikzleveldistance,0pt) |- (\tikzchildnode\tikzchildanchor)}}}%
+
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryturtle.code.tex b/graphics/pgf/base/tex/tikzlibraryturtle.code.tex
new file mode 100644
index 0000000000..009a309e31
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryturtle.code.tex
@@ -0,0 +1,84 @@
+% Copyright 2008 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryturtle.code.tex}
+
+
+\tikzset{turtle/.style={/tikz/turtle/.cd,#1}}%
+
+% The current angle is stored in this key.
+\tikzset{turtle/direction/.code=\gdef\tikz@lib@turtle@dir{#1},turtle/direction=90}%
+
+% The current angle is stored in this key.
+\tikzset{turtle/distance/.initial=1cm}%
+
+% The to path options that are used to move the turtle
+\tikzset{turtle/how/.style=}%
+
+% Let the turtle jump home
+\tikzset{turtle/home/.style={/tikz/insert path={(0,0) [turtle/direction=90]}}}%
+
+% Moves the turtle forward by the given distance or, if no distance is
+% given, by turtle distance
+\tikzset{
+ turtle/forward/.default=\pgfkeysvalueof{/tikz/turtle/distance},
+ turtle/forward/.style={/tikz/insert path={to[/tikz/turtle/how]++(\tikz@lib@turtle@dir:#1)}}
+}%
+
+
+
+% Moves the turtle backward by the given distance or, if no distance is
+% given, by turtle distance
+\tikzset{
+ turtle/back/.default=\pgfkeysvalueof{/tikz/turtle/distance},
+ turtle/back/.style={turtle forward=-#1}
+}%
+
+
+
+% Turns the turtle left by the given number of degrees
+\tikzset{
+ turtle/left/.default=90,
+ turtle/left/.code={%
+ \pgfmathparse{#1+\tikz@lib@turtle@dir}%
+ \ifdim\pgfmathresult pt>360pt\relax%
+ \pgfmathparse{\pgfmathresult-360}%
+ \fi%
+ \global\let\tikz@lib@turtle@dir\pgfmathresult
+ }
+}%
+
+
+% Turns the turtle left by the given number of degrees
+\tikzset{
+ turtle/right/.default=90,
+ turtle/right/.code={%
+ \pgfmathparse{#1}
+ \pgfmathparse{\tikz@lib@turtle@dir-\pgfmathresult}%
+ \ifdim\pgfmathresult pt<0pt\relax%
+ \pgfmathparse{\pgfmathresult+360}%
+ \fi%
+ \global\let\tikz@lib@turtle@dir\pgfmathresult
+ }
+}%
+
+
+% Shortcuts:
+\tikzset{turtle/.cd,
+ fd/.style={forward=#1},
+ fd/.default=\pgfkeysvalueof{/tikz/turtle/distance},
+ bk/.style={back=#1},
+ bk/.default=\pgfkeysvalueof{/tikz/turtle/distance},
+ lt/.style={left=#1},
+ lt/.default=90,
+ rt/.style={right=#1},
+ rt/.default=90}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/tikzlibraryviews.code.tex b/graphics/pgf/base/tex/tikzlibraryviews.code.tex
new file mode 100644
index 0000000000..746dd60f63
--- /dev/null
+++ b/graphics/pgf/base/tex/tikzlibraryviews.code.tex
@@ -0,0 +1,45 @@
+% Copyright 2015 by Till Tantau
+%
+% 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.
+
+\ProvidesFileRCS{tikzlibraryviews.code.tex}
+
+
+\tikzset{
+ meet/.style={execute at begin scope={\tikz@lib@view@parse{meet}#1\pgf@stop},execute at end scope={\endpgfviewboxscope}},
+ view/.style={meet = {#1}},
+ slice/.style={execute at begin scope={\tikz@lib@view@parse{slice}#1\pgf@stop},execute at end scope={\endpgfviewboxscope}},
+}%
+
+\def\tikz@lib@view@parse#1#2\pgf@stop{%
+ \tikz@scan@one@point\tikz@lib@view@a#2\pgf@stop%
+ \pgfviewboxscope{\tikz@lib@view@stored@a}{\tikz@lib@view@stored@b}{\tikz@lib@view@stored@c}{\tikz@lib@view@stored@d}{#1}%
+}%
+\def\tikz@lib@view@a#1{%
+ \def\tikz@lib@view@stored@a{#1}%
+ \pgfutil@ifnextchar r{\tikz@lib@view@a@rec}{\tikz@scan@one@point\tikz@lib@view@b}%
+}%
+\def\tikz@lib@view@a@rec rectangle{\tikz@scan@one@point\tikz@lib@view@b}%
+\def\tikz@lib@view@b#1{%
+ \def\tikz@lib@view@stored@b{#1}%
+ \pgfutil@ifnextchar\pgf@stop{%
+ \let\tikz@lib@view@stored@c\tikz@lib@view@stored@a%
+ \let\tikz@lib@view@stored@d\tikz@lib@view@stored@b%
+ \pgfutil@gobble%
+ }{\tikz@lib@view@b@at}%
+}%
+\def\tikz@lib@view@b@at at{\tikz@scan@one@point\tikz@lib@view@c}%
+\def\tikz@lib@view@c#1{%
+ \def\tikz@lib@view@stored@c{#1}%
+ \pgfutil@ifnextchar r{\tikz@lib@view@c@rec}{\tikz@scan@one@point\tikz@lib@view@d}%
+}%
+\def\tikz@lib@view@c@rec rectangle{\tikz@scan@one@point\tikz@lib@view@d}%
+\def\tikz@lib@view@d#1{\def\tikz@lib@view@stored@d{#1}\pgfutil@ifnextchar\pgf@stop\pgfutil@gobble{\tikzerror{Wrong syntax for meet or slice key}}}%
+
+
+\endinput
diff --git a/graphics/pgf/base/tex/xxcolor.sty b/graphics/pgf/base/tex/xxcolor.sty
new file mode 100644
index 0000000000..d085debebd
--- /dev/null
+++ b/graphics/pgf/base/tex/xxcolor.sty
@@ -0,0 +1,108 @@
+% Copyright 2006 by Till Tantau
+%
+% 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.
+
+\ProvidesPackage{xxcolor}[2003/10/24 ver 0.1]
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\RequirePackage{xcolor}
+
+
+
+% Command \newcolormixin{\somecommand}
+%
+% Description:
+%
+% After this command has been called, you can assign a partial color
+% specification to \somecommand. Every time a color is set, the
+% partial color specification in \somecommand will be applied to the
+% current color.
+%
+% Examples:
+%
+% \newcolormixin\mymixin
+% \def\mymixin{!50!white}
+%
+% \newcolormixin\anothermixin
+% \def\anothermixin{!50!red}
+
+\def\newcolormixin#1{%
+ \expandafter\def\csname XC@mixin@\the\XC@nummixins\endcsname{#1}%
+ \advance\XC@nummixins\@ne%
+ \ifx#1\@undefined\def#1{}\fi}
+
+\newcount\XC@nummixins
+\newcount\XC@countmixins
+
+
+% Command \applycolormixins{colorname}
+%
+% Description:
+%
+% Applies all color mixins that have been defined using \newcolormixin
+% to the color named colorname.
+%
+% Examples:
+%
+% \applycolormixins{mycolor}
+
+\def\applycolormixins#1{%
+ \XC@countmixins=0\relax%
+ \loop%
+ \ifnum\XC@countmixins<\XC@nummixins%
+ \colorlet{#1}{#1\csname XC@mixin@\the\XC@countmixins\endcsname}%
+ \advance\XC@countmixins\@ne\relax%
+ \repeat%
+}
+
+
+% Internal:
+
+\ifx\XC@mcolor\relax
+ \let\XC@mcolor\@empty
+\fi
+
+\g@addto@macro\XC@mcolor{%
+ \ifnum\XC@nummixins>0%
+ \colorlet{XC@mixtmp}{.}%
+ \applycolormixins{XC@mixtmp}%
+ \pgfutil@namelet{current@color}{\string\color@XC@mixtmp}%
+ \fi%
+}
+
+
+
+% Environment colormixin
+%
+% #1 = full xcolor specification after the first ! ("white" may not be
+% omitted)
+%
+% Description:
+%
+% Inside the environment, all colors get the specified mixin. May be
+% nested.
+%
+% Examples:
+%
+% \color{red}This is red.
+% \begin{colormixin}{25!black}
+% This is dark red.
+% \color{blue}
+% This is dark blue.
+% \end{colormixin}
+% This is normal red once more.
+
+\newcolormixin\colorcurrentmixin
+
+\newenvironment{colormixin}[1]%
+{\edef\colorcurrentmixin{!#1\colorcurrentmixin}\color{.}}{}
+
+\def\pgfalternateextension{\colorcurrentmixin}
+
+\endinput
+